dsh-kingdom 0.5.2 → 0.7.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/README.md +3 -3
- package/lib/core/binding.js +92 -12
- package/lib/core/binding.js.map +1 -1
- package/lib/core/db.js +285 -17
- package/lib/core/db.js.map +1 -1
- package/lib/core/kingdom.js +4 -0
- package/lib/core/kingdom.js.map +1 -1
- package/lib/core/task-service.js +215 -40
- package/lib/core/task-service.js.map +1 -1
- package/lib/core/territory.js +67 -13
- package/lib/core/territory.js.map +1 -1
- package/lib/gui/contract.js.map +1 -1
- package/lib/gui/snapshot.js +3 -0
- package/lib/gui/snapshot.js.map +1 -1
- package/lib/index.js +93 -11
- package/lib/index.js.map +1 -1
- package/lib/types/core/binding.d.ts +42 -4
- package/lib/types/core/db.d.ts +137 -6
- package/lib/types/core/task-service.d.ts +8 -5
- package/lib/types/core/territory.d.ts +20 -10
- package/lib/types/gui/contract.d.ts +6 -1
- package/lib/types/worker/dsh-subagent.d.ts +13 -1
- package/lib/types/worker/executor-factory.d.ts +62 -0
- package/lib/types/worker/executor.d.ts +23 -0
- package/lib/worker/dsh-subagent.js +14 -3
- package/lib/worker/dsh-subagent.js.map +1 -1
- package/lib/worker/executor-factory.js +70 -0
- package/lib/worker/executor-factory.js.map +1 -0
- package/lib/worker/executor.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
**在 DeepSeek Harness 里,装一个插件,拥有一个自己的 Agent 王国。**
|
|
6
6
|
|
|
7
7
|
[](https://github.com/lusblead/dsh-Kingdom/actions/workflows/ci.yml)
|
|
8
|
-
[](https://github.com/lusblead/dsh-Kingdom/releases)
|
|
9
9
|
[](LICENSE)
|
|
10
10
|
[](#compatibility)
|
|
11
11
|
[](#requirements)
|
|
@@ -68,10 +68,10 @@ dsh plugin --profile web add dsh-kingdom
|
|
|
68
68
|
|
|
69
69
|
**方式 B:从 GitHub Releases 下载 tgz**
|
|
70
70
|
|
|
71
|
-
从 [Releases](https://github.com/lusblead/dsh-Kingdom/releases) 下载 `dsh-kingdom-0.
|
|
71
|
+
从 [Releases](https://github.com/lusblead/dsh-Kingdom/releases) 下载 `dsh-kingdom-0.7.0.tgz`,然后:
|
|
72
72
|
|
|
73
73
|
```bash
|
|
74
|
-
dsh plugin --profile web add ./dsh-kingdom-0.
|
|
74
|
+
dsh plugin --profile web add ./dsh-kingdom-0.7.0.tgz
|
|
75
75
|
```
|
|
76
76
|
|
|
77
77
|
> 安装时会打印 5 条 peer dependency warning——**这是预期的**(这些包由 DSH 运行时提供),不是失败。
|
package/lib/core/binding.js
CHANGED
|
@@ -18,6 +18,75 @@
|
|
|
18
18
|
*/
|
|
19
19
|
import { randomUUID } from 'node:crypto';
|
|
20
20
|
export const ROLE_TYPES = ['OWNER', 'CHANCELLOR', 'SUPERVISOR', 'WORKER'];
|
|
21
|
+
/**
|
|
22
|
+
* v0.7.0(M2):Singleton 是 Domain Policy,不是 API 偶然限制。
|
|
23
|
+
* OWNER / CHANCELLOR 只允许一个 ACTIVE 绑定;SUPERVISOR / WORKER 允许 N 个。
|
|
24
|
+
*/
|
|
25
|
+
export const SINGLETON_ROLES = ['OWNER', 'CHANCELLOR'];
|
|
26
|
+
/** 解析 role_bindings.execution_profile_json;非法 JSON = 未配置(不猜)。 */
|
|
27
|
+
export function parseExecutionProfile(json) {
|
|
28
|
+
if (!json)
|
|
29
|
+
return null;
|
|
30
|
+
try {
|
|
31
|
+
const parsed = JSON.parse(json);
|
|
32
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))
|
|
33
|
+
return null;
|
|
34
|
+
const profile = parsed;
|
|
35
|
+
const out = {};
|
|
36
|
+
if (typeof profile.provider === 'string' && profile.provider.trim().length > 0)
|
|
37
|
+
out.provider = profile.provider.trim();
|
|
38
|
+
if (typeof profile.model === 'string' && profile.model.trim().length > 0)
|
|
39
|
+
out.model = profile.model.trim();
|
|
40
|
+
return Object.keys(out).length > 0 ? out : null;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* v0.6.0(M1-C):设置/清空角色执行配置(组织资源配置,治理对象)。
|
|
48
|
+
*
|
|
49
|
+
* 必须走 Trusted Governance Administration Plane(requireAdmin):
|
|
50
|
+
* session-bound 下仅真实 OWNER 会话可执行;declarative 演示模式保持现状。
|
|
51
|
+
* 独立工具面 `kingdom_set_execution_profile`,不塞进 bind_session
|
|
52
|
+
* (治理身份 Session 与执行能力 Profile 不混用)。
|
|
53
|
+
*/
|
|
54
|
+
export function setExecutionProfile(store, input, auth) {
|
|
55
|
+
const admin = requireAdmin(store, input.kingdomId, auth);
|
|
56
|
+
if (!admin.ok)
|
|
57
|
+
return admin.message;
|
|
58
|
+
const binding = resolveBinding(store, input.kingdomId, input.roleType, input.bindingId);
|
|
59
|
+
if (binding === null) {
|
|
60
|
+
return input.bindingId?.trim()
|
|
61
|
+
? `错误:找不到绑定 ${input.bindingId.trim()}(请核对 binding_id 是否属于当前王国)。`
|
|
62
|
+
: `错误:当前王国没有 ${input.roleType?.trim().toUpperCase()} 角色绑定可配置执行环境。`;
|
|
63
|
+
}
|
|
64
|
+
const json = input.profile === null ? null : JSON.stringify(input.profile);
|
|
65
|
+
// execution_profile_json 有独立写入通道(不混入 updateBindingProfile 的身份 patch 面)
|
|
66
|
+
store.setExecutionProfileJson(binding.binding_id, json);
|
|
67
|
+
const after = store.getBindingById(binding.binding_id);
|
|
68
|
+
store.appendEvent({
|
|
69
|
+
event_id: randomUUID(),
|
|
70
|
+
kingdom_id: input.kingdomId,
|
|
71
|
+
event_type: 'EXECUTION_PROFILE_UPDATED',
|
|
72
|
+
actor_role: admin.owner ? 'OWNER' : binding.role_type,
|
|
73
|
+
actor_id: admin.owner?.binding_id ?? null,
|
|
74
|
+
target_type: 'binding',
|
|
75
|
+
target_id: binding.binding_id,
|
|
76
|
+
payload_json: JSON.stringify({
|
|
77
|
+
role_type: binding.role_type,
|
|
78
|
+
role_name: binding.role_name,
|
|
79
|
+
provider: input.profile?.provider ?? null,
|
|
80
|
+
model: input.profile?.model ?? null,
|
|
81
|
+
cleared: input.profile === null,
|
|
82
|
+
}),
|
|
83
|
+
created_at: new Date().toISOString(),
|
|
84
|
+
});
|
|
85
|
+
const desc = input.profile === null
|
|
86
|
+
? '执行配置已清空(将回退全局 workerProvider)'
|
|
87
|
+
: `执行配置已更新:provider=${input.profile.provider ?? '(全局回退)'},model=${input.profile.model ?? '(继承父 Agent)'}`;
|
|
88
|
+
return `角色 ${binding.role_type}(${binding.role_name})${desc}。`;
|
|
89
|
+
}
|
|
21
90
|
/** 把 session_meta 归一化为可入库的 JSON 字符串(非法 JSON 一律落 null,不猜)。 */
|
|
22
91
|
export function normalizeSessionMeta(meta) {
|
|
23
92
|
if (meta === undefined || meta === null)
|
|
@@ -70,13 +139,15 @@ export function bindRole(store, input, auth) {
|
|
|
70
139
|
const modelName = input.modelName?.trim() || null;
|
|
71
140
|
const agentName = input.agentName?.trim() || null;
|
|
72
141
|
const sessionMeta = normalizeSessionMeta(input.sessionMeta);
|
|
73
|
-
//
|
|
142
|
+
// Singleton 是 Domain Policy(v0.7.0 M2):OWNER/CHANCELLOR 拒绝第二个 ACTIVE;
|
|
143
|
+
// SUPERVISOR/WORKER 允许多绑定(getBindingsByRole 供派发/scope 使用)。
|
|
74
144
|
const existing = store.getBindingByRole(input.kingdomId, roleType);
|
|
75
|
-
if (existing) {
|
|
145
|
+
if (existing && SINGLETON_ROLES.includes(roleType)) {
|
|
76
146
|
return `角色 ${roleType} 已有绑定(${existing.role_name},session=${existing.session_id ?? '未绑定 session'}` +
|
|
77
147
|
`${existing.model_name ? `,model=${existing.model_name}` : ''}` +
|
|
78
148
|
`${existing.agent_name ? `,agent=${existing.agent_name}` : ''})。` +
|
|
79
|
-
|
|
149
|
+
`(${roleType} 是单席位角色,同一时间只允许一个 ACTIVE 绑定。` +
|
|
150
|
+
`如需更换会话/身份,用 kingdom_bind_session;如需换届,用 kingdom_unbind_role 退任后重绑。)`;
|
|
80
151
|
}
|
|
81
152
|
const now = new Date().toISOString();
|
|
82
153
|
store.insertBinding({
|
|
@@ -89,6 +160,10 @@ export function bindRole(store, input, auth) {
|
|
|
89
160
|
model_name: modelName,
|
|
90
161
|
agent_name: agentName,
|
|
91
162
|
session_meta: sessionMeta,
|
|
163
|
+
execution_profile_json: null,
|
|
164
|
+
status: 'ACTIVE',
|
|
165
|
+
retired_at: null,
|
|
166
|
+
retired_reason: null,
|
|
92
167
|
principal_id: null,
|
|
93
168
|
created_at: now,
|
|
94
169
|
updated_at: now,
|
|
@@ -121,10 +196,10 @@ export function bindRole(store, input, auth) {
|
|
|
121
196
|
return `已绑定角色 ${roleType}(${roleName}${identity ? `,${identity}` : ',未指定会话身份'})。`;
|
|
122
197
|
}
|
|
123
198
|
/**
|
|
124
|
-
* v0.4
|
|
125
|
-
* - OWNER 受保护:王国需要常驻 Owner
|
|
126
|
-
* -
|
|
127
|
-
*
|
|
199
|
+
* v0.4:解绑(换届通道);v0.7.0(M2):**tombstone 退任**(不再物理删除)。
|
|
200
|
+
* - OWNER 受保护:王国需要常驻 Owner,退任直接拒绝。
|
|
201
|
+
* - 退任 = ACTIVE→RETIRED(+ retired_at/reason):历史引用(task_assignments/executions/
|
|
202
|
+
* 事件 actor/领地主理)永远可解析;治理操作因缺 ACTIVE 绑定明确报错。
|
|
128
203
|
*/
|
|
129
204
|
export function unbindRole(store, input, auth) {
|
|
130
205
|
const admin = requireAdmin(store, input.kingdomId, auth);
|
|
@@ -142,12 +217,16 @@ export function unbindRole(store, input, auth) {
|
|
|
142
217
|
if (binding.role_type === 'OWNER') {
|
|
143
218
|
return `错误:OWNER 是王国的常驻所有者身份,不允许解绑。如需更换 Owner 请重建王国或等待未来版本。`;
|
|
144
219
|
}
|
|
145
|
-
|
|
220
|
+
if (binding.status === 'RETIRED') {
|
|
221
|
+
return `角色 ${binding.role_type}(${binding.role_name})已处于 RETIRED 状态,无需重复退任。`;
|
|
222
|
+
}
|
|
223
|
+
const reason = input.reason?.trim() ?? null;
|
|
224
|
+
store.retireBinding(binding.binding_id, reason);
|
|
146
225
|
store.appendEvent({
|
|
147
226
|
event_id: randomUUID(),
|
|
148
227
|
kingdom_id: input.kingdomId,
|
|
149
228
|
event_type: 'ROLE_UNBOUND',
|
|
150
|
-
// v0.5.2 审计修正:actor = 实际操作者(OWNER),target =
|
|
229
|
+
// v0.5.2 审计修正:actor = 实际操作者(OWNER),target = 被退任的绑定。
|
|
151
230
|
actor_role: admin.owner ? 'OWNER' : binding.role_type,
|
|
152
231
|
actor_id: admin.owner?.binding_id ?? null,
|
|
153
232
|
target_type: 'binding',
|
|
@@ -156,12 +235,13 @@ export function unbindRole(store, input, auth) {
|
|
|
156
235
|
role_type: binding.role_type,
|
|
157
236
|
role_name: binding.role_name,
|
|
158
237
|
session_id: binding.session_id,
|
|
159
|
-
reason
|
|
238
|
+
reason,
|
|
239
|
+
status: 'RETIRED',
|
|
160
240
|
}),
|
|
161
241
|
created_at: new Date().toISOString(),
|
|
162
242
|
});
|
|
163
|
-
return
|
|
164
|
-
|
|
243
|
+
return `角色 ${binding.role_type}(${binding.role_name},session=${binding.session_id ?? '未绑定'})已退任(RETIRED)` +
|
|
244
|
+
`${reason ? `,原因:${reason}` : ''}。历史记录仍可追溯;该角色席位现在空缺,可重新 kingdom_bind_role。`;
|
|
165
245
|
}
|
|
166
246
|
/**
|
|
167
247
|
* v0.4:把角色绑定到(或改绑到)某个独立会话,并更新身份预留字段。
|
package/lib/core/binding.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binding.js","sourceRoot":"","sources":["../../src/core/binding.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"binding.js","sourceRoot":"","sources":["../../src/core/binding.ts"],"names":[],"mappings":"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"}
|
package/lib/core/db.js
CHANGED
|
@@ -20,12 +20,16 @@ import { asExecutionState, isTerminalExecutionState, transitionExecution, } from
|
|
|
20
20
|
/**
|
|
21
21
|
* 记录在 kingdoms.schema_version 上的值。
|
|
22
22
|
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
23
|
+
* - v1:0.x–0.5.x(幂等 DDL 收敛);
|
|
24
|
+
* - v2:v0.6.0 执行证据列(M1-C);
|
|
25
|
+
* - v3:v0.7.0(M2 Organization Scale)——
|
|
26
|
+
* role_bindings tombstone(status/retired_at/retired_reason)、
|
|
27
|
+
* territories tombstone(deleted_at/deleted_reason)、
|
|
28
|
+
* task_assignments(权威派遣历史 + one-active 唯一索引)、
|
|
29
|
+
* Territory supervisor backfill(1 个 ACTIVE Supervisor → NULL scope 领地自动接管)。
|
|
30
|
+
* 迁移均为 Versioned + transactional + idempotent ADD COLUMN / CREATE TABLE(不重建表)。
|
|
27
31
|
*/
|
|
28
|
-
export const SCHEMA_VERSION =
|
|
32
|
+
export const SCHEMA_VERSION = 3;
|
|
29
33
|
export const SCHEMA_SQL = `
|
|
30
34
|
CREATE TABLE IF NOT EXISTS kingdoms (
|
|
31
35
|
kingdom_id TEXT PRIMARY KEY,
|
|
@@ -119,6 +123,25 @@ CREATE TABLE IF NOT EXISTS executions (
|
|
|
119
123
|
);
|
|
120
124
|
|
|
121
125
|
CREATE INDEX IF NOT EXISTS executions_task_idx ON executions(task_id);
|
|
126
|
+
|
|
127
|
+
CREATE TABLE IF NOT EXISTS task_assignments (
|
|
128
|
+
assignment_id TEXT PRIMARY KEY,
|
|
129
|
+
task_id TEXT NOT NULL,
|
|
130
|
+
territory_id TEXT NOT NULL,
|
|
131
|
+
worker_binding_id TEXT NOT NULL,
|
|
132
|
+
assigned_by TEXT NOT NULL,
|
|
133
|
+
assigned_at TEXT NOT NULL,
|
|
134
|
+
ended_at TEXT,
|
|
135
|
+
end_reason TEXT,
|
|
136
|
+
previous_assignment_id TEXT,
|
|
137
|
+
handoff_reason TEXT,
|
|
138
|
+
created_at TEXT NOT NULL
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
CREATE UNIQUE INDEX IF NOT EXISTS one_active_assignment_per_task
|
|
142
|
+
ON task_assignments(task_id) WHERE ended_at IS NULL;
|
|
143
|
+
|
|
144
|
+
CREATE INDEX IF NOT EXISTS task_assignments_task_idx ON task_assignments(task_id);
|
|
122
145
|
`;
|
|
123
146
|
export class KingdomStore {
|
|
124
147
|
db;
|
|
@@ -133,6 +156,8 @@ export class KingdomStore {
|
|
|
133
156
|
this.db.exec(SCHEMA_SQL);
|
|
134
157
|
this.ensureEventSequence();
|
|
135
158
|
this.ensureSessionProfileColumns();
|
|
159
|
+
this.ensureSchemaV2();
|
|
160
|
+
this.ensureSchemaV3();
|
|
136
161
|
}
|
|
137
162
|
/**
|
|
138
163
|
* v0.4:给 role_bindings 补会话身份预留列(model_name / agent_name / session_meta)。
|
|
@@ -150,6 +175,135 @@ export class KingdomStore {
|
|
|
150
175
|
}
|
|
151
176
|
}
|
|
152
177
|
}
|
|
178
|
+
/**
|
|
179
|
+
* v0.6.0(M1-C,用户裁决 ④):正式 Schema v2 迁移。
|
|
180
|
+
*
|
|
181
|
+
* Versioned + transactional + idempotent ADD COLUMN:
|
|
182
|
+
* 1. 读 kingdoms.schema_version 判定是否需要升级(v1 → v2;新库建表后即 v2 无需动);
|
|
183
|
+
* 2. BEGIN IMMEDIATE → PRAGMA table_info gate 逐列 ADD COLUMN(缺啥补啥)→
|
|
184
|
+
* verify 全部预期列存在(缺失即抛错)→ UPDATE schema_version=2 → COMMIT;
|
|
185
|
+
* 3. 任一步失败 ROLLBACK,开库即失败(fail-loud,不留下半迁移的库)。
|
|
186
|
+
*
|
|
187
|
+
* 仍保持"增量、安全、不重建":ADD COLUMN 是 O(1) 元数据操作。
|
|
188
|
+
*/
|
|
189
|
+
ensureSchemaV2() {
|
|
190
|
+
const row = this.db
|
|
191
|
+
.prepare('SELECT COALESCE(MAX(schema_version), 0) AS v FROM kingdoms')
|
|
192
|
+
.get();
|
|
193
|
+
if ((row?.v ?? 0) >= SCHEMA_VERSION)
|
|
194
|
+
return;
|
|
195
|
+
const bindingColumns = ['execution_profile_json'];
|
|
196
|
+
const executionColumns = [
|
|
197
|
+
'executor_kind', 'provider', 'provider_source',
|
|
198
|
+
'requested_model', 'resolved_model', 'model_source',
|
|
199
|
+
'execution_profile_json',
|
|
200
|
+
];
|
|
201
|
+
const tableColumns = (table) => new Set(this.db.prepare(`PRAGMA table_info(${table})`).all().map(c => c.name));
|
|
202
|
+
this.db.exec('BEGIN IMMEDIATE');
|
|
203
|
+
try {
|
|
204
|
+
const bindings = tableColumns('role_bindings');
|
|
205
|
+
for (const column of bindingColumns) {
|
|
206
|
+
if (!bindings.has(column))
|
|
207
|
+
this.db.exec(`ALTER TABLE role_bindings ADD COLUMN ${column} TEXT`);
|
|
208
|
+
}
|
|
209
|
+
const executions = tableColumns('executions');
|
|
210
|
+
for (const column of executionColumns) {
|
|
211
|
+
if (!executions.has(column))
|
|
212
|
+
this.db.exec(`ALTER TABLE executions ADD COLUMN ${column} TEXT`);
|
|
213
|
+
}
|
|
214
|
+
// verify:全部预期列必须存在,缺失即失败(fail-loud,不静默通过半迁移)
|
|
215
|
+
const afterBindings = tableColumns('role_bindings');
|
|
216
|
+
const afterExecutions = tableColumns('executions');
|
|
217
|
+
for (const column of bindingColumns) {
|
|
218
|
+
if (!afterBindings.has(column))
|
|
219
|
+
throw new Error(`Schema v2 migration failed: role_bindings.${column} missing`);
|
|
220
|
+
}
|
|
221
|
+
for (const column of executionColumns) {
|
|
222
|
+
if (!afterExecutions.has(column))
|
|
223
|
+
throw new Error(`Schema v2 migration failed: executions.${column} missing`);
|
|
224
|
+
}
|
|
225
|
+
// 注意:写本迁移的目标版本 2,而不是全局 SCHEMA_VERSION(v3 迁移的入口判断依赖它)。
|
|
226
|
+
this.db.prepare('UPDATE kingdoms SET schema_version = ?').run(2);
|
|
227
|
+
this.db.exec('COMMIT');
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
this.db.exec('ROLLBACK');
|
|
231
|
+
throw error;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* v0.7.0(M2 Organization Scale):Schema v3 迁移。
|
|
236
|
+
*
|
|
237
|
+
* 1. role_bindings tombstone:status(ACTIVE|RETIRED)/ retired_at / retired_reason;
|
|
238
|
+
* 2. territories tombstone:deleted_at / deleted_reason(status 已有列,语义扩展 DELETED);
|
|
239
|
+
* 3. task_assignments 表与索引(SCHEMA_SQL 已建,这里 verify + 旧库兜底);
|
|
240
|
+
* 4. Territory supervisor backfill:恰好 1 个 ACTIVE Supervisor 时,
|
|
241
|
+
* 把所有 supervisor_binding_id IS NULL 的 ACTIVE Territory 自动接管(v2 兼容,老用户无感);
|
|
242
|
+
* 0 个 ACTIVE Supervisor → 保持 NULL(fail-closed:无主理则无人可治理)。
|
|
243
|
+
* 5. verify 全部预期列/表/索引 → UPDATE schema_version=3 → COMMIT(失败 ROLLBACK)。
|
|
244
|
+
*/
|
|
245
|
+
ensureSchemaV3() {
|
|
246
|
+
const row = this.db
|
|
247
|
+
.prepare('SELECT COALESCE(MAX(schema_version), 0) AS v FROM kingdoms')
|
|
248
|
+
.get();
|
|
249
|
+
if ((row?.v ?? 0) >= SCHEMA_VERSION)
|
|
250
|
+
return;
|
|
251
|
+
const bindingColumns = ['status', 'retired_at', 'retired_reason'];
|
|
252
|
+
const territoryColumns = ['deleted_at', 'deleted_reason'];
|
|
253
|
+
this.db.exec('BEGIN IMMEDIATE');
|
|
254
|
+
try {
|
|
255
|
+
const tableColumns = (table) => new Set(this.db.prepare(`PRAGMA table_info(${table})`).all().map(c => c.name));
|
|
256
|
+
const bindings = tableColumns('role_bindings');
|
|
257
|
+
for (const column of bindingColumns) {
|
|
258
|
+
if (!bindings.has(column))
|
|
259
|
+
this.db.exec(`ALTER TABLE role_bindings ADD COLUMN ${column} TEXT`);
|
|
260
|
+
}
|
|
261
|
+
const territories = tableColumns('territories');
|
|
262
|
+
for (const column of territoryColumns) {
|
|
263
|
+
if (!territories.has(column))
|
|
264
|
+
this.db.exec(`ALTER TABLE territories ADD COLUMN ${column} TEXT`);
|
|
265
|
+
}
|
|
266
|
+
// 旧库兜底:status 列缺省值统一为 ACTIVE(新增列默认 NULL → 归一化为 ACTIVE)
|
|
267
|
+
this.db.exec(`UPDATE role_bindings SET status = 'ACTIVE' WHERE status IS NULL`);
|
|
268
|
+
// backfill:恰好 1 个 ACTIVE Supervisor → NULL scope 领地自动接管(0 个 → fail-closed 保持 NULL)
|
|
269
|
+
const supervisorCount = this.db
|
|
270
|
+
.prepare(`SELECT COUNT(*) AS n FROM role_bindings WHERE role_type = 'SUPERVISOR' AND status = 'ACTIVE'`)
|
|
271
|
+
.get();
|
|
272
|
+
if (supervisorCount.n === 1) {
|
|
273
|
+
this.db.exec(`
|
|
274
|
+
UPDATE territories
|
|
275
|
+
SET supervisor_binding_id = (
|
|
276
|
+
SELECT binding_id FROM role_bindings
|
|
277
|
+
WHERE role_type = 'SUPERVISOR' AND status = 'ACTIVE' LIMIT 1
|
|
278
|
+
)
|
|
279
|
+
WHERE supervisor_binding_id IS NULL AND status = 'ACTIVE'
|
|
280
|
+
`);
|
|
281
|
+
}
|
|
282
|
+
// verify:全部预期列/表/索引存在,缺失即失败(fail-loud)
|
|
283
|
+
const afterBindings = tableColumns('role_bindings');
|
|
284
|
+
const afterTerritories = tableColumns('territories');
|
|
285
|
+
for (const column of bindingColumns) {
|
|
286
|
+
if (!afterBindings.has(column))
|
|
287
|
+
throw new Error(`Schema v3 migration failed: role_bindings.${column} missing`);
|
|
288
|
+
}
|
|
289
|
+
for (const column of territoryColumns) {
|
|
290
|
+
if (!afterTerritories.has(column))
|
|
291
|
+
throw new Error(`Schema v3 migration failed: territories.${column} missing`);
|
|
292
|
+
}
|
|
293
|
+
const tables = this.db.prepare(`SELECT name FROM sqlite_master WHERE type IN ('table','index')`).all();
|
|
294
|
+
const names = new Set(tables.map(t => t.name));
|
|
295
|
+
for (const required of ['task_assignments', 'one_active_assignment_per_task', 'task_assignments_task_idx']) {
|
|
296
|
+
if (!names.has(required))
|
|
297
|
+
throw new Error(`Schema v3 migration failed: ${required} missing`);
|
|
298
|
+
}
|
|
299
|
+
this.db.prepare('UPDATE kingdoms SET schema_version = ?').run(SCHEMA_VERSION);
|
|
300
|
+
this.db.exec('COMMIT');
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
this.db.exec('ROLLBACK');
|
|
304
|
+
throw error;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
153
307
|
/**
|
|
154
308
|
* 给 events 补上单调序号列(0.2.0 → 0.3.0 唯一一处触及既有表的变更)。
|
|
155
309
|
*
|
|
@@ -203,15 +357,16 @@ export class KingdomStore {
|
|
|
203
357
|
// ── territories ─────────────────────────────────────────────
|
|
204
358
|
listTerritories(kingdomId) {
|
|
205
359
|
return this.db
|
|
206
|
-
.prepare(
|
|
360
|
+
.prepare(`SELECT * FROM territories WHERE kingdom_id = ? AND status != 'DELETED' ORDER BY created_at`)
|
|
207
361
|
.all(kingdomId);
|
|
208
362
|
}
|
|
209
363
|
getTerritoryByName(kingdomId, name) {
|
|
210
364
|
const rows = this.db
|
|
211
|
-
.prepare(
|
|
365
|
+
.prepare(`SELECT * FROM territories WHERE kingdom_id = ? AND name = ? AND status != 'DELETED'`)
|
|
212
366
|
.all(kingdomId, name);
|
|
213
367
|
return rows[0] ?? null;
|
|
214
368
|
}
|
|
369
|
+
/** 任意状态取领地(历史解析;含 DELETED tombstone)。 */
|
|
215
370
|
getTerritoryById(territoryId) {
|
|
216
371
|
const rows = this.db
|
|
217
372
|
.prepare('SELECT * FROM territories WHERE territory_id = ?')
|
|
@@ -230,6 +385,54 @@ export class KingdomStore {
|
|
|
230
385
|
deleteTerritoryRow(territoryId) {
|
|
231
386
|
this.db.prepare('DELETE FROM territories WHERE territory_id = ?').run(territoryId);
|
|
232
387
|
}
|
|
388
|
+
/**
|
|
389
|
+
* v0.7.0(M2):Territory tombstone——ACTIVE → DELETED(不物理删行),
|
|
390
|
+
* 历史任务/Assignment/Event 的 territory_id 永远可解析。
|
|
391
|
+
*/
|
|
392
|
+
tombstoneTerritoryRow(territoryId, reason) {
|
|
393
|
+
const now = new Date().toISOString();
|
|
394
|
+
this.db
|
|
395
|
+
.prepare(`UPDATE territories SET status = 'DELETED', deleted_at = ?, deleted_reason = ? WHERE territory_id = ?`)
|
|
396
|
+
.run(now, reason ?? null, territoryId);
|
|
397
|
+
}
|
|
398
|
+
/** v0.7.0(M2):设置 Territory 主理 Supervisor(scope relation;NULL=未指派=fail-closed)。 */
|
|
399
|
+
updateTerritorySupervisor(territoryId, supervisorBindingId) {
|
|
400
|
+
this.db.prepare('UPDATE territories SET supervisor_binding_id = ? WHERE territory_id = ?').run(supervisorBindingId, territoryId);
|
|
401
|
+
}
|
|
402
|
+
// ── task_assignments(v0.7.0 M2-B Assignment Ledger)──────────
|
|
403
|
+
insertTaskAssignment(row) {
|
|
404
|
+
this.db
|
|
405
|
+
.prepare(`INSERT INTO task_assignments
|
|
406
|
+
(assignment_id, task_id, territory_id, worker_binding_id, assigned_by, assigned_at,
|
|
407
|
+
ended_at, end_reason, previous_assignment_id, handoff_reason, created_at)
|
|
408
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
409
|
+
.run(row.assignment_id, row.task_id, row.territory_id, row.worker_binding_id, row.assigned_by, row.assigned_at, row.ended_at, row.end_reason, row.previous_assignment_id, row.handoff_reason, row.created_at);
|
|
410
|
+
return row;
|
|
411
|
+
}
|
|
412
|
+
/** 当前 active assignment(partial unique index 保证至多一条)。 */
|
|
413
|
+
getActiveAssignmentForTask(taskId) {
|
|
414
|
+
const rows = this.db
|
|
415
|
+
.prepare(`SELECT * FROM task_assignments WHERE task_id = ? AND ended_at IS NULL LIMIT 1`)
|
|
416
|
+
.all(taskId);
|
|
417
|
+
return rows[0] ?? null;
|
|
418
|
+
}
|
|
419
|
+
/** 关闭当前 active assignment(handoff / task-terminal)。 */
|
|
420
|
+
closeActiveAssignment(taskId, endReason) {
|
|
421
|
+
const active = this.getActiveAssignmentForTask(taskId);
|
|
422
|
+
if (!active)
|
|
423
|
+
return null;
|
|
424
|
+
const now = new Date().toISOString();
|
|
425
|
+
this.db
|
|
426
|
+
.prepare(`UPDATE task_assignments SET ended_at = ?, end_reason = ? WHERE assignment_id = ?`)
|
|
427
|
+
.run(now, endReason, active.assignment_id);
|
|
428
|
+
return { ...active, ended_at: now, end_reason: endReason };
|
|
429
|
+
}
|
|
430
|
+
/** 按任务列出派遣历史(升序)。 */
|
|
431
|
+
listTaskAssignments(taskId) {
|
|
432
|
+
return this.db
|
|
433
|
+
.prepare(`SELECT * FROM task_assignments WHERE task_id = ? ORDER BY created_at`)
|
|
434
|
+
.all(taskId);
|
|
435
|
+
}
|
|
233
436
|
// ── role_bindings ───────────────────────────────────────────
|
|
234
437
|
listBindings(kingdomId) {
|
|
235
438
|
return this.db
|
|
@@ -238,10 +441,30 @@ export class KingdomStore {
|
|
|
238
441
|
}
|
|
239
442
|
getBindingByRole(kingdomId, roleType) {
|
|
240
443
|
const rows = this.db
|
|
241
|
-
.prepare(
|
|
444
|
+
.prepare(`SELECT * FROM role_bindings WHERE kingdom_id = ? AND role_type = ? AND status = 'ACTIVE'`)
|
|
242
445
|
.all(kingdomId, roleType);
|
|
243
446
|
return rows[0] ?? null;
|
|
244
447
|
}
|
|
448
|
+
/**
|
|
449
|
+
* v0.7.0(M2):按角色列出 **ACTIVE** 绑定(多 Worker/多 Supervisor)。
|
|
450
|
+
* Singleton(OWNER/CHANCELLOR)是 Domain Policy,本 API 不再隐含假设。
|
|
451
|
+
*/
|
|
452
|
+
getBindingsByRole(kingdomId, roleType) {
|
|
453
|
+
return this.db
|
|
454
|
+
.prepare(`SELECT * FROM role_bindings WHERE kingdom_id = ? AND role_type = ? AND status = 'ACTIVE' ORDER BY created_at`)
|
|
455
|
+
.all(kingdomId, roleType);
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* v0.7.0(M2):Binding tombstone——ACTIVE → RETIRED(历史引用永远可解析)。
|
|
459
|
+
* unbind 语义从物理删除升级为退任。
|
|
460
|
+
*/
|
|
461
|
+
retireBinding(bindingId, reason) {
|
|
462
|
+
const now = new Date().toISOString();
|
|
463
|
+
this.db
|
|
464
|
+
.prepare(`UPDATE role_bindings SET status = 'RETIRED', retired_at = ?, retired_reason = ?, updated_at = ? WHERE binding_id = ?`)
|
|
465
|
+
.run(now, reason ?? null, now, bindingId);
|
|
466
|
+
}
|
|
467
|
+
/** 按 id 取绑定(**任意状态**——历史解析用;ACTIVE 过滤由调用方语义决定)。 */
|
|
245
468
|
getBindingById(bindingId) {
|
|
246
469
|
const rows = this.db
|
|
247
470
|
.prepare('SELECT * FROM role_bindings WHERE binding_id = ?')
|
|
@@ -252,9 +475,10 @@ export class KingdomStore {
|
|
|
252
475
|
this.db
|
|
253
476
|
.prepare(`INSERT INTO role_bindings
|
|
254
477
|
(binding_id, kingdom_id, role_type, role_name, runtime_type,
|
|
255
|
-
session_id, model_name, agent_name, session_meta,
|
|
256
|
-
|
|
257
|
-
|
|
478
|
+
session_id, model_name, agent_name, session_meta, execution_profile_json,
|
|
479
|
+
status, retired_at, retired_reason, principal_id, created_at, updated_at)
|
|
480
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
481
|
+
.run(row.binding_id, row.kingdom_id, row.role_type, row.role_name, row.runtime_type, row.session_id, row.model_name ?? null, row.agent_name ?? null, row.session_meta ?? null, row.execution_profile_json ?? null, row.status ?? 'ACTIVE', row.retired_at ?? null, row.retired_reason ?? null, row.principal_id, row.created_at, row.updated_at);
|
|
258
482
|
return row;
|
|
259
483
|
}
|
|
260
484
|
/**
|
|
@@ -288,6 +512,10 @@ export class KingdomStore {
|
|
|
288
512
|
updateBindingSession(bindingId, sessionId, updatedAt) {
|
|
289
513
|
this.updateBindingProfile(bindingId, { sessionId }, updatedAt);
|
|
290
514
|
}
|
|
515
|
+
/** v0.6.0(M1-C):执行配置(execution_profile_json)独立写入通道。 */
|
|
516
|
+
setExecutionProfileJson(bindingId, json) {
|
|
517
|
+
this.db.prepare('UPDATE role_bindings SET execution_profile_json = ? WHERE binding_id = ?').run(json, bindingId);
|
|
518
|
+
}
|
|
291
519
|
/** v0.4:解绑(换届通道)。治理上由调用方决定谁可解绑;OWNER 由上层保护。 */
|
|
292
520
|
deleteBinding(bindingId) {
|
|
293
521
|
this.db.prepare('DELETE FROM role_bindings WHERE binding_id = ?').run(bindingId);
|
|
@@ -321,14 +549,39 @@ export class KingdomStore {
|
|
|
321
549
|
.get(kingdomId);
|
|
322
550
|
return row?.n ?? 0;
|
|
323
551
|
}
|
|
552
|
+
/**
|
|
553
|
+
* v0.7.0(M2):外层事务包装——HANDOFF 等**原子治理操作**(多步写 + 事件)整体提交/回滚。
|
|
554
|
+
* appendEvent 的内层 BEGIN 在事务中会抛错,由 appendEvent 的嵌套容忍逻辑接管(见下)。
|
|
555
|
+
*/
|
|
556
|
+
withImmediateTransaction(fn) {
|
|
557
|
+
this.db.exec('BEGIN IMMEDIATE');
|
|
558
|
+
try {
|
|
559
|
+
const result = fn();
|
|
560
|
+
this.db.exec('COMMIT');
|
|
561
|
+
return result;
|
|
562
|
+
}
|
|
563
|
+
catch (error) {
|
|
564
|
+
this.db.exec('ROLLBACK');
|
|
565
|
+
throw error;
|
|
566
|
+
}
|
|
567
|
+
}
|
|
324
568
|
/**
|
|
325
569
|
* 追加事件并分配单调 seq。
|
|
326
570
|
*
|
|
327
571
|
* 「读 MAX(seq) + INSERT」放在 IMMEDIATE 事务里,避免并发写出重复序号
|
|
328
572
|
* (SQLite 会串行化写事务)。序号在**全库**范围内单调,跨王国也不会回退。
|
|
573
|
+
*
|
|
574
|
+
* v0.7.0(M2):支持嵌套——已在 withImmediateTransaction 外层事务中时,
|
|
575
|
+
* BEGIN/COMMIT 自动跳过(外层统一提交/回滚),保证 HANDOFF 等原子操作不半写。
|
|
329
576
|
*/
|
|
330
577
|
appendEvent(row) {
|
|
331
|
-
|
|
578
|
+
let outer = false;
|
|
579
|
+
try {
|
|
580
|
+
this.db.exec('BEGIN IMMEDIATE');
|
|
581
|
+
}
|
|
582
|
+
catch {
|
|
583
|
+
outer = true; // 已在外层事务中(withImmediateTransaction)
|
|
584
|
+
}
|
|
332
585
|
try {
|
|
333
586
|
const next = this.db
|
|
334
587
|
.prepare('SELECT COALESCE(MAX(seq), 0) AS n FROM events')
|
|
@@ -339,11 +592,13 @@ export class KingdomStore {
|
|
|
339
592
|
(event_id, kingdom_id, event_type, actor_role, actor_id, target_type, target_id, payload_json, created_at, seq)
|
|
340
593
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
341
594
|
.run(row.event_id, row.kingdom_id, row.event_type, row.actor_role, row.actor_id, row.target_type, row.target_id, row.payload_json, row.created_at, seq);
|
|
342
|
-
|
|
595
|
+
if (!outer)
|
|
596
|
+
this.db.exec('COMMIT');
|
|
343
597
|
return { ...row, seq };
|
|
344
598
|
}
|
|
345
599
|
catch (error) {
|
|
346
|
-
|
|
600
|
+
if (!outer)
|
|
601
|
+
this.db.exec('ROLLBACK');
|
|
347
602
|
throw error;
|
|
348
603
|
}
|
|
349
604
|
}
|
|
@@ -489,11 +744,24 @@ export class KingdomStore {
|
|
|
489
744
|
this.db
|
|
490
745
|
.prepare(`INSERT INTO executions
|
|
491
746
|
(execution_id, task_id, attempt_no, worker_binding_id, session_id, state, detail,
|
|
492
|
-
started_at, heartbeat_at, ended_at, pause_requested_at
|
|
493
|
-
|
|
494
|
-
|
|
747
|
+
started_at, heartbeat_at, ended_at, pause_requested_at,
|
|
748
|
+
executor_kind, provider, provider_source, requested_model, resolved_model, model_source,
|
|
749
|
+
execution_profile_json)
|
|
750
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
751
|
+
.run(row.execution_id, row.task_id, row.attempt_no, row.worker_binding_id, row.session_id, row.state, row.detail, row.started_at, row.heartbeat_at, row.ended_at, row.pause_requested_at, row.executor_kind, row.provider, row.provider_source, row.requested_model, row.resolved_model, row.model_source, row.execution_profile_json);
|
|
495
752
|
return row;
|
|
496
753
|
}
|
|
754
|
+
/**
|
|
755
|
+
* v0.6.0(M1-C):结算时**一次性**补执行证据(resolved_model + 快照 resolved 节)。
|
|
756
|
+
*
|
|
757
|
+
* 证据列是不可变快照:start 时写 requested/source,此处只补 resolved——代码上
|
|
758
|
+
* 全库唯一 UPDATE 证据列的位置,之后不再改写(transitionExecution 不触碰证据列)。
|
|
759
|
+
*/
|
|
760
|
+
updateExecutionResolvedEvidence(executionId, resolvedModel, profileJson) {
|
|
761
|
+
this.db
|
|
762
|
+
.prepare(`UPDATE executions SET resolved_model = ?, execution_profile_json = ? WHERE execution_id = ?`)
|
|
763
|
+
.run(resolvedModel, profileJson, executionId);
|
|
764
|
+
}
|
|
497
765
|
/**
|
|
498
766
|
* **全库唯一的 executions.state 写入路径**(与 transitionTask 同构)。
|
|
499
767
|
*
|