@axiastudio/aioc 0.1.0-beta.5 → 0.1.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,19 +2,35 @@
2
2
 
3
3
  AIOC is a governance-first SDK for LLM agents: models can propose actions, while deterministic policies and runtime controls enforce decisions.
4
4
  It provides default-deny gates for tools and handoffs, end-to-end auditability (run records, prompt snapshots, request fingerprints), and a foundation for verifiable iteration on prompts and policies.
5
- AIOC is designed for enterprise and public-sector contexts with privacy-by-design and AI Act-aligned governance requirements.
5
+ AIOC is designed for enterprise and public-sector contexts with privacy-by-design and high-accountability (AI Act-style) governance requirements.
6
6
 
7
- Project home: [https://github.com/axiastudio/aioc](https://github.com/axiastudio/aioc)
7
+ Project home and documentation: [https://axiastudio.github.io/aioc](https://axiastudio.github.io/aioc)
8
8
 
9
9
  ## Release Status
10
10
 
11
- This package is currently in beta and is not production-ready.
12
- Breaking changes may occur before a stable release.
11
+ This package is currently in release-candidate phase (`0.1.0-rc.1`) and is not yet stable.
12
+ The core runtime surface is expected to remain frozen except for bug fixes, cleanup, and documentation adjustments before `0.1.0`.
13
13
 
14
- - Beta contract: `docs/BETA-CONTRACT.md`
15
- - Alpha contract (historical): `docs/ALPHA-CONTRACT.md`
14
+ ### What Stable Means
15
+
16
+ AIOC will move from release candidate to stable when the core runtime surface is confirmed, the public documentation matches the actual exported contract, `RunRecord` and replay/compare workflows are considered reliable, and the SDK has been validated in real applications beyond toy examples.
17
+
18
+ - Historical beta contract snapshot: `docs/BETA-CONTRACT.md`
19
+ - Historical alpha contract snapshot: `docs/ALPHA-CONTRACT.md`
16
20
  - Privacy baseline: `docs/PRIVACY-BASELINE.md`
17
21
 
22
+ ## Documentation Site
23
+
24
+ This repository also contains `aioc-docs`, a Starlight documentation app:
25
+
26
+ - app path: `apps/aioc-docs`
27
+ - source of truth for normative documents: `docs/`
28
+ - GitHub Pages target: `https://axiastudio.github.io/aioc/`
29
+ - start locally: `npm run docs:dev`
30
+ - build statically: `npm run docs:build`
31
+
32
+ The root `docs:*` commands intentionally invoke the app from inside `apps/aioc-docs` so it can use its own Node toolchain.
33
+
18
34
  ## Contact
19
35
 
20
36
  If you want to collaborate or provide feedback, write to `tiziano.lattisi@axia.studio`.
@@ -27,6 +43,29 @@ npm install @axiastudio/aioc
27
43
 
28
44
  ## Quickstart
29
45
 
46
+ ### OpenAI
47
+
48
+ ```ts
49
+ import "dotenv/config";
50
+ import { Agent, run, setupOpenAI } from "@axiastudio/aioc";
51
+
52
+ setupOpenAI(); // reads OPENAI_API_KEY from env
53
+
54
+ const agent = new Agent({
55
+ name: "Hello Agent",
56
+ model: "gpt-4.1-mini",
57
+ instructions: "Answer in 2 short sentences.",
58
+ });
59
+
60
+ const result = await run(
61
+ agent,
62
+ "In one sentence, what is a deterministic policy gate in an agent SDK?",
63
+ );
64
+ console.log(result.finalOutput);
65
+ ```
66
+
67
+ ### Mistral
68
+
30
69
  ```ts
31
70
  import "dotenv/config";
32
71
  import { Agent, run, setupMistral } from "@axiastudio/aioc";
@@ -53,7 +92,7 @@ console.log(result.finalOutput);
53
92
  - `Tool`, `tool(...)`
54
93
  - handoffs via `Agent({ handoffs: [...] })`
55
94
  - `run(...)` with streaming support (`stream` defaults to `false`)
56
- - policy helpers `allow(...)` / `deny(...)`
95
+ - policy helpers `allow(...)` / `deny(...)` / `requireApproval(...)`
57
96
  - provider setup helpers `setupMistral(...)`, `setupOpenAI(...)`, `setupProvider(...)`
58
97
  - run logger hook `run(..., { logger })`
59
98
  - run record hook `run(..., { record })`
@@ -68,7 +107,7 @@ import { Agent, allow, deny, run, tool, type ToolPolicy } from "@axiastudio/aioc
68
107
  const toolPolicy: ToolPolicy<{ actor: { groups: string[] } }> = ({ runContext }) => {
69
108
  if (!runContext.context.actor.groups.includes("finance")) {
70
109
  return deny("deny_missing_finance_group", {
71
- denyMode: "tool_result",
110
+ resultMode: "tool_result",
72
111
  publicReason: "You are not authorized to access this report.",
73
112
  });
74
113
  }
@@ -83,6 +122,8 @@ await run(agent, "Summarize report Q1.", {
83
122
 
84
123
  Default behavior is deny when no policy is configured.
85
124
 
125
+ `resultMode` is the canonical non-allow delivery mode (`"throw"` or `"tool_result"`). `denyMode` is no longer supported.
126
+
86
127
  ## Run Record (Minimal)
87
128
 
88
129
  ```ts
@@ -175,17 +216,21 @@ This repository also contains `aioc-inspect`, a private reference example UI for
175
216
 
176
217
  | Command | Purpose | Needs API key |
177
218
  |---|---|---|
178
- | `npm run example:hello` | Minimal single-agent run | Yes (`MISTRAL_API_KEY`) |
179
- | `npm run example:tool-policy` | Tool calls with deterministic policy gate | Yes (`MISTRAL_API_KEY`) |
180
- | `npm run example:run-record` | Run-record persistence with redaction + audit | Yes (`MISTRAL_API_KEY`) |
219
+ | `npm run example:hello` | Minimal single-agent run | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
220
+ | `npm run example:policy` | Minimal denied tool + policy flow | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
221
+ | `npm run example:approval-required` | Minimal approval-required tool + policy flow | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
222
+ | `npm run example:approval-evidence` | Approval evidence passed through context and reevaluated by policy | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
223
+ | `npm run example:tool-policy` | Straight tool + policy flow with allowed execution | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
224
+ | `npm run example:run-record` | Run-record persistence with redaction + audit | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
181
225
  | `npm run example:rru:01-extract` | Minimal `extractToolCalls(...)` | No |
182
226
  | `npm run example:rru:02-compare` | Minimal `compareRunRecords(...)` | No |
183
227
  | `npm run example:rru:03-replay-strict` | Minimal strict replay | No |
184
228
  | `npm run example:rru:04-replay-hybrid` | Minimal hybrid replay | No |
185
- | `npm run example:non-regression` | Advanced v1/v2 run-record diff | Yes (`MISTRAL_API_KEY`) |
229
+ | `npm run example:non-regression` | Advanced v1/v2 run-record diff | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
186
230
 
187
231
  Notes:
188
232
 
233
+ - for live-provider examples, set `AIOC_EXAMPLE_PROVIDER` to `openai` or `mistral`; the matching API key must also be available
189
234
  - `example:non-regression` is educational and can be non-deterministic because it uses a live provider.
190
235
  - canonical examples guide: `docs/CANONICAL-EXAMPLES.md`.
191
236
 
@@ -207,14 +252,22 @@ AIOC adopts the following non-negotiable principles:
207
252
  - **Bias and misalignment control**: continuous monitoring, dedicated tests, and clear mitigation/escalation mechanisms.
208
253
  - **Privacy by design and data minimization**: collect and process only what is strictly necessary, protect sensitive data by default (redaction, encryption, retention limits), and provide auditable controls for access and deletion.
209
254
 
210
- ## Governance References
255
+ ## Current Governance Documents
256
+
257
+ - `docs/RFC-0001-governance-first-runtime.md` (`Accepted`)
258
+ - `docs/RFC-0002-policy-gates-for-tools-and-handoffs.md` (`Accepted`)
259
+ - `docs/RFC-0003-run-record-audit-trail-and-persistence.md` (`Accepted`)
260
+ - `docs/RFC-0004-policy-outcomes-and-approval-model.md` (`Accepted`)
261
+ - `docs/RFC-0005-suspended-proposals-and-approval-lifecycle.md` (`Draft`)
262
+ - `docs/PRIVACY-BASELINE.md`
263
+
264
+ ## Historical Snapshots
211
265
 
212
- - `docs/RFC-0001-governance-first-runtime.md`
213
- - `docs/RFC-0002-policy-gates-for-tools-and-handoffs.md`
214
- - `docs/RFC-0003-run-record-audit-trail-and-persistence.md`
215
266
  - `docs/ALPHA-CONTRACT.md`
216
267
  - `docs/BETA-CONTRACT.md`
217
- - `docs/PRIVACY-BASELINE.md`
268
+ - `docs/BETA-CONTRACT-AUDIT.md`
269
+ - `docs/P0-TRIAGE.md`
270
+ - `docs/PRIVACY-ADOPTION.md`
218
271
 
219
272
  ## License
220
273
 
package/dist/agent.d.ts CHANGED
@@ -25,7 +25,6 @@ export declare class Agent<TContext = unknown> {
25
25
  handoffs: Agent<TContext>[];
26
26
  outputGuardrails: OutputGuardrail<TContext>[];
27
27
  constructor(config: AgentConfiguration<TContext>);
28
- static create<TContext = unknown>(config: AgentConfiguration<TContext>): Agent<TContext>;
29
28
  resolveInstructions(runContext: RunContext<TContext>): Promise<string | undefined>;
30
29
  }
31
30
  //# sourceMappingURL=agent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,MAAM,iBAAiB,CAAC,QAAQ,GAAG,OAAO,IAC5C,MAAM,GACN,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAErE,MAAM,WAAW,kBAAkB,CAAC,QAAQ,GAAG,OAAO;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,KAAK,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC7B,gBAAgB,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;CAChD;AAED,qBAAa,KAAK,CAAC,QAAQ,GAAG,OAAO;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;IACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC5B,gBAAgB,EAAE,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAElC,MAAM,EAAE,kBAAkB,CAAC,QAAQ,CAAC;IAYhD,MAAM,CAAC,MAAM,CAAC,QAAQ,GAAG,OAAO,EAC9B,MAAM,EAAE,kBAAkB,CAAC,QAAQ,CAAC,GACnC,KAAK,CAAC,QAAQ,CAAC;IAIZ,mBAAmB,CACvB,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,GAC/B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CAS/B"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,MAAM,iBAAiB,CAAC,QAAQ,GAAG,OAAO,IAC5C,MAAM,GACN,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAErE,MAAM,WAAW,kBAAkB,CAAC,QAAQ,GAAG,OAAO;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,KAAK,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC7B,gBAAgB,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;CAChD;AAED,qBAAa,KAAK,CAAC,QAAQ,GAAG,OAAO;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;IACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC5B,gBAAgB,EAAE,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAElC,MAAM,EAAE,kBAAkB,CAAC,QAAQ,CAAC;IAY1C,mBAAmB,CACvB,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,GAC/B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CAS/B"}
package/dist/agent.js CHANGED
@@ -22,9 +22,6 @@ class Agent {
22
22
  this.handoffs = config.handoffs ?? [];
23
23
  this.outputGuardrails = config.outputGuardrails ?? [];
24
24
  }
25
- static create(config) {
26
- return new Agent(config);
27
- }
28
25
  async resolveInstructions(runContext) {
29
26
  if (typeof this.instructions === "undefined") {
30
27
  return undefined;
package/dist/errors.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { GuardrailFunctionOutput } from "./guardrails";
2
2
  import type { PolicyResult } from "./policy";
3
+ import type { SuspendedProposal } from "./run-record";
3
4
  export declare class AIOCError extends Error {
4
5
  constructor(message: string);
5
6
  }
@@ -25,6 +26,15 @@ export declare class ToolCallPolicyDeniedError extends ToolCallError {
25
26
  result: ToolCallPolicyDeniedResult;
26
27
  constructor(result: ToolCallPolicyDeniedResult);
27
28
  }
29
+ export interface ToolCallApprovalRequiredResult {
30
+ toolName: string;
31
+ policyResult: PolicyResult;
32
+ suspendedProposal: SuspendedProposal;
33
+ }
34
+ export declare class ToolCallApprovalRequiredError extends ToolCallError {
35
+ result: ToolCallApprovalRequiredResult;
36
+ constructor(result: ToolCallApprovalRequiredResult);
37
+ }
28
38
  export interface HandoffPolicyDeniedResult {
29
39
  fromAgent: string;
30
40
  toAgent: string;
@@ -34,4 +44,14 @@ export declare class HandoffPolicyDeniedError extends AIOCError {
34
44
  result: HandoffPolicyDeniedResult;
35
45
  constructor(result: HandoffPolicyDeniedResult);
36
46
  }
47
+ export interface HandoffApprovalRequiredResult {
48
+ fromAgent: string;
49
+ toAgent: string;
50
+ policyResult: PolicyResult;
51
+ suspendedProposal: SuspendedProposal;
52
+ }
53
+ export declare class HandoffApprovalRequiredError extends AIOCError {
54
+ result: HandoffApprovalRequiredResult;
55
+ constructor(result: HandoffApprovalRequiredResult);
56
+ }
37
57
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,qBAAsB,SAAQ,SAAS;gBACtC,QAAQ,EAAE,MAAM;CAG7B;AAED,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,uBAAuB,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,gCAAiC,SAAQ,SAAS;IAC7D,MAAM,EAAE,6BAA6B,CAAC;gBAE1B,MAAM,EAAE,6BAA6B;CAOlD;AAED,qBAAa,aAAc,SAAQ,SAAS;CAAG;AAE/C,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,qBAAa,yBAA0B,SAAQ,aAAa;IAC1D,MAAM,EAAE,0BAA0B,CAAC;gBAEvB,MAAM,EAAE,0BAA0B;CAM/C;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,qBAAa,wBAAyB,SAAQ,SAAS;IACrD,MAAM,EAAE,yBAAyB,CAAC;gBAEtB,MAAM,EAAE,yBAAyB;CAM9C"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,qBAAsB,SAAQ,SAAS;gBACtC,QAAQ,EAAE,MAAM;CAG7B;AAED,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,uBAAuB,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,gCAAiC,SAAQ,SAAS;IAC7D,MAAM,EAAE,6BAA6B,CAAC;gBAE1B,MAAM,EAAE,6BAA6B;CAOlD;AAED,qBAAa,aAAc,SAAQ,SAAS;CAAG;AAE/C,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,qBAAa,yBAA0B,SAAQ,aAAa;IAC1D,MAAM,EAAE,0BAA0B,CAAC;gBAEvB,MAAM,EAAE,0BAA0B;CAM/C;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,YAAY,CAAC;IAC3B,iBAAiB,EAAE,iBAAiB,CAAC;CACtC;AAED,qBAAa,6BAA8B,SAAQ,aAAa;IAC9D,MAAM,EAAE,8BAA8B,CAAC;gBAE3B,MAAM,EAAE,8BAA8B;CAMnD;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,qBAAa,wBAAyB,SAAQ,SAAS;IACrD,MAAM,EAAE,yBAAyB,CAAC;gBAEtB,MAAM,EAAE,yBAAyB;CAM9C;AAED,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,YAAY,CAAC;IAC3B,iBAAiB,EAAE,iBAAiB,CAAC;CACtC;AAED,qBAAa,4BAA6B,SAAQ,SAAS;IACzD,MAAM,EAAE,6BAA6B,CAAC;gBAE1B,MAAM,EAAE,6BAA6B;CAMlD"}
package/dist/errors.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.HandoffPolicyDeniedError = exports.ToolCallPolicyDeniedError = exports.ToolCallError = exports.OutputGuardrailTripwireTriggered = exports.MaxTurnsExceededError = exports.AIOCError = void 0;
3
+ exports.HandoffApprovalRequiredError = exports.HandoffPolicyDeniedError = exports.ToolCallApprovalRequiredError = exports.ToolCallPolicyDeniedError = exports.ToolCallError = exports.OutputGuardrailTripwireTriggered = exports.MaxTurnsExceededError = exports.AIOCError = void 0;
4
4
  class AIOCError extends Error {
5
5
  constructor(message) {
6
6
  super(message);
@@ -36,6 +36,14 @@ class ToolCallPolicyDeniedError extends ToolCallError {
36
36
  }
37
37
  }
38
38
  exports.ToolCallPolicyDeniedError = ToolCallPolicyDeniedError;
39
+ class ToolCallApprovalRequiredError extends ToolCallError {
40
+ result;
41
+ constructor(result) {
42
+ super(`Tool "${result.toolName}" requires approval: ${result.policyResult.reason}`);
43
+ this.result = result;
44
+ }
45
+ }
46
+ exports.ToolCallApprovalRequiredError = ToolCallApprovalRequiredError;
39
47
  class HandoffPolicyDeniedError extends AIOCError {
40
48
  result;
41
49
  constructor(result) {
@@ -44,3 +52,11 @@ class HandoffPolicyDeniedError extends AIOCError {
44
52
  }
45
53
  }
46
54
  exports.HandoffPolicyDeniedError = HandoffPolicyDeniedError;
55
+ class HandoffApprovalRequiredError extends AIOCError {
56
+ result;
57
+ constructor(result) {
58
+ super(`Handoff "${result.fromAgent}" -> "${result.toAgent}" requires approval: ${result.policyResult.reason}`);
59
+ this.result = result;
60
+ }
61
+ }
62
+ exports.HandoffApprovalRequiredError = HandoffApprovalRequiredError;
package/dist/index.d.ts CHANGED
@@ -6,6 +6,7 @@ export * from "./json";
6
6
  export * from "./logger";
7
7
  export * from "./messages";
8
8
  export * from "./policy";
9
+ export * from "./proposal-hashing";
9
10
  export * from "./provider-setup";
10
11
  export * from "./providers/base";
11
12
  export * from "./providers/chat-completions";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,OAAO,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,OAAO,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -22,6 +22,7 @@ __exportStar(require("./json"), exports);
22
22
  __exportStar(require("./logger"), exports);
23
23
  __exportStar(require("./messages"), exports);
24
24
  __exportStar(require("./policy"), exports);
25
+ __exportStar(require("./proposal-hashing"), exports);
25
26
  __exportStar(require("./provider-setup"), exports);
26
27
  __exportStar(require("./providers/base"), exports);
27
28
  __exportStar(require("./providers/chat-completions"), exports);
package/dist/logger.d.ts CHANGED
@@ -21,18 +21,24 @@ export type RunLogEvent = (RunLogEventBase & {
21
21
  type: "tool_policy_evaluated";
22
22
  toolName: string;
23
23
  callId: string;
24
- decision: "allow" | "deny";
24
+ decision: "allow" | "deny" | "require_approval";
25
25
  reason: string;
26
+ publicReason?: string;
27
+ resultMode?: "throw" | "tool_result";
26
28
  policyVersion?: string;
29
+ expiresAt?: string;
27
30
  metadata?: Record<string, unknown>;
28
31
  }) | (RunLogEventBase & {
29
32
  type: "handoff_policy_evaluated";
30
33
  handoffName: string;
31
34
  callId: string;
32
35
  toAgent: string;
33
- decision: "allow" | "deny";
36
+ decision: "allow" | "deny" | "require_approval";
34
37
  reason: string;
38
+ publicReason?: string;
39
+ resultMode?: "throw" | "tool_result";
35
40
  policyVersion?: string;
41
+ expiresAt?: string;
36
42
  metadata?: Record<string, unknown>;
37
43
  }) | (RunLogEventBase & {
38
44
  type: "tool_call_completed";
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { PolicyResult, PolicyResultMode } from "./policy";
2
+ import type { SuspendedProposal } from "./run-record";
3
+ export type ToolResultEnvelopeStatus = "ok" | "denied" | "approval_required";
4
+ export interface ToolResultEnvelope {
5
+ status: ToolResultEnvelopeStatus;
6
+ code: string | null;
7
+ publicReason: string | null;
8
+ data: unknown | null;
9
+ }
10
+ export declare function createDeniedPolicyResult(reason: string, metadata?: Record<string, unknown>): PolicyResult;
11
+ export declare function createDeprecatedPolicyFieldResult(fieldName: string, replacementField: string, receivedValue?: unknown): PolicyResult;
12
+ export declare function toAllowedToolResultEnvelope(data: unknown): ToolResultEnvelope;
13
+ export declare function materializePolicyResult(policyResult: PolicyResult): PolicyResult;
14
+ export declare function resolveResultMode(policyResult: PolicyResult): PolicyResultMode;
15
+ export declare function handleBlockedPolicyResult(params: {
16
+ kind: "tool";
17
+ toolName: string;
18
+ policyResult: PolicyResult;
19
+ suspendedProposal?: SuspendedProposal;
20
+ } | {
21
+ kind: "handoff";
22
+ fromAgent: string;
23
+ toAgent: string;
24
+ policyResult: PolicyResult;
25
+ suspendedProposal?: SuspendedProposal;
26
+ }): ToolResultEnvelope;
27
+ //# sourceMappingURL=policy-outcomes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-outcomes.d.ts","sourceRoot":"","sources":["../src/policy-outcomes.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,MAAM,wBAAwB,GAAG,IAAI,GAAG,QAAQ,GAAG,mBAAmB,CAAC;AAE7E,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,wBAAwB,CAAC;IACjC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;CACtB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,YAAY,CAOd;AAED,wBAAgB,iCAAiC,CAC/C,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,EACxB,aAAa,CAAC,EAAE,OAAO,GACtB,YAAY,CAMd;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,OAAO,GAAG,kBAAkB,CAO7E;AAoBD,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,YAAY,GACzB,YAAY,CAYd;AAED,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,YAAY,GACzB,gBAAgB,CAElB;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EACF;IACE,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,YAAY,CAAC;IAC3B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC,GACD;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,YAAY,CAAC;IAC3B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC,GACJ,kBAAkB,CA+CpB"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createDeniedPolicyResult = createDeniedPolicyResult;
4
+ exports.createDeprecatedPolicyFieldResult = createDeprecatedPolicyFieldResult;
5
+ exports.toAllowedToolResultEnvelope = toAllowedToolResultEnvelope;
6
+ exports.materializePolicyResult = materializePolicyResult;
7
+ exports.resolveResultMode = resolveResultMode;
8
+ exports.handleBlockedPolicyResult = handleBlockedPolicyResult;
9
+ const errors_1 = require("./errors");
10
+ function createDeniedPolicyResult(reason, metadata) {
11
+ return {
12
+ decision: "deny",
13
+ reason,
14
+ resultMode: "throw",
15
+ metadata,
16
+ };
17
+ }
18
+ function createDeprecatedPolicyFieldResult(fieldName, replacementField, receivedValue) {
19
+ return createDeniedPolicyResult(`deprecated_policy_field_${fieldName}`, {
20
+ deprecatedField: fieldName,
21
+ replacementField,
22
+ receivedValue,
23
+ });
24
+ }
25
+ function toAllowedToolResultEnvelope(data) {
26
+ return {
27
+ status: "ok",
28
+ code: null,
29
+ publicReason: null,
30
+ data,
31
+ };
32
+ }
33
+ function toBlockedToolResultEnvelope(policyResult) {
34
+ return {
35
+ status: policyResult.decision === "require_approval"
36
+ ? "approval_required"
37
+ : "denied",
38
+ code: policyResult.reason,
39
+ publicReason: policyResult.publicReason?.trim() ||
40
+ (policyResult.decision === "require_approval"
41
+ ? "Action requires approval."
42
+ : "Action not allowed."),
43
+ data: null,
44
+ };
45
+ }
46
+ function materializePolicyResult(policyResult) {
47
+ if (policyResult.decision === "allow" ||
48
+ typeof policyResult.resultMode !== "undefined") {
49
+ return policyResult;
50
+ }
51
+ return {
52
+ ...policyResult,
53
+ resultMode: "throw",
54
+ };
55
+ }
56
+ function resolveResultMode(policyResult) {
57
+ return policyResult.resultMode ?? "throw";
58
+ }
59
+ function handleBlockedPolicyResult(params) {
60
+ const { policyResult } = params;
61
+ if (policyResult.decision === "allow") {
62
+ throw new Error("Blocked policy result handler received an allow decision.");
63
+ }
64
+ if (resolveResultMode(policyResult) === "tool_result") {
65
+ return toBlockedToolResultEnvelope(policyResult);
66
+ }
67
+ if (policyResult.decision === "require_approval") {
68
+ if (!params.suspendedProposal) {
69
+ throw new Error("Approval-required policy result is missing a suspended proposal.");
70
+ }
71
+ if (params.kind === "tool") {
72
+ throw new errors_1.ToolCallApprovalRequiredError({
73
+ toolName: params.toolName,
74
+ policyResult,
75
+ suspendedProposal: params.suspendedProposal,
76
+ });
77
+ }
78
+ throw new errors_1.HandoffApprovalRequiredError({
79
+ fromAgent: params.fromAgent,
80
+ toAgent: params.toAgent,
81
+ policyResult,
82
+ suspendedProposal: params.suspendedProposal,
83
+ });
84
+ }
85
+ if (params.kind === "tool") {
86
+ throw new errors_1.ToolCallPolicyDeniedError({
87
+ toolName: params.toolName,
88
+ policyResult,
89
+ });
90
+ }
91
+ throw new errors_1.HandoffPolicyDeniedError({
92
+ fromAgent: params.fromAgent,
93
+ toAgent: params.toAgent,
94
+ policyResult,
95
+ });
96
+ }
package/dist/policy.d.ts CHANGED
@@ -1,27 +1,32 @@
1
1
  import type { RunContext } from "./run-context";
2
- export type PolicyDecision = "allow" | "deny";
3
- export type PolicyDenyMode = "throw" | "tool_result";
2
+ export type PolicyDecision = "allow" | "deny" | "require_approval";
3
+ export type PolicyResultMode = "throw" | "tool_result";
4
4
  export interface PolicyResult {
5
5
  decision: PolicyDecision;
6
6
  reason: string;
7
7
  publicReason?: string;
8
- denyMode?: PolicyDenyMode;
8
+ resultMode?: PolicyResultMode;
9
9
  policyVersion?: string;
10
+ expiresAt?: string;
10
11
  metadata?: Record<string, unknown>;
11
12
  }
12
13
  export interface PolicyResultOptions {
13
14
  publicReason?: string;
14
- denyMode?: PolicyDenyMode;
15
+ resultMode?: PolicyResultMode;
15
16
  policyVersion?: string;
17
+ expiresAt?: string;
16
18
  metadata?: Record<string, unknown>;
17
19
  }
18
20
  export declare function allow(reason: string, options?: PolicyResultOptions): PolicyResult;
19
21
  export declare function deny(reason: string, options?: PolicyResultOptions): PolicyResult;
22
+ export declare function requireApproval(reason: string, options?: PolicyResultOptions): PolicyResult;
20
23
  export interface ToolPolicyInput<TContext = unknown> {
21
24
  agentName: string;
22
25
  toolName: string;
23
26
  rawArguments: string;
24
27
  parsedArguments: unknown;
28
+ proposalHash: string;
29
+ argsCanonicalJson: string;
25
30
  runContext: RunContext<TContext>;
26
31
  turn: number;
27
32
  }
@@ -29,6 +34,8 @@ export interface HandoffPolicyInput<TContext = unknown> {
29
34
  fromAgentName: string;
30
35
  toAgentName: string;
31
36
  handoffPayload: unknown;
37
+ proposalHash: string;
38
+ payloadCanonicalJson: string;
32
39
  runContext: RunContext<TContext>;
33
40
  turn: number;
34
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,CAAC;AAC9C,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,aAAa,CAAC;AAErD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAiBD,wBAAgB,KAAK,CACnB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,mBAAmB,GAC5B,YAAY,CAEd;AAED,wBAAgB,IAAI,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,mBAAmB,GAC5B,YAAY,CAEd;AAED,MAAM,WAAW,eAAe,CAAC,QAAQ,GAAG,OAAO;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB,CAAC,QAAQ,GAAG,OAAO;IACpD,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,UAAU,CAAC,QAAQ,GAAG,OAAO,IAAI,CAC3C,KAAK,EAAE,eAAe,CAAC,QAAQ,CAAC,KAC7B,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;AAE1C,MAAM,MAAM,aAAa,CAAC,QAAQ,GAAG,OAAO,IAAI,CAC9C,KAAK,EAAE,kBAAkB,CAAC,QAAQ,CAAC,KAChC,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;AAE1C,MAAM,WAAW,mBAAmB,CAAC,QAAQ,GAAG,OAAO;IACrD,UAAU,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,aAAa,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;CACzC"}
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,kBAAkB,CAAC;AACnE,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,aAAa,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAkBD,wBAAgB,KAAK,CACnB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,mBAAmB,GAC5B,YAAY,CAEd;AAED,wBAAgB,IAAI,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,mBAAmB,GAC5B,YAAY,CAEd;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,mBAAmB,GAC5B,YAAY,CAEd;AAED,MAAM,WAAW,eAAe,CAAC,QAAQ,GAAG,OAAO;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB,CAAC,QAAQ,GAAG,OAAO;IACpD,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,UAAU,CAAC,QAAQ,GAAG,OAAO,IAAI,CAC3C,KAAK,EAAE,eAAe,CAAC,QAAQ,CAAC,KAC7B,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;AAE1C,MAAM,MAAM,aAAa,CAAC,QAAQ,GAAG,OAAO,IAAI,CAC9C,KAAK,EAAE,kBAAkB,CAAC,QAAQ,CAAC,KAChC,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;AAE1C,MAAM,WAAW,mBAAmB,CAAC,QAAQ,GAAG,OAAO;IACrD,UAAU,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,aAAa,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;CACzC"}
package/dist/policy.js CHANGED
@@ -2,13 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.allow = allow;
4
4
  exports.deny = deny;
5
+ exports.requireApproval = requireApproval;
5
6
  function createPolicyResult(decision, reason, options) {
6
7
  return {
7
8
  decision,
8
9
  reason,
9
10
  publicReason: options?.publicReason,
10
- denyMode: options?.denyMode,
11
+ resultMode: options?.resultMode,
11
12
  policyVersion: options?.policyVersion,
13
+ expiresAt: options?.expiresAt,
12
14
  metadata: options?.metadata,
13
15
  };
14
16
  }
@@ -18,3 +20,6 @@ function allow(reason, options) {
18
20
  function deny(reason, options) {
19
21
  return createPolicyResult("deny", reason, options);
20
22
  }
23
+ function requireApproval(reason, options) {
24
+ return createPolicyResult("require_approval", reason, options);
25
+ }
@@ -0,0 +1,21 @@
1
+ export interface ToolProposalFingerprintInput {
2
+ agentName: string;
3
+ toolName: string;
4
+ parsedArguments: unknown;
5
+ }
6
+ export interface ToolProposalFingerprint {
7
+ proposalHash: string;
8
+ argsCanonicalJson: string;
9
+ }
10
+ export interface HandoffProposalFingerprintInput {
11
+ fromAgentName: string;
12
+ toAgentName: string;
13
+ handoffPayload: unknown;
14
+ }
15
+ export interface HandoffProposalFingerprint {
16
+ proposalHash: string;
17
+ payloadCanonicalJson: string;
18
+ }
19
+ export declare function createToolProposalFingerprint(input: ToolProposalFingerprintInput): ToolProposalFingerprint;
20
+ export declare function createHandoffProposalFingerprint(input: HandoffProposalFingerprintInput): HandoffProposalFingerprint;
21
+ //# sourceMappingURL=proposal-hashing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposal-hashing.d.ts","sourceRoot":"","sources":["../src/proposal-hashing.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,+BAA+B;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,4BAA4B,GAClC,uBAAuB,CAezB;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,+BAA+B,GACrC,0BAA0B,CAe5B"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createToolProposalFingerprint = createToolProposalFingerprint;
4
+ exports.createHandoffProposalFingerprint = createHandoffProposalFingerprint;
5
+ const canonical_json_1 = require("./canonical-json");
6
+ function createToolProposalFingerprint(input) {
7
+ const argsCanonicalJson = (0, canonical_json_1.toCanonicalJson)(input.parsedArguments);
8
+ const proposalHash = (0, canonical_json_1.hashCanonicalJson)((0, canonical_json_1.toCanonicalJson)({
9
+ kind: "tool",
10
+ agentName: input.agentName,
11
+ toolName: input.toolName,
12
+ argsCanonicalJson,
13
+ }));
14
+ return {
15
+ proposalHash,
16
+ argsCanonicalJson,
17
+ };
18
+ }
19
+ function createHandoffProposalFingerprint(input) {
20
+ const payloadCanonicalJson = (0, canonical_json_1.toCanonicalJson)(input.handoffPayload);
21
+ const proposalHash = (0, canonical_json_1.hashCanonicalJson)((0, canonical_json_1.toCanonicalJson)({
22
+ kind: "handoff",
23
+ fromAgentName: input.fromAgentName,
24
+ toAgentName: input.toAgentName,
25
+ payloadCanonicalJson,
26
+ }));
27
+ return {
28
+ proposalHash,
29
+ payloadCanonicalJson,
30
+ };
31
+ }
@@ -8,8 +8,8 @@ export declare class RunLogEmitter {
8
8
  agentActivated(agent: string, turn: number): Promise<void>;
9
9
  turnStarted(agent: string, turn: number): Promise<void>;
10
10
  toolCallStarted(agent: string, turn: number, toolName: string, callId: string): Promise<void>;
11
- toolPolicyEvaluated(agent: string, turn: number, toolName: string, callId: string, decision: "allow" | "deny", reason: string, policyVersion?: string, metadata?: Record<string, unknown>): Promise<void>;
12
- handoffPolicyEvaluated(agent: string, turn: number, handoffName: string, callId: string, toAgent: string, decision: "allow" | "deny", reason: string, policyVersion?: string, metadata?: Record<string, unknown>): Promise<void>;
11
+ toolPolicyEvaluated(agent: string, turn: number, toolName: string, callId: string, decision: "allow" | "deny" | "require_approval", reason: string, publicReason?: string, resultMode?: "throw" | "tool_result", policyVersion?: string, expiresAt?: string, metadata?: Record<string, unknown>): Promise<void>;
12
+ handoffPolicyEvaluated(agent: string, turn: number, handoffName: string, callId: string, toAgent: string, decision: "allow" | "deny" | "require_approval", reason: string, publicReason?: string, resultMode?: "throw" | "tool_result", policyVersion?: string, expiresAt?: string, metadata?: Record<string, unknown>): Promise<void>;
13
13
  toolCallCompleted(agent: string, turn: number, toolName: string, callId: string): Promise<void>;
14
14
  toolCallFailed(agent: string, turn: number, toolName: string, callId: string, error: unknown): Promise<void>;
15
15
  outputGuardrailStarted(agent: string, turn: number, guardrailName: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"run-log-emitter.d.ts","sourceRoot":"","sources":["../src/run-log-emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,SAAS,EAAE,MAAM,UAAU,CAAC;AAmBvD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,CAAY;gBAEf,MAAM,CAAC,EAAE,SAAS;IAI9B,OAAO,CAAC,eAAe;YAIT,IAAI;IAYZ,UAAU,CACd,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;IAWV,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU1D,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUvD,eAAe,CACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IAYV,mBAAmB,CACvB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,OAAO,GAAG,MAAM,EAC1B,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,EACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;IAgBV,sBAAsB,CAC1B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,OAAO,GAAG,MAAM,EAC1B,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,EACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;IAiBV,iBAAiB,CACrB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IAYV,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,IAAI,CAAC;IAeV,sBAAsB,CAC1B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;IAWV,qBAAqB,CACzB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;IAWV,wBAAwB,CAC5B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAYV,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;IAWV,SAAS,CACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,IAAI,CAAC;CAYjB"}
1
+ {"version":3,"file":"run-log-emitter.d.ts","sourceRoot":"","sources":["../src/run-log-emitter.ts"],"names":[],"mappings":"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"}