experimental-a2 0.18.1 → 0.20.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 (143) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/dist/actor.js +1 -1
  3. package/dist/{ai-BMLlI2Ff.d.ts → ai-Cz3hqVhk.d.ts} +33 -16
  4. package/dist/ai-Cz3hqVhk.d.ts.map +1 -0
  5. package/dist/ai-client.d.ts +1 -1
  6. package/dist/ai-client.js +1 -1
  7. package/dist/ai-control-CvLbW10B.js +46 -0
  8. package/dist/ai-control-CvLbW10B.js.map +1 -0
  9. package/dist/ai-fx.d.ts +1 -1
  10. package/dist/ai-fx.d.ts.map +1 -1
  11. package/dist/ai-fx.js +63 -13
  12. package/dist/ai-fx.js.map +1 -1
  13. package/dist/{ai-harness-B2suP2Qh.d.ts → ai-harness-CV6rXbB3.d.ts} +2 -2
  14. package/dist/ai-harness-CV6rXbB3.d.ts.map +1 -0
  15. package/dist/{ai-harness-BuLh_EYi.js → ai-harness-Clbg5ei7.js} +88 -15
  16. package/dist/ai-harness-Clbg5ei7.js.map +1 -0
  17. package/dist/{ai-D6mGlO8j.js → ai-mMiWul1T.js} +116 -77
  18. package/dist/ai-mMiWul1T.js.map +1 -0
  19. package/dist/ai-pi.d.ts +1 -1
  20. package/dist/ai-pi.d.ts.map +1 -1
  21. package/dist/ai-pi.js +56 -11
  22. package/dist/ai-pi.js.map +1 -1
  23. package/dist/ai-react.d.ts +1 -1
  24. package/dist/ai-react.js +1 -1
  25. package/dist/ai-server.d.ts +2 -2
  26. package/dist/ai-server.d.ts.map +1 -1
  27. package/dist/ai-server.js +123 -53
  28. package/dist/ai-server.js.map +1 -1
  29. package/dist/ai.d.ts +2 -2
  30. package/dist/ai.js +1 -1
  31. package/dist/internal-CscSY7K_.js.map +1 -1
  32. package/dist/scheduler-qstash.d.ts.map +1 -1
  33. package/dist/scheduler-qstash.js +5 -5
  34. package/dist/scheduler-qstash.js.map +1 -1
  35. package/dist/scheduler-vercel.d.ts.map +1 -1
  36. package/dist/scheduler-vercel.js +5 -7
  37. package/dist/scheduler-vercel.js.map +1 -1
  38. package/dist/server-DYAATFuT.d.ts.map +1 -1
  39. package/dist/{server-D-Y4pqwu.js → server-qyb5aJJG.js} +39 -25
  40. package/dist/server-qyb5aJJG.js.map +1 -0
  41. package/dist/server.js +1 -1
  42. package/dist/session-clear-DGI4jTQ5.js.map +1 -1
  43. package/dist/store-postgres.d.ts.map +1 -1
  44. package/dist/store-postgres.js +38 -136
  45. package/dist/store-postgres.js.map +1 -1
  46. package/docs/01-quickstart.mdx +7 -4
  47. package/docs/actors/01-introduction.mdx +1 -1
  48. package/docs/actors/meta.ts +1 -1
  49. package/docs/agents/02-tools.mdx +1 -1
  50. package/docs/agents/03-conversations.mdx +26 -14
  51. package/docs/agents/04-harnesses.mdx +51 -5
  52. package/docs/agents/meta.ts +1 -1
  53. package/docs/client/meta.ts +1 -1
  54. package/docs/contract/03-sessions.mdx +2 -2
  55. package/docs/index.mdx +2 -2
  56. package/docs/reference/01-core.mdx +8 -8
  57. package/docs/reference/02-server.mdx +3 -3
  58. package/docs/reference/04-ai.mdx +36 -19
  59. package/docs/reference/05-telemetry.mdx +132 -0
  60. package/docs/reference/06-errors.mdx +1 -1
  61. package/docs/reference/meta.ts +1 -1
  62. package/docs/schedulers/01-overview.mdx +112 -0
  63. package/docs/schedulers/02-vercel-queues.mdx +87 -0
  64. package/docs/schedulers/03-qstash.mdx +123 -0
  65. package/docs/schedulers/meta.ts +1 -0
  66. package/docs/server/01-handlers.mdx +29 -2
  67. package/docs/server/02-timers.mdx +3 -3
  68. package/docs/server/06-guarantees.mdx +6 -3
  69. package/docs/stores/01-overview.mdx +37 -0
  70. package/docs/stores/02-redis.mdx +49 -0
  71. package/docs/stores/03-redis-http.mdx +56 -0
  72. package/docs/stores/04-postgres.mdx +121 -0
  73. package/docs/stores/05-sqlite.mdx +34 -0
  74. package/docs/stores/06-memory.mdx +22 -0
  75. package/docs/stores/meta.ts +1 -0
  76. package/examples/playground/DEPLOY.md +19 -5
  77. package/examples/playground/app/a0/a0.css +244 -5
  78. package/examples/playground/app/a0/app-view.tsx +2 -1
  79. package/examples/playground/app/a0/apps/[appId]/route.ts +6 -10
  80. package/examples/playground/app/a0/attachments.ts +133 -0
  81. package/examples/playground/app/a0/chat.test.tsx +595 -0
  82. package/examples/playground/app/a0/chat.tsx +623 -63
  83. package/examples/playground/app/a0/context-menu.tsx +38 -11
  84. package/examples/playground/app/a0/model.test.ts +28 -0
  85. package/examples/playground/app/a0/model.ts +30 -0
  86. package/examples/playground/app/a0/server.ts +5 -0
  87. package/examples/playground/app/a0/shell.tsx +1 -1
  88. package/examples/playground/app/a0/uploads/route.test.ts +59 -0
  89. package/examples/playground/app/a0/uploads/route.ts +29 -0
  90. package/examples/playground/app/agent/[agentId]/agent-client.tsx +2 -1
  91. package/examples/playground/app/agent/[agentId]/agent-queue.test.tsx +116 -89
  92. package/examples/playground/app/agent/[agentId]/compaction-panel.test.tsx +107 -76
  93. package/examples/playground/app/agent/ingress.test.ts +41 -17
  94. package/examples/playground/app/agent/model-input.test.tsx +92 -43
  95. package/examples/playground/app/agent/model.test.ts +12 -3
  96. package/examples/playground/app/chat/[chatId]/agent-state.test.ts +1 -5
  97. package/examples/playground/app/chat/[chatId]/agent-stream-drawer.test.tsx +2 -2
  98. package/examples/playground/app/chat/server.test.ts +38 -65
  99. package/examples/playground/app/components/activity-history.test.tsx +60 -18
  100. package/examples/playground/app/components/fast-link.test.tsx +3 -5
  101. package/examples/playground/app/initial-state.test.tsx +86 -45
  102. package/examples/playground/next.config.ts +7 -4
  103. package/examples/playground/package.json +4 -1
  104. package/examples/playground/test/agent.ts +35 -0
  105. package/examples/playground/test/model.ts +149 -0
  106. package/examples/playground/test/serve.ts +184 -0
  107. package/examples/playground/test/server-only.ts +1 -0
  108. package/examples/playground/vitest.config.ts +27 -0
  109. package/package.json +3 -1
  110. package/sql/postgres/notifications.sql +24 -0
  111. package/sql/postgres/schema.sql +137 -0
  112. package/src/ai-agent.ts +9 -4
  113. package/src/ai-client-state.ts +21 -9
  114. package/src/ai-context-schema.ts +28 -4
  115. package/src/ai-context.ts +83 -3
  116. package/src/ai-control-server.ts +70 -43
  117. package/src/ai-control-state.ts +3 -4
  118. package/src/ai-control.ts +59 -10
  119. package/src/ai-coordinator.ts +7 -6
  120. package/src/ai-fx.ts +95 -23
  121. package/src/ai-harness.ts +171 -29
  122. package/src/ai-message-shape.ts +41 -0
  123. package/src/ai-pi.ts +88 -32
  124. package/src/ai-stored-state.ts +1 -3
  125. package/src/ai.ts +116 -77
  126. package/src/errors.ts +1 -1
  127. package/src/internal.ts +2 -1
  128. package/src/libfx.d.ts +8 -1
  129. package/src/postgres-notifications.ts +0 -22
  130. package/src/postgres-resources.ts +6 -9
  131. package/src/postgres-schema.ts +80 -0
  132. package/src/scheduler-qstash.ts +12 -5
  133. package/src/scheduler-vercel.ts +11 -16
  134. package/src/server.ts +66 -32
  135. package/src/store-postgres.ts +5 -123
  136. package/dist/ai-BMLlI2Ff.d.ts.map +0 -1
  137. package/dist/ai-D6mGlO8j.js.map +0 -1
  138. package/dist/ai-harness-B2suP2Qh.d.ts.map +0 -1
  139. package/dist/ai-harness-BuLh_EYi.js.map +0 -1
  140. package/dist/server-D-Y4pqwu.js.map +0 -1
  141. package/docs/reference/05-adapters.mdx +0 -351
  142. package/docs/server/05-production.mdx +0 -323
  143. package/examples/playground/app/a0/no-photon.cjs +0 -4
package/dist/ai-pi.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { n as HarnessSandbox, r as HarnessSandboxContext, t as Harness } from "./ai-harness-B2suP2Qh.js";
1
+ import { n as HarnessSandbox, r as HarnessSandboxContext, t as Harness } from "./ai-harness-CV6rXbB3.js";
2
2
  //#region src/ai-pi.d.ts
3
3
  /** What `pi()` takes. */
4
4
  type PiOptions = {
@@ -1 +1 @@
1
- {"version":3,"file":"ai-pi.d.ts","names":[],"sources":["../src/ai-pi.ts"],"mappings":";;;KAyEY;;EAEV,SAAS;;;;;;iBAOK,GAAG,SAAS,YAAY,cAAc;cAuBhD;KACD,kBAAkB"}
1
+ {"version":3,"file":"ai-pi.d.ts","names":[],"sources":["../src/ai-pi.ts"],"mappings":";;;KA4EY;;EAEV,SAAS;;;;;;iBAOK,GAAG,SAAS,YAAY,cAAc;cAuBhD;KACD,kBAAkB"}
package/dist/ai-pi.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { u as ambientToolScopeStorage } from "./internal-CscSY7K_.js";
2
2
  import { t as boundedCache } from "./bounded-cache-CPHWF-8h.js";
3
- import { c as pending, d as saveHarness, i as gatewayCredential, l as readHarness, n as deferred, r as defineHarness, t as Divergence } from "./ai-harness-BuLh_EYi.js";
3
+ import { d as readHarness, i as gatewayCredential, n as deferred, p as saveHarness, r as defineHarness, s as harnessImages, t as Divergence, u as pending } from "./ai-harness-Clbg5ei7.js";
4
4
  import { t as schemaInput } from "./ai-tool-input-DmSqMUQi.js";
5
- import { createHash } from "node:crypto";
6
5
  import { asSchema, jsonSchema } from "ai";
6
+ import { createHash } from "node:crypto";
7
7
  import { readFile, unlink } from "node:fs/promises";
8
8
  import { tmpdir } from "node:os";
9
9
  import { basename, dirname, join } from "node:path";
@@ -90,7 +90,7 @@ async function runStep(step, sandbox) {
90
90
  if (recorded !== void 0) {
91
91
  if (recorded.kind !== kind) fail(state, diverged(`call ${state.next} is not a ${kind}`));
92
92
  state.next++;
93
- for (const text of recorded.steers) await session.steer(text);
93
+ for (const { text, images } of recorded.steers) await session.steer(text, images.length === 0 ? void 0 : images);
94
94
  replay(out, recorded.response);
95
95
  return;
96
96
  }
@@ -110,7 +110,8 @@ async function runStep(step, sandbox) {
110
110
  headers: {
111
111
  ...options?.headers,
112
112
  ...gatewayHeaders(credential)
113
- }
113
+ },
114
+ ...step.speed === "fast" ? { onPayload: fastTier(options?.onPayload) } : {}
114
115
  });
115
116
  const live = kind === "step" ? liveStep() : void 0;
