@geminixiang/mikan 1.0.2 → 1.2.0

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 (97) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/dist/adapters/discord/context.js +1 -1
  3. package/dist/adapters/discord/context.js.map +1 -1
  4. package/dist/adapters/messages.d.ts +2 -0
  5. package/dist/adapters/messages.d.ts.map +1 -1
  6. package/dist/adapters/messages.js +6 -0
  7. package/dist/adapters/messages.js.map +1 -1
  8. package/dist/adapters/progressive-renderer.d.ts.map +1 -1
  9. package/dist/adapters/progressive-renderer.js +132 -147
  10. package/dist/adapters/progressive-renderer.js.map +1 -1
  11. package/dist/adapters/slack/bot.d.ts +3 -0
  12. package/dist/adapters/slack/bot.d.ts.map +1 -1
  13. package/dist/adapters/slack/bot.js +95 -34
  14. package/dist/adapters/slack/bot.js.map +1 -1
  15. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  16. package/dist/adapters/slack/response-lifecycle.js +1 -3
  17. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  18. package/dist/adapters/telegram/context.js +1 -1
  19. package/dist/adapters/telegram/context.js.map +1 -1
  20. package/dist/adapters/types.d.ts +1 -2
  21. package/dist/adapters/types.d.ts.map +1 -1
  22. package/dist/adapters/types.js.map +1 -1
  23. package/dist/env-manifest.js +1 -1
  24. package/dist/env-manifest.js.map +1 -1
  25. package/dist/events/scheduler.js +1 -1
  26. package/dist/events/scheduler.js.map +1 -1
  27. package/dist/harness/execution-env.d.ts.map +1 -1
  28. package/dist/harness/execution-env.js +82 -5
  29. package/dist/harness/execution-env.js.map +1 -1
  30. package/dist/harness/jev.d.ts +12 -11
  31. package/dist/harness/jev.d.ts.map +1 -1
  32. package/dist/harness/jev.js +67 -70
  33. package/dist/harness/jev.js.map +1 -1
  34. package/dist/harness/models.d.ts.map +1 -1
  35. package/dist/harness/models.js +36 -7
  36. package/dist/harness/models.js.map +1 -1
  37. package/dist/harness/presenter.d.ts.map +1 -1
  38. package/dist/harness/presenter.js +22 -47
  39. package/dist/harness/presenter.js.map +1 -1
  40. package/dist/harness/prompt.d.ts +1 -1
  41. package/dist/harness/prompt.d.ts.map +1 -1
  42. package/dist/harness/prompt.js +12 -15
  43. package/dist/harness/prompt.js.map +1 -1
  44. package/dist/harness/runner.d.ts.map +1 -1
  45. package/dist/harness/runner.js +10 -3
  46. package/dist/harness/runner.js.map +1 -1
  47. package/dist/harness/session.d.ts +2 -0
  48. package/dist/harness/session.d.ts.map +1 -1
  49. package/dist/harness/session.js +49 -8
  50. package/dist/harness/session.js.map +1 -1
  51. package/dist/harness/tools/index.d.ts +2 -1
  52. package/dist/harness/tools/index.d.ts.map +1 -1
  53. package/dist/harness/tools/index.js +2 -2
  54. package/dist/harness/tools/index.js.map +1 -1
  55. package/dist/harness/tools/jev-browser.d.ts +2 -1
  56. package/dist/harness/tools/jev-browser.d.ts.map +1 -1
  57. package/dist/harness/tools/jev-browser.js +18 -50
  58. package/dist/harness/tools/jev-browser.js.map +1 -1
  59. package/dist/harness/tools/jev.d.ts.map +1 -1
  60. package/dist/harness/tools/jev.js +2 -2
  61. package/dist/harness/tools/jev.js.map +1 -1
  62. package/dist/harness/tools/react.js +1 -1
  63. package/dist/harness/tools/react.js.map +1 -1
  64. package/dist/harness/tools/task.d.ts +4 -0
  65. package/dist/harness/tools/task.d.ts.map +1 -1
  66. package/dist/harness/tools/task.js +12 -0
  67. package/dist/harness/tools/task.js.map +1 -1
  68. package/dist/harness/types.d.ts +2 -0
  69. package/dist/harness/types.d.ts.map +1 -1
  70. package/dist/harness/types.js.map +1 -1
  71. package/dist/main.js +8 -2
  72. package/dist/main.js.map +1 -1
  73. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  74. package/dist/runtime/conversation-runtime.js +15 -0
  75. package/dist/runtime/conversation-runtime.js.map +1 -1
  76. package/dist/runtime/session-lifecycle.d.ts +1 -0
  77. package/dist/runtime/session-lifecycle.d.ts.map +1 -1
  78. package/dist/runtime/session-lifecycle.js +17 -1
  79. package/dist/runtime/session-lifecycle.js.map +1 -1
  80. package/dist/runtime/types.d.ts +1 -0
  81. package/dist/runtime/types.d.ts.map +1 -1
  82. package/dist/runtime/types.js.map +1 -1
  83. package/dist/sessions/session-store.d.ts +6 -1
  84. package/dist/sessions/session-store.d.ts.map +1 -1
  85. package/dist/sessions/session-store.js +103 -4
  86. package/dist/sessions/session-store.js.map +1 -1
  87. package/dist/sessions/types.d.ts +2 -0
  88. package/dist/sessions/types.d.ts.map +1 -1
  89. package/dist/sessions/types.js.map +1 -1
  90. package/dist/settings/index.d.ts +6 -0
  91. package/dist/settings/index.d.ts.map +1 -1
  92. package/dist/settings/index.js +5 -0
  93. package/dist/settings/index.js.map +1 -1
  94. package/dist/types.d.ts +7 -6
  95. package/dist/types.d.ts.map +1 -1
  96. package/dist/types.js.map +1 -1
  97. package/package.json +7 -8
@@ -1,3 +1,4 @@
1
+ import { contentText } from "@earendil-works/pi-ai";
1
2
  import { SessionStore } from "../sessions/session-store.js";
2
3
  import { CONTROL_INPUT_CUSTOM_TYPE, RUN_CAUSE_CUSTOM_TYPE, } from "../sessions/types.js";
3
4
  import { MikanAgentSession, DEFAULT_EVENT_BUDGET } from "./session.js";
@@ -20,7 +21,7 @@ import { ensureDefaultOpenConnector } from "./open-connector.js";
20
21
  import { OfficeEventStore } from "../events/index.js";
21
22
  import { addLifecycleEvent, updateActiveSpanAttribution } from "../observability/index.js";
22
23
  import { conversationIdOf, isThreadSessionKey } from "../sessions/session-key.js";
23
- import { START_TASK_TOOL, TASK_STATUS_TOOL } from "./tools/task.js";
24
+ import { isTaskRunId, START_TASK_TOOL, TASK_STATUS_TOOL } from "./tools/task.js";
24
25
  import { loadMikanSkills } from "./skills.js";
25
26
  import { buildPromptPayload, buildSystemPrompt, buildTurnInstructions, listScratchFolders, getMemory, resolveTriggerAttribution, } from "./prompt.js";
26
27
  import { attachSessionEventHandlers, activateRunPresentation, createRunState, finalizeRunResponse, getFinalAssistantText, isEventTriggerAttribution, reportUsageSummary, } from "./presenter.js";
