dsh-kingdom 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/LICENSE +29 -0
  2. package/README.md +184 -0
  3. package/cordis.patch.yml +6 -0
  4. package/lib/core/binding.js +57 -0
  5. package/lib/core/binding.js.map +1 -0
  6. package/lib/core/db.js +521 -0
  7. package/lib/core/db.js.map +1 -0
  8. package/lib/core/execution.js +88 -0
  9. package/lib/core/execution.js.map +1 -0
  10. package/lib/core/kingdom.js +117 -0
  11. package/lib/core/kingdom.js.map +1 -0
  12. package/lib/core/task-service.js +581 -0
  13. package/lib/core/task-service.js.map +1 -0
  14. package/lib/core/task.js +93 -0
  15. package/lib/core/task.js.map +1 -0
  16. package/lib/core/territory.js +47 -0
  17. package/lib/core/territory.js.map +1 -0
  18. package/lib/gui/contract.js +53 -0
  19. package/lib/gui/contract.js.map +1 -0
  20. package/lib/gui/server.js +204 -0
  21. package/lib/gui/server.js.map +1 -0
  22. package/lib/gui/snapshot.js +379 -0
  23. package/lib/gui/snapshot.js.map +1 -0
  24. package/lib/index.js +489 -0
  25. package/lib/index.js.map +1 -0
  26. package/lib/paths.js +23 -0
  27. package/lib/paths.js.map +1 -0
  28. package/lib/types/core/binding.d.ts +11 -0
  29. package/lib/types/core/db.d.ts +261 -0
  30. package/lib/types/core/execution.d.ts +51 -0
  31. package/lib/types/core/kingdom.d.ts +34 -0
  32. package/lib/types/core/task-service.d.ts +107 -0
  33. package/lib/types/core/task.d.ts +60 -0
  34. package/lib/types/core/territory.d.ts +9 -0
  35. package/lib/types/gui/contract.d.ts +226 -0
  36. package/lib/types/gui/server.d.ts +26 -0
  37. package/lib/types/gui/snapshot.d.ts +44 -0
  38. package/lib/types/index.d.ts +80 -0
  39. package/lib/types/paths.d.ts +6 -0
  40. package/lib/types/worker/dsh-subagent.d.ts +79 -0
  41. package/lib/types/worker/executor.d.ts +121 -0
  42. package/lib/worker/dsh-subagent.js +117 -0
  43. package/lib/worker/dsh-subagent.js.map +1 -0
  44. package/lib/worker/executor.js +94 -0
  45. package/lib/worker/executor.js.map +1 -0
  46. package/package.json +59 -0
