@geminixiang/mikan 1.4.0 → 1.5.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 (116) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/adapters/commands/desktop.d.ts +5 -0
  3. package/dist/adapters/commands/desktop.d.ts.map +1 -0
  4. package/dist/adapters/commands/desktop.js +58 -0
  5. package/dist/adapters/commands/desktop.js.map +1 -0
  6. package/dist/adapters/commands/manifest.d.ts.map +1 -1
  7. package/dist/adapters/commands/manifest.js +8 -0
  8. package/dist/adapters/commands/manifest.js.map +1 -1
  9. package/dist/adapters/commands/registry.d.ts.map +1 -1
  10. package/dist/adapters/commands/registry.js +2 -0
  11. package/dist/adapters/commands/registry.js.map +1 -1
  12. package/dist/adapters/commands/types.d.ts +3 -1
  13. package/dist/adapters/commands/types.d.ts.map +1 -1
  14. package/dist/adapters/commands/types.js.map +1 -1
  15. package/dist/adapters/messages.d.ts +0 -1
  16. package/dist/adapters/messages.d.ts.map +1 -1
  17. package/dist/adapters/messages.js +0 -3
  18. package/dist/adapters/messages.js.map +1 -1
  19. package/dist/adapters/slack/app-config.d.ts +27 -0
  20. package/dist/adapters/slack/app-config.d.ts.map +1 -0
  21. package/dist/adapters/slack/app-config.js +241 -0
  22. package/dist/adapters/slack/app-config.js.map +1 -0
  23. package/dist/adapters/slack/bot.d.ts +0 -3
  24. package/dist/adapters/slack/bot.d.ts.map +1 -1
  25. package/dist/adapters/slack/bot.js +4 -163
  26. package/dist/adapters/slack/bot.js.map +1 -1
  27. package/dist/adapters/slack/types.d.ts +46 -2
  28. package/dist/adapters/slack/types.d.ts.map +1 -1
  29. package/dist/adapters/slack/types.js.map +1 -1
  30. package/dist/adapters/web/desktop/index.d.ts +16 -0
  31. package/dist/adapters/web/desktop/index.d.ts.map +1 -0
  32. package/dist/adapters/web/desktop/index.js +163 -0
  33. package/dist/adapters/web/desktop/index.js.map +1 -0
  34. package/dist/adapters/web/desktop/page.d.ts +2 -0
  35. package/dist/adapters/web/desktop/page.d.ts.map +1 -0
  36. package/dist/adapters/web/desktop/page.js +83 -0
  37. package/dist/adapters/web/desktop/page.js.map +1 -0
  38. package/dist/adapters/web/desktop/types.d.ts +8 -0
  39. package/dist/adapters/web/desktop/types.d.ts.map +1 -0
  40. package/dist/adapters/web/desktop/types.js +2 -0
  41. package/dist/adapters/web/desktop/types.js.map +1 -0
  42. package/dist/adapters/web/server.d.ts +2 -0
  43. package/dist/adapters/web/server.d.ts.map +1 -1
  44. package/dist/adapters/web/server.js +19 -0
  45. package/dist/adapters/web/server.js.map +1 -1
  46. package/dist/cli/boot.d.ts.map +1 -1
  47. package/dist/cli/boot.js +4 -1
  48. package/dist/cli/boot.js.map +1 -1
  49. package/dist/cli/onboard.d.ts +3 -0
  50. package/dist/cli/onboard.d.ts.map +1 -1
  51. package/dist/cli/onboard.js +79 -3
  52. package/dist/cli/onboard.js.map +1 -1
  53. package/dist/cli/slack.d.ts +9 -0
  54. package/dist/cli/slack.d.ts.map +1 -0
  55. package/dist/cli/slack.js +96 -0
  56. package/dist/cli/slack.js.map +1 -0
  57. package/dist/cli/types.d.ts +2 -1
  58. package/dist/cli/types.d.ts.map +1 -1
  59. package/dist/cli/types.js.map +1 -1
  60. package/dist/harness/desktop.d.ts +16 -0
  61. package/dist/harness/desktop.d.ts.map +1 -0
  62. package/dist/harness/desktop.js +6 -0
  63. package/dist/harness/desktop.js.map +1 -0
  64. package/dist/harness/execution-resolver.d.ts +1 -0
  65. package/dist/harness/execution-resolver.d.ts.map +1 -1
  66. package/dist/harness/execution-resolver.js +5 -0
  67. package/dist/harness/execution-resolver.js.map +1 -1
  68. package/dist/harness/presenter.d.ts.map +1 -1
  69. package/dist/harness/presenter.js +6 -1
  70. package/dist/harness/presenter.js.map +1 -1
  71. package/dist/harness/runner.d.ts.map +1 -1
  72. package/dist/harness/runner.js +22 -1
  73. package/dist/harness/runner.js.map +1 -1
  74. package/dist/harness/session.d.ts +1 -1
  75. package/dist/harness/session.d.ts.map +1 -1
  76. package/dist/harness/session.js +30 -9
  77. package/dist/harness/session.js.map +1 -1
  78. package/dist/harness/tools/codemode.d.ts.map +1 -1
  79. package/dist/harness/tools/codemode.js +2 -2
  80. package/dist/harness/tools/codemode.js.map +1 -1
  81. package/dist/harness/tools/index.d.ts +2 -2
  82. package/dist/harness/tools/index.d.ts.map +1 -1
  83. package/dist/harness/tools/index.js +10 -2
  84. package/dist/harness/tools/index.js.map +1 -1
  85. package/dist/harness/tools/jev-browser.d.ts +12 -1
  86. package/dist/harness/tools/jev-browser.d.ts.map +1 -1
  87. package/dist/harness/tools/jev-browser.js +189 -30
  88. package/dist/harness/tools/jev-browser.js.map +1 -1
  89. package/dist/harness/tools/pi-tools.d.ts.map +1 -1
  90. package/dist/harness/tools/pi-tools.js +2 -1
  91. package/dist/harness/tools/pi-tools.js.map +1 -1
  92. package/dist/harness/tools/types.d.ts +4 -0
  93. package/dist/harness/tools/types.d.ts.map +1 -1
  94. package/dist/harness/tools/types.js.map +1 -1
  95. package/dist/harness/types.d.ts +2 -1
  96. package/dist/harness/types.d.ts.map +1 -1
  97. package/dist/harness/types.js.map +1 -1
  98. package/dist/main.js +29 -0
  99. package/dist/main.js.map +1 -1
  100. package/dist/runtime/conversation-runtime.js +7 -0
  101. package/dist/runtime/conversation-runtime.js.map +1 -1
  102. package/dist/sandbox/desktop.d.ts +30 -0
  103. package/dist/sandbox/desktop.d.ts.map +1 -0
  104. package/dist/sandbox/desktop.js +112 -0
  105. package/dist/sandbox/desktop.js.map +1 -0
  106. package/dist/sandbox/provisioner.d.ts +4 -1
  107. package/dist/sandbox/provisioner.d.ts.map +1 -1
  108. package/dist/sandbox/provisioner.js +21 -0
  109. package/dist/sandbox/provisioner.js.map +1 -1
  110. package/dist/sandbox/types.d.ts +19 -0
  111. package/dist/sandbox/types.d.ts.map +1 -1
  112. package/dist/sandbox/types.js.map +1 -1
  113. package/dist/types.d.ts +17 -1
  114. package/dist/types.d.ts.map +1 -1
  115. package/dist/types.js.map +1 -1
  116. package/package.json +9 -8
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/harness/session.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { Context } from \"@earendil-works/chord\";\nimport { BACKGROUND_CONTEXT } from \"@earendil-works/chord/context\";\nimport type {\n Api,\n AssistantMessage,\n AssistantMessageEventStream,\n ImageContent,\n Message,\n Model,\n Models,\n ProviderRequestOptions,\n TextContent,\n Usage,\n} from \"@earendil-works/pi-ai\";\nimport { contentText, createAssistantMessageEventStream } from \"@earendil-works/pi-ai\";\nimport { estimateMessageTokens } from \"@earendil-works/pi-ai/utils/estimate\";\nimport {\n AgentDoc,\n DEFAULT_COMPACTION_POLICY,\n CompactionTask,\n GenerationTask,\n LiveDoc,\n ToolTask,\n defineExtension,\n hook,\n section,\n watchEvents,\n type AgentEvent as DurableEvent,\n type AgentEventStream,\n type Conversation,\n type MessageChange,\n type ToolExecutionApi,\n type UsageState,\n} from \"@earendil-works/pi-durable\";\nimport type { SessionStore } from \"../sessions/session-store.js\";\nimport type { CompactOutcome } from \"../types.js\";\nimport type { AttachedSessionHarness, SessionRunStatus } from \"../sessions/types.js\";\nimport type {\n BudgetSettings,\n CompactionSettings,\n HarnessEvent,\n HarnessEventListener,\n HarnessSettings,\n MikanAgentSessionOptions,\n MikanHarnessTool,\n MikanToolInput,\n MikanToolResult,\n SubagentUsage,\n SubagentUsageSink,\n RetrySettings,\n} from \"./types.js\";\n\nimport * as log from \"../log.js\";\nimport { ToolLoopGuard } from \"./loop-guard.js\";\nimport { adaptAgentTool, isHarnessTool } from \"./tools/pi-tools.js\";\nimport { START_TASK_TOOL, TASK_STATUS_TOOL } from \"./tools/task.js\";\nimport { createCodemodeTool, isCodemodeCallable, withScriptCallNote } from \"./tools/codemode.js\";\nimport { renderMcpServersSection } from \"./mcp.js\";\nimport { createToolSearchTool } from \"./tools/tool-search.js\";\nimport { withSecretRedaction } from \"./tools/secret-redaction.js\";\nimport { errorMessage } from \"../unknown-values.js\";\n\nconst context: Context = BACKGROUND_CONTEXT;\nconst COMPACTION_REQUEST = Symbol(\"compaction-request\");\n\ninterface RunTally {\n usage: SubagentUsage;\n llmCalls: number;\n toolCalls: number;\n toolCallCounts: Record<string, number>;\n startedAt: number;\n endedAt?: number;\n}\n\ninterface RunOptions {\n images?: ImageContent[];\n budget?: BudgetSettings;\n tools?: MikanToolInput[];\n allowTaskHandoff?: boolean;\n allowTaskStatus?: boolean;\n}\n\ninterface Deferred {\n promise: Promise<void>;\n resolve: () => void;\n}\n\nfunction deferred(): Deferred {\n let resolve!: () => void;\n const promise = new Promise<void>((done) => {\n resolve = done;\n });\n return { promise, resolve };\n}\n\nexport class MikanAgentSession {\n readonly sessionStore: SessionStore;\n readonly model: Model<Api>;\n private readonly settings: HarnessSettings;\n private readonly listeners = new Set<HarnessEventListener>();\n private systemPrompt: string;\n private attached: AttachedSessionHarness | undefined;\n private runActive = false;\n private runAborted = false;\n private cancellation: Promise<void> | undefined;\n private cancellationError: unknown;\n private deadlineTimer: ReturnType<typeof setTimeout> | undefined;\n private deadlineNotification: Promise<void> | undefined;\n private runBudget: BudgetSettings = {};\n private budgetExceededReason: string | undefined;\n private retryAttempt = 0;\n private runMessages: AgentMessage[] = [];\n private streamingContent: AssistantMessage[\"content\"] = [];\n private readonly toolArgs = new Map<string, unknown>();\n private loopGuard = new ToolLoopGuard();\n private readonly loopNotices = new Map<string, string>();\n private runStarted = false;\n private runEndSeen = false;\n private observedUsage: Usage = createEmptyUsage();\n private requestRunId: string | undefined;\n private activeRequest: { token: symbol; runId: string } | undefined;\n private runEnded: Deferred = deferred();\n private lastSessionRunStatus: SessionRunStatus | undefined;\n private tally: RunTally = {\n usage: createEmptyUsage(),\n llmCalls: 0,\n toolCalls: 0,\n toolCallCounts: {},\n startedAt: 0,\n };\n\n constructor(private readonly options: MikanAgentSessionOptions) {\n this.sessionStore = options.sessionStore;\n this.model = options.model;\n this.systemPrompt = options.systemPrompt;\n this.settings = resolveHarnessSettings(options.settings);\n }\n\n get lastRunMessages(): readonly AgentMessage[] {\n return this.runMessages;\n }\n\n get isActiveRun(): boolean {\n return this.runActive;\n }\n\n setSystemPrompt(prompt: string): void {\n if (this.runActive) throw new Error(\"Cannot change the system prompt during a run\");\n this.systemPrompt = prompt;\n }\n\n getLastRunStats(): Readonly<{\n usage: SubagentUsage;\n tokens: number;\n costUsd: number;\n llmCalls: number;\n toolCalls: number;\n toolCallCounts: Record<string, number>;\n durationMs: number;\n budgetExceededReason?: string;\n status?: SessionRunStatus;\n }> {\n return {\n usage: copyUsage(this.tally.usage),\n tokens: this.tally.usage.totalTokens,\n costUsd: this.tally.usage.cost.total,\n llmCalls: this.tally.llmCalls,\n toolCalls: this.tally.toolCalls,\n toolCallCounts: { ...this.tally.toolCallCounts },\n durationMs:\n this.tally.startedAt > 0 ? (this.tally.endedAt ?? Date.now()) - this.tally.startedAt : 0,\n budgetExceededReason: this.budgetExceededReason || undefined,\n status: this.lastSessionRunStatus,\n };\n }\n\n captureExternalUsageSink(): SubagentUsageSink {\n const tally = this.tally;\n return async (usage) => {\n addUsage(tally.usage, usage);\n if (this.tally !== tally || !this.runActive || this.budgetExceededReason) return;\n const reason = this.resourceOverBudgetReason();\n if (reason) await this.exceedBudget(reason);\n };\n }\n\n subscribe(listener: HarnessEventListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n async prompt(text: string, options?: RunOptions): Promise<void> {\n await this.run(text, options);\n }\n\n async compact(instructions?: string): Promise<CompactOutcome> {\n if (this.runActive) throw new Error(\"Agent is already processing a prompt\");\n const { harness, conversation } = await this.attach();\n const tokensBefore = await contextTokens(conversation);\n const taskId = await conversation.compact(instructions, context);\n const { outcome } = (await harness.waitForTask(taskId, context)).state;\n if (outcome.status !== \"completed\") {\n throw new Error(\n outcome.status === \"failed\" ? outcome.error.message : `Compaction ${outcome.status}`,\n );\n }\n const submissionId = outcome.result.submissionId;\n if (submissionId === undefined) return { compacted: false };\n const placed = await (await harness.submission(submissionId, context))?.wait(context);\n if (placed?.status !== \"done\") return { compacted: false };\n return { compacted: true, tokensBefore, tokensAfter: await contextTokens(conversation) };\n }\n\n async steer(text: string): Promise<boolean> {\n if (!this.runActive || this.runAborted || !this.attached) return false;\n await this.attached.conversation.submit(\n { type: \"input\", content: text, whenBusy: \"steer\" },\n context,\n );\n return true;\n }\n\n private async run(text: string, options?: RunOptions): Promise<void> {\n if (this.runActive) throw new Error(\"Agent is already processing a prompt\");\n this.runActive = true;\n this.runAborted = false;\n this.budgetExceededReason = undefined;\n this.cancellation = undefined;\n this.cancellationError = undefined;\n this.retryAttempt = 0;\n this.runMessages = [];\n this.runStarted = false;\n this.runEndSeen = false;\n this.runEnded = deferred();\n this.activeRequest = undefined;\n this.requestRunId = undefined;\n this.loopGuard = new ToolLoopGuard();\n this.loopNotices.clear();\n this.runBudget = { ...this.settings.budget, ...options?.budget };\n this.lastSessionRunStatus = undefined;\n this.tally = {\n usage: createEmptyUsage(),\n llmCalls: 0,\n toolCalls: 0,\n toolCallCounts: {},\n startedAt: Date.now(),\n };\n let runFailure: { error: unknown } | undefined;\n let stream: AgentEventStream | undefined;\n let status: SessionRunStatus = \"completed\";\n try {\n if (!(await this.checkCallBudget())) return;\n this.armDeadline();\n const auth = await this.options.models.getAuth(this.model);\n if (this.runAborted) return;\n if (!auth)\n throw new Error(\n `No credentials for provider \"${this.model.provider}\". Set the provider API key environment variable.`,\n );\n const attached = await this.attach();\n if (this.runAborted) return;\n const tools = this.toHarnessTools(options?.tools ?? this.options.tools).filter(\n (tool) =>\n (tool.name !== START_TASK_TOOL || options?.allowTaskHandoff === true) &&\n (tool.name !== TASK_STATUS_TOOL || options?.allowTaskStatus === true),\n );\n await this.installRunTools(attached, tools);\n if (!(await this.checkCallBudget())) return;\n await this.sessionStore.recordRun({ startedAt: Date.now() });\n stream = await watchEvents(attached.harness, attached.conversation.id, context);\n this.observedUsage = sumUsageState(stream.snapshot.usage);\n stream.start((events) => this.handleDurableEvents(events));\n status = await this.drive(attached, text, options?.images);\n } catch (error) {\n runFailure = { error };\n status = \"failed\";\n throw error;\n } finally {\n if (status !== \"failed\" && this.runAborted) status = \"aborted\";\n await this.cleanupRun(runFailure, stream, status);\n }\n }\n\n private async drive(\n { harness, conversation }: AttachedSessionHarness,\n text: string,\n images?: ImageContent[],\n ): Promise<SessionRunStatus> {\n const interrupted = (await harness.snapshot(LiveDoc, conversation.id, context))?.run;\n if (interrupted) {\n log.logWarning(\"Aborting a run interrupted before this process started\");\n await conversation.abort(context);\n }\n const content: string | (TextContent | ImageContent)[] =\n images && images.length > 0 ? [{ type: \"text\", text }, ...images] : text;\n const submission = await conversation.submit(\n { type: \"input\", content, whenBusy: \"reject\" },\n context,\n );\n if (this.runAborted) this.requestCancellation();\n const settled = await submission.wait(context);\n if (this.runStarted) await this.runEnded.promise;\n if (settled.status === \"done\") return \"completed\";\n if (this.runAborted || settled.reason === \"aborted\") return \"aborted\";\n if (settled.reason === \"model_error\") return \"failed\";\n throw new Error(`Pi run failed: ${settled.reason}`);\n }\n\n private async cleanupRun(\n runFailure: { error: unknown } | undefined,\n stream: AgentEventStream | undefined,\n status: SessionRunStatus,\n ): Promise<void> {\n clearTimeout(this.deadlineTimer);\n this.deadlineTimer = undefined;\n let cleanupFailure: { error: unknown } | undefined;\n try {\n await this.cancellation;\n await this.deadlineNotification;\n await stream?.stop();\n if (this.attached) {\n await this.sessionStore.recordRun({ endedAt: Date.now(), status });\n }\n if (this.cancellationError) throw this.cancellationError;\n } catch (error) {\n cleanupFailure = { error };\n } finally {\n this.toolArgs.clear();\n this.loopNotices.clear();\n this.cancellation = undefined;\n this.deadlineNotification = undefined;\n this.tally.endedAt = Date.now();\n this.lastSessionRunStatus = status;\n this.runActive = false;\n }\n if (!cleanupFailure) return;\n if (runFailure) {\n throw new AggregateError(\n [runFailure.error, cleanupFailure.error],\n \"Agent run and cancellation cleanup failed\",\n { cause: runFailure.error },\n );\n }\n throw cleanupFailure.error;\n }\n\n abort(reason = \"cancelled\"): void {\n if (!this.runActive) return;\n const firstAbort = !this.runAborted;\n this.runAborted = true;\n clearTimeout(this.deadlineTimer);\n this.deadlineTimer = undefined;\n if (firstAbort && this.activeRequest !== undefined) {\n log.logInfo(\n `LLM request aborted ${JSON.stringify({ abort_reason: reason, run_id: this.activeRequest.runId })}`,\n );\n }\n this.requestCancellation();\n }\n\n private requestCancellation(): void {\n if (!this.attached || this.cancellation) return;\n this.cancellation = this.attached.conversation.abort(context).catch((error: unknown) => {\n this.cancellationError = error;\n });\n }\n\n private async attach(): Promise<AttachedSessionHarness> {\n if (this.attached) return this.attached;\n const { retry, compaction } = this.settings;\n this.attached = await this.sessionStore.bindHarness({\n models: this.options.models.models,\n requestModels: this.trackedModels(this.options.models.models),\n env: () => this.options.toolContext?.env(),\n settings: { retry, compaction },\n onReport: (error) => log.logWarning(\"Durable harness report\", errorMessage(error)),\n });\n return this.attached;\n }\n\n private trackedModels(models: Models): Models {\n const track = <TOptions extends ProviderRequestOptions>(\n options: TOptions | undefined,\n token: symbol,\n ): TOptions => {\n const onPayload = options?.onPayload;\n const tracked: TOptions = {\n ...options,\n onPayload: async (\n ...args: Parameters<NonNullable<ProviderRequestOptions[\"onPayload\"]>>\n ) => {\n const transformed = await onPayload?.(...args);\n if (this.runActive) {\n this.activeRequest = { token, runId: this.requestRunId ?? \"background\" };\n }\n return transformed;\n },\n } as TOptions;\n return tracked;\n };\n const finish = (token: symbol) => {\n if (this.activeRequest?.token === token) this.activeRequest = undefined;\n };\n const stream = (start: (token: symbol) => AssistantMessageEventStream) => {\n const token = Symbol(\"provider-request\");\n const result = start(token);\n void result.result().then(\n () => finish(token),\n () => finish(token),\n );\n return result;\n };\n return new Proxy(models, {\n get: (target, property) => {\n if (property === \"streamSimple\") {\n return (...[model, request, options]: Parameters<Models[\"streamSimple\"]>) => {\n const over = this.runActive ? this.callOverBudgetReason() : undefined;\n if (over || this.runAborted) return abortedStream(model, over ?? \"Operation aborted\");\n if (this.runActive) this.tally.llmCalls += 1;\n return stream((token) => target.streamSimple(model, request, track(options, token)));\n };\n }\n const value = Reflect.get(target, property, target) as unknown;\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n }\n\n private toHarnessTools(tools: MikanToolInput[]): MikanHarnessTool[] {\n return tools.map((tool) => (isHarnessTool(tool) ? tool : adaptAgentTool(tool)));\n }\n\n private async installRunTools(\n attached: AttachedSessionHarness,\n selected: MikanHarnessTool[],\n ): Promise<void> {\n const tools = [...selected];\n const deferredTools = tools.filter((tool) => tool.exposure === \"deferred\");\n const servers = this.sessionStore.mcpServers();\n const authorized = new Set(deferredTools.map((tool) => tool.name));\n const { harness, conversation, registry, extensionName } = attached;\n const stored = (await harness.snapshot(AgentDoc, conversation.id, context))?.tools;\n const loaded = new Set(\n Array.isArray(stored) ? stored.filter((name) => authorized.has(name)) : [],\n );\n if (tools.length > 0)\n tools.push(\n withSecretRedaction(\n createCodemodeTool({\n tools,\n servers,\n executeNested: (tool, call) => this.executeNestedTool(tool, call),\n }),\n ),\n );\n if (deferredTools.length > 0) {\n tools.push(\n withSecretRedaction(\n createToolSearchTool({\n tools: deferredTools,\n loaded,\n load: async (names) => {\n for (const name of names) if (authorized.has(name)) loaded.add(name);\n },\n }),\n ),\n );\n }\n const hasCodemode = tools.some((tool) => tool.name === \"codemode\");\n const registered = tools.map((tool) =>\n hasCodemode && tool.exposure === undefined && isCodemodeCallable(tool)\n ? withScriptCallNote(tool)\n : tool,\n );\n registry.install(\n defineExtension({\n name: extensionName,\n tools: registered,\n sections: [\n section(\"mikan\", () => this.systemPrompt, { tag: false }),\n section(\"mcp_servers\", () => renderMcpServersSection(servers) || undefined),\n ],\n hooks: [\n hook(GenerationTask, {\n beforeRequest: (_request, api) => this.beforeRequest(String(api.taskId)),\n }),\n hook(CompactionTask, {\n beforeCompact: (_compaction, api) => this.beforeCompact(String(api.taskId)),\n }),\n hook(ToolTask, {\n beforeTool: async (call, api) => this.beforeTool(call, api),\n afterTool: (call, result) => this.afterTool(call.id, result),\n }),\n ],\n }),\n );\n await conversation.configure(\n {\n model: { provider: this.model.provider, modelId: this.model.id },\n thinkingLevel: this.options.thinkingLevel,\n extensions: [registry.snapshot().extension(extensionName)!],\n tools: registered.filter((tool) => tool.exposure === undefined || loaded.has(tool.name)),\n },\n context,\n );\n }\n\n private beforeCompact(taskId: string): { decline: true } | undefined {\n if (!this.runActive) return undefined;\n if (this.runAborted || this.budgetExceededReason || this.callOverBudgetReason()) {\n return { decline: true };\n }\n this.tally.llmCalls += 1;\n this.activeRequest = { token: COMPACTION_REQUEST, runId: taskId };\n return undefined;\n }\n\n private async beforeRequest(runId: string): Promise<undefined> {\n if (!(await this.checkCallBudget())) return undefined;\n this.requestRunId = runId;\n return undefined;\n }\n\n private async beforeTool(\n call: { id: string; name: string; arguments: Record<string, unknown> },\n api: {\n snapshot: ToolExecutionApi[\"snapshot\"];\n conversationId: ToolExecutionApi[\"conversationId\"];\n },\n ): Promise<{ block?: string } | undefined> {\n const round = (await api.snapshot(LiveDoc, api.conversationId, context))?.tools ?? [];\n if (round.length > 1 && round.some((slot) => slot.name === START_TASK_TOOL)) {\n return { block: `Call ${START_TASK_TOOL} alone, without other tools in the same batch.` };\n }\n return this.checkToolLoop(call.id, call.name, call.arguments);\n }\n\n private afterTool<T extends { content?: (TextContent | ImageContent)[] }>(\n callId: string,\n result: T,\n ): T | undefined {\n const notice = this.loopNotices.get(callId);\n if (notice === undefined) return undefined;\n this.loopNotices.delete(callId);\n return { ...result, content: [...(result.content ?? []), { type: \"text\", text: notice }] };\n }\n\n private async executeNestedTool(\n tool: MikanHarnessTool,\n call: Parameters<MikanHarnessTool[\"execute\"]>,\n ): Promise<MikanToolResult> {\n const [args, api, toolContext] = call;\n const id = api.callId;\n if (this.runAborted || toolContext.abortSignal?.aborted) throw new Error(\"Operation aborted\");\n await this.emitToolStart(id, tool.name, args);\n let result: MikanToolResult;\n try {\n const verdict = await this.checkToolLoop(id, tool.name, args as Record<string, unknown>);\n if (verdict?.block) throw new Error(verdict.block);\n toolContext.abortSignal?.throwIfAborted();\n result = await tool.execute(args, api, toolContext);\n result = this.afterTool(id, result) ?? result;\n } catch (error) {\n result = { content: [{ type: \"text\", text: errorMessage(error) }], isError: true };\n } finally {\n this.loopNotices.delete(id);\n }\n await this.emitToolEnd(\n id,\n tool.name,\n { content: result.content ?? [], details: result.details },\n result.isError === true,\n );\n return result;\n }\n\n private async checkToolLoop(\n toolCallId: string,\n toolName: string,\n args: Record<string, unknown>,\n ): Promise<{ block: string } | undefined> {\n const verdict = this.loopGuard.observe(toolName, args);\n switch (verdict.kind) {\n case \"allow\":\n return undefined;\n case \"notice\":\n this.loopNotices.set(toolCallId, verdict.text);\n return undefined;\n case \"block\":\n return { block: verdict.reason };\n case \"stop\":\n await this.exceedBudget(verdict.reason);\n return { block: verdict.reason };\n default:\n return verdict satisfies never;\n }\n }\n\n private async emit(event: HarnessEvent): Promise<void> {\n for (const listener of this.listeners) {\n try {\n await listener(event);\n } catch (error) {\n log.logWarning(\"Harness event listener failed\", errorMessage(error));\n }\n }\n }\n\n private async handleDurableEvents(events: readonly DurableEvent[]): Promise<void> {\n for (const event of events) {\n try {\n await this.handleDurableEvent(event);\n } catch (error) {\n log.logWarning(\"Durable event handling failed\", errorMessage(error));\n }\n }\n if (this.runEndSeen) this.runEnded.resolve();\n }\n\n private async handleDurableEvent(event: DurableEvent): Promise<void> {\n switch (event.type) {\n case \"run_start\":\n this.runStarted = true;\n return;\n case \"run_end\":\n await this.endRetry(this.runAborted ? \"Retry cancelled\" : undefined);\n this.runEndSeen = true;\n return;\n case \"snapshot\":\n return this.streamContent(event.generation?.message?.content ?? []);\n case \"message_start\":\n if (event.message.role === \"system\") return;\n this.streamingContent = [];\n await this.emit({ type: \"message_start\", message: event.message });\n if (event.message.role === \"assistant\") await this.streamContent(event.message.content);\n return;\n case \"message_update\":\n return this.streamContent(applyMessageChanges(this.streamingContent, event.changes));\n case \"message_end\":\n return this.endMessage(event.entry.model?.[0]);\n case \"tool_execution_start\":\n return this.emitToolStart(event.toolCallId, event.toolName, event.args);\n case \"tool_execution_update\":\n if (event.details === undefined) return;\n await this.emit({\n type: \"tool_execution_update\",\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n details: event.details,\n });\n return;\n case \"tool_execution_end\": {\n const message = event.entry?.model?.[0];\n const toolResult = message?.role === \"toolResult\" ? message : undefined;\n await this.emitToolEnd(\n event.toolCallId,\n event.toolName,\n { content: toolResult?.content ?? [], details: toolResult?.details },\n toolResult?.isError ?? true,\n );\n return;\n }\n case \"auto_retry_start\":\n this.retryAttempt = event.attempt;\n await this.emit({\n type: \"auto_retry_start\",\n attempt: event.attempt,\n maxAttempts: this.settings.retry.maxRetries,\n delayMs: Math.max(0, event.at - Date.now()),\n errorMessage: event.errorMessage,\n });\n return;\n case \"auto_retry_end\":\n this.retryAttempt = 0;\n await this.emit({\n type: \"auto_retry_end\",\n attempt: event.attempt,\n success: !this.runAborted,\n finalError: this.runAborted ? \"Retry cancelled\" : undefined,\n });\n return;\n case \"compaction_start\":\n await this.emit({ type: \"compaction_start\", reason: event.reason });\n return;\n case \"compaction_end\": {\n if (this.activeRequest?.token === COMPACTION_REQUEST) this.activeRequest = undefined;\n const outcome = await this.compactionOutcome(event.taskId);\n await this.emit({\n type: \"compaction_end\",\n reason: event.reason,\n aborted: outcome?.status === \"aborted\",\n errorMessage: outcome?.status === \"failed\" ? outcome.error.message : undefined,\n });\n return;\n }\n case \"usage_changed\":\n return this.recordUsage(event.usage);\n case \"task_failed\":\n log.logWarning(`Durable task ${event.kind} failed`, event.message);\n return;\n default:\n return;\n }\n }\n\n private async streamContent(content: AssistantMessage[\"content\"]): Promise<void> {\n const before = contentText(this.streamingContent);\n this.streamingContent = content;\n const after = contentText(content);\n if (after.length > before.length && after.startsWith(before)) {\n await this.emit({ type: \"text_delta\", delta: after.slice(before.length) });\n }\n }\n\n private async compactionOutcome(\n taskId: Parameters<AttachedSessionHarness[\"harness\"][\"getTask\"]>[0],\n ) {\n const task = await this.attached?.harness.getTask(taskId, context);\n return task?.state.outcome;\n }\n\n private async recordUsage(state: UsageState): Promise<void> {\n const total = sumUsageState(state);\n addUsage(this.tally.usage, subtractUsage(total, this.observedUsage));\n this.observedUsage = total;\n const reason = this.resourceOverBudgetReason();\n if (reason) await this.exceedBudget(reason);\n }\n\n private async endRetry(finalError: string | undefined): Promise<void> {\n if (this.retryAttempt === 0) return;\n await this.emit({\n type: \"auto_retry_end\",\n attempt: this.retryAttempt,\n success: false,\n finalError,\n });\n this.retryAttempt = 0;\n }\n\n private async endMessage(message: Message | undefined): Promise<void> {\n if (!message || message.role === \"system\") return;\n if (message.role === \"assistant\") await this.streamContent(message.content);\n this.runMessages.push(message);\n await this.emit({ type: \"message_end\", message });\n if (message.role !== \"assistant\") return;\n const needsCall =\n message.stopReason === \"error\" || message.content.some((part) => part.type === \"toolCall\");\n const reason = (needsCall && this.callOverBudgetReason()) || this.resourceOverBudgetReason();\n if (reason) await this.exceedBudget(reason);\n }\n\n private async emitToolStart(toolCallId: string, toolName: string, args: unknown): Promise<void> {\n this.toolArgs.set(toolCallId, args);\n this.tally.toolCalls += 1;\n this.tally.toolCallCounts[toolName] = (this.tally.toolCallCounts[toolName] ?? 0) + 1;\n await this.emit({ type: \"tool_execution_start\", toolCallId, toolName, args });\n }\n\n private async emitToolEnd(\n toolCallId: string,\n toolName: string,\n result: Extract<HarnessEvent, { type: \"tool_execution_end\" }>[\"result\"],\n isError: boolean,\n ): Promise<void> {\n this.toolArgs.delete(toolCallId);\n await this.emit({ type: \"tool_execution_end\", toolCallId, toolName, result, isError });\n }\n\n private async exceedBudget(reason: string): Promise<void> {\n if (this.budgetExceededReason) return;\n this.budgetExceededReason = reason;\n this.abort(reason);\n await this.emit({\n type: \"budget_exceeded\",\n reason,\n tokens: this.tally.usage.totalTokens,\n costUsd: this.tally.usage.cost.total,\n llmCalls: this.tally.llmCalls,\n durationMs: Date.now() - this.tally.startedAt,\n });\n log.logWarning(\"Run budget exceeded — aborting\", reason);\n }\n\n private async checkCallBudget(): Promise<boolean> {\n if (this.runAborted || this.budgetExceededReason) {\n this.requestCancellation();\n return false;\n }\n const reason = this.callOverBudgetReason() ?? this.resourceOverBudgetReason();\n if (reason) await this.exceedBudget(reason);\n return !this.runAborted && !this.budgetExceededReason;\n }\n\n private callOverBudgetReason(): string | undefined {\n const limit = this.runBudget.maxLlmCalls;\n if (limit !== undefined && this.tally.llmCalls >= limit)\n return `${this.tally.llmCalls} LLM calls >= ${limit} limit`;\n return undefined;\n }\n\n private resourceOverBudgetReason(): string | undefined {\n const { maxTokens, maxCostUsd, maxDurationMs } = this.runBudget;\n if (maxTokens !== undefined && this.tally.usage.totalTokens >= maxTokens)\n return `${this.tally.usage.totalTokens} tokens >= ${maxTokens} limit`;\n if (maxCostUsd !== undefined && this.tally.usage.cost.total >= maxCostUsd)\n return `cost ${this.tally.usage.cost.total.toFixed(2)} USD >= ${maxCostUsd} USD limit`;\n if (maxDurationMs !== undefined && Date.now() - this.tally.startedAt >= maxDurationMs)\n return `${Date.now() - this.tally.startedAt}ms >= ${maxDurationMs}ms limit`;\n return undefined;\n }\n\n private armDeadline(): void {\n const maxDurationMs = this.runBudget.maxDurationMs;\n if (maxDurationMs === undefined || !Number.isFinite(maxDurationMs) || this.runAborted) return;\n const remaining = maxDurationMs - (Date.now() - this.tally.startedAt);\n this.deadlineTimer = setTimeout(\n () => {\n if (Date.now() - this.tally.startedAt < maxDurationMs) {\n this.armDeadline();\n return;\n }\n this.deadlineNotification = this.exceedBudget(\n `${Date.now() - this.tally.startedAt}ms >= ${maxDurationMs}ms limit`,\n );\n },\n Math.min(Math.max(0, remaining), 2_147_483_647),\n );\n }\n}\n\nfunction abortedAssistant(model: Model<Api>, reason: string): AssistantMessage {\n return {\n role: \"assistant\",\n content: [],\n api: model.api,\n provider: model.provider,\n model: model.id,\n usage: createEmptyUsage(),\n stopReason: \"aborted\",\n errorMessage: reason,\n timestamp: Date.now(),\n };\n}\n\nfunction abortedStream(model: Model<Api>, reason: string): AssistantMessageEventStream {\n const stream = createAssistantMessageEventStream();\n const error = abortedAssistant(model, reason);\n stream.push({ type: \"error\", reason: \"aborted\", error });\n stream.end(error);\n return stream;\n}\n\nconst DEFAULT_RETRY_SETTINGS: RetrySettings = {\n enabled: true,\n maxRetries: 3,\n baseDelayMs: 2000,\n};\n\nconst DEFAULT_BUDGET_SETTINGS: BudgetSettings = {};\n\nexport const DEFAULT_EVENT_BUDGET: BudgetSettings = {\n maxDurationMs: 10 * 60 * 1000,\n maxLlmCalls: 50,\n maxCostUsd: 10,\n};\n\nfunction resolveHarnessSettings(overrides?: {\n compaction?: Partial<CompactionSettings>;\n retry?: Partial<RetrySettings>;\n budget?: Partial<BudgetSettings>;\n}): HarnessSettings {\n return {\n compaction: { ...DEFAULT_COMPACTION_POLICY, ...overrides?.compaction },\n retry: { ...DEFAULT_RETRY_SETTINGS, ...overrides?.retry },\n budget: { ...DEFAULT_BUDGET_SETTINGS, ...overrides?.budget },\n };\n}\n\nasync function contextTokens(conversation: Conversation): Promise<number> {\n const { messages } = await conversation.context(context);\n return messages.reduce((total, message) => total + estimateMessageTokens(message), 0);\n}\n\nexport function createEmptyUsage(): Usage {\n return {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n };\n}\n\nexport function addUsage(total: Usage, usage: Usage): void {\n total.input += usage.input;\n total.output += usage.output;\n total.cacheRead += usage.cacheRead;\n total.cacheWrite += usage.cacheWrite;\n total.totalTokens += usage.input + usage.output + usage.cacheRead + usage.cacheWrite;\n total.cost.input += usage.cost.input;\n total.cost.output += usage.cost.output;\n total.cost.cacheRead += usage.cost.cacheRead;\n total.cost.cacheWrite += usage.cost.cacheWrite;\n total.cost.total += usage.cost.total;\n\n if (usage.cacheWrite1h !== undefined) {\n total.cacheWrite1h = (total.cacheWrite1h ?? 0) + usage.cacheWrite1h;\n }\n if (usage.reasoning !== undefined) {\n total.reasoning = (total.reasoning ?? 0) + usage.reasoning;\n }\n}\n\nexport function sumUsageState(state: UsageState): Usage {\n const total = createEmptyUsage();\n for (const usage of [...Object.values(state.models), ...Object.values(state.tools)]) {\n addUsage(total, usage);\n }\n return total;\n}\n\nfunction subtractUsage(total: Usage, base: Usage): Usage {\n return {\n input: total.input - base.input,\n output: total.output - base.output,\n cacheRead: total.cacheRead - base.cacheRead,\n cacheWrite: total.cacheWrite - base.cacheWrite,\n totalTokens: total.totalTokens - base.totalTokens,\n cost: {\n input: total.cost.input - base.cost.input,\n output: total.cost.output - base.cost.output,\n cacheRead: total.cost.cacheRead - base.cost.cacheRead,\n cacheWrite: total.cost.cacheWrite - base.cost.cacheWrite,\n total: total.cost.total - base.cost.total,\n },\n reasoning: total.reasoning === undefined ? undefined : total.reasoning - (base.reasoning ?? 0),\n };\n}\n\nexport function copyUsage(usage: Usage): Usage {\n return { ...usage, cost: { ...usage.cost } };\n}\n\nfunction applyMessageChanges(\n content: AssistantMessage[\"content\"],\n changes: readonly MessageChange[],\n): AssistantMessage[\"content\"] {\n const next = [...content];\n for (const change of changes) {\n switch (change.type) {\n case \"message\":\n next.splice(0, next.length, ...change.message.content);\n break;\n case \"text_start\":\n case \"thinking_start\":\n case \"toolcall_start\":\n case \"block\":\n next[change.contentIndex] = change.block;\n break;\n case \"text_delta\": {\n const block = next[change.contentIndex];\n next[change.contentIndex] =\n block?.type === \"text\"\n ? { ...block, text: `${block.text}${change.delta}` }\n : { type: \"text\", text: change.delta };\n break;\n }\n case \"thinking_delta\":\n case \"toolcall_delta\":\n break;\n default:\n change satisfies never;\n }\n }\n return next;\n}\n"]}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/harness/session.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { Context } from \"@earendil-works/chord\";\nimport { BACKGROUND_CONTEXT } from \"@earendil-works/chord/context\";\nimport type {\n Api,\n AssistantMessage,\n AssistantMessageEventStream,\n ImageContent,\n Message,\n Model,\n Models,\n ProviderRequestOptions,\n TextContent,\n Usage,\n} from \"@earendil-works/pi-ai\";\nimport { contentText, createAssistantMessageEventStream } from \"@earendil-works/pi-ai\";\nimport { estimateMessageTokens } from \"@earendil-works/pi-ai/utils/estimate\";\nimport {\n AgentDoc,\n DEFAULT_COMPACTION_POLICY,\n CompactionTask,\n GenerationTask,\n LiveDoc,\n ToolTask,\n defineExtension,\n hook,\n section,\n watchEvents,\n type AgentEvent as DurableEvent,\n type AgentEventStream,\n type Conversation,\n type MessageChange,\n type ToolExecutionApi,\n type ToolRegistration,\n type UsageState,\n} from \"@earendil-works/pi-durable\";\nimport type { SessionStore } from \"../sessions/session-store.js\";\nimport type { CompactOutcome } from \"../types.js\";\nimport type { AttachedSessionHarness, SessionRunStatus } from \"../sessions/types.js\";\nimport type {\n BudgetSettings,\n CompactionSettings,\n HarnessEvent,\n HarnessEventListener,\n HarnessSettings,\n MikanAgentSessionOptions,\n MikanHarnessTool,\n MikanToolInput,\n MikanToolResult,\n SubagentUsage,\n SubagentUsageSink,\n RetrySettings,\n} from \"./types.js\";\n\nimport * as log from \"../log.js\";\nimport { ToolLoopGuard } from \"./loop-guard.js\";\nimport { adaptAgentTool, isHarnessTool } from \"./tools/pi-tools.js\";\nimport { START_TASK_TOOL, TASK_STATUS_TOOL } from \"./tools/task.js\";\nimport { createCodemodeTool, isCodemodeCallable, withScriptCallNote } from \"./tools/codemode.js\";\nimport { renderMcpServersSection } from \"./mcp.js\";\nimport { createToolSearchTool } from \"./tools/tool-search.js\";\nimport { withSecretRedaction } from \"./tools/secret-redaction.js\";\nimport { errorMessage } from \"../unknown-values.js\";\n\nconst context: Context = BACKGROUND_CONTEXT;\nconst COMPACTION_REQUEST = Symbol(\"compaction-request\");\n\ninterface RunTally {\n usage: SubagentUsage;\n llmCalls: number;\n toolCalls: number;\n toolCallCounts: Record<string, number>;\n startedAt: number;\n endedAt?: number;\n}\n\ninterface RunOptions {\n images?: ImageContent[];\n budget?: BudgetSettings;\n tools?: MikanToolInput[];\n allowTaskHandoff?: boolean;\n allowTaskStatus?: boolean;\n}\n\ninterface Deferred {\n promise: Promise<void>;\n resolve: () => void;\n}\n\nfunction deferred(): Deferred {\n let resolve!: () => void;\n const promise = new Promise<void>((done) => {\n resolve = done;\n });\n return { promise, resolve };\n}\n\nexport class MikanAgentSession {\n readonly sessionStore: SessionStore;\n readonly model: Model<Api>;\n private readonly settings: HarnessSettings;\n private readonly listeners = new Set<HarnessEventListener>();\n private systemPrompt: string;\n private attached: AttachedSessionHarness | undefined;\n private runActive = false;\n private runAborted = false;\n private cancellation: Promise<void> | undefined;\n private cancellationError: unknown;\n private deadlineTimer: ReturnType<typeof setTimeout> | undefined;\n private deadlineNotification: Promise<void> | undefined;\n private runBudget: BudgetSettings = {};\n private budgetExceededReason: string | undefined;\n private retryAttempt = 0;\n private runMessages: AgentMessage[] = [];\n private streamingContent: AssistantMessage[\"content\"] = [];\n private readonly toolArgs = new Map<string, unknown>();\n private loopGuard = new ToolLoopGuard();\n private readonly loopNotices = new Map<string, string>();\n private runStarted = false;\n private runEndSeen = false;\n private observedUsage: Usage = createEmptyUsage();\n private requestRunId: string | undefined;\n private activeRequest: { token: symbol; runId: string } | undefined;\n private runEnded: Deferred = deferred();\n private lastSessionRunStatus: SessionRunStatus | undefined;\n private tally: RunTally = {\n usage: createEmptyUsage(),\n llmCalls: 0,\n toolCalls: 0,\n toolCallCounts: {},\n startedAt: 0,\n };\n\n constructor(private readonly options: MikanAgentSessionOptions) {\n this.sessionStore = options.sessionStore;\n this.model = options.model;\n this.systemPrompt = options.systemPrompt;\n this.settings = resolveHarnessSettings(options.settings);\n }\n\n get lastRunMessages(): readonly AgentMessage[] {\n return this.runMessages;\n }\n\n get isActiveRun(): boolean {\n return this.runActive;\n }\n\n setSystemPrompt(prompt: string): void {\n if (this.runActive) throw new Error(\"Cannot change the system prompt during a run\");\n this.systemPrompt = prompt;\n }\n\n getLastRunStats(): Readonly<{\n usage: SubagentUsage;\n tokens: number;\n costUsd: number;\n llmCalls: number;\n toolCalls: number;\n toolCallCounts: Record<string, number>;\n durationMs: number;\n budgetExceededReason?: string;\n status?: SessionRunStatus;\n }> {\n return {\n usage: copyUsage(this.tally.usage),\n tokens: this.tally.usage.totalTokens,\n costUsd: this.tally.usage.cost.total,\n llmCalls: this.tally.llmCalls,\n toolCalls: this.tally.toolCalls,\n toolCallCounts: { ...this.tally.toolCallCounts },\n durationMs:\n this.tally.startedAt > 0 ? (this.tally.endedAt ?? Date.now()) - this.tally.startedAt : 0,\n budgetExceededReason: this.budgetExceededReason || undefined,\n status: this.lastSessionRunStatus,\n };\n }\n\n captureExternalUsageSink(): SubagentUsageSink {\n const tally = this.tally;\n return async (usage) => {\n addUsage(tally.usage, usage);\n if (this.tally !== tally || !this.runActive || this.budgetExceededReason) return;\n const reason = this.resourceOverBudgetReason();\n if (reason) await this.exceedBudget(reason);\n };\n }\n\n subscribe(listener: HarnessEventListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n async prompt(text: string, options?: RunOptions): Promise<void> {\n await this.run(text, options);\n }\n\n async compact(instructions?: string): Promise<CompactOutcome> {\n if (this.runActive) throw new Error(\"Agent is already processing a prompt\");\n const { harness, conversation } = await this.attach();\n const tokensBefore = await contextTokens(conversation);\n const taskId = await conversation.compact(instructions, context);\n const { outcome } = (await harness.waitForTask(taskId, context)).state;\n if (outcome.status !== \"completed\") {\n throw new Error(\n outcome.status === \"failed\" ? outcome.error.message : `Compaction ${outcome.status}`,\n );\n }\n const submissionId = outcome.result.submissionId;\n if (submissionId === undefined) return { compacted: false };\n const placed = await (await harness.submission(submissionId, context))?.wait(context);\n if (placed?.status !== \"done\") return { compacted: false };\n return { compacted: true, tokensBefore, tokensAfter: await contextTokens(conversation) };\n }\n\n async steer(text: string): Promise<boolean> {\n if (!this.runActive || this.runAborted || !this.attached) return false;\n await this.attached.conversation.submit(\n { type: \"input\", content: text, whenBusy: \"steer\" },\n context,\n );\n return true;\n }\n\n private async run(text: string, options?: RunOptions): Promise<void> {\n if (this.runActive) throw new Error(\"Agent is already processing a prompt\");\n this.runActive = true;\n this.runAborted = false;\n this.budgetExceededReason = undefined;\n this.cancellation = undefined;\n this.cancellationError = undefined;\n this.retryAttempt = 0;\n this.runMessages = [];\n this.runStarted = false;\n this.runEndSeen = false;\n this.runEnded = deferred();\n this.activeRequest = undefined;\n this.requestRunId = undefined;\n this.loopGuard = new ToolLoopGuard();\n this.loopNotices.clear();\n this.runBudget = { ...this.settings.budget, ...options?.budget };\n this.lastSessionRunStatus = undefined;\n this.tally = {\n usage: createEmptyUsage(),\n llmCalls: 0,\n toolCalls: 0,\n toolCallCounts: {},\n startedAt: Date.now(),\n };\n let runFailure: { error: unknown } | undefined;\n let stream: AgentEventStream | undefined;\n let status: SessionRunStatus = \"completed\";\n try {\n if (!(await this.checkCallBudget())) return;\n this.armDeadline();\n const auth = await this.options.models.getAuth(this.model);\n if (this.runAborted) return;\n if (!auth)\n throw new Error(\n `No credentials for provider \"${this.model.provider}\". Set the provider API key environment variable.`,\n );\n const attached = await this.attach();\n if (this.runAborted) return;\n const tools = this.toHarnessTools(options?.tools ?? this.options.tools).filter(\n (tool) =>\n (tool.name !== START_TASK_TOOL || options?.allowTaskHandoff === true) &&\n (tool.name !== TASK_STATUS_TOOL || options?.allowTaskStatus === true),\n );\n await this.installRunTools(attached, tools);\n if (!(await this.checkCallBudget())) return;\n await this.sessionStore.recordRun({ startedAt: Date.now() });\n stream = await watchEvents(attached.harness, attached.conversation.id, context);\n this.observedUsage = sumUsageState(stream.snapshot.usage);\n stream.start((events) => this.handleDurableEvents(events));\n status = await this.drive(attached, text, options?.images);\n } catch (error) {\n runFailure = { error };\n status = \"failed\";\n throw error;\n } finally {\n if (status !== \"failed\" && this.runAborted) status = \"aborted\";\n await this.cleanupRun(runFailure, stream, status);\n }\n }\n\n private async drive(\n { harness, conversation }: AttachedSessionHarness,\n text: string,\n images?: ImageContent[],\n ): Promise<SessionRunStatus> {\n const interrupted = (await harness.snapshot(LiveDoc, conversation.id, context))?.run;\n if (interrupted) {\n log.logWarning(\"Aborting a run interrupted before this process started\");\n await conversation.abort(context);\n }\n const content: string | (TextContent | ImageContent)[] =\n images && images.length > 0 ? [{ type: \"text\", text }, ...images] : text;\n const submission = await conversation.submit(\n { type: \"input\", content, whenBusy: \"reject\" },\n context,\n );\n if (this.runAborted) this.requestCancellation();\n const settled = await submission.wait(context);\n if (this.runStarted) await this.runEnded.promise;\n if (settled.status === \"done\") return \"completed\";\n if (this.runAborted || settled.reason === \"aborted\") return \"aborted\";\n if (settled.reason === \"model_error\") return \"failed\";\n throw new Error(`Pi run failed: ${settled.reason}`);\n }\n\n private async cleanupRun(\n runFailure: { error: unknown } | undefined,\n stream: AgentEventStream | undefined,\n status: SessionRunStatus,\n ): Promise<void> {\n clearTimeout(this.deadlineTimer);\n this.deadlineTimer = undefined;\n let cleanupFailure: { error: unknown } | undefined;\n try {\n await this.cancellation;\n await this.deadlineNotification;\n await stream?.stop();\n if (this.attached) {\n await this.sessionStore.recordRun({ endedAt: Date.now(), status });\n }\n if (this.cancellationError) throw this.cancellationError;\n } catch (error) {\n cleanupFailure = { error };\n } finally {\n this.toolArgs.clear();\n this.loopNotices.clear();\n this.cancellation = undefined;\n this.deadlineNotification = undefined;\n this.tally.endedAt = Date.now();\n this.lastSessionRunStatus = status;\n this.runActive = false;\n }\n if (!cleanupFailure) return;\n if (runFailure) {\n throw new AggregateError(\n [runFailure.error, cleanupFailure.error],\n \"Agent run and cancellation cleanup failed\",\n { cause: runFailure.error },\n );\n }\n throw cleanupFailure.error;\n }\n\n abort(reason = \"cancelled\"): void {\n if (!this.runActive) return;\n const firstAbort = !this.runAborted;\n this.runAborted = true;\n clearTimeout(this.deadlineTimer);\n this.deadlineTimer = undefined;\n if (firstAbort && this.activeRequest !== undefined) {\n log.logInfo(\n `LLM request aborted ${JSON.stringify({ abort_reason: reason, run_id: this.activeRequest.runId })}`,\n );\n }\n this.requestCancellation();\n }\n\n private requestCancellation(): void {\n if (!this.attached || this.cancellation) return;\n this.cancellation = this.attached.conversation.abort(context).catch((error: unknown) => {\n this.cancellationError = error;\n });\n }\n\n private async attach(): Promise<AttachedSessionHarness> {\n if (this.attached) return this.attached;\n const { retry, compaction } = this.settings;\n this.attached = await this.sessionStore.bindHarness({\n models: this.options.models.models,\n requestModels: this.trackedModels(this.options.models.models),\n env: () => this.options.toolContext?.env(),\n settings: { retry, compaction },\n onReport: (error) => log.logWarning(\"Durable harness report\", errorMessage(error)),\n });\n return this.attached;\n }\n\n private trackedModels(models: Models): Models {\n const track = <TOptions extends ProviderRequestOptions>(\n options: TOptions | undefined,\n token: symbol,\n ): TOptions => {\n const onPayload = options?.onPayload;\n const tracked: TOptions = {\n ...options,\n onPayload: async (\n ...args: Parameters<NonNullable<ProviderRequestOptions[\"onPayload\"]>>\n ) => {\n const transformed = await onPayload?.(...args);\n if (this.runActive) {\n this.activeRequest = { token, runId: this.requestRunId ?? \"background\" };\n }\n return transformed;\n },\n } as TOptions;\n return tracked;\n };\n const finish = (token: symbol) => {\n if (this.activeRequest?.token === token) this.activeRequest = undefined;\n };\n const stream = (start: (token: symbol) => AssistantMessageEventStream) => {\n const token = Symbol(\"provider-request\");\n const result = start(token);\n void result.result().then(\n () => finish(token),\n () => finish(token),\n );\n return result;\n };\n return new Proxy(models, {\n get: (target, property) => {\n if (property === \"streamSimple\") {\n return (...[model, request, options]: Parameters<Models[\"streamSimple\"]>) => {\n const over = this.runActive ? this.callOverBudgetReason() : undefined;\n if (over || this.runAborted) return abortedStream(model, over ?? \"Operation aborted\");\n if (this.runActive) this.tally.llmCalls += 1;\n return stream((token) => target.streamSimple(model, request, track(options, token)));\n };\n }\n const value = Reflect.get(target, property, target) as unknown;\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n }\n\n private toHarnessTools(tools: MikanToolInput[]): MikanHarnessTool[] {\n return tools.map((tool) => (isHarnessTool(tool) ? tool : adaptAgentTool(tool)));\n }\n\n private async installRunTools(\n attached: AttachedSessionHarness,\n selected: MikanHarnessTool[],\n ): Promise<void> {\n const tools = [...selected];\n const deferredTools = tools.filter((tool) => tool.exposure === \"deferred\");\n const servers = this.sessionStore.mcpServers();\n const authorized = new Set(deferredTools.map((tool) => tool.name));\n const { harness, conversation, registry, extensionName } = attached;\n const stored = (await harness.snapshot(AgentDoc, conversation.id, context))?.tools;\n const loaded = new Set(\n Array.isArray(stored) ? stored.filter((name) => authorized.has(name)) : [],\n );\n if (tools.length > 0)\n tools.push(\n withSecretRedaction(\n createCodemodeTool({\n tools,\n servers,\n executeNested: (tool, call) => this.executeNestedTool(tool, call),\n }),\n ),\n );\n if (deferredTools.length > 0) {\n tools.push(\n withSecretRedaction(\n createToolSearchTool({\n tools: deferredTools,\n loaded,\n load: async (names) => {\n for (const name of names) if (authorized.has(name)) loaded.add(name);\n },\n }),\n ),\n );\n }\n const hasCodemode = tools.some((tool) => tool.name === \"codemode\");\n const registered = tools.map((tool) =>\n toPiTool(\n hasCodemode && tool.exposure === undefined && isCodemodeCallable(tool)\n ? withScriptCallNote(tool)\n : tool,\n ),\n );\n registry.install(\n defineExtension({\n name: extensionName,\n tools: registered,\n sections: [\n section(\"mikan\", () => this.systemPrompt, { tag: false }),\n section(\"mcp_servers\", () => renderMcpServersSection(servers) || undefined),\n ],\n hooks: [\n hook(GenerationTask, {\n beforeRequest: (_request, api) => this.beforeRequest(String(api.taskId)),\n }),\n hook(CompactionTask, {\n beforeCompact: (_compaction, api) => this.beforeCompact(String(api.taskId)),\n }),\n hook(ToolTask, {\n beforeTool: async (call, api) => this.beforeTool(call, api),\n afterTool: (call, result) => {\n const notice = this.takeLoopNotice(call.id);\n return notice === undefined\n ? undefined\n : { ...result, output: withNotice(result.output, notice) };\n },\n }),\n ],\n }),\n );\n await conversation.configure(\n {\n model: { provider: this.model.provider, modelId: this.model.id },\n thinkingLevel: this.options.thinkingLevel,\n extensions: [registry.snapshot().extension(extensionName)!],\n tools: registered.filter((_, index) => {\n const tool = tools[index]!;\n return tool.exposure === undefined || loaded.has(tool.name);\n }),\n },\n context,\n );\n }\n\n private beforeCompact(taskId: string): { decline: true } | undefined {\n if (!this.runActive) return undefined;\n if (this.runAborted || this.budgetExceededReason || this.callOverBudgetReason()) {\n return { decline: true };\n }\n this.tally.llmCalls += 1;\n this.activeRequest = { token: COMPACTION_REQUEST, runId: taskId };\n return undefined;\n }\n\n private async beforeRequest(runId: string): Promise<undefined> {\n if (!(await this.checkCallBudget())) return undefined;\n this.requestRunId = runId;\n return undefined;\n }\n\n private async beforeTool(\n call: { id: string; name: string; arguments: Record<string, unknown> },\n api: {\n snapshot: ToolExecutionApi[\"snapshot\"];\n conversationId: ToolExecutionApi[\"conversationId\"];\n },\n ): Promise<{ block?: string } | undefined> {\n const round = (await api.snapshot(LiveDoc, api.conversationId, context))?.tools ?? [];\n if (round.length > 1 && round.some((slot) => slot.name === START_TASK_TOOL)) {\n return { block: `Call ${START_TASK_TOOL} alone, without other tools in the same batch.` };\n }\n return this.checkToolLoop(call.id, call.name, call.arguments);\n }\n\n private takeLoopNotice(callId: string): string | undefined {\n const notice = this.loopNotices.get(callId);\n this.loopNotices.delete(callId);\n return notice;\n }\n\n private async executeNestedTool(\n tool: MikanHarnessTool,\n call: Parameters<MikanHarnessTool[\"execute\"]>,\n ): Promise<MikanToolResult> {\n const [args, api, toolContext] = call;\n const id = api.callId;\n if (this.runAborted || toolContext.abortSignal?.aborted) throw new Error(\"Operation aborted\");\n await this.emitToolStart(id, tool.name, args);\n let result: MikanToolResult;\n try {\n const verdict = await this.checkToolLoop(id, tool.name, args as Record<string, unknown>);\n if (verdict?.block) throw new Error(verdict.block);\n toolContext.abortSignal?.throwIfAborted();\n result = await tool.execute(args, api, toolContext);\n const notice = this.takeLoopNotice(id);\n if (notice !== undefined) result = { ...result, content: withNotice(result.content, notice) };\n } catch (error) {\n result = { content: [{ type: \"text\", text: errorMessage(error) }], isError: true };\n } finally {\n this.loopNotices.delete(id);\n }\n await this.emitToolEnd(\n id,\n tool.name,\n { content: result.content ?? [], details: result.details },\n result.isError === true,\n );\n return result;\n }\n\n private async checkToolLoop(\n toolCallId: string,\n toolName: string,\n args: Record<string, unknown>,\n ): Promise<{ block: string } | undefined> {\n const verdict = this.loopGuard.observe(toolName, args);\n switch (verdict.kind) {\n case \"allow\":\n return undefined;\n case \"notice\":\n this.loopNotices.set(toolCallId, verdict.text);\n return undefined;\n case \"block\":\n return { block: verdict.reason };\n case \"stop\":\n await this.exceedBudget(verdict.reason);\n return { block: verdict.reason };\n default:\n return verdict satisfies never;\n }\n }\n\n private async emit(event: HarnessEvent): Promise<void> {\n for (const listener of this.listeners) {\n try {\n await listener(event);\n } catch (error) {\n log.logWarning(\"Harness event listener failed\", errorMessage(error));\n }\n }\n }\n\n private async handleDurableEvents(events: readonly DurableEvent[]): Promise<void> {\n for (const event of events) {\n try {\n await this.handleDurableEvent(event);\n } catch (error) {\n log.logWarning(\"Durable event handling failed\", errorMessage(error));\n }\n }\n if (this.runEndSeen) this.runEnded.resolve();\n }\n\n private async handleDurableEvent(event: DurableEvent): Promise<void> {\n switch (event.type) {\n case \"run_start\":\n this.runStarted = true;\n return;\n case \"run_end\":\n await this.endRetry(this.runAborted ? \"Retry cancelled\" : undefined);\n this.runEndSeen = true;\n return;\n case \"snapshot\":\n return this.streamContent(event.generation?.message?.content ?? []);\n case \"message_start\":\n if (event.message.role === \"system\") return;\n this.streamingContent = [];\n await this.emit({ type: \"message_start\", message: event.message });\n if (event.message.role === \"assistant\") await this.streamContent(event.message.content);\n return;\n case \"message_update\":\n return this.streamContent(applyMessageChanges(this.streamingContent, event.changes));\n case \"message_end\":\n return this.endMessage(event.entry.model?.[0]);\n case \"tool_execution_start\":\n return this.emitToolStart(event.toolCallId, event.toolName, event.args);\n case \"tool_execution_update\":\n if (event.details === undefined) return;\n await this.emit({\n type: \"tool_execution_update\",\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n details: event.details,\n });\n return;\n case \"tool_execution_end\": {\n const message = event.entry?.model?.[0];\n const toolResult = message?.role === \"toolResult\" ? message : undefined;\n await this.emitToolEnd(\n event.toolCallId,\n event.toolName,\n { content: toolResult?.content ?? [], details: toolResult?.details },\n toolResult?.isError ?? true,\n );\n return;\n }\n case \"auto_retry_start\":\n this.retryAttempt = event.attempt;\n await this.emit({\n type: \"auto_retry_start\",\n attempt: event.attempt,\n maxAttempts: this.settings.retry.maxRetries,\n delayMs: Math.max(0, event.at - Date.now()),\n errorMessage: event.errorMessage,\n });\n return;\n case \"auto_retry_end\":\n this.retryAttempt = 0;\n await this.emit({\n type: \"auto_retry_end\",\n attempt: event.attempt,\n success: !this.runAborted,\n finalError: this.runAborted ? \"Retry cancelled\" : undefined,\n });\n return;\n case \"compaction_start\":\n await this.emit({ type: \"compaction_start\", reason: event.reason });\n return;\n case \"compaction_end\": {\n if (this.activeRequest?.token === COMPACTION_REQUEST) this.activeRequest = undefined;\n const outcome = await this.compactionOutcome(event.taskId);\n await this.emit({\n type: \"compaction_end\",\n reason: event.reason,\n aborted: outcome?.status === \"aborted\",\n errorMessage: outcome?.status === \"failed\" ? outcome.error.message : undefined,\n });\n return;\n }\n case \"usage_changed\":\n return this.recordUsage(event.usage);\n case \"task_failed\":\n log.logWarning(`Durable task ${event.kind} failed`, event.message);\n return;\n default:\n return;\n }\n }\n\n private async streamContent(content: AssistantMessage[\"content\"]): Promise<void> {\n const before = contentText(this.streamingContent);\n this.streamingContent = content;\n const after = contentText(content);\n if (after.length > before.length && after.startsWith(before)) {\n await this.emit({ type: \"text_delta\", delta: after.slice(before.length) });\n }\n }\n\n private async compactionOutcome(\n taskId: Parameters<AttachedSessionHarness[\"harness\"][\"getTask\"]>[0],\n ) {\n const task = await this.attached?.harness.getTask(taskId, context);\n return task?.state.outcome;\n }\n\n private async recordUsage(state: UsageState): Promise<void> {\n const total = sumUsageState(state);\n addUsage(this.tally.usage, subtractUsage(total, this.observedUsage));\n this.observedUsage = total;\n const reason = this.resourceOverBudgetReason();\n if (reason) await this.exceedBudget(reason);\n }\n\n private async endRetry(finalError: string | undefined): Promise<void> {\n if (this.retryAttempt === 0) return;\n await this.emit({\n type: \"auto_retry_end\",\n attempt: this.retryAttempt,\n success: false,\n finalError,\n });\n this.retryAttempt = 0;\n }\n\n private async endMessage(message: Message | undefined): Promise<void> {\n if (!message || message.role === \"system\") return;\n if (message.role === \"assistant\") await this.streamContent(message.content);\n this.runMessages.push(message);\n await this.emit({ type: \"message_end\", message });\n if (message.role !== \"assistant\") return;\n const needsCall =\n message.stopReason === \"error\" || message.content.some((part) => part.type === \"toolCall\");\n const reason = (needsCall && this.callOverBudgetReason()) || this.resourceOverBudgetReason();\n if (reason) await this.exceedBudget(reason);\n }\n\n private async emitToolStart(toolCallId: string, toolName: string, args: unknown): Promise<void> {\n this.toolArgs.set(toolCallId, args);\n this.tally.toolCalls += 1;\n this.tally.toolCallCounts[toolName] = (this.tally.toolCallCounts[toolName] ?? 0) + 1;\n await this.emit({ type: \"tool_execution_start\", toolCallId, toolName, args });\n }\n\n private async emitToolEnd(\n toolCallId: string,\n toolName: string,\n result: Extract<HarnessEvent, { type: \"tool_execution_end\" }>[\"result\"],\n isError: boolean,\n ): Promise<void> {\n this.toolArgs.delete(toolCallId);\n await this.emit({ type: \"tool_execution_end\", toolCallId, toolName, result, isError });\n }\n\n private async exceedBudget(reason: string): Promise<void> {\n if (this.budgetExceededReason) return;\n this.budgetExceededReason = reason;\n this.abort(reason);\n await this.emit({\n type: \"budget_exceeded\",\n reason,\n tokens: this.tally.usage.totalTokens,\n costUsd: this.tally.usage.cost.total,\n llmCalls: this.tally.llmCalls,\n durationMs: Date.now() - this.tally.startedAt,\n });\n log.logWarning(\"Run budget exceeded — aborting\", reason);\n }\n\n private async checkCallBudget(): Promise<boolean> {\n if (this.runAborted || this.budgetExceededReason) {\n this.requestCancellation();\n return false;\n }\n const reason = this.callOverBudgetReason() ?? this.resourceOverBudgetReason();\n if (reason) await this.exceedBudget(reason);\n return !this.runAborted && !this.budgetExceededReason;\n }\n\n private callOverBudgetReason(): string | undefined {\n const limit = this.runBudget.maxLlmCalls;\n if (limit !== undefined && this.tally.llmCalls >= limit)\n return `${this.tally.llmCalls} LLM calls >= ${limit} limit`;\n return undefined;\n }\n\n private resourceOverBudgetReason(): string | undefined {\n const { maxTokens, maxCostUsd, maxDurationMs } = this.runBudget;\n if (maxTokens !== undefined && this.tally.usage.totalTokens >= maxTokens)\n return `${this.tally.usage.totalTokens} tokens >= ${maxTokens} limit`;\n if (maxCostUsd !== undefined && this.tally.usage.cost.total >= maxCostUsd)\n return `cost ${this.tally.usage.cost.total.toFixed(2)} USD >= ${maxCostUsd} USD limit`;\n if (maxDurationMs !== undefined && Date.now() - this.tally.startedAt >= maxDurationMs)\n return `${Date.now() - this.tally.startedAt}ms >= ${maxDurationMs}ms limit`;\n return undefined;\n }\n\n private armDeadline(): void {\n const maxDurationMs = this.runBudget.maxDurationMs;\n if (maxDurationMs === undefined || !Number.isFinite(maxDurationMs) || this.runAborted) return;\n const remaining = maxDurationMs - (Date.now() - this.tally.startedAt);\n this.deadlineTimer = setTimeout(\n () => {\n if (Date.now() - this.tally.startedAt < maxDurationMs) {\n this.armDeadline();\n return;\n }\n this.deadlineNotification = this.exceedBudget(\n `${Date.now() - this.tally.startedAt}ms >= ${maxDurationMs}ms limit`,\n );\n },\n Math.min(Math.max(0, remaining), 2_147_483_647),\n );\n }\n}\n\nfunction abortedAssistant(model: Model<Api>, reason: string): AssistantMessage {\n return {\n role: \"assistant\",\n content: [],\n api: model.api,\n provider: model.provider,\n model: model.id,\n usage: createEmptyUsage(),\n stopReason: \"aborted\",\n errorMessage: reason,\n timestamp: Date.now(),\n };\n}\n\nfunction abortedStream(model: Model<Api>, reason: string): AssistantMessageEventStream {\n const stream = createAssistantMessageEventStream();\n const error = abortedAssistant(model, reason);\n stream.push({ type: \"error\", reason: \"aborted\", error });\n stream.end(error);\n return stream;\n}\n\nconst DEFAULT_RETRY_SETTINGS: RetrySettings = {\n enabled: true,\n maxRetries: 3,\n baseDelayMs: 2000,\n};\n\nconst DEFAULT_BUDGET_SETTINGS: BudgetSettings = {};\n\nexport const DEFAULT_EVENT_BUDGET: BudgetSettings = {\n maxDurationMs: 10 * 60 * 1000,\n maxLlmCalls: 50,\n maxCostUsd: 10,\n};\n\nfunction resolveHarnessSettings(overrides?: {\n compaction?: Partial<CompactionSettings>;\n retry?: Partial<RetrySettings>;\n budget?: Partial<BudgetSettings>;\n}): HarnessSettings {\n return {\n compaction: { ...DEFAULT_COMPACTION_POLICY, ...overrides?.compaction },\n retry: { ...DEFAULT_RETRY_SETTINGS, ...overrides?.retry },\n budget: { ...DEFAULT_BUDGET_SETTINGS, ...overrides?.budget },\n };\n}\n\nasync function contextTokens(conversation: Conversation): Promise<number> {\n const { messages } = await conversation.context(context);\n return messages.reduce((total, message) => total + estimateMessageTokens(message), 0);\n}\n\nexport function createEmptyUsage(): Usage {\n return {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n };\n}\n\nexport function addUsage(total: Usage, usage: Usage): void {\n total.input += usage.input;\n total.output += usage.output;\n total.cacheRead += usage.cacheRead;\n total.cacheWrite += usage.cacheWrite;\n total.totalTokens += usage.input + usage.output + usage.cacheRead + usage.cacheWrite;\n total.cost.input += usage.cost.input;\n total.cost.output += usage.cost.output;\n total.cost.cacheRead += usage.cost.cacheRead;\n total.cost.cacheWrite += usage.cost.cacheWrite;\n total.cost.total += usage.cost.total;\n\n if (usage.cacheWrite1h !== undefined) {\n total.cacheWrite1h = (total.cacheWrite1h ?? 0) + usage.cacheWrite1h;\n }\n if (usage.reasoning !== undefined) {\n total.reasoning = (total.reasoning ?? 0) + usage.reasoning;\n }\n}\n\nexport function sumUsageState(state: UsageState): Usage {\n const total = createEmptyUsage();\n for (const usage of [...Object.values(state.models), ...Object.values(state.tools)]) {\n addUsage(total, usage);\n }\n return total;\n}\n\nfunction subtractUsage(total: Usage, base: Usage): Usage {\n return {\n input: total.input - base.input,\n output: total.output - base.output,\n cacheRead: total.cacheRead - base.cacheRead,\n cacheWrite: total.cacheWrite - base.cacheWrite,\n totalTokens: total.totalTokens - base.totalTokens,\n cost: {\n input: total.cost.input - base.cost.input,\n output: total.cost.output - base.cost.output,\n cacheRead: total.cost.cacheRead - base.cost.cacheRead,\n cacheWrite: total.cost.cacheWrite - base.cost.cacheWrite,\n total: total.cost.total - base.cost.total,\n },\n reasoning: total.reasoning === undefined ? undefined : total.reasoning - (base.reasoning ?? 0),\n };\n}\n\nexport function copyUsage(usage: Usage): Usage {\n return { ...usage, cost: { ...usage.cost } };\n}\n\nfunction applyMessageChanges(\n content: AssistantMessage[\"content\"],\n changes: readonly MessageChange[],\n): AssistantMessage[\"content\"] {\n const next = [...content];\n for (const change of changes) {\n switch (change.type) {\n case \"message\":\n next.splice(0, next.length, ...change.message.content);\n break;\n case \"text_start\":\n case \"thinking_start\":\n case \"toolcall_start\":\n case \"block\":\n next[change.contentIndex] = change.block;\n break;\n case \"text_delta\": {\n const block = next[change.contentIndex];\n next[change.contentIndex] =\n block?.type === \"text\"\n ? { ...block, text: `${block.text}${change.delta}` }\n : { type: \"text\", text: change.delta };\n break;\n }\n case \"thinking_delta\":\n case \"toolcall_delta\":\n break;\n default:\n change satisfies never;\n }\n }\n return next;\n}\n\nfunction withNotice(\n content: readonly (TextContent | ImageContent)[] | undefined,\n notice: string,\n): (TextContent | ImageContent)[] {\n return [...(content ?? []), { type: \"text\", text: notice }];\n}\n\nfunction toPiTool(tool: MikanHarnessTool): ToolRegistration {\n const { outputSchema: _outputSchema, execute, ...registration } = tool;\n return {\n ...registration,\n execute: async (args, api, toolContext) => {\n const {\n content,\n structuredContent: _structured,\n ...result\n } = await execute(args, api, toolContext);\n return { ...result, output: content };\n },\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"codemode.d.ts","sourceRoot":"","sources":["../../../src/harness/tools/codemode.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAmB,MAAM,aAAa,CAAC;AAU1F,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAIlE;AAqBD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,gBAAgB,CAK3E;AAeD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,gBAAgB,CA+KjF"}
1
+ {"version":3,"file":"codemode.d.ts","sourceRoot":"","sources":["../../../src/harness/tools/codemode.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAmB,MAAM,aAAa,CAAC;AAU1F,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAIlE;AAqBD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,gBAAgB,CAK3E;AAeD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,gBAAgB,CA+KjF"}
@@ -1,5 +1,5 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { CodemodeSandbox, mcpStructuredContentSchema, parseCodemodeSource, renderDeclarations, renderToolOutputType, renderToolSample, toCodemodeIdentifier, } from "@earendil-works/pi-codemode";
2
+ import { CodemodeSandbox, parseCodemodeSource, renderDeclarations, renderToolOutputType, renderToolSample, toCodemodeIdentifier, } from "@earendil-works/pi-codemode";
3
3
  import { validateToolArguments } from "@earendil-works/pi-ai";
4
4
  import { withAbortSignal } from "@earendil-works/chord/context";
5
5
  import { Type } from "typebox";
@@ -21,7 +21,7 @@ function describeOutput(schema) {
21
21
  if (type === "string")
22
22
  return "a string";
23
23
  const properties = isRecord(schema) && isRecord(schema.properties) ? schema.properties : undefined;
24
- if (properties && mcpStructuredContentSchema(schema) === undefined) {
24
+ if (properties) {
25
25
  const required = new Set(isRecord(schema) && Array.isArray(schema.required) ? schema.required : []);
26
26
  const fields = Object.keys(properties).map((name) => (required.has(name) ? name : `${name}?`));
27
27
  return `\`{ ${fields.join(", ")} }\``;
@@ -1 +1 @@
1
- {"version":3,"file":"codemode.js","sourceRoot":"","sources":["../../../src/harness/tools/codemode.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n CodemodeSandbox,\n type CodemodeStoreWrites,\n mcpStructuredContentSchema,\n parseCodemodeSource,\n renderDeclarations,\n renderToolOutputType,\n renderToolSample,\n toCodemodeIdentifier,\n type CodemodeTool,\n type CodemodeJsonSchema,\n} from \"@earendil-works/pi-codemode\";\nimport { validateToolArguments, type JsonObject } from \"@earendil-works/pi-ai\";\nimport type { Context } from \"@earendil-works/chord\";\nimport { withAbortSignal } from \"@earendil-works/chord/context\";\nimport type { ToolExecutionApi } from \"@earendil-works/pi-durable\";\nimport { Type } from \"typebox\";\nimport type { CodemodeToolOptions, MikanHarnessTool, MikanToolResult } from \"../types.js\";\nimport { LABEL_PARAMETER } from \"./host-fn-tool.js\";\nimport { tagHarnessTool } from \"./pi-tools.js\";\nimport { START_TASK_TOOL } from \"./task.js\";\nimport { mcpNamespaceKey, searchTools, TOOL_SEARCH_TOOL } from \"./tool-search.js\";\nimport { isRecord } from \"../../unknown-values.js\";\nimport { ScriptStoreDoc } from \"../../sessions/session-store.js\";\n\nconst TEXT_OUTPUT_SCHEMA: CodemodeJsonSchema = { type: \"string\" };\n\nexport function isCodemodeCallable(tool: MikanHarnessTool): boolean {\n return (\n tool.name !== \"codemode\" && tool.name !== START_TASK_TOOL && tool.name !== TOOL_SEARCH_TOOL\n );\n}\n\nfunction outputSchemaOf(tool: MikanHarnessTool): CodemodeJsonSchema {\n return (tool.outputSchema as CodemodeJsonSchema | undefined) ?? TEXT_OUTPUT_SCHEMA;\n}\n\nfunction describeOutput(schema: CodemodeJsonSchema): string {\n const type = renderToolOutputType(schema);\n if (type === \"string\") return \"a string\";\n const properties =\n isRecord(schema) && isRecord(schema.properties) ? schema.properties : undefined;\n if (properties && mcpStructuredContentSchema(schema) === undefined) {\n const required = new Set(\n isRecord(schema) && Array.isArray(schema.required) ? schema.required : [],\n );\n const fields = Object.keys(properties).map((name) => (required.has(name) ? name : `${name}?`));\n return `\\`{ ${fields.join(\", \")} }\\``;\n }\n return `\\`${type.replace(/\\s+/g, \" \")}\\``;\n}\n\nexport function withScriptCallNote(tool: MikanHarnessTool): MikanHarnessTool {\n return tagHarnessTool({\n ...tool,\n description: `${tool.description.trim()}\\n\\nCodemode: \\`tools.${toCodemodeIdentifier(tool.name)}(args)\\` resolves to ${describeOutput(outputSchemaOf(tool))}.`,\n });\n}\n\nfunction scriptValue(tool: MikanHarnessTool, result: MikanToolResult, output: string): unknown {\n if (tool.outputSchema && result.structuredContent !== undefined) return result.structuredContent;\n const content = result.content ?? [{ type: \"text\" as const, text: output }];\n const text = content\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\\n\");\n if (result.isError) throw new Error(text || `Tool \"${tool.name}\" failed`);\n if (result.structuredContent !== undefined) return result.structuredContent;\n if (content.some((part) => part.type === \"image\")) return { content };\n return text;\n}\n\nexport function createCodemodeTool(options: CodemodeToolOptions): MikanHarnessTool {\n const callable = options.tools.filter(isCodemodeCallable);\n const declarations = callable.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.parameters as CodemodeJsonSchema,\n outputSchema: outputSchemaOf(tool),\n execute: () => undefined,\n }));\n const namespaces = (options.servers ?? []).flatMap((server) => {\n const key = mcpNamespaceKey(server.name);\n const tools = callable\n .filter((tool) => tool.namespace !== undefined && mcpNamespaceKey(tool.namespace) === key)\n .map((tool) => tool.name);\n if (tools.length === 0) return [];\n return [\n {\n key,\n value: {\n name: `mcp__${server.name}`,\n description: server.description,\n instructions: server.instructions,\n tools,\n },\n },\n ];\n });\n const samples = new Map(declarations.map((tool) => [tool.name, renderToolSample(tool)]));\n const globals: CodemodeTool[] = [\n {\n name: \"searchTools\",\n spread: true,\n description: \"Search authorized tools without changing model declarations.\",\n signature:\n \"(query: string, options?: { limit?: number; namespace?: string }): Promise<Array<{ name: string; description: string }>>\",\n execute: (args) => {\n if (!Array.isArray(args) || typeof args[0] !== \"string\")\n throw new Error(\"searchTools requires a string query\");\n const settings: unknown = args[1];\n if (settings !== undefined && !isRecord(settings))\n throw new Error(\"searchTools options must be an object\");\n const limit: unknown = settings?.limit;\n const namespace: unknown = settings?.namespace;\n if (limit !== undefined && typeof limit !== \"number\")\n throw new Error(\"limit must be a number\");\n if (namespace !== undefined && typeof namespace !== \"string\")\n throw new Error(\"namespace must be a string\");\n return searchTools({ tools: callable, query: args[0], limit, namespace }).map((tool) => ({\n name: tool.name,\n description: samples.get(tool.name) ?? tool.description,\n }));\n },\n },\n {\n name: \"describeTool\",\n description: \"Return the full declaration of an authorized tool, or undefined.\",\n signature: \"(name: string): Promise<string | undefined>\",\n execute: (name) => (typeof name === \"string\" ? samples.get(name) : undefined),\n },\n {\n name: \"describeNamespace\",\n description:\n \"Return an MCP server's description, instructions, and tool names, or undefined. Accepts `mcp__<server>` or `<server>`.\",\n signature:\n \"(name: string): Promise<{ name: string; description?: string; instructions?: string; tools: string[] } | undefined>\",\n execute: (name) => {\n if (typeof name !== \"string\") return undefined;\n const key = mcpNamespaceKey(name);\n return namespaces.find((namespace) => namespace.key === key)?.value;\n },\n },\n ];\n return tagHarnessTool({\n name: \"codemode\",\n description: `Run JavaScript code to orchestrate/compose authorized tool calls.\n- Evaluates raw JavaScript (not Markdown code fences) in a fresh QuickJS sandbox as an async function body: top-level await and return work.\n- Nested tools are on the global tools object: await tools.<name>(args). Each takes an object and resolves to text or a structured value; failed calls reject with an Error.\n- Batch independent calls with await Promise.allSettled([...]) and filter results before emitting them. Only script output and its return value reach the model.\n- No Node, filesystem, network, process, modules or timers except through authorized tools. Unawaited calls are cancelled when the script finishes. Tool side effects are real and are not undone if the script fails.\n- start_task, tool_search and recursive codemode are not callable from scripts.\n\nGlobal output helpers:\n- text(value) and console.* append text; image(dataUrlOrImageContent) forwards an image; exit() ends the script successfully.\n- return value emits the final value. store(key, value) and load(key) keep JSON values across codemode calls in this conversation; storing undefined deletes a key.\n- ALL_TOOLS lists the authorized nested tools as { name, description } entries.\n\nGlobal discovery helpers (async functions, not methods on tools):\n${renderDeclarations({ globals })}\n\nTools declared to you are also callable from scripts; each one's description says what its call resolves to. Other tools, such as MCP tools, are not listed: find them with searchTools(), inspect them with describeTool() or describeNamespace(), or filter ALL_TOOLS, then call tools[name](args).\nDiscover in one script: inspect every namespace and tool the task may need together, then call them in the next script using the declared parameter and return types. Do not guess argument names. Discovery does not load schemas into the model's direct tool set.\n\\`\\`\\`js\nconst matches = await searchTools(query, { namespace });\ntext((await describeNamespace(namespace))?.instructions);\nfor (const match of matches.slice(0, 3)) text(await describeTool(match.name));\n\\`\\`\\`\nMCP tools resolve to their complete CallToolResult { content, structuredContent?, isError? }, never truncated: text results are in content[i].text, usually JSON to parse, and an MCP error resolves with isError: true instead of rejecting. Never emit a whole result: everything you emit stays in the conversation and is sent again on every later model call. Parse it and emit only the fields the answer needs:\n\\`\\`\\`js\nconst result = await tools[name](args);\nif (result.isError) return result.content[0]?.text;\nconst data = JSON.parse(result.content[0].text);\nreturn data.items.map(({ id, title }) => ({ id, title }));\n\\`\\`\\``,\n parameters: Type.Object({ label: LABEL_PARAMETER, code: Type.String() }),\n execute: async (params, api, context) => {\n const id = api.callId;\n const { code } = validateToolArguments(\n { name: \"codemode\", description: \"\", parameters: Type.Object({ code: Type.String() }) },\n { type: \"toolCall\", id, name: \"codemode\", arguments: params as JsonObject },\n );\n const source = parseCodemodeSource(code);\n const pending = new Set<Promise<unknown>>();\n const tools: CodemodeTool[] = callable.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.parameters as CodemodeJsonSchema,\n execute: (args, { signal }) => {\n const call = (async () => {\n signal.throwIfAborted();\n const validated: Record<string, unknown> = validateToolArguments(tool, {\n type: \"toolCall\",\n id,\n name: tool.name,\n arguments: args as JsonObject,\n });\n const nested = nestedApi(api, `${id}:${randomUUID()}`);\n const result = await options.executeNested(tool, [\n validated,\n nested.api,\n withAbortSignal(signal, context),\n ]);\n return scriptValue(tool, result, nested.output());\n })();\n pending.add(call);\n void call.then(\n () => pending.delete(call),\n () => pending.delete(call),\n );\n return call;\n },\n }));\n const sandbox = new CodemodeSandbox({\n tools,\n globals,\n timeoutMs: source.options.timeoutMs ?? 60_000,\n memoryLimitBytes: 64 * 1024 * 1024,\n });\n try {\n const saved = await api.snapshot(ScriptStoreDoc, api.conversationId, context);\n const result = await sandbox.execute(source.code, {\n signal: context.abortSignal,\n store: saved?.values ?? {},\n });\n if (result.ok) await saveStoreWrites(api, result.storeWrites, context);\n const output = [...result.output];\n if (result.ok && result.value !== undefined)\n output.push({ type: \"text\", text: JSON.stringify(result.value) });\n if (!result.ok) output.push({ type: \"text\", text: result.error.message });\n let remaining = Math.min(source.options.maxOutputTokens ?? 10_000, 10_000) * 4;\n const content = output.map((part) => {\n if (part.type !== \"text\") return part;\n const text =\n part.text.length > remaining\n ? `${part.text.slice(0, remaining)}\\n[Codemode output truncated; emit less data.]`\n : part.text;\n remaining = Math.max(0, remaining - part.text.length);\n return { type: \"text\" as const, text };\n });\n return { content, details: undefined, isError: !result.ok };\n } finally {\n await sandbox.close();\n await Promise.allSettled(pending);\n }\n },\n });\n}\n\nasync function saveStoreWrites(\n api: ToolExecutionApi,\n writes: CodemodeStoreWrites,\n context: Context,\n): Promise<void> {\n if (writes.delete.length === 0 && Object.keys(writes.set).length === 0) return;\n await api.commit(async (tx) => {\n const store = await tx.doc(ScriptStoreDoc, api.conversationId);\n for (const key of writes.delete) delete store.values[key];\n Object.assign(store.values, writes.set);\n }, context);\n}\n\nfunction nestedApi(\n parent: ToolExecutionApi,\n callId: string,\n): { api: ToolExecutionApi; output: () => string } {\n const chunks: string[] = [];\n const decoder = new TextDecoder();\n return {\n api: {\n ...parent,\n callId,\n output: (chunk) => {\n chunks.push(typeof chunk === \"string\" ? chunk : decoder.decode(chunk));\n },\n diagnostic: (diagnostic) => {\n chunks.push(`\\n[${diagnostic.severity}] ${diagnostic.message}`);\n },\n details: async () => undefined,\n },\n output: () => chunks.join(\"\"),\n };\n}\n"]}
1
+ {"version":3,"file":"codemode.js","sourceRoot":"","sources":["../../../src/harness/tools/codemode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,eAAe,EAEf,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,GAGrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,qBAAqB,EAAmB,MAAM,uBAAuB,CAAC;AAE/E,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,MAAM,kBAAkB,GAAuB,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAElE,MAAM,UAAU,kBAAkB,CAAC,IAAsB;IACvD,OAAO,CACL,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAC5F,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,IAAsB;IAC5C,OAAQ,IAAI,CAAC,YAA+C,IAAI,kBAAkB,CAAC;AACrF,CAAC;AAED,SAAS,cAAc,CAAC,MAA0B;IAChD,MAAM,IAAI,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,UAAU,CAAC;IACzC,MAAM,UAAU,GACd,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IAClF,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAC1E,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;QAC/F,OAAO,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAsB;IACvD,OAAO,cAAc,CAAC;QACpB,GAAG,IAAI;QACP,WAAW,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,yBAAyB,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG;KAC/J,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,IAAsB,EAAE,MAAuB,EAAE,MAAc;IAClF,IAAI,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,iBAAiB,CAAC;IACjG,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,OAAO;SACjB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;SACtC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;SACxB,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,IAAI,MAAM,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,SAAS,IAAI,CAAC,IAAI,UAAU,CAAC,CAAC;IAC1E,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,iBAAiB,CAAC;IAC5E,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IACtE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA4B;IAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,UAAgC;QAClD,YAAY,EAAE,cAAc,CAAC,IAAI,CAAC;QAClC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS;KACzB,CAAC,CAAC,CAAC;IACJ,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QAC5D,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,QAAQ;aACnB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC;aACzF,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAClC,OAAO;YACL;gBACE,GAAG;gBACH,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ,MAAM,CAAC,IAAI,EAAE;oBAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;oBACjC,KAAK;iBACN;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACzF,MAAM,OAAO,GAAmB;QAC9B;YACE,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,8DAA8D;YAC3E,SAAS,EACP,0HAA0H;YAC5H,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBAChB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;oBACrD,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBACzD,MAAM,QAAQ,GAAY,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClC,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBAC/C,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBAC3D,MAAM,KAAK,GAAY,QAAQ,EAAE,KAAK,CAAC;gBACvC,MAAM,SAAS,GAAY,QAAQ,EAAE,SAAS,CAAC;gBAC/C,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ;oBAClD,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBAC5C,IAAI,SAAS,KAAK,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ;oBAC1D,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBAChD,OAAO,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBACvF,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW;iBACxD,CAAC,CAAC,CAAC;YACN,CAAC;SACF;QACD;YACE,IAAI,EAAE,cAAc;YACpB,WAAW,EAAE,kEAAkE;YAC/E,SAAS,EAAE,6CAA6C;YACxD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;SAC9E;QACD;YACE,IAAI,EAAE,mBAAmB;YACzB,WAAW,EACT,wHAAwH;YAC1H,SAAS,EACP,qHAAqH;YACvH,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBAChB,IAAI,OAAO,IAAI,KAAK,QAAQ;oBAAE,OAAO,SAAS,CAAC;gBAC/C,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;gBAClC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC;YACtE,CAAC;SACF;KACF,CAAC;IACF,OAAO,cAAc,CAAC;QACpB,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE;;;;;;;;;;;;;EAaf,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC;;;;;;;;;;;;;;;OAe1B;QACH,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QACxE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;YACtC,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;YACtB,MAAM,EAAE,IAAI,EAAE,GAAG,qBAAqB,CACpC,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EACvF,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,MAAoB,EAAE,CAC5E,CAAC;YACF,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;YAC5C,MAAM,KAAK,GAAmB,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACpD,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,WAAW,EAAE,IAAI,CAAC,UAAgC;gBAClD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;oBAC5B,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE;wBACvB,MAAM,CAAC,cAAc,EAAE,CAAC;wBACxB,MAAM,SAAS,GAA4B,qBAAqB,CAAC,IAAI,EAAE;4BACrE,IAAI,EAAE,UAAU;4BAChB,EAAE;4BACF,IAAI,EAAE,IAAI,CAAC,IAAI;4BACf,SAAS,EAAE,IAAkB;yBAC9B,CAAC,CAAC;wBACH,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,UAAU,EAAE,EAAE,CAAC,CAAC;wBACvD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE;4BAC/C,SAAS;4BACT,MAAM,CAAC,GAAG;4BACV,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC;yBACjC,CAAC,CAAC;wBACH,OAAO,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;oBACpD,CAAC,CAAC,EAAE,CAAC;oBACL,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAClB,KAAK,IAAI,CAAC,IAAI,CACZ,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAC1B,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAC3B,CAAC;oBACF,OAAO,IAAI,CAAC;gBACd,CAAC;aACF,CAAC,CAAC,CAAC;YACJ,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC;gBAClC,KAAK;gBACL,OAAO;gBACP,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,MAAM;gBAC7C,gBAAgB,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;aACnC,CAAC,CAAC;YACH,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;gBAC9E,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE;oBAChD,MAAM,EAAE,OAAO,CAAC,WAAW;oBAC3B,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE;iBAC3B,CAAC,CAAC;gBACH,IAAI,MAAM,CAAC,EAAE;oBAAE,MAAM,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBACvE,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;gBAClC,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;oBACzC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACpE,IAAI,CAAC,MAAM,CAAC,EAAE;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC1E,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,IAAI,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC/E,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;oBAClC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;wBAAE,OAAO,IAAI,CAAC;oBACtC,MAAM,IAAI,GACR,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS;wBAC1B,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,gDAAgD;wBAClF,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;oBAChB,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACtD,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;gBACzC,CAAC,CAAC,CAAC;gBACH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YAC9D,CAAC;oBAAS,CAAC;gBACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;gBACtB,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,GAAqB,EACrB,MAA2B,EAC3B,OAAgB;IAEhB,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC/E,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QAC5B,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;QAC/D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC,EAAE,OAAO,CAAC,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAChB,MAAwB,EACxB,MAAc;IAEd,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,OAAO;QACL,GAAG,EAAE;YACH,GAAG,MAAM;YACT,MAAM;YACN,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBAChB,MAAM,CAAC,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACzE,CAAC;YACD,UAAU,EAAE,CAAC,UAAU,EAAE,EAAE;gBACzB,MAAM,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,QAAQ,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;YAClE,CAAC;YACD,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS;SAC/B;QACD,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;KAC9B,CAAC;AACJ,CAAC","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n CodemodeSandbox,\n type CodemodeStoreWrites,\n parseCodemodeSource,\n renderDeclarations,\n renderToolOutputType,\n renderToolSample,\n toCodemodeIdentifier,\n type CodemodeTool,\n type CodemodeJsonSchema,\n} from \"@earendil-works/pi-codemode\";\nimport { validateToolArguments, type JsonObject } from \"@earendil-works/pi-ai\";\nimport type { Context } from \"@earendil-works/chord\";\nimport { withAbortSignal } from \"@earendil-works/chord/context\";\nimport type { ToolExecutionApi } from \"@earendil-works/pi-durable\";\nimport { Type } from \"typebox\";\nimport type { CodemodeToolOptions, MikanHarnessTool, MikanToolResult } from \"../types.js\";\nimport { LABEL_PARAMETER } from \"./host-fn-tool.js\";\nimport { tagHarnessTool } from \"./pi-tools.js\";\nimport { START_TASK_TOOL } from \"./task.js\";\nimport { mcpNamespaceKey, searchTools, TOOL_SEARCH_TOOL } from \"./tool-search.js\";\nimport { isRecord } from \"../../unknown-values.js\";\nimport { ScriptStoreDoc } from \"../../sessions/session-store.js\";\n\nconst TEXT_OUTPUT_SCHEMA: CodemodeJsonSchema = { type: \"string\" };\n\nexport function isCodemodeCallable(tool: MikanHarnessTool): boolean {\n return (\n tool.name !== \"codemode\" && tool.name !== START_TASK_TOOL && tool.name !== TOOL_SEARCH_TOOL\n );\n}\n\nfunction outputSchemaOf(tool: MikanHarnessTool): CodemodeJsonSchema {\n return (tool.outputSchema as CodemodeJsonSchema | undefined) ?? TEXT_OUTPUT_SCHEMA;\n}\n\nfunction describeOutput(schema: CodemodeJsonSchema): string {\n const type = renderToolOutputType(schema);\n if (type === \"string\") return \"a string\";\n const properties =\n isRecord(schema) && isRecord(schema.properties) ? schema.properties : undefined;\n if (properties) {\n const required = new Set(\n isRecord(schema) && Array.isArray(schema.required) ? schema.required : [],\n );\n const fields = Object.keys(properties).map((name) => (required.has(name) ? name : `${name}?`));\n return `\\`{ ${fields.join(\", \")} }\\``;\n }\n return `\\`${type.replace(/\\s+/g, \" \")}\\``;\n}\n\nexport function withScriptCallNote(tool: MikanHarnessTool): MikanHarnessTool {\n return tagHarnessTool({\n ...tool,\n description: `${tool.description.trim()}\\n\\nCodemode: \\`tools.${toCodemodeIdentifier(tool.name)}(args)\\` resolves to ${describeOutput(outputSchemaOf(tool))}.`,\n });\n}\n\nfunction scriptValue(tool: MikanHarnessTool, result: MikanToolResult, output: string): unknown {\n if (tool.outputSchema && result.structuredContent !== undefined) return result.structuredContent;\n const content = result.content ?? [{ type: \"text\" as const, text: output }];\n const text = content\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\\n\");\n if (result.isError) throw new Error(text || `Tool \"${tool.name}\" failed`);\n if (result.structuredContent !== undefined) return result.structuredContent;\n if (content.some((part) => part.type === \"image\")) return { content };\n return text;\n}\n\nexport function createCodemodeTool(options: CodemodeToolOptions): MikanHarnessTool {\n const callable = options.tools.filter(isCodemodeCallable);\n const declarations = callable.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.parameters as CodemodeJsonSchema,\n outputSchema: outputSchemaOf(tool),\n execute: () => undefined,\n }));\n const namespaces = (options.servers ?? []).flatMap((server) => {\n const key = mcpNamespaceKey(server.name);\n const tools = callable\n .filter((tool) => tool.namespace !== undefined && mcpNamespaceKey(tool.namespace) === key)\n .map((tool) => tool.name);\n if (tools.length === 0) return [];\n return [\n {\n key,\n value: {\n name: `mcp__${server.name}`,\n description: server.description,\n instructions: server.instructions,\n tools,\n },\n },\n ];\n });\n const samples = new Map(declarations.map((tool) => [tool.name, renderToolSample(tool)]));\n const globals: CodemodeTool[] = [\n {\n name: \"searchTools\",\n spread: true,\n description: \"Search authorized tools without changing model declarations.\",\n signature:\n \"(query: string, options?: { limit?: number; namespace?: string }): Promise<Array<{ name: string; description: string }>>\",\n execute: (args) => {\n if (!Array.isArray(args) || typeof args[0] !== \"string\")\n throw new Error(\"searchTools requires a string query\");\n const settings: unknown = args[1];\n if (settings !== undefined && !isRecord(settings))\n throw new Error(\"searchTools options must be an object\");\n const limit: unknown = settings?.limit;\n const namespace: unknown = settings?.namespace;\n if (limit !== undefined && typeof limit !== \"number\")\n throw new Error(\"limit must be a number\");\n if (namespace !== undefined && typeof namespace !== \"string\")\n throw new Error(\"namespace must be a string\");\n return searchTools({ tools: callable, query: args[0], limit, namespace }).map((tool) => ({\n name: tool.name,\n description: samples.get(tool.name) ?? tool.description,\n }));\n },\n },\n {\n name: \"describeTool\",\n description: \"Return the full declaration of an authorized tool, or undefined.\",\n signature: \"(name: string): Promise<string | undefined>\",\n execute: (name) => (typeof name === \"string\" ? samples.get(name) : undefined),\n },\n {\n name: \"describeNamespace\",\n description:\n \"Return an MCP server's description, instructions, and tool names, or undefined. Accepts `mcp__<server>` or `<server>`.\",\n signature:\n \"(name: string): Promise<{ name: string; description?: string; instructions?: string; tools: string[] } | undefined>\",\n execute: (name) => {\n if (typeof name !== \"string\") return undefined;\n const key = mcpNamespaceKey(name);\n return namespaces.find((namespace) => namespace.key === key)?.value;\n },\n },\n ];\n return tagHarnessTool({\n name: \"codemode\",\n description: `Run JavaScript code to orchestrate/compose authorized tool calls.\n- Evaluates raw JavaScript (not Markdown code fences) in a fresh QuickJS sandbox as an async function body: top-level await and return work.\n- Nested tools are on the global tools object: await tools.<name>(args). Each takes an object and resolves to text or a structured value; failed calls reject with an Error.\n- Batch independent calls with await Promise.allSettled([...]) and filter results before emitting them. Only script output and its return value reach the model.\n- No Node, filesystem, network, process, modules or timers except through authorized tools. Unawaited calls are cancelled when the script finishes. Tool side effects are real and are not undone if the script fails.\n- start_task, tool_search and recursive codemode are not callable from scripts.\n\nGlobal output helpers:\n- text(value) and console.* append text; image(dataUrlOrImageContent) forwards an image; exit() ends the script successfully.\n- return value emits the final value. store(key, value) and load(key) keep JSON values across codemode calls in this conversation; storing undefined deletes a key.\n- ALL_TOOLS lists the authorized nested tools as { name, description } entries.\n\nGlobal discovery helpers (async functions, not methods on tools):\n${renderDeclarations({ globals })}\n\nTools declared to you are also callable from scripts; each one's description says what its call resolves to. Other tools, such as MCP tools, are not listed: find them with searchTools(), inspect them with describeTool() or describeNamespace(), or filter ALL_TOOLS, then call tools[name](args).\nDiscover in one script: inspect every namespace and tool the task may need together, then call them in the next script using the declared parameter and return types. Do not guess argument names. Discovery does not load schemas into the model's direct tool set.\n\\`\\`\\`js\nconst matches = await searchTools(query, { namespace });\ntext((await describeNamespace(namespace))?.instructions);\nfor (const match of matches.slice(0, 3)) text(await describeTool(match.name));\n\\`\\`\\`\nMCP tools resolve to their complete CallToolResult { content, structuredContent?, isError? }, never truncated: text results are in content[i].text, usually JSON to parse, and an MCP error resolves with isError: true instead of rejecting. Never emit a whole result: everything you emit stays in the conversation and is sent again on every later model call. Parse it and emit only the fields the answer needs:\n\\`\\`\\`js\nconst result = await tools[name](args);\nif (result.isError) return result.content[0]?.text;\nconst data = JSON.parse(result.content[0].text);\nreturn data.items.map(({ id, title }) => ({ id, title }));\n\\`\\`\\``,\n parameters: Type.Object({ label: LABEL_PARAMETER, code: Type.String() }),\n execute: async (params, api, context) => {\n const id = api.callId;\n const { code } = validateToolArguments(\n { name: \"codemode\", description: \"\", parameters: Type.Object({ code: Type.String() }) },\n { type: \"toolCall\", id, name: \"codemode\", arguments: params as JsonObject },\n );\n const source = parseCodemodeSource(code);\n const pending = new Set<Promise<unknown>>();\n const tools: CodemodeTool[] = callable.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.parameters as CodemodeJsonSchema,\n execute: (args, { signal }) => {\n const call = (async () => {\n signal.throwIfAborted();\n const validated: Record<string, unknown> = validateToolArguments(tool, {\n type: \"toolCall\",\n id,\n name: tool.name,\n arguments: args as JsonObject,\n });\n const nested = nestedApi(api, `${id}:${randomUUID()}`);\n const result = await options.executeNested(tool, [\n validated,\n nested.api,\n withAbortSignal(signal, context),\n ]);\n return scriptValue(tool, result, nested.output());\n })();\n pending.add(call);\n void call.then(\n () => pending.delete(call),\n () => pending.delete(call),\n );\n return call;\n },\n }));\n const sandbox = new CodemodeSandbox({\n tools,\n globals,\n timeoutMs: source.options.timeoutMs ?? 60_000,\n memoryLimitBytes: 64 * 1024 * 1024,\n });\n try {\n const saved = await api.snapshot(ScriptStoreDoc, api.conversationId, context);\n const result = await sandbox.execute(source.code, {\n signal: context.abortSignal,\n store: saved?.values ?? {},\n });\n if (result.ok) await saveStoreWrites(api, result.storeWrites, context);\n const output = [...result.output];\n if (result.ok && result.value !== undefined)\n output.push({ type: \"text\", text: JSON.stringify(result.value) });\n if (!result.ok) output.push({ type: \"text\", text: result.error.message });\n let remaining = Math.min(source.options.maxOutputTokens ?? 10_000, 10_000) * 4;\n const content = output.map((part) => {\n if (part.type !== \"text\") return part;\n const text =\n part.text.length > remaining\n ? `${part.text.slice(0, remaining)}\\n[Codemode output truncated; emit less data.]`\n : part.text;\n remaining = Math.max(0, remaining - part.text.length);\n return { type: \"text\" as const, text };\n });\n return { content, details: undefined, isError: !result.ok };\n } finally {\n await sandbox.close();\n await Promise.allSettled(pending);\n }\n },\n });\n}\n\nasync function saveStoreWrites(\n api: ToolExecutionApi,\n writes: CodemodeStoreWrites,\n context: Context,\n): Promise<void> {\n if (writes.delete.length === 0 && Object.keys(writes.set).length === 0) return;\n await api.commit(async (tx) => {\n const store = await tx.doc(ScriptStoreDoc, api.conversationId);\n for (const key of writes.delete) delete store.values[key];\n Object.assign(store.values, writes.set);\n }, context);\n}\n\nfunction nestedApi(\n parent: ToolExecutionApi,\n callId: string,\n): { api: ToolExecutionApi; output: () => string } {\n const chunks: string[] = [];\n const decoder = new TextDecoder();\n return {\n api: {\n ...parent,\n callId,\n output: (chunk) => {\n chunks.push(typeof chunk === \"string\" ? chunk : decoder.decode(chunk));\n },\n diagnostic: (diagnostic) => {\n chunks.push(`\\n[${diagnostic.severity}] ${diagnostic.message}`);\n },\n details: async () => undefined,\n },\n output: () => chunks.join(\"\"),\n };\n}\n"]}
@@ -5,7 +5,7 @@ import type { SandboxResourceController } from "../../types.js";
5
5
  import type { EventStore } from "../../events/index.js";
6
6
  import { type MikanHarnessTool } from "./pi-tools.js";
7
7
  import { type FieldTextGenerator } from "./jev-browser.js";
8
- import type { MikanToolRunContext, PlatformToolPack } from "./types.js";
8
+ import type { DesktopAccess, MikanToolRunContext, PlatformToolPack } from "./types.js";
9
9
  export declare function createMikanTools(env: () => ExecutionEnv | undefined, eventStore: EventStore, sandboxController: {
10
10
  sandbox: SandboxConfig;
11
11
  resourceController?: Pick<SandboxResourceController, "getLimitStatus" | "setLimits">;
@@ -13,7 +13,7 @@ export declare function createMikanTools(env: () => ExecutionEnv | undefined, ev
13
13
  model: Model<Api>;
14
14
  getApiKey: () => Promise<string | undefined>;
15
15
  outputDir: string;
16
- }, generateFieldText?: FieldTextGenerator): {
16
+ }, generateFieldText?: FieldTextGenerator, desktopAccess?: DesktopAccess): {
17
17
  tools: MikanHarnessTool[];
18
18
  bindRun: (ctx: MikanToolRunContext) => void;
19
19
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/harness/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,EAAsC,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAI1F,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAIjF,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAExE,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,YAAY,GAAG,SAAS,EACnC,UAAU,EAAE,UAAU,EACtB,iBAAiB,EAAE;IACjB,OAAO,EAAE,aAAa,CAAC;IACvB,kBAAkB,CAAC,EAAE,IAAI,CAAC,yBAAyB,EAAE,gBAAgB,GAAG,WAAW,CAAC,CAAC;CACtF,EACD,iBAAiB,GAAE,SAAS,gBAAgB,EAAO,EACnD,eAAe,CAAC,EAAE;IAChB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC7C,SAAS,EAAE,MAAM,CAAC;CACnB,EACD,iBAAiB,CAAC,EAAE,kBAAkB,GACrC;IACD,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,OAAO,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAC7C,CAmDA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/harness/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,EAAsC,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAI1F,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAIjF,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEvF,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,YAAY,GAAG,SAAS,EACnC,UAAU,EAAE,UAAU,EACtB,iBAAiB,EAAE;IACjB,OAAO,EAAE,aAAa,CAAC;IACvB,kBAAkB,CAAC,EAAE,IAAI,CAAC,yBAAyB,EAAE,gBAAgB,GAAG,WAAW,CAAC,CAAC;CACtF,EACD,iBAAiB,GAAE,SAAS,gBAAgB,EAAO,EACnD,eAAe,CAAC,EAAE;IAChB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC7C,SAAS,EAAE,MAAM,CAAC;CACnB,EACD,iBAAiB,CAAC,EAAE,kBAAkB,EACtC,aAAa,CAAC,EAAE,aAAa,GAC5B;IACD,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,OAAO,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAC7C,CA8DA"}
@@ -9,13 +9,15 @@ import { createJevBrowserTool } from "./jev-browser.js";
9
9
  import { createReactTool } from "./react.js";
10
10
  import { createSandboxTool } from "./sandbox.js";
11
11
  import { createWebFetchTool } from "./web-fetch.js";
12
- export function createMikanTools(env, eventStore, sandboxController, platformToolPacks = [], imageGeneration, generateFieldText) {
12
+ export function createMikanTools(env, eventStore, sandboxController, platformToolPacks = [], imageGeneration, generateFieldText, desktopAccess) {
13
13
  const { tool: attachTool, setUploadFunction } = createAttachTool();
14
14
  const imageTool = imageGeneration ? createGenerateImageTool(imageGeneration) : undefined;
15
15
  const { tools: taskTools, bindTasks } = createTaskTools();
16
16
  const { tool: reactTool, setReactFunction } = createReactTool();
17
17
  const jevTool = createJevTool();
18
- const jevBrowserTool = createJevBrowserTool(env, generateFieldText);
18
+ const jevBrowserTool = createJevBrowserTool(env, generateFieldText, {
19
+ desktop: sandboxController.sandbox.type === "oci",
20
+ });
19
21
  const { tool: eventTool, setEventContext } = createEventTool(eventStore);
20
22
  const { tool: sandboxTool, setSandboxContext } = createSandboxTool(sandboxController);
21
23
  const packTools = platformToolPacks.flatMap((pack) => pack.tools);
@@ -48,6 +50,12 @@ export function createMikanTools(env, eventStore, sandboxController, platformToo
48
50
  });
49
51
  imageTool?.setUploadFunction((hostPath, title) => responder.uploadFile(hostPath, title));
50
52
  bindTasks(responder);
53
+ jevBrowserTool.setHandOff(desktopAccess && message.conversationKind === "direct"
54
+ ? {
55
+ openDesktop: () => desktopAccess.open(userId),
56
+ announce: (step) => responder.respond(`${step}\n\nOpen the desktop: ${desktopAccess.link(userId)}`),
57
+ }
58
+ : undefined);
51
59
  setReactFunction(responder.react ? (emoji) => responder.react(emoji) : null);
52
60
  for (const pack of platformToolPacks) {
53
61
  pack.bindRun({
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/harness/tools/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model } from \"@earendil-works/pi-ai\";\nimport { createAttachTool, normalizeAttachRuntimePath, withStagedRuntimeFile } from \"./attach.js\";\nimport type { ExecutionEnv } from \"@earendil-works/pi-durable/env\";\nimport type { SandboxConfig } from \"../../sandbox/types.js\";\nimport type { SandboxResourceController } from \"../../types.js\";\nimport type { EventStore } from \"../../events/index.js\";\nimport { createEventTool } from \"./event.js\";\nimport { createGenerateImageTool } from \"./generate-image.js\";\nimport { adaptAgentTool, createSandboxTools, type MikanHarnessTool } from \"./pi-tools.js\";\nimport { withSecretRedaction } from \"./secret-redaction.js\";\nimport { createTaskTools } from \"./task.js\";\nimport { createJevTool } from \"./jev.js\";\nimport { createJevBrowserTool, type FieldTextGenerator } from \"./jev-browser.js\";\nimport { createReactTool } from \"./react.js\";\nimport { createSandboxTool } from \"./sandbox.js\";\nimport { createWebFetchTool } from \"./web-fetch.js\";\nimport type { MikanToolRunContext, PlatformToolPack } from \"./types.js\";\n\nexport function createMikanTools(\n env: () => ExecutionEnv | undefined,\n eventStore: EventStore,\n sandboxController: {\n sandbox: SandboxConfig;\n resourceController?: Pick<SandboxResourceController, \"getLimitStatus\" | \"setLimits\">;\n },\n platformToolPacks: readonly PlatformToolPack[] = [],\n imageGeneration?: {\n model: Model<Api>;\n getApiKey: () => Promise<string | undefined>;\n outputDir: string;\n },\n generateFieldText?: FieldTextGenerator,\n): {\n tools: MikanHarnessTool[];\n bindRun: (ctx: MikanToolRunContext) => void;\n} {\n const { tool: attachTool, setUploadFunction } = createAttachTool();\n const imageTool = imageGeneration ? createGenerateImageTool(imageGeneration) : undefined;\n const { tools: taskTools, bindTasks } = createTaskTools();\n const { tool: reactTool, setReactFunction } = createReactTool();\n const jevTool = createJevTool();\n const jevBrowserTool = createJevBrowserTool(env, generateFieldText);\n const { tool: eventTool, setEventContext } = createEventTool(eventStore);\n const { tool: sandboxTool, setSandboxContext } = createSandboxTool(sandboxController);\n const packTools = platformToolPacks.flatMap((pack) => pack.tools);\n return {\n tools: [\n ...createSandboxTools(),\n adaptAgentTool(eventTool),\n adaptAgentTool(sandboxTool),\n adaptAgentTool(attachTool),\n ...(imageTool ? [adaptAgentTool(imageTool.tool)] : []),\n adaptAgentTool(reactTool),\n adaptAgentTool(jevTool),\n adaptAgentTool(jevBrowserTool),\n createWebFetchTool(),\n ...taskTools.map(adaptAgentTool),\n ...packTools.map(adaptAgentTool),\n ].map(withSecretRedaction),\n bindRun: ({ message, responder, platformName, runtimeWorkspaceRoot }) => {\n const { address, userId } = message;\n setEventContext({\n platform: platformName,\n conversationId: address.conversationId,\n conversationKind: message.conversationKind,\n userId,\n });\n setSandboxContext({ address, userId });\n setUploadFunction(async (filePath, title) => {\n const runtimePath = normalizeAttachRuntimePath(filePath, runtimeWorkspaceRoot);\n await withStagedRuntimeFile(env(), runtimePath, (stagedPath) =>\n responder.uploadFile(stagedPath, title),\n );\n });\n imageTool?.setUploadFunction((hostPath, title) => responder.uploadFile(hostPath, title));\n bindTasks(responder);\n setReactFunction(responder.react ? (emoji) => responder.react!(emoji) : null);\n for (const pack of platformToolPacks) {\n pack.bindRun({\n conversationId: address.conversationId,\n platformName,\n threadTs: message.threadTs,\n });\n }\n },\n };\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/harness/tools/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model } from \"@earendil-works/pi-ai\";\nimport { createAttachTool, normalizeAttachRuntimePath, withStagedRuntimeFile } from \"./attach.js\";\nimport type { ExecutionEnv } from \"@earendil-works/pi-durable/env\";\nimport type { SandboxConfig } from \"../../sandbox/types.js\";\nimport type { SandboxResourceController } from \"../../types.js\";\nimport type { EventStore } from \"../../events/index.js\";\nimport { createEventTool } from \"./event.js\";\nimport { createGenerateImageTool } from \"./generate-image.js\";\nimport { adaptAgentTool, createSandboxTools, type MikanHarnessTool } from \"./pi-tools.js\";\nimport { withSecretRedaction } from \"./secret-redaction.js\";\nimport { createTaskTools } from \"./task.js\";\nimport { createJevTool } from \"./jev.js\";\nimport { createJevBrowserTool, type FieldTextGenerator } from \"./jev-browser.js\";\nimport { createReactTool } from \"./react.js\";\nimport { createSandboxTool } from \"./sandbox.js\";\nimport { createWebFetchTool } from \"./web-fetch.js\";\nimport type { DesktopAccess, MikanToolRunContext, PlatformToolPack } from \"./types.js\";\n\nexport function createMikanTools(\n env: () => ExecutionEnv | undefined,\n eventStore: EventStore,\n sandboxController: {\n sandbox: SandboxConfig;\n resourceController?: Pick<SandboxResourceController, \"getLimitStatus\" | \"setLimits\">;\n },\n platformToolPacks: readonly PlatformToolPack[] = [],\n imageGeneration?: {\n model: Model<Api>;\n getApiKey: () => Promise<string | undefined>;\n outputDir: string;\n },\n generateFieldText?: FieldTextGenerator,\n desktopAccess?: DesktopAccess,\n): {\n tools: MikanHarnessTool[];\n bindRun: (ctx: MikanToolRunContext) => void;\n} {\n const { tool: attachTool, setUploadFunction } = createAttachTool();\n const imageTool = imageGeneration ? createGenerateImageTool(imageGeneration) : undefined;\n const { tools: taskTools, bindTasks } = createTaskTools();\n const { tool: reactTool, setReactFunction } = createReactTool();\n const jevTool = createJevTool();\n const jevBrowserTool = createJevBrowserTool(env, generateFieldText, {\n desktop: sandboxController.sandbox.type === \"oci\",\n });\n const { tool: eventTool, setEventContext } = createEventTool(eventStore);\n const { tool: sandboxTool, setSandboxContext } = createSandboxTool(sandboxController);\n const packTools = platformToolPacks.flatMap((pack) => pack.tools);\n return {\n tools: [\n ...createSandboxTools(),\n adaptAgentTool(eventTool),\n adaptAgentTool(sandboxTool),\n adaptAgentTool(attachTool),\n ...(imageTool ? [adaptAgentTool(imageTool.tool)] : []),\n adaptAgentTool(reactTool),\n adaptAgentTool(jevTool),\n adaptAgentTool(jevBrowserTool),\n createWebFetchTool(),\n ...taskTools.map(adaptAgentTool),\n ...packTools.map(adaptAgentTool),\n ].map(withSecretRedaction),\n bindRun: ({ message, responder, platformName, runtimeWorkspaceRoot }) => {\n const { address, userId } = message;\n setEventContext({\n platform: platformName,\n conversationId: address.conversationId,\n conversationKind: message.conversationKind,\n userId,\n });\n setSandboxContext({ address, userId });\n setUploadFunction(async (filePath, title) => {\n const runtimePath = normalizeAttachRuntimePath(filePath, runtimeWorkspaceRoot);\n await withStagedRuntimeFile(env(), runtimePath, (stagedPath) =>\n responder.uploadFile(stagedPath, title),\n );\n });\n imageTool?.setUploadFunction((hostPath, title) => responder.uploadFile(hostPath, title));\n bindTasks(responder);\n jevBrowserTool.setHandOff(\n desktopAccess && message.conversationKind === \"direct\"\n ? {\n openDesktop: () => desktopAccess.open(userId),\n announce: (step) =>\n responder.respond(`${step}\\n\\nOpen the desktop: ${desktopAccess.link(userId)}`),\n }\n : undefined,\n );\n setReactFunction(responder.react ? (emoji) => responder.react!(emoji) : null);\n for (const pack of platformToolPacks) {\n pack.bindRun({\n conversationId: address.conversationId,\n platformName,\n threadTs: message.threadTs,\n });\n }\n },\n };\n}\n"]}
@@ -11,6 +11,7 @@ declare const jevBrowserSchema: Type.TObject<{
11
11
  commands: Type.TOptional<Type.TArray<Type.TArray<Type.TString>>>;
12
12
  close: Type.TOptional<Type.TBoolean>;
13
13
  maxSteps: Type.TOptional<Type.TInteger>;
14
+ handOff: Type.TOptional<Type.TString>;
14
15
  }>;
15
16
  interface RefInfo {
16
17
  role: string;
@@ -37,6 +38,16 @@ export type FieldTextGenerator = (system: string, user: string, signal?: AbortSi
37
38
  declare function resolveTarget(operation: string, answers: Record<string, {
38
39
  choice?: unknown;
39
40
  } | undefined>, singles: Record<string, string>): string | undefined;
40
- export declare function createJevBrowserTool(getEnv: () => ExecutionEnv | undefined, generateText?: FieldTextGenerator): AgentTool<typeof jevBrowserSchema>;
41
+ interface BrowserHandOff {
42
+ openDesktop(): Promise<boolean>;
43
+ announce(step: string): Promise<void>;
44
+ }
45
+ export type JevBrowserTool = AgentTool<typeof jevBrowserSchema> & {
46
+ setHandOff(handOff: BrowserHandOff | undefined): void;
47
+ };
48
+ interface JevBrowserOptions {
49
+ desktop?: boolean;
50
+ }
51
+ export declare function createJevBrowserTool(getEnv: () => ExecutionEnv | undefined, generateText?: FieldTextGenerator, options?: JevBrowserOptions): JevBrowserTool;
41
52
  export { buildQuestionPlan, resolveTarget, categorizeRefs, truncate, describeContinuity };
42
53
  //# sourceMappingURL=jev-browser.d.ts.map