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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/adapters/discord/context.d.ts.map +1 -1
  3. package/dist/adapters/discord/context.js +2 -6
  4. package/dist/adapters/discord/context.js.map +1 -1
  5. package/dist/adapters/telegram/context.d.ts.map +1 -1
  6. package/dist/adapters/telegram/context.js +2 -4
  7. package/dist/adapters/telegram/context.js.map +1 -1
  8. package/dist/agent/presenter.d.ts +3 -10
  9. package/dist/agent/presenter.d.ts.map +1 -1
  10. package/dist/agent/presenter.js +35 -32
  11. package/dist/agent/presenter.js.map +1 -1
  12. package/dist/agent/runner.d.ts.map +1 -1
  13. package/dist/agent/runner.js +16 -22
  14. package/dist/agent/runner.js.map +1 -1
  15. package/dist/agent/types.d.ts +4 -6
  16. package/dist/agent/types.d.ts.map +1 -1
  17. package/dist/agent/types.js.map +1 -1
  18. package/dist/cli/boot.js +1 -1
  19. package/dist/cli/boot.js.map +1 -1
  20. package/dist/cli/sessions.d.ts.map +1 -1
  21. package/dist/cli/sessions.js +18 -13
  22. package/dist/cli/sessions.js.map +1 -1
  23. package/dist/config.d.ts.map +1 -1
  24. package/dist/config.js +4 -2
  25. package/dist/config.js.map +1 -1
  26. package/dist/env-manifest.js +2 -2
  27. package/dist/env-manifest.js.map +1 -1
  28. package/dist/harness/models.d.ts.map +1 -1
  29. package/dist/harness/models.js +1 -4
  30. package/dist/harness/models.js.map +1 -1
  31. package/dist/harness/runner.d.ts.map +1 -1
  32. package/dist/harness/runner.js +2 -2
  33. package/dist/harness/runner.js.map +1 -1
  34. package/dist/harness/session-store.d.ts +3 -45
  35. package/dist/harness/session-store.d.ts.map +1 -1
  36. package/dist/harness/session-store.js +293 -198
  37. package/dist/harness/session-store.js.map +1 -1
  38. package/dist/harness/subagent-runner.d.ts.map +1 -1
  39. package/dist/harness/subagent-runner.js +1 -8
  40. package/dist/harness/subagent-runner.js.map +1 -1
  41. package/dist/harness/types.d.ts +11 -11
  42. package/dist/harness/types.d.ts.map +1 -1
  43. package/dist/harness/types.js.map +1 -1
  44. package/dist/main.js +5 -0
  45. package/dist/main.js.map +1 -1
  46. package/dist/mcp/catalog.d.ts.map +1 -1
  47. package/dist/mcp/catalog.js +0 -88
  48. package/dist/mcp/catalog.js.map +1 -1
  49. package/dist/mcp/open-connector.d.ts +1 -1
  50. package/dist/mcp/open-connector.d.ts.map +1 -1
  51. package/dist/mcp/open-connector.js +23 -22
  52. package/dist/mcp/open-connector.js.map +1 -1
  53. package/dist/runtime/conversation-runtime.js +1 -0
  54. package/dist/runtime/conversation-runtime.js.map +1 -1
  55. package/dist/runtime/session-lifecycle.d.ts +0 -1
  56. package/dist/runtime/session-lifecycle.d.ts.map +1 -1
  57. package/dist/runtime/session-lifecycle.js +1 -4
  58. package/dist/runtime/session-lifecycle.js.map +1 -1
  59. package/dist/runtime/types.d.ts +3 -0
  60. package/dist/runtime/types.d.ts.map +1 -1
  61. package/dist/runtime/types.js.map +1 -1
  62. package/dist/sessions/migrate-pi-084.d.ts +8 -0
  63. package/dist/sessions/migrate-pi-084.d.ts.map +1 -0
  64. package/dist/sessions/migrate-pi-084.js +353 -0
  65. package/dist/sessions/migrate-pi-084.js.map +1 -0
  66. package/dist/sessions/migrate-v3.d.ts +0 -5
  67. package/dist/sessions/migrate-v3.d.ts.map +1 -1
  68. package/dist/sessions/migrate-v3.js +129 -51
  69. package/dist/sessions/migrate-v3.js.map +1 -1
  70. package/dist/sessions/types.d.ts +6 -1
  71. package/dist/sessions/types.d.ts.map +1 -1
  72. package/dist/sessions/types.js.map +1 -1
  73. package/dist/types.d.ts +5 -1
  74. package/dist/types.d.ts.map +1 -1
  75. package/dist/types.js.map +1 -1
  76. package/dist/web/session-view/portal.js +0 -16
  77. package/dist/web/session-view/portal.js.map +1 -1
  78. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"open-connector.js","sourceRoot":"","sources":["../../src/mcp/open-connector.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { Type, type Static } from \"@sinclair/typebox\";\nimport { join } from \"node:path\";\nimport { readEnv } from \"../env-manifest.js\";\nimport * as log from \"../log.js\";\nimport type { Office } from \"../office/index.js\";\nimport {\n atomicWritePrivateFile,\n ensureDirExists,\n isRecord,\n readJsonSchemaFileIfExists,\n} from \"../utils/file-guards.js\";\nimport type { McpServerConfig } from \"./types.js\";\n\nconst OPEN_CONNECTOR_SERVER = \"open-connector\";\nconst TOKEN_STATE_FILE = \"open-connector-runtime-token.json\";\nconst REQUEST_TIMEOUT_MS = 10_000;\nconst pendingTokens = new Map<string, Promise<RuntimeTokenState>>();\nconst CONNECTION_AWARE_TOOLS = new Set([\"get_action_guide\", \"execute_action\"]);\n\nconst RuntimeTokenStateSchema = Type.Object(\n {\n version: Type.Literal(1),\n origin: Type.String(),\n name: Type.String(),\n id: Type.String(),\n token: Type.String(),\n },\n { additionalProperties: false },\n);\n\ntype RuntimeTokenState = Static<typeof RuntimeTokenStateSchema>;\n\nfunction readRuntimeTokenState(path: string) {\n return readJsonSchemaFileIfExists(\n path,\n RuntimeTokenStateSchema,\n (detail) => `Malformed OpenConnector runtime token state at ${path}: ${detail}`,\n );\n}\n\nfunction readUniqueConnectionName(result: unknown, service: string) {\n if (!isRecord(result) || !Array.isArray(result.content)) return undefined;\n const text = result.content.find(\n (part): part is { type: \"text\"; text: string } =>\n isRecord(part) && part.type === \"text\" && typeof part.text === \"string\",\n )?.text;\n if (!text) return undefined;\n try {\n const payload: unknown = JSON.parse(text);\n if (!isRecord(payload)) return undefined;\n const connections = Array.isArray(payload.data)\n ? payload.data\n : Array.isArray(payload.connections)\n ? payload.connections\n : undefined;\n if (!connections) return undefined;\n const names = new Set(\n connections.flatMap((connection) =>\n isRecord(connection) &&\n connection.service === service &&\n typeof connection.connectionName === \"string\"\n ? [connection.connectionName]\n : [],\n ),\n );\n return names.size === 1 ? names.values().next().value : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Fill an omitted connection only when OpenConnector reports exactly one\n * candidate for the action's service. Multiple-account selection remains an\n * explicit agent decision. */\nexport async function prepareOpenConnectorToolArguments(\n client: Pick<Client, \"callTool\">,\n serverName: string,\n toolName: string,\n params: Record<string, unknown>,\n signal?: AbortSignal,\n): Promise<Record<string, unknown>> {\n if (\n serverName !== OPEN_CONNECTOR_SERVER ||\n !CONNECTION_AWARE_TOOLS.has(toolName) ||\n typeof params.connectionName === \"string\" ||\n typeof params.actionId !== \"string\"\n ) {\n return params;\n }\n const service = params.actionId.split(\".\", 1)[0];\n if (!service) return params;\n const result = await client.callTool(\n { name: \"list_connections\", arguments: { service } },\n undefined,\n { timeout: REQUEST_TIMEOUT_MS, ...(signal ? { signal } : {}) },\n );\n const connectionName = readUniqueConnectionName(result, service);\n return connectionName ? { ...params, connectionName } : params;\n}\n\nfunction stringArray(value: unknown, field: string): string[] {\n if (!Array.isArray(value) || !value.every((item) => typeof item === \"string\")) {\n throw new Error(`OpenConnector returned an invalid ${field}`);\n }\n return value;\n}\n\nasync function readJson(response: Response, operation: string): Promise<unknown> {\n if (!response.ok) {\n throw new Error(`OpenConnector ${operation} failed with HTTP ${response.status}`);\n }\n try {\n return await response.json();\n } catch (error) {\n throw new Error(`OpenConnector ${operation} returned invalid JSON`, { cause: error });\n }\n}\n\nfunction requestSignal(signal?: AbortSignal): AbortSignal {\n const timeout = AbortSignal.timeout(REQUEST_TIMEOUT_MS);\n return signal ? AbortSignal.any([signal, timeout]) : timeout;\n}\n\nasync function createRuntimeToken(\n origin: string,\n adminToken: string,\n name: string,\n signal?: AbortSignal,\n): Promise<RuntimeTokenState> {\n const headers = { Authorization: `Bearer ${adminToken}` };\n const policyValue = await readJson(\n await fetch(new URL(\"/api/runtime-policy\", origin), {\n headers,\n signal: requestSignal(signal),\n }),\n \"runtime policy request\",\n );\n if (!isRecord(policyValue) || !isRecord(policyValue.deployment)) {\n throw new Error(\"OpenConnector returned an invalid runtime policy\");\n }\n const deployment = policyValue.deployment;\n const responseValue = await readJson(\n await fetch(new URL(\"/api/runtime-tokens\", origin), {\n method: \"POST\",\n headers: { ...headers, \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n name,\n allowedActions: stringArray(deployment.allowedActions, \"allowedActions policy\"),\n blockedActions: stringArray(deployment.blockedActions, \"blockedActions policy\"),\n allowedProxies: stringArray(deployment.allowedProxies, \"allowedProxies policy\"),\n }),\n signal: requestSignal(signal),\n }),\n \"runtime token creation\",\n );\n if (\n !isRecord(responseValue) ||\n typeof responseValue.token !== \"string\" ||\n !responseValue.token.startsWith(\"oct_\") ||\n !isRecord(responseValue.record) ||\n typeof responseValue.record.id !== \"string\" ||\n responseValue.record.name !== name\n ) {\n throw new Error(\"OpenConnector returned an invalid runtime token\");\n }\n return {\n version: 1,\n origin,\n name,\n id: responseValue.record.id,\n token: responseValue.token,\n };\n}\n\nfunction disabledServer(\n servers: Record<string, McpServerConfig>,\n config: McpServerConfig,\n): Record<string, McpServerConfig> {\n return { ...servers, [OPEN_CONNECTOR_SERVER]: { ...config, disabled: true } };\n}\n\nasync function loadOrCreateRuntimeToken(\n office: Office,\n origin: string,\n adminToken: string,\n name: string,\n signal?: AbortSignal,\n): Promise<RuntimeTokenState> {\n const statePath = join(office.stateDir, TOKEN_STATE_FILE);\n const state = readRuntimeTokenState(statePath);\n if (state) {\n if (state.origin !== origin || state.name !== name) {\n throw new Error(`OpenConnector runtime token state does not match ${name}`);\n }\n return state;\n }\n\n const key = `${origin}:${office.key}`;\n const pending = pendingTokens.get(key);\n if (pending) return pending;\n\n const creation = (async () => {\n const current = readRuntimeTokenState(statePath);\n if (current) return current;\n const created = await createRuntimeToken(origin, adminToken, name, signal);\n ensureDirExists(office.stateDir);\n atomicWritePrivateFile(statePath, `${JSON.stringify(created, null, 2)}\\n`);\n log.logInfo(\n `[${office.address.conversationId}] Created OpenConnector runtime token ${created.id}`,\n );\n return created;\n })();\n pendingTokens.set(key, creation);\n try {\n return await creation;\n } finally {\n pendingTokens.delete(key);\n }\n}\n\n/**\n * Replace the deployment-wide OpenConnector bearer token with one scoped to\n * this Slack Conversation office. The privileged admin token is read only at\n * this host boundary and is never written into settings, Vault, or a sandbox.\n */\nexport async function provisionOfficeOpenConnectorToken(\n office: Office,\n platformWorkspaceId: string | undefined,\n servers: Record<string, McpServerConfig> | undefined,\n signal?: AbortSignal,\n): Promise<Record<string, McpServerConfig> | undefined> {\n const config = servers?.[OPEN_CONNECTOR_SERVER];\n const adminToken = readEnv(\"OPENCONNECTOR_ADMIN_TOKEN\");\n if (!config || config.disabled || !adminToken || office.address.platform !== \"slack\") {\n return servers;\n }\n const configuredOrigin = readEnv(\"OPENCONNECTOR_ORIGIN\");\n if (!configuredOrigin || !URL.canParse(configuredOrigin)) {\n log.logWarning(\n `[${office.address.conversationId}] OpenConnector token provisioning skipped`,\n \"OPENCONNECTOR_ORIGIN is missing or invalid\",\n );\n return disabledServer(servers, config);\n }\n if (!platformWorkspaceId) {\n log.logWarning(\n `[${office.address.conversationId}] OpenConnector token provisioning skipped`,\n \"Slack workspace ID is unavailable\",\n );\n return disabledServer(servers, config);\n }\n if (!config.url) {\n log.logWarning(\n `[${office.address.conversationId}] OpenConnector token provisioning skipped`,\n \"the open-connector server is not configured for HTTP\",\n );\n return disabledServer(servers, config);\n }\n\n try {\n const endpoint = new URL(config.url);\n const origin = new URL(configuredOrigin).origin;\n if (endpoint.origin !== origin) {\n throw new Error(\"the MCP endpoint does not match the deployment-owned OpenConnector origin\");\n }\n const name = `mikan:slack:${platformWorkspaceId}:${office.address.conversationId}`;\n const state = await loadOrCreateRuntimeToken(office, origin, adminToken, name, signal);\n return {\n ...servers,\n [OPEN_CONNECTOR_SERVER]: {\n ...config,\n headers: { ...config.headers, Authorization: `Bearer ${state.token}` },\n },\n };\n } catch (error) {\n log.logWarning(\n `[${office.address.conversationId}] OpenConnector token provisioning failed`,\n error instanceof Error ? error.message : String(error),\n );\n return disabledServer(servers, config);\n }\n}\n"]}
