@axiastudio/aioc 0.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +77 -0
  3. package/dist/agent.d.ts +29 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +36 -0
  6. package/dist/config.d.ts +5 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +18 -0
  9. package/dist/errors.d.ts +37 -0
  10. package/dist/errors.d.ts.map +1 -0
  11. package/dist/errors.js +46 -0
  12. package/dist/examples/basic/hello-world.d.ts +2 -0
  13. package/dist/examples/basic/hello-world.d.ts.map +1 -0
  14. package/dist/examples/basic/hello-world.js +20 -0
  15. package/dist/examples/basic/run-record-sink.d.ts +2 -0
  16. package/dist/examples/basic/run-record-sink.d.ts.map +1 -0
  17. package/dist/examples/basic/run-record-sink.js +103 -0
  18. package/dist/examples/basic/tools.d.ts +2 -0
  19. package/dist/examples/basic/tools.d.ts.map +1 -0
  20. package/dist/examples/basic/tools.js +84 -0
  21. package/dist/examples/guardrail-smoke.d.ts +2 -0
  22. package/dist/examples/guardrail-smoke.d.ts.map +1 -0
  23. package/dist/examples/guardrail-smoke.js +110 -0
  24. package/dist/examples/hello-run.d.ts +2 -0
  25. package/dist/examples/hello-run.d.ts.map +1 -0
  26. package/dist/examples/hello-run.js +20 -0
  27. package/dist/examples/learn-01-hello-run.d.ts +2 -0
  28. package/dist/examples/learn-01-hello-run.d.ts.map +1 -0
  29. package/dist/examples/learn-01-hello-run.js +29 -0
  30. package/dist/examples/learn-02-tool-policy.d.ts +2 -0
  31. package/dist/examples/learn-02-tool-policy.d.ts.map +1 -0
  32. package/dist/examples/learn-02-tool-policy.js +87 -0
  33. package/dist/examples/learn-03-controlled-handoff.d.ts +2 -0
  34. package/dist/examples/learn-03-controlled-handoff.d.ts.map +1 -0
  35. package/dist/examples/learn-03-controlled-handoff.js +84 -0
  36. package/dist/examples/learn-04-output-guardrail.d.ts +2 -0
  37. package/dist/examples/learn-04-output-guardrail.d.ts.map +1 -0
  38. package/dist/examples/learn-04-output-guardrail.js +61 -0
  39. package/dist/examples/learn-05-run-record-audit.d.ts +2 -0
  40. package/dist/examples/learn-05-run-record-audit.d.ts.map +1 -0
  41. package/dist/examples/learn-05-run-record-audit.js +135 -0
  42. package/dist/examples/mistral-smoke.d.ts +2 -0
  43. package/dist/examples/mistral-smoke.d.ts.map +1 -0
  44. package/dist/examples/mistral-smoke.js +63 -0
  45. package/dist/examples/onboarding-governance-smoke.d.ts +2 -0
  46. package/dist/examples/onboarding-governance-smoke.d.ts.map +1 -0
  47. package/dist/examples/onboarding-governance-smoke.js +477 -0
  48. package/dist/examples/onboarding-governance-tutorial.d.ts +2 -0
  49. package/dist/examples/onboarding-governance-tutorial.d.ts.map +1 -0
  50. package/dist/examples/onboarding-governance-tutorial.js +342 -0
  51. package/dist/examples/policy-smoke.d.ts +2 -0
  52. package/dist/examples/policy-smoke.d.ts.map +1 -0
  53. package/dist/examples/policy-smoke.js +137 -0
  54. package/dist/examples/support/scripted-provider.d.ts +8 -0
  55. package/dist/examples/support/scripted-provider.d.ts.map +1 -0
  56. package/dist/examples/support/scripted-provider.js +21 -0
  57. package/dist/examples/tool-policy-finance.d.ts +2 -0
  58. package/dist/examples/tool-policy-finance.d.ts.map +1 -0
  59. package/dist/examples/tool-policy-finance.js +77 -0
  60. package/dist/examples/tool-run.d.ts +2 -0
  61. package/dist/examples/tool-run.d.ts.map +1 -0
  62. package/dist/examples/tool-run.js +70 -0
  63. package/dist/guardrails.d.ts +20 -0
  64. package/dist/guardrails.d.ts.map +1 -0
  65. package/dist/guardrails.js +6 -0
  66. package/dist/index.d.ts +18 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +33 -0
  69. package/dist/logger.d.ts +76 -0
  70. package/dist/logger.d.ts.map +1 -0
  71. package/dist/logger.js +53 -0
  72. package/dist/messages.d.ts +5 -0
  73. package/dist/messages.d.ts.map +1 -0
  74. package/dist/messages.js +21 -0
  75. package/dist/policy.d.ts +41 -0
  76. package/dist/policy.d.ts.map +1 -0
  77. package/dist/policy.js +20 -0
  78. package/dist/provider-setup.d.ts +14 -0
  79. package/dist/provider-setup.d.ts.map +1 -0
  80. package/dist/provider-setup.js +43 -0
  81. package/dist/providers/base.d.ts +26 -0
  82. package/dist/providers/base.d.ts.map +1 -0
  83. package/dist/providers/base.js +2 -0
  84. package/dist/providers/chat-completions.d.ts +13 -0
  85. package/dist/providers/chat-completions.d.ts.map +1 -0
  86. package/dist/providers/chat-completions.js +314 -0
  87. package/dist/providers/mistral.d.ts +8 -0
  88. package/dist/providers/mistral.d.ts.map +1 -0
  89. package/dist/providers/mistral.js +14 -0
  90. package/dist/providers/openai.d.ts +11 -0
  91. package/dist/providers/openai.d.ts.map +1 -0
  92. package/dist/providers/openai.js +23 -0
  93. package/dist/run-context.d.ts +5 -0
  94. package/dist/run-context.d.ts.map +1 -0
  95. package/dist/run-context.js +10 -0
  96. package/dist/run-log-emitter.d.ts +21 -0
  97. package/dist/run-log-emitter.d.ts.map +1 -0
  98. package/dist/run-log-emitter.js +184 -0
  99. package/dist/run-record.d.ts +61 -0
  100. package/dist/run-record.d.ts.map +1 -0
  101. package/dist/run-record.js +2 -0
  102. package/dist/run-recorder-runtime.d.ts +38 -0
  103. package/dist/run-recorder-runtime.d.ts.map +1 -0
  104. package/dist/run-recorder-runtime.js +148 -0
  105. package/dist/run.d.ts +19 -0
  106. package/dist/run.d.ts.map +1 -0
  107. package/dist/run.js +497 -0
  108. package/dist/tests/integration/chat-completions.integration.d.ts +2 -0
  109. package/dist/tests/integration/chat-completions.integration.d.ts.map +1 -0
  110. package/dist/tests/integration/chat-completions.integration.js +110 -0
  111. package/dist/tests/integration/index.d.ts +2 -0
  112. package/dist/tests/integration/index.d.ts.map +1 -0
  113. package/dist/tests/integration/index.js +12 -0
  114. package/dist/tests/regression/handoff-policy-trace.regression.d.ts +2 -0
  115. package/dist/tests/regression/handoff-policy-trace.regression.d.ts.map +1 -0
  116. package/dist/tests/regression/handoff-policy-trace.regression.js +92 -0
  117. package/dist/tests/regression/handoff-transition.regression.d.ts +2 -0
  118. package/dist/tests/regression/handoff-transition.regression.d.ts.map +1 -0
  119. package/dist/tests/regression/handoff-transition.regression.js +62 -0
  120. package/dist/tests/regression/index.d.ts +2 -0
  121. package/dist/tests/regression/index.d.ts.map +1 -0
  122. package/dist/tests/regression/index.js +14 -0
  123. package/dist/tests/regression/policy-default-deny.regression.d.ts +2 -0
  124. package/dist/tests/regression/policy-default-deny.regression.d.ts.map +1 -0
  125. package/dist/tests/regression/policy-default-deny.regression.js +106 -0
  126. package/dist/tests/support/handoff-name.d.ts +2 -0
  127. package/dist/tests/support/handoff-name.d.ts.map +1 -0
  128. package/dist/tests/support/handoff-name.js +14 -0
  129. package/dist/tests/support/scripted-provider.d.ts +8 -0
  130. package/dist/tests/support/scripted-provider.d.ts.map +1 -0
  131. package/dist/tests/support/scripted-provider.js +19 -0
  132. package/dist/tests/unit/guardrail.unit.d.ts +2 -0
  133. package/dist/tests/unit/guardrail.unit.d.ts.map +1 -0
  134. package/dist/tests/unit/guardrail.unit.js +48 -0
  135. package/dist/tests/unit/handoff.unit.d.ts +2 -0
  136. package/dist/tests/unit/handoff.unit.d.ts.map +1 -0
  137. package/dist/tests/unit/handoff.unit.js +178 -0
  138. package/dist/tests/unit/index.d.ts +2 -0
  139. package/dist/tests/unit/index.d.ts.map +1 -0
  140. package/dist/tests/unit/index.js +24 -0
  141. package/dist/tests/unit/logger.unit.d.ts +2 -0
  142. package/dist/tests/unit/logger.unit.d.ts.map +1 -0
  143. package/dist/tests/unit/logger.unit.js +65 -0
  144. package/dist/tests/unit/policy.unit.d.ts +2 -0
  145. package/dist/tests/unit/policy.unit.d.ts.map +1 -0
  146. package/dist/tests/unit/policy.unit.js +167 -0
  147. package/dist/tests/unit/provider-setup.unit.d.ts +2 -0
  148. package/dist/tests/unit/provider-setup.unit.d.ts.map +1 -0
  149. package/dist/tests/unit/provider-setup.unit.js +75 -0
  150. package/dist/tests/unit/run-record.unit.d.ts +2 -0
  151. package/dist/tests/unit/run-record.unit.d.ts.map +1 -0
  152. package/dist/tests/unit/run-record.unit.js +118 -0
  153. package/dist/tests/unit/run.unit.d.ts +2 -0
  154. package/dist/tests/unit/run.unit.d.ts.map +1 -0
  155. package/dist/tests/unit/run.unit.js +30 -0
  156. package/dist/tool.d.ts +16 -0
  157. package/dist/tool.d.ts.map +1 -0
  158. package/dist/tool.js +6 -0
  159. package/dist/types.d.ts +67 -0
  160. package/dist/types.d.ts.map +1 -0
  161. package/dist/types.js +2 -0
  162. package/package.json +64 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 AIOC contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,77 @@
