@polpo-ai/core 0.10.4 → 0.10.6

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
@@ -20,6 +20,23 @@ export default defineProjectLoop({
20
20
  kind: "graph",
21
21
  name: "support-flow",
22
22
  context: "shared",
23
+ permissions: [
24
+ {
25
+ id: "support-tools",
26
+ resource: "tool",
27
+ action: "call",
28
+ effect: "allow",
29
+ match: { tool: ["read", "search_docs"] },
30
+ },
31
+ {
32
+ id: "refund-approval",
33
+ resource: "tool",
34
+ action: "call",
35
+ effect: "approval",
36
+ match: { tool: "issue_refund" },
37
+ message: "Refunds require human approval.",
38
+ },
39
+ ],
23
40
  start: "triage",
24
41
  steps: {
25
42
  triage: {
@@ -40,7 +57,14 @@ import { MemoryLoopRunStore } from "@polpo-ai/core/loop-run-store";
40
57
  const loopRunStore = new MemoryLoopRunStore();
41
58
  ```
42
59
 
43
- `PipelineExecutor` emits typed `LoopPolicyDeniedError` and `LoopApprovalRequiredError` for policy decisions, so hosts can map denies, approvals, and durable trace history to their own GRC surface.
60
+ `PipelineExecutor` emits typed `LoopPermissionDeniedError`, `LoopPermissionApprovalRequiredError`, `LoopPolicyDeniedError`, and `LoopApprovalRequiredError`, plus structured trace events such as `permission.result`, `policy.result`, and `approval.required`. Approval errors include a resume continuation: the context bag, remaining steps, and previous node. Hosts can persist that on `LoopRunRecord.resume`, approve the gate, then resume from the checkpoint without rerunning completed steps.
61
+
62
+ Loop run states distinguish the gate lifecycle from execution:
63
+
64
+ - `awaiting_approval`: execution is paused at a policy/permission gate.
65
+ - `approval_approved`: the gate was approved and the run can be resumed.
66
+ - `resuming`: the runtime is executing from the saved checkpoint.
67
+ - `completed`: the resumed or original run finished.
44
68
 
45
69
  ## License
46
70
 
package/dist/index.d.ts CHANGED
@@ -61,7 +61,7 @@ export type { CompactionConfig, CompactionEvent, OnCompactionFn, SummarizeFn, Co
61
61
  export { EVENT_CATALOG } from "./events-catalog.js";
62
62
  export type { EventCatalogGroup, EventCatalogEntry } from "./events-catalog.js";
63
63
  export { evaluateExpression, SafeExpressionEvaluator } from "./loop/expression.js";
64
- export type { AgentLoopConfig, ContextBag, LoopConfig, LoopHookAction, LoopLifecycleHook, LoopNext, LoopPolicyEffect, LoopStepConfig, LoopTraceEvent, LoopTraceEventType, LoopToolChoice, Pipeline, ProjectLoopConfig, ProjectLoopHooks, ProjectLoopKind, ProjectLoopPolicy, ProjectLoopVersion, Step, SwitchCase, Condition, ToolLoopStep, } from "./loop/types.js";
64
+ export type { AgentLoopConfig, ContextBag, LoopConfig, LoopHookAction, LoopLifecycleHook, LoopNext, LoopPermissionEffect, LoopPermissionMatch, LoopPermissionResource, LoopPolicyEffect, LoopStepConfig, LoopTraceEvent, LoopTraceEventType, LoopToolChoice, Pipeline, ProjectLoopConfig, ProjectLoopHooks, ProjectLoopKind, ProjectLoopPermission, ProjectLoopPolicy, ProjectLoopVersion, Step, SwitchCase, Condition, ToolLoopStep, } from "./loop/types.js";
65
65
  export { LOOP_LIFECYCLE_HOOKS, isLoopStep, isToolStep, isParallelStep, isSwitchStep, isHumanStep } from "./loop/types.js";
66
66
  export { normalizeProjectLoop } from "./loop/normalize.js";
67
67
  export { defineLoop, defineProjectLoop } from "./loop/code.js";
@@ -73,6 +73,6 @@ export { resolveLoopSelection, resolveActiveLoopTools, resolveActiveLoopSkills }
73
73
  export type { LoopSelection } from "./loop/selector.js";
74
74
  export { PipelineExecutor } from "./loop/pipeline.js";
75
75
  export type { PipelineExecutionResult, PipelineExecutorOptions, PipelineHumanResult, PipelineLoopResult, PipelineToolResult, PipelineTraceEvent, } from "./loop/pipeline.js";
76
- export { LoopApprovalRequiredError, LoopPolicyDeniedError, MemoryLoopRunStore } from "./loop/run-store.js";
77
- export type { CreateLoopRunInput, LoopApprovalSnapshot, LoopRunListFilter, LoopRunRecord, ProjectLoopRunStatus, LoopRunStore, } from "./loop/run-store.js";
76
+ export { LoopApprovalRequiredError, LoopPermissionApprovalRequiredError, LoopPermissionDeniedError, LoopPolicyDeniedError, MemoryLoopRunStore, } from "./loop/run-store.js";
77
+ export type { CreateLoopRunInput, LoopApprovedGate, LoopApprovalSnapshot, LoopRunListFilter, LoopRunRecord, LoopResumeState, ProjectLoopRunStatus, LoopRunStore, } from "./loop/run-store.js";
78
78
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC;AAG3B,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGjF,cAAc,aAAa,CAAC;AAG5B,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAGjG,cAAc,cAAc,CAAC;AAG7B,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EACV,aAAa,EACb,SAAS,EACT,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACrE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACvI,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAChE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGzE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACvE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGnE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,OAAO,EACL,cAAc,EAAE,eAAe,EAAE,yBAAyB,EAC1D,gBAAgB,EAAE,qBAAqB,EAAE,gBAAgB,GAC1D,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,mBAAmB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGnH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnE,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGvD,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC9E,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE/D,YAAY,EAAE,mBAAmB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGnG,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAGzF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,YAAY,EACV,sBAAsB,EACtB,cAAc,EACd,0BAA0B,EAC1B,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,sBAAsB,EAAE,KAAK,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,kBAAkB,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5N,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG/E,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG9D,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,kBAAkB,IAAI,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC5I,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC5H,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,KAAK,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACzJ,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAG5E,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,YAAY,GACb,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,WAAW,EACX,eAAe,EACf,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAIhF,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACnF,YAAY,EACV,eAAe,EACf,UAAU,EACV,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,QAAQ,EACR,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,IAAI,EACJ,UAAU,EACV,SAAS,EACT,YAAY,GACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC1H,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EACV,oBAAoB,EACpB,QAAQ,EACR,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC1G,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC3G,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EACV,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC3G,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,YAAY,GACb,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -55,5 +55,5 @@ export { LoopHookRegistry } from "./loop/hooks.js";
55
55
  export { LoopRunner } from "./loop/runner.js";
56
56
  export { resolveLoopSelection, resolveActiveLoopTools, resolveActiveLoopSkills } from "./loop/selector.js";
57
57
  export { PipelineExecutor } from "./loop/pipeline.js";
58
- export { LoopApprovalRequiredError, LoopPolicyDeniedError, MemoryLoopRunStore } from "./loop/run-store.js";
58
+ export { LoopApprovalRequiredError, LoopPermissionApprovalRequiredError, LoopPermissionDeniedError, LoopPolicyDeniedError, MemoryLoopRunStore, } from "./loop/run-store.js";
59
59
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -129,6 +129,23 @@ describe("agentLoopConfigSchema", () => {
129
129
  },
130
130
  ],
131
131
  },
132
+ permissions: [
133
+ {
134
+ id: "tools-allowlist",
135
+ resource: "tool",
136
+ action: "call",
137
+ effect: "allow",
138
+ match: { tool: ["read", "policy_check", "audit_log"] },
139
+ },
140
+ {
141
+ id: "approval-for-write",
142
+ resource: "tool",
143
+ action: "call",
144
+ effect: "approval",
145
+ match: { tool: "write" },
146
+ message: "Writing requires human approval.",
147
+ },
148
+ ],
132
149
  policies: [
133
150
  {
134
151
  id: "deny-dangerous-bash",
@@ -150,6 +167,8 @@ describe("agentLoopConfigSchema", () => {
150
167
  expect(loop.version).toBe("1");
151
168
  expect(loop.kind).toBe("graph");
152
169
  expect(loop.hooks?.["tool:before"]?.[0]?.tool).toBe("policy_check");
170
+ expect(loop.permissions?.[0]?.resource).toBe("tool");
171
+ expect(loop.permissions?.[1]?.effect).toBe("approval");
153
172
  expect(loop.policies?.[0]?.effect).toBe("deny");
154
173
  expect(normalizeProjectLoop(loop).pipeline?.steps).toEqual([{ loop: "work" }]);
155
174
  });
@@ -1 +1 @@
1
- {"version":3,"file":"contract.test.js","sourceRoot":"","sources":["../../src/loop/contract.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contract.test.js","sourceRoot":"","sources":["../../src/loop/contract.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { LoopHookRegistry } from "./hooks.js";
2
- import { type ContextBag, type LoopConfig, type ProjectLoopHooks, type ProjectLoopPolicy, type LoopTraceEvent, type Pipeline, type Step } from "./types.js";
2
+ import { type LoopApprovedGate } from "./run-store.js";
3
+ import { type ContextBag, type LoopConfig, type ProjectLoopHooks, type ProjectLoopPolicy, type LoopTraceEvent, type Pipeline, type ProjectLoopPermission, type Step } from "./types.js";
3
4
  export interface PipelineLoopResult {
4
5
  output?: unknown;
5
6
  context?: ContextBag;
@@ -30,7 +31,12 @@ export interface PipelineExecutorOptions {
30
31
  context?: ContextBag;
31
32
  hooks?: LoopHookRegistry;
32
33
  projectHooks?: ProjectLoopHooks;
34
+ projectPermissions?: ProjectLoopPermission[];
33
35
  projectPolicies?: ProjectLoopPolicy[];
36
+ resume?: {
37
+ previousNode?: string;
38
+ approvedGates?: LoopApprovedGate[];
39
+ };
34
40
  onTrace?: (event: LoopTraceEvent) => void | Promise<void>;
35
41
  runLoop: (name: string, loop: LoopConfig, context: Readonly<ContextBag>) => Promise<PipelineLoopResult>;
36
42
  runTool?: (name: string, input: unknown, context: Readonly<ContextBag>, step: Extract<Step, {
@@ -48,7 +54,12 @@ export declare class PipelineExecutor {
48
54
  private runTransitionHook;
49
55
  private runLifecyclePoint;
50
56
  private runHookAction;
57
+ private enforcePermissions;
51
58
  private enforcePolicies;
52
59
  private policyContext;
60
+ private permissionAppliesToHook;
61
+ private matchesPermission;
62
+ private isGateApproved;
63
+ private attachApprovalResume;
53
64
  }
54
65
  //# sourceMappingURL=pipeline.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/loop/pipeline.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAKnD,OAAO,EAML,KAAK,UAAU,EACf,KAAK,UAAU,EAGf,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,IAAI,EACV,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,UAAU,CAAC;IACpB,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,eAAe,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACtC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACxG,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC9I,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACrI;AAQD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;IAErD,OAAO,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC;YAoCnE,YAAY;IAoG1B,OAAO,CAAC,WAAW;YAKL,iBAAiB;YA0BjB,iBAAiB;YAgBjB,aAAa;IAsD3B,OAAO,CAAC,eAAe;IAmCvB,OAAO,CAAC,aAAa;CAOtB"}
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/loop/pipeline.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { SafeExpressionEvaluator } from "./expression.js";
2
- import { LoopApprovalRequiredError, LoopPolicyDeniedError, } from "./run-store.js";
2
+ import { LoopApprovalRequiredError, LoopPermissionApprovalRequiredError, LoopPermissionDeniedError, LoopPolicyDeniedError, } from "./run-store.js";
3
3
  import { isHumanStep, isLoopStep, isParallelStep, isSwitchStep, isToolStep, } from "./types.js";
4
4
  export class PipelineExecutor {
5
5
  evaluator = new SafeExpressionEvaluator();
@@ -21,10 +21,17 @@ export class PipelineExecutor {
21
21
  await options.onTrace?.(full);
22
22
  },
23
23
  };
24
- await state.emit({ type: "loop.start", status: "started" });
24
+ if (options.resume) {
25
+ await state.emit({ type: "loop.resume", status: "started", data: { previousNode: options.resume.previousNode } });
26
+ }
27
+ else {
28
+ await state.emit({ type: "loop.start", status: "started" });
29
+ }
25
30
  try {
26
- await this.runLifecyclePoint("loop:start", context, options, state, { loop: { name: options.name } });
27
- await this.executeSteps(options.pipeline.steps, context, trace, options, state);
31
+ if (!options.resume) {
32
+ await this.runLifecyclePoint("loop:start", context, options, state, { loop: { name: options.name } });
33
+ }
34
+ await this.executeSteps(options.pipeline.steps, context, trace, options, state, options.resume?.previousNode);
28
35
  await this.runLifecyclePoint("loop:end", context, options, state, { loop: { name: options.name }, status: "completed" });
29
36
  await state.emit({ type: "loop.end", status: "completed" });
30
37
  return { context, trace, events: state.events };
@@ -40,90 +47,97 @@ export class PipelineExecutor {
40
47
  }
41
48
  async executeSteps(steps, context, trace, options, state, previousNode) {
42
49
  let lastNode = previousNode;
43
- for (const step of steps) {
44
- if (!this.matchesWhen(step.when, context)) {
45
- trace.push({ type: "skip", when: step.when, matched: false });
46
- await state.emit({ type: "step.skip", status: "skipped", when: step.when });
47
- continue;
48
- }
49
- if (isLoopStep(step)) {
50
- const loop = options.loops[step.loop];
51
- if (!loop)
52
- throw new Error(`Pipeline references unknown loop "${step.loop}"`);
53
- await this.runTransitionHook(lastNode, step.loop, context, options, state);
54
- await this.runLifecyclePoint("step:before", context, options, state, { step: { name: step.loop, type: "agent" } });
55
- await this.runLifecyclePoint("model:before", context, options, state, { step: { name: step.loop, type: "agent" } });
56
- await state.emit({ type: "step.start", step: step.loop, status: "started", when: step.when });
57
- const result = await options.runLoop(step.loop, loop, freezeContext(context));
58
- mergeLoopResult(context, step.loop, result);
59
- trace.push({ type: "loop", name: step.loop, when: step.when, matched: true });
60
- await this.runLifecyclePoint("step:after", context, options, state, { step: { name: step.loop, type: "agent" }, output: result.output });
61
- await state.emit({ type: "step.end", step: step.loop, status: "completed", output: result.output });
62
- lastNode = step.loop;
63
- continue;
64
- }
65
- if (isToolStep(step)) {
66
- if (!options.runTool)
67
- throw new Error(`Pipeline tool step "${step.tool}" requires a tool handler`);
68
- await this.runTransitionHook(lastNode, step.tool, context, options, state);
69
- const stepName = step.saveAs ?? step.tool;
70
- await this.runLifecyclePoint("step:before", context, options, state, { step: { name: stepName, type: "tool" }, tool: { name: step.tool, input: step.input } });
71
- await this.runLifecyclePoint("tool:before", context, options, state, { step: { name: stepName, type: "tool" }, tool: { name: step.tool, input: step.input } });
72
- await state.emit({ type: "tool.call", tool: step.tool, step: step.saveAs ?? step.tool, status: "started", input: step.input });
73
- const result = await options.runTool(step.tool, step.input, freezeContext(context), step);
74
- mergeStepResult(context, step.saveAs ?? step.tool, result);
75
- trace.push({ type: "tool", name: step.tool, when: step.when, matched: true });
76
- await this.runLifecyclePoint("tool:after", context, options, state, { step: { name: stepName, type: "tool" }, tool: { name: step.tool, input: step.input }, output: result.output });
77
- await this.runLifecyclePoint("step:after", context, options, state, { step: { name: stepName, type: "tool" }, tool: { name: step.tool, input: step.input }, output: result.output });
78
- await state.emit({ type: "tool.result", tool: step.tool, step: step.saveAs ?? step.tool, status: "completed", output: result.output });
79
- lastNode = step.tool;
80
- continue;
81
- }
82
- if (isSwitchStep(step)) {
83
- let matched = false;
84
- for (const branch of step.switch.cases) {
85
- if (this.matchesWhen(branch.when, context)) {
86
- trace.push({ type: "switch", when: branch.when, matched: true });
87
- lastNode = await this.executeSteps(branch.steps, context, trace, options, state, lastNode);
88
- matched = true;
89
- break;
50
+ for (let i = 0; i < steps.length; i++) {
51
+ const step = steps[i];
52
+ try {
53
+ if (!this.matchesWhen(step.when, context)) {
54
+ trace.push({ type: "skip", when: step.when, matched: false });
55
+ await state.emit({ type: "step.skip", status: "skipped", when: step.when });
56
+ continue;
57
+ }
58
+ if (isLoopStep(step)) {
59
+ const loop = options.loops[step.loop];
60
+ if (!loop)
61
+ throw new Error(`Pipeline references unknown loop "${step.loop}"`);
62
+ await this.runTransitionHook(lastNode, step.loop, context, options, state);
63
+ await this.runLifecyclePoint("step:before", context, options, state, { step: { name: step.loop, type: "agent" } });
64
+ await this.runLifecyclePoint("model:before", context, options, state, { step: { name: step.loop, type: "agent" } });
65
+ await state.emit({ type: "step.start", step: step.loop, status: "started", when: step.when });
66
+ const result = await options.runLoop(step.loop, loop, freezeContext(context));
67
+ mergeLoopResult(context, step.loop, result);
68
+ trace.push({ type: "loop", name: step.loop, when: step.when, matched: true });
69
+ await this.runLifecyclePoint("step:after", context, options, state, { step: { name: step.loop, type: "agent" }, output: result.output });
70
+ await state.emit({ type: "step.end", step: step.loop, status: "completed", output: result.output });
71
+ lastNode = step.loop;
72
+ continue;
73
+ }
74
+ if (isToolStep(step)) {
75
+ if (!options.runTool)
76
+ throw new Error(`Pipeline tool step "${step.tool}" requires a tool handler`);
77
+ await this.runTransitionHook(lastNode, step.tool, context, options, state);
78
+ const stepName = step.saveAs ?? step.tool;
79
+ await this.runLifecyclePoint("step:before", context, options, state, { step: { name: stepName, type: "tool" }, tool: { name: step.tool, input: step.input } });
80
+ await this.runLifecyclePoint("tool:before", context, options, state, { step: { name: stepName, type: "tool" }, tool: { name: step.tool, input: step.input } });
81
+ await state.emit({ type: "tool.call", tool: step.tool, step: step.saveAs ?? step.tool, status: "started", input: step.input });
82
+ const result = await options.runTool(step.tool, step.input, freezeContext(context), step);
83
+ mergeStepResult(context, step.saveAs ?? step.tool, result);
84
+ trace.push({ type: "tool", name: step.tool, when: step.when, matched: true });
85
+ await this.runLifecyclePoint("tool:after", context, options, state, { step: { name: stepName, type: "tool" }, tool: { name: step.tool, input: step.input }, output: result.output });
86
+ await this.runLifecyclePoint("step:after", context, options, state, { step: { name: stepName, type: "tool" }, tool: { name: step.tool, input: step.input }, output: result.output });
87
+ await state.emit({ type: "tool.result", tool: step.tool, step: step.saveAs ?? step.tool, status: "completed", output: result.output });
88
+ lastNode = step.tool;
89
+ continue;
90
+ }
91
+ if (isSwitchStep(step)) {
92
+ let matched = false;
93
+ for (const branch of step.switch.cases) {
94
+ if (this.matchesWhen(branch.when, context)) {
95
+ trace.push({ type: "switch", when: branch.when, matched: true });
96
+ lastNode = await this.executeSteps(branch.steps, context, trace, options, state, lastNode);
97
+ matched = true;
98
+ break;
99
+ }
100
+ }
101
+ if (!matched && step.switch.default) {
102
+ trace.push({ type: "switch", matched: false });
103
+ lastNode = await this.executeSteps(step.switch.default.steps, context, trace, options, state, lastNode);
90
104
  }
105
+ continue;
91
106
  }
92
- if (!matched && step.switch.default) {
93
- trace.push({ type: "switch", matched: false });
94
- lastNode = await this.executeSteps(step.switch.default.steps, context, trace, options, state, lastNode);
107
+ if (isParallelStep(step)) {
108
+ await this.runLifecyclePoint("step:before", context, options, state, { step: { name: "parallel", type: "parallel" } });
109
+ const snapshot = freezeContext(context);
110
+ const branchResults = await Promise.all(step.parallel.map(async (child) => {
111
+ const branchContext = { ...snapshot };
112
+ const branchTrace = [];
113
+ await this.executeSteps([child], branchContext, branchTrace, options, state);
114
+ return { branchContext, branchTrace };
115
+ }));
116
+ for (const result of branchResults) {
117
+ Object.assign(context, result.branchContext);
118
+ trace.push(...result.branchTrace);
119
+ }
120
+ trace.push({ type: "parallel", matched: true });
121
+ await this.runLifecyclePoint("step:after", context, options, state, { step: { name: "parallel", type: "parallel" } });
122
+ continue;
95
123
  }
96
- continue;
97
- }
98
- if (isParallelStep(step)) {
99
- await this.runLifecyclePoint("step:before", context, options, state, { step: { name: "parallel", type: "parallel" } });
100
- const snapshot = freezeContext(context);
101
- const branchResults = await Promise.all(step.parallel.map(async (child) => {
102
- const branchContext = { ...snapshot };
103
- const branchTrace = [];
104
- await this.executeSteps([child], branchContext, branchTrace, options, state);
105
- return { branchContext, branchTrace };
106
- }));
107
- for (const result of branchResults) {
108
- Object.assign(context, result.branchContext);
109
- trace.push(...result.branchTrace);
124
+ if (isHumanStep(step)) {
125
+ if (!options.handleHuman)
126
+ throw new Error(`Pipeline human step "${step.human}" requires a human handler`);
127
+ await this.runTransitionHook(lastNode, step.human, context, options, state);
128
+ await this.runLifecyclePoint("step:before", context, options, state, { step: { name: step.human, type: "human" } });
129
+ await state.emit({ type: "human.request", human: step.human, step: step.human, status: "started", when: step.when });
130
+ const result = await options.handleHuman(step.human, step, freezeContext(context));
131
+ mergeLoopResult(context, step.human, result);
132
+ trace.push({ type: "human", name: step.human, when: step.when, matched: true });
133
+ await this.runLifecyclePoint("step:after", context, options, state, { step: { name: step.human, type: "human" }, output: result.output });
134
+ await state.emit({ type: "human.result", human: step.human, step: step.human, status: "completed", output: result.output });
135
+ lastNode = step.human;
110
136
  }
111
- trace.push({ type: "parallel", matched: true });
112
- await this.runLifecyclePoint("step:after", context, options, state, { step: { name: "parallel", type: "parallel" } });
113
- continue;
114
137
  }
115
- if (isHumanStep(step)) {
116
- if (!options.handleHuman)
117
- throw new Error(`Pipeline human step "${step.human}" requires a human handler`);
118
- await this.runTransitionHook(lastNode, step.human, context, options, state);
119
- await this.runLifecyclePoint("step:before", context, options, state, { step: { name: step.human, type: "human" } });
120
- await state.emit({ type: "human.request", human: step.human, step: step.human, status: "started", when: step.when });
121
- const result = await options.handleHuman(step.human, step, freezeContext(context));
122
- mergeLoopResult(context, step.human, result);
123
- trace.push({ type: "human", name: step.human, when: step.when, matched: true });
124
- await this.runLifecyclePoint("step:after", context, options, state, { step: { name: step.human, type: "human" }, output: result.output });
125
- await state.emit({ type: "human.result", human: step.human, step: step.human, status: "completed", output: result.output });
126
- lastNode = step.human;
138
+ catch (err) {
139
+ this.attachApprovalResume(err, context, err.resume ? steps.slice(i + 1) : steps.slice(i), lastNode);
140
+ throw err;
127
141
  }
128
142
  }
129
143
  return lastNode;
@@ -154,7 +168,8 @@ export class PipelineExecutor {
154
168
  await state.emit({ type: "transition", from, to, status: "completed" });
155
169
  }
156
170
  async runLifecyclePoint(hook, context, options, state, payload = {}) {
157
- this.enforcePolicies(hook, context, options.projectPolicies ?? [], payload);
171
+ await this.enforcePermissions(hook, context, options.projectPermissions ?? [], payload, state, options.resume?.approvedGates);
172
+ await this.enforcePolicies(hook, context, options.projectPolicies ?? [], payload, state, options.resume?.approvedGates);
158
173
  const actions = options.projectHooks?.[hook] ?? [];
159
174
  for (const action of actions) {
160
175
  if (!this.matchesWhen(action.when, this.policyContext(context, hook, payload)))
@@ -206,7 +221,58 @@ export class PipelineExecutor {
206
221
  }
207
222
  }
208
223
  }
209
- enforcePolicies(hook, context, policies, payload) {
224
+ async enforcePermissions(hook, context, permissions, payload, state, approvedGates) {
225
+ const relevant = permissions.filter((permission) => this.permissionAppliesToHook(permission, hook, payload));
226
+ if (relevant.length === 0)
227
+ return;
228
+ const policyContext = this.policyContext(context, hook, payload);
229
+ const allowPermissions = relevant.filter((permission) => permission.effect === "allow");
230
+ let allowMatched = false;
231
+ for (const permission of relevant) {
232
+ const matched = this.matchesPermission(permission, hook, policyContext, payload);
233
+ await state.emit({
234
+ type: "permission.result",
235
+ status: matched ? "completed" : "skipped",
236
+ data: {
237
+ permissionId: permission.id,
238
+ effect: permission.effect,
239
+ resource: permission.resource,
240
+ action: permission.action,
241
+ hook,
242
+ matched,
243
+ },
244
+ });
245
+ if (!matched)
246
+ continue;
247
+ if (permission.effect === "allow") {
248
+ allowMatched = true;
249
+ continue;
250
+ }
251
+ const id = permission.id ?? "anonymous";
252
+ const suffix = permission.message ? `: ${permission.message}` : "";
253
+ if (permission.effect === "deny") {
254
+ throw new LoopPermissionDeniedError(permission, hook, payload, `Loop permission "${id}" denied ${hook}${suffix}`);
255
+ }
256
+ if (this.isGateApproved(approvedGates, "permission", id, hook)) {
257
+ await state.emit({
258
+ type: "approval.required",
259
+ status: "completed",
260
+ data: { type: "permission", permissionId: id, hook, payload, resumed: true },
261
+ });
262
+ continue;
263
+ }
264
+ await state.emit({
265
+ type: "approval.required",
266
+ status: "started",
267
+ data: { type: "permission", permissionId: id, hook, payload },
268
+ });
269
+ throw new LoopPermissionApprovalRequiredError(permission, hook, { ...context }, payload, `Loop permission "${id}" requires approval at ${hook}${suffix}`);
270
+ }
271
+ if (allowPermissions.length > 0 && !allowMatched) {
272
+ throw new LoopPermissionDeniedError(allowPermissions[0], hook, payload, `Loop permission allow-list blocked ${hook}: no allow permission matched`);
273
+ }
274
+ }
275
+ async enforcePolicies(hook, context, policies, payload, state, approvedGates) {
210
276
  const relevant = policies.filter((policy) => (policy.hook ?? "tool:before") === hook);
211
277
  if (relevant.length === 0)
212
278
  return;
@@ -215,6 +281,16 @@ export class PipelineExecutor {
215
281
  let allowMatched = false;
216
282
  for (const policy of relevant) {
217
283
  const matched = this.matchesWhen(policy.when, policyContext);
284
+ await state.emit({
285
+ type: "policy.result",
286
+ status: matched ? "completed" : "skipped",
287
+ data: {
288
+ policyId: policy.id,
289
+ effect: policy.effect,
290
+ hook,
291
+ matched,
292
+ },
293
+ });
218
294
  if (!matched)
219
295
  continue;
220
296
  if (policy.effect === "allow") {
@@ -226,6 +302,19 @@ export class PipelineExecutor {
226
302
  if (policy.effect === "deny") {
227
303
  throw new LoopPolicyDeniedError(policy, hook, payload, `Loop policy "${id}" denied ${hook}${suffix}`);
228
304
  }
305
+ if (this.isGateApproved(approvedGates, "policy", id, hook)) {
306
+ await state.emit({
307
+ type: "approval.required",
308
+ status: "completed",
309
+ data: { type: "policy", policyId: id, hook, payload, resumed: true },
310
+ });
311
+ continue;
312
+ }
313
+ await state.emit({
314
+ type: "approval.required",
315
+ status: "started",
316
+ data: { type: "policy", policyId: id, hook, payload },
317
+ });
229
318
  throw new LoopApprovalRequiredError(policy, hook, { ...context }, payload, `Loop policy "${id}" requires approval at ${hook}${suffix}`);
230
319
  }
231
320
  if (allowPolicies.length > 0 && !allowMatched) {
@@ -239,6 +328,60 @@ export class PipelineExecutor {
239
328
  ...payload,
240
329
  };
241
330
  }
331
+ permissionAppliesToHook(permission, hook, payload) {
332
+ if ((permission.match?.hook && !matchesName(permission.match.hook, hook)) || defaultHookForResource(permission.resource) !== hook) {
333
+ return false;
334
+ }
335
+ if (permission.resource === "tool" && !payload.tool)
336
+ return false;
337
+ if (permission.resource === "step" && !payload.step)
338
+ return false;
339
+ if (permission.resource === "model" && !payload.step)
340
+ return false;
341
+ if (permission.resource === "human" && !payload.step?.type?.includes?.("human") && !payload.human)
342
+ return false;
343
+ return true;
344
+ }
345
+ matchesPermission(permission, hook, policyContext, payload) {
346
+ const match = permission.match;
347
+ if (match?.hook && !matchesName(match.hook, hook))
348
+ return false;
349
+ if (match?.loop && !matchesName(match.loop, String(payload.loop && typeof payload.loop === "object" ? payload.loop.name : policyContext.loop ?? "")))
350
+ return false;
351
+ if (match?.step && !matchesName(match.step, String(payload.step?.name ?? "")))
352
+ return false;
353
+ if (match?.tool && !matchesName(match.tool, String(payload.tool?.name ?? "")))
354
+ return false;
355
+ if (match?.human && !matchesName(match.human, String(payload.human?.name ?? payload.step?.name ?? "")))
356
+ return false;
357
+ return permission.when ? this.matchesWhen(permission.when, policyContext) : true;
358
+ }
359
+ isGateApproved(approvedGates, type, id, hook) {
360
+ return !!approvedGates?.some((gate) => gate.type === type && gate.id === id && gate.hook === hook);
361
+ }
362
+ attachApprovalResume(err, context, remainingSteps, previousNode) {
363
+ if (!(err instanceof LoopApprovalRequiredError || err instanceof LoopPermissionApprovalRequiredError))
364
+ return;
365
+ const existing = err.resume;
366
+ err.resume = {
367
+ context: { ...context },
368
+ previousNode: existing?.previousNode ?? previousNode,
369
+ steps: existing ? [...existing.steps, ...remainingSteps] : remainingSteps,
370
+ };
371
+ }
372
+ }
373
+ function defaultHookForResource(resource) {
374
+ switch (resource) {
375
+ case "loop": return "loop:start";
376
+ case "step": return "step:before";
377
+ case "model": return "model:before";
378
+ case "tool": return "tool:before";
379
+ case "human": return "step:before";
380
+ }
381
+ }
382
+ function matchesName(pattern, value) {
383
+ const patterns = Array.isArray(pattern) ? pattern : [pattern];
384
+ return patterns.some((item) => item === "*" || item === value);
242
385
  }
243
386
  function freezeContext(context) {
244
387
  return Object.freeze({ ...context });