@axiastudio/aioc 0.2.6 → 0.2.8

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
@@ -23,7 +23,7 @@ Its core job is to make agent execution boundaries explicit, testable, auditable
23
23
 
24
24
  ## Release Status
25
25
 
26
- Current stable release: `0.2.5`.
26
+ Current stable release: `0.2.8`.
27
27
  The stable line started with `0.1.0`.
28
28
  The core runtime surface is compatibility-managed. Breaking changes to the stable surface should ship only with explicit migration guidance and release notes.
29
29
 
@@ -40,16 +40,26 @@ AIOC `0.2.3` adds RFC-0010 policy composition helpers for exact-name tool and ha
40
40
  AIOC `0.2.4` adds experimental governance-event packages and an OpenTelemetry Logs exporter for reduced, operational observability events derived from `RunRecord` values.
41
41
  AIOC `0.2.5` makes replay history-faithful by recording the initial input scope in `RunRecord` and replaying from it by default.
42
42
  AIOC `0.2.6` adds descriptor-level conditional agent handoffs with boolean `where` gates that filter handoff tools before provider requests.
43
+ AIOC `0.2.7` adds run-regression suite utilities and the experimental
44
+ `@axiastudio/aioc-regression-judge` companion package for bounded LLM judge
45
+ inputs and structured judge results.
46
+ AIOC `0.2.8` fixes replay agent cloning so strict and hybrid replay preserve
47
+ conditional handoff rules and expose enabled `handoff_to_*` tools.
43
48
 
44
49
  ### Experimental Packages
45
50
 
51
+ `@axiastudio/aioc-regression-judge` implements the RFC-0012 companion judge
52
+ helpers outside the core runtime package. It builds bounded judge inputs for
53
+ run-regression suites and parses structured `RunJudgeResult` outputs while the
54
+ host application owns the model invocation.
55
+
46
56
  `@axiastudio/aioc-governance-events` implements the RFC-0009 governance-event
47
57
  mapper outside the core runtime package. It derives reduced, redacted,
48
58
  event-shaped records from `RunRecord` values.
49
59
 
50
60
  `@axiastudio/aioc-export-otel` maps those governance events to OpenTelemetry
51
- Logs. Both packages remain experimental while real exporter usage validates the
52
- schema and operational shape.
61
+ Logs. These packages remain experimental while real usage validates their
62
+ schemas and operational shape.
53
63
 
54
64
  - Release notes: `CHANGELOG.md`
55
65
  - Historical beta contract snapshot: `docs/BETA-CONTRACT.md`
@@ -152,9 +162,18 @@ The Agent Harness Descriptor is included in the supported `0.2.x` API surface as
152
162
  ## Policy Gate (Minimal)
153
163
 
154
164
  ```ts
155
- import { Agent, allow, deny, run, tool, type ToolPolicy } from "@axiastudio/aioc";
156
-
157
- const toolPolicy: ToolPolicy<{ actor: { groups: string[] } }> = ({ runContext }) => {
165
+ import {
166
+ Agent,
167
+ allow,
168
+ deny,
169
+ run,
170
+ tool,
171
+ type ToolPolicy,
172
+ } from "@axiastudio/aioc";
173
+
174
+ const toolPolicy: ToolPolicy<{ actor: { groups: string[] } }> = ({
175
+ runContext,
176
+ }) => {
158
177
  if (!runContext.context.actor.groups.includes("finance")) {
159
178
  return deny("deny_missing_finance_group", {
160
179
  resultMode: "tool_result",
@@ -216,7 +235,13 @@ console.log(calls[0]?.name, calls[0]?.argsHash, calls[0]?.hasOutput);
216
235
  import { compareRunRecords } from "@axiastudio/aioc";
217
236
 
218
237
  const comparison = compareRunRecords(runRecordA, runRecordB, {
219
- includeSections: ["response", "toolCalls", "policy", "guardrails", "metadata"],
238
+ includeSections: [
239
+ "response",
240
+ "toolCalls",
241
+ "policy",
242
+ "guardrails",
243
+ "metadata",
244
+ ],
220
245
  responseMatchMode: "exact",
221
246
  });
222
247
 
@@ -246,6 +271,9 @@ console.log(replay.replayStats);
246
271
  ```
247
272
 
248
273
  `replayFromRunRecord(...)` does not bypass policy enforcement: in `strict` and `hybrid`, provide `runOptions.policies` when tool/handoff execution must be authorized.
274
+ Strict and hybrid replay preserve conditional handoff rules from the source
275
+ agent, so enabled handoffs remain visible to the provider as `handoff_to_*`
276
+ tools during replay.
249
277
 
250
278
  ## Reference UI Example
251
279
 
