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

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 (59) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/adapters/github/bot.d.ts.map +1 -1
  3. package/dist/adapters/github/bot.js +3 -4
  4. package/dist/adapters/github/bot.js.map +1 -1
  5. package/dist/adapters/github/client.d.ts +4 -0
  6. package/dist/adapters/github/client.d.ts.map +1 -1
  7. package/dist/adapters/github/client.js +41 -23
  8. package/dist/adapters/github/client.js.map +1 -1
  9. package/dist/adapters/github/github-ops.js +16 -12
  10. package/dist/adapters/github/github-ops.js.map +1 -1
  11. package/dist/adapters/slack/bot.d.ts.map +1 -1
  12. package/dist/adapters/slack/bot.js +6 -3
  13. package/dist/adapters/slack/bot.js.map +1 -1
  14. package/dist/adapters/web/server.d.ts +2 -0
  15. package/dist/adapters/web/server.d.ts.map +1 -1
  16. package/dist/adapters/web/server.js +11 -4
  17. package/dist/adapters/web/server.js.map +1 -1
  18. package/dist/adapters/web/session-view/portal.d.ts.map +1 -1
  19. package/dist/adapters/web/session-view/portal.js +84 -63
  20. package/dist/adapters/web/session-view/portal.js.map +1 -1
  21. package/dist/adapters/web/session-view/types.d.ts +2 -0
  22. package/dist/adapters/web/session-view/types.d.ts.map +1 -1
  23. package/dist/adapters/web/session-view/types.js.map +1 -1
  24. package/dist/env-manifest.d.ts +1 -0
  25. package/dist/env-manifest.d.ts.map +1 -1
  26. package/dist/env-manifest.js +7 -0
  27. package/dist/env-manifest.js.map +1 -1
  28. package/dist/harness/loop-guard.d.ts +10 -0
  29. package/dist/harness/loop-guard.d.ts.map +1 -0
  30. package/dist/harness/loop-guard.js +111 -0
  31. package/dist/harness/loop-guard.js.map +1 -0
  32. package/dist/harness/presenter.d.ts.map +1 -1
  33. package/dist/harness/presenter.js +143 -141
  34. package/dist/harness/presenter.js.map +1 -1
  35. package/dist/harness/run-events.d.ts +10 -0
  36. package/dist/harness/run-events.d.ts.map +1 -0
  37. package/dist/harness/run-events.js +129 -0
  38. package/dist/harness/run-events.js.map +1 -0
  39. package/dist/harness/runner.d.ts.map +1 -1
  40. package/dist/harness/runner.js +78 -48
  41. package/dist/harness/runner.js.map +1 -1
  42. package/dist/harness/session.d.ts +5 -0
  43. package/dist/harness/session.d.ts.map +1 -1
  44. package/dist/harness/session.js +71 -1
  45. package/dist/harness/session.js.map +1 -1
  46. package/dist/harness/types.d.ts +60 -0
  47. package/dist/harness/types.d.ts.map +1 -1
  48. package/dist/harness/types.js.map +1 -1
  49. package/dist/main.js +11 -8
  50. package/dist/main.js.map +1 -1
  51. package/dist/runtime/conversation-runtime.js +1 -0
  52. package/dist/runtime/conversation-runtime.js.map +1 -1
  53. package/dist/runtime/types.d.ts +2 -1
  54. package/dist/runtime/types.d.ts.map +1 -1
  55. package/dist/runtime/types.js.map +1 -1
  56. package/dist/types.d.ts +2 -1
  57. package/dist/types.d.ts.map +1 -1
  58. package/dist/types.js.map +1 -1
  59. package/package.json +2 -2
@@ -344,6 +344,8 @@ async function runPreparedTurn(params) {
344
344
  sessionUuid,
345
345
  waitForQueue: presentation.wait,
346
346
  });
347
+ if (runState.stopReason === "stop")
348
+ session.compactWhenNearLimit();
347
349
  return {
348
350
  stopReason: runState.stopReason,
349
351
  errorMessage: runState.errorMessage,
@@ -367,8 +369,46 @@ async function steerRun(session, activeMessage, message) {
367
369
  }
368
370
  return true;
369
371
  }
