@geminixiang/mikan 1.5.0 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/dist/adapters/messages.d.ts +1 -2
- package/dist/adapters/messages.d.ts.map +1 -1
- package/dist/adapters/messages.js +2 -5
- package/dist/adapters/messages.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +2 -2
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +36 -50
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/harness/continued-run.d.ts +3 -0
- package/dist/harness/continued-run.d.ts.map +1 -0
- package/dist/harness/continued-run.js +8 -0
- package/dist/harness/continued-run.js.map +1 -0
- package/dist/harness/prompt.d.ts.map +1 -1
- package/dist/harness/prompt.js +1 -0
- package/dist/harness/prompt.js.map +1 -1
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +14 -7
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session.d.ts +3 -0
- package/dist/harness/session.d.ts.map +1 -1
- package/dist/harness/session.js +14 -1
- package/dist/harness/session.js.map +1 -1
- package/dist/harness/tools/codemode.js +1 -1
- package/dist/harness/tools/codemode.js.map +1 -1
- package/dist/harness/tools/jev-browser.d.ts.map +1 -1
- package/dist/harness/tools/jev-browser.js +31 -6
- package/dist/harness/tools/jev-browser.js.map +1 -1
- package/dist/harness/tools/task.d.ts +0 -2
- package/dist/harness/tools/task.d.ts.map +1 -1
- package/dist/harness/tools/task.js +1 -6
- package/dist/harness/tools/task.js.map +1 -1
- package/dist/runtime/conversation-runtime.d.ts.map +1 -1
- package/dist/runtime/conversation-runtime.js +6 -3
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/sessions/session-store.d.ts +4 -3
- package/dist/sessions/session-store.d.ts.map +1 -1
- package/dist/sessions/session-store.js +92 -47
- package/dist/sessions/session-store.js.map +1 -1
- package/dist/sessions/types.d.ts +0 -1
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-runtime.js","sourceRoot":"","sources":["../../src/runtime/conversation-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n MessagingBot,\n ConversationContext,\n ConversationMessage,\n ConversationEvent,\n CompactOutcome,\n HandleCompactCommandOptions,\n HandleNewCommandOptions,\n OfficeAddress,\n PlatformName,\n RunningSession,\n} from \"../types.js\";\nimport type { Office } from \"../office/types.js\";\nimport { createRunner } from \"../harness/runner.js\";\nimport type { PiAgentWrapper } from \"../types.js\";\nimport type { RunMemoryCapture } from \"../memory-capture/types.js\";\nimport { defaultModelsJsonPath, MikanModels } from \"../harness/models.js\";\nimport { isCommandText } from \"../adapters/commands/manifest.js\";\nimport { defaultCommandHandlers, dispatchCommand } from \"../adapters/commands/registry.js\";\nimport type { CommandHandler, CommandServices } from \"../adapters/commands/types.js\";\nimport { isPrivateConversation } from \"../adapters/commands/utils.js\";\nimport * as log from \"../log.js\";\nimport {\n addLifecycleEvent,\n createRunAttributionAttributes,\n recordCounter,\n recordDistribution,\n recordGauge,\n reportUserFacingError,\n withRunSpan,\n} from \"../observability/index.js\";\nimport {\n ChatHistorySync,\n hasMaterializedChatSession,\n waitForThreadSessionBootstrap,\n} from \"../sessions/chat-history-sync.js\";\nimport {\n assertSessionKeyBelongsToConversation,\n deriveSessionKey,\n threadSuffixOf,\n} from \"../sessions/session-key.js\";\nimport {\n formatNothingRunning,\n formatRestarting,\n formatStopped,\n formatStopping,\n} from \"../adapters/messages.js\";\nimport { disabledVaultManager } from \"../vault/index.js\";\nimport type { ConversationRuntimeState } from \"./types.js\";\nimport { SessionLifecycle } from \"./session-lifecycle.js\";\n\ntype ConversationState = ConversationRuntimeState;\n\nimport type {\n RunSessionOptions,\n ConversationRuntime,\n ConversationRuntimeOptions,\n SessionStateOptions,\n} from \"./types.js\";\nimport { errorMessage } from \"../unknown-values.js\";\nimport { SessionStore } from \"../sessions/session-store.js\";\nimport { stripTriggerSignature } from \"../sessions/history-line.js\";\nimport { isTaskRunId } from \"../harness/tools/task.js\";\n\ntype RunResult = Awaited<ReturnType<PiAgentWrapper[\"run\"]>>;\n\nfunction portalNotConfiguredTokenStore(portal: string): { create: () => never } {\n return {\n create: () => {\n throw new Error(`${portal} portal not configured`);\n },\n };\n}\n\nfunction requestStop(state: ConversationRuntimeState): void {\n state.stopRequested = true;\n state.runner.abort();\n}\n\nasync function postAbortNotice(\n state: ConversationRuntimeState,\n bot: MessagingBot,\n conversationId: string,\n platformName: string,\n): Promise<void> {\n if (state.shutdownAborted) {\n recordCounter(\"agent.run.shutdown_aborted\", 1, { platform: platformName });\n const text = formatRestarting(bot);\n const ts = await bot.postMessage(conversationId, text);\n bot.logBotResponse?.(conversationId, text, ts);\n return;\n }\n if (!state.stopRequested) return;\n if (state.stopNoticeOwned) return;\n const thread = threadSuffixOf(state.sessionKey) ?? undefined;\n const text = formatStopped(bot);\n const ts =\n thread && bot.postInThread\n ? await bot.postInThread(conversationId, thread, text)\n : await bot.postMessage(conversationId, text);\n bot.logBotResponse?.(conversationId, text, ts, thread);\n}\n\nexport function createConversationRuntime(\n options: ConversationRuntimeOptions,\n): ConversationRuntime {\n return new ConversationRuntimeImpl(options);\n}\n\nclass ConversationRuntimeImpl implements ConversationRuntime {\n private readonly sessions = new SessionLifecycle();\n private readonly chatSessionManager = new ChatHistorySync({ isCommandText });\n private readonly commandServices: CommandServices;\n private readonly commandHandlers: readonly CommandHandler[];\n private readonly resolvedModels: MikanModels;\n private readonly memoryCapture: RunMemoryCapture | undefined;\n private isShuttingDown = false;\n\n constructor(private readonly options: ConversationRuntimeOptions) {\n this.resolvedModels =\n options.models ??\n MikanModels.create({ modelsJsonPath: defaultModelsJsonPath(options.workspace.stateDir) });\n this.memoryCapture = options.memoryCapture?.(this.resolvedModels);\n this.commandServices = {\n ...options,\n resourceController: options.resourceController ?? options.provisioner,\n vaultManager: options.vaultManager ?? disabledVaultManager,\n linkTokenStore: options.linkTokenStore ?? portalNotConfiguredTokenStore(\"Login\"),\n sessionViewTokenStore:\n options.sessionViewTokenStore ?? portalNotConfiguredTokenStore(\"Session viewer\"),\n adminTokenStore: options.adminTokenStore ?? portalNotConfiguredTokenStore(\"Admin\"),\n runtime: this,\n };\n this.commandHandlers = options.commandHandlers ?? defaultCommandHandlers(this.resolvedModels);\n }\n\n isRunning(address: OfficeAddress, sessionKey: string): boolean {\n return this.sessions.get(address, sessionKey)?.running === true;\n }\n\n getRunningSessions(): RunningSession[] {\n const sessions: RunningSession[] = [];\n for (const state of this.sessions.runningStates()) {\n if (state.startedAt) {\n const currentStep = state.runner.getCurrentStep();\n sessions.push({\n address: state.address,\n sessionKey: state.sessionKey,\n startedAt: state.startedAt,\n lastActivityAt: state.lastActivityAt,\n currentTool: currentStep?.label || currentStep?.toolName,\n stopping: state.stopRequested ? true : undefined,\n });\n }\n }\n return sessions;\n }\n\n async steer(message: ConversationMessage): Promise<boolean> {\n const state = this.sessions.get(message.address, message.sessionKey);\n if (!state?.running) return false;\n return state.runner.steer ? state.runner.steer(message) : false;\n }\n\n async handleStop(\n address: OfficeAddress,\n sessionKey: string,\n bot: MessagingBot,\n replyThreadTs?: string,\n ): Promise<void> {\n assertSessionKeyBelongsToConversation(sessionKey, address.conversationId);\n const post = async (text: string) => {\n const ts =\n replyThreadTs && bot.postInThread\n ? await bot.postInThread(address.conversationId, replyThreadTs, text)\n : await bot.postMessage(address.conversationId, text);\n bot.logBotResponse?.(address.conversationId, text, ts, replyThreadTs);\n return ts;\n };\n const state = this.sessions.get(address, sessionKey);\n if (!state?.running) {\n await post(formatNothingRunning(bot));\n return;\n }\n const settlement = state.runSettlement;\n state.stopNoticeOwned = true;\n requestStop(state);\n try {\n const ts = await post(formatStopping(bot));\n await settlement;\n const stoppedText = formatStopped(bot);\n await bot.updateMessage(address.conversationId, ts, stoppedText);\n bot.logBotResponse?.(address.conversationId, stoppedText, ts, replyThreadTs);\n } finally {\n state.stopNoticeOwned = false;\n }\n }\n\n forceStop(address: OfficeAddress, sessionKey: string): void {\n const state = this.sessions.get(address, sessionKey);\n if (state?.running) {\n log.logInfo(`[Force Stop] Force stopping session: ${sessionKey}`);\n requestStop(state);\n }\n }\n\n async handleNewCommand({ bot, message }: HandleNewCommandOptions): Promise<void> {\n const { address, sessionKey } = message;\n assertSessionKeyBelongsToConversation(sessionKey, address.conversationId);\n\n const activeState = this.sessions.get(address, sessionKey);\n if (activeState?.runSettlement) {\n if (activeState.running) requestStop(activeState);\n await activeState.runSettlement;\n }\n\n await this.resetSession(address, sessionKey, bot);\n }\n\n async handleCompactCommand(options: HandleCompactCommandOptions): Promise<CompactOutcome> {\n const { address, sessionKey, platform, instructions } = options;\n assertSessionKeyBelongsToConversation(sessionKey, address.conversationId);\n const lease = await this.acquireState({\n address,\n sessionKey,\n trustModel: platform.trustModel ?? \"membership\",\n platformWorkspaceId: platform.workspaceId,\n });\n try {\n return await lease.state.runner.compact(instructions);\n } finally {\n lease.release();\n }\n }\n\n private async resetSession(\n address: OfficeAddress,\n sessionKey: string,\n bot: MessagingBot,\n ): Promise<void> {\n const conversationId = address.conversationId;\n const office = this.options.workspace.office(address);\n await this.sessions.discardAndWait(address, sessionKey);\n await this.chatSessionManager.resetSession({ office, sessionKey });\n\n log.logInfo(`[${conversationId}] Session reset: ${sessionKey}`);\n await bot.postMessage(conversationId, \"Conversation reset. Send a new message to start fresh.\");\n }\n\n async handleEvent(\n event: ConversationEvent,\n bot: MessagingBot,\n context: ConversationContext,\n ): Promise<void> {\n const sessionKey = deriveSessionKey(event);\n await this.sessions.enqueue(event.address, sessionKey, () =>\n this.runSession({ event, bot, context }),\n );\n }\n\n async runSession(options: RunSessionOptions): Promise<void> {\n const { event } = options;\n const conversationId = event.address.conversationId;\n if (this.isShuttingDown) {\n log.logInfo(\n `[${conversationId}] Rejected event during shutdown: ${event.text.substring(0, 50)}`,\n );\n return;\n }\n\n const sessionKey = deriveSessionKey(event);\n if (await this.handledBeforeRun(options, sessionKey)) return;\n\n await this.waitForParentSession(event.address, sessionKey);\n\n const lease = await this.acquireRunLease(options, sessionKey);\n const { state } = lease;\n state.detachOnShutdown = isTaskRunId(event.ts);\n log.logInfo(`[${conversationId}] Starting run: ${event.text.substring(0, 50)}`);\n const runPromise = this.sessions.settle(state, () =>\n this.executeRun(options, sessionKey, state),\n );\n lease.release();\n recordGauge(\"agent.sessions.active\", this.sessions.settlementCount());\n await runPromise;\n }\n\n private async handledBeforeRun(options: RunSessionOptions, sessionKey: string): Promise<boolean> {\n const { event } = options;\n if (await this.dispatchSessionCommand(options, sessionKey)) return true;\n\n const activeSettlement = this.sessions.get(event.address, sessionKey)?.runSettlement;\n if (activeSettlement) await activeSettlement;\n return false;\n }\n\n private async acquireRunLease(\n { event, context }: RunSessionOptions,\n sessionKey: string,\n ): Promise<{ state: ConversationState; release: () => void }> {\n let lease: { state: ConversationState; release: () => void } | undefined;\n try {\n lease = await this.acquireState({\n address: event.address,\n sessionKey,\n currentMessageId: event.ts,\n trustModel: context.platform.trustModel ?? \"membership\",\n platformWorkspaceId: context.platform.workspaceId,\n });\n await lease.state.runner.syncChatHistory(event.ts);\n return lease;\n } catch (err) {\n lease?.release();\n reportUserFacingError(err, {\n domain: \"mikan\",\n surface: \"session_setup\",\n operation: \"get_or_create_state\",\n severity: \"error\",\n platform: context.platform.name,\n context: {\n conversationId: event.address.conversationId,\n sessionKey,\n messageId: context.message.id,\n threadTs: context.message.threadTs,\n attachmentCount: context.message.attachments?.length ?? 0,\n },\n });\n throw err;\n }\n }\n\n private async executeRun(\n { event, bot, context }: RunSessionOptions,\n sessionKey: string,\n state: ConversationState,\n ): Promise<void> {\n const conversationId = event.address.conversationId;\n try {\n const result = await this.runWithInstrumentation(\n context,\n { conversationId, sessionKey, startedAt: state.startedAt },\n async () => {\n await context.responder.setTyping(true);\n await context.responder.setWorking(true);\n try {\n return await state.runner.run(context.message, context.responder, context.platform);\n } finally {\n await context.responder.setWorking(false);\n }\n },\n );\n\n if (result?.stopReason === \"aborted\") {\n await postAbortNotice(state, bot, conversationId, context.platform.name);\n } else if (result && state.detachOnShutdown) {\n await this.reportTaskOutcome(event.address, sessionKey, result.finalText ?? \"\");\n }\n if (result) {\n this.memoryCapture?.capture({\n office: this.options.workspace.office(event.address),\n message: context.message,\n stopReason: result.stopReason,\n reply: result.finalText ?? \"\",\n });\n }\n } finally {\n recordGauge(\"agent.sessions.active\", this.sessions.settlementCount() - 1);\n }\n }\n\n private async reportTaskOutcome(\n address: OfficeAddress,\n sessionKey: string,\n answer: string,\n ): Promise<void> {\n try {\n await SessionStore.reportTaskOutcome(\n this.options.workspace.office(address),\n sessionKey,\n stripTriggerSignature(answer),\n );\n } catch (error) {\n log.logWarning(`[${sessionKey}] Could not report the task outcome`, errorMessage(error));\n }\n }\n\n private async waitForParentSession(address: OfficeAddress, sessionKey: string): Promise<void> {\n const conversationId = address.conversationId;\n const office = this.options.workspace.office(address);\n const waited = await waitForThreadSessionBootstrap({\n parentSessionKey: conversationId,\n sessionKey,\n hasThreadSession: () => hasMaterializedChatSession({ office, sessionKey }),\n isParentRunning: () => this.sessions.get(address, conversationId)?.running === true,\n });\n if (waited) {\n log.logInfo(\n `[${conversationId}] Delayed thread bootstrap until parent session sealed: ${sessionKey}`,\n );\n }\n }\n\n private async dispatchSessionCommand(\n { event, bot, context }: RunSessionOptions,\n sessionKey: string,\n ): Promise<boolean> {\n return dispatchCommand(this.commandHandlers, {\n bot,\n responder: context.responder,\n platform: context.platform.name as PlatformName,\n address: event.address,\n platformUserId: event.user,\n platformUserName: context.message.userName,\n conversationId: event.address.conversationId,\n vaultConversationId: event.vaultConversationId,\n sessionKey,\n commandText: event.text,\n privateConversation: isPrivateConversation(event),\n messagingInfo: context.platform,\n services: this.commandServices,\n });\n }\n\n private async runWithInstrumentation(\n context: ConversationContext,\n meta: {\n conversationId: string;\n sessionKey: string;\n startedAt: number;\n },\n body: () => Promise<RunResult>,\n ): Promise<RunResult | undefined> {\n const { conversationId, sessionKey, startedAt } = meta;\n const { message, platform } = context;\n\n const attribution = createRunAttributionAttributes({\n conversationId,\n sessionKey,\n messageId: message.id,\n platform: platform.name,\n conversationKind: message.conversationKind,\n userId: message.userId,\n threadTs: message.threadTs,\n });\n\n recordCounter(\"agent.run.started\", 1, attribution);\n\n return withRunSpan(\n {\n conversationId,\n sessionKey,\n messageId: message.id,\n platform: platform.name,\n conversationKind: message.conversationKind,\n userId: message.userId,\n threadTs: message.threadTs,\n },\n async () => {\n addLifecycleEvent(\"agent.run.started\", {\n channel_id: attribution.channel_id,\n platform: platform.name,\n conversation_kind: message.conversationKind,\n has_attachments: (message.attachments?.length ?? 0) > 0,\n });\n\n try {\n const result = await body();\n const durationMs = Date.now() - startedAt;\n const completionAttrs = {\n ...attribution,\n stop_reason: result.stopReason,\n };\n recordDistribution(\"agent.run.duration\", durationMs, {\n unit: \"millisecond\",\n attributes: completionAttrs,\n });\n recordCounter(\"agent.run.completed\", 1, completionAttrs);\n addLifecycleEvent(\"agent.run.completed\", {\n channel_id: attribution.channel_id,\n platform: platform.name,\n stop_reason: result.stopReason,\n duration_ms: durationMs,\n });\n return result;\n } catch (err) {\n reportUserFacingError(err, {\n domain: \"mikan\",\n surface: \"agent_run\",\n operation: \"run\",\n severity: \"error\",\n platform: platform.name,\n context: {\n conversationId,\n sessionKey,\n messageId: message.id,\n threadTs: message.threadTs,\n attachmentCount: message.attachments?.length ?? 0,\n },\n });\n recordCounter(\"agent.run.errors\", 1, attribution);\n log.logWarning(`[${conversationId}] Run error`, errorMessage(err));\n await context.responder\n .replaceResponse(\"Could not complete the request. Please reply to retry or revise it.\")\n .catch(() => {});\n return undefined;\n }\n },\n );\n }\n\n refreshConversation(address: OfficeAddress): boolean {\n const cleared = this.sessions.invalidateConversation(address);\n if (cleared) log.logInfo(`[${address.conversationId}] Cleared cached session runners`);\n return cleared;\n }\n\n refreshAllConversations(): { busy: OfficeAddress[] } {\n const offices = this.sessions.offices();\n const result = this.sessions.invalidateAll();\n const busyKeys = new Set(\n result.busy.map((address) => `${address.platform}:${address.conversationId}`),\n );\n for (const address of offices) {\n if (busyKeys.has(`${address.platform}:${address.conversationId}`)) continue;\n log.logInfo(\n `[${address.conversationId}] Global settings changed; cleared cached session runners`,\n );\n }\n return result;\n }\n\n private async createCurrentRunner(\n options: SessionStateOptions,\n sessionScope: Awaited<ReturnType<ChatHistorySync[\"resolveSessionScope\"]>>,\n signal: AbortSignal,\n ): Promise<PiAgentWrapper> {\n const runnerFactory = this.options.runnerFactory ?? createRunner;\n return runnerFactory({\n sandboxConfig: this.options.sandbox,\n sessionKey: options.sessionKey,\n office: this.options.workspace.office(options.address),\n trustModel: options.trustModel,\n platformWorkspaceId: options.platformWorkspaceId,\n openConnector: this.options.openConnector,\n eventScheduler: this.options.eventScheduler?.(),\n sessionScope,\n chatHistory: this.chatSessionManager,\n signal,\n vaultManager: this.options.vaultManager,\n provisioner: this.options.provisioner,\n resourceController: this.options.resourceController,\n sessionView: this.options.sessionViewTokenStore\n ? {\n tokenStore: this.options.sessionViewTokenStore,\n portalBaseUrl: this.options.portalBaseUrl,\n }\n : undefined,\n desktop:\n this.options.desktopTokenStore && this.options.openDesktop\n ? {\n tokenStore: this.options.desktopTokenStore,\n portalBaseUrl: this.options.portalBaseUrl,\n open: this.options.openDesktop,\n }\n : undefined,\n platformToolPackFactories: this.options.platformToolPackFactories,\n models: this.resolvedModels,\n runEvents: this.options.runEvents,\n });\n }\n\n private acquireState(options: SessionStateOptions & { currentMessageId?: string }) {\n const { address, sessionKey } = options;\n const office = this.options.workspace.office(address);\n return this.sessions.acquire(address, sessionKey, (signal) =>\n this.materializeState(options, office, signal),\n );\n }\n\n private async materializeState(\n options: SessionStateOptions & { currentMessageId?: string },\n office: Office,\n signal: AbortSignal,\n ): Promise<ConversationState> {\n signal.throwIfAborted();\n const { address, sessionKey, currentMessageId } = options;\n const sessionScope = await this.chatSessionManager.resolveSessionScope({\n office,\n sessionKey,\n currentMessageId,\n });\n signal.throwIfAborted();\n return {\n address,\n sessionKey,\n running: false,\n runner: await this.createCurrentRunner(options, sessionScope, signal),\n stopRequested: false,\n lastAccessedAt: Date.now(),\n startedAt: 0,\n };\n }\n\n async shutdown(timeoutMs = 30_000): Promise<void> {\n if (this.isShuttingDown) return;\n this.isShuttingDown = true;\n log.logInfo(\"Shutting down gracefully...\");\n await this.sessions.shutdown(timeoutMs);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"conversation-runtime.js","sourceRoot":"","sources":["../../src/runtime/conversation-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n MessagingBot,\n ConversationContext,\n ConversationMessage,\n ConversationEvent,\n CompactOutcome,\n HandleCompactCommandOptions,\n HandleNewCommandOptions,\n OfficeAddress,\n PlatformName,\n RunningSession,\n} from \"../types.js\";\nimport type { Office } from \"../office/types.js\";\nimport { createRunner } from \"../harness/runner.js\";\nimport type { PiAgentWrapper } from \"../types.js\";\nimport type { RunMemoryCapture } from \"../memory-capture/types.js\";\nimport { defaultModelsJsonPath, MikanModels } from \"../harness/models.js\";\nimport { isCommandText } from \"../adapters/commands/manifest.js\";\nimport { defaultCommandHandlers, dispatchCommand } from \"../adapters/commands/registry.js\";\nimport type { CommandHandler, CommandServices } from \"../adapters/commands/types.js\";\nimport { isPrivateConversation } from \"../adapters/commands/utils.js\";\nimport * as log from \"../log.js\";\nimport {\n addLifecycleEvent,\n createRunAttributionAttributes,\n recordCounter,\n recordDistribution,\n recordGauge,\n reportUserFacingError,\n withRunSpan,\n} from \"../observability/index.js\";\nimport {\n ChatHistorySync,\n hasMaterializedChatSession,\n waitForThreadSessionBootstrap,\n} from \"../sessions/chat-history-sync.js\";\nimport {\n assertSessionKeyBelongsToConversation,\n deriveSessionKey,\n threadSuffixOf,\n} from \"../sessions/session-key.js\";\nimport {\n formatNothingRunning,\n formatRestarting,\n formatStopped,\n formatStopping,\n} from \"../adapters/messages.js\";\nimport { disabledVaultManager } from \"../vault/index.js\";\nimport type { ConversationRuntimeState } from \"./types.js\";\nimport { SessionLifecycle } from \"./session-lifecycle.js\";\n\ntype ConversationState = ConversationRuntimeState;\n\nimport type {\n RunSessionOptions,\n ConversationRuntime,\n ConversationRuntimeOptions,\n SessionStateOptions,\n} from \"./types.js\";\nimport { errorMessage } from \"../unknown-values.js\";\nimport { SessionStore } from \"../sessions/session-store.js\";\nimport { stripTriggerSignature } from \"../sessions/history-line.js\";\nimport { isTaskRunId } from \"../harness/tools/task.js\";\nimport { isContinuedRunId } from \"../harness/continued-run.js\";\n\ntype RunResult = Awaited<ReturnType<PiAgentWrapper[\"run\"]>>;\n\nfunction portalNotConfiguredTokenStore(portal: string): { create: () => never } {\n return {\n create: () => {\n throw new Error(`${portal} portal not configured`);\n },\n };\n}\n\nfunction requestStop(state: ConversationRuntimeState): void {\n state.stopRequested = true;\n state.runner.abort();\n}\n\nasync function postAbortNotice(\n state: ConversationRuntimeState,\n bot: MessagingBot,\n conversationId: string,\n platformName: string,\n): Promise<void> {\n if (state.shutdownAborted) {\n recordCounter(\"agent.run.shutdown_aborted\", 1, { platform: platformName });\n const text = formatRestarting(bot);\n const ts = await bot.postMessage(conversationId, text);\n bot.logBotResponse?.(conversationId, text, ts);\n return;\n }\n if (!state.stopRequested) return;\n if (state.stopNoticeOwned) return;\n const thread = threadSuffixOf(state.sessionKey) ?? undefined;\n const text = formatStopped(bot);\n const ts =\n thread && bot.postInThread\n ? await bot.postInThread(conversationId, thread, text)\n : await bot.postMessage(conversationId, text);\n bot.logBotResponse?.(conversationId, text, ts, thread);\n}\n\nexport function createConversationRuntime(\n options: ConversationRuntimeOptions,\n): ConversationRuntime {\n return new ConversationRuntimeImpl(options);\n}\n\nclass ConversationRuntimeImpl implements ConversationRuntime {\n private readonly sessions = new SessionLifecycle();\n private readonly chatSessionManager = new ChatHistorySync({ isCommandText });\n private readonly commandServices: CommandServices;\n private readonly commandHandlers: readonly CommandHandler[];\n private readonly resolvedModels: MikanModels;\n private readonly memoryCapture: RunMemoryCapture | undefined;\n private isShuttingDown = false;\n\n constructor(private readonly options: ConversationRuntimeOptions) {\n this.resolvedModels =\n options.models ??\n MikanModels.create({ modelsJsonPath: defaultModelsJsonPath(options.workspace.stateDir) });\n this.memoryCapture = options.memoryCapture?.(this.resolvedModels);\n this.commandServices = {\n ...options,\n resourceController: options.resourceController ?? options.provisioner,\n vaultManager: options.vaultManager ?? disabledVaultManager,\n linkTokenStore: options.linkTokenStore ?? portalNotConfiguredTokenStore(\"Login\"),\n sessionViewTokenStore:\n options.sessionViewTokenStore ?? portalNotConfiguredTokenStore(\"Session viewer\"),\n adminTokenStore: options.adminTokenStore ?? portalNotConfiguredTokenStore(\"Admin\"),\n runtime: this,\n };\n this.commandHandlers = options.commandHandlers ?? defaultCommandHandlers(this.resolvedModels);\n }\n\n isRunning(address: OfficeAddress, sessionKey: string): boolean {\n return this.sessions.get(address, sessionKey)?.running === true;\n }\n\n getRunningSessions(): RunningSession[] {\n const sessions: RunningSession[] = [];\n for (const state of this.sessions.runningStates()) {\n if (state.startedAt) {\n const currentStep = state.runner.getCurrentStep();\n sessions.push({\n address: state.address,\n sessionKey: state.sessionKey,\n startedAt: state.startedAt,\n lastActivityAt: state.lastActivityAt,\n currentTool: currentStep?.label || currentStep?.toolName,\n stopping: state.stopRequested ? true : undefined,\n });\n }\n }\n return sessions;\n }\n\n async steer(message: ConversationMessage): Promise<boolean> {\n const state = this.sessions.get(message.address, message.sessionKey);\n if (!state?.running) return false;\n return state.runner.steer ? state.runner.steer(message) : false;\n }\n\n async handleStop(\n address: OfficeAddress,\n sessionKey: string,\n bot: MessagingBot,\n replyThreadTs?: string,\n ): Promise<void> {\n assertSessionKeyBelongsToConversation(sessionKey, address.conversationId);\n const post = async (text: string) => {\n const ts =\n replyThreadTs && bot.postInThread\n ? await bot.postInThread(address.conversationId, replyThreadTs, text)\n : await bot.postMessage(address.conversationId, text);\n bot.logBotResponse?.(address.conversationId, text, ts, replyThreadTs);\n return ts;\n };\n const state = this.sessions.get(address, sessionKey);\n if (!state?.running) {\n await post(formatNothingRunning(bot));\n return;\n }\n const settlement = state.runSettlement;\n state.stopNoticeOwned = true;\n requestStop(state);\n try {\n const ts = await post(formatStopping(bot));\n await settlement;\n const stoppedText = formatStopped(bot);\n await bot.updateMessage(address.conversationId, ts, stoppedText);\n bot.logBotResponse?.(address.conversationId, stoppedText, ts, replyThreadTs);\n } finally {\n state.stopNoticeOwned = false;\n }\n }\n\n forceStop(address: OfficeAddress, sessionKey: string): void {\n const state = this.sessions.get(address, sessionKey);\n if (state?.running) {\n log.logInfo(`[Force Stop] Force stopping session: ${sessionKey}`);\n requestStop(state);\n }\n }\n\n async handleNewCommand({ bot, message }: HandleNewCommandOptions): Promise<void> {\n const { address, sessionKey } = message;\n assertSessionKeyBelongsToConversation(sessionKey, address.conversationId);\n\n const activeState = this.sessions.get(address, sessionKey);\n if (activeState?.runSettlement) {\n if (activeState.running) requestStop(activeState);\n await activeState.runSettlement;\n }\n\n await this.resetSession(address, sessionKey, bot);\n }\n\n async handleCompactCommand(options: HandleCompactCommandOptions): Promise<CompactOutcome> {\n const { address, sessionKey, platform, instructions } = options;\n assertSessionKeyBelongsToConversation(sessionKey, address.conversationId);\n const lease = await this.acquireState({\n address,\n sessionKey,\n trustModel: platform.trustModel ?? \"membership\",\n platformWorkspaceId: platform.workspaceId,\n });\n try {\n return await lease.state.runner.compact(instructions);\n } finally {\n lease.release();\n }\n }\n\n private async resetSession(\n address: OfficeAddress,\n sessionKey: string,\n bot: MessagingBot,\n ): Promise<void> {\n const conversationId = address.conversationId;\n const office = this.options.workspace.office(address);\n await this.sessions.discardAndWait(address, sessionKey);\n await this.chatSessionManager.resetSession({ office, sessionKey });\n\n log.logInfo(`[${conversationId}] Session reset: ${sessionKey}`);\n await bot.postMessage(conversationId, \"Conversation reset. Send a new message to start fresh.\");\n }\n\n async handleEvent(\n event: ConversationEvent,\n bot: MessagingBot,\n context: ConversationContext,\n ): Promise<void> {\n const sessionKey = deriveSessionKey(event);\n await this.sessions.enqueue(event.address, sessionKey, () =>\n this.runSession({ event, bot, context }),\n );\n }\n\n async runSession(options: RunSessionOptions): Promise<void> {\n const { event } = options;\n const conversationId = event.address.conversationId;\n if (this.isShuttingDown) {\n log.logInfo(\n `[${conversationId}] Rejected event during shutdown: ${event.text.substring(0, 50)}`,\n );\n return;\n }\n\n const sessionKey = deriveSessionKey(event);\n if (await this.handledBeforeRun(options, sessionKey)) return;\n\n await this.waitForParentSession(event.address, sessionKey);\n\n const lease = await this.acquireRunLease(options, sessionKey);\n const { state } = lease;\n state.detachOnShutdown =\n isTaskRunId(event.ts) || options.context.platform.continuesInterruptedRuns === true;\n log.logInfo(`[${conversationId}] Starting run: ${event.text.substring(0, 50)}`);\n const runPromise = this.sessions.settle(state, () =>\n this.executeRun(options, sessionKey, state),\n );\n lease.release();\n recordGauge(\"agent.sessions.active\", this.sessions.settlementCount());\n await runPromise;\n }\n\n private async handledBeforeRun(options: RunSessionOptions, sessionKey: string): Promise<boolean> {\n const { event } = options;\n if (await this.dispatchSessionCommand(options, sessionKey)) return true;\n\n const activeSettlement = this.sessions.get(event.address, sessionKey)?.runSettlement;\n if (activeSettlement) await activeSettlement;\n return false;\n }\n\n private async acquireRunLease(\n { event, context }: RunSessionOptions,\n sessionKey: string,\n ): Promise<{ state: ConversationState; release: () => void }> {\n let lease: { state: ConversationState; release: () => void } | undefined;\n try {\n lease = await this.acquireState({\n address: event.address,\n sessionKey,\n currentMessageId: event.ts,\n trustModel: context.platform.trustModel ?? \"membership\",\n platformWorkspaceId: context.platform.workspaceId,\n });\n if (!isContinuedRunId(event.ts)) await lease.state.runner.syncChatHistory(event.ts);\n return lease;\n } catch (err) {\n lease?.release();\n reportUserFacingError(err, {\n domain: \"mikan\",\n surface: \"session_setup\",\n operation: \"get_or_create_state\",\n severity: \"error\",\n platform: context.platform.name,\n context: {\n conversationId: event.address.conversationId,\n sessionKey,\n messageId: context.message.id,\n threadTs: context.message.threadTs,\n attachmentCount: context.message.attachments?.length ?? 0,\n },\n });\n throw err;\n }\n }\n\n private async executeRun(\n { event, bot, context }: RunSessionOptions,\n sessionKey: string,\n state: ConversationState,\n ): Promise<void> {\n const conversationId = event.address.conversationId;\n try {\n const result = await this.runWithInstrumentation(\n context,\n { conversationId, sessionKey, startedAt: state.startedAt },\n async () => {\n await context.responder.setTyping(true);\n await context.responder.setWorking(true);\n try {\n return await state.runner.run(context.message, context.responder, context.platform);\n } finally {\n await context.responder.setWorking(false);\n }\n },\n );\n\n if (result?.stopReason === \"aborted\") {\n await postAbortNotice(state, bot, conversationId, context.platform.name);\n } else if (result) {\n await this.reportTaskOutcome(event.address, sessionKey, result.finalText ?? \"\");\n }\n if (result) {\n this.memoryCapture?.capture({\n office: this.options.workspace.office(event.address),\n message: context.message,\n stopReason: result.stopReason,\n reply: result.finalText ?? \"\",\n });\n }\n } finally {\n recordGauge(\"agent.sessions.active\", this.sessions.settlementCount() - 1);\n }\n }\n\n private async reportTaskOutcome(\n address: OfficeAddress,\n sessionKey: string,\n answer: string,\n ): Promise<void> {\n try {\n await SessionStore.reportTaskOutcome(\n this.options.workspace.office(address),\n sessionKey,\n stripTriggerSignature(answer),\n );\n } catch (error) {\n log.logWarning(`[${sessionKey}] Could not report the task outcome`, errorMessage(error));\n }\n }\n\n private async waitForParentSession(address: OfficeAddress, sessionKey: string): Promise<void> {\n const conversationId = address.conversationId;\n const office = this.options.workspace.office(address);\n const waited = await waitForThreadSessionBootstrap({\n parentSessionKey: conversationId,\n sessionKey,\n hasThreadSession: () => hasMaterializedChatSession({ office, sessionKey }),\n isParentRunning: () => this.sessions.get(address, conversationId)?.running === true,\n });\n if (waited) {\n log.logInfo(\n `[${conversationId}] Delayed thread bootstrap until parent session sealed: ${sessionKey}`,\n );\n }\n }\n\n private async dispatchSessionCommand(\n { event, bot, context }: RunSessionOptions,\n sessionKey: string,\n ): Promise<boolean> {\n return dispatchCommand(this.commandHandlers, {\n bot,\n responder: context.responder,\n platform: context.platform.name as PlatformName,\n address: event.address,\n platformUserId: event.user,\n platformUserName: context.message.userName,\n conversationId: event.address.conversationId,\n vaultConversationId: event.vaultConversationId,\n sessionKey,\n commandText: event.text,\n privateConversation: isPrivateConversation(event),\n messagingInfo: context.platform,\n services: this.commandServices,\n });\n }\n\n private async runWithInstrumentation(\n context: ConversationContext,\n meta: {\n conversationId: string;\n sessionKey: string;\n startedAt: number;\n },\n body: () => Promise<RunResult>,\n ): Promise<RunResult | undefined> {\n const { conversationId, sessionKey, startedAt } = meta;\n const { message, platform } = context;\n\n const attribution = createRunAttributionAttributes({\n conversationId,\n sessionKey,\n messageId: message.id,\n platform: platform.name,\n conversationKind: message.conversationKind,\n userId: message.userId,\n threadTs: message.threadTs,\n });\n\n recordCounter(\"agent.run.started\", 1, attribution);\n\n return withRunSpan(\n {\n conversationId,\n sessionKey,\n messageId: message.id,\n platform: platform.name,\n conversationKind: message.conversationKind,\n userId: message.userId,\n threadTs: message.threadTs,\n },\n async () => {\n addLifecycleEvent(\"agent.run.started\", {\n channel_id: attribution.channel_id,\n platform: platform.name,\n conversation_kind: message.conversationKind,\n has_attachments: (message.attachments?.length ?? 0) > 0,\n });\n\n try {\n const result = await body();\n const durationMs = Date.now() - startedAt;\n const completionAttrs = {\n ...attribution,\n stop_reason: result.stopReason,\n };\n recordDistribution(\"agent.run.duration\", durationMs, {\n unit: \"millisecond\",\n attributes: completionAttrs,\n });\n recordCounter(\"agent.run.completed\", 1, completionAttrs);\n addLifecycleEvent(\"agent.run.completed\", {\n channel_id: attribution.channel_id,\n platform: platform.name,\n stop_reason: result.stopReason,\n duration_ms: durationMs,\n });\n return result;\n } catch (err) {\n reportUserFacingError(err, {\n domain: \"mikan\",\n surface: \"agent_run\",\n operation: \"run\",\n severity: \"error\",\n platform: platform.name,\n context: {\n conversationId,\n sessionKey,\n messageId: message.id,\n threadTs: message.threadTs,\n attachmentCount: message.attachments?.length ?? 0,\n },\n });\n recordCounter(\"agent.run.errors\", 1, attribution);\n log.logWarning(`[${conversationId}] Run error`, errorMessage(err));\n await context.responder\n .replaceResponse(\"Could not complete the request. Please reply to retry or revise it.\")\n .catch(() => {});\n return undefined;\n }\n },\n );\n }\n\n refreshConversation(address: OfficeAddress): boolean {\n const cleared = this.sessions.invalidateConversation(address);\n if (cleared) log.logInfo(`[${address.conversationId}] Cleared cached session runners`);\n return cleared;\n }\n\n refreshAllConversations(): { busy: OfficeAddress[] } {\n const offices = this.sessions.offices();\n const result = this.sessions.invalidateAll();\n const busyKeys = new Set(\n result.busy.map((address) => `${address.platform}:${address.conversationId}`),\n );\n for (const address of offices) {\n if (busyKeys.has(`${address.platform}:${address.conversationId}`)) continue;\n log.logInfo(\n `[${address.conversationId}] Global settings changed; cleared cached session runners`,\n );\n }\n return result;\n }\n\n private async createCurrentRunner(\n options: SessionStateOptions,\n sessionScope: Awaited<ReturnType<ChatHistorySync[\"resolveSessionScope\"]>>,\n signal: AbortSignal,\n ): Promise<PiAgentWrapper> {\n const runnerFactory = this.options.runnerFactory ?? createRunner;\n return runnerFactory({\n sandboxConfig: this.options.sandbox,\n sessionKey: options.sessionKey,\n office: this.options.workspace.office(options.address),\n trustModel: options.trustModel,\n platformWorkspaceId: options.platformWorkspaceId,\n openConnector: this.options.openConnector,\n eventScheduler: this.options.eventScheduler?.(),\n sessionScope,\n chatHistory: this.chatSessionManager,\n signal,\n vaultManager: this.options.vaultManager,\n provisioner: this.options.provisioner,\n resourceController: this.options.resourceController,\n sessionView: this.options.sessionViewTokenStore\n ? {\n tokenStore: this.options.sessionViewTokenStore,\n portalBaseUrl: this.options.portalBaseUrl,\n }\n : undefined,\n desktop:\n this.options.desktopTokenStore && this.options.openDesktop\n ? {\n tokenStore: this.options.desktopTokenStore,\n portalBaseUrl: this.options.portalBaseUrl,\n open: this.options.openDesktop,\n }\n : undefined,\n platformToolPackFactories: this.options.platformToolPackFactories,\n models: this.resolvedModels,\n runEvents: this.options.runEvents,\n });\n }\n\n private acquireState(options: SessionStateOptions & { currentMessageId?: string }) {\n const { address, sessionKey } = options;\n const office = this.options.workspace.office(address);\n return this.sessions.acquire(address, sessionKey, (signal) =>\n this.materializeState(options, office, signal),\n );\n }\n\n private async materializeState(\n options: SessionStateOptions & { currentMessageId?: string },\n office: Office,\n signal: AbortSignal,\n ): Promise<ConversationState> {\n signal.throwIfAborted();\n const { address, sessionKey, currentMessageId } = options;\n const sessionScope = await this.chatSessionManager.resolveSessionScope({\n office,\n sessionKey,\n currentMessageId,\n });\n signal.throwIfAborted();\n return {\n address,\n sessionKey,\n running: false,\n runner: await this.createCurrentRunner(options, sessionScope, signal),\n stopRequested: false,\n lastAccessedAt: Date.now(),\n startedAt: 0,\n };\n }\n\n async shutdown(timeoutMs = 30_000): Promise<void> {\n if (this.isShuttingDown) return;\n this.isShuttingDown = true;\n log.logInfo(\"Shutting down gracefully...\");\n await this.sessions.shutdown(timeoutMs);\n }\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AgentMessage } from "@earendil-works/pi-agent-core";
|
|
2
2
|
import type { JsonValue } from "@earendil-works/chord";
|
|
3
3
|
import type { Office } from "../office/types.js";
|
|
4
|
-
import type { AttachedSessionHarness, ImportedSession, ImportedSessionEntry,
|
|
4
|
+
import type { AttachedSessionHarness, ImportedSession, ImportedSessionEntry, SessionHarnessBinding, SessionContext, SessionEntry, SessionHeader, SessionInspection, SessionListing, SessionRunRecord, SessionExecution, SessionSpend, ResponseUsage, TaskBrief, TaskSessionState } from "./types.js";
|
|
5
5
|
import type { McpServerConfig, McpServerSummary } from "../harness/types.js";
|
|
6
6
|
export declare const ScriptStoreDoc: import("@earendil-works/pi-durable").RewindableConversationDocToken<{
|
|
7
7
|
values: Record<string, JsonValue>;
|
|
@@ -33,8 +33,7 @@ export declare class SessionStore implements SessionInspection {
|
|
|
33
33
|
static list(office: Office): Promise<SessionListing[]>;
|
|
34
34
|
static inspect(office: Office, key: string): Promise<SessionInspection | undefined>;
|
|
35
35
|
static reportTaskOutcome(office: Office, key: string, answer: string): Promise<void>;
|
|
36
|
-
static
|
|
37
|
-
static interruptedSince(office: Office, keys: readonly string[], sinceMs: number): Promise<string[]>;
|
|
36
|
+
static continueInterrupted(office: Office): Promise<string[]>;
|
|
38
37
|
static listTasks(office: Office, requesterKey: string): Promise<TaskSessionState[]>;
|
|
39
38
|
static inspectExecution(office: Office, key: string): Promise<SessionExecution>;
|
|
40
39
|
static spend(office: Office, key: string): Promise<SessionSpend | undefined>;
|
|
@@ -49,6 +48,8 @@ export declare class SessionStore implements SessionInspection {
|
|
|
49
48
|
buildSessionContext(): Promise<SessionContext>;
|
|
50
49
|
connectMcp(servers: Record<string, McpServerConfig>, signal?: AbortSignal): Promise<import("../harness/types.js").MikanHarnessTool[]>;
|
|
51
50
|
mcpServers(): readonly McpServerSummary[];
|
|
51
|
+
continueInterruptedRun(): Promise<boolean>;
|
|
52
|
+
whenContinued(): Promise<void>;
|
|
52
53
|
bindHarness(binding: SessionHarnessBinding): Promise<AttachedSessionHarness>;
|
|
53
54
|
appendEntries(entries: readonly ImportedSessionEntry[]): Promise<void>;
|
|
54
55
|
appendMessage(message: AgentMessage): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/sessions/session-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAkCvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EACV,sBAAsB,EAEtB,eAAe,EACf,oBAAoB,EACpB,
|
|
1
|
+
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/sessions/session-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { chmodSync, existsSync, mkdirSync } from "node:fs";
|
|
1
|
+
import { chmodSync, existsSync, mkdirSync, statSync } from "node:fs";
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
3
|
import { dirname } from "node:path";
|
|
4
4
|
import { BACKGROUND_CONTEXT } from "@earendil-works/chord/context";
|
|
@@ -143,6 +143,11 @@ function protectStorageFiles(path) {
|
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
145
|
const REQUEST_METHODS = new Set(["streamSimple", "completeSimple"]);
|
|
146
|
+
const CONTINUATION_WINDOW_MS = 24 * 60 * 60 * 1000;
|
|
147
|
+
const CONTINUATION_BIND_TIMEOUT_MS = 60_000;
|
|
148
|
+
function lastWriteMs(path) {
|
|
149
|
+
return Math.max(...[path, `${path}-wal`].map((file) => (existsSync(file) ? statSync(file).mtimeMs : 0)));
|
|
150
|
+
}
|
|
146
151
|
class OfficeStorage {
|
|
147
152
|
static { this.pool = new Map(); }
|
|
148
153
|
constructor(path) {
|
|
@@ -158,10 +163,10 @@ class OfficeStorage {
|
|
|
158
163
|
throw new Error("Office session storage is not open");
|
|
159
164
|
return this.opened;
|
|
160
165
|
}
|
|
161
|
-
static async acquire(path) {
|
|
166
|
+
static async acquire(path, keepUnfinished = false) {
|
|
162
167
|
let pending = OfficeStorage.pool.get(path);
|
|
163
168
|
if (!pending) {
|
|
164
|
-
pending = OfficeStorage.openShared(path);
|
|
169
|
+
pending = OfficeStorage.openShared(path, keepUnfinished);
|
|
165
170
|
OfficeStorage.pool.set(path, pending);
|
|
166
171
|
pending.catch(() => OfficeStorage.pool.delete(path));
|
|
167
172
|
}
|
|
@@ -174,13 +179,57 @@ class OfficeStorage {
|
|
|
174
179
|
storage.refs = 1;
|
|
175
180
|
return storage;
|
|
176
181
|
}
|
|
177
|
-
static async openShared(path) {
|
|
182
|
+
static async openShared(path, keepUnfinished) {
|
|
178
183
|
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
179
184
|
const storage = await OfficeStorage.open(path, await openNodeSqliteStorage(path));
|
|
180
185
|
protectStorageFiles(path);
|
|
181
|
-
|
|
186
|
+
if (!keepUnfinished)
|
|
187
|
+
await storage.abortUnfinishedWork(() => true);
|
|
182
188
|
return storage;
|
|
183
189
|
}
|
|
190
|
+
async planContinuation(continues) {
|
|
191
|
+
const unfinished = await this.unfinishedWork();
|
|
192
|
+
const kept = new Set(unfinished.map((task) => task.conversationId).filter(continues));
|
|
193
|
+
await this.abortUnfinishedWork((id) => !kept.has(id));
|
|
194
|
+
if (kept.size === 0)
|
|
195
|
+
return [];
|
|
196
|
+
this.refs += 1;
|
|
197
|
+
let start;
|
|
198
|
+
const started = new Promise((resolve) => {
|
|
199
|
+
start = resolve;
|
|
200
|
+
});
|
|
201
|
+
const timer = setTimeout(() => void this.startContinuation(), CONTINUATION_BIND_TIMEOUT_MS);
|
|
202
|
+
this.continuation = { unbound: new Set(kept), started, start, timer };
|
|
203
|
+
return [...kept];
|
|
204
|
+
}
|
|
205
|
+
async continueConversation(id) {
|
|
206
|
+
const planned = this.continuation;
|
|
207
|
+
if (!planned) {
|
|
208
|
+
this.harness.resume();
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
planned.unbound.delete(id);
|
|
212
|
+
if (planned.unbound.size === 0)
|
|
213
|
+
await this.startContinuation();
|
|
214
|
+
await planned.started;
|
|
215
|
+
}
|
|
216
|
+
whenContinued() {
|
|
217
|
+
return this.continuation?.started ?? Promise.resolve();
|
|
218
|
+
}
|
|
219
|
+
async startContinuation() {
|
|
220
|
+
const planned = this.continuation;
|
|
221
|
+
if (!planned)
|
|
222
|
+
return;
|
|
223
|
+
this.continuation = undefined;
|
|
224
|
+
clearTimeout(planned.timer);
|
|
225
|
+
if (planned.unbound.size > 0) {
|
|
226
|
+
log.logWarning(`Aborting ${planned.unbound.size} interrupted runs that were not continued in time`);
|
|
227
|
+
await this.abortUnfinishedWork((id) => planned.unbound.has(id));
|
|
228
|
+
}
|
|
229
|
+
this.harness.resume();
|
|
230
|
+
planned.start();
|
|
231
|
+
await this.release();
|
|
232
|
+
}
|
|
184
233
|
static async open(path, backend) {
|
|
185
234
|
const storage = new OfficeStorage(path);
|
|
186
235
|
storage.opened = await Harness.open(backend, storage.harnessOptions(), context);
|
|
@@ -244,14 +293,19 @@ class OfficeStorage {
|
|
|
244
293
|
},
|
|
245
294
|
};
|
|
246
295
|
}
|
|
247
|
-
async
|
|
296
|
+
async unfinishedWork() {
|
|
248
297
|
const { tasks } = await this.harness.inspect(context);
|
|
249
|
-
|
|
250
|
-
|
|
298
|
+
return tasks
|
|
299
|
+
.filter((task) => !task.record.owner && !task.record.background && !task.record.abortRequested)
|
|
300
|
+
.map((task) => ({ id: task.record.id, conversationId: task.record.conversationId }));
|
|
301
|
+
}
|
|
302
|
+
async abortUnfinishedWork(aborts) {
|
|
303
|
+
const unfinished = (await this.unfinishedWork()).filter((task) => aborts(task.conversationId));
|
|
304
|
+
if (unfinished.length === 0)
|
|
251
305
|
return;
|
|
252
|
-
log.logWarning(`Aborting ${
|
|
253
|
-
for (const task of
|
|
254
|
-
await this.harness.abortTask(task.
|
|
306
|
+
log.logWarning(`Aborting ${unfinished.length} durable tasks left unfinished by a previous process`);
|
|
307
|
+
for (const task of unfinished)
|
|
308
|
+
await this.harness.abortTask(task.id, context);
|
|
255
309
|
}
|
|
256
310
|
async index() {
|
|
257
311
|
return (await this.harness.snapshot(SessionIndexDoc, context))?.sessions ?? {};
|
|
@@ -708,6 +762,7 @@ export class SessionStore {
|
|
|
708
762
|
content: `[background task ${key} finished] ${answer}`,
|
|
709
763
|
timestamp: Date.now(),
|
|
710
764
|
};
|
|
765
|
+
await storage.whenContinued();
|
|
711
766
|
await requester.submit({
|
|
712
767
|
type: "write",
|
|
713
768
|
requestId: `task-report:${task.conversation.id}:${randomUUID()}`,
|
|
@@ -715,41 +770,22 @@ export class SessionStore {
|
|
|
715
770
|
}, context);
|
|
716
771
|
});
|
|
717
772
|
}
|
|
718
|
-
static async
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
if (!session)
|
|
722
|
-
return "exhausted";
|
|
723
|
-
return session.conversation.commit(async (tx) => {
|
|
724
|
-
const doc = await tx.doc(SessionDoc, session.conversation.id);
|
|
725
|
-
const resumes = doc.resumes ?? 0;
|
|
726
|
-
if (resumes < max) {
|
|
727
|
-
doc.resumes = resumes + 1;
|
|
728
|
-
return "resume";
|
|
729
|
-
}
|
|
730
|
-
doc.run = { ...doc.run, endedAt: Date.now(), status: "aborted" };
|
|
731
|
-
doc.resumes = undefined;
|
|
732
|
-
return "exhausted";
|
|
733
|
-
}, context);
|
|
734
|
-
});
|
|
735
|
-
}
|
|
736
|
-
static async interruptedSince(office, keys, sinceMs) {
|
|
737
|
-
if (keys.length === 0 || !existsSync(office.sessionsPath))
|
|
773
|
+
static async continueInterrupted(office) {
|
|
774
|
+
const path = office.sessionsPath;
|
|
775
|
+
if (!existsSync(path) || Date.now() - lastWriteMs(path) > CONTINUATION_WINDOW_MS)
|
|
738
776
|
return [];
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
return interrupted;
|
|
752
|
-
});
|
|
777
|
+
const storage = await OfficeStorage.acquire(path, true);
|
|
778
|
+
try {
|
|
779
|
+
const keyOf = new Map(Object.entries(await storage.index()).map(([key, record]) => [
|
|
780
|
+
record.conversationId,
|
|
781
|
+
key,
|
|
782
|
+
]));
|
|
783
|
+
const continued = await storage.planContinuation((id) => keyOf.has(id));
|
|
784
|
+
return continued.flatMap((id) => keyOf.get(id) ?? []);
|
|
785
|
+
}
|
|
786
|
+
finally {
|
|
787
|
+
await storage.release();
|
|
788
|
+
}
|
|
753
789
|
}
|
|
754
790
|
static async listTasks(office, requesterKey) {
|
|
755
791
|
if (!existsSync(office.sessionsPath))
|
|
@@ -877,6 +913,17 @@ export class SessionStore {
|
|
|
877
913
|
mcpServers() {
|
|
878
914
|
return this.mcp?.servers ?? [];
|
|
879
915
|
}
|
|
916
|
+
async continueInterruptedRun() {
|
|
917
|
+
const live = await this.storage.harness.snapshot(LiveDoc, this.conversation.id, context);
|
|
918
|
+
await this.storage.continueConversation(this.conversation.id);
|
|
919
|
+
if (live?.run === undefined)
|
|
920
|
+
return false;
|
|
921
|
+
await this.conversation.waitForIdle(context);
|
|
922
|
+
return true;
|
|
923
|
+
}
|
|
924
|
+
whenContinued() {
|
|
925
|
+
return this.storage.whenContinued();
|
|
926
|
+
}
|
|
880
927
|
async bindHarness(binding) {
|
|
881
928
|
return this.mutate(async () => {
|
|
882
929
|
await this.storage.bind(this.conversation.id, binding);
|
|
@@ -955,8 +1002,6 @@ export class SessionStore {
|
|
|
955
1002
|
async recordRun(run) {
|
|
956
1003
|
await this.updateSessionDoc((doc) => {
|
|
957
1004
|
doc.run = { ...run };
|
|
958
|
-
if (run.endedAt !== undefined)
|
|
959
|
-
doc.resumes = undefined;
|
|
960
1005
|
});
|
|
961
1006
|
}
|
|
962
1007
|
async close() {
|