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 CHANGED
@@ -5,7 +5,7 @@
5
5
  **在 DeepSeek Harness 里,装一个插件,拥有一个自己的 Agent 王国。**
6
6
 
7
7
  [![CI](https://github.com/lusblead/dsh-Kingdom/actions/workflows/ci.yml/badge.svg)](https://github.com/lusblead/dsh-Kingdom/actions/workflows/ci.yml)
8
- [![Version](https://img.shields.io/badge/version-0.5.2-blue)](https://github.com/lusblead/dsh-Kingdom/releases)
8
+ [![Version](https://img.shields.io/badge/version-0.7.0-blue)](https://github.com/lusblead/dsh-Kingdom/releases)
9
9
  [![License](https://img.shields.io/badge/license-BSD--3--Clause-green)](LICENSE)
10
10
  [![DSH](https://img.shields.io/badge/DSH-0.1.0--rc.5-orange)](#compatibility)
11
11
  [![Node](https://img.shields.io/badge/Node-%3E%3D22.19-339933)](#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.5.2.tgz`,然后:
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.5.2.tgz
74
+ dsh plugin --profile web add ./dsh-kingdom-0.7.0.tgz
75
75
  ```
76
76
 
77
77
  > 安装时会打印 5 条 peer dependency warning——**这是预期的**(这些包由 DSH 运行时提供),不是失败。
@@ -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
- // 同角色已存在:v0.4 起提示改用 kingdom_bind_session 重绑(或先解绑再绑)
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
- `如需更换会话/身份,用 kingdom_bind_session(或先 kingdom_unbind_role 再绑定)。`;
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
- * - 被解绑角色若已被任务引用(assigned_binding_id),任务保留引用、
127
- * 展示层显示为“未指派”;相关治理操作会因缺绑定而明确报错(ROLE_BINDING_MISSING)。
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
- store.deleteBinding(binding.binding_id);
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: input.reason?.trim() ?? null,
238
+ reason,
239
+ status: 'RETIRED',
160
240
  }),
161
241
  created_at: new Date().toISOString(),
162
242
  });
163
- return `已解绑角色 ${binding.role_type}(${binding.role_name},session=${binding.session_id ?? '未绑定'})。` +
164
- `该角色现在空缺,可重新 kingdom_bind_role。`;
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:把角色绑定到(或改绑到)某个独立会话,并更新身份预留字段。
@@ -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
- * Phase 2 **刻意保持 1**:本插件没有任何按版本号分支的 migration 逻辑,
24
- * 建表全部幂等,任何 0.2.0 打开的旧库都会在开库瞬间收敛到同一套 6 表结构。
25
- * 此时把新库标成 2、旧库留在 1,只会制造一个「同结构不同版本号」的假差异。
26
- * 真正引入破坏性 migration 时再启用这个字段作为 gate。
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 = 1;
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('SELECT * FROM territories WHERE kingdom_id = ? ORDER BY created_at')
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('SELECT * FROM territories WHERE kingdom_id = ? AND name = ?')
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('SELECT * FROM role_bindings WHERE kingdom_id = ? AND role_type = ?')
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, principal_id, created_at, updated_at)
256
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
257
- .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.principal_id, row.created_at, row.updated_at);
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
- this.db.exec('BEGIN IMMEDIATE');
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
- this.db.exec('COMMIT');
595
+ if (!outer)
596
+ this.db.exec('COMMIT');
343
597
  return { ...row, seq };
344
598
  }
345
599
  catch (error) {
346
- this.db.exec('ROLLBACK');
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
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
494
- .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);
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
  *