Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
9261644
fix(zcode): diagnose hosts and their managed skill facades
jackie-cqz Oct 5, 2026
bf582a9
test(zcode): verify diagnostic isolation and repair precedence
jackie-cqz Oct 5, 2026
c4a7809
docs(zcode): explain diagnostic evidence and skill repair
jackie-cqz Oct 5, 2026
0cfdd2a
Merge remote-tracking branch 'origin/main' into feat/zcode-host-diagn…
jackie-cqz Oct 6, 2026
513c4f7
feat(zcode): control managed native Goals through Core and UI
jackie-cqz Oct 6, 2026
519affe
test(zcode): qualify native Goal lifecycle and frontend recovery
jackie-cqz Oct 6, 2026
e62baba
docs(zcode): explain managed native Goal activation and boundaries
jackie-cqz Oct 6, 2026
6666848
Merge remote-tracking branch 'origin/main' into feat/zcode-host-diagn…
jackie-cqz Oct 6, 2026
db5af69
fix(zcode): preserve registered actor and local control boundaries
jackie-cqz Oct 6, 2026
dc32655
docs(zcode): illustrate quota and recovery controls
jackie-cqz Oct 6, 2026
3344487
Merge remote-tracking branch 'origin/main' into feat/zcode-host-diagn…
jackie-cqz Oct 7, 2026
93969c9
fix(zcode): preserve installation recovery for mixed host faults
jackie-cqz Oct 7, 2026
67666a2
fix(zcode): reuse the canonical hexadecimal digest validator
jackie-cqz Oct 7, 2026
9588ccc
test(ci): isolate acceptance recovery and count typed turn records
jackie-cqz Oct 7, 2026
6350e7c
Merge remote-tracking branch 'origin/main' into feat/zcode-host-diagn…
jackie-cqz Oct 7, 2026
b8debe6
Merge remote-tracking branch 'origin/main' into feat/zcode-host-diagn…
jackie-cqz Oct 7, 2026
7c9a195
refactor(hosts): place skill activation in the host boundary
jackie-cqz Oct 7, 2026
fa5f45e
test(chat): align fixtures with canonical admission gates
jackie-cqz Oct 7, 2026
2419f29
test(authority): select the intended legacy shadow source
jackie-cqz Oct 7, 2026
aed6ab6
test(cli): bound complete routed command output
jackie-cqz Oct 7, 2026
de94cbe
fix(demo): honor hard-lease replay transitions
jackie-cqz Oct 7, 2026
bd962e3
Merge remote-tracking branch 'origin/main' into feat/zcode-host-diagn…
jackie-cqz Oct 7, 2026
e37f283
test(scheduler): bind settlements to current receipts and workspace
jackie-cqz Oct 7, 2026
95b4ca6
fix(process): confirm owned descendants stop before returning
jackie-cqz Oct 7, 2026
3cacd63
test(architecture): bound source metadata reader exceptions
jackie-cqz Oct 7, 2026
a5b97fc
Merge remote-tracking branch 'origin/main' into feat/zcode-host-diagn…
jackie-cqz Oct 7, 2026
399d1bd
Merge remote-tracking branch 'origin/main' into feat/zcode-host-diagn…
jackie-cqz Oct 7, 2026
13733c9
test(cli): derive refresh-state fixtures from the parser
jackie-cqz Oct 7, 2026
6473f87
fix(zcode): align native Goal controls with host eligibility
jackie-cqz Oct 7, 2026
0972326
Merge remote-tracking branch 'origin/main' into feat/zcode-host-diagn…
jackie-cqz Oct 7, 2026
77dde0d
fix(testing): qualify current CLI presentation costs
jackie-cqz Oct 7, 2026
eb67ce6
Merge remote-tracking branch 'origin/main' into feat/zcode-host-diagn…
jackie-cqz Oct 7, 2026
3e083a7
Merge remote-tracking branch 'origin/main' into feat/zcode-host-diagn…
jackie-cqz Oct 7, 2026
f04c5a4
Merge remote-tracking branch 'origin/main' into feat/zcode-host-diagn…
jackie-cqz Oct 7, 2026
80368be
Merge remote-tracking branch 'origin/main' into feat/zcode-host-diagn…
jackie-cqz Oct 7, 2026
b53caa5
test(control-plane): qualify fresh preference output costs
jackie-cqz Oct 7, 2026
c6a00b6
Merge remote-tracking branch 'origin/main' into feat/zcode-host-diagn…
jackie-cqz Oct 7, 2026
27c1796
Revert "test(control-plane): qualify fresh preference output costs"
jackie-cqz Oct 7, 2026
3955d1c
Merge remote-tracking branch 'origin/main' into feat/zcode-host-diagn…
jackie-cqz Oct 7, 2026
21328ed
test(control-plane): qualify output ceilings on Windows
jackie-cqz Oct 7, 2026
256cd4e
docs(testing): reconcile cross-platform output qualification
jackie-cqz Oct 7, 2026
082a097
Merge latest origin/main into feat/zcode-host-diagnostics
jackie-cqz Oct 7, 2026
4c78852
Merge origin/main runtime archive fixes into ZCode branch
jackie-cqz Oct 8, 2026
9bf6664
Merge current origin/main before CI contract repair
jackie-cqz Oct 8, 2026
08bbb20
Merge remote-tracking branch 'origin/main' into feat/zcode-host-diagn…
jackie-cqz Oct 8, 2026
3bce41a
test: align CI fixtures with canonical read and lifecycle contracts
jackie-cqz Oct 8, 2026
29b2f98
Merge remote-tracking branch 'origin/main' into feat/zcode-host-diagn…
jackie-cqz Oct 8, 2026
d0f028c
test: align CI fixtures with current owner contracts
jackie-cqz Oct 8, 2026
1f308bb
ci: partition complete Python and Dashboard qualification
jackie-cqz Oct 8, 2026
bedcb47
Merge latest main and preserve ZCode CI repairs
jackie-cqz Oct 8, 2026
e3726de
fix(demo): honor upstream soft-claim replay contract
jackie-cqz Oct 8, 2026
857eeb5
Merge latest main into ZCode host branch
jackie-cqz Oct 8, 2026
7b6659f
Merge latest main and preserve handoff refusal invariants
jackie-cqz Oct 8, 2026
49cbab3
Merge latest main creation recovery and workspace context updates
jackie-cqz Oct 8, 2026
0168699
Merge main periodic report native successor acceptance
jackie-cqz Oct 8, 2026
129332a
Merge main typed frontier and current successor guard contracts
jackie-cqz Oct 8, 2026
49ce0d5
Merge latest main readable handoff acknowledgement fix
jackie-cqz Oct 8, 2026
b6ea0c9
Merge main verified private steward host grant fix
jackie-cqz Oct 8, 2026
15d5277
test(dashboard): supply validated workspace digest for creation recovery
jackie-cqz Oct 8, 2026
69c9e42
Merge main shared workspace digest and runtime recovery fixes
jackie-cqz Oct 8, 2026
66080d9
Merge main review experience and private Lark return updates
jackie-cqz Oct 8, 2026
1f4f42e
Merge main private Chat progress continuation fix
jackie-cqz Oct 8, 2026
f45e2ed
test(blog): validate resolved paired edition anchor URLs
jackie-cqz Oct 8, 2026
4be65b5
Merge main source session loader registration and qualification notes
jackie-cqz Oct 8, 2026
fb87c21
Merge main durable Explore links and visible filename fixes
jackie-cqz Oct 8, 2026
7ca5ab7
Merge main native transport and original proposal recovery updates
jackie-cqz Oct 9, 2026
bdb8ddf
Merge main verified Bot-only group connection fix
jackie-cqz Oct 9, 2026
61da640
Merge main recovery contracts while retaining CI shards and negative …
jackie-cqz Oct 9, 2026
9a046fe
test(replan): retain provenance refusal helper after inline context m…
jackie-cqz Oct 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 39 additions & 4 deletions .github/workflows/python-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -303,11 +303,15 @@ jobs:
if-no-files-found: error
retention-days: 3

