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.
- package/ASSETS_NOTICE.md +18 -2
- package/LICENSE +661 -661
- package/NOTICE +9 -9
- package/README.md +26 -20
- package/THIRD_PARTY_NOTICES.md +84 -0
- package/cordis.patch.yml +6 -6
- package/docs/V2.0-RELEASE-NOTES.md +30 -0
- package/docs/V2.0-USER-GUIDE.md +74 -0
- package/lib/adapter/dsh-backend.js +10 -6
- package/lib/adapter/dsh-backend.js.map +1 -1
- package/lib/adapter/dsh-cost.js +68 -0
- package/lib/adapter/dsh-cost.js.map +1 -0
- package/lib/adapter/dsh-session-events.js +86 -0
- package/lib/adapter/dsh-session-events.js.map +1 -0
- package/lib/adapter/dsh-usage.js +159 -0
- package/lib/adapter/dsh-usage.js.map +1 -0
- package/lib/capability/admin.js +4 -4
- package/lib/capability/admin.js.map +1 -1
- package/lib/capability/dsh-enforcement.js +19 -4
- package/lib/capability/dsh-enforcement.js.map +1 -1
- package/lib/capability/service.js +11 -0
- package/lib/capability/service.js.map +1 -1
- package/lib/capability/tool-disclosure.js +144 -0
- package/lib/capability/tool-disclosure.js.map +1 -0
- package/lib/core/binding.js +20 -18
- package/lib/core/binding.js.map +1 -1
- package/lib/core/budget.js +304 -0
- package/lib/core/budget.js.map +1 -0
- package/lib/core/collaboration.js +422 -0
- package/lib/core/collaboration.js.map +1 -0
- package/lib/core/cost.js +212 -0
- package/lib/core/cost.js.map +1 -0
- package/lib/core/db.js +124 -0
- package/lib/core/db.js.map +1 -1
- package/lib/core/governed-claim.js +46 -0
- package/lib/core/governed-claim.js.map +1 -0
- package/lib/core/governed.js +112 -7
- package/lib/core/governed.js.map +1 -1
- package/lib/core/kingdom.js +58 -56
- package/lib/core/kingdom.js.map +1 -1
- package/lib/core/owner-control.js +48 -7
- package/lib/core/owner-control.js.map +1 -1
- package/lib/core/owner-window.js +822 -0
- package/lib/core/owner-window.js.map +1 -0
- package/lib/core/task-service.js +103 -72
- package/lib/core/task-service.js.map +1 -1
- package/lib/core/territory.js +33 -11
- package/lib/core/territory.js.map +1 -1
- package/lib/core/usage.js +39 -0
- package/lib/core/usage.js.map +1 -0
- package/lib/core/workspace-admission.js +225 -0
- package/lib/core/workspace-admission.js.map +1 -0
- package/lib/dispatch/evidence.js +5 -2
- package/lib/dispatch/evidence.js.map +1 -1
- package/lib/dispatch/service.js +136 -5
- package/lib/dispatch/service.js.map +1 -1
- package/lib/gui/assets/characters/chancellor-idle.svg +67 -221
- package/lib/gui/assets/characters/chancellor-sleeping.svg +67 -221
- package/lib/gui/assets/characters/chancellor-thinking.svg +67 -221
- package/lib/gui/assets/characters/chancellor-working.svg +67 -221
- package/lib/gui/assets/characters/knight-redraw-r1-idle.svg +67 -111
- package/lib/gui/assets/characters/knight-redraw-r1-sleeping.svg +67 -115
- package/lib/gui/assets/characters/knight-redraw-r1-thinking.svg +67 -173
- package/lib/gui/assets/characters/knight-redraw-r1-working.svg +67 -248
- package/lib/gui/assets/characters/supervisor-idle.svg +67 -266
- package/lib/gui/assets/characters/supervisor-sleeping.svg +67 -266
- package/lib/gui/assets/characters/supervisor-thinking.svg +67 -266
- package/lib/gui/assets/characters/supervisor-working.svg +67 -266
- package/lib/gui/console-app.js +1964 -1927
- package/lib/gui/console-app.js.map +1 -1
- package/lib/gui/contract.js.map +1 -1
- package/lib/gui/control-contract.js +2 -0
- package/lib/gui/control-contract.js.map +1 -1
- package/lib/gui/local-control.js +1 -0
- package/lib/gui/local-control.js.map +1 -1
- package/lib/gui/owner-control.js +310 -0
- package/lib/gui/owner-control.js.map +1 -0
- package/lib/gui/owner-ui.js +191 -0
- package/lib/gui/owner-ui.js.map +1 -0
- package/lib/gui/server.js +4 -0
- package/lib/gui/server.js.map +1 -1
- package/lib/gui/snapshot.js +150 -15
- package/lib/gui/snapshot.js.map +1 -1
- package/lib/gui/visual-assets.js +56 -0
- package/lib/gui/visual-assets.js.map +1 -0
- package/lib/gui/visual-system.js +272 -0
- package/lib/gui/visual-system.js.map +1 -0
- package/lib/gui/workbench-ui.js +358 -0
- package/lib/gui/workbench-ui.js.map +1 -0
- package/lib/gui/workbench.js +163 -0
- package/lib/gui/workbench.js.map +1 -0
- package/lib/index.js +269 -39
- package/lib/index.js.map +1 -1
- package/lib/runner-context-broker.js +8 -2
- package/lib/runner-context-broker.js.map +1 -1
- package/lib/runtime-cost-observer.js +145 -0
- package/lib/runtime-cost-observer.js.map +1 -0
- package/lib/types/adapter/contract.d.ts +2 -0
- package/lib/types/adapter/dsh-backend.d.ts +2 -6
- package/lib/types/adapter/dsh-cost.d.ts +13 -0
- package/lib/types/adapter/dsh-session-events.d.ts +16 -0
- package/lib/types/adapter/dsh-usage.d.ts +36 -0
- package/lib/types/capability/dsh-enforcement.d.ts +8 -6
- package/lib/types/capability/service.d.ts +1 -0
- package/lib/types/capability/tool-disclosure.d.ts +36 -0
- package/lib/types/core/binding.d.ts +4 -3
- package/lib/types/core/budget.d.ts +81 -0
- package/lib/types/core/collaboration.d.ts +110 -0
- package/lib/types/core/cost.d.ts +99 -0
- package/lib/types/core/db.d.ts +21 -0
- package/lib/types/core/governed-claim.d.ts +7 -0
- package/lib/types/core/governed.d.ts +19 -1
- package/lib/types/core/kingdom.d.ts +3 -0
- package/lib/types/core/owner-control.d.ts +19 -3
- package/lib/types/core/owner-window.d.ts +226 -0
- package/lib/types/core/task-service.d.ts +36 -0
- package/lib/types/core/territory.d.ts +7 -0
- package/lib/types/core/usage.d.ts +26 -0
- package/lib/types/core/workspace-admission.d.ts +43 -0
- package/lib/types/dispatch/evidence.d.ts +2 -5
- package/lib/types/dispatch/service.d.ts +18 -0
- package/lib/types/gui/console-app.d.ts +2 -1
- package/lib/types/gui/contract.d.ts +176 -2
- package/lib/types/gui/control-contract.d.ts +1 -1
- package/lib/types/gui/owner-control.d.ts +45 -0
- package/lib/types/gui/owner-ui.d.ts +2 -0
- package/lib/types/gui/server.d.ts +3 -0
- package/lib/types/gui/snapshot.d.ts +3 -10
- package/lib/types/gui/visual-assets.d.ts +27 -0
- package/lib/types/gui/visual-system.d.ts +2 -0
- package/lib/types/gui/workbench-ui.d.ts +5 -0
- package/lib/types/gui/workbench.d.ts +33 -0
- package/lib/types/index.d.ts +36 -4
- package/lib/types/runtime-cost-observer.d.ts +22 -0
- package/lib/types/worker/collaboration.d.ts +35 -0
- package/lib/types/worker/executor.d.ts +3 -0
- package/lib/types/worker/governed-executor.d.ts +2 -0
- package/lib/worker/collaboration.js +172 -0
- package/lib/worker/collaboration.js.map +1 -0
- package/lib/worker/executor.js +5 -1
- package/lib/worker/executor.js.map +1 -1
- package/lib/worker/governed-executor.js +161 -93
- package/lib/worker/governed-executor.js.map +1 -1
- package/package.json +19 -8
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workbench.js","sourceRoot":"","sources":["../../src/gui/workbench.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAA;AAmBtC,MAAM,MAAM,GAAG,CAAC,UAAkB,EAAE,QAAuB,EAAa,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAA;AAC9H,MAAM,IAAI,GAAG,CAAC,QAAgB,EAAa,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;AACvI,MAAM,IAAI,GAAG,CAAC,KAAa,EAAW,EAAE,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AACxG,MAAM,KAAK,GAAG,CAAI,KAAU,EAAqB,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,GAAG,oBAAoB,EAAE,CAAC,CAAA;AAE/K,sFAAsF;AACtF,MAAM,UAAU,mBAAmB,CAAC,KAAgE;IAClG,IAAI,kBAAkB,GAAG,CAAC,CAAA;IAC1B,IAAI,iBAAiB,GAAG,CAAC,CAAA;IACzB,IAAI,qBAAqB,GAAG,CAAC,CAAA;IAC7B,MAAM,MAAM,GAAG,EAAE,mBAAmB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAA;IAC1E,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;IACtH,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAA;QAC7B,MAAM,OAAO,GAAG,MAAM,EAAE,IAAI,KAAK,yBAAyB,IAAI,MAAM,CAAC,MAAM,KAAK,mBAAmB;eAC9F,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,SAAS,CAAA;QAC9H,IAAI,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC3C,iBAAiB,IAAI,CAAC,CAAA;YACtB,SAAQ;QACV,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;QAC3E,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;eACtI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,GAA0B,CAAC,GAAG,KAAK,CAAC,GAA0B,CAAC,CAAC,CAAC,EAAE,CAAC;YACrI,qBAAqB,IAAI,CAAC,CAAA;YAC1B,SAAQ;QACV,CAAC;QACD,kBAAkB,IAAI,CAAC,CAAA;QACvB,MAAM,CAAC,mBAAmB,IAAI,KAAK,CAAC,mBAAmB,CAAA;QACvD,MAAM,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY,CAAA;QACzC,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAA;IACzC,CAAC;IACD,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAA;IACtF,MAAM,yBAAyB,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAA;IAC/H,OAAO;QACL,KAAK,EAAE,sBAAsB,EAAE,eAAe,EAAE,UAAU,CAAC,MAAM,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,qBAAqB;QAC/H,yBAAyB;QACzB,QAAQ,EAAE,kBAAkB,KAAK,CAAC,IAAI,iBAAiB,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa;YAC3E,CAAC,CAAC,kBAAkB,KAAK,UAAU,CAAC,MAAM,IAAI,yBAAyB,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QACxG,cAAc,EAAE,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;QAClD,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc;QACtC,UAAU,EAAE,CAAC,IAAI,CAAC,gCAAgC,CAAC,EAAE,IAAI,CAAC,qCAAqC,CAAC,CAAC;KAClG,CAAA;AACH,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,sBAAsB,CAAC,KAA6B;IAClE,MAAM,YAAY,GAA0B,EAAE,CAAA;IAC9C,MAAM,eAAe,GAA0B,EAAE,CAAA;IACjD,MAAM,UAAU,GAA0B,EAAE,CAAA;IAC5C,MAAM,UAAU,GAA4B,EAAE,CAAA;IAC9C,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAA;IACpF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;IAC7I,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;IACnG,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,OAAe,EAAE,cAA6B,IAAI,EAAQ,EAAE;QACnH,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,IAAI,WAAW,IAAI,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI;YAC5G,cAAc,EAAE,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE;YAC3E,UAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;IAC7F,CAAC,CAAA;IACD,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QAC1B,kBAAkB,CAAC,gCAAgC,EAAE,MAAM,EAAE,2BAA2B,CAAC,CAAA;IAC3F,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,YAAY,CAAC,EAAE,CAAC;YACvE,kBAAkB,CAAC,mCAAmC,EAAE,MAAM,EAAE,+BAA+B,CAAC,CAAA;QAClG,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,EAAE,CAAC;YACxE,kBAAkB,CAAC,kCAAkC,EAAE,QAAQ,EAAE,4BAA4B,CAAC,CAAA;QAChG,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YAC1C,IAAI,SAAS,CAAC,MAAM,KAAK,QAAQ;gBAAE,SAAQ;YAC3C,IAAI,CAAC,SAAS,CAAC,mBAAmB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBACtF,kBAAkB,CAAC,6CAA6C,EAAE,KAAK,SAAS,CAAC,IAAI,OAAO,EAC1F,qCAAqC,EAAE,SAAS,CAAC,WAAW,CAAC,CAAA;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;IACzK,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAA;IAC3C,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAA;QACzC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACnD,MAAM,UAAU,GAAG,SAAS,EAAE,MAAM,KAAK,QAAQ,IAAI,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAC1I,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC,YAAqB,CAAC,CAAC,CAAC,cAAuB,CAAA;QACnF,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAA;QACxF,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,YAAyB,EAAE,EAAuB,EAAE,CAAC,CAAC;YACnG,EAAE,EAAE,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW;YACtF,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,UAAU,EAAE,SAAS,IAAI,IAAI;YAC/F,kBAAkB,EAAE,UAAU,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACxE,CAAC,CAAA;QACF,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,CAAA;QAClG,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,CAAA;QACpF,MAAM,oBAAoB,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,KAAK,YAAY,CAAC,CAAA;QAC3F,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,YAAY,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAA;QAC5H,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,KAAK,KAAK,YAAY,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAA;QAC3H,IAAI,UAAU,EAAE,CAAC;YACf,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAClC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,6BAA6B,EAAE,UAAU;gBAC9D,CAAC,CAAC,sCAAsC;gBACxC,CAAC,CAAC,yCAAyC,EAAE;gBAC7C,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjH,GAAG,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,kBAAkB,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;gBACxF,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,kBAAkB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACtE,CAAC,CAAC,CAAA;QACL,CAAC;QACD,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAChC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,0BAA0B,EAAE,oCAAoC,EAAE;gBACvF,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,IAAI,IAAI,CAAC,EAAE,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,IAAI,IAAI,CAAC;aAC9H,CAAC,CAAC,CAAA;QACL,CAAC;QACD,8EAA8E;QAC9E,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,CAAA;QAChG,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACxH,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,KAAK,UAAU,CAAC,CAAA;QAC9E,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAE,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACzF,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,KAAK,OAAO,IAAI,YAAY,CAAC,gBAAgB,CAAC,CAAA;QAC9H,IAAI,CAAC,UAAU,IAAI,MAAM,IAAI,YAAY,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1H,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,cAAc,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,iCAAiC,EAAE,CAAC,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;QACrM,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7B,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAA;QACtI,CAAC;aAAM,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACpD,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,CAAC,CAAA;QACzE,CAAC;aAAM,IAAI,CAAC,UAAU,IAAI,YAAY,EAAE,CAAC;YACvC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,kBAAkB,EAC7G,IAAI,CAAC,YAAY,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAA;QACzF,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,QAAQ,KAAK,QAAQ;mBAC9E,IAAI,CAAC,YAAY,CAAC,iBAAiB,KAAK,IAAI,CAAC,WAAW,EAAE,SAAS,CAAA;YACxE,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW;gBACpG,kBAAkB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,IAAI,CAAC,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS;gBAC/H,UAAU,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;QAC1K,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAwB,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;QAC9D,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,KAAK,OAAO,CAAC,SAAS;YAC9H,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,SAAS;gBAChH,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAA;QACxC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QACjE,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;eAC5E,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACvH,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY;YAC/H,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,IAAI,GAAG,oBAAoB;YACxI,oBAAoB,EAAE,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM;YAC7H,mBAAmB,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YAC9F,UAAU,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,kCAAkC,CAAC,CAAC,EAAE,CAAA;IACxG,CAAC,CAAC,CAAA;IACF,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QAC1D,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU;YAAE,SAAQ;QACvC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI;YAChH,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,6CAA6C;YACvF,cAAc,EAAE,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,6BAA6B,CAAC,CAAC,EAAE,CAAC,CAAA;IACzK,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,CAAA;IACtC,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,oBAAoB,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAA;IACjL,UAAU,CAAC,UAAU,IAAI,gBAAgB,CAAC;IAAC,UAAU,CAAC,SAAS,KAAK,gBAAgB,GAAG,CAAC,CAAA;IACxF,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,mBAAmB,CAAC,KAAK,CAAC;QAC9L,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,oBAAoB,EAAE,CAAC,EAAE;QACzG,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAAE,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;AAC1J,CAAC"}
|
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 {
|
|
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
|
|
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.
|
|
591
|
-
|
|
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('
|
|
1284
|
-
: text.startsWith('
|
|
1285
|
-
: text.startsWith('
|
|
1286
|
-
: '
|
|
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}',
|