1
+ {"version":3,"file":"open-connector.js","sourceRoot":"","sources":["../../src/mcp/open-connector.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { Type, type Static } from \"@sinclair/typebox\";\nimport { join } from \"node:path\";\nimport { readEnv } from \"../env-manifest.js\";\nimport * as log from \"../log.js\";\nimport type { Office } from \"../office/index.js\";\nimport {\n atomicWritePrivateFile,\n ensureDirExists,\n isRecord,\n readJsonSchemaFileIfExists,\n} from \"../utils/file-guards.js\";\nimport type { McpServerConfig } from \"./types.js\";\n\nconst OPEN_CONNECTOR_SERVER = \"open-connector\";\nconst TOKEN_STATE_FILE = \"open-connector-runtime-token.json\";\nconst REQUEST_TIMEOUT_MS = 10_000;\nconst pendingTokens = new Map<string, Promise<RuntimeTokenState>>();\nconst CONNECTION_AWARE_TOOLS = new Set([\"get_action_guide\", \"execute_action\"]);\n\nconst RuntimeTokenStateSchema = Type.Object(\n {\n version: Type.Literal(1),\n origin: Type.String(),\n name: Type.String(),\n id: Type.String(),\n token: Type.String(),\n },\n { additionalProperties: false },\n);\n\ntype RuntimeTokenState = Static<typeof RuntimeTokenStateSchema>;\n\nfunction readRuntimeTokenState(path: string) {\n return readJsonSchemaFileIfExists(\n path,\n RuntimeTokenStateSchema,\n (detail) => `Malformed OpenConnector runtime token state at ${path}: ${detail}`,\n );\n}\n\nfunction readUniqueConnectionName(result: unknown, service: string) {\n if (!isRecord(result) || !Array.isArray(result.content)) return undefined;\n const text = result.content.find(\n (part): part is { type: \"text\"; text: string } =>\n isRecord(part) && part.type === \"text\" && typeof part.text === \"string\",\n )?.text;\n if (!text) return undefined;\n try {\n const payload: unknown = JSON.parse(text);\n if (!isRecord(payload)) return undefined;\n const connections = Array.isArray(payload.data)\n ? payload.data\n : Array.isArray(payload.connections)\n ? payload.connections\n : undefined;\n if (!connections) return undefined;\n const names = new Set(\n connections.flatMap((connection) =>\n isRecord(connection) &&\n connection.service === service &&\n typeof connection.connectionName === \"string\"\n ? [connection.connectionName]\n : [],\n ),\n );\n return names.size === 1 ? names.values().next().value : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Fill an omitted connection only when OpenConnector reports exactly one\n * candidate for the action's service. Multiple-account selection remains an\n * explicit agent decision. */\nexport async function prepareOpenConnectorToolArguments(\n client: Pick<Client, \"callTool\">,\n serverName: string,\n toolName: string,\n params: Record<string, unknown>,\n signal?: AbortSignal,\n): Promise<Record<string, unknown>> {\n if (\n serverName !== OPEN_CONNECTOR_SERVER ||\n !CONNECTION_AWARE_TOOLS.has(toolName) ||\n typeof params.connectionName === \"string\" ||\n typeof params.actionId !== \"string\"\n ) {\n return params;\n }\n const service = params.actionId.split(\".\", 1)[0];\n if (!service) return params;\n const result = await client.callTool(\n { name: \"list_connections\", arguments: { service } },\n undefined,\n { timeout: REQUEST_TIMEOUT_MS, ...(signal ? { signal } : {}) },\n );\n const connectionName = readUniqueConnectionName(result, service);\n return connectionName ? { ...params, connectionName } : params;\n}\n\nfunction stringArray(value: unknown, field: string): string[] {\n if (!Array.isArray(value) || !value.every((item) => typeof item === \"string\")) {\n throw new Error(`OpenConnector returned an invalid ${field}`);\n }\n return value;\n}\n\nasync function readJson(response: Response, operation: string): Promise<unknown> {\n if (!response.ok) {\n throw new Error(`OpenConnector ${operation} failed with HTTP ${response.status}`);\n }\n try {\n return await response.json();\n } catch (error) {\n throw new Error(`OpenConnector ${operation} returned invalid JSON`, { cause: error });\n }\n}\n\nfunction requestSignal(signal?: AbortSignal): AbortSignal {\n const timeout = AbortSignal.timeout(REQUEST_TIMEOUT_MS);\n return signal ? AbortSignal.any([signal, timeout]) : timeout;\n}\n\nasync function createRuntimeToken(\n origin: string,\n adminToken: string,\n name: string,\n signal?: AbortSignal,\n): Promise<RuntimeTokenState> {\n const headers = { Authorization: `Bearer ${adminToken}` };\n const policyValue = await readJson(\n await fetch(new URL(\"/api/runtime-policy\", origin), {\n headers,\n signal: requestSignal(signal),\n }),\n \"runtime policy request\",\n );\n if (!isRecord(policyValue) || !isRecord(policyValue.deployment)) {\n throw new Error(\"OpenConnector returned an invalid runtime policy\");\n }\n const deployment = policyValue.deployment;\n const responseValue = await readJson(\n await fetch(new URL(\"/api/runtime-tokens\", origin), {\n method: \"POST\",\n headers: { ...headers, \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n name,\n allowedActions: stringArray(deployment.allowedActions, \"allowedActions policy\"),\n blockedActions: stringArray(deployment.blockedActions, \"blockedActions policy\"),\n allowedProxies: stringArray(deployment.allowedProxies, \"allowedProxies policy\"),\n }),\n signal: requestSignal(signal),\n }),\n \"runtime token creation\",\n );\n if (\n !isRecord(responseValue) ||\n typeof responseValue.token !== \"string\" ||\n !responseValue.token.startsWith(\"oct_\") ||\n !isRecord(responseValue.record) ||\n typeof responseValue.record.id !== \"string\" ||\n responseValue.record.name !== name\n ) {\n throw new Error(\"OpenConnector returned an invalid runtime token\");\n }\n return {\n version: 1,\n origin,\n name,\n id: responseValue.record.id,\n token: responseValue.token,\n };\n}\n\nfunction withoutReservedServer(\n servers: Record<string, McpServerConfig> | undefined,\n): Record<string, McpServerConfig> {\n if (!servers) return {};\n const { [OPEN_CONNECTOR_SERVER]: _reserved, ...settingsServers } = servers;\n return settingsServers;\n}\n\nfunction disabledServer(\n servers: Record<string, McpServerConfig>,\n config: McpServerConfig,\n): Record<string, McpServerConfig> {\n return { ...servers, [OPEN_CONNECTOR_SERVER]: { ...config, disabled: true } };\n}\n\nasync function loadOrCreateRuntimeToken(\n office: Office,\n origin: string,\n adminToken: string,\n name: string,\n signal?: AbortSignal,\n): Promise<RuntimeTokenState> {\n const statePath = join(office.stateDir, TOKEN_STATE_FILE);\n const state = readRuntimeTokenState(statePath);\n if (state) {\n if (state.origin !== origin || state.name !== name) {\n throw new Error(`OpenConnector runtime token state does not match ${name}`);\n }\n return state;\n }\n\n const key = `${origin}:${office.key}`;\n const pending = pendingTokens.get(key);\n if (pending) return pending;\n\n const creation = (async () => {\n const current = readRuntimeTokenState(statePath);\n if (current) return current;\n const created = await createRuntimeToken(origin, adminToken, name, signal);\n ensureDirExists(office.stateDir);\n atomicWritePrivateFile(statePath, `${JSON.stringify(created, null, 2)}\\n`);\n log.logInfo(\n `[${office.address.conversationId}] Created OpenConnector runtime token ${created.id}`,\n );\n return created;\n })();\n pendingTokens.set(key, creation);\n try {\n return await creation;\n } finally {\n pendingTokens.delete(key);\n }\n}\n\n/**\n * Replace the deployment-wide OpenConnector bearer token with one scoped to\n * this Slack Conversation office. The privileged admin token is read only at\n * this host boundary and is never written into settings, Vault, or a sandbox.\n */\nexport async function provisionOfficeOpenConnectorToken(\n office: Office,\n platformWorkspaceId: string | undefined,\n servers: Record<string, McpServerConfig> | undefined,\n openConnector: McpServerConfig | undefined,\n signal?: AbortSignal,\n): Promise<Record<string, McpServerConfig>> {\n const settingsServers = withoutReservedServer(servers);\n const adminToken = readEnv(\"OPENCONNECTOR_ADMIN_TOKEN\");\n if (\n !openConnector ||\n openConnector.disabled ||\n !adminToken ||\n office.address.platform !== \"slack\"\n ) {\n return settingsServers;\n }\n if (!platformWorkspaceId) {\n log.logWarning(\n `[${office.address.conversationId}] OpenConnector token provisioning skipped`,\n \"Slack workspace ID is unavailable\",\n );\n return disabledServer(settingsServers, openConnector);\n }\n if (!openConnector.url) {\n log.logWarning(\n `[${office.address.conversationId}] OpenConnector token provisioning skipped`,\n \"the startup OpenConnector configuration is not configured for HTTP\",\n );\n return disabledServer(settingsServers, openConnector);\n }\n\n try {\n const endpoint = new URL(openConnector.url);\n const origin = endpoint.origin;\n const name = `mikan:slack:${platformWorkspaceId}:${office.address.conversationId}`;\n const state = await loadOrCreateRuntimeToken(office, origin, adminToken, name, signal);\n return {\n ...settingsServers,\n [OPEN_CONNECTOR_SERVER]: {\n ...openConnector,\n headers: { ...openConnector.headers, Authorization: `Bearer ${state.token}` },\n },\n };\n } catch (error) {\n log.logWarning(\n `[${office.address.conversationId}] OpenConnector token provisioning failed`,\n error instanceof Error ? error.message : String(error),\n );\n return disabledServer(settingsServers, openConnector);\n }\n}\n"]}
@@ -401,6 +401,7 @@ class ConversationRuntimeImpl {
401
401
  office: this.options.workspace.office(options.address),
402
402
  trustModel: options.trustModel,
403
403
  platformWorkspaceId: options.platformWorkspaceId,
404
+ openConnector: this.options.openConnector,
404
405
  sessionScope,
405
406
  signal,
406
407
  vaultManager: this.options.vaultManager,
@@ -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 ConversationEvent,\n HandleNewCommandOptions,\n OfficeAddress,\n PlatformName,\n RunningSession,\n} from \"../adapter.js\";\nimport type { Workspace } from \"../office/index.js\";\nimport { createRunner } from \"../agent/runner.js\";\nimport { commitOfficeDream, generateMemoryAnchor, prepareOfficeDream } from \"../dream/index.js\";\nimport type { PiAgentWrapper } from \"../types.js\";\nimport { MikanModels } from \"../harness/index.js\";\nimport { defaultCommandHandlers, dispatchCommand } from \"../commands/registry.js\";\nimport type { CommandHandler, CommandServices } from \"../commands/types.js\";\nimport { isPrivateConversation } from \"../commands/utils.js\";\nimport * as log from \"../log.js\";\nimport {\n addLifecycleBreadcrumb,\n applyRunScope,\n createRunAttributionAttributes,\n registerTraceAttribution,\n reportUserFacingError,\n} from \"../observability/sentry.js\";\nimport {\n ChatHistorySync,\n hasMaterializedChatSession,\n waitForThreadSessionBootstrap,\n} from \"../sessions/chat-history-sync.js\";\nimport { shouldRotateTopLevelSession } from \"../sessions/store.js\";\nimport {\n getThreadSessionFile,\n resolveChannelSessionFile,\n tryResolveThreadSession,\n} from \"../sessions/store.js\";\nimport {\n assertSessionKeyBelongsToConversation,\n deriveSessionKey,\n} from \"../sessions/session-key.js\";\nimport { formatNothingRunning, formatStopped, formatStopping } from \"../platform-messages.js\";\nimport * as Sentry from \"@sentry/node\";\nimport { getUnresolvedSandboxPathContext } from \"../sandbox/index.js\";\nimport { disabledVaultManager } from \"../vault/index.js\";\nimport type { ConversationRuntimeState } from \"./types.js\";\nimport { SessionLifecycle } from \"./session-lifecycle.js\";\n\ntype ConversationState = ConversationRuntimeState;\n\nexport type {\n RunSessionOptions,\n ConversationRuntime,\n ConversationRuntimeOptions,\n} from \"./types.js\";\nimport type {\n RunSessionOptions,\n ConversationRuntime,\n ConversationRuntimeOptions,\n SessionStateOptions,\n} from \"./types.js\";\n\n/**\n * Placeholder token store for embedders that run without the web portal.\n * Command handlers guard on `portalBaseUrl` before minting tokens, so this\n * only fires when a portal URL is configured without its backing store.\n */\nfunction portalNotConfiguredTokenStore(portal: string): { create: () => never } {\n return {\n create: () => {\n throw new Error(`${portal} portal not configured`);\n },\n };\n}\n\nfunction runtimeCwdForSandbox(\n sandbox: ConversationRuntimeOptions[\"sandbox\"],\n workspace: Workspace,\n address: OfficeAddress,\n): string {\n const runtimeWorkspaceRoot = getUnresolvedSandboxPathContext(\n sandbox,\n workspace.root,\n ).runtimeWorkspaceRoot;\n // The office key names the same segment on the host and in the runtime.\n return `${runtimeWorkspaceRoot.replace(/\\/+$/, \"\")}/${workspace.office(address).key}`;\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();\n private readonly commandServices: CommandServices;\n private readonly commandHandlers: readonly CommandHandler[];\n private readonly resolvedModels: MikanModels;\n private isShuttingDown = false;\n\n constructor(private readonly options: ConversationRuntimeOptions) {\n this.resolvedModels = options.models ?? MikanModels.create();\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 });\n }\n }\n return sessions;\n }\n\n async runDream(address: OfficeAddress, now = new Date()): Promise<boolean> {\n return this.sessions.runConversationMaintenance(address, async () => {\n const office = this.options.workspace.office(address);\n const plan = await prepareOfficeDream(office, now);\n if (!plan) return false;\n const memory = await generateMemoryAnchor(office, plan, this.resolvedModels);\n commitOfficeDream(office, plan, memory);\n log.logInfo(`[${address.conversationId}] Dream updated the Memory anchor`);\n return true;\n });\n }\n\n async handleStop(address: OfficeAddress, sessionKey: string, bot: MessagingBot): Promise<void> {\n assertSessionKeyBelongsToConversation(sessionKey, address.conversationId);\n const state = this.sessions.get(address, sessionKey);\n if (state?.running) {\n state.stopRequested = true;\n state.runner.abort();\n const ts = await bot.postMessage(address.conversationId, formatStopping(bot));\n state.stopMessageTs = ts;\n } else {\n await bot.postMessage(address.conversationId, formatNothingRunning(bot));\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 state.stopRequested = true;\n state.runner.abort();\n }\n }\n\n async handleNewCommand({\n sessionKey,\n conversationId,\n bot,\n message,\n }: HandleNewCommandOptions): Promise<void> {\n const address = message.address;\n if (conversationId !== address.conversationId) {\n throw new Error(\n `Conversation id ${JSON.stringify(conversationId)} does not match office ` +\n JSON.stringify(address.conversationId),\n );\n }\n assertSessionKeyBelongsToConversation(sessionKey, address.conversationId);\n\n const activeState = this.sessions.get(address, sessionKey);\n if (activeState?.runSettlement) {\n if (activeState.running) {\n activeState.stopRequested = true;\n activeState.runner.abort();\n }\n await activeState.runSettlement;\n }\n\n await this.sessions.runConversationMaintenance(address, async () => {\n await this.resetSession(address, sessionKey, bot);\n });\n }\n\n private scheduleSharedSessionRotation(\n { event, bot, context }: RunSessionOptions,\n sessionKey: string,\n ): boolean {\n const { address, conversationId } = event;\n if (context.message.conversationKind !== \"shared\" || sessionKey !== conversationId)\n return false;\n\n const conversationDir = this.options.workspace.office(address).dir;\n const currentSession = resolveChannelSessionFile(conversationDir);\n if (!currentSession || !shouldRotateTopLevelSession(currentSession, new Date())) return false;\n\n void this.sessions\n .runConversationMaintenance(address, async () => {\n const session = resolveChannelSessionFile(conversationDir);\n if (!session || !shouldRotateTopLevelSession(session, new Date())) {\n await this.runSession({ event, bot, context }, true);\n return;\n }\n\n const runtimeCwd = runtimeCwdForSandbox(\n this.options.sandbox,\n this.options.workspace,\n address,\n );\n await this.chatSessionManager.resetSession({\n conversationDir,\n sessionKey,\n cwd: runtimeCwd,\n });\n await this.sessions.discardAndWait(address, sessionKey);\n log.logInfo(`[${conversationId}] Rotated session: ${sessionKey}`);\n await this.runSession({ event, bot, context }, true);\n })\n .catch((err) => {\n reportUserFacingError(err, {\n domain: \"mikan\",\n surface: \"session_rotation\",\n operation: \"rotate_shared_session_in_background\",\n });\n });\n return true;\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 conversationDir = this.options.workspace.office(address).dir;\n const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workspace, address);\n await this.chatSessionManager.resetSession({ conversationDir, sessionKey, cwd: runtimeCwd });\n\n await this.sessions.discardAndWait(address, 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(\n { event, bot, context }: RunSessionOptions,\n skipRotation = false,\n ): Promise<void> {\n const conversationId = event.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 (!skipRotation && (await this.dispatchSessionCommand({ event, bot, context }, sessionKey))) {\n return;\n }\n\n const address = event.address;\n const activeSettlement = this.sessions.get(address, sessionKey)?.runSettlement;\n if (activeSettlement) await activeSettlement;\n\n if (\n !skipRotation &&\n sessionKey === conversationId &&\n this.scheduleSharedSessionRotation({ event, bot, context }, sessionKey)\n ) {\n return;\n }\n\n const releaseConversationWork = skipRotation\n ? () => {}\n : await this.sessions.acquireConversationWork(address);\n try {\n const conversationDir = this.options.workspace.office(address).dir;\n await this.waitForParentSession(address, sessionKey, conversationDir);\n\n let lease: { state: ConversationState; release: () => void } | undefined;\n try {\n lease = await this.acquireState({\n address,\n sessionKey,\n currentMessageId: event.ts,\n trustModel: context.platform.trustModel ?? \"membership\",\n platformWorkspaceId: context.platform.workspaceId,\n });\n const { state } = lease;\n await state.runner.syncChatHistory(event.ts);\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,\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 const { state } = lease;\n log.logInfo(`[${conversationId}] Starting run: ${event.text.substring(0, 50)}`);\n const runPromise = this.sessions.settle(state, async () => {\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\" && state.stopRequested) {\n if (state.stopMessageTs) {\n await bot.updateMessage(conversationId, state.stopMessageTs, formatStopped(bot));\n state.stopMessageTs = undefined;\n } else {\n await bot.postMessage(conversationId, formatStopped(bot));\n }\n }\n } finally {\n Sentry.metrics.gauge(\"agent.sessions.active\", this.sessions.settlementCount() - 1);\n }\n });\n lease.release();\n Sentry.metrics.gauge(\"agent.sessions.active\", this.sessions.settlementCount());\n await runPromise;\n } finally {\n releaseConversationWork();\n }\n }\n\n private async waitForParentSession(\n address: OfficeAddress,\n sessionKey: string,\n conversationDir: string,\n ): Promise<void> {\n const conversationId = address.conversationId;\n const waited = await waitForThreadSessionBootstrap({\n parentSessionKey: conversationId,\n sessionKey,\n hasThreadSession: () => hasMaterializedChatSession({ conversationDir, 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.conversationId,\n vaultConversationId: event.vaultConversationId,\n sessionKey,\n commandText: event.text,\n privateConversation: isPrivateConversation(event),\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<{ stopReason: string; errorMessage?: string }>,\n ): Promise<{ stopReason: string; errorMessage?: string } | 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 userId: message.userId,\n userName: message.userName,\n threadTs: message.threadTs,\n });\n\n Sentry.metrics.count(\"agent.run.started\", 1, {\n attributes: attribution,\n });\n\n return Sentry.startSpan(\n { name: \"agent.run\", op: \"agent\", attributes: attribution },\n async (span) =>\n Sentry.withScope(async (scope) => {\n registerTraceAttribution(span, attribution);\n applyRunScope(scope, {\n conversationId,\n sessionKey,\n messageId: message.id,\n platform: platform.name,\n userId: message.userId,\n userName: message.userName,\n threadTs: message.threadTs,\n });\n addLifecycleBreadcrumb(\"agent.run.started\", {\n channel_id: conversationId,\n platform: platform.name,\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 Sentry.metrics.distribution(\"agent.run.duration\", durationMs, {\n unit: \"millisecond\",\n attributes: completionAttrs,\n });\n Sentry.metrics.count(\"agent.run.completed\", 1, { attributes: completionAttrs });\n addLifecycleBreadcrumb(\"agent.run.completed\", {\n channel_id: conversationId,\n platform: platform.name,\n stop_reason: result.stopReason,\n duration_ms: durationMs,\n });\n return result;\n } catch (err) {\n scope.setContext(\"agent_run_error\", {\n conversationId,\n sessionKey,\n platform: platform.name,\n messageId: message.id,\n threadTs: message.threadTs,\n });\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 Sentry.metrics.count(\"agent.run.errors\", 1, {\n attributes: attribution,\n });\n log.logWarning(\n `[${conversationId}] Run error`,\n err instanceof Error ? err.message : String(err),\n );\n return undefined;\n }\n }),\n );\n }\n\n switchConversationModel(address: OfficeAddress, _provider: string, _model: string): boolean {\n return this.invalidateOffice(address, \"Model switched\");\n }\n\n refreshConversationEnvironment(address: OfficeAddress): boolean {\n return this.invalidateOffice(address, \"Environment refreshed\");\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 invalidateOffice(address: OfficeAddress, reason: string): boolean {\n const cleared = this.sessions.invalidateConversation(address);\n if (cleared) {\n log.logInfo(`[${address.conversationId}] ${reason}; cleared cached session runners`);\n }\n return cleared;\n }\n\n private async createCurrentRunner(\n options: SessionStateOptions,\n sessionScope: Awaited<ReturnType<ChatHistorySync[\"resolveSessionScope\"]>>,\n signal: AbortSignal,\n ): Promise<PiAgentWrapper> {\n return createRunner({\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 sessionScope,\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 platformToolPackFactories: this.options.platformToolPackFactories,\n models: this.resolvedModels,\n });\n }\n\n private acquireState(options: SessionStateOptions & { currentMessageId?: string }) {\n const { address, sessionKey } = options;\n const conversationDir = this.options.workspace.office(address).dir;\n return this.sessions.acquire(\n address,\n sessionKey,\n () =>\n sessionKey === address.conversationId\n ? resolveChannelSessionFile(conversationDir)\n : tryResolveThreadSession(getThreadSessionFile(conversationDir, sessionKey)),\n (signal) => this.materializeState(options, conversationDir, signal),\n );\n }\n\n private async materializeState(\n options: SessionStateOptions & { currentMessageId?: string },\n conversationDir: string,\n signal: AbortSignal,\n ): Promise<ConversationState> {\n signal.throwIfAborted();\n const { address, sessionKey, currentMessageId } = options;\n const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workspace, address);\n const sessionScope = await this.chatSessionManager.resolveSessionScope({\n conversationDir,\n sessionKey,\n cwd: runtimeCwd,\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 sessionFile: sessionScope.contextFile,\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 ConversationEvent,\n HandleNewCommandOptions,\n OfficeAddress,\n PlatformName,\n RunningSession,\n} from \"../adapter.js\";\nimport type { Workspace } from \"../office/index.js\";\nimport { createRunner } from \"../agent/runner.js\";\nimport { commitOfficeDream, generateMemoryAnchor, prepareOfficeDream } from \"../dream/index.js\";\nimport type { PiAgentWrapper } from \"../types.js\";\nimport { MikanModels } from \"../harness/index.js\";\nimport { defaultCommandHandlers, dispatchCommand } from \"../commands/registry.js\";\nimport type { CommandHandler, CommandServices } from \"../commands/types.js\";\nimport { isPrivateConversation } from \"../commands/utils.js\";\nimport * as log from \"../log.js\";\nimport {\n addLifecycleBreadcrumb,\n applyRunScope,\n createRunAttributionAttributes,\n registerTraceAttribution,\n reportUserFacingError,\n} from \"../observability/sentry.js\";\nimport {\n ChatHistorySync,\n hasMaterializedChatSession,\n waitForThreadSessionBootstrap,\n} from \"../sessions/chat-history-sync.js\";\nimport { shouldRotateTopLevelSession } from \"../sessions/store.js\";\nimport {\n getThreadSessionFile,\n resolveChannelSessionFile,\n tryResolveThreadSession,\n} from \"../sessions/store.js\";\nimport {\n assertSessionKeyBelongsToConversation,\n deriveSessionKey,\n} from \"../sessions/session-key.js\";\nimport { formatNothingRunning, formatStopped, formatStopping } from \"../platform-messages.js\";\nimport * as Sentry from \"@sentry/node\";\nimport { getUnresolvedSandboxPathContext } from \"../sandbox/index.js\";\nimport { disabledVaultManager } from \"../vault/index.js\";\nimport type { ConversationRuntimeState } from \"./types.js\";\nimport { SessionLifecycle } from \"./session-lifecycle.js\";\n\ntype ConversationState = ConversationRuntimeState;\n\nexport type {\n RunSessionOptions,\n ConversationRuntime,\n ConversationRuntimeOptions,\n} from \"./types.js\";\nimport type {\n RunSessionOptions,\n ConversationRuntime,\n ConversationRuntimeOptions,\n SessionStateOptions,\n} from \"./types.js\";\n\n/**\n * Placeholder token store for embedders that run without the web portal.\n * Command handlers guard on `portalBaseUrl` before minting tokens, so this\n * only fires when a portal URL is configured without its backing store.\n */\nfunction portalNotConfiguredTokenStore(portal: string): { create: () => never } {\n return {\n create: () => {\n throw new Error(`${portal} portal not configured`);\n },\n };\n}\n\nfunction runtimeCwdForSandbox(\n sandbox: ConversationRuntimeOptions[\"sandbox\"],\n workspace: Workspace,\n address: OfficeAddress,\n): string {\n const runtimeWorkspaceRoot = getUnresolvedSandboxPathContext(\n sandbox,\n workspace.root,\n ).runtimeWorkspaceRoot;\n // The office key names the same segment on the host and in the runtime.\n return `${runtimeWorkspaceRoot.replace(/\\/+$/, \"\")}/${workspace.office(address).key}`;\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();\n private readonly commandServices: CommandServices;\n private readonly commandHandlers: readonly CommandHandler[];\n private readonly resolvedModels: MikanModels;\n private isShuttingDown = false;\n\n constructor(private readonly options: ConversationRuntimeOptions) {\n this.resolvedModels = options.models ?? MikanModels.create();\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 });\n }\n }\n return sessions;\n }\n\n async runDream(address: OfficeAddress, now = new Date()): Promise<boolean> {\n return this.sessions.runConversationMaintenance(address, async () => {\n const office = this.options.workspace.office(address);\n const plan = await prepareOfficeDream(office, now);\n if (!plan) return false;\n const memory = await generateMemoryAnchor(office, plan, this.resolvedModels);\n commitOfficeDream(office, plan, memory);\n log.logInfo(`[${address.conversationId}] Dream updated the Memory anchor`);\n return true;\n });\n }\n\n async handleStop(address: OfficeAddress, sessionKey: string, bot: MessagingBot): Promise<void> {\n assertSessionKeyBelongsToConversation(sessionKey, address.conversationId);\n const state = this.sessions.get(address, sessionKey);\n if (state?.running) {\n state.stopRequested = true;\n state.runner.abort();\n const ts = await bot.postMessage(address.conversationId, formatStopping(bot));\n state.stopMessageTs = ts;\n } else {\n await bot.postMessage(address.conversationId, formatNothingRunning(bot));\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 state.stopRequested = true;\n state.runner.abort();\n }\n }\n\n async handleNewCommand({\n sessionKey,\n conversationId,\n bot,\n message,\n }: HandleNewCommandOptions): Promise<void> {\n const address = message.address;\n if (conversationId !== address.conversationId) {\n throw new Error(\n `Conversation id ${JSON.stringify(conversationId)} does not match office ` +\n JSON.stringify(address.conversationId),\n );\n }\n assertSessionKeyBelongsToConversation(sessionKey, address.conversationId);\n\n const activeState = this.sessions.get(address, sessionKey);\n if (activeState?.runSettlement) {\n if (activeState.running) {\n activeState.stopRequested = true;\n activeState.runner.abort();\n }\n await activeState.runSettlement;\n }\n\n await this.sessions.runConversationMaintenance(address, async () => {\n await this.resetSession(address, sessionKey, bot);\n });\n }\n\n private scheduleSharedSessionRotation(\n { event, bot, context }: RunSessionOptions,\n sessionKey: string,\n ): boolean {\n const { address, conversationId } = event;\n if (context.message.conversationKind !== \"shared\" || sessionKey !== conversationId)\n return false;\n\n const conversationDir = this.options.workspace.office(address).dir;\n const currentSession = resolveChannelSessionFile(conversationDir);\n if (!currentSession || !shouldRotateTopLevelSession(currentSession, new Date())) return false;\n\n void this.sessions\n .runConversationMaintenance(address, async () => {\n const session = resolveChannelSessionFile(conversationDir);\n if (!session || !shouldRotateTopLevelSession(session, new Date())) {\n await this.runSession({ event, bot, context }, true);\n return;\n }\n\n const runtimeCwd = runtimeCwdForSandbox(\n this.options.sandbox,\n this.options.workspace,\n address,\n );\n await this.chatSessionManager.resetSession({\n conversationDir,\n sessionKey,\n cwd: runtimeCwd,\n });\n await this.sessions.discardAndWait(address, sessionKey);\n log.logInfo(`[${conversationId}] Rotated session: ${sessionKey}`);\n await this.runSession({ event, bot, context }, true);\n })\n .catch((err) => {\n reportUserFacingError(err, {\n domain: \"mikan\",\n surface: \"session_rotation\",\n operation: \"rotate_shared_session_in_background\",\n });\n });\n return true;\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 conversationDir = this.options.workspace.office(address).dir;\n const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workspace, address);\n await this.chatSessionManager.resetSession({ conversationDir, sessionKey, cwd: runtimeCwd });\n\n await this.sessions.discardAndWait(address, 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(\n { event, bot, context }: RunSessionOptions,\n skipRotation = false,\n ): Promise<void> {\n const conversationId = event.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 (!skipRotation && (await this.dispatchSessionCommand({ event, bot, context }, sessionKey))) {\n return;\n }\n\n const address = event.address;\n const activeSettlement = this.sessions.get(address, sessionKey)?.runSettlement;\n if (activeSettlement) await activeSettlement;\n\n if (\n !skipRotation &&\n sessionKey === conversationId &&\n this.scheduleSharedSessionRotation({ event, bot, context }, sessionKey)\n ) {\n return;\n }\n\n const releaseConversationWork = skipRotation\n ? () => {}\n : await this.sessions.acquireConversationWork(address);\n try {\n const conversationDir = this.options.workspace.office(address).dir;\n await this.waitForParentSession(address, sessionKey, conversationDir);\n\n let lease: { state: ConversationState; release: () => void } | undefined;\n try {\n lease = await this.acquireState({\n address,\n sessionKey,\n currentMessageId: event.ts,\n trustModel: context.platform.trustModel ?? \"membership\",\n platformWorkspaceId: context.platform.workspaceId,\n });\n const { state } = lease;\n await state.runner.syncChatHistory(event.ts);\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,\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 const { state } = lease;\n log.logInfo(`[${conversationId}] Starting run: ${event.text.substring(0, 50)}`);\n const runPromise = this.sessions.settle(state, async () => {\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\" && state.stopRequested) {\n if (state.stopMessageTs) {\n await bot.updateMessage(conversationId, state.stopMessageTs, formatStopped(bot));\n state.stopMessageTs = undefined;\n } else {\n await bot.postMessage(conversationId, formatStopped(bot));\n }\n }\n } finally {\n Sentry.metrics.gauge(\"agent.sessions.active\", this.sessions.settlementCount() - 1);\n }\n });\n lease.release();\n Sentry.metrics.gauge(\"agent.sessions.active\", this.sessions.settlementCount());\n await runPromise;\n } finally {\n releaseConversationWork();\n }\n }\n\n private async waitForParentSession(\n address: OfficeAddress,\n sessionKey: string,\n conversationDir: string,\n ): Promise<void> {\n const conversationId = address.conversationId;\n const waited = await waitForThreadSessionBootstrap({\n parentSessionKey: conversationId,\n sessionKey,\n hasThreadSession: () => hasMaterializedChatSession({ conversationDir, 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.conversationId,\n vaultConversationId: event.vaultConversationId,\n sessionKey,\n commandText: event.text,\n privateConversation: isPrivateConversation(event),\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<{ stopReason: string; errorMessage?: string }>,\n ): Promise<{ stopReason: string; errorMessage?: string } | 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 userId: message.userId,\n userName: message.userName,\n threadTs: message.threadTs,\n });\n\n Sentry.metrics.count(\"agent.run.started\", 1, {\n attributes: attribution,\n });\n\n return Sentry.startSpan(\n { name: \"agent.run\", op: \"agent\", attributes: attribution },\n async (span) =>\n Sentry.withScope(async (scope) => {\n registerTraceAttribution(span, attribution);\n applyRunScope(scope, {\n conversationId,\n sessionKey,\n messageId: message.id,\n platform: platform.name,\n userId: message.userId,\n userName: message.userName,\n threadTs: message.threadTs,\n });\n addLifecycleBreadcrumb(\"agent.run.started\", {\n channel_id: conversationId,\n platform: platform.name,\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 Sentry.metrics.distribution(\"agent.run.duration\", durationMs, {\n unit: \"millisecond\",\n attributes: completionAttrs,\n });\n Sentry.metrics.count(\"agent.run.completed\", 1, { attributes: completionAttrs });\n addLifecycleBreadcrumb(\"agent.run.completed\", {\n channel_id: conversationId,\n platform: platform.name,\n stop_reason: result.stopReason,\n duration_ms: durationMs,\n });\n return result;\n } catch (err) {\n scope.setContext(\"agent_run_error\", {\n conversationId,\n sessionKey,\n platform: platform.name,\n messageId: message.id,\n threadTs: message.threadTs,\n });\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 Sentry.metrics.count(\"agent.run.errors\", 1, {\n attributes: attribution,\n });\n log.logWarning(\n `[${conversationId}] Run error`,\n err instanceof Error ? err.message : String(err),\n );\n return undefined;\n }\n }),\n );\n }\n\n switchConversationModel(address: OfficeAddress, _provider: string, _model: string): boolean {\n return this.invalidateOffice(address, \"Model switched\");\n }\n\n refreshConversationEnvironment(address: OfficeAddress): boolean {\n return this.invalidateOffice(address, \"Environment refreshed\");\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 invalidateOffice(address: OfficeAddress, reason: string): boolean {\n const cleared = this.sessions.invalidateConversation(address);\n if (cleared) {\n log.logInfo(`[${address.conversationId}] ${reason}; cleared cached session runners`);\n }\n return cleared;\n }\n\n private async createCurrentRunner(\n options: SessionStateOptions,\n sessionScope: Awaited<ReturnType<ChatHistorySync[\"resolveSessionScope\"]>>,\n signal: AbortSignal,\n ): Promise<PiAgentWrapper> {\n return createRunner({\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 sessionScope,\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 platformToolPackFactories: this.options.platformToolPackFactories,\n models: this.resolvedModels,\n });\n }\n\n private acquireState(options: SessionStateOptions & { currentMessageId?: string }) {\n const { address, sessionKey } = options;\n const conversationDir = this.options.workspace.office(address).dir;\n return this.sessions.acquire(\n address,\n sessionKey,\n () =>\n sessionKey === address.conversationId\n ? resolveChannelSessionFile(conversationDir)\n : tryResolveThreadSession(getThreadSessionFile(conversationDir, sessionKey)),\n (signal) => this.materializeState(options, conversationDir, signal),\n );\n }\n\n private async materializeState(\n options: SessionStateOptions & { currentMessageId?: string },\n conversationDir: string,\n signal: AbortSignal,\n ): Promise<ConversationState> {\n signal.throwIfAborted();\n const { address, sessionKey, currentMessageId } = options;\n const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workspace, address);\n const sessionScope = await this.chatSessionManager.resolveSessionScope({\n conversationDir,\n sessionKey,\n cwd: runtimeCwd,\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 sessionFile: sessionScope.contextFile,\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"]}
@@ -6,7 +6,6 @@ export declare class SessionLifecycle {
6
6
  private readonly transitions;
7
7
  private readonly queues;
8
8
  private readonly leases;
9
- private readonly settlements;
10
9
  private readonly settlementSessions;
11
10
  private readonly conversationBarriers;
12
11
  private readonly pendingConversationClears;
@@ -1 +1 @@
1
- {"version":3,"file":"session-lifecycle.d.ts","sourceRoot":"","sources":["../../src/runtime/session-lifecycle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-lifecycle.d.ts","sourceRoot":"","sources":["../../src/runtime/session-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,OAAO,KAAK,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAmBpF,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+C;IACtE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoC;IAChE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAoC;IACvE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA0C;IAC/E,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAqB;IAC/D,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA6B;IACrE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAyB;IAE9D,YAAY,OAAO,GAAE,uBAA4B,EAIhD;IAED,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS,CAEpF;IAED,iFAAiF;IACjF,GAAG,CAAC,KAAK,EAAE,wBAAwB,GAAG,IAAI,CAEzC;IAEK,OAAO,CACX,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,EAC7C,WAAW,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,wBAAwB,CAAC,GACtE,OAAO,CAAC;QAAE,KAAK,EAAE,wBAAwB,CAAC;QAAC,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC,CAQnE;YAEa,oBAAoB;IA6BlC,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,YAAY;IAOpB,MAAM,CACJ,KAAK,EAAE,wBAAwB,EAC/B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EACzB,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAO,GACtC,OAAO,CAAC,IAAI,CAAC,CAiBf;IAED,OAAO,CAAC,gBAAgB;IAcxB,eAAe,IAAI,MAAM,CAExB;IAEK,OAAO,CACX,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GACvB,OAAO,CAAC,IAAI,CAAC,CAUf;IAEK,uBAAuB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAgBzE;IAEK,0BAA0B,CAAC,CAAC,EAChC,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC,CAsBZ;IAED,OAAO,CAAC,sBAAsB;IAe9B,aAAa,IAAI,wBAAwB,EAAE,CAE1C;IAED,OAAO,IAAI,aAAa,EAAE,CAIzB;IAED,wBAAwB,CAAC,cAAc,EAAE,MAAM,GAAG,aAAa,EAAE,CAEhE;IAED,sBAAsB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAItD;IAED,aAAa,IAAI;QAAE,IAAI,EAAE,aAAa,EAAE,CAAA;KAAE,CASzC;IAED,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAKjD;IAED,sBAAsB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAEnD;IAED,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,UAAU;IAIZ,UAAU,CAAC,CAAC,EAChB,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACrB,OAAO,CAAC,CAAC,CAAC,CAcZ;IAED,4FAA4F;IACtF,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW9E;IAEK,YAAY,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5E;IAEK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAQ9B;IAED,OAAO,CAAC,OAAO;IAef,OAAO,CAAC,YAAY;IAQpB,SAAS,IAAI,IAAI,CAiBhB;IAEK,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB/C;YAEa,uBAAuB;YAiBvB,iBAAiB;IAM/B,OAAO,CAAC,eAAe;CAOxB"}
@@ -14,7 +14,6 @@ export class SessionLifecycle {
14
14
  this.transitions = new Map();
15
15
  this.queues = new Map();
16
16
  this.leases = new Map();
17
- this.settlements = new Set();
18
17
  this.settlementSessions = new Map();
19
18
  this.conversationBarriers = new Map();
20
19
  this.pendingConversationClears = new Set();
@@ -100,12 +99,10 @@ export class SessionLifecycle {
100
99
  .then(work)
101
100
  .finally(() => this.finishSettlement(state, settlement, id));
102
101
  state.runSettlement = settlement;
103
- this.settlements.add(settlement);
104
102
  this.settlementSessions.set(settlement, id);
105
103
  return settlement;
106
104
  }
107
105
  finishSettlement(state, settlement, id) {
108
- this.settlements.delete(settlement);
109
106
  this.settlementSessions.delete(settlement);
110
107
  if (state.runSettlement === settlement)
111
108
  state.runSettlement = undefined;
@@ -116,7 +113,7 @@ export class SessionLifecycle {
116
113
  this.evictIdle();
117
114
  }
118
115
  settlementCount() {
119
- return this.settlements.size;
116
+ return this.settlementSessions.size;
120
117
  }
121
118
  async enqueue(address, sessionKey, run) {
122
119
  const id = runtimeSessionId(address, sessionKey);
@@ -1 +1 @@
1
- {"version":3,"file":"session-lifecycle.js","sourceRoot":"","sources":["../../src/runtime/session-lifecycle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/C,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,uBAAuB,GAAG,SAAS,CAAC;AAC1C,MAAM,8BAA8B,GAAG,KAAK,CAAC;AAU7C,0EAA0E;AAC1E,SAAS,gBAAgB,CAAC,OAAsB,EAAE,UAAkB;IAClE,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,UAAU,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,OAAO,gBAAgB;IAkB3B,YAAY,OAAO,GAA4B,EAAE;QAjBhC,WAAM,GAAG,IAAI,GAAG,EAAoC,CAAC;QACrD,YAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;QAC3C,gBAAW,GAAG,IAAI,GAAG,EAAyB,CAAC;QAC/C,WAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;QAC1C,WAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACnC,gBAAW,GAAG,IAAI,GAAG,EAAiB,CAAC;QACvC,uBAAkB,GAAG,IAAI,GAAG,EAAyB,CAAC;QACtD,yBAAoB,GAAG,IAAI,GAAG,EAA+B,CAAC;QAC9D,8BAAyB,GAAG,IAAI,GAAG,EAAU,CAAC;QAC9C,4BAAuB,GAAG,IAAI,GAAG,EAAkB,CAAC;QAI7D,qBAAgB,GAAG,CAAC,CAAC;QACrB,iBAAY,GAAG,KAAK,CAAC;QACZ,yBAAoB,GAAG,IAAI,eAAe,EAAE,CAAC;QAG5D,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,oBAAoB,CAAC;QAC/D,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,uBAAuB,CAAC;QACtE,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACrC,CAAC;IAED,GAAG,CAAC,OAAsB,EAAE,UAAkB;QAC5C,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,iFAAiF;IACjF,GAAG,CAAC,KAA+B;QACjC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAAsB,EACtB,UAAkB,EAClB,YAA6C,EAC7C,WAAuE;QAEvE,IAAI,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;YAC9F,MAAM,EAAE,GAAG,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACpD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAChC,OAAsB,EACtB,UAAkB,EAClB,YAA6C,EAC7C,WAAuE;QAEvE,MAAM,EAAE,GAAG,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACjD,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,IAAI,CAAC,YAAY;gBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YAC7E,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrC,IAAI,QAAQ,IAAI,YAAY,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC;gBACxD,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACrC,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,IAAI,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC;gBAAE,OAAO,QAAQ,CAAC;YAClE,IAAI,QAAQ;gBAAE,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAE7D,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAClE,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,UAAU,KAAK,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBAC3B,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,YAAY;gBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAEO,kBAAkB,CAAC,EAAU,EAAE,OAAsB;QAC3D,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,OAAO,GAAG,EAAE;YACV,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACjC,CAAC,CAAC;IACJ,CAAC;IAEO,YAAY,CAAC,EAAU,EAAE,OAAsB;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,KAAK,IAAI,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;;YAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,CACJ,KAA+B,EAC/B,IAAyB,EACzB,OAAO,GAA8B,EAAE;QAEvC,MAAM,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpD,IAAI,OAAO,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAClC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;YACrB,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;YAC5B,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACpC,CAAC;QAED,IAAI,UAA0B,CAAC;QAC/B,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE;aAC3B,IAAI,CAAC,IAAI,CAAC;aACV,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/D,KAAK,CAAC,aAAa,GAAG,UAAU,CAAC;QACjC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACjC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC5C,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,gBAAgB,CACtB,KAA+B,EAC/B,UAAyB,EACzB,EAAU;QAEV,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACpC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,KAAK,CAAC,aAAa,KAAK,UAAU;YAAE,KAAK,CAAC,aAAa,GAAG,SAAS,CAAC;QACxE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;QACtB,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;QACpB,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAClC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAAsB,EACtB,UAAkB,EAClB,GAAwB;QAExB,MAAM,EAAE,GAAG,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC;QACb,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,IAAI;gBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,OAAsB;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACrD,OAAO,OAAO,CAAC,kBAAkB,GAAG,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,OAAO,GAAG,EAAE;YACV,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,OAAO,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,OAAO,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAChD,KAAK,MAAM,OAAO,IAAI,OAAO;oBAAE,OAAO,EAAE,CAAC;YAC3C,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,0BAA0B,CAC9B,OAAsB,EACtB,WAA6B;QAE7B,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACrD,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC7B,MAAM,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC;QACpD,IAAI,iBAA8B,CAAC;QACnC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,iBAAiB,GAAG,OAAO,CAAC,CAAC,CAAC;QACtF,OAAO,CAAC,eAAe,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC;QAE1E,MAAM,mBAAmB,CAAC;QAC1B,IAAI,OAAO,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,CAAC;YACH,OAAO,MAAM,WAAW,EAAE,CAAC;QAC7B,CAAC;gBAAS,CAAC;YACT,iBAAiB,EAAE,CAAC;YACpB,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAC7B,IAAI,OAAO,CAAC,kBAAkB,KAAK,CAAC,EAAE,CAAC;gBACrC,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC9C,KAAK,MAAM,OAAO,IAAI,OAAO;oBAAE,OAAO,EAAE,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,OAAsB;QACnD,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpD,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,MAAM,OAAO,GAAwB;YACnC,UAAU,EAAE,CAAC;YACb,kBAAkB,EAAE,CAAC;YACrB,eAAe,EAAE,OAAO,CAAC,OAAO,EAAE;YAClC,aAAa,EAAE,EAAE;YACjB,WAAW,EAAE,EAAE;SAChB,CAAC;QACF,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,aAAa;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO;QACL,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;QACjD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/F,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,wBAAwB,CAAC,cAAsB;QAC7C,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc,KAAK,cAAc,CAAC,CAAC;IACvF,CAAC;IAED,sBAAsB,CAAC,OAAsB;QAC3C,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxF,OAAO,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,aAAa;QACX,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,MAAM,IAAI,GAAoB,EAAE,CAAC;QACjC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;gBAAE,SAAS;YAC9C,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,CAAC;IAClB,CAAC;IAED,iBAAiB,CAAC,OAAsB;QACtC,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAC9C,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sBAAsB,CAAC,OAAsB;QAC3C,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACzD,CAAC;IAEO,kBAAkB,CAAC,OAAsB;QAC/C,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;YAAE,OAAO;QACpF,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAEO,aAAa,CAAC,OAAsB;QAC1C,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,MAAM,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YAC7D,IAAI,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;QACrF,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,aAAa,CAAC,EAAU,EAAE,KAA+B;QAC/D,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS,CAAC;IAC9F,CAAC;IAEO,mBAAmB,CAAC,OAAsB;QAChD,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;YACrD,IAAI,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG;gBAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,OAAsB;QACvC,OAAO,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IACjG,CAAC;IAED,KAAK,CAAC,UAAU,CACd,OAAsB,EACtB,UAAkB,EAClB,IAAsB;QAEtB,MAAM,EAAE,GAAG,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC/D,IAAI,OAAoB,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/B,MAAM,QAAQ,CAAC;QACf,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,EAAE,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,CAAC;YACV,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,IAAI;gBAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,4FAA4F;IAC5F,KAAK,CAAC,cAAc,CAAC,OAAsB,EAAE,UAAkB;QAC7D,MAAM,EAAE,GAAG,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACrC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC7B,MAAM,KAAK,CAAC;IACd,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAsB,EAAE,UAAkB;QAC3D,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YAC7D,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAEO,OAAO,CAAC,OAAsB,EAAE,UAAkB;QACxD,MAAM,EAAE,GAAG,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACrC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC7B,KAAK,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YAC3B,GAAG,CAAC,UAAU,CACZ,0BAA0B,UAAU,EAAE,EACtC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CACjD,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,YAAY,CAAC,EAAU,EAAE,KAAoB;QACnD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,KAAK;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC;QACF,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,SAAS;QACP,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;YACrD,MAAM,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YAC7D,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;gBACtF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAEjD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;aAC1C,MAAM,CACL,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CACzF;aACA,QAAQ,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;QACpD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC5F,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAAiB;QAC9B,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,MAAM,uBAAuB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,8BAA8B,CAAC;QAC5E,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;QACjF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACvC,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAE3C,IAAI,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,UAAU,CACZ,YAAY,IAAI,CAAC,eAAe,EAAE,8BAA8B,EAChE,GAAG,SAAS,IAAI,CACjB,CAAC;YACF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE;gBAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC/D,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC;YACtD,IAAI,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CACb,6BAA6B,IAAI,CAAC,eAAe,EAAE,6BAA6B,CACjF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,IAAI,CAAC,uBAAuB,CAAC,uBAAuB,CAAC,CAAC;QAC5D,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,uBAAuB,CAAC,QAAgB;QACpD,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QACxC,IAAI,OAAmC,CAAC;QACxC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;YACvD,IAAI,OAAO,CAAQ,CAAC,OAAO,EAAE,EAAE;gBAC7B,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACjF,CAAC,CAAC;SACH,CAAC,CAAC;QACH,IAAI,OAAO;YAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,6BAA6B,IAAI,CAAC,WAAW,CAAC,IAAI,mCAAmC,8BAA8B,IAAI,CACxH,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,QAAgB,EAAE,UAAkB;QAClE,OAAO,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC3D,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/C,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC;YACzD,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,UAAU,CAAC,IAAI,CAAC;IACzB,CAAC;CACF","sourcesContent":["import type { OfficeAddress } from \"../adapter.js\";\nimport * as log from \"../log.js\";\nimport { officeKey } from \"../office/index.js\";\nimport type { ConversationRuntimeState, SessionLifecycleOptions } from \"./types.js\";\n\nconst DEFAULT_MAX_SESSIONS = 500;\nconst DEFAULT_IDLE_TIMEOUT_MS = 3_600_000;\nconst MATERIALIZATION_ABORT_GRACE_MS = 5_000;\n\ninterface ConversationBarrier {\n activeWork: number;\n pendingMaintenance: number;\n maintenanceTail: Promise<void>;\n activeWaiters: Array<() => void>;\n workWaiters: Array<() => void>;\n}\n\n/** Runtime state is addressed by office plus the platform session key. */\nfunction runtimeSessionId(address: OfficeAddress, sessionKey: string): string {\n return `${officeKey(address)}|${sessionKey}`;\n}\n\nexport class SessionLifecycle {\n private readonly states = new Map<string, ConversationRuntimeState>();\n private readonly closing = new Map<string, Promise<void>>();\n private readonly transitions = new Map<string, Promise<void>>();\n private readonly queues = new Map<string, Promise<void>>();\n private readonly leases = new Map<string, number>();\n private readonly settlements = new Set<Promise<void>>();\n private readonly settlementSessions = new Map<Promise<void>, string>();\n private readonly conversationBarriers = new Map<string, ConversationBarrier>();\n private readonly pendingConversationClears = new Set<string>();\n private readonly conversationGenerations = new Map<string, number>();\n private readonly maxSessions: number;\n private readonly idleTimeoutMs: number;\n private readonly now: () => number;\n private globalGeneration = 0;\n private shuttingDown = false;\n private readonly materializationAbort = new AbortController();\n\n constructor(options: SessionLifecycleOptions = {}) {\n this.maxSessions = options.maxSessions ?? DEFAULT_MAX_SESSIONS;\n this.idleTimeoutMs = options.idleTimeoutMs ?? DEFAULT_IDLE_TIMEOUT_MS;\n this.now = options.now ?? Date.now;\n }\n\n get(address: OfficeAddress, sessionKey: string): ConversationRuntimeState | undefined {\n return this.states.get(runtimeSessionId(address, sessionKey));\n }\n\n /** Test/support insertion. Production materialization goes through acquire(). */\n set(state: ConversationRuntimeState): void {\n this.states.set(runtimeSessionId(state.address, state.sessionKey), state);\n }\n\n async acquire(\n address: OfficeAddress,\n sessionKey: string,\n expectedFile: () => string | null | undefined,\n materialize: (signal: AbortSignal) => Promise<ConversationRuntimeState>,\n ): Promise<{ state: ConversationRuntimeState; release: () => void }> {\n if (this.shuttingDown) throw new Error(\"Session lifecycle is shutting down\");\n return this.transition(address, sessionKey, async () => {\n const state = await this.materializeExclusive(address, sessionKey, expectedFile, materialize);\n const id = runtimeSessionId(address, sessionKey);\n this.leases.set(id, (this.leases.get(id) ?? 0) + 1);\n return { state, release: this.createLeaseRelease(id, address) };\n });\n }\n\n private async materializeExclusive(\n address: OfficeAddress,\n sessionKey: string,\n expectedFile: () => string | null | undefined,\n materialize: (signal: AbortSignal) => Promise<ConversationRuntimeState>,\n ): Promise<ConversationRuntimeState> {\n const id = runtimeSessionId(address, sessionKey);\n while (true) {\n if (this.shuttingDown) throw new Error(\"Session lifecycle is shutting down\");\n await this.waitForClose(address, sessionKey);\n const existing = this.states.get(id);\n if (existing && expectedFile() === existing.sessionFile) {\n existing.lastAccessedAt = this.now();\n return existing;\n }\n if (existing && this.isStateActive(id, existing)) return existing;\n if (existing) await this.discardAndWait(address, sessionKey);\n\n const generation = this.generation(address);\n const state = await materialize(this.materializationAbort.signal);\n if (!this.shuttingDown && generation === this.generation(address)) {\n this.states.set(id, state);\n return state;\n }\n await state.runner.dispose();\n if (this.shuttingDown) throw new Error(\"Session lifecycle is shutting down\");\n }\n }\n\n private createLeaseRelease(id: string, address: OfficeAddress): () => void {\n let released = false;\n return () => {\n if (released) return;\n released = true;\n this.releaseLease(id, address);\n };\n }\n\n private releaseLease(id: string, address: OfficeAddress): void {\n const count = this.leases.get(id) ?? 0;\n if (count <= 1) this.leases.delete(id);\n else this.leases.set(id, count - 1);\n this.applyDeferredClear(address);\n }\n\n settle(\n state: ConversationRuntimeState,\n work: () => Promise<void>,\n options: { markRunning?: boolean } = {},\n ): Promise<void> {\n const id = runtimeSessionId(state.address, state.sessionKey);\n this.leases.set(id, (this.leases.get(id) ?? 0) + 1);\n if (options.markRunning !== false) {\n state.running = true;\n state.stopRequested = false;\n state.startedAt = this.now();\n state.lastActivityAt = this.now();\n }\n\n let settlement!: Promise<void>;\n settlement = Promise.resolve()\n .then(work)\n .finally(() => this.finishSettlement(state, settlement, id));\n state.runSettlement = settlement;\n this.settlements.add(settlement);\n this.settlementSessions.set(settlement, id);\n return settlement;\n }\n\n private finishSettlement(\n state: ConversationRuntimeState,\n settlement: Promise<void>,\n id: string,\n ): void {\n this.settlements.delete(settlement);\n this.settlementSessions.delete(settlement);\n if (state.runSettlement === settlement) state.runSettlement = undefined;\n state.running = false;\n state.startedAt = 0;\n state.lastAccessedAt = this.now();\n this.releaseLease(id, state.address);\n this.evictIdle();\n }\n\n settlementCount(): number {\n return this.settlements.size;\n }\n\n async enqueue(\n address: OfficeAddress,\n sessionKey: string,\n run: () => Promise<void>,\n ): Promise<void> {\n const id = runtimeSessionId(address, sessionKey);\n const previous = this.queues.get(id) ?? Promise.resolve();\n const next = previous.catch(() => {}).then(run);\n this.queues.set(id, next);\n try {\n await next;\n } finally {\n if (this.queues.get(id) === next) this.queues.delete(id);\n }\n }\n\n async acquireConversationWork(address: OfficeAddress): Promise<() => void> {\n const barrier = this.getConversationBarrier(address);\n while (barrier.pendingMaintenance > 0) {\n await new Promise<void>((resolve) => barrier.workWaiters.push(resolve));\n }\n barrier.activeWork++;\n let released = false;\n return () => {\n if (released) return;\n released = true;\n barrier.activeWork--;\n if (barrier.activeWork === 0) {\n const waiters = barrier.activeWaiters.splice(0);\n for (const resolve of waiters) resolve();\n }\n };\n }\n\n async runConversationMaintenance<T>(\n address: OfficeAddress,\n maintenance: () => Promise<T>,\n ): Promise<T> {\n const barrier = this.getConversationBarrier(address);\n barrier.pendingMaintenance++;\n const previousMaintenance = barrier.maintenanceTail;\n let finishMaintenance!: () => void;\n const maintenanceTurn = new Promise<void>((resolve) => (finishMaintenance = resolve));\n barrier.maintenanceTail = previousMaintenance.then(() => maintenanceTurn);\n\n await previousMaintenance;\n if (barrier.activeWork > 0) {\n await new Promise<void>((resolve) => barrier.activeWaiters.push(resolve));\n }\n try {\n return await maintenance();\n } finally {\n finishMaintenance();\n barrier.pendingMaintenance--;\n if (barrier.pendingMaintenance === 0) {\n const waiters = barrier.workWaiters.splice(0);\n for (const resolve of waiters) resolve();\n }\n }\n }\n\n private getConversationBarrier(address: OfficeAddress): ConversationBarrier {\n const key = officeKey(address);\n const existing = this.conversationBarriers.get(key);\n if (existing) return existing;\n const barrier: ConversationBarrier = {\n activeWork: 0,\n pendingMaintenance: 0,\n maintenanceTail: Promise.resolve(),\n activeWaiters: [],\n workWaiters: [],\n };\n this.conversationBarriers.set(key, barrier);\n return barrier;\n }\n\n runningStates(): ConversationRuntimeState[] {\n return Array.from(this.states.values()).filter((state) => state.running);\n }\n\n offices(): OfficeAddress[] {\n const offices = new Map<string, OfficeAddress>();\n for (const state of this.states.values()) offices.set(officeKey(state.address), state.address);\n return Array.from(offices.values());\n }\n\n officesForConversationId(conversationId: string): OfficeAddress[] {\n return this.offices().filter((address) => address.conversationId === conversationId);\n }\n\n invalidateConversation(address: OfficeAddress): boolean {\n const key = officeKey(address);\n this.conversationGenerations.set(key, (this.conversationGenerations.get(key) ?? 0) + 1);\n return this.clearConversation(address);\n }\n\n invalidateAll(): { busy: OfficeAddress[] } {\n this.globalGeneration++;\n const busy: OfficeAddress[] = [];\n for (const address of this.offices()) {\n if (this.clearConversation(address)) continue;\n this.deferConversationClear(address);\n busy.push(address);\n }\n return { busy };\n }\n\n clearConversation(address: OfficeAddress): boolean {\n if (this.hasActiveWork(address)) return false;\n this.pendingConversationClears.delete(officeKey(address));\n this.discardConversation(address);\n return true;\n }\n\n deferConversationClear(address: OfficeAddress): void {\n this.pendingConversationClears.add(officeKey(address));\n }\n\n private applyDeferredClear(address: OfficeAddress): void {\n const key = officeKey(address);\n if (!this.pendingConversationClears.has(key) || this.hasActiveWork(address)) return;\n this.pendingConversationClears.delete(key);\n this.discardConversation(address);\n }\n\n private hasActiveWork(address: OfficeAddress): boolean {\n const key = officeKey(address);\n for (const state of this.states.values()) {\n const id = runtimeSessionId(state.address, state.sessionKey);\n if (officeKey(state.address) === key && this.isStateActive(id, state)) return true;\n }\n return false;\n }\n\n private isStateActive(id: string, state: ConversationRuntimeState): boolean {\n return (this.leases.get(id) ?? 0) > 0 || state.running || state.runSettlement !== undefined;\n }\n\n private discardConversation(address: OfficeAddress): void {\n const key = officeKey(address);\n for (const state of Array.from(this.states.values())) {\n if (officeKey(state.address) === key) this.discard(state.address, state.sessionKey);\n }\n }\n\n private generation(address: OfficeAddress): string {\n return `${this.globalGeneration}:${this.conversationGenerations.get(officeKey(address)) ?? 0}`;\n }\n\n async transition<T>(\n address: OfficeAddress,\n sessionKey: string,\n work: () => Promise<T>,\n ): Promise<T> {\n const id = runtimeSessionId(address, sessionKey);\n const previous = this.transitions.get(id) ?? Promise.resolve();\n let release!: () => void;\n const current = new Promise<void>((resolve) => (release = resolve));\n const tail = previous.then(() => current);\n this.transitions.set(id, tail);\n await previous;\n try {\n return await work();\n } finally {\n release();\n if (this.transitions.get(id) === tail) this.transitions.delete(id);\n }\n }\n\n /** Explicit reset/replacement path; caller guarantees the runner will not be used again. */\n async discardAndWait(address: OfficeAddress, sessionKey: string): Promise<void> {\n const id = runtimeSessionId(address, sessionKey);\n const state = this.states.get(id);\n if (!state) {\n await this.closing.get(id);\n return;\n }\n this.states.delete(id);\n const close = state.runner.dispose();\n this.trackClosing(id, close);\n await close;\n }\n\n async waitForClose(address: OfficeAddress, sessionKey: string): Promise<void> {\n await this.closing.get(runtimeSessionId(address, sessionKey));\n }\n\n async closeAll(): Promise<void> {\n const states = Array.from(this.states.values());\n this.states.clear();\n for (const state of states) {\n const id = runtimeSessionId(state.address, state.sessionKey);\n this.trackClosing(id, state.runner.dispose());\n }\n await Promise.all(this.closing.values());\n }\n\n private discard(address: OfficeAddress, sessionKey: string): void {\n const id = runtimeSessionId(address, sessionKey);\n const state = this.states.get(id);\n if (!state) return;\n this.states.delete(id);\n const close = state.runner.dispose();\n this.trackClosing(id, close);\n close.catch((err: unknown) => {\n log.logWarning(\n `Runner dispose failed: ${sessionKey}`,\n err instanceof Error ? err.message : String(err),\n );\n });\n }\n\n private trackClosing(id: string, close: Promise<void>): void {\n this.closing.set(id, close);\n const clear = () => {\n if (this.closing.get(id) === close) this.closing.delete(id);\n };\n void close.then(clear, clear);\n }\n\n evictIdle(): void {\n const now = this.now();\n for (const state of Array.from(this.states.values())) {\n const id = runtimeSessionId(state.address, state.sessionKey);\n if (!this.isStateActive(id, state) && now - state.lastAccessedAt > this.idleTimeoutMs) {\n this.discard(state.address, state.sessionKey);\n }\n }\n if (this.states.size <= this.maxSessions) return;\n\n const idle = Array.from(this.states.values())\n .filter(\n (state) => !this.isStateActive(runtimeSessionId(state.address, state.sessionKey), state),\n )\n .toSorted((left, right) => left.lastAccessedAt - right.lastAccessedAt);\n const toEvict = this.states.size - this.maxSessions;\n for (const state of idle.slice(0, toEvict)) this.discard(state.address, state.sessionKey);\n }\n\n async shutdown(timeoutMs: number): Promise<void> {\n if (this.shuttingDown) return;\n this.shuttingDown = true;\n const materializationDeadline = Date.now() + MATERIALIZATION_ABORT_GRACE_MS;\n this.materializationAbort.abort(new Error(\"Session lifecycle is shutting down\"));\n const timeout = Date.now() + timeoutMs;\n await this.waitForActiveWork(timeout, 500);\n\n if (this.activeWorkCount() > 0) {\n log.logWarning(\n `Aborting ${this.activeWorkCount()} runs after shutdown timeout`,\n `${timeoutMs}ms`,\n );\n for (const state of this.runningStates()) state.runner.abort();\n await this.waitForActiveWork(Date.now() + 5_000, 100);\n if (this.activeWorkCount() > 0) {\n throw new Error(\n `Shutdown could not settle ${this.activeWorkCount()} aborted runs within 5000ms`,\n );\n }\n }\n\n await this.waitForMaterializations(materializationDeadline);\n await this.closeAll();\n }\n\n private async waitForMaterializations(deadline: number): Promise<void> {\n if (this.transitions.size === 0) return;\n let timeout: NodeJS.Timeout | undefined;\n const settled = await Promise.race([\n Promise.all(this.transitions.values()).then(() => true),\n new Promise<false>((resolve) => {\n timeout = setTimeout(() => resolve(false), Math.max(0, deadline - Date.now()));\n }),\n ]);\n if (timeout) clearTimeout(timeout);\n if (!settled) {\n throw new Error(\n `Shutdown could not settle ${this.transitions.size} runner materializations within ${MATERIALIZATION_ABORT_GRACE_MS}ms`,\n );\n }\n }\n\n private async waitForActiveWork(deadline: number, intervalMs: number): Promise<void> {\n while (this.activeWorkCount() > 0 && Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n }\n\n private activeWorkCount(): number {\n const sessionIds = new Set(this.leases.keys());\n for (const sessionId of this.settlementSessions.values()) {\n sessionIds.add(sessionId);\n }\n return sessionIds.size;\n }\n}\n"]}
1
+ {"version":3,"file":"session-lifecycle.js","sourceRoot":"","sources":["../../src/runtime/session-lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["import type { OfficeAddress } from \"../adapter.js\";\nimport * as log from \"../log.js\";\nimport { officeKey } from \"../office/index.js\";\nimport type { ConversationRuntimeState, SessionLifecycleOptions } from \"./types.js\";\n\nconst DEFAULT_MAX_SESSIONS = 500;\nconst DEFAULT_IDLE_TIMEOUT_MS = 3_600_000;\nconst MATERIALIZATION_ABORT_GRACE_MS = 5_000;\n\ninterface ConversationBarrier {\n activeWork: number;\n pendingMaintenance: number;\n maintenanceTail: Promise<void>;\n activeWaiters: Array<() => void>;\n workWaiters: Array<() => void>;\n}\n\n/** Runtime state is addressed by office plus the platform session key. */\nfunction runtimeSessionId(address: OfficeAddress, sessionKey: string): string {\n return `${officeKey(address)}|${sessionKey}`;\n}\n\nexport class SessionLifecycle {\n private readonly states = new Map<string, ConversationRuntimeState>();\n private readonly closing = new Map<string, Promise<void>>();\n private readonly transitions = new Map<string, Promise<void>>();\n private readonly queues = new Map<string, Promise<void>>();\n private readonly leases = new Map<string, number>();\n private readonly settlementSessions = new Map<Promise<void>, string>();\n private readonly conversationBarriers = new Map<string, ConversationBarrier>();\n private readonly pendingConversationClears = new Set<string>();\n private readonly conversationGenerations = new Map<string, number>();\n private readonly maxSessions: number;\n private readonly idleTimeoutMs: number;\n private readonly now: () => number;\n private globalGeneration = 0;\n private shuttingDown = false;\n private readonly materializationAbort = new AbortController();\n\n constructor(options: SessionLifecycleOptions = {}) {\n this.maxSessions = options.maxSessions ?? DEFAULT_MAX_SESSIONS;\n this.idleTimeoutMs = options.idleTimeoutMs ?? DEFAULT_IDLE_TIMEOUT_MS;\n this.now = options.now ?? Date.now;\n }\n\n get(address: OfficeAddress, sessionKey: string): ConversationRuntimeState | undefined {\n return this.states.get(runtimeSessionId(address, sessionKey));\n }\n\n /** Test/support insertion. Production materialization goes through acquire(). */\n set(state: ConversationRuntimeState): void {\n this.states.set(runtimeSessionId(state.address, state.sessionKey), state);\n }\n\n async acquire(\n address: OfficeAddress,\n sessionKey: string,\n expectedFile: () => string | null | undefined,\n materialize: (signal: AbortSignal) => Promise<ConversationRuntimeState>,\n ): Promise<{ state: ConversationRuntimeState; release: () => void }> {\n if (this.shuttingDown) throw new Error(\"Session lifecycle is shutting down\");\n return this.transition(address, sessionKey, async () => {\n const state = await this.materializeExclusive(address, sessionKey, expectedFile, materialize);\n const id = runtimeSessionId(address, sessionKey);\n this.leases.set(id, (this.leases.get(id) ?? 0) + 1);\n return { state, release: this.createLeaseRelease(id, address) };\n });\n }\n\n private async materializeExclusive(\n address: OfficeAddress,\n sessionKey: string,\n expectedFile: () => string | null | undefined,\n materialize: (signal: AbortSignal) => Promise<ConversationRuntimeState>,\n ): Promise<ConversationRuntimeState> {\n const id = runtimeSessionId(address, sessionKey);\n while (true) {\n if (this.shuttingDown) throw new Error(\"Session lifecycle is shutting down\");\n await this.waitForClose(address, sessionKey);\n const existing = this.states.get(id);\n if (existing && expectedFile() === existing.sessionFile) {\n existing.lastAccessedAt = this.now();\n return existing;\n }\n if (existing && this.isStateActive(id, existing)) return existing;\n if (existing) await this.discardAndWait(address, sessionKey);\n\n const generation = this.generation(address);\n const state = await materialize(this.materializationAbort.signal);\n if (!this.shuttingDown && generation === this.generation(address)) {\n this.states.set(id, state);\n return state;\n }\n await state.runner.dispose();\n if (this.shuttingDown) throw new Error(\"Session lifecycle is shutting down\");\n }\n }\n\n private createLeaseRelease(id: string, address: OfficeAddress): () => void {\n let released = false;\n return () => {\n if (released) return;\n released = true;\n this.releaseLease(id, address);\n };\n }\n\n private releaseLease(id: string, address: OfficeAddress): void {\n const count = this.leases.get(id) ?? 0;\n if (count <= 1) this.leases.delete(id);\n else this.leases.set(id, count - 1);\n this.applyDeferredClear(address);\n }\n\n settle(\n state: ConversationRuntimeState,\n work: () => Promise<void>,\n options: { markRunning?: boolean } = {},\n ): Promise<void> {\n const id = runtimeSessionId(state.address, state.sessionKey);\n this.leases.set(id, (this.leases.get(id) ?? 0) + 1);\n if (options.markRunning !== false) {\n state.running = true;\n state.stopRequested = false;\n state.startedAt = this.now();\n state.lastActivityAt = this.now();\n }\n\n let settlement!: Promise<void>;\n settlement = Promise.resolve()\n .then(work)\n .finally(() => this.finishSettlement(state, settlement, id));\n state.runSettlement = settlement;\n this.settlementSessions.set(settlement, id);\n return settlement;\n }\n\n private finishSettlement(\n state: ConversationRuntimeState,\n settlement: Promise<void>,\n id: string,\n ): void {\n this.settlementSessions.delete(settlement);\n if (state.runSettlement === settlement) state.runSettlement = undefined;\n state.running = false;\n state.startedAt = 0;\n state.lastAccessedAt = this.now();\n this.releaseLease(id, state.address);\n this.evictIdle();\n }\n\n settlementCount(): number {\n return this.settlementSessions.size;\n }\n\n async enqueue(\n address: OfficeAddress,\n sessionKey: string,\n run: () => Promise<void>,\n ): Promise<void> {\n const id = runtimeSessionId(address, sessionKey);\n const previous = this.queues.get(id) ?? Promise.resolve();\n const next = previous.catch(() => {}).then(run);\n this.queues.set(id, next);\n try {\n await next;\n } finally {\n if (this.queues.get(id) === next) this.queues.delete(id);\n }\n }\n\n async acquireConversationWork(address: OfficeAddress): Promise<() => void> {\n const barrier = this.getConversationBarrier(address);\n while (barrier.pendingMaintenance > 0) {\n await new Promise<void>((resolve) => barrier.workWaiters.push(resolve));\n }\n barrier.activeWork++;\n let released = false;\n return () => {\n if (released) return;\n released = true;\n barrier.activeWork--;\n if (barrier.activeWork === 0) {\n const waiters = barrier.activeWaiters.splice(0);\n for (const resolve of waiters) resolve();\n }\n };\n }\n\n async runConversationMaintenance<T>(\n address: OfficeAddress,\n maintenance: () => Promise<T>,\n ): Promise<T> {\n const barrier = this.getConversationBarrier(address);\n barrier.pendingMaintenance++;\n const previousMaintenance = barrier.maintenanceTail;\n let finishMaintenance!: () => void;\n const maintenanceTurn = new Promise<void>((resolve) => (finishMaintenance = resolve));\n barrier.maintenanceTail = previousMaintenance.then(() => maintenanceTurn);\n\n await previousMaintenance;\n if (barrier.activeWork > 0) {\n await new Promise<void>((resolve) => barrier.activeWaiters.push(resolve));\n }\n try {\n return await maintenance();\n } finally {\n finishMaintenance();\n barrier.pendingMaintenance--;\n if (barrier.pendingMaintenance === 0) {\n const waiters = barrier.workWaiters.splice(0);\n for (const resolve of waiters) resolve();\n }\n }\n }\n\n private getConversationBarrier(address: OfficeAddress): ConversationBarrier {\n const key = officeKey(address);\n const existing = this.conversationBarriers.get(key);\n if (existing) return existing;\n const barrier: ConversationBarrier = {\n activeWork: 0,\n pendingMaintenance: 0,\n maintenanceTail: Promise.resolve(),\n activeWaiters: [],\n workWaiters: [],\n };\n this.conversationBarriers.set(key, barrier);\n return barrier;\n }\n\n runningStates(): ConversationRuntimeState[] {\n return Array.from(this.states.values()).filter((state) => state.running);\n }\n\n offices(): OfficeAddress[] {\n const offices = new Map<string, OfficeAddress>();\n for (const state of this.states.values()) offices.set(officeKey(state.address), state.address);\n return Array.from(offices.values());\n }\n\n officesForConversationId(conversationId: string): OfficeAddress[] {\n return this.offices().filter((address) => address.conversationId === conversationId);\n }\n\n invalidateConversation(address: OfficeAddress): boolean {\n const key = officeKey(address);\n this.conversationGenerations.set(key, (this.conversationGenerations.get(key) ?? 0) + 1);\n return this.clearConversation(address);\n }\n\n invalidateAll(): { busy: OfficeAddress[] } {\n this.globalGeneration++;\n const busy: OfficeAddress[] = [];\n for (const address of this.offices()) {\n if (this.clearConversation(address)) continue;\n this.deferConversationClear(address);\n busy.push(address);\n }\n return { busy };\n }\n\n clearConversation(address: OfficeAddress): boolean {\n if (this.hasActiveWork(address)) return false;\n this.pendingConversationClears.delete(officeKey(address));\n this.discardConversation(address);\n return true;\n }\n\n deferConversationClear(address: OfficeAddress): void {\n this.pendingConversationClears.add(officeKey(address));\n }\n\n private applyDeferredClear(address: OfficeAddress): void {\n const key = officeKey(address);\n if (!this.pendingConversationClears.has(key) || this.hasActiveWork(address)) return;\n this.pendingConversationClears.delete(key);\n this.discardConversation(address);\n }\n\n private hasActiveWork(address: OfficeAddress): boolean {\n const key = officeKey(address);\n for (const state of this.states.values()) {\n const id = runtimeSessionId(state.address, state.sessionKey);\n if (officeKey(state.address) === key && this.isStateActive(id, state)) return true;\n }\n return false;\n }\n\n private isStateActive(id: string, state: ConversationRuntimeState): boolean {\n return (this.leases.get(id) ?? 0) > 0 || state.running || state.runSettlement !== undefined;\n }\n\n private discardConversation(address: OfficeAddress): void {\n const key = officeKey(address);\n for (const state of Array.from(this.states.values())) {\n if (officeKey(state.address) === key) this.discard(state.address, state.sessionKey);\n }\n }\n\n private generation(address: OfficeAddress): string {\n return `${this.globalGeneration}:${this.conversationGenerations.get(officeKey(address)) ?? 0}`;\n }\n\n async transition<T>(\n address: OfficeAddress,\n sessionKey: string,\n work: () => Promise<T>,\n ): Promise<T> {\n const id = runtimeSessionId(address, sessionKey);\n const previous = this.transitions.get(id) ?? Promise.resolve();\n let release!: () => void;\n const current = new Promise<void>((resolve) => (release = resolve));\n const tail = previous.then(() => current);\n this.transitions.set(id, tail);\n await previous;\n try {\n return await work();\n } finally {\n release();\n if (this.transitions.get(id) === tail) this.transitions.delete(id);\n }\n }\n\n /** Explicit reset/replacement path; caller guarantees the runner will not be used again. */\n async discardAndWait(address: OfficeAddress, sessionKey: string): Promise<void> {\n const id = runtimeSessionId(address, sessionKey);\n const state = this.states.get(id);\n if (!state) {\n await this.closing.get(id);\n return;\n }\n this.states.delete(id);\n const close = state.runner.dispose();\n this.trackClosing(id, close);\n await close;\n }\n\n async waitForClose(address: OfficeAddress, sessionKey: string): Promise<void> {\n await this.closing.get(runtimeSessionId(address, sessionKey));\n }\n\n async closeAll(): Promise<void> {\n const states = Array.from(this.states.values());\n this.states.clear();\n for (const state of states) {\n const id = runtimeSessionId(state.address, state.sessionKey);\n this.trackClosing(id, state.runner.dispose());\n }\n await Promise.all(this.closing.values());\n }\n\n private discard(address: OfficeAddress, sessionKey: string): void {\n const id = runtimeSessionId(address, sessionKey);\n const state = this.states.get(id);\n if (!state) return;\n this.states.delete(id);\n const close = state.runner.dispose();\n this.trackClosing(id, close);\n close.catch((err: unknown) => {\n log.logWarning(\n `Runner dispose failed: ${sessionKey}`,\n err instanceof Error ? err.message : String(err),\n );\n });\n }\n\n private trackClosing(id: string, close: Promise<void>): void {\n this.closing.set(id, close);\n const clear = () => {\n if (this.closing.get(id) === close) this.closing.delete(id);\n };\n void close.then(clear, clear);\n }\n\n evictIdle(): void {\n const now = this.now();\n for (const state of Array.from(this.states.values())) {\n const id = runtimeSessionId(state.address, state.sessionKey);\n if (!this.isStateActive(id, state) && now - state.lastAccessedAt > this.idleTimeoutMs) {\n this.discard(state.address, state.sessionKey);\n }\n }\n if (this.states.size <= this.maxSessions) return;\n\n const idle = Array.from(this.states.values())\n .filter(\n (state) => !this.isStateActive(runtimeSessionId(state.address, state.sessionKey), state),\n )\n .toSorted((left, right) => left.lastAccessedAt - right.lastAccessedAt);\n const toEvict = this.states.size - this.maxSessions;\n for (const state of idle.slice(0, toEvict)) this.discard(state.address, state.sessionKey);\n }\n\n async shutdown(timeoutMs: number): Promise<void> {\n if (this.shuttingDown) return;\n this.shuttingDown = true;\n const materializationDeadline = Date.now() + MATERIALIZATION_ABORT_GRACE_MS;\n this.materializationAbort.abort(new Error(\"Session lifecycle is shutting down\"));\n const timeout = Date.now() + timeoutMs;\n await this.waitForActiveWork(timeout, 500);\n\n if (this.activeWorkCount() > 0) {\n log.logWarning(\n `Aborting ${this.activeWorkCount()} runs after shutdown timeout`,\n `${timeoutMs}ms`,\n );\n for (const state of this.runningStates()) state.runner.abort();\n await this.waitForActiveWork(Date.now() + 5_000, 100);\n if (this.activeWorkCount() > 0) {\n throw new Error(\n `Shutdown could not settle ${this.activeWorkCount()} aborted runs within 5000ms`,\n );\n }\n }\n\n await this.waitForMaterializations(materializationDeadline);\n await this.closeAll();\n }\n\n private async waitForMaterializations(deadline: number): Promise<void> {\n if (this.transitions.size === 0) return;\n let timeout: NodeJS.Timeout | undefined;\n const settled = await Promise.race([\n Promise.all(this.transitions.values()).then(() => true),\n new Promise<false>((resolve) => {\n timeout = setTimeout(() => resolve(false), Math.max(0, deadline - Date.now()));\n }),\n ]);\n if (timeout) clearTimeout(timeout);\n if (!settled) {\n throw new Error(\n `Shutdown could not settle ${this.transitions.size} runner materializations within ${MATERIALIZATION_ABORT_GRACE_MS}ms`,\n );\n }\n }\n\n private async waitForActiveWork(deadline: number, intervalMs: number): Promise<void> {\n while (this.activeWorkCount() > 0 && Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n }\n\n private activeWorkCount(): number {\n const sessionIds = new Set(this.leases.keys());\n for (const sessionId of this.settlementSessions.values()) {\n sessionIds.add(sessionId);\n }\n return sessionIds.size;\n }\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import type { McpServerConfig } from "../mcp/types.js";
1
2
  import type { PiAgentWrapper, PlatformTrustModel } from "../types.js";
2
3
  import type { MessagingBot, ConversationContext, ConversationEvent, MessagingEventHandler, OfficeAddress } from "../adapter.js";
3
4
  import type { AdminTokenStoreLike, CommandHandler, CommandServices, LinkTokenStoreLike, SessionViewTokenStoreLike } from "../commands/types.js";
@@ -57,6 +58,8 @@ export interface ConversationRuntimeOptions extends Omit<CommandServices, "runti
57
58
  commandHandlers?: readonly CommandHandler[];
58
59
  /** Model registry override; defaults to the process-wide models.json load. */
59
60
  models?: MikanModels;
61
+ /** Startup-owned OpenConnector MCP endpoint; settings cannot replace it. */
62
+ openConnector?: McpServerConfig;
60
63
  /**
61
64
  * Optional platform capability packs (extra tools + per-run bind), as
62
65
  * factories — each runner instantiates its own pack because bind state is
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { PiAgentWrapper, PlatformTrustModel } from \"../types.js\";\nimport type {\n MessagingBot,\n ConversationContext,\n ConversationEvent,\n MessagingEventHandler,\n OfficeAddress,\n} from \"../adapter.js\";\nimport type {\n AdminTokenStoreLike,\n CommandHandler,\n CommandServices,\n LinkTokenStoreLike,\n SessionViewTokenStoreLike,\n} from \"../commands/types.js\";\nimport type { MikanModels } from \"../harness/index.js\";\nimport type { PlatformToolPackFactory } from \"../tools/types.js\";\nimport type { VaultManager } from \"../vault/index.js\";\n\nexport interface SessionLifecycleOptions {\n maxSessions?: number;\n idleTimeoutMs?: number;\n now?: () => number;\n}\n\nexport interface ConversationRuntimeState {\n /** The office that owns this runtime state. */\n address: OfficeAddress;\n /** This office's platform session reference (raw session-key grammar). */\n sessionKey: string;\n running: boolean;\n /** Exact settlement of the current run, including post-run response handling. */\n runSettlement?: Promise<void>;\n runner: PiAgentWrapper;\n stopRequested: boolean;\n stopMessageTs?: string;\n lastAccessedAt: number;\n sessionFile: string;\n /** Epoch ms when the current run started; 0 when idle. */\n startedAt: number;\n lastActivityAt?: number;\n}\n\nexport interface RunSessionOptions {\n event: ConversationEvent;\n bot: MessagingBot;\n context: ConversationContext;\n}\n\n/** Conversation/session identity used to resolve per-session runner state. */\nexport interface SessionStateOptions {\n /** Canonical office identity; the runtime keys all state by this. */\n address: OfficeAddress;\n sessionKey: string;\n /** Fixed trust boundary for this office's built-in platform path. */\n trustModel: PlatformTrustModel;\n /** Stable platform workspace/team identity when the adapter supplies one. */\n platformWorkspaceId?: string;\n}\n\nexport interface ConversationRuntimeOptions extends Omit<\n CommandServices,\n \"runtime\" | \"vaultManager\" | \"linkTokenStore\" | \"sessionViewTokenStore\" | \"adminTokenStore\"\n> {\n /**\n * Credential vault for sandboxed conversations. Optional for embedders;\n * when omitted the runtime uses an inert, disabled vault.\n */\n vaultManager?: VaultManager;\n /** Login-portal token store; omit when no web portal is hosted. */\n linkTokenStore?: LinkTokenStoreLike;\n /** Session-viewer token store; omit when no web portal is hosted. */\n sessionViewTokenStore?: SessionViewTokenStoreLike;\n /** Admin-portal token store; omit when no web portal is hosted. */\n adminTokenStore?: AdminTokenStoreLike;\n /** Override the default command handlers (e.g., to add /help, /status). */\n commandHandlers?: readonly CommandHandler[];\n /** Model registry override; defaults to the process-wide models.json load. */\n models?: MikanModels;\n /**\n * Optional platform capability packs (extra tools + per-run bind), as\n * factories — each runner instantiates its own pack because bind state is\n * per-runner. Assembled at process start (e.g. GitHub PR/CI pack); core\n * stays platform-neutral.\n */\n platformToolPackFactories?: readonly PlatformToolPackFactory[];\n}\n\nexport interface ConversationRuntime extends MessagingEventHandler {\n runSession(options: RunSessionOptions): Promise<void>;\n runDream(address: OfficeAddress, now?: Date): Promise<boolean>;\n switchConversationModel(address: OfficeAddress, provider: string, model: string): boolean;\n refreshConversationEnvironment(address: OfficeAddress): boolean;\n /** Clear idle runners; defer busy conversation invalidation until settlement. */\n refreshAllConversations(): { busy: OfficeAddress[] };\n shutdown(timeoutMs?: number): Promise<void>;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { McpServerConfig } from \"../mcp/types.js\";\nimport type { PiAgentWrapper, PlatformTrustModel } from \"../types.js\";\nimport type {\n MessagingBot,\n ConversationContext,\n ConversationEvent,\n MessagingEventHandler,\n OfficeAddress,\n} from \"../adapter.js\";\nimport type {\n AdminTokenStoreLike,\n CommandHandler,\n CommandServices,\n LinkTokenStoreLike,\n SessionViewTokenStoreLike,\n} from \"../commands/types.js\";\nimport type { MikanModels } from \"../harness/index.js\";\nimport type { PlatformToolPackFactory } from \"../tools/types.js\";\nimport type { VaultManager } from \"../vault/index.js\";\n\nexport interface SessionLifecycleOptions {\n maxSessions?: number;\n idleTimeoutMs?: number;\n now?: () => number;\n}\n\nexport interface ConversationRuntimeState {\n /** The office that owns this runtime state. */\n address: OfficeAddress;\n /** This office's platform session reference (raw session-key grammar). */\n sessionKey: string;\n running: boolean;\n /** Exact settlement of the current run, including post-run response handling. */\n runSettlement?: Promise<void>;\n runner: PiAgentWrapper;\n stopRequested: boolean;\n stopMessageTs?: string;\n lastAccessedAt: number;\n sessionFile: string;\n /** Epoch ms when the current run started; 0 when idle. */\n startedAt: number;\n lastActivityAt?: number;\n}\n\nexport interface RunSessionOptions {\n event: ConversationEvent;\n bot: MessagingBot;\n context: ConversationContext;\n}\n\n/** Conversation/session identity used to resolve per-session runner state. */\nexport interface SessionStateOptions {\n /** Canonical office identity; the runtime keys all state by this. */\n address: OfficeAddress;\n sessionKey: string;\n /** Fixed trust boundary for this office's built-in platform path. */\n trustModel: PlatformTrustModel;\n /** Stable platform workspace/team identity when the adapter supplies one. */\n platformWorkspaceId?: string;\n}\n\nexport interface ConversationRuntimeOptions extends Omit<\n CommandServices,\n \"runtime\" | \"vaultManager\" | \"linkTokenStore\" | \"sessionViewTokenStore\" | \"adminTokenStore\"\n> {\n /**\n * Credential vault for sandboxed conversations. Optional for embedders;\n * when omitted the runtime uses an inert, disabled vault.\n */\n vaultManager?: VaultManager;\n /** Login-portal token store; omit when no web portal is hosted. */\n linkTokenStore?: LinkTokenStoreLike;\n /** Session-viewer token store; omit when no web portal is hosted. */\n sessionViewTokenStore?: SessionViewTokenStoreLike;\n /** Admin-portal token store; omit when no web portal is hosted. */\n adminTokenStore?: AdminTokenStoreLike;\n /** Override the default command handlers (e.g., to add /help, /status). */\n commandHandlers?: readonly CommandHandler[];\n /** Model registry override; defaults to the process-wide models.json load. */\n models?: MikanModels;\n /** Startup-owned OpenConnector MCP endpoint; settings cannot replace it. */\n openConnector?: McpServerConfig;\n /**\n * Optional platform capability packs (extra tools + per-run bind), as\n * factories — each runner instantiates its own pack because bind state is\n * per-runner. Assembled at process start (e.g. GitHub PR/CI pack); core\n * stays platform-neutral.\n */\n platformToolPackFactories?: readonly PlatformToolPackFactory[];\n}\n\nexport interface ConversationRuntime extends MessagingEventHandler {\n runSession(options: RunSessionOptions): Promise<void>;\n runDream(address: OfficeAddress, now?: Date): Promise<boolean>;\n switchConversationModel(address: OfficeAddress, provider: string, model: string): boolean;\n refreshConversationEnvironment(address: OfficeAddress): boolean;\n /** Clear idle runners; defer busy conversation invalidation until settlement. */\n refreshAllConversations(): { busy: OfficeAddress[] };\n shutdown(timeoutMs?: number): Promise<void>;\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import type { Pi084MigrationResult } from "./types.js";
2
+ export type { Pi084MigrationResult } from "./types.js";
3
+ export declare function isPi084SessionFile(filePath: string): boolean;
4
+ export declare function migratePi084SessionFile(filePath: string, options?: {
5
+ dryRun?: boolean;
6
+ }): Promise<Pi084MigrationResult>;
7
+ export declare function findPi084SessionFiles(root: string): string[];
8
+ //# sourceMappingURL=migrate-pi-084.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-pi-084.d.ts","sourceRoot":"","sources":["../../src/sessions/migrate-pi-084.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAkDvD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAO5D;AAoRD,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CA4B/B;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAmB5D"}