@@ -266,34 +294,52 @@ This repository also contains `aioc-inspect`, a private reference example UI for
266
294
 
267
295
  Suggested reading path: start with `example:hello`, then policy, approval,
268
296
  tool-policy, and policy-composition. Use run-record and harness examples after
269
- the basics; `example:non-regression` and `example:run-regression` are advanced
270
- workflows.
271
-
272
- | Command | Purpose | Needs API key |
273
- |---|---|---|
274
- | `npm run example:hello` | Minimal single-agent run | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
275
- | `npm run example:policy` | Minimal denied tool + policy flow | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
276
- | `npm run example:approval-required` | Minimal approval-required tool + policy flow | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
277
- | `npm run example:approval-evidence` | Approval evidence passed through context and reevaluated by policy | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
278
- | `npm run example:tool-policy` | Straight tool + policy flow with allowed execution | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
279
- | `npm run example:policy-composition` | Exact-name tool policy dispatch with fallback deny | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
280
- | `npm run example:harness-rerun` | Replay against a modified harness with a mocked new tool output | Yes (`OPENAI_API_KEY`) |
281
- | `npm run example:run-record` | Run-record persistence with redaction + audit | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
282
- | `npm run example:rru:01-extract` | Minimal `extractToolCalls(...)` | No |
283
- | `npm run example:rru:02-compare` | Minimal `compareRunRecords(...)` | No |
284
- | `npm run example:rru:03-replay-strict` | Minimal strict replay | No |
285
- | `npm run example:rru:04-replay-hybrid` | Minimal hybrid replay | No |
286
- | `npm run example:non-regression` | Advanced v1/v2 run-record diff | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
287
- | `npm run example:run-regression` | Local `runRegressionSuite(...)` over a modified harness | Yes (`OPENAI_API_KEY`) |
297
+ the basics; `example:non-regression`, `example:run-regression`, and
298
+ `example:run-regression-judge` are advanced workflows.
299
+
300
+ | Command | Purpose | Needs API key |
301
+ | -------------------------------------- | ------------------------------------------------------------------ | --------------------------------------------------------- |
302
+ | `npm run example:hello` | Minimal single-agent run | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
303
+ | `npm run example:policy` | Minimal denied tool + policy flow | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
304
+ | `npm run example:approval-required` | Minimal approval-required tool + policy flow | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
305
+ | `npm run example:approval-evidence` | Approval evidence passed through context and reevaluated by policy | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
306
+ | `npm run example:tool-policy` | Straight tool + policy flow with allowed execution | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
307
+ | `npm run example:policy-composition` | Exact-name tool policy dispatch with fallback deny | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
308
+ | `npm run example:harness-rerun` | Replay against a modified harness with a mocked new tool output | Yes (`OPENAI_API_KEY`) |
309
+ | `npm run example:run-record` | Run-record persistence with redaction + audit | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
310
+ | `npm run example:rru:01-extract` | Minimal `extractToolCalls(...)` | No |
311
+ | `npm run example:rru:02-compare` | Minimal `compareRunRecords(...)` | No |
312
+ | `npm run example:rru:03-replay-strict` | Minimal strict replay | No |
313
+ | `npm run example:rru:04-replay-hybrid` | Minimal hybrid replay | No |
314
+ | `npm run example:non-regression` | Advanced v1/v2 run-record diff | Yes (`AIOC_EXAMPLE_PROVIDER` + matching provider API key) |
315
+ | `npm run example:run-regression` | Local `runRegressionSuite(...)` over a modified harness | Yes (`OPENAI_API_KEY`) |
316
+ | `npm run example:run-regression-judge` | Local `runRegressionSuite(...)` with an LLM judge | Yes (`OPENAI_API_KEY`) |
288
317
 
289
318
  Notes:
290
319
 
291
320
  - for live-provider examples, set `AIOC_EXAMPLE_PROVIDER` to `openai` or `mistral`; the matching API key must also be available
292
- - `example:harness-rerun` and `example:run-regression` configure OpenAI directly from `OPENAI_API_KEY`; the model is declared in the YAML descriptor
321
+ - `example:harness-rerun`, `example:run-regression`, and `example:run-regression-judge` configure OpenAI directly from `OPENAI_API_KEY`; harness models are declared in YAML descriptors
293
322
  - run-record utility examples are deterministic and do not need a provider
294
323
  - `example:non-regression` is educational and can be non-deterministic because it uses a live provider.
295
324
  - canonical examples guide: `docs/CANONICAL-EXAMPLES.md`.
296
325
 
