agent-step-gate 0.3.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.
Files changed (68) hide show
  1. package/ARCHITECTURE.md +393 -0
  2. package/README.md +662 -0
  3. package/SKILL.md +190 -0
  4. package/Weaver.md +140 -0
  5. package/dist/cli.d.ts +1 -0
  6. package/dist/cli.js +573 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/core/errors.d.ts +16 -0
  9. package/dist/core/errors.js +32 -0
  10. package/dist/core/errors.js.map +1 -0
  11. package/dist/core/gate.d.ts +20 -0
  12. package/dist/core/gate.js +82 -0
  13. package/dist/core/gate.js.map +1 -0
  14. package/dist/core/keys.d.ts +18 -0
  15. package/dist/core/keys.js +37 -0
  16. package/dist/core/keys.js.map +1 -0
  17. package/dist/core/plan.d.ts +2 -0
  18. package/dist/core/plan.js +135 -0
  19. package/dist/core/plan.js.map +1 -0
  20. package/dist/core/program.d.ts +69 -0
  21. package/dist/core/program.js +191 -0
  22. package/dist/core/program.js.map +1 -0
  23. package/dist/core/reconcile.d.ts +37 -0
  24. package/dist/core/reconcile.js +198 -0
  25. package/dist/core/reconcile.js.map +1 -0
  26. package/dist/core/session.d.ts +25 -0
  27. package/dist/core/session.js +88 -0
  28. package/dist/core/session.js.map +1 -0
  29. package/dist/index.d.ts +1 -0
  30. package/dist/index.js +29 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/storage/db.d.ts +3 -0
  33. package/dist/storage/db.js +117 -0
  34. package/dist/storage/db.js.map +1 -0
  35. package/dist/storage/repository.d.ts +24 -0
  36. package/dist/storage/repository.js +449 -0
  37. package/dist/storage/repository.js.map +1 -0
  38. package/dist/tools/activeTask.d.ts +2 -0
  39. package/dist/tools/activeTask.js +41 -0
  40. package/dist/tools/activeTask.js.map +1 -0
  41. package/dist/tools/cancelTask.d.ts +2 -0
  42. package/dist/tools/cancelTask.js +39 -0
  43. package/dist/tools/cancelTask.js.map +1 -0
  44. package/dist/tools/checkpoint.d.ts +2 -0
  45. package/dist/tools/checkpoint.js +71 -0
  46. package/dist/tools/checkpoint.js.map +1 -0
  47. package/dist/tools/current.d.ts +2 -0
  48. package/dist/tools/current.js +64 -0
  49. package/dist/tools/current.js.map +1 -0
  50. package/dist/tools/finalize.d.ts +2 -0
  51. package/dist/tools/finalize.js +95 -0
  52. package/dist/tools/finalize.js.map +1 -0
  53. package/dist/tools/index.d.ts +6 -0
  54. package/dist/tools/index.js +7 -0
  55. package/dist/tools/index.js.map +1 -0
  56. package/dist/tools/startPlan.d.ts +2 -0
  57. package/dist/tools/startPlan.js +124 -0
  58. package/dist/tools/startPlan.js.map +1 -0
  59. package/dist/types/index.d.ts +142 -0
  60. package/dist/types/index.js +6 -0
  61. package/dist/types/index.js.map +1 -0
  62. package/package.json +48 -0
  63. package/scripts/interactive-demo.ts +394 -0
  64. package/scripts/mcp-call.mjs +56 -0
  65. package/scripts/prompt-check-hook.sh +27 -0
  66. package/scripts/session-start-hook.sh +47 -0
  67. package/scripts/stop-hook.mjs +83 -0
  68. package/scripts/stop-hook.sh +75 -0
