@polpo-ai/core 0.15.144 → 0.16.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 (172) hide show
  1. package/README.md +30 -0
  2. package/dist/__tests__/custom-tool-runner.test.d.ts +2 -0
  3. package/dist/__tests__/custom-tool-runner.test.d.ts.map +1 -0
  4. package/dist/__tests__/custom-tool-runner.test.js +121 -0
  5. package/dist/__tests__/custom-tool-runner.test.js.map +1 -0
  6. package/dist/__tests__/mcp-runner-client.test.d.ts +2 -0
  7. package/dist/__tests__/mcp-runner-client.test.d.ts.map +1 -0
  8. package/dist/__tests__/mcp-runner-client.test.js +144 -0
  9. package/dist/__tests__/mcp-runner-client.test.js.map +1 -0
  10. package/dist/__tests__/mission-execution.test.d.ts +2 -0
  11. package/dist/__tests__/mission-execution.test.d.ts.map +1 -0
  12. package/dist/__tests__/mission-execution.test.js +68 -0
  13. package/dist/__tests__/mission-execution.test.js.map +1 -0
  14. package/dist/__tests__/run-state-monitor.test.d.ts +2 -0
  15. package/dist/__tests__/run-state-monitor.test.d.ts.map +1 -0
  16. package/dist/__tests__/run-state-monitor.test.js +59 -0
  17. package/dist/__tests__/run-state-monitor.test.js.map +1 -0
  18. package/dist/__tests__/runtime-metadata.test.d.ts +2 -0
  19. package/dist/__tests__/runtime-metadata.test.d.ts.map +1 -0
  20. package/dist/__tests__/runtime-metadata.test.js +17 -0
  21. package/dist/__tests__/runtime-metadata.test.js.map +1 -0
  22. package/dist/__tests__/task-execution-router.test.js +1 -1
  23. package/dist/__tests__/task-execution-router.test.js.map +1 -1
  24. package/dist/__tests__/task-runner-agent-lifetime.test.d.ts +2 -0
  25. package/dist/__tests__/task-runner-agent-lifetime.test.d.ts.map +1 -0
  26. package/dist/__tests__/task-runner-agent-lifetime.test.js +136 -0
  27. package/dist/__tests__/task-runner-agent-lifetime.test.js.map +1 -0
  28. package/dist/adapter.d.ts +18 -0
  29. package/dist/adapter.d.ts.map +1 -1
  30. package/dist/agent-manager.d.ts +3 -0
  31. package/dist/agent-manager.d.ts.map +1 -1
  32. package/dist/agent-manager.js +28 -2
  33. package/dist/agent-manager.js.map +1 -1
  34. package/dist/agent-store.d.ts +70 -1
  35. package/dist/agent-store.d.ts.map +1 -1
  36. package/dist/agent-store.js +103 -1
  37. package/dist/agent-store.js.map +1 -1
  38. package/dist/approval-manager.d.ts +24 -4
  39. package/dist/approval-manager.d.ts.map +1 -1
  40. package/dist/approval-manager.js +160 -112
  41. package/dist/approval-manager.js.map +1 -1
  42. package/dist/approval-manager.test.d.ts +2 -0
  43. package/dist/approval-manager.test.d.ts.map +1 -0
  44. package/dist/approval-manager.test.js +116 -0
  45. package/dist/approval-manager.test.js.map +1 -0
  46. package/dist/assessment-orchestrator.d.ts +12 -1
  47. package/dist/assessment-orchestrator.d.ts.map +1 -1
  48. package/dist/assessment-orchestrator.js +181 -83
  49. package/dist/assessment-orchestrator.js.map +1 -1
  50. package/dist/custom-tool-runner.d.ts +56 -0
  51. package/dist/custom-tool-runner.d.ts.map +1 -0
  52. package/dist/custom-tool-runner.js +197 -0
  53. package/dist/custom-tool-runner.js.map +1 -0
  54. package/dist/escalation-manager.d.ts +2 -0
  55. package/dist/escalation-manager.d.ts.map +1 -1
  56. package/dist/escalation-manager.js +79 -25
  57. package/dist/escalation-manager.js.map +1 -1
  58. package/dist/events.d.ts +4 -0
  59. package/dist/events.d.ts.map +1 -1
  60. package/dist/hooks.d.ts.map +1 -1
  61. package/dist/hooks.js +6 -0
  62. package/dist/hooks.js.map +1 -1
  63. package/dist/index.d.ts +19 -3
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +13 -1
  66. package/dist/index.js.map +1 -1
  67. package/dist/mcp-capability.d.ts +40 -0
  68. package/dist/mcp-capability.d.ts.map +1 -0
  69. package/dist/mcp-capability.js +2 -0
  70. package/dist/mcp-capability.js.map +1 -0
  71. package/dist/mcp-runner.d.ts +45 -0
  72. package/dist/mcp-runner.d.ts.map +1 -0
  73. package/dist/mcp-runner.js +238 -0
  74. package/dist/mcp-runner.js.map +1 -0
  75. package/dist/mission-cancellation.d.ts +14 -0
  76. package/dist/mission-cancellation.d.ts.map +1 -0
  77. package/dist/mission-cancellation.js +43 -0
  78. package/dist/mission-cancellation.js.map +1 -0
  79. package/dist/mission-execution.d.ts +103 -0
  80. package/dist/mission-execution.d.ts.map +1 -0
  81. package/dist/mission-execution.js +196 -0
  82. package/dist/mission-execution.js.map +1 -0
  83. package/dist/mission-executor.d.ts +18 -16
  84. package/dist/mission-executor.d.ts.map +1 -1
  85. package/dist/mission-executor.js +339 -203
  86. package/dist/mission-executor.js.map +1 -1
  87. package/dist/mission-gating.d.ts +11 -15
  88. package/dist/mission-gating.d.ts.map +1 -1
  89. package/dist/mission-gating.js +25 -33
  90. package/dist/mission-gating.js.map +1 -1
  91. package/dist/mission-inspection.d.ts +29 -0
  92. package/dist/mission-inspection.d.ts.map +1 -0
  93. package/dist/mission-inspection.js +99 -0
  94. package/dist/mission-inspection.js.map +1 -0
  95. package/dist/mission-store.d.ts +7 -0
  96. package/dist/mission-store.d.ts.map +1 -1
  97. package/dist/mission-store.js +8 -0
  98. package/dist/mission-store.js.map +1 -1
  99. package/dist/orchestrator-context.d.ts +3 -0
  100. package/dist/orchestrator-context.d.ts.map +1 -1
  101. package/dist/orchestrator-engine.d.ts +39 -39
  102. package/dist/orchestrator-engine.d.ts.map +1 -1
  103. package/dist/orchestrator-engine.js +124 -24
  104. package/dist/orchestrator-engine.js.map +1 -1
  105. package/dist/run-state-monitor.d.ts +14 -0
  106. package/dist/run-state-monitor.d.ts.map +1 -0
  107. package/dist/run-state-monitor.js +63 -0
  108. package/dist/run-state-monitor.js.map +1 -0
  109. package/dist/run-store.d.ts +15 -0
  110. package/dist/run-store.d.ts.map +1 -1
  111. package/dist/runner-capability.d.ts +43 -0
  112. package/dist/runner-capability.d.ts.map +1 -0
  113. package/dist/runner-capability.js +55 -0
  114. package/dist/runner-capability.js.map +1 -0
  115. package/dist/runtime-metadata.d.ts +5 -0
  116. package/dist/runtime-metadata.d.ts.map +1 -0
  117. package/dist/runtime-metadata.js +21 -0
  118. package/dist/runtime-metadata.js.map +1 -0
  119. package/dist/scheduler.d.ts +2 -1
  120. package/dist/scheduler.d.ts.map +1 -1
  121. package/dist/scheduler.js +16 -6
  122. package/dist/scheduler.js.map +1 -1
  123. package/dist/schemas.d.ts +8 -6
  124. package/dist/schemas.d.ts.map +1 -1
  125. package/dist/schemas.js +10 -0
  126. package/dist/schemas.js.map +1 -1
  127. package/dist/spawner.d.ts +12 -0
  128. package/dist/spawner.d.ts.map +1 -1
  129. package/dist/steering.d.ts +4 -1
  130. package/dist/steering.d.ts.map +1 -1
  131. package/dist/steering.js.map +1 -1
  132. package/dist/task-approval-coordinator.d.ts +29 -0
  133. package/dist/task-approval-coordinator.d.ts.map +1 -0
  134. package/dist/task-approval-coordinator.js +216 -0
  135. package/dist/task-approval-coordinator.js.map +1 -0
  136. package/dist/task-dispatch.d.ts +40 -0
  137. package/dist/task-dispatch.d.ts.map +1 -0
  138. package/dist/task-dispatch.js +136 -0
  139. package/dist/task-dispatch.js.map +1 -0
  140. package/dist/task-execution.d.ts +146 -0
  141. package/dist/task-execution.d.ts.map +1 -0
  142. package/dist/task-execution.js +357 -0
  143. package/dist/task-execution.js.map +1 -0
  144. package/dist/task-manager.d.ts +31 -22
  145. package/dist/task-manager.d.ts.map +1 -1
  146. package/dist/task-manager.js +74 -7
  147. package/dist/task-manager.js.map +1 -1
  148. package/dist/task-runner.d.ts +30 -3
  149. package/dist/task-runner.d.ts.map +1 -1
  150. package/dist/task-runner.js +429 -90
  151. package/dist/task-runner.js.map +1 -1
  152. package/dist/task-store.d.ts +9 -3
  153. package/dist/task-store.d.ts.map +1 -1
  154. package/dist/tool-invocation.d.ts +4 -0
  155. package/dist/tool-invocation.d.ts.map +1 -1
  156. package/dist/tool-invocation.js +8 -1
  157. package/dist/tool-invocation.js.map +1 -1
  158. package/dist/tool-invocation.test.d.ts +2 -0
  159. package/dist/tool-invocation.test.d.ts.map +1 -0
  160. package/dist/tool-invocation.test.js +40 -0
  161. package/dist/tool-invocation.test.js.map +1 -0
  162. package/dist/types/agent.d.ts +4 -0
  163. package/dist/types/agent.d.ts.map +1 -1
  164. package/dist/types/agent.js.map +1 -1
  165. package/dist/types/config.d.ts +3 -0
  166. package/dist/types/config.d.ts.map +1 -1
  167. package/dist/types/config.js.map +1 -1
  168. package/dist/types/mission.d.ts +23 -1
  169. package/dist/types/mission.d.ts.map +1 -1
  170. package/dist/types/task.d.ts +10 -0
  171. package/dist/types/task.d.ts.map +1 -1
  172. package/package.json +17 -1
