@geminixiang/mikan 1.0.0-beta.30 → 1.0.0-beta.32

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 CHANGED
@@ -9,6 +9,31 @@ any release.
9
9
 
10
10
  ## [Unreleased]
11
11
 
12
+ ## [1.0.0-beta.32]
13
+
14
+ ### Changed
15
+
16
+ - Raise the autonomous event and trigger run cost stop-loss from $2 to $10 while retaining the 10-minute and 50-call limits.
17
+ - Allow session memory dreams to make up to 10 LLM calls and remove their fixed cost cap while retaining the two-minute limit.
18
+
19
+ ### Fixed
20
+
21
+ - Prevent large conversations from becoming permanently unable to reset or rotate when preserving memory necessarily exceeds a fixed cost threshold.
22
+
23
+ ## [1.0.0-beta.31]
24
+
25
+ ### Changed
26
+
27
+ - Allow attachments to use each sandbox executor's standard file reader while retaining workspace path containment.
28
+
29
+ ### Fixed
30
+
31
+ - Restore HTML, image, and document uploads from managed sandboxes that cannot provide atomic symlink-free traversal.
32
+
33
+ ### Tests
34
+
35
+ - Add end-to-end regression coverage for staging and uploading workspace files through the regular executor transport.
36
+
12
37
  ## [1.0.0-beta.30]
13
38
 
14
39
  ### Added
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGtE,OAAO,EAAY,KAAK,YAAY,EAAc,MAAM,uBAAuB,CAAC;AA6BhF,OAAO,KAAK,EAEV,mBAAmB,EAKpB,MAAM,cAAc,CAAC;AAetB,OAAO,EAIL,KAAK,kBAAkB,EAExB,MAAM,oBAAoB,CAAC;AAiC5B,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,kBAAkB,GAC9B,MAAM,CAER;AAcD,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,kBAAkB,GAC9B,MAAM,CAkDR;AAqGD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,mBAAmB,EAC5B,aAAa,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,kBAAkB,EAChC,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GACxD,OAAO,CAAC;IACT,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,YAAY,EAAE,CAAC;CAClC,CAAC,CAcD;AAiJD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,GAAG,MAAM,GAAG,UAAU,CAAC,GAC7D,MAAM,GAAG,SAAS,CAOpB;AA8KD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,OAAO,EACvB,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,YAAY,EAAE,MAAM,GACnB,MAAM,CAkBR;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAYR;AAi1CD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CA2XxF"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGtE,OAAO,EAAY,KAAK,YAAY,EAAc,MAAM,uBAAuB,CAAC;AA6BhF,OAAO,KAAK,EAEV,mBAAmB,EAKpB,MAAM,cAAc,CAAC;AAetB,OAAO,EAIL,KAAK,kBAAkB,EAExB,MAAM,oBAAoB,CAAC;AAiC5B,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,kBAAkB,GAC9B,MAAM,CAER;AAcD,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,kBAAkB,GAC9B,MAAM,CA2BR;AAgGD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,mBAAmB,EAC5B,aAAa,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,kBAAkB,EAChC,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GACxD,OAAO,CAAC;IACT,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,YAAY,EAAE,CAAC;CAClC,CAAC,CAcD;AAiJD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,GAAG,MAAM,GAAG,UAAU,CAAC,GAC7D,MAAM,GAAG,SAAS,CAOpB;AA8KD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,OAAO,EACvB,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,YAAY,EAAE,MAAM,GACnB,MAAM,CAkBR;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAYR;AAs0CD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CA2XxF"}
package/dist/agent.js CHANGED
@@ -7,7 +7,7 @@ import { runSubagent } from "./harness/subagent-runner.js";
7
7
  import { loadSubagentProfiles } from "./harness/subagent-profiles.js";
8
8
  import { mergeSubagentProgress, parseSubagentProgressSnapshot, renderSubagentDashboard, settleSubagentProgress, } from "./subagent-progress.js";
9
9
  import { createHash } from "crypto";
10
- import { existsSync, lstatSync } from "fs";
10
+ import { existsSync } from "fs";
11
11
  import { chmod, mkdtemp, mkdir, readFile, rm, writeFile } from "fs/promises";
12
12
  import { tmpdir } from "os";
13
13
  import { basename, isAbsolute, join, posix, relative, resolve, sep } from "path";
@@ -62,29 +62,6 @@ export function translateAttachPathToHost(filePath, pathContext) {
62
62
  if (!isWithinPathRoot(hostPath, hostRoot)) {
63
63
  throw new Error("Cannot attach files: path must be within the host workspace");
64
64
  }
65
- // Reject symlinks in every existing component. Missing files are left for
66
- // the uploader's normal error, but a present attachment must be a regular
67
- // non-symlink path all the way from the workspace root.
68
- if (existsSync(hostPath)) {
69
- let current = hostRoot;
70
- const pathParts = relative(hostRoot, hostPath).split(sep).filter(Boolean);
71
- for (const [index, part] of pathParts.entries()) {
72
- current = join(current, part);
73
- let stat;
74
- try {
75
- stat = lstatSync(current);
76
- }
77
- catch {
78
- break;
79
- }
80
- if (stat.isSymbolicLink()) {
81
- throw new Error("Cannot attach files: symlink components are not allowed");
82
- }
83
- if (index === pathParts.length - 1 && !stat.isFile()) {
84
- throw new Error("Cannot attach files: path must be a regular file");
85
- }
86
- }
87
- }
88
65
  return hostPath;
89
66
  }
