dsh-kingdom 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/ASSETS_NOTICE.md +18 -2
  2. package/LICENSE +661 -661
  3. package/NOTICE +9 -9
  4. package/README.md +26 -20
  5. package/THIRD_PARTY_NOTICES.md +84 -0
  6. package/cordis.patch.yml +6 -6
  7. package/docs/V2.0-RELEASE-NOTES.md +30 -0
  8. package/docs/V2.0-USER-GUIDE.md +74 -0
  9. package/lib/adapter/dsh-backend.js +10 -6
  10. package/lib/adapter/dsh-backend.js.map +1 -1
  11. package/lib/adapter/dsh-cost.js +68 -0
  12. package/lib/adapter/dsh-cost.js.map +1 -0
  13. package/lib/adapter/dsh-session-events.js +86 -0
  14. package/lib/adapter/dsh-session-events.js.map +1 -0
  15. package/lib/adapter/dsh-usage.js +159 -0
  16. package/lib/adapter/dsh-usage.js.map +1 -0
  17. package/lib/capability/admin.js +4 -4
  18. package/lib/capability/admin.js.map +1 -1
  19. package/lib/capability/dsh-enforcement.js +19 -4
  20. package/lib/capability/dsh-enforcement.js.map +1 -1
  21. package/lib/capability/service.js +11 -0
  22. package/lib/capability/service.js.map +1 -1
  23. package/lib/capability/tool-disclosure.js +144 -0
  24. package/lib/capability/tool-disclosure.js.map +1 -0
  25. package/lib/core/binding.js +20 -18
  26. package/lib/core/binding.js.map +1 -1
  27. package/lib/core/budget.js +304 -0
  28. package/lib/core/budget.js.map +1 -0
  29. package/lib/core/collaboration.js +422 -0
  30. package/lib/core/collaboration.js.map +1 -0
  31. package/lib/core/cost.js +212 -0
  32. package/lib/core/cost.js.map +1 -0
  33. package/lib/core/db.js +124 -0
  34. package/lib/core/db.js.map +1 -1
  35. package/lib/core/governed-claim.js +46 -0
  36. package/lib/core/governed-claim.js.map +1 -0
  37. package/lib/core/governed.js +112 -7
  38. package/lib/core/governed.js.map +1 -1
  39. package/lib/core/kingdom.js +58 -56
  40. package/lib/core/kingdom.js.map +1 -1
  41. package/lib/core/owner-control.js +48 -7
  42. package/lib/core/owner-control.js.map +1 -1
  43. package/lib/core/owner-window.js +822 -0
  44. package/lib/core/owner-window.js.map +1 -0
  45. package/lib/core/task-service.js +103 -72
  46. package/lib/core/task-service.js.map +1 -1
  47. package/lib/core/territory.js +33 -11
  48. package/lib/core/territory.js.map +1 -1
  49. package/lib/core/usage.js +39 -0
  50. package/lib/core/usage.js.map +1 -0
  51. package/lib/core/workspace-admission.js +225 -0
  52. package/lib/core/workspace-admission.js.map +1 -0
  53. package/lib/dispatch/evidence.js +5 -2
  54. package/lib/dispatch/evidence.js.map +1 -1
  55. package/lib/dispatch/service.js +136 -5
  56. package/lib/dispatch/service.js.map +1 -1
  57. package/lib/gui/assets/characters/chancellor-idle.svg +67 -221
  58. package/lib/gui/assets/characters/chancellor-sleeping.svg +67 -221
  59. package/lib/gui/assets/characters/chancellor-thinking.svg +67 -221
  60. package/lib/gui/assets/characters/chancellor-working.svg +67 -221
  61. package/lib/gui/assets/characters/knight-redraw-r1-idle.svg +67 -111
  62. package/lib/gui/assets/characters/knight-redraw-r1-sleeping.svg +67 -115
  63. package/lib/gui/assets/characters/knight-redraw-r1-thinking.svg +67 -173
  64. package/lib/gui/assets/characters/knight-redraw-r1-working.svg +67 -248
  65. package/lib/gui/assets/characters/supervisor-idle.svg +67 -266
  66. package/lib/gui/assets/characters/supervisor-sleeping.svg +67 -266
  67. package/lib/gui/assets/characters/supervisor-thinking.svg +67 -266
  68. package/lib/gui/assets/characters/supervisor-working.svg +67 -266
  69. package/lib/gui/console-app.js +1964 -1927
  70. package/lib/gui/console-app.js.map +1 -1
  71. package/lib/gui/contract.js.map +1 -1
  72. package/lib/gui/control-contract.js +2 -0
  73. package/lib/gui/control-contract.js.map +1 -1
  74. package/lib/gui/local-control.js +1 -0
  75. package/lib/gui/local-control.js.map +1 -1
  76. package/lib/gui/owner-control.js +310 -0
  77. package/lib/gui/owner-control.js.map +1 -0
  78. package/lib/gui/owner-ui.js +191 -0
  79. package/lib/gui/owner-ui.js.map +1 -0
  80. package/lib/gui/server.js +4 -0
  81. package/lib/gui/server.js.map +1 -1
  82. package/lib/gui/snapshot.js +150 -15
  83. package/lib/gui/snapshot.js.map +1 -1
  84. package/lib/gui/visual-assets.js +56 -0
  85. package/lib/gui/visual-assets.js.map +1 -0
  86. package/lib/gui/visual-system.js +272 -0
  87. package/lib/gui/visual-system.js.map +1 -0
  88. package/lib/gui/workbench-ui.js +358 -0
  89. package/lib/gui/workbench-ui.js.map +1 -0
  90. package/lib/gui/workbench.js +163 -0
  91. package/lib/gui/workbench.js.map +1 -0
  92. package/lib/index.js +269 -39
  93. package/lib/index.js.map +1 -1
  94. package/lib/runner-context-broker.js +8 -2
  95. package/lib/runner-context-broker.js.map +1 -1
  96. package/lib/runtime-cost-observer.js +145 -0
  97. package/lib/runtime-cost-observer.js.map +1 -0
  98. package/lib/types/adapter/contract.d.ts +2 -0
  99. package/lib/types/adapter/dsh-backend.d.ts +2 -6
  100. package/lib/types/adapter/dsh-cost.d.ts +13 -0
  101. package/lib/types/adapter/dsh-session-events.d.ts +16 -0
  102. package/lib/types/adapter/dsh-usage.d.ts +36 -0
  103. package/lib/types/capability/dsh-enforcement.d.ts +8 -6
  104. package/lib/types/capability/service.d.ts +1 -0
  105. package/lib/types/capability/tool-disclosure.d.ts +36 -0
  106. package/lib/types/core/binding.d.ts +4 -3
  107. package/lib/types/core/budget.d.ts +81 -0
  108. package/lib/types/core/collaboration.d.ts +110 -0
  109. package/lib/types/core/cost.d.ts +99 -0
  110. package/lib/types/core/db.d.ts +21 -0
  111. package/lib/types/core/governed-claim.d.ts +7 -0
  112. package/lib/types/core/governed.d.ts +19 -1
  113. package/lib/types/core/kingdom.d.ts +3 -0
  114. package/lib/types/core/owner-control.d.ts +19 -3
  115. package/lib/types/core/owner-window.d.ts +226 -0
  116. package/lib/types/core/task-service.d.ts +36 -0
  117. package/lib/types/core/territory.d.ts +7 -0
  118. package/lib/types/core/usage.d.ts +26 -0
  119. package/lib/types/core/workspace-admission.d.ts +43 -0
  120. package/lib/types/dispatch/evidence.d.ts +2 -5
  121. package/lib/types/dispatch/service.d.ts +18 -0
  122. package/lib/types/gui/console-app.d.ts +2 -1
  123. package/lib/types/gui/contract.d.ts +176 -2
  124. package/lib/types/gui/control-contract.d.ts +1 -1
  125. package/lib/types/gui/owner-control.d.ts +45 -0
  126. package/lib/types/gui/owner-ui.d.ts +2 -0
  127. package/lib/types/gui/server.d.ts +3 -0
  128. package/lib/types/gui/snapshot.d.ts +3 -10
  129. package/lib/types/gui/visual-assets.d.ts +27 -0
  130. package/lib/types/gui/visual-system.d.ts +2 -0
  131. package/lib/types/gui/workbench-ui.d.ts +5 -0
  132. package/lib/types/gui/workbench.d.ts +33 -0
  133. package/lib/types/index.d.ts +36 -4
  134. package/lib/types/runtime-cost-observer.d.ts +22 -0
  135. package/lib/types/worker/collaboration.d.ts +35 -0
  136. package/lib/types/worker/executor.d.ts +3 -0
  137. package/lib/types/worker/governed-executor.d.ts +2 -0
  138. package/lib/worker/collaboration.js +172 -0
  139. package/lib/worker/collaboration.js.map +1 -0
  140. package/lib/worker/executor.js +5 -1
  141. package/lib/worker/executor.js.map +1 -1
  142. package/lib/worker/governed-executor.js +161 -93
  143. package/lib/worker/governed-executor.js.map +1 -1
  144. package/package.json +19 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workbench.js","sourceRoot":"","sources":["../../src/gui/workbench.ts"],"names":[],"mappings":"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"}
