@earendil-works/pi-durable 1.0.3 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +2 -0
  3. package/dist/env/node-watch.d.ts.map +1 -1
  4. package/dist/env/node-watch.js +89 -35
  5. package/dist/env/node-watch.js.map +1 -1
  6. package/dist/harness/agent.d.ts.map +1 -1
  7. package/dist/harness/agent.js +8 -1
  8. package/dist/harness/agent.js.map +1 -1
  9. package/dist/harness/compaction.js +1 -1
  10. package/dist/harness/compaction.js.map +1 -1
  11. package/dist/harness/context.d.ts +29 -1
  12. package/dist/harness/context.d.ts.map +1 -1
  13. package/dist/harness/context.js +125 -24
  14. package/dist/harness/context.js.map +1 -1
  15. package/dist/harness/generation.d.ts.map +1 -1
  16. package/dist/harness/generation.js +3 -3
  17. package/dist/harness/generation.js.map +1 -1
  18. package/dist/harness/harness.d.ts.map +1 -1
  19. package/dist/harness/harness.js +4 -3
  20. package/dist/harness/harness.js.map +1 -1
  21. package/dist/harness/output.d.ts.map +1 -1
  22. package/dist/harness/output.js +15 -3
  23. package/dist/harness/output.js.map +1 -1
  24. package/dist/harness/scheduler.d.ts.map +1 -1
  25. package/dist/harness/scheduler.js +98 -5
  26. package/dist/harness/scheduler.js.map +1 -1
  27. package/dist/harness/tool.d.ts +1 -1
  28. package/dist/harness/tool.d.ts.map +1 -1
  29. package/dist/harness/tool.js +15 -5
  30. package/dist/harness/tool.js.map +1 -1
  31. package/dist/harness/types.d.ts +18 -2
  32. package/dist/harness/types.d.ts.map +1 -1
  33. package/dist/harness/types.js.map +1 -1
  34. package/dist/index.d.ts +1 -1
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/session/session.d.ts +5 -3
  38. package/dist/session/session.d.ts.map +1 -1
  39. package/dist/session/session.js +5 -4
  40. package/dist/session/session.js.map +1 -1
  41. package/dist/session/transaction.d.ts +2 -0
  42. package/dist/session/transaction.d.ts.map +1 -1
  43. package/dist/session/transaction.js +18 -1
  44. package/dist/session/transaction.js.map +1 -1
  45. package/dist/storage/jsonl/storage.d.ts +4 -0
  46. package/dist/storage/jsonl/storage.d.ts.map +1 -1
  47. package/dist/storage/memory.d.ts +2 -0
  48. package/dist/storage/memory.d.ts.map +1 -1
  49. package/dist/storage/memory.js +72 -18
  50. package/dist/storage/memory.js.map +1 -1
  51. package/dist/storage/scan.d.ts +18 -0
  52. package/dist/storage/scan.d.ts.map +1 -0
  53. package/dist/storage/scan.js +28 -0
  54. package/dist/storage/scan.js.map +1 -0
  55. package/dist/storage/sqlite/cloudflare.d.ts +46 -0
  56. package/dist/storage/sqlite/cloudflare.d.ts.map +1 -0
  57. package/dist/storage/sqlite/cloudflare.js +106 -0
  58. package/dist/storage/sqlite/cloudflare.js.map +1 -0
  59. package/dist/storage/sqlite/storage.d.ts +2 -0
  60. package/dist/storage/sqlite/storage.d.ts.map +1 -1
  61. package/dist/storage/sqlite/storage.js +68 -16
  62. package/dist/storage/sqlite/storage.js.map +1 -1
  63. package/dist/testing/env-conformance.d.ts.map +1 -1
  64. package/dist/testing/env-conformance.js +34 -0
  65. package/dist/testing/env-conformance.js.map +1 -1
  66. package/dist/testing/storage-conformance.d.ts.map +1 -1
  67. package/dist/testing/storage-conformance.js +58 -0
  68. package/dist/testing/storage-conformance.js.map +1 -1
  69. package/dist/tools/bash.d.ts +21 -3
  70. package/dist/tools/bash.d.ts.map +1 -1
  71. package/dist/tools/bash.js +85 -38
  72. package/dist/tools/bash.js.map +1 -1
  73. package/dist/tools/index.d.ts +2 -2
  74. package/dist/tools/index.d.ts.map +1 -1
  75. package/dist/tools/index.js +2 -2
  76. package/dist/tools/index.js.map +1 -1
  77. package/dist/tools/read.d.ts.map +1 -1
  78. package/dist/tools/read.js +4 -2
  79. package/dist/tools/read.js.map +1 -1
  80. package/dist/types.d.ts +30 -7
  81. package/dist/types.d.ts.map +1 -1
  82. package/dist/types.js.map +1 -1
  83. package/package.json +10 -4