90
67
  /**
@@ -106,10 +83,7 @@ function normalizeAttachRuntimePath(filePath, runtimeWorkspaceRoot) {
106
83
  return runtimePath;
107
84
  }
108
85
  async function withStagedRuntimeFile(executor, runtimePath, upload) {
109
- if (!executor.readFileBase64NoSymlinks) {
110
- throw new Error("Attachments are unavailable: this sandbox cannot guarantee symlink-free path traversal");
111
- }
112
- const content = Buffer.from(await executor.readFileBase64NoSymlinks(runtimePath), "base64");
86
+ const content = Buffer.from(await executor.readFileBase64(runtimePath), "base64");
113
87
  let stagingDir;
114
88
  try {
115
89
  stagingDir = await mkdtemp(join(tmpdir(), "mikan-upload-"));
@@ -889,12 +863,6 @@ function createRunnerExecutionContext(sandboxConfig, vaultManager, provisioner,
889
863
  readFileBase64(path, options) {
890
864
  return activeExecutor.readFileBase64(path, options);
891
865
  },
892
- readFileBase64NoSymlinks(path, options) {
893
- if (!activeExecutor.readFileBase64NoSymlinks) {
894
- throw new Error("Attachments are unavailable: this sandbox cannot guarantee symlink-free path traversal");
895
- }
896
- return activeExecutor.readFileBase64NoSymlinks(path, options);
897
- },
898
866
  writeFile(path, content, options) {
899
867
  return activeExecutor.writeFile(path, content, options);
900
868
  },
@@ -1113,9 +1081,7 @@ async function prepareRunContext(params) {
1113
1081
  runState.queue = runQueue.queue;
1114
1082
  log.logInfo(`Context sizes - system: ${systemPrompt.length} chars, memory: ${memory.length} chars`);
1115
1083
  log.logInfo(`Channels: ${platform.channels.length}, Users: ${platform.users.length}`);
1116
- const { userMessage, imageAttachments } = await buildPromptPayload(message, pathContext.runtimeWorkspaceRoot, pathContext, executor.readFileBase64NoSymlinks
1117
- ? (runtimePath) => executor.readFileBase64NoSymlinks(runtimePath)
1118
- : undefined);
1084
+ const { userMessage, imageAttachments } = await buildPromptPayload(message, pathContext.runtimeWorkspaceRoot, pathContext, (runtimePath) => executor.readFileBase64(runtimePath));
1119
1085
  const turnInstructions = buildTurnInstructions(message.id.startsWith("event:"), triggerAttribution, platform.name);
1120
1086
  const finalUserMessage = turnInstructions ? `${turnInstructions}\n\n${userMessage}` : userMessage;
1121
1087
  return {
@@ -1151,8 +1117,7 @@ function sessionDreamPrompt(conversationMemoryPath, toolNames) {
1151
1117
  }
1152
1118
  const SESSION_DREAM_BUDGET = {
1153
1119
  maxDurationMs: 2 * 60 * 1000,
1154
- maxLlmCalls: 5,
1155
- maxCostUsd: 0.25,
1120
+ maxLlmCalls: 10,
1156
1121
  };
1157
1122
  function sessionDreamTools(tools, conversationMemoryPath) {
1158
1123
  return tools
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":["/**\n * Agent runner: prompt construction, path translation, run lifecycle, and createRunner.\n * Single module — do not split helpers that only this file uses.\n */\n\nexport type { CreateRunnerOptions, PiAgentWrapper } from \"./types.js\";\nimport type { CreateRunnerOptions, PiAgentWrapper } from \"./types.js\";\n\nimport type { AgentTool, 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 type ExtensionBlockAction,\n type ExtensionHostServices,\n type ExtensionRegistry,\n formatSkillsForPrompt,\n loadExtensions,\n loadSkillsFromDir,\n MikanAgentSession,\n MikanModels,\n type MikanSkill,\n parseCommandInput,\n type RunOrigin,\n type SessionStore,\n} from \"./harness/index.js\";\nimport { runSubagent } from \"./harness/subagent-runner.js\";\nimport { loadSubagentProfiles } from \"./harness/subagent-profiles.js\";\nimport {\n mergeSubagentProgress,\n parseSubagentProgressSnapshot,\n renderSubagentDashboard,\n settleSubagentProgress,\n} from \"./subagent-progress.js\";\nimport { createHash } from \"crypto\";\nimport { existsSync, lstatSync } from \"fs\";\nimport { chmod, mkdtemp, mkdir, readFile, rm, writeFile } from \"fs/promises\";\nimport { tmpdir } from \"os\";\nimport { basename, isAbsolute, join, posix, relative, resolve, sep } from \"path\";\nimport type {\n ConversationKind,\n ConversationMessage,\n ConversationResponder,\n MessagingInfo,\n PlatformName,\n SubagentProgressSnapshot,\n} from \"./adapter.js\";\nimport type {\n AgentEventPayload,\n PlatformBlockKit,\n PlatformNotifier,\n PlatformReactor,\n PlatformTrustModel,\n PlatformUploader,\n} from \"./types.js\";\nimport { resolveConversationSettings } from \"./config.js\";\nimport { effectiveStateDir } from \"./cli/arg-grammar.js\";\nimport { packageSkillRuntimeDir, resolveConversationPackages } from \"./packages/index.js\";\nimport { ActorExecutionResolver } from \"./execution-resolver.js\";\nimport * as log from \"./log.js\";\nimport type { DockerContainerManager } from \"./provisioner.js\";\nimport {\n createExecutor,\n getUnresolvedSandboxPathContext,\n type Executor,\n type RuntimePathContext,\n type SandboxConfig,\n} from \"./sandbox/index.js\";\nimport {\n addLifecycleBreadcrumb,\n metricAttributes,\n reportUserFacingError,\n updateActiveSpanAttribution,\n} from \"./observability/sentry.js\";\nimport type { VaultManager } from \"./vault/index.js\";\nimport { ChatHistorySync } from \"./sessions/chat-history-sync.js\";\nimport { formatHistoryLine } from \"./sessions/history-line.js\";\nimport { conversationIdOf, isThreadSessionKey } from \"./sessions/session-key.js\";\nimport {\n extractSessionUuid,\n openManagedSession,\n type ThreadRootMessage,\n} from \"./sessions/store.js\";\nimport { HostEventStore } from \"./tools/event.js\";\nimport {\n createMikanTools,\n createSubagentTool,\n DEFAULT_GLOBAL_SUBAGENT_SLOTS,\n SubagentSlotPool,\n} from \"./tools/index.js\";\n\n// One process-wide fan-out account: per-conversation queues serialize runs,\n// but each run can fan out up to the per-run cap — without this shared\n// ceiling, N busy conversations hold N × cap live subagent sessions.\nconst globalSubagentSlots = new SubagentSlotPool(DEFAULT_GLOBAL_SUBAGENT_SLOTS);\nimport type { PlatformToolRunContext } from \"./tools/types.js\";\nimport * as Sentry from \"@sentry/node\";\n\nimport { emitAgentEvent } from \"./agent-events.js\";\n\nexport function translateRuntimePathToHost(\n runtimePath: string,\n pathContext: RuntimePathContext,\n): string {\n return pathContext.runtimeToHostPath?.(runtimePath) ?? runtimePath;\n}\n\nfunction isWithinPathRoot(path: string, root: string): boolean {\n const pathRelative = relative(root, path);\n return (\n pathRelative === \"\" ||\n (pathRelative !== \"..\" && !pathRelative.startsWith(`..${sep}`) && !isAbsolute(pathRelative))\n );\n}\n\nfunction hasParentTraversal(path: string): boolean {\n return path.split(/[\\\\/]/).some((segment) => segment === \"..\");\n}\n\nexport function translateAttachPathToHost(\n filePath: string,\n pathContext: RuntimePathContext,\n): string {\n if (!pathContext.runtimeToHostPath) {\n throw new Error(\n \"Cannot attach files: this sandbox has no host-backed runtime path mapping; attachments are unavailable for remote sandboxes such as Cloudflare or Firecracker\",\n );\n }\n if (hasParentTraversal(filePath)) {\n throw new Error(\"Cannot attach files: parent-directory traversal is not allowed\");\n }\n\n const runtimeRoot = resolve(pathContext.runtimeWorkspaceRoot);\n const runtimePath = posix.isAbsolute(filePath)\n ? filePath\n : posix.join(pathContext.runtimeWorkspaceRoot, filePath);\n const normalizedRuntimePath = resolve(runtimePath);\n if (!isWithinPathRoot(normalizedRuntimePath, runtimeRoot)) {\n throw new Error(\"Cannot attach files: path must be within the runtime workspace\");\n }\n\n const hostRoot = resolve(pathContext.hostWorkspaceRoot);\n const translatedPath = pathContext.runtimeToHostPath(runtimePath);\n const hostPath = resolve(translatedPath);\n if (!isWithinPathRoot(hostPath, hostRoot)) {\n throw new Error(\"Cannot attach files: path must be within the host workspace\");\n }\n\n // Reject symlinks in every existing component. Missing files are left for\n // the uploader's normal error, but a present attachment must be a regular\n // non-symlink path all the way from the workspace root.\n if (existsSync(hostPath)) {\n let current = hostRoot;\n const pathParts = relative(hostRoot, hostPath).split(sep).filter(Boolean);\n for (const [index, part] of pathParts.entries()) {\n current = join(current, part);\n let stat;\n try {\n stat = lstatSync(current);\n } catch {\n break;\n }\n if (stat.isSymbolicLink()) {\n throw new Error(\"Cannot attach files: symlink components are not allowed\");\n }\n if (index === pathParts.length - 1 && !stat.isFile()) {\n throw new Error(\"Cannot attach files: path must be a regular file\");\n }\n }\n }\n\n return hostPath;\n}\n\n/**\n * Normalize an attachment path using runtime lexical semantics only. The\n * executor remains the authority for reading the resulting runtime path.\n */\nfunction normalizeAttachRuntimePath(filePath: string, runtimeWorkspaceRoot: string): string {\n if (hasParentTraversal(filePath)) {\n throw new Error(\"Cannot attach files: parent-directory traversal is not allowed\");\n }\n\n const runtimeRoot = posix.resolve(runtimeWorkspaceRoot);\n const runtimePath = posix.resolve(runtimeRoot, filePath);\n const runtimeRelativePath = posix.relative(runtimeRoot, runtimePath);\n if (\n runtimeRelativePath === \"..\" ||\n runtimeRelativePath.startsWith(\"../\") ||\n posix.isAbsolute(runtimeRelativePath)\n ) {\n throw new Error(\"Cannot attach files: path must be within the runtime workspace\");\n }\n return runtimePath;\n}\n\nasync function withStagedRuntimeFile(\n executor: Executor,\n runtimePath: string,\n upload: (stagedPath: string) => Promise<void>,\n): Promise<void> {\n if (!executor.readFileBase64NoSymlinks) {\n throw new Error(\n \"Attachments are unavailable: this sandbox cannot guarantee symlink-free path traversal\",\n );\n }\n const content = Buffer.from(await executor.readFileBase64NoSymlinks(runtimePath), \"base64\");\n let stagingDir: string | undefined;\n try {\n stagingDir = await mkdtemp(join(tmpdir(), \"mikan-upload-\"));\n await chmod(stagingDir, 0o700);\n const stagedPath = join(stagingDir, basename(runtimePath));\n await writeFile(stagedPath, content, { mode: 0o600, flag: \"wx\" });\n await chmod(stagedPath, 0o600);\n await upload(stagedPath);\n } finally {\n if (stagingDir) await rm(stagingDir, { recursive: true, force: true });\n }\n}\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 formatTimestampedUserMessage(message: ConversationMessage): string {\n return formatHistoryLine({\n date: new Date(),\n userName: message.userName,\n threadTs: message.threadTs,\n text: message.text,\n });\n}\n\nasync function collectMessageAttachments(\n message: ConversationMessage,\n workspacePath: string,\n pathContext?: RuntimePathContext,\n readAttachment?: (runtimePath: string) => Promise<string>,\n): Promise<{ 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) && readAttachment) {\n try {\n imageAttachments.push({\n type: \"image\",\n mimeType,\n data: await readAttachment(runtimePath),\n });\n } catch {\n nonImagePaths.push(runtimePath);\n }\n } else {\n nonImagePaths.push(runtimePath);\n }\n }\n\n return { imageAttachments, nonImagePaths };\n}\n\nexport async function buildPromptPayload(\n message: ConversationMessage,\n workspacePath: string,\n pathContext?: RuntimePathContext,\n readAttachment?: (runtimePath: string) => Promise<string>,\n): Promise<{\n userMessage: string;\n imageAttachments: ImageContent[];\n}> {\n let userMessage = formatTimestampedUserMessage(message);\n const { imageAttachments, nonImagePaths } = await collectMessageAttachments(\n message,\n workspacePath,\n pathContext,\n readAttachment,\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 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 // Package skills first: they are the lowest precedence, so a workspace or\n // conversation skill of the same name below overwrites them. A package can\n // offer a capability without taking the name away from whoever wants to\n // replace it locally.\n //\n // Unlike extension-shipped skills, these are NOT inlined into the prompt:\n // conversationPackageSkillMounts exposes them read-only at a runtime path,\n // so the agent can read the files — including any scripts or templates the\n // skill ships alongside its SKILL.md, which inlining could never carry.\n const mounted = workspacePath !== hostWorkspacePath;\n for (const { slug, dir } of resolveConversationPackages({\n conversationId: basename(conversationDir),\n stateDir: effectiveStateDir(),\n conversationDir,\n }).skillDirs) {\n const runtimeDir = packageSkillRuntimeDir(slug);\n for (const skill of loadSkillsFromDir({ dir, source: `package:${slug}` }).skills) {\n // In host mode there is no mount, so the host path is already the path\n // the agent will use.\n if (mounted) {\n skill.filePath = runtimeDir + skill.filePath.slice(dir.length);\n skill.baseDir = runtimeDir + skill.baseDir.slice(dir.length);\n }\n skillMap.set(skill.name, skill);\n }\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 natively from standard Markdown. Answer in normal Markdown/GFM.\n- Markdown pipe tables are rendered as native Slack tables.\n- For interactive elements (buttons, select menus), use the slack_blockkit tool; user interactions arrive as \"[Slack action] <action_id>: <value>\" messages.\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 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 // Slack mrkdwn italics cannot span a URL — a `_..._` wrapping a link renders\n // the underscores literally. Keep the session link outside the italic span.\n const suffix = sessionLink ? `${legacySuffix} · session: ${sessionLink}` : 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 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\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 subagentProgress: Map<string, SubagentProgressSnapshot>;\n completedSubagentProgress: SubagentProgressSnapshot[];\n subagentToolCalls: Set<string>;\n subagentProgressShown: boolean;\n suppressResponseDeltas: boolean;\n lastSubagentProgressAt: number;\n toolProgressTimer: ReturnType<typeof setTimeout> | undefined;\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\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 subagentProgress: new Map<string, SubagentProgressSnapshot>(),\n completedSubagentProgress: [],\n subagentToolCalls: new Set<string>(),\n subagentProgressShown: false,\n suppressResponseDeltas: false,\n lastSubagentProgressAt: 0,\n toolProgressTimer: undefined,\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.subagentProgress.clear();\n runState.completedSubagentProgress = [];\n runState.subagentToolCalls.clear();\n runState.subagentProgressShown = false;\n runState.suppressResponseDeltas = false;\n runState.lastSubagentProgressAt = 0;\n if (runState.toolProgressTimer) clearTimeout(runState.toolProgressTimer);\n runState.toolProgressTimer = undefined;\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 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\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\n/** Non-subagent tool activity lines; subagent calls render as the dashboard. */\nfunction formatToolProgress(runState: RunnerSessionState): string {\n const lines = Array.from(runState.toolProgress.entries()).flatMap(([toolCallId, item]) => {\n if (runState.subagentToolCalls.has(toolCallId)) return [];\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, text].filter(Boolean).join(\"\\n\\n\");\n}\n\n/**\n * The one dashboard render path. A responder that overrides\n * `replaceSubagentProgress` converts the snapshot for a pipeline that is not\n * response-source Markdown (Telegram HTML); every other platform receives the\n * Markdown dashboard — \"dashboard, blank line, answer\" — through\n * `replaceResponse`, the same conversion as any response.\n */\nasync function replaceWithSubagentDashboard(\n responder: ConversationResponder,\n snapshot: SubagentProgressSnapshot,\n finalText?: string,\n options?: { createOverflowLink?: () => string },\n): Promise<void> {\n if (responder.replaceSubagentProgress) {\n await responder.replaceSubagentProgress(snapshot, finalText);\n return;\n }\n const dashboard = renderSubagentDashboard(snapshot);\n await responder.replaceResponse(finalText ? `${dashboard}\\n\\n${finalText}` : dashboard, options);\n}\n\nasync function replaceResponseWithToolProgress(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n subagentProgress = mergeSubagentProgress([...runState.subagentProgress.values()]),\n): Promise<void> {\n if (subagentProgress) {\n await replaceWithSubagentDashboard(responder, subagentProgress);\n return;\n }\n const progress = formatToolProgress(runState);\n if (progress) await responder.replaceResponse(progress);\n}\n\nconst TOOL_PROGRESS_DEBOUNCE_MS = 500;\nconst SUBAGENT_PROGRESS_THROTTLE_MS = 2000;\n\nfunction subagentProgressDelay(runState: RunnerSessionState): number {\n if (!runState.subagentProgressShown) return 0;\n return Math.max(0, runState.lastSubagentProgressAt + SUBAGENT_PROGRESS_THROTTLE_MS - Date.now());\n}\n\nfunction scheduleToolProgressUpdate(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n): void {\n if (runState.toolProgressTimer) return;\n const subagentProgress = mergeSubagentProgress([...runState.subagentProgress.values()]);\n const delay = subagentProgress ? subagentProgressDelay(runState) : TOOL_PROGRESS_DEBOUNCE_MS;\n runState.toolProgressTimer = setTimeout(() => {\n runState.toolProgressTimer = undefined;\n const snapshot = mergeSubagentProgress([...runState.subagentProgress.values()]);\n if (snapshot) {\n runState.subagentProgressShown = true;\n runState.lastSubagentProgressAt = Date.now();\n }\n runState.queue?.enqueue(\n () => replaceResponseWithToolProgress(responder, runState, snapshot),\n \"tool progress update\",\n );\n }, delay);\n runState.toolProgressTimer.unref();\n}\n\nfunction flushToolProgressUpdate(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n): void {\n if (runState.toolProgressTimer) clearTimeout(runState.toolProgressTimer);\n runState.toolProgressTimer = undefined;\n const subagentProgress = mergeSubagentProgress([...runState.subagentProgress.values()]);\n if (subagentProgress) {\n runState.subagentProgressShown = true;\n runState.lastSubagentProgressAt = Date.now();\n }\n runState.queue?.enqueue(\n () => replaceResponseWithToolProgress(responder, runState, subagentProgress),\n \"tool progress update\",\n );\n}\n\nfunction extractSubagentProgress(partialResult: unknown): SubagentProgressSnapshot | undefined {\n if (!partialResult || typeof partialResult !== \"object\") return undefined;\n const details = (partialResult as { details?: unknown }).details;\n if (!details || typeof details !== \"object\") return undefined;\n return parseSubagentProgressSnapshot((details as { progress?: unknown }).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 const finalResponse = appendTriggerAttribution(\n finalText,\n options?.triggerAttribution,\n options?.triggerSessionLink,\n );\n const finalDashboard = mergeSubagentProgress(runState.completedSubagentProgress);\n if (finalDashboard) {\n await replaceWithSubagentDashboard(responder, finalDashboard, finalResponse, {\n createOverflowLink: options?.createOverflowLink,\n });\n return;\n }\n await responder.replaceResponse(formatResponseWithToolProgress(finalResponse, runState), {\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 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\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\ninterface RunnerExecutionContext {\n executionResolver?: ActorExecutionResolver;\n executor: Executor;\n getPathContext: () => RuntimePathContext;\n resolveExecutorForRun(context: {\n platform: string;\n userId: string;\n conversationId: string;\n trustModel?: PlatformTrustModel;\n }): Promise<void>;\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 /** Registry backing extension command dispatch for this harness instance. */\n extensionRegistry: ExtensionRegistry;\n /** Runs extension disposers; call once when the runner is discarded. */\n disposeExtensions: () => Promise<void>;\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(\n sandboxConfig,\n vaultManager,\n provisioner,\n workspaceDir,\n hostWorkspacePath,\n )\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 readFile(path, options) {\n return activeExecutor.readFile(path, options);\n },\n readFileBase64(path, options) {\n return activeExecutor.readFileBase64(path, options);\n },\n readFileBase64NoSymlinks(path, options) {\n if (!activeExecutor.readFileBase64NoSymlinks) {\n throw new Error(\n \"Attachments are unavailable: this sandbox cannot guarantee symlink-free path traversal\",\n );\n }\n return activeExecutor.readFileBase64NoSymlinks(path, options);\n },\n writeFile(path, content, options) {\n return activeExecutor.writeFile(path, content, 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 platformReactor?: PlatformReactor;\n platformUploader?: PlatformUploader;\n platformBlockKit?: PlatformBlockKit;\n runSubagentService?: ExtensionHostServices[\"runSubagent\"];\n}): ExtensionHostServices {\n const {\n workspaceDir,\n vaultManager,\n platformNotifier,\n platformReactor,\n platformUploader,\n platformBlockKit,\n runSubagentService,\n } = params;\n const eventStore = HostEventStore.fromWorkspaceDir(workspaceDir);\n return {\n stateDir: effectiveStateDir(),\n scheduleStore: {\n write: async (filename, payload) => {\n await eventStore.write(filename, payload);\n },\n delete: async (filename) => (await eventStore.delete(filename)).deleted,\n list: async () =>\n (await eventStore.list()).flatMap((entry) =>\n entry.payload ? [{ filename: entry.filename, payload: entry.payload }] : [],\n ),\n },\n ...(platformNotifier ? { postMessage: platformNotifier } : {}),\n ...(platformReactor ? { addReaction: platformReactor } : {}),\n ...(platformUploader ? { uploadFile: platformUploader } : {}),\n ...(platformBlockKit\n ? { postBlocks: platformBlockKit.postBlocks, updateBlocks: platformBlockKit.updateBlocks }\n : {}),\n ...(runSubagentService ? { runSubagent: runSubagentService } : {}),\n ...(vaultManager\n ? {\n resolveSecrets: (slug: string) => vaultManager.resolve(`extensions/${slug}`)?.env ?? {},\n }\n : {}),\n };\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 platformReactor?: PlatformReactor;\n platformUploader?: PlatformUploader;\n platformBlockKit?: PlatformBlockKit;\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 platformReactor,\n platformUploader,\n platformBlockKit,\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 // resolveConversationPackages only ever returns state-dir paths (and host\n // paths an administrator named explicitly in settings); it never reaches\n // the network on this path, so a slow remote cannot delay a reply.\n let session: MikanAgentSession | undefined;\n const loadedProfiles = loadSubagentProfiles(workspaceDir);\n for (const diagnostic of loadedProfiles.diagnostics) {\n log.logWarning(\n `[${conversationId}] Subagent profile ignored: ${diagnostic.path}`,\n diagnostic.message,\n );\n }\n // Narrowed to the profiles whose tools actually exist once extensions have\n // contributed theirs. Both subagent entry points read this at call time, so\n // they always agree on which profiles are launchable.\n let runnableSubagentProfiles = loadedProfiles.profiles;\n const resolvedPackages = resolveConversationPackages({\n conversationId,\n stateDir: effectiveStateDir(),\n conversationDir: join(workspaceDir, conversationId),\n });\n for (const error of resolvedPackages.errors) {\n log.logWarning(`Package unavailable: ${error.source}`, error.message);\n }\n const extensionsResult = await loadExtensions({\n dirs: resolvedPackages.extensionDirs,\n roots: resolvedPackages.extensionRoots,\n context: { conversationId, workspaceDir, model, thinkingLevel },\n services: buildExtensionHostServices({\n workspaceDir,\n vaultManager,\n platformNotifier,\n platformReactor,\n platformUploader,\n platformBlockKit,\n runSubagentService: (request, extensionTools) => {\n const activeParent = session?.isActiveRun ? session : undefined;\n return runSubagent({\n request,\n defaultModel: model,\n thinkingLevel,\n models,\n workspaceDir,\n availableTools: [...tools, ...extensionTools],\n profiles: runnableSubagentProfiles,\n slots: globalSubagentSlots,\n ...(activeParent\n ? {\n parentMessages: [...activeParent.messages],\n onUsage: activeParent.captureExternalUsageSink(),\n }\n : {}),\n });\n },\n }),\n });\n const contributedTools = extensionsResult.registry.getContributedTools();\n const subagentAvailableTools = [...tools, ...contributedTools];\n const availableToolNames = new Set(subagentAvailableTools.map((tool) => tool.name));\n runnableSubagentProfiles = new Map(\n [...loadedProfiles.profiles].filter(([, profile]) =>\n profile.tools.every((tool) => availableToolNames.has(tool)),\n ),\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 subagentTool = createSubagentTool(\n (request) =>\n runSubagent({\n request,\n defaultModel: model,\n thinkingLevel,\n models,\n workspaceDir,\n availableTools: subagentAvailableTools,\n profiles: runnableSubagentProfiles,\n slots: globalSubagentSlots,\n parentMessages: [...session!.messages],\n onUsage: session!.captureExternalUsageSink(),\n }),\n runnableSubagentProfiles,\n );\n\n session = new MikanAgentSession({\n systemPrompt,\n model,\n thinkingLevel,\n tools: [...tools, subagentTool],\n models,\n sessionStore,\n extensions: extensionsResult.registry,\n });\n\n const activeSession = session;\n const reloaded = activeSession.reloadFromSession();\n if (reloaded > 0) {\n log.logInfo(`[${conversationId}] Reloaded ${reloaded} messages from session context`);\n }\n return {\n session: activeSession,\n extensionSkills: extensionsResult.skills,\n extensionRegistry: extensionsResult.registry,\n disposeExtensions: extensionsResult.dispose,\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 setReactFunction: (fn: ((emoji: string) => Promise<void>) | null) => void;\n bindPlatformToolPacks: (ctx: PlatformToolRunContext) => 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 setReactFunction,\n bindPlatformToolPacks,\n } = params;\n let pathContext = params.pathContext;\n const sessionConversation = conversationIdOf(message.sessionKey);\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 trustModel: platform.trustModel,\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). This is the base prompt mikan\n // builds; a `before_agent_start` extension may still rewrite it per turn\n // (logged separately by the runner).\n const promptHash = createHash(\"sha256\").update(systemPrompt).digest(\"hex\").slice(0, 8);\n log.logInfo(\n `[${conversationId}] System prompt (base): ${systemPrompt.length} chars, sha ${promptHash}`,\n );\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 runtimePath = normalizeAttachRuntimePath(filePath, pathContext.runtimeWorkspaceRoot);\n await withStagedRuntimeFile(executor, runtimePath, (stagedPath) =>\n responder.uploadFile(stagedPath, title),\n );\n });\n\n // The react tool is available only when the responder supports reactions\n // (interactive turns on platforms with reaction support); otherwise unset\n // so the tool reports it is unavailable rather than silently no-op'ing.\n setReactFunction(responder.react ? async (emoji: string) => responder.react!(emoji) : null);\n\n // Platform capability packs (e.g. GitHub PR/CI) enable themselves per run;\n // core does not branch on platform name here.\n bindPlatformToolPacks({\n conversationId,\n platformName: platform.name,\n threadTs: message.threadTs,\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 } = await buildPromptPayload(\n message,\n pathContext.runtimeWorkspaceRoot,\n pathContext,\n executor.readFileBase64NoSymlinks\n ? (runtimePath) => executor.readFileBase64NoSymlinks!(runtimePath)\n : undefined,\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 return {\n sessionConversation,\n runQueue,\n userMessage: finalUserMessage,\n imageAttachments,\n triggerAttribution,\n pathContext,\n };\n}\n\n/**\n * The dream run reads a transcript in which the agent held its full tool set,\n * but `sessionDreamTools` has since narrowed it. Left to infer its grant from\n * the transcript, the model calls a tool it no longer holds and burns one of\n * its five turns on the failure — so the grant is stated, and derived from the\n * tools actually handed to the run rather than restated by hand.\n */\nfunction sessionDreamPrompt(conversationMemoryPath: string, toolNames: string[]): string {\n // read/edit/write are core tools, so an empty grant does not arise today;\n // the fallback only keeps this sentence coherent if that ever changes.\n const grant =\n toolNames.length === 0\n ? \"You have no tools in this run and cannot change memory. Say so and stop.\"\n : `Your tools this run: ${toolNames.join(\", \")}. Nothing else will execute, including tools used earlier in this transcript. ${conversationMemoryPath} is the only path you may write.`;\n return [\n \"Before this conversation is reset or rotated, preserve only durable information worth carrying into future sessions of this same conversation.\",\n `Review the existing transcript and update only the conversation-specific MEMORY.md at ${conversationMemoryPath}.`,\n grant,\n \"Do not modify the workspace-level global MEMORY.md. Information from one DM or channel must not be promoted into memory shared with other conversations by this maintenance run.\",\n \"Preserve durable decisions, preferences, facts, and ongoing work specific to this conversation. Preserve the concrete values and details needed to resume the work; do not replace them with abstract categories, summaries of retention rules, or statements that merely say a kind of information is durable. An explicit user statement that a fact, preference, or decision should persist is strong evidence that its exact content is worth preserving.\",\n \"Deduplicate against existing conversation memory. Do not preserve transient discussion, tool noise, secrets, speculative details, or test scaffolding. If there is nothing new worth preserving, make no changes. Do no unrelated work.\",\n ].join(\"\\n\");\n}\n\nconst SESSION_DREAM_BUDGET = {\n maxDurationMs: 2 * 60 * 1000,\n maxLlmCalls: 5,\n maxCostUsd: 0.25,\n};\n\nfunction sessionDreamTools(tools: AgentTool[], conversationMemoryPath: string): AgentTool[] {\n return tools\n .filter((tool) => tool.name === \"read\" || tool.name === \"edit\" || tool.name === \"write\")\n .map((tool) => {\n if (tool.name === \"read\") return tool;\n return Object.assign({}, tool, {\n execute: async (...args: Parameters<AgentTool[\"execute\"]>) => {\n const params = args[1] as { path?: unknown };\n if (params.path !== conversationMemoryPath) {\n throw new Error(`Session Dream may only modify ${conversationMemoryPath}`);\n }\n return tool.execute(...args);\n },\n });\n });\n}\n\nasync function noopResponderMethod(): Promise<void> {}\n\nfunction createNoopResponder(): ConversationResponder {\n return {\n respond: noopResponderMethod,\n replaceResponse: noopResponderMethod,\n respondDiagnostic: noopResponderMethod,\n respondToolResult: noopResponderMethod,\n setTyping: noopResponderMethod,\n setWorking: noopResponderMethod,\n uploadFile: noopResponderMethod,\n deleteResponse: noopResponderMethod,\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 if (event.toolName === \"subagent\") {\n runState.subagentToolCalls.add(event.toolCallId);\n } else {\n queue.enqueue(\n () => replaceResponseWithToolProgress(responder, runState),\n \"tool progress update\",\n );\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_update\") {\n const subagentProgress = extractSubagentProgress(event.partialResult);\n if (subagentProgress) {\n runState.subagentProgress.set(event.toolCallId, subagentProgress);\n runState.subagentToolCalls.add(event.toolCallId);\n runState.suppressResponseDeltas = true;\n scheduleToolProgressUpdate(responder, runState);\n }\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 const subagentProgress = runState.subagentProgress.get(event.toolCallId);\n if (subagentProgress) {\n runState.subagentProgress.set(\n event.toolCallId,\n settleSubagentProgress(subagentProgress, event.isError),\n );\n }\n flushToolProgressUpdate(responder, runState);\n const completedProgress = runState.subagentProgress.get(event.toolCallId);\n if (completedProgress) runState.completedSubagentProgress.push(completedProgress);\n runState.subagentProgress.delete(event.toolCallId);\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 if (event.toolName === \"slack_blockkit\") {\n runState.finalResponseHandledByTool = true;\n }\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 && !runState.suppressResponseDeltas) {\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 // A run that produced a subagent dashboard finalizes through it:\n // finalizeRunResponse renders \"dashboard, blank line, answer\", and a\n // finish here would first overwrite the dashboard with the bare\n // answer on every platform.\n if (runState.completedSubagentProgress.length > 0) return;\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\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(options: CreateRunnerOptions): Promise<PiAgentWrapper> {\n const {\n sandboxConfig,\n sessionKey,\n conversationId,\n conversationDir,\n workspaceDir,\n sessionScope,\n vaultManager,\n provisioner,\n resourceController,\n sessionView,\n platformNotifier,\n platformReactor,\n platformUploader,\n platformBlockKit,\n platformToolPackFactories,\n } = options;\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 const modelRegistry = options.models ?? MikanModels.create();\n if (modelRegistry.getError()) {\n log.logWarning(\"models.json load error\", modelRegistry.getError()!);\n }\n const model = modelRegistry.resolve(agentConfig.provider, agentConfig.model);\n\n // Create tools (per-runner, with per-runner upload function setter)\n const {\n tools,\n setUploadFunction,\n setReactFunction,\n bindPlatformToolPacks,\n setEventContext,\n setSandboxContext,\n } = createMikanTools(\n executor,\n workspaceDir,\n { sandbox: sandboxConfig, resourceController: resourceController ?? provisioner },\n platformToolPackFactories ?? [],\n {\n model,\n getApiKey: () => modelRegistry.getApiKeyForProvider(model.provider),\n },\n );\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 trustModel: \"membership\",\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 = isThreadSessionKey(sessionKey);\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 ChatHistorySync();\n const { session, extensionSkills, extensionRegistry, disposeExtensions } =\n 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 platformReactor,\n platformUploader,\n platformBlockKit,\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 setReactFunction,\n bindPlatformToolPacks,\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 // Event runs have no triggering platform message, so identity fields\n // stay unset and extensions must null-check them.\n const origin: RunOrigin = isEventRun\n ? { kind: \"event\", platform: platform.name }\n : {\n kind: \"interactive\",\n platform: platform.name,\n messageTs: message.id,\n userId: message.userId,\n userName: message.userName,\n threadTs: message.threadTs,\n attachments: message.attachments,\n };\n const outcome = await session.prompt(prepared.userMessage, {\n origin,\n ...(prepared.imageAttachments.length > 0 ? { images: prepared.imageAttachments } : {}),\n ...(isEventRun ? { budget: DEFAULT_EVENT_BUDGET } : {}),\n });\n\n if (outcome?.blocked) {\n const text = outcome.reason\n ? `_Turn blocked by an extension: ${outcome.reason}_`\n : \"_Turn blocked by an extension._\";\n sendAgentEvent({\n sessionId: sessionUuid,\n actorName: formatAgentActorName(message.userName, prepared.sessionConversation),\n event: { kind: \"diagnostic\", text },\n });\n await responder.respondDiagnostic(text, { style: \"muted\" });\n runState.responder = null;\n runState.logCtx = null;\n runState.queue = null;\n return { stopReason: \"blocked\" };\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 async dreamSessionMemory(\n message: ConversationMessage,\n platform: MessagingInfo,\n ): Promise<{ stopReason: string; errorMessage?: string }> {\n const responder = createNoopResponder();\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 setReactFunction,\n bindPlatformToolPacks,\n pathContext,\n });\n pathContext = prepared.pathContext;\n\n try {\n const conversationMemoryPath = posix.join(\n prepared.pathContext.runtimeWorkspaceRoot,\n conversationId,\n \"MEMORY.md\",\n );\n const dreamTools = sessionDreamTools(session.agent.state.tools, conversationMemoryPath);\n const outcome = await session.prompt(\n sessionDreamPrompt(\n conversationMemoryPath,\n dreamTools.map((tool) => tool.name),\n ),\n {\n origin: {\n kind: \"interactive\",\n platform: platform.name,\n messageTs: message.id,\n userId: message.userId,\n userName: message.userName,\n threadTs: message.threadTs,\n attachments: message.attachments,\n },\n budget: SESSION_DREAM_BUDGET,\n tools: dreamTools,\n },\n );\n if (outcome?.blocked) {\n return { stopReason: \"blocked\", errorMessage: outcome.reason };\n }\n await prepared.runQueue.wait();\n // A budget abort carries its reason in the tally, not in errorMessage,\n // and that reason is the only thing that tells the user why memory was\n // not preserved.\n return {\n stopReason: runState.stopReason,\n errorMessage: runState.errorMessage ?? session.getLastRunStats().budgetExceededReason,\n };\n } finally {\n runState.responder = null;\n runState.logCtx = null;\n runState.queue = null;\n }\n },\n\n abort(): void {\n session.abort();\n },\n\n async tryExtensionCommand(\n message: ConversationMessage,\n responder: ConversationResponder,\n ): Promise<boolean> {\n const parsed = parseCommandInput(message.text);\n if (!parsed) return false;\n return extensionRegistry.dispatchCommand(parsed.name, {\n args: parsed.args,\n conversationId,\n userId: message.userId,\n userName: message.userName,\n threadTs: message.threadTs,\n respond: (text: string) => responder.respond(text),\n });\n },\n\n async tryExtensionAction(slug: string, action: ExtensionBlockAction): Promise<boolean> {\n return extensionRegistry.dispatchAction(slug, action);\n },\n\n async dispose(): Promise<void> {\n await disposeExtensions();\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"]}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Agent runner: prompt construction, path translation, run lifecycle, and createRunner.\n * Single module — do not split helpers that only this file uses.\n */\n\nexport type { CreateRunnerOptions, PiAgentWrapper } from \"./types.js\";\nimport type { CreateRunnerOptions, PiAgentWrapper } from \"./types.js\";\n\nimport type { AgentTool, 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 type ExtensionBlockAction,\n type ExtensionHostServices,\n type ExtensionRegistry,\n formatSkillsForPrompt,\n loadExtensions,\n loadSkillsFromDir,\n MikanAgentSession,\n MikanModels,\n type MikanSkill,\n parseCommandInput,\n type RunOrigin,\n type SessionStore,\n} from \"./harness/index.js\";\nimport { runSubagent } from \"./harness/subagent-runner.js\";\nimport { loadSubagentProfiles } from \"./harness/subagent-profiles.js\";\nimport {\n mergeSubagentProgress,\n parseSubagentProgressSnapshot,\n renderSubagentDashboard,\n settleSubagentProgress,\n} from \"./subagent-progress.js\";\nimport { createHash } from \"crypto\";\nimport { existsSync } from \"fs\";\nimport { chmod, mkdtemp, mkdir, readFile, rm, writeFile } from \"fs/promises\";\nimport { tmpdir } from \"os\";\nimport { basename, isAbsolute, join, posix, relative, resolve, sep } from \"path\";\nimport type {\n ConversationKind,\n ConversationMessage,\n ConversationResponder,\n MessagingInfo,\n PlatformName,\n SubagentProgressSnapshot,\n} from \"./adapter.js\";\nimport type {\n AgentEventPayload,\n PlatformBlockKit,\n PlatformNotifier,\n PlatformReactor,\n PlatformTrustModel,\n PlatformUploader,\n} from \"./types.js\";\nimport { resolveConversationSettings } from \"./config.js\";\nimport { effectiveStateDir } from \"./cli/arg-grammar.js\";\nimport { packageSkillRuntimeDir, resolveConversationPackages } from \"./packages/index.js\";\nimport { ActorExecutionResolver } from \"./execution-resolver.js\";\nimport * as log from \"./log.js\";\nimport type { DockerContainerManager } from \"./provisioner.js\";\nimport {\n createExecutor,\n getUnresolvedSandboxPathContext,\n type Executor,\n type RuntimePathContext,\n type SandboxConfig,\n} from \"./sandbox/index.js\";\nimport {\n addLifecycleBreadcrumb,\n metricAttributes,\n reportUserFacingError,\n updateActiveSpanAttribution,\n} from \"./observability/sentry.js\";\nimport type { VaultManager } from \"./vault/index.js\";\nimport { ChatHistorySync } from \"./sessions/chat-history-sync.js\";\nimport { formatHistoryLine } from \"./sessions/history-line.js\";\nimport { conversationIdOf, isThreadSessionKey } from \"./sessions/session-key.js\";\nimport {\n extractSessionUuid,\n openManagedSession,\n type ThreadRootMessage,\n} from \"./sessions/store.js\";\nimport { HostEventStore } from \"./tools/event.js\";\nimport {\n createMikanTools,\n createSubagentTool,\n DEFAULT_GLOBAL_SUBAGENT_SLOTS,\n SubagentSlotPool,\n} from \"./tools/index.js\";\n\n// One process-wide fan-out account: per-conversation queues serialize runs,\n// but each run can fan out up to the per-run cap — without this shared\n// ceiling, N busy conversations hold N × cap live subagent sessions.\nconst globalSubagentSlots = new SubagentSlotPool(DEFAULT_GLOBAL_SUBAGENT_SLOTS);\nimport type { PlatformToolRunContext } from \"./tools/types.js\";\nimport * as Sentry from \"@sentry/node\";\n\nimport { emitAgentEvent } from \"./agent-events.js\";\n\nexport function translateRuntimePathToHost(\n runtimePath: string,\n pathContext: RuntimePathContext,\n): string {\n return pathContext.runtimeToHostPath?.(runtimePath) ?? runtimePath;\n}\n\nfunction isWithinPathRoot(path: string, root: string): boolean {\n const pathRelative = relative(root, path);\n return (\n pathRelative === \"\" ||\n (pathRelative !== \"..\" && !pathRelative.startsWith(`..${sep}`) && !isAbsolute(pathRelative))\n );\n}\n\nfunction hasParentTraversal(path: string): boolean {\n return path.split(/[\\\\/]/).some((segment) => segment === \"..\");\n}\n\nexport function translateAttachPathToHost(\n filePath: string,\n pathContext: RuntimePathContext,\n): string {\n if (!pathContext.runtimeToHostPath) {\n throw new Error(\n \"Cannot attach files: this sandbox has no host-backed runtime path mapping; attachments are unavailable for remote sandboxes such as Cloudflare or Firecracker\",\n );\n }\n if (hasParentTraversal(filePath)) {\n throw new Error(\"Cannot attach files: parent-directory traversal is not allowed\");\n }\n\n const runtimeRoot = resolve(pathContext.runtimeWorkspaceRoot);\n const runtimePath = posix.isAbsolute(filePath)\n ? filePath\n : posix.join(pathContext.runtimeWorkspaceRoot, filePath);\n const normalizedRuntimePath = resolve(runtimePath);\n if (!isWithinPathRoot(normalizedRuntimePath, runtimeRoot)) {\n throw new Error(\"Cannot attach files: path must be within the runtime workspace\");\n }\n\n const hostRoot = resolve(pathContext.hostWorkspaceRoot);\n const translatedPath = pathContext.runtimeToHostPath(runtimePath);\n const hostPath = resolve(translatedPath);\n if (!isWithinPathRoot(hostPath, hostRoot)) {\n throw new Error(\"Cannot attach files: path must be within the host workspace\");\n }\n\n return hostPath;\n}\n\n/**\n * Normalize an attachment path using runtime lexical semantics only. The\n * executor remains the authority for reading the resulting runtime path.\n */\nfunction normalizeAttachRuntimePath(filePath: string, runtimeWorkspaceRoot: string): string {\n if (hasParentTraversal(filePath)) {\n throw new Error(\"Cannot attach files: parent-directory traversal is not allowed\");\n }\n\n const runtimeRoot = posix.resolve(runtimeWorkspaceRoot);\n const runtimePath = posix.resolve(runtimeRoot, filePath);\n const runtimeRelativePath = posix.relative(runtimeRoot, runtimePath);\n if (\n runtimeRelativePath === \"..\" ||\n runtimeRelativePath.startsWith(\"../\") ||\n posix.isAbsolute(runtimeRelativePath)\n ) {\n throw new Error(\"Cannot attach files: path must be within the runtime workspace\");\n }\n return runtimePath;\n}\n\nasync function withStagedRuntimeFile(\n executor: Executor,\n runtimePath: string,\n upload: (stagedPath: string) => Promise<void>,\n): Promise<void> {\n const content = Buffer.from(await executor.readFileBase64(runtimePath), \"base64\");\n let stagingDir: string | undefined;\n try {\n stagingDir = await mkdtemp(join(tmpdir(), \"mikan-upload-\"));\n await chmod(stagingDir, 0o700);\n const stagedPath = join(stagingDir, basename(runtimePath));\n await writeFile(stagedPath, content, { mode: 0o600, flag: \"wx\" });\n await chmod(stagedPath, 0o600);\n await upload(stagedPath);\n } finally {\n if (stagingDir) await rm(stagingDir, { recursive: true, force: true });\n }\n}\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 formatTimestampedUserMessage(message: ConversationMessage): string {\n return formatHistoryLine({\n date: new Date(),\n userName: message.userName,\n threadTs: message.threadTs,\n text: message.text,\n });\n}\n\nasync function collectMessageAttachments(\n message: ConversationMessage,\n workspacePath: string,\n pathContext?: RuntimePathContext,\n readAttachment?: (runtimePath: string) => Promise<string>,\n): Promise<{ 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) && readAttachment) {\n try {\n imageAttachments.push({\n type: \"image\",\n mimeType,\n data: await readAttachment(runtimePath),\n });\n } catch {\n nonImagePaths.push(runtimePath);\n }\n } else {\n nonImagePaths.push(runtimePath);\n }\n }\n\n return { imageAttachments, nonImagePaths };\n}\n\nexport async function buildPromptPayload(\n message: ConversationMessage,\n workspacePath: string,\n pathContext?: RuntimePathContext,\n readAttachment?: (runtimePath: string) => Promise<string>,\n): Promise<{\n userMessage: string;\n imageAttachments: ImageContent[];\n}> {\n let userMessage = formatTimestampedUserMessage(message);\n const { imageAttachments, nonImagePaths } = await collectMessageAttachments(\n message,\n workspacePath,\n pathContext,\n readAttachment,\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 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 // Package skills first: they are the lowest precedence, so a workspace or\n // conversation skill of the same name below overwrites them. A package can\n // offer a capability without taking the name away from whoever wants to\n // replace it locally.\n //\n // Unlike extension-shipped skills, these are NOT inlined into the prompt:\n // conversationPackageSkillMounts exposes them read-only at a runtime path,\n // so the agent can read the files — including any scripts or templates the\n // skill ships alongside its SKILL.md, which inlining could never carry.\n const mounted = workspacePath !== hostWorkspacePath;\n for (const { slug, dir } of resolveConversationPackages({\n conversationId: basename(conversationDir),\n stateDir: effectiveStateDir(),\n conversationDir,\n }).skillDirs) {\n const runtimeDir = packageSkillRuntimeDir(slug);\n for (const skill of loadSkillsFromDir({ dir, source: `package:${slug}` }).skills) {\n // In host mode there is no mount, so the host path is already the path\n // the agent will use.\n if (mounted) {\n skill.filePath = runtimeDir + skill.filePath.slice(dir.length);\n skill.baseDir = runtimeDir + skill.baseDir.slice(dir.length);\n }\n skillMap.set(skill.name, skill);\n }\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 natively from standard Markdown. Answer in normal Markdown/GFM.\n- Markdown pipe tables are rendered as native Slack tables.\n- For interactive elements (buttons, select menus), use the slack_blockkit tool; user interactions arrive as \"[Slack action] <action_id>: <value>\" messages.\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 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 // Slack mrkdwn italics cannot span a URL — a `_..._` wrapping a link renders\n // the underscores literally. Keep the session link outside the italic span.\n const suffix = sessionLink ? `${legacySuffix} · session: ${sessionLink}` : 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 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\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 subagentProgress: Map<string, SubagentProgressSnapshot>;\n completedSubagentProgress: SubagentProgressSnapshot[];\n subagentToolCalls: Set<string>;\n subagentProgressShown: boolean;\n suppressResponseDeltas: boolean;\n lastSubagentProgressAt: number;\n toolProgressTimer: ReturnType<typeof setTimeout> | undefined;\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\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 subagentProgress: new Map<string, SubagentProgressSnapshot>(),\n completedSubagentProgress: [],\n subagentToolCalls: new Set<string>(),\n subagentProgressShown: false,\n suppressResponseDeltas: false,\n lastSubagentProgressAt: 0,\n toolProgressTimer: undefined,\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.subagentProgress.clear();\n runState.completedSubagentProgress = [];\n runState.subagentToolCalls.clear();\n runState.subagentProgressShown = false;\n runState.suppressResponseDeltas = false;\n runState.lastSubagentProgressAt = 0;\n if (runState.toolProgressTimer) clearTimeout(runState.toolProgressTimer);\n runState.toolProgressTimer = undefined;\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 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\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\n/** Non-subagent tool activity lines; subagent calls render as the dashboard. */\nfunction formatToolProgress(runState: RunnerSessionState): string {\n const lines = Array.from(runState.toolProgress.entries()).flatMap(([toolCallId, item]) => {\n if (runState.subagentToolCalls.has(toolCallId)) return [];\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, text].filter(Boolean).join(\"\\n\\n\");\n}\n\n/**\n * The one dashboard render path. A responder that overrides\n * `replaceSubagentProgress` converts the snapshot for a pipeline that is not\n * response-source Markdown (Telegram HTML); every other platform receives the\n * Markdown dashboard — \"dashboard, blank line, answer\" — through\n * `replaceResponse`, the same conversion as any response.\n */\nasync function replaceWithSubagentDashboard(\n responder: ConversationResponder,\n snapshot: SubagentProgressSnapshot,\n finalText?: string,\n options?: { createOverflowLink?: () => string },\n): Promise<void> {\n if (responder.replaceSubagentProgress) {\n await responder.replaceSubagentProgress(snapshot, finalText);\n return;\n }\n const dashboard = renderSubagentDashboard(snapshot);\n await responder.replaceResponse(finalText ? `${dashboard}\\n\\n${finalText}` : dashboard, options);\n}\n\nasync function replaceResponseWithToolProgress(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n subagentProgress = mergeSubagentProgress([...runState.subagentProgress.values()]),\n): Promise<void> {\n if (subagentProgress) {\n await replaceWithSubagentDashboard(responder, subagentProgress);\n return;\n }\n const progress = formatToolProgress(runState);\n if (progress) await responder.replaceResponse(progress);\n}\n\nconst TOOL_PROGRESS_DEBOUNCE_MS = 500;\nconst SUBAGENT_PROGRESS_THROTTLE_MS = 2000;\n\nfunction subagentProgressDelay(runState: RunnerSessionState): number {\n if (!runState.subagentProgressShown) return 0;\n return Math.max(0, runState.lastSubagentProgressAt + SUBAGENT_PROGRESS_THROTTLE_MS - Date.now());\n}\n\nfunction scheduleToolProgressUpdate(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n): void {\n if (runState.toolProgressTimer) return;\n const subagentProgress = mergeSubagentProgress([...runState.subagentProgress.values()]);\n const delay = subagentProgress ? subagentProgressDelay(runState) : TOOL_PROGRESS_DEBOUNCE_MS;\n runState.toolProgressTimer = setTimeout(() => {\n runState.toolProgressTimer = undefined;\n const snapshot = mergeSubagentProgress([...runState.subagentProgress.values()]);\n if (snapshot) {\n runState.subagentProgressShown = true;\n runState.lastSubagentProgressAt = Date.now();\n }\n runState.queue?.enqueue(\n () => replaceResponseWithToolProgress(responder, runState, snapshot),\n \"tool progress update\",\n );\n }, delay);\n runState.toolProgressTimer.unref();\n}\n\nfunction flushToolProgressUpdate(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n): void {\n if (runState.toolProgressTimer) clearTimeout(runState.toolProgressTimer);\n runState.toolProgressTimer = undefined;\n const subagentProgress = mergeSubagentProgress([...runState.subagentProgress.values()]);\n if (subagentProgress) {\n runState.subagentProgressShown = true;\n runState.lastSubagentProgressAt = Date.now();\n }\n runState.queue?.enqueue(\n () => replaceResponseWithToolProgress(responder, runState, subagentProgress),\n \"tool progress update\",\n );\n}\n\nfunction extractSubagentProgress(partialResult: unknown): SubagentProgressSnapshot | undefined {\n if (!partialResult || typeof partialResult !== \"object\") return undefined;\n const details = (partialResult as { details?: unknown }).details;\n if (!details || typeof details !== \"object\") return undefined;\n return parseSubagentProgressSnapshot((details as { progress?: unknown }).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 const finalResponse = appendTriggerAttribution(\n finalText,\n options?.triggerAttribution,\n options?.triggerSessionLink,\n );\n const finalDashboard = mergeSubagentProgress(runState.completedSubagentProgress);\n if (finalDashboard) {\n await replaceWithSubagentDashboard(responder, finalDashboard, finalResponse, {\n createOverflowLink: options?.createOverflowLink,\n });\n return;\n }\n await responder.replaceResponse(formatResponseWithToolProgress(finalResponse, runState), {\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 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\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\ninterface RunnerExecutionContext {\n executionResolver?: ActorExecutionResolver;\n executor: Executor;\n getPathContext: () => RuntimePathContext;\n resolveExecutorForRun(context: {\n platform: string;\n userId: string;\n conversationId: string;\n trustModel?: PlatformTrustModel;\n }): Promise<void>;\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 /** Registry backing extension command dispatch for this harness instance. */\n extensionRegistry: ExtensionRegistry;\n /** Runs extension disposers; call once when the runner is discarded. */\n disposeExtensions: () => Promise<void>;\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(\n sandboxConfig,\n vaultManager,\n provisioner,\n workspaceDir,\n hostWorkspacePath,\n )\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 readFile(path, options) {\n return activeExecutor.readFile(path, options);\n },\n readFileBase64(path, options) {\n return activeExecutor.readFileBase64(path, options);\n },\n writeFile(path, content, options) {\n return activeExecutor.writeFile(path, content, 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 platformReactor?: PlatformReactor;\n platformUploader?: PlatformUploader;\n platformBlockKit?: PlatformBlockKit;\n runSubagentService?: ExtensionHostServices[\"runSubagent\"];\n}): ExtensionHostServices {\n const {\n workspaceDir,\n vaultManager,\n platformNotifier,\n platformReactor,\n platformUploader,\n platformBlockKit,\n runSubagentService,\n } = params;\n const eventStore = HostEventStore.fromWorkspaceDir(workspaceDir);\n return {\n stateDir: effectiveStateDir(),\n scheduleStore: {\n write: async (filename, payload) => {\n await eventStore.write(filename, payload);\n },\n delete: async (filename) => (await eventStore.delete(filename)).deleted,\n list: async () =>\n (await eventStore.list()).flatMap((entry) =>\n entry.payload ? [{ filename: entry.filename, payload: entry.payload }] : [],\n ),\n },\n ...(platformNotifier ? { postMessage: platformNotifier } : {}),\n ...(platformReactor ? { addReaction: platformReactor } : {}),\n ...(platformUploader ? { uploadFile: platformUploader } : {}),\n ...(platformBlockKit\n ? { postBlocks: platformBlockKit.postBlocks, updateBlocks: platformBlockKit.updateBlocks }\n : {}),\n ...(runSubagentService ? { runSubagent: runSubagentService } : {}),\n ...(vaultManager\n ? {\n resolveSecrets: (slug: string) => vaultManager.resolve(`extensions/${slug}`)?.env ?? {},\n }\n : {}),\n };\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 platformReactor?: PlatformReactor;\n platformUploader?: PlatformUploader;\n platformBlockKit?: PlatformBlockKit;\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 platformReactor,\n platformUploader,\n platformBlockKit,\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 // resolveConversationPackages only ever returns state-dir paths (and host\n // paths an administrator named explicitly in settings); it never reaches\n // the network on this path, so a slow remote cannot delay a reply.\n let session: MikanAgentSession | undefined;\n const loadedProfiles = loadSubagentProfiles(workspaceDir);\n for (const diagnostic of loadedProfiles.diagnostics) {\n log.logWarning(\n `[${conversationId}] Subagent profile ignored: ${diagnostic.path}`,\n diagnostic.message,\n );\n }\n // Narrowed to the profiles whose tools actually exist once extensions have\n // contributed theirs. Both subagent entry points read this at call time, so\n // they always agree on which profiles are launchable.\n let runnableSubagentProfiles = loadedProfiles.profiles;\n const resolvedPackages = resolveConversationPackages({\n conversationId,\n stateDir: effectiveStateDir(),\n conversationDir: join(workspaceDir, conversationId),\n });\n for (const error of resolvedPackages.errors) {\n log.logWarning(`Package unavailable: ${error.source}`, error.message);\n }\n const extensionsResult = await loadExtensions({\n dirs: resolvedPackages.extensionDirs,\n roots: resolvedPackages.extensionRoots,\n context: { conversationId, workspaceDir, model, thinkingLevel },\n services: buildExtensionHostServices({\n workspaceDir,\n vaultManager,\n platformNotifier,\n platformReactor,\n platformUploader,\n platformBlockKit,\n runSubagentService: (request, extensionTools) => {\n const activeParent = session?.isActiveRun ? session : undefined;\n return runSubagent({\n request,\n defaultModel: model,\n thinkingLevel,\n models,\n workspaceDir,\n availableTools: [...tools, ...extensionTools],\n profiles: runnableSubagentProfiles,\n slots: globalSubagentSlots,\n ...(activeParent\n ? {\n parentMessages: [...activeParent.messages],\n onUsage: activeParent.captureExternalUsageSink(),\n }\n : {}),\n });\n },\n }),\n });\n const contributedTools = extensionsResult.registry.getContributedTools();\n const subagentAvailableTools = [...tools, ...contributedTools];\n const availableToolNames = new Set(subagentAvailableTools.map((tool) => tool.name));\n runnableSubagentProfiles = new Map(\n [...loadedProfiles.profiles].filter(([, profile]) =>\n profile.tools.every((tool) => availableToolNames.has(tool)),\n ),\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 subagentTool = createSubagentTool(\n (request) =>\n runSubagent({\n request,\n defaultModel: model,\n thinkingLevel,\n models,\n workspaceDir,\n availableTools: subagentAvailableTools,\n profiles: runnableSubagentProfiles,\n slots: globalSubagentSlots,\n parentMessages: [...session!.messages],\n onUsage: session!.captureExternalUsageSink(),\n }),\n runnableSubagentProfiles,\n );\n\n session = new MikanAgentSession({\n systemPrompt,\n model,\n thinkingLevel,\n tools: [...tools, subagentTool],\n models,\n sessionStore,\n extensions: extensionsResult.registry,\n });\n\n const activeSession = session;\n const reloaded = activeSession.reloadFromSession();\n if (reloaded > 0) {\n log.logInfo(`[${conversationId}] Reloaded ${reloaded} messages from session context`);\n }\n return {\n session: activeSession,\n extensionSkills: extensionsResult.skills,\n extensionRegistry: extensionsResult.registry,\n disposeExtensions: extensionsResult.dispose,\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 setReactFunction: (fn: ((emoji: string) => Promise<void>) | null) => void;\n bindPlatformToolPacks: (ctx: PlatformToolRunContext) => 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 setReactFunction,\n bindPlatformToolPacks,\n } = params;\n let pathContext = params.pathContext;\n const sessionConversation = conversationIdOf(message.sessionKey);\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 trustModel: platform.trustModel,\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). This is the base prompt mikan\n // builds; a `before_agent_start` extension may still rewrite it per turn\n // (logged separately by the runner).\n const promptHash = createHash(\"sha256\").update(systemPrompt).digest(\"hex\").slice(0, 8);\n log.logInfo(\n `[${conversationId}] System prompt (base): ${systemPrompt.length} chars, sha ${promptHash}`,\n );\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 runtimePath = normalizeAttachRuntimePath(filePath, pathContext.runtimeWorkspaceRoot);\n await withStagedRuntimeFile(executor, runtimePath, (stagedPath) =>\n responder.uploadFile(stagedPath, title),\n );\n });\n\n // The react tool is available only when the responder supports reactions\n // (interactive turns on platforms with reaction support); otherwise unset\n // so the tool reports it is unavailable rather than silently no-op'ing.\n setReactFunction(responder.react ? async (emoji: string) => responder.react!(emoji) : null);\n\n // Platform capability packs (e.g. GitHub PR/CI) enable themselves per run;\n // core does not branch on platform name here.\n bindPlatformToolPacks({\n conversationId,\n platformName: platform.name,\n threadTs: message.threadTs,\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 } = await buildPromptPayload(\n message,\n pathContext.runtimeWorkspaceRoot,\n pathContext,\n (runtimePath) => executor.readFileBase64(runtimePath),\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 return {\n sessionConversation,\n runQueue,\n userMessage: finalUserMessage,\n imageAttachments,\n triggerAttribution,\n pathContext,\n };\n}\n\n/**\n * The dream run reads a transcript in which the agent held its full tool set,\n * but `sessionDreamTools` has since narrowed it. Left to infer its grant from\n * the transcript, the model calls a tool it no longer holds and burns one of\n * its five turns on the failure — so the grant is stated, and derived from the\n * tools actually handed to the run rather than restated by hand.\n */\nfunction sessionDreamPrompt(conversationMemoryPath: string, toolNames: string[]): string {\n // read/edit/write are core tools, so an empty grant does not arise today;\n // the fallback only keeps this sentence coherent if that ever changes.\n const grant =\n toolNames.length === 0\n ? \"You have no tools in this run and cannot change memory. Say so and stop.\"\n : `Your tools this run: ${toolNames.join(\", \")}. Nothing else will execute, including tools used earlier in this transcript. ${conversationMemoryPath} is the only path you may write.`;\n return [\n \"Before this conversation is reset or rotated, preserve only durable information worth carrying into future sessions of this same conversation.\",\n `Review the existing transcript and update only the conversation-specific MEMORY.md at ${conversationMemoryPath}.`,\n grant,\n \"Do not modify the workspace-level global MEMORY.md. Information from one DM or channel must not be promoted into memory shared with other conversations by this maintenance run.\",\n \"Preserve durable decisions, preferences, facts, and ongoing work specific to this conversation. Preserve the concrete values and details needed to resume the work; do not replace them with abstract categories, summaries of retention rules, or statements that merely say a kind of information is durable. An explicit user statement that a fact, preference, or decision should persist is strong evidence that its exact content is worth preserving.\",\n \"Deduplicate against existing conversation memory. Do not preserve transient discussion, tool noise, secrets, speculative details, or test scaffolding. If there is nothing new worth preserving, make no changes. Do no unrelated work.\",\n ].join(\"\\n\");\n}\n\nconst SESSION_DREAM_BUDGET = {\n maxDurationMs: 2 * 60 * 1000,\n maxLlmCalls: 10,\n};\n\nfunction sessionDreamTools(tools: AgentTool[], conversationMemoryPath: string): AgentTool[] {\n return tools\n .filter((tool) => tool.name === \"read\" || tool.name === \"edit\" || tool.name === \"write\")\n .map((tool) => {\n if (tool.name === \"read\") return tool;\n return Object.assign({}, tool, {\n execute: async (...args: Parameters<AgentTool[\"execute\"]>) => {\n const params = args[1] as { path?: unknown };\n if (params.path !== conversationMemoryPath) {\n throw new Error(`Session Dream may only modify ${conversationMemoryPath}`);\n }\n return tool.execute(...args);\n },\n });\n });\n}\n\nasync function noopResponderMethod(): Promise<void> {}\n\nfunction createNoopResponder(): ConversationResponder {\n return {\n respond: noopResponderMethod,\n replaceResponse: noopResponderMethod,\n respondDiagnostic: noopResponderMethod,\n respondToolResult: noopResponderMethod,\n setTyping: noopResponderMethod,\n setWorking: noopResponderMethod,\n uploadFile: noopResponderMethod,\n deleteResponse: noopResponderMethod,\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 if (event.toolName === \"subagent\") {\n runState.subagentToolCalls.add(event.toolCallId);\n } else {\n queue.enqueue(\n () => replaceResponseWithToolProgress(responder, runState),\n \"tool progress update\",\n );\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_update\") {\n const subagentProgress = extractSubagentProgress(event.partialResult);\n if (subagentProgress) {\n runState.subagentProgress.set(event.toolCallId, subagentProgress);\n runState.subagentToolCalls.add(event.toolCallId);\n runState.suppressResponseDeltas = true;\n scheduleToolProgressUpdate(responder, runState);\n }\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 const subagentProgress = runState.subagentProgress.get(event.toolCallId);\n if (subagentProgress) {\n runState.subagentProgress.set(\n event.toolCallId,\n settleSubagentProgress(subagentProgress, event.isError),\n );\n }\n flushToolProgressUpdate(responder, runState);\n const completedProgress = runState.subagentProgress.get(event.toolCallId);\n if (completedProgress) runState.completedSubagentProgress.push(completedProgress);\n runState.subagentProgress.delete(event.toolCallId);\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 if (event.toolName === \"slack_blockkit\") {\n runState.finalResponseHandledByTool = true;\n }\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 && !runState.suppressResponseDeltas) {\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 // A run that produced a subagent dashboard finalizes through it:\n // finalizeRunResponse renders \"dashboard, blank line, answer\", and a\n // finish here would first overwrite the dashboard with the bare\n // answer on every platform.\n if (runState.completedSubagentProgress.length > 0) return;\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\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(options: CreateRunnerOptions): Promise<PiAgentWrapper> {\n const {\n sandboxConfig,\n sessionKey,\n conversationId,\n conversationDir,\n workspaceDir,\n sessionScope,\n vaultManager,\n provisioner,\n resourceController,\n sessionView,\n platformNotifier,\n platformReactor,\n platformUploader,\n platformBlockKit,\n platformToolPackFactories,\n } = options;\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 const modelRegistry = options.models ?? MikanModels.create();\n if (modelRegistry.getError()) {\n log.logWarning(\"models.json load error\", modelRegistry.getError()!);\n }\n const model = modelRegistry.resolve(agentConfig.provider, agentConfig.model);\n\n // Create tools (per-runner, with per-runner upload function setter)\n const {\n tools,\n setUploadFunction,\n setReactFunction,\n bindPlatformToolPacks,\n setEventContext,\n setSandboxContext,\n } = createMikanTools(\n executor,\n workspaceDir,\n { sandbox: sandboxConfig, resourceController: resourceController ?? provisioner },\n platformToolPackFactories ?? [],\n {\n model,\n getApiKey: () => modelRegistry.getApiKeyForProvider(model.provider),\n },\n );\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 trustModel: \"membership\",\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 = isThreadSessionKey(sessionKey);\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 ChatHistorySync();\n const { session, extensionSkills, extensionRegistry, disposeExtensions } =\n 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 platformReactor,\n platformUploader,\n platformBlockKit,\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 setReactFunction,\n bindPlatformToolPacks,\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 // Event runs have no triggering platform message, so identity fields\n // stay unset and extensions must null-check them.\n const origin: RunOrigin = isEventRun\n ? { kind: \"event\", platform: platform.name }\n : {\n kind: \"interactive\",\n platform: platform.name,\n messageTs: message.id,\n userId: message.userId,\n userName: message.userName,\n threadTs: message.threadTs,\n attachments: message.attachments,\n };\n const outcome = await session.prompt(prepared.userMessage, {\n origin,\n ...(prepared.imageAttachments.length > 0 ? { images: prepared.imageAttachments } : {}),\n ...(isEventRun ? { budget: DEFAULT_EVENT_BUDGET } : {}),\n });\n\n if (outcome?.blocked) {\n const text = outcome.reason\n ? `_Turn blocked by an extension: ${outcome.reason}_`\n : \"_Turn blocked by an extension._\";\n sendAgentEvent({\n sessionId: sessionUuid,\n actorName: formatAgentActorName(message.userName, prepared.sessionConversation),\n event: { kind: \"diagnostic\", text },\n });\n await responder.respondDiagnostic(text, { style: \"muted\" });\n runState.responder = null;\n runState.logCtx = null;\n runState.queue = null;\n return { stopReason: \"blocked\" };\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 async dreamSessionMemory(\n message: ConversationMessage,\n platform: MessagingInfo,\n ): Promise<{ stopReason: string; errorMessage?: string }> {\n const responder = createNoopResponder();\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 setReactFunction,\n bindPlatformToolPacks,\n pathContext,\n });\n pathContext = prepared.pathContext;\n\n try {\n const conversationMemoryPath = posix.join(\n prepared.pathContext.runtimeWorkspaceRoot,\n conversationId,\n \"MEMORY.md\",\n );\n const dreamTools = sessionDreamTools(session.agent.state.tools, conversationMemoryPath);\n const outcome = await session.prompt(\n sessionDreamPrompt(\n conversationMemoryPath,\n dreamTools.map((tool) => tool.name),\n ),\n {\n origin: {\n kind: \"interactive\",\n platform: platform.name,\n messageTs: message.id,\n userId: message.userId,\n userName: message.userName,\n threadTs: message.threadTs,\n attachments: message.attachments,\n },\n budget: SESSION_DREAM_BUDGET,\n tools: dreamTools,\n },\n );\n if (outcome?.blocked) {\n return { stopReason: \"blocked\", errorMessage: outcome.reason };\n }\n await prepared.runQueue.wait();\n // A budget abort carries its reason in the tally, not in errorMessage,\n // and that reason is the only thing that tells the user why memory was\n // not preserved.\n return {\n stopReason: runState.stopReason,\n errorMessage: runState.errorMessage ?? session.getLastRunStats().budgetExceededReason,\n };\n } finally {\n runState.responder = null;\n runState.logCtx = null;\n runState.queue = null;\n }\n },\n\n abort(): void {\n session.abort();\n },\n\n async tryExtensionCommand(\n message: ConversationMessage,\n responder: ConversationResponder,\n ): Promise<boolean> {\n const parsed = parseCommandInput(message.text);\n if (!parsed) return false;\n return extensionRegistry.dispatchCommand(parsed.name, {\n args: parsed.args,\n conversationId,\n userId: message.userId,\n userName: message.userName,\n threadTs: message.threadTs,\n respond: (text: string) => responder.respond(text),\n });\n },\n\n async tryExtensionAction(slug: string, action: ExtensionBlockAction): Promise<boolean> {\n return extensionRegistry.dispatchAction(slug, action);\n },\n\n async dispose(): Promise<void> {\n await disposeExtensions();\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"]}
@@ -28,7 +28,7 @@ export const DEFAULT_BUDGET_SETTINGS = {};
28
28
  export const DEFAULT_EVENT_BUDGET = {
29
29
  maxDurationMs: 10 * 60 * 1000,
30
30
  maxLlmCalls: 50,
31
- maxCostUsd: 2,
31
+ maxCostUsd: 10,
32
32
  };
