@geminixiang/mikan 1.0.0-beta.47 → 1.0.0-beta.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/adapters/discord/context.d.ts.map +1 -1
  3. package/dist/adapters/discord/context.js +2 -6
  4. package/dist/adapters/discord/context.js.map +1 -1
  5. package/dist/adapters/telegram/context.d.ts.map +1 -1
  6. package/dist/adapters/telegram/context.js +2 -4
  7. package/dist/adapters/telegram/context.js.map +1 -1
  8. package/dist/agent/presenter.d.ts +3 -10
  9. package/dist/agent/presenter.d.ts.map +1 -1
  10. package/dist/agent/presenter.js +35 -32
  11. package/dist/agent/presenter.js.map +1 -1
  12. package/dist/agent/runner.d.ts.map +1 -1
  13. package/dist/agent/runner.js +16 -22
  14. package/dist/agent/runner.js.map +1 -1
  15. package/dist/agent/types.d.ts +4 -6
  16. package/dist/agent/types.d.ts.map +1 -1
  17. package/dist/agent/types.js.map +1 -1
  18. package/dist/cli/boot.js +1 -1
  19. package/dist/cli/boot.js.map +1 -1
  20. package/dist/cli/sessions.d.ts.map +1 -1
  21. package/dist/cli/sessions.js +18 -13
  22. package/dist/cli/sessions.js.map +1 -1
  23. package/dist/config.d.ts.map +1 -1
  24. package/dist/config.js +4 -2
  25. package/dist/config.js.map +1 -1
  26. package/dist/env-manifest.js +2 -2
  27. package/dist/env-manifest.js.map +1 -1
  28. package/dist/harness/models.d.ts.map +1 -1
  29. package/dist/harness/models.js +1 -4
  30. package/dist/harness/models.js.map +1 -1
  31. package/dist/harness/runner.d.ts.map +1 -1
  32. package/dist/harness/runner.js +2 -2
  33. package/dist/harness/runner.js.map +1 -1
  34. package/dist/harness/session-store.d.ts +3 -45
  35. package/dist/harness/session-store.d.ts.map +1 -1
  36. package/dist/harness/session-store.js +293 -198
  37. package/dist/harness/session-store.js.map +1 -1
  38. package/dist/harness/subagent-runner.d.ts.map +1 -1
  39. package/dist/harness/subagent-runner.js +1 -8
  40. package/dist/harness/subagent-runner.js.map +1 -1
  41. package/dist/harness/types.d.ts +11 -11
  42. package/dist/harness/types.d.ts.map +1 -1
  43. package/dist/harness/types.js.map +1 -1
  44. package/dist/main.js +5 -0
  45. package/dist/main.js.map +1 -1
  46. package/dist/mcp/catalog.d.ts.map +1 -1
  47. package/dist/mcp/catalog.js +0 -88
  48. package/dist/mcp/catalog.js.map +1 -1
  49. package/dist/mcp/open-connector.d.ts +1 -1
  50. package/dist/mcp/open-connector.d.ts.map +1 -1
  51. package/dist/mcp/open-connector.js +23 -22
  52. package/dist/mcp/open-connector.js.map +1 -1
  53. package/dist/runtime/conversation-runtime.js +1 -0
  54. package/dist/runtime/conversation-runtime.js.map +1 -1
  55. package/dist/runtime/session-lifecycle.d.ts +0 -1
  56. package/dist/runtime/session-lifecycle.d.ts.map +1 -1
  57. package/dist/runtime/session-lifecycle.js +1 -4
  58. package/dist/runtime/session-lifecycle.js.map +1 -1
  59. package/dist/runtime/types.d.ts +3 -0
  60. package/dist/runtime/types.d.ts.map +1 -1
  61. package/dist/runtime/types.js.map +1 -1
  62. package/dist/sessions/migrate-pi-084.d.ts +8 -0
  63. package/dist/sessions/migrate-pi-084.d.ts.map +1 -0
  64. package/dist/sessions/migrate-pi-084.js +353 -0
  65. package/dist/sessions/migrate-pi-084.js.map +1 -0
  66. package/dist/sessions/migrate-v3.d.ts +0 -5
  67. package/dist/sessions/migrate-v3.d.ts.map +1 -1
  68. package/dist/sessions/migrate-v3.js +129 -51
  69. package/dist/sessions/migrate-v3.js.map +1 -1
  70. package/dist/sessions/types.d.ts +6 -1
  71. package/dist/sessions/types.d.ts.map +1 -1
  72. package/dist/sessions/types.js.map +1 -1
  73. package/dist/types.d.ts +5 -1
  74. package/dist/types.d.ts.map +1 -1
  75. package/dist/types.js.map +1 -1
  76. package/dist/web/session-view/portal.js +0 -16
  77. package/dist/web/session-view/portal.js.map +1 -1
  78. package/package.json +3 -3
@@ -17,7 +17,7 @@ import { createMikanTools } from "../tools/index.js";
17
17
  import { createConfiguredAgentSession, loadMikanSkills } from "./catalog.js";
18
18
  import { createRunnerExecutionContext, normalizeAttachRuntimePath, withStagedRuntimeFile, } from "./execution.js";
19
19
  import { buildPromptPayload, buildSystemPrompt, buildTurnInstructions, getMemory, resolveTriggerAttribution, } from "./prompt.js";