@@ -182,7 +183,7 @@ async function prepareRunContext(params) {
182
183
  log.logInfo(`Context sizes - system: ${systemPrompt.length} chars, memory: ${memory.length} chars`);
183
184
  log.logInfo(`Channels: ${platform.channels.length}, Users: ${platform.users.length}`);
184
185
  const { userMessage, imageAttachments } = await buildPromptPayload(message, pathContext.runtimeWorkspaceRoot, pathContext, (runtimePath) => executor.readFileBase64(runtimePath));
185
- const turnInstructions = buildTurnInstructions(message.id.startsWith("event:"));
186
+ const turnInstructions = buildTurnInstructions(message.id.match(/^event:([^:]+)/)?.[1]);
186
187
  const finalUserMessage = turnInstructions ? `${turnInstructions}\n\n${userMessage}` : userMessage;
187
188
  return {
188
189
  sessionConversation,
@@ -280,7 +281,7 @@ async function runPreparedTurn(params) {
280
281
  await session.sessionStore.appendCustomEntry(RUN_CAUSE_CUSTOM_TYPE, { messageId: message.id });
281
282
  await session.prompt(prepared.userMessage, {
282
283
  allowTaskHandoff: responder.startTask !== undefined,
283
- allowTaskStatus: responder.getTaskStatus !== undefined,
284
+ allowTaskStatus: responder.getTaskStatus !== undefined && !isTaskRunId(message.id),
284
285
  images: prepared.imageAttachments.length > 0 ? prepared.imageAttachments : undefined,
285
286
  budget: isEventRun ? DEFAULT_EVENT_BUDGET : undefined,
286
287
  });
@@ -531,6 +532,12 @@ export async function createRunner(options) {
531
532
  model,
532
533
  getApiKey: () => modelRegistry.getApiKeyForProvider(model.provider),
533
534
  outputDir: office.dir,
535
+ }, async (systemPrompt, user, signal) => {
536
+ const reply = await modelRegistry.models.completeSimple(model, { systemPrompt, messages: [{ role: "user", content: user, timestamp: Date.now() }] }, { signal });
537
+ if (reply.stopReason === "error" || reply.stopReason === "aborted") {
538
+ throw new Error(reply.errorMessage ?? `Text generation ${reply.stopReason}`);
539
+ }
540
+ return contentText(reply.content);
534
541
  });
535
542
  const systemPrompt = await buildInitialSystemPrompt({
536
543
  office,
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/harness/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Office, Workspace } from \"../office/types.js\";\nimport type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport type { MikanModels } from \"./models.js\";\nimport { SessionStore } from \"../sessions/session-store.js\";\nimport {\n CONTROL_INPUT_CUSTOM_TYPE,\n RUN_CAUSE_CUSTOM_TYPE,\n type ThreadRootMessage,\n} from \"../sessions/types.js\";\nimport { MikanAgentSession, DEFAULT_EVENT_BUDGET } from \"./session.js\";\nimport { runSubagent, DEFAULT_GLOBAL_SUBAGENT_SLOTS, SubagentSlotPool } from \"./subagent.js\";\nimport { loadSubagentProfiles } from \"./subagent-profiles.js\";\nimport { createMikanTools } from \"./tools/index.js\";\nimport { createSubagentTool } from \"./tools/subagent.js\";\nimport { createHistoryTool } from \"./tools/history.js\";\nimport { adaptAgentTool } from \"./tools/pi-tools.js\";\nimport { withSecretRedaction } from \"./tools/secret-redaction.js\";\nimport { createSandboxExecutionEnv } from \"./execution-env.js\";\nimport { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n ConversationMessage,\n ConversationResponder,\n MessagingInfo,\n PlatformName,\n} from \"../types.js\";\nimport { ActorExecutionResolver } from \"./execution-resolver.js\";\nimport type { DockerContainerManager } from \"../sandbox/provisioner.js\";\nimport {\n warnUnenforcedPrivateOffice,\n createExecutor,\n getUnresolvedSandboxPathContext,\n} from \"../sandbox/registry.js\";\nimport type { Executor, RuntimePathContext, SandboxConfig } from \"../sandbox/types.js\";\nimport type { VaultManager } from \"../vault/types.js\";\nimport { resolveWorkspaceProjection } from \"../office/projection.js\";\nimport type {\n RunnerExecutionContext,\n PlatformToolRoles,\n PreparedRunContext,\n RunPresentation,\n RunEventListener,\n RunnerSessionState,\n MikanToolContext,\n} from \"./types.js\";\nimport type { CreateRunnerOptions, PiAgentWrapper } from \"../types.js\";\nimport { createHash } from \"node:crypto\";\nimport { loadSkillPatterns, resolveConversationSettings } from \"../settings/index.js\";\nimport { ensureDefaultOpenConnector } from \"./open-connector.js\";\nimport { OfficeEventStore } from \"../events/index.js\";\nimport { addLifecycleEvent, updateActiveSpanAttribution } from \"../observability/index.js\";\nimport type { ChatHistorySync } from \"../sessions/chat-history-sync.js\";\nimport { conversationIdOf, isThreadSessionKey } from \"../sessions/session-key.js\";\nimport type { PlatformToolPack } from \"./tools/types.js\";\nimport { START_TASK_TOOL, TASK_STATUS_TOOL } from \"./tools/task.js\";\nimport { loadMikanSkills } from \"./skills.js\";\nimport {\n buildPromptPayload,\n buildSystemPrompt,\n buildTurnInstructions,\n listScratchFolders,\n getMemory,\n resolveTriggerAttribution,\n} from \"./prompt.js\";\nimport {\n attachSessionEventHandlers,\n activateRunPresentation,\n createRunState,\n finalizeRunResponse,\n getFinalAssistantText,\n isEventTriggerAttribution,\n reportUsageSummary,\n} from \"./presenter.js\";\n\nimport * as log from \"../log.js\";\nimport { errorMessage } from \"../unknown-values.js\";\n\nconst globalSubagentSlots = new SubagentSlotPool(DEFAULT_GLOBAL_SUBAGENT_SLOTS);\n\nasync function createConfiguredAgentSession(params: {\n workspaceDir: string;\n systemPrompt: string;\n model: Model<Api>;\n thinkingLevel: ThinkingLevel;\n tools: Awaited<ReturnType<typeof createMikanTools>>[\"tools\"];\n toolContext: MikanToolContext;\n sessionStore: SessionStore;\n models: MikanModels;\n}): Promise<MikanAgentSession> {\n const {\n workspaceDir,\n systemPrompt,\n model,\n thinkingLevel,\n tools,\n toolContext,\n sessionStore,\n models,\n } = params;\n const loadedProfiles = loadSubagentProfiles(workspaceDir);\n for (const diagnostic of loadedProfiles.diagnostics) {\n log.logWarning(`Subagent profile ignored: ${diagnostic.path}`, diagnostic.message);\n }\n\n const availableToolNames = new Set(tools.map((tool) => tool.name));\n const runnableProfiles = new Map(\n [...loadedProfiles.profiles].filter(([, profile]) =>\n profile.tools.every((tool) => availableToolNames.has(tool)),\n ),\n );\n let session: MikanAgentSession | undefined;\n const subagentTool = createSubagentTool(\n async (request, hooks) =>\n runSubagent({\n request,\n onActivity: hooks?.onActivity,\n defaultModel: model,\n thinkingLevel,\n models,\n availableTools: tools.filter(\n (tool) => ![START_TASK_TOOL, TASK_STATUS_TOOL].includes(tool.name),\n ),\n profiles: runnableProfiles,\n slots: globalSubagentSlots,\n toolContext,\n parentEntries: await session!.sessionStore.getContextEntries(),\n onUsage: session!.captureExternalUsageSink(),\n }),\n runnableProfiles,\n );\n\n session = new MikanAgentSession({\n systemPrompt,\n model,\n thinkingLevel,\n tools: [...tools, adaptAgentTool(subagentTool)],\n toolContext,\n models,\n sessionStore,\n });\n return session;\n}\n\nfunction createRunnerExecutionContext(\n sandboxConfig: SandboxConfig,\n vaultManager: VaultManager | undefined,\n provisioner: DockerContainerManager | undefined,\n workspace: Workspace,\n): RunnerExecutionContext {\n const executionResolver =\n vaultManager && sandboxConfig.type !== \"host\"\n ? new ActorExecutionResolver(sandboxConfig, vaultManager, provisioner, workspace)\n : undefined;\n\n let activeExecutor: Executor =\n executionResolver !== undefined\n ? createExecutor({ type: \"host\" })\n : createExecutor(sandboxConfig);\n const executor: Executor = {\n exec(command, options) {\n return activeExecutor.exec(command, options);\n },\n readFile(path, options) {\n return activeExecutor.readFile(path, options);\n },\n readFileBase64(path, options) {\n return activeExecutor.readFileBase64(path, options);\n },\n writeFile(path, content, options) {\n return activeExecutor.writeFile(path, content, options);\n },\n getWorkspacePath(hostPath) {\n return activeExecutor.getWorkspacePath(hostPath);\n },\n getSandboxConfig() {\n return activeExecutor.getSandboxConfig();\n },\n getPathContext(hostWorkspaceRoot) {\n return activeExecutor.getPathContext(hostWorkspaceRoot);\n },\n };\n\n return {\n executor,\n async resolveForRun(context) {\n if (executionResolver) {\n const decision = await executionResolver.resolve(context);\n activeExecutor = decision.executor;\n return {\n pathContext: decision.pathContext,\n projection: decision.projection,\n };\n }\n\n const office = workspace.office(context.address);\n return {\n pathContext: executor.getPathContext(workspace.root),\n projection: resolveWorkspaceProjection(office),\n };\n },\n };\n}\n\nconst THREAD_SESSION_NAME_MAX_CHARS = 80;\n\nfunction buildThreadSessionName(message: ThreadRootMessage | null): string | undefined {\n const firstLine = message?.text\n ?.split(\"\\n\")\n .map((line) => line.trim())\n .find(Boolean);\n if (!firstLine) return undefined;\n const chars = Array.from(firstLine);\n const title =\n chars.length > THREAD_SESSION_NAME_MAX_CHARS\n ? `${chars.slice(0, THREAD_SESSION_NAME_MAX_CHARS).join(\"\")}…`\n : firstLine;\n const userLabel = message?.userName || message?.user || \"unknown\";\n return `[${userLabel}]: ${title}`;\n}\n\nasync function ensureDefaultMcpServers(options: {\n office: Office;\n trustModel: CreateRunnerOptions[\"trustModel\"];\n platformWorkspaceId?: string;\n openConnector?: CreateRunnerOptions[\"openConnector\"];\n signal?: AbortSignal;\n}): Promise<void> {\n if (options.trustModel === \"open-trigger\") return;\n try {\n await ensureDefaultOpenConnector({\n office: options.office,\n platformWorkspaceId: options.platformWorkspaceId,\n defaultServer: options.openConnector,\n signal: options.signal,\n });\n } catch (error) {\n options.signal?.throwIfAborted();\n log.logWarning(\n `[${options.office.address.conversationId}] OpenConnector default provisioning failed`,\n errorMessage(error),\n );\n }\n}\n\ninterface PrepareRunParams {\n message: ConversationMessage;\n responder: ConversationResponder;\n platform: MessagingInfo;\n office: Office;\n executor: Executor;\n resolveForRun: RunnerExecutionContext[\"resolveForRun\"];\n session: MikanAgentSession;\n bindTools: ReturnType<typeof createMikanTools>[\"bindRun\"];\n}\n\ninterface 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 } = decision;\n const memory = getMemory(projection);\n const conversationSkillLoad = loadMikanSkills(\n office,\n pathContext.runtimeWorkspaceRoot,\n projection,\n loadSkillPatterns(office),\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 scratch: listScratchFolders(office),\n });\n session.setSystemPrompt(systemPrompt);\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\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 params.bindTools({\n message,\n responder: params.responder,\n platformName: platform.name,\n runtimeWorkspaceRoot: pathContext.runtimeWorkspaceRoot,\n });\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(message.id.startsWith(\"event:\"));\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 = getMemory(projection);\n const { skills, skippedSkillLinks } = loadMikanSkills(\n office,\n pathContext.runtimeWorkspaceRoot,\n projection,\n loadSkillPatterns(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 scratch: listScratchFolders(office),\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 office: Office;\n sessionKey: string;\n threadRootMessage: ThreadRootMessage | null;\n}) {\n const { office, sessionKey, threadRootMessage } = params;\n const sessionManager = await SessionStore.open(office, sessionKey);\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 toolContext: MikanToolContext;\n sessionManager: SessionStore;\n modelRegistry: MikanModels;\n conversationId: string;\n signal?: AbortSignal;\n}) {\n const {\n workspaceDir,\n systemPrompt,\n model,\n agentConfig,\n tools,\n toolContext,\n sessionManager,\n modelRegistry,\n signal,\n } = params;\n const mcpTools = await sessionManager.connectMcp(agentConfig.mcpServers ?? {}, signal);\n return createConfiguredAgentSession({\n workspaceDir,\n systemPrompt,\n model,\n thinkingLevel: agentConfig.thinkingLevel,\n tools: [...tools, ...mcpTools.map(withSecretRedaction)],\n toolContext,\n sessionStore: sessionManager,\n models: modelRegistry,\n });\n}\n\ninterface 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 office: Office;\n sessionView: CreateRunnerOptions[\"sessionView\"];\n}\n\nasync function runPreparedTurn(params: PreparedTurnParams): Promise<{\n stopReason: string;\n errorMessage?: string;\n finalText: 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 office,\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: model.id,\n channel_id: prepared.sessionConversation,\n session_id: sessionUuid,\n \"mikan.input.message_count\": 1,\n \"mikan.input.characters\": prepared.userMessage.length,\n \"mikan.input.attachment_count\": message.attachments?.length ?? 0,\n \"mikan.input.image_count\": prepared.imageAttachments.length,\n \"mikan.input.has_text\": prepared.userMessage.length > 0,\n });\n addLifecycleEvent(\"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\n const isEventRun = message.id.startsWith(\"event:\");\n await session.sessionStore.appendCustomEntry(RUN_CAUSE_CUSTOM_TYPE, { messageId: message.id });\n await session.prompt(prepared.userMessage, {\n allowTaskHandoff: responder.startTask !== undefined,\n allowTaskStatus: responder.getTaskStatus !== undefined,\n images: prepared.imageAttachments.length > 0 ? prepared.imageAttachments : undefined,\n budget: isEventRun ? DEFAULT_EVENT_BUDGET : undefined,\n });\n await presentation.wait();\n if (session.getLastRunStats().status === \"aborted\") runState.stopReason = \"aborted\";\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 office,\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 initialTask: message.id.startsWith(\"task:\"),\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 sessionConversation: prepared.sessionConversation,\n sessionUuid,\n waitForQueue: presentation.wait,\n });\n return {\n stopReason: runState.stopReason,\n errorMessage: runState.errorMessage,\n finalText: getFinalAssistantText(session),\n };\n}\n\ntype MikanToolBindings = ReturnType<typeof createMikanTools>;\n\ninterface RunnerInterfaceParams {\n conversationId: string;\n sessionKey: string;\n office: Office;\n sessionUuid: string;\n sessionView: CreateRunnerOptions[\"sessionView\"];\n runEvents: CreateRunnerOptions[\"runEvents\"];\n runState: RunnerSessionState;\n executor: Executor;\n resolveForRun: RunnerExecutionContext[\"resolveForRun\"];\n session: MikanAgentSession;\n model: Model<Api>;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n sessionManager: SessionStore;\n chatSessionManager: ChatHistorySync;\n toolBindings: MikanToolBindings;\n}\n\nasync function steerRun(\n session: MikanAgentSession,\n activeMessage: ConversationMessage | undefined,\n message: ConversationMessage,\n): Promise<boolean> {\n if (!activeMessage) return false;\n await session.sessionStore.appendCustomEntry(CONTROL_INPUT_CUSTOM_TYPE, {\n messageId: message.id,\n });\n if (!session.isActiveRun)\n throw new Error(\"Task is preparing or settling. Please retry this update shortly.\");\n if (message.userId !== activeMessage.userId)\n throw new Error(\"Only the task's current actor can guide this run.\");\n if (message.attachments?.length)\n throw new Error(\"Stop the task before continuing with new attachments.\");\n if (!(await session.steer(`[${message.userName ?? message.userId}]: ${message.text}`))) {\n throw new Error(\"Task settled while receiving this update. Please send it again to continue.\");\n }\n return true;\n}\n\nasync function publishRunLifecycle<T>(\n publish: RunEventListener | undefined,\n message: ConversationMessage,\n run: () => Promise<T>,\n): Promise<T> {\n publish?.({\n type: \"run_started\",\n userName: message.userName ?? message.userId,\n text: message.text,\n });\n try {\n return await run();\n } finally {\n publish?.({ type: \"run_ended\" });\n }\n}\n\nfunction prepareRunnerTurn(\n params: RunnerInterfaceParams,\n message: ConversationMessage,\n responder: ConversationResponder,\n platform: MessagingInfo,\n): ReturnType<typeof prepareRunContext> {\n const { office, executor, resolveForRun, session, toolBindings } = params;\n return prepareRunContext({\n message,\n responder,\n platform,\n office,\n executor,\n resolveForRun,\n session,\n bindTools: toolBindings.bindRun,\n });\n}\n\nfunction createRunnerInterface(params: RunnerInterfaceParams): PiAgentWrapper {\n const {\n conversationId,\n sessionKey,\n office,\n sessionUuid,\n sessionView,\n runEvents,\n runState,\n session,\n model,\n agentConfig,\n sessionManager,\n chatSessionManager,\n } = params;\n const publishRunEvent: RunEventListener | undefined = runEvents\n ? (event) => runEvents.publish(office.address, sessionKey, event)\n : undefined;\n let activeMessage: ConversationMessage | undefined;\n let stopped = false;\n return {\n steer: (message) => steerRun(session, activeMessage, message),\n async syncChatHistory(currentMessageId?: string): Promise<void> {\n await chatSessionManager.syncSessionManager({\n office,\n sessionKey,\n sessionManager,\n currentMessageId,\n });\n },\n\n async run(message, responder, platform) {\n activeMessage = message;\n stopped = false;\n let presentation: RunPresentation | undefined;\n return publishRunLifecycle(publishRunEvent, message, async () => {\n try {\n const prepared = await prepareRunnerTurn(params, message, responder, platform);\n if (stopped) return { stopReason: \"aborted\" };\n presentation = activateRunPresentation(runState, {\n responder,\n sessionConversation: prepared.sessionConversation,\n userName: message.userName,\n sessionUuid,\n triggerAttribution: prepared.triggerAttribution,\n publishRunEvent,\n });\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 office,\n sessionView,\n });\n } finally {\n activeMessage = undefined;\n presentation?.dispose();\n }\n });\n },\n\n abort(): void {\n stopped = true;\n session.abort();\n },\n\n async dispose(): Promise<void> {\n await sessionManager.close();\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 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: SessionStore;\n toolBindings: MikanToolBindings;\n platformToolRoles: PlatformToolRoles;\n toolContext: MikanToolContext;\n}): Promise<PiAgentWrapper> {\n const {\n options,\n conversationId,\n workspaceDir,\n executor,\n resolveForRun,\n model,\n modelRegistry,\n agentConfig,\n systemPrompt,\n sessionManager,\n toolBindings,\n platformToolRoles,\n toolContext,\n } = params;\n const { sessionKey, office, sessionView, chatHistory, runEvents } = options;\n try {\n const sessionUuid = sessionManager.getSessionId();\n const session = await createRunnerAgentSession({\n workspaceDir,\n systemPrompt,\n model,\n agentConfig,\n tools: [\n ...toolBindings.tools,\n withSecretRedaction(adaptAgentTool(createHistoryTool({ office, sessionKey }))),\n ],\n toolContext,\n sessionManager,\n modelRegistry,\n conversationId,\n signal: options.signal,\n });\n options.signal?.throwIfAborted();\n\n const runState = createRunState();\n attachSessionEventHandlers({ session, runState, model, agentConfig, platformToolRoles });\n\n return createRunnerInterface({\n conversationId,\n sessionKey,\n office,\n sessionUuid,\n sessionView,\n runEvents,\n runState,\n executor,\n resolveForRun,\n session,\n model,\n agentConfig,\n sessionManager,\n chatSessionManager: chatHistory,\n toolBindings,\n });\n } catch (error) {\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 workspaceDir = office.workspace.root;\n await ensureDefaultMcpServers({\n office,\n trustModel,\n platformWorkspaceId: options.platformWorkspaceId,\n openConnector: options.openConnector,\n signal: options.signal,\n });\n options.signal?.throwIfAborted();\n const resolvedAgentConfig = resolveConversationSettings(office);\n const agentConfig = {\n ...resolvedAgentConfig,\n mcpServers: trustModel === \"open-trigger\" ? {} : (resolvedAgentConfig.mcpServers ?? {}),\n };\n\n const projection = resolveWorkspaceProjection(office);\n warnUnenforcedPrivateOffice(sandboxConfig, projection.visibility, office.key);\n const { executor, resolveForRun } = createRunnerExecutionContext(\n sandboxConfig,\n vaultManager,\n provisioner,\n office.workspace,\n );\n const pathContext = getUnresolvedSandboxPathContext(sandboxConfig, workspaceDir);\n const toolContext: MikanToolContext = {\n env: createSandboxExecutionEnv(executor, sandboxConfig.type, pathContext.runtimeWorkspaceRoot),\n };\n\n const modelRegistry = options.models;\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 const platformToolPacks = (platformToolPackFactories ?? []).map((createPack) => createPack());\n const toolBindings = createMikanTools(\n executor,\n new OfficeEventStore(office, options.eventScheduler),\n { sandbox: sandboxConfig, resourceController: resourceController ?? provisioner },\n platformToolPacks,\n {\n model,\n getApiKey: () => modelRegistry.getApiKeyForProvider(model.provider),\n outputDir: office.dir,\n },\n );\n\n const systemPrompt = await buildInitialSystemPrompt({\n office,\n pathContext,\n projection,\n sandboxConfig,\n });\n options.signal?.throwIfAborted();\n const { threadRootMessage } = sessionScope;\n const sessionManager = await openRunnerSessionManager({\n office,\n sessionKey,\n threadRootMessage,\n });\n return finishRunnerCreation({\n options,\n conversationId,\n workspaceDir,\n executor,\n resolveForRun,\n model,\n modelRegistry,\n agentConfig,\n systemPrompt,\n sessionManager,\n toolBindings,\n platformToolRoles: collectPlatformToolRoles(platformToolPacks),\n toolContext,\n });\n}\n\nfunction collectPlatformToolRoles(packs: readonly PlatformToolPack[]): PlatformToolRoles {\n return {\n platformTools: new Set(packs.flatMap((pack) => pack.tools.map((tool) => tool.name))),\n finalResponseTools: new Set(packs.flatMap((pack) => pack.finalResponseTools ?? [])),\n };\n}\n"]}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/harness/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Office, Workspace } from \"../office/types.js\";\nimport type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { contentText, type Api, type Model } from \"@earendil-works/pi-ai\";\nimport type { MikanModels } from \"./models.js\";\nimport { SessionStore } from \"../sessions/session-store.js\";\nimport {\n CONTROL_INPUT_CUSTOM_TYPE,\n RUN_CAUSE_CUSTOM_TYPE,\n type ThreadRootMessage,\n} from \"../sessions/types.js\";\nimport { MikanAgentSession, DEFAULT_EVENT_BUDGET } from \"./session.js\";\nimport { runSubagent, DEFAULT_GLOBAL_SUBAGENT_SLOTS, SubagentSlotPool } from \"./subagent.js\";\nimport { loadSubagentProfiles } from \"./subagent-profiles.js\";\nimport { createMikanTools } from \"./tools/index.js\";\nimport { createSubagentTool } from \"./tools/subagent.js\";\nimport { createHistoryTool } from \"./tools/history.js\";\nimport { adaptAgentTool } from \"./tools/pi-tools.js\";\nimport { withSecretRedaction } from \"./tools/secret-redaction.js\";\nimport { createSandboxExecutionEnv } from \"./execution-env.js\";\nimport { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n ConversationMessage,\n ConversationResponder,\n MessagingInfo,\n PlatformName,\n} from \"../types.js\";\nimport { ActorExecutionResolver } from \"./execution-resolver.js\";\nimport type { DockerContainerManager } from \"../sandbox/provisioner.js\";\nimport {\n warnUnenforcedPrivateOffice,\n createExecutor,\n getUnresolvedSandboxPathContext,\n} from \"../sandbox/registry.js\";\nimport type { Executor, RuntimePathContext, SandboxConfig } from \"../sandbox/types.js\";\nimport type { VaultManager } from \"../vault/types.js\";\nimport { resolveWorkspaceProjection } from \"../office/projection.js\";\nimport type {\n RunnerExecutionContext,\n PlatformToolRoles,\n PreparedRunContext,\n RunPresentation,\n RunEventListener,\n RunnerSessionState,\n MikanToolContext,\n} from \"./types.js\";\nimport type { CreateRunnerOptions, PiAgentWrapper } from \"../types.js\";\nimport { createHash } from \"node:crypto\";\nimport { loadSkillPatterns, resolveConversationSettings } from \"../settings/index.js\";\nimport { ensureDefaultOpenConnector } from \"./open-connector.js\";\nimport { OfficeEventStore } from \"../events/index.js\";\nimport { addLifecycleEvent, updateActiveSpanAttribution } from \"../observability/index.js\";\nimport type { ChatHistorySync } from \"../sessions/chat-history-sync.js\";\nimport { conversationIdOf, isThreadSessionKey } from \"../sessions/session-key.js\";\nimport type { PlatformToolPack } from \"./tools/types.js\";\nimport { isTaskRunId, START_TASK_TOOL, TASK_STATUS_TOOL } from \"./tools/task.js\";\nimport { loadMikanSkills } from \"./skills.js\";\nimport {\n buildPromptPayload,\n buildSystemPrompt,\n buildTurnInstructions,\n listScratchFolders,\n getMemory,\n resolveTriggerAttribution,\n} from \"./prompt.js\";\nimport {\n attachSessionEventHandlers,\n activateRunPresentation,\n createRunState,\n finalizeRunResponse,\n getFinalAssistantText,\n isEventTriggerAttribution,\n reportUsageSummary,\n} from \"./presenter.js\";\n\nimport * as log from \"../log.js\";\nimport { errorMessage } from \"../unknown-values.js\";\n\nconst globalSubagentSlots = new SubagentSlotPool(DEFAULT_GLOBAL_SUBAGENT_SLOTS);\n\nasync function createConfiguredAgentSession(params: {\n workspaceDir: string;\n systemPrompt: string;\n model: Model<Api>;\n thinkingLevel: ThinkingLevel;\n tools: Awaited<ReturnType<typeof createMikanTools>>[\"tools\"];\n toolContext: MikanToolContext;\n sessionStore: SessionStore;\n models: MikanModels;\n}): Promise<MikanAgentSession> {\n const {\n workspaceDir,\n systemPrompt,\n model,\n thinkingLevel,\n tools,\n toolContext,\n sessionStore,\n models,\n } = params;\n const loadedProfiles = loadSubagentProfiles(workspaceDir);\n for (const diagnostic of loadedProfiles.diagnostics) {\n log.logWarning(`Subagent profile ignored: ${diagnostic.path}`, diagnostic.message);\n }\n\n const availableToolNames = new Set(tools.map((tool) => tool.name));\n const runnableProfiles = new Map(\n [...loadedProfiles.profiles].filter(([, profile]) =>\n profile.tools.every((tool) => availableToolNames.has(tool)),\n ),\n );\n let session: MikanAgentSession | undefined;\n const subagentTool = createSubagentTool(\n async (request, hooks) =>\n runSubagent({\n request,\n onActivity: hooks?.onActivity,\n defaultModel: model,\n thinkingLevel,\n models,\n availableTools: tools.filter(\n (tool) => ![START_TASK_TOOL, TASK_STATUS_TOOL].includes(tool.name),\n ),\n profiles: runnableProfiles,\n slots: globalSubagentSlots,\n toolContext,\n parentEntries: await session!.sessionStore.getContextEntries(),\n onUsage: session!.captureExternalUsageSink(),\n }),\n runnableProfiles,\n );\n\n session = new MikanAgentSession({\n systemPrompt,\n model,\n thinkingLevel,\n tools: [...tools, adaptAgentTool(subagentTool)],\n toolContext,\n models,\n sessionStore,\n });\n return session;\n}\n\nfunction createRunnerExecutionContext(\n sandboxConfig: SandboxConfig,\n vaultManager: VaultManager | undefined,\n provisioner: DockerContainerManager | undefined,\n workspace: Workspace,\n): RunnerExecutionContext {\n const executionResolver =\n vaultManager && sandboxConfig.type !== \"host\"\n ? new ActorExecutionResolver(sandboxConfig, vaultManager, provisioner, workspace)\n : undefined;\n\n let activeExecutor: Executor =\n executionResolver !== undefined\n ? createExecutor({ type: \"host\" })\n : createExecutor(sandboxConfig);\n const executor: Executor = {\n exec(command, options) {\n return activeExecutor.exec(command, options);\n },\n readFile(path, options) {\n return activeExecutor.readFile(path, options);\n },\n readFileBase64(path, options) {\n return activeExecutor.readFileBase64(path, options);\n },\n writeFile(path, content, options) {\n return activeExecutor.writeFile(path, content, options);\n },\n getWorkspacePath(hostPath) {\n return activeExecutor.getWorkspacePath(hostPath);\n },\n getSandboxConfig() {\n return activeExecutor.getSandboxConfig();\n },\n getPathContext(hostWorkspaceRoot) {\n return activeExecutor.getPathContext(hostWorkspaceRoot);\n },\n };\n\n return {\n executor,\n async resolveForRun(context) {\n if (executionResolver) {\n const decision = await executionResolver.resolve(context);\n activeExecutor = decision.executor;\n return {\n pathContext: decision.pathContext,\n projection: decision.projection,\n };\n }\n\n const office = workspace.office(context.address);\n return {\n pathContext: executor.getPathContext(workspace.root),\n projection: resolveWorkspaceProjection(office),\n };\n },\n };\n}\n\nconst THREAD_SESSION_NAME_MAX_CHARS = 80;\n\nfunction buildThreadSessionName(message: ThreadRootMessage | null): string | undefined {\n const firstLine = message?.text\n ?.split(\"\\n\")\n .map((line) => line.trim())\n .find(Boolean);\n if (!firstLine) return undefined;\n const chars = Array.from(firstLine);\n const title =\n chars.length > THREAD_SESSION_NAME_MAX_CHARS\n ? `${chars.slice(0, THREAD_SESSION_NAME_MAX_CHARS).join(\"\")}…`\n : firstLine;\n const userLabel = message?.userName || message?.user || \"unknown\";\n return `[${userLabel}]: ${title}`;\n}\n\nasync function ensureDefaultMcpServers(options: {\n office: Office;\n trustModel: CreateRunnerOptions[\"trustModel\"];\n platformWorkspaceId?: string;\n openConnector?: CreateRunnerOptions[\"openConnector\"];\n signal?: AbortSignal;\n}): Promise<void> {\n if (options.trustModel === \"open-trigger\") return;\n try {\n await ensureDefaultOpenConnector({\n office: options.office,\n platformWorkspaceId: options.platformWorkspaceId,\n defaultServer: options.openConnector,\n signal: options.signal,\n });\n } catch (error) {\n options.signal?.throwIfAborted();\n log.logWarning(\n `[${options.office.address.conversationId}] OpenConnector default provisioning failed`,\n errorMessage(error),\n );\n }\n}\n\ninterface PrepareRunParams {\n message: ConversationMessage;\n responder: ConversationResponder;\n platform: MessagingInfo;\n office: Office;\n executor: Executor;\n resolveForRun: RunnerExecutionContext[\"resolveForRun\"];\n session: MikanAgentSession;\n bindTools: ReturnType<typeof createMikanTools>[\"bindRun\"];\n}\n\ninterface 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 } = decision;\n const memory = getMemory(projection);\n const conversationSkillLoad = loadMikanSkills(\n office,\n pathContext.runtimeWorkspaceRoot,\n projection,\n loadSkillPatterns(office),\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 scratch: listScratchFolders(office),\n });\n session.setSystemPrompt(systemPrompt);\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\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 params.bindTools({\n message,\n responder: params.responder,\n platformName: platform.name,\n runtimeWorkspaceRoot: pathContext.runtimeWorkspaceRoot,\n });\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(message.id.match(/^event:([^:]+)/)?.[1]);\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 = getMemory(projection);\n const { skills, skippedSkillLinks } = loadMikanSkills(\n office,\n pathContext.runtimeWorkspaceRoot,\n projection,\n loadSkillPatterns(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 scratch: listScratchFolders(office),\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 office: Office;\n sessionKey: string;\n threadRootMessage: ThreadRootMessage | null;\n}) {\n const { office, sessionKey, threadRootMessage } = params;\n const sessionManager = await SessionStore.open(office, sessionKey);\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 toolContext: MikanToolContext;\n sessionManager: SessionStore;\n modelRegistry: MikanModels;\n conversationId: string;\n signal?: AbortSignal;\n}) {\n const {\n workspaceDir,\n systemPrompt,\n model,\n agentConfig,\n tools,\n toolContext,\n sessionManager,\n modelRegistry,\n signal,\n } = params;\n const mcpTools = await sessionManager.connectMcp(agentConfig.mcpServers ?? {}, signal);\n return createConfiguredAgentSession({\n workspaceDir,\n systemPrompt,\n model,\n thinkingLevel: agentConfig.thinkingLevel,\n tools: [...tools, ...mcpTools.map(withSecretRedaction)],\n toolContext,\n sessionStore: sessionManager,\n models: modelRegistry,\n });\n}\n\ninterface 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 office: Office;\n sessionView: CreateRunnerOptions[\"sessionView\"];\n}\n\nasync function runPreparedTurn(params: PreparedTurnParams): Promise<{\n stopReason: string;\n errorMessage?: string;\n finalText: 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 office,\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: model.id,\n channel_id: prepared.sessionConversation,\n session_id: sessionUuid,\n \"mikan.input.message_count\": 1,\n \"mikan.input.characters\": prepared.userMessage.length,\n \"mikan.input.attachment_count\": message.attachments?.length ?? 0,\n \"mikan.input.image_count\": prepared.imageAttachments.length,\n \"mikan.input.has_text\": prepared.userMessage.length > 0,\n });\n addLifecycleEvent(\"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\n const isEventRun = message.id.startsWith(\"event:\");\n await session.sessionStore.appendCustomEntry(RUN_CAUSE_CUSTOM_TYPE, { messageId: message.id });\n await session.prompt(prepared.userMessage, {\n allowTaskHandoff: responder.startTask !== undefined,\n allowTaskStatus: responder.getTaskStatus !== undefined && !isTaskRunId(message.id),\n images: prepared.imageAttachments.length > 0 ? prepared.imageAttachments : undefined,\n budget: isEventRun ? DEFAULT_EVENT_BUDGET : undefined,\n });\n await presentation.wait();\n if (session.getLastRunStats().status === \"aborted\") runState.stopReason = \"aborted\";\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 office,\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 initialTask: message.id.startsWith(\"task:\"),\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 sessionConversation: prepared.sessionConversation,\n sessionUuid,\n waitForQueue: presentation.wait,\n });\n return {\n stopReason: runState.stopReason,\n errorMessage: runState.errorMessage,\n finalText: getFinalAssistantText(session),\n };\n}\n\ntype MikanToolBindings = ReturnType<typeof createMikanTools>;\n\ninterface RunnerInterfaceParams {\n conversationId: string;\n sessionKey: string;\n office: Office;\n sessionUuid: string;\n sessionView: CreateRunnerOptions[\"sessionView\"];\n runEvents: CreateRunnerOptions[\"runEvents\"];\n runState: RunnerSessionState;\n executor: Executor;\n resolveForRun: RunnerExecutionContext[\"resolveForRun\"];\n session: MikanAgentSession;\n model: Model<Api>;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n sessionManager: SessionStore;\n chatSessionManager: ChatHistorySync;\n toolBindings: MikanToolBindings;\n}\n\nasync function steerRun(\n session: MikanAgentSession,\n activeMessage: ConversationMessage | undefined,\n message: ConversationMessage,\n): Promise<boolean> {\n if (!activeMessage) return false;\n await session.sessionStore.appendCustomEntry(CONTROL_INPUT_CUSTOM_TYPE, {\n messageId: message.id,\n });\n if (!session.isActiveRun)\n throw new Error(\"Task is preparing or settling. Please retry this update shortly.\");\n if (message.userId !== activeMessage.userId)\n throw new Error(\"Only the task's current actor can guide this run.\");\n if (message.attachments?.length)\n throw new Error(\"Stop the task before continuing with new attachments.\");\n if (!(await session.steer(`[${message.userName ?? message.userId}]: ${message.text}`))) {\n throw new Error(\"Task settled while receiving this update. Please send it again to continue.\");\n }\n return true;\n}\n\nasync function publishRunLifecycle<T>(\n publish: RunEventListener | undefined,\n message: ConversationMessage,\n run: () => Promise<T>,\n): Promise<T> {\n publish?.({\n type: \"run_started\",\n userName: message.userName ?? message.userId,\n text: message.text,\n });\n try {\n return await run();\n } finally {\n publish?.({ type: \"run_ended\" });\n }\n}\n\nfunction prepareRunnerTurn(\n params: RunnerInterfaceParams,\n message: ConversationMessage,\n responder: ConversationResponder,\n platform: MessagingInfo,\n): ReturnType<typeof prepareRunContext> {\n const { office, executor, resolveForRun, session, toolBindings } = params;\n return prepareRunContext({\n message,\n responder,\n platform,\n office,\n executor,\n resolveForRun,\n session,\n bindTools: toolBindings.bindRun,\n });\n}\n\nfunction createRunnerInterface(params: RunnerInterfaceParams): PiAgentWrapper {\n const {\n conversationId,\n sessionKey,\n office,\n sessionUuid,\n sessionView,\n runEvents,\n runState,\n session,\n model,\n agentConfig,\n sessionManager,\n chatSessionManager,\n } = params;\n const publishRunEvent: RunEventListener | undefined = runEvents\n ? (event) => runEvents.publish(office.address, sessionKey, event)\n : undefined;\n let activeMessage: ConversationMessage | undefined;\n let stopped = false;\n return {\n steer: (message) => steerRun(session, activeMessage, message),\n async syncChatHistory(currentMessageId?: string): Promise<void> {\n await chatSessionManager.syncSessionManager({\n office,\n sessionKey,\n sessionManager,\n currentMessageId,\n });\n },\n\n async run(message, responder, platform) {\n activeMessage = message;\n stopped = false;\n let presentation: RunPresentation | undefined;\n return publishRunLifecycle(publishRunEvent, message, async () => {\n try {\n const prepared = await prepareRunnerTurn(params, message, responder, platform);\n if (stopped) return { stopReason: \"aborted\" };\n presentation = activateRunPresentation(runState, {\n responder,\n sessionConversation: prepared.sessionConversation,\n userName: message.userName,\n sessionUuid,\n triggerAttribution: prepared.triggerAttribution,\n publishRunEvent,\n });\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 office,\n sessionView,\n });\n } finally {\n activeMessage = undefined;\n presentation?.dispose();\n }\n });\n },\n\n abort(): void {\n stopped = true;\n session.abort();\n },\n\n async dispose(): Promise<void> {\n await sessionManager.close();\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 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: SessionStore;\n toolBindings: MikanToolBindings;\n platformToolRoles: PlatformToolRoles;\n toolContext: MikanToolContext;\n}): Promise<PiAgentWrapper> {\n const {\n options,\n conversationId,\n workspaceDir,\n executor,\n resolveForRun,\n model,\n modelRegistry,\n agentConfig,\n systemPrompt,\n sessionManager,\n toolBindings,\n platformToolRoles,\n toolContext,\n } = params;\n const { sessionKey, office, sessionView, chatHistory, runEvents } = options;\n try {\n const sessionUuid = sessionManager.getSessionId();\n const session = await createRunnerAgentSession({\n workspaceDir,\n systemPrompt,\n model,\n agentConfig,\n tools: [\n ...toolBindings.tools,\n withSecretRedaction(adaptAgentTool(createHistoryTool({ office, sessionKey }))),\n ],\n toolContext,\n sessionManager,\n modelRegistry,\n conversationId,\n signal: options.signal,\n });\n options.signal?.throwIfAborted();\n\n const runState = createRunState();\n attachSessionEventHandlers({ session, runState, model, agentConfig, platformToolRoles });\n\n return createRunnerInterface({\n conversationId,\n sessionKey,\n office,\n sessionUuid,\n sessionView,\n runEvents,\n runState,\n executor,\n resolveForRun,\n session,\n model,\n agentConfig,\n sessionManager,\n chatSessionManager: chatHistory,\n toolBindings,\n });\n } catch (error) {\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 workspaceDir = office.workspace.root;\n await ensureDefaultMcpServers({\n office,\n trustModel,\n platformWorkspaceId: options.platformWorkspaceId,\n openConnector: options.openConnector,\n signal: options.signal,\n });\n options.signal?.throwIfAborted();\n const resolvedAgentConfig = resolveConversationSettings(office);\n const agentConfig = {\n ...resolvedAgentConfig,\n mcpServers: trustModel === \"open-trigger\" ? {} : (resolvedAgentConfig.mcpServers ?? {}),\n };\n\n const projection = resolveWorkspaceProjection(office);\n warnUnenforcedPrivateOffice(sandboxConfig, projection.visibility, office.key);\n const { executor, resolveForRun } = createRunnerExecutionContext(\n sandboxConfig,\n vaultManager,\n provisioner,\n office.workspace,\n );\n const pathContext = getUnresolvedSandboxPathContext(sandboxConfig, workspaceDir);\n const toolContext: MikanToolContext = {\n env: createSandboxExecutionEnv(executor, sandboxConfig.type, pathContext.runtimeWorkspaceRoot),\n };\n\n const modelRegistry = options.models;\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 const platformToolPacks = (platformToolPackFactories ?? []).map((createPack) => createPack());\n const toolBindings = createMikanTools(\n executor,\n new OfficeEventStore(office, options.eventScheduler),\n { sandbox: sandboxConfig, resourceController: resourceController ?? provisioner },\n platformToolPacks,\n {\n model,\n getApiKey: () => modelRegistry.getApiKeyForProvider(model.provider),\n outputDir: office.dir,\n },\n async (systemPrompt, user, signal) => {\n const reply = await modelRegistry.models.completeSimple(\n model,\n { systemPrompt, messages: [{ role: \"user\", content: user, timestamp: Date.now() }] },\n { signal },\n );\n if (reply.stopReason === \"error\" || reply.stopReason === \"aborted\") {\n throw new Error(reply.errorMessage ?? `Text generation ${reply.stopReason}`);\n }\n return contentText(reply.content);\n },\n );\n\n const systemPrompt = await buildInitialSystemPrompt({\n office,\n pathContext,\n projection,\n sandboxConfig,\n });\n options.signal?.throwIfAborted();\n const { threadRootMessage } = sessionScope;\n const sessionManager = await openRunnerSessionManager({\n office,\n sessionKey,\n threadRootMessage,\n });\n return finishRunnerCreation({\n options,\n conversationId,\n workspaceDir,\n executor,\n resolveForRun,\n model,\n modelRegistry,\n agentConfig,\n systemPrompt,\n sessionManager,\n toolBindings,\n platformToolRoles: collectPlatformToolRoles(platformToolPacks),\n toolContext,\n });\n}\n\nfunction collectPlatformToolRoles(packs: readonly PlatformToolPack[]): PlatformToolRoles {\n return {\n platformTools: new Set(packs.flatMap((pack) => pack.tools.map((tool) => tool.name))),\n finalResponseTools: new Set(packs.flatMap((pack) => pack.finalResponseTools ?? [])),\n };\n}\n"]}
@@ -28,6 +28,7 @@ export declare class MikanAgentSession {
28
28
  private budgetExceededReason;
29
29
  private retryAttempt;
30
30
  private runMessages;
31
+ private streamingContent;
31
32
  private readonly toolArgs;
32
33
  private loopGuard;
33
34
  private readonly loopNotices;
@@ -76,6 +77,7 @@ export declare class MikanAgentSession {
76
77
  private emit;
77
78
  private handleDurableEvents;
78
79
  private handleDurableEvent;
80
+ private streamContent;
79
81
  private compactionOutcome;
80
82
  private recordUsage;
81
83
  private endRetry;
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/harness/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/harness/session.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { BACKGROUND_CONTEXT } from "@earendil-works/chord/context";
2
- import { createAssistantMessageEventStream } from "@earendil-works/pi-ai";
2
+ import { contentText, createAssistantMessageEventStream } from "@earendil-works/pi-ai";
3
3
  import { AgentDoc, DEFAULT_COMPACTION_POLICY, CompactionTask, GenerationTask, LiveDoc, ToolTask, defineExtension, hook, section, watchEvents, } from "@earendil-works/pi-durable";
4
4
  import * as log from "../log.js";
5
5
  import { ToolLoopGuard } from "./loop-guard.js";
@@ -28,6 +28,7 @@ export class MikanAgentSession {
28
28
  this.runBudget = {};
29
29
  this.retryAttempt = 0;
30
30
  this.runMessages = [];
31
+ this.streamingContent = [];
31
32
  this.toolArgs = new Map();
32
33
  this.loopGuard = new ToolLoopGuard();
33
34
  this.loopNotices = new Map();
@@ -141,7 +142,7 @@ export class MikanAgentSession {
141
142
  await this.installRunTools(attached, tools);
142
143
  if (!(await this.checkCallBudget()))
143
144
  return;
144
- await this.sessionStore.recordRun({});
145
+ await this.sessionStore.recordRun({ startedAt: Date.now() });
145
146
  stream = await watchEvents(attached.harness, attached.conversation.id, context);
146
147
  this.observedUsage = sumUsageState(stream.snapshot.usage);
147
148
  stream.start((events) => this.handleDurableEvents(events));
@@ -447,18 +448,18 @@ export class MikanAgentSession {
447
448
  await this.endRetry(this.runAborted ? "Retry cancelled" : undefined);
448
449
  this.runEndSeen = true;
449
450
  return;
451
+ case "snapshot":
452
+ return this.streamContent(event.generation?.message?.content ?? []);
450
453
  case "message_start":
451
454
  if (event.message.role === "system")
452
455
  return;
456
+ this.streamingContent = [];
453
457
  await this.emit({ type: "message_start", message: event.message });
458
+ if (event.message.role === "assistant")
459
+ await this.streamContent(event.message.content);
454
460
  return;
455
461
  case "message_update":
456
- for (const change of event.changes) {
457
- if (change.type === "text_delta" && change.delta) {
458
- await this.emit({ type: "text_delta", delta: change.delta });
459
- }
460
- }
461
- return;
462
+ return this.streamContent(applyMessageChanges(this.streamingContent, event.changes));
462
463
  case "message_end":
463
464
  return this.endMessage(event.entry.model?.[0]);
464
465
  case "tool_execution_start":
@@ -522,6 +523,14 @@ export class MikanAgentSession {
522
523
  return;
523
524
  }
524
525
  }
526
+ async streamContent(content) {
527
+ const before = contentText(this.streamingContent);
528
+ this.streamingContent = content;
529
+ const after = contentText(content);
530
+ if (after.length > before.length && after.startsWith(before)) {
531
+ await this.emit({ type: "text_delta", delta: after.slice(before.length) });
532
+ }
533
+ }
525
534
  async compactionOutcome(taskId) {
526
535
  const task = await this.attached?.harness.getTask(taskId, context);
527
536
  return task?.state.outcome;
@@ -548,6 +557,8 @@ export class MikanAgentSession {
548
557
  async endMessage(message) {
549
558
  if (!message || message.role === "system")
550
559
  return;
560
+ if (message.role === "assistant")
561
+ await this.streamContent(message.content);
551
562
  this.runMessages.push(message);
552
563
  await this.emit({ type: "message_end", message });
553
564
  if (message.role !== "assistant")
@@ -715,4 +726,34 @@ function subtractUsage(total, base) {
715
726
  export function copyUsage(usage) {
716
727
  return { ...usage, cost: { ...usage.cost } };
717
728
  }
729
+ function applyMessageChanges(content, changes) {
730
+ const next = [...content];
731
+ for (const change of changes) {
732
+ switch (change.type) {
733
+ case "message":
734
+ next.splice(0, next.length, ...change.message.content);
735
+ break;
736
+ case "text_start":
737
+ case "thinking_start":
738
+ case "toolcall_start":
739
+ case "block":
740
+ next[change.contentIndex] = change.block;
741
+ break;
742
+ case "text_delta": {
743
+ const block = next[change.contentIndex];
744
+ next[change.contentIndex] =
745
+ block?.type === "text"
746
+ ? { ...block, text: `${block.text}${change.delta}` }
747
+ : { type: "text", text: change.delta };
748
+ break;
749
+ }
750
+ case "thinking_delta":
751
+ case "toolcall_delta":
752
+ break;
753
+ default:
754
+ change;
755
+ }
756
+ }
757
+ return next;
758
+ }
718
759
  //# sourceMappingURL=session.js.map