package/lib/index.js CHANGED
@@ -1,12 +1,18 @@
1
1
  import { defineTool } from '@deepseek-ai/dsh-tools';
2
2
  import z from '@deepseek-ai/schemastery';
3
3
  import { spawnSync } from 'node:child_process';
4
- import { randomUUID } from 'node:crypto';
5
4
  import { hostname } from 'node:os';
6
5
  import { KingdomManager } from './core/kingdom.js';
7
6
  import { DshRuntimeAdapter } from './adapter/dsh-backend.js';
8
7
  import { runGovernedTask } from './worker/governed-executor.js';
9
- import { settleAndRelease } from './dispatch/service.js';
8
+ import { advanceCollaboration } from './worker/collaboration.js';
9
+ import { proposeCollaborationPlan } from './core/collaboration.js';
10
+ import { settleAndRelease, reconcileGovernedDispatch, discardGovernedRecoveryContexts } from './dispatch/service.js';
11
+ import { submitGovernedClaim } from './core/governed-claim.js';
12
+ import { recordDispatchUsage } from './core/usage.js';
13
+ import { observeDshDispatchUsage } from './adapter/dsh-usage.js';
14
+ import { ToolDisclosureRuntime, DISCOVERY_TOOL_NAME } from './capability/tool-disclosure.js';
15
+ import { installRuntimeCostObservers } from './runtime-cost-observer.js';
10
16
  import { setCapabilityCeiling } from './capability/admin.js';
11
17
  import { bindRole, listBindings, parseExecutionProfile, rebindSession, resolveBinding, setExecutionProfile, unbindRole, } from './core/binding.js';
12
18
  import { createRunnerContextPort } from './core/governed.js';
@@ -18,6 +24,8 @@ import { buildSnapshot, buildTaskDetail, toEventView } from './gui/snapshot.js';
18
24
  import { startGuiServer } from './gui/server.js';
19
25
  import { DuplicateJsonKeyError, GUI_OWNER_ONLY_HTTP_COMMANDS, GUI_SESSION_COMMANDS, GUI_START_SANDBOX_MODES, parseStrictJsonObject, } from './gui/control-contract.js';
20
26
  import { LOCAL_CONTROL_LAUNCH_PATH, LocalControlManager } from './gui/local-control.js';
27
+ import { OwnerLocalControlManager } from './gui/owner-control.js';
28
+ import { OwnerDecisionController } from './core/owner-window.js';
21
29
  import { resolveWorkerExecution } from './worker/executor-factory.js';
22
30
  import { issueOwnerControlCapability, ownerControlAuth, } from './core/owner-control.js';
23
31
  import { draftOwnerBindingIntent, draftOwnerBindingIntentFromRejectedWrite, serializeOwnerBindingIntentDraft, } from './core/owner-binding-intent.js';