20
- import { attachSessionEventHandlers, createRunQueue, createRunState, finalizeRunResponse, formatAgentActorName, isEventTriggerAttribution, reportUsageSummary, resetRunState, sendAgentEvent, } from "./presenter.js";
20
+ import { attachSessionEventHandlers, activateRunPresentation, createRunState, finalizeRunResponse, formatAgentActorName, isEventTriggerAttribution, reportUsageSummary, sendAgentEvent, } from "./presenter.js";
21
21
  function buildThreadSessionName(message) {
22
22
  const text = message?.text?.trim();
23
23
  if (!text)
@@ -28,7 +28,7 @@ function buildThreadSessionName(message) {
28
28
  async function resolveRunnerMcpServers(options) {
29
29
  if (options.trustModel === "open-trigger")
30
30
  return {};
31
- return provisionOfficeOpenConnectorToken(options.office, options.platformWorkspaceId, options.servers, options.signal);
31
+ return provisionOfficeOpenConnectorToken(options.office, options.platformWorkspaceId, options.servers, options.openConnector, options.signal);
32
32
  }
33
33
  async function preparePromptContext(params) {
34
34
  const { message, platform, office, executor, resolveForRun, session } = params;
@@ -92,20 +92,11 @@ function bindRunCapabilities(params, pathContext) {
92
92
  });
93
93
  }
94
94
  async function prepareRunContext(params) {
95
- const { message, responder, platform, office, sessionUuid, runState, executor } = params;
95
+ const { message, platform, office, executor } = params;
96
96
  const sessionConversation = conversationIdOf(message.sessionKey);
97
97
  await mkdir(join(office.dir, "scratch"), { recursive: true });
98
98
  const { pathContext, memory, systemPrompt, triggerAttribution } = await preparePromptContext(params);
99
99
  bindRunCapabilities(params, pathContext);
100
- resetRunState(runState, {
101
- responder,
102
- sessionConversation,
103
- userName: message.userName,
104
- sessionUuid,
105
- triggerAttribution,
106
- });
107
- const runQueue = createRunQueue(responder, runState);
108
- runState.queue = runQueue.queue;
109
100
  log.logInfo(`Context sizes - system: ${systemPrompt.length} chars, memory: ${memory.length} chars`);
110
101
  log.logInfo(`Channels: ${platform.channels.length}, Users: ${platform.users.length}`);
111
102
  const { userMessage, imageAttachments } = await buildPromptPayload(message, pathContext.runtimeWorkspaceRoot, pathContext, (runtimePath) => executor.readFileBase64(runtimePath));
@@ -113,7 +104,6 @@ async function prepareRunContext(params) {
113
104
  const finalUserMessage = turnInstructions ? `${turnInstructions}\n\n${userMessage}` : userMessage;
114
105
  return {
115
106
  sessionConversation,
116
- runQueue,
117
107
  userMessage: finalUserMessage,
118
108
  imageAttachments,
119
109
  triggerAttribution,
@@ -194,7 +184,7 @@ async function createRunnerAgentSession(params) {
194
184
  }
195
185
  }
196
186
  async function runPreparedTurn(params) {
197
- const { prepared, message, responder, platform, runState, session, model, agentConfig, sessionUuid, conversationId, contextFile, sessionView, } = params;
187
+ const { prepared, presentation, message, responder, platform, runState, session, model, agentConfig, sessionUuid, conversationId, contextFile, sessionView, } = params;
198
188
  if (runState.logCtx) {
199
189
  log.logAgentRunStart(runState.logCtx, model.provider, model.id, model.name);
200
190
  }
@@ -222,7 +212,7 @@ async function runPreparedTurn(params) {
222
212
  ...(prepared.imageAttachments.length > 0 ? { images: prepared.imageAttachments } : {}),
223
213
  ...(isEventRun ? { budget: DEFAULT_EVENT_BUDGET } : {}),
224
214
  });
225
- await prepared.runQueue.wait();
215
+ await presentation.wait();
226
216
  const sessionViewTokenStore = sessionView?.tokenStore;
227
217
  const sessionViewPortalBaseUrl = sessionView?.portalBaseUrl;
228
218
  let sessionViewLink;
@@ -243,7 +233,6 @@ async function runPreparedTurn(params) {
243
233
  }
244
234
  : undefined;
245
235
  await finalizeRunResponse(responder, session, runState, {
246
- triggerAttribution: prepared.triggerAttribution,
247
236
  triggerSessionLink: isEventTriggerAttribution(prepared.triggerAttribution)
248
237
  ? createSessionViewLink?.()
249
238
  : undefined,
@@ -262,7 +251,7 @@ async function runPreparedTurn(params) {
262
251
  agentConfig,
263
252
  sessionConversation: prepared.sessionConversation,
264
253
  sessionUuid,
265
- waitForQueue: () => prepared.runQueue.wait(),
254
+ waitForQueue: presentation.wait,
266
255
  });
267
256
  return { stopReason: runState.stopReason, errorMessage: runState.errorMessage };
268
257
  }
@@ -283,8 +272,6 @@ function createRunnerInterface(params) {
283
272
  responder,
284
273
  platform,
285
274
  office,
286
- sessionUuid,
287
- runState,
288
275
  executor,
289
276
  resolveForRun,
290
277
  session,
@@ -295,9 +282,17 @@ function createRunnerInterface(params) {
295
282
  setReactFunction: toolBindings.setReactFunction,
296
283
  bindPlatformToolPacks: toolBindings.bindPlatformToolPacks,
297
284
  });
285
+ const presentation = activateRunPresentation(runState, {
286
+ responder,
287
+ sessionConversation: prepared.sessionConversation,
288
+ userName: message.userName,
289
+ sessionUuid,
290
+ triggerAttribution: prepared.triggerAttribution,
291
+ });
298
292
  try {
299
293
  return await runPreparedTurn({
300
294
  prepared,
295
+ presentation,
301
296
  message,
302
297
  responder,
303
298
  platform,
@@ -312,9 +307,7 @@ function createRunnerInterface(params) {
312
307
  });
313
308
  }
314
309
  finally {
315
- runState.responder = null;
316
- runState.logCtx = null;
317
- runState.queue = null;
310
+ presentation.dispose();
318
311
  }
319
312
  },
320
313
  abort() {
@@ -402,6 +395,7 @@ export async function createRunner(options) {
402
395
  trustModel,
403
396
  platformWorkspaceId: options.platformWorkspaceId,
404
397
  servers: resolvedAgentConfig.mcpServers,
398
+ openConnector: options.openConnector,
405
399
  signal: options.signal,
406
400
  });
407
401
  options.signal?.throwIfAborted();
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/agent/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CreateRunnerOptions, OfficeAddress, PiAgentWrapper } from \"../types.js\";\nimport type { Office } from \"../office/index.js\";\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport type { MikanAgentSession } from \"../harness/index.js\";\nimport { DEFAULT_EVENT_BUDGET, MikanModels } from \"../harness/index.js\";\nimport { createHash } from \"node:crypto\";\nimport { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n ConversationKind,\n ConversationMessage,\n ConversationResponder,\n MessagingInfo,\n PlatformName,\n} from \"../adapter.js\";\nimport { resolveConversationSettings } from \"../config.js\";\nimport { resolveConversationPackages } from \"../packages/index.js\";\nimport { resolveWorkspaceProjection } from \"../workspace-projection/index.js\";\nimport * as log from \"../log.js\";\nimport { formatMcpServerInstructions, loadMcpTools } from \"../mcp/loader.js\";\nimport { provisionOfficeOpenConnectorToken } from \"../mcp/open-connector.js\";\nimport {\n assertSandboxSupportsWorkspacePolicy,\n getUnresolvedSandboxPathContext,\n type Executor,\n type RuntimePathContext,\n} from \"../sandbox/index.js\";\nimport { addLifecycleBreadcrumb, updateActiveSpanAttribution } from \"../observability/sentry.js\";\nimport { ChatHistorySync } from \"../sessions/chat-history-sync.js\";\nimport { conversationIdOf, isThreadSessionKey } from \"../sessions/session-key.js\";\nimport {\n extractSessionUuid,\n openManagedSession,\n type ThreadRootMessage,\n} from \"../sessions/store.js\";\nimport { createMikanTools } from \"../tools/index.js\";\nimport type { PlatformToolRunContext } from \"../tools/types.js\";\nimport { createConfiguredAgentSession, loadMikanSkills } from \"./catalog.js\";\nimport {\n createRunnerExecutionContext,\n normalizeAttachRuntimePath,\n withStagedRuntimeFile,\n} from \"./execution.js\";\nimport {\n buildPromptPayload,\n buildSystemPrompt,\n buildTurnInstructions,\n getMemory,\n resolveTriggerAttribution,\n} from \"./prompt.js\";\nimport {\n attachSessionEventHandlers,\n createRunQueue,\n createRunState,\n finalizeRunResponse,\n formatAgentActorName,\n isEventTriggerAttribution,\n reportUsageSummary,\n resetRunState,\n sendAgentEvent,\n} from \"./presenter.js\";\n\nimport type { PreparedRunContext, RunnerExecutionContext, RunnerSessionState } from \"./types.js\";\n\nfunction buildThreadSessionName(message: ThreadRootMessage | null): string | undefined {\n const text = message?.text?.trim();\n if (!text) return undefined;\n const userLabel = message?.userName || message?.user || \"unknown\";\n return `[${userLabel}]: ${text}`;\n}\n\nasync function resolveRunnerMcpServers(options: {\n office: Office;\n trustModel: CreateRunnerOptions[\"trustModel\"];\n platformWorkspaceId?: string;\n servers: ReturnType<typeof resolveConversationSettings>[\"mcpServers\"];\n signal?: AbortSignal;\n}): Promise<Awaited<ReturnType<typeof provisionOfficeOpenConnectorToken>>> {\n if (options.trustModel === \"open-trigger\") return {};\n return provisionOfficeOpenConnectorToken(\n options.office,\n options.platformWorkspaceId,\n options.servers,\n options.signal,\n );\n}\n\ntype PrepareRunParams = {\n message: ConversationMessage;\n responder: ConversationResponder;\n platform: MessagingInfo;\n office: Office;\n sessionUuid: string;\n runState: RunnerSessionState;\n executor: Executor;\n resolveForRun: RunnerExecutionContext[\"resolveForRun\"];\n session: MikanAgentSession;\n setEventContext: (context: {\n platform: string;\n conversationId: string;\n conversationKind: ConversationKind;\n userId: string;\n }) => void;\n setSandboxContext: (context: { address: OfficeAddress; userId: string }) => void;\n setUploadFunction: (fn: (filePath: string, title?: string) => Promise<void>) => void;\n setImageUploadFunction: (fn: (hostPath: string, title?: string) => Promise<void>) => void;\n setReactFunction: (fn: ((emoji: string) => Promise<void>) | null) => void;\n bindPlatformToolPacks: (ctx: PlatformToolRunContext) => void;\n};\n\ntype RunPromptContext = {\n pathContext: RuntimePathContext;\n memory: string;\n systemPrompt: string;\n triggerAttribution: string | undefined;\n};\n\nasync function preparePromptContext(params: PrepareRunParams): Promise<RunPromptContext> {\n const { message, platform, office, executor, resolveForRun, session } = params;\n const conversationId = office.address.conversationId;\n const decision = await resolveForRun({\n address: message.address,\n userId: message.userId,\n trustModel: platform.trustModel,\n });\n const { pathContext, projection, packages } = decision;\n for (const error of packages.errors) {\n log.logWarning(`Package unavailable: ${error.source}`, error.message);\n }\n\n const reloaded = await session.reloadFromSession();\n if (reloaded > 0) {\n log.logInfo(`[${conversationId}] Reloaded ${reloaded} messages from context`);\n }\n\n const memory = await getMemory(projection);\n const conversationSkillLoad = loadMikanSkills(\n office,\n pathContext.runtimeWorkspaceRoot,\n projection,\n packages,\n );\n const triggerAttribution = resolveTriggerAttribution(message);\n const systemPrompt = buildSystemPrompt({\n workspacePath: pathContext.runtimeWorkspaceRoot,\n office,\n memory,\n sandboxConfig: executor.getSandboxConfig(),\n platform,\n skills: conversationSkillLoad.skills,\n projection,\n skippedSkillLinks: conversationSkillLoad.skippedSkillLinks,\n });\n session.agent.state.systemPrompt = systemPrompt;\n // A stable hash across turns verifies that turn-specific data did not leak\n // into the provider-cacheable system prompt.\n const promptHash = createHash(\"sha256\").update(systemPrompt).digest(\"hex\").slice(0, 8);\n log.logInfo(\n `[${conversationId}] System prompt (base): ${systemPrompt.length} chars, sha ${promptHash}`,\n );\n return { pathContext, memory, systemPrompt, triggerAttribution };\n}\n\nfunction bindRunCapabilities(params: PrepareRunParams, pathContext: RuntimePathContext): void {\n const {\n message,\n responder,\n platform,\n office,\n executor,\n setEventContext,\n setSandboxContext,\n setUploadFunction,\n setImageUploadFunction,\n setReactFunction,\n bindPlatformToolPacks,\n } = params;\n setEventContext({\n platform: platform.name,\n conversationId: office.address.conversationId,\n conversationKind: message.conversationKind,\n userId: message.userId,\n });\n setSandboxContext({ address: message.address, userId: message.userId });\n setUploadFunction(async (filePath: string, title?: string) => {\n const runtimePath = normalizeAttachRuntimePath(filePath, pathContext.runtimeWorkspaceRoot);\n await withStagedRuntimeFile(executor, runtimePath, (stagedPath) =>\n responder.uploadFile(stagedPath, title),\n );\n });\n // Generated images already live host-side and must not be staged through a sandbox.\n setImageUploadFunction(async (hostPath: string, title?: string) => {\n await responder.uploadFile(hostPath, title);\n });\n // Unset reaction support when the active responder cannot react.\n setReactFunction(responder.react ? async (emoji: string) => responder.react!(emoji) : null);\n bindPlatformToolPacks({\n conversationId: office.address.conversationId,\n platformName: platform.name,\n threadTs: message.threadTs,\n });\n}\n\nasync function prepareRunContext(params: PrepareRunParams): Promise<PreparedRunContext> {\n const { message, responder, platform, office, sessionUuid, runState, executor } = params;\n const sessionConversation = conversationIdOf(message.sessionKey);\n await mkdir(join(office.dir, \"scratch\"), { recursive: true });\n const { pathContext, memory, systemPrompt, triggerAttribution } =\n await preparePromptContext(params);\n bindRunCapabilities(params, pathContext);\n\n resetRunState(runState, {\n responder,\n sessionConversation,\n userName: message.userName,\n sessionUuid,\n triggerAttribution,\n });\n const runQueue = createRunQueue(responder, runState);\n runState.queue = runQueue.queue;\n\n log.logInfo(\n `Context sizes - system: ${systemPrompt.length} chars, memory: ${memory.length} chars`,\n );\n log.logInfo(`Channels: ${platform.channels.length}, Users: ${platform.users.length}`);\n\n const { userMessage, imageAttachments } = await buildPromptPayload(\n message,\n pathContext.runtimeWorkspaceRoot,\n pathContext,\n (runtimePath) => executor.readFileBase64(runtimePath),\n );\n const turnInstructions = buildTurnInstructions(\n message.id.startsWith(\"event:\"),\n triggerAttribution,\n platform.name,\n );\n const finalUserMessage = turnInstructions ? `${turnInstructions}\\n\\n${userMessage}` : userMessage;\n return {\n sessionConversation,\n runQueue,\n userMessage: finalUserMessage,\n imageAttachments,\n triggerAttribution,\n };\n}\n\nasync function buildInitialSystemPrompt(params: {\n office: Office;\n pathContext: RuntimePathContext;\n projection: ReturnType<typeof resolveWorkspaceProjection>;\n sandboxConfig: CreateRunnerOptions[\"sandboxConfig\"];\n}): Promise<string> {\n const { office, pathContext, projection, sandboxConfig } = params;\n const memory = await getMemory(projection);\n const { skills, skippedSkillLinks } = loadMikanSkills(\n office,\n pathContext.runtimeWorkspaceRoot,\n projection,\n resolveConversationPackages({ office }),\n );\n return buildSystemPrompt({\n workspacePath: pathContext.runtimeWorkspaceRoot,\n office,\n memory,\n sandboxConfig,\n platform: {\n name: \"chat\",\n formattingGuide: \"\",\n channels: [],\n users: [],\n trustModel: \"membership\",\n },\n skills,\n projection,\n skippedSkillLinks,\n });\n}\n\nasync function rollbackRunnerResource(label: string, cleanup: () => Promise<void>): Promise<void> {\n try {\n await cleanup();\n } catch (error) {\n log.logWarning(`Runner rollback failed to ${label}`, String(error));\n }\n}\n\nasync function openRunnerSessionManager(params: {\n contextFile: string;\n runtimeWorkspaceRoot: string;\n sessionKey: string;\n threadRootMessage: ThreadRootMessage | null;\n}) {\n const { contextFile, runtimeWorkspaceRoot, sessionKey, threadRootMessage } = params;\n const sessionManager = await openManagedSession(contextFile, runtimeWorkspaceRoot);\n try {\n const threadSessionName = buildThreadSessionName(threadRootMessage);\n if (\n isThreadSessionKey(sessionKey) &&\n threadSessionName &&\n (await sessionManager.getSessionName()) !== threadSessionName\n ) {\n await sessionManager.setSessionName(threadSessionName);\n }\n return sessionManager;\n } catch (error) {\n await rollbackRunnerResource(\"close the session writer\", () => sessionManager.close());\n throw error;\n }\n}\n\nasync function createRunnerAgentSession(params: {\n workspaceDir: string;\n systemPrompt: string;\n model: Model<Api>;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n tools: ReturnType<typeof createMikanTools>[\"tools\"];\n sessionManager: Awaited<ReturnType<typeof openManagedSession>>;\n modelRegistry: MikanModels;\n conversationId: string;\n signal?: AbortSignal;\n}) {\n const {\n workspaceDir,\n systemPrompt,\n model,\n agentConfig,\n tools,\n sessionManager,\n modelRegistry,\n signal,\n } = params;\n const mcpResult = await loadMcpTools(agentConfig.mcpServers ?? {}, signal);\n for (const mcpError of mcpResult.errors) {\n log.logWarning(\n `[${params.conversationId}] MCP server unavailable: ${mcpError.server}`,\n mcpError.error,\n );\n }\n if (mcpResult.tools.length > 0) {\n log.logInfo(`[${params.conversationId}] Loaded ${mcpResult.tools.length} MCP tool(s)`);\n }\n try {\n signal?.throwIfAborted();\n const mcpInstructions = formatMcpServerInstructions(mcpResult.instructions);\n const session = await createConfiguredAgentSession({\n workspaceDir,\n systemPrompt: mcpInstructions ? `${systemPrompt}\\n\\n${mcpInstructions}` : systemPrompt,\n model,\n thinkingLevel: agentConfig.thinkingLevel,\n tools: [...tools, ...mcpResult.tools],\n sessionStore: sessionManager,\n models: modelRegistry,\n });\n return { mcpResult, session };\n } catch (error) {\n await rollbackRunnerResource(\"dispose MCP resources\", mcpResult.dispose);\n throw error;\n }\n}\n\ntype PreparedTurnParams = {\n prepared: PreparedRunContext;\n message: ConversationMessage;\n responder: ConversationResponder;\n platform: MessagingInfo;\n runState: RunnerSessionState;\n session: MikanAgentSession;\n model: Model<Api>;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n sessionUuid: string;\n conversationId: string;\n contextFile: string;\n sessionView: CreateRunnerOptions[\"sessionView\"];\n};\n\nasync function runPreparedTurn(params: PreparedTurnParams): Promise<{\n stopReason: string;\n errorMessage?: string;\n}> {\n const {\n prepared,\n message,\n responder,\n platform,\n runState,\n session,\n model,\n agentConfig,\n sessionUuid,\n conversationId,\n contextFile,\n sessionView,\n } = params;\n if (runState.logCtx) {\n log.logAgentRunStart(runState.logCtx, model.provider, model.id, model.name);\n }\n\n updateActiveSpanAttribution({\n provider: model.provider,\n model: agentConfig.model,\n channel_id: prepared.sessionConversation,\n session_id: sessionUuid,\n });\n addLifecycleBreadcrumb(\"agent.prompt.sent\", {\n provider: model.provider,\n model: agentConfig.model,\n channel_id: prepared.sessionConversation,\n session_id: sessionUuid,\n attachment_count: message.attachments?.length ?? 0,\n image_attachment_count: prepared.imageAttachments.length,\n });\n sendAgentEvent({\n sessionId: sessionUuid,\n actorName: formatAgentActorName(message.userName, prepared.sessionConversation),\n event: { kind: \"sessionStart\" },\n });\n\n const isEventRun = message.id.startsWith(\"event:\");\n await session.prompt(prepared.userMessage, {\n ...(prepared.imageAttachments.length > 0 ? { images: prepared.imageAttachments } : {}),\n ...(isEventRun ? { budget: DEFAULT_EVENT_BUDGET } : {}),\n });\n await prepared.runQueue.wait();\n\n const sessionViewTokenStore = sessionView?.tokenStore;\n const sessionViewPortalBaseUrl = sessionView?.portalBaseUrl;\n let sessionViewLink: string | undefined;\n const createSessionViewLink =\n sessionViewTokenStore && sessionViewPortalBaseUrl\n ? () => {\n if (!sessionViewLink) {\n const token = sessionViewTokenStore.create({\n platform: platform.name as PlatformName,\n platformUserId: message.userId,\n conversationId,\n sessionKey: message.sessionKey,\n sessionFile: contextFile,\n platformUserName: message.userName,\n });\n sessionViewLink = `${sessionViewPortalBaseUrl}/session?token=${token.token}`;\n }\n return sessionViewLink;\n }\n : undefined;\n\n await finalizeRunResponse(responder, session, runState, {\n triggerAttribution: prepared.triggerAttribution,\n triggerSessionLink: isEventTriggerAttribution(prepared.triggerAttribution)\n ? createSessionViewLink?.()\n : undefined,\n createOverflowLink: createSessionViewLink,\n platform: platform.name,\n model,\n sessionConversation: prepared.sessionConversation,\n sessionUuid,\n });\n await reportUsageSummary({\n session,\n runState,\n responder,\n platform,\n model,\n agentConfig,\n sessionConversation: prepared.sessionConversation,\n sessionUuid,\n waitForQueue: () => prepared.runQueue.wait(),\n });\n return { stopReason: runState.stopReason, errorMessage: runState.errorMessage };\n}\n\ntype MikanToolBindings = ReturnType<typeof createMikanTools>;\n\ntype RunnerInterfaceParams = {\n conversationId: string;\n conversationDir: string;\n sessionKey: string;\n office: Office;\n sessionUuid: string;\n contextFile: string;\n sessionView: CreateRunnerOptions[\"sessionView\"];\n runState: RunnerSessionState;\n executor: Executor;\n resolveForRun: RunnerExecutionContext[\"resolveForRun\"];\n session: MikanAgentSession;\n model: Model<Api>;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n sessionManager: Awaited<ReturnType<typeof openManagedSession>>;\n chatSessionManager: ChatHistorySync;\n mcpResult: Awaited<ReturnType<typeof loadMcpTools>>;\n toolBindings: MikanToolBindings;\n};\n\nfunction createRunnerInterface(params: RunnerInterfaceParams): PiAgentWrapper {\n const {\n conversationId,\n conversationDir,\n sessionKey,\n office,\n sessionUuid,\n contextFile,\n sessionView,\n runState,\n executor,\n resolveForRun,\n session,\n model,\n agentConfig,\n sessionManager,\n chatSessionManager,\n mcpResult,\n toolBindings,\n } = params;\n return {\n async syncChatHistory(currentMessageId?: string): Promise<void> {\n await chatSessionManager.syncSessionManager({\n conversationDir,\n sessionKey,\n sessionManager,\n currentMessageId,\n });\n },\n\n async run(message, responder, platform) {\n const prepared = await prepareRunContext({\n message,\n responder,\n platform,\n office,\n sessionUuid,\n runState,\n executor,\n resolveForRun,\n session,\n setEventContext: toolBindings.setEventContext,\n setSandboxContext: toolBindings.setSandboxContext,\n setUploadFunction: toolBindings.setUploadFunction,\n setImageUploadFunction: toolBindings.setImageUploadFunction,\n setReactFunction: toolBindings.setReactFunction,\n bindPlatformToolPacks: toolBindings.bindPlatformToolPacks,\n });\n try {\n return await runPreparedTurn({\n prepared,\n message,\n responder,\n platform,\n runState,\n session,\n model,\n agentConfig,\n sessionUuid,\n conversationId,\n contextFile,\n sessionView,\n });\n } finally {\n runState.responder = null;\n runState.logCtx = null;\n runState.queue = null;\n }\n },\n\n abort(): void {\n session.abort();\n },\n\n async dispose(): Promise<void> {\n try {\n await mcpResult.dispose();\n } finally {\n await sessionManager.close();\n }\n },\n\n getCurrentStep(): { toolName?: string; label?: string } | undefined {\n const first = runState.pendingTools.values().next().value;\n if (!first) return undefined;\n return {\n toolName: first.toolName,\n label: (first.args as { label?: string })?.label,\n };\n },\n };\n}\n\nasync function finishRunnerCreation(params: {\n options: CreateRunnerOptions;\n conversationId: string;\n conversationDir: string;\n workspaceDir: string;\n executor: Executor;\n resolveForRun: RunnerExecutionContext[\"resolveForRun\"];\n model: Model<Api>;\n modelRegistry: MikanModels;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n systemPrompt: string;\n sessionManager: Awaited<ReturnType<typeof openManagedSession>>;\n toolBindings: MikanToolBindings;\n}): Promise<PiAgentWrapper> {\n const {\n options,\n conversationId,\n conversationDir,\n workspaceDir,\n executor,\n resolveForRun,\n model,\n modelRegistry,\n agentConfig,\n systemPrompt,\n sessionManager,\n toolBindings,\n } = params;\n const { sessionKey, office, sessionScope, sessionView } = options;\n const { contextFile } = sessionScope;\n let acquiredMcpResult: Awaited<ReturnType<typeof loadMcpTools>> | undefined;\n try {\n const sessionUuid = extractSessionUuid(contextFile);\n const chatSessionManager = new ChatHistorySync();\n const { mcpResult, session } = await createRunnerAgentSession({\n workspaceDir,\n systemPrompt,\n model,\n agentConfig,\n tools: toolBindings.tools,\n sessionManager,\n modelRegistry,\n conversationId,\n signal: options.signal,\n });\n acquiredMcpResult = mcpResult;\n options.signal?.throwIfAborted();\n\n const runState = createRunState();\n attachSessionEventHandlers({ session, runState, model, agentConfig });\n\n return createRunnerInterface({\n conversationId,\n conversationDir,\n sessionKey,\n office,\n sessionUuid,\n contextFile,\n sessionView,\n runState,\n executor,\n resolveForRun,\n session,\n model,\n agentConfig,\n sessionManager,\n chatSessionManager,\n mcpResult,\n toolBindings,\n });\n } catch (error) {\n if (acquiredMcpResult) {\n await rollbackRunnerResource(\"dispose MCP resources\", acquiredMcpResult.dispose);\n }\n await rollbackRunnerResource(\"close the session writer\", () => sessionManager.close());\n throw error;\n }\n}\n\nexport async function createRunner(options: CreateRunnerOptions): Promise<PiAgentWrapper> {\n options.signal?.throwIfAborted();\n const {\n sandboxConfig,\n sessionKey,\n office,\n trustModel,\n sessionScope,\n vaultManager,\n provisioner,\n resourceController,\n platformToolPackFactories,\n } = options;\n const conversationId = office.address.conversationId;\n const conversationDir = office.dir;\n const workspaceDir = office.workspace.root;\n const resolvedAgentConfig = resolveConversationSettings(office);\n const mcpServers = await resolveRunnerMcpServers({\n office,\n trustModel,\n platformWorkspaceId: options.platformWorkspaceId,\n servers: resolvedAgentConfig.mcpServers,\n signal: options.signal,\n });\n options.signal?.throwIfAborted();\n const agentConfig = { ...resolvedAgentConfig, mcpServers };\n\n const projection = resolveWorkspaceProjection(office);\n // Bootstrap validation fails runner creation early. resolveForRun repeats\n // the check against the actor-specific decision before any provider call.\n assertSandboxSupportsWorkspacePolicy(\n sandboxConfig,\n projection.doorPolicy,\n projection.promptSources.globalMemoryReadOnly === true,\n );\n const { executor, resolveForRun } = createRunnerExecutionContext(\n sandboxConfig,\n vaultManager,\n provisioner,\n office.workspace,\n );\n const pathContext = getUnresolvedSandboxPathContext(sandboxConfig, workspaceDir);\n\n const modelRegistry = options.models ?? MikanModels.create();\n if (modelRegistry.getError()) {\n log.logWarning(\"models.json load error\", modelRegistry.getError()!);\n }\n const model = modelRegistry.resolve(agentConfig.provider, agentConfig.model);\n\n // Create tools (per-runner, with per-runner upload function setter)\n const toolBindings = createMikanTools(\n executor,\n workspaceDir,\n { sandbox: sandboxConfig, resourceController: resourceController ?? provisioner },\n platformToolPackFactories ?? [],\n {\n model,\n getApiKey: () => modelRegistry.getApiKeyForProvider(model.provider),\n // The conversation's own office dir: mounted into the sandbox, unlike\n // the workspace base — generated images must land somewhere the agent\n // (and a future run) can still reach.\n outputDir: conversationDir,\n },\n );\n\n const systemPrompt = await buildInitialSystemPrompt({\n office,\n pathContext,\n projection,\n sandboxConfig,\n });\n options.signal?.throwIfAborted();\n const { contextFile, threadRootMessage } = sessionScope;\n const sessionManager = await openRunnerSessionManager({\n contextFile,\n runtimeWorkspaceRoot: pathContext.runtimeWorkspaceRoot,\n sessionKey,\n threadRootMessage,\n });\n return finishRunnerCreation({\n options,\n conversationId,\n conversationDir,\n workspaceDir,\n executor,\n resolveForRun,\n model,\n modelRegistry,\n agentConfig,\n systemPrompt,\n sessionManager,\n toolBindings,\n });\n}\n"]}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/agent/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CreateRunnerOptions, OfficeAddress, PiAgentWrapper } from \"../types.js\";\nimport type { Office } from \"../office/index.js\";\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport type { MikanAgentSession } from \"../harness/index.js\";\nimport { DEFAULT_EVENT_BUDGET, MikanModels } from \"../harness/index.js\";\nimport { createHash } from \"node:crypto\";\nimport { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n ConversationKind,\n ConversationMessage,\n ConversationResponder,\n MessagingInfo,\n PlatformName,\n} from \"../adapter.js\";\nimport { resolveConversationSettings } from \"../config.js\";\nimport { resolveConversationPackages } from \"../packages/index.js\";\nimport { resolveWorkspaceProjection } from \"../workspace-projection/index.js\";\nimport * as log from \"../log.js\";\nimport { formatMcpServerInstructions, loadMcpTools } from \"../mcp/loader.js\";\nimport { provisionOfficeOpenConnectorToken } from \"../mcp/open-connector.js\";\nimport {\n assertSandboxSupportsWorkspacePolicy,\n getUnresolvedSandboxPathContext,\n type Executor,\n type RuntimePathContext,\n} from \"../sandbox/index.js\";\nimport { addLifecycleBreadcrumb, updateActiveSpanAttribution } from \"../observability/sentry.js\";\nimport { ChatHistorySync } from \"../sessions/chat-history-sync.js\";\nimport { conversationIdOf, isThreadSessionKey } from \"../sessions/session-key.js\";\nimport {\n extractSessionUuid,\n openManagedSession,\n type ThreadRootMessage,\n} from \"../sessions/store.js\";\nimport { createMikanTools } from \"../tools/index.js\";\nimport type { PlatformToolRunContext } from \"../tools/types.js\";\nimport { createConfiguredAgentSession, loadMikanSkills } from \"./catalog.js\";\nimport {\n createRunnerExecutionContext,\n normalizeAttachRuntimePath,\n withStagedRuntimeFile,\n} from \"./execution.js\";\nimport {\n buildPromptPayload,\n buildSystemPrompt,\n buildTurnInstructions,\n getMemory,\n resolveTriggerAttribution,\n} from \"./prompt.js\";\nimport {\n attachSessionEventHandlers,\n activateRunPresentation,\n createRunState,\n finalizeRunResponse,\n formatAgentActorName,\n isEventTriggerAttribution,\n reportUsageSummary,\n sendAgentEvent,\n} from \"./presenter.js\";\n\nimport type {\n PreparedRunContext,\n RunPresentation,\n RunnerExecutionContext,\n RunnerSessionState,\n} from \"./types.js\";\n\nfunction buildThreadSessionName(message: ThreadRootMessage | null): string | undefined {\n const text = message?.text?.trim();\n if (!text) return undefined;\n const userLabel = message?.userName || message?.user || \"unknown\";\n return `[${userLabel}]: ${text}`;\n}\n\nasync function resolveRunnerMcpServers(options: {\n office: Office;\n trustModel: CreateRunnerOptions[\"trustModel\"];\n platformWorkspaceId?: string;\n servers: ReturnType<typeof resolveConversationSettings>[\"mcpServers\"];\n openConnector?: CreateRunnerOptions[\"openConnector\"];\n signal?: AbortSignal;\n}): Promise<Awaited<ReturnType<typeof provisionOfficeOpenConnectorToken>>> {\n if (options.trustModel === \"open-trigger\") return {};\n return provisionOfficeOpenConnectorToken(\n options.office,\n options.platformWorkspaceId,\n options.servers,\n options.openConnector,\n options.signal,\n );\n}\n\ntype PrepareRunParams = {\n message: ConversationMessage;\n responder: ConversationResponder;\n platform: MessagingInfo;\n office: Office;\n executor: Executor;\n resolveForRun: RunnerExecutionContext[\"resolveForRun\"];\n session: MikanAgentSession;\n setEventContext: (context: {\n platform: string;\n conversationId: string;\n conversationKind: ConversationKind;\n userId: string;\n }) => void;\n setSandboxContext: (context: { address: OfficeAddress; userId: string }) => void;\n setUploadFunction: (fn: (filePath: string, title?: string) => Promise<void>) => void;\n setImageUploadFunction: (fn: (hostPath: string, title?: string) => Promise<void>) => void;\n setReactFunction: (fn: ((emoji: string) => Promise<void>) | null) => void;\n bindPlatformToolPacks: (ctx: PlatformToolRunContext) => void;\n};\n\ntype RunPromptContext = {\n pathContext: RuntimePathContext;\n memory: string;\n systemPrompt: string;\n triggerAttribution: string | undefined;\n};\n\nasync function preparePromptContext(params: PrepareRunParams): Promise<RunPromptContext> {\n const { message, platform, office, executor, resolveForRun, session } = params;\n const conversationId = office.address.conversationId;\n const decision = await resolveForRun({\n address: message.address,\n userId: message.userId,\n trustModel: platform.trustModel,\n });\n const { pathContext, projection, packages } = decision;\n for (const error of packages.errors) {\n log.logWarning(`Package unavailable: ${error.source}`, error.message);\n }\n\n const reloaded = await session.reloadFromSession();\n if (reloaded > 0) {\n log.logInfo(`[${conversationId}] Reloaded ${reloaded} messages from context`);\n }\n\n const memory = await getMemory(projection);\n const conversationSkillLoad = loadMikanSkills(\n office,\n pathContext.runtimeWorkspaceRoot,\n projection,\n packages,\n );\n const triggerAttribution = resolveTriggerAttribution(message);\n const systemPrompt = buildSystemPrompt({\n workspacePath: pathContext.runtimeWorkspaceRoot,\n office,\n memory,\n sandboxConfig: executor.getSandboxConfig(),\n platform,\n skills: conversationSkillLoad.skills,\n projection,\n skippedSkillLinks: conversationSkillLoad.skippedSkillLinks,\n });\n session.agent.state.systemPrompt = systemPrompt;\n // A stable hash across turns verifies that turn-specific data did not leak\n // into the provider-cacheable system prompt.\n const promptHash = createHash(\"sha256\").update(systemPrompt).digest(\"hex\").slice(0, 8);\n log.logInfo(\n `[${conversationId}] System prompt (base): ${systemPrompt.length} chars, sha ${promptHash}`,\n );\n return { pathContext, memory, systemPrompt, triggerAttribution };\n}\n\nfunction bindRunCapabilities(params: PrepareRunParams, pathContext: RuntimePathContext): void {\n const {\n message,\n responder,\n platform,\n office,\n executor,\n setEventContext,\n setSandboxContext,\n setUploadFunction,\n setImageUploadFunction,\n setReactFunction,\n bindPlatformToolPacks,\n } = params;\n setEventContext({\n platform: platform.name,\n conversationId: office.address.conversationId,\n conversationKind: message.conversationKind,\n userId: message.userId,\n });\n setSandboxContext({ address: message.address, userId: message.userId });\n setUploadFunction(async (filePath: string, title?: string) => {\n const runtimePath = normalizeAttachRuntimePath(filePath, pathContext.runtimeWorkspaceRoot);\n await withStagedRuntimeFile(executor, runtimePath, (stagedPath) =>\n responder.uploadFile(stagedPath, title),\n );\n });\n // Generated images already live host-side and must not be staged through a sandbox.\n setImageUploadFunction(async (hostPath: string, title?: string) => {\n await responder.uploadFile(hostPath, title);\n });\n // Unset reaction support when the active responder cannot react.\n setReactFunction(responder.react ? async (emoji: string) => responder.react!(emoji) : null);\n bindPlatformToolPacks({\n conversationId: office.address.conversationId,\n platformName: platform.name,\n threadTs: message.threadTs,\n });\n}\n\nasync function prepareRunContext(params: PrepareRunParams): Promise<PreparedRunContext> {\n const { message, platform, office, executor } = params;\n const sessionConversation = conversationIdOf(message.sessionKey);\n await mkdir(join(office.dir, \"scratch\"), { recursive: true });\n const { pathContext, memory, systemPrompt, triggerAttribution } =\n await preparePromptContext(params);\n bindRunCapabilities(params, pathContext);\n\n log.logInfo(\n `Context sizes - system: ${systemPrompt.length} chars, memory: ${memory.length} chars`,\n );\n log.logInfo(`Channels: ${platform.channels.length}, Users: ${platform.users.length}`);\n\n const { userMessage, imageAttachments } = await buildPromptPayload(\n message,\n pathContext.runtimeWorkspaceRoot,\n pathContext,\n (runtimePath) => executor.readFileBase64(runtimePath),\n );\n const turnInstructions = buildTurnInstructions(\n message.id.startsWith(\"event:\"),\n triggerAttribution,\n platform.name,\n );\n const finalUserMessage = turnInstructions ? `${turnInstructions}\\n\\n${userMessage}` : userMessage;\n return {\n sessionConversation,\n userMessage: finalUserMessage,\n imageAttachments,\n triggerAttribution,\n };\n}\n\nasync function buildInitialSystemPrompt(params: {\n office: Office;\n pathContext: RuntimePathContext;\n projection: ReturnType<typeof resolveWorkspaceProjection>;\n sandboxConfig: CreateRunnerOptions[\"sandboxConfig\"];\n}): Promise<string> {\n const { office, pathContext, projection, sandboxConfig } = params;\n const memory = await getMemory(projection);\n const { skills, skippedSkillLinks } = loadMikanSkills(\n office,\n pathContext.runtimeWorkspaceRoot,\n projection,\n resolveConversationPackages({ office }),\n );\n return buildSystemPrompt({\n workspacePath: pathContext.runtimeWorkspaceRoot,\n office,\n memory,\n sandboxConfig,\n platform: {\n name: \"chat\",\n formattingGuide: \"\",\n channels: [],\n users: [],\n trustModel: \"membership\",\n },\n skills,\n projection,\n skippedSkillLinks,\n });\n}\n\nasync function rollbackRunnerResource(label: string, cleanup: () => Promise<void>): Promise<void> {\n try {\n await cleanup();\n } catch (error) {\n log.logWarning(`Runner rollback failed to ${label}`, String(error));\n }\n}\n\nasync function openRunnerSessionManager(params: {\n contextFile: string;\n runtimeWorkspaceRoot: string;\n sessionKey: string;\n threadRootMessage: ThreadRootMessage | null;\n}) {\n const { contextFile, runtimeWorkspaceRoot, sessionKey, threadRootMessage } = params;\n const sessionManager = await openManagedSession(contextFile, runtimeWorkspaceRoot);\n try {\n const threadSessionName = buildThreadSessionName(threadRootMessage);\n if (\n isThreadSessionKey(sessionKey) &&\n threadSessionName &&\n (await sessionManager.getSessionName()) !== threadSessionName\n ) {\n await sessionManager.setSessionName(threadSessionName);\n }\n return sessionManager;\n } catch (error) {\n await rollbackRunnerResource(\"close the session writer\", () => sessionManager.close());\n throw error;\n }\n}\n\nasync function createRunnerAgentSession(params: {\n workspaceDir: string;\n systemPrompt: string;\n model: Model<Api>;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n tools: ReturnType<typeof createMikanTools>[\"tools\"];\n sessionManager: Awaited<ReturnType<typeof openManagedSession>>;\n modelRegistry: MikanModels;\n conversationId: string;\n signal?: AbortSignal;\n}) {\n const {\n workspaceDir,\n systemPrompt,\n model,\n agentConfig,\n tools,\n sessionManager,\n modelRegistry,\n signal,\n } = params;\n const mcpResult = await loadMcpTools(agentConfig.mcpServers ?? {}, signal);\n for (const mcpError of mcpResult.errors) {\n log.logWarning(\n `[${params.conversationId}] MCP server unavailable: ${mcpError.server}`,\n mcpError.error,\n );\n }\n if (mcpResult.tools.length > 0) {\n log.logInfo(`[${params.conversationId}] Loaded ${mcpResult.tools.length} MCP tool(s)`);\n }\n try {\n signal?.throwIfAborted();\n const mcpInstructions = formatMcpServerInstructions(mcpResult.instructions);\n const session = await createConfiguredAgentSession({\n workspaceDir,\n systemPrompt: mcpInstructions ? `${systemPrompt}\\n\\n${mcpInstructions}` : systemPrompt,\n model,\n thinkingLevel: agentConfig.thinkingLevel,\n tools: [...tools, ...mcpResult.tools],\n sessionStore: sessionManager,\n models: modelRegistry,\n });\n return { mcpResult, session };\n } catch (error) {\n await rollbackRunnerResource(\"dispose MCP resources\", mcpResult.dispose);\n throw error;\n }\n}\n\ntype PreparedTurnParams = {\n prepared: PreparedRunContext;\n presentation: RunPresentation;\n message: ConversationMessage;\n responder: ConversationResponder;\n platform: MessagingInfo;\n runState: RunnerSessionState;\n session: MikanAgentSession;\n model: Model<Api>;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n sessionUuid: string;\n conversationId: string;\n contextFile: string;\n sessionView: CreateRunnerOptions[\"sessionView\"];\n};\n\nasync function runPreparedTurn(params: PreparedTurnParams): Promise<{\n stopReason: string;\n errorMessage?: string;\n}> {\n const {\n prepared,\n presentation,\n message,\n responder,\n platform,\n runState,\n session,\n model,\n agentConfig,\n sessionUuid,\n conversationId,\n contextFile,\n sessionView,\n } = params;\n if (runState.logCtx) {\n log.logAgentRunStart(runState.logCtx, model.provider, model.id, model.name);\n }\n\n updateActiveSpanAttribution({\n provider: model.provider,\n model: agentConfig.model,\n channel_id: prepared.sessionConversation,\n session_id: sessionUuid,\n });\n addLifecycleBreadcrumb(\"agent.prompt.sent\", {\n provider: model.provider,\n model: agentConfig.model,\n channel_id: prepared.sessionConversation,\n session_id: sessionUuid,\n attachment_count: message.attachments?.length ?? 0,\n image_attachment_count: prepared.imageAttachments.length,\n });\n sendAgentEvent({\n sessionId: sessionUuid,\n actorName: formatAgentActorName(message.userName, prepared.sessionConversation),\n event: { kind: \"sessionStart\" },\n });\n\n const isEventRun = message.id.startsWith(\"event:\");\n await session.prompt(prepared.userMessage, {\n ...(prepared.imageAttachments.length > 0 ? { images: prepared.imageAttachments } : {}),\n ...(isEventRun ? { budget: DEFAULT_EVENT_BUDGET } : {}),\n });\n await presentation.wait();\n\n const sessionViewTokenStore = sessionView?.tokenStore;\n const sessionViewPortalBaseUrl = sessionView?.portalBaseUrl;\n let sessionViewLink: string | undefined;\n const createSessionViewLink =\n sessionViewTokenStore && sessionViewPortalBaseUrl\n ? () => {\n if (!sessionViewLink) {\n const token = sessionViewTokenStore.create({\n platform: platform.name as PlatformName,\n platformUserId: message.userId,\n conversationId,\n sessionKey: message.sessionKey,\n sessionFile: contextFile,\n platformUserName: message.userName,\n });\n sessionViewLink = `${sessionViewPortalBaseUrl}/session?token=${token.token}`;\n }\n return sessionViewLink;\n }\n : undefined;\n\n await finalizeRunResponse(responder, session, runState, {\n triggerSessionLink: isEventTriggerAttribution(prepared.triggerAttribution)\n ? createSessionViewLink?.()\n : undefined,\n createOverflowLink: createSessionViewLink,\n platform: platform.name,\n model,\n sessionConversation: prepared.sessionConversation,\n sessionUuid,\n });\n await reportUsageSummary({\n session,\n runState,\n responder,\n platform,\n model,\n agentConfig,\n sessionConversation: prepared.sessionConversation,\n sessionUuid,\n waitForQueue: presentation.wait,\n });\n return { stopReason: runState.stopReason, errorMessage: runState.errorMessage };\n}\n\ntype MikanToolBindings = ReturnType<typeof createMikanTools>;\n\ntype RunnerInterfaceParams = {\n conversationId: string;\n conversationDir: string;\n sessionKey: string;\n office: Office;\n sessionUuid: string;\n contextFile: string;\n sessionView: CreateRunnerOptions[\"sessionView\"];\n runState: RunnerSessionState;\n executor: Executor;\n resolveForRun: RunnerExecutionContext[\"resolveForRun\"];\n session: MikanAgentSession;\n model: Model<Api>;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n sessionManager: Awaited<ReturnType<typeof openManagedSession>>;\n chatSessionManager: ChatHistorySync;\n mcpResult: Awaited<ReturnType<typeof loadMcpTools>>;\n toolBindings: MikanToolBindings;\n};\n\nfunction createRunnerInterface(params: RunnerInterfaceParams): PiAgentWrapper {\n const {\n conversationId,\n conversationDir,\n sessionKey,\n office,\n sessionUuid,\n contextFile,\n sessionView,\n runState,\n executor,\n resolveForRun,\n session,\n model,\n agentConfig,\n sessionManager,\n chatSessionManager,\n mcpResult,\n toolBindings,\n } = params;\n return {\n async syncChatHistory(currentMessageId?: string): Promise<void> {\n await chatSessionManager.syncSessionManager({\n conversationDir,\n sessionKey,\n sessionManager,\n currentMessageId,\n });\n },\n\n async run(message, responder, platform) {\n const prepared = await prepareRunContext({\n message,\n responder,\n platform,\n office,\n executor,\n resolveForRun,\n session,\n setEventContext: toolBindings.setEventContext,\n setSandboxContext: toolBindings.setSandboxContext,\n setUploadFunction: toolBindings.setUploadFunction,\n setImageUploadFunction: toolBindings.setImageUploadFunction,\n setReactFunction: toolBindings.setReactFunction,\n bindPlatformToolPacks: toolBindings.bindPlatformToolPacks,\n });\n const presentation = activateRunPresentation(runState, {\n responder,\n sessionConversation: prepared.sessionConversation,\n userName: message.userName,\n sessionUuid,\n triggerAttribution: prepared.triggerAttribution,\n });\n try {\n return await runPreparedTurn({\n prepared,\n presentation,\n message,\n responder,\n platform,\n runState,\n session,\n model,\n agentConfig,\n sessionUuid,\n conversationId,\n contextFile,\n sessionView,\n });\n } finally {\n presentation.dispose();\n }\n },\n\n abort(): void {\n session.abort();\n },\n\n async dispose(): Promise<void> {\n try {\n await mcpResult.dispose();\n } finally {\n await sessionManager.close();\n }\n },\n\n getCurrentStep(): { toolName?: string; label?: string } | undefined {\n const first = runState.pendingTools.values().next().value;\n if (!first) return undefined;\n return {\n toolName: first.toolName,\n label: (first.args as { label?: string })?.label,\n };\n },\n };\n}\n\nasync function finishRunnerCreation(params: {\n options: CreateRunnerOptions;\n conversationId: string;\n conversationDir: string;\n workspaceDir: string;\n executor: Executor;\n resolveForRun: RunnerExecutionContext[\"resolveForRun\"];\n model: Model<Api>;\n modelRegistry: MikanModels;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n systemPrompt: string;\n sessionManager: Awaited<ReturnType<typeof openManagedSession>>;\n toolBindings: MikanToolBindings;\n}): Promise<PiAgentWrapper> {\n const {\n options,\n conversationId,\n conversationDir,\n workspaceDir,\n executor,\n resolveForRun,\n model,\n modelRegistry,\n agentConfig,\n systemPrompt,\n sessionManager,\n toolBindings,\n } = params;\n const { sessionKey, office, sessionScope, sessionView } = options;\n const { contextFile } = sessionScope;\n let acquiredMcpResult: Awaited<ReturnType<typeof loadMcpTools>> | undefined;\n try {\n const sessionUuid = extractSessionUuid(contextFile);\n const chatSessionManager = new ChatHistorySync();\n const { mcpResult, session } = await createRunnerAgentSession({\n workspaceDir,\n systemPrompt,\n model,\n agentConfig,\n tools: toolBindings.tools,\n sessionManager,\n modelRegistry,\n conversationId,\n signal: options.signal,\n });\n acquiredMcpResult = mcpResult;\n options.signal?.throwIfAborted();\n\n const runState = createRunState();\n attachSessionEventHandlers({ session, runState, model, agentConfig });\n\n return createRunnerInterface({\n conversationId,\n conversationDir,\n sessionKey,\n office,\n sessionUuid,\n contextFile,\n sessionView,\n runState,\n executor,\n resolveForRun,\n session,\n model,\n agentConfig,\n sessionManager,\n chatSessionManager,\n mcpResult,\n toolBindings,\n });\n } catch (error) {\n if (acquiredMcpResult) {\n await rollbackRunnerResource(\"dispose MCP resources\", acquiredMcpResult.dispose);\n }\n await rollbackRunnerResource(\"close the session writer\", () => sessionManager.close());\n throw error;\n }\n}\n\nexport async function createRunner(options: CreateRunnerOptions): Promise<PiAgentWrapper> {\n options.signal?.throwIfAborted();\n const {\n sandboxConfig,\n sessionKey,\n office,\n trustModel,\n sessionScope,\n vaultManager,\n provisioner,\n resourceController,\n platformToolPackFactories,\n } = options;\n const conversationId = office.address.conversationId;\n const conversationDir = office.dir;\n const workspaceDir = office.workspace.root;\n const resolvedAgentConfig = resolveConversationSettings(office);\n const mcpServers = await resolveRunnerMcpServers({\n office,\n trustModel,\n platformWorkspaceId: options.platformWorkspaceId,\n servers: resolvedAgentConfig.mcpServers,\n openConnector: options.openConnector,\n signal: options.signal,\n });\n options.signal?.throwIfAborted();\n const agentConfig = { ...resolvedAgentConfig, mcpServers };\n\n const projection = resolveWorkspaceProjection(office);\n // Bootstrap validation fails runner creation early. resolveForRun repeats\n // the check against the actor-specific decision before any provider call.\n assertSandboxSupportsWorkspacePolicy(\n sandboxConfig,\n projection.doorPolicy,\n projection.promptSources.globalMemoryReadOnly === true,\n );\n const { executor, resolveForRun } = createRunnerExecutionContext(\n sandboxConfig,\n vaultManager,\n provisioner,\n office.workspace,\n );\n const pathContext = getUnresolvedSandboxPathContext(sandboxConfig, workspaceDir);\n\n const modelRegistry = options.models ?? MikanModels.create();\n if (modelRegistry.getError()) {\n log.logWarning(\"models.json load error\", modelRegistry.getError()!);\n }\n const model = modelRegistry.resolve(agentConfig.provider, agentConfig.model);\n\n // Create tools (per-runner, with per-runner upload function setter)\n const toolBindings = createMikanTools(\n executor,\n workspaceDir,\n { sandbox: sandboxConfig, resourceController: resourceController ?? provisioner },\n platformToolPackFactories ?? [],\n {\n model,\n getApiKey: () => modelRegistry.getApiKeyForProvider(model.provider),\n // The conversation's own office dir: mounted into the sandbox, unlike\n // the workspace base — generated images must land somewhere the agent\n // (and a future run) can still reach.\n outputDir: conversationDir,\n },\n );\n\n const systemPrompt = await buildInitialSystemPrompt({\n office,\n pathContext,\n projection,\n sandboxConfig,\n });\n options.signal?.throwIfAborted();\n const { contextFile, threadRootMessage } = sessionScope;\n const sessionManager = await openRunnerSessionManager({\n contextFile,\n runtimeWorkspaceRoot: pathContext.runtimeWorkspaceRoot,\n sessionKey,\n threadRootMessage,\n });\n return finishRunnerCreation({\n options,\n conversationId,\n conversationDir,\n workspaceDir,\n executor,\n resolveForRun,\n model,\n modelRegistry,\n agentConfig,\n systemPrompt,\n sessionManager,\n toolBindings,\n });\n}\n"]}
@@ -88,14 +88,12 @@ export interface RunnerExecutionContext {
88
88
  packages: ResolvedPackages;
89
89
  }>;
