@geminixiang/mikan 1.5.0 → 1.5.1

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 (46) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/adapters/messages.d.ts +1 -2
  3. package/dist/adapters/messages.d.ts.map +1 -1
  4. package/dist/adapters/messages.js +2 -5
  5. package/dist/adapters/messages.js.map +1 -1
  6. package/dist/adapters/slack/bot.d.ts +2 -2
  7. package/dist/adapters/slack/bot.d.ts.map +1 -1
  8. package/dist/adapters/slack/bot.js +36 -50
  9. package/dist/adapters/slack/bot.js.map +1 -1
  10. package/dist/harness/continued-run.d.ts +3 -0
  11. package/dist/harness/continued-run.d.ts.map +1 -0
  12. package/dist/harness/continued-run.js +8 -0
  13. package/dist/harness/continued-run.js.map +1 -0
  14. package/dist/harness/prompt.d.ts.map +1 -1
  15. package/dist/harness/prompt.js +1 -0
  16. package/dist/harness/prompt.js.map +1 -1
  17. package/dist/harness/runner.d.ts.map +1 -1
  18. package/dist/harness/runner.js +14 -7
  19. package/dist/harness/runner.js.map +1 -1
  20. package/dist/harness/session.d.ts +3 -0
  21. package/dist/harness/session.d.ts.map +1 -1
  22. package/dist/harness/session.js +14 -1
  23. package/dist/harness/session.js.map +1 -1
  24. package/dist/harness/tools/codemode.js +1 -1
  25. package/dist/harness/tools/codemode.js.map +1 -1
  26. package/dist/harness/tools/jev-browser.d.ts.map +1 -1
  27. package/dist/harness/tools/jev-browser.js +31 -6
  28. package/dist/harness/tools/jev-browser.js.map +1 -1
  29. package/dist/harness/tools/task.d.ts +0 -2
  30. package/dist/harness/tools/task.d.ts.map +1 -1
  31. package/dist/harness/tools/task.js +1 -6
  32. package/dist/harness/tools/task.js.map +1 -1
  33. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  34. package/dist/runtime/conversation-runtime.js +6 -3
  35. package/dist/runtime/conversation-runtime.js.map +1 -1
  36. package/dist/sessions/session-store.d.ts +4 -3
  37. package/dist/sessions/session-store.d.ts.map +1 -1
  38. package/dist/sessions/session-store.js +92 -47
  39. package/dist/sessions/session-store.js.map +1 -1
  40. package/dist/sessions/types.d.ts +0 -1
  41. package/dist/sessions/types.d.ts.map +1 -1
  42. package/dist/sessions/types.js.map +1 -1
  43. package/dist/types.d.ts +1 -0
  44. package/dist/types.d.ts.map +1 -1
  45. package/dist/types.js.map +1 -1
  46. package/package.json +1 -1
@@ -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 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
+ {"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 continueInterrupted?: 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 continueInterrupted(options?: Omit<RunOptions, \"continueInterrupted\">): Promise<void> {\n await this.run(\"\", { ...options, continueInterrupted: true });\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 await this.sessionStore.whenContinued();\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 = options?.continueInterrupted\n ? await this.continueRun()\n : 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 continueRun(): Promise<SessionRunStatus> {\n this.runStarted = await this.sessionStore.continueInterruptedRun();\n if (this.runStarted) await this.runEnded.promise;\n return this.runAborted ? \"aborted\" : \"completed\";\n }\n\n private async drive(\n { harness, conversation }: AttachedSessionHarness,\n text: string,\n images?: ImageContent[],\n ): Promise<SessionRunStatus> {\n await this.sessionStore.whenContinued();\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"]}
@@ -187,7 +187,7 @@ return data.items.map(({ id, title }) => ({ id, title }));
187
187
  const sandbox = new CodemodeSandbox({
188
188
  tools,
189
189
  globals,
190
- timeoutMs: source.options.timeoutMs ?? 60_000,
190
+ timeoutMs: source.options.timeoutMs ?? Number.POSITIVE_INFINITY,
191
191
  memoryLimitBytes: 64 * 1024 * 1024,
192
192
  });
