@axiastudio/aioc 0.1.0-beta.6 → 0.1.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.
package/README.md CHANGED
@@ -4,15 +4,20 @@ AIOC is a governance-first SDK for LLM agents: models can propose actions, while
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
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 and documentation: [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 stable as of `0.1.0`.
12
+ The core runtime surface is compatibility-managed. Breaking changes to the stable surface should ship only with explicit migration guidance and release notes.
13
13
 
14
- - Beta contract: `docs/BETA-CONTRACT.md`
15
- - Alpha contract (historical): `docs/ALPHA-CONTRACT.md`
14
+ ### Stable Scope
15
+
16
+ AIOC `0.1.0` stabilizes the core runtime surface, public documentation aligned to the exported contract, `RunRecord` and replay/compare workflows, and the governance-first runtime model validated in real applications beyond toy examples.
17
+
18
+ - Release notes: `CHANGELOG.md`
19
+ - Historical beta contract snapshot: `docs/BETA-CONTRACT.md`
20
+ - Historical alpha contract snapshot: `docs/ALPHA-CONTRACT.md`
16
21
  - Privacy baseline: `docs/PRIVACY-BASELINE.md`
17
22
 
18
23
  ## Documentation Site
@@ -39,6 +44,29 @@ npm install @axiastudio/aioc
39
44
 
40
45
  ## Quickstart
41
46
 
47
+ ### OpenAI
48
+
49
+ ```ts
50
+ import "dotenv/config";
51
+ import { Agent, run, setupOpenAI } from "@axiastudio/aioc";
52
+
53
+ setupOpenAI(); // reads OPENAI_API_KEY from env
54
+
55
+ const agent = new Agent({
56
+ name: "Hello Agent",
57
+ model: "gpt-4.1-mini",
58
+ instructions: "Answer in 2 short sentences.",
59
+ });
60
+
61
+ const result = await run(
62
+ agent,
63
+ "In one sentence, what is a deterministic policy gate in an agent SDK?",
64
+ );
65
+ console.log(result.finalOutput);
66
+ ```
67
+
68
+ ### Mistral
69
+
42
70
  ```ts
43
71
  import "dotenv/config";
44
72
  import { Agent, run, setupMistral } from "@axiastudio/aioc";
@@ -65,7 +93,7 @@ console.log(result.finalOutput);
65
93
  - `Tool`, `tool(...)`
66
94
  - handoffs via `Agent({ handoffs: [...] })`
67
95
  - `run(...)` with streaming support (`stream` defaults to `false`)
68
- - policy helpers `allow(...)` / `deny(...)`
96
+ - policy helpers `allow(...)` / `deny(...)` / `requireApproval(...)`
69
97
  - provider setup helpers `setupMistral(...)`, `setupOpenAI(...)`, `setupProvider(...)`
70
98
  - run logger hook `run(..., { logger })`
71
99
  - run record hook `run(..., { record })`
@@ -80,7 +108,7 @@ import { Agent, allow, deny, run, tool, type ToolPolicy } from "@axiastudio/aioc
80
108
  const toolPolicy: ToolPolicy<{ actor: { groups: string[] } }> = ({ runContext }) => {
81
109
  if (!runContext.context.actor.groups.includes("finance")) {
82
110
  return deny("deny_missing_finance_group", {
83
- denyMode: "tool_result",
111
+ resultMode: "tool_result",
84
112
  publicReason: "You are not authorized to access this report.",
85
113
  });
86
114
  }
@@ -95,6 +123,8 @@ await run(agent, "Summarize report Q1.", {
95
123
 
96
124
  Default behavior is deny when no policy is configured.
97
125
 
126
+ `resultMode` is the canonical non-allow delivery mode (`"throw"` or `"tool_result"`). `denyMode` is no longer supported.
127
+
98
128
  ## Run Record (Minimal)
99
129
 
100
130
  ```ts
@@ -187,17 +217,21 @@ This repository also contains `aioc-inspect`, a private reference example UI for
187
217
 
188
218
  | Command | Purpose | Needs API key |
189
219
  |---|---|---|
190
- | `npm run example:hello` | Minimal single-agent run | Yes (`MISTRAL_API_KEY`) |
191
- | `npm run example:tool-policy` | Tool calls with deterministic policy gate | Yes (`MISTRAL_API_KEY`) |
192
- | `npm run example:run-record` | Run-record persistence with redaction + audit | Yes (`MISTRAL_API_KEY`) |
220
+ | `npm run example:hello` | Minimal single-agent run | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
221
+ | `npm run example:policy` | Minimal denied tool + policy flow | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
222
+ | `npm run example:approval-required` | Minimal approval-required tool + policy flow | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
223
+ | `npm run example:approval-evidence` | Approval evidence passed through context and reevaluated by policy | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
224
+ | `npm run example:tool-policy` | Straight tool + policy flow with allowed execution | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
225
+ | `npm run example:run-record` | Run-record persistence with redaction + audit | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
193
226
  | `npm run example:rru:01-extract` | Minimal `extractToolCalls(...)` | No |
194
227
  | `npm run example:rru:02-compare` | Minimal `compareRunRecords(...)` | No |
195
228
  | `npm run example:rru:03-replay-strict` | Minimal strict replay | No |
196
229
  | `npm run example:rru:04-replay-hybrid` | Minimal hybrid replay | No |
197
- | `npm run example:non-regression` | Advanced v1/v2 run-record diff | Yes (`MISTRAL_API_KEY`) |
230
+ | `npm run example:non-regression` | Advanced v1/v2 run-record diff | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
198
231
 
199
232
  Notes:
200
233
 
234
+ - for live-provider examples, set `AIOC_EXAMPLE_PROVIDER` to `openai` or `mistral`; the matching API key must also be available
201
235
  - `example:non-regression` is educational and can be non-deterministic because it uses a live provider.
202
236
  - canonical examples guide: `docs/CANONICAL-EXAMPLES.md`.
203
237
 
@@ -224,8 +258,10 @@ AIOC adopts the following non-negotiable principles:
224
258
  - `docs/RFC-0001-governance-first-runtime.md` (`Accepted`)
225
259
  - `docs/RFC-0002-policy-gates-for-tools-and-handoffs.md` (`Accepted`)
226
260
  - `docs/RFC-0003-run-record-audit-trail-and-persistence.md` (`Accepted`)
227
- - `docs/RFC-0004-policy-outcomes-and-approval-model.md` (`Draft`)
261
+ - `docs/RFC-0004-policy-outcomes-and-approval-model.md` (`Accepted`)
228
262
  - `docs/RFC-0005-suspended-proposals-and-approval-lifecycle.md` (`Draft`)
263
+ - `docs/RFC-0006-approval-evidence-helpers.md` (`Draft`)
264
+ - `docs/RFC-0007-thread-state-utilities.md` (`Draft`)
229
265
  - `docs/PRIVACY-BASELINE.md`
230
266
 
231
267
  ## Historical Snapshots
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,26 @@
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 toAllowedToolResultEnvelope(data: unknown): ToolResultEnvelope;
12
+ export declare function materializePolicyResult(policyResult: PolicyResult): PolicyResult;
13
+ export declare function resolveResultMode(policyResult: PolicyResult): PolicyResultMode;
14
+ export declare function handleBlockedPolicyResult(params: {
15
+ kind: "tool";
16
+ toolName: string;
17
+ policyResult: PolicyResult;
18
+ suspendedProposal?: SuspendedProposal;
19
+ } | {
20
+ kind: "handoff";
21
+ fromAgent: string;
22
+ toAgent: string;
23
+ policyResult: PolicyResult;
24
+ suspendedProposal?: SuspendedProposal;
25
+ }): ToolResultEnvelope;
26
+ //# 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,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,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createDeniedPolicyResult = createDeniedPolicyResult;
4
+ exports.toAllowedToolResultEnvelope = toAllowedToolResultEnvelope;
5
+ exports.materializePolicyResult = materializePolicyResult;
6
+ exports.resolveResultMode = resolveResultMode;
7
+ exports.handleBlockedPolicyResult = handleBlockedPolicyResult;
8
+ const errors_1 = require("./errors");
9
+ function createDeniedPolicyResult(reason, metadata) {
10
+ return {
11
+ decision: "deny",
12
+ reason,
13
+ resultMode: "throw",
14
+ metadata,
15
+ };
16
+ }
17
+ function toAllowedToolResultEnvelope(data) {
18
+ return {
19
+ status: "ok",
20
+ code: null,
21
+ publicReason: null,
22
+ data,
23
+ };
24
+ }
25
+ function toBlockedToolResultEnvelope(policyResult) {
26
+ return {
27
+ status: policyResult.decision === "require_approval"
28
+ ? "approval_required"
29
+ : "denied",
30
+ code: policyResult.reason,
31
+ publicReason: policyResult.publicReason?.trim() ||
32
+ (policyResult.decision === "require_approval"
33
+ ? "Action requires approval."
34
+ : "Action not allowed."),
35
+ data: null,
36
+ };
37
+ }
38
+ function materializePolicyResult(policyResult) {
39
+ if (policyResult.decision === "allow" ||
40
+ typeof policyResult.resultMode !== "undefined") {
41
+ return policyResult;
42
+ }
43
+ return {
44
+ ...policyResult,
45
+ resultMode: "throw",
46
+ };
47
+ }
48
+ function resolveResultMode(policyResult) {
49
+ return policyResult.resultMode ?? "throw";
50
+ }
51
+ function handleBlockedPolicyResult(params) {
52
+ const { policyResult } = params;
53
+ if (policyResult.decision === "allow") {
54
+ throw new Error("Blocked policy result handler received an allow decision.");
55
+ }
56
+ if (resolveResultMode(policyResult) === "tool_result") {
57
+ return toBlockedToolResultEnvelope(policyResult);
58
+ }
59
+ if (policyResult.decision === "require_approval") {
60
+ if (!params.suspendedProposal) {
61
+ throw new Error("Approval-required policy result is missing a suspended proposal.");
62
+ }
63
+ if (params.kind === "tool") {
64
+ throw new errors_1.ToolCallApprovalRequiredError({
65
+ toolName: params.toolName,
66
+ policyResult,
67
+ suspendedProposal: params.suspendedProposal,
68
+ });
69
+ }
70
+ throw new errors_1.HandoffApprovalRequiredError({
71
+ fromAgent: params.fromAgent,
72
+ toAgent: params.toAgent,
73
+ policyResult,
74
+ suspendedProposal: params.suspendedProposal,
75
+ });
76
+ }
77
+ if (params.kind === "tool") {
78
+ throw new errors_1.ToolCallPolicyDeniedError({
79
+ toolName: params.toolName,
80
+ policyResult,
81
+ });
82
+ }
83
+ throw new errors_1.HandoffPolicyDeniedError({
84
+ fromAgent: params.fromAgent,
85
+ toAgent: params.toAgent,
86
+ policyResult,
87
+ });
88
+ }
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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"}
@@ -71,10 +71,10 @@ class RunLogEmitter {
71
71
  callId,
72
72
  });