90
90
  }
91
+ export interface RunPresentation {
92
+ wait(): Promise<void>;
93
+ dispose(): void;
94
+ }
91
95
  export interface PreparedRunContext {
92
96
  sessionConversation: string;
93
- runQueue: {
94
- queue: {
95
- enqueue(fn: () => Promise<void>, errorContext: string): void;
96
- };
97
- wait: () => Promise<void>;
98
- };
99
97
  userMessage: string;
100
98
  imageAttachments: ImageContent[];
101
99
  triggerAttribution?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2C,MAAM,uBAAuB,CAAC;AAKhF,OAAO,EAA8D,MAAM,qBAAqB,CAAC","sourcesContent":["import type { OfficeAddress } from \"../types.js\";\nimport type { MikanAgentSession, MikanSkill } from \"../harness/index.js\";\nimport { type Api, type ImageContent, type Model } from \"@earendil-works/pi-ai\";\nimport type { ConversationResponder, MessagingInfo, SubagentProgressSnapshot } from \"../adapter.js\";\nimport type { PlatformTrustModel } from \"../types.js\";\nimport type { resolveConversationSettings } from \"../config.js\";\nimport type { ResolvedPackages } from \"../packages/types.js\";\nimport { type Executor, type RuntimePathContext, type SandboxConfig } from \"../sandbox/index.js\";\nimport type { WorkspaceProjection } from \"../workspace-projection/types.js\";\nimport type { Office } from \"../office/index.js\";\n\nexport interface BuildSystemPromptOptions {\n workspacePath: string;\n office: Office;\n memory: string;\n sandboxConfig: SandboxConfig;\n platform: MessagingInfo;\n skills: MikanSkill[];\n projection: WorkspaceProjection;\n skippedSkillLinks?: string[];\n}\n\nexport interface RunnerSessionState {\n responder: ConversationResponder | null;\n logCtx: {\n conversationId: string;\n userName?: string;\n conversationName?: string;\n sessionId?: string;\n } | null;\n queue: {\n enqueue(fn: () => Promise<void>, errorContext: string): void;\n } | null;\n pendingTools: Map<string, { toolName: string; args: unknown; startTime: number }>;\n toolProgress: Map<string, { label: string; status: \"running\" | \"done\" | \"error\" }>;\n subagentProgress: Map<string, SubagentProgressSnapshot>;\n completedSubagentProgress: SubagentProgressSnapshot[];\n subagentToolCalls: Set<string>;\n subagentProgressShown: boolean;\n suppressResponseDeltas: boolean;\n lastSubagentProgressAt: number;\n toolProgressTimer: ReturnType<typeof setTimeout> | undefined;\n totalUsage: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: { input: number; output: number; cacheRead: number; cacheWrite: number; total: number };\n };\n llmCallCount: number;\n stopReason: string;\n errorMessage: string | undefined;\n reportedLlmError: boolean;\n finalResponseHandledByTool: boolean;\n triggerAttribution?: string;\n}\n\nexport interface UsageReportContext {\n session: MikanAgentSession;\n runState: RunnerSessionState;\n responder: ConversationResponder;\n platform: MessagingInfo;\n model: Model<Api>;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n sessionConversation: string;\n sessionUuid: string;\n waitForQueue: () => Promise<void>;\n}\n\nexport interface RunnerExecutionContext {\n executor: Executor;\n resolveForRun(context: {\n address: OfficeAddress;\n userId: string;\n trustModel?: PlatformTrustModel;\n }): Promise<{\n pathContext: RuntimePathContext;\n projection: WorkspaceProjection;\n packages: ResolvedPackages;\n }>;\n}\n\nexport interface PreparedRunContext {\n sessionConversation: string;\n runQueue: {\n queue: { enqueue(fn: () => Promise<void>, errorContext: string): void };\n wait: () => Promise<void>;\n };\n userMessage: string;\n imageAttachments: ImageContent[];\n triggerAttribution?: string;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2C,MAAM,uBAAuB,CAAC;AAKhF,OAAO,EAA8D,MAAM,qBAAqB,CAAC","sourcesContent":["import type { OfficeAddress } from \"../types.js\";\nimport type { MikanAgentSession, MikanSkill } from \"../harness/index.js\";\nimport { type Api, type ImageContent, type Model } from \"@earendil-works/pi-ai\";\nimport type { ConversationResponder, MessagingInfo, SubagentProgressSnapshot } from \"../adapter.js\";\nimport type { PlatformTrustModel } from \"../types.js\";\nimport type { resolveConversationSettings } from \"../config.js\";\nimport type { ResolvedPackages } from \"../packages/types.js\";\nimport { type Executor, type RuntimePathContext, type SandboxConfig } from \"../sandbox/index.js\";\nimport type { WorkspaceProjection } from \"../workspace-projection/types.js\";\nimport type { Office } from \"../office/index.js\";\n\nexport interface BuildSystemPromptOptions {\n workspacePath: string;\n office: Office;\n memory: string;\n sandboxConfig: SandboxConfig;\n platform: MessagingInfo;\n skills: MikanSkill[];\n projection: WorkspaceProjection;\n skippedSkillLinks?: string[];\n}\n\nexport interface RunnerSessionState {\n responder: ConversationResponder | null;\n logCtx: {\n conversationId: string;\n userName?: string;\n conversationName?: string;\n sessionId?: string;\n } | null;\n queue: {\n enqueue(fn: () => Promise<void>, errorContext: string): void;\n } | null;\n pendingTools: Map<string, { toolName: string; args: unknown; startTime: number }>;\n toolProgress: Map<string, { label: string; status: \"running\" | \"done\" | \"error\" }>;\n subagentProgress: Map<string, SubagentProgressSnapshot>;\n completedSubagentProgress: SubagentProgressSnapshot[];\n subagentToolCalls: Set<string>;\n subagentProgressShown: boolean;\n suppressResponseDeltas: boolean;\n lastSubagentProgressAt: number;\n toolProgressTimer: ReturnType<typeof setTimeout> | undefined;\n totalUsage: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: { input: number; output: number; cacheRead: number; cacheWrite: number; total: number };\n };\n llmCallCount: number;\n stopReason: string;\n errorMessage: string | undefined;\n reportedLlmError: boolean;\n finalResponseHandledByTool: boolean;\n triggerAttribution?: string;\n}\n\nexport interface UsageReportContext {\n session: MikanAgentSession;\n runState: RunnerSessionState;\n responder: ConversationResponder;\n platform: MessagingInfo;\n model: Model<Api>;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n sessionConversation: string;\n sessionUuid: string;\n waitForQueue: () => Promise<void>;\n}\n\nexport interface RunnerExecutionContext {\n executor: Executor;\n resolveForRun(context: {\n address: OfficeAddress;\n userId: string;\n trustModel?: PlatformTrustModel;\n }): Promise<{\n pathContext: RuntimePathContext;\n projection: WorkspaceProjection;\n packages: ResolvedPackages;\n }>;\n}\n\nexport interface RunPresentation {\n wait(): Promise<void>;\n dispose(): void;\n}\n\nexport interface PreparedRunContext {\n sessionConversation: string;\n userMessage: string;\n imageAttachments: ImageContent[];\n triggerAttribution?: string;\n}\n"]}