@@ -0,0 +1,449 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import db from './db.js';
3
+ import { GateError, GateErrorCode } from '../core/errors.js';
4
+ function sha256(input) {
5
+ return createHash('sha256').update(input).digest('hex');
6
+ }
7
+ function now() {
8
+ return new Date().toISOString();
9
+ }
10
+ // ---------------------------------------------------------------------------
11
+ // Snake_case → camelCase mappers for SELECT * results
12
+ // ---------------------------------------------------------------------------
13
+ function mapTaskRow(row) {
14
+ return {
15
+ id: row.id,
16
+ title: row.title,
17
+ status: row.status,
18
+ currentIndex: row.current_index,
19
+ totalSteps: row.total_steps,
20
+ finalKeyHash: row.final_key_hash ?? null,
21
+ sessionId: row.session_id ?? null,
22
+ createdAt: row.created_at,
23
+ updatedAt: row.updated_at,
24
+ };
25
+ }
26
+ function mapStepRow(row) {
27
+ return {
28
+ id: row.id,
29
+ taskId: row.task_id,
30
+ parentPath: row.parent_path ?? null,
31
+ title: row.title,
32
+ path: row.path,
33
+ orderIndex: row.order_index,
34
+ dependsOn: row.depends_on ? JSON.parse(row.depends_on) : [],
35
+ status: row.status,
36
+ stepKeyHash: row.step_key_hash ?? null,
37
+ completedAt: row.completed_at ?? null,
38
+ createdAt: row.created_at,
39
+ };
40
+ }
41
+ function mapEventRow(row) {
42
+ return {
43
+ id: row.id,
44
+ taskId: row.task_id,
45
+ stepId: row.step_id ?? null,
46
+ eventType: row.event_type,
47
+ payload: row.payload ?? null,
48
+ createdAt: row.created_at,
49
+ };
50
+ }
51
+ // ---------------------------------------------------------------------------
52
+ // createTask
53
+ // ---------------------------------------------------------------------------
54
+ export function createTask(task, steps) {
55
+ if (!task || !task.id || !task.title) {
56
+ throw new GateError(GateErrorCode.PLAN_SCHEMA_INVALID, 'Task must have id and title');
57
+ }
58
+ if (!steps || steps.length === 0) {
59
+ throw new GateError(GateErrorCode.NO_STEPS, 'Task must have at least one step');
60
+ }
61
+ const insertTask = db.prepare(`
62
+ INSERT INTO tasks (id, title, status, current_index, total_steps, final_key_hash, session_id, created_at, updated_at)
63
+ VALUES (@id, @title, @status, @currentIndex, @totalSteps, @finalKeyHash, @sessionId, @createdAt, @updatedAt)
64
+ `);
65
+ const insertStep = db.prepare(`
66
+ INSERT INTO steps (id, task_id, parent_path, title, path, order_index, depends_on, status, step_key_hash, completed_at, created_at)
67
+ VALUES (@id, @taskId, @parentPath, @title, @path, @orderIndex, @dependsOn, @status, @stepKeyHash, @completedAt, @createdAt)
68
+ `);
69
+ const transaction = db.transaction(() => {
70
+ insertTask.run({
71
+ id: task.id,
72
+ title: task.title,
73
+ status: task.status,
74
+ currentIndex: task.currentIndex,
75
+ totalSteps: task.totalSteps,
76
+ finalKeyHash: task.finalKeyHash,
77
+ sessionId: task.sessionId ?? null,
78
+ createdAt: task.createdAt,
79
+ updatedAt: task.updatedAt,
80
+ });
81
+ for (const step of steps) {
82
+ insertStep.run({
83
+ id: step.id,
84
+ taskId: step.taskId,
85
+ parentPath: step.parentPath,
86
+ title: step.title,
87
+ path: step.path,
88
+ orderIndex: step.orderIndex,
89
+ dependsOn: JSON.stringify(step.dependsOn),
90
+ status: step.status,
91
+ stepKeyHash: step.stepKeyHash,
92
+ completedAt: step.completedAt,
93
+ createdAt: step.createdAt,
94
+ });
95
+ }
96
+ });
97
+ try {
98
+ transaction();
99
+ }
100
+ catch (err) {
101
+ throw new GateError(GateErrorCode.INTERNAL_ERROR, `Failed to create task: ${err instanceof Error ? err.message : String(err)}`);
102
+ }
103
+ }
104
+ // ---------------------------------------------------------------------------
105
+ // getTask
106
+ // ---------------------------------------------------------------------------
107
+ export function getTask(taskId) {
108
+ if (!taskId) {
109
+ throw new GateError(GateErrorCode.TASK_NOT_FOUND, 'taskId is required');
110
+ }
111
+ try {
112
+ const row = db.prepare('SELECT * FROM tasks WHERE id = ?').get(taskId);
113
+ return row ? mapTaskRow(row) : undefined;
114
+ }
115
+ catch (err) {
116
+ throw new GateError(GateErrorCode.INTERNAL_ERROR, `Failed to get task: ${err instanceof Error ? err.message : String(err)}`);
117
+ }
118
+ }
119
+ // ---------------------------------------------------------------------------
120
+ // getCurrentSteps — returns ALL steps with status='current' (DAG support)
121
+ // ---------------------------------------------------------------------------
122
+ export function getCurrentSteps(taskId) {
123
+ if (!taskId) {
124
+ throw new GateError(GateErrorCode.TASK_NOT_FOUND, 'taskId is required');
125
+ }
126
+ try {
127
+ const rows = db
128
+ .prepare("SELECT * FROM steps WHERE task_id = ? AND status = 'current' ORDER BY order_index ASC")
129
+ .all(taskId);
130
+ return rows.map(mapStepRow);
131
+ }
132
+ catch (err) {
133
+ throw new GateError(GateErrorCode.INTERNAL_ERROR, `Failed to get current steps: ${err instanceof Error ? err.message : String(err)}`);
134
+ }
135
+ }
136
+ // ---------------------------------------------------------------------------
137
+ // getCurrentStep — legacy single-step query (for backward compat)
138
+ // ---------------------------------------------------------------------------
139
+ export function getCurrentStep(taskId) {
140
+ const steps = getCurrentSteps(taskId);
141
+ return steps.length > 0 ? steps[0] : undefined;
142
+ }
143
+ // ---------------------------------------------------------------------------
144
+ // getStep
145
+ // ---------------------------------------------------------------------------
146
+ export function getStep(stepId) {
147
+ if (!stepId) {
148
+ return undefined;
149
+ }
150
+ try {
151
+ const row = db
152
+ .prepare('SELECT * FROM steps WHERE id = ?')
153
+ .get(stepId);
154
+ return row ? mapStepRow(row) : undefined;
155
+ }
156
+ catch (err) {
157
+ throw new GateError(GateErrorCode.INTERNAL_ERROR, `Failed to get step: ${err instanceof Error ? err.message : String(err)}`);
158
+ }
159
+ }
160
+ // ---------------------------------------------------------------------------
161
+ // getTaskSteps
162
+ // ---------------------------------------------------------------------------
163
+ export function getTaskSteps(taskId) {
164
+ if (!taskId) {
165
+ throw new GateError(GateErrorCode.TASK_NOT_FOUND, 'taskId is required');
166
+ }
167
+ try {
168
+ const rows = db
169
+ .prepare('SELECT * FROM steps WHERE task_id = ? ORDER BY order_index ASC')
170
+ .all(taskId);
171
+ return rows.map(mapStepRow);
172
+ }
173
+ catch (err) {
174
+ throw new GateError(GateErrorCode.INTERNAL_ERROR, `Failed to get task steps: ${err instanceof Error ? err.message : String(err)}`);
175
+ }
176
+ }
177
+ // ---------------------------------------------------------------------------
178
+ // completeStep (legacy, kept for test compat)
179
+ // ---------------------------------------------------------------------------
180
+ export function completeStep(stepId) {
181
+ if (!stepId) {
182
+ throw new GateError(GateErrorCode.INVALID_CURRENT_STEP, 'stepId is required');
183
+ }
184
+ try {
185
+ const result = db
186
+ .prepare("UPDATE steps SET status = 'completed', completed_at = ? WHERE id = ?")
187
+ .run(now(), stepId);
188
+ if (result.changes === 0) {
189
+ throw new GateError(GateErrorCode.INVALID_CURRENT_STEP, `Step not found: ${stepId}`);
190
+ }
191
+ }
192
+ catch (err) {
193
+ if (err instanceof GateError)
194
+ throw err;
195
+ throw new GateError(GateErrorCode.INTERNAL_ERROR, `Failed to complete step: ${err instanceof Error ? err.message : String(err)}`);
196
+ }
197
+ }
198
+ // ---------------------------------------------------------------------------
199
+ // setCurrentStep (legacy, kept for test compat)
200
+ // ---------------------------------------------------------------------------
201
+ export function setCurrentStep(stepId, keyHash) {
202
+ if (!stepId) {
203
+ throw new GateError(GateErrorCode.INVALID_CURRENT_STEP, 'stepId is required');
204
+ }
205
+ try {
206
+ const result = db
207
+ .prepare("UPDATE steps SET status = 'current', step_key_hash = ? WHERE id = ?")
208
+ .run(keyHash, stepId);
209
+ if (result.changes === 0) {
210
+ throw new GateError(GateErrorCode.INVALID_CURRENT_STEP, `Step not found: ${stepId}`);
211
+ }
212
+ }
213
+ catch (err) {
214
+ if (err instanceof GateError)
215
+ throw err;
216
+ throw new GateError(GateErrorCode.INTERNAL_ERROR, `Failed to set current step: ${err instanceof Error ? err.message : String(err)}`);
217
+ }
218
+ }
219
+ // ---------------------------------------------------------------------------
220
+ // updateTaskStatus
221
+ // ---------------------------------------------------------------------------
222
+ export function updateTaskStatus(taskId, status) {
223
+ if (!taskId) {
224
+ throw new GateError(GateErrorCode.TASK_NOT_FOUND, 'taskId is required');
225
+ }
226
+ try {
227
+ const result = db
228
+ .prepare('UPDATE tasks SET status = ?, updated_at = ? WHERE id = ?')
229
+ .run(status, now(), taskId);
230
+ if (result.changes === 0) {
231
+ throw new GateError(GateErrorCode.TASK_NOT_FOUND, `Task not found: ${taskId}`);
232
+ }
233
+ }
234
+ catch (err) {
235
+ if (err instanceof GateError)
236
+ throw err;
237
+ throw new GateError(GateErrorCode.INTERNAL_ERROR, `Failed to update task status: ${err instanceof Error ? err.message : String(err)}`);
238
+ }
239
+ }
240
+ // ---------------------------------------------------------------------------
241
+ // setFinalKeyHash (legacy, kept for test compat)
242
+ // ---------------------------------------------------------------------------
243
+ export function setFinalKeyHash(taskId, hash) {
244
+ if (!taskId) {
245
+ throw new GateError(GateErrorCode.TASK_NOT_FOUND, 'taskId is required');
246
+ }
247
+ try {
248
+ const result = db
249
+ .prepare('UPDATE tasks SET final_key_hash = ?, updated_at = ? WHERE id = ?')
250
+ .run(hash, now(), taskId);
251
+ if (result.changes === 0) {
252
+ throw new GateError(GateErrorCode.TASK_NOT_FOUND, `Task not found: ${taskId}`);
253
+ }
254
+ }
255
+ catch (err) {
256
+ if (err instanceof GateError)
257
+ throw err;
258
+ throw new GateError(GateErrorCode.INTERNAL_ERROR, `Failed to set final key hash: ${err instanceof Error ? err.message : String(err)}`);
259
+ }
260
+ }
261
+ // ---------------------------------------------------------------------------
262
+ // verifyStepKey
263
+ // ---------------------------------------------------------------------------
264
+ export function verifyStepKey(taskId, stepId, keyPlaintext) {
265
+ if (!taskId || !stepId || !keyPlaintext) {
266
+ return false;
267
+ }
268
+ try {
269
+ const hashed = sha256(keyPlaintext);
270
+ const step = db
271
+ .prepare("SELECT step_key_hash FROM steps WHERE task_id = ? AND id = ? AND status = 'current' AND step_key_hash = ?")
272
+ .get(taskId, stepId, hashed);
273
+ if (!step)
274
+ return false;
275
+ return true;
276
+ }
277
+ catch {
278
+ return false;
279
+ }
280
+ }
281
+ // ---------------------------------------------------------------------------
282
+ // verifyFinalKey
283
+ // ---------------------------------------------------------------------------
284
+ export function verifyTaskKey(taskId, keyPlaintext) {
285
+ if (!taskId || !keyPlaintext) {
286
+ return false;
287
+ }
288
+ try {
289
+ const task = db
290
+ .prepare('SELECT final_key_hash FROM tasks WHERE id = ?')
291
+ .get(taskId);
292
+ if (!task || !task.final_key_hash)
293
+ return false;
294
+ return sha256(keyPlaintext) === task.final_key_hash;
295
+ }
296
+ catch {
297
+ return false;
298
+ }
299
+ }
300
+ /** @deprecated use verifyTaskKey */
301
+ export const verifyFinalKey = verifyTaskKey;
302
+ // ---------------------------------------------------------------------------
303
+ // getActiveTasks — all tasks with status='active'
304
+ // ---------------------------------------------------------------------------
305
+ export function getActiveTasks(sessionId) {
306
+ try {
307
+ const rows = sessionId
308
+ ? db.prepare("SELECT * FROM tasks WHERE status = 'active' AND session_id = ?").all(sessionId)
309
+ : db.prepare("SELECT * FROM tasks WHERE status = 'active'").all();
310
+ return rows.map(mapTaskRow);
311
+ }
312
+ catch (err) {
313
+ throw new GateError(GateErrorCode.INTERNAL_ERROR, `Failed to get active tasks: ${err instanceof Error ? err.message : String(err)}`);
314
+ }
315
+ }
316
+ // ---------------------------------------------------------------------------
317
+ // getActiveTask — legacy single-task query (for backward compat)
318
+ // ---------------------------------------------------------------------------
319
+ export function getActiveTask() {
320
+ try {
321
+ const row = db.prepare("SELECT * FROM tasks WHERE status = 'active' LIMIT 1").get();
322
+ return row ? mapTaskRow(row) : undefined;
323
+ }
324
+ catch (err) {
325
+ throw new GateError(GateErrorCode.INTERNAL_ERROR, `Failed to get active task: ${err instanceof Error ? err.message : String(err)}`);
326
+ }
327
+ }
328
+ // ---------------------------------------------------------------------------
329
+ // cancelTask
330
+ // ---------------------------------------------------------------------------
331
+ export function cancelTask(taskId, sessionId) {
332
+ if (!taskId || !sessionId) {
333
+ throw new GateError(GateErrorCode.TASK_NOT_FOUND, 'taskId and sessionId are required');
334
+ }
335
+ try {
336
+ const result = db
337
+ .prepare('UPDATE tasks SET status = ?, updated_at = ? WHERE id = ? AND session_id = ? AND status = ?')
338
+ .run('cancelled', now(), taskId, sessionId, 'active');
339
+ if (result.changes === 0) {
340
+ throw new GateError(GateErrorCode.TASK_NOT_FOUND, `Task not found or not owned by this session: ${taskId}`);
341
+ }
342
+ addEvent(taskId, null, 'task_cancelled');
343
+ }
344
+ catch (err) {
345
+ if (err instanceof GateError)
346
+ throw err;
347
+ throw new GateError(GateErrorCode.INTERNAL_ERROR, `Failed to cancel task: ${err instanceof Error ? err.message : String(err)}`);
348
+ }
349
+ }
350
+ // ---------------------------------------------------------------------------
351
+ // addEvent
352
+ // ---------------------------------------------------------------------------
353
+ export function addEvent(taskId, stepId, eventType, payload) {
354
+ if (!taskId || !eventType) {
355
+ throw new GateError(GateErrorCode.INTERNAL_ERROR, 'taskId and eventType are required');
356
+ }
357
+ try {
358
+ db.prepare('INSERT INTO events (id, task_id, step_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)').run(randomUUID(), taskId, stepId, eventType, payload ?? null, now());
359
+ }
360
+ catch (err) {
361
+ throw new GateError(GateErrorCode.INTERNAL_ERROR, `Failed to add event: ${err instanceof Error ? err.message : String(err)}`);
362
+ }
363
+ }
364
+ // ---------------------------------------------------------------------------
365
+ // completeAndAdvance — atomic completion + multi-step activation (DAG)
366
+ // ---------------------------------------------------------------------------
367
+ export function completeAndAdvance(completedStepId, nextStepIds, nextKeyHashes, taskId, finalKeyHash) {
368
+ const transaction = db.transaction(() => {
369
+ // Complete current step — strict WHERE prevents double-consumption
370
+ const result = db.prepare("UPDATE steps SET status = 'completed', completed_at = ? WHERE id = ? AND task_id = ? AND status = 'current'").run(now(), completedStepId, taskId);
371
+ if (result.changes === 0) {
372
+ throw new GateError(GateErrorCode.INVALID_CURRENT_STEP, `Step not in current state or not found: ${completedStepId}`);
373
+ }
374
+ db.prepare("INSERT INTO events (id, task_id, step_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)")
375
+ .run(randomUUID(), taskId, completedStepId, 'step_completed', null, now());
376
+ if (nextStepIds.length > 0) {
377
+ // Activate all unlocked next steps
378
+ for (let i = 0; i < nextStepIds.length; i++) {
379
+ db.prepare("UPDATE steps SET status = 'current', step_key_hash = ? WHERE id = ?")
380
+ .run(nextKeyHashes[i], nextStepIds[i]);
381
+ db.prepare("INSERT INTO events (id, task_id, step_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)")
382
+ .run(randomUUID(), taskId, nextStepIds[i], 'step_activated', null, now());
383
+ }
384
+ // Update task timestamp
385
+ db.prepare('UPDATE tasks SET updated_at = ? WHERE id = ?')
386
+ .run(now(), taskId);
387
+ }
388
+ else if (finalKeyHash) {
389
+ // All completed: store final key hash
390
+ db.prepare('UPDATE tasks SET final_key_hash = ?, updated_at = ? WHERE id = ?')
391
+ .run(finalKeyHash, now(), taskId);
392
+ db.prepare("INSERT INTO events (id, task_id, step_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)")
393
+ .run(randomUUID(), taskId, null, 'all_steps_completed', null, now());
394
+ }
395
+ // else: no next steps and no finalKeyHash → just complete, don't activate anything (parallel branch await)
396
+ });
397
+ try {
398
+ transaction();
399
+ }
400
+ catch (err) {
401
+ if (err instanceof GateError)
402
+ throw err;
403
+ throw new GateError(GateErrorCode.INTERNAL_ERROR, `Failed to advance step: ${err instanceof Error ? err.message : String(err)}`);
404
+ }
405
+ }
406
+ // ---------------------------------------------------------------------------
407
+ // verifySkipKey — proves a step was genuinely completed (for skip on rebuild)
408
+ // ---------------------------------------------------------------------------
409
+ export function verifySkipKey(oldTaskId, stepId, oldKey) {
410
+ if (!oldTaskId || !stepId || !oldKey)
411
+ return false;
412
+ try {
413
+ // Reject if this key has already been consumed (one-time use)
414
+ const consumed = db.prepare("SELECT 1 FROM events WHERE task_id = ? AND step_id = ? AND event_type = 'skip_key_consumed'").get(oldTaskId, stepId);
415
+ if (consumed)
416
+ return false;
417
+ const step = db.prepare("SELECT step_key_hash, status FROM steps WHERE task_id = ? AND id = ?").get(oldTaskId, stepId);
418
+ if (!step || !step.step_key_hash)
419
+ return false;
420
+ if (step.status !== 'completed')
421
+ return false;
422
+ return sha256(oldKey) === step.step_key_hash;
423
+ }
424
+ catch {
425
+ return false;
426
+ }
427
+ }
428
+ /** Record that a skipKey has been consumed — prevents unlimited reuse (B1 fix) */
429
+ export function recordSkipConsumed(taskId, stepId) {
430
+ addEvent(taskId, stepId, 'skip_key_consumed');
431
+ }
432
+ // ---------------------------------------------------------------------------
433
+ // getEvents
434
+ // ---------------------------------------------------------------------------
435
+ export function getEvents(taskId) {
436
+ if (!taskId) {
437
+ throw new GateError(GateErrorCode.TASK_NOT_FOUND, 'taskId is required');
438
+ }
439
+ try {
440
+ const rows = db
441
+ .prepare('SELECT * FROM events WHERE task_id = ? ORDER BY created_at ASC')
442
+ .all(taskId);
443
+ return rows.map(mapEventRow);
444
+ }
445
+ catch (err) {
446
+ throw new GateError(GateErrorCode.INTERNAL_ERROR, `Failed to get events: ${err instanceof Error ? err.message : String(err)}`);
447
+ }
448
+ }
449
+ //# sourceMappingURL=repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/storage/repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerActiveTask(server: McpServer, getSessionId: () => string | null): void;
@@ -0,0 +1,41 @@
1
+ import { getActiveTasks, getTaskSteps } from '../storage/repository.js';
2
+ export function registerActiveTask(server, getSessionId) {
3
+ server.tool('gate_active_task', 'List all active Step Gate tasks for the current session. Returns each task with its currentSteps. Stop Hooks use this to determine whether to call gate_finalize.', {}, async () => {
4
+ const sessionId = getSessionId();
5
+ // Fail closed: without a session, return empty (don't leak other sessions' tasks)
6
+ if (!sessionId) {
7
+ return {
8
+ content: [{ type: 'text', text: JSON.stringify({ sessionId: '', activeTasks: [] }) }],
9
+ };
10
+ }
11
+ const tasks = getActiveTasks(sessionId);
12
+ if (tasks.length === 0) {
13
+ return {
14
+ content: [{ type: 'text', text: JSON.stringify({ sessionId, activeTasks: [] }) }],
15
+ };
16
+ }
17
+ const activeTasks = tasks.map(task => {
18
+ const allSteps = getTaskSteps(task.id);
19
+ const currentSteps = allSteps
20
+ .filter(s => s.status === 'current')
21
+ .map(s => ({
22
+ stepId: s.id,
23
+ path: s.path,
24
+ index: s.orderIndex,
25
+ total: task.totalSteps,
26
+ }));
27
+ return {
28
+ taskId: task.id,
29
+ title: task.title,
30
+ status: task.status,
31
+ totalSteps: task.totalSteps,
32
+ completedSteps: allSteps.filter(s => s.status === 'completed').length,
33
+ currentSteps,
34
+ };
35
+ });
36
+ return {
37
+ content: [{ type: 'text', text: JSON.stringify({ sessionId, activeTasks }) }],
38
+ };
39
+ });
40
+ }
41
+ //# sourceMappingURL=activeTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activeTask.js","sourceRoot":"","sources":["../../src/tools/activeTask.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAmB,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEzF,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,YAAiC;IACrF,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,mKAAmK,EACnK,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,kFAAkF;QAClF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;aAC/F,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAExC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;aAC3F,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACnC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,YAAY,GAAG,QAAQ;iBAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC;iBACnC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACT,MAAM,EAAE,CAAC,CAAC,EAAE;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,UAAU;gBACnB,KAAK,EAAE,IAAI,CAAC,UAAU;aACvB,CAAC,CAAC,CAAC;YAEN,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM;gBACrE,YAAY;aACb,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;SACvF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerCancelTask(server: McpServer, getSessionId: () => string | null): void;
@@ -0,0 +1,39 @@
1
+ import { z } from 'zod';
2
+ import { getTask, cancelTask } from '../storage/repository.js';
3
+ export function registerCancelTask(server, getSessionId) {
4
+ server.tool('gate_cancel_task', 'Cancel an active task. All its steps will be left in their current state.', { taskId: z.string() }, async (params) => {
5
+ const sessionId = getSessionId();
6
+ if (!sessionId) {
7
+ return {
8
+ content: [{ type: 'text', text: JSON.stringify({ accepted: false, message: 'No active session. Task cancellation requires a session.' }) }],
9
+ isError: true,
10
+ };
11
+ }
12
+ const task = getTask(params.taskId);
13
+ if (!task) {
14
+ return {
15
+ content: [{ type: 'text', text: JSON.stringify({ accepted: false, message: 'Task not found.' }) }],
16
+ isError: true,
17
+ };
18
+ }
19
+ if (task.status !== 'active') {
20
+ return {
21
+ content: [{ type: 'text', text: JSON.stringify({ accepted: false, message: 'Task is not active.' }) }],
22
+ isError: true,
23
+ };
24
+ }
25
+ try {
26
+ cancelTask(params.taskId, sessionId);
27
+ return {
28
+ content: [{ type: 'text', text: JSON.stringify({ accepted: true, message: 'Task cancelled.' }) }],
29
+ };
30
+ }
31
+ catch {
32
+ return {
33
+ content: [{ type: 'text', text: JSON.stringify({ accepted: false, message: 'Cannot cancel task from another session.' }) }],
34
+ isError: true,
35
+ };
36
+ }
37
+ });
38
+ }
39
+ //# sourceMappingURL=cancelTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancelTask.js","sourceRoot":"","sources":["../../src/tools/cancelTask.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,YAAiC;IACrF,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,2EAA2E,EAC3E,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EACtB,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,0DAA0D,EAAE,CAAC,EAAE,CAAC;gBACpJ,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;gBAC3G,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC;gBAC/G,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACrC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;aAC3G,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,0CAA0C,EAAE,CAAC,EAAE,CAAC;gBACpI,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerCheckpoint(server: McpServer): void;
@@ -0,0 +1,71 @@
1
+ // ============================================================================
2
+ // Agent Step Gate — gate_checkpoint MCP Tool
3
+ // Phase 2: Supports DAG — returns multiple next steps, stepId is required.
4
+ // ============================================================================
5
+ import { z } from 'zod';
6
+ import { GateError, GateErrorCode } from '../core/errors.js';
7
+ import { validateCheckpoint, advanceSteps } from '../core/gate.js';
8
+ import * as repo from '../storage/repository.js';
9
+ // ---------------------------------------------------------------------------
10
+ // Handler
11
+ // ---------------------------------------------------------------------------
12
+ async function handleCheckpoint(params) {
13
+ try {
14
+ // validateCheckpoint performs 5 checks, throws GateError on failure
15
+ const { task, currentStep } = validateCheckpoint(repo, params.taskId, params.stepId, params.stepKey);
16
+ // Advance the DAG state machine
17
+ const result = advanceSteps(repo, task, params.stepId);
18
+ // All steps completed → return task_key
19
+ if (result.allStepsCompleted) {
20
+ return {
21
+ accepted: true,
22
+ allStepsCompleted: true,
23
+ taskKey: result.taskKey,
24
+ completedStep: { stepId: currentStep.id, path: currentStep.path },
25
+ };
26
+ }
27
+ // Normal advance → return next steps (may be empty if parallel branch)
28
+ return {
29
+ accepted: true,
30
+ completedStep: { stepId: currentStep.id, path: currentStep.path },
31
+ nextSteps: result.nextSteps,
32
+ nextStepKeys: result.nextStepKeys,
33
+ };
34
+ }
35
+ catch (err) {
36
+ if (err instanceof GateError) {
37
+ const response = {
38
+ accepted: false,
39
+ error: err.code,
40
+ message: err.message,
41
+ };
42
+ if (err.currentStep) {
43
+ response.currentStep = err.currentStep;
44
+ }
45
+ return response;
46
+ }
47
+ // Unknown error
48
+ return {
49
+ accepted: false,
50
+ error: GateErrorCode.INTERNAL_ERROR,
51
+ message: err instanceof Error ? err.message : String(err),
52
+ };
53
+ }
54
+ }
55
+ // ---------------------------------------------------------------------------
56
+ // MCP Tool registration
57
+ // ---------------------------------------------------------------------------
58
+ export function registerCheckpoint(server) {
59
+ server.tool('gate_checkpoint', 'Complete a current step and unlock next steps whose dependencies are satisfied. Returns next step keys (may be multiple for parallel branches). Returns task_key when all steps are done.', {
60
+ taskId: z.string().describe('The task ID'),
61
+ stepId: z.string().describe('The step ID being completed'),
62
+ stepKey: z.string().describe('The step key for the current step (proves possession)'),
63
+ }, async (params) => {
64
+ const output = await handleCheckpoint(params);
65
+ return {
66
+ content: [{ type: 'text', text: JSON.stringify(output) }],
67
+ isError: !output.accepted,
68
+ };
69
+ });
70
+ }
71
+ //# sourceMappingURL=checkpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/tools/checkpoint.ts"],"names":[],"mappings":"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"}