116
117
  for await (const event of upstream) {
@@ -381,9 +382,16 @@ async function runStep(step, sandbox) {
381
382
  }
382
383
  for (const plan of read.turns) {
383
384
  if (step.signal.aborted) return;
385
+ const prompt = await piInput({
386
+ input: plan.prompt,
387
+ signal: step.signal
388
+ });
384
389
  const state = {
385
390
  plan,
386
- calls: recordedTurn(plan),
391
+ calls: await recordedTurn({
392
+ turn: plan,
393
+ signal: step.signal
394
+ }),
387
395
  next: 0,
388
396
  liveStep: false,
389
397
  over: false,
@@ -391,7 +399,10 @@ async function runStep(step, sandbox) {
391
399
  compactions: []
392
400
  };
393
401
  turn = state;
394
- const running = session.prompt(plan.prompt, { expandPromptTemplates: false });
402
+ const running = session.prompt(prompt.text, {
403
+ expandPromptTemplates: false,
404
+ ...prompt.images.length === 0 ? {} : { images: prompt.images }
405
+ });
395
406
  if (plan.end !== "live") {
396
407
  await running.catch((error) => {
397
408
  throw state.failure ?? error;
@@ -444,16 +455,34 @@ async function runStep(step, sandbox) {
444
455
  };
445
456
  }
446
457
  /** A turn's recorded model calls, in the order Pi made them. */
447
- function recordedTurn(turn) {
458
+ async function recordedTurn({ turn, signal }) {
448
459
  const calls = [];
449
- turn.generations.forEach((generation, index) => {
460
+ for (const [index, generation] of turn.generations.entries()) {
450
461
  calls.push(...recordedCalls(generation));
451
462
  const steers = turn.steers.get(index);
452
463
  const last = calls.findLast((call) => call.kind === "step");
453
- if (steers !== void 0 && last !== void 0) last.steers.push(...steers);
454
- });
464
+ if (steers !== void 0 && last !== void 0) for (const input of steers) last.steers.push(await piInput({
465
+ input,
466
+ signal
467
+ }));
468
+ }
455
469
  return calls;
456
470
  }
471
+ async function piInput({ input, signal }) {
472
+ const images = await harnessImages({
473
+ harness: "pi()",
474
+ input,
475
+ signal
476
+ });
477
+ return {
478
+ text: input.text,
479
+ images: images.map((image) => ({
480
+ type: "image",
481
+ data: image.data,
482
+ mimeType: image.mediaType
483
+ }))
484
+ };
485
+ }
457
486
  function recordedCalls(generation) {
458
487
  const texts = /* @__PURE__ */ new Map();
459
488
  const inputs = /* @__PURE__ */ new Map();
@@ -671,7 +700,7 @@ function builtinDefinition(modules, name, cwd, call) {
671
700
  * come from A2's log; A2's tool handlers ran them.
672
701
  */
673
702
  async function sessionTools(modules, tools, cwd, result) {
674
- return Promise.all(Object.entries(tools).filter(([, tool]) => tool.type !== "provider").map(async ([name, tool]) => {
703
+ return Promise.all(Object.entries(tools).map(async ([name, tool]) => {
675
704
  const builtin = builtinOf(tools, name);
676
705
  if (builtin !== void 0) return Object.assign(builtinDefinition(modules, builtin, cwd), { execute: (toolCallId, _params, signal) => result(toolCallId, signal, "pi") });
677
706
  return {
@@ -886,6 +915,22 @@ function thinkingLevel(step) {
886
915
  if (step.reasoning === void 0 || step.reasoning === "provider-default") return {};
887
916
  return { thinkingLevel: step.reasoning === "none" ? "off" : step.reasoning };
888
917
  }
918
+ /** Asks AI Gateway for the model's fast tier, on the payload Pi's own hook returns. */
919
+ function fastTier(inner) {
920
+ return async (payload, model) => {
921
+ const body = await inner?.(payload, model) ?? payload;
922
+ return {
923
+ ...body,
924
+ providerOptions: {
925
+ ...body.providerOptions,
926
+ gateway: {
927
+ ...body.providerOptions?.gateway,
928
+ speed: "fast"
929
+ }
930
+ }
931
+ };
932
+ };
933
+ }
889
934
  function gatewayHeaders(credential) {
890
935
  return {
891
936
  authorization: `Bearer ${credential.token}`,
package/dist/ai-pi.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ai-pi.js","names":["readLocalFile"],"sources":["../src/ai-pi.ts"],"sourcesContent":["/**\n * experimental-a2/ai/pi — `pi()`: the Pi harness for `agent({ harness })`.\n * Server-only; Pi comes from the optional `@earendil-works/pi-coding-agent`\n * and `@earendil-works/pi-ai` peer dependencies.\n */\n\n// oxlint-disable no-await-in-loop -- turns replay in order, each on the session the last one left.\n\nimport { createHash } from 'node:crypto'\nimport { readFile as readLocalFile, unlink } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { basename, dirname, join } from 'node:path'\nimport type {\n AssistantMessage,\n AssistantMessageEvent,\n AssistantMessageEventStream,\n JsonObject,\n TextContent,\n ThinkingContent,\n ToolCall,\n Usage,\n} from '@earendil-works/pi-ai'\nimport type {\n AgentSession,\n AgentToolResult,\n BashOperations,\n ModelRuntime,\n ResourceLoader,\n SessionEntry,\n SessionHeader,\n ToolDefinition,\n} from '@earendil-works/pi-coding-agent'\nimport {\n asSchema,\n jsonSchema,\n type Experimental_SandboxSession,\n type FinishReason,\n type JSONSchema7,\n type LanguageModelUsage,\n type Tool,\n type ToolExecutionOptions,\n type ToolSet,\n type UIMessageChunk,\n} from 'ai'\nimport {\n type Deferred,\n defineHarness,\n deferred,\n Divergence,\n gatewayCredential,\n type Harness,\n type HarnessGeneration,\n type HarnessRead,\n type HarnessSandbox,\n type HarnessStep,\n type HarnessTurn,\n pending,\n readHarness,\n type RecordedGeneration,\n saveHarness,\n} from './ai-harness.ts'\nimport { type SchemaInput, schemaInput } from './ai-tool-input.ts'\nimport type { CompactionPartData, ToolResultPayload } from './ai.ts'\nimport { boundedCache } from './bounded-cache.ts'\nimport { ambientToolScopeStorage } from './internal.ts'\n\nexport type {\n Harness,\n HarnessSandbox,\n HarnessSandboxContext,\n} from './ai-harness.ts'\n\n/** What `pi()` takes. */\nexport type PiOptions = {\n /** The session's sandbox: Pi's tools, and the agent's, work in it. */\n sandbox: HarnessSandbox\n}\n\n/**\n * The Pi harness. Every model call Pi makes is one durable step; A2 rebuilds\n * Pi's session for each step from its latest snapshot and the log since.\n */\nexport function pi(options: PiOptions): Harness<'pi', Builtin> {\n if (typeof options?.sandbox !== 'function')\n throw new TypeError('pi() requires sandbox')\n return defineHarness<'pi', Builtin>('pi', {\n sandbox: options.sandbox,\n tools: builtinTools,\n step: (step) =>\n runStep(step, async () =>\n options.sandbox({\n session: { id: step.sessionId },\n signal: step.signal,\n }),\n ),\n })\n}\n\nconst SNAPSHOT_VERSION = 1\nconst GATEWAY = 'vercel-ai-gateway'\n// The most a file read or a command's output moves from the sandbox to the\n// server. Pi's tools show the model 50 KB at a time, after reading it all.\nconst MAX_TRANSFER_BYTES = 4 * 1024 * 1024\nconst MAX_TRANSFER = '4 MiB'\n// Pi's default tools.\nconst BUILTINS = ['read', 'write', 'edit', 'bash'] as const\ntype Builtin = (typeof BUILTINS)[number]\n\ntype PiModules = {\n agent: typeof import('@earendil-works/pi-coding-agent')\n ai: typeof import('@earendil-works/pi-ai')\n}\n\n/**\n * A content block without the text the transcript already holds. A tool call\n * keeps its arguments only where the transcript's input is not the model's.\n */\ntype StoredBlock =\n | (Omit<TextContent, 'text'> & { ref: string })\n | (Omit<ThinkingContent, 'thinking'> & { ref: string })\n | (Omit<ToolCall, 'arguments'> & Partial<Pick<ToolCall, 'arguments'>>)\n\n/** What a step's transcript parts do not hold of Pi's response. */\ntype StoredResponse = Omit<AssistantMessage, 'content'> & {\n content: StoredBlock[]\n}\n\n/** The transient record of one model call, for replay. */\ntype PiRecord =\n | { call: 'step'; response: StoredResponse }\n | { call: 'compaction'; response: AssistantMessage }\n\ntype RecordedCall = {\n kind: 'step' | 'compaction'\n response: AssistantMessage\n /** Steering to queue while serving this call. */\n steers: string[]\n}\n\ntype Saved = {\n cwd: string\n header: SessionHeader\n entries: SessionEntry[]\n}\n\ntype Completion = { finishReason?: FinishReason; usage?: LanguageModelUsage }\n\n/** The turn being replayed or run live, as the model and tool hooks see it. */\ntype TurnState = {\n plan: HarnessTurn\n calls: RecordedCall[]\n next: number\n liveStep: boolean\n /** The live step is over; Pi's run is being stopped. */\n over: boolean\n failure?: Error\n /** Resolves when the live step is over: Pi asked for its tools or another step. */\n stepOver: Deferred\n /** Live compaction responses, in request order. */\n compactions: AssistantMessage[]\n}\n\nfunction endStep(state: TurnState): void {\n state.over = true\n state.stepOver.resolve()\n}\n\nconst diverged = (message: string): Divergence => new Divergence('Pi', message)\n\n// ---------------------------------------------------------------- step\n\nasync function runStep(\n step: HarnessStep,\n sandbox: () => Promise<Experimental_SandboxSession>,\n): Promise<HarnessGeneration> {\n const modules = await loadPi()\n const credential = gatewayCredential('pi')\n const name = `${step.agentName}.a2.harness.pi`\n const { replayAll, ...first } = await readHarness({\n step,\n name,\n parse: savedSession,\n })\n let read: HarnessRead<Saved> = first\n let results = read.results\n const cwd =\n read.saved?.cwd ??\n (await sessionCwd({\n key: cwdKey(step.agentName, step.sessionId),\n sandbox,\n }))\n\n let completion: Completion = {}\n let session: AgentSession | undefined\n let compacting = false\n let turn: TurnState | undefined\n\n const fail = (state: TurnState, error: Error): never => {\n state.failure ??= error\n endStep(state)\n void session?.abort()\n throw state.failure\n }\n\n let controller: ReadableStreamDefaultController<UIMessageChunk> | undefined\n let closed = false\n const emit = (chunk: UIMessageChunk): void => {\n if (!closed) controller!.enqueue(chunk)\n }\n const record = (data: PiRecord): void =>\n emit({ type: 'data-a2-pi', data, transient: true })\n\n // ------------------------------------------------------ model calls\n\n const answer = async (\n out: AssistantMessageEventStream,\n model: Parameters<ModelRuntime['streamSimple']>[0],\n context: Parameters<ModelRuntime['streamSimple']>[1],\n options: Parameters<ModelRuntime['streamSimple']>[2],\n ): Promise<void> => {\n const state = turn!\n if (state.failure) throw state.failure\n // Stopping Pi runs its turn-end hooks; nothing they ask the model counts.\n if (state.over) {\n replay(out, interrupted(model))\n return\n }\n const kind = compacting ? 'compaction' : 'step'\n const recorded = state.calls[state.next]\n if (recorded !== undefined) {\n if (recorded.kind !== kind)\n fail(state, diverged(`call ${state.next} is not a ${kind}`))\n state.next++\n // Steering queued while a response streams enters after its tools.\n for (const text of recorded.steers) await session!.steer(text)\n replay(out, recorded.response)\n return\n }\n if (state.plan.end === 'stop')\n fail(state, diverged('Pi continued a turn the log ended'))\n if (state.plan.end === 'interrupted') {\n replay(out, interrupted(model))\n return\n }\n if (kind === 'step' && state.liveStep) {\n // One generation is one step; the next step is A2's next generation.\n endStep(state)\n replay(out, interrupted(model))\n return\n }\n if (kind === 'step') state.liveStep = true\n const upstream = realStream(model, context, {\n ...options,\n headers: { ...options?.headers, ...gatewayHeaders(credential) },\n })\n const live = kind === 'step' ? liveStep() : undefined\n for await (const event of upstream) {\n await live?.(event)\n if (event.type === 'done' || event.type === 'error') {\n const response = event.type === 'done' ? event.message : event.error\n if (kind === 'compaction') state.compactions.push(response)\n // A2 retries the step; Pi's own recovery would run outside it.\n if (event.type === 'error' && event.reason === 'error') {\n state.failure ??= new Error(\n response.errorMessage ?? 'the Pi model call failed',\n )\n endStep(state)\n }\n }\n out.push(event)\n }\n }\n\n /**\n * A live call's input as Pi's loop, then the AI SDK step, read it. Pi\n * answers a call to no tool, or whose arguments it cannot prepare or\n * validate, itself. The agent's tool reads the arguments Pi accepts through\n * its own schema; A2 runs Pi's own tools from the model's arguments, as\n * Pi's loop does.\n */\n const callInput = async (block: ToolCall): Promise<SchemaInput> => {\n const definition = tools.find((tool) => tool.name === block.name)\n if (definition === undefined)\n return { success: false, errorText: `Tool ${block.name} not found` }\n let args: unknown\n try {\n const prepared = definition.prepareArguments?.(block.arguments)\n args = modules.ai.validateToolArguments(\n definition,\n prepared === undefined\n ? block\n : { ...block, arguments: prepared as JsonObject },\n )\n } catch (error) {\n return { success: false, errorText: asError(error).message }\n }\n if (builtinOf(step.tools, block.name) !== undefined)\n return { success: true, value: block.arguments }\n return schemaInput({ tools: step.tools, toolName: block.name, value: args })\n }\n\n /** Streams one live step response as UI chunks and records it. */\n const liveStep = () => {\n const ref = (index: number) => `pi:${step.requestIndex}:${index}`\n const started = new Set<string>()\n return async (event: AssistantMessageEvent): Promise<void> => {\n switch (event.type) {\n case 'start':\n emit({ type: 'start-step' })\n break\n case 'text_start':\n emit({ type: 'text-start', id: ref(event.contentIndex) })\n break\n case 'text_delta':\n emit({\n type: 'text-delta',\n id: ref(event.contentIndex),\n delta: event.delta,\n })\n break\n case 'text_end':\n emit({ type: 'text-end', id: ref(event.contentIndex) })\n break\n case 'thinking_start':\n emit({ type: 'reasoning-start', id: ref(event.contentIndex) })\n break\n case 'thinking_delta':\n emit({\n type: 'reasoning-delta',\n id: ref(event.contentIndex),\n delta: event.delta,\n })\n break\n case 'thinking_end':\n emit({ type: 'reasoning-end', id: ref(event.contentIndex) })\n break\n case 'toolcall_start':\n case 'toolcall_delta': {\n const call = event.partial.content[event.contentIndex] as ToolCall\n if (!call.id) break\n if (!started.has(call.id)) {\n started.add(call.id)\n emit({\n type: 'tool-input-start',\n toolCallId: call.id,\n toolName: call.name,\n })\n }\n if (event.type === 'toolcall_delta')\n emit({\n type: 'tool-input-delta',\n toolCallId: call.id,\n inputTextDelta: event.delta,\n })\n break\n }\n case 'done':\n case 'error': {\n const response = event.type === 'done' ? event.message : event.error\n // Calls whose transcript input is not the model's arguments.\n const changed = new Set<string>()\n if (event.type === 'done') {\n for (const block of response.content) {\n if (block.type !== 'toolCall') continue\n if (!started.has(block.id))\n emit({\n type: 'tool-input-start',\n toolCallId: block.id,\n toolName: block.name,\n })\n // Pi does not run the calls of a cut-off response.\n const input: SchemaInput =\n response.stopReason === 'length'\n ? {\n success: false,\n errorText:\n 'The response hit the output token limit before this call was complete.',\n }\n : await callInput(block)\n if (\n input.success &&\n JSON.stringify(input.value) !== JSON.stringify(block.arguments)\n )\n changed.add(block.id)\n emit(\n input.success\n ? {\n type: 'tool-input-available',\n toolCallId: block.id,\n toolName: block.name,\n input: input.value,\n }\n : {\n type: 'tool-input-error',\n toolCallId: block.id,\n toolName: block.name,\n input: block.arguments,\n errorText: input.errorText,\n },\n )\n }\n }\n record({\n call: 'step',\n response: storedResponse(response, ref, changed),\n })\n completion = {\n finishReason: finishReason(response.stopReason),\n usage: modelUsage(response.usage),\n }\n break\n }\n }\n }\n }\n\n // ----------------------------------------------------- tool results\n\n const toolResult = async (\n toolCallId: string,\n signal: AbortSignal | undefined,\n shape: 'pi' | 'tool',\n ): Promise<AgentToolResult<unknown>> => {\n const state = turn!\n if (state.failure) throw state.failure\n const result = results.get(toolCallId)\n if (result !== undefined) return answeredTool(result, shape)\n if (state.plan.end === 'live' && state.liveStep) {\n // Pi now waits on tools that A2's tool handlers run.\n endStep(state)\n return pending(signal)\n }\n if (state.plan.end === 'interrupted') {\n void session!.abort()\n return pending(signal)\n }\n return fail(state, diverged(`no recorded result for ${toolCallId}`))\n }\n\n // ------------------------------------------------------------ run\n\n const runtime = await modules.agent.ModelRuntime.create({\n credentials: new modules.ai.InMemoryCredentialStore(),\n modelsPath: null,\n allowModelNetwork: false,\n refreshOnCreate: false,\n })\n await runtime.setRuntimeApiKey(GATEWAY, credential.token)\n const model = runtime.getModel(GATEWAY, step.model)\n if (model === undefined)\n throw new Error(`Pi does not know the Gateway model ${step.model}`)\n const realStream = runtime.streamSimple.bind(runtime)\n runtime.streamSimple = (requested, context, options?) => {\n const out = modules.ai.createAssistantMessageEventStream()\n answer(out, requested, context, options).catch((error: unknown) => {\n const state = turn\n if (state) state.failure ??= asError(error)\n replay(out, { ...interrupted(requested), stopReason: 'error' })\n })\n return out\n }\n\n const tools = await sessionTools(modules, step.tools, cwd, toolResult)\n\n const createSession = async (from: Saved | undefined) => {\n const sessionManager =\n from === undefined\n ? modules.agent.SessionManager.inMemory(cwd, {\n id: sessionUuid(step.agentName, step.sessionId),\n })\n : modules.agent.SessionManager.inMemory(cwd, { id: from.header.id }, [\n from.header,\n ...from.entries,\n ])\n const created = await modules.agent.createAgentSession({\n cwd,\n // Pi reads nothing there: every resource and manager comes from A2.\n agentDir: join(tmpdir(), 'a2-pi'),\n model,\n ...thinkingLevel(step),\n modelRuntime: runtime,\n resourceLoader: resources(modules, step.instructions),\n sessionManager,\n settingsManager: modules.agent.SettingsManager.inMemory({\n // A2 retries failed steps.\n retry: { enabled: false, maxRetries: 0, baseDelayMs: 0 },\n cacheWarming: 'off',\n }),\n customTools: tools,\n tools: tools.map((definition) => definition.name),\n })\n created.session.subscribe((event) => {\n if (event.type === 'compaction_start') compacting = true\n if (event.type !== 'compaction_end') return\n compacting = false\n const state = turn\n if (state === undefined || state.over || state.compactions.length === 0)\n return\n for (const response of state.compactions.splice(0))\n record({ call: 'compaction', response })\n emit({\n type: 'data-a2-compaction',\n id: `pi-compaction:${step.requestIndex}:${compactions++}`,\n data: compactionData(event),\n })\n })\n return created.session\n }\n let compactions = 0\n\n const saveSnapshot = async (): Promise<void> => {\n const manager = session!.sessionManager\n const header = manager.getHeader()\n const entries = manager.getEntries()\n const last = entries.findLast(\n (entry) => entry.type === 'message' && entry.message.role === 'assistant',\n )\n const stop =\n last?.type === 'message' && last.message.role === 'assistant'\n ? last.message.stopReason\n : undefined\n // Only a turn this attempt finished describes the log.\n if (\n header === null ||\n step.signal.aborted ||\n stop === 'aborted' ||\n stop === 'error'\n )\n return\n await saveHarness({\n step,\n name,\n state: { version: SNAPSHOT_VERSION, cwd, header, entries },\n })\n }\n\n const run = async (): Promise<void> => {\n emit({ type: 'start', messageId: step.responseMessageId })\n try {\n session = await createSession(read.saved)\n } catch (error) {\n if (read.saved === undefined) throw error\n // An unusable snapshot: replay the whole log instead.\n read = await replayAll()\n results = read.results\n session = await createSession(undefined)\n }\n for (const plan of read.turns) {\n if (step.signal.aborted) return\n const state: TurnState = {\n plan,\n calls: recordedTurn(plan),\n next: 0,\n liveStep: false,\n over: false,\n stepOver: deferred(),\n compactions: [],\n }\n turn = state\n const running = session.prompt(plan.prompt, {\n expandPromptTemplates: false,\n })\n if (plan.end !== 'live') {\n await running.catch((error: unknown) => {\n throw state.failure ?? error\n })\n if (state.failure) throw state.failure\n continue\n }\n const ended = await Promise.race([\n running.then(() => true),\n state.stepOver.promise.then(() => false),\n ]).catch((error: unknown) => {\n throw state.failure ?? error\n })\n if (!ended) {\n await session.abort()\n await running.catch(() => {})\n }\n if (state.failure) throw state.failure\n if (ended) await saveSnapshot()\n emit({ type: 'finish-step' })\n emit({\n type: 'finish',\n ...(completion.finishReason === undefined\n ? {}\n : { finishReason: completion.finishReason }),\n })\n }\n }\n\n const stream = new ReadableStream<UIMessageChunk>({\n start(streamController) {\n controller = streamController\n const abort = () => void session?.abort()\n step.signal.addEventListener('abort', abort, { once: true })\n void (async () => {\n try {\n await run()\n closed = true\n streamController.close()\n } catch (error) {\n closed = true\n streamController.error(\n step.signal.aborted ? step.signal.reason : error,\n )\n } finally {\n step.signal.removeEventListener('abort', abort)\n session?.dispose()\n }\n })()\n },\n cancel() {\n closed = true\n void session?.abort()\n },\n })\n\n return { stream, completion: () => completion }\n}\n\n// ------------------------------------------------------------ the plan\n\n/** A turn's recorded model calls, in the order Pi made them. */\nfunction recordedTurn(turn: HarnessTurn): RecordedCall[] {\n const calls: RecordedCall[] = []\n turn.generations.forEach((generation, index) => {\n calls.push(...recordedCalls(generation))\n const steers = turn.steers.get(index)\n const last = calls.findLast((call) => call.kind === 'step')\n if (steers !== undefined && last !== undefined) last.steers.push(...steers)\n })\n return calls\n}\n\nfunction recordedCalls(generation: RecordedGeneration): RecordedCall[] {\n const texts = new Map<string, string>()\n const inputs = new Map<string, unknown>()\n const calls: RecordedCall[] = []\n for (const chunk of generation.chunks) {\n switch (chunk.type) {\n case 'text-delta':\n case 'reasoning-delta':\n texts.set(chunk.id, (texts.get(chunk.id) ?? '') + chunk.delta)\n break\n case 'tool-input-available':\n case 'tool-input-error':\n inputs.set(chunk.toolCallId, chunk.input)\n break\n case 'data-a2-pi': {\n const record = chunk.data as PiRecord\n calls.push({\n kind: record.call,\n response:\n record.call === 'step'\n ? restoredResponse(record.response, texts, inputs)\n : record.response,\n steers: [],\n })\n break\n }\n }\n }\n if (!calls.some((call) => call.kind === 'step'))\n throw diverged('a completed generation has no recorded response')\n return calls\n}\n\nfunction storedResponse(\n response: AssistantMessage,\n ref: (index: number) => string,\n changed: ReadonlySet<string>,\n): StoredResponse {\n return {\n ...response,\n content: response.content.map((block, index): StoredBlock => {\n switch (block.type) {\n case 'text': {\n const { text: _, ...rest } = block\n return { ...rest, ref: ref(index) }\n }\n case 'thinking': {\n const { thinking: _, ...rest } = block\n return { ...rest, ref: ref(index) }\n }\n case 'toolCall': {\n if (changed.has(block.id)) return block\n const { arguments: _, ...rest } = block\n return rest\n }\n }\n }),\n }\n}\n\nfunction restoredResponse(\n stored: StoredResponse,\n texts: ReadonlyMap<string, string>,\n inputs: ReadonlyMap<string, unknown>,\n): AssistantMessage {\n return {\n ...stored,\n content: stored.content.map((block) => {\n if (block.type === 'toolCall')\n return {\n ...block,\n arguments:\n block.arguments ?? ((inputs.get(block.id) ?? {}) as JsonObject),\n }\n const { ref, ...rest } = block\n const text = texts.get(ref) ?? ''\n return rest.type === 'text'\n ? { ...rest, text }\n : { ...rest, thinking: text }\n }),\n }\n}\n\n/** Hands a recorded response to Pi's loop. */\nfunction replay(out: AssistantMessageEventStream, response: AssistantMessage) {\n out.push({ type: 'start', partial: response })\n const reason = response.stopReason\n if (reason === 'error' || reason === 'aborted')\n out.push({ type: 'error', reason, error: response })\n else if (reason === 'pending')\n out.push({ type: 'done', reason: 'stop', message: response })\n else out.push({ type: 'done', reason, message: response })\n}\n\n/** The response of a model call that A2 interrupted. */\nfunction interrupted(\n model: Parameters<ModelRuntime['streamSimple']>[0],\n): AssistantMessage {\n return {\n role: 'assistant',\n content: [],\n api: model.api,\n provider: model.provider,\n model: model.id,\n usage: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n },\n stopReason: 'aborted',\n timestamp: Date.now(),\n }\n}\n\n// ----------------------------------------------------------- the tools\n\nconst builtinTools: ToolSet = Object.fromEntries(\n BUILTINS.map((name): [string, Tool] => [\n name,\n {\n inputSchema: jsonSchema(\n async () =>\n builtinDefinition(await loadPi(), name, '/')\n .parameters as JSONSchema7,\n ),\n execute: (input: unknown, options: ToolExecutionOptions<unknown>) =>\n runBuiltin(name, input, options),\n },\n ]),\n)\n\n/** Runs one of Pi's tools in the session's sandbox, as Pi's loop would. */\nasync function runBuiltin(\n name: Builtin,\n input: unknown,\n options: ToolExecutionOptions<unknown>,\n): Promise<AgentToolResult<unknown>> {\n const sandbox = options.experimental_sandbox\n if (sandbox === undefined)\n throw new Error(`pi() runs ${name} in the agent's sandbox`)\n const modules = await loadPi()\n const scope = ambientToolScopeStorage()?.getStore()\n const event = (scope?.context as { event?: { sessionId?: unknown } })?.event\n const cwd = await sessionCwd({\n key:\n scope?.contract !== undefined && typeof event?.sessionId === 'string'\n ? cwdKey(scope.contract.name, event.sessionId)\n : undefined,\n sandbox: async () => sandbox,\n })\n const definition = builtinDefinition(modules, name, cwd, {\n sandbox,\n signal: options.abortSignal,\n })\n const args: unknown = modules.ai.validateToolArguments(definition, {\n type: 'toolCall',\n id: options.toolCallId,\n name,\n arguments: (definition.prepareArguments?.(input) ?? input) as JsonObject,\n })\n // Pi's bash keeps a long output's full text in a local file, named in its\n // updates and its result. It is removed however the call ends.\n let outputFile: string | undefined\n try {\n const result = await definition.execute(\n options.toolCallId,\n args,\n options.abortSignal,\n (update) => {\n outputFile ??= fullOutputPath(update)\n },\n // Pi's tools take their context from the session, which A2 runs elsewhere.\n undefined as never,\n )\n outputFile ??= fullOutputPath(result)\n return await recordedResult(result, sandbox)\n } catch (error) {\n // Output whose last bytes tip it over Pi's limit opens the file only as\n // it ends, after the last update; a failed call then names it in its error.\n outputFile ??= namedOutputFile(error)\n throw error\n } finally {\n if (outputFile !== undefined) await unlink(outputFile).catch(() => {})\n }\n}\n\ntype BuiltinDetails =\n { truncation?: { content?: unknown }; fullOutputPath?: unknown } | undefined\n\nconst fullOutputPath = (\n result: AgentToolResult<unknown>,\n): string | undefined => {\n const path = (result.details as BuiltinDetails)?.fullOutputPath\n return typeof path === 'string' ? path : undefined\n}\n\n/** The full-output file an aborted or timed-out bash call's error names. */\nfunction namedOutputFile(error: unknown): string | undefined {\n if (!(error instanceof Error)) return undefined\n const path = /Full output: ([^\\n]+)\\]\\n\\nCommand [^\\n]+$/.exec(\n error.message,\n )?.[1]\n // The command's own output precedes Pi's note, and could name any file.\n return path !== undefined &&\n dirname(path) === tmpdir() &&\n /^pi-bash-[0-9a-f]{16}\\.log$/.test(basename(path))\n ? path\n : undefined\n}\n\n/**\n * What the log keeps of a result: what Pi's tool-result message holds. A\n * long output's full text moves to the path its result names in the sandbox,\n * where the model's `read` finds it.\n */\nasync function recordedResult(\n result: AgentToolResult<unknown>,\n sandbox: Experimental_SandboxSession,\n): Promise<AgentToolResult<unknown>> {\n // Pi's tool-result message does not carry structured content.\n const { structuredContent: _, ...kept } =\n result as AgentToolResult<unknown> & {\n structuredContent?: unknown\n }\n const details = kept.details as BuiltinDetails\n const path = fullOutputPath(kept)\n if (path !== undefined) {\n try {\n await sandbox.writeBinaryFile({\n path,\n content: await readLocalFile(path),\n })\n } catch {\n // The result stands without it; the model can rerun the command.\n }\n }\n if (details?.truncation === undefined) return kept\n // The truncated text is the result's content already.\n const { content: __, ...truncation } = details.truncation\n return { ...kept, details: { ...details, truncation } }\n}\n\n/** The Pi tool a name in the agent's tool set runs, unless the agent replaced it. */\nconst builtinOf = (tools: ToolSet, name: string): Builtin | undefined =>\n BUILTINS.find(\n (candidate) =>\n candidate === name &&\n Object.hasOwn(tools, name) &&\n tools[name] === builtinTools[name],\n )\n\n// Each definition is typed by its parameters; a session takes any of them.\nconst untyped = (definition: object) => definition as ToolDefinition\n\nfunction builtinDefinition(\n modules: PiModules,\n name: Builtin,\n cwd: string,\n call?: {\n sandbox: Experimental_SandboxSession\n signal: AbortSignal | undefined\n },\n): ToolDefinition {\n const sandbox = call?.sandbox\n const files =\n call === undefined ? undefined : { operations: sandboxFiles(call) }\n switch (name) {\n case 'read':\n return untyped(modules.agent.createReadToolDefinition(cwd, files))\n case 'write':\n return untyped(modules.agent.createWriteToolDefinition(cwd, files))\n case 'edit':\n return untyped(modules.agent.createEditToolDefinition(cwd, files))\n case 'bash':\n return untyped(\n modules.agent.createBashToolDefinition(cwd, {\n // No PI_* variables reach the sandbox, so Pi's prompt names none.\n exposeSessionEnvironment: false,\n ...(sandbox === undefined\n ? {}\n : { operations: sandboxBash(sandbox) }),\n }),\n )\n }\n}\n\n/**\n * The tools Pi's session declares: Pi's own, and the agent's. Their results\n * come from A2's log; A2's tool handlers ran them.\n */\nasync function sessionTools(\n modules: PiModules,\n tools: ToolSet,\n cwd: string,\n result: (\n toolCallId: string,\n signal: AbortSignal | undefined,\n shape: 'pi' | 'tool',\n ) => Promise<AgentToolResult<unknown>>,\n): Promise<ToolDefinition[]> {\n return Promise.all(\n Object.entries(tools)\n .filter(([, tool]) => tool.type !== 'provider')\n .map(async ([name, tool]): Promise<ToolDefinition> => {\n const builtin = builtinOf(tools, name)\n if (builtin !== undefined)\n // Pi's own definition, for its prompt; A2 already ran the call.\n return Object.assign(builtinDefinition(modules, builtin, cwd), {\n execute: (\n toolCallId: string,\n _params: unknown,\n signal?: AbortSignal,\n ) => result(toolCallId, signal, 'pi'),\n })\n return {\n name,\n label: name,\n description:\n typeof tool.description === 'string' ? tool.description : '',\n parameters: (await asSchema(tool.inputSchema)\n .jsonSchema) as ToolDefinition['parameters'],\n execute: (toolCallId, _params, signal) =>\n result(toolCallId, signal, 'tool'),\n }\n }),\n )\n}\n\nfunction answeredTool(\n result: ToolResultPayload,\n shape: 'pi' | 'tool',\n): AgentToolResult<unknown> {\n if (result.error !== undefined) throw new Error(result.error)\n if (result.denied === true) throw new Error('The tool call was denied.')\n if (shape === 'pi') return result.output as AgentToolResult<unknown>\n const output = result.output\n return {\n content: [\n {\n type: 'text',\n text:\n typeof output === 'string' ? output : (JSON.stringify(output) ?? ''),\n },\n ],\n details: undefined,\n }\n}\n\n// ------------------------------------------------------------ sandbox\n\n/** Pi's file operations, against the sandbox. */\nfunction sandboxFiles({\n sandbox,\n signal,\n}: {\n sandbox: Experimental_SandboxSession\n /** The tool call's: it stops a read or write in flight. */\n signal: AbortSignal | undefined\n}) {\n const abortSignal = signal === undefined ? {} : { abortSignal: signal }\n let checked: { path: string; bytes: Buffer } | undefined\n const readFile = async (path: string): Promise<Buffer> => {\n if (checked?.path === path) {\n const { bytes } = checked\n checked = undefined\n return bytes\n }\n const stream = await sandbox.readFile({ path, ...abortSignal })\n if (stream === null)\n throw Object.assign(\n new Error(`ENOENT: no such file or directory, open '${path}'`),\n { code: 'ENOENT' },\n )\n const chunks: Uint8Array[] = []\n let size = 0\n // Leaving the loop cancels the stream.\n for await (const chunk of stream) {\n size += chunk.byteLength\n if (size > MAX_TRANSFER_BYTES)\n throw new Error(\n `${path} is larger than ${MAX_TRANSFER}. Read or change parts of it with bash, using sed, head, or grep.`,\n )\n chunks.push(chunk)\n }\n return Buffer.concat(chunks)\n }\n return {\n readFile,\n // Pi checks a file just before reading it; the check's read serves both.\n access: async (path: string): Promise<void> => {\n checked = { path, bytes: await readFile(path) }\n },\n writeFile: async (path: string, content: string): Promise<void> => {\n checked = undefined\n await sandbox.writeTextFile({ path, content, ...abortSignal })\n },\n // The sandbox creates parent directories as it writes.\n mkdir: async (): Promise<void> => {},\n }\n}\n\n/** Pi's shell operations, against the sandbox. */\nconst sandboxBash = (sandbox: Experimental_SandboxSession): BashOperations => ({\n // Pi hands over the server's environment; it never reaches the sandbox.\n exec: (command, cwd, { onData, signal, timeout }) =>\n sandboxExec({\n sandbox,\n command,\n workingDirectory: cwd,\n onData,\n signal,\n timeout,\n }),\n})\n\n/**\n * Runs a command in the sandbox with Pi's error contract. At most\n * `MAX_TRANSFER_BYTES` of its output reach the server; past that, the\n * command is stopped.\n */\nasync function sandboxExec({\n sandbox,\n command,\n workingDirectory,\n onData,\n signal,\n timeout,\n}: {\n sandbox: Experimental_SandboxSession\n command: string\n /** The sandbox's own when absent. */\n workingDirectory?: string\n onData: (data: Buffer, stream: 'stdout' | 'stderr') => void\n signal?: AbortSignal | undefined\n /** In seconds. */\n timeout?: number | undefined\n}): Promise<{ exitCode: number }> {\n if (signal?.aborted) throw new Error('aborted')\n const stop = new AbortController()\n const abort = () => stop.abort()\n signal?.addEventListener('abort', abort, { once: true })\n let timedOut = false\n const timer =\n timeout === undefined || timeout <= 0\n ? undefined\n : setTimeout(() => {\n timedOut = true\n stop.abort()\n }, timeout * 1000)\n let size = 0\n let overflowed = false\n const overflow = (options?: ErrorOptions) =>\n new Error(\n `The command's output passed ${MAX_TRANSFER}, so it was stopped. Write long output to a file and read parts of it with head, tail, or grep.`,\n options,\n )\n let exitCode: number\n try {\n const process = await sandbox.spawn({\n command,\n ...(workingDirectory === undefined ? {} : { workingDirectory }),\n abortSignal: stop.signal,\n })\n const pipe = async (stream: 'stdout' | 'stderr') => {\n for await (const chunk of process[stream]) {\n size += chunk.byteLength\n if (size > MAX_TRANSFER_BYTES) {\n overflowed = true\n stop.abort()\n return\n }\n onData(Buffer.from(chunk), stream)\n }\n }\n const [exited] = await Promise.all([\n process.wait(),\n pipe('stdout'),\n pipe('stderr'),\n ])\n exitCode = exited.exitCode\n } catch (error) {\n if (signal?.aborted) throw new Error('aborted', { cause: error })\n if (timedOut) throw new Error(`timeout:${timeout}`, { cause: error })\n if (overflowed) throw overflow({ cause: error })\n throw error\n } finally {\n clearTimeout(timer)\n signal?.removeEventListener('abort', abort)\n }\n if (signal?.aborted) throw new Error('aborted')\n if (timedOut) throw new Error(`timeout:${timeout}`)\n if (overflowed) throw overflow()\n return { exitCode }\n}\n\n// Sandbox resolvers may return a new object each time; sessions keep theirs.\nconst cwds = boundedCache<string, Promise<string>>({\n maxEntries: 1000,\n maxBytes: 1000,\n})\n\nconst cwdKey = (agentName: string, sessionId: string): string =>\n `${agentName}\\u001f${sessionId}`\n\n/** A session's working directory in its sandbox: Pi's cwd. */\nfunction sessionCwd({\n key,\n sandbox,\n}: {\n /** The agent and session, when known; otherwise the sandbox is asked. */\n key: string | undefined\n sandbox: () => Promise<Experimental_SandboxSession>\n}): Promise<string> {\n const cached = key === undefined ? undefined : cwds.get(key)\n if (cached !== undefined) return cached\n const cwd = sandbox().then(async (resolved) => {\n // Bounded, unlike `run`: a login profile in the sandbox can print anything.\n const output = { stdout: '', stderr: '' }\n const decoder = { stdout: new TextDecoder(), stderr: new TextDecoder() }\n const { exitCode } = await sandboxExec({\n sandbox: resolved,\n command: 'pwd',\n onData: (data, stream) => {\n output[stream] += decoder[stream].decode(data, { stream: true })\n },\n }).catch((error: unknown) => {\n throw new Error(\"pi() could not read the sandbox's working directory\", {\n cause: error,\n })\n })\n const path = output.stdout.trim()\n if (exitCode !== 0 || !path.startsWith('/'))\n throw new Error(\n `pi() could not read the sandbox's working directory: ${(output.stderr || output.stdout).slice(0, 1000)}`,\n )\n return path\n })\n if (key !== undefined) {\n cwds.set(key, cwd, 1)\n cwd.catch(() => cwds.delete(key))\n }\n return cwd\n}\n\n// ------------------------------------------------------------- Pi\n\nlet loading: Promise<PiModules> | undefined\n\nfunction loadPi(): Promise<PiModules> {\n loading ??= Promise.all([\n import('@earendil-works/pi-coding-agent'),\n import('@earendil-works/pi-ai'),\n ]).then(\n ([agent, ai]) => ({ agent, ai }),\n (error: unknown) => {\n loading = undefined\n throw new Error(\n 'pi() needs @earendil-works/pi-coding-agent and @earendil-works/pi-ai: install them',\n { cause: error },\n )\n },\n )\n return loading\n}\n\n/** Pi's resources: nothing discovered from disk, the agent's instructions appended. */\nfunction resources(modules: PiModules, instructions: string[]): ResourceLoader {\n const runtime = modules.agent.createExtensionRuntime()\n return {\n getExtensions: () => ({ extensions: [], errors: [], runtime }),\n getSkills: () => ({ skills: [], diagnostics: [] }),\n getPrompts: () => ({ prompts: [], diagnostics: [] }),\n getThemes: () => ({ themes: [], diagnostics: [] }),\n getAgentsFiles: () => ({ agentsFiles: [] }),\n getSystemPrompt: () => undefined,\n getSystemPromptSource: () => undefined,\n getAppendSystemPrompt: () => instructions,\n getAppendSystemPromptSources: () => [],\n extendResources: () => {},\n reload: async () => {},\n }\n}\n\nfunction thinkingLevel(step: HarnessStep): {\n thinkingLevel?: 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh'\n} {\n if (step.reasoning === undefined || step.reasoning === 'provider-default')\n return {}\n return { thinkingLevel: step.reasoning === 'none' ? 'off' : step.reasoning }\n}\n\nfunction gatewayHeaders(credential: {\n token: string\n method: string\n}): Record<string, string> {\n return {\n authorization: `Bearer ${credential.token}`,\n 'ai-gateway-auth-method': credential.method,\n }\n}\n\n/** A stable Pi session ID for an A2 session, so Pi's cache affinity holds. */\nfunction sessionUuid(agentName: string, sessionId: string): string {\n const hex = createHash('sha256')\n .update(`${agentName}\\u001f${sessionId}`)\n .digest('hex')\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-8${hex.slice(13, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`\n}\n\nfunction savedSession(state: unknown): Saved | undefined {\n if (typeof state !== 'object' || state === null) return undefined\n const { version, cwd, header, entries } = state as Record<string, unknown>\n if (\n version !== SNAPSHOT_VERSION ||\n typeof cwd !== 'string' ||\n typeof header !== 'object' ||\n header === null ||\n !Array.isArray(entries)\n )\n return undefined\n return {\n cwd,\n header: header as SessionHeader,\n entries: entries as SessionEntry[],\n }\n}\n\nfunction compactionData(event: {\n result: { summary: string; tokensBefore: number; usage?: Usage } | undefined\n aborted: boolean\n errorMessage?: string\n}): CompactionPartData {\n if (event.result === undefined)\n return { status: event.aborted ? 'interrupted' : 'failed' }\n return {\n status: 'completed',\n inputTokens: event.result.tokensBefore,\n summary: event.result.summary,\n ...(event.result.usage === undefined\n ? {}\n : { usage: modelUsage(event.result.usage) }),\n }\n}\n\nfunction finishReason(reason: AssistantMessage['stopReason']): FinishReason {\n switch (reason) {\n case 'stop':\n return 'stop'\n case 'length':\n return 'length'\n case 'toolUse':\n return 'tool-calls'\n case 'error':\n return 'error'\n default:\n return 'other'\n }\n}\n\nfunction modelUsage(usage: Usage): LanguageModelUsage {\n return {\n inputTokens: usage.input + usage.cacheRead + usage.cacheWrite,\n inputTokenDetails: {\n noCacheTokens: usage.input,\n cacheReadTokens: usage.cacheRead,\n cacheWriteTokens: usage.cacheWrite,\n },\n outputTokens: usage.output,\n outputTokenDetails: {\n textTokens:\n usage.reasoning === undefined\n ? undefined\n : usage.output - usage.reasoning,\n reasoningTokens: usage.reasoning,\n },\n totalTokens: usage.totalTokens,\n }\n}\n\n// ------------------------------------------------------------- helpers\n\nfunction asError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error))\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ai-pi.js","names":["readLocalFile"],"sources":["../src/ai-pi.ts"],"sourcesContent":["/**\n * experimental-a2/ai/pi — `pi()`: the Pi harness for `agent({ harness })`.\n * Server-only; Pi comes from the optional `@earendil-works/pi-coding-agent`\n * and `@earendil-works/pi-ai` peer dependencies.\n */\n\n// oxlint-disable no-await-in-loop -- turns replay in order, each on the session the last one left.\n\nimport { createHash } from 'node:crypto'\nimport { readFile as readLocalFile, unlink } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { basename, dirname, join } from 'node:path'\nimport type {\n AssistantMessage,\n AssistantMessageEvent,\n AssistantMessageEventStream,\n ImageContent,\n JsonObject,\n TextContent,\n ThinkingContent,\n ToolCall,\n Usage,\n} from '@earendil-works/pi-ai'\nimport type {\n AgentSession,\n AgentToolResult,\n BashOperations,\n ModelRuntime,\n ResourceLoader,\n SessionEntry,\n SessionHeader,\n ToolDefinition,\n} from '@earendil-works/pi-coding-agent'\nimport {\n asSchema,\n jsonSchema,\n type Experimental_SandboxSession,\n type FinishReason,\n type JSONSchema7,\n type LanguageModelUsage,\n type Tool,\n type ToolExecutionOptions,\n type ToolSet,\n type UIMessageChunk,\n} from 'ai'\nimport {\n type Deferred,\n defineHarness,\n deferred,\n Divergence,\n gatewayCredential,\n type Harness,\n type HarnessGeneration,\n harnessImages,\n type HarnessInput,\n type HarnessRead,\n type HarnessSandbox,\n type HarnessStep,\n type HarnessTurn,\n pending,\n readHarness,\n type RecordedGeneration,\n saveHarness,\n} from './ai-harness.ts'\nimport { type SchemaInput, schemaInput } from './ai-tool-input.ts'\nimport type { CompactionPartData, ToolResultPayload } from './ai.ts'\nimport { boundedCache } from './bounded-cache.ts'\nimport { ambientToolScopeStorage } from './internal.ts'\n\nexport type {\n Harness,\n HarnessSandbox,\n HarnessSandboxContext,\n} from './ai-harness.ts'\n\n/** What `pi()` takes. */\nexport type PiOptions = {\n /** The session's sandbox: Pi's tools, and the agent's, work in it. */\n sandbox: HarnessSandbox\n}\n\n/**\n * The Pi harness. Every model call Pi makes is one durable step; A2 rebuilds\n * Pi's session for each step from its latest snapshot and the log since.\n */\nexport function pi(options: PiOptions): Harness<'pi', Builtin> {\n if (typeof options?.sandbox !== 'function')\n throw new TypeError('pi() requires sandbox')\n return defineHarness<'pi', Builtin>('pi', {\n sandbox: options.sandbox,\n tools: builtinTools,\n step: (step) =>\n runStep(step, async () =>\n options.sandbox({\n session: { id: step.sessionId },\n signal: step.signal,\n }),\n ),\n })\n}\n\nconst SNAPSHOT_VERSION = 1\nconst GATEWAY = 'vercel-ai-gateway'\n// The most a file read or a command's output moves from the sandbox to the\n// server. Pi's tools show the model 50 KB at a time, after reading it all.\nconst MAX_TRANSFER_BYTES = 4 * 1024 * 1024\nconst MAX_TRANSFER = '4 MiB'\n// Pi's default tools.\nconst BUILTINS = ['read', 'write', 'edit', 'bash'] as const\ntype Builtin = (typeof BUILTINS)[number]\n\ntype PiModules = {\n agent: typeof import('@earendil-works/pi-coding-agent')\n ai: typeof import('@earendil-works/pi-ai')\n}\n\n/**\n * A content block without the text the transcript already holds. A tool call\n * keeps its arguments only where the transcript's input is not the model's.\n */\ntype StoredBlock =\n | (Omit<TextContent, 'text'> & { ref: string })\n | (Omit<ThinkingContent, 'thinking'> & { ref: string })\n | (Omit<ToolCall, 'arguments'> & Partial<Pick<ToolCall, 'arguments'>>)\n\n/** What a step's transcript parts do not hold of Pi's response. */\ntype StoredResponse = Omit<AssistantMessage, 'content'> & {\n content: StoredBlock[]\n}\n\n/** The transient record of one model call, for replay. */\ntype PiRecord =\n | { call: 'step'; response: StoredResponse }\n | { call: 'compaction'; response: AssistantMessage }\n\n/** A user message as Pi takes it. */\ntype PiInput = { text: string; images: ImageContent[] }\n\ntype RecordedCall = {\n kind: 'step' | 'compaction'\n response: AssistantMessage\n /** Steering to queue while serving this call. */\n steers: PiInput[]\n}\n\ntype Saved = {\n cwd: string\n header: SessionHeader\n entries: SessionEntry[]\n}\n\ntype Completion = { finishReason?: FinishReason; usage?: LanguageModelUsage }\n\n/** The turn being replayed or run live, as the model and tool hooks see it. */\ntype TurnState = {\n plan: HarnessTurn\n calls: RecordedCall[]\n next: number\n liveStep: boolean\n /** The live step is over; Pi's run is being stopped. */\n over: boolean\n failure?: Error\n /** Resolves when the live step is over: Pi asked for its tools or another step. */\n stepOver: Deferred\n /** Live compaction responses, in request order. */\n compactions: AssistantMessage[]\n}\n\nfunction endStep(state: TurnState): void {\n state.over = true\n state.stepOver.resolve()\n}\n\nconst diverged = (message: string): Divergence => new Divergence('Pi', message)\n\n// ---------------------------------------------------------------- step\n\nasync function runStep(\n step: HarnessStep,\n sandbox: () => Promise<Experimental_SandboxSession>,\n): Promise<HarnessGeneration> {\n const modules = await loadPi()\n const credential = gatewayCredential('pi')\n const name = `${step.agentName}.a2.harness.pi`\n const { replayAll, ...first } = await readHarness({\n step,\n name,\n parse: savedSession,\n })\n let read: HarnessRead<Saved> = first\n let results = read.results\n const cwd =\n read.saved?.cwd ??\n (await sessionCwd({\n key: cwdKey(step.agentName, step.sessionId),\n sandbox,\n }))\n\n let completion: Completion = {}\n let session: AgentSession | undefined\n let compacting = false\n let turn: TurnState | undefined\n\n const fail = (state: TurnState, error: Error): never => {\n state.failure ??= error\n endStep(state)\n void session?.abort()\n throw state.failure\n }\n\n let controller: ReadableStreamDefaultController<UIMessageChunk> | undefined\n let closed = false\n const emit = (chunk: UIMessageChunk): void => {\n if (!closed) controller!.enqueue(chunk)\n }\n const record = (data: PiRecord): void =>\n emit({ type: 'data-a2-pi', data, transient: true })\n\n // ------------------------------------------------------ model calls\n\n const answer = async (\n out: AssistantMessageEventStream,\n model: Parameters<ModelRuntime['streamSimple']>[0],\n context: Parameters<ModelRuntime['streamSimple']>[1],\n options: Parameters<ModelRuntime['streamSimple']>[2],\n ): Promise<void> => {\n const state = turn!\n if (state.failure) throw state.failure\n // Stopping Pi runs its turn-end hooks; nothing they ask the model counts.\n if (state.over) {\n replay(out, interrupted(model))\n return\n }\n const kind = compacting ? 'compaction' : 'step'\n const recorded = state.calls[state.next]\n if (recorded !== undefined) {\n if (recorded.kind !== kind)\n fail(state, diverged(`call ${state.next} is not a ${kind}`))\n state.next++\n // Steering queued while a response streams enters after its tools.\n for (const { text, images } of recorded.steers)\n await session!.steer(text, images.length === 0 ? undefined : images)\n replay(out, recorded.response)\n return\n }\n if (state.plan.end === 'stop')\n fail(state, diverged('Pi continued a turn the log ended'))\n if (state.plan.end === 'interrupted') {\n replay(out, interrupted(model))\n return\n }\n if (kind === 'step' && state.liveStep) {\n // One generation is one step; the next step is A2's next generation.\n endStep(state)\n replay(out, interrupted(model))\n return\n }\n if (kind === 'step') state.liveStep = true\n const upstream = realStream(model, context, {\n ...options,\n headers: { ...options?.headers, ...gatewayHeaders(credential) },\n ...(step.speed === 'fast'\n ? { onPayload: fastTier(options?.onPayload) }\n : {}),\n })\n const live = kind === 'step' ? liveStep() : undefined\n for await (const event of upstream) {\n await live?.(event)\n if (event.type === 'done' || event.type === 'error') {\n const response = event.type === 'done' ? event.message : event.error\n if (kind === 'compaction') state.compactions.push(response)\n // A2 retries the step; Pi's own recovery would run outside it.\n if (event.type === 'error' && event.reason === 'error') {\n state.failure ??= new Error(\n response.errorMessage ?? 'the Pi model call failed',\n )\n endStep(state)\n }\n }\n out.push(event)\n }\n }\n\n /**\n * A live call's input as Pi's loop, then the AI SDK step, read it. Pi\n * answers a call to no tool, or whose arguments it cannot prepare or\n * validate, itself. The agent's tool reads the arguments Pi accepts through\n * its own schema; A2 runs Pi's own tools from the model's arguments, as\n * Pi's loop does.\n */\n const callInput = async (block: ToolCall): Promise<SchemaInput> => {\n const definition = tools.find((tool) => tool.name === block.name)\n if (definition === undefined)\n return { success: false, errorText: `Tool ${block.name} not found` }\n let args: unknown\n try {\n const prepared = definition.prepareArguments?.(block.arguments)\n args = modules.ai.validateToolArguments(\n definition,\n prepared === undefined\n ? block\n : { ...block, arguments: prepared as JsonObject },\n )\n } catch (error) {\n return { success: false, errorText: asError(error).message }\n }\n if (builtinOf(step.tools, block.name) !== undefined)\n return { success: true, value: block.arguments }\n return schemaInput({ tools: step.tools, toolName: block.name, value: args })\n }\n\n /** Streams one live step response as UI chunks and records it. */\n const liveStep = () => {\n const ref = (index: number) => `pi:${step.requestIndex}:${index}`\n const started = new Set<string>()\n return async (event: AssistantMessageEvent): Promise<void> => {\n switch (event.type) {\n case 'start':\n emit({ type: 'start-step' })\n break\n case 'text_start':\n emit({ type: 'text-start', id: ref(event.contentIndex) })\n break\n case 'text_delta':\n emit({\n type: 'text-delta',\n id: ref(event.contentIndex),\n delta: event.delta,\n })\n break\n case 'text_end':\n emit({ type: 'text-end', id: ref(event.contentIndex) })\n break\n case 'thinking_start':\n emit({ type: 'reasoning-start', id: ref(event.contentIndex) })\n break\n case 'thinking_delta':\n emit({\n type: 'reasoning-delta',\n id: ref(event.contentIndex),\n delta: event.delta,\n })\n break\n case 'thinking_end':\n emit({ type: 'reasoning-end', id: ref(event.contentIndex) })\n break\n case 'toolcall_start':\n case 'toolcall_delta': {\n const call = event.partial.content[event.contentIndex] as ToolCall\n if (!call.id) break\n if (!started.has(call.id)) {\n started.add(call.id)\n emit({\n type: 'tool-input-start',\n toolCallId: call.id,\n toolName: call.name,\n })\n }\n if (event.type === 'toolcall_delta')\n emit({\n type: 'tool-input-delta',\n toolCallId: call.id,\n inputTextDelta: event.delta,\n })\n break\n }\n case 'done':\n case 'error': {\n const response = event.type === 'done' ? event.message : event.error\n // Calls whose transcript input is not the model's arguments.\n const changed = new Set<string>()\n if (event.type === 'done') {\n for (const block of response.content) {\n if (block.type !== 'toolCall') continue\n if (!started.has(block.id))\n emit({\n type: 'tool-input-start',\n toolCallId: block.id,\n toolName: block.name,\n })\n // Pi does not run the calls of a cut-off response.\n const input: SchemaInput =\n response.stopReason === 'length'\n ? {\n success: false,\n errorText:\n 'The response hit the output token limit before this call was complete.',\n }\n : await callInput(block)\n if (\n input.success &&\n JSON.stringify(input.value) !== JSON.stringify(block.arguments)\n )\n changed.add(block.id)\n emit(\n input.success\n ? {\n type: 'tool-input-available',\n toolCallId: block.id,\n toolName: block.name,\n input: input.value,\n }\n : {\n type: 'tool-input-error',\n toolCallId: block.id,\n toolName: block.name,\n input: block.arguments,\n errorText: input.errorText,\n },\n )\n }\n }\n record({\n call: 'step',\n response: storedResponse(response, ref, changed),\n })\n completion = {\n finishReason: finishReason(response.stopReason),\n usage: modelUsage(response.usage),\n }\n break\n }\n }\n }\n }\n\n // ----------------------------------------------------- tool results\n\n const toolResult = async (\n toolCallId: string,\n signal: AbortSignal | undefined,\n shape: 'pi' | 'tool',\n ): Promise<AgentToolResult<unknown>> => {\n const state = turn!\n if (state.failure) throw state.failure\n const result = results.get(toolCallId)\n if (result !== undefined) return answeredTool(result, shape)\n if (state.plan.end === 'live' && state.liveStep) {\n // Pi now waits on tools that A2's tool handlers run.\n endStep(state)\n return pending(signal)\n }\n if (state.plan.end === 'interrupted') {\n void session!.abort()\n return pending(signal)\n }\n return fail(state, diverged(`no recorded result for ${toolCallId}`))\n }\n\n // ------------------------------------------------------------ run\n\n const runtime = await modules.agent.ModelRuntime.create({\n credentials: new modules.ai.InMemoryCredentialStore(),\n modelsPath: null,\n allowModelNetwork: false,\n refreshOnCreate: false,\n })\n await runtime.setRuntimeApiKey(GATEWAY, credential.token)\n const model = runtime.getModel(GATEWAY, step.model)\n if (model === undefined)\n throw new Error(`Pi does not know the Gateway model ${step.model}`)\n const realStream = runtime.streamSimple.bind(runtime)\n runtime.streamSimple = (requested, context, options?) => {\n const out = modules.ai.createAssistantMessageEventStream()\n answer(out, requested, context, options).catch((error: unknown) => {\n const state = turn\n if (state) state.failure ??= asError(error)\n replay(out, { ...interrupted(requested), stopReason: 'error' })\n })\n return out\n }\n\n const tools = await sessionTools(modules, step.tools, cwd, toolResult)\n\n const createSession = async (from: Saved | undefined) => {\n const sessionManager =\n from === undefined\n ? modules.agent.SessionManager.inMemory(cwd, {\n id: sessionUuid(step.agentName, step.sessionId),\n })\n : modules.agent.SessionManager.inMemory(cwd, { id: from.header.id }, [\n from.header,\n ...from.entries,\n ])\n const created = await modules.agent.createAgentSession({\n cwd,\n // Pi reads nothing there: every resource and manager comes from A2.\n agentDir: join(tmpdir(), 'a2-pi'),\n model,\n ...thinkingLevel(step),\n modelRuntime: runtime,\n resourceLoader: resources(modules, step.instructions),\n sessionManager,\n settingsManager: modules.agent.SettingsManager.inMemory({\n // A2 retries failed steps.\n retry: { enabled: false, maxRetries: 0, baseDelayMs: 0 },\n cacheWarming: 'off',\n }),\n customTools: tools,\n tools: tools.map((definition) => definition.name),\n })\n created.session.subscribe((event) => {\n if (event.type === 'compaction_start') compacting = true\n if (event.type !== 'compaction_end') return\n compacting = false\n const state = turn\n if (state === undefined || state.over || state.compactions.length === 0)\n return\n for (const response of state.compactions.splice(0))\n record({ call: 'compaction', response })\n emit({\n type: 'data-a2-compaction',\n id: `pi-compaction:${step.requestIndex}:${compactions++}`,\n data: compactionData(event),\n })\n })\n return created.session\n }\n let compactions = 0\n\n const saveSnapshot = async (): Promise<void> => {\n const manager = session!.sessionManager\n const header = manager.getHeader()\n const entries = manager.getEntries()\n const last = entries.findLast(\n (entry) => entry.type === 'message' && entry.message.role === 'assistant',\n )\n const stop =\n last?.type === 'message' && last.message.role === 'assistant'\n ? last.message.stopReason\n : undefined\n // Only a turn this attempt finished describes the log.\n if (\n header === null ||\n step.signal.aborted ||\n stop === 'aborted' ||\n stop === 'error'\n )\n return\n await saveHarness({\n step,\n name,\n state: { version: SNAPSHOT_VERSION, cwd, header, entries },\n })\n }\n\n const run = async (): Promise<void> => {\n emit({ type: 'start', messageId: step.responseMessageId })\n try {\n session = await createSession(read.saved)\n } catch (error) {\n if (read.saved === undefined) throw error\n // An unusable snapshot: replay the whole log instead.\n read = await replayAll()\n results = read.results\n session = await createSession(undefined)\n }\n for (const plan of read.turns) {\n if (step.signal.aborted) return\n const prompt = await piInput({ input: plan.prompt, signal: step.signal })\n const state: TurnState = {\n plan,\n calls: await recordedTurn({ turn: plan, signal: step.signal }),\n next: 0,\n liveStep: false,\n over: false,\n stepOver: deferred(),\n compactions: [],\n }\n turn = state\n const running = session.prompt(prompt.text, {\n expandPromptTemplates: false,\n ...(prompt.images.length === 0 ? {} : { images: prompt.images }),\n })\n if (plan.end !== 'live') {\n await running.catch((error: unknown) => {\n throw state.failure ?? error\n })\n if (state.failure) throw state.failure\n continue\n }\n const ended = await Promise.race([\n running.then(() => true),\n state.stepOver.promise.then(() => false),\n ]).catch((error: unknown) => {\n throw state.failure ?? error\n })\n if (!ended) {\n await session.abort()\n await running.catch(() => {})\n }\n if (state.failure) throw state.failure\n if (ended) await saveSnapshot()\n emit({ type: 'finish-step' })\n emit({\n type: 'finish',\n ...(completion.finishReason === undefined\n ? {}\n : { finishReason: completion.finishReason }),\n })\n }\n }\n\n const stream = new ReadableStream<UIMessageChunk>({\n start(streamController) {\n controller = streamController\n const abort = () => void session?.abort()\n step.signal.addEventListener('abort', abort, { once: true })\n void (async () => {\n try {\n await run()\n closed = true\n streamController.close()\n } catch (error) {\n closed = true\n streamController.error(\n step.signal.aborted ? step.signal.reason : error,\n )\n } finally {\n step.signal.removeEventListener('abort', abort)\n session?.dispose()\n }\n })()\n },\n cancel() {\n closed = true\n void session?.abort()\n },\n })\n\n return { stream, completion: () => completion }\n}\n\n// ------------------------------------------------------------ the plan\n\n/** A turn's recorded model calls, in the order Pi made them. */\nasync function recordedTurn({\n turn,\n signal,\n}: {\n turn: HarnessTurn\n signal: AbortSignal\n}): Promise<RecordedCall[]> {\n const calls: RecordedCall[] = []\n for (const [index, generation] of turn.generations.entries()) {\n calls.push(...recordedCalls(generation))\n const steers = turn.steers.get(index)\n const last = calls.findLast((call) => call.kind === 'step')\n if (steers !== undefined && last !== undefined)\n for (const input of steers)\n last.steers.push(await piInput({ input, signal }))\n }\n return calls\n}\n\nasync function piInput({\n input,\n signal,\n}: {\n input: HarnessInput\n signal: AbortSignal\n}): Promise<PiInput> {\n const images = await harnessImages({ harness: 'pi()', input, signal })\n return {\n text: input.text,\n images: images.map((image) => ({\n type: 'image',\n data: image.data,\n mimeType: image.mediaType,\n })),\n }\n}\n\nfunction recordedCalls(generation: RecordedGeneration): RecordedCall[] {\n const texts = new Map<string, string>()\n const inputs = new Map<string, unknown>()\n const calls: RecordedCall[] = []\n for (const chunk of generation.chunks) {\n switch (chunk.type) {\n case 'text-delta':\n case 'reasoning-delta':\n texts.set(chunk.id, (texts.get(chunk.id) ?? '') + chunk.delta)\n break\n case 'tool-input-available':\n case 'tool-input-error':\n inputs.set(chunk.toolCallId, chunk.input)\n break\n case 'data-a2-pi': {\n const record = chunk.data as PiRecord\n calls.push({\n kind: record.call,\n response:\n record.call === 'step'\n ? restoredResponse(record.response, texts, inputs)\n : record.response,\n steers: [],\n })\n break\n }\n }\n }\n if (!calls.some((call) => call.kind === 'step'))\n throw diverged('a completed generation has no recorded response')\n return calls\n}\n\nfunction storedResponse(\n response: AssistantMessage,\n ref: (index: number) => string,\n changed: ReadonlySet<string>,\n): StoredResponse {\n return {\n ...response,\n content: response.content.map((block, index): StoredBlock => {\n switch (block.type) {\n case 'text': {\n const { text: _, ...rest } = block\n return { ...rest, ref: ref(index) }\n }\n case 'thinking': {\n const { thinking: _, ...rest } = block\n return { ...rest, ref: ref(index) }\n }\n case 'toolCall': {\n if (changed.has(block.id)) return block\n const { arguments: _, ...rest } = block\n return rest\n }\n }\n }),\n }\n}\n\nfunction restoredResponse(\n stored: StoredResponse,\n texts: ReadonlyMap<string, string>,\n inputs: ReadonlyMap<string, unknown>,\n): AssistantMessage {\n return {\n ...stored,\n content: stored.content.map((block) => {\n if (block.type === 'toolCall')\n return {\n ...block,\n arguments:\n block.arguments ?? ((inputs.get(block.id) ?? {}) as JsonObject),\n }\n const { ref, ...rest } = block\n const text = texts.get(ref) ?? ''\n return rest.type === 'text'\n ? { ...rest, text }\n : { ...rest, thinking: text }\n }),\n }\n}\n\n/** Hands a recorded response to Pi's loop. */\nfunction replay(out: AssistantMessageEventStream, response: AssistantMessage) {\n out.push({ type: 'start', partial: response })\n const reason = response.stopReason\n if (reason === 'error' || reason === 'aborted')\n out.push({ type: 'error', reason, error: response })\n else if (reason === 'pending')\n out.push({ type: 'done', reason: 'stop', message: response })\n else out.push({ type: 'done', reason, message: response })\n}\n\n/** The response of a model call that A2 interrupted. */\nfunction interrupted(\n model: Parameters<ModelRuntime['streamSimple']>[0],\n): AssistantMessage {\n return {\n role: 'assistant',\n content: [],\n api: model.api,\n provider: model.provider,\n model: model.id,\n usage: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n },\n stopReason: 'aborted',\n timestamp: Date.now(),\n }\n}\n\n// ----------------------------------------------------------- the tools\n\nconst builtinTools: ToolSet = Object.fromEntries(\n BUILTINS.map((name): [string, Tool] => [\n name,\n {\n inputSchema: jsonSchema(\n async () =>\n builtinDefinition(await loadPi(), name, '/')\n .parameters as JSONSchema7,\n ),\n execute: (input: unknown, options: ToolExecutionOptions<unknown>) =>\n runBuiltin(name, input, options),\n },\n ]),\n)\n\n/** Runs one of Pi's tools in the session's sandbox, as Pi's loop would. */\nasync function runBuiltin(\n name: Builtin,\n input: unknown,\n options: ToolExecutionOptions<unknown>,\n): Promise<AgentToolResult<unknown>> {\n const sandbox = options.experimental_sandbox\n if (sandbox === undefined)\n throw new Error(`pi() runs ${name} in the agent's sandbox`)\n const modules = await loadPi()\n const scope = ambientToolScopeStorage()?.getStore()\n const event = (scope?.context as { event?: { sessionId?: unknown } })?.event\n const cwd = await sessionCwd({\n key:\n scope?.contract !== undefined && typeof event?.sessionId === 'string'\n ? cwdKey(scope.contract.name, event.sessionId)\n : undefined,\n sandbox: async () => sandbox,\n })\n const definition = builtinDefinition(modules, name, cwd, {\n sandbox,\n signal: options.abortSignal,\n })\n const args: unknown = modules.ai.validateToolArguments(definition, {\n type: 'toolCall',\n id: options.toolCallId,\n name,\n arguments: (definition.prepareArguments?.(input) ?? input) as JsonObject,\n })\n // Pi's bash keeps a long output's full text in a local file, named in its\n // updates and its result. It is removed however the call ends.\n let outputFile: string | undefined\n try {\n const result = await definition.execute(\n options.toolCallId,\n args,\n options.abortSignal,\n (update) => {\n outputFile ??= fullOutputPath(update)\n },\n // Pi's tools take their context from the session, which A2 runs elsewhere.\n undefined as never,\n )\n outputFile ??= fullOutputPath(result)\n return await recordedResult(result, sandbox)\n } catch (error) {\n // Output whose last bytes tip it over Pi's limit opens the file only as\n // it ends, after the last update; a failed call then names it in its error.\n outputFile ??= namedOutputFile(error)\n throw error\n } finally {\n if (outputFile !== undefined) await unlink(outputFile).catch(() => {})\n }\n}\n\ntype BuiltinDetails =\n { truncation?: { content?: unknown }; fullOutputPath?: unknown } | undefined\n\nconst fullOutputPath = (\n result: AgentToolResult<unknown>,\n): string | undefined => {\n const path = (result.details as BuiltinDetails)?.fullOutputPath\n return typeof path === 'string' ? path : undefined\n}\n\n/** The full-output file an aborted or timed-out bash call's error names. */\nfunction namedOutputFile(error: unknown): string | undefined {\n if (!(error instanceof Error)) return undefined\n const path = /Full output: ([^\\n]+)\\]\\n\\nCommand [^\\n]+$/.exec(\n error.message,\n )?.[1]\n // The command's own output precedes Pi's note, and could name any file.\n return path !== undefined &&\n dirname(path) === tmpdir() &&\n /^pi-bash-[0-9a-f]{16}\\.log$/.test(basename(path))\n ? path\n : undefined\n}\n\n/**\n * What the log keeps of a result: what Pi's tool-result message holds. A\n * long output's full text moves to the path its result names in the sandbox,\n * where the model's `read` finds it.\n */\nasync function recordedResult(\n result: AgentToolResult<unknown>,\n sandbox: Experimental_SandboxSession,\n): Promise<AgentToolResult<unknown>> {\n // Pi's tool-result message does not carry structured content.\n const { structuredContent: _, ...kept } =\n result as AgentToolResult<unknown> & {\n structuredContent?: unknown\n }\n const details = kept.details as BuiltinDetails\n const path = fullOutputPath(kept)\n if (path !== undefined) {\n try {\n await sandbox.writeBinaryFile({\n path,\n content: await readLocalFile(path),\n })\n } catch {\n // The result stands without it; the model can rerun the command.\n }\n }\n if (details?.truncation === undefined) return kept\n // The truncated text is the result's content already.\n const { content: __, ...truncation } = details.truncation\n return { ...kept, details: { ...details, truncation } }\n}\n\n/** The Pi tool a name in the agent's tool set runs, unless the agent replaced it. */\nconst builtinOf = (tools: ToolSet, name: string): Builtin | undefined =>\n BUILTINS.find(\n (candidate) =>\n candidate === name &&\n Object.hasOwn(tools, name) &&\n tools[name] === builtinTools[name],\n )\n\n// Each definition is typed by its parameters; a session takes any of them.\nconst untyped = (definition: object) => definition as ToolDefinition\n\nfunction builtinDefinition(\n modules: PiModules,\n name: Builtin,\n cwd: string,\n call?: {\n sandbox: Experimental_SandboxSession\n signal: AbortSignal | undefined\n },\n): ToolDefinition {\n const sandbox = call?.sandbox\n const files =\n call === undefined ? undefined : { operations: sandboxFiles(call) }\n switch (name) {\n case 'read':\n return untyped(modules.agent.createReadToolDefinition(cwd, files))\n case 'write':\n return untyped(modules.agent.createWriteToolDefinition(cwd, files))\n case 'edit':\n return untyped(modules.agent.createEditToolDefinition(cwd, files))\n case 'bash':\n return untyped(\n modules.agent.createBashToolDefinition(cwd, {\n // No PI_* variables reach the sandbox, so Pi's prompt names none.\n exposeSessionEnvironment: false,\n ...(sandbox === undefined\n ? {}\n : { operations: sandboxBash(sandbox) }),\n }),\n )\n }\n}\n\n/**\n * The tools Pi's session declares: Pi's own, and the agent's. Their results\n * come from A2's log; A2's tool handlers ran them.\n */\nasync function sessionTools(\n modules: PiModules,\n tools: ToolSet,\n cwd: string,\n result: (\n toolCallId: string,\n signal: AbortSignal | undefined,\n shape: 'pi' | 'tool',\n ) => Promise<AgentToolResult<unknown>>,\n): Promise<ToolDefinition[]> {\n return Promise.all(\n Object.entries(tools).map(async ([name, tool]): Promise<ToolDefinition> => {\n const builtin = builtinOf(tools, name)\n if (builtin !== undefined)\n // Pi's own definition, for its prompt; A2 already ran the call.\n return Object.assign(builtinDefinition(modules, builtin, cwd), {\n execute: (\n toolCallId: string,\n _params: unknown,\n signal?: AbortSignal,\n ) => result(toolCallId, signal, 'pi'),\n })\n return {\n name,\n label: name,\n description:\n typeof tool.description === 'string' ? tool.description : '',\n parameters: (await asSchema(tool.inputSchema)\n .jsonSchema) as ToolDefinition['parameters'],\n execute: (toolCallId, _params, signal) =>\n result(toolCallId, signal, 'tool'),\n }\n }),\n )\n}\n\nfunction answeredTool(\n result: ToolResultPayload,\n shape: 'pi' | 'tool',\n): AgentToolResult<unknown> {\n if (result.error !== undefined) throw new Error(result.error)\n if (result.denied === true) throw new Error('The tool call was denied.')\n if (shape === 'pi') return result.output as AgentToolResult<unknown>\n const output = result.output\n return {\n content: [\n {\n type: 'text',\n text:\n typeof output === 'string' ? output : (JSON.stringify(output) ?? ''),\n },\n ],\n details: undefined,\n }\n}\n\n// ------------------------------------------------------------ sandbox\n\n/** Pi's file operations, against the sandbox. */\nfunction sandboxFiles({\n sandbox,\n signal,\n}: {\n sandbox: Experimental_SandboxSession\n /** The tool call's: it stops a read or write in flight. */\n signal: AbortSignal | undefined\n}) {\n const abortSignal = signal === undefined ? {} : { abortSignal: signal }\n let checked: { path: string; bytes: Buffer } | undefined\n const readFile = async (path: string): Promise<Buffer> => {\n if (checked?.path === path) {\n const { bytes } = checked\n checked = undefined\n return bytes\n }\n const stream = await sandbox.readFile({ path, ...abortSignal })\n if (stream === null)\n throw Object.assign(\n new Error(`ENOENT: no such file or directory, open '${path}'`),\n { code: 'ENOENT' },\n )\n const chunks: Uint8Array[] = []\n let size = 0\n // Leaving the loop cancels the stream.\n for await (const chunk of stream) {\n size += chunk.byteLength\n if (size > MAX_TRANSFER_BYTES)\n throw new Error(\n `${path} is larger than ${MAX_TRANSFER}. Read or change parts of it with bash, using sed, head, or grep.`,\n )\n chunks.push(chunk)\n }\n return Buffer.concat(chunks)\n }\n return {\n readFile,\n // Pi checks a file just before reading it; the check's read serves both.\n access: async (path: string): Promise<void> => {\n checked = { path, bytes: await readFile(path) }\n },\n writeFile: async (path: string, content: string): Promise<void> => {\n checked = undefined\n await sandbox.writeTextFile({ path, content, ...abortSignal })\n },\n // The sandbox creates parent directories as it writes.\n mkdir: async (): Promise<void> => {},\n }\n}\n\n/** Pi's shell operations, against the sandbox. */\nconst sandboxBash = (sandbox: Experimental_SandboxSession): BashOperations => ({\n // Pi hands over the server's environment; it never reaches the sandbox.\n exec: (command, cwd, { onData, signal, timeout }) =>\n sandboxExec({\n sandbox,\n command,\n workingDirectory: cwd,\n onData,\n signal,\n timeout,\n }),\n})\n\n/**\n * Runs a command in the sandbox with Pi's error contract. At most\n * `MAX_TRANSFER_BYTES` of its output reach the server; past that, the\n * command is stopped.\n */\nasync function sandboxExec({\n sandbox,\n command,\n workingDirectory,\n onData,\n signal,\n timeout,\n}: {\n sandbox: Experimental_SandboxSession\n command: string\n /** The sandbox's own when absent. */\n workingDirectory?: string\n onData: (data: Buffer, stream: 'stdout' | 'stderr') => void\n signal?: AbortSignal | undefined\n /** In seconds. */\n timeout?: number | undefined\n}): Promise<{ exitCode: number }> {\n if (signal?.aborted) throw new Error('aborted')\n const stop = new AbortController()\n const abort = () => stop.abort()\n signal?.addEventListener('abort', abort, { once: true })\n let timedOut = false\n const timer =\n timeout === undefined || timeout <= 0\n ? undefined\n : setTimeout(() => {\n timedOut = true\n stop.abort()\n }, timeout * 1000)\n let size = 0\n let overflowed = false\n const overflow = (options?: ErrorOptions) =>\n new Error(\n `The command's output passed ${MAX_TRANSFER}, so it was stopped. Write long output to a file and read parts of it with head, tail, or grep.`,\n options,\n )\n let exitCode: number\n try {\n const process = await sandbox.spawn({\n command,\n ...(workingDirectory === undefined ? {} : { workingDirectory }),\n abortSignal: stop.signal,\n })\n const pipe = async (stream: 'stdout' | 'stderr') => {\n for await (const chunk of process[stream]) {\n size += chunk.byteLength\n if (size > MAX_TRANSFER_BYTES) {\n overflowed = true\n stop.abort()\n return\n }\n onData(Buffer.from(chunk), stream)\n }\n }\n const [exited] = await Promise.all([\n process.wait(),\n pipe('stdout'),\n pipe('stderr'),\n ])\n exitCode = exited.exitCode\n } catch (error) {\n if (signal?.aborted) throw new Error('aborted', { cause: error })\n if (timedOut) throw new Error(`timeout:${timeout}`, { cause: error })\n if (overflowed) throw overflow({ cause: error })\n throw error\n } finally {\n clearTimeout(timer)\n signal?.removeEventListener('abort', abort)\n }\n if (signal?.aborted) throw new Error('aborted')\n if (timedOut) throw new Error(`timeout:${timeout}`)\n if (overflowed) throw overflow()\n return { exitCode }\n}\n\n// Sandbox resolvers may return a new object each time; sessions keep theirs.\nconst cwds = boundedCache<string, Promise<string>>({\n maxEntries: 1000,\n maxBytes: 1000,\n})\n\nconst cwdKey = (agentName: string, sessionId: string): string =>\n `${agentName}\\u001f${sessionId}`\n\n/** A session's working directory in its sandbox: Pi's cwd. */\nfunction sessionCwd({\n key,\n sandbox,\n}: {\n /** The agent and session, when known; otherwise the sandbox is asked. */\n key: string | undefined\n sandbox: () => Promise<Experimental_SandboxSession>\n}): Promise<string> {\n const cached = key === undefined ? undefined : cwds.get(key)\n if (cached !== undefined) return cached\n const cwd = sandbox().then(async (resolved) => {\n // Bounded, unlike `run`: a login profile in the sandbox can print anything.\n const output = { stdout: '', stderr: '' }\n const decoder = { stdout: new TextDecoder(), stderr: new TextDecoder() }\n const { exitCode } = await sandboxExec({\n sandbox: resolved,\n command: 'pwd',\n onData: (data, stream) => {\n output[stream] += decoder[stream].decode(data, { stream: true })\n },\n }).catch((error: unknown) => {\n throw new Error(\"pi() could not read the sandbox's working directory\", {\n cause: error,\n })\n })\n const path = output.stdout.trim()\n if (exitCode !== 0 || !path.startsWith('/'))\n throw new Error(\n `pi() could not read the sandbox's working directory: ${(output.stderr || output.stdout).slice(0, 1000)}`,\n )\n return path\n })\n if (key !== undefined) {\n cwds.set(key, cwd, 1)\n cwd.catch(() => cwds.delete(key))\n }\n return cwd\n}\n\n// ------------------------------------------------------------- Pi\n\nlet loading: Promise<PiModules> | undefined\n\nfunction loadPi(): Promise<PiModules> {\n loading ??= Promise.all([\n import('@earendil-works/pi-coding-agent'),\n import('@earendil-works/pi-ai'),\n ]).then(\n ([agent, ai]) => ({ agent, ai }),\n (error: unknown) => {\n loading = undefined\n throw new Error(\n 'pi() needs @earendil-works/pi-coding-agent and @earendil-works/pi-ai: install them',\n { cause: error },\n )\n },\n )\n return loading\n}\n\n/** Pi's resources: nothing discovered from disk, the agent's instructions appended. */\nfunction resources(modules: PiModules, instructions: string[]): ResourceLoader {\n const runtime = modules.agent.createExtensionRuntime()\n return {\n getExtensions: () => ({ extensions: [], errors: [], runtime }),\n getSkills: () => ({ skills: [], diagnostics: [] }),\n getPrompts: () => ({ prompts: [], diagnostics: [] }),\n getThemes: () => ({ themes: [], diagnostics: [] }),\n getAgentsFiles: () => ({ agentsFiles: [] }),\n getSystemPrompt: () => undefined,\n getSystemPromptSource: () => undefined,\n getAppendSystemPrompt: () => instructions,\n getAppendSystemPromptSources: () => [],\n extendResources: () => {},\n reload: async () => {},\n }\n}\n\nfunction thinkingLevel(step: HarnessStep): {\n thinkingLevel?: 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh'\n} {\n if (step.reasoning === undefined || step.reasoning === 'provider-default')\n return {}\n return { thinkingLevel: step.reasoning === 'none' ? 'off' : step.reasoning }\n}\n\ntype PayloadHook = NonNullable<\n NonNullable<Parameters<ModelRuntime['streamSimple']>[2]>['onPayload']\n>\n\n/** Asks AI Gateway for the model's fast tier, on the payload Pi's own hook returns. */\nfunction fastTier(inner: PayloadHook | undefined): PayloadHook {\n return async (payload, model) => {\n const body = ((await inner?.(payload, model)) ?? payload) as {\n providerOptions?: { gateway?: object }\n }\n return {\n ...body,\n providerOptions: {\n ...body.providerOptions,\n gateway: { ...body.providerOptions?.gateway, speed: 'fast' },\n },\n }\n }\n}\n\nfunction gatewayHeaders(credential: {\n token: string\n method: string\n}): Record<string, string> {\n return {\n authorization: `Bearer ${credential.token}`,\n 'ai-gateway-auth-method': credential.method,\n }\n}\n\n/** A stable Pi session ID for an A2 session, so Pi's cache affinity holds. */\nfunction sessionUuid(agentName: string, sessionId: string): string {\n const hex = createHash('sha256')\n .update(`${agentName}\\u001f${sessionId}`)\n .digest('hex')\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-8${hex.slice(13, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`\n}\n\nfunction savedSession(state: unknown): Saved | undefined {\n if (typeof state !== 'object' || state === null) return undefined\n const { version, cwd, header, entries } = state as Record<string, unknown>\n if (\n version !== SNAPSHOT_VERSION ||\n typeof cwd !== 'string' ||\n typeof header !== 'object' ||\n header === null ||\n !Array.isArray(entries)\n )\n return undefined\n return {\n cwd,\n header: header as SessionHeader,\n entries: entries as SessionEntry[],\n }\n}\n\nfunction compactionData(event: {\n result: { summary: string; tokensBefore: number; usage?: Usage } | undefined\n aborted: boolean\n errorMessage?: string\n}): CompactionPartData {\n if (event.result === undefined)\n return { status: event.aborted ? 'interrupted' : 'failed' }\n return {\n status: 'completed',\n inputTokens: event.result.tokensBefore,\n summary: event.result.summary,\n ...(event.result.usage === undefined\n ? {}\n : { usage: modelUsage(event.result.usage) }),\n }\n}\n\nfunction finishReason(reason: AssistantMessage['stopReason']): FinishReason {\n switch (reason) {\n case 'stop':\n return 'stop'\n case 'length':\n return 'length'\n case 'toolUse':\n return 'tool-calls'\n case 'error':\n return 'error'\n default:\n return 'other'\n }\n}\n\nfunction modelUsage(usage: Usage): LanguageModelUsage {\n return {\n inputTokens: usage.input + usage.cacheRead + usage.cacheWrite,\n inputTokenDetails: {\n noCacheTokens: usage.input,\n cacheReadTokens: usage.cacheRead,\n cacheWriteTokens: usage.cacheWrite,\n },\n outputTokens: usage.output,\n outputTokenDetails: {\n textTokens:\n usage.reasoning === undefined\n ? undefined\n : usage.output - usage.reasoning,\n reasoningTokens: usage.reasoning,\n },\n totalTokens: usage.totalTokens,\n }\n}\n\n// ------------------------------------------------------------- helpers\n\nfunction asError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error))\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { s as Contract, t as Reducer, u as EventDefs } from "./reducer-CqA59Q6U.js";
2
2
  import { t as InitialSnapshot } from "./initial-snapshot-Bx-c0pDP.js";
3
3
  import { t as A2Client, u as PushResult } from "./client-h_DKFAjj.js";
4
- import { B as PendingApproval, V as PendingInput, d as AgentStatus, i as AIState, t as AIEventDefs } from "./ai-BMLlI2Ff.js";
4
+ import { B as PendingApproval, V as PendingInput, d as AgentStatus, i as AIState, t as AIEventDefs } from "./ai-Cz3hqVhk.js";
5
5
  import { AgentClient, AgentMessage, AnyAgent } from "./ai-client.js";
6
6
  import { c as UseSessionResult } from "./react-BBXgHWFc.js";
7
7
  import { JSONValue, UIMessage } from "ai";
package/dist/ai-react.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { t as createClient } from "./client-BhHLoNKF.js";
3
3
  import { useSession } from "./react.js";
4
- import { s as inputs, x as isCompactionPart } from "./ai-D6mGlO8j.js";
4
+ import { s as inputs, x as isCompactionPart } from "./ai-mMiWul1T.js";
5
5
  import { createAgentClient } from "./ai-client.js";
6
6
  //#region src/ai-agent-actions.ts
7
7
  const visible = (part) => part.type === "text" ? part.text.length > 0 : part.type !== "reasoning" && part.type !== "step-start" && !isCompactionPart(part);
@@ -1,7 +1,7 @@
1
1
  import { c as ContractEvent, s as Contract, t as Reducer, u as EventDefs, v as StandardSchemaV1 } from "./reducer-CqA59Q6U.js";
2
2
  import { c as HandlerContext, m as ServerOptions, n as A2Server } from "./server-DYAATFuT.js";
3
- import { H as ReasoningLevel, a as AI_STATE_REDUCER, f as AgentToolContext, i as AIState, p as AgentToolEventDefs, r as AIMessageOf, t as AIEventDefs } from "./ai-BMLlI2Ff.js";
4
- import { t as Harness } from "./ai-harness-B2suP2Qh.js";
3
+ import { H as ReasoningLevel, a as AI_STATE_REDUCER, f as AgentToolContext, i as AIState, p as AgentToolEventDefs, r as AIMessageOf, t as AIEventDefs } from "./ai-Cz3hqVhk.js";
4
+ import { t as Harness } from "./ai-harness-CV6rXbB3.js";
5
5
  import { Instructions, ModelMessage, TextStreamPart, ToolSet, ToolSet as ToolSet$1, UIMessage, UIMessageChunk, streamText } from "ai";
6
6
  //#region src/ai-sdk-step.d.ts
7
7
  type StreamTextOptions<T extends ToolSet$1> = Parameters<typeof streamText<T>>[0];
@@ -1 +1 @@
1
- {"version":3,"file":"ai-server.d.ts","names":[],"sources":["../src/ai-sdk-step.ts","../src/ai-agent.ts"],"mappings":"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"}
1
+ {"version":3,"file":"ai-server.d.ts","names":[],"sources":["../src/ai-sdk-step.ts","../src/ai-agent.ts"],"mappings":"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"}