package/dist/cli/boot.js CHANGED
@@ -90,7 +90,7 @@ Usage:
90
90
  mikan office <list|claim> …
91
91
  Inspect conversation offices and claim legacy directories for a platform.
92
92
  mikan sessions migrate …
93
- Migrate legacy v3 session files to the v4 format (run with the daemon stopped).
93
+ Migrate legacy v3 and Pi 0.84 session files to the current v4 format (stop the daemon first).
94
94
  mikan env
95
95
  Show the full environment-variable inventory and what is currently set.
96
96
  mikan onboard
@@ -1 +1 @@
1
- {"version":3,"file":"boot.js","sourceRoot":"","sources":["../../src/cli/boot.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Boot resolution for the `mikan` binary: argv → a BootPlan saying which mode\n * to run and with what configuration. Pure — no side effects, no exits — so\n * the grammar that actually drives the daemon is testable without spawning a\n * process; main.ts just executes the plan.\n *\n * Modes, highest priority first: `office`, `sessions`, `env` (own grammars, never\n * flag-parsed here), `help`, `version`, `onboard`, `download`, `run`.\n */\nimport { join, resolve } from \"node:path\";\nimport { envSummaryLines } from \"../env-manifest.js\";\nimport { parseSandboxArg } from \"../sandbox/index.js\";\nimport type { SandboxConfig } from \"../sandbox/types.js\";\nimport type { BootPlan } from \"./types.js\";\nimport { defaultStateDir, resolveStateDir, takeValueFlag } from \"./arg-grammar.js\";\n\nexport type { BootPlan } from \"./types.js\";\n\nexport function resolveBoot(args: string[] = process.argv.slice(2)): BootPlan {\n if (args[0] === \"office\" || args[0] === \"sessions\" || args[0] === \"env\") {\n return {\n mode: args[0],\n ...(args[0] === \"office\" ? { officeArgs: args.slice(1) } : {}),\n ...(args[0] === \"sessions\" ? { sessionsArgs: args.slice(1) } : {}),\n stateDir: defaultStateDir(),\n workingDir: join(defaultStateDir(), \"workspace\"),\n workingDirExplicit: false,\n sandbox: { type: \"host\" },\n };\n }\n\n let sandbox: SandboxConfig = { type: \"host\" };\n let workingDirArg: string | undefined;\n let downloadChannel: string | undefined;\n let help = false;\n let version = false;\n let onboard = false;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === undefined) continue;\n let taken;\n if (arg === \"--help\" || arg === \"-h\") {\n help = true;\n } else if (arg === \"--version\" || arg === \"-v\" || arg === \"-V\") {\n version = true;\n } else if (arg === \"--onboard\" || (arg === \"onboard\" && i === 0)) {\n onboard = true;\n } else if ((taken = takeValueFlag(args, i, \"--sandbox\"))) {\n sandbox = parseSandboxArg(taken.value);\n i = taken.lastIndex;\n } else if ((taken = takeValueFlag(args, i, \"--state-dir\"))) {\n // Consumed here so its value never reads as the positional working\n // dir; the value itself is resolved by resolveStateDir below.\n i = taken.lastIndex;\n } else if ((taken = takeValueFlag(args, i, \"--download\"))) {\n downloadChannel = taken.value;\n i = taken.lastIndex;\n } else if (!arg.startsWith(\"-\")) {\n workingDirArg = arg;\n } else {\n throw new Error(`Unknown flag: ${arg}. Run \\`mikan --help\\` for usage.`);\n }\n }\n\n const stateDir = resolveStateDir(args);\n return {\n mode: help\n ? \"help\"\n : version\n ? \"version\"\n : onboard\n ? \"onboard\"\n : downloadChannel\n ? \"download\"\n : \"run\",\n stateDir,\n workingDir: workingDirArg ? resolve(workingDirArg) : join(stateDir, \"workspace\"),\n workingDirExplicit: workingDirArg !== undefined,\n sandbox,\n downloadChannel,\n };\n}\n\nexport function helpText(): string {\n return `mikan — multi-platform chat agent daemon\n\nUsage:\n mikan [options] [working-directory]\n Start the daemon. The working directory defaults to <state-dir>/workspace.\n mikan office <list|claim> …\n Inspect conversation offices and claim legacy directories for a platform.\n mikan sessions migrate …\n Migrate legacy v3 session files to the v4 format (run with the daemon stopped).\n mikan env\n Show the full environment-variable inventory and what is currently set.\n mikan onboard\n Interactive first-run setup: chat adapter, LLM provider, sandbox.\n Writes settings.json, ~/.mikan/mikan.env, and models.json as needed.\n\nOptions:\n --state-dir <dir> State directory (settings.json, vaults, packages).\n Default: ~/.mikan\n --sandbox <spec> Execution sandbox. One of:\n host\n container:<existing-container-name>\n image:<image[:tag]>\n cloudflare:<sandbox-id>\n Default: host\n --download <channel> Dump a Slack channel's history (Slack only), then exit.\n --version, -v Print the version.\n --help, -h Show this help.\n\nEnvironment (platform tokens select which chat adapters start):\n${envSummaryLines().join(\"\\n\")}\nRun \\`mikan env\\` for the full inventory.`;\n}\n"]}
1
+ {"version":3,"file":"boot.js","sourceRoot":"","sources":["../../src/cli/boot.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Boot resolution for the `mikan` binary: argv → a BootPlan saying which mode\n * to run and with what configuration. Pure — no side effects, no exits — so\n * the grammar that actually drives the daemon is testable without spawning a\n * process; main.ts just executes the plan.\n *\n * Modes, highest priority first: `office`, `sessions`, `env` (own grammars, never\n * flag-parsed here), `help`, `version`, `onboard`, `download`, `run`.\n */\nimport { join, resolve } from \"node:path\";\nimport { envSummaryLines } from \"../env-manifest.js\";\nimport { parseSandboxArg } from \"../sandbox/index.js\";\nimport type { SandboxConfig } from \"../sandbox/types.js\";\nimport type { BootPlan } from \"./types.js\";\nimport { defaultStateDir, resolveStateDir, takeValueFlag } from \"./arg-grammar.js\";\n\nexport type { BootPlan } from \"./types.js\";\n\nexport function resolveBoot(args: string[] = process.argv.slice(2)): BootPlan {\n if (args[0] === \"office\" || args[0] === \"sessions\" || args[0] === \"env\") {\n return {\n mode: args[0],\n ...(args[0] === \"office\" ? { officeArgs: args.slice(1) } : {}),\n ...(args[0] === \"sessions\" ? { sessionsArgs: args.slice(1) } : {}),\n stateDir: defaultStateDir(),\n workingDir: join(defaultStateDir(), \"workspace\"),\n workingDirExplicit: false,\n sandbox: { type: \"host\" },\n };\n }\n\n let sandbox: SandboxConfig = { type: \"host\" };\n let workingDirArg: string | undefined;\n let downloadChannel: string | undefined;\n let help = false;\n let version = false;\n let onboard = false;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === undefined) continue;\n let taken;\n if (arg === \"--help\" || arg === \"-h\") {\n help = true;\n } else if (arg === \"--version\" || arg === \"-v\" || arg === \"-V\") {\n version = true;\n } else if (arg === \"--onboard\" || (arg === \"onboard\" && i === 0)) {\n onboard = true;\n } else if ((taken = takeValueFlag(args, i, \"--sandbox\"))) {\n sandbox = parseSandboxArg(taken.value);\n i = taken.lastIndex;\n } else if ((taken = takeValueFlag(args, i, \"--state-dir\"))) {\n // Consumed here so its value never reads as the positional working\n // dir; the value itself is resolved by resolveStateDir below.\n i = taken.lastIndex;\n } else if ((taken = takeValueFlag(args, i, \"--download\"))) {\n downloadChannel = taken.value;\n i = taken.lastIndex;\n } else if (!arg.startsWith(\"-\")) {\n workingDirArg = arg;\n } else {\n throw new Error(`Unknown flag: ${arg}. Run \\`mikan --help\\` for usage.`);\n }\n }\n\n const stateDir = resolveStateDir(args);\n return {\n mode: help\n ? \"help\"\n : version\n ? \"version\"\n : onboard\n ? \"onboard\"\n : downloadChannel\n ? \"download\"\n : \"run\",\n stateDir,\n workingDir: workingDirArg ? resolve(workingDirArg) : join(stateDir, \"workspace\"),\n workingDirExplicit: workingDirArg !== undefined,\n sandbox,\n downloadChannel,\n };\n}\n\nexport function helpText(): string {\n return `mikan — multi-platform chat agent daemon\n\nUsage:\n mikan [options] [working-directory]\n Start the daemon. The working directory defaults to <state-dir>/workspace.\n mikan office <list|claim> …\n Inspect conversation offices and claim legacy directories for a platform.\n mikan sessions migrate …\n Migrate legacy v3 and Pi 0.84 session files to the current v4 format (stop the daemon first).\n mikan env\n Show the full environment-variable inventory and what is currently set.\n mikan onboard\n Interactive first-run setup: chat adapter, LLM provider, sandbox.\n Writes settings.json, ~/.mikan/mikan.env, and models.json as needed.\n\nOptions:\n --state-dir <dir> State directory (settings.json, vaults, packages).\n Default: ~/.mikan\n --sandbox <spec> Execution sandbox. One of:\n host\n container:<existing-container-name>\n image:<image[:tag]>\n cloudflare:<sandbox-id>\n Default: host\n --download <channel> Dump a Slack channel's history (Slack only), then exit.\n --version, -v Print the version.\n --help, -h Show this help.\n\nEnvironment (platform tokens select which chat adapters start):\n${envSummaryLines().join(\"\\n\")}\nRun \\`mikan env\\` for the full inventory.`;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/cli/sessions.ts"],"names":[],"mappings":"AAmBA,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA6DxE"}
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/cli/sessions.ts"],"names":[],"mappings":"AAkBA,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoExE"}
@@ -3,14 +3,13 @@
3
3
  *
