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,191 @@
|
|
|
1
|
+
/** Self-contained management surface; all business values are rendered as text. */
|
|
2
|
+
export function renderOwnerApp(nonce) {
|
|
3
|
+
if (!/^[A-Za-z0-9_-]{20,100}$/u.test(nonce))
|
|
4
|
+
throw new Error('invalid owner page nonce');
|
|
5
|
+
return OWNER_APP_HTML.replaceAll('__OWNER_NONCE__', nonce);
|
|
6
|
+
}
|
|
7
|
+
const OWNER_APP_HTML = String.raw `<!doctype html>
|
|
8
|
+
<html lang="zh-CN" data-theme="forest"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>王国管理 · dsh-Kingdom</title>
|
|
9
|
+
<style nonce="__OWNER_NONCE__">
|
|
10
|
+
:root{color-scheme:dark;--bg:#132920;--panel:#1d372b;--soft:#243f31;--ink:#f4ecda;--muted:#bec5b4;--line:#526346;--accent:#e4c483;--button:#f0d49a;--button-ink:#213123;font-family:system-ui,"Microsoft YaHei",sans-serif}
|
|
11
|
+
:root[data-theme=parchment]{color-scheme:light;--bg:#efe4cb;--panel:#faf3e3;--soft:#eee1c5;--ink:#392d21;--muted:#6e624d;--line:#b7a47d;--accent:#745326;--button:#674c28;--button-ink:#fff7e6}
|
|
12
|
+
:root[data-theme=night]{--bg:#101f35;--panel:#1b2c45;--soft:#223750;--ink:#edf1fa;--muted:#bac8dd;--line:#526a8a;--accent:#bbd2ee;--button:#c7dcef;--button-ink:#142239}
|
|
13
|
+
:root[data-theme=wine]{--bg:#301e29;--panel:#402a36;--soft:#4f3342;--ink:#f9e8e9;--muted:#d6b9c6;--line:#866573;--accent:#efc4b6;--button:#f0cbb6;--button-ink:#3b2430}
|
|
14
|
+
*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--ink);line-height:1.55}main{width:min(100% - 40px,1020px);margin:auto;padding:26px 0 64px}header{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:28px}a{color:var(--accent);text-underline-offset:4px}h1{font-size:clamp(1.7rem,4vw,2.5rem);font-weight:650;letter-spacing:.02em;margin:0 0 8px}h2{font-size:1.12rem;margin:0 0 12px}p{margin:8px 0}.eyebrow{letter-spacing:.15em;font-size:.76rem;color:var(--accent)}.muted,small{color:var(--muted)}.panel{padding:24px;border:1px solid var(--line);background:var(--panel);border-radius:14px;margin:18px 0;overflow-wrap:anywhere}.bar{display:flex;gap:16px;justify-content:space-between;align-items:start}.stack{display:grid;gap:15px}.fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px}.field{display:grid;gap:7px;min-width:0}.field.wide{grid-column:1/-1}label{font-weight:600}input,select,textarea,button{font:inherit}input,select,textarea{width:100%;min-width:0;color:var(--ink);background:var(--bg);border:1px solid var(--line);border-radius:7px;padding:10px 12px}textarea{min-height:90px;resize:vertical}button{border:1px solid var(--line);padding:10px 18px;border-radius:8px;cursor:pointer;background:var(--soft);color:var(--ink)}button.primary{background:var(--button);color:var(--button-ink);border-color:var(--button);font-weight:700}button:disabled{opacity:.5;cursor:default}:focus-visible{outline:3px solid var(--accent);outline-offset:3px}fieldset{border:0;margin:0;padding:0;min-width:0}.actions{display:flex;gap:12px;flex-wrap:wrap;margin-top:20px}.status{padding:12px 0;min-height:30px;white-space:pre-wrap}.tag{display:inline-block;border:1px solid var(--line);border-radius:20px;padding:3px 10px;margin:4px 7px 0 0;font-size:.84rem}.changes{margin:0}.change{border-top:1px solid var(--line);padding:12px 0}.change dt{font-weight:700}.change dd{margin:6px 0 0;white-space:pre-wrap}.before{color:var(--muted)}.after{color:var(--accent)}code{display:block;white-space:pre-wrap;overflow-wrap:anywhere;background:var(--bg);padding:14px;border-radius:8px;font-size:.85rem}.ceiling-row{display:grid;grid-template-columns:minmax(0,1fr) 100px auto;gap:10px;align-items:end}.receipt-meta{font-size:.8rem;color:var(--muted);overflow-wrap:anywhere}[hidden]{display:none!important}#theme{width:auto}.title-note{max-width:70ch}.scope-summary{white-space:pre-line}.danger{border-color:var(--accent)}
|
|
15
|
+
@media(max-width:600px){main{width:calc(100% - 24px);padding-top:16px}header{align-items:start}.panel{padding:17px}.fields{grid-template-columns:minmax(0,1fr)}.bar{display:grid;gap:12px}.bar button{justify-self:start}.ceiling-row{grid-template-columns:minmax(0,1fr) 92px}.ceiling-row button{grid-column:1/-1;justify-self:start}.actions button{flex:1 1 auto}h1{font-size:1.85rem}}
|
|
16
|
+
@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important}}
|
|
17
|
+
</style></head><body><main>
|
|
18
|
+
<header><a href="/console#settings">← 返回工作台设置</a><label class="field" for="theme"><span class="muted">外观</span><select id="theme"><option value="forest">森林墨绿</option><option value="parchment">羊皮纸</option><option value="night">夜蓝星图</option><option value="wine">酒红议会</option></select></label></header>
|
|
19
|
+
<div class="eyebrow">KINGDOM / OWNER</div><h1>王国管理</h1><p class="title-note muted">在已授权范围内管理领地、角色与执行配置。每次变更先查看影响,再确认应用。</p>
|
|
20
|
+
<p id="status" class="status" role="status" aria-live="polite">正在检查管理窗口…</p>
|
|
21
|
+
<section id="activation" class="panel" hidden><h2>从本地打开管理窗口</h2><p>当前没有可用的管理授权。请由人类在 DSH 的直接命令入口打开一次管理窗口,再使用返回的短期链接。</p><p class="muted">普通工作台会话不会自动获得管理权;每个窗口都需要明确操作范围,并在十分钟内到期。</p><details><summary>首次初始化的本地命令</summary><p>只用于尚未建立王国的空库;初始化后需要按实际范围重新激活。</p><code>/kingdom owner.gui {"kingdomId":null,"actions":["init"],"scope":{"kingdomWide":false,"territoryIds":[],"bindingIds":[],"roleTypes":[],"targetSessionIds":[],"workspaceRoots":[]},"ttlMs":600000}</code></details></section>
|
|
22
|
+
<section id="window" class="panel" hidden><div class="bar"><div><h2>本次管理范围</h2><p id="scope" class="scope-summary"></p><p id="expiry" class="muted"></p></div><button id="revoke" class="danger" type="button">立即撤销管理窗口</button></div></section>
|
|
23
|
+
<section id="editor" class="panel" hidden><h2>准备变更</h2><form id="operation-form"><fieldset id="edit-fields"><div class="field"><label for="action">要进行的操作</label><select id="action" required></select></div><p id="action-note" class="muted"></p><div id="fields" class="fields"></div><div class="actions"><button id="prepare" class="primary" type="submit">查看变更预览</button></div></fieldset></form></section>
|
|
24
|
+
<section id="preview-panel" class="panel" hidden><h2>确认本次变更</h2><p id="preview-summary"></p><dl id="changes" class="changes"></dl><p id="preview-expiry" class="muted"></p><div class="actions"><button id="commit" class="primary" type="button">确认应用此变更</button><button id="edit-again" type="button">返回修改</button></div></section>
|
|
25
|
+
<section id="result-panel" class="panel" hidden><h2 id="result-title">操作结果</h2><p id="result-message"></p><p id="result-meta" class="receipt-meta"></p><div class="actions"><button id="lookup" type="button" hidden>查询本次操作结果</button><button id="next" type="button" hidden>准备下一项变更</button></div></section>
|
|
26
|
+
</main><script nonce="__OWNER_NONCE__">
|
|
27
|
+
(() => {
|
|
28
|
+
'use strict';
|
|
29
|
+
const el = id => document.getElementById(id);
|
|
30
|
+
const state = { control: null, decisionId: null, preview: null, busy: false, uncertain: false };
|
|
31
|
+
const pendingKey = 'dsh-kingdom.owner.pending.v1';
|
|
32
|
+
let pendingInvalid = false;
|
|
33
|
+
try { const raw=sessionStorage.getItem(pendingKey); if(raw) { const value=JSON.parse(raw);
|
|
34
|
+
if(!value || !['decisionId','prepareId','operationId'].every(key=>typeof value[key]==='string' && value[key].length>0 && value[key].length<=768)) throw new Error('invalid pending reference');
|
|
35
|
+
state.decisionId=value.decisionId; state.preview={prepareId:value.prepareId,operationId:value.operationId}; state.uncertain=true;
|
|
36
|
+
} } catch { pendingInvalid=true; state.uncertain=true; }
|
|
37
|
+
function rememberPending() { const raw=JSON.stringify({decisionId:state.decisionId,prepareId:state.preview.prepareId,operationId:state.preview.operationId});
|
|
38
|
+
try { sessionStorage.setItem(pendingKey,raw); if(sessionStorage.getItem(pendingKey)!==raw) throw new Error(); }
|
|
39
|
+
catch { const error=new Error('浏览器无法保留操作编号,本次尚未发送。请允许此页面使用会话存储后重新预览。'); error.confirmedRejection=true; throw error; }
|
|
40
|
+
}
|
|
41
|
+
function clearPending() { try { sessionStorage.removeItem(pendingKey); } catch {} }
|
|
42
|
+
const names = { init:'初始化王国', 'territory.create':'创建领地', 'territory.update':'修改领地名称与说明', 'territory.supervisor':'任命领地主管', 'role.bind':'登记新角色', 'role.session':'调整角色会话', ceiling:'调整王国权限上限', 'execution-profile':'设置执行模型', 'budget.policy':'调整软预算政策', 'plan.adopt':'采纳一份协作计划' };
|
|
43
|
+
const roleNames = { CHANCELLOR:'宰相', SUPERVISOR:'主管', WORKER:'执行者' };
|
|
44
|
+
const notes = { init:'初始化只创建王国与人类所有者,完成后本次授权即结束。', 'territory.create':'选择已存在且在授权根目录内的工作目录;这里不会创建目录。', 'territory.update':'保留工作目录和已有会话关系。', 'territory.supervisor':'仍有未决执行或工作占用时,变更将被拒绝。', 'role.bind':'主管与宰相需要真实运行会话;执行者会话由正常执行流程建立。', 'role.session':'仅调整主管或宰相;不会迁移执行者的持久会话。', ceiling:'此映射将替换王国上限。请完整列出本次需要配置的能力;它不会改变已在途的运行限制。', 'execution-profile':'保存的是请求配置;只有后续真实运行才能确认实际使用的模型。', 'budget.policy':'软预算按 Token 管理新增执行,不是费用硬上限。每次启动的预留是估计;关闭不重置统计起点,调整不会终止在途工作或释放恢复中的占用。' };
|
|
45
|
+
notes['plan.adopt']='一次采纳完整计划及其固定版本。采纳只创建子任务;主管仍须合法分配、启动和审查,主执行者仍须实际整合。不会自动授权、派发或接受产物。';
|
|
46
|
+
const text = (id, value) => { el(id).textContent = String(value ?? ''); };
|
|
47
|
+
const status = value => text('status', value);
|
|
48
|
+
const show = (id, visible) => { el(id).hidden = !visible; };
|
|
49
|
+
const active = () => state.control?.decision?.state === 'ACTIVE' && Date.parse(state.control.decision.expiresAt) > Date.now();
|
|
50
|
+
function applyTheme(value) { const theme = ['forest','parchment','night','wine'].includes(value) ? value : 'forest'; document.documentElement.dataset.theme = theme; el('theme').value = theme; try { localStorage.setItem('dsh-kingdom.console.theme', theme); } catch {} }
|
|
51
|
+
let stored = 'forest'; try { stored = localStorage.getItem('dsh-kingdom.console.theme'); } catch {} applyTheme(stored);
|
|
52
|
+
el('theme').addEventListener('change', () => applyTheme(el('theme').value));
|
|
53
|
+
const make = (tag, value, className) => { const node = document.createElement(tag); if (value !== undefined) node.textContent = value; if (className) node.className = className; return node; };
|
|
54
|
+
const options = (select, values) => { select.replaceChildren(); for (const value of values) { const option = make('option', value.label); option.value = value.id; select.append(option); } };
|
|
55
|
+
function field(key, label, kind = 'text', choices, required = true) {
|
|
56
|
+
const box = make('div', undefined, 'field' + (kind === 'textarea' ? ' wide' : ''));
|
|
57
|
+
const input = make(kind === 'textarea' ? 'textarea' : kind === 'select' ? 'select' : 'input'); input.id = 'param-' + key; input.name = key; input.required = required;
|
|
58
|
+
if (input.tagName === 'INPUT') input.type = kind;
|
|
59
|
+
if (kind === 'select') options(input, choices || []);
|
|
60
|
+
if (kind === 'text' || kind === 'textarea') input.maxLength = kind === 'textarea' ? 4000 : 2000;
|
|
61
|
+
const title = make('label', label); title.htmlFor = input.id; box.append(title, input); el('fields').append(box); return input;
|
|
62
|
+
}
|
|
63
|
+
function allowedBindings(filter) { return (state.control.catalog?.bindings || []).filter(filter || (() => true)).map(item => ({id:item.id,label:(roleNames[item.roleType] || item.roleType) + ' · ' + item.roleName + ' · ' + item.id})); }
|
|
64
|
+
function ceilingRow() {
|
|
65
|
+
const row = make('div', undefined, 'ceiling-row');
|
|
66
|
+
const box = make('label', '能力名称', 'field'); const input = make('input'); input.required = true; input.maxLength = 200; input.setAttribute('aria-label', '能力名称'); box.append(input);
|
|
67
|
+
const selectBox = make('label', '是否允许', 'field'); const select = make('select'); select.setAttribute('aria-label', '是否允许'); options(select,[{id:'true',label:'允许'},{id:'false',label:'禁止'}]); selectBox.append(select);
|
|
68
|
+
const remove = make('button','移除此项'); remove.type='button'; remove.addEventListener('click',()=>row.remove()); row.append(box,selectBox,remove); return row;
|
|
69
|
+
}
|
|
70
|
+
function renderFields() {
|
|
71
|
+
state.preview = null; state.uncertain = false; show('preview-panel',false); show('result-panel',false); el('fields').replaceChildren();
|
|
72
|
+
const action = el('action').value; const catalog = state.control.catalog || {}; text('action-note', notes[action]);
|
|
73
|
+
const territories = (catalog.territories || []).map(item => ({id:item.id,label:item.name + ' · ' + item.id}));
|
|
74
|
+
const sessions = (catalog.runtimeSessions || []).map(item => ({id:item.id,label:item.label + ' · ' + item.id}));
|
|
75
|
+
if (action === 'init') { field('kingdom_name','王国名称'); field('owner_name','所有者显示名'); }
|
|
76
|
+
if (action === 'territory.create') { field('name','领地名称'); field('workspace_path','已存在的工作目录'); field('summary','领地说明','textarea',undefined,false); const roots = make('p','允许的根目录:' + (catalog.workspaceRoots || []).join(';'),'muted'); roots.classList.add('wide'); el('fields').append(roots); }
|
|
77
|
+
if (action === 'territory.update') { field('territory_id','领地','select',territories); field('name','新名称(不改请留空)','text',undefined,false); field('summary','新说明(不改请留空)','textarea',undefined,false); }
|
|
78
|
+
if (action === 'territory.supervisor') { field('territory_id','领地','select',territories); field('supervisor_binding_id','主管','select',allowedBindings(item=>item.roleType==='SUPERVISOR')); }
|
|
79
|
+
if (action === 'role.bind') {
|
|
80
|
+
const role = field('role_type','角色','select',(state.control.decision.scope.roleTypes || []).map(id=>({id,label:roleNames[id]}))); field('role_name','角色名称');
|
|
81
|
+
const session = field('session_id','运行会话','select',sessions); const update = () => { const needed = role.value !== 'WORKER'; session.required = needed; session.disabled = !needed; session.parentElement.hidden = !needed; }; role.addEventListener('change',update); update();
|
|
82
|
+
}
|
|
83
|
+
if (action === 'role.session') { field('binding_id','要调整的角色','select',allowedBindings(item=>['CHANCELLOR','SUPERVISOR'].includes(item.roleType))); field('session_id','新的运行会话','select',sessions); }
|
|
84
|
+
if (action === 'execution-profile') {
|
|
85
|
+
field('binding_id','要配置的角色','select',allowedBindings(item=>['CHANCELLOR','SUPERVISOR','WORKER'].includes(item.roleType)));
|
|
86
|
+
field('provider','模型服务商(可选,留空使用现有配置默认值)','text',undefined,false); field('model','模型名称');
|
|
87
|
+
}
|
|
88
|
+
if (action === 'ceiling') { const rows=make('div',undefined,'stack field wide'); rows.id='ceiling-rows'; rows.append(ceilingRow()); const add=make('button','添加能力'); add.type='button'; add.addEventListener('click',()=>rows.append(ceilingRow())); el('fields').append(rows,add); }
|
|
89
|
+
if (action === 'budget.policy') {
|
|
90
|
+
field('enabled','预算拦截','select',[{id:'true',label:'启用,按政策检查新增执行'},{id:'false',label:'关闭,保留统计起点与已有记录'}]);
|
|
91
|
+
const limit=field('limit_tokens','周期 Token 额度','number'); limit.min='1'; limit.step='1';
|
|
92
|
+
const reserve=field('reserve_tokens','每次新执行预留 Token(估计)','number'); reserve.min='1'; reserve.step='1';
|
|
93
|
+
field('unknown_policy','存在未知用量时','select',[{id:'BLOCK',label:'阻止新增执行,先核对未知用量'},{id:'WARN',label:'提示后继续,可能超过估计额度'}]);
|
|
94
|
+
const warning=field('warning_percent','提醒阈值(百分比)','number'); warning.min='1'; warning.max='100'; warning.step='1'; warning.value='80';
|
|
95
|
+
}
|
|
96
|
+
if (action === 'plan.adopt') {
|
|
97
|
+
const plans=(Array.isArray(catalog.plans)?catalog.plans:[]).filter(plan=>plan.state==='PROPOSED');
|
|
98
|
+
const selection=field('plan_id','本次采纳的完整计划','select',plans.map(plan=>({id:plan.planId,label:plan.parentTaskId+' · 第 '+plan.version+' 版 · '+(plan.mode==='EXPERT'?'只读专家':'独立小团队')})));
|
|
99
|
+
const version=field('version','固定版本','number'); version.readOnly=true;
|
|
100
|
+
const digest=field('digest','内容指纹(固定)','textarea'); digest.readOnly=true; digest.rows=3; digest.style.overflowWrap='anywhere'; digest.style.wordBreak='break-all';
|
|
101
|
+
const review=make('section',undefined,'field wide'); review.id='plan-adoption-review'; review.setAttribute('aria-live','polite'); el('fields').append(review);
|
|
102
|
+
const update=()=>{ review.replaceChildren(); const plan=plans.find(item=>item.planId===selection.value); version.value=plan?String(plan.version):''; digest.value=plan?plan.digest:'';
|
|
103
|
+
if(!plan){review.append(make('p',plans.length?'请选择一份计划,再核对完整分工。':'当前授权范围内没有可采纳计划;请先核对计划状态及本窗口范围。','muted'));return;}
|
|
104
|
+
const binding=id=>(catalog.bindings || []).find(item=>item.id===id)?.roleName || id;
|
|
105
|
+
const territory=id=>(catalog.territories || []).find(item=>item.id===id)?.name || id;
|
|
106
|
+
review.append(make('h3','整份计划 · '+plan.parentTaskId),make('p','拆分理由:'+plan.reason),make('p','主整合者:'+binding(plan.integratorBindingId)),make('p','整项软额度 '+plan.budgetTokens+' Tokens;每次估计预留 '+plan.reserveTokens+' Tokens。金额未知。'));
|
|
107
|
+
plan.items.forEach(item=>{const row=make('article',undefined,'change');row.append(make('h4',item.title),make('p','负责人:'+binding(item.workerBindingId)+' · 领地:'+territory(item.territoryId)+' · '+(item.access==='READ_ONLY'?'只读':'范围内写入')),make('p','范围:'+item.description),make('p','验收:'+item.acceptanceCriteria),make('p','前置工作:'+(item.dependsOn.length?item.dependsOn.map(key=>plan.items.find(other=>other.key===key)?.title || key).join('、'):'无')),make('p','预期产物:'+item.expectedArtifact));review.append(row);});
|
|
108
|
+
review.append(make('p','所有子项接受后,由指定主执行者实际整合,再由主管正常审查父任务。此采纳不代表产物验收。','muted'));
|
|
109
|
+
}; selection.addEventListener('change',update); update();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function payload() {
|
|
113
|
+
const action=el('action').value; const parameters={};
|
|
114
|
+
for (const field of el('fields').querySelectorAll('[name]')) if (!field.disabled && field.value.trim() !== '') parameters[field.name]=field.value.trim();
|
|
115
|
+
if (action==='execution-profile') { const binding_id=parameters.binding_id; if (!parameters.model) throw new Error('请填写明确的模型名称。'); const profile={...(parameters.provider?{provider:parameters.provider}:{}),model:parameters.model}; return {action,parameters:{binding_id,profile}}; }
|
|
116
|
+
if (action==='ceiling') { const ceiling=Object.create(null); for (const row of el('ceiling-rows').children) { const name=row.querySelector('input').value.trim(); if (!name || Object.hasOwn(ceiling,name)) throw new Error('能力名称不能为空或重复。'); ceiling[name]=row.querySelector('select').value==='true'; } if (!Object.keys(ceiling).length) throw new Error('请至少配置一项能力。'); return {action,parameters:{ceiling}}; }
|
|
117
|
+
if (action==='budget.policy') { const numeric={}; for (const key of ['limit_tokens','reserve_tokens','warning_percent']) { const value=Number(parameters[key]); if (!Number.isSafeInteger(value) || value<1 || key==='warning_percent' && value>100) throw new Error('预算额度、预留和阈值必须是范围内的正整数。'); numeric[key]=value; } if (numeric.reserve_tokens>numeric.limit_tokens) throw new Error('每次预留不能超过周期额度。'); return {action,parameters:{enabled:parameters.enabled==='true',...numeric,unknown_policy:parameters.unknown_policy}}; }
|
|
118
|
+
if (action==='plan.adopt') { const plan=(state.control.catalog?.plans || []).find(item=>item.planId===parameters.plan_id && item.state==='PROPOSED'); const version=Number(parameters.version); if(!plan || !Number.isSafeInteger(version) || version<1 || version!==plan.version || parameters.digest!==plan.digest) throw new Error('请选择当前范围内的完整计划;版本或内容指纹已变化时请重新读取。'); return {action,parameters:{plan_id:plan.planId,version:plan.version,digest:plan.digest}}; }
|
|
119
|
+
if (action==='territory.update' && !parameters.name && !parameters.summary) throw new Error('请填写要修改的名称或说明。');
|
|
120
|
+
return {action,parameters};
|
|
121
|
+
}
|
|
122
|
+
async function request(path, body) {
|
|
123
|
+
const config={credentials:'same-origin',cache:'no-store',headers:{Accept:'application/json'}};
|
|
124
|
+
if (path.startsWith('receipts/')) config.headers['X-Kingdom-Decision-Id']=state.decisionId;
|
|
125
|
+
if (body !== undefined) { config.method='POST'; config.headers['Content-Type']='application/json'; config.headers['X-Kingdom-Client']='owner-gui'; config.headers['X-Kingdom-CSRF']=state.control.csrfToken; config.headers['X-Kingdom-Request-Id']=crypto.randomUUID(); config.body=JSON.stringify(body); }
|
|
126
|
+
const response=await fetch('/api/owner/'+path,config); let result;
|
|
127
|
+
try { result=await response.json(); } catch { throw new Error('未收到可核对的服务端结果。'); }
|
|
128
|
+
if (!response.ok || result.ok===false) { const error=new Error(result.message || '请求未成功。'); error.confirmedRejection=response.status===409 && ['PREVIEW_STALE','PREVIEW_EXPIRED','MUTATION_NOT_APPLIED'].includes(result.errorCode); throw error; }
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
function lock(value) { state.busy=value; el('edit-fields').disabled=value || !!state.preview || state.uncertain || !active(); el('commit').disabled=value || !state.preview || !active() || state.uncertain; el('edit-again').disabled=value || state.uncertain; el('next').disabled=value || state.uncertain; }
|
|
132
|
+
function scopeText(view) {
|
|
133
|
+
const scope=view.scope; const catalog=state.control.catalog || {};
|
|
134
|
+
const lines=[view.kingdomId?'王国:'+view.kingdomId:'仅允许初始化空王国', '操作:'+view.actions.map(action=>names[action] || action).join('、')];
|
|
135
|
+
if (scope.kingdomWide) lines.push('包含明确授权的王国级配置');
|
|
136
|
+
if (scope.territoryIds.length) lines.push('领地:'+(catalog.territories || []).map(item=>item.name).join('、'));
|
|
137
|
+
if (scope.bindingIds.length) lines.push('角色:'+(catalog.bindings || []).map(item=>item.roleName).join('、'));
|
|
138
|
+
return lines.join('\n');
|
|
139
|
+
}
|
|
140
|
+
async function load() {
|
|
141
|
+
try {
|
|
142
|
+
if(pendingInvalid) throw new Error('浏览器中的待确认操作引用无法读取。请保留当前页面并核对原操作记录后再继续。');
|
|
143
|
+
if(state.uncertain && state.preview) { show('result-panel',true); show('lookup',true); show('next',false); text('result-title','正在恢复待确认操作'); text('result-meta','决定 '+state.decisionId+' · 操作 '+state.preview.operationId); }
|
|
144
|
+
const control=await request('control');
|
|
145
|
+
if (state.decisionId !== null && control.decision.decisionId !== state.decisionId) throw new Error('管理窗口已被替换。请保留原决定与操作编号核对结果,不要重新提交原变更。');
|
|
146
|
+
if (state.decisionId === null) state.decisionId=control.decision.decisionId;
|
|
147
|
+
state.control=control;
|
|
148
|
+
if(state.uncertain && state.preview) { show('editor',false); show('preview-panel',false); lock(false); await lookupReceipt(); tick(); return; }
|
|
149
|
+
if (!active()) { tick(); return; }
|
|
150
|
+
show('activation',false); show('window',true); show('editor',true); text('scope',scopeText(control.decision));
|
|
151
|
+
options(el('action'),control.decision.actions.filter(action=>Object.hasOwn(names,action)).map(id=>({id,label:names[id]}))); renderFields(); lock(false); status('管理窗口已就绪。填写变更后先查看预览。'); tick();
|
|
152
|
+
} catch(error) { show('activation',true); show('editor',false); show('window',false); status(error.message); }
|
|
153
|
+
}
|
|
154
|
+
function expire(message) { show('activation',true); show('editor',false); el('commit').disabled=true; el('revoke').disabled=true; status(message); }
|
|
155
|
+
function tick() { if (!state.control) return; const seconds=Math.max(0,Math.ceil((Date.parse(state.control.decision.expiresAt)-Date.now())/1000)); text('expiry','授权剩余 '+Math.floor(seconds/60)+' 分 '+seconds%60+' 秒'); if (!active()) { const receiptUntil=Date.parse(state.control.receiptExpiresAt || ''); expire(Number.isFinite(receiptUntil) && receiptUntil>Date.now()?'写窗口已到期或撤销,仍可在五分钟宽限期内查询已提交结果;新变更需要重新激活。':'管理窗口及结果查询宽限期已结束。请保留操作编号并重新核对。'); } }
|
|
156
|
+
setInterval(tick,1000);
|
|
157
|
+
el('action').addEventListener('change',renderFields);
|
|
158
|
+
el('operation-form').addEventListener('submit',async event=>{
|
|
159
|
+
event.preventDefault(); if (state.busy || state.uncertain || !active()) return; lock(true); status('正在核对范围与当前状态…');
|
|
160
|
+
try { const result=await request('prepare',payload()); state.preview=result.preview; show('preview-panel',true); text('preview-summary',result.preview.summary); el('changes').replaceChildren();
|
|
161
|
+
for (const change of result.preview.changes) { const row=make('div',undefined,'change'); row.append(make('dt',change.label),make('dd','当前:'+(change.before ?? '无'),'before'),make('dd','应用后:'+(change.after ?? '无'),'after')); el('changes').append(row); }
|
|
162
|
+
text('preview-expiry','预览有效至 '+new Date(result.preview.expiresAt).toLocaleTimeString()+'。提交前会再次检查当前状态。'); status('请确认下面的准确变更。'); el('commit').focus();
|
|
163
|
+
} catch(error) { status(error.message); } finally { lock(false); }
|
|
164
|
+
});
|
|
165
|
+
el('edit-again').addEventListener('click',()=>{ if (state.busy || state.uncertain) return; state.preview=null; show('preview-panel',false); lock(false); el('action').focus(); status('可修改内容;修改后需要重新生成预览。'); });
|
|
166
|
+
function receiptView(receipt) { clearPending(); state.uncertain=false; if (receipt.action==='init' && state.control) { state.control.decision.state='CONSUMED'; show('editor',false); show('activation',true); el('revoke').disabled=true; } show('result-panel',true); show('lookup',false); show('next',active()); text('result-title','变更已应用'); text('result-message',receipt.message); text('result-meta','操作 '+receipt.operationId+' · 记录 '+receipt.receiptSeq+' · '+new Date(receipt.appliedAt).toLocaleString()); show('preview-panel',false); status(receipt.action==='init'?'初始化已完成。本次单次授权已用完,日常管理需要按实际范围重新激活。':'已收到本次变更的服务端记录。'); }
|
|
167
|
+
el('commit').addEventListener('click',async()=>{
|
|
168
|
+
if (state.busy || !state.preview || state.uncertain || !active()) return; lock(true); status('正在提交已确认的变更…');
|
|
169
|
+
try { rememberPending(); receiptView((await request('commit',{prepareId:state.preview.prepareId,operationId:state.preview.operationId})).receipt); }
|
|
170
|
+
catch(error) { state.uncertain=!error.confirmedRejection; show('result-panel',true); show('lookup',state.uncertain); show('next',false); text('result-title',error.confirmedRejection?'本次提交未应用':'结果待确认'); text('result-meta','决定 '+state.decisionId+' · 操作 '+state.preview.operationId);
|
|
171
|
+
if(error.confirmedRejection) { clearPending(); state.preview=null; show('preview-panel',false); text('result-message',error.message+' 原输入已保留,请重新查看变更预览。'); status('本次未应用,可以修改内容并重新预览。'); }
|
|
172
|
+
else { text('result-message',error.message+' 请查询同一操作的记录。页面不会自动重发变更;刷新页面后也会恢复此操作。'); status('请先查询本次结果,再决定下一步。'); }
|
|
173
|
+
}
|
|
174
|
+
finally { lock(false); }
|
|
175
|
+
});
|
|
176
|
+
async function lookupReceipt() {
|
|
177
|
+
if (!state.preview || state.busy) return; lock(true);
|
|
178
|
+
try { const result=await request('receipts/'+encodeURIComponent(state.preview.operationId)); if (result.receipt) receiptView(result.receipt); else { text('result-message','暂未发现本次操作的完成记录。这不等于确认没有副作用;请保留操作编号,待核对后再创建新变更。'); status('尚无完成记录;原操作不会被自动重试。'); } }
|
|
179
|
+
catch(error) { status(error.message+' 原决定 '+state.decisionId+';原操作 '+state.preview.operationId+'。'); } finally { lock(false); }
|
|
180
|
+
}
|
|
181
|
+
el('lookup').addEventListener('click',lookupReceipt);
|
|
182
|
+
el('next').addEventListener('click',()=>{ if(state.busy || state.uncertain) return; state.preview=null; void load(); });
|
|
183
|
+
el('revoke').addEventListener('click',async()=>{
|
|
184
|
+
if (!state.control) return; el('revoke').disabled=true;
|
|
185
|
+
try { const result=await request('revoke',{}); state.control.decision.state='REVOKED'; state.control.receiptExpiresAt=result.receiptExpiresAt; expire('管理窗口已撤销。五分钟内仍可查询已提交结果;未提交预览不能继续应用。'); }
|
|
186
|
+
catch(error) { status(error.message+' 撤销尚未确认。'); el('revoke').disabled=false; }
|
|
187
|
+
});
|
|
188
|
+
void load();
|
|
189
|
+
})();
|
|
190
|
+
</script></body></html>`;
|
|
191
|
+
//# sourceMappingURL=owner-ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-ui.js","sourceRoot":"","sources":["../../src/gui/owner-ui.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;IACxF,OAAO,cAAc,CAAC,UAAU,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAA;AAC5D,CAAC;AAED,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAuLT,CAAA"}
|
package/lib/gui/server.js
CHANGED
|
@@ -22,6 +22,7 @@ import { readFileSync } from 'node:fs';
|
|
|
22
22
|
import { createServer } from 'node:http';
|
|
23
23
|
import { GUI_SCHEMA_VERSION } from './contract.js';
|
|
24
24
|
import { CONSOLE_APP_HTML, guiCharacterAssetLocations, isGuiCharacterAssetFile } from './console-app.js';
|
|
25
|
+
import { handleOwnerRequest } from './owner-control.js';
|
|
25
26
|
import { DuplicateJsonKeyError, GUI_COMMAND_PAYLOAD_FIELDS, GUI_FORBIDDEN_PAYLOAD_FIELDS, GUI_OWNER_ONLY_HTTP_COMMANDS, GUI_SESSION_COMMANDS, parseStrictJsonObject, } from './control-contract.js';
|
|
26
27
|
/** 写命令必须带的自定义头(存在即可,值不校验)。 */
|
|
27
28
|
const CLIENT_HEADER = 'x-kingdom-client';
|
|
@@ -329,6 +330,8 @@ export function startGuiServer(handlers, options) {
|
|
|
329
330
|
async function handleRequest(req, res) {
|
|
330
331
|
const url = new URL(req.url ?? '/', `http://${host}`);
|
|
331
332
|
const path = url.pathname.replace(/\/+$/, '') || '/';
|
|
333
|
+
if (await handleOwnerRequest(req, res, url, options.ownerControl))
|
|
334
|
+
return;
|
|
332
335
|
const address = server.address();
|
|
333
336
|
const localOrigin = typeof address === 'object' && address !== null
|
|
334
337
|
? `http://${host}:${address.port}`
|
|
@@ -608,6 +611,7 @@ export function startGuiServer(handlers, options) {
|
|
|
608
611
|
server.close();
|
|
609
612
|
server.closeAllConnections?.();
|
|
610
613
|
options.control?.dispose();
|
|
614
|
+
options.ownerControl?.dispose();
|
|
611
615
|
};
|
|
612
616
|
}
|
|
613
617
|
//# sourceMappingURL=server.js.map
|
package/lib/gui/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/gui/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/gui/server.ts"],"names":[],"mappings":"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"}
|
package/lib/gui/snapshot.js
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dsh-kingdom — DB 行 → GUI 视图的投影(Phase 3)。
|
|
3
|
+
*
|
|
4
|
+
* 全部是**纯函数**:给定 (库状态, now) 就唯一确定输出。
|
|
5
|
+
* 因此 GUI 轮询即可拿到正确的表演状态,服务端不需要任何定时器或推送状态机。
|
|
6
|
+
*
|
|
7
|
+
* 再次强调边界:本文件只产出 `{ role, state, activity }` 这类语义,
|
|
8
|
+
* 绝不产出贴图、clip、场景文件名——那些是 GUI 的 visual-map 的事。
|
|
9
|
+
*/
|
|
10
|
+
import { readDispatchUsage } from '../core/usage.js';
|
|
11
|
+
import { readAdditionalRoleCost, readLatestPromptCosts } from '../core/cost.js';
|
|
12
|
+
import { readBudgetView } from '../core/budget.js';
|
|
13
|
+
import { listCollaborationPlans, readCollaborationReadiness, readPlanBudgetView } from '../core/collaboration.js';
|
|
14
|
+
import { readWorkspaceReservations } from '../core/workspace-admission.js';
|
|
15
|
+
import { buildPersonalWorkbench } from './workbench.js';
|
|
1
16
|
import { GUI_SCHEMA_VERSION, TRANSIENT_WINDOW_MS } from './contract.js';
|
|
2
17
|
import { asExecutionState, isLiveExecutionState, isTerminalExecutionState } from '../core/execution.js';
|
|
3
18
|
import { asTaskStatus } from '../core/task.js';
|
|
@@ -577,8 +592,9 @@ function toDecisionView(row) {
|
|
|
577
592
|
createdAt: row.created_at,
|
|
578
593
|
};
|
|
579
594
|
}
|
|
580
|
-
function toDispatchView(row) {
|
|
595
|
+
function toDispatchView(row, store) {
|
|
581
596
|
return {
|
|
597
|
+
usage: readDispatchUsage(store, row.dispatch_id),
|
|
582
598
|
dispatchId: row.dispatch_id,
|
|
583
599
|
leaseId: row.lease_id,
|
|
584
600
|
executionId: row.execution_id,
|
|
@@ -600,7 +616,7 @@ export function buildGovernance(store, kingdomId) {
|
|
|
600
616
|
workerSessions: store.listAffinities(kingdomId).map(toAffinityView),
|
|
601
617
|
leases: store.listLeases(kingdomId).map(toLeaseView),
|
|
602
618
|
decisions: store.listCapabilityDecisions(kingdomId).map(toDecisionView),
|
|
603
|
-
dispatches: store.listDispatches(kingdomId).map(toDispatchView),
|
|
619
|
+
dispatches: store.listDispatches(kingdomId).map(row => toDispatchView(row, store)),
|
|
604
620
|
};
|
|
605
621
|
}
|
|
606
622
|
/** 任务级 Runtime Governance 投影(TaskDetail 用)。 */
|
|
@@ -611,7 +627,7 @@ export function buildTaskGovernance(store, taskId) {
|
|
|
611
627
|
workerSessions: [],
|
|
612
628
|
leases: store.listLeases(store.getDefaultKingdom()?.kingdom_id ?? '').filter(l => l.task_id === taskId).map(toLeaseView),
|
|
613
629
|
decisions: store.listCapabilityDecisions(store.getDefaultKingdom()?.kingdom_id ?? '').filter(d => d.task_id === taskId).map(toDecisionView),
|
|
614
|
-
dispatches: store.listDispatches(store.getDefaultKingdom()?.kingdom_id ?? '').filter(d => d.task_id === taskId).map(toDispatchView),
|
|
630
|
+
dispatches: store.listDispatches(store.getDefaultKingdom()?.kingdom_id ?? '').filter(d => d.task_id === taskId).map(row => toDispatchView(row, store)),
|
|
615
631
|
};
|
|
616
632
|
}
|
|
617
633
|
/**
|
|
@@ -628,12 +644,12 @@ export function allowedActionsFor(task, execution) {
|
|
|
628
644
|
case 'CREATED':
|
|
629
645
|
return ['assign'];
|
|
630
646
|
case 'ASSIGNED':
|
|
631
|
-
return isGovernedStartBlocked(execution) ? [] : ['start'];
|
|
647
|
+
return executionState === 'RECOVERING' && execution?.execution_contract === 'GOVERNED_PERSISTENT' ? ['reconcile'] : isGovernedStartBlocked(execution) ? [] : ['start'];
|
|
632
648
|
case 'RUNNING': {
|
|
633
649
|
// RECOVERING means the Runtime outcome is unknown. Exposing start here would
|
|
634
650
|
// invite a duplicate attempt before reconciliation, so the projection fails closed.
|
|
635
651
|
if (executionState === 'RECOVERING')
|
|
636
|
-
return [];
|
|
652
|
+
return execution?.execution_contract === 'GOVERNED_PERSISTENT' ? ['reconcile'] : [];
|
|
637
653
|
if (execution === null || !live) {
|
|
638
654
|
// REWORK 之后:任务已回 RUNNING,但还没有新的 Execution。
|
|
639
655
|
return ['start'];
|
|
@@ -1093,19 +1109,20 @@ export function buildTimeline(store, kingdomId, options = {}) {
|
|
|
1093
1109
|
const items = [];
|
|
1094
1110
|
const events = store.listEvents(kingdomId, Math.min(options.eventLimit ?? 50, MAX_PROJECTION_TIMELINE_ITEMS));
|
|
1095
1111
|
for (const event of events) {
|
|
1112
|
+
const usageObservation = event.event_type === 'DISPATCH_USAGE_OBSERVED';
|
|
1096
1113
|
const refs = [eventSource(event.seq)];
|
|
1097
1114
|
const entityRef = event.target_type ? publicEntityRef(event.target_type, event.target_id) : null;
|
|
1098
1115
|
items.push({
|
|
1099
1116
|
id: `event:${event.seq}`,
|
|
1100
|
-
kind: 'GOVERNANCE_FACT',
|
|
1117
|
+
kind: usageObservation ? 'RUNTIME_OBSERVATION' : 'GOVERNANCE_FACT',
|
|
1101
1118
|
occurredAt: safeDate(event.created_at),
|
|
1102
1119
|
entityRef,
|
|
1103
|
-
authoritativeState: stateValue(event.event_type, 'GOVERNANCE_FACT', refs),
|
|
1120
|
+
authoritativeState: stateValue(event.event_type, usageObservation ? 'RUNTIME_OBSERVATION' : 'GOVERNANCE_FACT', refs),
|
|
1104
1121
|
sourceRefs: boundedSourceRefs(refs),
|
|
1105
1122
|
allowedActions: null,
|
|
1106
1123
|
attentionReason: timelineAttention(attentions, entityRef),
|
|
1107
1124
|
terminality: 'UNKNOWN',
|
|
1108
|
-
summary: `Governance Fact: ${boundedText(event.event_type)}`,
|
|
1125
|
+
summary: usageObservation ? 'Provider usage observation (coverage may be partial)' : `Governance Fact: ${boundedText(event.event_type)}`,
|
|
1109
1126
|
requiresOwnerAction: false,
|
|
1110
1127
|
rawEvidenceAvailable: false,
|
|
1111
1128
|
});
|
|
@@ -1447,6 +1464,113 @@ function buildExecutionProjectionData(store, tasks, attentions, security) {
|
|
|
1447
1464
|
truncated: candidates.length > items.length,
|
|
1448
1465
|
};
|
|
1449
1466
|
}
|
|
1467
|
+
/** Keep runtime references and prompt text outside the public cost projection. */
|
|
1468
|
+
function buildWorkbenchCost(store, kingdomId, present, runtime) {
|
|
1469
|
+
const number = (value) => Number.isSafeInteger(value) && Number(value) >= 0 ? Number(value) : null;
|
|
1470
|
+
const rows = present ? readLatestPromptCosts(store, kingdomId) : [];
|
|
1471
|
+
const parts = (value) => Array.isArray(value)
|
|
1472
|
+
? value.slice(0, 24).map(item => ({ name: boundedText(typeof item?.name === 'string' ? item.name : 'UNKNOWN'), bytes: number(item?.bytes) })) : [];
|
|
1473
|
+
return {
|
|
1474
|
+
additionalRoles: present ? readAdditionalRoleCost(store, kingdomId) : null,
|
|
1475
|
+
budget: present ? readBudgetView(store, kingdomId) : null,
|
|
1476
|
+
prompts: { totalCount: rows.length, truncated: rows.length > 40, items: rows.slice(0, 40).map(row => ({
|
|
1477
|
+
bindingId: publicReferenceId(row.bindingId), roleType: boundedText(row.roleType),
|
|
1478
|
+
toolsBefore: number(row.toolsBefore), toolsAfter: number(row.toolsAfter), toolsBytesBefore: number(row.toolsBytesBefore), toolsBytesAfter: number(row.toolsBytesAfter),
|
|
1479
|
+
sections: parts(row.sections), contexts: parts(row.contexts),
|
|
1480
|
+
partsTruncated: (Array.isArray(row.sections) && row.sections.length > 24) || (Array.isArray(row.contexts) && row.contexts.length > 24),
|
|
1481
|
+
historyBytes: null, tokenEstimate: null, mode: row.mode === 'off' || row.mode === 'pilot' ? row.mode : 'UNKNOWN',
|
|
1482
|
+
reasonCode: typeof row.reasonCode === 'string' ? boundedText(row.reasonCode) : null,
|
|
1483
|
+
})) },
|
|
1484
|
+
runtime: { toolDisclosureMode: runtime?.toolDisclosureMode === 'off' || runtime?.toolDisclosureMode === 'pilot' ? runtime.toolDisclosureMode : 'UNKNOWN',
|
|
1485
|
+
observerAvailable: typeof runtime?.observerAvailable === 'boolean' ? runtime.observerAvailable : null },
|
|
1486
|
+
};
|
|
1487
|
+
}
|
|
1488
|
+
/** Apply the bound after exact task selection, so unrelated activity cannot erase task history. */
|
|
1489
|
+
function readTaskEvents(store, kingdomId, taskId, limit) {
|
|
1490
|
+
return store.db.prepare('SELECT * FROM events WHERE kingdom_id = ? AND target_type = ? AND target_id = ? ORDER BY seq DESC LIMIT ?')
|
|
1491
|
+
.all(kingdomId, 'task', taskId, limit);
|
|
1492
|
+
}
|
|
1493
|
+
function readTaskReviewEvents(store, kingdomId, taskId, limit) {
|
|
1494
|
+
return store.db.prepare("SELECT * FROM events WHERE kingdom_id = ? AND target_type = 'task' AND target_id = ? AND actor_role = 'SUPERVISOR' AND event_type IN ('TASK_ACCEPTED', 'TASK_REWORK_REQUESTED', 'TASK_FAILED', 'TASK_HANDED_OFF') ORDER BY seq DESC LIMIT ?")
|
|
1495
|
+
.all(kingdomId, taskId, limit);
|
|
1496
|
+
}
|
|
1497
|
+
/** Canonical reads remain here; the workbench builder only receives public projection values. */
|
|
1498
|
+
function buildWorkbenchCollaboration(store, kingdomId, present) {
|
|
1499
|
+
const publicId = (id) => publicReferenceId(id) ?? 'redacted';
|
|
1500
|
+
const plans = present ? listCollaborationPlans(store, kingdomId) : [];
|
|
1501
|
+
const resources = present && store.isSchemaV4 ? readWorkspaceReservations(store, kingdomId) : [];
|
|
1502
|
+
const readiness = (value) => value ? {
|
|
1503
|
+
ready: value.ready, reasonCode: value.reasonCode, blockingTaskIds: value.blockingTaskIds.map(publicId),
|
|
1504
|
+
acceptedResults: value.handoffs.map(item => ({ taskId: publicId(item.taskId), attemptNo: item.attemptNo,
|
|
1505
|
+
resultId: publicId(item.resultId), resultDigest: item.resultDigest, acceptEventId: publicId(item.acceptEventId) })),
|
|
1506
|
+
} : null;
|
|
1507
|
+
return {
|
|
1508
|
+
pendingAdoptionCount: plans.filter(plan => plan.state === 'PROPOSED').length,
|
|
1509
|
+
plans: { totalCount: plans.length, truncated: plans.length > 40, items: plans.slice(0, 40).map(plan => ({
|
|
1510
|
+
planId: publicId(plan.planId), parentTaskId: publicId(plan.parentTaskId), title: boundedText(store.getTask(plan.parentTaskId)?.title),
|
|
1511
|
+
version: plan.version, digest: plan.digest, state: plan.state, mode: plan.mode, reason: boundedText(plan.reason),
|
|
1512
|
+
integratorBindingId: publicId(plan.integratorBindingId), integratorName: boundedText(store.getBindingById(plan.integratorBindingId)?.role_name),
|
|
1513
|
+
parentStatus: store.getTask(plan.parentTaskId)?.status ?? 'UNKNOWN', budgetTokens: plan.budgetTokens, reserveTokens: plan.reserveTokens,
|
|
1514
|
+
adoptedAt: plan.adoptedAt, integration: readiness(readCollaborationReadiness(store, kingdomId, plan.parentTaskId)),
|
|
1515
|
+
budget: readPlanBudgetView(store, kingdomId, plan.planId),
|
|
1516
|
+
items: plan.items.map(item => ({ key: boundedText(item.key), taskId: publicId(item.taskId), title: boundedText(item.title),
|
|
1517
|
+
description: boundedText(item.description), acceptanceCriteria: boundedText(item.acceptanceCriteria),
|
|
1518
|
+
territoryId: publicId(item.territoryId), territoryName: boundedText(store.getTerritoryById(item.territoryId)?.name),
|
|
1519
|
+
workerBindingId: publicId(item.workerBindingId), workerName: boundedText(store.getBindingById(item.workerBindingId)?.role_name),
|
|
1520
|
+
access: item.access, dependsOn: item.dependsOn.map(boundedText), expectedArtifact: boundedText(item.expectedArtifact),
|
|
1521
|
+
status: store.getTask(item.taskId)?.status ?? 'NOT_CREATED', readiness: readiness(readCollaborationReadiness(store, kingdomId, item.taskId)) })),
|
|
1522
|
+
})) },
|
|
1523
|
+
resources: { totalCount: resources.length, truncated: resources.length > 80, items: resources.slice(0, 80).map(item => ({
|
|
1524
|
+
taskId: publicId(item.taskId), attemptNo: item.attemptNo, access: item.access, state: boundedText(item.state), recovery: item.recovery,
|
|
1525
|
+
})) },
|
|
1526
|
+
};
|
|
1527
|
+
}
|
|
1528
|
+
function buildWorkbenchData(store, kingdomId, tasks, security, costRuntime) {
|
|
1529
|
+
const kingdom = store.getDefaultKingdom();
|
|
1530
|
+
const present = kingdom?.kingdom_id === kingdomId;
|
|
1531
|
+
const bindings = present ? store.listBindings(kingdomId) : [];
|
|
1532
|
+
const territories = present ? store.listTerritories(kingdomId) : [];
|
|
1533
|
+
const publicId = (id) => publicReferenceId(id) ?? 'redacted';
|
|
1534
|
+
const taskInputs = tasks.map(task => {
|
|
1535
|
+
const view = toTaskView(store, task);
|
|
1536
|
+
const claim = store.latestWorkerResult(task.task_id);
|
|
1537
|
+
const execution = store.latestExecution(task.task_id);
|
|
1538
|
+
const review = readTaskReviewEvents(store, kingdomId, task.task_id, 1)[0];
|
|
1539
|
+
return {
|
|
1540
|
+
task: {
|
|
1541
|
+
taskId: publicId(task.task_id), territoryId: publicId(task.territory_id), title: boundedText(task.title),
|
|
1542
|
+
status: boundedText(task.status), assignedBindingId: publicReferenceId(task.assigned_binding_id), updatedAt: safeDate(task.updated_at) ?? '',
|
|
1543
|
+
latestClaim: view.latestClaim ? { ...view.latestClaim, resultId: publicId(view.latestClaim.resultId),
|
|
1544
|
+
workerBindingId: publicReferenceId(view.latestClaim.workerBindingId), sessionId: null } : null,
|
|
1545
|
+
latestExecution: view.latestExecution ? { ...view.latestExecution, executionId: publicId(view.latestExecution.executionId),
|
|
1546
|
+
taskId: publicId(task.task_id), workerBindingId: publicReferenceId(view.latestExecution.workerBindingId), sessionId: null,
|
|
1547
|
+
leaseId: publicReferenceId(view.latestExecution.leaseId), capabilityDecisionId: publicReferenceId(view.latestExecution.capabilityDecisionId) } : null,
|
|
1548
|
+
},
|
|
1549
|
+
actionAvailability: buildActionAvailability(store, task, execution, security),
|
|
1550
|
+
latestReview: review ? toSupervisorDecisionView(review) : null,
|
|
1551
|
+
claimExecutionMismatch: Boolean(claim && execution && claimExecutionMismatch(claim, execution)),
|
|
1552
|
+
};
|
|
1553
|
+
});
|
|
1554
|
+
const governance = present ? buildGovernance(store, kingdomId) : emptyGovernance();
|
|
1555
|
+
// Only public IDs, reason codes and typed token observations can be consumed by the workbench.
|
|
1556
|
+
governance.decisions = governance.decisions.map(decision => ({ ...decision, decisionId: publicId(decision.decisionId), taskId: publicId(decision.taskId), reasonCode: boundedText(decision.reasonCode) || null }));
|
|
1557
|
+
governance.dispatches = governance.dispatches.map(dispatch => ({ ...dispatch, dispatchId: publicId(dispatch.dispatchId), taskId: publicId(dispatch.taskId),
|
|
1558
|
+
executionId: publicId(dispatch.executionId), leaseId: publicId(dispatch.leaseId), runtimeDispatchRef: null, runtimeExecutionRef: null }));
|
|
1559
|
+
governance.leases = governance.leases.map(lease => ({ ...lease, leaseId: publicId(lease.leaseId), taskId: publicId(lease.taskId) }));
|
|
1560
|
+
return buildPersonalWorkbench({
|
|
1561
|
+
kingdomPresent: present,
|
|
1562
|
+
bindings: bindings.map(binding => ({ bindingId: publicId(binding.binding_id), roleType: boundedText(binding.role_type), roleName: boundedText(binding.role_name),
|
|
1563
|
+
status: boundedText(binding.status), sessionBound: binding.session_id !== null })),
|
|
1564
|
+
territories: territories.map(territory => ({ territoryId: publicId(territory.territory_id), name: boundedText(territory.name), status: boundedText(territory.status),
|
|
1565
|
+
supervisorBindingId: publicReferenceId(territory.supervisor_binding_id) })),
|
|
1566
|
+
tasks: taskInputs,
|
|
1567
|
+
executions: tasks.flatMap(task => store.listExecutions(task.task_id).map(execution => ({ executionId: publicId(execution.execution_id), taskId: publicId(task.task_id),
|
|
1568
|
+
workerBindingId: publicReferenceId(execution.worker_binding_id), state: boundedText(execution.state) }))),
|
|
1569
|
+
governance,
|
|
1570
|
+
cost: buildWorkbenchCost(store, kingdomId, present, costRuntime),
|
|
1571
|
+
collaboration: buildWorkbenchCollaboration(store, kingdomId, present),
|
|
1572
|
+
});
|
|
1573
|
+
}
|
|
1450
1574
|
/** S1 顶层只读 Projection;没有 kingdom 时显式返回 UNKNOWN/空数据。 */
|
|
1451
1575
|
export function buildReadonlySnapshotProjection(store, kingdomId, options = {}) {
|
|
1452
1576
|
const nowMs = options.nowMs ?? Date.now();
|
|
@@ -1523,6 +1647,14 @@ export function buildReadonlySnapshotProjection(store, kingdomId, options = {})
|
|
|
1523
1647
|
attentionReason: topAttention,
|
|
1524
1648
|
data: attentions,
|
|
1525
1649
|
}),
|
|
1650
|
+
workbench: projectionEnvelope({
|
|
1651
|
+
revision,
|
|
1652
|
+
refreshedAt,
|
|
1653
|
+
entityRef: kingdomRef,
|
|
1654
|
+
authoritativeState: null,
|
|
1655
|
+
sourceRefs: [...sourceRefs, ruleSource('PERSONAL_WORKBENCH_DERIVED')],
|
|
1656
|
+
data: buildWorkbenchData(store, actualKingdomId, tasks, options.security, options.costRuntime),
|
|
1657
|
+
}),
|
|
1526
1658
|
};
|
|
1527
1659
|
}
|
|
1528
1660
|
export function buildSnapshot(store, options) {
|
|
@@ -1547,6 +1679,7 @@ export function buildSnapshot(store, options) {
|
|
|
1547
1679
|
eventLimit: options.eventLimit,
|
|
1548
1680
|
nowMs,
|
|
1549
1681
|
security: options.security,
|
|
1682
|
+
costRuntime: options.costRuntime,
|
|
1550
1683
|
}),
|
|
1551
1684
|
};
|
|
1552
1685
|
}
|
|
@@ -1587,6 +1720,7 @@ export function buildSnapshot(store, options) {
|
|
|
1587
1720
|
eventLimit: options.eventLimit,
|
|
1588
1721
|
nowMs,
|
|
1589
1722
|
security: options.security,
|
|
1723
|
+
costRuntime: options.costRuntime,
|
|
1590
1724
|
}),
|
|
1591
1725
|
};
|
|
1592
1726
|
}
|
|
@@ -1600,13 +1734,10 @@ export function buildTaskDetail(store, kingdomId, taskId, options = {}) {
|
|
|
1600
1734
|
const binding = task.assigned_binding_id ? store.getBindingById(task.assigned_binding_id) : null;
|
|
1601
1735
|
const assignments = store.listTaskAssignments(taskId);
|
|
1602
1736
|
const executions = store.listExecutions(taskId);
|
|
1603
|
-
const
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
const reviews = related
|
|
1608
|
-
.filter(e => ['TASK_ACCEPTED', 'TASK_REWORK_REQUESTED', 'TASK_FAILED', 'TASK_HANDED_OFF'].includes(e.event_type))
|
|
1609
|
-
.map(toSupervisorDecisionView);
|
|
1737
|
+
const taskEvents = readTaskEvents(store, kingdomId, taskId, 501);
|
|
1738
|
+
const related = taskEvents.slice(0, 500).sort((a, b) => a.seq - b.seq);
|
|
1739
|
+
const reviewEvents = readTaskReviewEvents(store, kingdomId, taskId, 501);
|
|
1740
|
+
const reviews = reviewEvents.slice(0, 500).sort((a, b) => a.seq - b.seq).map(toSupervisorDecisionView);
|
|
1610
1741
|
const view = toTaskView(store, task);
|
|
1611
1742
|
return {
|
|
1612
1743
|
schemaVersion: GUI_SCHEMA_VERSION,
|
|
@@ -1618,9 +1749,13 @@ export function buildTaskDetail(store, kingdomId, taskId, options = {}) {
|
|
|
1618
1749
|
claims: store.listWorkerResults(taskId).map(toClaimView),
|
|
1619
1750
|
executions: executions.map(toExecutionView),
|
|
1620
1751
|
reviews,
|
|
1752
|
+
reviewsTruncated: reviewEvents.length > reviews.length,
|
|
1621
1753
|
relatedEvents: related.map(toEventView),
|
|
1754
|
+
relatedEventsTruncated: taskEvents.length > related.length,
|
|
1755
|
+
humanAcceptance: 'NOT_RECORDED',
|
|
1622
1756
|
allowedActions: view.allowedActions,
|
|
1623
1757
|
governance: buildTaskGovernance(store, taskId),
|
|
1758
|
+
additionalRoleCost: readAdditionalRoleCost(store, kingdomId, taskId),
|
|
1624
1759
|
projection: buildTaskProjection(store, kingdomId, task, options),
|
|
1625
1760
|
};
|
|
1626
1761
|
}
|