@@ -1 +1 @@
1
- {"version":3,"file":"generation.js","sourceRoot":"","sources":["../../src/harness/generation.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Context, copyJson, type Draft, type JsonValue } from \"@earendil-works/chord\";\nimport type {\n\tApi,\n\tAssistantMessage,\n\tDeferredHandle,\n\tMessage,\n\tModel,\n\tModelThinkingLevel,\n\tSimpleStreamOptions,\n\tToolCall,\n} from \"@earendil-works/pi-ai\";\nimport { isContextOverflow } from \"@earendil-works/pi-ai/utils/overflow\";\nimport { isRetryableAssistantError, retryDelayMs } from \"@earendil-works/pi-ai/utils/retry\";\nimport { getCurrentTools } from \"@earendil-works/pi-ai/utils/transcript\";\nimport { AssistantEntry, ResetEntry, SystemEntry, UserEntry } from \"../entries.ts\";\nimport type { ExecutionEnv } from \"../env/index.ts\";\nimport { defineTask } from \"../tasks.ts\";\nimport type {\n\tConversationId,\n\tEntryId,\n\tNextTaskState,\n\tSubmissionId,\n\tTaskId,\n\tTaskRuntime,\n\tTx,\n\tTypedEntry,\n} from \"../types.ts\";\nimport { addTools } from \"./agent.ts\";\nimport { createCompaction, estimateContext, selectCut } from \"./compaction.ts\";\nimport { applyBoundary, prepareBoundary } from \"./inbox.ts\";\nimport { assignJson } from \"./json.ts\";\nimport { endRun, LiveDoc, type LiveState, type ToolSlot } from \"./live.ts\";\nimport { planSystemEntries, renderSections, replaySections } from \"./prompt.ts\";\nimport { ensureProviderSessionId } from \"./provider.ts\";\nimport { appendToolResult, harnessError, ToolTask, type ToolTaskResult } from \"./tool.ts\";\nimport type {\n\tCompactionPolicy,\n\tCompactionResult,\n\tContextView,\n\tConversationStreamOptions,\n\tGenerationHooks,\n\tModelRef,\n\tPromptInput,\n\tToolControl,\n\tUserInput,\n} from \"./types.ts\";\nimport { recordUsage } from \"./usage.ts\";\n\nexport type GenerationInput = Record<string, never>;\n\nexport type GenerationCheckpoint =\n\t| {\n\t\t\tphase: \"prepare\";\n\t\t\tattempt: number;\n\t\t\t/** The blocking compaction this generation waited for; it starts no other compaction (spec §8.3). */\n\t\t\tcompacted?: TaskId<CompactionResult>;\n\t\t\t/** Error text of the overflow that started `compacted`; checked once when `prepare` resumes. */\n\t\t\toverflow?: string;\n\t }\n\t| {\n\t\t\tphase: \"request\";\n\t\t\tattempt: number;\n\t\t\tcompacted?: TaskId<CompactionResult>;\n\t\t\tmodel: ModelRef;\n\t\t\tthinkingLevel: ModelThinkingLevel;\n\t\t\t/** The settings' request options when preparation committed; a resend after recovery uses them unchanged. */\n\t\t\tstreamOptions: ConversationStreamOptions;\n\t\t\t/** Newest entry included in the request. */\n\t\t\tcutoff: EntryId;\n\t }\n\t| { phase: \"retry\"; attempt: number; compacted?: TaskId<CompactionResult>; until: number }\n\t| {\n\t\t\tphase: \"poll\";\n\t\t\tattempt: number;\n\t\t\tcompacted?: TaskId<CompactionResult>;\n\t\t\tmodel: ModelRef;\n\t\t\tcutoff: EntryId;\n\t\t\thandle: DeferredHandle;\n\t\t\tpollAt: number;\n\t }\n\t| {\n\t\t\t/** Waiting on the round's tool tasks, which the generation owns (spec §8.5). */\n\t\t\tphase: \"tools\";\n\t\t\t/** The tool-calling answer. */\n\t\t\tassistant: EntryId;\n\t\t\t/** Tool tasks created so far, in call order; grows by one per started call of a sequential round. */\n\t\t\ttools: TaskId<ToolTaskResult>[];\n\t\t\t/** Calls of a sequential round not started yet, in call order. */\n\t\t\tpending: string[];\n\t };\n\nexport type GenerationResult = { entryId: EntryId };\n\ntype Runtime = TaskRuntime<GenerationInput, GenerationCheckpoint, GenerationResult, GenerationHooks>;\ntype Next = NextTaskState<GenerationCheckpoint, GenerationResult>;\n\n/** What classification needs from the request that produced a message. */\ntype Request = {\n\treadonly attempt: number;\n\treadonly compacted: TaskId<CompactionResult> | undefined;\n\treadonly model: ModelRef;\n\treadonly cutoff: EntryId;\n\t/** Committed model context through `cutoff`, when the phase already derived it. */\n\treadonly messages?: readonly Message[];\n\t/** Set when the message came from polling, so a still deferred result polls strictly later. */\n\treadonly pollAt?: number;\n};\n\nconst DEFAULT_POLL_AFTER_MS = 5000;\n\n/**\n * Built-in generation task: prepares the positional system prompt and tool loadout, requests or polls the model,\n * retries, and classifies the response. The run's inputs live in `pi.live.run`.\n */\nexport const GenerationTask = defineTask<GenerationInput, GenerationCheckpoint, GenerationResult, GenerationHooks>({\n\tname: \"pi.generation\",\n\tversion: 1,\n\tinitial: () => ({ phase: \"prepare\", attempt: 1 }),\n\tphases: {\n\t\t/**\n\t\t * Render the system prompt and tool loadout and append the positional `pi.system` entries they need, then move to\n\t\t * `request`. The agent and settings resolved here are fixed for this request. Only the Harness writes to a busy\n\t\t * conversation, so the transcript read here is still the tail at the commit.\n\t\t */\n\t\tprepare: async (task, runtime, context) => {\n\t\t\tconst { conversationId } = runtime;\n\t\t\tconst agent = await runtime.agent(context);\n\t\t\tconst settings = runtime.settings;\n\t\t\tconst { model, thinkingLevel } = agent;\n\t\t\tconst resolved = model === undefined ? undefined : runtime.models.getModel(model.provider, model.modelId);\n\t\t\tif (model === undefined || resolved === undefined) return failNoModel(runtime, model, context);\n\t\t\tconst { attempt, compacted, overflow } = task.state.checkpoint;\n\t\t\tif (compacted !== undefined && overflow !== undefined) {\n\t\t\t\tconst [outcome] = await runtime.outcomes([compacted], context);\n\t\t\t\tif (outcome?.status !== \"completed\" || outcome.result.entryId === undefined) {\n\t\t\t\t\treturn failModelError(runtime, overflow, context);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst view = await runtime.context(conversationId, context);\n\t\t\tconst shown = replaySections(view.messages);\n\t\t\tconst report = (error: unknown) => runtime.report(error);\n\t\t\tlet env: ExecutionEnv | undefined;\n\t\t\ttry {\n\t\t\t\tenv = await runtime.env(context);\n\t\t\t} catch (error) {\n\t\t\t\tif (context.abortSignal?.aborted) throw error;\n\t\t\t\treport(error);\n\t\t\t}\n\t\t\tconst input: PromptInput = { conversationId, agent, env, shown: Object.fromEntries(shown), read: runtime };\n\t\t\tconst desired = await renderSections(agent.sections, input, shown, report, context);\n\t\t\tconst entries = planSystemEntries(view, desired, agent.tools, runtime.now());\n\t\t\tconst threshold =\n\t\t\t\tcompacted === undefined\n\t\t\t\t\t? thresholdCompaction(view, entries, resolved.contextWindow, settings.compaction)\n\t\t\t\t\t: undefined;\n\t\t\tif (threshold === \"blocking\") {\n\t\t\t\t// Compact first and prepare again; the transcript is unchanged until the compaction appends.\n\t\t\t\tawait runtime.commit(async (tx): Promise<Next> => {\n\t\t\t\t\tconst child = await createCompaction(tx, conversationId, { reason: \"threshold\" }, runtime.taskId);\n\t\t\t\t\tconst checkpoint = { phase: \"prepare\", attempt, compacted: child } as const;\n\t\t\t\t\treturn { status: \"waiting\", checkpoint, on: [child], policy: \"allSettled\" };\n\t\t\t\t}, context);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait runtime.commit(async (tx) => {\n\t\t\t\tlet cutoff = (await tx.scanEntries({ conversationId }, 1)).items[0]?.id;\n\t\t\t\tfor (const entry of entries) cutoff = (await tx.appendEntry(SystemEntry, conversationId, entry)).id;\n\t\t\t\tif (cutoff === undefined) throw new Error(`Conversation ${conversationId} has no entries to send`);\n\t\t\t\t// Checked in this commit, so a compaction admitted during preparation counts.\n\t\t\t\tif (threshold === \"background\" && (await tx.doc(LiveDoc, conversationId)).compactions === undefined) {\n\t\t\t\t\tawait createCompaction(tx, conversationId, { reason: \"threshold\" });\n\t\t\t\t}\n\t\t\t\tconst request = {\n\t\t\t\t\tattempt,\n\t\t\t\t\t...(compacted === undefined ? {} : { compacted }),\n\t\t\t\t\tmodel,\n\t\t\t\t\tthinkingLevel,\n\t\t\t\t\tstreamOptions: settings.stream,\n\t\t\t\t\tcutoff,\n\t\t\t\t};\n\t\t\t\treturn { status: \"running\", checkpoint: { phase: \"request\", ...request } };\n\t\t\t}, context);\n\t\t},\n\t\trequest: async (task, runtime, context) => {\n\t\t\tconst { attempt, compacted, model: ref, thinkingLevel, streamOptions, cutoff } = task.state.checkpoint;\n\t\t\tconst conversationId = runtime.conversationId;\n\t\t\tawait runtime.commit(async (tx) => {\n\t\t\t\tconst live = await tx.doc(LiveDoc, conversationId);\n\t\t\t\tawait convertPartial(tx, live, conversationId);\n\t\t\t\tlive.generation = { attempt };\n\t\t\t\treturn undefined;\n\t\t\t}, context);\n\t\t\tconst model = runtime.models.getModel(ref.provider, ref.modelId);\n\t\t\tif (model === undefined) return failNoModel(runtime, ref, context);\n\t\t\tconst view = await runtime.context(conversationId, context, cutoff);\n\t\t\tlet messages = view.messages;\n\t\t\tawait runtime.hooks.each(\"beforeRequest\", async (hook) => {\n\t\t\t\tconst replaced = await hook({ messages }, runtime, context);\n\t\t\t\tif (replaced !== undefined) messages = replaced.messages;\n\t\t\t});\n\t\t\tconst options: SimpleStreamOptions = {\n\t\t\t\t...streamOptions,\n\t\t\t\tsignal: runtime.signal,\n\t\t\t\tsessionId: await ensureProviderSessionId(runtime, context),\n\t\t\t\t...(thinkingLevel === \"off\" ? {} : { reasoning: thinkingLevel }),\n\t\t\t};\n\t\t\tconst message = await streamResponse(runtime, model, messages, options, attempt, context);\n\t\t\tconst request = { attempt, compacted, model: ref, cutoff, messages: view.messages };\n\t\t\tawait classify(runtime, request, message, context);\n\t\t},\n\t\tretry: async (task, runtime, context) => {\n\t\t\tconst { attempt, compacted, until } = task.state.checkpoint;\n\t\t\tawait runtime.sleep(until, context);\n\t\t\tawait runtime.commit(async (tx) => {\n\t\t\t\t(await tx.doc(LiveDoc, runtime.conversationId)).generation = { attempt: attempt + 1 };\n\t\t\t\tconst checkpoint: GenerationCheckpoint = {\n\t\t\t\t\tphase: \"prepare\",\n\t\t\t\t\tattempt: attempt + 1,\n\t\t\t\t\t...(compacted === undefined ? {} : { compacted }),\n\t\t\t\t};\n\t\t\t\treturn { status: \"running\", checkpoint };\n\t\t\t}, context);\n\t\t},\n\t\tpoll: async (task, runtime, context) => {\n\t\t\tconst { attempt, compacted, model: ref, cutoff, handle, pollAt } = task.state.checkpoint;\n\t\t\tconst model = runtime.models.getModel(ref.provider, ref.modelId);\n\t\t\tif (model === undefined) return failNoModel(runtime, ref, context);\n\t\t\tawait runtime.sleep(pollAt, context);\n\t\t\tconst message = await runtime.models.fetchDeferred(model, handle, { signal: runtime.signal });\n\t\t\tconst request = { attempt, compacted, model: ref, cutoff, pollAt };\n\t\t\tawait classify(runtime, request, message, context);\n\t\t},\n\t\ttools: async (task, runtime, context) => {\n\t\t\tconst { assistant, tools, pending } = task.state.checkpoint;\n\t\t\tconst [next, ...rest] = pending;\n\t\t\tif (next === undefined) return finishToolRound(runtime, assistant, tools, context);\n\t\t\t// Sequential round: start the next call and wait for it.\n\t\t\tawait runtime.commit(async (tx): Promise<Next> => {\n\t\t\t\tconst live = await tx.doc(LiveDoc, runtime.conversationId);\n\t\t\t\tconst taskId = await createToolTask(tx, runtime, assistant, next);\n\t\t\t\tconst slot = live.tools?.find((slot) => slot.callId === next && slot.taskId === undefined);\n\t\t\t\tif (slot !== undefined) slot.taskId = taskId;\n\t\t\t\tconst checkpoint: GenerationCheckpoint = {\n\t\t\t\t\tphase: \"tools\",\n\t\t\t\t\tassistant,\n\t\t\t\t\ttools: [...tools, taskId],\n\t\t\t\t\tpending: rest,\n\t\t\t\t};\n\t\t\t\treturn { status: \"waiting\", checkpoint, on: [taskId], policy: \"allSettled\" };\n\t\t\t}, context);\n\t\t},\n\t},\n\tabort: async (task, runtime, context) => {\n\t\tconst checkpoint = task.state.checkpoint;\n\t\tif (checkpoint.phase === \"poll\") {\n\t\t\tconst model = runtime.models.getModel(checkpoint.model.provider, checkpoint.model.modelId);\n\t\t\tif (model !== undefined) {\n\t\t\t\ttry {\n\t\t\t\t\tawait runtime.models.cancelDeferred(model, checkpoint.handle, { signal: runtime.signal });\n\t\t\t\t} catch (error) {\n\t\t\t\t\truntime.report(error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst conversationId = runtime.conversationId;\n\t\t// Runs after the round's tool tasks are terminal; calls never started get `aborted` results (spec §8.5).\n\t\tconst unstarted =\n\t\t\tcheckpoint.phase === \"tools\"\n\t\t\t\t? await readCalls(runtime, checkpoint.assistant, checkpoint.pending, context)\n\t\t\t\t: [];\n\t\tawait runtime.commit(async (tx) => {\n\t\t\tconst live = await tx.doc(LiveDoc, conversationId);\n\t\t\tawait convertPartial(tx, live, conversationId);\n\t\t\tfor (const call of unstarted) {\n\t\t\t\tconst result = harnessError(\"aborted\", `Tool ${call.name} was aborted`);\n\t\t\t\tawait appendToolResult(tx, conversationId, call, result, runtime.now());\n\t\t\t}\n\t\t\tendRun(tx, live, runtime.taskId, { status: \"unanswered\", reason: \"aborted\" });\n\t\t\treturn { status: \"terminal\", outcome: { status: \"aborted\" } };\n\t\t}, context);\n\t},\n});\n\n/** The calls `callIds` of the assistant entry, in the given order. */\nasync function readCalls(\n\truntime: Runtime,\n\tassistant: EntryId,\n\tcallIds: readonly string[],\n\tcontext: Context,\n): Promise<ToolCall[]> {\n\tconst message = (await runtime.entry(AssistantEntry, assistant, context))?.model?.[0];\n\tconst calls = message?.role === \"assistant\" ? message.content.filter((content) => content.type === \"toolCall\") : [];\n\treturn callIds.flatMap((id) => calls.filter((call) => call.id === id).slice(0, 1));\n}\n\n/** A tool task for call `callId`, owned by the generation. */\nfunction createToolTask(tx: Tx, runtime: Runtime, assistant: EntryId, callId: string): Promise<TaskId<ToolTaskResult>> {\n\treturn tx.createTask(ToolTask, { assistant, callId }, { ownership: { kind: \"task\", taskId: runtime.taskId } });\n}\n\n/**\n * Which threshold compaction preparation starts before its request (spec §8.3): `blocking` above\n * `contextWindow - reserveTokens`, `background` above the background threshold, and only when range selection finds a\n * cut. The caller starts a background one only while no compaction is listed.\n */\nfunction thresholdCompaction(\n\tview: ContextView,\n\tplanned: readonly { readonly model?: readonly Message[] }[],\n\tcontextWindow: number,\n\tpolicy: CompactionPolicy,\n): \"blocking\" | \"background\" | undefined {\n\tif (!policy.enabled || contextWindow <= 0) return undefined;\n\tconst tokens = estimateContext(\n\t\tview,\n\t\tplanned.flatMap((entry) => entry.model ?? []),\n\t);\n\tconst blocking = contextWindow - policy.reserveTokens;\n\tconst background = blocking - policy.backgroundTokens;\n\tconst over =\n\t\ttokens > blocking ? \"blocking\" : policy.backgroundTokens > 0 && tokens > background ? \"background\" : undefined;\n\tif (over === undefined || selectCut(view, policy.keepRecentTokens) === undefined) return undefined;\n\treturn over;\n}\n\n/** Settle the run's inputs `unanswered` with `model_error` and fail with `text`. */\nasync function failModelError(runtime: Runtime, text: string, context: Context): Promise<void> {\n\tawait runtime.commit(async (tx) => {\n\t\tconst live = await tx.doc(LiveDoc, runtime.conversationId);\n\t\tendRun(tx, live, runtime.taskId, { status: \"unanswered\", reason: \"model_error\", detail: text });\n\t\treturn {\n\t\t\tstatus: \"terminal\",\n\t\t\toutcome: { status: \"failed\", error: { message: text, detail: { reason: \"model_error\" } } },\n\t\t};\n\t}, context);\n}\n\n/** Settle the run's inputs `unanswered` with `no_model` and fail. */\nasync function failNoModel(runtime: Runtime, ref: ModelRef | undefined, context: Context): Promise<void> {\n\tconst message =\n\t\tref === undefined ? \"No model is configured\" : `Model ${ref.provider}/${ref.modelId} is not available`;\n\tawait runtime.commit(async (tx) => {\n\t\tconst live = await tx.doc(LiveDoc, runtime.conversationId);\n\t\tendRun(tx, live, runtime.taskId, { status: \"unanswered\", reason: \"no_model\" });\n\t\treturn { status: \"terminal\", outcome: { status: \"failed\", error: { message, detail: { reason: \"no_model\" } } } };\n\t}, context);\n}\n\n/**\n * Append a committed partial left by an interrupted, aborted, faulted, or orphaned attempt as an aborted assistant\n * entry; the caller replaces or removes `generation`.\n */\nexport async function convertPartial(tx: Tx, live: Draft<LiveState>, conversationId: ConversationId): Promise<void> {\n\tconst partial = live.generation?.message;\n\tif (partial === undefined) return;\n\tconst message = copyJson(partial) as unknown as AssistantMessage;\n\tawait appendAssistant(tx, conversationId, { ...message, stopReason: \"aborted\" });\n}\n\n/**\n * Stream one request and return the terminal message. Partials commit as trailing writes at most every\n * `progress.partialIntervalMs` (default 100 ms) with one commit in flight; `finally` stops the throttle and awaits that\n * commit, so no stale partial lands after the outcome.\n */\nasync function streamResponse(\n\truntime: Runtime,\n\tmodel: Model<Api>,\n\tmessages: readonly Message[],\n\toptions: SimpleStreamOptions,\n\tattempt: number,\n\tcontext: Context,\n): Promise<AssistantMessage> {\n\tconst interval = runtime.settings.progress.partialIntervalMs;\n\tlet pending: AssistantMessage | undefined;\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet inFlight: Promise<void> | undefined;\n\tlet stopped = false;\n\tconst flush = (): void => {\n\t\ttimer = undefined;\n\t\tconst partial = pending;\n\t\tpending = undefined;\n\t\tif (partial === undefined || stopped) return;\n\t\tinFlight = (async () => {\n\t\t\t// Copy synchronously: the provider keeps mutating its partial.\n\t\t\tconst message = copyJson(partial, { omitUndefinedProperties: true });\n\t\t\tawait runtime.commit(async (tx) => {\n\t\t\t\tconst live = await tx.doc(LiveDoc, runtime.conversationId);\n\t\t\t\tlive.generation ??= { attempt };\n\t\t\t\tassignJson(live.generation as Draft<Record<string, JsonValue>>, \"message\", message);\n\t\t\t\treturn undefined;\n\t\t\t}, context);\n\t\t})()\n\t\t\t.catch((error: unknown) => {\n\t\t\t\t// Rejections after an abort mark or close are expected; the committed state stays consistent.\n\t\t\t\tif (!runtime.signal.aborted) runtime.report(error);\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tinFlight = undefined;\n\t\t\t\tif (pending !== undefined && !stopped) timer = setTimeout(flush, interval);\n\t\t\t});\n\t};\n\ttry {\n\t\tconst events = runtime.models.streamSimple(model, { messages: [...messages] }, options);\n\t\tfor await (const event of events) {\n\t\t\t// A partial without content, such as pi-ai's opening `start` event, shows nothing; a deferred response\n\t\t\t// never gets past it, so it never leaves a partial.\n\t\t\tif (event.type === \"done\" || event.type === \"error\" || event.partial.content.length === 0) continue;\n\t\t\tpending = event.partial;\n\t\t\tif (timer === undefined && inFlight === undefined) timer = setTimeout(flush, interval);\n\t\t}\n\t\treturn await events.result();\n\t} finally {\n\t\tstopped = true;\n\t\tclearTimeout(timer);\n\t\tawait inFlight;\n\t}\n}\n\n/** Classify a terminal provider message in one commit that also clears the partial. */\nasync function classify(\n\truntime: Runtime,\n\trequest: Request,\n\tmessage: AssistantMessage,\n\tcontext: Context,\n): Promise<void> {\n\t// An abort mark or close: the abort invocation or the reopened run handles the committed state.\n\truntime.signal.throwIfAborted();\n\tconst conversationId = runtime.conversationId;\n\tconst { attempt, compacted, model: ref, cutoff } = request;\n\tif (message.stopReason === \"deferred\" && message.deferred !== undefined) {\n\t\tconst handle = message.deferred;\n\t\tconst pollAt = Math.max(\n\t\t\truntime.now() + (handle.pollAfterMs ?? DEFAULT_POLL_AFTER_MS),\n\t\t\trequest.pollAt === undefined ? Number.NEGATIVE_INFINITY : request.pollAt + 1,\n\t\t);\n\t\tawait runtime.commit(async (tx) => {\n\t\t\t(await tx.doc(LiveDoc, conversationId)).generation = { attempt, deferred: { pollAt } };\n\t\t\tconst checkpoint = {\n\t\t\t\tphase: \"poll\",\n\t\t\t\tattempt,\n\t\t\t\t...(compacted === undefined ? {} : { compacted }),\n\t\t\t\tmodel: ref,\n\t\t\t\tcutoff,\n\t\t\t\thandle,\n\t\t\t\tpollAt,\n\t\t\t} as const;\n\t\t\treturn { status: \"running\", checkpoint };\n\t\t}, context);\n\t\treturn;\n\t}\n\tawait runtime.hooks.each(\"afterResponse\", (hook) => hook(message, runtime, context));\n\tconst calls = message.content.filter((content): content is ToolCall => content.type === \"toolCall\");\n\tif (message.stopReason === \"toolUse\" && calls.length > 0) {\n\t\treturn startToolRound(runtime, request, message, calls, context);\n\t}\n\tif (message.stopReason === \"stop\" || message.stopReason === \"length\" || message.stopReason === \"toolUse\") {\n\t\treturn answer(runtime, message, context);\n\t}\n\t// The retry and compaction policies govern the next attempt, so they are read now rather than pinned at preparation.\n\tconst settings = runtime.settings;\n\tconst overflow = message.stopReason === \"error\" && isContextOverflow(message);\n\tif (overflow && compacted === undefined && settings.compaction.enabled) {\n\t\tconst policy = settings.compaction;\n\t\tconst view = await runtime.context(conversationId, context, cutoff);\n\t\tif (selectCut(view, policy.keepRecentTokens) !== undefined) {\n\t\t\tconst text = message.errorMessage ?? \"Context overflow\";\n\t\t\tawait runtime.commit(async (tx): Promise<Next> => {\n\t\t\t\tconst live = await tx.doc(LiveDoc, conversationId);\n\t\t\t\tawait appendAssistant(tx, conversationId, message);\n\t\t\t\tdelete live.generation;\n\t\t\t\tconst child = await createCompaction(tx, conversationId, { reason: \"overflow\" }, runtime.taskId);\n\t\t\t\tconst checkpoint = { phase: \"prepare\", attempt, compacted: child, overflow: text } as const;\n\t\t\t\treturn { status: \"waiting\", checkpoint, on: [child], policy: \"allSettled\" };\n\t\t\t}, context);\n\t\t\treturn;\n\t\t}\n\t}\n\tconst policy = settings.retry;\n\t// An overflow is never retried: only a compaction can make the next request fit.\n\tconst retry =\n\t\tmessage.stopReason === \"error\" &&\n\t\t!overflow &&\n\t\tisRetryableAssistantError(message) &&\n\t\tpolicy.enabled &&\n\t\tattempt <= policy.maxRetries;\n\tconst until = retry ? runtime.now() + retryDelayMs(policy, attempt) : 0;\n\tawait runtime.commit(async (tx): Promise<Next> => {\n\t\tconst live = await tx.doc(LiveDoc, conversationId);\n\t\tawait appendAssistant(tx, conversationId, message);\n\t\tif (retry) {\n\t\t\tlive.generation = { attempt, retry: { at: until, error: message.errorMessage ?? \"\" } };\n\t\t\tconst checkpoint = {\n\t\t\t\tphase: \"retry\",\n\t\t\t\tattempt,\n\t\t\t\t...(compacted === undefined ? {} : { compacted }),\n\t\t\t\tuntil,\n\t\t\t} as const;\n\t\t\treturn { status: \"running\", checkpoint };\n\t\t}\n\t\tconst text = message.errorMessage ?? `Model response ended with stop reason ${message.stopReason}`;\n\t\tendRun(tx, live, runtime.taskId, { status: \"unanswered\", reason: \"model_error\", detail: text });\n\t\treturn {\n\t\t\tstatus: \"terminal\",\n\t\t\toutcome: { status: \"failed\", error: { message: text, detail: { reason: \"model_error\" } } },\n\t\t};\n\t}, context);\n}\n\n/**\n * A final answer; the final boundary places queued items (spec §6). The first `onYield` continuation appends a user\n * message and hands the run to a successor generation, but only when the boundary selected no user item and no reset.\n * Otherwise the run's inputs settle `done`, and selected user items start the next run.\n */\nasync function answer(runtime: Runtime, message: AssistantMessage, context: Context): Promise<void> {\n\tlet continuation: UserInput | undefined;\n\tawait runtime.hooks.each(\"onYield\", async (hook) => {\n\t\tif (continuation !== undefined) return;\n\t\tcontinuation = (await hook(message, runtime, context))?.continue;\n\t});\n\tconst conversationId = runtime.conversationId;\n\tawait runtime.commit(async (tx): Promise<Next> => {\n\t\t// Queue modes are read on the Session line, when the boundary is decided.\n\t\tconst boundary = await prepareBoundary(tx, conversationId, runtime.settings);\n\t\tconst live = await tx.doc(LiveDoc, conversationId);\n\t\tconst entry = await appendAssistant(tx, conversationId, message);\n\t\tconst result: Next = { status: \"terminal\", outcome: { status: \"completed\", result: { entryId: entry.id } } };\n\t\tconst { users, reset } = await applyBoundary(tx, boundary, \"final\", runtime.now());\n\t\tif (continuation !== undefined && users.length === 0 && !reset) {\n\t\t\tconst user = { role: \"user\", content: continuation, timestamp: runtime.now() } as const;\n\t\t\tawait tx.appendEntry(UserEntry, conversationId, { model: [user] });\n\t\t\thandOver(live, runtime.taskId, await createGeneration(tx, conversationId));\n\t\t\tdelete live.generation;\n\t\t\treturn result;\n\t\t}\n\t\tendRun(tx, live, runtime.taskId, { status: \"done\", answer: entry.id });\n\t\tif (users.length > 0) await startRun(tx, conversationId, live, users);\n\t\treturn result;\n\t}, context);\n}\n\n/**\n * Append the tool-calling answer and start its tool round in one commit (spec §8.3). A call to a tool the request did\n * not offer gets its `tool_unavailable` result here; every other call gets a tool task owned by the generation, only the\n * first one now when the round is sequential. The generation then waits for them in its `tools` phase, keeping the run.\n */\nasync function startToolRound(\n\truntime: Runtime,\n\trequest: Request,\n\tmessage: AssistantMessage,\n\tcalls: readonly ToolCall[],\n\tcontext: Context,\n): Promise<void> {\n\tconst conversationId = runtime.conversationId;\n\tconst messages = request.messages ?? (await runtime.context(conversationId, context, request.cutoff)).messages;\n\tconst offered = new Set(getCurrentTools(messages).map((tool) => tool.name));\n\t// Read as the round starts; a tool is resolved as its tool task resolves it.\n\tconst tools = (await runtime.agent(context)).tools;\n\tconst sequential =\n\t\truntime.settings.toolExecution === \"sequential\" ||\n\t\tcalls.some(\n\t\t\t(call) =>\n\t\t\t\toffered.has(call.name) && tools.find((tool) => tool.name === call.name)?.executionMode === \"sequential\",\n\t\t);\n\tawait runtime.commit(async (tx): Promise<Next> => {\n\t\tconst live = await tx.doc(LiveDoc, conversationId);\n\t\tconst entry = await appendAssistant(tx, conversationId, message);\n\t\tconst slots: ToolSlot[] = [];\n\t\tconst tools: TaskId<ToolTaskResult>[] = [];\n\t\tconst pending: string[] = [];\n\t\tfor (const call of calls) {\n\t\t\tif (!offered.has(call.name)) {\n\t\t\t\tconst unavailable = harnessError(\"tool_unavailable\", `Tool ${call.name} is not available`);\n\t\t\t\tconst result = await appendToolResult(tx, conversationId, call, unavailable, runtime.now());\n\t\t\t\tslots.push({ callId: call.id, name: call.name, status: \"done\", entry: result.id });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (sequential && tools.length > 0) {\n\t\t\t\tpending.push(call.id);\n\t\t\t\tslots.push({ callId: call.id, name: call.name, status: \"pending\" });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst taskId = await createToolTask(tx, runtime, entry.id, call.id);\n\t\t\ttools.push(taskId);\n\t\t\tslots.push({ callId: call.id, name: call.name, taskId, status: \"pending\" });\n\t\t}\n\t\tdelete live.generation;\n\t\tlive.tools = slots;\n\t\tconst checkpoint = { phase: \"tools\", assistant: entry.id, tools, pending } as const;\n\t\treturn { status: \"waiting\", checkpoint, on: tools, policy: \"allSettled\" };\n\t}, context);\n}\n\n/**\n * The round's tools are terminal: apply their controls and either end the run at the final boundary (`terminate`,\n * `handoff`, or a queued reset) or hand it to the next generation at the `postTools` boundary (spec §8.5).\n */\nasync function finishToolRound(\n\truntime: Runtime,\n\tassistant: EntryId,\n\ttools: readonly TaskId<ToolTaskResult>[],\n\tcontext: Context,\n): Promise<void> {\n\tconst conversationId = runtime.conversationId;\n\tconst controls = new Map<TaskId, ToolControl | undefined>();\n\tconst outcomes = await runtime.outcomes(tools, context);\n\ttools.forEach((id, index) => {\n\t\tconst outcome = outcomes[index]!;\n\t\tcontrols.set(id, outcome.status === \"completed\" ? outcome.result.control : undefined);\n\t});\n\tconst slots = (await runtime.snapshot(LiveDoc, conversationId, context))?.tools ?? [];\n\tconst results = slots.flatMap((slot) => (slot.entry === undefined ? [] : [slot.entry]));\n\tawait runtime.hooks.each(\"afterTools\", (hook) => hook(assistant, results, runtime, context));\n\t// Every call of the round, including those answered without a task, must ask to terminate.\n\tconst terminate =\n\t\tslots.length > 0 &&\n\t\tslots.every((slot) => slot.taskId !== undefined && controls.get(slot.taskId)?.terminate === true);\n\tconst added = [...controls.values()].flatMap((control) => control?.addTools ?? []);\n\t// The last handoff in call order wins.\n\tconst handoff = [...controls.values()].findLast((control) => control?.handoff !== undefined)?.handoff;\n\tawait runtime.commit(async (tx): Promise<Next> => {\n\t\tconst boundary = await prepareBoundary(tx, conversationId, runtime.settings);\n\t\tif (added.length > 0) await addTools(tx, conversationId, added);\n\t\tconst live = await tx.doc(LiveDoc, conversationId);\n\t\tconst now = runtime.now();\n\t\tif (terminate || handoff !== undefined) {\n\t\t\tif (handoff !== undefined) {\n\t\t\t\tconst message = { role: \"user\", content: handoff, timestamp: now } as const;\n\t\t\t\tconst entry = await tx.appendEntry(ResetEntry, conversationId, { head: \"self\", model: [message] });\n\t\t\t\tboundary.head = entry.id;\n\t\t\t}\n\t\t\tconst { users } = await applyBoundary(tx, boundary, \"final\", now);\n\t\t\tendRun(tx, live, runtime.taskId, { status: \"done\", answer: assistant });\n\t\t\tif (users.length > 0) await startRun(tx, conversationId, live, users);\n\t\t} else {\n\t\t\tconst { users, reset } = await applyBoundary(tx, boundary, \"postTools\", now);\n\t\t\tif (reset) {\n\t\t\t\t// The queued reset cut the run's context before an answer.\n\t\t\t\tendRun(tx, live, runtime.taskId, { status: \"unanswered\", reason: \"reset\" });\n\t\t\t\tif (users.length > 0) await startRun(tx, conversationId, live, users);\n\t\t\t} else {\n\t\t\t\tdelete live.tools;\n\t\t\t\tif (live.run?.taskId === runtime.taskId) live.run.inputs.push(...users);\n\t\t\t\thandOver(live, runtime.taskId, await createGeneration(tx, conversationId));\n\t\t\t}\n\t\t}\n\t\treturn { status: \"terminal\", outcome: { status: \"completed\", result: { entryId: assistant } } };\n\t}, context);\n}\n\n/**\n * Append a provider result and add its usage to `pi.usage` in the same commit.\n * REMINDER: every built-in writer of assistant entries goes through here, so the usage ledger stays complete.\n */\nasync function appendAssistant(\n\ttx: Tx,\n\tconversationId: ConversationId,\n\tmessage: AssistantMessage,\n): Promise<TypedEntry<never>> {\n\tawait recordUsage(tx, conversationId, \"models\", `${message.provider}/${message.model}`, message.usage);\n\treturn tx.appendEntry(AssistantEntry, conversationId, { model: [message] });\n}\n\n/** Start a run for `inputs`, placed input submissions: a new generation takes `pi.live.run`. */\nexport async function startRun(\n\ttx: Tx,\n\tconversationId: ConversationId,\n\tlive: Draft<LiveState>,\n\tinputs: SubmissionId[],\n): Promise<void> {\n\tlive.run = { taskId: await createGeneration(tx, conversationId), inputs };\n}\n\n/** A generation owned by its conversation. */\nfunction createGeneration(tx: Tx, conversationId: ConversationId): Promise<TaskId<GenerationResult>> {\n\treturn tx.createTask(GenerationTask, {}, { ownership: { kind: \"conversation\" }, conversationId });\n}\n\n/** Hand run control from `from` to `to`; the run's inputs move with it. */\nexport function handOver(live: Draft<LiveState>, from: TaskId, to: TaskId): void {\n\tif (live.run?.taskId === from) live.run.taskId = to;\n}\n"]}
1
+ {"version":3,"file":"generation.js","sourceRoot":"","sources":["../../src/harness/generation.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Context, copyJson, type Draft, type JsonValue } from \"@earendil-works/chord\";\nimport type {\n\tApi,\n\tAssistantMessage,\n\tDeferredHandle,\n\tMessage,\n\tModel,\n\tModelThinkingLevel,\n\tSimpleStreamOptions,\n\tToolCall,\n} from \"@earendil-works/pi-ai\";\nimport { isContextOverflow } from \"@earendil-works/pi-ai/utils/overflow\";\nimport { isRetryableAssistantError, retryDelayMs } from \"@earendil-works/pi-ai/utils/retry\";\nimport { getCurrentTools } from \"@earendil-works/pi-ai/utils/transcript\";\nimport { AssistantEntry, ResetEntry, SystemEntry, UserEntry } from \"../entries.ts\";\nimport type { ExecutionEnv } from \"../env/index.ts\";\nimport { defineTask } from \"../tasks.ts\";\nimport type {\n\tConversationId,\n\tEntryId,\n\tNextTaskState,\n\tSubmissionId,\n\tTaskId,\n\tTaskRuntime,\n\tTx,\n\tTypedEntry,\n} from \"../types.ts\";\nimport { addTools } from \"./agent.ts\";\nimport { createCompaction, estimateContext, selectCut } from \"./compaction.ts\";\nimport { applyBoundary, prepareBoundary } from \"./inbox.ts\";\nimport { assignJson } from \"./json.ts\";\nimport { endRun, LiveDoc, type LiveState, type ToolSlot } from \"./live.ts\";\nimport { planSystemEntries, renderSections, replaySections } from \"./prompt.ts\";\nimport { ensureProviderSessionId } from \"./provider.ts\";\nimport { appendToolResult, harnessError, ToolTask, type ToolTaskResult } from \"./tool.ts\";\nimport type {\n\tCompactionPolicy,\n\tCompactionResult,\n\tContextView,\n\tConversationStreamOptions,\n\tGenerationHooks,\n\tModelRef,\n\tPromptInput,\n\tToolControl,\n\tUserInput,\n} from \"./types.ts\";\nimport { recordUsage } from \"./usage.ts\";\n\nexport type GenerationInput = Record<string, never>;\n\nexport type GenerationCheckpoint =\n\t| {\n\t\t\tphase: \"prepare\";\n\t\t\tattempt: number;\n\t\t\t/** The blocking compaction this generation waited for; it starts no other compaction (spec §8.3). */\n\t\t\tcompacted?: TaskId<CompactionResult>;\n\t\t\t/** Error text of the overflow that started `compacted`; checked once when `prepare` resumes. */\n\t\t\toverflow?: string;\n\t }\n\t| {\n\t\t\tphase: \"request\";\n\t\t\tattempt: number;\n\t\t\tcompacted?: TaskId<CompactionResult>;\n\t\t\tmodel: ModelRef;\n\t\t\tthinkingLevel: ModelThinkingLevel;\n\t\t\t/** The settings' request options when preparation committed; a resend after recovery uses them unchanged. */\n\t\t\tstreamOptions: ConversationStreamOptions;\n\t\t\t/** Newest entry included in the request. */\n\t\t\tcutoff: EntryId;\n\t }\n\t| { phase: \"retry\"; attempt: number; compacted?: TaskId<CompactionResult>; until: number }\n\t| {\n\t\t\tphase: \"poll\";\n\t\t\tattempt: number;\n\t\t\tcompacted?: TaskId<CompactionResult>;\n\t\t\tmodel: ModelRef;\n\t\t\tcutoff: EntryId;\n\t\t\thandle: DeferredHandle;\n\t\t\tpollAt: number;\n\t }\n\t| {\n\t\t\t/** Waiting on the round's tool tasks, which the generation owns (spec §8.5). */\n\t\t\tphase: \"tools\";\n\t\t\t/** The tool-calling answer. */\n\t\t\tassistant: EntryId;\n\t\t\t/** Tool tasks created so far, in call order; grows by one per started call of a sequential round. */\n\t\t\ttools: TaskId<ToolTaskResult>[];\n\t\t\t/** Calls of a sequential round not started yet, in call order. */\n\t\t\tpending: string[];\n\t };\n\nexport type GenerationResult = { entryId: EntryId };\n\ntype Runtime = TaskRuntime<GenerationInput, GenerationCheckpoint, GenerationResult, GenerationHooks>;\ntype Next = NextTaskState<GenerationCheckpoint, GenerationResult>;\n\n/** What classification needs from the request that produced a message. */\ntype Request = {\n\treadonly attempt: number;\n\treadonly compacted: TaskId<CompactionResult> | undefined;\n\treadonly model: ModelRef;\n\treadonly cutoff: EntryId;\n\t/** Committed model context through `cutoff`, when the phase already derived it. */\n\treadonly messages?: readonly Message[];\n\t/** Set when the message came from polling, so a still deferred result polls strictly later. */\n\treadonly pollAt?: number;\n};\n\nconst DEFAULT_POLL_AFTER_MS = 5000;\n\n/**\n * Built-in generation task: prepares the positional system prompt and tool loadout, requests or polls the model,\n * retries, and classifies the response. The run's inputs live in `pi.live.run`.\n */\nexport const GenerationTask = defineTask<GenerationInput, GenerationCheckpoint, GenerationResult, GenerationHooks>({\n\tname: \"pi.generation\",\n\tversion: 1,\n\tinitial: () => ({ phase: \"prepare\", attempt: 1 }),\n\tphases: {\n\t\t/**\n\t\t * Render the system prompt and tool loadout and append the positional `pi.system` entries they need, then move to\n\t\t * `request`. The agent and settings resolved here are fixed for this request. Only the Harness writes to a busy\n\t\t * conversation, so the transcript read here is still the tail at the commit.\n\t\t */\n\t\tprepare: async (task, runtime, context) => {\n\t\t\tconst { conversationId } = runtime;\n\t\t\tconst agent = await runtime.agent(context);\n\t\t\tconst settings = runtime.settings;\n\t\t\tconst { model, thinkingLevel } = agent;\n\t\t\tconst resolved = model === undefined ? undefined : runtime.models.getModel(model.provider, model.modelId);\n\t\t\tif (model === undefined || resolved === undefined) return failNoModel(runtime, model, context);\n\t\t\tconst { attempt, compacted, overflow } = task.state.checkpoint;\n\t\t\tif (compacted !== undefined && overflow !== undefined) {\n\t\t\t\tconst [outcome] = await runtime.outcomes([compacted], context);\n\t\t\t\tif (outcome?.status !== \"completed\" || outcome.result.entryId === undefined) {\n\t\t\t\t\treturn failModelError(runtime, overflow, context);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst view = await runtime.context(conversationId, context);\n\t\t\tconst shown = replaySections(view.messages);\n\t\t\tconst report = (error: unknown) => runtime.report(error);\n\t\t\tlet env: ExecutionEnv | undefined;\n\t\t\ttry {\n\t\t\t\tenv = await runtime.env(context);\n\t\t\t} catch (error) {\n\t\t\t\tif (context.abortSignal?.aborted) throw error;\n\t\t\t\treport(error);\n\t\t\t}\n\t\t\tconst input: PromptInput = { conversationId, agent, env, shown: Object.fromEntries(shown), read: runtime };\n\t\t\tconst desired = await renderSections(agent.sections, input, shown, report, context);\n\t\t\tconst entries = planSystemEntries(view, desired, agent.tools, runtime.now());\n\t\t\tconst threshold =\n\t\t\t\tcompacted === undefined\n\t\t\t\t\t? thresholdCompaction(view, entries, resolved.contextWindow, settings.compaction)\n\t\t\t\t\t: undefined;\n\t\t\tif (threshold === \"blocking\") {\n\t\t\t\t// Compact first and prepare again; the transcript is unchanged until the compaction appends.\n\t\t\t\tawait runtime.commit(async (tx): Promise<Next> => {\n\t\t\t\t\tconst child = await createCompaction(tx, conversationId, { reason: \"threshold\" }, runtime.taskId);\n\t\t\t\t\tconst checkpoint = { phase: \"prepare\", attempt, compacted: child } as const;\n\t\t\t\t\treturn { status: \"waiting\", checkpoint, on: [child], policy: \"allSettled\" };\n\t\t\t\t}, context);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait runtime.commit(async (tx) => {\n\t\t\t\tlet cutoff = (await tx.scanEntries({ conversationId }, 1)).items[0]?.id;\n\t\t\t\tfor (const entry of entries) cutoff = (await tx.appendEntry(SystemEntry, conversationId, entry)).id;\n\t\t\t\tif (cutoff === undefined) throw new Error(`Conversation ${conversationId} has no entries to send`);\n\t\t\t\t// Checked in this commit, so a compaction admitted during preparation counts.\n\t\t\t\tif (threshold === \"background\" && (await tx.doc(LiveDoc, conversationId)).compactions === undefined) {\n\t\t\t\t\tawait createCompaction(tx, conversationId, { reason: \"threshold\" });\n\t\t\t\t}\n\t\t\t\tconst request = {\n\t\t\t\t\tattempt,\n\t\t\t\t\t...(compacted === undefined ? {} : { compacted }),\n\t\t\t\t\tmodel,\n\t\t\t\t\tthinkingLevel,\n\t\t\t\t\tstreamOptions: settings.stream,\n\t\t\t\t\tcutoff,\n\t\t\t\t};\n\t\t\t\treturn { status: \"running\", checkpoint: { phase: \"request\", ...request } };\n\t\t\t}, context);\n\t\t},\n\t\trequest: async (task, runtime, context) => {\n\t\t\tconst { attempt, compacted, model: ref, thinkingLevel, streamOptions, cutoff } = task.state.checkpoint;\n\t\t\tconst conversationId = runtime.conversationId;\n\t\t\tawait runtime.commit(async (tx) => {\n\t\t\t\tconst live = await tx.doc(LiveDoc, conversationId);\n\t\t\t\tawait convertPartial(tx, live, conversationId);\n\t\t\t\tlive.generation = { attempt };\n\t\t\t\treturn undefined;\n\t\t\t}, context);\n\t\t\tconst model = runtime.models.getModel(ref.provider, ref.modelId);\n\t\t\tif (model === undefined) return failNoModel(runtime, ref, context);\n\t\t\tconst view = await runtime.context(conversationId, context, { at: cutoff });\n\t\t\tlet messages = view.messages;\n\t\t\tawait runtime.hooks.each(\"beforeRequest\", async (hook) => {\n\t\t\t\tconst replaced = await hook({ messages }, runtime, context);\n\t\t\t\tif (replaced !== undefined) messages = replaced.messages;\n\t\t\t});\n\t\t\tconst options: SimpleStreamOptions = {\n\t\t\t\t...streamOptions,\n\t\t\t\tsignal: runtime.signal,\n\t\t\t\tsessionId: await ensureProviderSessionId(runtime, context),\n\t\t\t\t...(thinkingLevel === \"off\" ? {} : { reasoning: thinkingLevel }),\n\t\t\t};\n\t\t\tconst message = await streamResponse(runtime, model, messages, options, attempt, context);\n\t\t\tconst request = { attempt, compacted, model: ref, cutoff, messages: view.messages };\n\t\t\tawait classify(runtime, request, message, context);\n\t\t},\n\t\tretry: async (task, runtime, context) => {\n\t\t\tconst { attempt, compacted, until } = task.state.checkpoint;\n\t\t\tawait runtime.sleep(until, context);\n\t\t\tawait runtime.commit(async (tx) => {\n\t\t\t\t(await tx.doc(LiveDoc, runtime.conversationId)).generation = { attempt: attempt + 1 };\n\t\t\t\tconst checkpoint: GenerationCheckpoint = {\n\t\t\t\t\tphase: \"prepare\",\n\t\t\t\t\tattempt: attempt + 1,\n\t\t\t\t\t...(compacted === undefined ? {} : { compacted }),\n\t\t\t\t};\n\t\t\t\treturn { status: \"running\", checkpoint };\n\t\t\t}, context);\n\t\t},\n\t\tpoll: async (task, runtime, context) => {\n\t\t\tconst { attempt, compacted, model: ref, cutoff, handle, pollAt } = task.state.checkpoint;\n\t\t\tconst model = runtime.models.getModel(ref.provider, ref.modelId);\n\t\t\tif (model === undefined) return failNoModel(runtime, ref, context);\n\t\t\tawait runtime.sleep(pollAt, context);\n\t\t\tconst message = await runtime.models.fetchDeferred(model, handle, { signal: runtime.signal });\n\t\t\tconst request = { attempt, compacted, model: ref, cutoff, pollAt };\n\t\t\tawait classify(runtime, request, message, context);\n\t\t},\n\t\ttools: async (task, runtime, context) => {\n\t\t\tconst { assistant, tools, pending } = task.state.checkpoint;\n\t\t\tconst [next, ...rest] = pending;\n\t\t\tif (next === undefined) return finishToolRound(runtime, assistant, tools, context);\n\t\t\t// Sequential round: start the next call and wait for it.\n\t\t\tawait runtime.commit(async (tx): Promise<Next> => {\n\t\t\t\tconst live = await tx.doc(LiveDoc, runtime.conversationId);\n\t\t\t\tconst taskId = await createToolTask(tx, runtime, assistant, next);\n\t\t\t\tconst slot = live.tools?.find((slot) => slot.callId === next && slot.taskId === undefined);\n\t\t\t\tif (slot !== undefined) slot.taskId = taskId;\n\t\t\t\tconst checkpoint: GenerationCheckpoint = {\n\t\t\t\t\tphase: \"tools\",\n\t\t\t\t\tassistant,\n\t\t\t\t\ttools: [...tools, taskId],\n\t\t\t\t\tpending: rest,\n\t\t\t\t};\n\t\t\t\treturn { status: \"waiting\", checkpoint, on: [taskId], policy: \"allSettled\" };\n\t\t\t}, context);\n\t\t},\n\t},\n\tabort: async (task, runtime, context) => {\n\t\tconst checkpoint = task.state.checkpoint;\n\t\tif (checkpoint.phase === \"poll\") {\n\t\t\tconst model = runtime.models.getModel(checkpoint.model.provider, checkpoint.model.modelId);\n\t\t\tif (model !== undefined) {\n\t\t\t\ttry {\n\t\t\t\t\tawait runtime.models.cancelDeferred(model, checkpoint.handle, { signal: runtime.signal });\n\t\t\t\t} catch (error) {\n\t\t\t\t\truntime.report(error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst conversationId = runtime.conversationId;\n\t\t// Runs after the round's tool tasks are terminal; calls never started get `aborted` results (spec §8.5).\n\t\tconst unstarted =\n\t\t\tcheckpoint.phase === \"tools\"\n\t\t\t\t? await readCalls(runtime, checkpoint.assistant, checkpoint.pending, context)\n\t\t\t\t: [];\n\t\tawait runtime.commit(async (tx) => {\n\t\t\tconst live = await tx.doc(LiveDoc, conversationId);\n\t\t\tawait convertPartial(tx, live, conversationId);\n\t\t\tfor (const call of unstarted) {\n\t\t\t\tconst result = harnessError(\"aborted\", `Tool ${call.name} was aborted`);\n\t\t\t\tawait appendToolResult(tx, conversationId, call, result, runtime.now());\n\t\t\t}\n\t\t\tendRun(tx, live, runtime.taskId, { status: \"unanswered\", reason: \"aborted\" });\n\t\t\treturn { status: \"terminal\", outcome: { status: \"aborted\" } };\n\t\t}, context);\n\t},\n});\n\n/** The calls `callIds` of the assistant entry, in the given order. */\nasync function readCalls(\n\truntime: Runtime,\n\tassistant: EntryId,\n\tcallIds: readonly string[],\n\tcontext: Context,\n): Promise<ToolCall[]> {\n\tconst message = (await runtime.entry(AssistantEntry, assistant, context))?.model?.[0];\n\tconst calls = message?.role === \"assistant\" ? message.content.filter((content) => content.type === \"toolCall\") : [];\n\treturn callIds.flatMap((id) => calls.filter((call) => call.id === id).slice(0, 1));\n}\n\n/** A tool task for call `callId`, owned by the generation. */\nfunction createToolTask(tx: Tx, runtime: Runtime, assistant: EntryId, callId: string): Promise<TaskId<ToolTaskResult>> {\n\treturn tx.createTask(ToolTask, { assistant, callId }, { ownership: { kind: \"task\", taskId: runtime.taskId } });\n}\n\n/**\n * Which threshold compaction preparation starts before its request (spec §8.3): `blocking` above\n * `contextWindow - reserveTokens`, `background` above the background threshold, and only when range selection finds a\n * cut. The caller starts a background one only while no compaction is listed.\n */\nfunction thresholdCompaction(\n\tview: ContextView,\n\tplanned: readonly { readonly model?: readonly Message[] }[],\n\tcontextWindow: number,\n\tpolicy: CompactionPolicy,\n): \"blocking\" | \"background\" | undefined {\n\tif (!policy.enabled || contextWindow <= 0) return undefined;\n\tconst tokens = estimateContext(\n\t\tview,\n\t\tplanned.flatMap((entry) => entry.model ?? []),\n\t);\n\tconst blocking = contextWindow - policy.reserveTokens;\n\tconst background = blocking - policy.backgroundTokens;\n\tconst over =\n\t\ttokens > blocking ? \"blocking\" : policy.backgroundTokens > 0 && tokens > background ? \"background\" : undefined;\n\tif (over === undefined || selectCut(view, policy.keepRecentTokens) === undefined) return undefined;\n\treturn over;\n}\n\n/** Settle the run's inputs `unanswered` with `model_error` and fail with `text`. */\nasync function failModelError(runtime: Runtime, text: string, context: Context): Promise<void> {\n\tawait runtime.commit(async (tx) => {\n\t\tconst live = await tx.doc(LiveDoc, runtime.conversationId);\n\t\tendRun(tx, live, runtime.taskId, { status: \"unanswered\", reason: \"model_error\", detail: text });\n\t\treturn {\n\t\t\tstatus: \"terminal\",\n\t\t\toutcome: { status: \"failed\", error: { message: text, detail: { reason: \"model_error\" } } },\n\t\t};\n\t}, context);\n}\n\n/** Settle the run's inputs `unanswered` with `no_model` and fail. */\nasync function failNoModel(runtime: Runtime, ref: ModelRef | undefined, context: Context): Promise<void> {\n\tconst message =\n\t\tref === undefined ? \"No model is configured\" : `Model ${ref.provider}/${ref.modelId} is not available`;\n\tawait runtime.commit(async (tx) => {\n\t\tconst live = await tx.doc(LiveDoc, runtime.conversationId);\n\t\tendRun(tx, live, runtime.taskId, { status: \"unanswered\", reason: \"no_model\" });\n\t\treturn { status: \"terminal\", outcome: { status: \"failed\", error: { message, detail: { reason: \"no_model\" } } } };\n\t}, context);\n}\n\n/**\n * Append a committed partial left by an interrupted, aborted, faulted, or orphaned attempt as an aborted assistant\n * entry; the caller replaces or removes `generation`.\n */\nexport async function convertPartial(tx: Tx, live: Draft<LiveState>, conversationId: ConversationId): Promise<void> {\n\tconst partial = live.generation?.message;\n\tif (partial === undefined) return;\n\tconst message = copyJson(partial) as unknown as AssistantMessage;\n\tawait appendAssistant(tx, conversationId, { ...message, stopReason: \"aborted\" });\n}\n\n/**\n * Stream one request and return the terminal message. Partials commit as trailing writes at most every\n * `progress.partialIntervalMs` (default 100 ms) with one commit in flight; `finally` stops the throttle and awaits that\n * commit, so no stale partial lands after the outcome.\n */\nasync function streamResponse(\n\truntime: Runtime,\n\tmodel: Model<Api>,\n\tmessages: readonly Message[],\n\toptions: SimpleStreamOptions,\n\tattempt: number,\n\tcontext: Context,\n): Promise<AssistantMessage> {\n\tconst interval = runtime.settings.progress.partialIntervalMs;\n\tlet pending: AssistantMessage | undefined;\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet inFlight: Promise<void> | undefined;\n\tlet stopped = false;\n\tconst flush = (): void => {\n\t\ttimer = undefined;\n\t\tconst partial = pending;\n\t\tpending = undefined;\n\t\tif (partial === undefined || stopped) return;\n\t\tinFlight = (async () => {\n\t\t\t// Copy synchronously: the provider keeps mutating its partial.\n\t\t\tconst message = copyJson(partial, { omitUndefinedProperties: true });\n\t\t\tawait runtime.commit(async (tx) => {\n\t\t\t\tconst live = await tx.doc(LiveDoc, runtime.conversationId);\n\t\t\t\tlive.generation ??= { attempt };\n\t\t\t\tassignJson(live.generation as Draft<Record<string, JsonValue>>, \"message\", message);\n\t\t\t\treturn undefined;\n\t\t\t}, context);\n\t\t})()\n\t\t\t.catch((error: unknown) => {\n\t\t\t\t// Rejections after an abort mark or close are expected; the committed state stays consistent.\n\t\t\t\tif (!runtime.signal.aborted) runtime.report(error);\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tinFlight = undefined;\n\t\t\t\tif (pending !== undefined && !stopped) timer = setTimeout(flush, interval);\n\t\t\t});\n\t};\n\ttry {\n\t\tconst events = runtime.models.streamSimple(model, { messages: [...messages] }, options);\n\t\tfor await (const event of events) {\n\t\t\t// A partial without content, such as pi-ai's opening `start` event, shows nothing; a deferred response\n\t\t\t// never gets past it, so it never leaves a partial.\n\t\t\tif (event.type === \"done\" || event.type === \"error\" || event.partial.content.length === 0) continue;\n\t\t\tpending = event.partial;\n\t\t\tif (timer === undefined && inFlight === undefined) timer = setTimeout(flush, interval);\n\t\t}\n\t\treturn await events.result();\n\t} finally {\n\t\tstopped = true;\n\t\tclearTimeout(timer);\n\t\tawait inFlight;\n\t}\n}\n\n/** Classify a terminal provider message in one commit that also clears the partial. */\nasync function classify(\n\truntime: Runtime,\n\trequest: Request,\n\tmessage: AssistantMessage,\n\tcontext: Context,\n): Promise<void> {\n\t// An abort mark or close: the abort invocation or the reopened run handles the committed state.\n\truntime.signal.throwIfAborted();\n\tconst conversationId = runtime.conversationId;\n\tconst { attempt, compacted, model: ref, cutoff } = request;\n\tif (message.stopReason === \"deferred\" && message.deferred !== undefined) {\n\t\tconst handle = message.deferred;\n\t\tconst pollAt = Math.max(\n\t\t\truntime.now() + (handle.pollAfterMs ?? DEFAULT_POLL_AFTER_MS),\n\t\t\trequest.pollAt === undefined ? Number.NEGATIVE_INFINITY : request.pollAt + 1,\n\t\t);\n\t\tawait runtime.commit(async (tx) => {\n\t\t\t(await tx.doc(LiveDoc, conversationId)).generation = { attempt, deferred: { pollAt } };\n\t\t\tconst checkpoint = {\n\t\t\t\tphase: \"poll\",\n\t\t\t\tattempt,\n\t\t\t\t...(compacted === undefined ? {} : { compacted }),\n\t\t\t\tmodel: ref,\n\t\t\t\tcutoff,\n\t\t\t\thandle,\n\t\t\t\tpollAt,\n\t\t\t} as const;\n\t\t\treturn { status: \"running\", checkpoint };\n\t\t}, context);\n\t\treturn;\n\t}\n\tawait runtime.hooks.each(\"afterResponse\", (hook) => hook(message, runtime, context));\n\tconst calls = message.content.filter((content): content is ToolCall => content.type === \"toolCall\");\n\tif (message.stopReason === \"toolUse\" && calls.length > 0) {\n\t\treturn startToolRound(runtime, request, message, calls, context);\n\t}\n\tif (message.stopReason === \"stop\" || message.stopReason === \"length\" || message.stopReason === \"toolUse\") {\n\t\treturn answer(runtime, message, context);\n\t}\n\t// The retry and compaction policies govern the next attempt, so they are read now rather than pinned at preparation.\n\tconst settings = runtime.settings;\n\tconst overflow = message.stopReason === \"error\" && isContextOverflow(message);\n\tif (overflow && compacted === undefined && settings.compaction.enabled) {\n\t\tconst policy = settings.compaction;\n\t\tconst view = await runtime.context(conversationId, context, { at: cutoff });\n\t\tif (selectCut(view, policy.keepRecentTokens) !== undefined) {\n\t\t\tconst text = message.errorMessage ?? \"Context overflow\";\n\t\t\tawait runtime.commit(async (tx): Promise<Next> => {\n\t\t\t\tconst live = await tx.doc(LiveDoc, conversationId);\n\t\t\t\tawait appendAssistant(tx, conversationId, message);\n\t\t\t\tdelete live.generation;\n\t\t\t\tconst child = await createCompaction(tx, conversationId, { reason: \"overflow\" }, runtime.taskId);\n\t\t\t\tconst checkpoint = { phase: \"prepare\", attempt, compacted: child, overflow: text } as const;\n\t\t\t\treturn { status: \"waiting\", checkpoint, on: [child], policy: \"allSettled\" };\n\t\t\t}, context);\n\t\t\treturn;\n\t\t}\n\t}\n\tconst policy = settings.retry;\n\t// An overflow is never retried: only a compaction can make the next request fit.\n\tconst retry =\n\t\tmessage.stopReason === \"error\" &&\n\t\t!overflow &&\n\t\tisRetryableAssistantError(message) &&\n\t\tpolicy.enabled &&\n\t\tattempt <= policy.maxRetries;\n\tconst until = retry ? runtime.now() + retryDelayMs(policy, attempt) : 0;\n\tawait runtime.commit(async (tx): Promise<Next> => {\n\t\tconst live = await tx.doc(LiveDoc, conversationId);\n\t\tawait appendAssistant(tx, conversationId, message);\n\t\tif (retry) {\n\t\t\tlive.generation = { attempt, retry: { at: until, error: message.errorMessage ?? \"\" } };\n\t\t\tconst checkpoint = {\n\t\t\t\tphase: \"retry\",\n\t\t\t\tattempt,\n\t\t\t\t...(compacted === undefined ? {} : { compacted }),\n\t\t\t\tuntil,\n\t\t\t} as const;\n\t\t\treturn { status: \"running\", checkpoint };\n\t\t}\n\t\tconst text = message.errorMessage ?? `Model response ended with stop reason ${message.stopReason}`;\n\t\tendRun(tx, live, runtime.taskId, { status: \"unanswered\", reason: \"model_error\", detail: text });\n\t\treturn {\n\t\t\tstatus: \"terminal\",\n\t\t\toutcome: { status: \"failed\", error: { message: text, detail: { reason: \"model_error\" } } },\n\t\t};\n\t}, context);\n}\n\n/**\n * A final answer; the final boundary places queued items (spec §6). The first `onYield` continuation appends a user\n * message and hands the run to a successor generation, but only when the boundary selected no user item and no reset.\n * Otherwise the run's inputs settle `done`, and selected user items start the next run.\n */\nasync function answer(runtime: Runtime, message: AssistantMessage, context: Context): Promise<void> {\n\tlet continuation: UserInput | undefined;\n\tawait runtime.hooks.each(\"onYield\", async (hook) => {\n\t\tif (continuation !== undefined) return;\n\t\tcontinuation = (await hook(message, runtime, context))?.continue;\n\t});\n\tconst conversationId = runtime.conversationId;\n\tawait runtime.commit(async (tx): Promise<Next> => {\n\t\t// Queue modes are read on the Session line, when the boundary is decided.\n\t\tconst boundary = await prepareBoundary(tx, conversationId, runtime.settings);\n\t\tconst live = await tx.doc(LiveDoc, conversationId);\n\t\tconst entry = await appendAssistant(tx, conversationId, message);\n\t\tconst result: Next = { status: \"terminal\", outcome: { status: \"completed\", result: { entryId: entry.id } } };\n\t\tconst { users, reset } = await applyBoundary(tx, boundary, \"final\", runtime.now());\n\t\tif (continuation !== undefined && users.length === 0 && !reset) {\n\t\t\tconst user = { role: \"user\", content: continuation, timestamp: runtime.now() } as const;\n\t\t\tawait tx.appendEntry(UserEntry, conversationId, { model: [user] });\n\t\t\thandOver(live, runtime.taskId, await createGeneration(tx, conversationId));\n\t\t\tdelete live.generation;\n\t\t\treturn result;\n\t\t}\n\t\tendRun(tx, live, runtime.taskId, { status: \"done\", answer: entry.id });\n\t\tif (users.length > 0) await startRun(tx, conversationId, live, users);\n\t\treturn result;\n\t}, context);\n}\n\n/**\n * Append the tool-calling answer and start its tool round in one commit (spec §8.3). A call to a tool the request did\n * not offer gets its `tool_unavailable` result here; every other call gets a tool task owned by the generation, only the\n * first one now when the round is sequential. The generation then waits for them in its `tools` phase, keeping the run.\n */\nasync function startToolRound(\n\truntime: Runtime,\n\trequest: Request,\n\tmessage: AssistantMessage,\n\tcalls: readonly ToolCall[],\n\tcontext: Context,\n): Promise<void> {\n\tconst conversationId = runtime.conversationId;\n\tconst messages =\n\t\trequest.messages ?? (await runtime.context(conversationId, context, { at: request.cutoff })).messages;\n\tconst offered = new Set(getCurrentTools(messages).map((tool) => tool.name));\n\t// Read as the round starts; a tool is resolved as its tool task resolves it.\n\tconst tools = (await runtime.agent(context)).tools;\n\tconst sequential =\n\t\truntime.settings.toolExecution === \"sequential\" ||\n\t\tcalls.some(\n\t\t\t(call) =>\n\t\t\t\toffered.has(call.name) && tools.find((tool) => tool.name === call.name)?.executionMode === \"sequential\",\n\t\t);\n\tawait runtime.commit(async (tx): Promise<Next> => {\n\t\tconst live = await tx.doc(LiveDoc, conversationId);\n\t\tconst entry = await appendAssistant(tx, conversationId, message);\n\t\tconst slots: ToolSlot[] = [];\n\t\tconst tools: TaskId<ToolTaskResult>[] = [];\n\t\tconst pending: string[] = [];\n\t\tfor (const call of calls) {\n\t\t\tif (!offered.has(call.name)) {\n\t\t\t\tconst unavailable = harnessError(\"tool_unavailable\", `Tool ${call.name} is not available`);\n\t\t\t\tconst result = await appendToolResult(tx, conversationId, call, unavailable, runtime.now());\n\t\t\t\tslots.push({ callId: call.id, name: call.name, status: \"done\", entry: result.id });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (sequential && tools.length > 0) {\n\t\t\t\tpending.push(call.id);\n\t\t\t\tslots.push({ callId: call.id, name: call.name, status: \"pending\" });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst taskId = await createToolTask(tx, runtime, entry.id, call.id);\n\t\t\ttools.push(taskId);\n\t\t\tslots.push({ callId: call.id, name: call.name, taskId, status: \"pending\" });\n\t\t}\n\t\tdelete live.generation;\n\t\tlive.tools = slots;\n\t\tconst checkpoint = { phase: \"tools\", assistant: entry.id, tools, pending } as const;\n\t\treturn { status: \"waiting\", checkpoint, on: tools, policy: \"allSettled\" };\n\t}, context);\n}\n\n/**\n * The round's tools are terminal: apply their controls and either end the run at the final boundary (`terminate`,\n * `handoff`, or a queued reset) or hand it to the next generation at the `postTools` boundary (spec §8.5).\n */\nasync function finishToolRound(\n\truntime: Runtime,\n\tassistant: EntryId,\n\ttools: readonly TaskId<ToolTaskResult>[],\n\tcontext: Context,\n): Promise<void> {\n\tconst conversationId = runtime.conversationId;\n\tconst controls = new Map<TaskId, ToolControl | undefined>();\n\tconst outcomes = await runtime.outcomes(tools, context);\n\ttools.forEach((id, index) => {\n\t\tconst outcome = outcomes[index]!;\n\t\tcontrols.set(id, outcome.status === \"completed\" ? outcome.result.control : undefined);\n\t});\n\tconst slots = (await runtime.snapshot(LiveDoc, conversationId, context))?.tools ?? [];\n\tconst results = slots.flatMap((slot) => (slot.entry === undefined ? [] : [slot.entry]));\n\tawait runtime.hooks.each(\"afterTools\", (hook) => hook(assistant, results, runtime, context));\n\t// Every call of the round, including those answered without a task, must ask to terminate.\n\tconst terminate =\n\t\tslots.length > 0 &&\n\t\tslots.every((slot) => slot.taskId !== undefined && controls.get(slot.taskId)?.terminate === true);\n\tconst added = [...controls.values()].flatMap((control) => control?.addTools ?? []);\n\t// The last handoff in call order wins.\n\tconst handoff = [...controls.values()].findLast((control) => control?.handoff !== undefined)?.handoff;\n\tawait runtime.commit(async (tx): Promise<Next> => {\n\t\tconst boundary = await prepareBoundary(tx, conversationId, runtime.settings);\n\t\tif (added.length > 0) await addTools(tx, conversationId, added);\n\t\tconst live = await tx.doc(LiveDoc, conversationId);\n\t\tconst now = runtime.now();\n\t\tif (terminate || handoff !== undefined) {\n\t\t\tif (handoff !== undefined) {\n\t\t\t\tconst message = { role: \"user\", content: handoff, timestamp: now } as const;\n\t\t\t\tconst entry = await tx.appendEntry(ResetEntry, conversationId, { head: \"self\", model: [message] });\n\t\t\t\tboundary.head = entry.id;\n\t\t\t}\n\t\t\tconst { users } = await applyBoundary(tx, boundary, \"final\", now);\n\t\t\tendRun(tx, live, runtime.taskId, { status: \"done\", answer: assistant });\n\t\t\tif (users.length > 0) await startRun(tx, conversationId, live, users);\n\t\t} else {\n\t\t\tconst { users, reset } = await applyBoundary(tx, boundary, \"postTools\", now);\n\t\t\tif (reset) {\n\t\t\t\t// The queued reset cut the run's context before an answer.\n\t\t\t\tendRun(tx, live, runtime.taskId, { status: \"unanswered\", reason: \"reset\" });\n\t\t\t\tif (users.length > 0) await startRun(tx, conversationId, live, users);\n\t\t\t} else {\n\t\t\t\tdelete live.tools;\n\t\t\t\tif (live.run?.taskId === runtime.taskId) live.run.inputs.push(...users);\n\t\t\t\thandOver(live, runtime.taskId, await createGeneration(tx, conversationId));\n\t\t\t}\n\t\t}\n\t\treturn { status: \"terminal\", outcome: { status: \"completed\", result: { entryId: assistant } } };\n\t}, context);\n}\n\n/**\n * Append a provider result and add its usage to `pi.usage` in the same commit.\n * REMINDER: every built-in writer of assistant entries goes through here, so the usage ledger stays complete.\n */\nasync function appendAssistant(\n\ttx: Tx,\n\tconversationId: ConversationId,\n\tmessage: AssistantMessage,\n): Promise<TypedEntry<never>> {\n\tawait recordUsage(tx, conversationId, \"models\", `${message.provider}/${message.model}`, message.usage);\n\treturn tx.appendEntry(AssistantEntry, conversationId, { model: [message] });\n}\n\n/** Start a run for `inputs`, placed input submissions: a new generation takes `pi.live.run`. */\nexport async function startRun(\n\ttx: Tx,\n\tconversationId: ConversationId,\n\tlive: Draft<LiveState>,\n\tinputs: SubmissionId[],\n): Promise<void> {\n\tlive.run = { taskId: await createGeneration(tx, conversationId), inputs };\n}\n\n/** A generation owned by its conversation. */\nfunction createGeneration(tx: Tx, conversationId: ConversationId): Promise<TaskId<GenerationResult>> {\n\treturn tx.createTask(GenerationTask, {}, { ownership: { kind: \"conversation\" }, conversationId });\n}\n\n/** Hand run control from `from` to `to`; the run's inputs move with it. */\nexport function handOver(live: Draft<LiveState>, from: TaskId, to: TaskId): void {\n\tif (live.run?.taskId === from) live.run.taskId = to;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../src/harness/harness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,OAAO,EAAa,MAAM,uBAAuB,CAAC;AAMzF,OAAO,KAAK,EASX,OAAO,EAKP,MAAM,aAAa,CAAC;AAYrB,OAAO,KAAK,EAYX,cAAc,EACd,OAAO,IAAI,WAAW,EAKtB,gBAAgB,EAChB,MAAM,YAAY,CAAC;AAmWpB,8CAA8C;AAC9C,MAAM,MAAM,OAAO,GAAG,WAAW,CAAC;AAElC,eAAO,MAAM,OAAO;IACnB,0FAA0F;IACpF,IAAI,CAAC,IAAI,SAAS,gBAAgB,WAC9B,OAAO,WACP,cAAc,CAAC,IAAI,CAAC,WACpB,OAAO,GACd,OAAO,CAAC,OAAO,CAAC;CAoBnB,CAAC"}
1
+ {"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../src/harness/harness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,OAAO,EAAa,MAAM,uBAAuB,CAAC;AAMzF,OAAO,KAAK,EASX,OAAO,EAKP,MAAM,aAAa,CAAC;AAYrB,OAAO,KAAK,EAYX,cAAc,EACd,OAAO,IAAI,WAAW,EAKtB,gBAAgB,EAChB,MAAM,YAAY,CAAC;AAoWpB,8CAA8C;AAC9C,MAAM,MAAM,OAAO,GAAG,WAAW,CAAC;AAElC,eAAO,MAAM,OAAO;IACnB,0FAA0F;IACpF,IAAI,CAAC,IAAI,SAAS,gBAAgB,WAC9B,OAAO,WACP,cAAc,CAAC,IAAI,CAAC,WACpB,OAAO,GACd,OAAO,CAAC,OAAO,CAAC;CAoBnB,CAAC"}
@@ -47,14 +47,15 @@ class ConversationImpl {
47
47
  commit(change, context) {
48
48
  return this.#host.harness.commitWith(change, context, { conversationId: this.id });
49
49
  }
50
- context(context) {
51
- return readContext(this.#host.harness, this.#host.storage, this.id, context);
50
+ context(context, options) {
51
+ return readContext(this.#host.harness, this.#host.storage, this.id, context, options?.at);
52
52
  }
53
53
  entries(query, limit, cursor, context) {
54
54
  const bounded = {
55
55
  conversationId: this.id,
56
56
  ...(query.minEntryId === undefined ? {} : { minEntryId: query.minEntryId }),
57
57
  ...(query.maxEntryId === undefined ? {} : { maxEntryId: query.maxEntryId }),
58
+ ...(query.order === undefined ? {} : { order: query.order }),
58
59
  };
59
60
  return this.#host.harness.readOnLine(() => this.#host.storage.scanEntries(bounded, limit, cursor, context));
60
61
  }
@@ -87,7 +88,7 @@ class HarnessImpl extends SessionImpl {
87
88
  #taskGraph;
88
89
  #closed = false;
89
90
  constructor(storage, options, context) {
90
- super(storage);
91
+ super(storage, options.now);
91
92
  this.#storage = storage;
92
93
  this.#options = options;
93
94
  this.#report = options.onReport ?? (() => { });
@@ -1 +1 @@
1
- {"version":3,"file":"harness.js","sourceRoot":"","sources":["../../src/harness/harness.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AttachedReplicatedState, Context, JsonValue } from \"@earendil-works/chord\";\nimport { withAbortSignal, withoutAbortSignal } from \"@earendil-works/chord/context\";\nimport { ResetEntry } from \"../entries.ts\";\nimport type { ExecutionEnv } from \"../env/index.ts\";\nimport { SessionImpl } from \"../session/session.ts\";\nimport type { Transaction } from \"../session/transaction.ts\";\nimport type {\n\tConversationId,\n\tConversationOwnership,\n\tConversationRecord,\n\tCursor,\n\tEntryId,\n\tEntryQuery,\n\tEntryRecord,\n\tPage,\n\tStorage,\n\tSubmissionId,\n\tTaskId,\n\tTaskRecord,\n\tTx,\n} from \"../types.ts\";\nimport { ROOT_CONVERSATION_ID } from \"../types.ts\";\nimport { AgentDoc, configure, createAgent, resolveAgent, resolveSettings } from \"./agent.ts\";\nimport { createCompaction } from \"./compaction.ts\";\nimport { readContext } from \"./context.ts\";\nimport { InboxDoc, withdrawQueuedInputs } from \"./inbox.ts\";\nimport { LiveDoc, settleSchedulerOutcome } from \"./live.ts\";\nimport { ProviderDoc } from \"./provider.ts\";\nimport { BUILTIN_TASKS } from \"./registry.ts\";\nimport { type InvocationBinding, TaskScheduler } from \"./scheduler.ts\";\nimport { Submissions } from \"./submissions.ts\";\nimport { type TaskGraph, TaskGraphView, type TaskGraphWatch } from \"./task-graph.ts\";\nimport type {\n\tAgent,\n\tAgentChange,\n\tCompactionResult,\n\tContextView,\n\tConversation,\n\tConversationAbortOptions,\n\tConversationCreateOptions,\n\tConversationHandle,\n\tConversationInit,\n\tConversationWatch,\n\tHarnessInspection,\n\tHarnessOptions,\n\tHarness as HarnessType,\n\tRegistrySnapshot,\n\tSettledTask,\n\tSubmission,\n\tSubmissionDraft,\n\tToolRegistration,\n} from \"./types.ts\";\nimport { addUsageState, UsageDoc, type UsageState } from \"./usage.ts\";\nimport { scanAll } from \"./util.ts\";\nimport { type ConversationView, ConversationViews } from \"./view.ts\";\n\nconst SCAN_PAGE_SIZE = 256;\n\ntype CreateTarget =\n\t| { readonly kind: \"root\" }\n\t| { readonly kind: \"independent\"; readonly ownership: ConversationOwnership }\n\t| {\n\t\t\treadonly kind: \"fork\";\n\t\t\treadonly parentId: ConversationId;\n\t\t\treadonly at: EntryId;\n\t\t\treadonly ownership: ConversationOwnership;\n\t };\n\n/** What the conveniences apply in the creating commit, after the creation hook. */\ntype CreateOptions = { readonly agent?: AgentChange; readonly init?: ConversationInit };\n\n/** Harness-private services used by Conversation handles. */\ntype ConversationHost<Tool extends ToolRegistration> = {\n\treadonly harness: HarnessImpl<Tool>;\n\treadonly storage: Storage;\n\treadonly tasks: TaskScheduler;\n\treadonly submissions: Submissions;\n\treadonly views: ConversationViews;\n\treadonly now: () => number;\n\tcreate(target: CreateTarget, options: CreateOptions, context: Context): Promise<Conversation>;\n};\n\nclass ConversationImpl<Tool extends ToolRegistration> implements Conversation {\n\treadonly id: ConversationId;\n\treadonly #host: ConversationHost<Tool>;\n\n\tconstructor(id: ConversationId, host: ConversationHost<Tool>) {\n\t\tthis.id = id;\n\t\tthis.#host = host;\n\t}\n\n\tagent(context: Context): Promise<Agent> {\n\t\treturn this.#host.harness.resolveAgent(this.id, undefined, context);\n\t}\n\n\tconfigure(change: AgentChange, context: Context): Promise<void> {\n\t\treturn this.#host.harness.commitWith((tx) => configure(tx, this.id, change), context);\n\t}\n\n\tsubmit(submission: SubmissionDraft, context: Context): Promise<Submission> {\n\t\treturn this.#host.submissions.submit(this.id, submission, context);\n\t}\n\n\tcompact(instructions: string | undefined, context: Context): Promise<TaskId<CompactionResult>> {\n\t\tthis.#host.tasks.resume();\n\t\tconst input = { reason: \"manual\", ...(instructions === undefined ? {} : { instructions }) } as const;\n\t\treturn this.#host.harness.commitWith((tx) => createCompaction(tx, this.id, input), context);\n\t}\n\n\tasync reset(handoff: string | undefined, context: Context): Promise<void> {\n\t\tconst model =\n\t\t\thandoff === undefined\n\t\t\t\t? {}\n\t\t\t\t: { model: [{ role: \"user\", content: handoff, timestamp: this.#host.now() } as const] };\n\t\tconst entry = { kind: ResetEntry.kind, head: \"self\", ...model } as const;\n\t\tawait this.#host.submissions.submit(this.id, { type: \"write\", entry }, context);\n\t}\n\n\tcommit<T>(change: (tx: Tx) => T | Promise<T>, context: Context): Promise<T> {\n\t\treturn this.#host.harness.commitWith(change, context, { conversationId: this.id });\n\t}\n\n\tcontext(context: Context): Promise<ContextView> {\n\t\treturn readContext(this.#host.harness, this.#host.storage, this.id, context);\n\t}\n\n\tentries(\n\t\tquery: Omit<EntryQuery, \"conversationId\">,\n\t\tlimit: number,\n\t\tcursor: Cursor | undefined,\n\t\tcontext: Context,\n\t): Promise<Page<EntryRecord, Cursor>> {\n\t\tconst bounded: EntryQuery = {\n\t\t\tconversationId: this.id,\n\t\t\t...(query.minEntryId === undefined ? {} : { minEntryId: query.minEntryId }),\n\t\t\t...(query.maxEntryId === undefined ? {} : { maxEntryId: query.maxEntryId }),\n\t\t};\n\t\treturn this.#host.harness.readOnLine(() => this.#host.storage.scanEntries(bounded, limit, cursor, context));\n\t}\n\n\tfork(at: EntryId, options: ConversationCreateOptions, context: Context): Promise<Conversation> {\n\t\treturn this.#host.create({ kind: \"fork\", parentId: this.id, at, ownership: options.ownership }, options, context);\n\t}\n\n\tabort(context: Context, options?: ConversationAbortOptions): Promise<void> {\n\t\tthis.#host.tasks.resume();\n\t\treturn this.#host.tasks.abortConversation(this.id, options?.background === true, context);\n\t}\n\n\twaitForIdle(context: Context): Promise<void> {\n\t\tthis.#host.tasks.resume();\n\t\treturn this.#host.tasks.waitForIdle(this.id, context);\n\t}\n\n\tviewState(context: Context): Promise<AttachedReplicatedState<ConversationView>> {\n\t\treturn this.#host.views.state(this.id, context);\n\t}\n\n\twatch(context: Context): Promise<ConversationWatch> {\n\t\treturn this.#host.views.watch(this.id, context);\n\t}\n}\n\n/** Session kernel extended with conversation handles and a registry. */\nclass HarnessImpl<Tool extends ToolRegistration> extends SessionImpl implements HarnessType {\n\treadonly #storage: Storage;\n\treadonly #options: HarnessOptions<Tool>;\n\treadonly #report: (error: unknown) => void;\n\treadonly #host: ConversationHost<Tool>;\n\treadonly #tasks: TaskScheduler;\n\treadonly #submissions: Submissions;\n\treadonly #taskGraph: TaskGraphView;\n\t#closed = false;\n\n\tconstructor(storage: Storage, options: HarnessOptions<Tool>, context: Context) {\n\t\tsuper(storage);\n\t\tthis.#storage = storage;\n\t\tthis.#options = options;\n\t\tthis.#report = options.onReport ?? (() => {});\n\t\tconst now = options.now ?? Date.now;\n\t\tconst settings = () => resolveSettings(options.settings);\n\t\tthis.#tasks = new TaskScheduler({\n\t\t\tsession: this,\n\t\t\tstorage,\n\t\t\tregistry: options.registry,\n\t\t\tmodels: options.models,\n\t\t\tagent: (id, snapshot, callContext) => this.resolveAgent(id, snapshot as RegistrySnapshot<Tool>, callContext),\n\t\t\tsettings,\n\t\t\tenv: (id, callContext) => this.buildEnv(id, callContext),\n\t\t\tnow,\n\t\t\treport: this.#report,\n\t\t\tsettleOutcome: settleSchedulerOutcome,\n\t\t\twithdrawInputs: withdrawQueuedInputs,\n\t\t\tconversation: async (id, binding, callContext) => {\n\t\t\t\tconst record = await this.readOnLine(() => storage.conversation(id, callContext));\n\t\t\t\treturn record === undefined ? undefined : boundConversation(id, binding, this.#submissions, this.#tasks);\n\t\t\t},\n\t\t\tcontext: withoutAbortSignal(context),\n\t\t});\n\t\tthis.#submissions = new Submissions(this, storage, now, settings, () => this.#tasks.resume());\n\t\tthis.#taskGraph = new TaskGraphView(this, storage);\n\t\tthis.#host = {\n\t\t\tharness: this,\n\t\t\tstorage,\n\t\t\ttasks: this.#tasks,\n\t\t\tsubmissions: this.#submissions,\n\t\t\tviews: new ConversationViews(this, storage),\n\t\t\tnow,\n\t\t\tcreate: (target, createOptions, context) => this.#create(target, createOptions, context),\n\t\t};\n\t}\n\n\t/** Resolve a conversation's committed `pi.agent` against `snapshot`, or the current one, and the current settings. */\n\tasync resolveAgent(\n\t\tid: ConversationId,\n\t\tsnapshot: RegistrySnapshot<Tool> | undefined,\n\t\tcontext: Context,\n\t): Promise<Agent<Tool>> {\n\t\tconst registry = snapshot ?? this.#options.registry.snapshot();\n\t\tconst state = await this.snapshot(AgentDoc, id, context);\n\t\treturn resolveAgent(state, registry, resolveSettings(this.#options.settings), this.#report);\n\t}\n\n\t/** Build a conversation's environment from its current `cwd`; `undefined` without an `env` option. */\n\tasync buildEnv(id: ConversationId, context: Context): Promise<ExecutionEnv | undefined> {\n\t\tconst build = this.#options.env;\n\t\tif (build === undefined) return undefined;\n\t\tconst cwd = (await this.snapshot(AgentDoc, id, context))?.cwd;\n\t\treturn build({ conversationId: id, ...(cwd === undefined ? {} : { cwd }), read: this }, context);\n\t}\n\n\t/** Reconcile surviving `running` tasks to `pending`; part of open. */\n\topenTasks(context: Context): Promise<void> {\n\t\treturn this.#tasks.open(context);\n\t}\n\n\tresume(): void {\n\t\tthis.#assertOpen();\n\t\tthis.#tasks.resume();\n\t}\n\n\tgetTask<R>(id: TaskId<R>, context: Context): Promise<TaskRecord<JsonValue, JsonValue, R> | undefined> {\n\t\treturn this.readOnLine(() => this.#storage.task(id, context)) as Promise<\n\t\t\tTaskRecord<JsonValue, JsonValue, R> | undefined\n\t\t>;\n\t}\n\n\tinspect(context: Context): Promise<HarnessInspection> {\n\t\treturn this.readOnLine(async () => {\n\t\t\tconst { scheduling, tasks } = await this.#tasks.inspect(this.#options.registry.snapshot());\n\t\t\tconst scan = (status: \"queued\" | \"placed\") =>\n\t\t\t\tscanAll((cursor) => this.#storage.scanSubmissions({ status }, SCAN_PAGE_SIZE, cursor, context));\n\t\t\tconst submissions = [...(await scan(\"queued\")), ...(await scan(\"placed\"))].sort((a, b) => a.id - b.id);\n\t\t\treturn { scheduling, tasks, submissions };\n\t\t});\n\t}\n\n\tsubmission(id: SubmissionId, context: Context): Promise<Submission | undefined> {\n\t\treturn this.#submissions.get(id, context);\n\t}\n\n\tabortSubmission(\n\t\tid: SubmissionId,\n\t\tcontext: Context,\n\t\tconversationId?: ConversationId,\n\t): Promise<\"aborted\" | \"already_placed\" | \"settled\" | \"not_found\"> {\n\t\treturn this.#submissions.abort(id, context, conversationId);\n\t}\n\n\tabortTask(id: TaskId, context: Context): Promise<\"marked\" | \"terminal\"> {\n\t\treturn this.#tasks.abort(id, context);\n\t}\n\n\twaitForTask<R>(id: TaskId<R>, context: Context): Promise<SettledTask<R>> {\n\t\tthis.#tasks.resume();\n\t\treturn this.#tasks.waitForTask(id, context) as Promise<SettledTask<R>>;\n\t}\n\n\twaitForIdle(context: Context): Promise<void> {\n\t\tthis.#tasks.resume();\n\t\treturn this.#tasks.waitForIdle(undefined, context);\n\t}\n\n\t/** Sum every conversation's committed `pi.usage`. Each document is read at its own point; totals only grow. */\n\tasync usage(context: Context): Promise<UsageState> {\n\t\tconst conversations = await this.readOnLine(() =>\n\t\t\tscanAll((cursor) => this.#storage.scanConversations({}, SCAN_PAGE_SIZE, cursor, context)),\n\t\t);\n\t\tconst total = UsageDoc.definition.initial();\n\t\tfor (const { id } of conversations) {\n\t\t\tconst state = await this.snapshot(UsageDoc, id, context);\n\t\t\tif (state !== undefined) addUsageState(total, state);\n\t\t}\n\t\treturn total;\n\t}\n\n\ttaskGraph(context: Context): Promise<AttachedReplicatedState<TaskGraph>> {\n\t\treturn this.#taskGraph.state(context);\n\t}\n\n\twatchTaskGraph(context: Context): Promise<TaskGraphWatch> {\n\t\treturn this.#taskGraph.watch(context);\n\t}\n\n\troot(\n\t\tcontext: Context,\n\t\toptions?: { readonly agent?: AgentChange; readonly init?: ConversationInit },\n\t): Promise<Conversation> {\n\t\treturn this.#create({ kind: \"root\" }, options ?? {}, context);\n\t}\n\n\tasync conversation(id: ConversationId, context: Context): Promise<Conversation | undefined> {\n\t\tthis.#assertOpen();\n\t\tconst record = await this.readOnLine(() => this.#storage.conversation(id, context));\n\t\treturn record === undefined ? undefined : new ConversationImpl(record.id, this.#host);\n\t}\n\n\tcreateConversation(options: ConversationCreateOptions, context: Context): Promise<Conversation> {\n\t\treturn this.#create({ kind: \"independent\", ownership: options.ownership }, options, context);\n\t}\n\n\toverride close(context: Context): Promise<void> {\n\t\tthis.#closed = true;\n\t\treturn super.close(context);\n\t}\n\n\t/** Join task invocations after admission is sealed and before Storage closes; writes no task outcome. */\n\tprotected override beforeClose(): Promise<void> {\n\t\treturn this.#tasks.join();\n\t}\n\n\tasync #create(target: CreateTarget, options: CreateOptions, context: Context): Promise<Conversation> {\n\t\tthis.#assertOpen();\n\t\tconst id = await this.commitWith(async (tx) => {\n\t\t\tif (target.kind === \"root\" && (await tx.conversation(ROOT_CONVERSATION_ID)) !== undefined) {\n\t\t\t\treturn ROOT_CONVERSATION_ID;\n\t\t\t}\n\t\t\tconst record =\n\t\t\t\ttarget.kind === \"root\"\n\t\t\t\t\t? await tx.createRootConversation()\n\t\t\t\t\t: target.kind === \"fork\"\n\t\t\t\t\t\t? await tx.forkConversation(target.parentId, target.at, { ownership: target.ownership })\n\t\t\t\t\t\t: await tx.createConversation({ ownership: target.ownership });\n\t\t\tif (options.agent !== undefined) await configure(tx, record.id, options.agent);\n\t\t\tif (options.init !== undefined) await options.init(tx, record.id);\n\t\t\treturn record.id;\n\t\t}, context);\n\t\treturn new ConversationImpl(id, this.#host);\n\t}\n\n\t/**\n\t * The built-in creation hook, in every commit that creates or forks a conversation: empty `pi.live`, `pi.inbox`, and\n\t * `pi.usage`, a fresh `pi.provider`, the conversation's `pi.agent` (see `createAgent()`), then\n\t * `HarnessOptions.conversationCreated`.\n\t */\n\tprotected override async conversationCreated(tx: Transaction, record: ConversationRecord): Promise<void> {\n\t\tawait tx.doc(LiveDoc, record.id);\n\t\tawait tx.doc(InboxDoc, record.id);\n\t\tawait tx.doc(UsageDoc, record.id);\n\t\tawait tx.doc(ProviderDoc, record.id);\n\t\tawait createAgent(tx, record);\n\t\tawait this.#options.conversationCreated?.(tx, record);\n\t}\n\n\t#assertOpen(): void {\n\t\tif (this.#closed) throw new Error(\"Harness is closed\");\n\t}\n}\n\n/**\n * Invocation-bound handle for tasks and tools. Every operation, and every operation of a submission it returns, first\n * checks the invocation and runs under its signal, so it rejects once the invocation ends; admitted work stays durable.\n */\nfunction boundConversation(\n\tid: ConversationId,\n\tbinding: InvocationBinding,\n\tsubmissions: Submissions,\n\ttasks: TaskScheduler,\n): ConversationHandle {\n\tconst bind = (context: Context): Context => withAbortSignal(binding.signal, context);\n\tconst bound = <T>(operation: (context: Context) => Promise<T>) => {\n\t\treturn async (context: Context): Promise<T> => {\n\t\t\tbinding.check();\n\t\t\treturn operation(bind(context));\n\t\t};\n\t};\n\treturn {\n\t\tid,\n\t\tsubmit: async (draft, context) => {\n\t\t\tbinding.check();\n\t\t\tconst submission = await submissions.submit(id, draft, bind(context));\n\t\t\treturn {\n\t\t\t\tid: submission.id,\n\t\t\t\tstatus: bound((callContext) => submission.status(callContext)),\n\t\t\t\twait: bound((callContext) => submission.wait(callContext)),\n\t\t\t\tabort: bound((callContext) => submission.abort(callContext)),\n\t\t\t};\n\t\t},\n\t\tabort: async (context, options) => {\n\t\t\tbinding.check();\n\t\t\treturn tasks.abortConversation(id, options?.background === true, bind(context));\n\t\t},\n\t\twaitForIdle: bound((callContext) => tasks.waitForIdle(id, callContext)),\n\t};\n}\n\n/** Durable agent harness over one Session. */\nexport type Harness = HarnessType;\n\nexport const Harness = {\n\t/** Open a Harness over storage. The registry may keep changing while the Harness runs. */\n\tasync open<Tool extends ToolRegistration>(\n\t\tstorage: Storage,\n\t\toptions: HarnessOptions<Tool>,\n\t\tcontext: Context,\n\t): Promise<Harness> {\n\t\tcontext.abortSignal?.throwIfAborted();\n\t\tconst snapshot = options.registry.snapshot();\n\t\tconst missing = BUILTIN_TASKS.filter((task) => snapshot.task(task.definition.name) === undefined);\n\t\tif (missing.length > 0) {\n\t\t\tconst names = missing.map((task) => task.definition.name).join(\", \");\n\t\t\tthrow new Error(`Registry lacks built-in tasks ${names}; create it with createRegistry()`);\n\t\t}\n\t\tconst harness = new HarnessImpl(storage, options, context);\n\t\ttry {\n\t\t\tawait harness.openTasks(context);\n\t\t} catch (error) {\n\t\t\t// The caller's context may be what failed open: close without it, and rethrow the open error.\n\t\t\tawait harness\n\t\t\t\t.close(withoutAbortSignal(context))\n\t\t\t\t.catch((closeError: unknown) => options.onReport?.(closeError));\n\t\t\tthrow error;\n\t\t}\n\t\treturn harness;\n\t},\n};\n"]}
1
+ {"version":3,"file":"harness.js","sourceRoot":"","sources":["../../src/harness/harness.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AttachedReplicatedState, Context, JsonValue } from \"@earendil-works/chord\";\nimport { withAbortSignal, withoutAbortSignal } from \"@earendil-works/chord/context\";\nimport { ResetEntry } from \"../entries.ts\";\nimport type { ExecutionEnv } from \"../env/index.ts\";\nimport { SessionImpl } from \"../session/session.ts\";\nimport type { Transaction } from \"../session/transaction.ts\";\nimport type {\n\tConversationId,\n\tConversationOwnership,\n\tConversationRecord,\n\tCursor,\n\tEntryId,\n\tEntryQuery,\n\tEntryRecord,\n\tPage,\n\tStorage,\n\tSubmissionId,\n\tTaskId,\n\tTaskRecord,\n\tTx,\n} from \"../types.ts\";\nimport { ROOT_CONVERSATION_ID } from \"../types.ts\";\nimport { AgentDoc, configure, createAgent, resolveAgent, resolveSettings } from \"./agent.ts\";\nimport { createCompaction } from \"./compaction.ts\";\nimport { readContext } from \"./context.ts\";\nimport { InboxDoc, withdrawQueuedInputs } from \"./inbox.ts\";\nimport { LiveDoc, settleSchedulerOutcome } from \"./live.ts\";\nimport { ProviderDoc } from \"./provider.ts\";\nimport { BUILTIN_TASKS } from \"./registry.ts\";\nimport { type InvocationBinding, TaskScheduler } from \"./scheduler.ts\";\nimport { Submissions } from \"./submissions.ts\";\nimport { type TaskGraph, TaskGraphView, type TaskGraphWatch } from \"./task-graph.ts\";\nimport type {\n\tAgent,\n\tAgentChange,\n\tCompactionResult,\n\tContextView,\n\tConversation,\n\tConversationAbortOptions,\n\tConversationCreateOptions,\n\tConversationHandle,\n\tConversationInit,\n\tConversationWatch,\n\tHarnessInspection,\n\tHarnessOptions,\n\tHarness as HarnessType,\n\tRegistrySnapshot,\n\tSettledTask,\n\tSubmission,\n\tSubmissionDraft,\n\tToolRegistration,\n} from \"./types.ts\";\nimport { addUsageState, UsageDoc, type UsageState } from \"./usage.ts\";\nimport { scanAll } from \"./util.ts\";\nimport { type ConversationView, ConversationViews } from \"./view.ts\";\n\nconst SCAN_PAGE_SIZE = 256;\n\ntype CreateTarget =\n\t| { readonly kind: \"root\" }\n\t| { readonly kind: \"independent\"; readonly ownership: ConversationOwnership }\n\t| {\n\t\t\treadonly kind: \"fork\";\n\t\t\treadonly parentId: ConversationId;\n\t\t\treadonly at: EntryId;\n\t\t\treadonly ownership: ConversationOwnership;\n\t };\n\n/** What the conveniences apply in the creating commit, after the creation hook. */\ntype CreateOptions = { readonly agent?: AgentChange; readonly init?: ConversationInit };\n\n/** Harness-private services used by Conversation handles. */\ntype ConversationHost<Tool extends ToolRegistration> = {\n\treadonly harness: HarnessImpl<Tool>;\n\treadonly storage: Storage;\n\treadonly tasks: TaskScheduler;\n\treadonly submissions: Submissions;\n\treadonly views: ConversationViews;\n\treadonly now: () => number;\n\tcreate(target: CreateTarget, options: CreateOptions, context: Context): Promise<Conversation>;\n};\n\nclass ConversationImpl<Tool extends ToolRegistration> implements Conversation {\n\treadonly id: ConversationId;\n\treadonly #host: ConversationHost<Tool>;\n\n\tconstructor(id: ConversationId, host: ConversationHost<Tool>) {\n\t\tthis.id = id;\n\t\tthis.#host = host;\n\t}\n\n\tagent(context: Context): Promise<Agent> {\n\t\treturn this.#host.harness.resolveAgent(this.id, undefined, context);\n\t}\n\n\tconfigure(change: AgentChange, context: Context): Promise<void> {\n\t\treturn this.#host.harness.commitWith((tx) => configure(tx, this.id, change), context);\n\t}\n\n\tsubmit(submission: SubmissionDraft, context: Context): Promise<Submission> {\n\t\treturn this.#host.submissions.submit(this.id, submission, context);\n\t}\n\n\tcompact(instructions: string | undefined, context: Context): Promise<TaskId<CompactionResult>> {\n\t\tthis.#host.tasks.resume();\n\t\tconst input = { reason: \"manual\", ...(instructions === undefined ? {} : { instructions }) } as const;\n\t\treturn this.#host.harness.commitWith((tx) => createCompaction(tx, this.id, input), context);\n\t}\n\n\tasync reset(handoff: string | undefined, context: Context): Promise<void> {\n\t\tconst model =\n\t\t\thandoff === undefined\n\t\t\t\t? {}\n\t\t\t\t: { model: [{ role: \"user\", content: handoff, timestamp: this.#host.now() } as const] };\n\t\tconst entry = { kind: ResetEntry.kind, head: \"self\", ...model } as const;\n\t\tawait this.#host.submissions.submit(this.id, { type: \"write\", entry }, context);\n\t}\n\n\tcommit<T>(change: (tx: Tx) => T | Promise<T>, context: Context): Promise<T> {\n\t\treturn this.#host.harness.commitWith(change, context, { conversationId: this.id });\n\t}\n\n\tcontext(context: Context, options?: { readonly at?: EntryId }): Promise<ContextView> {\n\t\treturn readContext(this.#host.harness, this.#host.storage, this.id, context, options?.at);\n\t}\n\n\tentries(\n\t\tquery: Omit<EntryQuery, \"conversationId\">,\n\t\tlimit: number,\n\t\tcursor: Cursor | undefined,\n\t\tcontext: Context,\n\t): Promise<Page<EntryRecord, Cursor>> {\n\t\tconst bounded: EntryQuery = {\n\t\t\tconversationId: this.id,\n\t\t\t...(query.minEntryId === undefined ? {} : { minEntryId: query.minEntryId }),\n\t\t\t...(query.maxEntryId === undefined ? {} : { maxEntryId: query.maxEntryId }),\n\t\t\t...(query.order === undefined ? {} : { order: query.order }),\n\t\t};\n\t\treturn this.#host.harness.readOnLine(() => this.#host.storage.scanEntries(bounded, limit, cursor, context));\n\t}\n\n\tfork(at: EntryId, options: ConversationCreateOptions, context: Context): Promise<Conversation> {\n\t\treturn this.#host.create({ kind: \"fork\", parentId: this.id, at, ownership: options.ownership }, options, context);\n\t}\n\n\tabort(context: Context, options?: ConversationAbortOptions): Promise<void> {\n\t\tthis.#host.tasks.resume();\n\t\treturn this.#host.tasks.abortConversation(this.id, options?.background === true, context);\n\t}\n\n\twaitForIdle(context: Context): Promise<void> {\n\t\tthis.#host.tasks.resume();\n\t\treturn this.#host.tasks.waitForIdle(this.id, context);\n\t}\n\n\tviewState(context: Context): Promise<AttachedReplicatedState<ConversationView>> {\n\t\treturn this.#host.views.state(this.id, context);\n\t}\n\n\twatch(context: Context): Promise<ConversationWatch> {\n\t\treturn this.#host.views.watch(this.id, context);\n\t}\n}\n\n/** Session kernel extended with conversation handles and a registry. */\nclass HarnessImpl<Tool extends ToolRegistration> extends SessionImpl implements HarnessType {\n\treadonly #storage: Storage;\n\treadonly #options: HarnessOptions<Tool>;\n\treadonly #report: (error: unknown) => void;\n\treadonly #host: ConversationHost<Tool>;\n\treadonly #tasks: TaskScheduler;\n\treadonly #submissions: Submissions;\n\treadonly #taskGraph: TaskGraphView;\n\t#closed = false;\n\n\tconstructor(storage: Storage, options: HarnessOptions<Tool>, context: Context) {\n\t\tsuper(storage, options.now);\n\t\tthis.#storage = storage;\n\t\tthis.#options = options;\n\t\tthis.#report = options.onReport ?? (() => {});\n\t\tconst now = options.now ?? Date.now;\n\t\tconst settings = () => resolveSettings(options.settings);\n\t\tthis.#tasks = new TaskScheduler({\n\t\t\tsession: this,\n\t\t\tstorage,\n\t\t\tregistry: options.registry,\n\t\t\tmodels: options.models,\n\t\t\tagent: (id, snapshot, callContext) => this.resolveAgent(id, snapshot as RegistrySnapshot<Tool>, callContext),\n\t\t\tsettings,\n\t\t\tenv: (id, callContext) => this.buildEnv(id, callContext),\n\t\t\tnow,\n\t\t\treport: this.#report,\n\t\t\tsettleOutcome: settleSchedulerOutcome,\n\t\t\twithdrawInputs: withdrawQueuedInputs,\n\t\t\tconversation: async (id, binding, callContext) => {\n\t\t\t\tconst record = await this.readOnLine(() => storage.conversation(id, callContext));\n\t\t\t\treturn record === undefined ? undefined : boundConversation(id, binding, this.#submissions, this.#tasks);\n\t\t\t},\n\t\t\tcontext: withoutAbortSignal(context),\n\t\t});\n\t\tthis.#submissions = new Submissions(this, storage, now, settings, () => this.#tasks.resume());\n\t\tthis.#taskGraph = new TaskGraphView(this, storage);\n\t\tthis.#host = {\n\t\t\tharness: this,\n\t\t\tstorage,\n\t\t\ttasks: this.#tasks,\n\t\t\tsubmissions: this.#submissions,\n\t\t\tviews: new ConversationViews(this, storage),\n\t\t\tnow,\n\t\t\tcreate: (target, createOptions, context) => this.#create(target, createOptions, context),\n\t\t};\n\t}\n\n\t/** Resolve a conversation's committed `pi.agent` against `snapshot`, or the current one, and the current settings. */\n\tasync resolveAgent(\n\t\tid: ConversationId,\n\t\tsnapshot: RegistrySnapshot<Tool> | undefined,\n\t\tcontext: Context,\n\t): Promise<Agent<Tool>> {\n\t\tconst registry = snapshot ?? this.#options.registry.snapshot();\n\t\tconst state = await this.snapshot(AgentDoc, id, context);\n\t\treturn resolveAgent(state, registry, resolveSettings(this.#options.settings), this.#report);\n\t}\n\n\t/** Build a conversation's environment from its current `cwd`; `undefined` without an `env` option. */\n\tasync buildEnv(id: ConversationId, context: Context): Promise<ExecutionEnv | undefined> {\n\t\tconst build = this.#options.env;\n\t\tif (build === undefined) return undefined;\n\t\tconst cwd = (await this.snapshot(AgentDoc, id, context))?.cwd;\n\t\treturn build({ conversationId: id, ...(cwd === undefined ? {} : { cwd }), read: this }, context);\n\t}\n\n\t/** Reconcile surviving `running` tasks to `pending`; part of open. */\n\topenTasks(context: Context): Promise<void> {\n\t\treturn this.#tasks.open(context);\n\t}\n\n\tresume(): void {\n\t\tthis.#assertOpen();\n\t\tthis.#tasks.resume();\n\t}\n\n\tgetTask<R>(id: TaskId<R>, context: Context): Promise<TaskRecord<JsonValue, JsonValue, R> | undefined> {\n\t\treturn this.readOnLine(() => this.#storage.task(id, context)) as Promise<\n\t\t\tTaskRecord<JsonValue, JsonValue, R> | undefined\n\t\t>;\n\t}\n\n\tinspect(context: Context): Promise<HarnessInspection> {\n\t\treturn this.readOnLine(async () => {\n\t\t\tconst { scheduling, tasks } = await this.#tasks.inspect(this.#options.registry.snapshot());\n\t\t\tconst scan = (status: \"queued\" | \"placed\") =>\n\t\t\t\tscanAll((cursor) => this.#storage.scanSubmissions({ status }, SCAN_PAGE_SIZE, cursor, context));\n\t\t\tconst submissions = [...(await scan(\"queued\")), ...(await scan(\"placed\"))].sort((a, b) => a.id - b.id);\n\t\t\treturn { scheduling, tasks, submissions };\n\t\t});\n\t}\n\n\tsubmission(id: SubmissionId, context: Context): Promise<Submission | undefined> {\n\t\treturn this.#submissions.get(id, context);\n\t}\n\n\tabortSubmission(\n\t\tid: SubmissionId,\n\t\tcontext: Context,\n\t\tconversationId?: ConversationId,\n\t): Promise<\"aborted\" | \"already_placed\" | \"settled\" | \"not_found\"> {\n\t\treturn this.#submissions.abort(id, context, conversationId);\n\t}\n\n\tabortTask(id: TaskId, context: Context): Promise<\"marked\" | \"terminal\"> {\n\t\treturn this.#tasks.abort(id, context);\n\t}\n\n\twaitForTask<R>(id: TaskId<R>, context: Context): Promise<SettledTask<R>> {\n\t\tthis.#tasks.resume();\n\t\treturn this.#tasks.waitForTask(id, context) as Promise<SettledTask<R>>;\n\t}\n\n\twaitForIdle(context: Context): Promise<void> {\n\t\tthis.#tasks.resume();\n\t\treturn this.#tasks.waitForIdle(undefined, context);\n\t}\n\n\t/** Sum every conversation's committed `pi.usage`. Each document is read at its own point; totals only grow. */\n\tasync usage(context: Context): Promise<UsageState> {\n\t\tconst conversations = await this.readOnLine(() =>\n\t\t\tscanAll((cursor) => this.#storage.scanConversations({}, SCAN_PAGE_SIZE, cursor, context)),\n\t\t);\n\t\tconst total = UsageDoc.definition.initial();\n\t\tfor (const { id } of conversations) {\n\t\t\tconst state = await this.snapshot(UsageDoc, id, context);\n\t\t\tif (state !== undefined) addUsageState(total, state);\n\t\t}\n\t\treturn total;\n\t}\n\n\ttaskGraph(context: Context): Promise<AttachedReplicatedState<TaskGraph>> {\n\t\treturn this.#taskGraph.state(context);\n\t}\n\n\twatchTaskGraph(context: Context): Promise<TaskGraphWatch> {\n\t\treturn this.#taskGraph.watch(context);\n\t}\n\n\troot(\n\t\tcontext: Context,\n\t\toptions?: { readonly agent?: AgentChange; readonly init?: ConversationInit },\n\t): Promise<Conversation> {\n\t\treturn this.#create({ kind: \"root\" }, options ?? {}, context);\n\t}\n\n\tasync conversation(id: ConversationId, context: Context): Promise<Conversation | undefined> {\n\t\tthis.#assertOpen();\n\t\tconst record = await this.readOnLine(() => this.#storage.conversation(id, context));\n\t\treturn record === undefined ? undefined : new ConversationImpl(record.id, this.#host);\n\t}\n\n\tcreateConversation(options: ConversationCreateOptions, context: Context): Promise<Conversation> {\n\t\treturn this.#create({ kind: \"independent\", ownership: options.ownership }, options, context);\n\t}\n\n\toverride close(context: Context): Promise<void> {\n\t\tthis.#closed = true;\n\t\treturn super.close(context);\n\t}\n\n\t/** Join task invocations after admission is sealed and before Storage closes; writes no task outcome. */\n\tprotected override beforeClose(): Promise<void> {\n\t\treturn this.#tasks.join();\n\t}\n\n\tasync #create(target: CreateTarget, options: CreateOptions, context: Context): Promise<Conversation> {\n\t\tthis.#assertOpen();\n\t\tconst id = await this.commitWith(async (tx) => {\n\t\t\tif (target.kind === \"root\" && (await tx.conversation(ROOT_CONVERSATION_ID)) !== undefined) {\n\t\t\t\treturn ROOT_CONVERSATION_ID;\n\t\t\t}\n\t\t\tconst record =\n\t\t\t\ttarget.kind === \"root\"\n\t\t\t\t\t? await tx.createRootConversation()\n\t\t\t\t\t: target.kind === \"fork\"\n\t\t\t\t\t\t? await tx.forkConversation(target.parentId, target.at, { ownership: target.ownership })\n\t\t\t\t\t\t: await tx.createConversation({ ownership: target.ownership });\n\t\t\tif (options.agent !== undefined) await configure(tx, record.id, options.agent);\n\t\t\tif (options.init !== undefined) await options.init(tx, record.id);\n\t\t\treturn record.id;\n\t\t}, context);\n\t\treturn new ConversationImpl(id, this.#host);\n\t}\n\n\t/**\n\t * The built-in creation hook, in every commit that creates or forks a conversation: empty `pi.live`, `pi.inbox`, and\n\t * `pi.usage`, a fresh `pi.provider`, the conversation's `pi.agent` (see `createAgent()`), then\n\t * `HarnessOptions.conversationCreated`.\n\t */\n\tprotected override async conversationCreated(tx: Transaction, record: ConversationRecord): Promise<void> {\n\t\tawait tx.doc(LiveDoc, record.id);\n\t\tawait tx.doc(InboxDoc, record.id);\n\t\tawait tx.doc(UsageDoc, record.id);\n\t\tawait tx.doc(ProviderDoc, record.id);\n\t\tawait createAgent(tx, record);\n\t\tawait this.#options.conversationCreated?.(tx, record);\n\t}\n\n\t#assertOpen(): void {\n\t\tif (this.#closed) throw new Error(\"Harness is closed\");\n\t}\n}\n\n/**\n * Invocation-bound handle for tasks and tools. Every operation, and every operation of a submission it returns, first\n * checks the invocation and runs under its signal, so it rejects once the invocation ends; admitted work stays durable.\n */\nfunction boundConversation(\n\tid: ConversationId,\n\tbinding: InvocationBinding,\n\tsubmissions: Submissions,\n\ttasks: TaskScheduler,\n): ConversationHandle {\n\tconst bind = (context: Context): Context => withAbortSignal(binding.signal, context);\n\tconst bound = <T>(operation: (context: Context) => Promise<T>) => {\n\t\treturn async (context: Context): Promise<T> => {\n\t\t\tbinding.check();\n\t\t\treturn operation(bind(context));\n\t\t};\n\t};\n\treturn {\n\t\tid,\n\t\tsubmit: async (draft, context) => {\n\t\t\tbinding.check();\n\t\t\tconst submission = await submissions.submit(id, draft, bind(context));\n\t\t\treturn {\n\t\t\t\tid: submission.id,\n\t\t\t\tstatus: bound((callContext) => submission.status(callContext)),\n\t\t\t\twait: bound((callContext) => submission.wait(callContext)),\n\t\t\t\tabort: bound((callContext) => submission.abort(callContext)),\n\t\t\t};\n\t\t},\n\t\tabort: async (context, options) => {\n\t\t\tbinding.check();\n\t\t\treturn tasks.abortConversation(id, options?.background === true, bind(context));\n\t\t},\n\t\twaitForIdle: bound((callContext) => tasks.waitForIdle(id, callContext)),\n\t};\n}\n\n/** Durable agent harness over one Session. */\nexport type Harness = HarnessType;\n\nexport const Harness = {\n\t/** Open a Harness over storage. The registry may keep changing while the Harness runs. */\n\tasync open<Tool extends ToolRegistration>(\n\t\tstorage: Storage,\n\t\toptions: HarnessOptions<Tool>,\n\t\tcontext: Context,\n\t): Promise<Harness> {\n\t\tcontext.abortSignal?.throwIfAborted();\n\t\tconst snapshot = options.registry.snapshot();\n\t\tconst missing = BUILTIN_TASKS.filter((task) => snapshot.task(task.definition.name) === undefined);\n\t\tif (missing.length > 0) {\n\t\t\tconst names = missing.map((task) => task.definition.name).join(\", \");\n\t\t\tthrow new Error(`Registry lacks built-in tasks ${names}; create it with createRegistry()`);\n\t\t}\n\t\tconst harness = new HarnessImpl(storage, options, context);\n\t\ttry {\n\t\t\tawait harness.openTasks(context);\n\t\t} catch (error) {\n\t\t\t// The caller's context may be what failed open: close without it, and rethrow the open error.\n\t\t\tawait harness\n\t\t\t\t.close(withoutAbortSignal(context))\n\t\t\t\t.catch((closeError: unknown) => options.onReport?.(closeError));\n\t\t\tthrow error;\n\t\t}\n\t\treturn harness;\n\t},\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/harness/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGvD,6CAA6C;AAC7C,MAAM,MAAM,YAAY,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC;AAEtH,mDAAmD;AACnD,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpH,2EAA2E;AAC3E,MAAM,MAAM,WAAW,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC9B,CAAC;AAOF,4FAA4F;AAC5F,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,WAAW,CAU3E;AA0CD,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIrE;AAgBD;;;;GAIG;AACH,qBAAa,YAAY;;IAYxB,YAAY,MAAM,EAAE,YAAY,EAE/B;IAED,kEAAkE;IAClE,IAAI,WAAW,IAAI,MAAM,CAExB;IAED;;;;OAIG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAUnE;IAaD,oGAAoG;IACpG,GAAG,IAAI,IAAI,CAEV;IAgCD,oFAAoF;IACpF,QAAQ,IAAI,aAAa,CAoBxB;CACD;AAiCD,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,QAAa,CAAC;AAEpD;;;;GAIG;AACH,qBAAa,QAAQ;;IAWpB,YAAY,KAAK,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,EAAE,aAAa,EAAE,MAAM,EAIjG;IAED,yBAAyB;IACzB,IAAI,IAAI,IAAI,CAGX;IAED,wFAAwF;IACxF,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAK3B;IAED,2GAA2G;IACrG,IAAI,IAAI,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAMlD;CAmCD"}
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/harness/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGvD,6CAA6C;AAC7C,MAAM,MAAM,YAAY,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC;AAEtH,mDAAmD;AACnD,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpH,2EAA2E;AAC3E,MAAM,MAAM,WAAW,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC9B,CAAC;AAQF,4FAA4F;AAC5F,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,WAAW,CAU3E;AA0CD,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIrE;AAgBD;;;;GAIG;AACH,qBAAa,YAAY;;IAkBxB,YAAY,MAAM,EAAE,YAAY,EAE/B;IAED,kEAAkE;IAClE,IAAI,WAAW,IAAI,MAAM,CAExB;IAED;;;;OAIG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAanE;IAaD,oGAAoG;IACpG,GAAG,IAAI,IAAI,CAEV;IAgCD,oFAAoF;IACpF,QAAQ,IAAI,aAAa,CAoBxB;CACD;AAiCD,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,QAAa,CAAC;AAEpD;;;;GAIG;AACH,qBAAa,QAAQ;;IAWpB,YAAY,KAAK,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,EAAE,aAAa,EAAE,MAAM,EAIjG;IAED,yBAAyB;IACzB,IAAI,IAAI,IAAI,CAGX;IAED,wFAAwF;IACxF,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAK3B;IAED,2GAA2G;IACrG,IAAI,IAAI,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAMlD;CAmCD"}
@@ -2,7 +2,8 @@ import { utf8ByteLength } from "../truncate.js";
2
2
  const NEWLINE = 0x0a;
3
3
  const INVALID_OUTPUT = /[\x00-\x08\x0b-\x1f\ufff9-\ufffb]/g;
4
4
  const encoder = new TextEncoder();
5
- const decoder = new TextDecoder();
5
+ /** Slices decode exactly: a U+FEFF at a slice's start is text, not a byte-order mark. */
6
+ const decoder = new TextDecoder("utf-8", { ignoreBOM: true });
6
7
  /** Remove control characters that break display and transcripts; tabs and newlines stay. */
7
8
  export function sanitizeOutput(text) {
8
9
  return text.replace(INVALID_OUTPUT, "");
@@ -92,7 +93,13 @@ function lineCount(bytes) {
92
93
  */
93
94
  export class OutputBuffer {
94
95
  #limits;
95
- #decoder = new TextDecoder();
96
+ /**
97
+ * Decoder of byte chunks. A string chunk or a skip ends an incomplete character of earlier bytes (it becomes U+FFFD);
98
+ * the next byte chunk then starts a new character. As in `StreamDecoder`, only a byte-order mark at the very start of
99
+ * the output is dropped, never a U+FEFF later in it.
100
+ */
101
+ #decoder = new TextDecoder("utf-8", { ignoreBOM: true });
102
+ #started = false;
96
103
  /** Stored chunks: for head the start of the stream, for tail a suffix that still contains the next window. */
97
104
  #chunks = [];
98
105
  #storedBytes = 0;
@@ -116,7 +123,12 @@ export class OutputBuffer {
116
123
  push(chunk, skipped) {
117
124
  // Bytes of an incomplete character from an earlier byte chunk come first.
118
125
  const pending = typeof chunk === "string" || skipped !== undefined ? this.#decoder.decode() : "";
119
- const text = typeof chunk === "string" ? chunk : this.#decoder.decode(chunk, { stream: true });
126
+ let text = typeof chunk === "string" ? chunk : this.#decoder.decode(chunk, { stream: true });
127
+ const first = !this.#started && pending === "" && skipped === undefined;
128
+ if (pending !== "" || text !== "" || skipped !== undefined)
129
+ this.#started = true;
130
+ if (first && typeof chunk !== "string" && text.startsWith("\ufeff"))
131
+ text = text.slice(1);
120
132
  if (skipped === undefined)
121
133
  return this.#accept(pending + text);
122
134
  if (this.#limits.retain !== "tail")