@@ -136,6 +144,13 @@ export function validateLiveDirectSession(sessionId, seam) {
136
144
  }
137
145
  }
138
146
  export const Config = z.object({
147
+ toolDisclosure: z.object({
148
+ mode: z.union(['off', 'pilot']).default('off'),
149
+ residentTools: z.array(z.string()).default([]),
150
+ phaseTools: z.array(z.string()).default([]),
151
+ maxResults: z.number().default(3),
152
+ maxResultBytes: z.number().default(12000),
153
+ }).default({ mode: 'off', residentTools: [], phaseTools: [], maxResults: 3, maxResultBytes: 12000 }),
139
154
  kingdomName: z.string().default('My Kingdom'),
140
155
  ownerName: z.string().default(''),
141
156
  /** Worker 执行用的 subagent provider(dsh base bundle 默认注册 spawn / fork)。 */
@@ -145,7 +160,7 @@ export const Config = z.object({
145
160
  * 设为非零值即启用,只绑定 127.0.0.1。
146
161
  */
147
162
  guiPort: z.number().default(0),
148
- /** 可选 bearer token;设置后 GUI 所有请求都要带 Authorization 头。 */
163
+ /** Role GUI 可选 bearer;独立 Owner 路由使用其直接激活的短期凭据,不升级 Role 权限。 */
149
164
  guiToken: z.string().default(''),
150
165
  /** CORS 允许的 Origin 列表;默认放开(服务只绑本机回环)。 */
151
166
  guiAllowOrigins: z.array(z.string()).default(['*']),
@@ -300,6 +315,21 @@ export function apply(ctx, config, dependencies = {}) {
300
315
  // 卸载/重载时关闭 SQLite 连接(disposer 由 fiber 自动收集执行)
301
316
  ctx.effect(() => () => manager.close());
302
317
  const store = manager.storeHandle;
318
+ const disclosure = new ToolDisclosureRuntime(config.toolDisclosure ?? { mode: 'off' });
319
+ ctx.effect(() => () => disclosure.dispose());
320
+ const costObserver = installRuntimeCostObservers(ctx, store, {
321
+ runtimeInstanceRef: `dsh-${hostname()}`, mode: disclosure.config.mode, disclosureMeta: assembly => disclosure.metadata(assembly),
322
+ });
323
+ ctx.effect(() => () => costObserver.dispose());
324
+ const costRuntime = { toolDisclosureMode: disclosure.config.mode, observerAvailable: costObserver.available };
325
+ if (disclosure.config.mode === 'pilot')
326
+ ctx.effect(() => ctx.tools.register(defineTool({
327
+ name: DISCOVERY_TOOL_NAME,
328
+ description: 'Find currently granted tools by a short name or purpose query. Matching native schemas become visible on the next step; discovery grants no permission.',
329
+ parameters: { query: { type: 'string', required: true, description: 'A short exact tool name or purpose; at most 160 characters.' } },
330
+ output: { schema: { type: 'string' }, render: (_args, value) => [{ type: 'text', text: String(value) }] },
331
+ async execute(args, exec) { return JSON.stringify(disclosure.find(args, exec)); },
332
+ })), 'dsh-kingdom: authorized tool discovery pilot');
303
333
  const requireKingdom = () => {
304
334
  const kingdom = store.getDefaultKingdom();
305
335
  return kingdom ? kingdom.kingdom_id : null;
@@ -413,6 +443,17 @@ export function apply(ctx, config, dependencies = {}) {
413
443
  return { ok: false, message: 'grant_json 必须是合法 JSON。' };
414
444
  }
415
445
  };
446
+ const collectDispatchUsage = async (dispatchId, authorized = () => true) => {
447
+ const dispatch = store.getDispatch(dispatchId);
448
+ if (!dispatch?.runtime_dispatch_ref)
449
+ return;
450
+ // Resolve the persisted exact reference against Runtime-owned agents; do not mint a branded SessionId.
451
+ const agent = ctx.get('agents')?.list().find(candidate => candidate.id === dispatch.session_ref);
452
+ const observed = await observeDshDispatchUsage(agent?.session, dispatch.runtime_dispatch_ref);
453
+ if (!authorized())
454
+ return;
455
+ recordDispatchUsage(store, dispatchId, observed);
456
+ };
416
457
  const runGovernedStart = async (args, caller) => {
417
458
  const requestedSandboxMode = args.sandboxMode ?? 'workspace-write';
418
459
  if (!GUI_START_SANDBOX_MODES.includes(requestedSandboxMode)) {
@@ -464,6 +505,24 @@ export function apply(ctx, config, dependencies = {}) {
464
505
  const worker = loadedTask.assigned_binding_id;
465
506
  if (!worker)
466
507
  return '错误:任务未指派 Worker。';
508
+ const initialCeiling = store.getKingdomCapabilityCeiling(kingdomId);
509
+ const initialProfile = store.getBindingById(worker)?.execution_profile_json;
510
+ const stillAuthorized = () => {
511
+ if (caller.kind === 'gui' && caller.signal?.aborted)
512
+ return false;
513
+ const currentPrincipal = caller.kind === 'tool' ? trustedToolPrincipal(caller.execution) : caller.principal;
514
+ if (!currentPrincipal || currentPrincipal.sessionId !== principal.sessionId)
515
+ return false;
516
+ const checked = resolveGovernedStartSupervisor(store, governedStartCommandContext(kingdomId, currentPrincipal), args.taskId);
517
+ return checked.ok && checked.binding.binding_id === supervisor.binding.binding_id
518
+ && checked.task.assigned_binding_id === worker && checked.task.territory_id === loadedTask.territory_id
519
+ && checked.task.title === loadedTask.title && checked.task.description === loadedTask.description
520
+ && checked.task.acceptance_criteria === loadedTask.acceptance_criteria
521
+ && checked.task.capability_requirement_json === loadedTask.capability_requirement_json
522
+ && store.getTerritoryById(loadedTask.territory_id)?.workspace_path === territory.workspace_path
523
+ && store.getKingdomCapabilityCeiling(kingdomId) === initialCeiling
524
+ && store.getBindingById(worker)?.execution_profile_json === initialProfile;
525
+ };
467
526
  const agents = ctx.get('agents');
468
527
  if (!agents) {
469
528
  return '错误:当前 dsh 组合未提供 agents 服务(Persistent Session 不可用);governed 执行不可用。';
@@ -490,8 +549,11 @@ export function apply(ctx, config, dependencies = {}) {
490
549
  return { sandboxPolicy: null, approval: null };
491
550
  }
492
551
  })();
552
+ if (!stillAuthorized())
553
+ return 'AUTHZ_DENIED [AUTHORITY_CHANGED]: 准备期间身份、任务范围或执行配置变化;未访问 Worker Session。';
493
554
  const adapter = new DshRuntimeAdapter({
494
555
  runtimeInstanceRef: `dsh-${hostname()}`,
556
+ ...(disclosure.config.mode === 'pilot' ? { toolDisclosure: { install: disclosure.install.bind(disclosure) } } : {}),
495
557
  provider: config.workerProvider || 'spawn',
496
558
  model: null,
497
559
  agents,
@@ -518,10 +580,11 @@ export function apply(ctx, config, dependencies = {}) {
518
580
  // Worker 的 provider/model 权威来源 = execution_profile_json(runGovernedTask 内部解析,
519
581
  // model 缺失 → fail closed configuration error,不创建 Session、不 dispatch)。
520
582
  globalProvider: config.workerProvider || 'spawn',
583
+ stillAuthorized,
521
584
  // 真实模型 turn 轮询窗口(正式入口 E2E 实证:默认 100ms×40=4s 太短,turn 未及 terminal):
522
585
  // 1s × 60 = 60s;超窗 → fail-closed 返回(进 RECOVERING,由 reconcile 处理)。
523
- pollIntervalMs: 1000,
524
- maxPolls: 60,
586
+ pollIntervalMs: dependencies.governedPolling?.intervalMs ?? 1000,
587
+ maxPolls: dependencies.governedPolling?.maxPolls ?? 60,
525
588
  });
526
589
  }
527
590
  catch (error) {
@@ -535,7 +598,13 @@ export function apply(ctx, config, dependencies = {}) {
535
598
  return `GOVERNED_EXECUTION_DENIED [DISPATCH_EXCEPTION]: ${detail}`;
536
599
  }
537
600
  if (!result.ok) {
601
+ const observedDispatch = store.listDispatchesForTaskAttempt(loadedTask.task_id, attemptNo)[0];
602
+ if (observedDispatch)
603
+ await collectDispatchUsage(observedDispatch.dispatch_id);
538
604
  const prefix = result.reason.startsWith('Capability DENIED') ? 'CAPABILITY_DENIED' : 'GOVERNED_EXECUTION_DENIED';
605
+ if (observedDispatch && store.getDispatch(observedDispatch.dispatch_id)?.state === 'RECOVERING') {
606
+ return `${prefix}: ${result.reason}\n(任务保持 ${loadedTask.status};请由当前 Supervisor 使用 kingdom_reconcile_task 对账原 Dispatch ${observedDispatch.dispatch_id}。对账完成前不得再次启动任务;不会自动降级为 LEGACY_COMPAT。)`;
607
+ }
539
608
  return `${prefix}: ${result.reason}\n(任务保持 ${loadedTask.status};请检查 Capability/Runtime 配置后,在同一 governed persistent 入口重试。不会自动降级为 LEGACY_COMPAT。)`;
540
609
  }
541
610
  // R11 settlement-before-Claim:先从已提交的 canonical
@@ -584,35 +653,10 @@ export function apply(ctx, config, dependencies = {}) {
584
653
  // Owner V0.8 FINAL RELEASE BLOCKER:Claim outcome 按已验证 terminalOutcome 收敛
585
654
  // (COMPLETED/FAILED/ABORTED)——禁止 hardcode COMPLETED;FAILED 不得生成 COMPLETED Claim;
586
655
  // summary 仅来自真实 assistant 文本,无文本 → 诚实回退占位(不伪造"任务完成"类摘要)。
587
- const running = task.status === 'ASSIGNED' ? store.transitionTask(task, 'RUNNING') : task;
588
656
  const outcome = result.terminalOutcome;
589
657
  const summary = result.summary;
590
- store.insertWorkerResult({
591
- result_id: randomUUID(),
592
- task_id: task.task_id,
593
- attempt_no: attemptNo,
594
- worker_binding_id: worker,
595
- session_id: result.sessionRef,
596
- outcome,
597
- result_json: JSON.stringify({ outcome, summary }),
598
- created_at: new Date().toISOString(),
599
- });
600
- store.transitionTask(running, 'REVIEW', { result_summary: summary });
601
- const nowIso = new Date().toISOString();
602
- store.appendEvent({
603
- event_id: randomUUID(), kingdom_id: kingdomId, event_type: 'WORKER_RESULT_SUBMITTED',
604
- actor_role: 'WORKER', actor_id: worker, target_type: 'task', target_id: task.task_id,
605
- payload_json: JSON.stringify({ attempt_no: attemptNo, claimed_outcome: outcome, session_id: result.sessionRef, executor: 'dsh-governed:persistent' }),
606
- created_at: nowIso,
607
- });
608
- if (settledLease?.state === 'RELEASED') {
609
- store.appendEvent({
610
- event_id: randomUUID(), kingdom_id: kingdomId, event_type: 'SESSION_STOPPED',
611
- actor_role: 'WORKER', actor_id: worker, target_type: 'execution', target_id: result.executionId,
612
- payload_json: JSON.stringify({ task_id: task.task_id, attempt_no: attemptNo, reason: outcome === 'COMPLETED' ? 'completed' : outcome.toLowerCase() }),
613
- created_at: nowIso,
614
- });
615
- }
658
+ submitGovernedClaim(store, result.dispatchId, summary);
659
+ await collectDispatchUsage(result.dispatchId);
616
660
  const recoveryNotice = settledLease?.state === 'RECOVERING'
617
661
  ? result.cleanupReceipt.status === 'CONFIRMED'
618
662
  ? `\n注意:terminal settlement 未能安全释放(${settledLease.release_reason ?? 'integrity recovery'}),Lease=RECOVERING;不得复用该 Session 或发起新 Dispatch,须先完成 reconcile/恢复。`
@@ -657,6 +701,58 @@ export function apply(ctx, config, dependencies = {}) {
657
701
  }
658
702
  }
659
703
  }
704
+ ctx.effect(() => () => discardGovernedRecoveryContexts(store));
705
+ const runGovernedReconcile = async (args, caller) => {
706
+ const kingdomId = requireKingdom();
707
+ if (!kingdomId)
708
+ return '尚未初始化王国。';
709
+ const resolveCaller = () => {
710
+ if (caller.kind === 'tool')
711
+ return trustedToolPrincipal(caller.execution);
712
+ if (caller.signal?.aborted)
713
+ return undefined;
714
+ if (!caller.principal.sessionId)
715
+ return undefined;
716
+ // GUI has a broker-owned activation, not an active Tool/current-initiator scope.
717
+ const live = validateLiveDirectSession(caller.principal.sessionId, dshRegistrySeam());
718
+ return live.ok && live.agent === caller.agent ? caller.principal : undefined;
719
+ };
720
+ const initialPrincipal = resolveCaller();
721
+ if (!initialPrincipal)
722
+ return 'AUTHZ_DENIED [UNAUTHORIZED_PRINCIPAL]: 无法证明当前 DSH Session。';
723
+ const authorized = resolveGovernedStartSupervisor(store, governedStartCommandContext(kingdomId, initialPrincipal), args.taskId);
724
+ if (!authorized.ok)
725
+ return `AUTHZ_DENIED [${authorized.code}]: ${authorized.message}`;
726
+ const execution = store.latestExecution(args.taskId);
727
+ const dispatch = args.dispatchId ? store.getDispatch(args.dispatchId) : execution && store.listDispatchesForTaskAttempt(args.taskId, execution.attempt_no)
728
+ .find(row => row.execution_id === execution.execution_id);
729
+ if (!dispatch || dispatch.task_id !== args.taskId || dispatch.kingdom_id !== kingdomId)
730
+ return 'RECOVERY_REQUIRED [DISPATCH_MISSING]: 未找到该任务的执行凭据。';
731
+ const stillAuthorized = () => {
732
+ const principal = resolveCaller();
733
+ if (!principal || principal.sessionId !== initialPrincipal.sessionId)
734
+ return false;
735
+ const current = resolveGovernedStartSupervisor(store, governedStartCommandContext(kingdomId, principal), args.taskId);
736
+ return current.ok && current.binding.binding_id === authorized.binding.binding_id;
737
+ };
738
+ const reconciled = await reconcileGovernedDispatch(store, dispatch.dispatch_id, stillAuthorized);
739
+ if (!stillAuthorized())
740
+ return 'AUTHZ_DENIED [AUTHORITY_REVOKED]: 对账期间授权已失效,请重新确认当前任务。';
741
+ await collectDispatchUsage(dispatch.dispatch_id, stillAuthorized);
742
+ if (!stillAuthorized())
743
+ return 'AUTHZ_DENIED [AUTHORITY_REVOKED]: 对账期间授权已失效。';
744
+ if (reconciled.status !== 'TERMINAL')
745
+ return `RECOVERY_REQUIRED [${reconciled.status}]: ${reconciled.reason};未重新派发任务,未释放 Lease。`;
746
+ try {
747
+ const claim = submitGovernedClaim(store, dispatch.dispatch_id, reconciled.summary ?? '(终态证据已确认;最终消息文本当前不可恢复)');
748
+ const lease = store.getLease(dispatch.lease_id);
749
+ const task = store.getTask(args.taskId);
750
+ return `${claim.created ? '对账已补齐' : '已存在'}第 ${dispatch.attempt_no} 次 Claim(${claim.outcome})。\n摘要:${claim.summary}\n任务状态 ${task?.status ?? 'UNKNOWN'};Lease=${lease?.state ?? 'UNKNOWN'}。${lease?.state === 'RECOVERING' ? '清理或结算证据不足,不重试清理、不复用 Session。' : ''}任务完成仍由 Supervisor 审查裁定。`;
751
+ }
752
+ catch (error) {
753
+ return `RECOVERY_REQUIRED [CLAIM_BLOCKED]: ${error instanceof Error ? error.message : String(error)}`;
754
+ }
755
+ };
660
756
  // ── 工具注册(全部挂 ctx.effect)────────────────────────────
661
757
  ctx.effect(() => ctx.tools.register(defineTool({
662
758
  name: 'kingdom_init',
@@ -920,6 +1016,62 @@ export function apply(ctx, config, dependencies = {}) {
920
1016
  }).message;
921
1017
  },
922
1018
  })), 'dsh-kingdom: plan-task tool');
1019
+ ctx.effect(() => ctx.tools.register(defineTool({
1020
+ name: 'kingdom_propose_collaboration',
1021
+ description: '宰相提议一层协作计划:含主整合者最多3位Worker,先由人类按准确版本采纳。小任务仍默认单执行者。',
1022
+ parameters: { plan_json: { type: 'string', required: true, description: 'JSON: parentTaskId,expectedVersion?,mode(EXPERT|TEAM),reason,integratorBindingId,budgetTokens,reserveTokens,items(1..2)。每项key/title/description/acceptanceCriteria/territoryId/workerBindingId/access(READ_ONLY|WRITE)/dependsOn/expectedArtifact;EXPERT只读。' } },
1023
+ output: { schema: { type: 'string' }, render: (_args, value) => [{ type: 'text', text: String(value) }] },
1024
+ async execute(args, exec) {
1025
+ const kingdomId = requireKingdom(), principal = trustedToolPrincipal(exec);
1026
+ if (!kingdomId || !principal)
1027
+ return 'AUTHZ_DENIED: 需要当前王国的真实宰相 Session。';
1028
+ try {
1029
+ if (typeof args.plan_json !== 'string' || args.plan_json.length > 24000)
1030
+ return 'INPUT_DENIED: 计划过长。';
1031
+ return JSON.stringify(proposeCollaborationPlan(store, governedStartCommandContext(kingdomId, principal), parseStrictJsonObject(args.plan_json)));
1032
+ }
1033
+ catch (error) {
1034
+ return `PLAN_REJECTED: ${error instanceof Error ? error.message : String(error)}`;
1035
+ }
1036
+ },
1037
+ })), 'dsh-kingdom: propose-collaboration tool');
1038
+ ctx.effect(() => ctx.tools.register(defineTool({
1039
+ name: 'kingdom_advance_collaboration',
1040
+ description: '当前主管推进已获人类采纳的准确计划;串行单项或并行至多两个独立项,自动完成正常指派,沿原Gate/执行/Claim链,仍须主管审查,不自动ACCEPT。',
1041
+ parameters: { plan_id: { type: 'string', required: true, description: '已采纳计划ID' },
1042
+ version: { type: 'number', required: true, description: '准确版本' }, digest: { type: 'string', required: true, description: '完整计划摘要' },
1043
+ strategy: { type: 'string', required: true, description: 'SERIAL单项等待已有结算 / PARALLEL独立子项至多两个' },
1044
+ items_json: { type: 'string', required: true, description: 'JSON数组,每项{taskId,grant:{能力名:boolean}};不携带身份,不自动扩大权限。' } },
1045
+ output: { schema: { type: 'string' }, render: (_args, value) => [{ type: 'text', text: String(value) }] },
1046
+ async execute(args, exec) {
1047
+ const kingdomId = requireKingdom();
1048
+ if (!kingdomId)
1049
+ return '尚未初始化王国。';
1050
+ try {
1051
+ if (typeof args.items_json !== 'string' || args.items_json.length > 20000)
1052
+ return 'INPUT_DENIED: 批次过长。';
1053
+ const items = parseStrictJsonObject(`{"items":${args.items_json}}`).items;
1054
+ const result = await advanceCollaboration(store, () => {
1055
+ const principal = trustedToolPrincipal(exec);
1056
+ return principal ? governedStartCommandContext(kingdomId, principal) : null;
1057
+ }, { planId: args.plan_id, version: args.version, digest: args.digest, strategy: args.strategy, items }, async (input) => {
1058
+ const previous = store.latestWorkerResult(input.taskId)?.result_id;
1059
+ const message = await runGovernedStart(input, { kind: 'tool', execution: exec });
1060
+ const task = store.getTask(input.taskId), claim = store.latestWorkerResult(input.taskId), execution = store.latestExecution(input.taskId);
1061
+ const dispatch = execution ? store.listDispatchesForTaskAttempt(input.taskId, execution.attempt_no).find(row => row.execution_id === execution.execution_id) : null;
1062
+ const lease = dispatch ? store.getLease(dispatch.lease_id) : null;
1063
+ const ok = task?.status === 'REVIEW' && !!claim && claim.result_id !== previous && claim.outcome === 'COMPLETED'
1064
+ && execution?.state === 'COMPLETED' && execution.attempt_no === claim.attempt_no && execution.worker_binding_id === claim.worker_binding_id
1065
+ && dispatch?.state === 'TERMINAL' && dispatch.session_ref === claim.session_id && lease?.state === 'RELEASED';
1066
+ return { ok, message };
1067
+ });
1068
+ return JSON.stringify(result);
1069
+ }
1070
+ catch (error) {
1071
+ return `ADVANCE_REJECTED: ${error instanceof Error ? error.message : String(error)}`;
1072
+ }
1073
+ },
1074
+ })), 'dsh-kingdom: advance-collaboration tool');
923
1075
  ctx.effect(() => ctx.tools.register(defineTool({
924
1076
  name: 'kingdom_assign_task',
925
1077
  description: '把任务派给 Worker 绑定(Supervisor 职权),CREATED → ASSIGNED',
@@ -1004,6 +1156,18 @@ export function apply(ctx, config, dependencies = {}) {
1004
1156
  }, { kind: 'tool', execution: exec });
1005
1157
  },
1006
1158
  })), 'dsh-kingdom: governed start-task tool');
1159
+ ctx.effect(() => ctx.tools.register(defineTool({
1160
+ name: 'kingdom_reconcile_task',
1161
+ description: '对账已有任务的 governed Dispatch:仅原进程保留的可信上下文可补齐迟到 Claim;缺凭据或清理证据保持 RECOVERING。不会重发任务或自动 ACCEPT。',
1162
+ parameters: {
1163
+ task_id: { type: 'string', required: true, description: '当前 Supervisor 管辖的任务 id' },
1164
+ dispatch_id: { type: 'string', description: '可选;默认选任务最新 Execution 的原 Dispatch' },
1165
+ },
1166
+ output: { schema: { type: 'string' }, render: (_args, value) => [{ type: 'text', text: String(value) }] },
1167
+ async execute(args, exec) {
1168
+ return runGovernedReconcile({ taskId: args.task_id, dispatchId: args.dispatch_id }, { kind: 'tool', execution: exec });
1169
+ },
1170
+ })), 'dsh-kingdom: governed reconcile-task tool');
1007
1171
  ctx.effect(() => ctx.tools.register(defineTool({
1008
1172
  name: 'kingdom_review_task',
1009
1173
  description: '审查 Worker 提交的结果并裁定(Supervisor 职权,须在任务领地的主理范围内)。这是任务能变成 DONE 的唯一路径:ACCEPT(→DONE)/ REWORK(→RUNNING 同 Worker)/ FAIL(→FAILED)/ HANDOFF(→RUNNING 转交新 Worker,需 to_binding_id + reason)',
@@ -1071,7 +1235,7 @@ export function apply(ctx, config, dependencies = {}) {
1071
1235
  const kingdomId = requireKingdom();
1072
1236
  if (!kingdomId)
1073
1237
  return { error: 'KINGDOM_NOT_INITIALIZED', message: '尚未初始化王国。请先 /kingdom init。' };
1074
- return buildSnapshot(store, { auth: authView });
1238
+ return buildSnapshot(store, { auth: authView, costRuntime });
1075
1239
  }), 'dsh-kingdom: snapshot tool');
1076
1240
  ctx.effect(() => jsonTool('kingdom_task_detail', '返回单个任务的结构化详情 JSON:验收标准、尝试历史、全部 Claim、Supervisor 决策、执行记录、关联事件与允许的下一步动作', { task_id: { type: 'string', required: true, description: '任务 id' } }, (args) => {
1077
1241
  const kingdomId = requireKingdom();
@@ -1137,6 +1301,7 @@ export function apply(ctx, config, dependencies = {}) {
1137
1301
  };
1138
1302
  const closeGuiRuntime = (runtime) => {
1139
1303
  runtime.control.revokeAllSessions();
1304
+ runtime.ownerControl.dispose();
1140
1305
  try {
1141
1306
  runtime.close();
1142
1307
  }
@@ -1160,6 +1325,36 @@ export function apply(ctx, config, dependencies = {}) {
1160
1325
  // In particular, port=0 can never activate against a guessed origin.
1161
1326
  expectedOrigin: () => listeningAddress?.origin ?? '',
1162
1327
  });
1328
+ const ownerController = new OwnerDecisionController(store, {
1329
+ validateTargetSession: async ({ sessionId, signal }) => {
1330
+ if (signal.aborted)
1331
+ return { ok: false, code: 'OWNER_VALIDATION_ABORTED', message: '管理窗口已撤销或校验超时。' };
1332
+ const checked = validateLiveDirectSession(sessionId, dshRegistrySeam());
1333
+ return checked.ok ? { ok: true } : { ok: false, code: 'OWNER_SESSION_UNAVAILABLE', message: '目标会话不是当前唯一、有效的 DSH 会话;请刷新后重新选择。' };
1334
+ },
1335
+ listTargetSessions: async ({ sessionIds, signal }) => {
1336
+ const seam = dshRegistrySeam();
1337
+ return signal.aborted ? [] : sessionIds.filter(id => validateLiveDirectSession(id, seam).ok)
1338
+ .map(id => ({ id, label: `DSH 会话 ${id}` }));
1339
+ },
1340
+ validateExecutionProfile: async ({ profile, signal }) => {
1341
+ const provider = profile?.provider?.trim() || config.workerProvider;
1342
+ const model = profile?.model?.trim();
1343
+ if (!model)
1344
+ return { ok: false, code: 'OWNER_MODEL_REQUIRED', message: '请明确选择模型;保存配置不会证明模型已运行成功。' };
1345
+ const llm = ctx.get('llm');
1346
+ if (!llm || typeof llm.resolveModelInfo !== 'function')
1347
+ return { ok: false, code: 'OWNER_MODEL_VALIDATION_UNAVAILABLE', message: '当前宿主无法核对模型配置,未写入变更。' };
1348
+ try {
1349
+ await llm.resolveModelInfo(provider, model, signal);
1350
+ return signal.aborted ? { ok: false, code: 'OWNER_VALIDATION_ABORTED', message: '管理窗口已撤销或校验超时。' } : { ok: true };
1351
+ }
1352
+ catch {
1353
+ return { ok: false, code: 'OWNER_MODEL_UNAVAILABLE', message: '宿主未能确认该提供方与模型路由,请核对现有模型配置。' };
1354
+ }
1355
+ },
1356
+ });
1357
+ const ownerControl = new OwnerLocalControlManager({ controller: ownerController, expectedOrigin: () => listeningAddress?.origin ?? '' });
1163
1358
  const safeClose = () => {
1164
1359
  try {
1165
1360
  closeServer?.();
@@ -1181,10 +1376,12 @@ export function apply(ctx, config, dependencies = {}) {
1181
1376
  const runtime = {
1182
1377
  address,
1183
1378
  control,
1379
+ ownerControl,
1184
1380
  close: safeClose,
1185
1381
  };
1186
1382
  if (guiStopRequested) {
1187
1383
  control.revokeAllSessions();
1384
+ ownerControl.dispose();
1188
1385
  safeClose();
1189
1386
  settled = true;
1190
1387
  reject(new Error('GUI_STOPPED_DURING_START'));
@@ -1199,11 +1396,13 @@ export function apply(ctx, config, dependencies = {}) {
1199
1396
  return;
1200
1397
  settled = true;
1201
1398
  control.dispose();
1399
+ ownerControl.dispose();
1202
1400
  reject(error);
1203
1401
  };
1204
1402
  serverClose = startGuiServer({
1205
1403
  snapshot: (readContext) => buildSnapshot(store, {
1206
1404
  auth: authView,
1405
+ costRuntime,
1207
1406
  security: projectionSecurityFor(readContext),
1208
1407
  }),
1209
1408
  taskDetail: (taskId, readContext) => {
@@ -1230,6 +1429,7 @@ export function apply(ctx, config, dependencies = {}) {
1230
1429
  ...config.guiToken ? { token: config.guiToken } : {},
1231
1430
  allowOrigins: config.guiAllowOrigins,
1232
1431
  control,
1432
+ ownerControl,
1233
1433
  onListening,
1234
1434
  onUnavailable,
1235
1435
  logger: ctx.logger,
@@ -1277,13 +1477,14 @@ export function apply(ctx, config, dependencies = {}) {
1277
1477
  });
1278
1478
  /** 把 Phase-1 风格(返回字符串)的领地/角色操作包装成 CommandResultView(M2:GUI 写层)。 */
1279
1479
  const plainResult = (text, kId) => {
1280
- const failed = /^(?:错误:|OWNER_CONTROL_REQUIRED|CONFIG_DENIED|UNKNOWN\/|INPUT_DENIED|AUTHZ_DENIED|CAPABILITY_DENIED|GOVERNED_EXECUTION_DENIED)/u.test(text);
1480
+ const failed = /^(?:错误:|OWNER_CONTROL_REQUIRED|CONFIG_DENIED|UNKNOWN\/|INPUT_DENIED|AUTHZ_DENIED|CAPABILITY_DENIED|GOVERNED_EXECUTION_DENIED|GOVERNED_SETTLEMENT_BLOCKED|RECOVERY_REQUIRED)/u.test(text);
1281
1481
  const errorCode = !failed
1282
1482
  ? null
1283
- : text.startsWith('AUTHZ_DENIED') ? 'SESSION_AUTH_REQUIRED'
1284
- : text.startsWith('INPUT_DENIED') || text.startsWith('错误:') ? 'INVALID_INPUT'
1285
- : text.startsWith('OWNER_CONTROL_REQUIRED') || text.startsWith('CONFIG_DENIED') ? 'SESSION_AUTH_REQUIRED'
1286
- : 'WORKER_EXECUTION_FAILED';
1483
+ : text.startsWith('RECOVERY_REQUIRED') || text.startsWith('GOVERNED_SETTLEMENT_BLOCKED') ? 'RECOVERY_REQUIRED'
1484
+ : text.startsWith('AUTHZ_DENIED') ? 'SESSION_AUTH_REQUIRED'
1485
+ : text.startsWith('INPUT_DENIED') || text.startsWith('错误:') ? 'INVALID_INPUT'
1486
+ : text.startsWith('OWNER_CONTROL_REQUIRED') || text.startsWith('CONFIG_DENIED') ? 'SESSION_AUTH_REQUIRED'
1487
+ : 'WORKER_EXECUTION_FAILED';
1287
1488
  return {
1288
1489
  ok: !failed,
1289
1490
  errorCode,
@@ -1385,6 +1586,15 @@ export function apply(ctx, config, dependencies = {}) {
1385
1586
  return resumeExecution(store, cmd, { executionId: str('execution_id'), reason: opt('reason') });
1386
1587
  case 'execution.abort':
1387
1588
  return abortExecution(store, cmd, { executionId: str('execution_id'), reason: opt('reason') });
1589
+ case 'reconcile': {
1590
+ if (control.signal.aborted)
1591
+ return guiFailure('UNAUTHORIZED_PRINCIPAL', '本地控制已关闭。');
1592
+ const reconciled = await runGovernedReconcile({ taskId: str('task_id') }, {
1593
+ kind: 'gui', principal: { sessionId: control.principalSessionId }, agent: control.agent,
1594
+ signal: control.signal,
1595
+ });
1596
+ return plainResult(reconciled, kingdomId);
1597
+ }
1388
1598
  case 'start':
1389
1599
  if (!control.principalSessionId.trim()) {
1390
1600
  return guiFailure('UNAUTHORIZED_PRINCIPAL', '激活时没有 exact agent.session.id;governed start 拒绝执行。');
@@ -1475,11 +1685,30 @@ export function apply(ctx, config, dependencies = {}) {
1475
1685
  ctx.effect(() => ctx.commands.register({
1476
1686
  name: 'kingdom',
1477
1687
  description: 'direct Owner Control:初始化、状态、内置 GUI 与精确 JSON 配置;独立 Agent Tool/HTTP payload 不得代行 Owner 写入',
1478
- input: { hint: 'gui [start|stop] | init | status | ceiling <json> | territory.* <json> | role.* <json> | execution-profile <json> | help' },
1688
+ input: { hint: 'gui [start|stop] | owner.gui <json> | init | status | ceiling <json> | territory.* <json> | role.* <json> | execution-profile <json> | help' },
1479
1689
  handler: async (invocation) => {
1480
1690
  const { sub, rest } = directCommandParts(invocation.rawInput);
1481
1691
  const auth = ownerAuth();
1482
1692
  switch (sub) {
1693
+ case 'owner.gui': {
1694
+ const parsed = parseJsonEnvelope(rest, ['kingdomId', 'actions', 'scope', 'ttlMs']);
1695
+ if (!parsed.ok)
1696
+ return { kind: 'error', text: `INPUT_DENIED [OWNER_COMMAND_GRAMMAR]: ${parsed.message}` };
1697
+ try {
1698
+ const runtime = await ensureGuiServer();
1699
+ const activation = runtime.ownerControl.activate(issueOwnerControlCapability(), parsed.value);
1700
+ const opened = openLocalConsole(`${runtime.address.origin}${activation.launchPath}?ticket=${encodeURIComponent(activation.launchTicket)}`);
1701
+ return {
1702
+ kind: opened ? 'success' : 'error',
1703
+ text: opened
1704
+ ? `人类管理窗口已激活:${runtime.address.origin}/owner;有效期至 ${activation.expiresAt}。网页仅可操作本次授权范围。`
1705
+ : '管理窗口已建立,但浏览器未能打开;未输出一次性票据,请重新直接激活。',
1706
+ };
1707
+ }
1708
+ catch {
1709
+ return { kind: 'error', text: 'OWNER_GUI_ACTIVATION_DENIED: 管理窗口未能激活。请核对严格 JSON 中的王国、动作、具体范围及期限;没有输出控制凭据。' };
1710
+ }
1711
+ }
1483
1712
  case 'gui': {
1484
1713
  const action = rest.trim().toLowerCase();
1485
1714
  if (action === 'stop') {
@@ -1688,6 +1917,7 @@ export function apply(ctx, config, dependencies = {}) {
1688
1917
  'dsh-Kingdom Owner Control Plane(Owner ≠ Agent ≠ Session)',
1689
1918
  '/kingdom init 原子初始化/接入;OWNER.session_id 永远为 null',
1690
1919
  '/kingdom status 查看真实状态(只读)',
1920
+ '/kingdom owner.gui <严格 JSON> 激活具体动作/资源范围的短期人类管理窗口;/owner 页面提供激活格式说明',
1691
1921
  '/kingdom ceiling {"ceiling":{"tool:pwsh":true}} | {"clear":true}',
1692
1922
  '/kingdom territory.create {"name":"研发领","workspace_path":"C:/work"}',
1693
1923
  '/kingdom territory.delete {"territory_id":"...","force":false}',