73
73
  }
74
- async toolPolicyEvaluated(agent, turn, toolName, callId, decision, reason, policyVersion, metadata) {
74
+ async toolPolicyEvaluated(agent, turn, toolName, callId, decision, reason, publicReason, resultMode, policyVersion, expiresAt, metadata) {
75
75
  await this.emit({
76
76
  timestamp: this.createTimestamp(),
77
- level: decision === "deny" ? "warn" : "info",
77
+ level: decision === "allow" ? "info" : "warn",
78
78
  type: "tool_policy_evaluated",
79
79
  agent,
80
80
  turn,
@@ -82,14 +82,17 @@ class RunLogEmitter {
82
82
  callId,
83
83
  decision,
84
84
  reason,
85
+ publicReason,
86
+ resultMode,
85
87
  policyVersion,
88
+ expiresAt,
86
89
  metadata,
87
90
  });
88
91
  }
89
- async handoffPolicyEvaluated(agent, turn, handoffName, callId, toAgent, decision, reason, policyVersion, metadata) {
92
+ async handoffPolicyEvaluated(agent, turn, handoffName, callId, toAgent, decision, reason, publicReason, resultMode, policyVersion, expiresAt, metadata) {
90
93
  await this.emit({
91
94
  timestamp: this.createTimestamp(),
92
- level: decision === "deny" ? "warn" : "info",
95
+ level: decision === "allow" ? "info" : "warn",
93
96
  type: "handoff_policy_evaluated",
94
97
  agent,
95
98
  turn,
@@ -98,7 +101,10 @@ class RunLogEmitter {
98
101
  toAgent,
99
102
  decision,
100
103
  reason,
104
+ publicReason,
105
+ resultMode,
101
106
  policyVersion,
107
+ expiresAt,
102
108
  metadata,
103
109
  });
104
110
  }