@geminixiang/mikan 0.5.3 → 1.0.0-beta.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.
- package/CHANGELOG.md +27 -0
- package/README.md +2 -2
- package/dist/adapter.d.ts +1 -1
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js.map +1 -1
- package/dist/agent.d.ts +10 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +153 -95
- package/dist/agent.js.map +1 -1
- package/dist/commands/model.d.ts +2 -2
- package/dist/commands/model.d.ts.map +1 -1
- package/dist/commands/model.js.map +1 -1
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +2 -5
- package/dist/commands/registry.js.map +1 -1
- package/dist/config.d.ts +33 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +83 -5
- package/dist/config.js.map +1 -1
- package/dist/execution-resolver.d.ts.map +1 -1
- package/dist/execution-resolver.js +2 -3
- package/dist/execution-resolver.js.map +1 -1
- package/dist/harness/auth.d.ts +16 -0
- package/dist/harness/auth.d.ts.map +1 -0
- package/dist/harness/auth.js +86 -0
- package/dist/harness/auth.js.map +1 -0
- package/dist/harness/extensions/loader.d.ts +43 -0
- package/dist/harness/extensions/loader.d.ts.map +1 -0
- package/dist/harness/extensions/loader.js +325 -0
- package/dist/harness/extensions/loader.js.map +1 -0
- package/dist/harness/extensions/registry.d.ts +23 -0
- package/dist/harness/extensions/registry.d.ts.map +1 -0
- package/dist/harness/extensions/registry.js +45 -0
- package/dist/harness/extensions/registry.js.map +1 -0
- package/dist/harness/extensions/types.d.ts +225 -0
- package/dist/harness/extensions/types.d.ts.map +1 -0
- package/dist/harness/extensions/types.js +2 -0
- package/dist/harness/extensions/types.js.map +1 -0
- package/dist/harness/http.d.ts +16 -0
- package/dist/harness/http.d.ts.map +1 -0
- package/dist/harness/http.js +71 -0
- package/dist/harness/http.js.map +1 -0
- package/dist/harness/index.d.ts +19 -0
- package/dist/harness/index.d.ts.map +1 -0
- package/dist/harness/index.js +18 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/models.d.ts +34 -0
- package/dist/harness/models.d.ts.map +1 -0
- package/dist/harness/models.js +248 -0
- package/dist/harness/models.js.map +1 -0
- package/dist/harness/runner.d.ts +124 -0
- package/dist/harness/runner.d.ts.map +1 -0
- package/dist/harness/runner.js +436 -0
- package/dist/harness/runner.js.map +1 -0
- package/dist/harness/session-store.d.ts +77 -0
- package/dist/harness/session-store.d.ts.map +1 -0
- package/dist/harness/session-store.js +248 -0
- package/dist/harness/session-store.js.map +1 -0
- package/dist/harness/settings.d.ts +47 -0
- package/dist/harness/settings.d.ts.map +1 -0
- package/dist/harness/settings.js +29 -0
- package/dist/harness/settings.js.map +1 -0
- package/dist/harness/skills.d.ts +54 -0
- package/dist/harness/skills.d.ts.map +1 -0
- package/dist/harness/skills.js +203 -0
- package/dist/harness/skills.js.map +1 -0
- package/dist/harness/types.d.ts +32 -0
- package/dist/harness/types.d.ts.map +1 -0
- package/dist/harness/types.js +2 -0
- package/dist/harness/types.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/main.js +65 -3
- package/dist/main.js.map +1 -1
- package/dist/model-registry.d.ts +2 -2
- package/dist/model-registry.d.ts.map +1 -1
- package/dist/model-registry.js.map +1 -1
- package/dist/runtime/conversation-runtime.js +1 -1
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/types.d.ts +3 -1
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sessions/agent-memory-file-manager.d.ts.map +1 -1
- package/dist/sessions/agent-memory-file-manager.js +8 -8
- package/dist/sessions/agent-memory-file-manager.js.map +1 -1
- package/dist/sessions/metadata.js +2 -2
- package/dist/sessions/metadata.js.map +1 -1
- package/dist/sessions/store.d.ts +3 -3
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +4 -4
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +1 -1
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/trigger.d.ts.map +1 -1
- package/dist/trigger.js +5 -13
- package/dist/trigger.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +7 -1
- package/dist/vault/index.js.map +1 -1
- package/dist/web/admin/portal.d.ts.map +1 -1
- package/dist/web/admin/portal.js +328 -9
- package/dist/web/admin/portal.js.map +1 -1
- package/dist/web/admin/provider-models.d.ts +2 -2
- package/dist/web/admin/provider-models.d.ts.map +1 -1
- package/dist/web/admin/provider-models.js.map +1 -1
- package/dist/web/session-view/service.js +5 -5
- package/dist/web/session-view/service.js.map +1 -1
- package/package.json +3 -3
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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","sourcesContent":["import { Agent, type ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { type Api, type ImageContent, type Model } from \"@earendil-works/pi-ai\";\nimport {\n AgentSession,\n AuthStorage,\n convertToLlm,\n DefaultResourceLoader,\n formatSkillsForPrompt,\n getAgentDir,\n loadSkillsFromDir,\n ModelRegistry,\n SessionManager,\n SettingsManager,\n type Skill,\n} from \"@earendil-works/pi-coding-agent\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { mkdir, readFile, writeFile } from \"fs/promises\";\nimport { homedir } from \"os\";\nimport { join, posix } from \"path\";\nimport type {\n ConversationMessage,\n ConversationResponder,\n ConversationKind,\n MessagingInfo,\n PlatformName,\n} from \"./adapter.js\";\nimport type { AgentEventPayload } from \"./types.js\";\nimport type { SessionViewTokenStoreLike } from \"./commands/types.js\";\nimport { resolveConversationSettings } from \"./config.js\";\nimport { ActorExecutionResolver } from \"./execution-resolver.js\";\nimport * as log from \"./log.js\";\nimport { reportUserFacingError } from \"./observability/sentry.js\";\nimport type { DockerContainerManager } from \"./provisioner.js\";\nimport {\n createExecutor,\n type Executor,\n type RuntimePathContext,\n type SandboxConfig,\n} from \"./sandbox/index.js\";\nimport { createMountedRuntimePathContext } from \"./sandbox/path-context.js\";\nimport {\n addLifecycleBreadcrumb,\n metricAttributes,\n updateActiveSpanAttribution,\n} from \"./observability/sentry.js\";\nimport type { VaultManager } from \"./vault/index.js\";\nimport { AgentMemoryFileManager } from \"./sessions/agent-memory-file-manager.js\";\nimport {\n extractSessionUuid,\n openManagedSession,\n type ResolvedSessionScope,\n type ThreadRootMessage,\n} from \"./sessions/store.js\";\nimport { createMikanTools } from \"./tools/index.js\";\nimport * as Sentry from \"@sentry/node\";\nimport { formatLocalTimestamp } from \"./utils/date.js\";\nimport { resolveConfiguredModel } from \"./model-registry.js\";\nimport { emitAgentEvent } from \"./agent-events.js\";\n\nexport type { PiAgentWrapper } from \"./types.js\";\nimport type { PiAgentWrapper } from \"./types.js\";\n\nconst IMAGE_MIME_TYPES: Record<string, string> = {\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n};\n\nfunction getImageMimeType(filename: string): string | undefined {\n return IMAGE_MIME_TYPES[filename.toLowerCase().split(\".\").pop() || \"\"];\n}\n\nfunction buildThreadSessionName(message: ThreadRootMessage | null): string | undefined {\n const text = message?.text?.trim();\n if (!text) return undefined;\n const userLabel = message?.userName || message?.user || \"unknown\";\n return `[${userLabel}]: ${text}`;\n}\n\nasync function getMemory(conversationDir: string): Promise<string> {\n const parts: string[] = [];\n\n // Read workspace-level memory (shared across all conversations)\n const workspaceMemoryPath = join(conversationDir, \"..\", \"MEMORY.md\");\n if (existsSync(workspaceMemoryPath)) {\n try {\n const content = (await readFile(workspaceMemoryPath, \"utf-8\")).trim();\n if (content) {\n parts.push(`### Global Workspace Memory\\n${content}`);\n }\n } catch (error) {\n log.logWarning(\"Failed to read workspace memory\", `${workspaceMemoryPath}: ${error}`);\n }\n }\n\n // Read conversation-specific memory\n const conversationMemoryPath = join(conversationDir, \"MEMORY.md\");\n if (existsSync(conversationMemoryPath)) {\n try {\n const content = (await readFile(conversationMemoryPath, \"utf-8\")).trim();\n if (content) {\n parts.push(`### Conversation-Specific Memory\\n${content}`);\n }\n } catch (error) {\n log.logWarning(\"Failed to read conversation memory\", `${conversationMemoryPath}: ${error}`);\n }\n }\n\n if (parts.length === 0) {\n return \"(no working memory yet)\";\n }\n\n return parts.join(\"\\n\\n\");\n}\n\nfunction loadMikanSkills(conversationDir: string, workspacePath: string): Skill[] {\n const skillMap = new Map<string, Skill>();\n\n // conversationDir is the host path (e.g., /Users/.../data/C0A34FL8PMH)\n // hostWorkspacePath is the parent directory on host\n // workspacePath is the container path (e.g., /workspace)\n const hostWorkspacePath = join(conversationDir, \"..\");\n\n // Helper to translate host paths to container paths\n const translatePath = (hostPath: string): string => {\n if (hostPath.startsWith(hostWorkspacePath)) {\n return workspacePath + hostPath.slice(hostWorkspacePath.length);\n }\n return hostPath;\n };\n\n // Load workspace-level skills (global)\n const workspaceSkillsDir = join(hostWorkspacePath, \"skills\");\n for (const skill of loadSkillsFromDir({ dir: workspaceSkillsDir, source: \"workspace\" }).skills) {\n // Translate paths to container paths for system prompt\n skill.filePath = translatePath(skill.filePath);\n skill.baseDir = translatePath(skill.baseDir);\n skillMap.set(skill.name, skill);\n }\n\n // Load conversation-specific skills (override workspace skills on collision)\n const conversationSkillsDir = join(conversationDir, \"skills\");\n for (const skill of loadSkillsFromDir({ dir: conversationSkillsDir, source: \"channel\" }).skills) {\n skill.filePath = translatePath(skill.filePath);\n skill.baseDir = translatePath(skill.baseDir);\n skillMap.set(skill.name, skill);\n }\n\n return Array.from(skillMap.values());\n}\n\nfunction buildRuntimePaths(runtimeWorkspaceRoot: string, conversationId: string) {\n const workspaceRoot = runtimeWorkspaceRoot.replace(/\\/+$/, \"\") || \"/\";\n const conversationPath = posix.join(workspaceRoot, conversationId);\n return {\n workspaceRoot,\n conversationPath,\n scratchPath: posix.join(conversationPath, \"scratch\"),\n };\n}\n\nfunction buildEnvDescription(sandboxType: SandboxConfig[\"type\"], workspaceRoot: string): string {\n switch (sandboxType) {\n case \"image\":\n return `You are running inside a managed per-user container.\n- Runtime workspace root: ${workspaceRoot}\n- Bash commands start in: ${workspaceRoot}\n- Install tools with the image's package manager\n- Your changes persist for this user's container until it is recreated`;\n case \"container\":\n return `You are running inside a shared container.\n- Runtime workspace root: ${workspaceRoot}\n- Bash commands start in: ${workspaceRoot}\n- Install tools with the container's package manager\n- Your changes persist across sessions`;\n case \"firecracker\":\n return `You are running inside a Firecracker microVM.\n- Runtime workspace root: ${workspaceRoot}\n- Use cd or absolute paths; project files are under ${workspaceRoot}\n- Install tools with: apt-get install <package> (Debian-based)\n- Your changes persist across sessions`;\n case \"cloudflare\":\n return `You are running through a Cloudflare Sandbox bridge.\n- Runtime workspace root: ${workspaceRoot}\n- Bash commands start in: ${workspaceRoot}\n- Your commands run in a remote container managed by Cloudflare\n- Important: the remote filesystem is not automatically synced back to the host workspace`;\n default:\n return `You are running directly on the host machine.\n- Runtime workspace root: ${workspaceRoot}\n- Bash commands start in: ${process.cwd()}\n- Be careful with system modifications`;\n }\n}\n\nexport function resolveTriggerAttribution(\n message: Pick<ConversationMessage, \"id\" | \"text\" | \"userName\">,\n): string | undefined {\n const eventTextMatch = message.text.match(/^\\[EVENT:([^:]+):/);\n if (eventTextMatch) return `[event: ${eventTextMatch[1]}]`;\n const eventIdMatch = message.id.match(/^event:([^:]+)/);\n if (eventIdMatch) return `[event: ${eventIdMatch[1]}]`;\n if (message.userName) return `@${message.userName}`;\n return undefined;\n}\n\nfunction buildSystemPrompt(\n workspacePath: string,\n conversationId: string,\n conversationKind: ConversationKind,\n currentUserId: string | undefined,\n memory: string,\n sandboxConfig: SandboxConfig,\n platform: MessagingInfo,\n skills: Skill[],\n isEventTrigger = false,\n triggerAttribution?: string,\n): string {\n const { workspaceRoot, conversationPath, scratchPath } = buildRuntimePaths(\n workspacePath,\n conversationId,\n );\n const sandboxType = sandboxConfig.type;\n const isContainerLike = sandboxType === \"container\" || sandboxType === \"image\";\n const isFirecracker = sandboxType === \"firecracker\";\n\n // Format channel mappings\n const channelMappings =\n platform.channels.length > 0\n ? platform.channels.map((c) => `${c.id}\\t#${c.name}`).join(\"\\n\")\n : \"(no channels loaded)\";\n\n // Format user mappings\n const userMappings =\n platform.users.length > 0\n ? platform.users.map((u) => `${u.id}\\t@${u.userName}\\t${u.displayName}`).join(\"\\n\")\n : \"(no users loaded)\";\n\n const envDescription = buildEnvDescription(sandboxType, workspaceRoot);\n const eventTriggerInstructions = isEventTrigger\n ? `\n## Event Trigger Mode\n- You are handling a scheduled/background event, not opening a brand new chat with a stranger.\n- Treat the incoming user message as a self-contained task prepared by an earlier run.\n- Complete the task directly. Avoid generic greetings, self-introductions, or boilerplate offers to help.\n- For reminders/follow-ups, prefer a short direct response that sounds like a continuation of prior intent.\n- If the event text includes tone, brevity, or language instructions, follow them literally.\n`\n : \"\";\n const attributionInstructions = triggerAttribution\n ? `\n## Attribution\nAlways end your final ${platform.name} response and any GitHub issue/PR comments or descriptions you write via tools with:\n_Triggered by ${triggerAttribution}_\n\nDo not add this to \\`[SILENT]\\` responses.\n`\n : \"\";\n const slackBlockKitInstructions =\n platform.name === \"slack\"\n ? `\n## Slack Rendering\n- The Slack adapter renders responses with Block Kit automatically. Answer normally using Slack mrkdwn.\n- Do not emit markdown pipe tables; Slack does not render them as tables. Prefer short sections or bullet lists.\n`\n : \"\";\n\n return `You are mikan, a ${platform.name} bot assistant. Be concise. No emojis.\n\n## Context\n- For current date/time, use: date\n- You have access to previous conversation context including tool results from prior turns.\n- For older human-readable history beyond your context, search \\`log.jsonl\\` (contains user messages and your final responses, but not tool results).\n- Structured session history with tool results lives in \\`${conversationPath}/sessions/\\`.\n- The active top-level session is selected by \\`${conversationPath}/sessions/current\\`, which points to a timestamped \\`.jsonl\\` file in the same directory.\n- Scoped/thread sessions use fixed files at \\`${conversationPath}/sessions/<scope_id>.jsonl\\` (for example \\`${conversationPath}/sessions/1777386320.800769.jsonl\\`).\n- If a user asks about something that should exist in conversation history but is not found in the current context window, do not answer \"I don't know\" or \"I don't have that\". Instead, search the thread session, top-level session, and \\`log.jsonl\\` before responding.\n- User messages include a \\`[in-thread:TS]\\` marker when sent from within a platform thread/reply (TS is the thread or parent message identifier). Without this marker, the message is a top-level conversation message.\n${eventTriggerInstructions}\n${platform.formattingGuide}${slackBlockKitInstructions}\n\n## Platform IDs\nChannels: ${channelMappings}\n\nUsers: ${userMappings}\n\nWhen mentioning users, use <@username> format (e.g., <@mario>).\n\n## Environment\n${envDescription}\n- Default place for clones, downloads, and experiments: ${scratchPath}\n- Do not use host-only paths unless you are running in host mode and verified they exist.\n\n## Workspace Layout\n${workspaceRoot}/\n├── MEMORY.md # Global memory (all conversations)\n├── skills/ # Global CLI tools you create\n└── ${conversationId}/ # This conversation\n ├── MEMORY.md # Conversation-specific memory\n ├── log.jsonl # Human-readable message history (no tool results)\n ├── sessions/ # Structured session history used for context reconstruction\n │ ├── current # Active top-level session pointer\n │ ├── <timestamp>_<id>.jsonl # Top-level session files\n │ └── <scope_id>.jsonl # Scoped thread/reply session files\n ├── attachments/ # User-shared files\n ├── scratch/ # Working directory for clones/downloads/experiments: ${scratchPath}\n └── skills/ # Conversation-specific tools\n\n## Skills (Custom CLI Tools)\nYou can create reusable CLI tools for recurring tasks (email, APIs, data processing, etc.).\n\n### Creating Skills\nStore in \\`${workspaceRoot}/skills/<name>/\\` (global) or \\`${conversationPath}/skills/<name>/\\` (conversation-specific).\nEach skill directory needs a \\`SKILL.md\\` with YAML frontmatter:\n\n\\`\\`\\`markdown\n---\nname: skill-name\ndescription: Short description of what this skill does\n---\n\n# Skill Name\n\nUsage instructions, examples, etc.\nScripts are in: {baseDir}/\n\\`\\`\\`\n\n\\`name\\` and \\`description\\` are required. Use \\`{baseDir}\\` as placeholder for the skill's directory path.\n\n### Available Skills\n${skills.length > 0 ? formatSkillsForPrompt(skills) : \"(no skills installed yet)\"}\n\n## Events\nUse the \\`event\\` tool to schedule immediate, one-shot, or periodic follow-ups. It writes to the host-side mikan control plane and fills routing fields for the current conversation automatically.\n\nWrite event \\`text\\` as a self-contained future task with needed context, tone, and constraints because events do not inherit normal conversation history.\n\nFor one-shot reminders, include a timezone offset in \\`at\\`. For periodic events, use a cron schedule plus IANA timezone; assume ${Intl.DateTimeFormat().resolvedOptions().timeZone} when users omit timezone.\n\nWhen events trigger, messages are prefixed like \\`[EVENT:filename:type:time]\\`. Immediate and one-shot events auto-delete after triggering; periodic events persist until deleted.\n\nFor periodic events where there's nothing to report, respond with exactly \\`[SILENT]\\`. Debounce external triggers; prefer one summarized event over many.\n\n## Memory\nWrite to MEMORY.md files to persist context across conversations.\n- Global (${workspaceRoot}/MEMORY.md): skills, preferences, project info\n- Conversation (${conversationPath}/MEMORY.md): conversation-specific decisions, ongoing work\nUpdate when you learn something important or when asked to remember something.\n\n### Current Memory\n${memory}\n\n## System Configuration Log\nMaintain ${workspaceRoot}/SYSTEM.md to log all environment modifications:\n- Installed packages (apt install, npm install, uv pip install)\n- Environment variables set\n- Config files modified (~/.gitconfig, cron jobs, etc.)\n- Skill dependencies installed\n\nUpdate this file whenever you modify the environment. On fresh container, read it first to restore your setup.\n\n## Log Queries (for older history)\nFormat: \\`{\"date\":\"...\",\"ts\":\"...\",\"user\":\"...\",\"userName\":\"...\",\"text\":\"...\",\"isMessagingBot\":false}\\`\nThe log contains user messages and your final responses (not tool calls/results).\nUse \\`log.jsonl\\` for quick grep-style history. Use \\`${conversationPath}/sessions/\\` when you need structured turns, tool outputs, or thread/session lineage.\n${isContainerLike || isFirecracker ? \"Install jq: apt-get install jq\" : \"\"}\n${attributionInstructions}\n\\`\\`\\`bash\n# Recent messages\ntail -30 log.jsonl | jq -c '{date: .date[0:19], user: (.userName // .user), text}'\n\n# Search for specific topic\ngrep -i \"topic\" log.jsonl | jq -c '{date: .date[0:19], user: (.userName // .user), text}'\n\n# Messages from specific user\ngrep '\"userName\":\"mario\"' log.jsonl | tail -20 | jq -c '{date: .date[0:19], text}'\n\n# Inspect top-level session pointer and available session files\ncat sessions/current\nls -1 sessions/\n\\`\\`\\`\n\n## Tools\n- bash: Run shell commands (primary tool). Install packages as needed.\n- read: Read files\n- write: Create/overwrite files\n- edit: Surgical file edits\n- event: Schedule immediate, one-shot, or periodic follow-ups\n- sandbox: Inspect or temporarily adjust sandbox limits\n- attach: Share files to the platform\n\nEach tool requires a \"label\" parameter (shown to user).\n`;\n}\n\nexport function getUnresolvedSandboxPathContext(\n sandboxConfig: SandboxConfig,\n hostWorkspaceRoot: string,\n): RuntimePathContext {\n if (sandboxConfig.type === \"image\") {\n return createMountedRuntimePathContext(hostWorkspaceRoot, \"/workspace\");\n }\n\n return createExecutor(sandboxConfig).getPathContext(hostWorkspaceRoot);\n}\n\ninterface RunnerExecutionContext {\n executionResolver?: ActorExecutionResolver;\n executor: Executor;\n getPathContext: () => RuntimePathContext;\n resolveExecutorForRun(context: {\n platform: string;\n userId: string;\n conversationId: string;\n }): Promise<void>;\n}\n\ninterface RunnerSessionState {\n responder: ConversationResponder | null;\n logCtx: {\n conversationId: string;\n userName?: string;\n conversationName?: string;\n sessionId?: string;\n } | null;\n queue: {\n enqueue(fn: () => Promise<void>, errorContext: string): void;\n } | null;\n pendingTools: Map<string, { toolName: string; args: unknown; startTime: number }>;\n toolProgress: Map<string, { label: string; status: \"running\" | \"done\" | \"error\" }>;\n totalUsage: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: { input: number; output: number; cacheRead: number; cacheWrite: number; total: number };\n };\n llmCallCount: number;\n stopReason: string;\n errorMessage: string | undefined;\n reportedLlmError: boolean;\n finalResponseHandledByTool: boolean;\n triggerAttribution?: string;\n}\n\ninterface PreparedRunContext {\n sessionConversation: string;\n runQueue: ReturnType<typeof createRunQueue>;\n userMessage: string;\n imageAttachments: ImageContent[];\n triggerAttribution?: string;\n}\n\ninterface ConfiguredAgentSession {\n agent: Agent;\n session: AgentSession;\n}\n\nfunction createRunnerExecutionContext(\n sandboxConfig: SandboxConfig,\n vaultManager: VaultManager | undefined,\n provisioner: DockerContainerManager | undefined,\n workspaceDir: string,\n hostWorkspacePath: string,\n): RunnerExecutionContext {\n const executionResolver =\n vaultManager && sandboxConfig.type !== \"host\"\n ? new ActorExecutionResolver(sandboxConfig, vaultManager, provisioner, workspaceDir)\n : undefined;\n\n // activeExecutor is replaced at the start of each run() call when executionResolver\n // is present, so the stable `executor` wrapper always delegates to the latest resolved value.\n let activeExecutor: Executor =\n executionResolver !== undefined\n ? createExecutor({ type: \"host\" })\n : createExecutor(sandboxConfig);\n const executor: Executor = {\n exec(command, options) {\n return activeExecutor.exec(command, options);\n },\n getWorkspacePath(hostPath) {\n return activeExecutor.getWorkspacePath(hostPath);\n },\n getSandboxConfig() {\n return activeExecutor.getSandboxConfig();\n },\n getPathContext(hostWorkspaceRoot) {\n return activeExecutor.getPathContext(hostWorkspaceRoot);\n },\n };\n\n return {\n executionResolver,\n executor,\n getPathContext: () => executor.getPathContext(hostWorkspacePath),\n async resolveExecutorForRun(context): Promise<void> {\n if (!executionResolver) return;\n activeExecutor = await executionResolver.resolve(context);\n },\n };\n}\n\nasync function createConfiguredAgentSession(params: {\n conversationId: string;\n workspaceDir: string;\n runtimeWorkspaceRoot: string;\n systemPrompt: string;\n model: Model<Api>;\n thinkingLevel: ThinkingLevel;\n tools: Awaited<ReturnType<typeof createMikanTools>>[\"tools\"];\n sessionManager: SessionManager;\n settingsManager: SettingsManager;\n modelRegistry: ModelRegistry;\n}): Promise<ConfiguredAgentSession> {\n const {\n conversationId,\n workspaceDir,\n runtimeWorkspaceRoot,\n systemPrompt,\n model,\n thinkingLevel,\n tools,\n sessionManager,\n settingsManager,\n modelRegistry,\n } = params;\n const agent = new Agent({\n initialState: {\n systemPrompt,\n model,\n thinkingLevel,\n tools,\n },\n convertToLlm,\n getApiKey: async (provider) => {\n const key = await modelRegistry.getApiKeyForProvider(provider);\n if (!key) {\n throw new Error(\n `No API key for provider \"${provider}\". Set the appropriate environment variable or configure via auth.json`,\n );\n }\n return key;\n },\n });\n\n const loadedSession = sessionManager.buildSessionContext();\n if (loadedSession.messages.length > 0) {\n agent.state.messages = loadedSession.messages;\n log.logInfo(\n `[${conversationId}] Reloaded ${loadedSession.messages.length} messages from session context`,\n );\n }\n\n const resourceLoader = new DefaultResourceLoader({\n cwd: workspaceDir,\n agentDir: getAgentDir(),\n systemPrompt,\n });\n try {\n await resourceLoader.reload();\n const extResult = resourceLoader.getExtensions();\n if (extResult.errors.length > 0) {\n for (const err of extResult.errors) {\n log.logWarning(`[${conversationId}] Extension load error: ${err.path}`, err.error);\n }\n }\n log.logInfo(\n `[${conversationId}] Loaded ${extResult.extensions.length} extension(s): ${extResult.extensions.map((extension) => extension.path).join(\", \")}`,\n );\n } catch (error) {\n log.logWarning(`[${conversationId}] Failed to load resources`, String(error));\n }\n\n const baseToolsOverride = Object.fromEntries(tools.map((tool) => [tool.name, tool]));\n const session = new AgentSession({\n agent,\n sessionManager,\n settingsManager,\n cwd: runtimeWorkspaceRoot,\n modelRegistry,\n resourceLoader,\n baseToolsOverride,\n });\n return { agent, session };\n}\n\nfunction createEmptyUsageTotals() {\n return {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n };\n}\n\nfunction createRunState(): RunnerSessionState {\n return {\n responder: null,\n logCtx: null,\n queue: null,\n pendingTools: new Map<string, { toolName: string; args: unknown; startTime: number }>(),\n toolProgress: new Map<string, { label: string; status: \"running\" | \"done\" | \"error\" }>(),\n totalUsage: createEmptyUsageTotals(),\n llmCallCount: 0,\n stopReason: \"stop\",\n errorMessage: undefined,\n reportedLlmError: false,\n finalResponseHandledByTool: false,\n triggerAttribution: undefined,\n };\n}\n\nfunction resetRunState(\n runState: RunnerSessionState,\n responder: ConversationResponder,\n sessionConversation: string,\n userName: string | undefined,\n sessionUuid: string,\n triggerAttribution: string | undefined,\n): void {\n runState.responder = responder;\n runState.logCtx = {\n conversationId: sessionConversation,\n userName,\n conversationName: undefined,\n sessionId: sessionUuid,\n };\n runState.pendingTools.clear();\n runState.toolProgress.clear();\n runState.totalUsage = createEmptyUsageTotals();\n runState.llmCallCount = 0;\n runState.stopReason = \"stop\";\n runState.errorMessage = undefined;\n runState.reportedLlmError = false;\n runState.finalResponseHandledByTool = false;\n runState.triggerAttribution = triggerAttribution;\n}\n\nfunction createRunQueue(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n): {\n queue: { enqueue(fn: () => Promise<void>, errorContext: string): void };\n wait: () => Promise<void>;\n} {\n let queueChain = Promise.resolve();\n return {\n queue: {\n enqueue(fn: () => Promise<void>, errorContext: string): void {\n queueChain = queueChain.then(async () => {\n if (runState.finalResponseHandledByTool) return;\n try {\n await fn();\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n log.logWarning(`API error (${errorContext})`, errMsg);\n try {\n await responder.respondDiagnostic(`Error: ${errMsg}`, { style: \"error\" });\n } catch {\n // Ignore\n }\n }\n });\n },\n },\n wait: () => queueChain,\n };\n}\n\nfunction formatTimestampedUserMessage(message: ConversationMessage): string {\n const timestamp = formatLocalTimestamp(new Date())!;\n const threadContext = message.threadTs ? ` [in-thread:${message.threadTs}]` : \"\";\n return `[${timestamp}] [${message.userName || \"unknown\"}]${threadContext}: ${message.text}`;\n}\n\nfunction collectMessageAttachments(\n message: ConversationMessage,\n workspacePath: string,\n pathContext?: RuntimePathContext,\n): { imageAttachments: ImageContent[]; nonImagePaths: string[] } {\n const imageAttachments: ImageContent[] = [];\n const nonImagePaths: string[] = [];\n\n for (const attachment of message.attachments || []) {\n const runtimePath = `${workspacePath}/${attachment.localPath}`;\n const hostPath = pathContext?.runtimeToHostPath?.(runtimePath) ?? runtimePath;\n const mimeType = getImageMimeType(attachment.localPath);\n\n if (mimeType && existsSync(hostPath)) {\n try {\n imageAttachments.push({\n type: \"image\",\n mimeType,\n data: readFileSync(hostPath).toString(\"base64\"),\n });\n } catch {\n nonImagePaths.push(runtimePath);\n }\n } else {\n nonImagePaths.push(runtimePath);\n }\n }\n\n return { imageAttachments, nonImagePaths };\n}\n\nexport function buildPromptPayload(\n message: ConversationMessage,\n workspacePath: string,\n pathContext?: RuntimePathContext,\n): {\n userMessage: string;\n imageAttachments: ImageContent[];\n} {\n let userMessage = formatTimestampedUserMessage(message);\n const { imageAttachments, nonImagePaths } = collectMessageAttachments(\n message,\n workspacePath,\n pathContext,\n );\n\n if (nonImagePaths.length > 0) {\n userMessage += `\\n\\n<slack_attachments>\\n${nonImagePaths.join(\"\\n\")}\\n</slack_attachments>`;\n }\n\n return { userMessage, imageAttachments };\n}\n\nasync function writePromptDebugContext(\n conversationDir: string,\n systemPrompt: string,\n session: AgentSession,\n userMessage: string,\n imageAttachmentCount: number,\n): Promise<void> {\n const debugContext = {\n systemPrompt,\n messages: session.messages,\n newUserMessage: userMessage,\n imageAttachmentCount,\n };\n await writeFile(\n join(conversationDir, \"last_prompt.jsonl\"),\n JSON.stringify(debugContext, null, 2),\n );\n}\n\nfunction getFinalAssistantText(session: AgentSession): string {\n const lastAssistant = session.messages.findLast((message) => message.role === \"assistant\");\n return (\n lastAssistant?.content\n .filter((content): content is { type: \"text\"; text: string } => content.type === \"text\")\n .map((content) => content.text)\n .join(\"\\n\") || \"\"\n );\n}\n\nexport function appendTriggerAttribution(\n text: string,\n triggerAttribution: string | undefined,\n sessionLink?: string,\n): string {\n if (!triggerAttribution) return text;\n const trimmed = text.trimEnd();\n const legacySuffix = `_Triggered by ${triggerAttribution}_`;\n const suffix = sessionLink\n ? `_Triggered by ${triggerAttribution} · session: ${sessionLink}_`\n : legacySuffix;\n if (trimmed.endsWith(suffix)) return text;\n const body = trimmed.endsWith(legacySuffix)\n ? trimmed.slice(0, -legacySuffix.length).trimEnd()\n : trimmed;\n return `${body}\\n\\n${suffix}`;\n}\n\nfunction isEventTriggerAttribution(triggerAttribution: string | undefined): boolean {\n return triggerAttribution?.startsWith(\"[event:\") === true;\n}\n\nfunction extractToolLabel(toolName: string, args: unknown): string {\n const label = (args as { label?: unknown } | undefined)?.label;\n if (typeof label !== \"string\") return toolName;\n return label.trim() || toolName;\n}\n\nfunction formatToolProgress(runState: RunnerSessionState): string {\n const lines = Array.from(runState.toolProgress.values()).map((item) => {\n const marker = item.status === \"running\" ? \"•\" : item.status === \"error\" ? \"✗\" : \"✓\";\n return `${marker} ${item.label}`;\n });\n return lines.join(\"\\n\");\n}\n\nfunction formatResponseWithToolProgress(text: string, runState: RunnerSessionState): string {\n const progress = formatToolProgress(runState);\n return progress ? `${progress}\\n\\n${text}` : text;\n}\n\nasync function replaceResponseWithToolProgress(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n): Promise<void> {\n const progress = formatToolProgress(runState);\n if (progress) await responder.replaceResponse(progress);\n}\n\nasync function finalizeRunResponse(\n responder: ConversationResponder,\n session: AgentSession,\n runState: RunnerSessionState,\n options?: {\n triggerAttribution?: string;\n triggerSessionLink?: string;\n createOverflowLink?: () => string;\n platform?: string;\n model?: Model<Api>;\n sessionConversation?: string;\n sessionUuid?: string;\n },\n): Promise<void> {\n if (runState.stopReason === \"error\" && runState.errorMessage) {\n if (!runState.reportedLlmError) {\n runState.reportedLlmError = true;\n reportUserFacingError(new Error(\"LLM run completed with error stop reason\"), {\n domain: \"llm\",\n surface: \"assistant_response\",\n operation: \"llm_turn\",\n severity: \"error\",\n platform: options?.platform,\n provider: options?.model?.provider,\n model: options?.model?.name,\n stopReason: runState.stopReason,\n context: {\n sessionConversation: options?.sessionConversation,\n sessionUuid: options?.sessionUuid,\n hasErrorMessage: true,\n llmCallCount: runState.llmCallCount,\n },\n });\n }\n try {\n await responder.replaceResponse(\"_Sorry, something went wrong_\");\n await responder.respondDiagnostic(`Error: ${runState.errorMessage}`, {\n style: \"error\",\n });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n log.logWarning(\"Failed to post error message\", errMsg);\n reportUserFacingError(err, {\n domain: \"chat_platform\",\n surface: \"final_response\",\n operation: \"finalize_error_response\",\n severity: \"error\",\n platform: options?.platform,\n context: {\n sessionConversation: options?.sessionConversation,\n sessionUuid: options?.sessionUuid,\n stopReason: runState.stopReason,\n },\n });\n }\n return;\n }\n\n const finalText = getFinalAssistantText(session);\n if (runState.finalResponseHandledByTool) {\n log.logInfo(\"Final response already handled by tool - skipping final replacement\");\n return;\n }\n if (finalText.trim() === \"[SILENT]\" || finalText.trim().startsWith(\"[SILENT]\")) {\n try {\n await responder.deleteResponse();\n log.logInfo(\"Silent response - deleted message and thread\");\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n log.logWarning(\"Failed to delete message for silent response\", errMsg);\n }\n return;\n }\n\n if (!finalText.trim()) return;\n\n try {\n await responder.replaceResponse(\n appendTriggerAttribution(\n formatResponseWithToolProgress(finalText, runState),\n options?.triggerAttribution,\n options?.triggerSessionLink,\n ),\n { createOverflowLink: options?.createOverflowLink },\n );\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n log.logWarning(\"Failed to replace message with final text\", errMsg);\n reportUserFacingError(err, {\n domain: \"chat_platform\",\n surface: \"final_response\",\n operation: \"replace_final_response\",\n severity: \"error\",\n platform: options?.platform,\n context: {\n sessionConversation: options?.sessionConversation,\n sessionUuid: options?.sessionUuid,\n finalTextLength: finalText.length,\n },\n });\n }\n}\n\ninterface UsageReportContext {\n session: AgentSession;\n runState: RunnerSessionState;\n responder: ConversationResponder;\n platform: MessagingInfo;\n model: Model<Api>;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n sessionConversation: string;\n sessionUuid: string;\n waitForQueue: () => Promise<void>;\n}\n\nasync function reportUsageSummary(ctx: UsageReportContext): Promise<void> {\n const {\n session,\n runState,\n responder,\n platform,\n model,\n agentConfig,\n sessionConversation,\n sessionUuid,\n waitForQueue,\n } = ctx;\n const lastAssistantMessage = session.messages\n .slice()\n .toReversed()\n .find(\n (message): message is Extract<typeof message, { role: \"assistant\" }> =>\n message.role === \"assistant\" && message.stopReason !== \"aborted\",\n );\n\n const contextTokens = lastAssistantMessage\n ? lastAssistantMessage.usage.input +\n lastAssistantMessage.usage.output +\n lastAssistantMessage.usage.cacheRead +\n lastAssistantMessage.usage.cacheWrite\n : 0;\n const contextWindow = model.contextWindow || 200000;\n\n const { totalUsage } = runState;\n const runMetricAttributes = metricAttributes({\n provider: model.provider,\n model: agentConfig.model,\n channel_id: sessionConversation,\n session_id: sessionUuid,\n stop_reason: runState.stopReason,\n llm_calls: runState.llmCallCount,\n });\n Sentry.metrics.distribution(\"agent.run.tokens_in\", totalUsage.input, {\n attributes: runMetricAttributes,\n });\n Sentry.metrics.distribution(\"agent.run.tokens_out\", totalUsage.output, {\n attributes: runMetricAttributes,\n });\n Sentry.metrics.distribution(\"agent.run.cache_read\", totalUsage.cacheRead, {\n attributes: runMetricAttributes,\n });\n Sentry.metrics.distribution(\"agent.run.cache_write\", totalUsage.cacheWrite, {\n attributes: runMetricAttributes,\n });\n Sentry.metrics.distribution(\"agent.run.cost\", totalUsage.cost.total, {\n attributes: runMetricAttributes,\n });\n Sentry.metrics.gauge(\"agent.context.utilization\", contextTokens / contextWindow, {\n unit: \"ratio\",\n attributes: runMetricAttributes,\n });\n\n const summary = log.logUsageSummary(\n runState.logCtx!,\n runState.totalUsage,\n contextTokens,\n contextWindow,\n );\n if (platform.diagnostics?.showUsageSummary === true) {\n runState.queue!.enqueue(\n () => responder.respondDiagnostic(summary, { style: \"muted\" }),\n \"usage summary\",\n );\n await waitForQueue();\n }\n}\n\nfunction reloadSessionMessages(\n sessionManager: SessionManager,\n conversationId: string,\n agent: Agent,\n): void {\n const messages = sessionManager.buildSessionContext().messages;\n if (messages.length > 0) {\n agent.state.messages = messages;\n log.logInfo(`[${conversationId}] Reloaded ${messages.length} messages from context`);\n }\n}\n\nasync function prepareRunContext(params: {\n message: ConversationMessage;\n responder: ConversationResponder;\n platform: MessagingInfo;\n conversationId: string;\n conversationDir: string;\n sessionUuid: string;\n runState: RunnerSessionState;\n executor: Executor;\n executionResolver?: ActorExecutionResolver;\n resolveExecutorForRun: RunnerExecutionContext[\"resolveExecutorForRun\"];\n getPathContext: () => RuntimePathContext;\n sessionManager: SessionManager;\n session: AgentSession;\n agent: Agent;\n setEventContext: (context: {\n platform: string;\n conversationId: string;\n conversationKind: ConversationKind;\n userId: string;\n }) => void;\n setSandboxContext: (context: { conversationId: string; userId: string }) => void;\n setUploadFunction: (fn: (filePath: string, title?: string) => Promise<void>) => void;\n pathContext: RuntimePathContext;\n}): Promise<PreparedRunContext & { pathContext: RuntimePathContext }> {\n const {\n message,\n responder,\n platform,\n conversationId,\n conversationDir,\n sessionUuid,\n runState,\n executor,\n executionResolver,\n resolveExecutorForRun,\n getPathContext,\n sessionManager,\n session,\n agent,\n setEventContext,\n setSandboxContext,\n setUploadFunction,\n } = params;\n let pathContext = params.pathContext;\n const sessionConversation = message.sessionKey.split(\":\")[0];\n\n await mkdir(join(conversationDir, \"scratch\"), { recursive: true });\n\n if (executionResolver) {\n await resolveExecutorForRun({\n platform: platform.name,\n userId: message.userId,\n conversationId,\n });\n pathContext = getPathContext();\n }\n\n reloadSessionMessages(sessionManager, conversationId, agent);\n\n const memory = await getMemory(conversationDir);\n const skills = loadMikanSkills(conversationDir, pathContext.runtimeWorkspaceRoot);\n const triggerAttribution = resolveTriggerAttribution(message);\n const systemPrompt = buildSystemPrompt(\n pathContext.runtimeWorkspaceRoot,\n conversationId,\n message.conversationKind,\n message.userId,\n memory,\n executor.getSandboxConfig(),\n platform,\n skills,\n message.id.startsWith(\"event:\"),\n triggerAttribution,\n );\n session.agent.state.systemPrompt = systemPrompt;\n\n setEventContext({\n platform: platform.name,\n conversationId,\n conversationKind: message.conversationKind,\n userId: message.userId,\n });\n setSandboxContext({ conversationId, userId: message.userId });\n\n setUploadFunction(async (filePath: string, title?: string) => {\n const hostPath = translateAttachPathToHost(filePath, pathContext);\n await responder.uploadFile(hostPath, title);\n });\n\n resetRunState(\n runState,\n responder,\n sessionConversation,\n message.userName,\n sessionUuid,\n triggerAttribution,\n );\n const runQueue = createRunQueue(responder, runState);\n runState.queue = runQueue.queue;\n\n log.logInfo(\n `Context sizes - system: ${systemPrompt.length} chars, memory: ${memory.length} chars`,\n );\n log.logInfo(`Channels: ${platform.channels.length}, Users: ${platform.users.length}`);\n\n const { userMessage, imageAttachments } = buildPromptPayload(\n message,\n pathContext.runtimeWorkspaceRoot,\n pathContext,\n );\n await writePromptDebugContext(\n conversationDir,\n systemPrompt,\n session,\n userMessage,\n imageAttachments.length,\n );\n\n return {\n sessionConversation,\n runQueue,\n userMessage,\n imageAttachments,\n triggerAttribution,\n pathContext,\n };\n}\n\nfunction formatAgentActorName(userName: string | undefined, fallback: string): string {\n return userName ? `DM:${userName}` : fallback;\n}\n\nfunction sendAgentEvent(payload: {\n sessionId: string;\n actorName: string;\n event: AgentEventPayload;\n}): void {\n emitAgentEvent({ source: \"mikan\", ...payload });\n}\n\n// ponytail: additive SSE mirror only; keep responder rendering here until another frontend needs the same stream.\nfunction attachSessionEventHandlers(params: {\n session: AgentSession;\n runState: RunnerSessionState;\n model: Model<Api>;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n}): void {\n const { session, runState, model, agentConfig } = params;\n session.subscribe(async (event) => {\n if (!runState.responder || !runState.logCtx || !runState.queue) return;\n\n const { responder, logCtx, queue, pendingTools } = runState;\n const baseAttrs = { channel_id: logCtx.conversationId, session_id: logCtx.sessionId };\n const agentEventSessionId = logCtx.sessionId ?? logCtx.conversationId;\n\n if (event.type === \"tool_execution_start\") {\n const args = (event.args ?? {}) as { label?: string };\n const label = args.label || event.toolName;\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: {\n kind: \"toolStart\",\n toolId: event.toolCallId,\n toolName: event.toolName,\n input: { label },\n },\n });\n\n pendingTools.set(event.toolCallId, {\n toolName: event.toolName,\n args: event.args,\n startTime: Date.now(),\n });\n runState.toolProgress.set(event.toolCallId, {\n label: extractToolLabel(event.toolName, event.args),\n status: \"running\",\n });\n queue.enqueue(\n () => replaceResponseWithToolProgress(responder, runState),\n \"tool progress update\",\n );\n addLifecycleBreadcrumb(\"agent.tool.started\", {\n tool: event.toolName,\n ...baseAttrs,\n });\n\n log.logToolStart(logCtx, event.toolName, label, event.args as Record<string, unknown>);\n return;\n }\n\n if (event.type === \"tool_execution_end\") {\n const resultStr = extractToolResultText(event.result);\n const pending = pendingTools.get(event.toolCallId);\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: { kind: \"toolEnd\", toolId: event.toolCallId },\n });\n const progress = runState.toolProgress.get(event.toolCallId);\n if (progress) progress.status = event.isError ? \"error\" : \"done\";\n queue.enqueue(\n () => replaceResponseWithToolProgress(responder, runState),\n \"tool progress update\",\n );\n pendingTools.delete(event.toolCallId);\n const durationMs = pending ? Date.now() - pending.startTime : 0;\n\n Sentry.metrics.count(\"agent.tool.calls\", 1, {\n attributes: metricAttributes({\n tool: event.toolName,\n error: String(event.isError),\n ...baseAttrs,\n }),\n });\n Sentry.metrics.distribution(\"agent.tool.duration\", durationMs, {\n unit: \"millisecond\",\n attributes: metricAttributes({\n tool: event.toolName,\n ...baseAttrs,\n }),\n });\n addLifecycleBreadcrumb(\"agent.tool.completed\", {\n tool: event.toolName,\n error: event.isError,\n duration_ms: durationMs,\n ...baseAttrs,\n });\n\n if (event.isError) {\n log.logToolError(logCtx, event.toolName, durationMs, resultStr);\n } else {\n log.logToolSuccess(logCtx, event.toolName, durationMs, resultStr);\n }\n\n return;\n }\n\n if (event.type === \"message_start\") {\n if (event.message.role === \"assistant\") {\n runState.llmCallCount += 1;\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: { kind: \"sessionStart\" },\n });\n addLifecycleBreadcrumb(\"agent.llm.call.started\", {\n call_index: runState.llmCallCount,\n provider: model.provider,\n model: agentConfig.model,\n ...baseAttrs,\n });\n log.logResponseStart(logCtx);\n }\n return;\n }\n\n if (event.type === \"message_update\") {\n const assistantMessageEvent = (\n event as {\n assistantMessageEvent?: { type?: string; delta?: string };\n }\n ).assistantMessageEvent;\n if (assistantMessageEvent?.type === \"text_delta\" && assistantMessageEvent.delta) {\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: { kind: \"responseDelta\", delta: assistantMessageEvent.delta },\n });\n if (responder.appendResponseDelta) {\n queue.enqueue(async () => {\n await responder.appendResponseDelta?.(assistantMessageEvent.delta ?? \"\");\n }, \"response delta\");\n }\n }\n return;\n }\n\n if (event.type === \"message_end\") {\n if (event.message.role === \"assistant\") {\n const assistantMsg = event.message;\n\n if (assistantMsg.stopReason) {\n runState.stopReason = assistantMsg.stopReason;\n }\n if (assistantMsg.errorMessage) {\n runState.errorMessage = assistantMsg.errorMessage;\n }\n\n if (assistantMsg.usage) {\n runState.totalUsage.input += assistantMsg.usage.input;\n runState.totalUsage.output += assistantMsg.usage.output;\n runState.totalUsage.cacheRead += assistantMsg.usage.cacheRead;\n runState.totalUsage.cacheWrite += assistantMsg.usage.cacheWrite;\n runState.totalUsage.cost.input += assistantMsg.usage.cost.input;\n runState.totalUsage.cost.output += assistantMsg.usage.cost.output;\n runState.totalUsage.cost.cacheRead += assistantMsg.usage.cost.cacheRead;\n runState.totalUsage.cost.cacheWrite += assistantMsg.usage.cost.cacheWrite;\n runState.totalUsage.cost.total += assistantMsg.usage.cost.total;\n\n const llmAttributes = metricAttributes({\n provider: model.provider,\n model: agentConfig.model,\n ...baseAttrs,\n stop_reason: assistantMsg.stopReason,\n error: Boolean(assistantMsg.errorMessage),\n });\n Sentry.metrics.count(\"agent.llm.calls\", 1, { attributes: llmAttributes });\n Sentry.metrics.distribution(\"agent.llm.tokens_in\", assistantMsg.usage.input, {\n attributes: llmAttributes,\n });\n Sentry.metrics.distribution(\"agent.llm.tokens_out\", assistantMsg.usage.output, {\n attributes: llmAttributes,\n });\n if (assistantMsg.usage.cacheRead > 0) {\n Sentry.metrics.distribution(\"agent.llm.cache_read\", assistantMsg.usage.cacheRead, {\n attributes: llmAttributes,\n });\n }\n if (assistantMsg.usage.cacheWrite > 0) {\n Sentry.metrics.distribution(\"agent.llm.cache_write\", assistantMsg.usage.cacheWrite, {\n attributes: llmAttributes,\n });\n }\n Sentry.metrics.distribution(\"agent.llm.cost_per_turn\", assistantMsg.usage.cost.total, {\n attributes: llmAttributes,\n });\n addLifecycleBreadcrumb(\"agent.llm.call.completed\", {\n call_index: runState.llmCallCount,\n provider: model.provider,\n model: agentConfig.model,\n stop_reason: assistantMsg.stopReason,\n error: Boolean(assistantMsg.errorMessage),\n input_tokens: assistantMsg.usage.input,\n output_tokens: assistantMsg.usage.output,\n cost_total_usd: assistantMsg.usage.cost.total,\n });\n }\n\n const thinkingParts: string[] = [];\n const textParts: string[] = [];\n const hasToolCall = assistantMsg.content.some((part) =>\n [\"tool_use\", \"toolCall\", \"tool-call\"].includes((part as { type?: string }).type ?? \"\"),\n );\n for (const part of assistantMsg.content) {\n if (part.type === \"thinking\") {\n thinkingParts.push(part.thinking);\n } else if (part.type === \"text\") {\n textParts.push(part.text);\n }\n }\n\n const text = textParts.join(\"\\n\");\n\n for (const thinking of thinkingParts) {\n log.logThinking(logCtx, thinking);\n queue.enqueue(() => responder.respond(`_${thinking}_`), \"thinking main\");\n queue.enqueue(() => responder.respondDiagnostic(`_${thinking}_`), \"thinking diagnostic\");\n }\n\n if (text.trim() && !hasToolCall) {\n if (runState.finalResponseHandledByTool) return;\n const finalText = appendTriggerAttribution(\n formatResponseWithToolProgress(text, runState),\n runState.triggerAttribution,\n );\n log.logResponse(logCtx, text);\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: { kind: \"responseFinal\", text: finalText },\n });\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: { kind: \"turnEnd\" },\n });\n if (responder.finishResponse) {\n queue.enqueue(async () => {\n await responder.finishResponse?.(finalText);\n }, \"response finish\");\n } else {\n queue.enqueue(() => responder.respond(finalText), \"response main\");\n }\n }\n }\n return;\n }\n\n if (event.type === \"compaction_start\") {\n const text = \"_Compacting context..._\";\n log.logInfo(`Auto-compaction started (reason: ${event.reason})`);\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: { kind: \"diagnostic\", text },\n });\n queue.enqueue(() => responder.respond(text), \"compaction start\");\n return;\n }\n\n if (event.type === \"compaction_end\") {\n if (event.result) {\n log.logInfo(`Auto-compaction complete: ${event.result.tokensBefore} tokens compacted`);\n } else if (event.aborted) {\n log.logInfo(\"Auto-compaction aborted\");\n }\n return;\n }\n\n if (event.type === \"auto_retry_start\") {\n log.logWarning(`Retrying (${event.attempt}/${event.maxAttempts})`, event.errorMessage);\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: { kind: \"sessionStart\" },\n });\n const text = `_Retrying (${event.attempt}/${event.maxAttempts})..._`;\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: { kind: \"diagnostic\", text },\n });\n queue.enqueue(() => responder.respond(text), \"retry\");\n }\n });\n}\n\nfunction extractToolResultText(result: unknown): string {\n if (typeof result === \"string\") {\n return result;\n }\n\n if (\n result &&\n typeof result === \"object\" &&\n \"content\" in result &&\n Array.isArray((result as { content: unknown }).content)\n ) {\n const content = (result as { content: Array<{ type: string; text?: string }> }).content;\n const textParts: string[] = [];\n for (const part of content) {\n if (part.type === \"text\" && part.text) {\n textParts.push(part.text);\n }\n }\n if (textParts.length > 0) {\n return textParts.join(\"\\n\");\n }\n }\n\n return JSON.stringify(result);\n}\n\n/**\n * Create a new PiAgentWrapper for a channel.\n * Sets up the session and subscribes to events once.\n *\n * Runner caching is handled by the caller (channelStates in main.ts).\n * This is a stateless factory function.\n */\nexport async function createRunner(\n sandboxConfig: SandboxConfig,\n sessionKey: string,\n conversationId: string,\n conversationDir: string,\n workspaceDir: string,\n sessionScope: ResolvedSessionScope,\n vaultManager?: VaultManager,\n provisioner?: DockerContainerManager,\n sessionView?: {\n tokenStore: SessionViewTokenStoreLike;\n portalBaseUrl?: string;\n },\n): Promise<PiAgentWrapper> {\n const agentConfig = resolveConversationSettings(conversationDir);\n\n const workspaceBase = join(conversationDir, \"..\");\n const { executionResolver, executor, getPathContext, resolveExecutorForRun } =\n createRunnerExecutionContext(\n sandboxConfig,\n vaultManager,\n provisioner,\n workspaceDir,\n workspaceBase,\n );\n let pathContext = getUnresolvedSandboxPathContext(sandboxConfig, workspaceBase);\n\n // Create tools (per-runner, with per-runner upload function setter)\n const { tools, setUploadFunction, setEventContext, setSandboxContext } = createMikanTools(\n executor,\n workspaceDir,\n { sandbox: sandboxConfig, provisioner },\n );\n\n const authStorage = AuthStorage.create(join(homedir(), \".pi\", \"mikan\", \"auth.json\"));\n const modelRegistry = ModelRegistry.create(authStorage);\n const model = resolveConfiguredModel(modelRegistry, agentConfig.provider, agentConfig.model);\n\n // Initial system prompt (will be updated each run with fresh memory/channels/users/skills)\n const memory = await getMemory(conversationDir);\n const skills = loadMikanSkills(conversationDir, pathContext.runtimeWorkspaceRoot);\n const emptyPlatform: MessagingInfo = {\n name: \"chat\",\n formattingGuide: \"\",\n channels: [],\n users: [],\n };\n const systemPrompt = buildSystemPrompt(\n pathContext.runtimeWorkspaceRoot,\n conversationId,\n \"shared\",\n undefined,\n memory,\n sandboxConfig,\n emptyPlatform,\n skills,\n );\n\n // Create session manager and settings manager. Top-level/private sessions\n // use the conversation's current pointer; scoped sessions use fixed files.\n // Platform-specific scope behavior is resolved before runner creation.\n const isThread = sessionKey.includes(\":\");\n const { sessionDir, contextFile, threadRootMessage } = sessionScope;\n const sessionManager = openManagedSession(\n contextFile,\n sessionDir,\n pathContext.runtimeWorkspaceRoot,\n );\n const threadSessionName = buildThreadSessionName(threadRootMessage);\n if (isThread && threadSessionName && sessionManager.getSessionName() !== threadSessionName) {\n sessionManager.appendSessionInfo(threadSessionName);\n }\n\n const sessionUuid = extractSessionUuid(contextFile);\n const chatSessionManager = new AgentMemoryFileManager();\n const settingsManager = SettingsManager.inMemory();\n const { agent, session } = await createConfiguredAgentSession({\n conversationId,\n workspaceDir,\n runtimeWorkspaceRoot: pathContext.runtimeWorkspaceRoot,\n systemPrompt,\n model,\n thinkingLevel: agentConfig.thinkingLevel,\n tools,\n sessionManager,\n settingsManager,\n modelRegistry,\n });\n\n // Mutable per-run state - event handler references this\n const runState = createRunState();\n attachSessionEventHandlers({ session, runState, model, agentConfig });\n\n return {\n syncChatHistory(currentMessageId?: string): void {\n chatSessionManager.syncSessionManager({\n conversationDir,\n sessionKey,\n sessionManager,\n currentMessageId,\n });\n },\n\n async run(\n message: ConversationMessage,\n responder: ConversationResponder,\n platform: MessagingInfo,\n ): Promise<{ stopReason: string; errorMessage?: string }> {\n const prepared = await prepareRunContext({\n message,\n responder,\n platform,\n conversationId,\n conversationDir,\n sessionUuid,\n runState,\n executor,\n executionResolver,\n resolveExecutorForRun,\n getPathContext,\n sessionManager,\n session,\n agent,\n setEventContext,\n setSandboxContext,\n setUploadFunction,\n pathContext,\n });\n pathContext = prepared.pathContext;\n\n if (runState.logCtx) {\n log.logAgentRunStart(runState.logCtx, model.provider, model.id, model.name);\n }\n\n updateActiveSpanAttribution({\n provider: model.provider,\n model: agentConfig.model,\n channel_id: prepared.sessionConversation,\n session_id: sessionUuid,\n });\n addLifecycleBreadcrumb(\"agent.prompt.sent\", {\n provider: model.provider,\n model: agentConfig.model,\n channel_id: prepared.sessionConversation,\n session_id: sessionUuid,\n attachment_count: message.attachments?.length ?? 0,\n image_attachment_count: prepared.imageAttachments.length,\n });\n sendAgentEvent({\n sessionId: sessionUuid,\n actorName: formatAgentActorName(message.userName, prepared.sessionConversation),\n event: { kind: \"sessionStart\" },\n });\n\n await session.prompt(\n prepared.userMessage,\n prepared.imageAttachments.length > 0 ? { images: prepared.imageAttachments } : undefined,\n );\n\n // Wait for queued messages\n await prepared.runQueue.wait();\n\n const sessionViewTokenStore = sessionView?.tokenStore;\n const sessionViewPortalBaseUrl = sessionView?.portalBaseUrl;\n let sessionViewLink: string | undefined;\n const createSessionViewLink =\n sessionViewTokenStore && sessionViewPortalBaseUrl\n ? () => {\n if (!sessionViewLink) {\n const token = sessionViewTokenStore.create(\n platform.name as PlatformName,\n message.userId,\n conversationId,\n message.sessionKey,\n contextFile,\n message.userName,\n );\n sessionViewLink = `${sessionViewPortalBaseUrl}/session?token=${token.token}`;\n }\n return sessionViewLink;\n }\n : undefined;\n\n await finalizeRunResponse(responder, session, runState, {\n triggerAttribution: prepared.triggerAttribution,\n triggerSessionLink: isEventTriggerAttribution(prepared.triggerAttribution)\n ? createSessionViewLink?.()\n : undefined,\n createOverflowLink: createSessionViewLink,\n platform: platform.name,\n model,\n sessionConversation: prepared.sessionConversation,\n sessionUuid,\n });\n\n await reportUsageSummary({\n session,\n runState,\n responder,\n platform,\n model,\n agentConfig,\n sessionConversation: prepared.sessionConversation,\n sessionUuid,\n waitForQueue: () => prepared.runQueue.wait(),\n });\n\n // Clear run state\n runState.responder = null;\n runState.logCtx = null;\n runState.queue = null;\n\n return { stopReason: runState.stopReason, errorMessage: runState.errorMessage };\n },\n\n abort(): void {\n session.abort();\n },\n\n getCurrentStep(): { toolName?: string; label?: string } | undefined {\n const pending = runState.pendingTools;\n if (pending.size === 0) return undefined;\n // Get the first pending tool\n const first = pending.values().next().value;\n if (!first) return undefined;\n return {\n toolName: first.toolName,\n label: (first.args as { label?: string })?.label,\n };\n },\n };\n}\n\nexport function translateRuntimePathToHost(\n runtimePath: string,\n pathContext: RuntimePathContext,\n): string {\n return pathContext.runtimeToHostPath?.(runtimePath) ?? runtimePath;\n}\n\nexport function translateAttachPathToHost(\n filePath: string,\n pathContext: RuntimePathContext,\n): string {\n const runtimePath = posix.isAbsolute(filePath)\n ? filePath\n : posix.join(pathContext.runtimeWorkspaceRoot, filePath);\n return translateRuntimePathToHost(runtimePath, pathContext);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { type Api, type ImageContent, type Model } from \"@earendil-works/pi-ai\";\nimport {\n DEFAULT_EVENT_BUDGET,\n defaultExtensionDirs,\n type ExtensionHostServices,\n type ExtensionSchedulePayload,\n formatSkillsForPrompt,\n loadExtensions,\n loadSkillsFromDir,\n MikanAgentSession,\n MikanModels,\n type MikanSkill,\n type SessionStore,\n} from \"./harness/index.js\";\nimport { createHash } from \"crypto\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { mkdir, readFile, writeFile } from \"fs/promises\";\nimport { join, posix } from \"path\";\nimport type {\n ConversationMessage,\n ConversationResponder,\n ConversationKind,\n MessagingInfo,\n PlatformName,\n} from \"./adapter.js\";\nimport type { AgentEventPayload, MikanEvent, PlatformNotifier } from \"./types.js\";\nimport type { SessionViewTokenStoreLike } from \"./commands/types.js\";\nimport { resolveConversationSettings } from \"./config.js\";\nimport { readEnv } from \"./utils/env.js\";\nimport { ActorExecutionResolver } from \"./execution-resolver.js\";\nimport * as log from \"./log.js\";\nimport { reportUserFacingError } from \"./observability/sentry.js\";\nimport type { DockerContainerManager } from \"./provisioner.js\";\nimport {\n createExecutor,\n type Executor,\n type RuntimePathContext,\n type SandboxConfig,\n} from \"./sandbox/index.js\";\nimport { createMountedRuntimePathContext } from \"./sandbox/path-context.js\";\nimport {\n addLifecycleBreadcrumb,\n metricAttributes,\n updateActiveSpanAttribution,\n} from \"./observability/sentry.js\";\nimport type { VaultManager } from \"./vault/index.js\";\nimport { AgentMemoryFileManager } from \"./sessions/agent-memory-file-manager.js\";\nimport {\n extractSessionUuid,\n openManagedSession,\n type ResolvedSessionScope,\n type ThreadRootMessage,\n} from \"./sessions/store.js\";\nimport { HostEventStore } from \"./tools/event.js\";\nimport { createMikanTools } from \"./tools/index.js\";\nimport * as Sentry from \"@sentry/node\";\nimport { formatLocalTimestamp } from \"./utils/date.js\";\nimport { resolveConfiguredModel } from \"./model-registry.js\";\nimport { emitAgentEvent } from \"./agent-events.js\";\n\nexport type { PiAgentWrapper } from \"./types.js\";\nimport type { PiAgentWrapper } from \"./types.js\";\n\nconst IMAGE_MIME_TYPES: Record<string, string> = {\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n};\n\nfunction getImageMimeType(filename: string): string | undefined {\n return IMAGE_MIME_TYPES[filename.toLowerCase().split(\".\").pop() || \"\"];\n}\n\nfunction buildThreadSessionName(message: ThreadRootMessage | null): string | undefined {\n const text = message?.text?.trim();\n if (!text) return undefined;\n const userLabel = message?.userName || message?.user || \"unknown\";\n return `[${userLabel}]: ${text}`;\n}\n\nasync function getMemory(conversationDir: string): Promise<string> {\n const parts: string[] = [];\n\n // Read workspace-level memory (shared across all conversations)\n const workspaceMemoryPath = join(conversationDir, \"..\", \"MEMORY.md\");\n if (existsSync(workspaceMemoryPath)) {\n try {\n const content = (await readFile(workspaceMemoryPath, \"utf-8\")).trim();\n if (content) {\n parts.push(`### Global Workspace Memory\\n${content}`);\n }\n } catch (error) {\n log.logWarning(\"Failed to read workspace memory\", `${workspaceMemoryPath}: ${error}`);\n }\n }\n\n // Read conversation-specific memory\n const conversationMemoryPath = join(conversationDir, \"MEMORY.md\");\n if (existsSync(conversationMemoryPath)) {\n try {\n const content = (await readFile(conversationMemoryPath, \"utf-8\")).trim();\n if (content) {\n parts.push(`### Conversation-Specific Memory\\n${content}`);\n }\n } catch (error) {\n log.logWarning(\"Failed to read conversation memory\", `${conversationMemoryPath}: ${error}`);\n }\n }\n\n if (parts.length === 0) {\n return \"(no working memory yet)\";\n }\n\n return parts.join(\"\\n\\n\");\n}\n\nfunction loadMikanSkills(conversationDir: string, workspacePath: string): MikanSkill[] {\n const skillMap = new Map<string, MikanSkill>();\n\n // conversationDir is the host path (e.g., /Users/.../data/C0A34FL8PMH)\n // hostWorkspacePath is the parent directory on host\n // workspacePath is the container path (e.g., /workspace)\n const hostWorkspacePath = join(conversationDir, \"..\");\n\n // Helper to translate host paths to container paths\n const translatePath = (hostPath: string): string => {\n if (hostPath.startsWith(hostWorkspacePath)) {\n return workspacePath + hostPath.slice(hostWorkspacePath.length);\n }\n return hostPath;\n };\n\n // Load workspace-level skills (global)\n const workspaceSkillsDir = join(hostWorkspacePath, \"skills\");\n for (const skill of loadSkillsFromDir({ dir: workspaceSkillsDir, source: \"workspace\" }).skills) {\n // Translate paths to container paths for system prompt\n skill.filePath = translatePath(skill.filePath);\n skill.baseDir = translatePath(skill.baseDir);\n skillMap.set(skill.name, skill);\n }\n\n // Load conversation-specific skills (override workspace skills on collision)\n const conversationSkillsDir = join(conversationDir, \"skills\");\n for (const skill of loadSkillsFromDir({ dir: conversationSkillsDir, source: \"channel\" }).skills) {\n skill.filePath = translatePath(skill.filePath);\n skill.baseDir = translatePath(skill.baseDir);\n skillMap.set(skill.name, skill);\n }\n\n return Array.from(skillMap.values());\n}\n\nfunction buildRuntimePaths(runtimeWorkspaceRoot: string, conversationId: string) {\n const workspaceRoot = runtimeWorkspaceRoot.replace(/\\/+$/, \"\") || \"/\";\n const conversationPath = posix.join(workspaceRoot, conversationId);\n return {\n workspaceRoot,\n conversationPath,\n scratchPath: posix.join(conversationPath, \"scratch\"),\n };\n}\n\nfunction buildEnvDescription(sandboxType: SandboxConfig[\"type\"], workspaceRoot: string): string {\n switch (sandboxType) {\n case \"image\":\n return `You are running inside a managed per-user container.\n- Runtime workspace root: ${workspaceRoot}\n- Bash commands start in: ${workspaceRoot}\n- Install tools with the image's package manager\n- Your changes persist for this user's container until it is recreated`;\n case \"container\":\n return `You are running inside a shared container.\n- Runtime workspace root: ${workspaceRoot}\n- Bash commands start in: ${workspaceRoot}\n- Install tools with the container's package manager\n- Your changes persist across sessions`;\n case \"firecracker\":\n return `You are running inside a Firecracker microVM.\n- Runtime workspace root: ${workspaceRoot}\n- Use cd or absolute paths; project files are under ${workspaceRoot}\n- Install tools with: apt-get install <package> (Debian-based)\n- Your changes persist across sessions`;\n case \"cloudflare\":\n return `You are running through a Cloudflare Sandbox bridge.\n- Runtime workspace root: ${workspaceRoot}\n- Bash commands start in: ${workspaceRoot}\n- Your commands run in a remote container managed by Cloudflare\n- Important: the remote filesystem is not automatically synced back to the host workspace`;\n default:\n return `You are running directly on the host machine.\n- Runtime workspace root: ${workspaceRoot}\n- Bash commands start in: ${process.cwd()}\n- Be careful with system modifications`;\n }\n}\n\nexport function resolveTriggerAttribution(\n message: Pick<ConversationMessage, \"id\" | \"text\" | \"userName\">,\n): string | undefined {\n const eventTextMatch = message.text.match(/^\\[EVENT:([^:]+):/);\n if (eventTextMatch) return `[event: ${eventTextMatch[1]}]`;\n const eventIdMatch = message.id.match(/^event:([^:]+)/);\n if (eventIdMatch) return `[event: ${eventIdMatch[1]}]`;\n if (message.userName) return `@${message.userName}`;\n return undefined;\n}\n\nfunction buildSystemPrompt(\n workspacePath: string,\n conversationId: string,\n conversationKind: ConversationKind,\n currentUserId: string | undefined,\n memory: string,\n sandboxConfig: SandboxConfig,\n platform: MessagingInfo,\n skills: MikanSkill[],\n): string {\n const { workspaceRoot, conversationPath, scratchPath } = buildRuntimePaths(\n workspacePath,\n conversationId,\n );\n const sandboxType = sandboxConfig.type;\n const isContainerLike = sandboxType === \"container\" || sandboxType === \"image\";\n const isFirecracker = sandboxType === \"firecracker\";\n\n // Format channel mappings\n const channelMappings =\n platform.channels.length > 0\n ? platform.channels.map((c) => `${c.id}\\t#${c.name}`).join(\"\\n\")\n : \"(no channels loaded)\";\n\n // Format user mappings\n const userMappings =\n platform.users.length > 0\n ? platform.users.map((u) => `${u.id}\\t@${u.userName}\\t${u.displayName}`).join(\"\\n\")\n : \"(no users loaded)\";\n\n const envDescription = buildEnvDescription(sandboxType, workspaceRoot);\n // Per-turn instructions (event-trigger mode, attribution) are delivered with\n // the user message via buildTurnInstructions(), not baked in here, so this\n // system prompt stays byte-stable across a conversation's turns and keeps the\n // provider prompt cache warm (a changing system prefix invalidates the cache\n // for the whole request, including the far larger conversation history).\n const slackBlockKitInstructions =\n platform.name === \"slack\"\n ? `\n## Slack Rendering\n- The Slack adapter renders responses with Block Kit automatically. Answer normally using Slack mrkdwn.\n- Do not emit markdown pipe tables; Slack does not render them as tables. Prefer short sections or bullet lists.\n`\n : \"\";\n\n return `You are mikan, a ${platform.name} bot assistant. Be concise. No emojis.\n\n## Context\n- For current date/time, use: date\n- You have access to previous conversation context including tool results from prior turns.\n- For older human-readable history beyond your context, search \\`log.jsonl\\` (contains user messages and your final responses, but not tool results).\n- Structured session history with tool results lives in \\`${conversationPath}/sessions/\\`.\n- The active top-level session is selected by \\`${conversationPath}/sessions/current\\`, which points to a timestamped \\`.jsonl\\` file in the same directory.\n- Scoped/thread sessions use fixed files at \\`${conversationPath}/sessions/<scope_id>.jsonl\\` (for example \\`${conversationPath}/sessions/1777386320.800769.jsonl\\`).\n- If a user asks about something that should exist in conversation history but is not found in the current context window, do not answer \"I don't know\" or \"I don't have that\". Instead, search the thread session, top-level session, and \\`log.jsonl\\` before responding.\n- User messages include a \\`[in-thread:TS]\\` marker when sent from within a platform thread/reply (TS is the thread or parent message identifier). Without this marker, the message is a top-level conversation message.\n${platform.formattingGuide}${slackBlockKitInstructions}\n\n## Platform IDs\nChannels: ${channelMappings}\n\nUsers: ${userMappings}\n\nWhen mentioning users, use <@username> format (e.g., <@mario>).\n\n## Environment\n${envDescription}\n- Default place for clones, downloads, and experiments: ${scratchPath}\n- Do not use host-only paths unless you are running in host mode and verified they exist.\n\n## Workspace Layout\n${workspaceRoot}/\n├── MEMORY.md # Global memory (all conversations)\n├── skills/ # Global CLI tools you create\n└── ${conversationId}/ # This conversation\n ├── MEMORY.md # Conversation-specific memory\n ├── log.jsonl # Human-readable message history (no tool results)\n ├── sessions/ # Structured session history used for context reconstruction\n │ ├── current # Active top-level session pointer\n │ ├── <timestamp>_<id>.jsonl # Top-level session files\n │ └── <scope_id>.jsonl # Scoped thread/reply session files\n ├── attachments/ # User-shared files\n ├── scratch/ # Working directory for clones/downloads/experiments: ${scratchPath}\n └── skills/ # Conversation-specific tools\n\n## Skills (Custom CLI Tools)\nYou can create reusable CLI tools for recurring tasks (email, APIs, data processing, etc.).\n\n### Creating Skills\nStore in \\`${workspaceRoot}/skills/<name>/\\` (global) or \\`${conversationPath}/skills/<name>/\\` (conversation-specific).\nEach skill directory needs a \\`SKILL.md\\` with YAML frontmatter:\n\n\\`\\`\\`markdown\n---\nname: skill-name\ndescription: Short description of what this skill does\n---\n\n# Skill Name\n\nUsage instructions, examples, etc.\nScripts are in: {baseDir}/\n\\`\\`\\`\n\n\\`name\\` and \\`description\\` are required. Use \\`{baseDir}\\` as placeholder for the skill's directory path.\n\n### Available Skills\n${skills.length > 0 ? formatSkillsForPrompt(skills) : \"(no skills installed yet)\"}\n\n## Events\nUse the \\`event\\` tool to schedule immediate, one-shot, or periodic follow-ups. It writes to the host-side mikan control plane and fills routing fields for the current conversation automatically.\n\nWrite event \\`text\\` as a self-contained future task with needed context, tone, and constraints because events do not inherit normal conversation history.\n\nFor one-shot reminders, include a timezone offset in \\`at\\`. For periodic events, use a cron schedule plus IANA timezone; assume ${Intl.DateTimeFormat().resolvedOptions().timeZone} when users omit timezone.\n\nWhen events trigger, messages are prefixed like \\`[EVENT:filename:type:time]\\`. Immediate and one-shot events auto-delete after triggering; periodic events persist until deleted.\n\nFor periodic events where there's nothing to report, respond with exactly \\`[SILENT]\\`. Debounce external triggers; prefer one summarized event over many.\n\n## Memory\nWrite to MEMORY.md files to persist context across conversations.\n- Global (${workspaceRoot}/MEMORY.md): skills, preferences, project info\n- Conversation (${conversationPath}/MEMORY.md): conversation-specific decisions, ongoing work\nUpdate when you learn something important or when asked to remember something.\n\n### Current Memory\n${memory}\n\n## System Configuration Log\nMaintain ${workspaceRoot}/SYSTEM.md to log all environment modifications:\n- Installed packages (apt install, npm install, uv pip install)\n- Environment variables set\n- Config files modified (~/.gitconfig, cron jobs, etc.)\n- Skill dependencies installed\n\nUpdate this file whenever you modify the environment. On fresh container, read it first to restore your setup.\n\n## Log Queries (for older history)\nFormat: \\`{\"date\":\"...\",\"ts\":\"...\",\"user\":\"...\",\"userName\":\"...\",\"text\":\"...\",\"isMessagingBot\":false}\\`\nThe log contains user messages and your final responses (not tool calls/results).\nUse \\`log.jsonl\\` for quick grep-style history. Use \\`${conversationPath}/sessions/\\` when you need structured turns, tool outputs, or thread/session lineage.\n${isContainerLike || isFirecracker ? \"Install jq: apt-get install jq\" : \"\"}\n\\`\\`\\`bash\n# Recent messages\ntail -30 log.jsonl | jq -c '{date: .date[0:19], user: (.userName // .user), text}'\n\n# Search for specific topic\ngrep -i \"topic\" log.jsonl | jq -c '{date: .date[0:19], user: (.userName // .user), text}'\n\n# Messages from specific user\ngrep '\"userName\":\"mario\"' log.jsonl | tail -20 | jq -c '{date: .date[0:19], text}'\n\n# Inspect top-level session pointer and available session files\ncat sessions/current\nls -1 sessions/\n\\`\\`\\`\n\n## Tools\n- bash: Run shell commands (primary tool). Install packages as needed.\n- read: Read files\n- write: Create/overwrite files\n- edit: Surgical file edits\n- event: Schedule immediate, one-shot, or periodic follow-ups\n- sandbox: Inspect or temporarily adjust sandbox limits\n- attach: Share files to the platform\n\nEach tool requires a \"label\" parameter (shown to user).\n`;\n}\n\n/**\n * Instructions that vary per turn (event-trigger mode, response attribution).\n * These are delivered with the user message rather than baked into the system\n * prompt, so the system prompt stays cache-stable across a conversation's turns\n * (in a multi-user channel the attribution line alone changes every turn).\n * Returns an empty string when the turn needs no special framing.\n */\nexport function buildTurnInstructions(\n isEventTrigger: boolean,\n triggerAttribution: string | undefined,\n platformName: string,\n): string {\n const parts: string[] = [];\n if (isEventTrigger) {\n parts.push(`## Event Trigger Mode\n- You are handling a scheduled/background event, not opening a brand new chat with a stranger.\n- Treat the incoming user message as a self-contained task prepared by an earlier run.\n- Complete the task directly. Avoid generic greetings, self-introductions, or boilerplate offers to help.\n- For reminders/follow-ups, prefer a short direct response that sounds like a continuation of prior intent.\n- If the event text includes tone, brevity, or language instructions, follow them literally.`);\n }\n if (triggerAttribution) {\n parts.push(`## Attribution\nAlways end your final ${platformName} response and any GitHub issue/PR comments or descriptions you write via tools with:\n_Triggered by ${triggerAttribution}_\n\nDo not add this to \\`[SILENT]\\` responses.`);\n }\n return parts.join(\"\\n\\n\");\n}\n\nexport function getUnresolvedSandboxPathContext(\n sandboxConfig: SandboxConfig,\n hostWorkspaceRoot: string,\n): RuntimePathContext {\n if (sandboxConfig.type === \"image\") {\n return createMountedRuntimePathContext(hostWorkspaceRoot, \"/workspace\");\n }\n\n return createExecutor(sandboxConfig).getPathContext(hostWorkspaceRoot);\n}\n\ninterface RunnerExecutionContext {\n executionResolver?: ActorExecutionResolver;\n executor: Executor;\n getPathContext: () => RuntimePathContext;\n resolveExecutorForRun(context: {\n platform: string;\n userId: string;\n conversationId: string;\n }): Promise<void>;\n}\n\ninterface RunnerSessionState {\n responder: ConversationResponder | null;\n logCtx: {\n conversationId: string;\n userName?: string;\n conversationName?: string;\n sessionId?: string;\n } | null;\n queue: {\n enqueue(fn: () => Promise<void>, errorContext: string): void;\n } | null;\n pendingTools: Map<string, { toolName: string; args: unknown; startTime: number }>;\n toolProgress: Map<string, { label: string; status: \"running\" | \"done\" | \"error\" }>;\n totalUsage: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: { input: number; output: number; cacheRead: number; cacheWrite: number; total: number };\n };\n llmCallCount: number;\n stopReason: string;\n errorMessage: string | undefined;\n reportedLlmError: boolean;\n finalResponseHandledByTool: boolean;\n triggerAttribution?: string;\n}\n\ninterface PreparedRunContext {\n sessionConversation: string;\n runQueue: ReturnType<typeof createRunQueue>;\n userMessage: string;\n imageAttachments: ImageContent[];\n triggerAttribution?: string;\n}\n\ninterface ConfiguredAgentSession {\n session: MikanAgentSession;\n /** Skills contributed by extensions, merged into each run's system prompt. */\n extensionSkills: MikanSkill[];\n}\n\nfunction createRunnerExecutionContext(\n sandboxConfig: SandboxConfig,\n vaultManager: VaultManager | undefined,\n provisioner: DockerContainerManager | undefined,\n workspaceDir: string,\n hostWorkspacePath: string,\n): RunnerExecutionContext {\n const executionResolver =\n vaultManager && sandboxConfig.type !== \"host\"\n ? new ActorExecutionResolver(sandboxConfig, vaultManager, provisioner, workspaceDir)\n : undefined;\n\n // activeExecutor is replaced at the start of each run() call when executionResolver\n // is present, so the stable `executor` wrapper always delegates to the latest resolved value.\n let activeExecutor: Executor =\n executionResolver !== undefined\n ? createExecutor({ type: \"host\" })\n : createExecutor(sandboxConfig);\n const executor: Executor = {\n exec(command, options) {\n return activeExecutor.exec(command, options);\n },\n getWorkspacePath(hostPath) {\n return activeExecutor.getWorkspacePath(hostPath);\n },\n getSandboxConfig() {\n return activeExecutor.getSandboxConfig();\n },\n getPathContext(hostWorkspaceRoot) {\n return activeExecutor.getPathContext(hostWorkspaceRoot);\n },\n };\n\n return {\n executionResolver,\n executor,\n getPathContext: () => executor.getPathContext(hostWorkspacePath),\n async resolveExecutorForRun(context): Promise<void> {\n if (!executionResolver) return;\n activeExecutor = await executionResolver.resolve(context);\n },\n };\n}\n\n/**\n * Extension host services over mikan's runtime infrastructure: schedules\n * become event files under `<workspaceDir>/events` (picked up live by\n * EventsWatcher), secrets come from `vaults/extensions/<slug>/env`, and\n * notify posts through the platform bots when main.ts provides a notifier.\n */\nfunction buildExtensionHostServices(params: {\n workspaceDir: string;\n vaultManager?: VaultManager;\n platformNotifier?: PlatformNotifier;\n}): ExtensionHostServices {\n const { workspaceDir, vaultManager, platformNotifier } = params;\n const eventStore = HostEventStore.fromWorkspaceDir(workspaceDir);\n return {\n stateDir: readEnv(\"STATE_DIR\"),\n scheduleStore: {\n write: async (filename, payload) => {\n // Event files tolerate a missing platform (single-platform default),\n // so the harness payload is a valid event payload as written.\n await eventStore.write(filename, payload as unknown as MikanEvent);\n },\n delete: async (filename) => (await eventStore.delete(filename)).deleted,\n list: async () =>\n (await eventStore.list()).map((entry) => ({\n filename: entry.filename,\n payload: entry.payload as unknown as ExtensionSchedulePayload,\n })),\n },\n ...(platformNotifier ? { postMessage: platformNotifier } : {}),\n ...(vaultManager\n ? {\n resolveSecrets: (slug: string) => vaultManager.resolve(`extensions/${slug}`)?.env ?? {},\n }\n : {}),\n };\n}\n\n/**\n * Local (workspace/conversation) skills override extension skills on name\n * collision: an admin's on-disk skill always beats an extension's.\n */\nfunction mergeExtensionSkills(local: MikanSkill[], extension: MikanSkill[]): MikanSkill[] {\n if (extension.length === 0) return local;\n const byName = new Map<string, MikanSkill>();\n for (const skill of extension) byName.set(skill.name, skill);\n for (const skill of local) byName.set(skill.name, skill);\n return [...byName.values()];\n}\n\nasync function createConfiguredAgentSession(params: {\n conversationId: string;\n workspaceDir: string;\n systemPrompt: string;\n model: Model<Api>;\n thinkingLevel: ThinkingLevel;\n tools: Awaited<ReturnType<typeof createMikanTools>>[\"tools\"];\n sessionStore: SessionStore;\n models: MikanModels;\n vaultManager?: VaultManager;\n platformNotifier?: PlatformNotifier;\n}): Promise<ConfiguredAgentSession> {\n const {\n conversationId,\n workspaceDir,\n systemPrompt,\n model,\n thinkingLevel,\n tools,\n sessionStore,\n models,\n vaultManager,\n platformNotifier,\n } = params;\n\n // Host-only dirs under the state dir: extension code runs in the mikan\n // process, so it must never load from workspace paths — those are mounted\n // into sandbox containers and agent-writable (sandbox escape otherwise).\n const extensionsResult = await loadExtensions({\n dirs: defaultExtensionDirs(conversationId, readEnv(\"STATE_DIR\")),\n context: { conversationId, workspaceDir, model, thinkingLevel },\n services: buildExtensionHostServices({ workspaceDir, vaultManager, platformNotifier }),\n });\n for (const err of extensionsResult.errors) {\n log.logWarning(`[${conversationId}] Extension load error: ${err.path}`, err.error);\n }\n if (extensionsResult.extensions.length > 0) {\n log.logInfo(\n `[${conversationId}] Loaded ${extensionsResult.extensions.length} extension(s): ${extensionsResult.extensions.map((extension) => extension.name).join(\", \")}`,\n );\n }\n\n const session = new MikanAgentSession({\n systemPrompt,\n model,\n thinkingLevel,\n tools,\n models,\n sessionStore,\n extensions: extensionsResult.registry,\n });\n\n const reloaded = session.reloadFromSession();\n if (reloaded > 0) {\n log.logInfo(`[${conversationId}] Reloaded ${reloaded} messages from session context`);\n }\n return { session, extensionSkills: extensionsResult.skills };\n}\n\nfunction createEmptyUsageTotals() {\n return {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n };\n}\n\nfunction createRunState(): RunnerSessionState {\n return {\n responder: null,\n logCtx: null,\n queue: null,\n pendingTools: new Map<string, { toolName: string; args: unknown; startTime: number }>(),\n toolProgress: new Map<string, { label: string; status: \"running\" | \"done\" | \"error\" }>(),\n totalUsage: createEmptyUsageTotals(),\n llmCallCount: 0,\n stopReason: \"stop\",\n errorMessage: undefined,\n reportedLlmError: false,\n finalResponseHandledByTool: false,\n triggerAttribution: undefined,\n };\n}\n\nfunction resetRunState(\n runState: RunnerSessionState,\n responder: ConversationResponder,\n sessionConversation: string,\n userName: string | undefined,\n sessionUuid: string,\n triggerAttribution: string | undefined,\n): void {\n runState.responder = responder;\n runState.logCtx = {\n conversationId: sessionConversation,\n userName,\n conversationName: undefined,\n sessionId: sessionUuid,\n };\n runState.pendingTools.clear();\n runState.toolProgress.clear();\n runState.totalUsage = createEmptyUsageTotals();\n runState.llmCallCount = 0;\n runState.stopReason = \"stop\";\n runState.errorMessage = undefined;\n runState.reportedLlmError = false;\n runState.finalResponseHandledByTool = false;\n runState.triggerAttribution = triggerAttribution;\n}\n\nfunction createRunQueue(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n): {\n queue: { enqueue(fn: () => Promise<void>, errorContext: string): void };\n wait: () => Promise<void>;\n} {\n let queueChain = Promise.resolve();\n return {\n queue: {\n enqueue(fn: () => Promise<void>, errorContext: string): void {\n queueChain = queueChain.then(async () => {\n if (runState.finalResponseHandledByTool) return;\n try {\n await fn();\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n log.logWarning(`API error (${errorContext})`, errMsg);\n try {\n await responder.respondDiagnostic(`Error: ${errMsg}`, { style: \"error\" });\n } catch {\n // Ignore\n }\n }\n });\n },\n },\n wait: () => queueChain,\n };\n}\n\nfunction formatTimestampedUserMessage(message: ConversationMessage): string {\n const timestamp = formatLocalTimestamp(new Date())!;\n const threadContext = message.threadTs ? ` [in-thread:${message.threadTs}]` : \"\";\n return `[${timestamp}] [${message.userName || \"unknown\"}]${threadContext}: ${message.text}`;\n}\n\nfunction collectMessageAttachments(\n message: ConversationMessage,\n workspacePath: string,\n pathContext?: RuntimePathContext,\n): { imageAttachments: ImageContent[]; nonImagePaths: string[] } {\n const imageAttachments: ImageContent[] = [];\n const nonImagePaths: string[] = [];\n\n for (const attachment of message.attachments || []) {\n const runtimePath = `${workspacePath}/${attachment.localPath}`;\n const hostPath = pathContext?.runtimeToHostPath?.(runtimePath) ?? runtimePath;\n const mimeType = getImageMimeType(attachment.localPath);\n\n if (mimeType && existsSync(hostPath)) {\n try {\n imageAttachments.push({\n type: \"image\",\n mimeType,\n data: readFileSync(hostPath).toString(\"base64\"),\n });\n } catch {\n nonImagePaths.push(runtimePath);\n }\n } else {\n nonImagePaths.push(runtimePath);\n }\n }\n\n return { imageAttachments, nonImagePaths };\n}\n\nexport function buildPromptPayload(\n message: ConversationMessage,\n workspacePath: string,\n pathContext?: RuntimePathContext,\n): {\n userMessage: string;\n imageAttachments: ImageContent[];\n} {\n let userMessage = formatTimestampedUserMessage(message);\n const { imageAttachments, nonImagePaths } = collectMessageAttachments(\n message,\n workspacePath,\n pathContext,\n );\n\n if (nonImagePaths.length > 0) {\n userMessage += `\\n\\n<slack_attachments>\\n${nonImagePaths.join(\"\\n\")}\\n</slack_attachments>`;\n }\n\n return { userMessage, imageAttachments };\n}\n\nasync function writePromptDebugContext(\n conversationDir: string,\n systemPrompt: string,\n session: MikanAgentSession,\n userMessage: string,\n imageAttachmentCount: number,\n): Promise<void> {\n const debugContext = {\n systemPrompt,\n messages: session.messages,\n newUserMessage: userMessage,\n imageAttachmentCount,\n };\n await writeFile(\n join(conversationDir, \"last_prompt.jsonl\"),\n JSON.stringify(debugContext, null, 2),\n );\n}\n\nfunction getFinalAssistantText(session: MikanAgentSession): string {\n const lastAssistant = session.messages.findLast((message) => message.role === \"assistant\");\n return (\n lastAssistant?.content\n .filter((content): content is { type: \"text\"; text: string } => content.type === \"text\")\n .map((content) => content.text)\n .join(\"\\n\") || \"\"\n );\n}\n\nexport function appendTriggerAttribution(\n text: string,\n triggerAttribution: string | undefined,\n sessionLink?: string,\n): string {\n if (!triggerAttribution) return text;\n const trimmed = text.trimEnd();\n const legacySuffix = `_Triggered by ${triggerAttribution}_`;\n const suffix = sessionLink\n ? `_Triggered by ${triggerAttribution} · session: ${sessionLink}_`\n : legacySuffix;\n if (trimmed.endsWith(suffix)) return text;\n const body = trimmed.endsWith(legacySuffix)\n ? trimmed.slice(0, -legacySuffix.length).trimEnd()\n : trimmed;\n return `${body}\\n\\n${suffix}`;\n}\n\nfunction isEventTriggerAttribution(triggerAttribution: string | undefined): boolean {\n return triggerAttribution?.startsWith(\"[event:\") === true;\n}\n\nfunction extractToolLabel(toolName: string, args: unknown): string {\n const label = (args as { label?: unknown } | undefined)?.label;\n if (typeof label !== \"string\") return toolName;\n return label.trim() || toolName;\n}\n\nfunction formatToolProgress(runState: RunnerSessionState): string {\n const lines = Array.from(runState.toolProgress.values()).map((item) => {\n const marker = item.status === \"running\" ? \"•\" : item.status === \"error\" ? \"✗\" : \"✓\";\n return `${marker} ${item.label}`;\n });\n return lines.join(\"\\n\");\n}\n\nfunction formatResponseWithToolProgress(text: string, runState: RunnerSessionState): string {\n const progress = formatToolProgress(runState);\n return progress ? `${progress}\\n\\n${text}` : text;\n}\n\nasync function replaceResponseWithToolProgress(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n): Promise<void> {\n const progress = formatToolProgress(runState);\n if (progress) await responder.replaceResponse(progress);\n}\n\nasync function finalizeRunResponse(\n responder: ConversationResponder,\n session: MikanAgentSession,\n runState: RunnerSessionState,\n options?: {\n triggerAttribution?: string;\n triggerSessionLink?: string;\n createOverflowLink?: () => string;\n platform?: string;\n model?: Model<Api>;\n sessionConversation?: string;\n sessionUuid?: string;\n },\n): Promise<void> {\n if (runState.stopReason === \"error\" && runState.errorMessage) {\n if (!runState.reportedLlmError) {\n runState.reportedLlmError = true;\n reportUserFacingError(new Error(\"LLM run completed with error stop reason\"), {\n domain: \"llm\",\n surface: \"assistant_response\",\n operation: \"llm_turn\",\n severity: \"error\",\n platform: options?.platform,\n provider: options?.model?.provider,\n model: options?.model?.name,\n stopReason: runState.stopReason,\n context: {\n sessionConversation: options?.sessionConversation,\n sessionUuid: options?.sessionUuid,\n hasErrorMessage: true,\n llmCallCount: runState.llmCallCount,\n },\n });\n }\n try {\n await responder.replaceResponse(\"_Sorry, something went wrong_\");\n await responder.respondDiagnostic(`Error: ${runState.errorMessage}`, {\n style: \"error\",\n });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n log.logWarning(\"Failed to post error message\", errMsg);\n reportUserFacingError(err, {\n domain: \"chat_platform\",\n surface: \"final_response\",\n operation: \"finalize_error_response\",\n severity: \"error\",\n platform: options?.platform,\n context: {\n sessionConversation: options?.sessionConversation,\n sessionUuid: options?.sessionUuid,\n stopReason: runState.stopReason,\n },\n });\n }\n return;\n }\n\n const finalText = getFinalAssistantText(session);\n if (runState.finalResponseHandledByTool) {\n log.logInfo(\"Final response already handled by tool - skipping final replacement\");\n return;\n }\n if (finalText.trim() === \"[SILENT]\" || finalText.trim().startsWith(\"[SILENT]\")) {\n try {\n await responder.deleteResponse();\n log.logInfo(\"Silent response - deleted message and thread\");\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n log.logWarning(\"Failed to delete message for silent response\", errMsg);\n }\n return;\n }\n\n if (!finalText.trim()) return;\n\n try {\n await responder.replaceResponse(\n appendTriggerAttribution(\n formatResponseWithToolProgress(finalText, runState),\n options?.triggerAttribution,\n options?.triggerSessionLink,\n ),\n { createOverflowLink: options?.createOverflowLink },\n );\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n log.logWarning(\"Failed to replace message with final text\", errMsg);\n reportUserFacingError(err, {\n domain: \"chat_platform\",\n surface: \"final_response\",\n operation: \"replace_final_response\",\n severity: \"error\",\n platform: options?.platform,\n context: {\n sessionConversation: options?.sessionConversation,\n sessionUuid: options?.sessionUuid,\n finalTextLength: finalText.length,\n },\n });\n }\n}\n\ninterface UsageReportContext {\n session: MikanAgentSession;\n runState: RunnerSessionState;\n responder: ConversationResponder;\n platform: MessagingInfo;\n model: Model<Api>;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n sessionConversation: string;\n sessionUuid: string;\n waitForQueue: () => Promise<void>;\n}\n\nasync function reportUsageSummary(ctx: UsageReportContext): Promise<void> {\n const {\n session,\n runState,\n responder,\n platform,\n model,\n agentConfig,\n sessionConversation,\n sessionUuid,\n waitForQueue,\n } = ctx;\n const lastAssistantMessage = session.messages\n .slice()\n .toReversed()\n .find(\n (message): message is Extract<typeof message, { role: \"assistant\" }> =>\n message.role === \"assistant\" && message.stopReason !== \"aborted\",\n );\n\n const contextTokens = lastAssistantMessage\n ? lastAssistantMessage.usage.input +\n lastAssistantMessage.usage.output +\n lastAssistantMessage.usage.cacheRead +\n lastAssistantMessage.usage.cacheWrite\n : 0;\n const contextWindow = model.contextWindow || 200000;\n\n const { totalUsage } = runState;\n const runMetricAttributes = metricAttributes({\n provider: model.provider,\n model: agentConfig.model,\n channel_id: sessionConversation,\n session_id: sessionUuid,\n stop_reason: runState.stopReason,\n llm_calls: runState.llmCallCount,\n });\n Sentry.metrics.distribution(\"agent.run.tokens_in\", totalUsage.input, {\n attributes: runMetricAttributes,\n });\n Sentry.metrics.distribution(\"agent.run.tokens_out\", totalUsage.output, {\n attributes: runMetricAttributes,\n });\n Sentry.metrics.distribution(\"agent.run.cache_read\", totalUsage.cacheRead, {\n attributes: runMetricAttributes,\n });\n Sentry.metrics.distribution(\"agent.run.cache_write\", totalUsage.cacheWrite, {\n attributes: runMetricAttributes,\n });\n Sentry.metrics.distribution(\"agent.run.cost\", totalUsage.cost.total, {\n attributes: runMetricAttributes,\n });\n Sentry.metrics.gauge(\"agent.context.utilization\", contextTokens / contextWindow, {\n unit: \"ratio\",\n attributes: runMetricAttributes,\n });\n\n const summary = log.logUsageSummary(\n runState.logCtx!,\n runState.totalUsage,\n contextTokens,\n contextWindow,\n );\n if (platform.diagnostics?.showUsageSummary === true) {\n runState.queue!.enqueue(\n () => responder.respondDiagnostic(summary, { style: \"muted\" }),\n \"usage summary\",\n );\n await waitForQueue();\n }\n}\n\nfunction reloadSessionMessages(session: MikanAgentSession, conversationId: string): void {\n const reloaded = session.reloadFromSession();\n if (reloaded > 0) {\n log.logInfo(`[${conversationId}] Reloaded ${reloaded} messages from context`);\n }\n}\n\nasync function prepareRunContext(params: {\n message: ConversationMessage;\n responder: ConversationResponder;\n platform: MessagingInfo;\n conversationId: string;\n conversationDir: string;\n sessionUuid: string;\n runState: RunnerSessionState;\n executor: Executor;\n executionResolver?: ActorExecutionResolver;\n resolveExecutorForRun: RunnerExecutionContext[\"resolveExecutorForRun\"];\n getPathContext: () => RuntimePathContext;\n session: MikanAgentSession;\n extensionSkills?: MikanSkill[];\n setEventContext: (context: {\n platform: string;\n conversationId: string;\n conversationKind: ConversationKind;\n userId: string;\n }) => void;\n setSandboxContext: (context: { conversationId: string; userId: string }) => void;\n setUploadFunction: (fn: (filePath: string, title?: string) => Promise<void>) => void;\n pathContext: RuntimePathContext;\n}): Promise<PreparedRunContext & { pathContext: RuntimePathContext }> {\n const {\n message,\n responder,\n platform,\n conversationId,\n conversationDir,\n sessionUuid,\n runState,\n executor,\n executionResolver,\n resolveExecutorForRun,\n getPathContext,\n session,\n setEventContext,\n setSandboxContext,\n setUploadFunction,\n } = params;\n let pathContext = params.pathContext;\n const sessionConversation = message.sessionKey.split(\":\")[0];\n\n await mkdir(join(conversationDir, \"scratch\"), { recursive: true });\n\n if (executionResolver) {\n await resolveExecutorForRun({\n platform: platform.name,\n userId: message.userId,\n conversationId,\n });\n pathContext = getPathContext();\n }\n\n reloadSessionMessages(session, conversationId);\n\n const memory = await getMemory(conversationDir);\n const skills = mergeExtensionSkills(\n loadMikanSkills(conversationDir, pathContext.runtimeWorkspaceRoot),\n params.extensionSkills ?? [],\n );\n const triggerAttribution = resolveTriggerAttribution(message);\n const systemPrompt = buildSystemPrompt(\n pathContext.runtimeWorkspaceRoot,\n conversationId,\n message.conversationKind,\n message.userId,\n memory,\n executor.getSandboxConfig(),\n platform,\n skills,\n );\n session.agent.state.systemPrompt = systemPrompt;\n // Cache diagnosis: a byte-stable system prompt is the precondition for\n // provider prompt caching. If this hash changes between turns of one\n // conversation, something turn-varying leaked into the prompt; if it is\n // stable and cacheRead stays 0, the miss is provider-side (e.g. OpenRouter\n // routing the model across upstream hosts).\n const promptHash = createHash(\"sha256\").update(systemPrompt).digest(\"hex\").slice(0, 8);\n log.logInfo(`[${conversationId}] System prompt: ${systemPrompt.length} chars, sha ${promptHash}`);\n\n setEventContext({\n platform: platform.name,\n conversationId,\n conversationKind: message.conversationKind,\n userId: message.userId,\n });\n setSandboxContext({ conversationId, userId: message.userId });\n\n setUploadFunction(async (filePath: string, title?: string) => {\n const hostPath = translateAttachPathToHost(filePath, pathContext);\n await responder.uploadFile(hostPath, title);\n });\n\n resetRunState(\n runState,\n responder,\n sessionConversation,\n message.userName,\n sessionUuid,\n triggerAttribution,\n );\n const runQueue = createRunQueue(responder, runState);\n runState.queue = runQueue.queue;\n\n log.logInfo(\n `Context sizes - system: ${systemPrompt.length} chars, memory: ${memory.length} chars`,\n );\n log.logInfo(`Channels: ${platform.channels.length}, Users: ${platform.users.length}`);\n\n const { userMessage, imageAttachments } = buildPromptPayload(\n message,\n pathContext.runtimeWorkspaceRoot,\n pathContext,\n );\n const turnInstructions = buildTurnInstructions(\n message.id.startsWith(\"event:\"),\n triggerAttribution,\n platform.name,\n );\n const finalUserMessage = turnInstructions ? `${turnInstructions}\\n\\n${userMessage}` : userMessage;\n await writePromptDebugContext(\n conversationDir,\n systemPrompt,\n session,\n finalUserMessage,\n imageAttachments.length,\n );\n\n return {\n sessionConversation,\n runQueue,\n userMessage: finalUserMessage,\n imageAttachments,\n triggerAttribution,\n pathContext,\n };\n}\n\nfunction formatAgentActorName(userName: string | undefined, fallback: string): string {\n return userName ? `DM:${userName}` : fallback;\n}\n\nfunction sendAgentEvent(payload: {\n sessionId: string;\n actorName: string;\n event: AgentEventPayload;\n}): void {\n emitAgentEvent({ source: \"mikan\", ...payload });\n}\n\n// ponytail: additive SSE mirror only; keep responder rendering here until another frontend needs the same stream.\nfunction attachSessionEventHandlers(params: {\n session: MikanAgentSession;\n runState: RunnerSessionState;\n model: Model<Api>;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n}): void {\n const { session, runState, model, agentConfig } = params;\n session.subscribe(async (event) => {\n if (!runState.responder || !runState.logCtx || !runState.queue) return;\n\n const { responder, logCtx, queue, pendingTools } = runState;\n const baseAttrs = { channel_id: logCtx.conversationId, session_id: logCtx.sessionId };\n const agentEventSessionId = logCtx.sessionId ?? logCtx.conversationId;\n\n if (event.type === \"tool_execution_start\") {\n const args = (event.args ?? {}) as { label?: string };\n const label = args.label || event.toolName;\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: {\n kind: \"toolStart\",\n toolId: event.toolCallId,\n toolName: event.toolName,\n input: { label },\n },\n });\n\n pendingTools.set(event.toolCallId, {\n toolName: event.toolName,\n args: event.args,\n startTime: Date.now(),\n });\n runState.toolProgress.set(event.toolCallId, {\n label: extractToolLabel(event.toolName, event.args),\n status: \"running\",\n });\n queue.enqueue(\n () => replaceResponseWithToolProgress(responder, runState),\n \"tool progress update\",\n );\n addLifecycleBreadcrumb(\"agent.tool.started\", {\n tool: event.toolName,\n ...baseAttrs,\n });\n\n log.logToolStart(logCtx, event.toolName, label, event.args as Record<string, unknown>);\n return;\n }\n\n if (event.type === \"tool_execution_end\") {\n const resultStr = extractToolResultText(event.result);\n const pending = pendingTools.get(event.toolCallId);\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: { kind: \"toolEnd\", toolId: event.toolCallId },\n });\n const progress = runState.toolProgress.get(event.toolCallId);\n if (progress) progress.status = event.isError ? \"error\" : \"done\";\n queue.enqueue(\n () => replaceResponseWithToolProgress(responder, runState),\n \"tool progress update\",\n );\n pendingTools.delete(event.toolCallId);\n const durationMs = pending ? Date.now() - pending.startTime : 0;\n\n Sentry.metrics.count(\"agent.tool.calls\", 1, {\n attributes: metricAttributes({\n tool: event.toolName,\n error: String(event.isError),\n ...baseAttrs,\n }),\n });\n Sentry.metrics.distribution(\"agent.tool.duration\", durationMs, {\n unit: \"millisecond\",\n attributes: metricAttributes({\n tool: event.toolName,\n ...baseAttrs,\n }),\n });\n addLifecycleBreadcrumb(\"agent.tool.completed\", {\n tool: event.toolName,\n error: event.isError,\n duration_ms: durationMs,\n ...baseAttrs,\n });\n\n if (event.isError) {\n log.logToolError(logCtx, event.toolName, durationMs, resultStr);\n } else {\n log.logToolSuccess(logCtx, event.toolName, durationMs, resultStr);\n }\n\n return;\n }\n\n if (event.type === \"message_start\") {\n if (event.message.role === \"assistant\") {\n runState.llmCallCount += 1;\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: { kind: \"sessionStart\" },\n });\n addLifecycleBreadcrumb(\"agent.llm.call.started\", {\n call_index: runState.llmCallCount,\n provider: model.provider,\n model: agentConfig.model,\n ...baseAttrs,\n });\n log.logResponseStart(logCtx);\n }\n return;\n }\n\n if (event.type === \"message_update\") {\n const assistantMessageEvent = (\n event as {\n assistantMessageEvent?: { type?: string; delta?: string };\n }\n ).assistantMessageEvent;\n if (assistantMessageEvent?.type === \"text_delta\" && assistantMessageEvent.delta) {\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: { kind: \"responseDelta\", delta: assistantMessageEvent.delta },\n });\n if (responder.appendResponseDelta) {\n queue.enqueue(async () => {\n await responder.appendResponseDelta?.(assistantMessageEvent.delta ?? \"\");\n }, \"response delta\");\n }\n }\n return;\n }\n\n if (event.type === \"message_end\") {\n if (event.message.role === \"assistant\") {\n const assistantMsg = event.message;\n\n if (assistantMsg.stopReason) {\n runState.stopReason = assistantMsg.stopReason;\n }\n if (assistantMsg.errorMessage) {\n runState.errorMessage = assistantMsg.errorMessage;\n }\n\n if (assistantMsg.usage) {\n runState.totalUsage.input += assistantMsg.usage.input;\n runState.totalUsage.output += assistantMsg.usage.output;\n runState.totalUsage.cacheRead += assistantMsg.usage.cacheRead;\n runState.totalUsage.cacheWrite += assistantMsg.usage.cacheWrite;\n runState.totalUsage.cost.input += assistantMsg.usage.cost.input;\n runState.totalUsage.cost.output += assistantMsg.usage.cost.output;\n runState.totalUsage.cost.cacheRead += assistantMsg.usage.cost.cacheRead;\n runState.totalUsage.cost.cacheWrite += assistantMsg.usage.cost.cacheWrite;\n runState.totalUsage.cost.total += assistantMsg.usage.cost.total;\n\n const llmAttributes = metricAttributes({\n provider: model.provider,\n model: agentConfig.model,\n ...baseAttrs,\n stop_reason: assistantMsg.stopReason,\n error: Boolean(assistantMsg.errorMessage),\n });\n Sentry.metrics.count(\"agent.llm.calls\", 1, { attributes: llmAttributes });\n Sentry.metrics.distribution(\"agent.llm.tokens_in\", assistantMsg.usage.input, {\n attributes: llmAttributes,\n });\n Sentry.metrics.distribution(\"agent.llm.tokens_out\", assistantMsg.usage.output, {\n attributes: llmAttributes,\n });\n if (assistantMsg.usage.cacheRead > 0) {\n Sentry.metrics.distribution(\"agent.llm.cache_read\", assistantMsg.usage.cacheRead, {\n attributes: llmAttributes,\n });\n }\n if (assistantMsg.usage.cacheWrite > 0) {\n Sentry.metrics.distribution(\"agent.llm.cache_write\", assistantMsg.usage.cacheWrite, {\n attributes: llmAttributes,\n });\n }\n Sentry.metrics.distribution(\"agent.llm.cost_per_turn\", assistantMsg.usage.cost.total, {\n attributes: llmAttributes,\n });\n addLifecycleBreadcrumb(\"agent.llm.call.completed\", {\n call_index: runState.llmCallCount,\n provider: model.provider,\n model: agentConfig.model,\n stop_reason: assistantMsg.stopReason,\n error: Boolean(assistantMsg.errorMessage),\n input_tokens: assistantMsg.usage.input,\n output_tokens: assistantMsg.usage.output,\n cost_total_usd: assistantMsg.usage.cost.total,\n });\n }\n\n const thinkingParts: string[] = [];\n const textParts: string[] = [];\n const hasToolCall = assistantMsg.content.some((part) =>\n [\"tool_use\", \"toolCall\", \"tool-call\"].includes((part as { type?: string }).type ?? \"\"),\n );\n for (const part of assistantMsg.content) {\n if (part.type === \"thinking\") {\n thinkingParts.push(part.thinking);\n } else if (part.type === \"text\") {\n textParts.push(part.text);\n }\n }\n\n const text = textParts.join(\"\\n\");\n\n for (const thinking of thinkingParts) {\n log.logThinking(logCtx, thinking);\n queue.enqueue(() => responder.respond(`_${thinking}_`), \"thinking main\");\n queue.enqueue(() => responder.respondDiagnostic(`_${thinking}_`), \"thinking diagnostic\");\n }\n\n if (text.trim() && !hasToolCall) {\n if (runState.finalResponseHandledByTool) return;\n const finalText = appendTriggerAttribution(\n formatResponseWithToolProgress(text, runState),\n runState.triggerAttribution,\n );\n log.logResponse(logCtx, text);\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: { kind: \"responseFinal\", text: finalText },\n });\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: { kind: \"turnEnd\" },\n });\n if (responder.finishResponse) {\n queue.enqueue(async () => {\n await responder.finishResponse?.(finalText);\n }, \"response finish\");\n } else {\n queue.enqueue(() => responder.respond(finalText), \"response main\");\n }\n }\n }\n return;\n }\n\n if (event.type === \"compaction_start\") {\n const text = \"_Compacting context..._\";\n log.logInfo(`Auto-compaction started (reason: ${event.reason})`);\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: { kind: \"diagnostic\", text },\n });\n queue.enqueue(() => responder.respond(text), \"compaction start\");\n return;\n }\n\n if (event.type === \"compaction_end\") {\n if (event.result) {\n log.logInfo(`Auto-compaction complete: ${event.result.tokensBefore} tokens compacted`);\n } else if (event.aborted) {\n log.logInfo(\"Auto-compaction aborted\");\n }\n return;\n }\n\n if (event.type === \"auto_retry_start\") {\n log.logWarning(`Retrying (${event.attempt}/${event.maxAttempts})`, event.errorMessage);\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: { kind: \"sessionStart\" },\n });\n const text = `_Retrying (${event.attempt}/${event.maxAttempts})..._`;\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: { kind: \"diagnostic\", text },\n });\n queue.enqueue(() => responder.respond(text), \"retry\");\n }\n\n if (event.type === \"budget_exceeded\") {\n log.logWarning(\n \"Run stopped by budget circuit breaker\",\n `${event.reason} (tokens=${event.tokens}, cost=${event.costUsd.toFixed(2)}, calls=${event.llmCalls}, ${event.durationMs}ms)`,\n );\n const text = `_Stopped: run budget exceeded (${event.reason})_`;\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: { kind: \"diagnostic\", text },\n });\n queue.enqueue(() => responder.respondDiagnostic(text, { style: \"error\" }), \"budget exceeded\");\n }\n });\n}\n\nfunction extractToolResultText(result: unknown): string {\n if (typeof result === \"string\") {\n return result;\n }\n\n if (\n result &&\n typeof result === \"object\" &&\n \"content\" in result &&\n Array.isArray((result as { content: unknown }).content)\n ) {\n const content = (result as { content: Array<{ type: string; text?: string }> }).content;\n const textParts: string[] = [];\n for (const part of content) {\n if (part.type === \"text\" && part.text) {\n textParts.push(part.text);\n }\n }\n if (textParts.length > 0) {\n return textParts.join(\"\\n\");\n }\n }\n\n return JSON.stringify(result);\n}\n\n/**\n * Create a new PiAgentWrapper for a channel.\n * Sets up the session and subscribes to events once.\n *\n * Runner caching is handled by the caller (channelStates in main.ts).\n * This is a stateless factory function.\n */\nexport async function createRunner(\n sandboxConfig: SandboxConfig,\n sessionKey: string,\n conversationId: string,\n conversationDir: string,\n workspaceDir: string,\n sessionScope: ResolvedSessionScope,\n vaultManager?: VaultManager,\n provisioner?: DockerContainerManager,\n sessionView?: {\n tokenStore: SessionViewTokenStoreLike;\n portalBaseUrl?: string;\n },\n platformNotifier?: PlatformNotifier,\n): Promise<PiAgentWrapper> {\n const agentConfig = resolveConversationSettings(conversationDir);\n\n const workspaceBase = join(conversationDir, \"..\");\n const { executionResolver, executor, getPathContext, resolveExecutorForRun } =\n createRunnerExecutionContext(\n sandboxConfig,\n vaultManager,\n provisioner,\n workspaceDir,\n workspaceBase,\n );\n let pathContext = getUnresolvedSandboxPathContext(sandboxConfig, workspaceBase);\n\n // Create tools (per-runner, with per-runner upload function setter)\n const { tools, setUploadFunction, setEventContext, setSandboxContext } = createMikanTools(\n executor,\n workspaceDir,\n { sandbox: sandboxConfig, provisioner },\n );\n\n const modelRegistry = MikanModels.create();\n if (modelRegistry.getError()) {\n log.logWarning(\"models.json load error\", modelRegistry.getError()!);\n }\n const model = resolveConfiguredModel(modelRegistry, agentConfig.provider, agentConfig.model);\n\n // Initial system prompt (will be updated each run with fresh memory/channels/users/skills)\n const memory = await getMemory(conversationDir);\n const skills = loadMikanSkills(conversationDir, pathContext.runtimeWorkspaceRoot);\n const emptyPlatform: MessagingInfo = {\n name: \"chat\",\n formattingGuide: \"\",\n channels: [],\n users: [],\n };\n const systemPrompt = buildSystemPrompt(\n pathContext.runtimeWorkspaceRoot,\n conversationId,\n \"shared\",\n undefined,\n memory,\n sandboxConfig,\n emptyPlatform,\n skills,\n );\n\n // Create session manager and settings manager. Top-level/private sessions\n // use the conversation's current pointer; scoped sessions use fixed files.\n // Platform-specific scope behavior is resolved before runner creation.\n const isThread = sessionKey.includes(\":\");\n const { contextFile, threadRootMessage } = sessionScope;\n const sessionManager = openManagedSession(contextFile, pathContext.runtimeWorkspaceRoot);\n const threadSessionName = buildThreadSessionName(threadRootMessage);\n if (isThread && threadSessionName && sessionManager.getSessionName() !== threadSessionName) {\n sessionManager.appendSessionInfo(threadSessionName);\n }\n\n const sessionUuid = extractSessionUuid(contextFile);\n const chatSessionManager = new AgentMemoryFileManager();\n const { session, extensionSkills } = await createConfiguredAgentSession({\n conversationId,\n workspaceDir,\n systemPrompt,\n model,\n thinkingLevel: agentConfig.thinkingLevel,\n tools,\n sessionStore: sessionManager,\n models: modelRegistry,\n vaultManager,\n platformNotifier,\n });\n\n // Mutable per-run state - event handler references this\n const runState = createRunState();\n attachSessionEventHandlers({ session, runState, model, agentConfig });\n\n return {\n syncChatHistory(currentMessageId?: string): void {\n chatSessionManager.syncSessionManager({\n conversationDir,\n sessionKey,\n sessionManager,\n currentMessageId,\n });\n },\n\n async run(\n message: ConversationMessage,\n responder: ConversationResponder,\n platform: MessagingInfo,\n ): Promise<{ stopReason: string; errorMessage?: string }> {\n const prepared = await prepareRunContext({\n message,\n responder,\n platform,\n conversationId,\n conversationDir,\n sessionUuid,\n runState,\n executor,\n executionResolver,\n resolveExecutorForRun,\n getPathContext,\n session,\n extensionSkills,\n setEventContext,\n setSandboxContext,\n setUploadFunction,\n pathContext,\n });\n pathContext = prepared.pathContext;\n\n if (runState.logCtx) {\n log.logAgentRunStart(runState.logCtx, model.provider, model.id, model.name);\n }\n\n updateActiveSpanAttribution({\n provider: model.provider,\n model: agentConfig.model,\n channel_id: prepared.sessionConversation,\n session_id: sessionUuid,\n });\n addLifecycleBreadcrumb(\"agent.prompt.sent\", {\n provider: model.provider,\n model: agentConfig.model,\n channel_id: prepared.sessionConversation,\n session_id: sessionUuid,\n attachment_count: message.attachments?.length ?? 0,\n image_attachment_count: prepared.imageAttachments.length,\n });\n sendAgentEvent({\n sessionId: sessionUuid,\n actorName: formatAgentActorName(message.userName, prepared.sessionConversation),\n event: { kind: \"sessionStart\" },\n });\n\n // Autonomous (event/trigger) runs get an explicit resource ceiling since\n // no human is watching the loop; interactive turns stay human-gated.\n const isEventRun = message.id.startsWith(\"event:\");\n await session.prompt(prepared.userMessage, {\n ...(prepared.imageAttachments.length > 0 ? { images: prepared.imageAttachments } : {}),\n ...(isEventRun ? { budget: DEFAULT_EVENT_BUDGET } : {}),\n });\n\n // Wait for queued messages\n await prepared.runQueue.wait();\n\n const sessionViewTokenStore = sessionView?.tokenStore;\n const sessionViewPortalBaseUrl = sessionView?.portalBaseUrl;\n let sessionViewLink: string | undefined;\n const createSessionViewLink =\n sessionViewTokenStore && sessionViewPortalBaseUrl\n ? () => {\n if (!sessionViewLink) {\n const token = sessionViewTokenStore.create(\n platform.name as PlatformName,\n message.userId,\n conversationId,\n message.sessionKey,\n contextFile,\n message.userName,\n );\n sessionViewLink = `${sessionViewPortalBaseUrl}/session?token=${token.token}`;\n }\n return sessionViewLink;\n }\n : undefined;\n\n await finalizeRunResponse(responder, session, runState, {\n triggerAttribution: prepared.triggerAttribution,\n triggerSessionLink: isEventTriggerAttribution(prepared.triggerAttribution)\n ? createSessionViewLink?.()\n : undefined,\n createOverflowLink: createSessionViewLink,\n platform: platform.name,\n model,\n sessionConversation: prepared.sessionConversation,\n sessionUuid,\n });\n\n await reportUsageSummary({\n session,\n runState,\n responder,\n platform,\n model,\n agentConfig,\n sessionConversation: prepared.sessionConversation,\n sessionUuid,\n waitForQueue: () => prepared.runQueue.wait(),\n });\n\n // Clear run state\n runState.responder = null;\n runState.logCtx = null;\n runState.queue = null;\n\n return { stopReason: runState.stopReason, errorMessage: runState.errorMessage };\n },\n\n abort(): void {\n session.abort();\n },\n\n getCurrentStep(): { toolName?: string; label?: string } | undefined {\n const pending = runState.pendingTools;\n if (pending.size === 0) return undefined;\n // Get the first pending tool\n const first = pending.values().next().value;\n if (!first) return undefined;\n return {\n toolName: first.toolName,\n label: (first.args as { label?: string })?.label,\n };\n },\n };\n}\n\nexport function translateRuntimePathToHost(\n runtimePath: string,\n pathContext: RuntimePathContext,\n): string {\n return pathContext.runtimeToHostPath?.(runtimePath) ?? runtimePath;\n}\n\nexport function translateAttachPathToHost(\n filePath: string,\n pathContext: RuntimePathContext,\n): string {\n const runtimePath = posix.isAbsolute(filePath)\n ? filePath\n : posix.join(pathContext.runtimeWorkspaceRoot, filePath);\n return translateRuntimePathToHost(runtimePath, pathContext);\n}\n"]}
|
package/dist/commands/model.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { MikanModels } from "../harness/index.js";
|
|
2
2
|
import type { CommandContext, CommandHandler, ParsedModelCommand } from "./types.js";
|
|
3
3
|
export type { ParsedModelCommand } from "./types.js";
|
|
4
4
|
export declare function parseModelCommand(text: string): ParsedModelCommand | null;
|
|
5
5
|
export declare class ModelCommandHandler implements CommandHandler {
|
|
6
6
|
private readonly modelRegistry;
|
|
7
|
-
constructor(modelRegistry:
|
|
7
|
+
constructor(modelRegistry: MikanModels);
|
|
8
8
|
tryHandle(context: CommandContext): Promise<boolean>;
|
|
9
9
|
}
|
|
10
10
|
//# sourceMappingURL=model.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/commands/model.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/commands/model.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAYrF,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIrD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAsBzE;AA0BD,qBAAa,mBAAoB,YAAW,cAAc;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa;IAA1C,YAA6B,aAAa,EAAE,WAAW,EAAI;IACrD,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CA0EzD;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/commands/model.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAE9E,MAAM,qBAAqB,GAAG;IAC5B,SAAS;IACT,KAAK;IACL,QAAQ;IACR,MAAM;IACN,OAAO;CACsB,CAAC;AAChC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAgB,CAAC,KAAK,EAAE,GAAG,qBAAqB,CAAC,CAAC,CAAC;AAIlF,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAU,CAAC;AAExD,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACnD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;IAEvD,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;QAC9B,KAAK,EAAE,WAAW,CAAC,KAAK;QACxB,aAAa,EAAE,WAAW,CAAC,aAAa;KACzC,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,SAAiB;IAIhD,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC1C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAuB,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC9B,CAAC;IAED,OAAO;QACL,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;QAChC,aAAa,EAAE,MAAuB;KACvC,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB,EAAE,KAAa,EAAE,aAA6B;IACrF,OAAO,GAAG,QAAQ,IAAI,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC3E,CAAC;AAED,MAAM,OAAO,mBAAmB;IAC9B,YAA6B,
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/commands/model.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { ThinkingLevel as PiAiThinkingLevel } from \"@earendil-works/pi-ai\";\nimport type { MikanModels } from \"../harness/index.js\";\nimport { join } from \"path\";\nimport { resolveConversationSettings, updateConversationSettings } from \"../config.js\";\nimport { matchCommand } from \"./parse.js\";\nimport type { CommandContext, CommandHandler, ParsedModelCommand } from \"./types.js\";\nimport { formatCommandSummary, replyDiagnosticWithContext } from \"./utils.js\";\n\nconst PI_AI_THINKING_LEVELS = [\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n] satisfies PiAiThinkingLevel[];\nconst THINKING_LEVELS = new Set<ThinkingLevel>([\"off\", ...PI_AI_THINKING_LEVELS]);\n\nexport type { ParsedModelCommand } from \"./types.js\";\n\nconst MODEL_COMMANDS = [\"/model\", \"/pi-model\"] as const;\n\nexport function parseModelCommand(text: string): ParsedModelCommand | null {\n const matched = matchCommand(text, MODEL_COMMANDS);\n if (!matched) return null;\n\n if (matched.args.length === 0) {\n return {};\n }\n\n const spec = matched.args[0];\n const slash = spec.indexOf(\"/\");\n if (slash <= 0 || slash === spec.length - 1) {\n return {};\n }\n\n const modelSpec = spec.slice(slash + 1);\n const parsedModel = parseModelThinkingLevel(modelSpec);\n\n return {\n provider: spec.slice(0, slash),\n model: parsedModel.model,\n thinkingLevel: parsedModel.thinkingLevel,\n };\n}\n\nfunction parseModelThinkingLevel(modelSpec: string): {\n model: string;\n thinkingLevel?: ThinkingLevel;\n} {\n const colon = modelSpec.lastIndexOf(\":\");\n if (colon <= 0 || colon === modelSpec.length - 1) {\n return { model: modelSpec };\n }\n\n const suffix = modelSpec.slice(colon + 1);\n if (!THINKING_LEVELS.has(suffix as ThinkingLevel)) {\n return { model: modelSpec };\n }\n\n return {\n model: modelSpec.slice(0, colon),\n thinkingLevel: suffix as ThinkingLevel,\n };\n}\n\nfunction formatModelSpec(provider: string, model: string, thinkingLevel?: ThinkingLevel): string {\n return `${provider}/${model}${thinkingLevel ? `:${thinkingLevel}` : \"\"}`;\n}\n\nexport class ModelCommandHandler implements CommandHandler {\n constructor(private readonly modelRegistry: MikanModels) {}\n async tryHandle(context: CommandContext): Promise<boolean> {\n const parsed = parseModelCommand(context.commandText);\n if (!parsed) return false;\n\n const conversationDir = join(context.services.workingDir, context.conversationId);\n if (!parsed.provider || !parsed.model) {\n const current = resolveConversationSettings(conversationDir);\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\"Model\", [\n `Current: \\`${formatModelSpec(current.provider, current.model, current.thinkingLevel)}\\``,\n \"\",\n \"Usage: `/pi-model provider/model[:thinking]`\",\n \"Example: `/pi-model anthropic/claude-sonnet-4-6:off`\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n\n if (!this.modelRegistry.find(parsed.provider, parsed.model)) {\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\"Model\", [\n `找不到模型:\\`${formatModelSpec(parsed.provider, parsed.model, parsed.thinkingLevel)}\\``,\n \"請確認 provider/model 名稱,或先在 pi models.json 註冊自訂模型。\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n\n if (!context.services.runtime) {\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\"Model\", [\n \"Model command is not configured correctly on the server. Please try again later.\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n\n const switched = context.services.runtime.switchConversationModel(\n context.conversationId,\n parsed.provider,\n parsed.model,\n );\n if (!switched) {\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\"Model\", [\n \"目前這個 conversation 有執行中的工作,請等它完成或先 `/stop` 後再切換模型。\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n\n updateConversationSettings(conversationDir, {\n provider: parsed.provider,\n model: parsed.model,\n ...(parsed.thinkingLevel ? { thinkingLevel: parsed.thinkingLevel } : {}),\n });\n\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\"Model\", [\n `Switched: \\`${formatModelSpec(parsed.provider, parsed.model, parsed.thinkingLevel)}\\``,\n \"下一則訊息會使用新模型。\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/commands/registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/commands/registry.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjE,wBAAgB,sBAAsB,IAAI,cAAc,EAAE,CAWzD;AAED,gFAAgF;AAChF,wBAAsB,eAAe,CACnC,QAAQ,EAAE,SAAS,cAAc,EAAE,EACnC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,OAAO,CAAC,CAKlB"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { homedir } from "os";
|
|
3
|
-
import { join } from "path";
|
|
1
|
+
import { MikanModels } from "../harness/index.js";
|
|
4
2
|
import { AdminCommandHandler } from "./admin.js";
|
|
5
3
|
import { AutoReplyCommandHandler } from "./auto-reply.js";
|
|
6
4
|
import { LoginCommandHandler } from "./login.js";
|
|
@@ -9,8 +7,7 @@ import { NewCommandHandler } from "./new.js";
|
|
|
9
7
|
import { SandboxCommandHandler } from "./sandbox.js";
|
|
10
8
|
import { SessionViewCommandHandler } from "./session-view.js";
|
|
11
9
|
export function defaultCommandHandlers() {
|
|
12
|
-
const
|
|
13
|
-
const modelRegistry = ModelRegistry.create(authStorage);
|
|
10
|
+
const modelRegistry = MikanModels.create();
|
|
14
11
|
return [
|
|
15
12
|
new AdminCommandHandler(),
|
|
16
13
|
new LoginCommandHandler(),
|