372
+ async function publishRunLifecycle(publish, message, run) {
373
+ publish?.({
374
+ type: "run_started",
375
+ userName: message.userName ?? message.userId,
376
+ text: message.text,
377
+ });
378
+ let stopReason = "error";
379
+ try {
380
+ const result = await run();
381
+ stopReason = result.stopReason;
382
+ return result;
383
+ }
384
+ finally {
385
+ publish?.({ type: "run_ended", stopReason });
386
+ }
387
+ }
388
+ function prepareRunnerTurn(params, message, responder, platform) {
389
+ const { office, executor, resolveForRun, session, toolBindings } = params;
390
+ return prepareRunContext({
391
+ message,
392
+ responder,
393
+ platform,
394
+ office,
395
+ executor,
396
+ resolveForRun,
397
+ session,
398
+ setEventContext: toolBindings.setEventContext,
399
+ setSandboxContext: toolBindings.setSandboxContext,
400
+ setUploadFunction: toolBindings.setUploadFunction,
401
+ setImageUploadFunction: toolBindings.setImageUploadFunction,
402
+ setReactFunction: toolBindings.setReactFunction,
403
+ bindTasks: toolBindings.bindTasks,
404
+ bindPlatformToolPacks: toolBindings.bindPlatformToolPacks,
405
+ });
406
+ }
370
407
  function createRunnerInterface(params) {
371
- const { conversationId, conversationDir, sessionKey, office, sessionUuid, contextFile, sessionView, runState, executor, resolveForRun, session, model, agentConfig, sessionManager, chatSessionManager, toolBindings, } = params;
408
+ const { conversationId, conversationDir, sessionKey, office, sessionUuid, contextFile, sessionView, runEvents, runState, session, model, agentConfig, sessionManager, chatSessionManager, } = params;
409
+ const publishRunEvent = runEvents
410
+ ? (event) => runEvents.publish(office.address, sessionKey, event)
411
+ : undefined;
372
412
  let activeMessage;
373
413
  let stopped = false;
374
414
  return {
@@ -385,58 +425,47 @@ function createRunnerInterface(params) {
385
425
  activeMessage = message;
386
426
  stopped = false;
387
427
  let presentation;
388
- try {
389
- const prepared = await prepareRunContext({
390
- message,
391
- responder,
392
- platform,
393
- office,
394
- executor,
395
- resolveForRun,
396
- session,
397
- setEventContext: toolBindings.setEventContext,
398
- setSandboxContext: toolBindings.setSandboxContext,
399
- setUploadFunction: toolBindings.setUploadFunction,
400
- setImageUploadFunction: toolBindings.setImageUploadFunction,
401
- setReactFunction: toolBindings.setReactFunction,
402
- bindTasks: toolBindings.bindTasks,
403
- bindPlatformToolPacks: toolBindings.bindPlatformToolPacks,
404
- });
405
- if (stopped)
406
- return { stopReason: "aborted" };
407
- presentation = activateRunPresentation(runState, {
408
- responder,
409
- sessionConversation: prepared.sessionConversation,
410
- userName: message.userName,
411
- sessionUuid,
412
- triggerAttribution: prepared.triggerAttribution,
413
- });
414
- return await runPreparedTurn({
415
- prepared,
416
- presentation,
417
- message,
418
- responder,
419
- platform,
420
- runState,
421
- session,
422
- model,
423
- agentConfig,
424
- sessionUuid,
425
- conversationId,
426
- contextFile,
427
- sessionView,
428
- });
429
- }
430
- finally {
431
- activeMessage = undefined;
432
- presentation?.dispose();
433
- }
428
+ return publishRunLifecycle(publishRunEvent, message, async () => {
429
+ try {
430
+ const prepared = await prepareRunnerTurn(params, message, responder, platform);
431
+ if (stopped)
432
+ return { stopReason: "aborted" };
433
+ presentation = activateRunPresentation(runState, {
434
+ responder,
435
+ sessionConversation: prepared.sessionConversation,
436
+ userName: message.userName,
437
+ sessionUuid,
438
+ triggerAttribution: prepared.triggerAttribution,
439
+ publishRunEvent,
440
+ });
441
+ return await runPreparedTurn({
442
+ prepared,
443
+ presentation,
444
+ message,
445
+ responder,
446
+ platform,
447
+ runState,
448
+ session,
449
+ model,
450
+ agentConfig,
451
+ sessionUuid,
452
+ conversationId,
453
+ contextFile,
454
+ sessionView,
455
+ });
456
+ }
457
+ finally {
458
+ activeMessage = undefined;
459
+ presentation?.dispose();
460
+ }
461
+ });
434
462
  },
435
463
  abort() {
436
464
  stopped = true;
437
465
  session.abort();
438
466
  },
439
467
  async dispose() {
468
+ await session.cancelIdleCompaction();
440
469
  await sessionManager.close();
441
470
  },
442
471
  getCurrentStep() {
@@ -452,7 +481,7 @@ function createRunnerInterface(params) {
452
481
  }
453
482
  async function finishRunnerCreation(params) {
454
483
  const { options, conversationId, conversationDir, workspaceDir, executor, resolveForRun, model, modelRegistry, agentConfig, systemPrompt, sessionManager, toolBindings, platformToolRoles, toolContext, } = params;
455
- const { sessionKey, office, sessionScope, sessionView, chatHistory } = options;
484
+ const { sessionKey, office, sessionScope, sessionView, chatHistory, runEvents } = options;
456
485
  const { contextFile } = sessionScope;
457
486
  try {
458
487
  const sessionUuid = extractSessionUuid(contextFile);
@@ -479,6 +508,7 @@ async function finishRunnerCreation(params) {
479
508
  sessionUuid,
480
509
  contextFile,
481
510
  sessionView,
511
+ runEvents,
482
512
  runState,
483
513
  executor,
484
514
  resolveForRun,
@@ -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 { ExecutionToolContext, ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport { MikanModels } from \"./models.js\";\nimport type { SessionStore } from \"../sessions/session-store.js\";\nimport { CONTROL_INPUT_CUSTOM_TYPE, type ThreadRootMessage } 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 { 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 ConversationKind,\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 assertSandboxSupportsWorkspacePolicy,\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 RunnerSessionState,\n} from \"./types.js\";\nimport type { CreateRunnerOptions, OfficeAddress, PiAgentWrapper } from \"../types.js\";\nimport { createHash } from \"node:crypto\";\nimport { 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 { extractSessionUuid, openManagedSession } from \"../sessions/store.js\";\nimport type { PlatformToolPack, PlatformToolRunContext } from \"./tools/types.js\";\nimport { START_TASK_TOOL, TASK_STATUS_TOOL } from \"./tools/task.js\";\nimport { loadMikanSkills } from \"./skills.js\";\nimport {\n normalizeAttachRuntimePath,\n withStagedRuntimeFile,\n buildPromptPayload,\n buildSystemPrompt,\n buildTurnInstructions,\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: ExecutionToolContext;\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 (request, hooks) =>\n runSubagent({\n request,\n onActivity: hooks?.onActivity,\n defaultModel: model,\n thinkingLevel,\n models,\n workspaceDir,\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 parentMessages: [...session!.messages],\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 const reloaded = await session.reloadFromSession();\n if (reloaded > 0) log.logInfo(`Reloaded ${reloaded} messages from session context`);\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 const projection = resolveWorkspaceProjection(office);\n assertSandboxSupportsWorkspacePolicy(sandboxConfig, projection.visibility, office.key);\n return {\n pathContext: executor.getPathContext(workspace.root),\n projection,\n };\n },\n };\n}\n\nfunction buildThreadSessionName(message: ThreadRootMessage | null): string | undefined {\n const text = message?.text?.trim();\n if (!text) return undefined;\n const userLabel = message?.userName || message?.user || \"unknown\";\n return `[${userLabel}]: ${text}`;\n}\n\nasync function 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 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 bindTasks: ReturnType<typeof createMikanTools>[\"bindTasks\"];\n setReactFunction: (fn: ((emoji: string) => Promise<void>) | null) => void;\n bindPlatformToolPacks: (ctx: PlatformToolRunContext) => void;\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 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 );\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.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\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 bindTasks,\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 setImageUploadFunction(async (hostPath: string, title?: string) => {\n await responder.uploadFile(hostPath, title);\n });\n bindTasks(responder);\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 );\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 toolContext: ExecutionToolContext;\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 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 contextFile: string;\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 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: 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.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\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 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 agentConfig,\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 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 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\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 toolBindings,\n } = params;\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 conversationDir,\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 try {\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 bindTasks: toolBindings.bindTasks,\n bindPlatformToolPacks: toolBindings.bindPlatformToolPacks,\n });\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 });\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 activeMessage = undefined;\n presentation?.dispose();\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 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 platformToolRoles: PlatformToolRoles;\n toolContext: ExecutionToolContext;\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 platformToolRoles,\n toolContext,\n } = params;\n const { sessionKey, office, sessionScope, sessionView, chatHistory } = options;\n const { contextFile } = sessionScope;\n try {\n const sessionUuid = extractSessionUuid(contextFile);\n const session = await createRunnerAgentSession({\n workspaceDir,\n systemPrompt,\n model,\n agentConfig,\n tools: toolBindings.tools,\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 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: 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 conversationDir = office.dir;\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 assertSandboxSupportsWorkspacePolicy(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: ExecutionToolContext = {\n env: createSandboxExecutionEnv(executor, sandboxConfig.type, pathContext.runtimeWorkspaceRoot),\n };\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 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: 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 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 { ExecutionToolContext, ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport { MikanModels } from \"./models.js\";\nimport type { SessionStore } from \"../sessions/session-store.js\";\nimport { CONTROL_INPUT_CUSTOM_TYPE, type ThreadRootMessage } 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 { 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 ConversationKind,\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 assertSandboxSupportsWorkspacePolicy,\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} from \"./types.js\";\nimport type { CreateRunnerOptions, OfficeAddress, PiAgentWrapper } from \"../types.js\";\nimport { createHash } from \"node:crypto\";\nimport { 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 { extractSessionUuid, openManagedSession } from \"../sessions/store.js\";\nimport type { PlatformToolPack, PlatformToolRunContext } from \"./tools/types.js\";\nimport { START_TASK_TOOL, TASK_STATUS_TOOL } from \"./tools/task.js\";\nimport { loadMikanSkills } from \"./skills.js\";\nimport {\n normalizeAttachRuntimePath,\n withStagedRuntimeFile,\n buildPromptPayload,\n buildSystemPrompt,\n buildTurnInstructions,\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: ExecutionToolContext;\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 (request, hooks) =>\n runSubagent({\n request,\n onActivity: hooks?.onActivity,\n defaultModel: model,\n thinkingLevel,\n models,\n workspaceDir,\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 parentMessages: [...session!.messages],\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 const reloaded = await session.reloadFromSession();\n if (reloaded > 0) log.logInfo(`Reloaded ${reloaded} messages from session context`);\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 const projection = resolveWorkspaceProjection(office);\n assertSandboxSupportsWorkspacePolicy(sandboxConfig, projection.visibility, office.key);\n return {\n pathContext: executor.getPathContext(workspace.root),\n projection,\n };\n },\n };\n}\n\nfunction buildThreadSessionName(message: ThreadRootMessage | null): string | undefined {\n const text = message?.text?.trim();\n if (!text) return undefined;\n const userLabel = message?.userName || message?.user || \"unknown\";\n return `[${userLabel}]: ${text}`;\n}\n\nasync function 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 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 bindTasks: ReturnType<typeof createMikanTools>[\"bindTasks\"];\n setReactFunction: (fn: ((emoji: string) => Promise<void>) | null) => void;\n bindPlatformToolPacks: (ctx: PlatformToolRunContext) => void;\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 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 );\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.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\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 bindTasks,\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 setImageUploadFunction(async (hostPath: string, title?: string) => {\n await responder.uploadFile(hostPath, title);\n });\n bindTasks(responder);\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 );\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 toolContext: ExecutionToolContext;\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 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 contextFile: string;\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 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: 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.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\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 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 agentConfig,\n sessionConversation: prepared.sessionConversation,\n sessionUuid,\n waitForQueue: presentation.wait,\n });\n if (runState.stopReason === \"stop\") session.compactWhenNearLimit();\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 conversationDir: string;\n sessionKey: string;\n office: Office;\n sessionUuid: string;\n contextFile: 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: Awaited<ReturnType<typeof openManagedSession>>;\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 extends { stopReason: string }>(\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 let stopReason = \"error\";\n try {\n const result = await run();\n stopReason = result.stopReason;\n return result;\n } finally {\n publish?.({ type: \"run_ended\", stopReason });\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 setEventContext: toolBindings.setEventContext,\n setSandboxContext: toolBindings.setSandboxContext,\n setUploadFunction: toolBindings.setUploadFunction,\n setImageUploadFunction: toolBindings.setImageUploadFunction,\n setReactFunction: toolBindings.setReactFunction,\n bindTasks: toolBindings.bindTasks,\n bindPlatformToolPacks: toolBindings.bindPlatformToolPacks,\n });\n}\n\nfunction createRunnerInterface(params: RunnerInterfaceParams): PiAgentWrapper {\n const {\n conversationId,\n conversationDir,\n sessionKey,\n office,\n sessionUuid,\n contextFile,\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 conversationDir,\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 contextFile,\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 session.cancelIdleCompaction();\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 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 platformToolRoles: PlatformToolRoles;\n toolContext: ExecutionToolContext;\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 platformToolRoles,\n toolContext,\n } = params;\n const { sessionKey, office, sessionScope, sessionView, chatHistory, runEvents } = options;\n const { contextFile } = sessionScope;\n try {\n const sessionUuid = extractSessionUuid(contextFile);\n const session = await createRunnerAgentSession({\n workspaceDir,\n systemPrompt,\n model,\n agentConfig,\n tools: toolBindings.tools,\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 conversationDir,\n sessionKey,\n office,\n sessionUuid,\n contextFile,\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 conversationDir = office.dir;\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 assertSandboxSupportsWorkspacePolicy(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: ExecutionToolContext = {\n env: createSandboxExecutionEnv(executor, sandboxConfig.type, pathContext.runtimeWorkspaceRoot),\n };\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 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: 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 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"]}
@@ -29,6 +29,9 @@ export declare class MikanAgentSession {
29
29
  private latestAssistantErrored;
30
30
  private runMessages;
31
31
  private readonly toolArgs;
32
+ private idleCompaction;
33
+ private loopGuard;
34
+ private readonly loopNotices;
32
35
  private tally;
33
36
  constructor(options: MikanAgentSessionOptions);
34
37
  get messages(): AgentMessage[];
@@ -60,6 +63,8 @@ export declare class MikanAgentSession {
60
63
  budget?: BudgetSettings;
61
64
  tools?: MikanToolInput[];
62
65
  }): Promise<void>;
66
+ compactWhenNearLimit(): void;
67
+ cancelIdleCompaction(): Promise<void>;
63
68
  private run;
64
69
  private driveOperation;
65
70
  private cleanupRun;
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/harness/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,YAAY,EAGjB,KAAK,kBAAkB,EACxB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EACV,GAAG,EAEH,YAAY,EACZ,KAAK,EAGL,KAAK,EACN,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EACV,cAAc,EAEd,oBAAoB,EACpB,eAAe,EACf,wBAAwB,EAExB,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,aAAa,EACd,MAAM,YAAY,CAAC;AAwCpB,qBAAa,iBAAiB;IAkChB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAjCpC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmC;IAC7D,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,IAAI,CAAwB;IACpC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,sBAAsB,CAAmC;IACjE,OAAO,CAAC,sBAAsB,CAAmC;IACjE,OAAO,CAAC,qBAAqB,CAAmC;IAChE,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,aAAa,CAA4C;IACjE,OAAO,CAAC,oBAAoB,CAA4B;IACxD,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,oBAAoB,CAAqB;IACjD,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,wBAAwB,CAAS;IACzC,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IACvD,OAAO,CAAC,KAAK,CAMX;IAEF,YAA6B,OAAO,EAAE,wBAAwB,EAK7D;IAED,IAAI,QAAQ,IAAI,YAAY,EAAE,CAE7B;IACD,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAGpC;IAED,eAAe,IAAI,QAAQ,CAAC;QAC1B,KAAK,EAAE,aAAa,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,UAAU,EAAE,MAAM,CAAC;QACnB,oBAAoB,CAAC,EAAE,MAAM,CAAC;KAC/B,CAAC,CAYD;IAED,wBAAwB,IAAI,iBAAiB,CAQ5C;IAEK,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;IAED,SAAS,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,IAAI,CAGpD;IAEK,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAGzC;IAEK,MAAM,CACV,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;QACxB,MAAM,CAAC,EAAE,cAAc,CAAC;QACxB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;QACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,GACA,OAAO,CAAC,IAAI,CAAC,CAEf;IAEK,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI1C;IAEK,MAAM,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,cAAc,CAAC;QAAC,KAAK,CAAC,EAAE,cAAc,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3F;YAEa,GAAG;YAiEH,cAAc;YA8Bd,UAAU;IAgCxB,KAAK,CAAC,MAAM,SAAc,GAAG,IAAI,CAehC;IAED,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,sBAAsB;IAkB9B,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,oBAAoB;IAuB5B,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,cAAc;YAIR,UAAU;YA4CV,IAAI;YAUJ,aAAa;YAuDb,WAAW;YAQX,iBAAiB;YAsCjB,sBAAsB;YA+EtB,YAAY;YAeZ,eAAe;IAU7B,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,wBAAwB;IAWhC,OAAO,CAAC,WAAW;CAiBpB;AAED,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAEnC,eAAO,MAAM,sBAAsB,EAAE,aAIpC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,cAAmB,CAAC;AAE1D,eAAO,MAAM,oBAAoB,EAAE,cAIlC,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,SAAS,CAAC,EAAE;IACjD,UAAU,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACzC,KAAK,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;CAClC,GAAG,eAAe,CAMlB;AAED,wBAAgB,gBAAgB,IAAI,KAAK,CASxC;AAsBD,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAE7C"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/harness/session.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,10 @@
1
- import { TODO_CONTEXT, OperationMismatch, getOrThrow, DEFAULT_COMPACTION_SETTINGS, } from "@earendil-works/pi-agent-core";
1
+ import { TODO_CONTEXT, OperationMismatch, getOrThrow, DEFAULT_COMPACTION_SETTINGS, estimateContextTokens, } from "@earendil-works/pi-agent-core";
2
2
  import * as log from "../log.js";
3
+ import { ToolLoopGuard } from "./loop-guard.js";
3
4
  import { adaptAgentTool, isHarnessTool } from "./tools/pi-tools.js";
4
5
  import { START_TASK_TOOL, TASK_STATUS_TOOL } from "./tools/task.js";
5
6
  import { errorMessage } from "../unknown-values.js";
7
+ const IDLE_COMPACTION_FRACTION_OF_PI_THRESHOLD = 0.8;
6
8
  const FORWARDED_EVENTS = [
7
9
  "run_start",
8
10
  "run_end",
@@ -34,6 +36,8 @@ export class MikanAgentSession {
34
36
  this.latestAssistantErrored = false;
35
37
  this.runMessages = [];
36
38
  this.toolArgs = new Map();
39
+ this.loopGuard = new ToolLoopGuard();
40
+ this.loopNotices = new Map();
37
41
  this.tally = {
38
42
  usage: createEmptyUsage(),
39
43
  llmCalls: 0,
@@ -103,6 +107,46 @@ export class MikanAgentSession {
103
107
  async resume(options) {
104
108
  await this.run(undefined, options);
105
109
  }
110
+ compactWhenNearLimit() {
111
+ if (this.runActive || this.idleCompaction || !this.lane)
112
+ return;
113
+ const { enabled, reserveTokens } = this.settings.compaction;
114
+ if (!enabled)
115
+ return;
116
+ const threshold = (this.model.contextWindow - reserveTokens) * IDLE_COMPACTION_FRACTION_OF_PI_THRESHOLD;
117
+ const { tokens } = estimateContextTokens(this.transcript);
118
+ if (tokens < threshold)
119
+ return;
120
+ const lane = this.lane;
121
+ log.logInfo(`Idle compaction started ${JSON.stringify({ tokens, threshold })}`);
122
+ const compaction = lane
123
+ .compact(undefined, TODO_CONTEXT)
124
+ .then(async (result) => {
125
+ if (!result.ok) {
126
+ log.logInfo(`Idle compaction skipped: ${result.error.message}`);
127
+ return;
128
+ }
129
+ log.logInfo(`Idle compaction ${result.value.compaction.status}`);
130
+ await this.reloadFromSession();
131
+ })
132
+ .catch((error) => {
133
+ log.logWarning("Idle compaction failed", errorMessage(error));
134
+ })
135
+ .finally(() => {
136
+ if (this.idleCompaction === compaction)
137
+ this.idleCompaction = undefined;
138
+ });
139
+ this.idleCompaction = compaction;
140
+ }
141
+ async cancelIdleCompaction() {
142
+ const compaction = this.idleCompaction;
143
+ if (!compaction || !this.lane)
144
+ return;
145
+ const aborted = await this.lane.abort(TODO_CONTEXT);
146
+ if (!aborted.ok)
147
+ log.logInfo(`Idle compaction abort: ${aborted.error.message}`);
148
+ await compaction;
149
+ }
106
150
  async run(text, options) {
107
151
  if (this.runActive)
108
152
  throw new Error("Agent is already processing a prompt");
@@ -117,6 +161,8 @@ export class MikanAgentSession {
117
161
  this.latestAssistantNeedsCall = false;
118
162
  this.latestAssistantErrored = false;
119
163
  this.runMessages = [];
164
+ this.loopGuard = new ToolLoopGuard();
165
+ this.loopNotices.clear();
120
166
  this.runBudget = { ...this.settings.budget, ...options?.budget };
121
167
  this.tally = {
122
168
  usage: createEmptyUsage(),
@@ -127,6 +173,7 @@ export class MikanAgentSession {
127
173
  };
128
174
  let runFailure;
129
175
  try {
176
+ await this.idleCompaction;
130
177
  if (!(await this.checkCallBudget()))
131
178
  return;
132
179
  this.armDeadline();
@@ -194,6 +241,7 @@ export class MikanAgentSession {
194
241
  }
195
242
  finally {
196
243
  this.toolArgs.clear();
244
+ this.loopNotices.clear();
197
245
  this.pendingProviderRequest = undefined;
198
246
  this.currentProviderRequest = undefined;
199
247
  this.activeProviderRequest = undefined;
@@ -360,6 +408,28 @@ export class MikanAgentSession {
360
408
  }
361
409
  return undefined;
362
410
  });
411
+ this.harness.hooks.on("before_tool", async (event) => {
412
+ const verdict = this.loopGuard.observe(event.toolName, event.args);
413
+ switch (verdict.kind) {
414
+ case "allow":
415
+ return undefined;
416
+ case "notice":
417
+ this.loopNotices.set(event.toolCallId, verdict.text);
418
+ return undefined;
419
+ case "block":
420
+ return { block: { reason: verdict.reason } };
421
+ case "stop":
422
+ await this.exceedBudget(verdict.reason);
423
+ return { block: { reason: verdict.reason, terminate: true } };
424
+ }
425
+ });
426
+ this.harness.hooks.on("after_tool", (event) => {
427
+ const notice = this.loopNotices.get(event.toolCallId);
428
+ if (notice === undefined)
429
+ return undefined;
430
+ this.loopNotices.delete(event.toolCallId);
431
+ return { content: [...event.content, { type: "text", text: notice }] };
432
+ });
363
433
  for (const type of FORWARDED_EVENTS) {
364
434
  this.harness.events.on(type, (event) => this.handlePiEvent(event));
365
435
  }