@geminixiang/mikan 1.0.0-beta.79 → 1.0.0-beta.80

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,13 @@ any release.
9
9
 
10
10
  ## [Unreleased]
11
11
 
12
+ ## [1.0.0-beta.80]
13
+
14
+ ### Fixed
15
+
16
+ - Post no Slack usage summary for a `[SILENT]` response: the reply and its thread were deleted, so the summary for a quiet recurring event landed at the top level of the channel on every run.
17
+ - Stop warning `Could not remove snapshot image mikan-migrate:...` for every migrated container on each startup; the startup sweep now leaves a snapshot alone while its container still runs from it, and still reclaims snapshots no container uses.
18
+
12
19
  ## [1.0.0-beta.79]
13
20
 
14
21
  ### Changed
@@ -1 +1 @@
1
- {"version":3,"file":"presenter.d.ts","sourceRoot":"","sources":["../../src/harness/presenter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,0BAA0B,EAG1B,eAAe,EACf,sBAAsB,EACtB,kBAAkB,EAClB,yBAAyB,EACzB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAOtD,OAAO,KAAK,EAAE,qBAAqB,EAA4B,MAAM,aAAa,CAAC;AAwGnF,wBAAgB,cAAc,IAAI,kBAAkB,CAEnD;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,sBAAsB,GAC9B,eAAe,CA2CjB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAGxE;AAED,wBAAgB,yBAAyB,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEzF;AAwJD,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,qBAAqB,EAChC,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,IAAI,CAAC,CAsBf;AAwED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiG/E;AAqcD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI,CAkBlF"}
1
+ {"version":3,"file":"presenter.d.ts","sourceRoot":"","sources":["../../src/harness/presenter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,0BAA0B,EAG1B,eAAe,EACf,sBAAsB,EACtB,kBAAkB,EAClB,yBAAyB,EACzB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAOtD,OAAO,KAAK,EAAE,qBAAqB,EAA4B,MAAM,aAAa,CAAC;AAwGnF,wBAAgB,cAAc,IAAI,kBAAkB,CAEnD;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,sBAAsB,GAC9B,eAAe,CA2CjB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAGxE;AAED,wBAAgB,yBAAyB,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEzF;AAwJD,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,qBAAqB,EAChC,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,IAAI,CAAC,CAsBf;AA4ED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkG/E;AAqcD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI,CAkBlF"}
@@ -265,7 +265,7 @@ export async function finalizeRunResponse(responder, session, runState, options)
265
265
  log.logInfo("Final response already handled by tool - skipping final replacement");
266
266
  return;
267
267
  }
268
- if (finalText.trim().startsWith("[SILENT]")) {
268
+ if (isSilentResponse(finalText)) {
269
269
  await deleteForSilentResponse(responder);
270
270
  return;
271
271
  }
@@ -276,6 +276,9 @@ export async function finalizeRunResponse(responder, session, runState, options)
276
276
  if (published && runState.stopReason === "stop" && (didWork || options?.initialTask))
277
277
  await responder.notifyCompletion?.();
278
278
  }
279
+ function isSilentResponse(finalText) {
280
+ return finalText.trim().startsWith("[SILENT]");
281
+ }
279
282
  async function deleteForSilentResponse(responder) {
280
283
  try {
281
284
  await responder.deleteResponse();
@@ -407,7 +410,8 @@ export async function reportUsageSummary(ctx) {
407
410
  const statusOnly = toolNames.length > 0 && toolNames.every((name) => name === TASK_STATUS_TOOL);
408
411
  if (platform.diagnostics?.showUsageSummary === true &&
409
412
  !runState.finalResponseHandledByTool &&
410
- !statusOnly) {
413
+ !statusOnly &&
414
+ !isSilentResponse(getFinalAssistantText(session))) {
411
415
  runState.queue.enqueue(() => responder.respondDiagnostic(summary, { style: "muted" }), "usage summary");
412
416
  await waitForQueue();
413
417
  }
@@ -1 +1 @@
1
- {"version":3,"file":"presenter.js","sourceRoot":"","sources":["../../src/harness/presenter.ts"],"names":[],"mappings":"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","sourcesContent":["import { contentText, type Api, type Model } from \"@earendil-works/pi-ai\";\nimport type {\n FinalizeRunResponseOptions,\n HarnessEvent,\n PlatformToolRoles,\n RunPresentation,\n RunPresentationContext,\n RunnerSessionState,\n SessionEventHandlerParams,\n UsageReportContext,\n} from \"./types.js\";\nimport type { MikanAgentSession } from \"./session.js\";\nimport {\n mergeSubagentProgress,\n parseSubagentProgressSnapshot,\n renderSubagentDashboard,\n settleSubagentProgress,\n} from \"./tools/subagent.js\";\nimport type { ConversationResponder, SubagentProgressSnapshot } from \"../types.js\";\nimport type { resolveConversationSettings } from \"../settings/index.js\";\nimport {\n addLifecycleEvent,\n metricAttributes,\n recordCounter,\n recordDistribution,\n recordGauge,\n reportUserFacingError,\n startOperationSpan,\n updateActiveSpanAttribution,\n type ObservabilitySpan,\n} from \"../observability/index.js\";\nimport { appendTriggerAttribution } from \"./prompt.js\";\nimport { START_TASK_TOOL, TASK_STATUS_TOOL } from \"./tools/task.js\";\nimport { JEV_TOOL } from \"./tools/jev.js\";\nimport { JEV_BROWSER_TOOL } from \"./tools/jev-browser.js\";\n\nimport * as log from \"../log.js\";\nimport { errorMessage } from \"../unknown-values.js\";\n\ninterface LlmOperationSpan {\n span: ObservabilitySpan;\n startedAt: number;\n firstTokenAt?: number;\n}\n\ninterface RunOperationSpans {\n llm: LlmOperationSpan[];\n tools: Map<string, ObservabilitySpan>;\n}\n\nconst operationSpans = new WeakMap<RunnerSessionState, RunOperationSpans>();\n\nfunction spansFor(runState: RunnerSessionState): RunOperationSpans {\n let spans = operationSpans.get(runState);\n if (!spans) {\n spans = { llm: [], tools: new Map() };\n operationSpans.set(runState, spans);\n }\n return spans;\n}\n\nfunction operationError(name: \"AbortError\" | \"LLMError\" | \"ToolError\"): Error {\n const error = new Error();\n error.name = name;\n return error;\n}\n\nfunction endOutstandingOperationSpans(runState: RunnerSessionState): void {\n const spans = operationSpans.get(runState);\n if (!spans) return;\n const aborted = operationError(\"AbortError\");\n for (const entry of spans.llm) entry.span.end({ error: aborted });\n for (const span of spans.tools.values()) span.end({ error: aborted });\n operationSpans.delete(runState);\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 createRunStateDefaults(): 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 toolCallCount: 0,\n toolErrorCount: 0,\n toolInputCharacters: 0,\n toolOutputCharacters: 0,\n assistantMessageCount: 0,\n outputCharacters: 0,\n reasoningTokens: 0,\n retryCount: 0,\n compactionCount: 0,\n budgetExceeded: false,\n firstTokenLatencyMs: undefined,\n responseModel: undefined,\n stopReason: \"stop\",\n errorMessage: undefined,\n reportedLlmError: false,\n finalResponseHandledByTool: false,\n triggerAttribution: undefined,\n };\n}\n\nexport function createRunState(): RunnerSessionState {\n return createRunStateDefaults();\n}\n\nexport function activateRunPresentation(\n runState: RunnerSessionState,\n context: RunPresentationContext,\n): RunPresentation {\n endOutstandingOperationSpans(runState);\n if (runState.toolProgressTimer) clearTimeout(runState.toolProgressTimer);\n Object.assign(runState, createRunStateDefaults(), {\n responder: context.responder,\n logCtx: {\n conversationId: context.sessionConversation,\n userName: context.userName,\n conversationName: undefined,\n sessionId: context.sessionUuid,\n },\n triggerAttribution: context.triggerAttribution,\n });\n\n const { responder } = context;\n let queueChain = Promise.resolve();\n runState.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 = errorMessage(err);\n log.logWarning(`API error (${errorContext})`, errMsg);\n try {\n await responder.respondDiagnostic(`Error: ${errMsg}`, { style: \"error\" });\n } catch {}\n }\n });\n },\n };\n return {\n wait: () => queueChain,\n dispose(): void {\n endOutstandingOperationSpans(runState);\n if (runState.toolProgressTimer) clearTimeout(runState.toolProgressTimer);\n runState.toolProgressTimer = undefined;\n runState.responder = null;\n runState.logCtx = null;\n runState.queue = null;\n },\n };\n}\n\nexport function getFinalAssistantText(session: MikanAgentSession): string {\n const lastAssistant = session.messages.findLast((message) => message.role === \"assistant\");\n return contentText(lastAssistant?.content ?? []);\n}\n\nexport function 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 const text = typeof label === \"string\" ? label.trim() || toolName : toolName;\n if ((toolName === JEV_TOOL || toolName === JEV_BROWSER_TOOL) && text !== toolName) {\n return `${toolName} · ${text}`;\n }\n return text;\n}\n\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\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;\n\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 markSubagentProgressShown(runState: RunnerSessionState, snapshot: unknown): void {\n if (!snapshot) return;\n runState.subagentProgressShown = true;\n runState.lastSubagentProgressAt = 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 markSubagentProgressShown(runState, snapshot);\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 markSubagentProgressShown(runState, subagentProgress);\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 finalizeErrorResponse(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n options?: FinalizeRunResponseOptions,\n): Promise<void> {\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}`, { style: \"error\" });\n } catch (err) {\n const errMsg = errorMessage(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}\n\nexport async function finalizeRunResponse(\n responder: ConversationResponder,\n session: MikanAgentSession,\n runState: RunnerSessionState,\n options?: FinalizeRunResponseOptions,\n): Promise<void> {\n if (runState.stopReason === \"error\" && runState.errorMessage) {\n await finalizeErrorResponse(responder, runState, options);\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().startsWith(\"[SILENT]\")) {\n await deleteForSilentResponse(responder);\n return;\n }\n if (!finalText.trim()) return;\n const published = await publishFinalResponse(responder, runState, finalText, options);\n const didWork = Object.keys(session.getLastRunStats().toolCallCounts).some(\n (name) => ![TASK_STATUS_TOOL, START_TASK_TOOL, \"react\"].includes(name),\n );\n if (published && runState.stopReason === \"stop\" && (didWork || options?.initialTask))\n await responder.notifyCompletion?.();\n}\n\nasync function deleteForSilentResponse(responder: ConversationResponder): Promise<void> {\n try {\n await responder.deleteResponse();\n log.logInfo(\"Silent response - deleted message and thread\");\n } catch (err) {\n const errMsg = errorMessage(err);\n log.logWarning(\"Failed to delete message for silent response\", errMsg);\n }\n}\n\nfunction resolveSingleCompletedProfile(runState: RunnerSessionState): string | undefined {\n const nodes = runState.completedSubagentProgress.flatMap((snapshot) => snapshot.nodes);\n if (nodes.length === 0) return undefined;\n const profiles = new Set(nodes.map((node) => node.profile));\n if (profiles.size !== 1) return undefined;\n const [profile] = profiles;\n if (!profile) return undefined;\n return nodes.every((node) => node.status === \"completed\") ? profile : undefined;\n}\n\nasync function publishFinalResponse(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n finalText: string,\n options?: FinalizeRunResponseOptions,\n): Promise<boolean> {\n try {\n const finalResponse = appendTriggerAttribution(\n finalText,\n runState.triggerAttribution,\n options?.triggerSessionLink,\n );\n const finalDashboard = mergeSubagentProgress(runState.completedSubagentProgress);\n if (finalDashboard) {\n const resolvedProfile = resolveSingleCompletedProfile(runState);\n if (resolvedProfile && responder.respondAsRole) {\n await replaceWithSubagentDashboard(responder, finalDashboard, undefined, {\n createOverflowLink: options?.createOverflowLink,\n });\n await responder.respondAsRole(resolvedProfile, finalResponse);\n return true;\n }\n await replaceWithSubagentDashboard(responder, finalDashboard, finalResponse, {\n createOverflowLink: options?.createOverflowLink,\n });\n return true;\n }\n await responder.replaceResponse(formatResponseWithToolProgress(finalResponse, runState), {\n createOverflowLink: options?.createOverflowLink,\n });\n return true;\n } catch (err) {\n const errMsg = errorMessage(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 return false;\n }\n}\n\nexport async function reportUsageSummary(ctx: UsageReportContext): Promise<void> {\n const {\n session,\n runState,\n responder,\n platform,\n model,\n sessionConversation,\n sessionUuid,\n waitForQueue,\n } = ctx;\n const lastAssistantMessage = session.messages.findLast(\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: model.id,\n channel_id: sessionConversation,\n session_id: sessionUuid,\n stop_reason: runState.stopReason,\n llm_calls: runState.llmCallCount,\n });\n recordDistribution(\"agent.run.tokens_in\", totalUsage.input, {\n attributes: runMetricAttributes,\n });\n recordDistribution(\"agent.run.tokens_out\", totalUsage.output, {\n attributes: runMetricAttributes,\n });\n recordDistribution(\"agent.run.cache_read\", totalUsage.cacheRead, {\n attributes: runMetricAttributes,\n });\n recordDistribution(\"agent.run.cache_write\", totalUsage.cacheWrite, {\n attributes: runMetricAttributes,\n });\n recordDistribution(\"agent.run.cost\", totalUsage.cost.total, {\n attributes: runMetricAttributes,\n });\n const contextUtilization = contextTokens / contextWindow;\n recordGauge(\"agent.context.utilization\", contextUtilization, {\n unit: \"ratio\",\n attributes: runMetricAttributes,\n });\n updateActiveSpanAttribution({\n \"gen_ai.request.model\": model.id,\n \"gen_ai.response.model\": runState.responseModel ?? model.id,\n \"gen_ai.usage.input_tokens\": totalUsage.input + totalUsage.cacheRead + totalUsage.cacheWrite,\n \"gen_ai.usage.input_tokens.cached\": totalUsage.cacheRead,\n \"gen_ai.usage.input_tokens.cache_write\": totalUsage.cacheWrite,\n \"gen_ai.usage.output_tokens\": totalUsage.output,\n \"gen_ai.usage.output_tokens.reasoning\": runState.reasoningTokens,\n \"mikan.usage.cost_usd\": totalUsage.cost.total,\n \"mikan.context.utilization\": contextUtilization,\n \"mikan.llm.call_count\": runState.llmCallCount,\n \"mikan.tool.call_count\": runState.toolCallCount,\n \"mikan.tool.error_count\": runState.toolErrorCount,\n \"mikan.tool.input.characters\": runState.toolInputCharacters,\n \"mikan.tool.output.characters\": runState.toolOutputCharacters,\n \"mikan.output.message_count\": runState.assistantMessageCount,\n \"mikan.output.characters\": runState.outputCharacters,\n \"mikan.retry.count\": runState.retryCount,\n \"mikan.compaction.count\": runState.compactionCount,\n \"mikan.budget.exceeded\": runState.budgetExceeded,\n ...(runState.firstTokenLatencyMs === undefined\n ? {}\n : { \"mikan.response.first_token_ms\": runState.firstTokenLatencyMs }),\n });\n\n const summary = log.logUsageSummary(\n runState.logCtx!,\n runState.totalUsage,\n contextTokens,\n contextWindow,\n );\n const toolNames = Object.keys(session.getLastRunStats().toolCallCounts);\n const statusOnly = toolNames.length > 0 && toolNames.every((name) => name === TASK_STATUS_TOOL);\n if (\n platform.diagnostics?.showUsageSummary === true &&\n !runState.finalResponseHandledByTool &&\n !statusOnly\n ) {\n runState.queue!.enqueue(\n () => responder.respondDiagnostic(summary, { style: \"muted\" }),\n \"usage summary\",\n );\n await waitForQueue();\n }\n}\n\nfunction toolResultContentText(result: unknown): string | undefined {\n if (!result || typeof result !== \"object\" || !(\"content\" in result)) return undefined;\n const content = (result as { content: unknown }).content;\n if (!Array.isArray(content)) return undefined;\n const textParts = (content as Array<{ type?: string; text?: string }>)\n .filter((part) => part.type === \"text\" && part.text)\n .map((part) => part.text);\n return textParts.length > 0 ? textParts.join(\"\\n\") : undefined;\n}\n\nfunction extractToolResultText(result: unknown): string {\n if (typeof result === \"string\") return result;\n return toolResultContentText(result) ?? JSON.stringify(result);\n}\n\nfunction serializedLength(value: unknown): number {\n if (typeof value === \"string\") return value.length;\n try {\n return JSON.stringify(value)?.length ?? 0;\n } catch {\n return 0;\n }\n}\n\nfunction toolCategory(name: string, roles: PlatformToolRoles): string {\n if ([\"read\", \"write\", \"edit\", \"bash\"].includes(name)) return \"sandbox\";\n if (name === \"subagent\") return \"agent\";\n if (name.startsWith(\"mcp__\")) return \"mcp\";\n if (name.startsWith(\"github_\")) return \"github\";\n if (roles.platformTools.has(name)) return \"platform\";\n return \"function\";\n}\n\ninterface PresenterEventContext {\n runState: RunnerSessionState;\n responder: ConversationResponder;\n logCtx: NonNullable<RunnerSessionState[\"logCtx\"]>;\n queue: NonNullable<RunnerSessionState[\"queue\"]>;\n baseAttrs: { channel_id: string; session_id: string | undefined };\n model: Model<Api>;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n platformToolRoles: PlatformToolRoles;\n}\n\ntype ToolStartEvent = Extract<HarnessEvent, { type: \"tool_execution_start\" }>;\n\ntype ToolUpdateEvent = Extract<HarnessEvent, { type: \"tool_execution_update\" }>;\n\ntype ToolEndEvent = Extract<HarnessEvent, { type: \"tool_execution_end\" }>;\n\ntype MessageStartEvent = Extract<HarnessEvent, { type: \"message_start\" }>;\n\ntype MessageUpdateEvent = Extract<HarnessEvent, { type: \"message_update\" }>;\n\ntype MessageEndEvent = Extract<HarnessEvent, { type: \"message_end\" }>;\n\ntype AssistantMessage = Extract<MessageEndEvent[\"message\"], { role: \"assistant\" }>;\n\ntype LifecycleEvent = Extract<\n HarnessEvent,\n { type: \"compaction_start\" | \"compaction_end\" | \"auto_retry_start\" | \"budget_exceeded\" }\n>;\n\nfunction handleToolStart(event: ToolStartEvent, context: PresenterEventContext): void {\n const { runState, responder, logCtx, queue, baseAttrs } = context;\n const args = (event.args ?? {}) as { label?: string };\n const label = args.label || event.toolName;\n runState.toolCallCount += 1;\n runState.toolInputCharacters += serializedLength(event.args);\n runState.pendingTools.set(event.toolCallId, {\n toolName: event.toolName,\n args: event.args,\n startTime: Date.now(),\n });\n if (event.toolName === START_TASK_TOOL) return;\n if (event.toolName !== TASK_STATUS_TOOL) {\n runState.toolProgress.set(event.toolCallId, {\n label: extractToolLabel(event.toolName, event.args),\n status: \"running\",\n });\n }\n if (event.toolName === \"subagent\") {\n runState.subagentToolCalls.add(event.toolCallId);\n } else if (event.toolName !== TASK_STATUS_TOOL) {\n queue.enqueue(\n () => replaceResponseWithToolProgress(responder, runState),\n \"tool progress update\",\n );\n }\n spansFor(runState).tools.set(\n event.toolCallId,\n startOperationSpan(\n `execute_tool ${event.toolName}`,\n metricAttributes({\n \"gen_ai.operation.name\": \"execute_tool\",\n \"gen_ai.tool.name\": event.toolName,\n \"gen_ai.tool.type\": \"function\",\n \"mikan.tool.category\": toolCategory(event.toolName, context.platformToolRoles),\n \"mikan.tool.input.characters\": serializedLength(event.args),\n \"openinference.span.kind\": \"TOOL\",\n ...baseAttrs,\n }),\n ),\n );\n addLifecycleEvent(\"agent.tool.started\", { tool: event.toolName, ...baseAttrs });\n log.logToolStart(logCtx, event.toolName, label, event.args as Record<string, unknown>);\n}\n\nfunction handleToolUpdate(event: ToolUpdateEvent, context: PresenterEventContext): void {\n const subagentProgress = extractSubagentProgress(event.partialResult);\n if (!subagentProgress) return;\n context.runState.subagentProgress.set(event.toolCallId, subagentProgress);\n context.runState.subagentToolCalls.add(event.toolCallId);\n context.runState.suppressResponseDeltas = true;\n scheduleToolProgressUpdate(context.responder, context.runState);\n}\n\nfunction recordToolMetrics(\n event: ToolEndEvent,\n durationMs: number,\n context: PresenterEventContext,\n): void {\n recordCounter(\n \"agent.tool.calls\",\n 1,\n metricAttributes({\n tool: event.toolName,\n error: String(event.isError),\n ...context.baseAttrs,\n }),\n );\n recordDistribution(\"agent.tool.duration\", durationMs, {\n unit: \"millisecond\",\n attributes: metricAttributes({ tool: event.toolName, ...context.baseAttrs }),\n });\n addLifecycleEvent(\"agent.tool.completed\", {\n tool: event.toolName,\n error: event.isError,\n duration_ms: durationMs,\n ...context.baseAttrs,\n });\n}\n\nfunction handleToolEnd(event: ToolEndEvent, context: PresenterEventContext): void {\n const { runState, responder, logCtx } = context;\n const resultStr = extractToolResultText(event.result);\n const outputCharacters = serializedLength(event.result);\n runState.toolOutputCharacters += outputCharacters;\n if (event.isError) runState.toolErrorCount += 1;\n const pending = runState.pendingTools.get(event.toolCallId);\n if (event.toolName === START_TASK_TOOL) {\n runState.pendingTools.delete(event.toolCallId);\n if (!event.isError) runState.finalResponseHandledByTool = true;\n else\n reportUserFacingError(new Error(\"Task admission failed\"), {\n domain: \"mikan\",\n surface: \"task_handoff\",\n operation: \"admit_task\",\n severity: \"error\",\n context: { sessionId: logCtx.sessionId, toolCallId: event.toolCallId },\n });\n return;\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 if (event.toolName !== TASK_STATUS_TOOL) 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 runState.pendingTools.delete(event.toolCallId);\n const durationMs = pending ? Date.now() - pending.startTime : 0;\n const toolSpan = spansFor(runState).tools.get(event.toolCallId);\n toolSpan?.end({\n attributes: metricAttributes({\n \"gen_ai.tool.name\": event.toolName,\n \"gen_ai.tool.type\": \"function\",\n \"mikan.tool.category\": toolCategory(event.toolName, context.platformToolRoles),\n \"mikan.tool.output.characters\": outputCharacters,\n \"openinference.span.kind\": \"TOOL\",\n duration_ms: durationMs,\n ...context.baseAttrs,\n }),\n error: event.isError ? operationError(\"ToolError\") : undefined,\n });\n spansFor(runState).tools.delete(event.toolCallId);\n recordToolMetrics(event, durationMs, context);\n if (event.isError) {\n log.logToolError(logCtx, event.toolName, durationMs, resultStr);\n return;\n }\n log.logToolSuccess(logCtx, event.toolName, durationMs, resultStr);\n if (context.platformToolRoles.finalResponseTools.has(event.toolName)) {\n runState.finalResponseHandledByTool = true;\n }\n}\n\nfunction handleMessageStart(event: MessageStartEvent, context: PresenterEventContext): void {\n if (event.message.role !== \"assistant\") return;\n context.runState.llmCallCount += 1;\n spansFor(context.runState).llm.push({\n span: startOperationSpan(\n `chat ${context.model.id}`,\n metricAttributes({\n \"gen_ai.operation.name\": \"chat\",\n \"gen_ai.provider.name\": context.model.provider,\n \"gen_ai.request.model\": context.model.id,\n \"openinference.span.kind\": \"LLM\",\n \"llm.provider\": context.model.provider,\n \"llm.model_name\": context.model.id,\n ...context.baseAttrs,\n }),\n ),\n startedAt: Date.now(),\n });\n addLifecycleEvent(\"agent.llm.call.started\", {\n call_index: context.runState.llmCallCount,\n provider: context.model.provider,\n model: context.agentConfig.model,\n ...context.baseAttrs,\n });\n log.logResponseStart(context.logCtx);\n}\n\nfunction handleMessageUpdate(event: MessageUpdateEvent, context: PresenterEventContext): void {\n const update = event.assistantMessageEvent;\n if (update.type !== \"text_delta\" || !update.delta) return;\n const llmEntry = spansFor(context.runState).llm[0];\n if (llmEntry && llmEntry.firstTokenAt === undefined) {\n llmEntry.firstTokenAt = Date.now();\n context.runState.firstTokenLatencyMs ??= llmEntry.firstTokenAt - llmEntry.startedAt;\n }\n if (context.responder.appendResponseDelta && !context.runState.suppressResponseDeltas) {\n context.queue.enqueue(async () => {\n await context.responder.appendResponseDelta?.(update.delta);\n }, \"response delta\");\n }\n}\n\nfunction recordAssistantUsage(message: AssistantMessage, context: PresenterEventContext): void {\n if (!message.usage) return;\n const { totalUsage } = context.runState;\n totalUsage.input += message.usage.input;\n totalUsage.output += message.usage.output;\n totalUsage.cacheRead += message.usage.cacheRead;\n totalUsage.cacheWrite += message.usage.cacheWrite;\n totalUsage.cost.input += message.usage.cost.input;\n totalUsage.cost.output += message.usage.cost.output;\n totalUsage.cost.cacheRead += message.usage.cost.cacheRead;\n totalUsage.cost.cacheWrite += message.usage.cost.cacheWrite;\n totalUsage.cost.total += message.usage.cost.total;\n context.runState.reasoningTokens += message.usage.reasoning ?? 0;\n context.runState.responseModel = message.responseModel ?? message.model;\n\n const attributes = metricAttributes({\n provider: context.model.provider,\n model: context.agentConfig.model,\n ...context.baseAttrs,\n stop_reason: message.stopReason,\n error: Boolean(message.errorMessage),\n });\n recordCounter(\"agent.llm.calls\", 1, attributes);\n recordDistribution(\"agent.llm.tokens_in\", message.usage.input, { attributes });\n recordDistribution(\"agent.llm.tokens_out\", message.usage.output, { attributes });\n if (message.usage.cacheRead > 0) {\n recordDistribution(\"agent.llm.cache_read\", message.usage.cacheRead, { attributes });\n }\n if (message.usage.cacheWrite > 0) {\n recordDistribution(\"agent.llm.cache_write\", message.usage.cacheWrite, { attributes });\n }\n recordDistribution(\"agent.llm.cost_per_turn\", message.usage.cost.total, { attributes });\n addLifecycleEvent(\"agent.llm.call.completed\", {\n call_index: context.runState.llmCallCount,\n provider: context.model.provider,\n model: context.agentConfig.model,\n stop_reason: message.stopReason,\n error: Boolean(message.errorMessage),\n input_tokens: message.usage.input,\n output_tokens: message.usage.output,\n cost_total_usd: message.usage.cost.total,\n });\n}\n\nfunction presentThinking(thinking: string, context: PresenterEventContext): void {\n log.logThinking(context.logCtx, thinking);\n context.queue.enqueue(() => context.responder.respond(`_${thinking}_`), \"thinking main\");\n context.queue.enqueue(\n () => context.responder.respondDiagnostic(`_${thinking}_`),\n \"thinking diagnostic\",\n );\n}\n\nfunction presentFinalText(text: string, context: PresenterEventContext): void {\n const finalText = appendTriggerAttribution(\n formatResponseWithToolProgress(text, context.runState),\n context.runState.triggerAttribution,\n );\n log.logResponse(context.logCtx, text);\n if (context.runState.completedSubagentProgress.length > 0) return;\n if (context.responder.finishResponse) {\n context.queue.enqueue(async () => {\n await context.responder.finishResponse?.(finalText);\n }, \"response finish\");\n } else {\n context.queue.enqueue(() => context.responder.respond(finalText), \"response main\");\n }\n}\n\nfunction presentAssistantMessage(message: AssistantMessage, context: PresenterEventContext): void {\n const thinkingParts: string[] = [];\n const textParts: string[] = [];\n const hasToolCall = message.content.some((part) =>\n [\"tool_use\", \"toolCall\", \"tool-call\"].includes((part as { type?: string }).type ?? \"\"),\n );\n for (const part of message.content) {\n if (part.type === \"thinking\") thinkingParts.push(part.thinking);\n else if (part.type === \"text\") textParts.push(part.text);\n }\n for (const thinking of thinkingParts) presentThinking(thinking, context);\n\n const text = textParts.join(\"\\n\");\n if (!text.trim() || hasToolCall || context.runState.finalResponseHandledByTool) return;\n presentFinalText(text, context);\n}\n\nfunction handleMessageEnd(event: MessageEndEvent, context: PresenterEventContext): void {\n if (event.message.role !== \"assistant\") return;\n const message = event.message;\n context.runState.assistantMessageCount += 1;\n context.runState.outputCharacters += message.content.reduce(\n (total, part) => total + (part.type === \"text\" ? part.text.length : 0),\n 0,\n );\n if (message.stopReason) {\n context.runState.stopReason = message.stopReason;\n context.runState.errorMessage = message.errorMessage;\n }\n recordAssistantUsage(message, context);\n const llmEntry = spansFor(context.runState).llm.shift();\n const inputTokens = message.usage\n ? message.usage.input + message.usage.cacheRead + message.usage.cacheWrite\n : undefined;\n llmEntry?.span.end({\n attributes: metricAttributes({\n \"gen_ai.provider.name\": context.model.provider,\n \"gen_ai.request.model\": context.model.id,\n \"gen_ai.response.model\": message.responseModel ?? message.model,\n \"gen_ai.usage.input_tokens\": inputTokens,\n \"gen_ai.usage.output_tokens\": message.usage?.output,\n \"gen_ai.usage.input_tokens.cached\": message.usage?.cacheRead,\n \"gen_ai.usage.input_tokens.cache_write\": message.usage?.cacheWrite,\n \"gen_ai.usage.output_tokens.reasoning\": message.usage?.reasoning,\n \"mikan.usage.cost_usd\": message.usage?.cost.total,\n \"mikan.response.first_token_ms\":\n llmEntry?.firstTokenAt === undefined\n ? undefined\n : llmEntry.firstTokenAt - llmEntry.startedAt,\n \"mikan.output.characters\": message.content.reduce(\n (total, part) => total + (part.type === \"text\" ? part.text.length : 0),\n 0,\n ),\n \"openinference.span.kind\": \"LLM\",\n \"llm.provider\": context.model.provider,\n \"llm.model_name\": context.model.id,\n \"llm.token_count.prompt\": inputTokens,\n \"llm.token_count.completion\": message.usage?.output,\n \"llm.token_count.total\":\n inputTokens !== undefined && message.usage ? inputTokens + message.usage.output : undefined,\n \"llm.token_count.prompt_details.cache_read\": message.usage?.cacheRead,\n \"llm.token_count.prompt_details.cache_write\": message.usage?.cacheWrite,\n stop_reason: message.stopReason,\n ...context.baseAttrs,\n }),\n error: message.errorMessage ? operationError(\"LLMError\") : undefined,\n });\n presentAssistantMessage(message, context);\n}\n\nfunction handleLifecycleEvent(event: LifecycleEvent, context: PresenterEventContext): void {\n if (event.type === \"compaction_start\") {\n context.runState.compactionCount += 1;\n const text = \"_Compacting context..._\";\n log.logInfo(`Auto-compaction started (reason: ${event.reason})`);\n context.queue.enqueue(() => context.responder.respond(text), \"compaction start\");\n return;\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 if (event.type === \"auto_retry_start\") {\n context.runState.retryCount += 1;\n log.logWarning(`Retrying (${event.attempt}/${event.maxAttempts})`, event.errorMessage);\n const text = `_Retrying (${event.attempt}/${event.maxAttempts})..._`;\n context.queue.enqueue(() => context.responder.respond(text), \"retry\");\n return;\n }\n\n context.runState.budgetExceeded = true;\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 context.queue.enqueue(\n () => context.responder.respondDiagnostic(text, { style: \"error\" }),\n \"budget exceeded\",\n );\n}\n\nfunction handlePresenterEvent(event: HarnessEvent, context: PresenterEventContext): void {\n switch (event.type) {\n case \"tool_execution_start\":\n handleToolStart(event, context);\n return;\n case \"tool_execution_update\":\n handleToolUpdate(event, context);\n return;\n case \"tool_execution_end\":\n handleToolEnd(event, context);\n return;\n case \"message_start\":\n handleMessageStart(event, context);\n return;\n case \"message_update\":\n handleMessageUpdate(event, context);\n return;\n case \"message_end\":\n handleMessageEnd(event, context);\n return;\n case \"compaction_start\":\n case \"compaction_end\":\n case \"auto_retry_start\":\n case \"budget_exceeded\":\n handleLifecycleEvent(event, context);\n return;\n default:\n return;\n }\n}\n\nexport function attachSessionEventHandlers(params: SessionEventHandlerParams): void {\n const { session, runState, model, agentConfig, platformToolRoles } = params;\n session.subscribe((event) => {\n if (!runState.responder || !runState.logCtx || !runState.queue) return;\n handlePresenterEvent(event, {\n runState,\n responder: runState.responder,\n logCtx: runState.logCtx,\n queue: runState.queue,\n baseAttrs: {\n channel_id: runState.logCtx.conversationId,\n session_id: runState.logCtx.sessionId,\n },\n model,\n agentConfig,\n platformToolRoles,\n });\n });\n}\n"]}
1
+ {"version":3,"file":"presenter.js","sourceRoot":"","sources":["../../src/harness/presenter.ts"],"names":[],"mappings":"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","sourcesContent":["import { contentText, type Api, type Model } from \"@earendil-works/pi-ai\";\nimport type {\n FinalizeRunResponseOptions,\n HarnessEvent,\n PlatformToolRoles,\n RunPresentation,\n RunPresentationContext,\n RunnerSessionState,\n SessionEventHandlerParams,\n UsageReportContext,\n} from \"./types.js\";\nimport type { MikanAgentSession } from \"./session.js\";\nimport {\n mergeSubagentProgress,\n parseSubagentProgressSnapshot,\n renderSubagentDashboard,\n settleSubagentProgress,\n} from \"./tools/subagent.js\";\nimport type { ConversationResponder, SubagentProgressSnapshot } from \"../types.js\";\nimport type { resolveConversationSettings } from \"../settings/index.js\";\nimport {\n addLifecycleEvent,\n metricAttributes,\n recordCounter,\n recordDistribution,\n recordGauge,\n reportUserFacingError,\n startOperationSpan,\n updateActiveSpanAttribution,\n type ObservabilitySpan,\n} from \"../observability/index.js\";\nimport { appendTriggerAttribution } from \"./prompt.js\";\nimport { START_TASK_TOOL, TASK_STATUS_TOOL } from \"./tools/task.js\";\nimport { JEV_TOOL } from \"./tools/jev.js\";\nimport { JEV_BROWSER_TOOL } from \"./tools/jev-browser.js\";\n\nimport * as log from \"../log.js\";\nimport { errorMessage } from \"../unknown-values.js\";\n\ninterface LlmOperationSpan {\n span: ObservabilitySpan;\n startedAt: number;\n firstTokenAt?: number;\n}\n\ninterface RunOperationSpans {\n llm: LlmOperationSpan[];\n tools: Map<string, ObservabilitySpan>;\n}\n\nconst operationSpans = new WeakMap<RunnerSessionState, RunOperationSpans>();\n\nfunction spansFor(runState: RunnerSessionState): RunOperationSpans {\n let spans = operationSpans.get(runState);\n if (!spans) {\n spans = { llm: [], tools: new Map() };\n operationSpans.set(runState, spans);\n }\n return spans;\n}\n\nfunction operationError(name: \"AbortError\" | \"LLMError\" | \"ToolError\"): Error {\n const error = new Error();\n error.name = name;\n return error;\n}\n\nfunction endOutstandingOperationSpans(runState: RunnerSessionState): void {\n const spans = operationSpans.get(runState);\n if (!spans) return;\n const aborted = operationError(\"AbortError\");\n for (const entry of spans.llm) entry.span.end({ error: aborted });\n for (const span of spans.tools.values()) span.end({ error: aborted });\n operationSpans.delete(runState);\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 createRunStateDefaults(): 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 toolCallCount: 0,\n toolErrorCount: 0,\n toolInputCharacters: 0,\n toolOutputCharacters: 0,\n assistantMessageCount: 0,\n outputCharacters: 0,\n reasoningTokens: 0,\n retryCount: 0,\n compactionCount: 0,\n budgetExceeded: false,\n firstTokenLatencyMs: undefined,\n responseModel: undefined,\n stopReason: \"stop\",\n errorMessage: undefined,\n reportedLlmError: false,\n finalResponseHandledByTool: false,\n triggerAttribution: undefined,\n };\n}\n\nexport function createRunState(): RunnerSessionState {\n return createRunStateDefaults();\n}\n\nexport function activateRunPresentation(\n runState: RunnerSessionState,\n context: RunPresentationContext,\n): RunPresentation {\n endOutstandingOperationSpans(runState);\n if (runState.toolProgressTimer) clearTimeout(runState.toolProgressTimer);\n Object.assign(runState, createRunStateDefaults(), {\n responder: context.responder,\n logCtx: {\n conversationId: context.sessionConversation,\n userName: context.userName,\n conversationName: undefined,\n sessionId: context.sessionUuid,\n },\n triggerAttribution: context.triggerAttribution,\n });\n\n const { responder } = context;\n let queueChain = Promise.resolve();\n runState.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 = errorMessage(err);\n log.logWarning(`API error (${errorContext})`, errMsg);\n try {\n await responder.respondDiagnostic(`Error: ${errMsg}`, { style: \"error\" });\n } catch {}\n }\n });\n },\n };\n return {\n wait: () => queueChain,\n dispose(): void {\n endOutstandingOperationSpans(runState);\n if (runState.toolProgressTimer) clearTimeout(runState.toolProgressTimer);\n runState.toolProgressTimer = undefined;\n runState.responder = null;\n runState.logCtx = null;\n runState.queue = null;\n },\n };\n}\n\nexport function getFinalAssistantText(session: MikanAgentSession): string {\n const lastAssistant = session.messages.findLast((message) => message.role === \"assistant\");\n return contentText(lastAssistant?.content ?? []);\n}\n\nexport function 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 const text = typeof label === \"string\" ? label.trim() || toolName : toolName;\n if ((toolName === JEV_TOOL || toolName === JEV_BROWSER_TOOL) && text !== toolName) {\n return `${toolName} · ${text}`;\n }\n return text;\n}\n\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\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;\n\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 markSubagentProgressShown(runState: RunnerSessionState, snapshot: unknown): void {\n if (!snapshot) return;\n runState.subagentProgressShown = true;\n runState.lastSubagentProgressAt = 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 markSubagentProgressShown(runState, snapshot);\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 markSubagentProgressShown(runState, subagentProgress);\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 finalizeErrorResponse(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n options?: FinalizeRunResponseOptions,\n): Promise<void> {\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}`, { style: \"error\" });\n } catch (err) {\n const errMsg = errorMessage(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}\n\nexport async function finalizeRunResponse(\n responder: ConversationResponder,\n session: MikanAgentSession,\n runState: RunnerSessionState,\n options?: FinalizeRunResponseOptions,\n): Promise<void> {\n if (runState.stopReason === \"error\" && runState.errorMessage) {\n await finalizeErrorResponse(responder, runState, options);\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 (isSilentResponse(finalText)) {\n await deleteForSilentResponse(responder);\n return;\n }\n if (!finalText.trim()) return;\n const published = await publishFinalResponse(responder, runState, finalText, options);\n const didWork = Object.keys(session.getLastRunStats().toolCallCounts).some(\n (name) => ![TASK_STATUS_TOOL, START_TASK_TOOL, \"react\"].includes(name),\n );\n if (published && runState.stopReason === \"stop\" && (didWork || options?.initialTask))\n await responder.notifyCompletion?.();\n}\n\nfunction isSilentResponse(finalText: string): boolean {\n return finalText.trim().startsWith(\"[SILENT]\");\n}\n\nasync function deleteForSilentResponse(responder: ConversationResponder): Promise<void> {\n try {\n await responder.deleteResponse();\n log.logInfo(\"Silent response - deleted message and thread\");\n } catch (err) {\n const errMsg = errorMessage(err);\n log.logWarning(\"Failed to delete message for silent response\", errMsg);\n }\n}\n\nfunction resolveSingleCompletedProfile(runState: RunnerSessionState): string | undefined {\n const nodes = runState.completedSubagentProgress.flatMap((snapshot) => snapshot.nodes);\n if (nodes.length === 0) return undefined;\n const profiles = new Set(nodes.map((node) => node.profile));\n if (profiles.size !== 1) return undefined;\n const [profile] = profiles;\n if (!profile) return undefined;\n return nodes.every((node) => node.status === \"completed\") ? profile : undefined;\n}\n\nasync function publishFinalResponse(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n finalText: string,\n options?: FinalizeRunResponseOptions,\n): Promise<boolean> {\n try {\n const finalResponse = appendTriggerAttribution(\n finalText,\n runState.triggerAttribution,\n options?.triggerSessionLink,\n );\n const finalDashboard = mergeSubagentProgress(runState.completedSubagentProgress);\n if (finalDashboard) {\n const resolvedProfile = resolveSingleCompletedProfile(runState);\n if (resolvedProfile && responder.respondAsRole) {\n await replaceWithSubagentDashboard(responder, finalDashboard, undefined, {\n createOverflowLink: options?.createOverflowLink,\n });\n await responder.respondAsRole(resolvedProfile, finalResponse);\n return true;\n }\n await replaceWithSubagentDashboard(responder, finalDashboard, finalResponse, {\n createOverflowLink: options?.createOverflowLink,\n });\n return true;\n }\n await responder.replaceResponse(formatResponseWithToolProgress(finalResponse, runState), {\n createOverflowLink: options?.createOverflowLink,\n });\n return true;\n } catch (err) {\n const errMsg = errorMessage(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 return false;\n }\n}\n\nexport async function reportUsageSummary(ctx: UsageReportContext): Promise<void> {\n const {\n session,\n runState,\n responder,\n platform,\n model,\n sessionConversation,\n sessionUuid,\n waitForQueue,\n } = ctx;\n const lastAssistantMessage = session.messages.findLast(\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: model.id,\n channel_id: sessionConversation,\n session_id: sessionUuid,\n stop_reason: runState.stopReason,\n llm_calls: runState.llmCallCount,\n });\n recordDistribution(\"agent.run.tokens_in\", totalUsage.input, {\n attributes: runMetricAttributes,\n });\n recordDistribution(\"agent.run.tokens_out\", totalUsage.output, {\n attributes: runMetricAttributes,\n });\n recordDistribution(\"agent.run.cache_read\", totalUsage.cacheRead, {\n attributes: runMetricAttributes,\n });\n recordDistribution(\"agent.run.cache_write\", totalUsage.cacheWrite, {\n attributes: runMetricAttributes,\n });\n recordDistribution(\"agent.run.cost\", totalUsage.cost.total, {\n attributes: runMetricAttributes,\n });\n const contextUtilization = contextTokens / contextWindow;\n recordGauge(\"agent.context.utilization\", contextUtilization, {\n unit: \"ratio\",\n attributes: runMetricAttributes,\n });\n updateActiveSpanAttribution({\n \"gen_ai.request.model\": model.id,\n \"gen_ai.response.model\": runState.responseModel ?? model.id,\n \"gen_ai.usage.input_tokens\": totalUsage.input + totalUsage.cacheRead + totalUsage.cacheWrite,\n \"gen_ai.usage.input_tokens.cached\": totalUsage.cacheRead,\n \"gen_ai.usage.input_tokens.cache_write\": totalUsage.cacheWrite,\n \"gen_ai.usage.output_tokens\": totalUsage.output,\n \"gen_ai.usage.output_tokens.reasoning\": runState.reasoningTokens,\n \"mikan.usage.cost_usd\": totalUsage.cost.total,\n \"mikan.context.utilization\": contextUtilization,\n \"mikan.llm.call_count\": runState.llmCallCount,\n \"mikan.tool.call_count\": runState.toolCallCount,\n \"mikan.tool.error_count\": runState.toolErrorCount,\n \"mikan.tool.input.characters\": runState.toolInputCharacters,\n \"mikan.tool.output.characters\": runState.toolOutputCharacters,\n \"mikan.output.message_count\": runState.assistantMessageCount,\n \"mikan.output.characters\": runState.outputCharacters,\n \"mikan.retry.count\": runState.retryCount,\n \"mikan.compaction.count\": runState.compactionCount,\n \"mikan.budget.exceeded\": runState.budgetExceeded,\n ...(runState.firstTokenLatencyMs === undefined\n ? {}\n : { \"mikan.response.first_token_ms\": runState.firstTokenLatencyMs }),\n });\n\n const summary = log.logUsageSummary(\n runState.logCtx!,\n runState.totalUsage,\n contextTokens,\n contextWindow,\n );\n const toolNames = Object.keys(session.getLastRunStats().toolCallCounts);\n const statusOnly = toolNames.length > 0 && toolNames.every((name) => name === TASK_STATUS_TOOL);\n if (\n platform.diagnostics?.showUsageSummary === true &&\n !runState.finalResponseHandledByTool &&\n !statusOnly &&\n !isSilentResponse(getFinalAssistantText(session))\n ) {\n runState.queue!.enqueue(\n () => responder.respondDiagnostic(summary, { style: \"muted\" }),\n \"usage summary\",\n );\n await waitForQueue();\n }\n}\n\nfunction toolResultContentText(result: unknown): string | undefined {\n if (!result || typeof result !== \"object\" || !(\"content\" in result)) return undefined;\n const content = (result as { content: unknown }).content;\n if (!Array.isArray(content)) return undefined;\n const textParts = (content as Array<{ type?: string; text?: string }>)\n .filter((part) => part.type === \"text\" && part.text)\n .map((part) => part.text);\n return textParts.length > 0 ? textParts.join(\"\\n\") : undefined;\n}\n\nfunction extractToolResultText(result: unknown): string {\n if (typeof result === \"string\") return result;\n return toolResultContentText(result) ?? JSON.stringify(result);\n}\n\nfunction serializedLength(value: unknown): number {\n if (typeof value === \"string\") return value.length;\n try {\n return JSON.stringify(value)?.length ?? 0;\n } catch {\n return 0;\n }\n}\n\nfunction toolCategory(name: string, roles: PlatformToolRoles): string {\n if ([\"read\", \"write\", \"edit\", \"bash\"].includes(name)) return \"sandbox\";\n if (name === \"subagent\") return \"agent\";\n if (name.startsWith(\"mcp__\")) return \"mcp\";\n if (name.startsWith(\"github_\")) return \"github\";\n if (roles.platformTools.has(name)) return \"platform\";\n return \"function\";\n}\n\ninterface PresenterEventContext {\n runState: RunnerSessionState;\n responder: ConversationResponder;\n logCtx: NonNullable<RunnerSessionState[\"logCtx\"]>;\n queue: NonNullable<RunnerSessionState[\"queue\"]>;\n baseAttrs: { channel_id: string; session_id: string | undefined };\n model: Model<Api>;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n platformToolRoles: PlatformToolRoles;\n}\n\ntype ToolStartEvent = Extract<HarnessEvent, { type: \"tool_execution_start\" }>;\n\ntype ToolUpdateEvent = Extract<HarnessEvent, { type: \"tool_execution_update\" }>;\n\ntype ToolEndEvent = Extract<HarnessEvent, { type: \"tool_execution_end\" }>;\n\ntype MessageStartEvent = Extract<HarnessEvent, { type: \"message_start\" }>;\n\ntype MessageUpdateEvent = Extract<HarnessEvent, { type: \"message_update\" }>;\n\ntype MessageEndEvent = Extract<HarnessEvent, { type: \"message_end\" }>;\n\ntype AssistantMessage = Extract<MessageEndEvent[\"message\"], { role: \"assistant\" }>;\n\ntype LifecycleEvent = Extract<\n HarnessEvent,\n { type: \"compaction_start\" | \"compaction_end\" | \"auto_retry_start\" | \"budget_exceeded\" }\n>;\n\nfunction handleToolStart(event: ToolStartEvent, context: PresenterEventContext): void {\n const { runState, responder, logCtx, queue, baseAttrs } = context;\n const args = (event.args ?? {}) as { label?: string };\n const label = args.label || event.toolName;\n runState.toolCallCount += 1;\n runState.toolInputCharacters += serializedLength(event.args);\n runState.pendingTools.set(event.toolCallId, {\n toolName: event.toolName,\n args: event.args,\n startTime: Date.now(),\n });\n if (event.toolName === START_TASK_TOOL) return;\n if (event.toolName !== TASK_STATUS_TOOL) {\n runState.toolProgress.set(event.toolCallId, {\n label: extractToolLabel(event.toolName, event.args),\n status: \"running\",\n });\n }\n if (event.toolName === \"subagent\") {\n runState.subagentToolCalls.add(event.toolCallId);\n } else if (event.toolName !== TASK_STATUS_TOOL) {\n queue.enqueue(\n () => replaceResponseWithToolProgress(responder, runState),\n \"tool progress update\",\n );\n }\n spansFor(runState).tools.set(\n event.toolCallId,\n startOperationSpan(\n `execute_tool ${event.toolName}`,\n metricAttributes({\n \"gen_ai.operation.name\": \"execute_tool\",\n \"gen_ai.tool.name\": event.toolName,\n \"gen_ai.tool.type\": \"function\",\n \"mikan.tool.category\": toolCategory(event.toolName, context.platformToolRoles),\n \"mikan.tool.input.characters\": serializedLength(event.args),\n \"openinference.span.kind\": \"TOOL\",\n ...baseAttrs,\n }),\n ),\n );\n addLifecycleEvent(\"agent.tool.started\", { tool: event.toolName, ...baseAttrs });\n log.logToolStart(logCtx, event.toolName, label, event.args as Record<string, unknown>);\n}\n\nfunction handleToolUpdate(event: ToolUpdateEvent, context: PresenterEventContext): void {\n const subagentProgress = extractSubagentProgress(event.partialResult);\n if (!subagentProgress) return;\n context.runState.subagentProgress.set(event.toolCallId, subagentProgress);\n context.runState.subagentToolCalls.add(event.toolCallId);\n context.runState.suppressResponseDeltas = true;\n scheduleToolProgressUpdate(context.responder, context.runState);\n}\n\nfunction recordToolMetrics(\n event: ToolEndEvent,\n durationMs: number,\n context: PresenterEventContext,\n): void {\n recordCounter(\n \"agent.tool.calls\",\n 1,\n metricAttributes({\n tool: event.toolName,\n error: String(event.isError),\n ...context.baseAttrs,\n }),\n );\n recordDistribution(\"agent.tool.duration\", durationMs, {\n unit: \"millisecond\",\n attributes: metricAttributes({ tool: event.toolName, ...context.baseAttrs }),\n });\n addLifecycleEvent(\"agent.tool.completed\", {\n tool: event.toolName,\n error: event.isError,\n duration_ms: durationMs,\n ...context.baseAttrs,\n });\n}\n\nfunction handleToolEnd(event: ToolEndEvent, context: PresenterEventContext): void {\n const { runState, responder, logCtx } = context;\n const resultStr = extractToolResultText(event.result);\n const outputCharacters = serializedLength(event.result);\n runState.toolOutputCharacters += outputCharacters;\n if (event.isError) runState.toolErrorCount += 1;\n const pending = runState.pendingTools.get(event.toolCallId);\n if (event.toolName === START_TASK_TOOL) {\n runState.pendingTools.delete(event.toolCallId);\n if (!event.isError) runState.finalResponseHandledByTool = true;\n else\n reportUserFacingError(new Error(\"Task admission failed\"), {\n domain: \"mikan\",\n surface: \"task_handoff\",\n operation: \"admit_task\",\n severity: \"error\",\n context: { sessionId: logCtx.sessionId, toolCallId: event.toolCallId },\n });\n return;\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 if (event.toolName !== TASK_STATUS_TOOL) 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 runState.pendingTools.delete(event.toolCallId);\n const durationMs = pending ? Date.now() - pending.startTime : 0;\n const toolSpan = spansFor(runState).tools.get(event.toolCallId);\n toolSpan?.end({\n attributes: metricAttributes({\n \"gen_ai.tool.name\": event.toolName,\n \"gen_ai.tool.type\": \"function\",\n \"mikan.tool.category\": toolCategory(event.toolName, context.platformToolRoles),\n \"mikan.tool.output.characters\": outputCharacters,\n \"openinference.span.kind\": \"TOOL\",\n duration_ms: durationMs,\n ...context.baseAttrs,\n }),\n error: event.isError ? operationError(\"ToolError\") : undefined,\n });\n spansFor(runState).tools.delete(event.toolCallId);\n recordToolMetrics(event, durationMs, context);\n if (event.isError) {\n log.logToolError(logCtx, event.toolName, durationMs, resultStr);\n return;\n }\n log.logToolSuccess(logCtx, event.toolName, durationMs, resultStr);\n if (context.platformToolRoles.finalResponseTools.has(event.toolName)) {\n runState.finalResponseHandledByTool = true;\n }\n}\n\nfunction handleMessageStart(event: MessageStartEvent, context: PresenterEventContext): void {\n if (event.message.role !== \"assistant\") return;\n context.runState.llmCallCount += 1;\n spansFor(context.runState).llm.push({\n span: startOperationSpan(\n `chat ${context.model.id}`,\n metricAttributes({\n \"gen_ai.operation.name\": \"chat\",\n \"gen_ai.provider.name\": context.model.provider,\n \"gen_ai.request.model\": context.model.id,\n \"openinference.span.kind\": \"LLM\",\n \"llm.provider\": context.model.provider,\n \"llm.model_name\": context.model.id,\n ...context.baseAttrs,\n }),\n ),\n startedAt: Date.now(),\n });\n addLifecycleEvent(\"agent.llm.call.started\", {\n call_index: context.runState.llmCallCount,\n provider: context.model.provider,\n model: context.agentConfig.model,\n ...context.baseAttrs,\n });\n log.logResponseStart(context.logCtx);\n}\n\nfunction handleMessageUpdate(event: MessageUpdateEvent, context: PresenterEventContext): void {\n const update = event.assistantMessageEvent;\n if (update.type !== \"text_delta\" || !update.delta) return;\n const llmEntry = spansFor(context.runState).llm[0];\n if (llmEntry && llmEntry.firstTokenAt === undefined) {\n llmEntry.firstTokenAt = Date.now();\n context.runState.firstTokenLatencyMs ??= llmEntry.firstTokenAt - llmEntry.startedAt;\n }\n if (context.responder.appendResponseDelta && !context.runState.suppressResponseDeltas) {\n context.queue.enqueue(async () => {\n await context.responder.appendResponseDelta?.(update.delta);\n }, \"response delta\");\n }\n}\n\nfunction recordAssistantUsage(message: AssistantMessage, context: PresenterEventContext): void {\n if (!message.usage) return;\n const { totalUsage } = context.runState;\n totalUsage.input += message.usage.input;\n totalUsage.output += message.usage.output;\n totalUsage.cacheRead += message.usage.cacheRead;\n totalUsage.cacheWrite += message.usage.cacheWrite;\n totalUsage.cost.input += message.usage.cost.input;\n totalUsage.cost.output += message.usage.cost.output;\n totalUsage.cost.cacheRead += message.usage.cost.cacheRead;\n totalUsage.cost.cacheWrite += message.usage.cost.cacheWrite;\n totalUsage.cost.total += message.usage.cost.total;\n context.runState.reasoningTokens += message.usage.reasoning ?? 0;\n context.runState.responseModel = message.responseModel ?? message.model;\n\n const attributes = metricAttributes({\n provider: context.model.provider,\n model: context.agentConfig.model,\n ...context.baseAttrs,\n stop_reason: message.stopReason,\n error: Boolean(message.errorMessage),\n });\n recordCounter(\"agent.llm.calls\", 1, attributes);\n recordDistribution(\"agent.llm.tokens_in\", message.usage.input, { attributes });\n recordDistribution(\"agent.llm.tokens_out\", message.usage.output, { attributes });\n if (message.usage.cacheRead > 0) {\n recordDistribution(\"agent.llm.cache_read\", message.usage.cacheRead, { attributes });\n }\n if (message.usage.cacheWrite > 0) {\n recordDistribution(\"agent.llm.cache_write\", message.usage.cacheWrite, { attributes });\n }\n recordDistribution(\"agent.llm.cost_per_turn\", message.usage.cost.total, { attributes });\n addLifecycleEvent(\"agent.llm.call.completed\", {\n call_index: context.runState.llmCallCount,\n provider: context.model.provider,\n model: context.agentConfig.model,\n stop_reason: message.stopReason,\n error: Boolean(message.errorMessage),\n input_tokens: message.usage.input,\n output_tokens: message.usage.output,\n cost_total_usd: message.usage.cost.total,\n });\n}\n\nfunction presentThinking(thinking: string, context: PresenterEventContext): void {\n log.logThinking(context.logCtx, thinking);\n context.queue.enqueue(() => context.responder.respond(`_${thinking}_`), \"thinking main\");\n context.queue.enqueue(\n () => context.responder.respondDiagnostic(`_${thinking}_`),\n \"thinking diagnostic\",\n );\n}\n\nfunction presentFinalText(text: string, context: PresenterEventContext): void {\n const finalText = appendTriggerAttribution(\n formatResponseWithToolProgress(text, context.runState),\n context.runState.triggerAttribution,\n );\n log.logResponse(context.logCtx, text);\n if (context.runState.completedSubagentProgress.length > 0) return;\n if (context.responder.finishResponse) {\n context.queue.enqueue(async () => {\n await context.responder.finishResponse?.(finalText);\n }, \"response finish\");\n } else {\n context.queue.enqueue(() => context.responder.respond(finalText), \"response main\");\n }\n}\n\nfunction presentAssistantMessage(message: AssistantMessage, context: PresenterEventContext): void {\n const thinkingParts: string[] = [];\n const textParts: string[] = [];\n const hasToolCall = message.content.some((part) =>\n [\"tool_use\", \"toolCall\", \"tool-call\"].includes((part as { type?: string }).type ?? \"\"),\n );\n for (const part of message.content) {\n if (part.type === \"thinking\") thinkingParts.push(part.thinking);\n else if (part.type === \"text\") textParts.push(part.text);\n }\n for (const thinking of thinkingParts) presentThinking(thinking, context);\n\n const text = textParts.join(\"\\n\");\n if (!text.trim() || hasToolCall || context.runState.finalResponseHandledByTool) return;\n presentFinalText(text, context);\n}\n\nfunction handleMessageEnd(event: MessageEndEvent, context: PresenterEventContext): void {\n if (event.message.role !== \"assistant\") return;\n const message = event.message;\n context.runState.assistantMessageCount += 1;\n context.runState.outputCharacters += message.content.reduce(\n (total, part) => total + (part.type === \"text\" ? part.text.length : 0),\n 0,\n );\n if (message.stopReason) {\n context.runState.stopReason = message.stopReason;\n context.runState.errorMessage = message.errorMessage;\n }\n recordAssistantUsage(message, context);\n const llmEntry = spansFor(context.runState).llm.shift();\n const inputTokens = message.usage\n ? message.usage.input + message.usage.cacheRead + message.usage.cacheWrite\n : undefined;\n llmEntry?.span.end({\n attributes: metricAttributes({\n \"gen_ai.provider.name\": context.model.provider,\n \"gen_ai.request.model\": context.model.id,\n \"gen_ai.response.model\": message.responseModel ?? message.model,\n \"gen_ai.usage.input_tokens\": inputTokens,\n \"gen_ai.usage.output_tokens\": message.usage?.output,\n \"gen_ai.usage.input_tokens.cached\": message.usage?.cacheRead,\n \"gen_ai.usage.input_tokens.cache_write\": message.usage?.cacheWrite,\n \"gen_ai.usage.output_tokens.reasoning\": message.usage?.reasoning,\n \"mikan.usage.cost_usd\": message.usage?.cost.total,\n \"mikan.response.first_token_ms\":\n llmEntry?.firstTokenAt === undefined\n ? undefined\n : llmEntry.firstTokenAt - llmEntry.startedAt,\n \"mikan.output.characters\": message.content.reduce(\n (total, part) => total + (part.type === \"text\" ? part.text.length : 0),\n 0,\n ),\n \"openinference.span.kind\": \"LLM\",\n \"llm.provider\": context.model.provider,\n \"llm.model_name\": context.model.id,\n \"llm.token_count.prompt\": inputTokens,\n \"llm.token_count.completion\": message.usage?.output,\n \"llm.token_count.total\":\n inputTokens !== undefined && message.usage ? inputTokens + message.usage.output : undefined,\n \"llm.token_count.prompt_details.cache_read\": message.usage?.cacheRead,\n \"llm.token_count.prompt_details.cache_write\": message.usage?.cacheWrite,\n stop_reason: message.stopReason,\n ...context.baseAttrs,\n }),\n error: message.errorMessage ? operationError(\"LLMError\") : undefined,\n });\n presentAssistantMessage(message, context);\n}\n\nfunction handleLifecycleEvent(event: LifecycleEvent, context: PresenterEventContext): void {\n if (event.type === \"compaction_start\") {\n context.runState.compactionCount += 1;\n const text = \"_Compacting context..._\";\n log.logInfo(`Auto-compaction started (reason: ${event.reason})`);\n context.queue.enqueue(() => context.responder.respond(text), \"compaction start\");\n return;\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 if (event.type === \"auto_retry_start\") {\n context.runState.retryCount += 1;\n log.logWarning(`Retrying (${event.attempt}/${event.maxAttempts})`, event.errorMessage);\n const text = `_Retrying (${event.attempt}/${event.maxAttempts})..._`;\n context.queue.enqueue(() => context.responder.respond(text), \"retry\");\n return;\n }\n\n context.runState.budgetExceeded = true;\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 context.queue.enqueue(\n () => context.responder.respondDiagnostic(text, { style: \"error\" }),\n \"budget exceeded\",\n );\n}\n\nfunction handlePresenterEvent(event: HarnessEvent, context: PresenterEventContext): void {\n switch (event.type) {\n case \"tool_execution_start\":\n handleToolStart(event, context);\n return;\n case \"tool_execution_update\":\n handleToolUpdate(event, context);\n return;\n case \"tool_execution_end\":\n handleToolEnd(event, context);\n return;\n case \"message_start\":\n handleMessageStart(event, context);\n return;\n case \"message_update\":\n handleMessageUpdate(event, context);\n return;\n case \"message_end\":\n handleMessageEnd(event, context);\n return;\n case \"compaction_start\":\n case \"compaction_end\":\n case \"auto_retry_start\":\n case \"budget_exceeded\":\n handleLifecycleEvent(event, context);\n return;\n default:\n return;\n }\n}\n\nexport function attachSessionEventHandlers(params: SessionEventHandlerParams): void {\n const { session, runState, model, agentConfig, platformToolRoles } = params;\n session.subscribe((event) => {\n if (!runState.responder || !runState.logCtx || !runState.queue) return;\n handlePresenterEvent(event, {\n runState,\n responder: runState.responder,\n logCtx: runState.logCtx,\n queue: runState.queue,\n baseAttrs: {\n channel_id: runState.logCtx.conversationId,\n session_id: runState.logCtx.sessionId,\n },\n model,\n agentConfig,\n platformToolRoles,\n });\n });\n}\n"]}
@@ -51,6 +51,7 @@ export declare class DockerContainerManager {
51
51
  private removeMigrateSnapshot;
52
52
  private listMigrateSnapshotContainerNames;
53
53
  private removeDanglingMigrateImages;
54
+ private containerRunsFromImage;
54
55
  reconcile(): Promise<void>;
55
56
  private setState;
56
57
  private getContainerName;
@@ -1 +1 @@
1
- {"version":3,"file":"provisioner.d.ts","sourceRoot":"","sources":["../../src/sandbox/provisioner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provisioner.d.ts","sourceRoot":"","sources":["../../src/sandbox/provisioner.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EACV,uBAAuB,EAEvB,6BAA6B,EAC7B,0BAA0B,EAC1B,8BAA8B,EAC9B,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAerB,qBAAa,sBAAsB;IAqB/B,OAAO,CAAC,QAAQ,CAAC,KAAK;IApBxB,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,cAAc,CAAC,CAA0B;IACjD,OAAO,CAAC,gBAAgB,CAAoC;IAC5D,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAwB;IAC7D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAyB;IACjE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAoB;IAC9D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAA2B;IAC5E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAA2B;IAC5E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAmB;IAC/D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAyB;IAExE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAiB;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqC;IACpE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiB;IAE9C,YACmB,KAAK,EAAE,MAAM,EAC9B,OAAO,GAAE,6BAAkC,EAK5C;IAED,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5C;IAED,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEjD;IAED,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE/C;IAED,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAElD;IAED,OAAO,CAAC,SAAS;IAWX,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAWrF;YAEa,cAAc;IA6CtB,KAAK,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAY7D;IAEK,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAQzF;IAED,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,kBAAkB,CAGvD;IAED,gBAAgB,IAAI,cAAc,GAAG,SAAS,CAE7C;IAED,cAAc,IAAI,cAAc,GAAG,SAAS,CAE3C;IAED,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAExC;YAEa,SAAS;IAavB,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjF;YAEa,WAAW;IA4BnB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS/C;IAEK,gCAAgC,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB1F;IAED,2BAA2B,CAAC,UAAU,EAAE,uBAAuB,GAAG,IAAI,CAErE;IAEK,6BAA6B,CAAC,OAAO,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBjE;IAED,OAAO,CAAC,sBAAsB;YAYhB,2BAA2B;YAkC3B,2BAA2B;YAsD3B,sBAAsB;YAiCtB,mCAAmC;YAqBnC,qBAAqB;YAarB,cAAc;YAcd,qBAAqB;YASrB,iCAAiC;YAcjC,2BAA2B;YA0B3B,sBAAsB;IAU9B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAqD/B;IAED,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,UAAU;YAIJ,YAAY;IAqD1B,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,iBAAiB;YAUX,mBAAmB;YA2BnB,YAAY;IAgB1B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,SAAS;YAQH,sBAAsB;IAgBpC,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,sBAAsB;YAYhB,iBAAiB;IAqB/B,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,iBAAiB;YAKX,aAAa;YAIb,aAAa;YAYb,YAAY;YAeZ,gBAAgB;YAchB,gBAAgB;YAWhB,0BAA0B;IAelC,SAAS,IAAI,OAAO,CAAC,8BAA8B,EAAE,CAAC,CAmB3D;IAEK,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAM5D;IAED,OAAO,CAAC,gBAAgB;IAIxB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAE7E;YAEa,wBAAwB;YA6CxB,mBAAmB;YAWnB,aAAa;YAwBb,aAAa;YAeb,yBAAyB;YAmBzB,0BAA0B;IAiBxC,OAAO,CAAC,cAAc;YAOR,uBAAuB;IAwBrC,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,6BAA6B;YAOvB,oBAAoB;YAiBpB,qBAAqB;CAOpC"}
@@ -437,6 +437,8 @@ export class DockerContainerManager {
437
437
  const status = await this.inspectStatus(containerName);
438
438
  if (status === "missing")
439
439
  continue;
440
+ if (await this.containerRunsFromImage(containerName, image))
441
+ continue;
440
442
  try {
441
443
  await this.execFileImpl("docker", ["rmi", image]);
442
444
  log.logInfo(`Removed layout-migration snapshot image ${image}`);
@@ -446,6 +448,15 @@ export class DockerContainerManager {
446
448
  }
447
449
  }
448
450
  }
451
+ async containerRunsFromImage(containerName, image) {
452
+ const { stdout } = await this.execFileImpl("docker", [
453
+ "inspect",
454
+ "-f",
455
+ "{{.Config.Image}}",
456
+ containerName,
457
+ ]);
458
+ return stdout.trim() === image;
459
+ }
449
460
  async reconcile() {
450
461
  const discovered = new Set();
451
462
  const labeledNames = await this.listContainerNamesByLabel();
@@ -1 +1 @@
1
- {"version":3,"file":"provisioner.js","sourceRoot":"","sources":["../../src/sandbox/provisioner.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile } from \"node:child_process\";\nimport { legacyConversationResourceKey, sanitizeIdentitySegment } from \"./identity.js\";\nimport { GUEST_HOME, GUEST_PUBLIC_OFFICES_DIR } from \"./layout.js\";\nimport { createHash } from \"node:crypto\";\nimport { readFileSync, statSync } from \"node:fs\";\nimport { promisify } from \"node:util\";\nimport * as log from \"../log.js\";\nimport { reportUserFacingError } from \"../observability/index.js\";\n\nconst execFileAsync = promisify(execFile);\n\ntype ContainerStatus = \"running\" | \"stopped\" | \"missing\";\ntype DriftReason = \"binds\" | \"mount-content\" | \"network\" | \"image\";\n\nfunction isDockerNotFoundError(err: unknown): boolean {\n if (!err || typeof err !== \"object\") return false;\n const stderr = (err as { stderr?: unknown }).stderr;\n const message = (err as { message?: unknown }).message;\n const haystack = `${typeof stderr === \"string\" ? stderr : \"\"}\\n${\n typeof message === \"string\" ? message : \"\"\n }`.toLowerCase();\n return (\n haystack.includes(\"no such network\") ||\n haystack.includes(\"no such container\") ||\n haystack.includes(\"no such object\") ||\n haystack.includes(\"network not found\") ||\n /network [^\\n]+ not found/.test(haystack) ||\n /error: no such [^\\n]+/.test(haystack)\n );\n}\n\ninterface ContainerState {\n status: ContainerStatus;\n lastUsed: number;\n containerName: string;\n}\n\nimport type {\n ContainerBindTranslator,\n ContainerMount,\n DockerContainerManagerOptions,\n HomeVolumeMigrationOutcome,\n ManagedContainerInventoryEntry,\n ProvisionOptions,\n ResourceLimits,\n SandboxLimitStatus,\n} from \"../types.js\";\nimport { errorMessage } from \"../unknown-values.js\";\nimport type { DockerExecFile } from \"./types.js\";\n\nfunction bindSpecToMount(bindSpec: string): ContainerMount {\n const readOnly = bindSpec.endsWith(\":ro\");\n const spec = readOnly ? bindSpec.slice(0, -3) : bindSpec;\n const separator = spec.indexOf(\":\");\n return {\n source: spec.slice(0, separator),\n target: spec.slice(separator + 1),\n readOnly: readOnly ? true : undefined,\n };\n}\n\nexport class DockerContainerManager {\n private state = new Map<string, ContainerState>();\n private inflight = new Map<string, Promise<string>>();\n private bindTranslator?: ContainerBindTranslator;\n private layoutMigrations = new Map<string, Promise<void>>();\n private keyQueues = new Map<string, Promise<unknown>>();\n private static readonly MANAGED_LABEL = \"mikan.managed=true\";\n private static readonly IMAGE_MODE_LABEL = \"mikan.sandbox=image\";\n private static readonly VAULT_ID_LABEL_KEY = \"mikan.vault-id\";\n private static readonly CONVERSATION_ID_LABEL_KEY = \"mikan.conversation-id\";\n private static readonly MOUNT_SIGNATURE_LABEL_KEY = \"mikan.mount-signature\";\n private static readonly MIGRATE_IMAGE_PREFIX = \"mikan-migrate\";\n private static readonly MIGRATE_BINDS_LABEL_KEY = \"mikan.migrate-binds\";\n\n private readonly limits?: ResourceLimits;\n private readonly boostLimits?: ResourceLimits;\n private readonly boostedKeys = new Set<string>();\n private readonly overrideLimits = new Map<string, ResourceLimits>();\n private readonly execFileImpl: DockerExecFile;\n\n constructor(\n private readonly image: string,\n options: DockerContainerManagerOptions = {},\n ) {\n this.limits = options.limits;\n this.boostLimits = options.boostLimits;\n this.execFileImpl = options.execFileImpl ?? execFileAsync;\n }\n\n static sanitizeSegment(value: string): string {\n return sanitizeIdentitySegment(value);\n }\n\n static containerName(containerKey: string): string {\n return `mikan-sandbox-${containerKey}`;\n }\n\n static networkName(containerKey: string): string {\n return `mikan-sandbox-net-${containerKey}`;\n }\n\n static homeVolumeName(containerKey: string): string {\n return `mikan-home-${containerKey}`;\n }\n\n private serialize<T>(containerKey: string, task: () => Promise<T>): Promise<T> {\n const previous = this.keyQueues.get(containerKey) ?? Promise.resolve();\n const next = previous.then(task, task);\n const settled = next.catch(() => undefined);\n this.keyQueues.set(containerKey, settled);\n void settled.then(() => {\n if (this.keyQueues.get(containerKey) === settled) this.keyQueues.delete(containerKey);\n });\n return next;\n }\n\n async provision(containerKey: string, options: ProvisionOptions = {}): Promise<string> {\n const existing = this.inflight.get(containerKey);\n if (existing) return existing;\n\n const pending = this.serialize(containerKey, () =>\n this.provisionInner(containerKey, options),\n ).finally(() => {\n this.inflight.delete(containerKey);\n });\n this.inflight.set(containerKey, pending);\n return pending;\n }\n\n private async provisionInner(containerKey: string, options: ProvisionOptions): Promise<string> {\n const containerName =\n options.containerName ?? DockerContainerManager.containerName(containerKey);\n const mounts = options.mounts ?? [];\n await this.migrateContainerLayout(containerName);\n const status = await this.inspectStatus(containerName);\n\n try {\n const binds = status === \"missing\" ? [] : await this.inspectBindMounts(containerName);\n const homeVolume = this.hasHomeVolumeBind(containerKey, binds);\n const drift =\n status === \"missing\"\n ? undefined\n : await this.runtimeDrift(containerKey, containerName, mounts, {\n binds,\n status,\n homeVolume,\n });\n if (drift && homeVolume) {\n log.logInfo(`Container ${containerName} is out of date (${drift}); replacing container`);\n await this.replaceHomeVolumeContainer(containerKey, containerName, mounts, options);\n log.logInfo(`Container ${containerName} replaced from image ${this.image}`);\n } else if (drift) {\n log.logInfo(\n `Container ${containerName} configuration changed (${drift}); recreating container`,\n );\n await this.recreateContainerPreservingContents(containerKey, containerName, mounts);\n log.logInfo(`Container ${containerName} recreated`);\n } else if (status === \"stopped\") {\n await this.execFileImpl(\"docker\", [\"start\", containerName]);\n log.logInfo(`Container ${containerName} started`);\n } else if (status === \"missing\") {\n await this.runContainer(containerKey, containerName, mounts, options);\n log.logInfo(`Container ${containerName} created`);\n }\n } catch (err) {\n this.state.delete(containerKey);\n throw err;\n }\n\n this.setState(containerKey, \"running\", containerName);\n await this.applyResourceLimits(containerKey, containerName);\n return containerName;\n }\n\n async boost(containerKey: string): Promise<SandboxLimitStatus> {\n if (!this.boostLimits?.cpus && !this.boostLimits?.memory) {\n return this.getLimitStatus(containerKey);\n }\n\n this.overrideLimits.delete(containerKey);\n this.boostedKeys.add(containerKey);\n const state = this.state.get(containerKey);\n if (state?.status === \"running\") {\n await this.applyResourceLimits(containerKey, state.containerName);\n }\n return this.getLimitStatus(containerKey);\n }\n\n async setLimits(containerKey: string, limits: ResourceLimits): Promise<SandboxLimitStatus> {\n this.boostedKeys.delete(containerKey);\n this.overrideLimits.set(containerKey, { ...this.limits, ...limits });\n const state = this.state.get(containerKey);\n if (state?.status === \"running\") {\n await this.applyResourceLimits(containerKey, state.containerName);\n }\n return this.getLimitStatus(containerKey);\n }\n\n getLimitStatus(containerKey: string): SandboxLimitStatus {\n const boosted = this.boostedKeys.has(containerKey);\n return { limits: this.effectiveLimits(containerKey), boosted };\n }\n\n getDefaultLimits(): ResourceLimits | undefined {\n return this.limits;\n }\n\n getBoostLimits(): ResourceLimits | undefined {\n return this.boostLimits;\n }\n\n stop(containerKey: string): Promise<void> {\n return this.serialize(containerKey, () => this.stopInner(containerKey));\n }\n\n private async stopInner(containerKey: string): Promise<void> {\n const containerName = this.getContainerName(containerKey);\n try {\n await this.execFileImpl(\"docker\", [\"stop\", containerName]);\n this.setState(containerKey, \"stopped\", containerName);\n this.boostedKeys.delete(containerKey);\n this.overrideLimits.delete(containerKey);\n log.logInfo(`Container ${containerName} stopped (idle)`);\n } catch (err) {\n log.logWarning(`Failed to stop container ${containerName}`, errorMessage(err));\n }\n }\n\n remove(containerKey: string, options: { purgeHome?: boolean } = {}): Promise<void> {\n return this.serialize(containerKey, () => this.removeInner(containerKey, options));\n }\n\n private async removeInner(containerKey: string, options: { purgeHome?: boolean }): Promise<void> {\n const containerName = this.getContainerName(containerKey);\n const networkName = DockerContainerManager.networkName(containerKey);\n\n const removed = await this.forceRemoveContainer(\n containerName,\n `Container ${containerName} removed`,\n `Failed to remove container ${containerName}`,\n );\n if (!removed) {\n throw new Error(`Failed to remove container ${containerName}`);\n }\n\n try {\n await this.execFileImpl(\"docker\", [\"network\", \"rm\", networkName]);\n log.logInfo(`Network ${networkName} removed`);\n } catch (err) {\n log.logWarning(`Failed to remove network ${networkName}`, errorMessage(err));\n }\n\n await this.removeMigrateSnapshot(containerName);\n if (options.purgeHome) await this.removeHomeVolume(containerKey);\n\n this.state.delete(containerKey);\n this.boostedKeys.delete(containerKey);\n this.overrideLimits.delete(containerKey);\n }\n\n async stopIdle(maxIdleMs: number): Promise<void> {\n const now = Date.now();\n const toStop: string[] = [];\n for (const [containerKey, containerState] of this.state) {\n if (containerState.status === \"running\" && now - containerState.lastUsed > maxIdleMs) {\n toStop.push(containerKey);\n }\n }\n await Promise.all(toStop.map((containerKey) => this.stop(containerKey)));\n }\n\n async removeContainersForConversations(conversationIds: ReadonlySet<string>): Promise<void> {\n if (conversationIds.size === 0) return;\n const names = await this.listContainerNamesByLabel();\n await Promise.all(\n names.map(async (containerName) => {\n const details = await this.inspectContainerDetails(containerName);\n if (!details?.conversationId || !conversationIds.has(details.conversationId)) return;\n const removed = await this.forceRemoveContainer(\n containerName,\n `Removed container ${containerName} after office migration`,\n `Failed to remove container ${containerName} after office migration`,\n );\n const containerKey = this.containerKeyFromContainerName(containerName);\n if (removed && containerKey) await this.removeHomeVolume(containerKey);\n }),\n );\n }\n\n armContainerLayoutMigration(translator: ContainerBindTranslator): void {\n this.bindTranslator = translator;\n }\n\n async sweepContainerLayoutMigration(delayMs = 2000): Promise<void> {\n if (!this.bindTranslator) return;\n let names: string[];\n try {\n const containers = await this.listContainerNamesByLabel();\n const snapshots = await this.listMigrateSnapshotContainerNames();\n names = Array.from(new Set([...containers, ...snapshots]));\n } catch (err) {\n log.logWarning(\"Container layout sweep could not list containers\", String(err));\n return;\n }\n for (const containerName of names) {\n try {\n await this.migrateContainerLayout(containerName);\n } catch (err) {\n log.logWarning(\n `Container layout migration failed for ${containerName}; leaving it in place`,\n errorMessage(err),\n );\n }\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n await this.removeDanglingMigrateImages();\n }\n\n private migrateContainerLayout(containerName: string): Promise<void> {\n const translator = this.bindTranslator;\n if (!translator) return Promise.resolve();\n const existing = this.layoutMigrations.get(containerName);\n if (existing) return existing;\n const pending = this.migrateContainerLayoutInner(containerName, translator).finally(() => {\n this.layoutMigrations.delete(containerName);\n });\n this.layoutMigrations.set(containerName, pending);\n return pending;\n }\n\n private async migrateContainerLayoutInner(\n containerName: string,\n translator: ContainerBindTranslator,\n ): Promise<void> {\n const snapshotImage = `${DockerContainerManager.MIGRATE_IMAGE_PREFIX}:${containerName}`;\n\n let originalBinds: string[];\n const status = await this.inspectStatus(containerName);\n if (status === \"missing\") {\n const labeled = await this.readMigrateImageBinds(snapshotImage);\n if (labeled === undefined) return;\n originalBinds = labeled;\n } else {\n originalBinds = await this.inspectBindMounts(containerName);\n const translated = originalBinds.map(translator);\n if (this.sameBinds(translated.toSorted(), originalBinds.slice().toSorted())) {\n return;\n }\n log.logInfo(`Migrating container ${containerName} to the office layout`);\n await this.execFileImpl(\"docker\", [\n \"commit\",\n \"-c\",\n `LABEL ${DockerContainerManager.MIGRATE_BINDS_LABEL_KEY}=${JSON.stringify(JSON.stringify(originalBinds))}`,\n containerName,\n snapshotImage,\n ]);\n await this.execFileImpl(\"docker\", [\"rm\", \"-f\", containerName]);\n }\n\n await this.createContainerFromSnapshot(containerName, originalBinds.map(translator));\n await this.removeMigrateSnapshot(containerName);\n log.logInfo(`Container ${containerName} migrated to the office layout`);\n }\n\n private async createContainerFromSnapshot(\n containerName: string,\n bindSpecs: string[],\n knownContainerKey?: string,\n ): Promise<void> {\n const snapshotImage = `${DockerContainerManager.MIGRATE_IMAGE_PREFIX}:${containerName}`;\n const containerKey =\n knownContainerKey ?? this.containerKeyFromContainerName(containerName) ?? containerName;\n const networkName = await this.ensureNetwork(containerKey);\n const conversationId = await this.readImageLabel(\n snapshotImage,\n DockerContainerManager.CONVERSATION_ID_LABEL_KEY,\n );\n const labels = [\n \"--label\",\n DockerContainerManager.MANAGED_LABEL,\n \"--label\",\n DockerContainerManager.IMAGE_MODE_LABEL,\n \"--label\",\n `${DockerContainerManager.VAULT_ID_LABEL_KEY}=${containerKey}`,\n ];\n if (conversationId) {\n labels.push(\n \"--label\",\n `${DockerContainerManager.CONVERSATION_ID_LABEL_KEY}=${conversationId}`,\n );\n }\n labels.push(\n \"--label\",\n `${DockerContainerManager.MOUNT_SIGNATURE_LABEL_KEY}=${this.mountSignature(\n bindSpecs.map(bindSpecToMount),\n )}`,\n );\n await this.execFileImpl(\"docker\", [\n \"create\",\n \"--name\",\n containerName,\n \"--network\",\n networkName,\n \"--cap-drop\",\n \"ALL\",\n \"--security-opt\",\n \"no-new-privileges\",\n \"--pids-limit\",\n \"1024\",\n ...labels,\n ...this.resourceLimitArgs(this.effectiveLimits(containerKey)),\n ...bindSpecs.flatMap((bind) => [\"-v\", bind]),\n snapshotImage,\n \"sleep\",\n \"infinity\",\n ]);\n }\n\n private async removeStaleMountpoints(\n containerName: string,\n bindSpecs: readonly string[],\n ): Promise<void> {\n const keep = new Set(\n bindSpecs\n .map((bind) => bindSpecToMount(bind).target)\n .filter((target) => target.startsWith(`${GUEST_PUBLIC_OFFICES_DIR}/`))\n .map((target) => target.slice(GUEST_PUBLIC_OFFICES_DIR.length + 1)),\n );\n const script = [\n `cd ${GUEST_PUBLIC_OFFICES_DIR} 2>/dev/null || exit 0`,\n \"for d in *; do\",\n ' [ -e \"$d\" ] || continue',\n ' case \" $KEEP \" in *\" ${d##*/} \"*) continue;; esac',\n ' rmdir \"$d\" 2>/dev/null || true',\n \"done\",\n ].join(\"\\n\");\n try {\n await this.execFileImpl(\"docker\", [\n \"exec\",\n \"-e\",\n `KEEP=${[...keep].join(\" \")}`,\n containerName,\n \"sh\",\n \"-c\",\n script,\n ]);\n } catch (err) {\n log.logWarning(`Could not clean stale mountpoints in ${containerName}`, String(err));\n }\n }\n\n private async recreateContainerPreservingContents(\n containerKey: string,\n containerName: string,\n mounts: ContainerMount[],\n ): Promise<void> {\n const snapshotImage = `${DockerContainerManager.MIGRATE_IMAGE_PREFIX}:${containerName}`;\n const bindSpecs = mounts.map((mount) => this.toBindSpec(mount));\n await this.execFileImpl(\"docker\", [\n \"commit\",\n \"-c\",\n `LABEL ${DockerContainerManager.MIGRATE_BINDS_LABEL_KEY}=${JSON.stringify(JSON.stringify(bindSpecs))}`,\n containerName,\n snapshotImage,\n ]);\n await this.execFileImpl(\"docker\", [\"rm\", \"-f\", containerName]);\n await this.createContainerFromSnapshot(containerName, bindSpecs, containerKey);\n await this.execFileImpl(\"docker\", [\"start\", containerName]);\n await this.removeStaleMountpoints(containerName, bindSpecs);\n await this.removeMigrateSnapshot(containerName);\n }\n\n private async readMigrateImageBinds(snapshotImage: string): Promise<string[] | undefined> {\n const raw = await this.readImageLabel(\n snapshotImage,\n DockerContainerManager.MIGRATE_BINDS_LABEL_KEY,\n );\n if (raw === undefined) return undefined;\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed) || parsed.some((bind) => typeof bind !== \"string\")) {\n throw new Error(`Snapshot image ${snapshotImage} carries malformed migrate binds`);\n }\n return parsed;\n }\n\n private async readImageLabel(image: string, key: string): Promise<string | undefined> {\n try {\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"inspect\",\n \"-f\",\n `{{index .Config.Labels \"${key}\"}}`,\n image,\n ]);\n return this.normalizeDockerValue(stdout.trim());\n } catch {\n return undefined;\n }\n }\n\n private async removeMigrateSnapshot(containerName: string): Promise<void> {\n try {\n await this.execFileImpl(\"docker\", [\n \"rmi\",\n `${DockerContainerManager.MIGRATE_IMAGE_PREFIX}:${containerName}`,\n ]);\n } catch {}\n }\n\n private async listMigrateSnapshotContainerNames(): Promise<string[]> {\n try {\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"images\",\n DockerContainerManager.MIGRATE_IMAGE_PREFIX,\n \"--format\",\n \"{{.Tag}}\",\n ]);\n return this.parseNameLines(stdout);\n } catch {\n return [];\n }\n }\n\n private async removeDanglingMigrateImages(): Promise<void> {\n let stdout: string;\n try {\n ({ stdout } = await this.execFileImpl(\"docker\", [\n \"images\",\n `${DockerContainerManager.MIGRATE_IMAGE_PREFIX}`,\n \"--format\",\n \"{{.Repository}}:{{.Tag}}\",\n ]));\n } catch {\n return;\n }\n for (const image of this.parseNameLines(stdout)) {\n const containerName = image.slice(DockerContainerManager.MIGRATE_IMAGE_PREFIX.length + 1);\n const status = await this.inspectStatus(containerName);\n if (status === \"missing\") continue;\n try {\n await this.execFileImpl(\"docker\", [\"rmi\", image]);\n log.logInfo(`Removed layout-migration snapshot image ${image}`);\n } catch (err) {\n log.logWarning(`Could not remove snapshot image ${image}`, String(err));\n }\n }\n }\n\n async reconcile(): Promise<void> {\n const discovered = new Set<string>();\n const labeledNames = await this.listContainerNamesByLabel();\n for (const name of labeledNames) discovered.add(name);\n const legacyNames = await this.listContainerNamesByPrefix();\n for (const name of legacyNames) discovered.add(name);\n\n this.state.clear();\n\n const inspected = await Promise.all(\n Array.from(discovered).map(async (containerName) => ({\n containerName,\n details: await this.inspectContainerDetails(containerName),\n })),\n );\n\n const legacyRemovals: Promise<void>[] = [];\n for (const { containerName, details } of inspected) {\n if (!details) continue;\n\n if (!details.conversationId) {\n legacyRemovals.push(this.removeLegacyContainer(containerName));\n continue;\n }\n\n const containerKey = this.containerKeyFromContainerName(containerName);\n if (!containerKey) {\n log.logWarning(`Skipping unmanaged-style container without container key`, containerName);\n continue;\n }\n\n if (containerKey === legacyConversationResourceKey(details.conversationId)) {\n legacyRemovals.push(\n this.forceRemoveContainer(\n containerName,\n `Removed container ${containerName} keyed by pre-office resource identity`,\n `Failed to remove legacy-keyed container ${containerName}`,\n ).then(() => undefined),\n );\n continue;\n }\n\n const status: ContainerStatus = details.running ? \"running\" : \"stopped\";\n const lastUsed = details.startedAtMs ?? Date.now();\n this.state.set(containerKey, { status, lastUsed, containerName });\n }\n await Promise.all(legacyRemovals);\n\n const running = Array.from(this.state.values()).filter((s) => s.status === \"running\").length;\n const stopped = this.state.size - running;\n log.logInfo(\n `Reconciled ${this.state.size} managed containers (running=${running}, stopped=${stopped})`,\n );\n }\n\n private setState(containerKey: string, status: ContainerStatus, containerName: string): void {\n this.state.set(containerKey, { status, lastUsed: Date.now(), containerName });\n }\n\n private getContainerName(containerKey: string): string {\n return (\n this.state.get(containerKey)?.containerName ??\n DockerContainerManager.containerName(containerKey)\n );\n }\n\n private mountArgs(mounts: ContainerMount[]): string[] {\n return mounts.flatMap((mount) => [\"-v\", this.toBindSpec(mount)]);\n }\n\n private toBindSpec(mount: ContainerMount): string {\n return `${mount.source}:${mount.target}${mount.readOnly ? \":ro\" : \"\"}`;\n }\n\n private async runContainer(\n containerKey: string,\n containerName: string,\n mounts: ContainerMount[],\n options: ProvisionOptions,\n ): Promise<void> {\n const networkName = await this.ensureNetwork(containerKey);\n const homeVolume = await this.ensureHomeVolume(containerKey);\n log.logInfo(`Creating container ${containerName} from image ${this.image}`);\n const labels = [\n \"--label\",\n DockerContainerManager.MANAGED_LABEL,\n \"--label\",\n DockerContainerManager.IMAGE_MODE_LABEL,\n \"--label\",\n `${DockerContainerManager.VAULT_ID_LABEL_KEY}=${containerKey}`,\n ];\n if (options.conversationId) {\n labels.push(\n \"--label\",\n `${DockerContainerManager.CONVERSATION_ID_LABEL_KEY}=${options.conversationId}`,\n );\n }\n if (mounts.length > 0) {\n labels.push(\n \"--label\",\n `${DockerContainerManager.MOUNT_SIGNATURE_LABEL_KEY}=${this.mountSignature(mounts)}`,\n );\n }\n await this.execFileImpl(\"docker\", [\n \"run\",\n \"-d\",\n \"--name\",\n containerName,\n \"--network\",\n networkName,\n \"--cap-drop\",\n \"ALL\",\n \"--security-opt\",\n \"no-new-privileges\",\n \"--pids-limit\",\n \"1024\",\n ...labels,\n ...this.resourceLimitArgs(this.effectiveLimits(containerKey)),\n \"-v\",\n `${homeVolume}:${GUEST_HOME}`,\n ...this.mountArgs(mounts),\n this.image,\n \"sleep\",\n \"infinity\",\n ]);\n }\n\n private effectiveLimits(containerKey: string): ResourceLimits | undefined {\n const override = this.overrideLimits.get(containerKey);\n if (override) return override;\n if (!this.boostedKeys.has(containerKey)) return this.limits;\n return { ...this.limits, ...this.boostLimits };\n }\n\n private resourceLimitArgs(limits: ResourceLimits | undefined): string[] {\n const args: string[] = [];\n if (limits?.cpus) args.push(\"--cpus\", limits.cpus);\n if (limits?.memory) {\n args.push(\"--memory\", limits.memory);\n args.push(\"--memory-swap\", limits.memory);\n }\n return args;\n }\n\n private async applyResourceLimits(containerKey: string, containerName: string): Promise<void> {\n const limitArgs = this.resourceLimitArgs(this.effectiveLimits(containerKey));\n if (limitArgs.length === 0) return;\n const args = [\"update\", ...limitArgs, containerName];\n try {\n await this.execFileImpl(\"docker\", args);\n } catch (err) {\n log.logWarning(\n `Failed to apply resource limits to container ${containerName}`,\n errorMessage(err),\n );\n reportUserFacingError(err, {\n domain: \"sandbox\",\n surface: \"sandbox_provision\",\n operation: \"apply_resource_limits\",\n severity: \"warning\",\n context: {\n sandboxType: \"image\",\n containerKey,\n containerName,\n limitArgCount: limitArgs.length,\n fatal: false,\n },\n });\n }\n }\n\n private async runtimeDrift(\n containerKey: string,\n containerName: string,\n mounts: ContainerMount[],\n current: { binds: readonly string[]; status: ContainerStatus; homeVolume: boolean },\n ): Promise<DriftReason | undefined> {\n const { binds, status, homeVolume } = current;\n if (this.hasBindMountDrift(binds, mounts)) return \"binds\";\n if (await this.hasMountSignatureDrift(containerName, mounts)) return \"mount-content\";\n if (await this.hasNetworkModeDrift(containerKey, containerName)) return \"network\";\n if (homeVolume && status === \"stopped\" && (await this.hasImageDrift(containerName))) {\n return \"image\";\n }\n return undefined;\n }\n\n private hasBindMountDrift(binds: readonly string[], mounts: ContainerMount[]): boolean {\n const expected = this.expectedBinds(mounts);\n const actual = binds.filter((bind) => !this.isHomeVolumeBind(bind));\n return !this.sameBinds(expected, actual);\n }\n\n private expectedBinds(mounts: ContainerMount[]): string[] {\n return mounts\n .map((mount) => this.toBindSpec(mount))\n .slice()\n .toSorted();\n }\n\n private sameBinds(expected: string[], actual: string[]): boolean {\n if (expected.length !== actual.length) {\n return false;\n }\n\n return expected.every((bind, index) => bind === actual[index]);\n }\n\n private async hasMountSignatureDrift(\n containerName: string,\n mounts: ContainerMount[],\n ): Promise<boolean> {\n if (mounts.length === 0) return false;\n const expected = this.mountSignature(mounts);\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"inspect\",\n \"-f\",\n `{{index .Config.Labels \"${DockerContainerManager.MOUNT_SIGNATURE_LABEL_KEY}\"}}`,\n containerName,\n ]);\n const actual = this.normalizeDockerValue(stdout.trim());\n return actual !== expected;\n }\n\n private mountSignature(mounts: ContainerMount[]): string {\n const payload = mounts\n .map((mount) => ({\n source: mount.source,\n target: mount.target,\n fingerprint: this.mountSourceFingerprint(mount.source),\n }))\n .toSorted((left, right) =>\n `${left.target}\\0${left.source}`.localeCompare(`${right.target}\\0${right.source}`),\n );\n return createHash(\"sha256\").update(JSON.stringify(payload)).digest(\"hex\");\n }\n\n private mountSourceFingerprint(source: string): string {\n try {\n const stat = statSync(source);\n if (stat.isFile()) {\n return createHash(\"sha256\").update(readFileSync(source)).digest(\"hex\");\n }\n return `${stat.isDirectory() ? \"dir\" : \"other\"}:${stat.dev}:${stat.ino}:${stat.birthtimeMs}`;\n } catch {\n return \"missing\";\n }\n }\n\n private async inspectBindMounts(containerName: string): Promise<string[]> {\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"inspect\",\n \"-f\",\n \"{{json .HostConfig.Binds}}\",\n containerName,\n ]);\n const payload = stdout.trim();\n const parsed = JSON.parse(payload.length > 0 ? payload : \"null\") as unknown;\n\n if (parsed === null) {\n return [];\n }\n\n if (!Array.isArray(parsed) || parsed.some((bind) => typeof bind !== \"string\")) {\n throw new Error(`Unexpected docker bind mount payload for container \"${containerName}\"`);\n }\n\n return [...parsed].toSorted();\n }\n\n private isHomeVolumeBind(bind: string): boolean {\n const separator = bind.indexOf(\":\");\n if (separator === -1) return false;\n const source = bind.slice(0, separator);\n const target = bind.slice(separator + 1).replace(/:r[ow]$/, \"\");\n return source.startsWith(DockerContainerManager.homeVolumeName(\"\")) && target === GUEST_HOME;\n }\n\n private hasHomeVolumeBind(containerKey: string, binds: readonly string[]): boolean {\n const expected = `${DockerContainerManager.homeVolumeName(containerKey)}:${GUEST_HOME}`;\n return binds.includes(expected);\n }\n\n private async hasHomeVolume(containerKey: string, containerName: string): Promise<boolean> {\n return this.hasHomeVolumeBind(containerKey, await this.inspectBindMounts(containerName));\n }\n\n private async hasImageDrift(containerName: string): Promise<boolean> {\n const desired = await this.localImageId();\n if (!desired) return false;\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"inspect\",\n \"-f\",\n \"{{.Image}}\",\n containerName,\n ]);\n return stdout.trim() !== desired;\n }\n\n private async localImageId(): Promise<string | undefined> {\n try {\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"image\",\n \"inspect\",\n \"-f\",\n \"{{.Id}}\",\n this.image,\n ]);\n return this.normalizeDockerValue(stdout.trim());\n } catch {\n return undefined;\n }\n }\n\n private async ensureHomeVolume(containerKey: string): Promise<string> {\n const volumeName = DockerContainerManager.homeVolumeName(containerKey);\n await this.execFileImpl(\"docker\", [\n \"volume\",\n \"create\",\n \"--label\",\n DockerContainerManager.MANAGED_LABEL,\n \"--label\",\n `${DockerContainerManager.VAULT_ID_LABEL_KEY}=${containerKey}`,\n volumeName,\n ]);\n return volumeName;\n }\n\n private async removeHomeVolume(containerKey: string): Promise<void> {\n const volumeName = DockerContainerManager.homeVolumeName(containerKey);\n try {\n await this.execFileImpl(\"docker\", [\"volume\", \"rm\", volumeName]);\n log.logInfo(`Home volume ${volumeName} removed`);\n } catch (err) {\n if (isDockerNotFoundError(err)) return;\n log.logWarning(`Failed to remove home volume ${volumeName}`, errorMessage(err));\n }\n }\n\n private async replaceHomeVolumeContainer(\n containerKey: string,\n containerName: string,\n mounts: ContainerMount[],\n options: ProvisionOptions,\n ): Promise<void> {\n const removed = await this.forceRemoveContainer(\n containerName,\n `Container ${containerName} removed for replacement`,\n `Failed to remove container ${containerName} for replacement`,\n );\n if (!removed) throw new Error(`Failed to remove container ${containerName} for replacement`);\n await this.runContainer(containerKey, containerName, mounts, options);\n }\n\n async inventory(): Promise<ManagedContainerInventoryEntry[]> {\n const names = await this.listContainerNamesByLabel();\n const entries: ManagedContainerInventoryEntry[] = [];\n for (const containerName of names) {\n const containerKey = this.containerKeyFromContainerName(containerName);\n const status = await this.inspectStatus(containerName);\n if (status === \"missing\") continue;\n const homeVolume = containerKey\n ? await this.hasHomeVolume(containerKey, containerName)\n : false;\n entries.push({\n containerName,\n containerKey,\n running: status === \"running\",\n homeVolume,\n imageStale: await this.hasImageDrift(containerName),\n });\n }\n return entries;\n }\n\n async systemChanges(containerName: string): Promise<string[]> {\n const { stdout } = await this.execFileImpl(\"docker\", [\"diff\", containerName]);\n return this.parseNameLines(stdout).filter((line) => {\n const path = line.slice(2);\n return !this.isUnderGuestPath(path, GUEST_HOME) && !this.isUnderGuestPath(path, \"/workspace\");\n });\n }\n\n private isUnderGuestPath(path: string, root: string): boolean {\n return path === root || path.startsWith(`${root}/`);\n }\n\n migrateToHomeVolume(containerKey: string): Promise<HomeVolumeMigrationOutcome> {\n return this.serialize(containerKey, () => this.migrateToHomeVolumeInner(containerKey));\n }\n\n private async migrateToHomeVolumeInner(\n containerKey: string,\n ): Promise<HomeVolumeMigrationOutcome> {\n const containerName = DockerContainerManager.containerName(containerKey);\n const status = await this.inspectStatus(containerName);\n if (status === \"missing\") return \"missing\";\n if (await this.hasHomeVolume(containerKey, containerName)) return \"already-migrated\";\n\n const details = await this.inspectContainerDetails(containerName);\n const mounts = (await this.inspectBindMounts(containerName))\n .filter((bind) => !this.isHomeVolumeBind(bind))\n .map(bindSpecToMount);\n const snapshotImage = `${DockerContainerManager.MIGRATE_IMAGE_PREFIX}:${containerName}`;\n log.logInfo(`Migrating container ${containerName} to a home volume`);\n await this.execFileImpl(\"docker\", [\"commit\", containerName, snapshotImage]);\n const homeVolume = await this.ensureHomeVolume(containerKey);\n await this.execFileImpl(\"docker\", [\n \"run\",\n \"--rm\",\n \"--network\",\n \"none\",\n \"-v\",\n `${homeVolume}:${GUEST_HOME}`,\n snapshotImage,\n \"true\",\n ]);\n const removed = await this.forceRemoveContainer(\n containerName,\n `Container ${containerName} removed for home-volume migration`,\n `Failed to remove container ${containerName} for home-volume migration`,\n );\n if (!removed) throw new Error(`Failed to remove container ${containerName}`);\n await this.runContainer(\n containerKey,\n containerName,\n mounts,\n details?.conversationId ? { conversationId: details.conversationId } : {},\n );\n if (status === \"stopped\") await this.execFileImpl(\"docker\", [\"stop\", containerName]);\n await this.removeMigrateSnapshot(containerName);\n this.setState(containerKey, status === \"stopped\" ? \"stopped\" : \"running\", containerName);\n log.logInfo(`Container ${containerName} migrated to home volume ${homeVolume}`);\n return \"migrated\";\n }\n\n private async hasNetworkModeDrift(containerKey: string, containerName: string): Promise<boolean> {\n const expected = DockerContainerManager.networkName(containerKey);\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"inspect\",\n \"-f\",\n \"{{.HostConfig.NetworkMode}}\",\n containerName,\n ]);\n return stdout.trim() !== expected;\n }\n\n private async ensureNetwork(containerKey: string): Promise<string> {\n const networkName = DockerContainerManager.networkName(containerKey);\n try {\n await this.execFileImpl(\"docker\", [\"network\", \"inspect\", networkName]);\n return networkName;\n } catch (err) {\n if (!isDockerNotFoundError(err)) throw err;\n }\n await this.execFileImpl(\"docker\", [\n \"network\",\n \"create\",\n \"--driver\",\n \"bridge\",\n \"--label\",\n DockerContainerManager.MANAGED_LABEL,\n \"--label\",\n DockerContainerManager.IMAGE_MODE_LABEL,\n \"--label\",\n `${DockerContainerManager.VAULT_ID_LABEL_KEY}=${containerKey}`,\n networkName,\n ]);\n return networkName;\n }\n\n private async inspectStatus(containerName: string): Promise<ContainerStatus> {\n try {\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"inspect\",\n \"-f\",\n \"{{.State.Running}}\",\n containerName,\n ]);\n return stdout.trim() === \"true\" ? \"running\" : \"stopped\";\n } catch (err) {\n if (isDockerNotFoundError(err)) return \"missing\";\n throw err;\n }\n }\n\n private async listContainerNamesByLabel(): Promise<string[]> {\n try {\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"ps\",\n \"-a\",\n \"--filter\",\n `label=${DockerContainerManager.MANAGED_LABEL}`,\n \"--filter\",\n `label=${DockerContainerManager.IMAGE_MODE_LABEL}`,\n \"--format\",\n \"{{.Names}}\",\n ]);\n return this.parseNameLines(stdout);\n } catch (err) {\n log.logWarning(\"Failed to list labeled managed containers\", errorMessage(err));\n return [];\n }\n }\n\n private async listContainerNamesByPrefix(): Promise<string[]> {\n try {\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"ps\",\n \"-a\",\n \"--filter\",\n `name=${DockerContainerManager.containerName(\"\")}`,\n \"--format\",\n \"{{.Names}}\",\n ]);\n return this.parseNameLines(stdout);\n } catch (err) {\n log.logWarning(\"Failed to list legacy managed containers\", errorMessage(err));\n return [];\n }\n }\n\n private parseNameLines(stdout: string): string[] {\n return stdout\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n }\n\n private async inspectContainerDetails(\n containerName: string,\n ): Promise<{ running: boolean; startedAtMs?: number; conversationId?: string } | undefined> {\n try {\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"inspect\",\n \"-f\",\n `{{.State.Running}}\\t{{.State.StartedAt}}\\t{{index .Config.Labels \"${DockerContainerManager.VAULT_ID_LABEL_KEY}\"}}\\t{{index .Config.Labels \"${DockerContainerManager.CONVERSATION_ID_LABEL_KEY}\"}}`,\n containerName,\n ]);\n const [runningRaw, startedAtRaw, , conversationIdRaw] = stdout.trim().split(\"\\t\");\n const running = runningRaw === \"true\";\n const startedAtMs = this.parseDockerTimestamp(startedAtRaw);\n const conversationId = this.normalizeDockerValue(conversationIdRaw);\n return { running, startedAtMs, conversationId };\n } catch (err) {\n log.logWarning(\n `Failed to inspect container ${containerName} during reconcile`,\n errorMessage(err),\n );\n return undefined;\n }\n }\n\n private normalizeDockerValue(value?: string): string | undefined {\n if (!value || value === \"<no value>\") return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n\n private parseDockerTimestamp(value?: string): number | undefined {\n const normalized = this.normalizeDockerValue(value);\n if (!normalized || normalized.startsWith(\"0001-\")) return undefined;\n const parsed = Date.parse(normalized);\n return Number.isNaN(parsed) ? undefined : parsed;\n }\n\n private containerKeyFromContainerName(containerName: string): string | undefined {\n const prefix = DockerContainerManager.containerName(\"\");\n if (!containerName.startsWith(prefix)) return undefined;\n const containerKey = containerName.slice(prefix.length);\n return containerKey.length > 0 ? containerKey : undefined;\n }\n\n private async forceRemoveContainer(\n containerName: string,\n successLog: string,\n failureLog: string,\n ): Promise<boolean> {\n try {\n await this.execFileImpl(\"docker\", [\"rm\", \"-f\", containerName]);\n log.logInfo(successLog);\n return true;\n } catch (err) {\n const message = errorMessage(err);\n if (/no such container/i.test(message)) return true;\n log.logWarning(failureLog, message);\n return false;\n }\n }\n\n private async removeLegacyContainer(containerName: string): Promise<void> {\n await this.forceRemoveContainer(\n containerName,\n `Removed legacy mikan container ${containerName} (pre-channel-isolation scheme)`,\n `Failed to remove legacy mikan container ${containerName}`,\n );\n }\n}\n"]}
1
+ {"version":3,"file":"provisioner.js","sourceRoot":"","sources":["../../src/sandbox/provisioner.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile } from \"node:child_process\";\nimport { legacyConversationResourceKey, sanitizeIdentitySegment } from \"./identity.js\";\nimport { GUEST_HOME, GUEST_PUBLIC_OFFICES_DIR } from \"./layout.js\";\nimport { createHash } from \"node:crypto\";\nimport { readFileSync, statSync } from \"node:fs\";\nimport { promisify } from \"node:util\";\nimport * as log from \"../log.js\";\nimport { reportUserFacingError } from \"../observability/index.js\";\n\nconst execFileAsync = promisify(execFile);\n\ntype ContainerStatus = \"running\" | \"stopped\" | \"missing\";\ntype DriftReason = \"binds\" | \"mount-content\" | \"network\" | \"image\";\n\nfunction isDockerNotFoundError(err: unknown): boolean {\n if (!err || typeof err !== \"object\") return false;\n const stderr = (err as { stderr?: unknown }).stderr;\n const message = (err as { message?: unknown }).message;\n const haystack = `${typeof stderr === \"string\" ? stderr : \"\"}\\n${\n typeof message === \"string\" ? message : \"\"\n }`.toLowerCase();\n return (\n haystack.includes(\"no such network\") ||\n haystack.includes(\"no such container\") ||\n haystack.includes(\"no such object\") ||\n haystack.includes(\"network not found\") ||\n /network [^\\n]+ not found/.test(haystack) ||\n /error: no such [^\\n]+/.test(haystack)\n );\n}\n\ninterface ContainerState {\n status: ContainerStatus;\n lastUsed: number;\n containerName: string;\n}\n\nimport type {\n ContainerBindTranslator,\n ContainerMount,\n DockerContainerManagerOptions,\n HomeVolumeMigrationOutcome,\n ManagedContainerInventoryEntry,\n ProvisionOptions,\n ResourceLimits,\n SandboxLimitStatus,\n} from \"../types.js\";\nimport { errorMessage } from \"../unknown-values.js\";\nimport type { DockerExecFile } from \"./types.js\";\n\nfunction bindSpecToMount(bindSpec: string): ContainerMount {\n const readOnly = bindSpec.endsWith(\":ro\");\n const spec = readOnly ? bindSpec.slice(0, -3) : bindSpec;\n const separator = spec.indexOf(\":\");\n return {\n source: spec.slice(0, separator),\n target: spec.slice(separator + 1),\n readOnly: readOnly ? true : undefined,\n };\n}\n\nexport class DockerContainerManager {\n private state = new Map<string, ContainerState>();\n private inflight = new Map<string, Promise<string>>();\n private bindTranslator?: ContainerBindTranslator;\n private layoutMigrations = new Map<string, Promise<void>>();\n private keyQueues = new Map<string, Promise<unknown>>();\n private static readonly MANAGED_LABEL = \"mikan.managed=true\";\n private static readonly IMAGE_MODE_LABEL = \"mikan.sandbox=image\";\n private static readonly VAULT_ID_LABEL_KEY = \"mikan.vault-id\";\n private static readonly CONVERSATION_ID_LABEL_KEY = \"mikan.conversation-id\";\n private static readonly MOUNT_SIGNATURE_LABEL_KEY = \"mikan.mount-signature\";\n private static readonly MIGRATE_IMAGE_PREFIX = \"mikan-migrate\";\n private static readonly MIGRATE_BINDS_LABEL_KEY = \"mikan.migrate-binds\";\n\n private readonly limits?: ResourceLimits;\n private readonly boostLimits?: ResourceLimits;\n private readonly boostedKeys = new Set<string>();\n private readonly overrideLimits = new Map<string, ResourceLimits>();\n private readonly execFileImpl: DockerExecFile;\n\n constructor(\n private readonly image: string,\n options: DockerContainerManagerOptions = {},\n ) {\n this.limits = options.limits;\n this.boostLimits = options.boostLimits;\n this.execFileImpl = options.execFileImpl ?? execFileAsync;\n }\n\n static sanitizeSegment(value: string): string {\n return sanitizeIdentitySegment(value);\n }\n\n static containerName(containerKey: string): string {\n return `mikan-sandbox-${containerKey}`;\n }\n\n static networkName(containerKey: string): string {\n return `mikan-sandbox-net-${containerKey}`;\n }\n\n static homeVolumeName(containerKey: string): string {\n return `mikan-home-${containerKey}`;\n }\n\n private serialize<T>(containerKey: string, task: () => Promise<T>): Promise<T> {\n const previous = this.keyQueues.get(containerKey) ?? Promise.resolve();\n const next = previous.then(task, task);\n const settled = next.catch(() => undefined);\n this.keyQueues.set(containerKey, settled);\n void settled.then(() => {\n if (this.keyQueues.get(containerKey) === settled) this.keyQueues.delete(containerKey);\n });\n return next;\n }\n\n async provision(containerKey: string, options: ProvisionOptions = {}): Promise<string> {\n const existing = this.inflight.get(containerKey);\n if (existing) return existing;\n\n const pending = this.serialize(containerKey, () =>\n this.provisionInner(containerKey, options),\n ).finally(() => {\n this.inflight.delete(containerKey);\n });\n this.inflight.set(containerKey, pending);\n return pending;\n }\n\n private async provisionInner(containerKey: string, options: ProvisionOptions): Promise<string> {\n const containerName =\n options.containerName ?? DockerContainerManager.containerName(containerKey);\n const mounts = options.mounts ?? [];\n await this.migrateContainerLayout(containerName);\n const status = await this.inspectStatus(containerName);\n\n try {\n const binds = status === \"missing\" ? [] : await this.inspectBindMounts(containerName);\n const homeVolume = this.hasHomeVolumeBind(containerKey, binds);\n const drift =\n status === \"missing\"\n ? undefined\n : await this.runtimeDrift(containerKey, containerName, mounts, {\n binds,\n status,\n homeVolume,\n });\n if (drift && homeVolume) {\n log.logInfo(`Container ${containerName} is out of date (${drift}); replacing container`);\n await this.replaceHomeVolumeContainer(containerKey, containerName, mounts, options);\n log.logInfo(`Container ${containerName} replaced from image ${this.image}`);\n } else if (drift) {\n log.logInfo(\n `Container ${containerName} configuration changed (${drift}); recreating container`,\n );\n await this.recreateContainerPreservingContents(containerKey, containerName, mounts);\n log.logInfo(`Container ${containerName} recreated`);\n } else if (status === \"stopped\") {\n await this.execFileImpl(\"docker\", [\"start\", containerName]);\n log.logInfo(`Container ${containerName} started`);\n } else if (status === \"missing\") {\n await this.runContainer(containerKey, containerName, mounts, options);\n log.logInfo(`Container ${containerName} created`);\n }\n } catch (err) {\n this.state.delete(containerKey);\n throw err;\n }\n\n this.setState(containerKey, \"running\", containerName);\n await this.applyResourceLimits(containerKey, containerName);\n return containerName;\n }\n\n async boost(containerKey: string): Promise<SandboxLimitStatus> {\n if (!this.boostLimits?.cpus && !this.boostLimits?.memory) {\n return this.getLimitStatus(containerKey);\n }\n\n this.overrideLimits.delete(containerKey);\n this.boostedKeys.add(containerKey);\n const state = this.state.get(containerKey);\n if (state?.status === \"running\") {\n await this.applyResourceLimits(containerKey, state.containerName);\n }\n return this.getLimitStatus(containerKey);\n }\n\n async setLimits(containerKey: string, limits: ResourceLimits): Promise<SandboxLimitStatus> {\n this.boostedKeys.delete(containerKey);\n this.overrideLimits.set(containerKey, { ...this.limits, ...limits });\n const state = this.state.get(containerKey);\n if (state?.status === \"running\") {\n await this.applyResourceLimits(containerKey, state.containerName);\n }\n return this.getLimitStatus(containerKey);\n }\n\n getLimitStatus(containerKey: string): SandboxLimitStatus {\n const boosted = this.boostedKeys.has(containerKey);\n return { limits: this.effectiveLimits(containerKey), boosted };\n }\n\n getDefaultLimits(): ResourceLimits | undefined {\n return this.limits;\n }\n\n getBoostLimits(): ResourceLimits | undefined {\n return this.boostLimits;\n }\n\n stop(containerKey: string): Promise<void> {\n return this.serialize(containerKey, () => this.stopInner(containerKey));\n }\n\n private async stopInner(containerKey: string): Promise<void> {\n const containerName = this.getContainerName(containerKey);\n try {\n await this.execFileImpl(\"docker\", [\"stop\", containerName]);\n this.setState(containerKey, \"stopped\", containerName);\n this.boostedKeys.delete(containerKey);\n this.overrideLimits.delete(containerKey);\n log.logInfo(`Container ${containerName} stopped (idle)`);\n } catch (err) {\n log.logWarning(`Failed to stop container ${containerName}`, errorMessage(err));\n }\n }\n\n remove(containerKey: string, options: { purgeHome?: boolean } = {}): Promise<void> {\n return this.serialize(containerKey, () => this.removeInner(containerKey, options));\n }\n\n private async removeInner(containerKey: string, options: { purgeHome?: boolean }): Promise<void> {\n const containerName = this.getContainerName(containerKey);\n const networkName = DockerContainerManager.networkName(containerKey);\n\n const removed = await this.forceRemoveContainer(\n containerName,\n `Container ${containerName} removed`,\n `Failed to remove container ${containerName}`,\n );\n if (!removed) {\n throw new Error(`Failed to remove container ${containerName}`);\n }\n\n try {\n await this.execFileImpl(\"docker\", [\"network\", \"rm\", networkName]);\n log.logInfo(`Network ${networkName} removed`);\n } catch (err) {\n log.logWarning(`Failed to remove network ${networkName}`, errorMessage(err));\n }\n\n await this.removeMigrateSnapshot(containerName);\n if (options.purgeHome) await this.removeHomeVolume(containerKey);\n\n this.state.delete(containerKey);\n this.boostedKeys.delete(containerKey);\n this.overrideLimits.delete(containerKey);\n }\n\n async stopIdle(maxIdleMs: number): Promise<void> {\n const now = Date.now();\n const toStop: string[] = [];\n for (const [containerKey, containerState] of this.state) {\n if (containerState.status === \"running\" && now - containerState.lastUsed > maxIdleMs) {\n toStop.push(containerKey);\n }\n }\n await Promise.all(toStop.map((containerKey) => this.stop(containerKey)));\n }\n\n async removeContainersForConversations(conversationIds: ReadonlySet<string>): Promise<void> {\n if (conversationIds.size === 0) return;\n const names = await this.listContainerNamesByLabel();\n await Promise.all(\n names.map(async (containerName) => {\n const details = await this.inspectContainerDetails(containerName);\n if (!details?.conversationId || !conversationIds.has(details.conversationId)) return;\n const removed = await this.forceRemoveContainer(\n containerName,\n `Removed container ${containerName} after office migration`,\n `Failed to remove container ${containerName} after office migration`,\n );\n const containerKey = this.containerKeyFromContainerName(containerName);\n if (removed && containerKey) await this.removeHomeVolume(containerKey);\n }),\n );\n }\n\n armContainerLayoutMigration(translator: ContainerBindTranslator): void {\n this.bindTranslator = translator;\n }\n\n async sweepContainerLayoutMigration(delayMs = 2000): Promise<void> {\n if (!this.bindTranslator) return;\n let names: string[];\n try {\n const containers = await this.listContainerNamesByLabel();\n const snapshots = await this.listMigrateSnapshotContainerNames();\n names = Array.from(new Set([...containers, ...snapshots]));\n } catch (err) {\n log.logWarning(\"Container layout sweep could not list containers\", String(err));\n return;\n }\n for (const containerName of names) {\n try {\n await this.migrateContainerLayout(containerName);\n } catch (err) {\n log.logWarning(\n `Container layout migration failed for ${containerName}; leaving it in place`,\n errorMessage(err),\n );\n }\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n await this.removeDanglingMigrateImages();\n }\n\n private migrateContainerLayout(containerName: string): Promise<void> {\n const translator = this.bindTranslator;\n if (!translator) return Promise.resolve();\n const existing = this.layoutMigrations.get(containerName);\n if (existing) return existing;\n const pending = this.migrateContainerLayoutInner(containerName, translator).finally(() => {\n this.layoutMigrations.delete(containerName);\n });\n this.layoutMigrations.set(containerName, pending);\n return pending;\n }\n\n private async migrateContainerLayoutInner(\n containerName: string,\n translator: ContainerBindTranslator,\n ): Promise<void> {\n const snapshotImage = `${DockerContainerManager.MIGRATE_IMAGE_PREFIX}:${containerName}`;\n\n let originalBinds: string[];\n const status = await this.inspectStatus(containerName);\n if (status === \"missing\") {\n const labeled = await this.readMigrateImageBinds(snapshotImage);\n if (labeled === undefined) return;\n originalBinds = labeled;\n } else {\n originalBinds = await this.inspectBindMounts(containerName);\n const translated = originalBinds.map(translator);\n if (this.sameBinds(translated.toSorted(), originalBinds.slice().toSorted())) {\n return;\n }\n log.logInfo(`Migrating container ${containerName} to the office layout`);\n await this.execFileImpl(\"docker\", [\n \"commit\",\n \"-c\",\n `LABEL ${DockerContainerManager.MIGRATE_BINDS_LABEL_KEY}=${JSON.stringify(JSON.stringify(originalBinds))}`,\n containerName,\n snapshotImage,\n ]);\n await this.execFileImpl(\"docker\", [\"rm\", \"-f\", containerName]);\n }\n\n await this.createContainerFromSnapshot(containerName, originalBinds.map(translator));\n await this.removeMigrateSnapshot(containerName);\n log.logInfo(`Container ${containerName} migrated to the office layout`);\n }\n\n private async createContainerFromSnapshot(\n containerName: string,\n bindSpecs: string[],\n knownContainerKey?: string,\n ): Promise<void> {\n const snapshotImage = `${DockerContainerManager.MIGRATE_IMAGE_PREFIX}:${containerName}`;\n const containerKey =\n knownContainerKey ?? this.containerKeyFromContainerName(containerName) ?? containerName;\n const networkName = await this.ensureNetwork(containerKey);\n const conversationId = await this.readImageLabel(\n snapshotImage,\n DockerContainerManager.CONVERSATION_ID_LABEL_KEY,\n );\n const labels = [\n \"--label\",\n DockerContainerManager.MANAGED_LABEL,\n \"--label\",\n DockerContainerManager.IMAGE_MODE_LABEL,\n \"--label\",\n `${DockerContainerManager.VAULT_ID_LABEL_KEY}=${containerKey}`,\n ];\n if (conversationId) {\n labels.push(\n \"--label\",\n `${DockerContainerManager.CONVERSATION_ID_LABEL_KEY}=${conversationId}`,\n );\n }\n labels.push(\n \"--label\",\n `${DockerContainerManager.MOUNT_SIGNATURE_LABEL_KEY}=${this.mountSignature(\n bindSpecs.map(bindSpecToMount),\n )}`,\n );\n await this.execFileImpl(\"docker\", [\n \"create\",\n \"--name\",\n containerName,\n \"--network\",\n networkName,\n \"--cap-drop\",\n \"ALL\",\n \"--security-opt\",\n \"no-new-privileges\",\n \"--pids-limit\",\n \"1024\",\n ...labels,\n ...this.resourceLimitArgs(this.effectiveLimits(containerKey)),\n ...bindSpecs.flatMap((bind) => [\"-v\", bind]),\n snapshotImage,\n \"sleep\",\n \"infinity\",\n ]);\n }\n\n private async removeStaleMountpoints(\n containerName: string,\n bindSpecs: readonly string[],\n ): Promise<void> {\n const keep = new Set(\n bindSpecs\n .map((bind) => bindSpecToMount(bind).target)\n .filter((target) => target.startsWith(`${GUEST_PUBLIC_OFFICES_DIR}/`))\n .map((target) => target.slice(GUEST_PUBLIC_OFFICES_DIR.length + 1)),\n );\n const script = [\n `cd ${GUEST_PUBLIC_OFFICES_DIR} 2>/dev/null || exit 0`,\n \"for d in *; do\",\n ' [ -e \"$d\" ] || continue',\n ' case \" $KEEP \" in *\" ${d##*/} \"*) continue;; esac',\n ' rmdir \"$d\" 2>/dev/null || true',\n \"done\",\n ].join(\"\\n\");\n try {\n await this.execFileImpl(\"docker\", [\n \"exec\",\n \"-e\",\n `KEEP=${[...keep].join(\" \")}`,\n containerName,\n \"sh\",\n \"-c\",\n script,\n ]);\n } catch (err) {\n log.logWarning(`Could not clean stale mountpoints in ${containerName}`, String(err));\n }\n }\n\n private async recreateContainerPreservingContents(\n containerKey: string,\n containerName: string,\n mounts: ContainerMount[],\n ): Promise<void> {\n const snapshotImage = `${DockerContainerManager.MIGRATE_IMAGE_PREFIX}:${containerName}`;\n const bindSpecs = mounts.map((mount) => this.toBindSpec(mount));\n await this.execFileImpl(\"docker\", [\n \"commit\",\n \"-c\",\n `LABEL ${DockerContainerManager.MIGRATE_BINDS_LABEL_KEY}=${JSON.stringify(JSON.stringify(bindSpecs))}`,\n containerName,\n snapshotImage,\n ]);\n await this.execFileImpl(\"docker\", [\"rm\", \"-f\", containerName]);\n await this.createContainerFromSnapshot(containerName, bindSpecs, containerKey);\n await this.execFileImpl(\"docker\", [\"start\", containerName]);\n await this.removeStaleMountpoints(containerName, bindSpecs);\n await this.removeMigrateSnapshot(containerName);\n }\n\n private async readMigrateImageBinds(snapshotImage: string): Promise<string[] | undefined> {\n const raw = await this.readImageLabel(\n snapshotImage,\n DockerContainerManager.MIGRATE_BINDS_LABEL_KEY,\n );\n if (raw === undefined) return undefined;\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed) || parsed.some((bind) => typeof bind !== \"string\")) {\n throw new Error(`Snapshot image ${snapshotImage} carries malformed migrate binds`);\n }\n return parsed;\n }\n\n private async readImageLabel(image: string, key: string): Promise<string | undefined> {\n try {\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"inspect\",\n \"-f\",\n `{{index .Config.Labels \"${key}\"}}`,\n image,\n ]);\n return this.normalizeDockerValue(stdout.trim());\n } catch {\n return undefined;\n }\n }\n\n private async removeMigrateSnapshot(containerName: string): Promise<void> {\n try {\n await this.execFileImpl(\"docker\", [\n \"rmi\",\n `${DockerContainerManager.MIGRATE_IMAGE_PREFIX}:${containerName}`,\n ]);\n } catch {}\n }\n\n private async listMigrateSnapshotContainerNames(): Promise<string[]> {\n try {\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"images\",\n DockerContainerManager.MIGRATE_IMAGE_PREFIX,\n \"--format\",\n \"{{.Tag}}\",\n ]);\n return this.parseNameLines(stdout);\n } catch {\n return [];\n }\n }\n\n private async removeDanglingMigrateImages(): Promise<void> {\n let stdout: string;\n try {\n ({ stdout } = await this.execFileImpl(\"docker\", [\n \"images\",\n `${DockerContainerManager.MIGRATE_IMAGE_PREFIX}`,\n \"--format\",\n \"{{.Repository}}:{{.Tag}}\",\n ]));\n } catch {\n return;\n }\n for (const image of this.parseNameLines(stdout)) {\n const containerName = image.slice(DockerContainerManager.MIGRATE_IMAGE_PREFIX.length + 1);\n const status = await this.inspectStatus(containerName);\n if (status === \"missing\") continue;\n if (await this.containerRunsFromImage(containerName, image)) continue;\n try {\n await this.execFileImpl(\"docker\", [\"rmi\", image]);\n log.logInfo(`Removed layout-migration snapshot image ${image}`);\n } catch (err) {\n log.logWarning(`Could not remove snapshot image ${image}`, String(err));\n }\n }\n }\n\n private async containerRunsFromImage(containerName: string, image: string): Promise<boolean> {\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"inspect\",\n \"-f\",\n \"{{.Config.Image}}\",\n containerName,\n ]);\n return stdout.trim() === image;\n }\n\n async reconcile(): Promise<void> {\n const discovered = new Set<string>();\n const labeledNames = await this.listContainerNamesByLabel();\n for (const name of labeledNames) discovered.add(name);\n const legacyNames = await this.listContainerNamesByPrefix();\n for (const name of legacyNames) discovered.add(name);\n\n this.state.clear();\n\n const inspected = await Promise.all(\n Array.from(discovered).map(async (containerName) => ({\n containerName,\n details: await this.inspectContainerDetails(containerName),\n })),\n );\n\n const legacyRemovals: Promise<void>[] = [];\n for (const { containerName, details } of inspected) {\n if (!details) continue;\n\n if (!details.conversationId) {\n legacyRemovals.push(this.removeLegacyContainer(containerName));\n continue;\n }\n\n const containerKey = this.containerKeyFromContainerName(containerName);\n if (!containerKey) {\n log.logWarning(`Skipping unmanaged-style container without container key`, containerName);\n continue;\n }\n\n if (containerKey === legacyConversationResourceKey(details.conversationId)) {\n legacyRemovals.push(\n this.forceRemoveContainer(\n containerName,\n `Removed container ${containerName} keyed by pre-office resource identity`,\n `Failed to remove legacy-keyed container ${containerName}`,\n ).then(() => undefined),\n );\n continue;\n }\n\n const status: ContainerStatus = details.running ? \"running\" : \"stopped\";\n const lastUsed = details.startedAtMs ?? Date.now();\n this.state.set(containerKey, { status, lastUsed, containerName });\n }\n await Promise.all(legacyRemovals);\n\n const running = Array.from(this.state.values()).filter((s) => s.status === \"running\").length;\n const stopped = this.state.size - running;\n log.logInfo(\n `Reconciled ${this.state.size} managed containers (running=${running}, stopped=${stopped})`,\n );\n }\n\n private setState(containerKey: string, status: ContainerStatus, containerName: string): void {\n this.state.set(containerKey, { status, lastUsed: Date.now(), containerName });\n }\n\n private getContainerName(containerKey: string): string {\n return (\n this.state.get(containerKey)?.containerName ??\n DockerContainerManager.containerName(containerKey)\n );\n }\n\n private mountArgs(mounts: ContainerMount[]): string[] {\n return mounts.flatMap((mount) => [\"-v\", this.toBindSpec(mount)]);\n }\n\n private toBindSpec(mount: ContainerMount): string {\n return `${mount.source}:${mount.target}${mount.readOnly ? \":ro\" : \"\"}`;\n }\n\n private async runContainer(\n containerKey: string,\n containerName: string,\n mounts: ContainerMount[],\n options: ProvisionOptions,\n ): Promise<void> {\n const networkName = await this.ensureNetwork(containerKey);\n const homeVolume = await this.ensureHomeVolume(containerKey);\n log.logInfo(`Creating container ${containerName} from image ${this.image}`);\n const labels = [\n \"--label\",\n DockerContainerManager.MANAGED_LABEL,\n \"--label\",\n DockerContainerManager.IMAGE_MODE_LABEL,\n \"--label\",\n `${DockerContainerManager.VAULT_ID_LABEL_KEY}=${containerKey}`,\n ];\n if (options.conversationId) {\n labels.push(\n \"--label\",\n `${DockerContainerManager.CONVERSATION_ID_LABEL_KEY}=${options.conversationId}`,\n );\n }\n if (mounts.length > 0) {\n labels.push(\n \"--label\",\n `${DockerContainerManager.MOUNT_SIGNATURE_LABEL_KEY}=${this.mountSignature(mounts)}`,\n );\n }\n await this.execFileImpl(\"docker\", [\n \"run\",\n \"-d\",\n \"--name\",\n containerName,\n \"--network\",\n networkName,\n \"--cap-drop\",\n \"ALL\",\n \"--security-opt\",\n \"no-new-privileges\",\n \"--pids-limit\",\n \"1024\",\n ...labels,\n ...this.resourceLimitArgs(this.effectiveLimits(containerKey)),\n \"-v\",\n `${homeVolume}:${GUEST_HOME}`,\n ...this.mountArgs(mounts),\n this.image,\n \"sleep\",\n \"infinity\",\n ]);\n }\n\n private effectiveLimits(containerKey: string): ResourceLimits | undefined {\n const override = this.overrideLimits.get(containerKey);\n if (override) return override;\n if (!this.boostedKeys.has(containerKey)) return this.limits;\n return { ...this.limits, ...this.boostLimits };\n }\n\n private resourceLimitArgs(limits: ResourceLimits | undefined): string[] {\n const args: string[] = [];\n if (limits?.cpus) args.push(\"--cpus\", limits.cpus);\n if (limits?.memory) {\n args.push(\"--memory\", limits.memory);\n args.push(\"--memory-swap\", limits.memory);\n }\n return args;\n }\n\n private async applyResourceLimits(containerKey: string, containerName: string): Promise<void> {\n const limitArgs = this.resourceLimitArgs(this.effectiveLimits(containerKey));\n if (limitArgs.length === 0) return;\n const args = [\"update\", ...limitArgs, containerName];\n try {\n await this.execFileImpl(\"docker\", args);\n } catch (err) {\n log.logWarning(\n `Failed to apply resource limits to container ${containerName}`,\n errorMessage(err),\n );\n reportUserFacingError(err, {\n domain: \"sandbox\",\n surface: \"sandbox_provision\",\n operation: \"apply_resource_limits\",\n severity: \"warning\",\n context: {\n sandboxType: \"image\",\n containerKey,\n containerName,\n limitArgCount: limitArgs.length,\n fatal: false,\n },\n });\n }\n }\n\n private async runtimeDrift(\n containerKey: string,\n containerName: string,\n mounts: ContainerMount[],\n current: { binds: readonly string[]; status: ContainerStatus; homeVolume: boolean },\n ): Promise<DriftReason | undefined> {\n const { binds, status, homeVolume } = current;\n if (this.hasBindMountDrift(binds, mounts)) return \"binds\";\n if (await this.hasMountSignatureDrift(containerName, mounts)) return \"mount-content\";\n if (await this.hasNetworkModeDrift(containerKey, containerName)) return \"network\";\n if (homeVolume && status === \"stopped\" && (await this.hasImageDrift(containerName))) {\n return \"image\";\n }\n return undefined;\n }\n\n private hasBindMountDrift(binds: readonly string[], mounts: ContainerMount[]): boolean {\n const expected = this.expectedBinds(mounts);\n const actual = binds.filter((bind) => !this.isHomeVolumeBind(bind));\n return !this.sameBinds(expected, actual);\n }\n\n private expectedBinds(mounts: ContainerMount[]): string[] {\n return mounts\n .map((mount) => this.toBindSpec(mount))\n .slice()\n .toSorted();\n }\n\n private sameBinds(expected: string[], actual: string[]): boolean {\n if (expected.length !== actual.length) {\n return false;\n }\n\n return expected.every((bind, index) => bind === actual[index]);\n }\n\n private async hasMountSignatureDrift(\n containerName: string,\n mounts: ContainerMount[],\n ): Promise<boolean> {\n if (mounts.length === 0) return false;\n const expected = this.mountSignature(mounts);\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"inspect\",\n \"-f\",\n `{{index .Config.Labels \"${DockerContainerManager.MOUNT_SIGNATURE_LABEL_KEY}\"}}`,\n containerName,\n ]);\n const actual = this.normalizeDockerValue(stdout.trim());\n return actual !== expected;\n }\n\n private mountSignature(mounts: ContainerMount[]): string {\n const payload = mounts\n .map((mount) => ({\n source: mount.source,\n target: mount.target,\n fingerprint: this.mountSourceFingerprint(mount.source),\n }))\n .toSorted((left, right) =>\n `${left.target}\\0${left.source}`.localeCompare(`${right.target}\\0${right.source}`),\n );\n return createHash(\"sha256\").update(JSON.stringify(payload)).digest(\"hex\");\n }\n\n private mountSourceFingerprint(source: string): string {\n try {\n const stat = statSync(source);\n if (stat.isFile()) {\n return createHash(\"sha256\").update(readFileSync(source)).digest(\"hex\");\n }\n return `${stat.isDirectory() ? \"dir\" : \"other\"}:${stat.dev}:${stat.ino}:${stat.birthtimeMs}`;\n } catch {\n return \"missing\";\n }\n }\n\n private async inspectBindMounts(containerName: string): Promise<string[]> {\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"inspect\",\n \"-f\",\n \"{{json .HostConfig.Binds}}\",\n containerName,\n ]);\n const payload = stdout.trim();\n const parsed = JSON.parse(payload.length > 0 ? payload : \"null\") as unknown;\n\n if (parsed === null) {\n return [];\n }\n\n if (!Array.isArray(parsed) || parsed.some((bind) => typeof bind !== \"string\")) {\n throw new Error(`Unexpected docker bind mount payload for container \"${containerName}\"`);\n }\n\n return [...parsed].toSorted();\n }\n\n private isHomeVolumeBind(bind: string): boolean {\n const separator = bind.indexOf(\":\");\n if (separator === -1) return false;\n const source = bind.slice(0, separator);\n const target = bind.slice(separator + 1).replace(/:r[ow]$/, \"\");\n return source.startsWith(DockerContainerManager.homeVolumeName(\"\")) && target === GUEST_HOME;\n }\n\n private hasHomeVolumeBind(containerKey: string, binds: readonly string[]): boolean {\n const expected = `${DockerContainerManager.homeVolumeName(containerKey)}:${GUEST_HOME}`;\n return binds.includes(expected);\n }\n\n private async hasHomeVolume(containerKey: string, containerName: string): Promise<boolean> {\n return this.hasHomeVolumeBind(containerKey, await this.inspectBindMounts(containerName));\n }\n\n private async hasImageDrift(containerName: string): Promise<boolean> {\n const desired = await this.localImageId();\n if (!desired) return false;\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"inspect\",\n \"-f\",\n \"{{.Image}}\",\n containerName,\n ]);\n return stdout.trim() !== desired;\n }\n\n private async localImageId(): Promise<string | undefined> {\n try {\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"image\",\n \"inspect\",\n \"-f\",\n \"{{.Id}}\",\n this.image,\n ]);\n return this.normalizeDockerValue(stdout.trim());\n } catch {\n return undefined;\n }\n }\n\n private async ensureHomeVolume(containerKey: string): Promise<string> {\n const volumeName = DockerContainerManager.homeVolumeName(containerKey);\n await this.execFileImpl(\"docker\", [\n \"volume\",\n \"create\",\n \"--label\",\n DockerContainerManager.MANAGED_LABEL,\n \"--label\",\n `${DockerContainerManager.VAULT_ID_LABEL_KEY}=${containerKey}`,\n volumeName,\n ]);\n return volumeName;\n }\n\n private async removeHomeVolume(containerKey: string): Promise<void> {\n const volumeName = DockerContainerManager.homeVolumeName(containerKey);\n try {\n await this.execFileImpl(\"docker\", [\"volume\", \"rm\", volumeName]);\n log.logInfo(`Home volume ${volumeName} removed`);\n } catch (err) {\n if (isDockerNotFoundError(err)) return;\n log.logWarning(`Failed to remove home volume ${volumeName}`, errorMessage(err));\n }\n }\n\n private async replaceHomeVolumeContainer(\n containerKey: string,\n containerName: string,\n mounts: ContainerMount[],\n options: ProvisionOptions,\n ): Promise<void> {\n const removed = await this.forceRemoveContainer(\n containerName,\n `Container ${containerName} removed for replacement`,\n `Failed to remove container ${containerName} for replacement`,\n );\n if (!removed) throw new Error(`Failed to remove container ${containerName} for replacement`);\n await this.runContainer(containerKey, containerName, mounts, options);\n }\n\n async inventory(): Promise<ManagedContainerInventoryEntry[]> {\n const names = await this.listContainerNamesByLabel();\n const entries: ManagedContainerInventoryEntry[] = [];\n for (const containerName of names) {\n const containerKey = this.containerKeyFromContainerName(containerName);\n const status = await this.inspectStatus(containerName);\n if (status === \"missing\") continue;\n const homeVolume = containerKey\n ? await this.hasHomeVolume(containerKey, containerName)\n : false;\n entries.push({\n containerName,\n containerKey,\n running: status === \"running\",\n homeVolume,\n imageStale: await this.hasImageDrift(containerName),\n });\n }\n return entries;\n }\n\n async systemChanges(containerName: string): Promise<string[]> {\n const { stdout } = await this.execFileImpl(\"docker\", [\"diff\", containerName]);\n return this.parseNameLines(stdout).filter((line) => {\n const path = line.slice(2);\n return !this.isUnderGuestPath(path, GUEST_HOME) && !this.isUnderGuestPath(path, \"/workspace\");\n });\n }\n\n private isUnderGuestPath(path: string, root: string): boolean {\n return path === root || path.startsWith(`${root}/`);\n }\n\n migrateToHomeVolume(containerKey: string): Promise<HomeVolumeMigrationOutcome> {\n return this.serialize(containerKey, () => this.migrateToHomeVolumeInner(containerKey));\n }\n\n private async migrateToHomeVolumeInner(\n containerKey: string,\n ): Promise<HomeVolumeMigrationOutcome> {\n const containerName = DockerContainerManager.containerName(containerKey);\n const status = await this.inspectStatus(containerName);\n if (status === \"missing\") return \"missing\";\n if (await this.hasHomeVolume(containerKey, containerName)) return \"already-migrated\";\n\n const details = await this.inspectContainerDetails(containerName);\n const mounts = (await this.inspectBindMounts(containerName))\n .filter((bind) => !this.isHomeVolumeBind(bind))\n .map(bindSpecToMount);\n const snapshotImage = `${DockerContainerManager.MIGRATE_IMAGE_PREFIX}:${containerName}`;\n log.logInfo(`Migrating container ${containerName} to a home volume`);\n await this.execFileImpl(\"docker\", [\"commit\", containerName, snapshotImage]);\n const homeVolume = await this.ensureHomeVolume(containerKey);\n await this.execFileImpl(\"docker\", [\n \"run\",\n \"--rm\",\n \"--network\",\n \"none\",\n \"-v\",\n `${homeVolume}:${GUEST_HOME}`,\n snapshotImage,\n \"true\",\n ]);\n const removed = await this.forceRemoveContainer(\n containerName,\n `Container ${containerName} removed for home-volume migration`,\n `Failed to remove container ${containerName} for home-volume migration`,\n );\n if (!removed) throw new Error(`Failed to remove container ${containerName}`);\n await this.runContainer(\n containerKey,\n containerName,\n mounts,\n details?.conversationId ? { conversationId: details.conversationId } : {},\n );\n if (status === \"stopped\") await this.execFileImpl(\"docker\", [\"stop\", containerName]);\n await this.removeMigrateSnapshot(containerName);\n this.setState(containerKey, status === \"stopped\" ? \"stopped\" : \"running\", containerName);\n log.logInfo(`Container ${containerName} migrated to home volume ${homeVolume}`);\n return \"migrated\";\n }\n\n private async hasNetworkModeDrift(containerKey: string, containerName: string): Promise<boolean> {\n const expected = DockerContainerManager.networkName(containerKey);\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"inspect\",\n \"-f\",\n \"{{.HostConfig.NetworkMode}}\",\n containerName,\n ]);\n return stdout.trim() !== expected;\n }\n\n private async ensureNetwork(containerKey: string): Promise<string> {\n const networkName = DockerContainerManager.networkName(containerKey);\n try {\n await this.execFileImpl(\"docker\", [\"network\", \"inspect\", networkName]);\n return networkName;\n } catch (err) {\n if (!isDockerNotFoundError(err)) throw err;\n }\n await this.execFileImpl(\"docker\", [\n \"network\",\n \"create\",\n \"--driver\",\n \"bridge\",\n \"--label\",\n DockerContainerManager.MANAGED_LABEL,\n \"--label\",\n DockerContainerManager.IMAGE_MODE_LABEL,\n \"--label\",\n `${DockerContainerManager.VAULT_ID_LABEL_KEY}=${containerKey}`,\n networkName,\n ]);\n return networkName;\n }\n\n private async inspectStatus(containerName: string): Promise<ContainerStatus> {\n try {\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"inspect\",\n \"-f\",\n \"{{.State.Running}}\",\n containerName,\n ]);\n return stdout.trim() === \"true\" ? \"running\" : \"stopped\";\n } catch (err) {\n if (isDockerNotFoundError(err)) return \"missing\";\n throw err;\n }\n }\n\n private async listContainerNamesByLabel(): Promise<string[]> {\n try {\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"ps\",\n \"-a\",\n \"--filter\",\n `label=${DockerContainerManager.MANAGED_LABEL}`,\n \"--filter\",\n `label=${DockerContainerManager.IMAGE_MODE_LABEL}`,\n \"--format\",\n \"{{.Names}}\",\n ]);\n return this.parseNameLines(stdout);\n } catch (err) {\n log.logWarning(\"Failed to list labeled managed containers\", errorMessage(err));\n return [];\n }\n }\n\n private async listContainerNamesByPrefix(): Promise<string[]> {\n try {\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"ps\",\n \"-a\",\n \"--filter\",\n `name=${DockerContainerManager.containerName(\"\")}`,\n \"--format\",\n \"{{.Names}}\",\n ]);\n return this.parseNameLines(stdout);\n } catch (err) {\n log.logWarning(\"Failed to list legacy managed containers\", errorMessage(err));\n return [];\n }\n }\n\n private parseNameLines(stdout: string): string[] {\n return stdout\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n }\n\n private async inspectContainerDetails(\n containerName: string,\n ): Promise<{ running: boolean; startedAtMs?: number; conversationId?: string } | undefined> {\n try {\n const { stdout } = await this.execFileImpl(\"docker\", [\n \"inspect\",\n \"-f\",\n `{{.State.Running}}\\t{{.State.StartedAt}}\\t{{index .Config.Labels \"${DockerContainerManager.VAULT_ID_LABEL_KEY}\"}}\\t{{index .Config.Labels \"${DockerContainerManager.CONVERSATION_ID_LABEL_KEY}\"}}`,\n containerName,\n ]);\n const [runningRaw, startedAtRaw, , conversationIdRaw] = stdout.trim().split(\"\\t\");\n const running = runningRaw === \"true\";\n const startedAtMs = this.parseDockerTimestamp(startedAtRaw);\n const conversationId = this.normalizeDockerValue(conversationIdRaw);\n return { running, startedAtMs, conversationId };\n } catch (err) {\n log.logWarning(\n `Failed to inspect container ${containerName} during reconcile`,\n errorMessage(err),\n );\n return undefined;\n }\n }\n\n private normalizeDockerValue(value?: string): string | undefined {\n if (!value || value === \"<no value>\") return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n\n private parseDockerTimestamp(value?: string): number | undefined {\n const normalized = this.normalizeDockerValue(value);\n if (!normalized || normalized.startsWith(\"0001-\")) return undefined;\n const parsed = Date.parse(normalized);\n return Number.isNaN(parsed) ? undefined : parsed;\n }\n\n private containerKeyFromContainerName(containerName: string): string | undefined {\n const prefix = DockerContainerManager.containerName(\"\");\n if (!containerName.startsWith(prefix)) return undefined;\n const containerKey = containerName.slice(prefix.length);\n return containerKey.length > 0 ? containerKey : undefined;\n }\n\n private async forceRemoveContainer(\n containerName: string,\n successLog: string,\n failureLog: string,\n ): Promise<boolean> {\n try {\n await this.execFileImpl(\"docker\", [\"rm\", \"-f\", containerName]);\n log.logInfo(successLog);\n return true;\n } catch (err) {\n const message = errorMessage(err);\n if (/no such container/i.test(message)) return true;\n log.logWarning(failureLog, message);\n return false;\n }\n }\n\n private async removeLegacyContainer(containerName: string): Promise<void> {\n await this.forceRemoveContainer(\n containerName,\n `Removed legacy mikan container ${containerName} (pre-channel-isolation scheme)`,\n `Failed to remove legacy mikan container ${containerName}`,\n );\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geminixiang/mikan",
3
- "version": "1.0.0-beta.79",
3
+ "version": "1.0.0-beta.80",
4
4
  "description": "Self-hosted AI coding agent for organizations: every Slack channel and DM gets its own sandboxed workspace, credentials, and memory.",
5
5
  "keywords": [
6
6
  "agent",