@@ -1 +1 @@
1
- {"version":3,"file":"agent-store.js","sourceRoot":"","sources":["../src/agent-store.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"agent-store.js","sourceRoot":"","sources":["../src/agent-store.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,12 @@
1
1
  import type { OrchestratorContext } from "./orchestrator-context.js";
2
2
  import type { ApprovalStore } from "./approval-store.js";
3
- import type { ApprovalRequest, ApprovalStatus } from "./types.js";
3
+ import type { ApprovalGate, ApprovalRequest, ApprovalStatus, Task } from "./types.js";
4
+ import { type TaskApprovalBinding } from "./task-execution.js";
5
+ /** Approval resolution can run on a cold host without creating a scheduler,
6
+ * model client, runner, sandbox or any other execution subsystem. */
7
+ export type ApprovalContext = Pick<OrchestratorContext, "taskStore" | "hooks" | "config" | "emitter">;
8
+ /** Shared project-policy validation, including hosts loading JSON settings. */
9
+ export declare function normalizeApprovalGates(value: unknown): ApprovalGate[];
4
10
  /**
5
11
  * Manages approval gates — both automatic (condition-based) and human (blocking).
6
12
  *
@@ -15,23 +21,33 @@ export declare class ApprovalManager {
15
21
  private ctx;
16
22
  private store;
17
23
  private timers;
18
- private registeredGateRules;
24
+ private unregister;
25
+ private initialized;
26
+ private disposed;
27
+ private inFlight;
28
+ private taskApprovals;
19
29
  private evaluator;
20
- constructor(ctx: OrchestratorContext, store: ApprovalStore);
30
+ constructor(ctx: ApprovalContext, store: ApprovalStore);
21
31
  /** Initialize: register hooks for all configured approval gates. */
22
32
  init(): Promise<void>;
33
+ private initCurrent;
23
34
  private ensureGateNotificationRules;
24
35
  private registerGate;
25
36
  private createRequest;
37
+ checkTask(hook: TaskApprovalBinding["hook"], task: Task, invocation: TaskApprovalBinding["invocation"]): Promise<boolean>;
38
+ private checkTaskCurrent;
39
+ claimTask(task: Task, runId: string): Promise<import("./task-execution.js").TaskDispatchClaim>;
26
40
  approve(requestId: string, resolvedBy?: string, note?: string): Promise<ApprovalRequest | null>;
41
+ private approveCurrent;
27
42
  reject(requestId: string, feedback: string, resolvedBy?: string): Promise<ApprovalRequest | null>;
43
+ private rejectCurrent;
28
44
  canReject(requestId: string): Promise<{
29
45
  allowed: boolean;
30
46
  rejectionCount: number;
31
47
  maxRejections: number;
32
48
  }>;
33
- private resolve;
34
49
  private resolveTimeout;
50
+ private resolveTimeoutCurrent;
35
51
  getPending(): Promise<ApprovalRequest[]>;
36
52
  getAll(status?: ApprovalStatus): Promise<ApprovalRequest[]>;
37
53
  getRequest(id: string): Promise<ApprovalRequest | undefined>;
@@ -41,6 +57,10 @@ export declare class ApprovalManager {
41
57
  private isRecord;
42
58
  private extractTaskId;
43
59
  private extractMissionId;
60
+ private track;
61
+ /** Hosts must await this before replacing the manager or closing its stores.
62
+ * The replacement's init then discovers every committed pending request. */
63
+ close(): Promise<void>;
44
64
  dispose(): void;
45
65
  }
46
66
  //# sourceMappingURL=approval-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"approval-manager.d.ts","sourceRoot":"","sources":["../src/approval-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAgB,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGhF;;;;;;;;;GASG;AACH,qBAAa,eAAe;IAMxB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,KAAK;IANf,OAAO,CAAC,MAAM,CAAoD;IAClE,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,SAAS,CAAiC;gBAGxC,GAAG,EAAE,mBAAmB,EACxB,KAAK,EAAE,aAAa;IAG9B,oEAAoE;IAC9D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB3B,OAAO,CAAC,2BAA2B;IAInC,OAAO,CAAC,YAAY;IAiDpB,OAAO,CAAC,aAAa;IAgBf,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAI/F,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IA8CjG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;YAclG,OAAO;YAsCP,cAAc;IAyBtB,UAAU,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAIxC,MAAM,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAI3D,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAMlE,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,IAAI,IAAI;CAOhB"}
1
+ {"version":3,"file":"approval-manager.d.ts","sourceRoot":"","sources":["../src/approval-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,EAAmE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAIhI;qEACqE;AACrE,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,EAAE,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC;AACtG,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,EAAE,CAiBrE;AACD;;;;;;;;;GASG;AACH,qBAAa,eAAe;IAUxB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,KAAK;IAVf,OAAO,CAAC,MAAM,CAAoD;IAClE,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,SAAS,CAAiC;gBAGxC,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,aAAa;IAG9B,oEAAoE;IACpE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAEP,WAAW;IAyBzB,OAAO,CAAC,2BAA2B;IAInC,OAAO,CAAC,YAAY;IAqDpB,OAAO,CAAC,aAAa;IAcrB,SAAS,CAAC,IAAI,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,mBAAmB,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;YAG3G,gBAAgB;IAe9B,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM;IAEnC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;YAGjF,cAAc;IAc5B,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;YAGnF,aAAa;IAQrB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAKhH,OAAO,CAAC,cAAc;YAGR,qBAAqB;IAiB7B,UAAU,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAIxC,MAAM,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAI3D,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAMlE,OAAO,CAAC,UAAU;IA6BlB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,KAAK;IAQb;gFAC4E;IACtE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,OAAO,IAAI,IAAI;CAShB"}
@@ -1,5 +1,29 @@
1
1
  import { nanoid } from "nanoid";
2
+ import { isTaskExecutionStore, taskExecutionReference, TaskApprovalError } from "./task-execution.js";
3
+ import { TaskApprovalCoordinator } from "./task-approval-coordinator.js";
2
4
  import { SafeExpressionEvaluator } from "./loop/expression.js";
5
+ /** Shared project-policy validation, including hosts loading JSON settings. */
6
+ export function normalizeApprovalGates(value) {
7
+ if (value === undefined)
8
+ return [];
9
+ const invalid = () => { throw new TaskApprovalError("task_approval_invalid", "Invalid approval gate configuration"); };
10
+ if (!Array.isArray(value) || value.length > 1000)
11
+ invalid();
12
+ const ids = new Set();
13
+ for (const gate of value) {
14
+ if (!gate || typeof gate !== "object" || typeof gate.id !== "string" || !gate.id.trim() || ids.has(gate.id)
15
+ || typeof gate.name !== "string" || !gate.name.trim() || typeof gate.hook !== "string" || !gate.hook.trim()
16
+ || !["human", "auto"].includes(gate.handler)
17
+ || (gate.condition !== undefined && typeof gate.condition?.expression !== "string")
18
+ || (gate.timeoutMs !== undefined && (!Number.isSafeInteger(gate.timeoutMs) || gate.timeoutMs < 0 || gate.timeoutMs > 2_147_483_647))
19
+ || (gate.timeoutAction !== undefined && !["approve", "reject"].includes(gate.timeoutAction))
20
+ || (gate.maxRevisions !== undefined && (!Number.isSafeInteger(gate.maxRevisions) || gate.maxRevisions < 0))
21
+ || (gate.priority !== undefined && !Number.isFinite(gate.priority)))
22
+ invalid();
23
+ ids.add(gate.id);
24
+ }
25
+ return structuredClone(value);
26
+ }
3
27
  /**
4
28
  * Manages approval gates — both automatic (condition-based) and human (blocking).
5
29
  *
@@ -14,24 +38,32 @@ export class ApprovalManager {
14
38
  ctx;
15
39
  store;
16
40
  timers = new Map();
17
- registeredGateRules = new Set();
41
+ unregister = [];
42
+ initialized = false;
43
+ disposed = false;
44
+ inFlight = new Set();
45
+ taskApprovals;
18
46
  evaluator = new SafeExpressionEvaluator();
19
47
  constructor(ctx, store) {
20
48
  this.ctx = ctx;
21
49
  this.store = store;
50
+ this.taskApprovals = new TaskApprovalCoordinator(ctx);
22
51
  }
23
52
  /** Initialize: register hooks for all configured approval gates. */
24
- async init() {
25
- const gates = this.ctx.config.settings.approvalGates;
26
- if (!gates || gates.length === 0)
53
+ init() { return this.track(() => this.initCurrent()); }
54
+ async initCurrent() {
55
+ if (this.initialized)
27
56
  return;
57
+ this.initialized = true;
58
+ const gates = normalizeApprovalGates(this.ctx.config.settings.approvalGates);
28
59
  for (const gate of gates) {
29
- this.registerGate(gate);
60
+ if (gate.hook !== "task:spawn" && gate.hook !== "task:complete")
61
+ this.registerGate(gate);
30
62
  }
31
63
  // Resume any pending approval timeouts from previous session
32
64
  const pending = await this.store.list("pending");
33
65
  for (const req of pending) {
34
- const gate = gates.find(g => g.id === req.gateId);
66
+ const gate = req.taskExecution?.gates.find(g => g.id === req.gateId) ?? gates.find(g => g.id === req.gateId);
35
67
  if (gate?.timeoutMs && gate.timeoutMs > 0) {
36
68
  const elapsed = Date.now() - new Date(req.requestedAt).getTime();
37
69
  const remaining = gate.timeoutMs - elapsed;
@@ -50,12 +82,12 @@ export class ApprovalManager {
50
82
  registerGate(gate) {
51
83
  const hook = gate.hook;
52
84
  this.ensureGateNotificationRules(gate);
53
- this.ctx.hooks.register({
85
+ this.unregister.push(this.ctx.hooks.register({
54
86
  hook,
55
87
  phase: "before",
56
88
  priority: gate.priority ?? 50,
57
89
  name: `approval-gate:${gate.name}`,
58
- handler: (ctx) => {
90
+ handler: async (ctx) => {
59
91
  if (gate.condition?.expression) {
60
92
  const matches = this.evaluateCondition(gate.condition.expression, ctx.data);
61
93
  if (!matches)
@@ -70,11 +102,16 @@ export class ApprovalManager {
70
102
  const request = this.createRequest(gate, ctx.data);
71
103
  ctx.cancel(`Awaiting human approval: ${gate.name} (request: ${request.id})`);
72
104
  const taskId = this.extractTaskId(ctx.data);
105
+ const payloadTask = ctx.data.task;
106
+ const execution = payloadTask && payloadTask.id === taskId ? taskExecutionReference(payloadTask) : undefined;
107
+ await this.store.upsert(request);
73
108
  if (taskId) {
74
- // Fire-and-forget async transition
75
- this.ctx.taskStore.transition(taskId, "awaiting_approval").catch(() => {
76
- /* Task may already be in a state that doesn't allow this transition */
77
- });
109
+ if (execution && isTaskExecutionStore(this.ctx.taskStore)) {
110
+ await this.ctx.taskStore.mutateTaskExecution(execution, { type: "transition", status: "awaiting_approval" });
111
+ }
112
+ else {
113
+ await this.ctx.taskStore.transition(taskId, "awaiting_approval");
114
+ }
78
115
  }
79
116
  this.ctx.emitter.emit("approval:requested", {
80
117
  requestId: request.id,
@@ -87,7 +124,7 @@ export class ApprovalManager {
87
124
  this.startTimer(request.id, gate.timeoutMs, gate);
88
125
  }
89
126
  },
90
- });
127
+ }));
91
128
  }
92
129
  createRequest(gate, payload) {
93
130
  const request = {
@@ -100,117 +137,85 @@ export class ApprovalManager {
100
137
  payload,
101
138
  requestedAt: new Date().toISOString(),
102
139
  };
103
- // Fire-and-forget async store write
104
- this.store.upsert(request).catch(() => { });
105
140
  return request;
106
141
  }
107
- async approve(requestId, resolvedBy, note) {
108
- return this.resolve(requestId, "approved", resolvedBy, note);
142
+ checkTask(hook, task, invocation) {
143
+ return this.track(() => this.checkTaskCurrent(hook, task, invocation));
109
144
  }
110
- async reject(requestId, feedback, resolvedBy) {
111
- const request = await this.store.get(requestId);
112
- if (!request || request.status !== "pending")
113
- return null;
114
- if (!request.taskId)
115
- return null;
116
- const gate = this.ctx.config.settings.approvalGates?.find(g => g.id === request.gateId);
117
- const maxRevisions = gate?.maxRevisions ?? 3;
118
- const task = await this.ctx.taskStore.getTask(request.taskId);
119
- if (!task)
120
- return null;
121
- const currentCount = task.revisionCount ?? 0;
122
- if (currentCount >= maxRevisions)
123
- return null;
124
- request.status = "rejected";
125
- request.resolvedAt = new Date().toISOString();
126
- request.resolvedBy = resolvedBy ?? "user";
127
- request.note = feedback;
128
- await this.store.upsert(request);
129
- this.clearTimer(requestId);
130
- const newCount = currentCount + 1;
131
- await this.ctx.taskStore.updateTask(request.taskId, { revisionCount: newCount });
132
- const separator = "\n\n---\n";
133
- const feedbackBlock = `**Rejection #${newCount} feedback:** ${feedback}`;
134
- const updatedDescription = task.description + separator + feedbackBlock;
135
- await this.ctx.taskStore.updateTask(request.taskId, { description: updatedDescription });
136
- this.ctx.emitter.emit("approval:rejected", {
137
- requestId,
138
- taskId: request.taskId,
139
- feedback,
140
- rejectionCount: newCount,
141
- resolvedBy: request.resolvedBy,
142
- });
143
- await this.ctx.taskStore.updateTask(request.taskId, { outcomes: [] });
144
- try {
145
- await this.ctx.taskStore.transition(request.taskId, "pending");
145
+ async checkTaskCurrent(hook, task, invocation) {
146
+ const payload = hook === "task:complete" ? { taskId: task.id, ...invocation } : invocation;
147
+ const gates = normalizeApprovalGates(this.ctx.config.settings.approvalGates).filter(gate => gate.hook === hook
148
+ && (!gate.condition?.expression || this.evaluateCondition(gate.condition.expression, payload)))
149
+ .sort((a, b) => (a.priority ?? 50) - (b.priority ?? 50));
150
+ const result = await this.taskApprovals.check(hook, task, invocation, gates);
151
+ for (const request of this.disposed ? [] : result.created) {
152
+ this.ctx.emitter.emit("approval:requested", { requestId: request.id, gateId: request.gateId,
153
+ gateName: request.gateName, taskId: request.taskId, missionId: request.missionId });
154
+ const gate = request.taskExecution.gates.find(gate => gate.id === request.gateId);
155
+ if (gate.timeoutMs && gate.timeoutMs > 0)
156
+ this.startTimer(request.id, gate.timeoutMs, gate);
146
157
  }
147
- catch { /* Task may have been modified externally */ }
148
- return request;
158
+ return result.allowed;
149
159
  }
150
- async canReject(requestId) {
151
- const request = await this.store.get(requestId);
152
- if (!request || request.status !== "pending" || !request.taskId) {
153
- return { allowed: false, rejectionCount: 0, maxRejections: 0 };
154
- }
155
- const gate = this.ctx.config.settings.approvalGates?.find(g => g.id === request.gateId);
156
- const maxRejections = gate?.maxRevisions ?? 3;
157
- const task = await this.ctx.taskStore.getTask(request.taskId);
158
- const currentCount = task?.revisionCount ?? 0;
159
- return { allowed: currentCount < maxRejections, rejectionCount: currentCount, maxRejections };
160
+ claimTask(task, runId) { return this.track(() => this.taskApprovals.claim(task, runId)); }
161
+ approve(requestId, resolvedBy, note) {
162
+ return this.track(() => this.approveCurrent(requestId, resolvedBy, note));
160
163
  }
161
- async resolve(requestId, status, resolvedBy, note) {
164
+ async approveCurrent(requestId, resolvedBy, note) {
162
165
  const request = await this.store.get(requestId);
163
166
  if (!request || request.status !== "pending")
164
167
  return null;
165
- request.status = status;
166
- request.resolvedAt = new Date().toISOString();
167
- request.resolvedBy = resolvedBy ?? "user";
168
- request.note = note;
169
- await this.store.upsert(request);
170
- this.clearTimer(requestId);
171
- this.ctx.emitter.emit("approval:resolved", {
172
- requestId,
173
- status,
174
- resolvedBy: request.resolvedBy,
175
- });
176
168
  if (request.taskId) {
177
- try {
178
- if (status === "approved") {
179
- const gate = this.ctx.config.settings.approvalGates?.find(g => g.id === request.gateId);
180
- const targetStatus = gate?.hook === "task:complete" ? "done" : "assigned";
181
- await this.ctx.taskStore.transition(request.taskId, targetStatus);
182
- }
183
- else {
184
- await this.ctx.taskStore.transition(request.taskId, "failed");
185
- }
186
- }
187
- catch { /* Task may have been modified externally */ }
169
+ const resolved = await this.taskApprovals.resolve(request, "approve", resolvedBy, note);
170
+ if (resolved)
171
+ this.clearTimer(requestId);
172
+ return resolved;
188
173
  }
189
- return request;
174
+ const resolved = { ...request, status: "approved", resolvedAt: new Date().toISOString(), resolvedBy: resolvedBy ?? "user", note };
175
+ await this.store.upsert(resolved);
176
+ this.clearTimer(requestId);
177
+ this.ctx.emitter.emit("approval:resolved", { requestId, status: resolved.status, resolvedBy: resolved.resolvedBy });
178
+ return resolved;
179
+ }
180
+ reject(requestId, feedback, resolvedBy) {
181
+ return this.track(() => this.rejectCurrent(requestId, feedback, resolvedBy));
190
182
  }
191
- async resolveTimeout(request, gate) {
183
+ async rejectCurrent(requestId, feedback, resolvedBy) {
184
+ const request = await this.store.get(requestId);
185
+ if (!request || request.status !== "pending" || !request.taskId)
186
+ return null;
187
+ const resolved = await this.taskApprovals.resolve(request, "reject", resolvedBy, feedback);
188
+ if (resolved)
189
+ for (const id of request.taskExecution?.requestIds ?? [requestId])
190
+ this.clearTimer(id);
191
+ return resolved;
192
+ }
193
+ async canReject(requestId) {
194
+ const request = await this.store.get(requestId);
195
+ return request ? this.taskApprovals.canReject(request) : { allowed: false, rejectionCount: 0, maxRejections: 0 };
196
+ }
197
+ resolveTimeout(request, gate) {
198
+ return this.track(() => this.resolveTimeoutCurrent(request, gate));
199
+ }
200
+ async resolveTimeoutCurrent(request, gate) {
192
201
  if (request.status !== "pending")
193
202
  return;
194
- const action = gate.timeoutAction ?? "reject";
195
- request.status = "timeout";
196
- request.resolvedAt = new Date().toISOString();
197
- request.resolvedBy = "timeout";
198
- await this.store.upsert(request);
199
- this.ctx.emitter.emit("approval:timeout", {
200
- requestId: request.id,
201
- action,
202
- });
203
203
  if (request.taskId) {
204
204
  try {
205
- if (action === "approve") {
206
- await this.ctx.taskStore.transition(request.taskId, "assigned");
207
- }
208
- else {
209
- await this.ctx.taskStore.transition(request.taskId, "failed");
210
- }
205
+ await this.taskApprovals.resolve(request, "timeout");
211
206
  }
212
- catch { /* Task may have been modified externally */ }
207
+ catch (error) {
208
+ // A sibling gate may have changed while this timer was committing.
209
+ // Retry that conflict; only confirmed obsolete work loses its timer.
210
+ if (!(error instanceof TaskApprovalError && error.code === "task_approval_conflict")
211
+ || await this.taskApprovals.isPending(request))
212
+ throw error;
213
+ }
214
+ return;
213
215
  }
216
+ const resolved = { ...request, status: "timeout", resolvedAt: new Date().toISOString(), resolvedBy: "timeout" };
217
+ await this.store.upsert(resolved);
218
+ this.ctx.emitter.emit("approval:timeout", { requestId: request.id, action: gate.timeoutAction ?? "reject" });
214
219
  }
215
220
  async getPending() {
216
221
  return this.store.list("pending");
@@ -222,12 +227,39 @@ export class ApprovalManager {
222
227
  return this.store.get(id);
223
228
  }
224
229
  // ─── Helpers ───────────────────────────────────────
225
- startTimer(requestId, ms, gate) {
230
+ startTimer(requestId, ms, gate, failures = 0) {
231
+ if (this.disposed)
232
+ return;
233
+ this.clearTimer(requestId);
226
234
  const timer = setTimeout(async () => {
227
- const request = await this.store.get(requestId);
228
- if (request)
229
- await this.resolveTimeout(request, gate);
230
- this.timers.delete(requestId);
235
+ try {
236
+ const request = await this.store.get(requestId);
237
+ // A dispose or explicit resolution may have cleared this timer while
238
+ // the durable read was in flight. It no longer owns timeout work.
239
+ if (this.timers.get(requestId) !== timer)
240
+ return;
241
+ if (request?.status === "pending")
242
+ await this.resolveTimeout(request, gate);
243
+ }
244
+ catch {
245
+ if (this.timers.get(requestId) !== timer)
246
+ return;
247
+ // Storage errors can contain connection strings or private payloads.
248
+ // Retry the durable read with backoff; never infer a successful
249
+ // resolution from a failed write or its missing acknowledgement.
250
+ try {
251
+ this.ctx.emitter.emit("log", { level: "error", message: "Approval timeout could not be processed; retrying" });
252
+ }
253
+ catch { /* A logging listener must not create an unhandled rejection. */ }
254
+ if (this.timers.get(requestId) === timer) {
255
+ this.startTimer(requestId, Math.min(1_000 * 2 ** failures, 30_000), gate, Math.min(failures + 1, 5));
256
+ }
257
+ }
258
+ finally {
259
+ // Do not remove the replacement timer installed for a failed attempt.
260
+ if (this.timers.get(requestId) === timer)
261
+ this.timers.delete(requestId);
262
+ }
231
263
  }, ms);
232
264
  this.timers.set(requestId, timer);
233
265
  }
@@ -270,12 +302,28 @@ export class ApprovalManager {
270
302
  }
271
303
  return undefined;
272
304
  }
305
+ track(operation) {
306
+ if (this.disposed)
307
+ return Promise.reject(new TaskApprovalError("task_approval_unsupported", "Approval manager has been disposed"));
308
+ const promise = operation();
309
+ this.inFlight.add(promise);
310
+ void promise.then(() => this.inFlight.delete(promise), () => this.inFlight.delete(promise));
311
+ return promise;
312
+ }
313
+ /** Hosts must await this before replacing the manager or closing its stores.
314
+ * The replacement's init then discovers every committed pending request. */
315
+ async close() {
316
+ this.dispose();
317
+ await Promise.allSettled([...this.inFlight]);
318
+ }
273
319
  dispose() {
320
+ this.disposed = true;
274
321
  for (const timer of this.timers.values()) {
275
322
  clearTimeout(timer);
276
323
  }
277
324
  this.timers.clear();
278
- this.store.close?.();
325
+ this.unregister.splice(0).forEach(unregister => unregister());
326
+ this.initialized = false;
279
327
  }
280
328
  }
281
329
  //# sourceMappingURL=approval-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"approval-manager.js","sourceRoot":"","sources":["../src/approval-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"approval-manager.js","sourceRoot":"","sources":["../src/approval-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=approval-manager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-manager.test.d.ts","sourceRoot":"","sources":["../src/approval-manager.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,116 @@
1
+ import { afterEach, describe, expect, it, vi } from "vitest";
2
+ import { ApprovalManager } from "./approval-manager.js";
3
+ import { HookRegistry } from "./hooks.js";
4
+ const managers = [];
5
+ afterEach(() => {
6
+ managers.splice(0).forEach(manager => manager.dispose());
7
+ vi.useRealTimers();
8
+ vi.restoreAllMocks();
9
+ });
10
+ async function fixture() {
11
+ vi.useFakeTimers();
12
+ vi.setSystemTime(new Date("2026-10-11T12:00:00.000Z"));
13
+ let current = { id: "approval", gateId: "gate", gateName: "Review", status: "pending",
14
+ payload: { mission: "Review" }, requestedAt: new Date().toISOString() };
15
+ const store = {
16
+ get: vi.fn(async () => structuredClone(current)),
17
+ list: vi.fn(async () => [structuredClone(current)]),
18
+ listByTask: vi.fn(async () => []), delete: vi.fn(async () => false),
19
+ upsert: vi.fn(async (request) => { current = structuredClone(request); }),
20
+ };
21
+ const emit = vi.fn(), transition = vi.fn();
22
+ const ctx = { emitter: { emit }, taskStore: { transition }, hooks: new HookRegistry(),
23
+ config: { settings: { approvalGates: [{ id: "gate", name: "Review", handler: "human",
24
+ hook: "mission:execute", timeoutMs: 10, timeoutAction: "approve" }] } },
25
+ };
26
+ const manager = new ApprovalManager(ctx, store);
27
+ managers.push(manager);
28
+ await manager.init();
29
+ return { store, emit, transition, manager, current: () => current };
30
+ }
31
+ describe("approval timeout persistence failures", () => {
32
+ it("retains pending work on a read failure, logs safely, and retries after a delay", async () => {
33
+ const f = await fixture();
34
+ f.store.get.mockRejectedValueOnce(new Error("private database credential"));
35
+ await vi.advanceTimersByTimeAsync(10);
36
+ expect(f.current().status).toBe("pending");
37
+ expect(f.store.upsert).not.toHaveBeenCalled();
38
+ expect(f.transition).not.toHaveBeenCalled();
39
+ expect(f.emit).toHaveBeenCalledWith("log", expect.objectContaining({ level: "error", message: expect.stringContaining("Approval timeout") }));
40
+ expect(JSON.stringify(f.emit.mock.calls)).not.toContain("private database credential");
41
+ expect(vi.getTimerCount()).toBe(1);
42
+ await vi.advanceTimersByTimeAsync(999);
43
+ expect(f.store.get).toHaveBeenCalledTimes(1);
44
+ await vi.advanceTimersByTimeAsync(1);
45
+ expect(f.current().status).toBe("timeout");
46
+ expect(f.store.upsert).toHaveBeenCalledTimes(1);
47
+ expect(vi.getTimerCount()).toBe(0);
48
+ });
49
+ it("does not emit timeout or resume work when saving the resolution fails", async () => {
50
+ const f = await fixture();
51
+ f.store.upsert.mockRejectedValueOnce(new Error("disk unavailable"));
52
+ await vi.advanceTimersByTimeAsync(10);
53
+ expect(f.current().status).toBe("pending");
54
+ expect(f.emit).not.toHaveBeenCalledWith("approval:timeout", expect.anything());
55
+ expect(f.transition).not.toHaveBeenCalled();
56
+ await vi.advanceTimersByTimeAsync(1_000);
57
+ expect(f.current().status).toBe("timeout");
58
+ expect(vi.getTimerCount()).toBe(0);
59
+ });
60
+ it("backs off repeated failures and cancels retries when disposed", async () => {
61
+ const f = await fixture();
62
+ f.store.get.mockRejectedValue(new Error("unavailable"));
63
+ await vi.advanceTimersByTimeAsync(10);
64
+ for (const delay of [1_000, 2_000, 4_000, 8_000, 16_000, 30_000, 30_000]) {
65
+ const calls = f.store.get.mock.calls.length;
66
+ await vi.advanceTimersByTimeAsync(delay - 1);
67
+ expect(f.store.get).toHaveBeenCalledTimes(calls);
68
+ await vi.advanceTimersByTimeAsync(1);
69
+ expect(f.store.get).toHaveBeenCalledTimes(calls + 1);
70
+ expect(vi.getTimerCount()).toBe(1);
71
+ }
72
+ f.manager.dispose();
73
+ expect(vi.getTimerCount()).toBe(0);
74
+ const calls = f.store.get.mock.calls.length;
75
+ await vi.advanceTimersByTimeAsync(60_000);
76
+ expect(f.store.get).toHaveBeenCalledTimes(calls);
77
+ });
78
+ it.each([false, true])("does not resolve or retry an in-flight read after disposal (failure=%s)", async (fails) => {
79
+ const f = await fixture();
80
+ let release;
81
+ const pending = new Promise(resolve => { release = resolve; });
82
+ f.store.get.mockImplementationOnce(async () => {
83
+ await pending;
84
+ if (fails)
85
+ throw new Error("unavailable");
86
+ return structuredClone(f.current());
87
+ });
88
+ vi.advanceTimersByTime(10);
89
+ expect(f.store.get).toHaveBeenCalledOnce();
90
+ f.manager.dispose();
91
+ release();
92
+ await vi.advanceTimersByTimeAsync(0);
93
+ expect(f.current().status).toBe("pending");
94
+ expect(f.store.upsert).not.toHaveBeenCalled();
95
+ expect(vi.getTimerCount()).toBe(0);
96
+ });
97
+ it("stops retrying if another resolver has already settled the request", async () => {
98
+ const f = await fixture();
99
+ f.store.get.mockRejectedValueOnce(new Error("unavailable"));
100
+ await vi.advanceTimersByTimeAsync(10);
101
+ await f.store.upsert({ ...f.current(), status: "approved" });
102
+ await vi.advanceTimersByTimeAsync(1_000);
103
+ expect(f.current().status).toBe("approved");
104
+ expect(f.store.upsert).toHaveBeenCalledOnce();
105
+ expect(vi.getTimerCount()).toBe(0);
106
+ });
107
+ it("keeps persistence retries bounded even when a log listener throws", async () => {
108
+ const f = await fixture();
109
+ f.store.get.mockRejectedValue(new Error("unavailable"));
110
+ f.emit.mockImplementation(() => { throw new Error("listener failed"); });
111
+ await vi.advanceTimersByTimeAsync(10);
112
+ expect(vi.getTimerCount()).toBe(1);
113
+ expect(f.current().status).toBe("pending");
114
+ });
115
+ });
116
+ //# sourceMappingURL=approval-manager.test.js.map