dashboard-acceptance:
dashboard-browser:
needs: [changes, chat-bundle]
if: needs.changes.outputs.core_tests == 'true'
runs-on: ubuntu-latest
timeout-minutes: 25
strategy:
fail-fast: false
matrix:
shard: [1, 2, 3]
steps:
- name: Check out repository
uses: actions/checkout@v7
Expand Down Expand Up @@ -339,16 +343,47 @@ jobs:

- name: Measure Dashboard unit and browser interactions
env:
LOOPX_PERSONAL_WORKSPACE_SHARD: "${{ matrix.shard }}/3"
LOOPX_DASHBOARD_COVERAGE: "1"
LOOPX_PLAYWRIGHT_PACKAGE: ${{ github.workspace }}/apps/presentation/dashboard/node_modules/playwright
run: |
node --test examples/personal-workspace-browser/shard.test.mjs
npm run test:dashboard:coverage
cd apps/presentation/dashboard
npx playwright install --with-deps chromium --only-shell
node ../../../examples/personal-workspace-browser-smoke.mjs
cp ../../../output/playwright/personal-workspace/acceptance-results.json ../../../coverage/dashboard/acceptance-results.json

- name: Upload Dashboard coverage
uses: actions/upload-artifact@v7
with:
name: dashboard-coverage-${{ matrix.shard }}
path: |
coverage/dashboard/lcov.info
coverage/dashboard/browser-coverage.json
coverage/dashboard/acceptance-results.json
if-no-files-found: error
retention-days: 3