4
4
  * mikan sessions migrate [--state-dir <dir>] [--workspace <dir>] [--dry-run]
5
5
  *
6
- * `migrate` rewrites legacy v3 session files under the workspace to pi's v4
7
- * JSONL format. Run it with the daemon stopped: this mikan version cannot
8
- * read v3 files, and old versions cannot read v4, so the deploy order is
9
- * stop → migrate → start. Each migrated file is verified against the v3
10
- * semantics before it replaces the original, and the original is kept as
11
- * `<file>.v3.bak`.
6
+ * `migrate` rewrites legacy mikan v3 and Pi 0.84-generation v4 sessions to
7
+ * Pi's current JSONL v4 storage schema. Run it with the daemon stopped. Each
8
+ * candidate is verified before atomic replacement, and the original remains
9
+ * beside it as `<file>.v3.bak` or `<file>.pi-084.bak`.
12
10
  */
13
11
  import { join, resolve } from "node:path";
12
+ import { findPi084SessionFiles, migratePi084SessionFile } from "../sessions/migrate-pi-084.js";
14
13
  import { findV3SessionFiles, migrateSessionFile } from "../sessions/migrate-v3.js";
15
14
  import { resolveStateDir, takeValueFlag } from "./arg-grammar.js";
16
15
  const USAGE = `Usage:
@@ -48,17 +47,23 @@ export async function runSessionsCommand(argv) {
48
47
  return 1;
49
48
  }
50
49
  const workspaceRoot = workspaceArg ? resolve(workspaceArg) : join(stateDir, "workspace");
51
- const files = findV3SessionFiles(workspaceRoot);
52
- if (files.length === 0) {
53
- console.log(`No v3 session files found under ${workspaceRoot}`);
50
+ const candidates = [
51
+ ...findV3SessionFiles(workspaceRoot).map((file) => ({ file, format: "v3" })),
52
+ ...findPi084SessionFiles(workspaceRoot).map((file) => ({ file, format: "pi-084" })),
53
+ ].toSorted((left, right) => left.file.localeCompare(right.file));
54
+ if (candidates.length === 0) {
55
+ console.log(`No legacy session files found under ${workspaceRoot}`);
54
56
  return 0;
55
57
  }
56
- console.log(`Found ${files.length} v3 session file(s) under ${workspaceRoot}`);
58
+ console.log(`Found ${candidates.length} legacy session file(s) under ${workspaceRoot}`);
57
59
  let migrated = 0;
58
60
  let failed = 0;
59
- for (const file of files) {
61
+ for (const candidate of candidates) {
62
+ const { file } = candidate;
60
63
  try {
61
- const result = await migrateSessionFile(file, { dryRun });
64
+ const result = candidate.format === "v3"
65
+ ? await migrateSessionFile(file, { dryRun })
66
+ : await migratePi084SessionFile(file, { dryRun });
62
67
  if (result.status === "migrated") {
63
68
  migrated++;
64
69
  console.log(`${dryRun ? "would migrate" : "migrated"} ${file}`);
@@ -72,7 +77,7 @@ export async function runSessionsCommand(argv) {
72
77
  }
73
78
  console.log(dryRun
74
79
  ? `Dry run: ${migrated} file(s) would be migrated, ${failed} failed to read.`
75
- : `Migrated ${migrated} file(s), ${failed} failure(s). Originals kept as *.v3.bak.`);
80
+ : `Migrated ${migrated} file(s), ${failed} failure(s). Originals kept as *.v3.bak or *.pi-084.bak.`);
76
81
  return failed === 0 ? 0 : 1;
77
82
  }
78
83
  //# sourceMappingURL=sessions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/cli/sessions.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `mikan sessions` — session-file maintenance from the CLI.\n *\n * mikan sessions migrate [--state-dir <dir>] [--workspace <dir>] [--dry-run]\n *\n * `migrate` rewrites legacy v3 session files under the workspace to pi's v4\n * JSONL format. Run it with the daemon stopped: this mikan version cannot\n * read v3 files, and old versions cannot read v4, so the deploy order is\n * stop → migrate → start. Each migrated file is verified against the v3\n * semantics before it replaces the original, and the original is kept as\n * `<file>.v3.bak`.\n */\nimport { join, resolve } from \"node:path\";\nimport { findV3SessionFiles, migrateSessionFile } from \"../sessions/migrate-v3.js\";\nimport { resolveStateDir, takeValueFlag } from \"./arg-grammar.js\";\n\nconst USAGE = `Usage:\n mikan sessions migrate [--state-dir <dir>] [--workspace <dir>] [--dry-run]`;\n\nexport async function runSessionsCommand(argv: string[]): Promise<number> {\n const stateDir = resolveStateDir(argv);\n let workspaceArg: string | undefined;\n let dryRun = false;\n const positional: string[] = [];\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === undefined) continue;\n let taken;\n if ((taken = takeValueFlag(argv, i, \"--workspace\"))) {\n workspaceArg = taken.value;\n i = taken.lastIndex;\n } else if ((taken = takeValueFlag(argv, i, \"--state-dir\"))) {\n i = taken.lastIndex; // consumed by resolveStateDir above\n } else if (arg === \"--dry-run\") {\n dryRun = true;\n } else if (arg.startsWith(\"-\")) {\n console.error(`Unknown flag: ${arg}\\n${USAGE}`);\n return 1;\n } else {\n positional.push(arg);\n }\n }\n\n if (positional[0] !== \"migrate\" || positional.length !== 1) {\n console.error(USAGE);\n return 1;\n }\n\n const workspaceRoot = workspaceArg ? resolve(workspaceArg) : join(stateDir, \"workspace\");\n const files = findV3SessionFiles(workspaceRoot);\n if (files.length === 0) {\n console.log(`No v3 session files found under ${workspaceRoot}`);\n return 0;\n }\n\n console.log(`Found ${files.length} v3 session file(s) under ${workspaceRoot}`);\n let migrated = 0;\n let failed = 0;\n for (const file of files) {\n try {\n const result = await migrateSessionFile(file, { dryRun });\n if (result.status === \"migrated\") {\n migrated++;\n console.log(`${dryRun ? \"would migrate\" : \"migrated\"} ${file}`);\n }\n } catch (error) {\n failed++;\n const cause = error instanceof Error && error.cause ? ` (${String(error.cause)})` : \"\";\n console.error(\n `FAILED ${file}: ${error instanceof Error ? error.message : error}${cause}`,\n );\n }\n }\n console.log(\n dryRun\n ? `Dry run: ${migrated} file(s) would be migrated, ${failed} failed to read.`\n : `Migrated ${migrated} file(s), ${failed} failure(s). Originals kept as *.v3.bak.`,\n );\n return failed === 0 ? 0 : 1;\n}\n"]}
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/cli/sessions.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `mikan sessions` — session-file maintenance from the CLI.\n *\n * mikan sessions migrate [--state-dir <dir>] [--workspace <dir>] [--dry-run]\n *\n * `migrate` rewrites legacy mikan v3 and Pi 0.84-generation v4 sessions to\n * Pi's current JSONL v4 storage schema. Run it with the daemon stopped. Each\n * candidate is verified before atomic replacement, and the original remains\n * beside it as `<file>.v3.bak` or `<file>.pi-084.bak`.\n */\nimport { join, resolve } from \"node:path\";\nimport { findPi084SessionFiles, migratePi084SessionFile } from \"../sessions/migrate-pi-084.js\";\nimport { findV3SessionFiles, migrateSessionFile } from \"../sessions/migrate-v3.js\";\nimport { resolveStateDir, takeValueFlag } from \"./arg-grammar.js\";\n\nconst USAGE = `Usage:\n mikan sessions migrate [--state-dir <dir>] [--workspace <dir>] [--dry-run]`;\n\nexport async function runSessionsCommand(argv: string[]): Promise<number> {\n const stateDir = resolveStateDir(argv);\n let workspaceArg: string | undefined;\n let dryRun = false;\n const positional: string[] = [];\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === undefined) continue;\n let taken;\n if ((taken = takeValueFlag(argv, i, \"--workspace\"))) {\n workspaceArg = taken.value;\n i = taken.lastIndex;\n } else if ((taken = takeValueFlag(argv, i, \"--state-dir\"))) {\n i = taken.lastIndex; // consumed by resolveStateDir above\n } else if (arg === \"--dry-run\") {\n dryRun = true;\n } else if (arg.startsWith(\"-\")) {\n console.error(`Unknown flag: ${arg}\\n${USAGE}`);\n return 1;\n } else {\n positional.push(arg);\n }\n }\n\n if (positional[0] !== \"migrate\" || positional.length !== 1) {\n console.error(USAGE);\n return 1;\n }\n\n const workspaceRoot = workspaceArg ? resolve(workspaceArg) : join(stateDir, \"workspace\");\n const candidates = [\n ...findV3SessionFiles(workspaceRoot).map((file) => ({ file, format: \"v3\" as const })),\n ...findPi084SessionFiles(workspaceRoot).map((file) => ({ file, format: \"pi-084\" as const })),\n ].toSorted((left, right) => left.file.localeCompare(right.file));\n if (candidates.length === 0) {\n console.log(`No legacy session files found under ${workspaceRoot}`);\n return 0;\n }\n\n console.log(`Found ${candidates.length} legacy session file(s) under ${workspaceRoot}`);\n let migrated = 0;\n let failed = 0;\n for (const candidate of candidates) {\n const { file } = candidate;\n try {\n const result =\n candidate.format === \"v3\"\n ? await migrateSessionFile(file, { dryRun })\n : await migratePi084SessionFile(file, { dryRun });\n if (result.status === \"migrated\") {\n migrated++;\n console.log(`${dryRun ? \"would migrate\" : \"migrated\"} ${file}`);\n }\n } catch (error) {\n failed++;\n const cause = error instanceof Error && error.cause ? ` (${String(error.cause)})` : \"\";\n console.error(\n `FAILED ${file}: ${error instanceof Error ? error.message : error}${cause}`,\n );\n }\n }\n console.log(\n dryRun\n ? `Dry run: ${migrated} file(s) would be migrated, ${failed} failed to read.`\n : `Migrated ${migrated} file(s), ${failed} failure(s). Originals kept as *.v3.bak or *.pi-084.bak.`,\n );\n return failed === 0 ? 0 : 1;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAUA,qBAAa,0BAA2B,SAAQ,KAAK;aACvB,YAAY,EAAE,MAAM;IAAhD,YAA4B,YAAY,EAAE,MAAM,EAG/C;CACF;AAED,YAAY,EACV,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,gBAAgB,EAEhB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAsQhD,wBAAgB,kBAAkB,IAAI,WAAW,CAEhD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA6B/D;AAcD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAwBvE;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAQzE;AAUD;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAAC,eAAe,EAAE,MAAM,GAAG,eAAe,CAYxF;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,eAAe,GACtB,IAAI,CAaN;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAInE;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,IAAI,CAWN;AAOD,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAGrD;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAqBzF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAIvD;AAoFD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAEtE;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAE5F;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG;IACnD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACxC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC/C,CAKA;AAED;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAiB9F;AAED,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,qBAAqB,GAAG,IAAI,GACnC,IAAI,CAEN;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI,GAAG,IAAI,CAEnF"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAUA,qBAAa,0BAA2B,SAAQ,KAAK;aACvB,YAAY,EAAE,MAAM;IAAhD,YAA4B,YAAY,EAAE,MAAM,EAG/C;CACF;AAED,YAAY,EACV,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,gBAAgB,EAEhB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAuQhD,wBAAgB,kBAAkB,IAAI,WAAW,CAEhD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA6B/D;AAcD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAyBvE;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAQzE;AAUD;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAAC,eAAe,EAAE,MAAM,GAAG,eAAe,CAYxF;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,eAAe,GACtB,IAAI,CAaN;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAInE;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,IAAI,CAWN;AAOD,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAGrD;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAqBzF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAIvD;AAoFD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAEtE;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAE5F;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG;IACnD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACxC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC/C,CAKA;AAED;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAiB9F;AAED,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,qBAAqB,GAAG,IAAI,GACnC,IAAI,CAEN;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI,GAAG,IAAI,CAEnF"}
package/dist/config.js CHANGED
@@ -95,7 +95,8 @@ const SettingsFileSchema = Type.Object({
95
95
  /**
96
96
  * MCP servers, keyed by name. Merged per key across scopes: a conversation
97
97
  * entry overrides (or, with `disabled: true`, turns off) the same-name
98
- * global entry; other global entries stay available.
98
+ * global entry; other global entries stay available. The reserved
99
+ * `open-connector` name is ignored by runner construction.
99
100
  */
100
101
  mcpServers: Type.Optional(Type.Record(Type.String(), Type.Object({
101
102
  command: Type.Optional(Type.String()),
@@ -290,7 +291,8 @@ export function resolveConversationSettings(office) {
290
291
  const globalConfig = loadRawGlobalSettings();
291
292
  const conversationConfig = normalizeSettingsConfig(loadSettingsFile(conversationSettingsPath(office)) ?? {});
292
293
  // MCP servers merge per key: a conversation redefines or disables individual
293
- // servers without losing the rest of the global set.
294
+ // servers without losing the rest of the global set. Runner construction
295
+ // removes the reserved open-connector entry before loading servers.
294
296
  const mcpServers = { ...globalConfig.mcpServers, ...conversationConfig.mcpServers };
295
297
  // The sandbox group merges at the leaf level (see mergeSandboxSettings):
296
298
  // a conversation that only sets sandbox.memory keeps the global sandbox.cpus.