@@ -0,0 +1,379 @@
1
+ import { GUI_SCHEMA_VERSION, TRANSIENT_WINDOW_MS } from './contract.js';
2
+ import { asExecutionState, isLiveExecutionState } from '../core/execution.js';
3
+ import { asTaskStatus } from '../core/task.js';
4
+ // ── 行 → 视图 ───────────────────────────────────────────────────
5
+ function parseJson(text) {
6
+ try {
7
+ const value = JSON.parse(text);
8
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
9
+ ? value
10
+ : {};
11
+ }
12
+ catch {
13
+ return {};
14
+ }
15
+ }
16
+ function stringList(value) {
17
+ return Array.isArray(value) ? value.filter((v) => typeof v === 'string') : [];
18
+ }
19
+ export function toEventView(row) {
20
+ return {
21
+ seq: row.seq,
22
+ eventId: row.event_id,
23
+ type: row.event_type,
24
+ actorRole: row.actor_role,
25
+ actorId: row.actor_id,
26
+ targetType: row.target_type,
27
+ targetId: row.target_id,
28
+ payload: parseJson(row.payload_json),
29
+ createdAt: row.created_at,
30
+ };
31
+ }
32
+ export function toBindingView(row) {
33
+ return {
34
+ bindingId: row.binding_id,
35
+ roleType: row.role_type,
36
+ roleName: row.role_name,
37
+ runtimeType: row.runtime_type,
38
+ sessionId: row.session_id,
39
+ createdAt: row.created_at,
40
+ };
41
+ }
42
+ export function toTerritoryView(row) {
43
+ return {
44
+ territoryId: row.territory_id,
45
+ name: row.name,
46
+ workspacePath: row.workspace_path,
47
+ summary: row.summary,
48
+ status: row.status,
49
+ createdAt: row.created_at,
50
+ };
51
+ }
52
+ export function toClaimView(row) {
53
+ const payload = parseJson(row.result_json);
54
+ return {
55
+ resultId: row.result_id,
56
+ attemptNo: row.attempt_no,
57
+ workerBindingId: row.worker_binding_id,
58
+ sessionId: row.session_id,
59
+ claimedOutcome: row.outcome,
60
+ summary: typeof payload.summary === 'string' ? payload.summary : null,
61
+ artifacts: stringList(payload.artifacts),
62
+ risks: stringList(payload.risks),
63
+ createdAt: row.created_at,
64
+ };
65
+ }
66
+ export function toExecutionView(row) {
67
+ return {
68
+ executionId: row.execution_id,
69
+ taskId: row.task_id,
70
+ attemptNo: row.attempt_no,
71
+ workerBindingId: row.worker_binding_id,
72
+ sessionId: row.session_id,
73
+ state: row.state,
74
+ detail: row.detail,
75
+ startedAt: row.started_at,
76
+ heartbeatAt: row.heartbeat_at,
77
+ endedAt: row.ended_at,
78
+ pausePending: row.pause_requested_at !== null && row.state === 'RUNNING',
79
+ };
80
+ }
81
+ /**
82
+ * 任务当前允许的下一步动作。
83
+ *
84
+ * 这是 GUI 按钮可用性的**唯一**依据——GUI 不应自己从 status 推断,
85
+ * 否则状态机一改按钮就错。
86
+ */
87
+ export function allowedActionsFor(task, execution) {
88
+ const status = asTaskStatus(task.status);
89
+ const live = execution !== null && isLiveExecutionState(asExecutionState(execution.state));
90
+ switch (status) {
91
+ case 'CREATED':
92
+ return ['assign'];
93
+ case 'ASSIGNED':
94
+ return ['start'];
95
+ case 'RUNNING': {
96
+ if (!live) {
97
+ // REWORK 之后:任务已回 RUNNING,但还没有新的 Execution。
98
+ return ['start'];
99
+ }
100
+ const state = asExecutionState(execution.state);
101
+ const actions = ['execution:abort'];
102
+ if (state === 'PAUSED')
103
+ actions.unshift('execution:resume');
104
+ else if (execution.pause_requested_at === null)
105
+ actions.unshift('execution:pause');
106
+ return actions;
107
+ }
108
+ case 'REVIEW':
109
+ return ['review:accept', 'review:rework', 'review:fail'];
110
+ default:
111
+ return [];
112
+ }
113
+ }
114
+ export function toTaskView(store, task) {
115
+ const claim = store.latestWorkerResult(task.task_id);
116
+ const execution = store.latestExecution(task.task_id);
117
+ return {
118
+ taskId: task.task_id,
119
+ territoryId: task.territory_id,
120
+ title: task.title,
121
+ description: task.description,
122
+ acceptanceCriteria: task.acceptance_criteria,
123
+ status: task.status,
124
+ assignedBindingId: task.assigned_binding_id,
125
+ resultSummary: task.result_summary,
126
+ attemptCount: store.maxAttemptNo(task.task_id),
127
+ latestClaim: claim ? toClaimView(claim) : null,
128
+ latestExecution: execution ? toExecutionView(execution) : null,
129
+ allowedActions: allowedActionsFor(task, execution),
130
+ createdAt: task.created_at,
131
+ updatedAt: task.updated_at,
132
+ };
133
+ }
134
+ /**
135
+ * 在窗口期内找出**最近的一条**指定类型事件(events 已按 seq 降序传入)。
136
+ *
137
+ * 注意语义:返回的是这些类型里**最新的那条**,若它已过期则返回 null
138
+ * ——而不是"往前翻到第一条没过期的"。因此调用方必须把一组互斥的候选类型
139
+ * 一次性传进来,再按 `event_type` 分派;分成多次调用会让较早的动作
140
+ * 盖住较晚的动作(例如刚 ACCEPT 完却还在播派发)。
141
+ */
142
+ function latestWithin(input, types) {
143
+ for (const event of input.events) {
144
+ if (!types.includes(event.event_type))
145
+ continue;
146
+ const age = input.nowMs - Date.parse(event.created_at);
147
+ if (Number.isNaN(age))
148
+ continue;
149
+ return age <= input.transientWindowMs ? event : null;
150
+ }
151
+ return null;
152
+ }
153
+ function actor(role, binding, state, activity, extra = {}) {
154
+ return {
155
+ role,
156
+ bindingId: binding?.binding_id ?? null,
157
+ roleName: binding?.role_name ?? null,
158
+ state,
159
+ activity,
160
+ taskId: null,
161
+ executionId: null,
162
+ attemptNo: null,
163
+ since: null,
164
+ transient: false,
165
+ remainingMs: null,
166
+ fallbackState: 'idle',
167
+ sourceSeq: null,
168
+ ...extra,
169
+ };
170
+ }
171
+ function transientFrom(input, event) {
172
+ const elapsed = input.nowMs - Date.parse(event.created_at);
173
+ return {
174
+ transient: true,
175
+ remainingMs: Math.max(0, input.transientWindowMs - elapsed),
176
+ since: event.created_at,
177
+ sourceSeq: event.seq,
178
+ };
179
+ }
180
+ /**
181
+ * 宰相:只负责规划。
182
+ * `TASK_PLANNED` → 短暂播放规划动作,之后回待命。
183
+ */
184
+ function chancellorActor(input, binding) {
185
+ if (!binding)
186
+ return actor('CHANCELLOR', null, 'absent', null);
187
+ const planned = latestWithin(input, ['TASK_PLANNED']);
188
+ if (planned) {
189
+ return actor('CHANCELLOR', binding, 'planning', 'plan', {
190
+ taskId: planned.target_id,
191
+ ...transientFrom(input, planned),
192
+ });
193
+ }
194
+ return actor('CHANCELLOR', binding, 'idle', null);
195
+ }
196
+ /**
197
+ * 主管:派发、复核、返工、确认。
198
+ *
199
+ * 一组一次性动作**一次性**取最新的那条再分派(见 {@link latestWithin} 的语义说明),
200
+ * 否则「刚 ACCEPT 完」会被「几秒前的派发」盖住。
201
+ * 没有一次性动作时,只要还有任务停在 REVIEW,主管就保持 `reviewing` 循环——
202
+ * 这正好对应"Claim 已到达但尚未成为事实"这个治理状态。
203
+ */
204
+ function supervisorActor(input, binding) {
205
+ if (!binding)
206
+ return actor('SUPERVISOR', null, 'absent', null);
207
+ const recent = latestWithin(input, ['TASK_ASSIGNED', 'TASK_REWORK_REQUESTED', 'TASK_ACCEPTED', 'TASK_FAILED']);
208
+ if (recent) {
209
+ const common = { taskId: recent.target_id, fallbackState: 'idle', ...transientFrom(input, recent) };
210
+ switch (recent.event_type) {
211
+ case 'TASK_ASSIGNED':
212
+ return actor('SUPERVISOR', binding, 'assigning', 'assign', common);
213
+ case 'TASK_REWORK_REQUESTED':
214
+ return actor('SUPERVISOR', binding, 'reviewing', 'rework', common);
215
+ case 'TASK_ACCEPTED':
216
+ return actor('SUPERVISOR', binding, 'reviewing', 'accept', common);
217
+ default:
218
+ return actor('SUPERVISOR', binding, 'reviewing', 'review', common);
219
+ }
220
+ }
221
+ // 持续状态:有待审 Claim 就一直在复核。
222
+ const pending = input.tasks.find(t => t.status === 'REVIEW');
223
+ if (pending) {
224
+ return actor('SUPERVISOR', binding, 'reviewing', 'review', {
225
+ taskId: pending.task_id,
226
+ since: pending.updated_at,
227
+ });
228
+ }
229
+ return actor('SUPERVISOR', binding, 'idle', null);
230
+ }
231
+ /**
232
+ * 骑士(Worker):**只由 Execution 决定是否在工作**,不看 Task.status。
233
+ *
234
+ * 这是整套映射里最容易搞错的一条:REWORK 之后 Task 立刻回到 RUNNING,
235
+ * 但那时还没有新的 Execution,骑士必须处于 `waiting`(等待新 Execution),
236
+ * 而不能立即假装工作。
237
+ */
238
+ function workerActor(input, binding) {
239
+ if (!binding)
240
+ return actor('WORKER', null, 'absent', null);
241
+ const live = input.executions.find(e => isLiveExecutionState(asExecutionState(e.state)));
242
+ if (live) {
243
+ const state = asExecutionState(live.state);
244
+ const common = {
245
+ taskId: live.task_id,
246
+ executionId: live.execution_id,
247
+ attemptNo: live.attempt_no,
248
+ since: live.started_at,
249
+ };
250
+ if (state === 'PAUSED') {
251
+ return actor('WORKER', binding, 'sleeping', null, { ...common, fallbackState: 'sleeping' });
252
+ }
253
+ // STARTING / RUNNING 都算在工作;pausePending 由 ExecutionView 单独暴露,
254
+ // GUI 可以据此播"准备休息",但**不能**直接播睡觉——那会谎报运行状态。
255
+ return actor('WORKER', binding, 'working', 'execute', { ...common, fallbackState: 'working' });
256
+ }
257
+ // 一次性表演:庆祝(任务刚被 ACCEPT)与困惑(宿主观察到执行没跑起来)。
258
+ // 同样一次性取最新再分派,避免旧事件盖住新事件。
259
+ const recent = latestWithin(input, ['TASK_ACCEPTED', 'WORKER_EXECUTION_FAILED']);
260
+ if (recent) {
261
+ const common = { taskId: recent.target_id, fallbackState: 'idle', ...transientFrom(input, recent) };
262
+ return recent.event_type === 'TASK_ACCEPTED'
263
+ ? actor('WORKER', binding, 'celebrating', null, common)
264
+ : actor('WORKER', binding, 'confused', null, common);
265
+ }
266
+ // 任务处于 RUNNING 但没有活跃 Execution = 返工后待命,等新一轮执行。
267
+ const awaiting = input.tasks.find(t => t.status === 'RUNNING' && t.assigned_binding_id === binding.binding_id);
268
+ if (awaiting) {
269
+ return actor('WORKER', binding, 'waiting', null, {
270
+ taskId: awaiting.task_id,
271
+ since: awaiting.updated_at,
272
+ });
273
+ }
274
+ return actor('WORKER', binding, 'idle', null);
275
+ }
276
+ /** 计算全部角色此刻的表演语义。 */
277
+ export function projectStage(input) {
278
+ const byRole = (role) => input.bindings.find(b => b.role_type === role) ?? null;
279
+ const owner = byRole('OWNER');
280
+ return [
281
+ owner ? actor('OWNER', owner, 'idle', null) : actor('OWNER', null, 'absent', null),
282
+ chancellorActor(input, byRole('CHANCELLOR')),
283
+ supervisorActor(input, byRole('SUPERVISOR')),
284
+ workerActor(input, byRole('WORKER')),
285
+ ];
286
+ }
287
+ export function buildSnapshot(store, options) {
288
+ const kingdom = store.getDefaultKingdom();
289
+ const nowMs = options.nowMs ?? Date.now();
290
+ const generatedAt = new Date(nowMs).toISOString();
291
+ if (!kingdom) {
292
+ return {
293
+ schemaVersion: GUI_SCHEMA_VERSION,
294
+ revision: 0,
295
+ generatedAt,
296
+ kingdom: null,
297
+ auth: options.auth,
298
+ bindings: [],
299
+ territories: [],
300
+ tasks: [],
301
+ liveExecutions: [],
302
+ stage: [],
303
+ recentEvents: [],
304
+ };
305
+ }
306
+ const kingdomId = kingdom.kingdom_id;
307
+ const bindings = store.listBindings(kingdomId);
308
+ const tasks = store.listTasks(kingdomId);
309
+ const events = store.listEvents(kingdomId, options.eventLimit ?? 50);
310
+ const liveExecutions = store.listLiveExecutions(kingdomId);
311
+ return {
312
+ schemaVersion: GUI_SCHEMA_VERSION,
313
+ revision: store.revision(kingdomId),
314
+ generatedAt,
315
+ kingdom: {
316
+ kingdomId,
317
+ name: kingdom.name,
318
+ ownerId: kingdom.owner_id,
319
+ ownerName: kingdom.owner_name,
320
+ createdAt: kingdom.created_at,
321
+ },
322
+ auth: options.auth,
323
+ bindings: bindings.map(toBindingView),
324
+ territories: store.listTerritories(kingdomId).map(toTerritoryView),
325
+ tasks: tasks.map(t => toTaskView(store, t)),
326
+ liveExecutions: liveExecutions.map(toExecutionView),
327
+ stage: projectStage({
328
+ bindings,
329
+ tasks,
330
+ executions: liveExecutions,
331
+ events,
332
+ nowMs,
333
+ transientWindowMs: options.transientWindowMs ?? TRANSIENT_WINDOW_MS,
334
+ }),
335
+ recentEvents: events.map(toEventView),
336
+ };
337
+ }
338
+ export function buildTaskDetail(store, kingdomId, taskId) {
339
+ const task = store.getTask(taskId);
340
+ if (!task)
341
+ return null;
342
+ const territory = store.getTerritoryById(task.territory_id);
343
+ if (!territory || territory.kingdom_id !== kingdomId)
344
+ return null;
345
+ const binding = task.assigned_binding_id ? store.getBindingById(task.assigned_binding_id) : null;
346
+ const executions = store.listExecutions(taskId);
347
+ const related = store
348
+ .listEvents(kingdomId, 500)
349
+ .filter(e => e.target_id === taskId)
350
+ .sort((a, b) => a.seq - b.seq);
351
+ const reviews = related
352
+ .filter(e => ['TASK_ACCEPTED', 'TASK_REWORK_REQUESTED', 'TASK_FAILED'].includes(e.event_type))
353
+ .map((e) => {
354
+ const payload = parseJson(e.payload_json);
355
+ return {
356
+ seq: e.seq,
357
+ decision: typeof payload.decision === 'string' ? payload.decision : e.event_type,
358
+ reason: typeof payload.reason === 'string' ? payload.reason : null,
359
+ reviewerBindingId: typeof payload.reviewer_binding_id === 'string' ? payload.reviewer_binding_id : null,
360
+ reviewedAttemptNo: typeof payload.reviewed_attempt_no === 'number' ? payload.reviewed_attempt_no : null,
361
+ claimedOutcome: typeof payload.claimed_outcome === 'string' ? payload.claimed_outcome : null,
362
+ createdAt: e.created_at,
363
+ };
364
+ });
365
+ const view = toTaskView(store, task);
366
+ return {
367
+ schemaVersion: GUI_SCHEMA_VERSION,
368
+ revision: store.revision(kingdomId),
369
+ task: view,
370
+ territory: toTerritoryView(territory),
371
+ assignedBinding: binding ? toBindingView(binding) : null,
372
+ claims: store.listWorkerResults(taskId).map(toClaimView),
373
+ executions: executions.map(toExecutionView),
374
+ reviews,
375
+ relatedEvents: related.map(toEventView),
376
+ allowedActions: view.allowedActions,
377
+ };
378
+ }
379
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/gui/snapshot.ts"],"names":[],"mappings":"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"}