dashboard-acceptance:
needs: [changes, dashboard-browser]
if: needs.changes.outputs.core_tests == 'true'
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v7
- uses: actions/setup-node@v6
with:
node-version: "22.22.3"
- run: npm ci --ignore-scripts
- run: node --test scripts/ci/merge-dashboard-coverage.test.mjs
- uses: actions/download-artifact@v7
with:
pattern: dashboard-coverage-*
path: coverage/dashboard-shards
- name: Require every acceptance shard and merge source coverage
run: node scripts/ci/merge-dashboard-coverage.mjs coverage/dashboard-shards coverage/dashboard
- uses: actions/upload-artifact@v7
with:
name: dashboard-coverage
path: coverage/dashboard/*.info
Expand Down Expand Up @@ -427,7 +462,7 @@ jobs:
strategy:
fail-fast: false
matrix:
shard: [1, 2, 3, 4]
shard: [1, 2, 3, 4, 5, 6]
steps:
- uses: actions/checkout@v7
with:
Expand Down Expand Up @@ -473,7 +508,7 @@ jobs:
# Each runner retains the measured two-worker pool.
run: >-
python -m pytest -q -n 2 -m "not stage2c_e2e"
--splits 4 --group ${{ matrix.shard }}
--splits 6 --group ${{ matrix.shard }}
--splitting-algorithm least_duration
--durations=25 --durations-min=1
--junitxml=junit.xml
Expand Down Expand Up @@ -523,7 +558,7 @@ jobs:
- name: Combine complete coverage and enforce the existing floor
run: |
shards=()
for shard in 1 2 3 4; do
for shard in 1 2 3 4 5 6; do
path="coverage-shards/python-coverage-${shard}/.coverage"
test -s "$path"
shards+=("$path")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

from loopx.chat_runtime import ChatRuntimeController
from loopx.chat_server import ChatHTTPServer, ChatRequestHandler
from loopx.chat_store import ChatSessionStore
from loopx.chat_store import CHAT_TURN_SCHEMA_VERSION, ChatSessionStore


class _HealthyAdapter:
Expand Down Expand Up @@ -39,11 +39,14 @@ def close_session(self) -> None:


def _turn_count(store: ChatSessionStore, session_id: str) -> int:
return sum(
1
for path in (store.sessions_root / session_id / "turns").glob("*.json")
if not path.name.endswith(".events.json")
)
count = 0
for path in (store.sessions_root / session_id / "turns").glob("*.json"):
payload = json.loads(path.read_text(encoding="utf-8"))
if not isinstance(payload, dict):
raise TypeError("persisted turn-directory JSON must be an object")
if payload.get("schema_version") == CHAT_TURN_SCHEMA_VERSION:
count += 1
return count


def main() -> int:
Expand All @@ -59,6 +62,7 @@ def main() -> int:
json.dumps(
{
"schema_version": "0.1",
"common_runtime_root": str(root),
"goals": [
{
"id": "goal-one",
Expand Down
5 changes: 3 additions & 2 deletions apps/presentation/dashboard/src/data/chat.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { HANDOFF_MODES, EXECUTION_HANDOFF_MODES } from "../../../../../loopx/control_plane/coordination/handoff_mode_vocabulary.js";
import { normalizeGoalDraft } from "../../../../../loopx/control_plane/collaboration/goal_draft.js";
import { parseTurnStep, type TurnStep } from "./turn-steps";
import { parseTurnStep, type TurnStep } from "./turn-steps.js";
import { z } from "zod";
import { actionSourceBasisSchema } from "./action-source-basis.js";

Expand Down Expand Up @@ -2324,7 +2324,7 @@ export async function disconnectLarkGoalTopic(goalId: string, connectionId: stri
);
}

export { CONTEXTS as usageContexts } from "../../../../../loopx/control_plane/runtime/usage_statistics_contract";
export { CONTEXTS as usageContexts } from "../../../../../loopx/control_plane/runtime/usage_statistics_contract.js";
const usageStatisticsSchema = z.object({
consent: z.enum(["default", "enabled", "disabled"]),
sending: z.boolean(), blocked_by: z.string().nullable(), endpoint: z.string().nullable(),
Expand Down Expand Up @@ -2432,6 +2432,7 @@ export async function changePrivateAgentTarget(bindingId: string, revision: numb
}));
}


// Display validation only; finding status semantics remain owned by Explore.
const exploreResultPageSchema = z.object({
ok: z.literal(true), goal_id: z.string(), total: z.number().int().nonnegative(),
Expand Down
1 change: 1 addition & 0 deletions apps/presentation/dashboard/src/data/status.ts
Original file line number Diff line number Diff line change
Expand Up @@ -537,6 +537,7 @@ export const runRecordSchema = z.object({
});

export const runGoalSchema = z.object({
zcode_goal_eligible_agent_ids: z.array(z.string()).optional().default([]).catch([]),
acceptance_observation: goalAcceptanceObservationSchema.optional().nullable().catch(null),
id: z.string(),
activation_state: z.enum(["active", "stopped"]).optional().default("active"),
Expand Down
60 changes: 60 additions & 0 deletions apps/presentation/dashboard/src/data/zcode-goal.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import { ZCODE_GOAL_ACTIONS, ZCODE_NATIVE_GOAL_STATUSES, ZCODE_IDENTITY_SCOPES, type ZCodeGoalAction, type ZCodeGoalReadback, type ZCodeModelSelection } from "../../../../../loopx/zcode_goal_mode/contract.js";
import {z} from "zod";
import {requestJson} from "./chat.js";

const zcodeModelSelectionSchema = z.object({
providerId: z.string().min(1), modelId: z.string().min(1),
options: z.object({reasoningLevel: z.string().min(1)}).optional(),
});

// Validate provider transport observations; action permission remains with the typed provider owner.
const zcodeGoalReadbackSchema = z.object({
ok: z.boolean(), available: z.boolean(), reason: z.string().optional(),
goal_id: z.string(), agent_id: z.string(), goal_creation_operation_id: z.string().nullable(),
goal_ref: z.object({goal_id: z.string(), goal_instance_id: z.string().min(1).optional()}),
identity_scope: z.enum(ZCODE_IDENTITY_SCOPES).optional(),
binding: z.object({mode: z.literal("managed_cli"), connected: z.boolean(), cli_path: z.string(), protocol: z.string()}).nullable(),
native: z.object({
session_id: z.string(), target_id: z.string().nullable(),
status: z.enum(ZCODE_NATIVE_GOAL_STATUSES).nullable(), running: z.boolean(),
session_status: z.string().optional(), raw_status: z.string().nullable().optional(), usage: z.null().optional(),
objective_sha256: z.string().nullable().optional(), selected_model: zcodeModelSelectionSchema.nullable().optional(),
available_models: z.array(z.object({selection: zcodeModelSelectionSchema, label: z.string(), provider_label: z.string().optional(),
reasoning_levels: z.array(z.string()), default_reasoning_level: z.string().nullable(), disabled: z.boolean()})).optional(),
}).nullable(),
quota: z.object({should_run: z.boolean(), reason: z.string().optional(), checked_at: z.string()}).nullable(),
actions: z.array(z.enum(ZCODE_GOAL_ACTIONS)),
});

function zcodeGoalUrl(goalId: string, agentId: string) {
return `/api/goals/${encodeURIComponent(goalId)}/agents/${encodeURIComponent(agentId)}/zcode-goal`;
}

function zcodeGoalReadback(payload: unknown, goalId: string, agentId: string): ZCodeGoalReadback {
const result = zcodeGoalReadbackSchema.parse(payload);
if (result.goal_id !== goalId || result.goal_ref.goal_id !== goalId || result.agent_id !== agentId) {
throw new Error("ZCode Goal source changed; read the current Goal and Agent again.");
}
return result;
}

export async function fetchZCodeGoal(goalId: string, agentId: string, signal?: AbortSignal) {
return zcodeGoalReadback(await requestJson<unknown>(zcodeGoalUrl(goalId, agentId), {signal}), goalId, agentId);
}

export async function updateZCodeGoal(goalId: string, agentId: string, action: Exclude<ZCodeGoalAction, "status">,
expectedBinding: Pick<ZCodeGoalReadback, "goal_ref" | "goal_creation_operation_id">,
options?: {cliPath?: string; modelSelection?: ZCodeModelSelection}, signal?: AbortSignal) {
const result = zcodeGoalReadback(await requestJson<unknown>(zcodeGoalUrl(goalId, agentId), {
method: "POST", signal,
body: JSON.stringify({action, expected_binding: expectedBinding,
...(action === "bind" && options?.cliPath?.trim() ? {cli_path: options.cliPath.trim()} : {}),
...(action === "select_model" && options?.modelSelection ? {model_selection: options.modelSelection} : {}),
}),
}), goalId, agentId);
if (result.goal_ref.goal_instance_id !== expectedBinding.goal_ref.goal_instance_id
|| result.goal_creation_operation_id !== expectedBinding.goal_creation_operation_id) {
throw new Error("ZCode Goal source changed; read the current Goal and Agent again.");
}
return result;
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { ZCodeGoalControl } from "./zcode-goal-control";
import { GoalAcceptanceObservationCard } from "./goal-acceptance-observation-card";
import { AttentionActions } from "./attention-actions";
import { AttentionDetailCard } from "./attention-detail-card";
Expand Down Expand Up @@ -803,6 +804,7 @@ export function ContextDrawer({ agents, attentionHistory = [], onSelectAttention
</>
)}
</section>
{selection.item.zcodeGoalEligibleAgentIds?.length ? <ZCodeGoalControl key={selection.item.goalId} goal={selection.item} readOnly={readOnly} /> : null}
{!readOnly ? <div className="personal-drawer-action-grid">
<button className="personal-secondary-action" onClick={() => callbacks.onRequestScheduleConfig?.("heartbeat", selection.item.goalId)} type="button"><Radio size={16} />{t("drawer.setupHeartbeat")}</button>
<button className="personal-secondary-action" onClick={() => callbacks.onRequestScheduleConfig?.("monitor", selection.item.goalId)} type="button"><CalendarClock size={16} />{t("drawer.scheduleAdd")}</button>
Expand Down
112 changes: 112 additions & 0 deletions apps/presentation/dashboard/src/features/personal-workspace/i18n.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,62 @@ export const workspaceLocaleStorageKey = "loopx-pw-locale";
export type WorkspaceLocale = "en" | "zh-CN";

const en = {
"zcode.executionFailed": "ZCode native execution failed. Check the host session and model configuration, then read status again.",
"zcode.currentModel": "Current model",
"zcode.modelNotSelected": "Not selected",
"zcode.model": "Configured model",
"zcode.chooseModel": "Choose an existing model",
"zcode.modelDisabled": "Unavailable",
"zcode.reasoning": "Reasoning level",
"zcode.chooseReasoning": "Choose a reasoning level",
"zcode.useModel": "Use this model",
"zcode.modelsUnavailable": "ZCode did not provide an available model. Configure a model in ZCode, then bind the CLI again.",
"zcode.identity": "Goal identity",
"zcode.identity.exact_goal_instance": "Exact Goal instance",
"zcode.identity.legacy_goal_alias": "Legacy Goal alias",
"zcode.identityBoundary": "Identity boundary",
"zcode.legacyBoundary": "This binding follows the legacy alias and creation witness. Recreating the same alias is not an exact lifetime guarantee.",
"zcode.title": "ZCode native Goal",
"zcode.scope": "Bind a managed ZCode CLI session to a registered Agent in this Goal. Binding does not start model work; Start executes the Goal.",
"zcode.remote": "Switch to the local workspace to bind and control a CLI session.",
"zcode.noAgents": "No registered Agent is available for this Goal. Register an Agent before binding a session.",
"zcode.agent": "Registered Agent",
"zcode.cli": "CLI path",
"zcode.pathPlaceholder": "Use ZCode from PATH",
"zcode.pathHelp": "Leave blank to use PATH. A new path takes effect only after binding.",
"zcode.bind": "Bind CLI",
"zcode.refresh": "Read status",
"zcode.pending": "Waiting for host readback…",
"zcode.failed": "Operation could not be confirmed.",
"zcode.readAgain": "Read status before continuing.",
"zcode.unavailable": "Native control unavailable",
"zcode.binding": "CLI binding",
"zcode.connected": "Connected",
"zcode.disconnected": "Disconnected",
"zcode.unbound": "Not bound",
"zcode.native": "Native Goal state",
"zcode.unknown": "Unknown",
"zcode.state.active": "Active",
"zcode.state.paused": "Paused",
"zcode.state.completed": "Completed",
"zcode.state.budget_limited": "Native budget limit reached",
"zcode.execution": "Observed execution",
"zcode.running": "Running",
"zcode.idle": "Not running",
"zcode.quota": "LoopX quota admission",
"zcode.quotaAllowed": "Continuation permitted",
"zcode.quotaHeld": "Continuation held",
"zcode.quotaBoundary": "LoopX checks quota before start and continuation, and monitors revocation during execution. ZCode manages internal model calls.",
"zcode.usageUnknown": "Native token usage and a model-call token limit are not provided.",
"zcode.checked": "Host state read at {time}",
"zcode.diagnostics": "Connection details",
"zcode.sessionState": "Session state",
"zcode.rawState": "Raw Goal state",
"zcode.pathChanged": "Bind the edited CLI path before starting or resuming.",
"zcode.start": "Start",
"zcode.pause": "Pause",
"zcode.resume": "Resume",
"zcode.stop": "Stop",
"storage.title": "Goal data storage",
"storage.boundary": "Confirmation changes only this existing Goal. New-Goal defaults and task ownership are separate. Preserve journal, metadata and receipts; no execution authority is granted.",
"storage.current": "Current source (fresh readback)",
Expand Down Expand Up @@ -1355,6 +1411,62 @@ const en = {
export type WorkspaceMessageKey = keyof typeof en;

const zhCN: Record<WorkspaceMessageKey, string> = {
"zcode.executionFailed": "ZCode 原生执行失败。请检查宿主会话与模型配置,再回读状态。",
"zcode.currentModel": "当前模型",
"zcode.modelNotSelected": "未选择",
"zcode.model": "已配置模型",
"zcode.chooseModel": "选择已有模型",
"zcode.modelDisabled": "不可用",
"zcode.reasoning": "推理级别",
"zcode.chooseReasoning": "选择推理级别",
"zcode.useModel": "使用此模型",
"zcode.modelsUnavailable": "ZCode 未提供可用模型。请先在 ZCode 配置模型,再绑定 CLI。",
"zcode.identity": "Goal 身份",
"zcode.identity.exact_goal_instance": "精确 Goal 实例",
"zcode.identity.legacy_goal_alias": "旧版 Goal 别名",
"zcode.identityBoundary": "身份边界",
"zcode.legacyBoundary": "此绑定沿用旧版别名与创建凭据;同名重建不具备精确生命周期保证。",
"zcode.title": "ZCode 原生 Goal",
"zcode.scope": "为当前 Goal 的已注册 Agent 绑定托管 ZCode CLI 会话。绑定不启动模型;点击启动会执行 Goal。",
"zcode.remote": "请切回本地工作区后绑定和控制 CLI 会话。",
"zcode.noAgents": "此 Goal 没有可用的已注册 Agent。请先注册 Agent,再绑定会话。",
"zcode.agent": "已注册 Agent",
"zcode.cli": "CLI 路径",
"zcode.pathPlaceholder": "使用 PATH 中的 ZCode",
"zcode.pathHelp": "留空使用 PATH。新路径在绑定后生效。",
"zcode.bind": "绑定 CLI",
"zcode.refresh": "回读状态",
"zcode.pending": "等待宿主回读…",
"zcode.failed": "无法确认操作结果。",
"zcode.readAgain": "请先回读状态,再继续操作。",
"zcode.unavailable": "原生控制不可用",
"zcode.binding": "CLI 绑定",
"zcode.connected": "已连接",
"zcode.disconnected": "未连接",
"zcode.unbound": "未绑定",
"zcode.native": "原生 Goal 状态",
"zcode.unknown": "未知",
"zcode.state.active": "活跃",
"zcode.state.paused": "已暂停",
"zcode.state.completed": "已完成",
"zcode.state.budget_limited": "原生预算已达限额",
"zcode.execution": "观察到的执行",
"zcode.running": "正在运行",
"zcode.idle": "未运行",
"zcode.quota": "LoopX 配额准入",
"zcode.quotaAllowed": "允许续跑",
"zcode.quotaHeld": "续跑受限",
"zcode.quotaBoundary": "LoopX 检查启动与续跑配额,并在运行中监测撤销。ZCode 管理内部模型调用。",
"zcode.usageUnknown": "原生 Token 用量与逐次模型调用的 Token 限额未提供。",
"zcode.checked": "宿主状态回读于 {time}",
"zcode.diagnostics": "连接详情",
"zcode.sessionState": "会话状态",
"zcode.rawState": "原始 Goal 状态",
"zcode.pathChanged": "启动或恢复前,请先绑定修改后的 CLI 路径。",
"zcode.start": "启动",
"zcode.pause": "暂停",
"zcode.resume": "恢复",
"zcode.stop": "停止",
"storage.title": "Goal 数据存储",
"storage.boundary": "明确确认后仅切换此既有 Goal。新 Goal 默认值与任务所有权是各自的设置。保留日志、metadata 和回执,不授予执行权限。",
"storage.current": "当前来源(实时读回)",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,10 @@ export type WorkspaceGoal = {
lastActivityAt?: string | null;
state?: string | null;
}>;
/** Canonical registered identities; discovered task claimants do not grant binding authority. */
registeredAgentIds?: string[];
/** Host-compatible registered IDs from the canonical backend; absence grants no controls. */
zcodeGoalEligibleAgentIds?: string[];
agentLaneCount?: number;
agentLabel?: string;
agentSentence: string;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
.personal-zcode-goal > summary, .personal-zcode-diagnostics > summary { cursor: pointer; min-height: 44px; display: list-item; align-content: center; font-size: 13px; font-weight: 500; }
.personal-zcode-goal label { display: grid; gap: 6px; margin-block: 12px; font-size: 12px; color: var(--pw-muted, #666); }
.personal-zcode-goal input, .personal-zcode-goal select { box-sizing: border-box; width: 100%; min-width: 0; min-height: 44px; border: 1px solid var(--pw-line, #ebebeb); border-radius: 6px; padding: 8px 10px; background: var(--pw-surface, #fff); color: var(--pw-text, #171717); font: inherit; }
.personal-zcode-goal .personal-zcode-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; margin-block: 12px; }
.personal-zcode-goal .personal-zcode-actions > button { min-height: 44px; margin-top: 0; }
.personal-detail-card.personal-zcode-goal dl > div { grid-template-columns: minmax(110px, .8fr) minmax(0, 1fr); }
.personal-zcode-goal .personal-zcode-help { font-size: 12px; color: var(--pw-muted, #666); }
.personal-zcode-goal .personal-zcode-error { color: var(--pw-red, #b42318); }
.personal-zcode-goal dd { overflow-wrap: anywhere; }
.personal-zcode-goal :is(summary, input, select, button):focus-visible { outline: 2px solid var(--pw-text, #171717); outline-offset: 3px; }
.personal-zcode-diagnostics { border-top: 1px solid var(--pw-line, #ebebeb); margin-top: 12px; }

.personal-zcode-model > summary { min-height: 44px; align-content: center; cursor: pointer; font-size: 12px; }
.personal-zcode-model > button { min-height: 44px; }
Loading
Loading