1
+ # @axiastudio/aioc
2
+
3
+ AIOC is a lightweight internal agent SDK with an IoC-oriented control plane.
4
+
5
+ ## Release status
6
+
7
+ This package is currently in alpha and is not production-ready.
8
+ Breaking changes may occur before a stable release.
9
+
10
+ ## Contact
11
+
12
+ If you want to collaborate or provide feedback, write to `tiziano.lattisi@axia.studio`.
13
+
14
+ ## Project principles
15
+
16
+ AIOC adopts the following non-negotiable principles:
17
+
18
+ - **LLM outside the control plane**: critical decisions remain in deterministic components; the LLM supports but does not govern.
19
+ - **End-to-end transparency**: each decision is traceable (inputs, context, prompt/policy version, output).
20
+ - **Verifiable corrigibility**: prompts, policies, and materials are versioned, editable, and comparable before/after changes.
21
+ - **Non-degeneration validation**: each correction must pass regression tests and quality checks.
22
+ - **Bias and misalignment control**: continuous monitoring, dedicated tests, and clear mitigation/escalation mechanisms.
23
+ - **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.
24
+
25
+ Governance implementation reference:
26
+
27
+ - `docs/RFC-0001-governance-first-runtime.md`
28
+ - `docs/RFC-0002-policy-gates-for-tools-and-handoffs.md`
29
+ - `docs/RFC-0003-run-record-audit-trail-and-persistence.md`
30
+
31
+ ## Goals of this first scaffold
32
+
33
+ - Keep a familiar API.
34
+ - Isolate provider/runtime concerns from application agent logic.
35
+ - Enable provider wrappers (including Mistral) behind a stable SDK surface.
36
+
37
+ ## Exposed primitives (v0 scaffold)
38
+
39
+ - `Agent`, `RunContext`
40
+ - `Tool`, `tool(...)`
41
+ - agent handoffs via `Agent({ handoffs: [...] })`
42
+ - `run(...)` with streaming support
43
+ - run logger hook via `run(..., { logger })`
44
+ - deterministic policy gates via `run(..., { policies })` (tool execution and handoff transitions are default-deny without explicit allow policy)
45
+ - policy helpers `allow(...)` and `deny(...)` for deterministic policy results (including optional `publicReason` and `denyMode`)
46
+ - tool/handoff call outputs are normalized in an envelope: `{ status, code, publicReason, data }`
47
+ - provider setup helpers `setupMistral(...)`, `setupOpenAI(...)`, `setupProvider(...)`
48
+ - stdout logger helper `createStdoutLogger(...)` (opt-in)
49
+ - run record hook via `run(..., { record })` for external persistence/audit adapters
50
+ - message helpers `user(...)`, `assistant(...)`, `system(...)`
51
+ - `setDefaultProvider(...)`
52
+ - error classes including `OutputGuardrailTripwireTriggered`
53
+ - `OpenAIProvider`, `MistralProvider`
54
+
55
+ Provider setup notes:
56
+
57
+ - `setupMistral()` reads `MISTRAL_API_KEY` from env if no `apiKey` is passed.
58
+ - `setupOpenAI()` reads `OPENAI_API_KEY` from env if no `apiKey` is passed.
59
+ - `setupProvider("mistral" | "openai", ...)` provides a single entrypoint.
60
+ - `run(...)` defaults to non-stream mode (`stream: false`).
61
+
62
+ Policy deny notes:
63
+
64
+ - Default deny behavior raises typed runtime errors (`ToolCallPolicyDeniedError` / `HandoffPolicyDeniedError`).
65
+ - Policies can choose `denyMode: "tool_result"` to return a denied tool result to the model without throwing.
66
+
67
+ ## Test Commands
68
+
69
+ - `npm run test:unit`
70
+ - `npm run test:integration`
71
+ - `npm run test:regression`
72
+ - `npm run test:ci`
73
+
74
+ ## License
75
+
76
+ - Project license: `MIT` (`LICENSE`)
77
+ - Third-party notices: `THIRD_PARTY_NOTICES.md`
@@ -0,0 +1,29 @@
1
+ import { RunContext } from "./run-context";
2
+ import type { OutputGuardrail } from "./guardrails";
3
+ import type { Tool } from "./tool";
4
+ import type { ModelSettings } from "./types";
5
+ export type AgentInstructions<TContext = unknown> = string | ((runContext: RunContext<TContext>) => string | Promise<string>);
6
+ export interface AgentConfiguration<TContext = unknown> {
7
+ name: string;
8
+ handoffDescription?: string;
9
+ instructions?: AgentInstructions<TContext>;
10
+ model?: string;
11
+ modelSettings?: ModelSettings;
12
+ tools?: Tool<TContext>[];
13
+ handoffs?: Agent<TContext>[];
14
+ outputGuardrails?: OutputGuardrail<TContext>[];
15
+ }
16
+ export declare class Agent<TContext = unknown> {
17
+ name: string;
18
+ handoffDescription: string;
19
+ instructions?: AgentInstructions<TContext>;
20
+ model?: string;
21
+ modelSettings?: ModelSettings;
22
+ tools: Tool<TContext>[];
23
+ handoffs: Agent<TContext>[];
24
+ outputGuardrails: OutputGuardrail<TContext>[];
25
+ constructor(config: AgentConfiguration<TContext>);
26
+ static create<TContext = unknown>(config: AgentConfiguration<TContext>): Agent<TContext>;
27
+ resolveInstructions(runContext: RunContext<TContext>): Promise<string | undefined>;
28
+ }
29
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +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,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,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;IAWhD,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"}
package/dist/agent.js ADDED
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Agent = void 0;
4
+ class Agent {
5
+ name;
6
+ handoffDescription;
7
+ instructions;
8
+ model;
9
+ modelSettings;
10
+ tools;
11
+ handoffs;
12
+ outputGuardrails;
13
+ constructor(config) {
14
+ this.name = config.name;
15
+ this.handoffDescription = config.handoffDescription ?? "";
16
+ this.instructions = config.instructions;
17
+ this.model = config.model;
18
+ this.modelSettings = config.modelSettings;
19
+ this.tools = config.tools ?? [];
20
+ this.handoffs = config.handoffs ?? [];
21
+ this.outputGuardrails = config.outputGuardrails ?? [];
22
+ }
23
+ static create(config) {
24
+ return new Agent(config);
25
+ }
26
+ async resolveInstructions(runContext) {
27
+ if (typeof this.instructions === "undefined") {
28
+ return undefined;
29
+ }
30
+ if (typeof this.instructions === "string") {
31
+ return this.instructions;
32
+ }
33
+ return this.instructions(runContext);
34
+ }
35
+ }
36
+ exports.Agent = Agent;
@@ -0,0 +1,5 @@
1
+ import { ModelProvider } from "./providers/base";
2
+ export declare function setDefaultProvider(provider: ModelProvider): void;
3
+ export declare function clearDefaultProvider(): void;
4
+ export declare function getDefaultProvider(): ModelProvider;
5
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAIjD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAEhE;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED,wBAAgB,kBAAkB,IAAI,aAAa,CAOlD"}
package/dist/config.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setDefaultProvider = setDefaultProvider;
4
+ exports.clearDefaultProvider = clearDefaultProvider;
5
+ exports.getDefaultProvider = getDefaultProvider;
6
+ let defaultProvider = null;
7
+ function setDefaultProvider(provider) {
8
+ defaultProvider = provider;
9
+ }
10
+ function clearDefaultProvider() {
11
+ defaultProvider = null;
12
+ }
13
+ function getDefaultProvider() {
14
+ if (!defaultProvider) {
15
+ throw new Error("No default provider configured. Call setDefaultProvider().");
16
+ }
17
+ return defaultProvider;
18
+ }
@@ -0,0 +1,37 @@
1
+ import type { GuardrailFunctionOutput } from "./guardrails";
2
+ import type { PolicyResult } from "./policy";
3
+ export declare class AIOCError extends Error {
4
+ constructor(message: string);
5
+ }
6
+ export declare class MaxTurnsExceededError extends AIOCError {
7
+ constructor(maxTurns: number);
8
+ }
9
+ export interface OutputGuardrailTripwireResult {
10
+ guardrail: string;
11
+ output: GuardrailFunctionOutput;
12
+ outputText: string;
13
+ }
14
+ export declare class OutputGuardrailTripwireTriggered extends AIOCError {
15
+ result: OutputGuardrailTripwireResult;
16
+ constructor(result: OutputGuardrailTripwireResult);
17
+ }
18
+ export declare class ToolCallError extends AIOCError {
19
+ }
20
+ export interface ToolCallPolicyDeniedResult {
21
+ toolName: string;
22
+ policyResult: PolicyResult;
23
+ }
24
+ export declare class ToolCallPolicyDeniedError extends ToolCallError {
25
+ result: ToolCallPolicyDeniedResult;
26
+ constructor(result: ToolCallPolicyDeniedResult);
27
+ }
28
+ export interface HandoffPolicyDeniedResult {
29
+ fromAgent: string;
30
+ toAgent: string;
31
+ policyResult: PolicyResult;
32
+ }
33
+ export declare class HandoffPolicyDeniedError extends AIOCError {
34
+ result: HandoffPolicyDeniedResult;
35
+ constructor(result: HandoffPolicyDeniedResult);
36
+ }
37
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +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"}
package/dist/errors.js ADDED
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HandoffPolicyDeniedError = exports.ToolCallPolicyDeniedError = exports.ToolCallError = exports.OutputGuardrailTripwireTriggered = exports.MaxTurnsExceededError = exports.AIOCError = void 0;
4
+ class AIOCError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = new.target.name;
8
+ }
9
+ }
10
+ exports.AIOCError = AIOCError;
11
+ class MaxTurnsExceededError extends AIOCError {
12
+ constructor(maxTurns) {
13
+ super(`Max turns exceeded: ${maxTurns}`);
14
+ }
15
+ }
16
+ exports.MaxTurnsExceededError = MaxTurnsExceededError;
17
+ class OutputGuardrailTripwireTriggered extends AIOCError {
18
+ result;
19
+ constructor(result) {
20
+ const reason = result.output.reason
21
+ ? ` Reason: ${result.output.reason}`
22
+ : "";
23
+ super(`Output guardrail "${result.guardrail}" triggered.${reason}`);
24
+ this.result = result;
25
+ }
26
+ }
27
+ exports.OutputGuardrailTripwireTriggered = OutputGuardrailTripwireTriggered;
28
+ class ToolCallError extends AIOCError {
29
+ }
30
+ exports.ToolCallError = ToolCallError;
31
+ class ToolCallPolicyDeniedError extends ToolCallError {
32
+ result;
33
+ constructor(result) {
34
+ super(`Tool "${result.toolName}" denied by policy: ${result.policyResult.reason}`);
35
+ this.result = result;
36
+ }
37
+ }
38
+ exports.ToolCallPolicyDeniedError = ToolCallPolicyDeniedError;
39
+ class HandoffPolicyDeniedError extends AIOCError {
40
+ result;
41
+ constructor(result) {
42
+ super(`Handoff "${result.fromAgent}" -> "${result.toAgent}" denied by policy: ${result.policyResult.reason}`);
43
+ this.result = result;
44
+ }
45
+ }
46
+ exports.HandoffPolicyDeniedError = HandoffPolicyDeniedError;
@@ -0,0 +1,2 @@
1
+ import "dotenv/config";
2
+ //# sourceMappingURL=hello-world.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hello-world.d.ts","sourceRoot":"","sources":["../../../src/examples/basic/hello-world.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("dotenv/config");
4
+ const index_1 = require("../../index");
5
+ async function main() {
6
+ // Minimal setup: configure default provider from MISTRAL_API_KEY.
7
+ (0, index_1.setupMistral)();
8
+ const agent = new index_1.Agent({
9
+ name: "Hello run agent",
10
+ model: "mistral-small-latest",
11
+ instructions: "You only respond in haikus.",
12
+ });
13
+ // Default behavior: non-stream run (stream defaults to false).
14
+ const result = await (0, index_1.run)(agent, "Tell me about recursion in programming. Quickly responding with a single answer is fine.");
15
+ process.stdout.write(`${result.finalOutput}\n`);
16
+ }
17
+ main().catch((error) => {
18
+ process.stderr.write(`${String(error)}\n`);
19
+ process.exit(1);
20
+ });
@@ -0,0 +1,2 @@
1
+ import "dotenv/config";
2
+ //# sourceMappingURL=run-record-sink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-record-sink.d.ts","sourceRoot":"","sources":["../../../src/examples/basic/run-record-sink.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("dotenv/config");
4
+ const zod_1 = require("zod");
5
+ const index_1 = require("../../index");
6
+ function findLastToolResultEnvelope(record) {
7
+ const reversedItems = [...record.items].reverse();
8
+ const outputItem = reversedItems.find((item) => item.type === "tool_call_output_item");
9
+ if (!outputItem || outputItem.type !== "tool_call_output_item") {
10
+ return undefined;
11
+ }
12
+ return outputItem?.output;
13
+ }
14
+ async function runScenario(label, agent, actor, toolPolicy, sink) {
15
+ process.stdout.write(`\n=== Scenario: ${label} (groups: ${actor.groups.join(", ")}) ===\n`);
16
+ const result = await (0, index_1.run)(agent, "Summarize report Q1-2026.", {
17
+ context: { actor },
18
+ policies: { toolPolicy },
19
+ maxTurns: 6,
20
+ record: {
21
+ metadata: { scenario: label },
22
+ contextRedactor: (context) => ({
23
+ contextSnapshot: {
24
+ actor: {
25
+ ...context.actor,
26
+ email: "[redacted-email]",
27
+ },
28
+ },
29
+ contextRedacted: true,
30
+ }),
31
+ sink,
32
+ },
33
+ });
34
+ process.stdout.write(`assistant: ${result.finalOutput}\n`);
35
+ }
36
+ async function main() {
37
+ // Configure default provider from MISTRAL_API_KEY.
38
+ (0, index_1.setupMistral)();
39
+ const getFinanceReport = (0, index_1.tool)({
40
+ name: "get_finance_report",
41
+ description: "Return summary fields for a finance report.",
42
+ parameters: zod_1.z.object({
43
+ reportId: zod_1.z.string(),
44
+ }),
45
+ execute: async ({ reportId }) => ({
46
+ reportId,
47
+ revenue: 1240000,
48
+ costs: 820000,
49
+ margin: 420000,
50
+ currency: "EUR",
51
+ }),
52
+ });
53
+ const agent = new index_1.Agent({
54
+ name: "Finance Analyst Agent",
55
+ model: "mistral-small-latest",
56
+ instructions: "If asked about a finance report, call get_finance_report first, then provide a short business summary.",
57
+ tools: [getFinanceReport],
58
+ });
59
+ const toolPolicy = ({ runContext }) => {
60
+ if (!runContext.context.actor.groups.includes("finance")) {
61
+ return (0, index_1.deny)("deny_missing_finance_group", {
62
+ denyMode: "tool_result",
63
+ publicReason: "You are not authorized to access finance reports.",
64
+ policyVersion: "finance-policy.v1",
65
+ });
66
+ }
67
+ return (0, index_1.allow)("allow_finance_group_access", {
68
+ policyVersion: "finance-policy.v1",
69
+ });
70
+ };
71
+ const records = [];
72
+ const sink = {
73
+ write: (record) => {
74
+ records.push(record);
75
+ process.stdout.write(`[sink] runId=${record.runId} status=${record.status} decisions=${record.policyDecisions.length}\n`);
76
+ },
77
+ };
78
+ await runScenario("actor in finance", agent, {
79
+ userId: "u-finance",
80
+ groups: ["finance"],
81
+ email: "alice.finance@example.com",
82
+ }, toolPolicy, sink);
83
+ await runScenario("actor in sales", agent, {
84
+ userId: "u-sales",
85
+ groups: ["sales"],
86
+ email: "bob.sales@example.com",
87
+ }, toolPolicy, sink);
88
+ process.stdout.write(`\n=== Persisted records (${records.length}) ===\n`);
89
+ for (const record of records) {
90
+ const lastDecision = record.policyDecisions[record.policyDecisions.length - 1];
91
+ process.stdout.write([
92
+ `runId: ${record.runId}`,
93
+ `scenario: ${String(record.metadata?.scenario ?? "")}`,
94
+ `contextRedacted: ${String(record.contextRedacted ?? false)}`,
95
+ `policyDecision: ${lastDecision?.decision ?? "n/a"} (${lastDecision?.reason ?? "n/a"})`,
96
+ `toolResultEnvelope: ${JSON.stringify(findLastToolResultEnvelope(record))}`,
97
+ ].join("\n") + "\n\n");
98
+ }
99
+ }
100
+ main().catch((error) => {
101
+ process.stderr.write(`${String(error)}\n`);
102
+ process.exit(1);
103
+ });
@@ -0,0 +1,2 @@
1
+ import "dotenv/config";
2
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/examples/basic/tools.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("dotenv/config");
4
+ const zod_1 = require("zod");
5
+ const index_1 = require("../../index");
6
+ async function runScenario(label, agent, toolPolicy, logger, actor) {
7
+ process.stdout.write(`\n=== Scenario: ${label} (groups: ${actor.groups.join(", ")}) ===\n`);
8
+ const stream = await (0, index_1.run)(agent, "Give me a concise summary for report Q1-2026.", {
9
+ stream: true,
10
+ context: { actor },
11
+ policies: { toolPolicy },
12
+ logger,
13
+ maxTurns: 6,
14
+ });
15
+ for await (const event of stream.toStream()) {
16
+ if (event.type === "run_item_stream_event" &&
17
+ event.item.type === "tool_call_item") {
18
+ process.stdout.write(`\n[tool call] ${event.item.name} ${JSON.stringify(event.item.arguments)}\n`);
19
+ }
20
+ if (event.type === "run_item_stream_event" &&
21
+ event.item.type === "tool_call_output_item") {
22
+ process.stdout.write(`[tool result] ${JSON.stringify(event.item.output)}\n\n`);
23
+ }
24
+ if (event.type === "raw_model_stream_event") {
25
+ process.stdout.write(event.data.delta ?? "");
26
+ }
27
+ }
28
+ process.stdout.write(`\n\nCompleted. Last agent: ${stream.lastAgent.name}. History items: ${stream.history.length}\n`);
29
+ }
30
+ async function main() {
31
+ // Minimal provider setup from env (MISTRAL_API_KEY).
32
+ (0, index_1.setupMistral)();
33
+ // One tool: read a finance report by id.
34
+ const getFinanceReport = (0, index_1.tool)({
35
+ name: "get_finance_report",
36
+ description: "Return summary fields for a finance report.",
37
+ parameters: zod_1.z.object({
38
+ reportId: zod_1.z.string(),
39
+ }),
40
+ execute: async ({ reportId }) => {
41
+ return {
42
+ reportId,
43
+ revenue: 1240000,
44
+ costs: 820000,
45
+ margin: 420000,
46
+ currency: "EUR",
47
+ };
48
+ },
49
+ });
50
+ const agent = new index_1.Agent({
51
+ name: "Finance Analyst Agent",
52
+ model: "mistral-small-latest",
53
+ instructions: "If asked about a finance report, call get_finance_report first, then provide a short business summary.",
54
+ tools: [getFinanceReport],
55
+ });
56
+ // Policy gate: the tool is allowed only to users in 'finance' group.
57
+ const toolPolicy = ({ runContext }) => {
58
+ const hasFinanceAccess = runContext.context.actor.groups.includes("finance");
59
+ if (!hasFinanceAccess) {
60
+ return (0, index_1.deny)("deny_missing_finance_group", {
61
+ denyMode: "tool_result",
62
+ publicReason: "You are not authorized to access finance reports.",
63
+ });
64
+ }
65
+ return (0, index_1.allow)("allow_finance_group_access");
66
+ };
67
+ // Optional logger: prints only the policy decision event to keep output readable.
68
+ const logger = (0, index_1.createStdoutLogger)({
69
+ pretty: true,
70
+ events: ["tool_policy_evaluated"],
71
+ });
72
+ await runScenario("actor in finance", agent, toolPolicy, logger, {
73
+ userId: "u-finance",
74
+ groups: ["finance"],
75
+ });
76
+ await runScenario("actor in sales", agent, toolPolicy, logger, {
77
+ userId: "u-sales",
78
+ groups: ["sales"],
79
+ });
80
+ }
81
+ main().catch((error) => {
82
+ process.stderr.write(`${String(error)}\n`);
83
+ process.exit(1);
84
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=guardrail-smoke.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guardrail-smoke.d.ts","sourceRoot":"","sources":["../../src/examples/guardrail-smoke.ts"],"names":[],"mappings":""}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const index_1 = require("../index");
8
+ class ScriptedProvider {
9
+ events;
10
+ constructor(events) {
11
+ this.events = events;
12
+ }
13
+ async *stream(_request) {
14
+ void _request;
15
+ for (const event of this.events) {
16
+ yield event;
17
+ }
18
+ }
19
+ }
20
+ const outputGuardrail = (0, index_1.defineOutputGuardrail)({
21
+ name: "block_unsafe_output",
22
+ execute: ({ outputText }) => ({
23
+ tripwireTriggered: outputText.toLowerCase().includes("unsafe"),
24
+ reason: "Output contains forbidden token 'unsafe'.",
25
+ metadata: {
26
+ matched: "unsafe",
27
+ },
28
+ }),
29
+ });
30
+ function getRawOutput(events) {
31
+ return events
32
+ .filter((event) => event.type === "raw_model_stream_event")
33
+ .map((event) => event.data.delta ?? "")
34
+ .join("");
35
+ }
36
+ function getMessageOutput(events) {
37
+ const itemEvent = events.find((event) => event.type === "run_item_stream_event" &&
38
+ event.item.type === "message_output_item");
39
+ if (!itemEvent) {
40
+ return null;
41
+ }
42
+ return itemEvent.item.type === "message_output_item"
43
+ ? itemEvent.item.content
44
+ : null;
45
+ }
46
+ function isAssistantMessage(item) {
47
+ return item.type === "message" && item.role === "assistant";
48
+ }
49
+ async function runPassingCase() {
50
+ (0, index_1.setDefaultProvider)(new ScriptedProvider([
51
+ { type: "delta", delta: "Safe " },
52
+ { type: "delta", delta: "answer." },
53
+ { type: "completed", message: "Safe answer." },
54
+ ]));
55
+ const agent = new index_1.Agent({
56
+ name: "Guardrail pass",
57
+ model: "fake-model",
58
+ outputGuardrails: [outputGuardrail],
59
+ });
60
+ const streamed = await (0, index_1.run)(agent, "hello", { stream: true });
61
+ const events = [];
62
+ for await (const event of streamed.toStream()) {
63
+ events.push(event);
64
+ }
65
+ strict_1.default.equal(getRawOutput(events), "Safe answer.");
66
+ strict_1.default.equal(getMessageOutput(events), "Safe answer.");
67
+ const assistantMessages = streamed.history.filter(isAssistantMessage);
68
+ strict_1.default.equal(assistantMessages.length, 1);
69
+ strict_1.default.equal(assistantMessages[0]?.content, "Safe answer.");
70
+ }
71
+ async function runTripwireCase() {
72
+ (0, index_1.setDefaultProvider)(new ScriptedProvider([
73
+ { type: "delta", delta: "unsafe answer" },
74
+ { type: "completed", message: "unsafe answer" },
75
+ ]));
76
+ const agent = new index_1.Agent({
77
+ name: "Guardrail fail",
78
+ model: "fake-model",
79
+ outputGuardrails: [outputGuardrail],
80
+ });
81
+ const streamed = await (0, index_1.run)(agent, "hello", { stream: true });
82
+ const events = [];
83
+ let capturedError = null;
84
+ try {
85
+ for await (const event of streamed.toStream()) {
86
+ events.push(event);
87
+ }
88
+ }
89
+ catch (error) {
90
+ capturedError = error;
91
+ }
92
+ strict_1.default.ok(capturedError instanceof index_1.OutputGuardrailTripwireTriggered);
93
+ strict_1.default.equal(capturedError.result.guardrail, "block_unsafe_output");
94
+ strict_1.default.equal(capturedError.result.output.tripwireTriggered, true);
95
+ strict_1.default.equal(capturedError.result.outputText, "unsafe answer");
96
+ strict_1.default.equal(getRawOutput(events), "");
97
+ strict_1.default.equal(getMessageOutput(events), null);
98
+ const assistantMessages = streamed.history.filter(isAssistantMessage);
99
+ strict_1.default.equal(assistantMessages.length, 0);
100
+ }
101
+ async function main() {
102
+ await runPassingCase();
103
+ await runTripwireCase();
104
+ process.stdout.write("Guardrail smoke passed.\n");
105
+ }
106
+ main().catch((error) => {
107
+ const message = error instanceof Error ? `${error.name}: ${error.message}` : String(error);
108
+ process.stderr.write(`${message}\n`);
109
+ process.exit(1);
110
+ });
@@ -0,0 +1,2 @@
1
+ import "dotenv/config";
2
+ //# sourceMappingURL=hello-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hello-run.d.ts","sourceRoot":"","sources":["../../src/examples/hello-run.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC"}