326
+ ### Optional LangChain Examples
327
+
328
+ Optional LangChain interoperability examples live in `examples/langchain`.
329
+ They use their own `package.json` so LangChain dependencies do not become
330
+ dependencies of the core `@axiastudio/aioc` runtime package.
331
+
332
+ They demonstrate three composition patterns:
333
+
334
+ - **aioc-first, LangChain-extended**: aioc owns the governed agent run while
335
+ LangChain provides OSS components behind aioc tools, such as retrieval.
336
+ - **LangGraph-orchestrated, aioc-governed**: LangGraph owns workflow
337
+ orchestration while selected graph nodes call aioc for policy-gated execution
338
+ and portable audit evidence.
339
+ - **LangGraph-orchestrated, aioc-recorded**: LangGraph remains the primary
340
+ orchestrator while a local RFC-0013 prototype emits a graph-level
341
+ `RunRecord` around the compiled graph.
342
+
297
343
  ## Test Commands
298
344
 
299
345
  - `npm run test:unit`
@@ -325,6 +371,7 @@ AIOC adopts the following non-negotiable principles:
325
371
  - `docs/RFC-0009-governance-events-and-exporters.md` (`Experimental`)
326
372
  - `docs/RFC-0010-policy-composition-helpers.md` (`Accepted`)
327
373
  - `docs/RFC-0011-agent-harness-descriptor.md` (`Accepted`)
374
+ - `docs/RFC-0012-run-regression-suites-and-llm-judging.md` (`Accepted`)
328
375
  - `docs/PRIVACY-BASELINE.md`
329
376
 
330
377
  ## Historical Snapshots
@@ -1 +1 @@
1
- {"version":3,"file":"run-record-utils.d.ts","sourceRoot":"","sources":["../src/run-record-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-record-utils.d.ts","sourceRoot":"","sources":["../src/run-record-utils.ts"],"names":[],"mappings":"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"}
@@ -424,9 +424,21 @@ function cloneAgentWithReplayedTools(sourceAgent, mode, queues, replayStats, onM
424
424
  },
425
425
  };
426
426
  });
427
- const wrappedHandoffs = sourceAgent.handoffs.map((handoffAgent) => cloneAgentWithReplayedTools(handoffAgent, mode, queues, replayStats, onMissingToolCall, cache));
427
+ const wrappedHandoffRules = sourceAgent.handoffRules.map((handoffRule) => {
428
+ const clonedHandoffAgent = cloneAgentWithReplayedTools(handoffRule.agent, mode, queues, replayStats, onMissingToolCall, cache);
429
+ if (handoffRule.enabled) {
430
+ return {
431
+ agent: clonedHandoffAgent,
432
+ enabled: handoffRule.enabled,
433
+ };
434
+ }
435
+ return {
436
+ agent: clonedHandoffAgent,
437
+ };
438
+ });
428
439
  cloned.tools = wrappedTools;
429
- cloned.handoffs = wrappedHandoffs;
440
+ cloned.handoffRules = wrappedHandoffRules;
441
+ cloned.handoffs = wrappedHandoffRules.map((rule) => rule.agent);
430
442
  return cloned;
431
443
  }
432
444
  async function resolveReplayAgent(input) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axiastudio/aioc",