33
33
  export function resolveHarnessSettings(overrides) {
34
34
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/harness/settings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAO5E,MAAM,CAAC,MAAM,sBAAsB,GAAkB;IACnD,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,IAAI;CAClB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,mFAAmF;AACnF,MAAM,CAAC,MAAM,uBAAuB,GAAmB,EAAE,CAAC;AAE1D;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAmB;IAClD,aAAa,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;IAC7B,WAAW,EAAE,EAAE;IACf,UAAU,EAAE,CAAC;CACd,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,SAItC;IACC,OAAO;QACL,UAAU,EAAE,EAAE,GAAG,2BAA2B,EAAE,GAAG,SAAS,EAAE,UAAU,EAAE;QACxE,KAAK,EAAE,EAAE,GAAG,sBAAsB,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE;QACzD,MAAM,EAAE,EAAE,GAAG,uBAAuB,EAAE,GAAG,SAAS,EAAE,MAAM,EAAE;KAC7D,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Runtime settings for the mikan harness. mikan runs headless, so these are\n * plain values with defaults matching the behavior mikan shipped with.\n */\nimport { DEFAULT_COMPACTION_SETTINGS } from \"@earendil-works/pi-agent-core\";\nimport type { CompactionSettings } from \"@earendil-works/pi-agent-core\";\nimport type { BudgetSettings, HarnessSettings, RetrySettings } from \"./types.js\";\n\nexport type { CompactionSettings };\nexport type { BudgetSettings, HarnessSettings, RetrySettings } from \"./types.js\";\n\nexport const DEFAULT_RETRY_SETTINGS: RetrySettings = {\n enabled: true,\n maxRetries: 3,\n baseDelayMs: 2000,\n};\n\n/**\n * Per-run resource ceilings — the harness's external circuit breakers.\n *\n * An LLM cannot reliably decide on its own when to stop (the halting problem),\n * so a runaway run has to be stopped from the outside. When any populated cap\n * is exceeded, the run is aborted and a `budget_exceeded` event is emitted.\n * Every field is a cap on a single `prompt()` call; an undefined field means\n * \"no cap on that axis\". Interactive runs are gated turn-by-turn by a human,\n * so they default to uncapped; autonomous runs (scheduled events, triggers)\n * pass {@link DEFAULT_EVENT_BUDGET}, where nobody is watching the loop.\n */\n/** Interactive runs are human-gated per turn — no automatic ceiling by default. */\nexport const DEFAULT_BUDGET_SETTINGS: BudgetSettings = {};\n\n/**\n * Ceiling for autonomous (event / trigger) runs, where no human is watching\n * the loop. Deliberately generous — it is a stop-loss, not a target.\n */\nexport const DEFAULT_EVENT_BUDGET: BudgetSettings = {\n maxDurationMs: 10 * 60 * 1000,\n maxLlmCalls: 50,\n maxCostUsd: 2,\n};\n\nexport function resolveHarnessSettings(overrides?: {\n compaction?: Partial<CompactionSettings>;\n retry?: Partial<RetrySettings>;\n budget?: Partial<BudgetSettings>;\n}): HarnessSettings {\n return {\n compaction: { ...DEFAULT_COMPACTION_SETTINGS, ...overrides?.compaction },\n retry: { ...DEFAULT_RETRY_SETTINGS, ...overrides?.retry },\n budget: { ...DEFAULT_BUDGET_SETTINGS, ...overrides?.budget },\n };\n}\n"]}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/harness/settings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAO5E,MAAM,CAAC,MAAM,sBAAsB,GAAkB;IACnD,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,IAAI;CAClB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,mFAAmF;AACnF,MAAM,CAAC,MAAM,uBAAuB,GAAmB,EAAE,CAAC;AAE1D;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAmB;IAClD,aAAa,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;IAC7B,WAAW,EAAE,EAAE;IACf,UAAU,EAAE,EAAE;CACf,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,SAItC;IACC,OAAO;QACL,UAAU,EAAE,EAAE,GAAG,2BAA2B,EAAE,GAAG,SAAS,EAAE,UAAU,EAAE;QACxE,KAAK,EAAE,EAAE,GAAG,sBAAsB,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE;QACzD,MAAM,EAAE,EAAE,GAAG,uBAAuB,EAAE,GAAG,SAAS,EAAE,MAAM,EAAE;KAC7D,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Runtime settings for the mikan harness. mikan runs headless, so these are\n * plain values with defaults matching the behavior mikan shipped with.\n */\nimport { DEFAULT_COMPACTION_SETTINGS } from \"@earendil-works/pi-agent-core\";\nimport type { CompactionSettings } from \"@earendil-works/pi-agent-core\";\nimport type { BudgetSettings, HarnessSettings, RetrySettings } from \"./types.js\";\n\nexport type { CompactionSettings };\nexport type { BudgetSettings, HarnessSettings, RetrySettings } from \"./types.js\";\n\nexport const DEFAULT_RETRY_SETTINGS: RetrySettings = {\n enabled: true,\n maxRetries: 3,\n baseDelayMs: 2000,\n};\n\n/**\n * Per-run resource ceilings — the harness's external circuit breakers.\n *\n * An LLM cannot reliably decide on its own when to stop (the halting problem),\n * so a runaway run has to be stopped from the outside. When any populated cap\n * is exceeded, the run is aborted and a `budget_exceeded` event is emitted.\n * Every field is a cap on a single `prompt()` call; an undefined field means\n * \"no cap on that axis\". Interactive runs are gated turn-by-turn by a human,\n * so they default to uncapped; autonomous runs (scheduled events, triggers)\n * pass {@link DEFAULT_EVENT_BUDGET}, where nobody is watching the loop.\n */\n/** Interactive runs are human-gated per turn — no automatic ceiling by default. */\nexport const DEFAULT_BUDGET_SETTINGS: BudgetSettings = {};\n\n/**\n * Ceiling for autonomous (event / trigger) runs, where no human is watching\n * the loop. Deliberately generous — it is a stop-loss, not a target.\n */\nexport const DEFAULT_EVENT_BUDGET: BudgetSettings = {\n maxDurationMs: 10 * 60 * 1000,\n maxLlmCalls: 50,\n maxCostUsd: 10,\n};\n\nexport function resolveHarnessSettings(overrides?: {\n compaction?: Partial<CompactionSettings>;\n retry?: Partial<RetrySettings>;\n budget?: Partial<BudgetSettings>;\n}): HarnessSettings {\n return {\n compaction: { ...DEFAULT_COMPACTION_SETTINGS, ...overrides?.compaction },\n retry: { ...DEFAULT_RETRY_SETTINGS, ...overrides?.retry },\n budget: { ...DEFAULT_BUDGET_SETTINGS, ...overrides?.budget },\n };\n}\n"]}
@@ -3,7 +3,6 @@ export declare class HostExecutor implements Executor {
3
3
  exec(command: string, options?: ExecOptions): Promise<ExecResult>;
4
4
  readFile(path: string): Promise<string>;
5
5
  readFileBase64(path: string): Promise<string>;
6
- readFileBase64NoSymlinks(path: string): Promise<string>;
7
6
  writeFile(path: string, content: string): Promise<void>;
8
7
  getWorkspacePath(hostPath: string): string;
9
8
  getPathContext(hostWorkspaceRoot: string): RuntimePathContext;
@@ -1 +1 @@
1
- {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/sandbox/host.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,QAAQ,EACR,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACf,MAAM,YAAY,CAAC;AAWpB,qBAAa,YAAa,YAAW,QAAQ;IACrC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAuEtE;IAEK,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE5C;IAEK,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAElD;IAEK,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4C5D;IAEK,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK5D;IAED,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzC;IAED,cAAc,CAAC,iBAAiB,EAAE,MAAM,GAAG,kBAAkB,CAE5D;IAED,gBAAgB,IAAI,iBAAiB,CAEpC;CACF;AAED,eAAO,MAAM,kBAAkB,EAAE,cAAc,CAAC,iBAAiB,CAKhE,CAAC"}
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/sandbox/host.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,QAAQ,EACR,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACf,MAAM,YAAY,CAAC;AAWpB,qBAAa,YAAa,YAAW,QAAQ;IACrC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAuEtE;IAEK,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE5C;IAEK,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAElD;IAEK,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK5D;IAED,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzC;IAED,cAAc,CAAC,iBAAiB,EAAE,MAAM,GAAG,kBAAkB,CAE5D;IAED,gBAAgB,IAAI,iBAAiB,CAEpC;CACF;AAED,eAAO,MAAM,kBAAkB,EAAE,cAAc,CAAC,iBAAiB,CAKhE,CAAC"}
@@ -1,7 +1,6 @@
1
1
  import { spawn } from "child_process";
2
- import { constants } from "fs";
3
- import { mkdir, open, readFile, rename, writeFile } from "fs/promises";
4
- import { dirname, isAbsolute, relative, sep } from "path";
2
+ import { mkdir, readFile, rename, writeFile } from "fs/promises";
3
+ import { dirname } from "path";
5
4
  import { killProcessTree } from "./utils.js";
6
5
  import { createMountedRuntimePathContext } from "./path-context.js";
7
6
  function parseHostSandboxArg(value) {
@@ -76,42 +75,6 @@ export class HostExecutor {
76
75
  async readFileBase64(path) {
77
76
  return (await readFile(path)).toString("base64");
78
77
  }
79
- async readFileBase64NoSymlinks(path) {
80
- if (process.platform !== "linux") {
81
- throw new Error("Attachments are unavailable: this host cannot guarantee symlink-free path traversal");
82
- }
83
- if (!isAbsolute(path)) {
84
- throw new Error("Attachments require an absolute host path");
85
- }
86
- const root = path.slice(0, path.startsWith(sep) ? 1 : 0) || sep;
87
- const relativePath = relative(root, path);
88
- const parts = relativePath.split(sep).filter((part) => part.length > 0);
89
- if (parts.length === 0 || parts.some((part) => part === "." || part === "..")) {
90
- throw new Error("Attachments require a regular file below the host root");
91
- }
92
- const opened = [];
93
- let directory = await open(root, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
94
- opened.push(directory);
95
- try {
96
- for (const [index, part] of parts.entries()) {
97
- const isFile = index === parts.length - 1;
98
- const flags = constants.O_RDONLY | constants.O_NOFOLLOW;
99
- const next = await open(`/proc/self/fd/${directory.fd}/${part}`, flags | (isFile ? 0 : constants.O_DIRECTORY));
100
- opened.push(next);
101
- if (isFile) {
102
- const stat = await next.stat();
103
- if (!stat.isFile())
104
- throw new Error("Attachments require a regular file");
105
- return (await next.readFile()).toString("base64");
106
- }
107
- directory = next;
108
- }
109
- }
110
- finally {
111
- await Promise.all(opened.toReversed().map((handle) => handle.close()));
112
- }
113
- throw new Error("Attachments require a regular file");
114
- }
115
78
  async writeFile(path, content) {
116
79
  await mkdir(dirname(path), { recursive: true });
117
80
  const stage = `${path}.mikan-stage`;
@@ -1 +1 @@
1
- {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/sandbox/host.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"child_process\";\nimport { constants } from \"fs\";\nimport { mkdir, open, readFile, rename, writeFile } from \"fs/promises\";\nimport { dirname, isAbsolute, relative, sep } from \"path\";\nimport type { FileHandle } from \"fs/promises\";\nimport type {\n ExecOptions,\n ExecResult,\n Executor,\n HostSandboxConfig,\n RuntimePathContext,\n SandboxAdapter,\n} from \"./types.js\";\nimport { killProcessTree } from \"./utils.js\";\nimport { createMountedRuntimePathContext } from \"./path-context.js\";\n\nfunction parseHostSandboxArg(value: string): HostSandboxConfig | undefined {\n if (value === \"host\") {\n return { type: \"host\" };\n }\n return undefined;\n}\n\nexport class HostExecutor implements Executor {\n async exec(command: string, options?: ExecOptions): Promise<ExecResult> {\n return new Promise((resolve, reject) => {\n const shell = process.platform === \"win32\" ? \"cmd\" : \"sh\";\n const shellArgs = process.platform === \"win32\" ? [\"/c\"] : [\"-c\"];\n\n const child = spawn(shell, [...shellArgs, command], {\n detached: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n\n const timeoutHandle =\n options?.timeout && options.timeout > 0\n ? setTimeout(() => {\n timedOut = true;\n killProcessTree(child.pid!);\n }, options.timeout * 1000)\n : undefined;\n\n const onAbort = () => {\n if (child.pid) killProcessTree(child.pid);\n };\n\n if (options?.signal) {\n if (options.signal.aborted) {\n onAbort();\n } else {\n options.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n }\n\n child.stdout?.on(\"data\", (data) => {\n stdout += data.toString();\n if (stdout.length > 10 * 1024 * 1024) {\n stdout = stdout.slice(0, 10 * 1024 * 1024);\n }\n });\n\n child.stderr?.on(\"data\", (data) => {\n stderr += data.toString();\n if (stderr.length > 10 * 1024 * 1024) {\n stderr = stderr.slice(0, 10 * 1024 * 1024);\n }\n });\n\n child.on(\"close\", (code) => {\n if (timeoutHandle) clearTimeout(timeoutHandle);\n if (options?.signal) {\n options.signal.removeEventListener(\"abort\", onAbort);\n }\n\n if (options?.signal?.aborted) {\n reject(new Error(`${stdout}\\n${stderr}\\nCommand aborted`.trim()));\n return;\n }\n\n if (timedOut) {\n reject(\n new Error(\n `${stdout}\\n${stderr}\\nCommand timed out after ${options?.timeout} seconds`.trim(),\n ),\n );\n return;\n }\n\n resolve({ stdout, stderr, code: code ?? 0 });\n });\n });\n }\n\n async readFile(path: string): Promise<string> {\n return readFile(path, \"utf-8\");\n }\n\n async readFileBase64(path: string): Promise<string> {\n return (await readFile(path)).toString(\"base64\");\n }\n\n async readFileBase64NoSymlinks(path: string): Promise<string> {\n if (process.platform !== \"linux\") {\n throw new Error(\n \"Attachments are unavailable: this host cannot guarantee symlink-free path traversal\",\n );\n }\n if (!isAbsolute(path)) {\n throw new Error(\"Attachments require an absolute host path\");\n }\n\n const root = path.slice(0, path.startsWith(sep) ? 1 : 0) || sep;\n const relativePath = relative(root, path);\n const parts = relativePath.split(sep).filter((part) => part.length > 0);\n if (parts.length === 0 || parts.some((part) => part === \".\" || part === \"..\")) {\n throw new Error(\"Attachments require a regular file below the host root\");\n }\n\n const opened: FileHandle[] = [];\n let directory = await open(\n root,\n constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW,\n );\n opened.push(directory);\n try {\n for (const [index, part] of parts.entries()) {\n const isFile = index === parts.length - 1;\n const flags = constants.O_RDONLY | constants.O_NOFOLLOW;\n const next = await open(\n `/proc/self/fd/${directory.fd}/${part}`,\n flags | (isFile ? 0 : constants.O_DIRECTORY),\n );\n opened.push(next);\n if (isFile) {\n const stat = await next.stat();\n if (!stat.isFile()) throw new Error(\"Attachments require a regular file\");\n return (await next.readFile()).toString(\"base64\");\n }\n directory = next;\n }\n } finally {\n await Promise.all(opened.toReversed().map((handle) => handle.close()));\n }\n\n throw new Error(\"Attachments require a regular file\");\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n const stage = `${path}.mikan-stage`;\n await writeFile(stage, content, \"utf-8\");\n await rename(stage, path);\n }\n\n getWorkspacePath(hostPath: string): string {\n return hostPath;\n }\n\n getPathContext(hostWorkspaceRoot: string): RuntimePathContext {\n return createMountedRuntimePathContext(hostWorkspaceRoot, hostWorkspaceRoot);\n }\n\n getSandboxConfig(): HostSandboxConfig {\n return { type: \"host\" };\n }\n}\n\nexport const hostSandboxAdapter: SandboxAdapter<HostSandboxConfig> = {\n type: \"host\",\n credentials: { env: false, fileMounts: false },\n parse: parseHostSandboxArg,\n createExecutor: () => new HostExecutor(),\n};\n"]}
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/sandbox/host.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"child_process\";\nimport { mkdir, readFile, rename, writeFile } from \"fs/promises\";\nimport { dirname } from \"path\";\nimport type {\n ExecOptions,\n ExecResult,\n Executor,\n HostSandboxConfig,\n RuntimePathContext,\n SandboxAdapter,\n} from \"./types.js\";\nimport { killProcessTree } from \"./utils.js\";\nimport { createMountedRuntimePathContext } from \"./path-context.js\";\n\nfunction parseHostSandboxArg(value: string): HostSandboxConfig | undefined {\n if (value === \"host\") {\n return { type: \"host\" };\n }\n return undefined;\n}\n\nexport class HostExecutor implements Executor {\n async exec(command: string, options?: ExecOptions): Promise<ExecResult> {\n return new Promise((resolve, reject) => {\n const shell = process.platform === \"win32\" ? \"cmd\" : \"sh\";\n const shellArgs = process.platform === \"win32\" ? [\"/c\"] : [\"-c\"];\n\n const child = spawn(shell, [...shellArgs, command], {\n detached: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n\n const timeoutHandle =\n options?.timeout && options.timeout > 0\n ? setTimeout(() => {\n timedOut = true;\n killProcessTree(child.pid!);\n }, options.timeout * 1000)\n : undefined;\n\n const onAbort = () => {\n if (child.pid) killProcessTree(child.pid);\n };\n\n if (options?.signal) {\n if (options.signal.aborted) {\n onAbort();\n } else {\n options.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n }\n\n child.stdout?.on(\"data\", (data) => {\n stdout += data.toString();\n if (stdout.length > 10 * 1024 * 1024) {\n stdout = stdout.slice(0, 10 * 1024 * 1024);\n }\n });\n\n child.stderr?.on(\"data\", (data) => {\n stderr += data.toString();\n if (stderr.length > 10 * 1024 * 1024) {\n stderr = stderr.slice(0, 10 * 1024 * 1024);\n }\n });\n\n child.on(\"close\", (code) => {\n if (timeoutHandle) clearTimeout(timeoutHandle);\n if (options?.signal) {\n options.signal.removeEventListener(\"abort\", onAbort);\n }\n\n if (options?.signal?.aborted) {\n reject(new Error(`${stdout}\\n${stderr}\\nCommand aborted`.trim()));\n return;\n }\n\n if (timedOut) {\n reject(\n new Error(\n `${stdout}\\n${stderr}\\nCommand timed out after ${options?.timeout} seconds`.trim(),\n ),\n );\n return;\n }\n\n resolve({ stdout, stderr, code: code ?? 0 });\n });\n });\n }\n\n async readFile(path: string): Promise<string> {\n return readFile(path, \"utf-8\");\n }\n\n async readFileBase64(path: string): Promise<string> {\n return (await readFile(path)).toString(\"base64\");\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n const stage = `${path}.mikan-stage`;\n await writeFile(stage, content, \"utf-8\");\n await rename(stage, path);\n }\n\n getWorkspacePath(hostPath: string): string {\n return hostPath;\n }\n\n getPathContext(hostWorkspaceRoot: string): RuntimePathContext {\n return createMountedRuntimePathContext(hostWorkspaceRoot, hostWorkspaceRoot);\n }\n\n getSandboxConfig(): HostSandboxConfig {\n return { type: \"host\" };\n }\n}\n\nexport const hostSandboxAdapter: SandboxAdapter<HostSandboxConfig> = {\n type: \"host\",\n credentials: { env: false, fileMounts: false },\n parse: parseHostSandboxArg,\n createExecutor: () => new HostExecutor(),\n};\n"]}
@@ -72,12 +72,6 @@ export interface Executor {
72
72
  * transport ownership as readFile.
73
73
  */
74
74
  readFileBase64(path: string, options?: ExecOptions): Promise<string>;
75
- /**
76
- * Read an attachment without following any symlink in the path. Executors
77
- * that cannot provide this atomically must omit the capability; attachment
78
- * uploads then fail closed.
79
- */
80
- readFileBase64NoSymlinks?(path: string, options?: ExecOptions): Promise<string>;
81
75
  /**
82
76
  * Write a runtime file, creating parent directories and replacing via a
83
77
  * staging file so an aborted write never truncates the target. Like
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sandbox/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sandbox/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sandbox/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ResourceLimits } from \"../types.js\";\n\nexport type SandboxConfig =\n | HostSandboxConfig\n | ContainerSandboxConfig\n | ImageSandboxConfig\n | GondolinSandboxConfig\n | FirecrackerSandboxConfig\n | CloudflareSandboxConfig;\n\nexport interface HostSandboxConfig {\n type: \"host\";\n}\n\nexport interface ContainerSandboxConfig {\n type: \"container\";\n container: string;\n}\n\nexport interface ImageSandboxConfig {\n type: \"image\";\n image: string;\n}\n\nexport interface GondolinSandboxConfig {\n type: \"gondolin\";\n profile: \"default\";\n /** Local-only runtime details supplied after actor/workspace resolution. */\n image?: string;\n workspacePath?: string;\n mounts?: Array<{ source: string; target: string; readOnly?: boolean }>;\n instanceId?: string;\n resourceKey?: string;\n}\n\nexport interface GondolinBootstrapOptions {\n /** Default per-runtime resource limits. */\n limits?: ResourceLimits;\n /** Boosted limits applied while a runtime holds a boost. */\n boostLimits?: ResourceLimits;\n}\n\nexport interface SessionClientCallbacks {\n onJson: (message: {\n type: string;\n id?: number;\n exit_code?: number | null;\n code?: string;\n message?: string;\n }) => void;\n onBinary: (frame: Buffer) => void;\n onClose: (error?: Error) => void;\n}\n\nexport interface SessionClient {\n send(message: object): void;\n close(): void;\n}\n\nexport interface FirecrackerSandboxConfig {\n type: \"firecracker\";\n vmId: string;\n hostPath: string;\n sshUser?: string;\n sshPort?: number;\n}\n\nexport interface CloudflareSandboxConfig {\n type: \"cloudflare\";\n sandboxId: string;\n}\n\nexport interface Executor {\n /**\n * Execute a bash command.\n */\n exec(command: string, options?: ExecOptions): Promise<ExecResult>;\n\n /**\n * Read a runtime file as UTF-8 text. The executor owns the transport, so\n * file contents never pass through shell argv or extra shell parse layers.\n */\n readFile(path: string, options?: ExecOptions): Promise<string>;\n\n /**\n * Read a runtime file as base64 (for binary content, e.g. images). Same\n * transport ownership as readFile.\n */\n readFileBase64(path: string, options?: ExecOptions): Promise<string>;\n\n /**\n * Read an attachment without following any symlink in the path. Executors\n * that cannot provide this atomically must omit the capability; attachment\n * uploads then fail closed.\n */\n readFileBase64NoSymlinks?(path: string, options?: ExecOptions): Promise<string>;\n\n /**\n * Write a runtime file, creating parent directories and replacing via a\n * staging file so an aborted write never truncates the target. Like\n * readFile, transport is the executor's concern — content must survive\n * arbitrary quoting and ARG_MAX limits.\n */\n writeFile(path: string, content: string, options?: ExecOptions): Promise<void>;\n\n /**\n * Get the workspace path prefix for this executor.\n * Host: returns the actual path.\n * Container/Firecracker: returns /workspace.\n */\n getWorkspacePath(hostPath: string): string;\n\n /**\n * Return explicit host/control-plane/runtime path semantics for this executor.\n */\n getPathContext(hostWorkspaceRoot: string): RuntimePathContext;\n\n /**\n * Get the current sandbox config used by this executor.\n */\n getSandboxConfig(): SandboxConfig;\n}\n\nexport interface RuntimePathContext {\n /** Host-side workspace root used by mikan's control plane. */\n hostWorkspaceRoot: string;\n /** Workspace root as seen by bash/read/write/edit inside the runtime. */\n runtimeWorkspaceRoot: string;\n /** Translate a runtime path back to a host path when the runtime is host-backed. */\n runtimeToHostPath?: (runtimePath: string) => string;\n}\n\nexport interface ExecOptions {\n timeout?: number;\n signal?: AbortSignal;\n}\n\nexport interface ExecResult {\n stdout: string;\n stderr: string;\n code: number;\n}\n\nexport interface SandboxCredentialCapabilities {\n env: boolean;\n fileMounts: boolean;\n}\n\nexport interface SandboxAdapter<TConfig extends SandboxConfig = SandboxConfig> {\n type: TConfig[\"type\"];\n credentials: SandboxCredentialCapabilities;\n parse(value: string): TConfig | undefined;\n validate?(config: TConfig): Promise<void>;\n createExecutor?(\n config: TConfig,\n env?: Record<string, string>,\n ensureReady?: () => Promise<void>,\n ): Executor;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sandbox/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ResourceLimits } from \"../types.js\";\n\nexport type SandboxConfig =\n | HostSandboxConfig\n | ContainerSandboxConfig\n | ImageSandboxConfig\n | GondolinSandboxConfig\n | FirecrackerSandboxConfig\n | CloudflareSandboxConfig;\n\nexport interface HostSandboxConfig {\n type: \"host\";\n}\n\nexport interface ContainerSandboxConfig {\n type: \"container\";\n container: string;\n}\n\nexport interface ImageSandboxConfig {\n type: \"image\";\n image: string;\n}\n\nexport interface GondolinSandboxConfig {\n type: \"gondolin\";\n profile: \"default\";\n /** Local-only runtime details supplied after actor/workspace resolution. */\n image?: string;\n workspacePath?: string;\n mounts?: Array<{ source: string; target: string; readOnly?: boolean }>;\n instanceId?: string;\n resourceKey?: string;\n}\n\nexport interface GondolinBootstrapOptions {\n /** Default per-runtime resource limits. */\n limits?: ResourceLimits;\n /** Boosted limits applied while a runtime holds a boost. */\n boostLimits?: ResourceLimits;\n}\n\nexport interface SessionClientCallbacks {\n onJson: (message: {\n type: string;\n id?: number;\n exit_code?: number | null;\n code?: string;\n message?: string;\n }) => void;\n onBinary: (frame: Buffer) => void;\n onClose: (error?: Error) => void;\n}\n\nexport interface SessionClient {\n send(message: object): void;\n close(): void;\n}\n\nexport interface FirecrackerSandboxConfig {\n type: \"firecracker\";\n vmId: string;\n hostPath: string;\n sshUser?: string;\n sshPort?: number;\n}\n\nexport interface CloudflareSandboxConfig {\n type: \"cloudflare\";\n sandboxId: string;\n}\n\nexport interface Executor {\n /**\n * Execute a bash command.\n */\n exec(command: string, options?: ExecOptions): Promise<ExecResult>;\n\n /**\n * Read a runtime file as UTF-8 text. The executor owns the transport, so\n * file contents never pass through shell argv or extra shell parse layers.\n */\n readFile(path: string, options?: ExecOptions): Promise<string>;\n\n /**\n * Read a runtime file as base64 (for binary content, e.g. images). Same\n * transport ownership as readFile.\n */\n readFileBase64(path: string, options?: ExecOptions): Promise<string>;\n\n /**\n * Write a runtime file, creating parent directories and replacing via a\n * staging file so an aborted write never truncates the target. Like\n * readFile, transport is the executor's concern — content must survive\n * arbitrary quoting and ARG_MAX limits.\n */\n writeFile(path: string, content: string, options?: ExecOptions): Promise<void>;\n\n /**\n * Get the workspace path prefix for this executor.\n * Host: returns the actual path.\n * Container/Firecracker: returns /workspace.\n */\n getWorkspacePath(hostPath: string): string;\n\n /**\n * Return explicit host/control-plane/runtime path semantics for this executor.\n */\n getPathContext(hostWorkspaceRoot: string): RuntimePathContext;\n\n /**\n * Get the current sandbox config used by this executor.\n */\n getSandboxConfig(): SandboxConfig;\n}\n\nexport interface RuntimePathContext {\n /** Host-side workspace root used by mikan's control plane. */\n hostWorkspaceRoot: string;\n /** Workspace root as seen by bash/read/write/edit inside the runtime. */\n runtimeWorkspaceRoot: string;\n /** Translate a runtime path back to a host path when the runtime is host-backed. */\n runtimeToHostPath?: (runtimePath: string) => string;\n}\n\nexport interface ExecOptions {\n timeout?: number;\n signal?: AbortSignal;\n}\n\nexport interface ExecResult {\n stdout: string;\n stderr: string;\n code: number;\n}\n\nexport interface SandboxCredentialCapabilities {\n env: boolean;\n fileMounts: boolean;\n}\n\nexport interface SandboxAdapter<TConfig extends SandboxConfig = SandboxConfig> {\n type: TConfig[\"type\"];\n credentials: SandboxCredentialCapabilities;\n parse(value: string): TConfig | undefined;\n validate?(config: TConfig): Promise<void>;\n createExecutor?(\n config: TConfig,\n env?: Record<string, string>,\n ensureReady?: () => Promise<void>,\n ): Executor;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geminixiang/mikan",
3
- "version": "1.0.0-beta.30",
3
+ "version": "1.0.0-beta.32",
4
4
  "description": "Multi-platform AI coding agent for Slack, Telegram, Discord, and GitHub",
5
5
  "keywords": [
6
6
  "agent",