@axiastudio/aioc 0.2.11 → 0.2.12

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.11`.
26
+ Current stable release: `0.2.12`.
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
 
@@ -52,6 +52,9 @@ AIOC `0.2.10` hardens tool authorization around schema-normalized RFC 8785 JSON
52
52
  snapshots and adds opt-in Chat Completions `response_format` forwarding.
53
53
  AIOC `0.2.11` fixes Chat Completions `reasoning_effort` forwarding from agent
54
54
  model settings, including YAML descriptors.
55
+ AIOC `0.2.12` processes tools before the first requested handoff, without
56
+ fallback, and adds optional agent execution evidence to `RunRecord`.
57
+ See the `0.2.12` migration notes in `CHANGELOG.md` for the handoff behavior change.
55
58
 
56
59
  ### Experimental Packages
57
60
 
@@ -161,6 +164,10 @@ console.log(result.finalOutput);
161
164
  - thread history utilities `toThreadHistory(...)`, `appendUserMessage(...)`, `replaceThreadHistory(...)`, `applyRunResultHistory(...)`
162
165
  - JSON helper `toJsonValue(...)`
163
166
 
167
+ Within each model response, ordinary tools run before the first requested
168
+ handoff. Later handoffs are ignored, not used as authorization fallbacks. See
169
+ [runtime execution order](https://axiastudio.github.io/aioc/reference/run/#tool-and-handoff-order).
170
+
164
171
  ## Agent Harness Descriptor
165
172
 
166
173
  - `buildAgentHarness(...)`
@@ -231,6 +238,11 @@ Privacy notes:
231
238
  - `contextSnapshot` captures the initial run context, not final mutable app state.
232
239
  - sink adapters should implement encryption, access controls, retention, and deletion.
233
240
 
241
+ Optional `initialAgentName`, `executionRecordingStatus`, and handoff decision
242
+ `handoffApplied` fields support reconstructing agent visits without treating
243
+ authorization as proof of a transition. `agentName` remains the final agent.
244
+ See [Agent Execution](https://axiastudio.github.io/aioc/run-records/#agent-execution).
245
+
234
246
  ## RunRecord Utilities (Minimal)
235
247
 
236
248
  ### `extractToolCalls(...)`
@@ -16,6 +16,8 @@ export interface PolicyDecisionRecord {
16
16
  resultMode?: "throw" | "tool_result";
17
17
  policyVersion?: string;
18
18
  resource: PolicyResourceSnapshot;
19
+ /** Handoff application evidence, not a policy outcome. Absent means unknown. */
20
+ handoffApplied?: boolean;
19
21
  expiresAt?: string;
20
22
  metadata?: Record<string, unknown>;
21
23
  }
@@ -89,6 +91,9 @@ export interface RunRecord<TContext = unknown> {
89
91
  completedAt: string;
90
92
  status: RunRecordStatus;
91
93
  agentName: string;
94
+ initialAgentName?: string;
95
+ /** Completeness of agent execution evidence, independent of run success. */
96
+ executionRecordingStatus?: "complete" | "partial";
92
97
  providerName?: string;
93
98
  model?: string;
94
99
  question: string;
@@ -1 +1 @@
1
- {"version":3,"file":"run-record.d.ts","sourceRoot":"","sources":["../src/run-record.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-record.d.ts","sourceRoot":"","sources":["../src/run-record.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { GuardrailDecisionRecord, PolicyDecisionRecord, PromptSnapshotRecord, RequestFingerprintRecord, RunRecordOptions, SuspendedProposal } from "./run-record";
2
2
  import type { AgentInputItem } from "./types";
3
- export type PendingPolicyDecisionRecord = Omit<PolicyDecisionRecord, "timestamp">;
3
+ export type PendingPolicyDecisionRecord = Omit<PolicyDecisionRecord, "timestamp" | "handoffApplied">;
4
4
  export type PendingGuardrailDecisionRecord = Omit<GuardrailDecisionRecord, "timestamp">;
5
5
  export type PendingPromptSnapshotRecord = Omit<PromptSnapshotRecord, "timestamp" | "promptHash" | "promptText"> & {
6
6
  promptText?: string;
@@ -18,6 +18,7 @@ export type PendingRequestFingerprintRecord = Omit<RequestFingerprintRecord, "ti
18
18
  interface RunRecorderCreateOptions<TContext> {
19
19
  input: string | AgentInputItem[];
20
20
  inputItemCount: number;
21
+ initialAgentName: string;
21
22
  context: TContext;
22
23
  providerName: string;
23
24
  recordOptions?: RunRecordOptions<TContext>;
@@ -33,6 +34,7 @@ export declare class RunRecorder<TContext = unknown> {
33
34
  private readonly startedAt;
34
35
  private readonly question;
35
36
  private readonly inputItemCount;
37
+ private readonly initialAgentName;
36
38
  private readonly providerName;
37
39
  private readonly metadata?;
38
40
  private readonly contextSnapshot;
@@ -44,10 +46,13 @@ export declare class RunRecorder<TContext = unknown> {
44
46
  private readonly requestFingerprints;
45
47
  private observedFinalOutput;
46
48
  private runRecordWritten;
49
+ private executionRecordingStatus;
47
50
  private constructor();
48
51
  static create<TContext = unknown>(options: RunRecorderCreateOptions<TContext>): Promise<RunRecorder<TContext>>;
49
52
  get runId(): string;
53
+ private captureExecutionEvidence;
50
54
  onPolicyDecision: (decision: PendingPolicyDecisionRecord) => void;
55
+ onHandoffApplied: (turn: number, callId: string) => void;
51
56
  onSuspendedProposal: (proposal: SuspendedProposal) => void;
52
57
  onGuardrailDecision: (decision: PendingGuardrailDecisionRecord) => void;
53
58
  onPromptSnapshot: (snapshot: PendingPromptSnapshotRecord) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"run-recorder-runtime.d.ts","sourceRoot":"","sources":["../src/run-recorder-runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-recorder-runtime.d.ts","sourceRoot":"","sources":["../src/run-recorder-runtime.ts"],"names":[],"mappings":"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"}
@@ -108,6 +108,7 @@ class RunRecorder {
108
108
  startedAt;
109
109
  question;
110
110
  inputItemCount;
111
+ initialAgentName;
111
112
  providerName;
112
113
  metadata;
113
114
  contextSnapshot;
@@ -119,12 +120,14 @@ class RunRecorder {
119
120
  requestFingerprints = [];
120
121
  observedFinalOutput = "";
121
122
  runRecordWritten = false;
122
- constructor(runRecordWriter, runRecordId, startedAt, question, inputItemCount, providerName, metadata, contextSnapshot, includePromptText) {
123
+ executionRecordingStatus = "complete";
124
+ constructor(runRecordWriter, runRecordId, startedAt, question, inputItemCount, initialAgentName, providerName, metadata, contextSnapshot, includePromptText) {
123
125
  this.runRecordWriter = runRecordWriter;
124
126
  this.runRecordId = runRecordId;
125
127
  this.startedAt = startedAt;
126
128
  this.question = question;
127
129
  this.inputItemCount = inputItemCount;
130
+ this.initialAgentName = initialAgentName;
128
131
  this.providerName = providerName;
129
132
  this.metadata = metadata;
130
133
  this.contextSnapshot = contextSnapshot;
@@ -136,15 +139,41 @@ class RunRecorder {
136
139
  const startedAt = new Date().toISOString();
137
140
  const question = extractQuestion(options.input);
138
141
  const contextSnapshot = await resolveContextSnapshot(options.context, options.recordOptions);
139
- return new RunRecorder(runRecordWriter, runRecordId, startedAt, question, options.inputItemCount, options.providerName, options.recordOptions?.metadata, contextSnapshot, options.recordOptions?.includePromptText ?? false);
142
+ return new RunRecorder(runRecordWriter, runRecordId, startedAt, question, options.inputItemCount, options.initialAgentName, options.providerName, options.recordOptions?.metadata, contextSnapshot, options.recordOptions?.includePromptText ?? false);
140
143
  }
141
144
  get runId() {
142
145
  return this.runRecordId;
143
146
  }
147
+ captureExecutionEvidence(capture) {
148
+ try {
149
+ capture();
150
+ }
151
+ catch {
152
+ this.executionRecordingStatus = "partial";
153
+ }
154
+ }
144
155
  onPolicyDecision = (decision) => {
145
- this.policyDecisions.push({
146
- timestamp: new Date().toISOString(),
147
- ...decision,
156
+ this.captureExecutionEvidence(() => {
157
+ this.policyDecisions.push({
158
+ timestamp: new Date().toISOString(),
159
+ ...decision,
160
+ ...(decision.resource.kind === "handoff" &&
161
+ decision.decision !== "allow"
162
+ ? { handoffApplied: false }
163
+ : {}),
164
+ });
165
+ });
166
+ };
167
+ onHandoffApplied = (turn, callId) => {
168
+ this.captureExecutionEvidence(() => {
169
+ const decision = this.policyDecisions.find((entry) => entry.resource.kind === "handoff" &&
170
+ entry.turn === turn &&
171
+ entry.callId === callId);
172
+ if (!decision || decision.decision !== "allow") {
173
+ this.executionRecordingStatus = "partial";
174
+ return;
175
+ }
176
+ decision.handoffApplied = true;
148
177
  });
149
178
  };
150
179
  onSuspendedProposal = (proposal) => {
@@ -157,47 +186,51 @@ class RunRecorder {
157
186
  });
158
187
  };
159
188
  onPromptSnapshot = (snapshot) => {
160
- const normalizedPrompt = snapshot.promptText ?? "";
161
- this.promptSnapshots.push({
162
- timestamp: new Date().toISOString(),
163
- turn: snapshot.turn,
164
- agentName: snapshot.agentName,
165
- model: snapshot.model,
166
- promptVersion: snapshot.promptVersion,
167
- promptHash: hashPrompt(normalizedPrompt),
168
- promptText: this.includePromptText ? normalizedPrompt : undefined,
189
+ this.captureExecutionEvidence(() => {
190
+ const normalizedPrompt = snapshot.promptText ?? "";
191
+ this.promptSnapshots.push({
192
+ timestamp: new Date().toISOString(),
193
+ turn: snapshot.turn,
194
+ agentName: snapshot.agentName,
195
+ model: snapshot.model,
196
+ promptVersion: snapshot.promptVersion,
197
+ promptHash: hashPrompt(normalizedPrompt),
198
+ promptText: this.includePromptText ? normalizedPrompt : undefined,
199
+ });
169
200
  });
170
201
  };
171
202
  onRequestFingerprint = (fingerprint) => {
172
- const normalizedSystemPrompt = fingerprint.systemPrompt ?? "";
173
- const normalizedModelSettings = fingerprint.modelSettings ?? {};
174
- const normalizedTools = fingerprint.tools.map((tool) => ({
175
- name: tool.name,
176
- description: tool.description,
177
- parameters: tool.parameters,
178
- }));
179
- const requestPayload = {
180
- model: fingerprint.model,
181
- systemPrompt: normalizedSystemPrompt,
182
- messages: fingerprint.messages,
183
- tools: normalizedTools,
184
- modelSettings: normalizedModelSettings,
185
- };
186
- this.requestFingerprints.push({
187
- timestamp: new Date().toISOString(),
188
- turn: fingerprint.turn,
189
- agentName: fingerprint.agentName,
190
- providerName: fingerprint.providerName,
191
- model: fingerprint.model,
192
- runtimeVersion: RUNTIME_VERSION,
193
- fingerprintSchemaVersion: REQUEST_FINGERPRINT_SCHEMA_VERSION,
194
- requestHash: (0, canonical_json_1.hashCanonicalJsonValue)(requestPayload),
195
- systemPromptHash: (0, canonical_json_1.hashCanonicalJsonValue)(normalizedSystemPrompt),
196
- messagesHash: (0, canonical_json_1.hashCanonicalJsonValue)(fingerprint.messages),
197
- toolsHash: (0, canonical_json_1.hashCanonicalJsonValue)(normalizedTools),
198
- modelSettingsHash: (0, canonical_json_1.hashCanonicalJsonValue)(normalizedModelSettings),
199
- messageCount: fingerprint.messages.length,
200
- toolCount: normalizedTools.length,
203
+ this.captureExecutionEvidence(() => {
204
+ const normalizedSystemPrompt = fingerprint.systemPrompt ?? "";
205
+ const normalizedModelSettings = fingerprint.modelSettings ?? {};
206
+ const normalizedTools = fingerprint.tools.map((tool) => ({
207
+ name: tool.name,
208
+ description: tool.description,
209
+ parameters: tool.parameters,
210
+ }));
211
+ const requestPayload = {
212
+ model: fingerprint.model,
213
+ systemPrompt: normalizedSystemPrompt,
214
+ messages: fingerprint.messages,
215
+ tools: normalizedTools,
216
+ modelSettings: normalizedModelSettings,
217
+ };
218
+ this.requestFingerprints.push({
219
+ timestamp: new Date().toISOString(),
220
+ turn: fingerprint.turn,
221
+ agentName: fingerprint.agentName,
222
+ providerName: fingerprint.providerName,
223
+ model: fingerprint.model,
224
+ runtimeVersion: RUNTIME_VERSION,
225
+ fingerprintSchemaVersion: REQUEST_FINGERPRINT_SCHEMA_VERSION,
226
+ requestHash: (0, canonical_json_1.hashCanonicalJsonValue)(requestPayload),
227
+ systemPromptHash: (0, canonical_json_1.hashCanonicalJsonValue)(normalizedSystemPrompt),
228
+ messagesHash: (0, canonical_json_1.hashCanonicalJsonValue)(fingerprint.messages),
229
+ toolsHash: (0, canonical_json_1.hashCanonicalJsonValue)(normalizedTools),
230
+ modelSettingsHash: (0, canonical_json_1.hashCanonicalJsonValue)(normalizedModelSettings),
231
+ messageCount: fingerprint.messages.length,
232
+ toolCount: normalizedTools.length,
233
+ });
201
234
  });
202
235
  };
203
236
  onMessageOutput = (content) => {
@@ -221,6 +254,8 @@ class RunRecorder {
221
254
  completedAt: new Date().toISOString(),
222
255
  status,
223
256
  agentName: options.agentName,
257
+ initialAgentName: this.initialAgentName,
258
+ executionRecordingStatus: this.executionRecordingStatus,
224
259
  providerName: this.providerName,
225
260
  model: options.model,
226
261
  question: this.question,
@@ -231,7 +266,14 @@ class RunRecorder {
231
266
  inputItemCount: this.inputItemCount,
232
267
  promptSnapshots: [...this.promptSnapshots],
233
268
  requestFingerprints: [...this.requestFingerprints],
234
- policyDecisions: [...this.policyDecisions],
269
+ policyDecisions: this.policyDecisions.map((decision) => ({
270
+ ...decision,
271
+ // Only complete evidence can establish that an allowed handoff was not applied.
272
+ ...(this.executionRecordingStatus === "complete" &&
273
+ decision.resource.kind === "handoff"
274
+ ? { handoffApplied: decision.handoffApplied ?? false }
275
+ : {}),
276
+ })),
235
277
  suspendedProposals: this.suspendedProposals.length > 0
236
278
  ? [...this.suspendedProposals]
237
279
  : undefined,
package/dist/run.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,SAAS,CAAC;AA4CnD,OAAO,EACL,cAAc,EAEd,mBAAmB,EAGnB,SAAS,EACT,cAAc,EACd,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAUjB,KAAK,eAAe,CAAC,QAAQ,IAAI;IAC/B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;CAC5B,CAAC;AAGF,YAAY,EACV,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAi0B3B,qBAAa,iBAAiB,CAAC,QAAQ,GAAG,OAAO;IAC/C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,KAAK,CAA4B;gBAGvC,MAAM,EAAE,aAAa,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,EAC/C,KAAK,EAAE,eAAe,CAAC,QAAQ,CAAC;IAMlC,QAAQ,IAAI,aAAa,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAQnD,IAAI,OAAO,IAAI,cAAc,EAAE,CAE9B;IAED,IAAI,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,CAE/B;CACF;AAED,wBAAsB,GAAG,CAAC,QAAQ,GAAG,OAAO,EAC1C,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,EAC9B,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,EAChC,OAAO,EAAE,gBAAgB,CAAC,QAAQ,CAAC,GAClC,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;AAExC,wBAAsB,GAAG,CAAC,QAAQ,GAAG,OAAO,EAC1C,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,EAC9B,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,EAChC,OAAO,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,GACtC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,SAAS,CAAC;AA4CnD,OAAO,EACL,cAAc,EAEd,mBAAmB,EAGnB,SAAS,EACT,cAAc,EACd,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAUjB,KAAK,eAAe,CAAC,QAAQ,IAAI;IAC/B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;CAC5B,CAAC;AAGF,YAAY,EACV,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AA80B3B,qBAAa,iBAAiB,CAAC,QAAQ,GAAG,OAAO;IAC/C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,KAAK,CAA4B;gBAGvC,MAAM,EAAE,aAAa,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,EAC/C,KAAK,EAAE,eAAe,CAAC,QAAQ,CAAC;IAMlC,QAAQ,IAAI,aAAa,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAQnD,IAAI,OAAO,IAAI,cAAc,EAAE,CAE9B;IAED,IAAI,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,CAE/B;CACF;AAED,wBAAsB,GAAG,CAAC,QAAQ,GAAG,OAAO,EAC1C,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,EAC9B,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,EAChC,OAAO,EAAE,gBAAgB,CAAC,QAAQ,CAAC,GAClC,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;AAExC,wBAAsB,GAAG,CAAC,QAAQ,GAAG,OAAO,EAC1C,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,EAC9B,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,EAChC,OAAO,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,GACtC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC"}
package/dist/run.js CHANGED
@@ -361,7 +361,7 @@ async function evaluateOutputGuardrails(agent, runContext, history, outputText,
361
361
  await logEmitter.outputGuardrailPassed(agent.name, turn, guardrail.name);
362
362
  }
363
363
  }
364
- async function* runLoop(state, runId, provider, runContext, maxTurns, logger, policies, onPolicyDecision, onSuspendedProposal, onGuardrailDecision, onPromptSnapshot, onRequestFingerprint) {
364
+ async function* runLoop(state, runId, provider, runContext, maxTurns, logger, policies, onPolicyDecision, onSuspendedProposal, onGuardrailDecision, onPromptSnapshot, onRequestFingerprint, onHandoffApplied) {
365
365
  const logEmitter = new run_log_emitter_1.RunLogEmitter(logger);
366
366
  await logEmitter.runStarted(state.lastAgent.name, maxTurns, state.history.length);
367
367
  yield {
@@ -448,7 +448,13 @@ async function* runLoop(state, runId, provider, runContext, maxTurns, logger, po
448
448
  }
449
449
  }
450
450
  if (pendingToolCalls.length > 0) {
451
- for (const call of pendingToolCalls) {
451
+ const firstHandoff = pendingToolCalls.find((call) => handoffRegistry.has(call.name));
452
+ const callsToExecute = pendingToolCalls.filter((call) => !handoffRegistry.has(call.name));
453
+ // Tools belong to the requesting agent; only the first handoff is eligible.
454
+ if (firstHandoff) {
455
+ callsToExecute.push(firstHandoff);
456
+ }
457
+ for (const call of callsToExecute) {
452
458
  const callItemArguments = parseArguments(call.arguments, call.name);
453
459
  const callItem = {
454
460
  type: "tool_call_item",
@@ -515,6 +521,7 @@ async function* runLoop(state, runId, provider, runContext, maxTurns, logger, po
515
521
  payload: callItemArguments,
516
522
  });
517
523
  state.lastAgent = handoffTarget;
524
+ onHandoffApplied?.(activeTurn, call.callId);
518
525
  handoffTransitioned = true;
519
526
  }
520
527
  }
@@ -609,11 +616,12 @@ async function run(startingAgent, input, options = {}) {
609
616
  const runRecorder = await run_recorder_runtime_1.RunRecorder.create({
610
617
  input,
611
618
  inputItemCount: state.history.length,
619
+ initialAgentName: startingAgent.name,
612
620
  context: runContext.context,
613
621
  providerName: provider.constructor.name,
614
622
  recordOptions: options.record,
615
623
  });
616
- const rawStream = runLoop(state, runRecorder.runId, provider, runContext, maxTurns, options.logger, options.policies, runRecorder.onPolicyDecision, runRecorder.onSuspendedProposal, runRecorder.onGuardrailDecision, runRecorder.onPromptSnapshot, runRecorder.onRequestFingerprint);
624
+ const rawStream = runLoop(state, runRecorder.runId, provider, runContext, maxTurns, options.logger, options.policies, runRecorder.onPolicyDecision, runRecorder.onSuspendedProposal, runRecorder.onGuardrailDecision, runRecorder.onPromptSnapshot, runRecorder.onRequestFingerprint, runRecorder.onHandoffApplied);
617
625
  const runRecordSnapshot = () => ({
618
626
  agentName: state.lastAgent.name,
619
627
  model: state.lastAgent.model,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axiastudio/aioc",
3
- "version": "0.2.11",
3
+ "version": "0.2.12",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "files": [