3
- "version": "0.2.6",
3
+ "version": "0.2.8",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "files": [
@@ -14,41 +14,46 @@
14
14
  "clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
15
15
  "build": "tsc -p tsconfig.json",
16
16
  "build:package": "npm run clean && tsc -p tsconfig.build.json",
17
+ "examples:check": "tsc -p tsconfig.examples.json --noEmit",
17
18
  "lint": "eslint ./src --ext .ts",
18
19
  "test:unit": "npm run build && node dist/tests/unit/index.js",
19
20
  "test:integration": "npm run build && node dist/tests/integration/index.js",
20
21
  "test:regression": "npm run build && node dist/tests/regression/index.js",
21
22
  "test:ci": "npm run lint && npm run build && node dist/tests/unit/index.js && node dist/tests/integration/index.js && node dist/tests/regression/index.js",
22
23
  "test:ci:stability": "npm run test:ci && npm run test:ci",
23
- "example:hello": "tsx src/examples/basic/hello-world.ts",
24
- "example:policy": "tsx src/examples/basic/policy.ts",
25
- "example:approval-required": "tsx src/examples/basic/approval-required.ts",
26
- "example:approval-evidence": "tsx src/examples/basic/approval-evidence.ts",
27
- "example:tool-policy": "tsx src/examples/basic/tools.ts",
28
- "example:policy-composition": "tsx src/examples/basic/policy-composition.ts",
29
- "example:harness": "tsx src/examples/harness-descriptor/customer-support.ts",
30
- "example:harness-rerun": "tsx src/examples/harness-descriptor/rerun-modified-harness.ts",
31
- "example:run-record": "tsx src/examples/basic/run-record-sink.ts",
32
- "example:rru:01-extract": "tsx src/examples/run-record-utils-minimal/01-extract-tool-calls.ts",
33
- "example:rru:02-compare": "tsx src/examples/run-record-utils-minimal/02-compare-run-records.ts",
34
- "example:rru:03-replay-strict": "tsx src/examples/run-record-utils-minimal/03-replay-strict.ts",
35
- "example:rru:04-replay-hybrid": "tsx src/examples/run-record-utils-minimal/04-replay-hybrid.ts",
36
- "example:non-regression": "tsx src/examples/non-regression/v1-v2-runrecord-diff.ts",
37
- "example:run-regression": "tsx src/examples/run-regression/age-adapted-suite.ts",
24
+ "example:hello": "tsx examples/core/basic/hello-world.ts",
25
+ "example:policy": "tsx examples/core/basic/policy.ts",
26
+ "example:approval-required": "tsx examples/core/basic/approval-required.ts",
27
+ "example:approval-evidence": "tsx examples/core/basic/approval-evidence.ts",
28
+ "example:tool-policy": "tsx examples/core/basic/tools.ts",
29
+ "example:policy-composition": "tsx examples/core/basic/policy-composition.ts",
30
+ "example:harness": "tsx examples/core/harness-descriptor/customer-support.ts",
31
+ "example:harness-rerun": "tsx examples/core/harness-descriptor/rerun-modified-harness.ts",
32
+ "example:run-record": "tsx examples/core/basic/run-record-sink.ts",
33
+ "example:rru:01-extract": "tsx examples/core/run-record-utils-minimal/01-extract-tool-calls.ts",
34
+ "example:rru:02-compare": "tsx examples/core/run-record-utils-minimal/02-compare-run-records.ts",
35
+ "example:rru:03-replay-strict": "tsx examples/core/run-record-utils-minimal/03-replay-strict.ts",
36
+ "example:rru:04-replay-hybrid": "tsx examples/core/run-record-utils-minimal/04-replay-hybrid.ts",
37
+ "example:non-regression": "tsx examples/core/non-regression/v1-v2-runrecord-diff.ts",
38
+ "example:run-regression": "tsx examples/core/run-regression/age-adapted-suite.ts",
39
+ "example:run-regression-judge": "npm run regression-judge:build && tsx packages/aioc-regression-judge/examples/age-adapted-suite-with-judge.ts",
40
+ "example:self-harness": "npm run regression-judge:build && tsx examples/self-harness/phase-1.ts",
38
41
  "inspect:samples": "tsx scripts/generate-aioc-inspect-samples.ts",
39
42
  "docs:sync": "node scripts/sync-aioc-docs.mjs",
40
43
  "docs:dev": "npm run docs:sync && cd apps/aioc-docs && zsh -lc 'npm run dev'",
41
44
  "docs:build": "npm run docs:sync && cd apps/aioc-docs && zsh -lc 'npm run build'",
42
45
  "docs:preview": "cd apps/aioc-docs && zsh -lc 'npm run preview'",
43
- "packages:build": "npm run governance-events:build && npm run build -w @axiastudio/aioc-export-otel && npm run build -w @axiastudio/aioc-inspect-ui",
44
- "packages:test": "npm run governance-events:test && npm run export-otel:test",
46
+ "packages:build": "npm run governance-events:build && npm run regression-judge:build && npm run build -w @axiastudio/aioc-export-otel && npm run build -w @axiastudio/aioc-inspect-ui",
47
+ "packages:test": "npm run governance-events:test && npm run export-otel:test && npm run regression-judge:test",
45
48
  "governance-events:build": "npm run build && npm run build -w @axiastudio/aioc-governance-events",
46
49
  "governance-events:test": "npm run build && npm test -w @axiastudio/aioc-governance-events",
50
+ "regression-judge:build": "npm run build && npm run build -w @axiastudio/aioc-regression-judge",
51
+ "regression-judge:test": "npm run build && npm test -w @axiastudio/aioc-regression-judge",
47
52
  "export-otel:build": "npm run governance-events:build && npm run build -w @axiastudio/aioc-export-otel",
48
53
  "export-otel:test": "npm run governance-events:build && npm test -w @axiastudio/aioc-export-otel",
49
54
  "export-otel:console": "npm run governance-events:build && npm run console -w @axiastudio/aioc-export-otel",
50
55
  "export-otel:signoz": "npm run governance-events:build && npm run signoz -w @axiastudio/aioc-export-otel",
51
- "test:mistral": "tsx src/examples/mistral-smoke.ts",
56
+ "test:mistral": "tsx examples/core/mistral-smoke.ts",
52
57
  "prepack": "npm run build:package"
53
58
  },
54
59
  "keywords": [