193
193
  try {
@@ -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 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"]}
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 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 ?? Number.POSITIVE_INFINITY,\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 +1 @@
1
- {"version":3,"file":"jev-browser.d.ts","sourceRoot":"","sources":["../../../src/harness/tools/jev-browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAe,MAAM,SAAS,CAAC;AAG5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAkC,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAM9E,eAAO,MAAM,gBAAgB,gBAAgB,CAAC;AAe9C,QAAA,MAAM,gBAAgB;;;;;;;;;EA6CpB,CAAC;AAIH,UAAU,OAAO;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAcD,UAAU,gBAAgB;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAMD,iBAAS,kBAAkB,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,GAAG,SAAS,GAAG,MAAM,CAY9F;AA2HD,iBAAS,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAuDD,iBAAS,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACtD,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC3B,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC1B,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CAC7B,CAOA;AAmBD,UAAU,YAAY;IACpB,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,iBAAS,iBAAiB,CACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,WAAW,EAAE,OAAO,EACpB,aAAa,EAAE,OAAO,EACtB,QAAQ,SAAK,GACZ,YAAY,CAiDd;AAED,MAAM,MAAM,kBAAkB,GAAG,CAC/B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,MAAM,CAAC,CAAC;AAkCrB,iBAAS,aAAa,CACpB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAAC,EACzD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,MAAM,GAAG,SAAS,CAUpB;AAcD,UAAU,cAAc;IACtB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,gBAAgB,CAAC,GAAG;IAChE,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI,CAAC;CACvD,CAAC;AAEF,UAAU,iBAAiB;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA0cD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,YAAY,GAAG,SAAS,EACtC,YAAY,CAAC,EAAE,kBAAkB,EACjC,OAAO,GAAE,iBAAsB,GAC9B,cAAc,CAqBhB;AAED,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"jev-browser.d.ts","sourceRoot":"","sources":["../../../src/harness/tools/jev-browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAe,MAAM,SAAS,CAAC;AAG5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAkC,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAM9E,eAAO,MAAM,gBAAgB,gBAAgB,CAAC;AAe9C,QAAA,MAAM,gBAAgB;;;;;;;;;EA6CpB,CAAC;AAIH,UAAU,OAAO;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAcD,UAAU,gBAAgB;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAMD,iBAAS,kBAAkB,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,GAAG,SAAS,GAAG,MAAM,CAY9F;AA2HD,iBAAS,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAuDD,iBAAS,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACtD,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC3B,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC1B,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CAC7B,CAOA;AAmBD,UAAU,YAAY;IACpB,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,iBAAS,iBAAiB,CACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,WAAW,EAAE,OAAO,EACpB,aAAa,EAAE,OAAO,EACtB,QAAQ,SAAK,GACZ,YAAY,CAiDd;AAED,MAAM,MAAM,kBAAkB,GAAG,CAC/B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,MAAM,CAAC,CAAC;AAkCrB,iBAAS,aAAa,CACpB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAAC,EACzD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,MAAM,GAAG,SAAS,CAUpB;AAcD,UAAU,cAAc;IACtB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,gBAAgB,CAAC,GAAG;IAChE,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI,CAAC;CACvD,CAAC;AAEF,UAAU,iBAAiB;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAweD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,YAAY,GAAG,SAAS,EACtC,YAAY,CAAC,EAAE,kBAAkB,EACjC,OAAO,GAAE,iBAAsB,GAC9B,cAAc,CAqBhB;AAED,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC"}
@@ -23,7 +23,7 @@ const jevBrowserSchema = Type.Object({
23
23
  description: "Natural-language task for Jev to complete step by step, including any literal values to type or select. Omit to only run commands.",
24
24
  })),
25
25
  url: Type.Optional(Type.String({
26
- description: "Page to open first, in a new tab after the first call. Omit to keep working on the current tab.",
26
+ description: "Page to open first, in a new tab after the first call. Alone, it only opens the page and returns its final URL and title, for example to show it on the office desktop. Omit to keep working on the current tab.",
27
27
  })),
28
28
  frame: Type.Optional(Type.String({
29
29
  description: 'Iframe to act in: a CSS selector or iframe @ref from the latest snapshot; "main" returns to the top page. eval and CSS commands still target the top page.',
@@ -406,11 +406,13 @@ function createUnlockedJevBrowserTool(getEnv, generateText, options) {
406
406
  throw new Error('press takes a key, not a target ref: use ["press","Enter"] after focusing the input. Check ["press","--help"] for native syntax.');
407
407
  }
408
408
  }
409
- if (args.handOff !== undefined) {
410
- if (args.url || args.goal || args.commands?.length || args.close || args.frame) {
409
+ const handOffStep = args.handOff?.trim();
410
+ if (handOffStep) {
411
+ const frame = args.frame === "main" ? undefined : args.frame;
412
+ if (args.url || args.goal || args.commands?.length || args.close || frame) {
411
413
  throw new Error("Use handOff alone, without url, goal, commands, frame, or close.");
412
414
  }
413
- return handBrowserToPerson(env, args.handOff, signal);
415
+ return handBrowserToPerson(env, handOffStep, signal);
414
416
  }
415
417
  const desktop = await desktopStatus(env, signal);
416
418
  if (desktop.control === "user")
@@ -429,8 +431,8 @@ function createUnlockedJevBrowserTool(getEnv, generateText, options) {
429
431
  details: undefined,
430
432
  };
431
433
  }
432
- if (!args.goal && !args.commands?.length) {
433
- throw new Error("Provide goal or commands, or close: true to only close the browser.");
434
+ if (!args.url && !args.goal && !args.commands?.length) {
435
+ throw new Error("Provide url, goal, or commands, or close: true to only close the browser.");
434
436
  }
435
437
  if (!args.url && closedByCall) {
436
438
  throw new Error("This thread's browser was explicitly closed. Provide url to start it again; refusing to silently replace it with about:blank.");
@@ -446,6 +448,7 @@ function createUnlockedJevBrowserTool(getEnv, generateText, options) {
446
448
  let status = "no-goal";
447
449
  let message = "No goal was given; ran commands only.";
448
450
  let finalUrl = args.url;
451
+ let openedTitle;
449
452
  let lastSnapshotText = "";
450
453
  let firstLifecycle;
451
454
  const captureLifecycle = (result) => {
@@ -464,6 +467,11 @@ function createUnlockedJevBrowserTool(getEnv, generateText, options) {
464
467
  const opened = targetIdOf(openResult);
465
468
  if (opened)
466
469
  agentTargets.add(opened);
470
+ const page = isRecord(openResult.data) ? openResult.data : {};
471
+ if (typeof page.url === "string")
472
+ finalUrl = page.url;
473
+ if (typeof page.title === "string")
474
+ openedTitle = page.title;
467
475
  browserOpen = true;
468
476
  closedByCall = false;
469
477
  }
@@ -472,6 +480,23 @@ function createUnlockedJevBrowserTool(getEnv, generateText, options) {
472
480
  if (!switched.success)
473
481
  throw new Error(`Failed to switch browser frame: ${switched.error}`);
474
482
  }
483
+ if (!args.goal && !args.commands?.length) {
484
+ return {
485
+ content: [
486
+ {
487
+ type: "text",
488
+ text: JSON.stringify({
489
+ status: "opened",
490
+ finalUrl,
491
+ title: openedTitle,
492
+ browserContinuity: describeContinuity(expectedOpen, firstLifecycle),
493
+ closedOldTabs: closedTabs.length ? closedTabs : undefined,
494
+ }, null, 2),
495
+ },
496
+ ],
497
+ details: undefined,
498
+ };
499
+ }
475
500
  for (const command of args.commands ?? []) {
476
501
  if (signal?.aborted)
477
502
  throw new Error("Operation aborted");