@agimon-ai/doompi-core 0.0.1-alpha.77 → 0.0.1-alpha.78
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/headless.d.cts +2 -2
- package/dist/headless.d.mts +2 -2
- package/dist/mcp-facet.d.cts +2 -2
- package/dist/mcp-facet.d.mts +2 -2
- package/dist/runtime-cordis-host.cjs.map +1 -1
- package/dist/runtime-cordis-host.d.cts +1 -1
- package/dist/runtime-cordis-host.d.cts.map +1 -1
- package/dist/runtime-cordis-host.d.mts +1 -1
- package/dist/runtime-cordis-host.d.mts.map +1 -1
- package/dist/runtime-cordis-host.mjs.map +1 -1
- package/dist/runtime-pi-extension.cjs +6 -2
- package/dist/runtime-pi-extension.cjs.map +1 -1
- package/dist/runtime-pi-extension.d.cts.map +1 -1
- package/dist/runtime-pi-extension.d.mts.map +1 -1
- package/dist/runtime-pi-extension.mjs +6 -2
- package/dist/runtime-pi-extension.mjs.map +1 -1
- package/dist/schemas/builtinApiContracts.cjs +1 -1
- package/dist/schemas/builtinApiContracts.cjs.map +1 -1
- package/dist/schemas/builtinApiContracts.mjs +1 -1
- package/dist/schemas/builtinApiContracts.mjs.map +1 -1
- package/dist/schemas/headless.cjs.map +1 -1
- package/dist/schemas/headless.d.cts +10 -0
- package/dist/schemas/headless.d.cts.map +1 -1
- package/dist/schemas/headless.d.mts +10 -0
- package/dist/schemas/headless.d.mts.map +1 -1
- package/dist/schemas/headless.mjs.map +1 -1
- package/dist/schemas/mcpFacet.cjs.map +1 -1
- package/dist/schemas/mcpFacet.d.cts +26 -0
- package/dist/schemas/mcpFacet.d.cts.map +1 -1
- package/dist/schemas/mcpFacet.d.mts +26 -0
- package/dist/schemas/mcpFacet.d.mts.map +1 -1
- package/dist/schemas/mcpFacet.mjs.map +1 -1
- package/dist/server/sessionMcpHandler.cjs +34 -5
- package/dist/server/sessionMcpHandler.cjs.map +1 -1
- package/dist/server/sessionMcpHandler.mjs +34 -5
- package/dist/server/sessionMcpHandler.mjs.map +1 -1
- package/dist/services/historyCreationFileSystem/index.cjs +3 -2
- package/dist/services/historyCreationFileSystem/index.cjs.map +1 -1
- package/dist/services/historyCreationFileSystem/index.mjs +3 -2
- package/dist/services/historyCreationFileSystem/index.mjs.map +1 -1
- package/dist/services/piExtensionHost/index.cjs +19 -7
- package/dist/services/piExtensionHost/index.cjs.map +1 -1
- package/dist/services/piExtensionHost/index.mjs +19 -7
- package/dist/services/piExtensionHost/index.mjs.map +1 -1
- package/dist/services/pluginLifecycle/index.cjs +1 -1
- package/dist/services/pluginLifecycle/index.cjs.map +1 -1
- package/dist/services/pluginLifecycle/index.mjs +1 -1
- package/dist/services/pluginLifecycle/index.mjs.map +1 -1
- package/dist/systems/main/adapters/headlessSessionHost.cjs +77 -11
- package/dist/systems/main/adapters/headlessSessionHost.cjs.map +1 -1
- package/dist/systems/main/adapters/headlessSessionHost.d.cts.map +1 -1
- package/dist/systems/main/adapters/headlessSessionHost.d.mts.map +1 -1
- package/dist/systems/main/adapters/headlessSessionHost.mjs +76 -11
- package/dist/systems/main/adapters/headlessSessionHost.mjs.map +1 -1
- package/dist/testing/pi/testHost.cjs +6 -0
- package/dist/testing/pi/testHost.cjs.map +1 -1
- package/dist/testing/pi/testHost.mjs +6 -0
- package/dist/testing/pi/testHost.mjs.map +1 -1
- package/dist/types/server/sessionToolSurface.d.cts +3 -2
- package/dist/types/server/sessionToolSurface.d.cts.map +1 -1
- package/dist/types/server/sessionToolSurface.d.mts +3 -2
- package/dist/types/server/sessionToolSurface.d.mts.map +1 -1
- package/package.json +14 -14
package/dist/headless.d.cts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { DOOM_HEADLESS_HOST_SERVICE, DOOM_HEADLESS_OWNER, DoomHeadlessActivity, DoomHeadlessClient, DoomHeadlessClientRequest, DoomHeadlessCommand, DoomHeadlessCompactionResult, DoomHeadlessCondition, DoomHeadlessContent, DoomHeadlessEventName, DoomHeadlessExecutionContext, DoomHeadlessHook, DoomHeadlessHookEvent, DoomHeadlessHookResult, DoomHeadlessHostService, DoomHeadlessModelSettings, DoomHeadlessRegistration, DoomHeadlessResource, DoomHeadlessSelection, DoomHeadlessSelectionChange, DoomHeadlessSession, DoomHeadlessTool, DoomHeadlessToolRestriction, DoomHeadlessToolResult, readDoomHeadlessHost, readDoomHeadlessOwner, requireDoomHeadlessHost } from "./schemas/headless.cjs";
|
|
2
|
-
export { DOOM_HEADLESS_HOST_SERVICE, DOOM_HEADLESS_OWNER, DoomHeadlessActivity, DoomHeadlessClient, DoomHeadlessClientRequest, DoomHeadlessCommand, DoomHeadlessCompactionResult, DoomHeadlessCondition, DoomHeadlessContent, DoomHeadlessEventName, DoomHeadlessExecutionContext, DoomHeadlessHook, DoomHeadlessHookEvent, DoomHeadlessHookResult, DoomHeadlessHostService, DoomHeadlessModelSettings, DoomHeadlessRegistration, DoomHeadlessResource, DoomHeadlessSelection, DoomHeadlessSelectionChange, DoomHeadlessSession, DoomHeadlessTool, DoomHeadlessToolRestriction, DoomHeadlessToolResult, readDoomHeadlessHost, readDoomHeadlessOwner, requireDoomHeadlessHost };
|
|
1
|
+
import { DOOM_HEADLESS_HOST_SERVICE, DOOM_HEADLESS_OWNER, DoomHeadlessActivity, DoomHeadlessClient, DoomHeadlessClientRequest, DoomHeadlessCommand, DoomHeadlessCompactionResult, DoomHeadlessCondition, DoomHeadlessContent, DoomHeadlessEventName, DoomHeadlessExecutionContext, DoomHeadlessHook, DoomHeadlessHookEvent, DoomHeadlessHookResult, DoomHeadlessHostService, DoomHeadlessModelSettings, DoomHeadlessRegistration, DoomHeadlessResource, DoomHeadlessSelection, DoomHeadlessSelectionChange, DoomHeadlessSession, DoomHeadlessTool, DoomHeadlessToolRestriction, DoomHeadlessToolResult, DoomMcpSkillAccess, readDoomHeadlessHost, readDoomHeadlessOwner, requireDoomHeadlessHost } from "./schemas/headless.cjs";
|
|
2
|
+
export { DOOM_HEADLESS_HOST_SERVICE, DOOM_HEADLESS_OWNER, DoomHeadlessActivity, DoomHeadlessClient, DoomHeadlessClientRequest, DoomHeadlessCommand, DoomHeadlessCompactionResult, DoomHeadlessCondition, DoomHeadlessContent, DoomHeadlessEventName, DoomHeadlessExecutionContext, DoomHeadlessHook, DoomHeadlessHookEvent, DoomHeadlessHookResult, DoomHeadlessHostService, DoomHeadlessModelSettings, DoomHeadlessRegistration, DoomHeadlessResource, DoomHeadlessSelection, DoomHeadlessSelectionChange, DoomHeadlessSession, DoomHeadlessTool, DoomHeadlessToolRestriction, DoomHeadlessToolResult, DoomMcpSkillAccess, readDoomHeadlessHost, readDoomHeadlessOwner, requireDoomHeadlessHost };
|
package/dist/headless.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { DOOM_HEADLESS_HOST_SERVICE, DOOM_HEADLESS_OWNER, DoomHeadlessActivity, DoomHeadlessClient, DoomHeadlessClientRequest, DoomHeadlessCommand, DoomHeadlessCompactionResult, DoomHeadlessCondition, DoomHeadlessContent, DoomHeadlessEventName, DoomHeadlessExecutionContext, DoomHeadlessHook, DoomHeadlessHookEvent, DoomHeadlessHookResult, DoomHeadlessHostService, DoomHeadlessModelSettings, DoomHeadlessRegistration, DoomHeadlessResource, DoomHeadlessSelection, DoomHeadlessSelectionChange, DoomHeadlessSession, DoomHeadlessTool, DoomHeadlessToolRestriction, DoomHeadlessToolResult, readDoomHeadlessHost, readDoomHeadlessOwner, requireDoomHeadlessHost } from "./schemas/headless.mjs";
|
|
2
|
-
export { DOOM_HEADLESS_HOST_SERVICE, DOOM_HEADLESS_OWNER, DoomHeadlessActivity, DoomHeadlessClient, DoomHeadlessClientRequest, DoomHeadlessCommand, DoomHeadlessCompactionResult, DoomHeadlessCondition, DoomHeadlessContent, DoomHeadlessEventName, DoomHeadlessExecutionContext, DoomHeadlessHook, DoomHeadlessHookEvent, DoomHeadlessHookResult, DoomHeadlessHostService, DoomHeadlessModelSettings, DoomHeadlessRegistration, DoomHeadlessResource, DoomHeadlessSelection, DoomHeadlessSelectionChange, DoomHeadlessSession, DoomHeadlessTool, DoomHeadlessToolRestriction, DoomHeadlessToolResult, readDoomHeadlessHost, readDoomHeadlessOwner, requireDoomHeadlessHost };
|
|
1
|
+
import { DOOM_HEADLESS_HOST_SERVICE, DOOM_HEADLESS_OWNER, DoomHeadlessActivity, DoomHeadlessClient, DoomHeadlessClientRequest, DoomHeadlessCommand, DoomHeadlessCompactionResult, DoomHeadlessCondition, DoomHeadlessContent, DoomHeadlessEventName, DoomHeadlessExecutionContext, DoomHeadlessHook, DoomHeadlessHookEvent, DoomHeadlessHookResult, DoomHeadlessHostService, DoomHeadlessModelSettings, DoomHeadlessRegistration, DoomHeadlessResource, DoomHeadlessSelection, DoomHeadlessSelectionChange, DoomHeadlessSession, DoomHeadlessTool, DoomHeadlessToolRestriction, DoomHeadlessToolResult, DoomMcpSkillAccess, readDoomHeadlessHost, readDoomHeadlessOwner, requireDoomHeadlessHost } from "./schemas/headless.mjs";
|
|
2
|
+
export { DOOM_HEADLESS_HOST_SERVICE, DOOM_HEADLESS_OWNER, DoomHeadlessActivity, DoomHeadlessClient, DoomHeadlessClientRequest, DoomHeadlessCommand, DoomHeadlessCompactionResult, DoomHeadlessCondition, DoomHeadlessContent, DoomHeadlessEventName, DoomHeadlessExecutionContext, DoomHeadlessHook, DoomHeadlessHookEvent, DoomHeadlessHookResult, DoomHeadlessHostService, DoomHeadlessModelSettings, DoomHeadlessRegistration, DoomHeadlessResource, DoomHeadlessSelection, DoomHeadlessSelectionChange, DoomHeadlessSession, DoomHeadlessTool, DoomHeadlessToolRestriction, DoomHeadlessToolResult, DoomMcpSkillAccess, readDoomHeadlessHost, readDoomHeadlessOwner, requireDoomHeadlessHost };
|
package/dist/mcp-facet.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DoomMcpPluginContext, DoomMcpPluginDefinition, DoomMcpServiceScope, DoomMcpSessionPlugin, DoomMcpSkill, defineMcpPlugin, defineMcpSkill, defineMcpTool } from "./schemas/mcpFacet.cjs";
|
|
1
|
+
import { DoomMcpContextSnapshot, DoomMcpPluginContext, DoomMcpPluginDefinition, DoomMcpServiceScope, DoomMcpSessionPlugin, DoomMcpSkill, defineMcpPlugin, defineMcpSkill, defineMcpTool } from "./schemas/mcpFacet.cjs";
|
|
2
2
|
import { DOOM_MCP_BUNDLE_FILE, DOOM_MCP_BUNDLE_VERSION, DoomMcpBundle, DoomMcpBundleEntry, parseDoomMcpBundle } from "./schemas/mcpBundle.cjs";
|
|
3
3
|
import { LoadMcpBundleOptions, LoadedMcpBundle, LoadedMcpPlugin, loadMcpBundle } from "./server/mcpBundleLoader.cjs";
|
|
4
|
-
export { DOOM_MCP_BUNDLE_FILE, DOOM_MCP_BUNDLE_VERSION, type DoomMcpBundle, type DoomMcpBundleEntry, type DoomMcpPluginContext, type DoomMcpPluginDefinition, type DoomMcpServiceScope, type DoomMcpSessionPlugin, type DoomMcpSkill, type LoadMcpBundleOptions, type LoadedMcpBundle, type LoadedMcpPlugin, defineMcpPlugin, defineMcpSkill, defineMcpTool, loadMcpBundle, parseDoomMcpBundle };
|
|
4
|
+
export { DOOM_MCP_BUNDLE_FILE, DOOM_MCP_BUNDLE_VERSION, type DoomMcpBundle, type DoomMcpBundleEntry, type DoomMcpContextSnapshot, type DoomMcpPluginContext, type DoomMcpPluginDefinition, type DoomMcpServiceScope, type DoomMcpSessionPlugin, type DoomMcpSkill, type LoadMcpBundleOptions, type LoadedMcpBundle, type LoadedMcpPlugin, defineMcpPlugin, defineMcpSkill, defineMcpTool, loadMcpBundle, parseDoomMcpBundle };
|
package/dist/mcp-facet.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DoomMcpPluginContext, DoomMcpPluginDefinition, DoomMcpServiceScope, DoomMcpSessionPlugin, DoomMcpSkill, defineMcpPlugin, defineMcpSkill, defineMcpTool } from "./schemas/mcpFacet.mjs";
|
|
1
|
+
import { DoomMcpContextSnapshot, DoomMcpPluginContext, DoomMcpPluginDefinition, DoomMcpServiceScope, DoomMcpSessionPlugin, DoomMcpSkill, defineMcpPlugin, defineMcpSkill, defineMcpTool } from "./schemas/mcpFacet.mjs";
|
|
2
2
|
import { DOOM_MCP_BUNDLE_FILE, DOOM_MCP_BUNDLE_VERSION, DoomMcpBundle, DoomMcpBundleEntry, parseDoomMcpBundle } from "./schemas/mcpBundle.mjs";
|
|
3
3
|
import { LoadMcpBundleOptions, LoadedMcpBundle, LoadedMcpPlugin, loadMcpBundle } from "./server/mcpBundleLoader.mjs";
|
|
4
|
-
export { DOOM_MCP_BUNDLE_FILE, DOOM_MCP_BUNDLE_VERSION, type DoomMcpBundle, type DoomMcpBundleEntry, type DoomMcpPluginContext, type DoomMcpPluginDefinition, type DoomMcpServiceScope, type DoomMcpSessionPlugin, type DoomMcpSkill, type LoadMcpBundleOptions, type LoadedMcpBundle, type LoadedMcpPlugin, defineMcpPlugin, defineMcpSkill, defineMcpTool, loadMcpBundle, parseDoomMcpBundle };
|
|
4
|
+
export { DOOM_MCP_BUNDLE_FILE, DOOM_MCP_BUNDLE_VERSION, type DoomMcpBundle, type DoomMcpBundleEntry, type DoomMcpContextSnapshot, type DoomMcpPluginContext, type DoomMcpPluginDefinition, type DoomMcpServiceScope, type DoomMcpSessionPlugin, type DoomMcpSkill, type LoadMcpBundleOptions, type LoadedMcpBundle, type LoadedMcpPlugin, defineMcpPlugin, defineMcpSkill, defineMcpTool, loadMcpBundle, parseDoomMcpBundle };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-cordis-host.cjs","names":["Context","DOOM_TOOL_OVERRIDES_SERVICE","createDoomToolOverridesService","DOOM_CONTEXT_CONTRIBUTIONS_SERVICE","createDoomContextContributionsService","DOOM_TOOL_SURFACE_SERVICE","createDoomToolSurface"],"sources":["../src/pi/cordisHost.ts"],"sourcesContent":["import { Context, type Fiber } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext, SessionStartEvent } from '@earendil-works/pi-coding-agent';\n\nimport { DOOM_CONTEXT_CONTRIBUTIONS_SERVICE } from '../schemas/contextContributions';\nimport { DOOM_TOOL_OVERRIDES_SERVICE } from '../schemas/toolOverrides';\nimport { DOOM_TOOL_SURFACE_SERVICE } from '../schemas/toolSurface';\nimport { createDoomContextContributionsService } from '../services/contextContributions';\nimport { createDoomToolOverridesService } from '../services/toolOverrides';\nimport { createDoomToolSurface } from '../services/toolSurface';\n\nexport const DOOM_CORDIS_HOST_ABI_VERSION = 1 as const;\nexport const DOOM_CORDIS_HOST_QUERY_CHANNEL = 'doom:cordis:host:v1:query';\nexport const DOOM_CORDIS_RUNTIME_SERVICE = 'doom/runtime';\nexport const DOOM_CORDIS_SESSION_SERVICE = 'doom/session';\nconst HOST_PROTOCOL = 'doom.cordis.host';\nconst DEFAULT_HOST_SOURCE = '@agimon-ai/doompi/cordis-host';\n\nexport type DoomCordisHostMode = 'composed' | 'standalone';\n\nexport interface DoomCordisRuntimeService {\n readonly abiVersion: typeof DOOM_CORDIS_HOST_ABI_VERSION;\n readonly hostId: string;\n readonly generation: string;\n readonly mode: DoomCordisHostMode;\n}\n\nexport interface DoomCordisSessionService {\n readonly sessionId: string;\n readonly generation: string;\n readonly reason: SessionStartEvent['reason'];\n readonly context: ExtensionContext;\n}\n\nexport function requireDoomCordisSession(context: Context): DoomCordisSessionService {\n const session = context.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService | undefined;\n if (!session) throw new Error('Doom Cordis session service is unavailable.');\n return session;\n}\n\nexport interface DoomCordisHostConnection {\n readonly root: Context;\n readonly runtime: DoomCordisRuntimeService;\n /** Releases this consumer's lease. It never disposes a composed host. */\n dispose(): Promise<void>;\n}\n\nexport interface DoomCordisHostController {\n readonly root: Context;\n readonly runtime: DoomCordisRuntimeService;\n /** Recursively disposes the session and application plugin tree. */\n shutdown(): Promise<void>;\n}\n\nexport interface InstallDoomCordisHostOptions {\n readonly mode: DoomCordisHostMode;\n readonly source?: string;\n}\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n 'doom/runtime': DoomCordisRuntimeService;\n 'doom/session': DoomCordisSessionService;\n }\n}\n\ninterface HostQuery {\n readonly protocol: typeof HOST_PROTOCOL;\n readonly abiVersion: typeof DOOM_CORDIS_HOST_ABI_VERSION;\n readonly kind: 'query';\n readonly requestId: string;\n readonly source: string;\n readonly accept: (response: unknown) => void;\n}\n\ninterface HostResponder {\n readonly protocol: typeof HOST_PROTOCOL;\n readonly abiVersion: typeof DOOM_CORDIS_HOST_ABI_VERSION;\n readonly hostId: string;\n readonly root: Context;\n readonly runtime: DoomCordisRuntimeService;\n readonly ready: Promise<void>;\n acquire(): DoomCordisHostConnection;\n shutdown(): Promise<void>;\n}\n\nfunction isRecord(value: unknown): value is Record<PropertyKey, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction asHostQuery(value: unknown): HostQuery | undefined {\n if (!isRecord(value)) return undefined;\n if (\n value.protocol !== HOST_PROTOCOL ||\n value.abiVersion !== DOOM_CORDIS_HOST_ABI_VERSION ||\n value.kind !== 'query' ||\n typeof value.requestId !== 'string' ||\n value.requestId.length === 0 ||\n typeof value.source !== 'string' ||\n value.source.length === 0 ||\n typeof value.accept !== 'function'\n ) {\n return undefined;\n }\n return value as unknown as HostQuery;\n}\n\nfunction asHostResponder(value: unknown): HostResponder {\n if (!isRecord(value)) throw new Error('The Doom Cordis host returned an invalid discovery response.');\n if (value.protocol !== HOST_PROTOCOL) {\n throw new Error('The Doom Cordis host returned an invalid protocol identifier.');\n }\n if (value.abiVersion !== DOOM_CORDIS_HOST_ABI_VERSION) {\n throw new Error(\n `The Doom Cordis host ABI is incompatible: expected ${String(DOOM_CORDIS_HOST_ABI_VERSION)}, received ${String(value.abiVersion)}.`,\n );\n }\n if (typeof value.hostId !== 'string' || value.hostId.length === 0) {\n throw new Error('The Doom Cordis host returned an invalid host identifier.');\n }\n if (!Context.is(value.root)) {\n throw new Error('The Doom Cordis host returned a value that is not a Cordis Context.');\n }\n if (\n !isRecord(value.runtime) ||\n value.runtime.abiVersion !== DOOM_CORDIS_HOST_ABI_VERSION ||\n value.runtime.hostId !== value.hostId ||\n typeof value.acquire !== 'function' ||\n typeof value.shutdown !== 'function' ||\n !isRecord(value.ready) ||\n typeof value.ready.then !== 'function'\n ) {\n throw new Error('The Doom Cordis host returned incomplete runtime metadata.');\n }\n return value as unknown as HostResponder;\n}\n\nfunction discoverHosts(pi: Pick<ExtensionAPI, 'events'>, source: string): HostResponder[] {\n const responses: HostResponder[] = [];\n const request: HostQuery = {\n protocol: HOST_PROTOCOL,\n abiVersion: DOOM_CORDIS_HOST_ABI_VERSION,\n kind: 'query',\n requestId: `${source}:${crypto.randomUUID()}`,\n source,\n accept(response) {\n responses.push(asHostResponder(response));\n },\n };\n pi.events.emit(DOOM_CORDIS_HOST_QUERY_CHANNEL, request);\n return responses;\n}\n\nfunction exactlyOneHost(responses: readonly HostResponder[], source: string): HostResponder | undefined {\n if (responses.length <= 1) return responses[0];\n const hostIds = responses.map(({ hostId }) => hostId).join(', ');\n throw new Error(`Multiple Doom Cordis hosts answered ${source}: ${hostIds}.`);\n}\n\nfunction runtimeProvider(ctx: Context, service: DoomCordisRuntimeService): void {\n ctx.provide(DOOM_CORDIS_RUNTIME_SERVICE, service);\n ctx.provide(DOOM_TOOL_OVERRIDES_SERVICE, createDoomToolOverridesService(service.generation));\n}\n\nfunction sessionProvider(ctx: Context, service: DoomCordisSessionService, pi: ExtensionAPI): void {\n ctx.provide(DOOM_CORDIS_SESSION_SERVICE, service);\n ctx.provide(DOOM_CONTEXT_CONTRIBUTIONS_SERVICE, createDoomContextContributionsService(service.generation));\n ctx.provide(\n DOOM_TOOL_SURFACE_SERVICE,\n createDoomToolSurface({\n generation: service.generation,\n allTools: () => pi.getAllTools().map((tool) => tool.name),\n activeTools: () => pi.getActiveTools(),\n setActiveTools: (names) => pi.setActiveTools(names),\n }),\n );\n}\n\n/**\n * Installs the sole Cordis application root for one Pi extension runner.\n *\n * The versioned EventBus query is intentional: Pi may hand independently\n * loaded factories different ExtensionAPI wrapper objects, while their event\n * buses still address the same runner.\n */\nexport async function installDoomCordisHost(\n pi: ExtensionAPI,\n options: InstallDoomCordisHostOptions,\n): Promise<DoomCordisHostController> {\n const source = options.source ?? DEFAULT_HOST_SOURCE;\n const existing = exactlyOneHost(discoverHosts(pi, source), source);\n if (existing) throw new Error(`A Doom Cordis host is already installed: ${existing.hostId}.`);\n\n // This is the one intentional Context constructor for DoomPi extension code.\n const root = new Context();\n const runtime: DoomCordisRuntimeService = Object.freeze({\n abiVersion: DOOM_CORDIS_HOST_ABI_VERSION,\n hostId: `doom-cordis:${crypto.randomUUID()}`,\n generation: `doom-runtime:${crypto.randomUUID()}`,\n mode: options.mode,\n });\n const runtimeFiber = root.plugin(runtimeProvider, runtime);\n const ready = runtimeFiber.await().then(() => undefined);\n let sessionFiber: Fiber | undefined;\n let sessionGeneration = 0;\n let sessionQueue = Promise.resolve();\n let leaseCount = 0;\n let shutdownPromise: Promise<void> | undefined;\n let responder: HostResponder;\n let disposeQuerySubscription = (): void => undefined;\n\n const controller: DoomCordisHostController = {\n root,\n runtime,\n shutdown() {\n shutdownPromise ??= (async () => {\n disposeQuerySubscription();\n await ready.catch(() => undefined);\n await sessionQueue.catch(() => undefined);\n await sessionFiber?.dispose();\n sessionFiber = undefined;\n await root.fiber.dispose();\n })();\n return shutdownPromise;\n },\n };\n\n responder = {\n protocol: HOST_PROTOCOL,\n abiVersion: DOOM_CORDIS_HOST_ABI_VERSION,\n hostId: runtime.hostId,\n root,\n runtime,\n ready,\n acquire() {\n if (shutdownPromise) throw new Error(`The Doom Cordis host is shutting down: ${runtime.hostId}.`);\n leaseCount += 1;\n let released = false;\n return {\n root,\n runtime,\n async dispose() {\n if (released) return;\n released = true;\n leaseCount -= 1;\n if (options.mode === 'standalone' && leaseCount === 0) await controller.shutdown();\n },\n };\n },\n shutdown: () => controller.shutdown(),\n };\n try {\n disposeQuerySubscription = pi.events.on(DOOM_CORDIS_HOST_QUERY_CHANNEL, (value) => {\n const query = asHostQuery(value);\n if (query) query.accept(responder);\n });\n pi.on('session_start', (event, context) => {\n sessionQueue = sessionQueue\n .catch(() => undefined)\n .then(async () => {\n // Pi owns its listener table and can retain this callback across a\n // replacement. A start delivered after finalization belongs to the\n // stale graph and must not revive or fail the next one.\n if (shutdownPromise) return;\n await sessionFiber?.dispose();\n sessionGeneration += 1;\n const service: DoomCordisSessionService = Object.freeze({\n sessionId: context.sessionManager.getSessionId(),\n generation: `${runtime.generation}:${String(sessionGeneration)}`,\n reason: event.reason,\n context,\n });\n sessionFiber = root.plugin((ctx: Context, value: DoomCordisSessionService) => {\n sessionProvider(ctx, value, pi);\n }, service);\n await sessionFiber.await();\n });\n return sessionQueue;\n });\n if (options.mode === 'standalone') {\n pi.on('session_shutdown', () => {\n disposeQuerySubscription();\n });\n }\n await ready;\n } catch (error) {\n await controller.shutdown();\n throw error;\n }\n return controller;\n}\n\n/** Resolves the composed host installed by the canonical runtime. */\nexport async function connectDoomCordisHost(pi: ExtensionAPI, source: string): Promise<DoomCordisHostConnection> {\n const responder = exactlyOneHost(discoverHosts(pi, source), source);\n if (!responder)\n throw new Error('The composed Doom Cordis host is unavailable. Ensure cordisHost is the first extension.');\n await responder.ready;\n return responder.acquire();\n}\n\n/** Ends the host discovered on this runner. Repeated finalization is a no-op. */\nexport async function finalizeDoomCordisHost(pi: Pick<ExtensionAPI, 'events'>, source: string): Promise<void> {\n const responder = exactlyOneHost(discoverHosts(pi, source), source);\n await responder?.shutdown();\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtime-cordis-host.cjs","names":["Context","DOOM_TOOL_OVERRIDES_SERVICE","createDoomToolOverridesService","DOOM_CONTEXT_CONTRIBUTIONS_SERVICE","createDoomContextContributionsService","DOOM_TOOL_SURFACE_SERVICE","createDoomToolSurface"],"sources":["../src/pi/cordisHost.ts"],"sourcesContent":["import { Context, type Fiber } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext, SessionStartEvent } from '@earendil-works/pi-coding-agent';\n\nimport { DOOM_CONTEXT_CONTRIBUTIONS_SERVICE } from '../schemas/contextContributions';\nimport { DOOM_TOOL_OVERRIDES_SERVICE } from '../schemas/toolOverrides';\nimport { DOOM_TOOL_SURFACE_SERVICE } from '../schemas/toolSurface';\nimport { createDoomContextContributionsService } from '../services/contextContributions';\nimport { createDoomToolOverridesService } from '../services/toolOverrides';\nimport { createDoomToolSurface } from '../services/toolSurface';\n\nexport const DOOM_CORDIS_HOST_ABI_VERSION = 1 as const;\nexport const DOOM_CORDIS_HOST_QUERY_CHANNEL = 'doom:cordis:host:v1:query';\nexport const DOOM_CORDIS_RUNTIME_SERVICE = 'doom/runtime';\nexport const DOOM_CORDIS_SESSION_SERVICE = 'doom/session';\nconst HOST_PROTOCOL = 'doom.cordis.host';\nconst DEFAULT_HOST_SOURCE = '@agimon-ai/doompi/cordis-host';\n\nexport type DoomCordisHostMode = 'composed' | 'standalone';\n\nexport interface DoomCordisRuntimeService {\n readonly abiVersion: typeof DOOM_CORDIS_HOST_ABI_VERSION;\n readonly hostId: string;\n readonly generation: string;\n readonly mode: DoomCordisHostMode;\n}\n\nexport interface DoomCordisSessionService {\n readonly sessionId: string;\n readonly generation: string;\n readonly reason: SessionStartEvent['reason'];\n readonly context: ExtensionContext;\n}\n\nexport function requireDoomCordisSession(context: Context): DoomCordisSessionService {\n const session = context.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService | undefined;\n if (!session) throw new Error('Doom Cordis session service is unavailable.');\n return session;\n}\n\nexport interface DoomCordisHostConnection {\n readonly root: Context;\n readonly runtime: DoomCordisRuntimeService;\n /** Releases this consumer's lease. It never disposes a composed host. */\n dispose(): Promise<void>;\n}\n\nexport interface DoomCordisHostController {\n readonly root: Context;\n readonly runtime: DoomCordisRuntimeService;\n /** Recursively disposes the session and application plugin tree. */\n shutdown(): Promise<void>;\n}\n\nexport interface InstallDoomCordisHostOptions {\n readonly mode: DoomCordisHostMode;\n readonly source?: string;\n}\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n 'doom/runtime': DoomCordisRuntimeService;\n 'doom/session': DoomCordisSessionService;\n }\n}\n\ninterface HostQuery {\n readonly protocol: typeof HOST_PROTOCOL;\n readonly abiVersion: typeof DOOM_CORDIS_HOST_ABI_VERSION;\n readonly kind: 'query';\n readonly requestId: string;\n readonly source: string;\n readonly accept: (response: unknown) => void;\n}\n\ninterface HostResponder {\n readonly protocol: typeof HOST_PROTOCOL;\n readonly abiVersion: typeof DOOM_CORDIS_HOST_ABI_VERSION;\n readonly hostId: string;\n readonly root: Context;\n readonly runtime: DoomCordisRuntimeService;\n readonly ready: Promise<void>;\n acquire(): DoomCordisHostConnection;\n shutdown(): Promise<void>;\n}\n\nfunction isRecord(value: unknown): value is Record<PropertyKey, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction asHostQuery(value: unknown): HostQuery | undefined {\n if (!isRecord(value)) return undefined;\n if (\n value.protocol !== HOST_PROTOCOL ||\n value.abiVersion !== DOOM_CORDIS_HOST_ABI_VERSION ||\n value.kind !== 'query' ||\n typeof value.requestId !== 'string' ||\n value.requestId.length === 0 ||\n typeof value.source !== 'string' ||\n value.source.length === 0 ||\n typeof value.accept !== 'function'\n ) {\n return undefined;\n }\n return value as unknown as HostQuery;\n}\n\nfunction asHostResponder(value: unknown): HostResponder {\n if (!isRecord(value)) throw new Error('The Doom Cordis host returned an invalid discovery response.');\n if (value.protocol !== HOST_PROTOCOL) {\n throw new Error('The Doom Cordis host returned an invalid protocol identifier.');\n }\n if (value.abiVersion !== DOOM_CORDIS_HOST_ABI_VERSION) {\n throw new Error(\n `The Doom Cordis host ABI is incompatible: expected ${String(DOOM_CORDIS_HOST_ABI_VERSION)}, received ${String(value.abiVersion)}.`,\n );\n }\n if (typeof value.hostId !== 'string' || value.hostId.length === 0) {\n throw new Error('The Doom Cordis host returned an invalid host identifier.');\n }\n if (!Context.is(value.root)) {\n throw new Error('The Doom Cordis host returned a value that is not a Cordis Context.');\n }\n if (\n !isRecord(value.runtime) ||\n value.runtime.abiVersion !== DOOM_CORDIS_HOST_ABI_VERSION ||\n value.runtime.hostId !== value.hostId ||\n typeof value.acquire !== 'function' ||\n typeof value.shutdown !== 'function' ||\n !isRecord(value.ready) ||\n typeof value.ready.then !== 'function'\n ) {\n throw new Error('The Doom Cordis host returned incomplete runtime metadata.');\n }\n return value as unknown as HostResponder;\n}\n\nfunction discoverHosts(pi: Pick<ExtensionAPI, 'events'>, source: string): HostResponder[] {\n const responses: HostResponder[] = [];\n const request: HostQuery = {\n protocol: HOST_PROTOCOL,\n abiVersion: DOOM_CORDIS_HOST_ABI_VERSION,\n kind: 'query',\n requestId: `${source}:${crypto.randomUUID()}`,\n source,\n accept(response) {\n responses.push(asHostResponder(response));\n },\n };\n pi.events.emit(DOOM_CORDIS_HOST_QUERY_CHANNEL, request);\n return responses;\n}\n\nfunction exactlyOneHost(responses: readonly HostResponder[], source: string): HostResponder | undefined {\n if (responses.length <= 1) return responses[0];\n const hostIds = responses.map(({ hostId }) => hostId).join(', ');\n throw new Error(`Multiple Doom Cordis hosts answered ${source}: ${hostIds}.`);\n}\n\nfunction runtimeProvider(ctx: Context, service: DoomCordisRuntimeService): void {\n ctx.provide(DOOM_CORDIS_RUNTIME_SERVICE, service);\n ctx.provide(DOOM_TOOL_OVERRIDES_SERVICE, createDoomToolOverridesService(service.generation));\n}\n\nfunction sessionProvider(ctx: Context, service: DoomCordisSessionService, pi: ExtensionAPI): void {\n ctx.provide(DOOM_CORDIS_SESSION_SERVICE, service);\n ctx.provide(DOOM_CONTEXT_CONTRIBUTIONS_SERVICE, createDoomContextContributionsService(service.generation));\n ctx.provide(\n DOOM_TOOL_SURFACE_SERVICE,\n createDoomToolSurface({\n generation: service.generation,\n allTools: () => pi.getAllTools().map((tool) => tool.name),\n activeTools: () => pi.getActiveTools(),\n setActiveTools: (names) => pi.setActiveTools(names),\n }),\n );\n}\n\n/**\n * Installs the sole Cordis application root for one Pi extension runner.\n *\n * The versioned EventBus query is intentional: Pi may hand independently\n * loaded factories different ExtensionAPI wrapper objects, while their event\n * buses still address the same runner.\n */\nexport async function installDoomCordisHost(\n pi: ExtensionAPI,\n options: InstallDoomCordisHostOptions,\n): Promise<DoomCordisHostController> {\n const source = options.source ?? DEFAULT_HOST_SOURCE;\n const existing = exactlyOneHost(discoverHosts(pi, source), source);\n if (existing) throw new Error(`A Doom Cordis host is already installed: ${existing.hostId}.`);\n\n // This is the one intentional Context constructor for DoomPi extension code.\n const root = new Context();\n const runtime: DoomCordisRuntimeService = Object.freeze({\n abiVersion: DOOM_CORDIS_HOST_ABI_VERSION,\n hostId: `doom-cordis:${crypto.randomUUID()}`,\n generation: `doom-runtime:${crypto.randomUUID()}`,\n mode: options.mode,\n });\n const runtimeFiber = root.plugin(runtimeProvider, runtime);\n const ready = runtimeFiber.await().then(() => undefined);\n let sessionFiber: Fiber | undefined;\n let sessionGeneration = 0;\n let sessionQueue = Promise.resolve();\n let leaseCount = 0;\n let shutdownPromise: Promise<void> | undefined;\n let responder: HostResponder;\n let disposeQuerySubscription = (): void => undefined;\n\n const controller: DoomCordisHostController = {\n root,\n runtime,\n shutdown() {\n shutdownPromise ??= (async () => {\n disposeQuerySubscription();\n await ready.catch(() => undefined);\n await sessionQueue.catch(() => undefined);\n await sessionFiber?.dispose();\n sessionFiber = undefined;\n await root.fiber.dispose();\n })();\n return shutdownPromise;\n },\n };\n\n responder = {\n protocol: HOST_PROTOCOL,\n abiVersion: DOOM_CORDIS_HOST_ABI_VERSION,\n hostId: runtime.hostId,\n root,\n runtime,\n ready,\n acquire() {\n if (shutdownPromise) throw new Error(`The Doom Cordis host is shutting down: ${runtime.hostId}.`);\n leaseCount += 1;\n let released = false;\n return {\n root,\n runtime,\n async dispose() {\n if (released) return;\n released = true;\n leaseCount -= 1;\n if (options.mode === 'standalone' && leaseCount === 0) await controller.shutdown();\n },\n };\n },\n shutdown: () => controller.shutdown(),\n };\n try {\n disposeQuerySubscription = pi.events.on(DOOM_CORDIS_HOST_QUERY_CHANNEL, (value) => {\n const query = asHostQuery(value);\n if (query) query.accept(responder);\n });\n pi.on('session_start', (event, context) => {\n sessionQueue = sessionQueue\n .catch(() => undefined)\n .then(async () => {\n // Pi owns its listener table and can retain this callback across a\n // replacement. A start delivered after finalization belongs to the\n // stale graph and must not revive or fail the next one.\n if (shutdownPromise) return;\n await sessionFiber?.dispose();\n sessionGeneration += 1;\n const service: DoomCordisSessionService = Object.freeze({\n sessionId: context.sessionManager.getSessionId(),\n generation: `${runtime.generation}:${String(sessionGeneration)}`,\n reason: event.reason,\n context,\n });\n sessionFiber = root.plugin((ctx: Context, value: DoomCordisSessionService) => {\n sessionProvider(ctx, value, pi);\n }, service);\n await sessionFiber.await();\n });\n return sessionQueue;\n });\n if (options.mode === 'standalone') {\n pi.on('session_shutdown', () => {\n disposeQuerySubscription();\n });\n }\n await ready;\n } catch (error) {\n await controller.shutdown();\n throw error;\n }\n return controller;\n}\n\n/** Resolves the composed host installed by the canonical runtime. */\nexport async function connectDoomCordisHost(\n pi: Pick<ExtensionAPI, 'events'>,\n source: string,\n): Promise<DoomCordisHostConnection> {\n const responder = exactlyOneHost(discoverHosts(pi, source), source);\n if (!responder)\n throw new Error('The composed Doom Cordis host is unavailable. Ensure cordisHost is the first extension.');\n await responder.ready;\n return responder.acquire();\n}\n\n/** Ends the host discovered on this runner. Repeated finalization is a no-op. */\nexport async function finalizeDoomCordisHost(pi: Pick<ExtensionAPI, 'events'>, source: string): Promise<void> {\n const responder = exactlyOneHost(discoverHosts(pi, source), source);\n await responder?.shutdown();\n}\n"],"mappings":"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"}
|
|
@@ -50,7 +50,7 @@ declare module '@deepseek-ai/cordis' {
|
|
|
50
50
|
*/
|
|
51
51
|
export declare function installDoomCordisHost(pi: ExtensionAPI, options: InstallDoomCordisHostOptions): Promise<DoomCordisHostController>;
|
|
52
52
|
/** Resolves the composed host installed by the canonical runtime. */
|
|
53
|
-
export declare function connectDoomCordisHost(pi: ExtensionAPI, source: string): Promise<DoomCordisHostConnection>;
|
|
53
|
+
export declare function connectDoomCordisHost(pi: Pick<ExtensionAPI, 'events'>, source: string): Promise<DoomCordisHostConnection>;
|
|
54
54
|
/** Ends the host discovered on this runner. Repeated finalization is a no-op. */
|
|
55
55
|
export declare function finalizeDoomCordisHost(pi: Pick<ExtensionAPI, 'events'>, source: string): Promise<void>;
|
|
56
56
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-cordis-host.d.cts","names":[],"sources":["../src/pi/cordisHost.ts"],"mappings":";;;qBAUa;qBACA;qBACA;qBACA;YAID;iBAEK;WACN,mBAAmB;WACnB;WACA;WACA,MAAM;;iBAGA;WACN;WACA;WACA,QAAQ;WACR,SAAS;;wBAGJ,yBAAyB,SAAS,UAAU;iBAM3C;WACN,MAAM;WACN,SAAS;;EAElB,WAAW;;iBAGI;WACN,MAAM;WACN,SAAS;;EAElB,YAAY;;iBAGG;WACN,MAAM;WACN;;;YAIC;IACR,gBAAgB;IAChB,gBAAgB;;;;;;;;;;wBA2HE,sBACpB,IAAI,cACJ,SAAS,+BACR,QAAQ;;wBAyGW,
|
|
1
|
+
{"version":3,"file":"runtime-cordis-host.d.cts","names":[],"sources":["../src/pi/cordisHost.ts"],"mappings":";;;qBAUa;qBACA;qBACA;qBACA;YAID;iBAEK;WACN,mBAAmB;WACnB;WACA;WACA,MAAM;;iBAGA;WACN;WACA;WACA,QAAQ;WACR,SAAS;;wBAGJ,yBAAyB,SAAS,UAAU;iBAM3C;WACN,MAAM;WACN,SAAS;;EAElB,WAAW;;iBAGI;WACN,MAAM;WACN,SAAS;;EAElB,YAAY;;iBAGG;WACN,MAAM;WACN;;;YAIC;IACR,gBAAgB;IAChB,gBAAgB;;;;;;;;;;wBA2HE,sBACpB,IAAI,cACJ,SAAS,+BACR,QAAQ;;wBAyGW,sBACpB,IAAI,KAAK,yBACT,iBACC,QAAQ;;wBASW,uBAAuB,IAAI,KAAK,yBAAyB,iBAAiB"}
|
|
@@ -50,7 +50,7 @@ declare module '@deepseek-ai/cordis' {
|
|
|
50
50
|
*/
|
|
51
51
|
export declare function installDoomCordisHost(pi: ExtensionAPI, options: InstallDoomCordisHostOptions): Promise<DoomCordisHostController>;
|
|
52
52
|
/** Resolves the composed host installed by the canonical runtime. */
|
|
53
|
-
export declare function connectDoomCordisHost(pi: ExtensionAPI, source: string): Promise<DoomCordisHostConnection>;
|
|
53
|
+
export declare function connectDoomCordisHost(pi: Pick<ExtensionAPI, 'events'>, source: string): Promise<DoomCordisHostConnection>;
|
|
54
54
|
/** Ends the host discovered on this runner. Repeated finalization is a no-op. */
|
|
55
55
|
export declare function finalizeDoomCordisHost(pi: Pick<ExtensionAPI, 'events'>, source: string): Promise<void>;
|
|
56
56
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-cordis-host.d.mts","names":[],"sources":["../src/pi/cordisHost.ts"],"mappings":";;;qBAUa;qBACA;qBACA;qBACA;YAID;iBAEK;WACN,mBAAmB;WACnB;WACA;WACA,MAAM;;iBAGA;WACN;WACA;WACA,QAAQ;WACR,SAAS;;wBAGJ,yBAAyB,SAAS,UAAU;iBAM3C;WACN,MAAM;WACN,SAAS;;EAElB,WAAW;;iBAGI;WACN,MAAM;WACN,SAAS;;EAElB,YAAY;;iBAGG;WACN,MAAM;WACN;;;YAIC;IACR,gBAAgB;IAChB,gBAAgB;;;;;;;;;;wBA2HE,sBACpB,IAAI,cACJ,SAAS,+BACR,QAAQ;;wBAyGW,
|
|
1
|
+
{"version":3,"file":"runtime-cordis-host.d.mts","names":[],"sources":["../src/pi/cordisHost.ts"],"mappings":";;;qBAUa;qBACA;qBACA;qBACA;YAID;iBAEK;WACN,mBAAmB;WACnB;WACA;WACA,MAAM;;iBAGA;WACN;WACA;WACA,QAAQ;WACR,SAAS;;wBAGJ,yBAAyB,SAAS,UAAU;iBAM3C;WACN,MAAM;WACN,SAAS;;EAElB,WAAW;;iBAGI;WACN,MAAM;WACN,SAAS;;EAElB,YAAY;;iBAGG;WACN,MAAM;WACN;;;YAIC;IACR,gBAAgB;IAChB,gBAAgB;;;;;;;;;;wBA2HE,sBACpB,IAAI,cACJ,SAAS,+BACR,QAAQ;;wBAyGW,sBACpB,IAAI,KAAK,yBACT,iBACC,QAAQ;;wBASW,uBAAuB,IAAI,KAAK,yBAAyB,iBAAiB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-cordis-host.mjs","names":[],"sources":["../src/pi/cordisHost.ts"],"sourcesContent":["import { Context, type Fiber } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext, SessionStartEvent } from '@earendil-works/pi-coding-agent';\n\nimport { DOOM_CONTEXT_CONTRIBUTIONS_SERVICE } from '../schemas/contextContributions';\nimport { DOOM_TOOL_OVERRIDES_SERVICE } from '../schemas/toolOverrides';\nimport { DOOM_TOOL_SURFACE_SERVICE } from '../schemas/toolSurface';\nimport { createDoomContextContributionsService } from '../services/contextContributions';\nimport { createDoomToolOverridesService } from '../services/toolOverrides';\nimport { createDoomToolSurface } from '../services/toolSurface';\n\nexport const DOOM_CORDIS_HOST_ABI_VERSION = 1 as const;\nexport const DOOM_CORDIS_HOST_QUERY_CHANNEL = 'doom:cordis:host:v1:query';\nexport const DOOM_CORDIS_RUNTIME_SERVICE = 'doom/runtime';\nexport const DOOM_CORDIS_SESSION_SERVICE = 'doom/session';\nconst HOST_PROTOCOL = 'doom.cordis.host';\nconst DEFAULT_HOST_SOURCE = '@agimon-ai/doompi/cordis-host';\n\nexport type DoomCordisHostMode = 'composed' | 'standalone';\n\nexport interface DoomCordisRuntimeService {\n readonly abiVersion: typeof DOOM_CORDIS_HOST_ABI_VERSION;\n readonly hostId: string;\n readonly generation: string;\n readonly mode: DoomCordisHostMode;\n}\n\nexport interface DoomCordisSessionService {\n readonly sessionId: string;\n readonly generation: string;\n readonly reason: SessionStartEvent['reason'];\n readonly context: ExtensionContext;\n}\n\nexport function requireDoomCordisSession(context: Context): DoomCordisSessionService {\n const session = context.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService | undefined;\n if (!session) throw new Error('Doom Cordis session service is unavailable.');\n return session;\n}\n\nexport interface DoomCordisHostConnection {\n readonly root: Context;\n readonly runtime: DoomCordisRuntimeService;\n /** Releases this consumer's lease. It never disposes a composed host. */\n dispose(): Promise<void>;\n}\n\nexport interface DoomCordisHostController {\n readonly root: Context;\n readonly runtime: DoomCordisRuntimeService;\n /** Recursively disposes the session and application plugin tree. */\n shutdown(): Promise<void>;\n}\n\nexport interface InstallDoomCordisHostOptions {\n readonly mode: DoomCordisHostMode;\n readonly source?: string;\n}\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n 'doom/runtime': DoomCordisRuntimeService;\n 'doom/session': DoomCordisSessionService;\n }\n}\n\ninterface HostQuery {\n readonly protocol: typeof HOST_PROTOCOL;\n readonly abiVersion: typeof DOOM_CORDIS_HOST_ABI_VERSION;\n readonly kind: 'query';\n readonly requestId: string;\n readonly source: string;\n readonly accept: (response: unknown) => void;\n}\n\ninterface HostResponder {\n readonly protocol: typeof HOST_PROTOCOL;\n readonly abiVersion: typeof DOOM_CORDIS_HOST_ABI_VERSION;\n readonly hostId: string;\n readonly root: Context;\n readonly runtime: DoomCordisRuntimeService;\n readonly ready: Promise<void>;\n acquire(): DoomCordisHostConnection;\n shutdown(): Promise<void>;\n}\n\nfunction isRecord(value: unknown): value is Record<PropertyKey, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction asHostQuery(value: unknown): HostQuery | undefined {\n if (!isRecord(value)) return undefined;\n if (\n value.protocol !== HOST_PROTOCOL ||\n value.abiVersion !== DOOM_CORDIS_HOST_ABI_VERSION ||\n value.kind !== 'query' ||\n typeof value.requestId !== 'string' ||\n value.requestId.length === 0 ||\n typeof value.source !== 'string' ||\n value.source.length === 0 ||\n typeof value.accept !== 'function'\n ) {\n return undefined;\n }\n return value as unknown as HostQuery;\n}\n\nfunction asHostResponder(value: unknown): HostResponder {\n if (!isRecord(value)) throw new Error('The Doom Cordis host returned an invalid discovery response.');\n if (value.protocol !== HOST_PROTOCOL) {\n throw new Error('The Doom Cordis host returned an invalid protocol identifier.');\n }\n if (value.abiVersion !== DOOM_CORDIS_HOST_ABI_VERSION) {\n throw new Error(\n `The Doom Cordis host ABI is incompatible: expected ${String(DOOM_CORDIS_HOST_ABI_VERSION)}, received ${String(value.abiVersion)}.`,\n );\n }\n if (typeof value.hostId !== 'string' || value.hostId.length === 0) {\n throw new Error('The Doom Cordis host returned an invalid host identifier.');\n }\n if (!Context.is(value.root)) {\n throw new Error('The Doom Cordis host returned a value that is not a Cordis Context.');\n }\n if (\n !isRecord(value.runtime) ||\n value.runtime.abiVersion !== DOOM_CORDIS_HOST_ABI_VERSION ||\n value.runtime.hostId !== value.hostId ||\n typeof value.acquire !== 'function' ||\n typeof value.shutdown !== 'function' ||\n !isRecord(value.ready) ||\n typeof value.ready.then !== 'function'\n ) {\n throw new Error('The Doom Cordis host returned incomplete runtime metadata.');\n }\n return value as unknown as HostResponder;\n}\n\nfunction discoverHosts(pi: Pick<ExtensionAPI, 'events'>, source: string): HostResponder[] {\n const responses: HostResponder[] = [];\n const request: HostQuery = {\n protocol: HOST_PROTOCOL,\n abiVersion: DOOM_CORDIS_HOST_ABI_VERSION,\n kind: 'query',\n requestId: `${source}:${crypto.randomUUID()}`,\n source,\n accept(response) {\n responses.push(asHostResponder(response));\n },\n };\n pi.events.emit(DOOM_CORDIS_HOST_QUERY_CHANNEL, request);\n return responses;\n}\n\nfunction exactlyOneHost(responses: readonly HostResponder[], source: string): HostResponder | undefined {\n if (responses.length <= 1) return responses[0];\n const hostIds = responses.map(({ hostId }) => hostId).join(', ');\n throw new Error(`Multiple Doom Cordis hosts answered ${source}: ${hostIds}.`);\n}\n\nfunction runtimeProvider(ctx: Context, service: DoomCordisRuntimeService): void {\n ctx.provide(DOOM_CORDIS_RUNTIME_SERVICE, service);\n ctx.provide(DOOM_TOOL_OVERRIDES_SERVICE, createDoomToolOverridesService(service.generation));\n}\n\nfunction sessionProvider(ctx: Context, service: DoomCordisSessionService, pi: ExtensionAPI): void {\n ctx.provide(DOOM_CORDIS_SESSION_SERVICE, service);\n ctx.provide(DOOM_CONTEXT_CONTRIBUTIONS_SERVICE, createDoomContextContributionsService(service.generation));\n ctx.provide(\n DOOM_TOOL_SURFACE_SERVICE,\n createDoomToolSurface({\n generation: service.generation,\n allTools: () => pi.getAllTools().map((tool) => tool.name),\n activeTools: () => pi.getActiveTools(),\n setActiveTools: (names) => pi.setActiveTools(names),\n }),\n );\n}\n\n/**\n * Installs the sole Cordis application root for one Pi extension runner.\n *\n * The versioned EventBus query is intentional: Pi may hand independently\n * loaded factories different ExtensionAPI wrapper objects, while their event\n * buses still address the same runner.\n */\nexport async function installDoomCordisHost(\n pi: ExtensionAPI,\n options: InstallDoomCordisHostOptions,\n): Promise<DoomCordisHostController> {\n const source = options.source ?? DEFAULT_HOST_SOURCE;\n const existing = exactlyOneHost(discoverHosts(pi, source), source);\n if (existing) throw new Error(`A Doom Cordis host is already installed: ${existing.hostId}.`);\n\n // This is the one intentional Context constructor for DoomPi extension code.\n const root = new Context();\n const runtime: DoomCordisRuntimeService = Object.freeze({\n abiVersion: DOOM_CORDIS_HOST_ABI_VERSION,\n hostId: `doom-cordis:${crypto.randomUUID()}`,\n generation: `doom-runtime:${crypto.randomUUID()}`,\n mode: options.mode,\n });\n const runtimeFiber = root.plugin(runtimeProvider, runtime);\n const ready = runtimeFiber.await().then(() => undefined);\n let sessionFiber: Fiber | undefined;\n let sessionGeneration = 0;\n let sessionQueue = Promise.resolve();\n let leaseCount = 0;\n let shutdownPromise: Promise<void> | undefined;\n let responder: HostResponder;\n let disposeQuerySubscription = (): void => undefined;\n\n const controller: DoomCordisHostController = {\n root,\n runtime,\n shutdown() {\n shutdownPromise ??= (async () => {\n disposeQuerySubscription();\n await ready.catch(() => undefined);\n await sessionQueue.catch(() => undefined);\n await sessionFiber?.dispose();\n sessionFiber = undefined;\n await root.fiber.dispose();\n })();\n return shutdownPromise;\n },\n };\n\n responder = {\n protocol: HOST_PROTOCOL,\n abiVersion: DOOM_CORDIS_HOST_ABI_VERSION,\n hostId: runtime.hostId,\n root,\n runtime,\n ready,\n acquire() {\n if (shutdownPromise) throw new Error(`The Doom Cordis host is shutting down: ${runtime.hostId}.`);\n leaseCount += 1;\n let released = false;\n return {\n root,\n runtime,\n async dispose() {\n if (released) return;\n released = true;\n leaseCount -= 1;\n if (options.mode === 'standalone' && leaseCount === 0) await controller.shutdown();\n },\n };\n },\n shutdown: () => controller.shutdown(),\n };\n try {\n disposeQuerySubscription = pi.events.on(DOOM_CORDIS_HOST_QUERY_CHANNEL, (value) => {\n const query = asHostQuery(value);\n if (query) query.accept(responder);\n });\n pi.on('session_start', (event, context) => {\n sessionQueue = sessionQueue\n .catch(() => undefined)\n .then(async () => {\n // Pi owns its listener table and can retain this callback across a\n // replacement. A start delivered after finalization belongs to the\n // stale graph and must not revive or fail the next one.\n if (shutdownPromise) return;\n await sessionFiber?.dispose();\n sessionGeneration += 1;\n const service: DoomCordisSessionService = Object.freeze({\n sessionId: context.sessionManager.getSessionId(),\n generation: `${runtime.generation}:${String(sessionGeneration)}`,\n reason: event.reason,\n context,\n });\n sessionFiber = root.plugin((ctx: Context, value: DoomCordisSessionService) => {\n sessionProvider(ctx, value, pi);\n }, service);\n await sessionFiber.await();\n });\n return sessionQueue;\n });\n if (options.mode === 'standalone') {\n pi.on('session_shutdown', () => {\n disposeQuerySubscription();\n });\n }\n await ready;\n } catch (error) {\n await controller.shutdown();\n throw error;\n }\n return controller;\n}\n\n/** Resolves the composed host installed by the canonical runtime. */\nexport async function connectDoomCordisHost(pi: ExtensionAPI, source: string): Promise<DoomCordisHostConnection> {\n const responder = exactlyOneHost(discoverHosts(pi, source), source);\n if (!responder)\n throw new Error('The composed Doom Cordis host is unavailable. Ensure cordisHost is the first extension.');\n await responder.ready;\n return responder.acquire();\n}\n\n/** Ends the host discovered on this runner. Repeated finalization is a no-op. */\nexport async function finalizeDoomCordisHost(pi: Pick<ExtensionAPI, 'events'>, source: string): Promise<void> {\n const responder = exactlyOneHost(discoverHosts(pi, source), source);\n await responder?.shutdown();\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtime-cordis-host.mjs","names":[],"sources":["../src/pi/cordisHost.ts"],"sourcesContent":["import { Context, type Fiber } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext, SessionStartEvent } from '@earendil-works/pi-coding-agent';\n\nimport { DOOM_CONTEXT_CONTRIBUTIONS_SERVICE } from '../schemas/contextContributions';\nimport { DOOM_TOOL_OVERRIDES_SERVICE } from '../schemas/toolOverrides';\nimport { DOOM_TOOL_SURFACE_SERVICE } from '../schemas/toolSurface';\nimport { createDoomContextContributionsService } from '../services/contextContributions';\nimport { createDoomToolOverridesService } from '../services/toolOverrides';\nimport { createDoomToolSurface } from '../services/toolSurface';\n\nexport const DOOM_CORDIS_HOST_ABI_VERSION = 1 as const;\nexport const DOOM_CORDIS_HOST_QUERY_CHANNEL = 'doom:cordis:host:v1:query';\nexport const DOOM_CORDIS_RUNTIME_SERVICE = 'doom/runtime';\nexport const DOOM_CORDIS_SESSION_SERVICE = 'doom/session';\nconst HOST_PROTOCOL = 'doom.cordis.host';\nconst DEFAULT_HOST_SOURCE = '@agimon-ai/doompi/cordis-host';\n\nexport type DoomCordisHostMode = 'composed' | 'standalone';\n\nexport interface DoomCordisRuntimeService {\n readonly abiVersion: typeof DOOM_CORDIS_HOST_ABI_VERSION;\n readonly hostId: string;\n readonly generation: string;\n readonly mode: DoomCordisHostMode;\n}\n\nexport interface DoomCordisSessionService {\n readonly sessionId: string;\n readonly generation: string;\n readonly reason: SessionStartEvent['reason'];\n readonly context: ExtensionContext;\n}\n\nexport function requireDoomCordisSession(context: Context): DoomCordisSessionService {\n const session = context.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService | undefined;\n if (!session) throw new Error('Doom Cordis session service is unavailable.');\n return session;\n}\n\nexport interface DoomCordisHostConnection {\n readonly root: Context;\n readonly runtime: DoomCordisRuntimeService;\n /** Releases this consumer's lease. It never disposes a composed host. */\n dispose(): Promise<void>;\n}\n\nexport interface DoomCordisHostController {\n readonly root: Context;\n readonly runtime: DoomCordisRuntimeService;\n /** Recursively disposes the session and application plugin tree. */\n shutdown(): Promise<void>;\n}\n\nexport interface InstallDoomCordisHostOptions {\n readonly mode: DoomCordisHostMode;\n readonly source?: string;\n}\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n 'doom/runtime': DoomCordisRuntimeService;\n 'doom/session': DoomCordisSessionService;\n }\n}\n\ninterface HostQuery {\n readonly protocol: typeof HOST_PROTOCOL;\n readonly abiVersion: typeof DOOM_CORDIS_HOST_ABI_VERSION;\n readonly kind: 'query';\n readonly requestId: string;\n readonly source: string;\n readonly accept: (response: unknown) => void;\n}\n\ninterface HostResponder {\n readonly protocol: typeof HOST_PROTOCOL;\n readonly abiVersion: typeof DOOM_CORDIS_HOST_ABI_VERSION;\n readonly hostId: string;\n readonly root: Context;\n readonly runtime: DoomCordisRuntimeService;\n readonly ready: Promise<void>;\n acquire(): DoomCordisHostConnection;\n shutdown(): Promise<void>;\n}\n\nfunction isRecord(value: unknown): value is Record<PropertyKey, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction asHostQuery(value: unknown): HostQuery | undefined {\n if (!isRecord(value)) return undefined;\n if (\n value.protocol !== HOST_PROTOCOL ||\n value.abiVersion !== DOOM_CORDIS_HOST_ABI_VERSION ||\n value.kind !== 'query' ||\n typeof value.requestId !== 'string' ||\n value.requestId.length === 0 ||\n typeof value.source !== 'string' ||\n value.source.length === 0 ||\n typeof value.accept !== 'function'\n ) {\n return undefined;\n }\n return value as unknown as HostQuery;\n}\n\nfunction asHostResponder(value: unknown): HostResponder {\n if (!isRecord(value)) throw new Error('The Doom Cordis host returned an invalid discovery response.');\n if (value.protocol !== HOST_PROTOCOL) {\n throw new Error('The Doom Cordis host returned an invalid protocol identifier.');\n }\n if (value.abiVersion !== DOOM_CORDIS_HOST_ABI_VERSION) {\n throw new Error(\n `The Doom Cordis host ABI is incompatible: expected ${String(DOOM_CORDIS_HOST_ABI_VERSION)}, received ${String(value.abiVersion)}.`,\n );\n }\n if (typeof value.hostId !== 'string' || value.hostId.length === 0) {\n throw new Error('The Doom Cordis host returned an invalid host identifier.');\n }\n if (!Context.is(value.root)) {\n throw new Error('The Doom Cordis host returned a value that is not a Cordis Context.');\n }\n if (\n !isRecord(value.runtime) ||\n value.runtime.abiVersion !== DOOM_CORDIS_HOST_ABI_VERSION ||\n value.runtime.hostId !== value.hostId ||\n typeof value.acquire !== 'function' ||\n typeof value.shutdown !== 'function' ||\n !isRecord(value.ready) ||\n typeof value.ready.then !== 'function'\n ) {\n throw new Error('The Doom Cordis host returned incomplete runtime metadata.');\n }\n return value as unknown as HostResponder;\n}\n\nfunction discoverHosts(pi: Pick<ExtensionAPI, 'events'>, source: string): HostResponder[] {\n const responses: HostResponder[] = [];\n const request: HostQuery = {\n protocol: HOST_PROTOCOL,\n abiVersion: DOOM_CORDIS_HOST_ABI_VERSION,\n kind: 'query',\n requestId: `${source}:${crypto.randomUUID()}`,\n source,\n accept(response) {\n responses.push(asHostResponder(response));\n },\n };\n pi.events.emit(DOOM_CORDIS_HOST_QUERY_CHANNEL, request);\n return responses;\n}\n\nfunction exactlyOneHost(responses: readonly HostResponder[], source: string): HostResponder | undefined {\n if (responses.length <= 1) return responses[0];\n const hostIds = responses.map(({ hostId }) => hostId).join(', ');\n throw new Error(`Multiple Doom Cordis hosts answered ${source}: ${hostIds}.`);\n}\n\nfunction runtimeProvider(ctx: Context, service: DoomCordisRuntimeService): void {\n ctx.provide(DOOM_CORDIS_RUNTIME_SERVICE, service);\n ctx.provide(DOOM_TOOL_OVERRIDES_SERVICE, createDoomToolOverridesService(service.generation));\n}\n\nfunction sessionProvider(ctx: Context, service: DoomCordisSessionService, pi: ExtensionAPI): void {\n ctx.provide(DOOM_CORDIS_SESSION_SERVICE, service);\n ctx.provide(DOOM_CONTEXT_CONTRIBUTIONS_SERVICE, createDoomContextContributionsService(service.generation));\n ctx.provide(\n DOOM_TOOL_SURFACE_SERVICE,\n createDoomToolSurface({\n generation: service.generation,\n allTools: () => pi.getAllTools().map((tool) => tool.name),\n activeTools: () => pi.getActiveTools(),\n setActiveTools: (names) => pi.setActiveTools(names),\n }),\n );\n}\n\n/**\n * Installs the sole Cordis application root for one Pi extension runner.\n *\n * The versioned EventBus query is intentional: Pi may hand independently\n * loaded factories different ExtensionAPI wrapper objects, while their event\n * buses still address the same runner.\n */\nexport async function installDoomCordisHost(\n pi: ExtensionAPI,\n options: InstallDoomCordisHostOptions,\n): Promise<DoomCordisHostController> {\n const source = options.source ?? DEFAULT_HOST_SOURCE;\n const existing = exactlyOneHost(discoverHosts(pi, source), source);\n if (existing) throw new Error(`A Doom Cordis host is already installed: ${existing.hostId}.`);\n\n // This is the one intentional Context constructor for DoomPi extension code.\n const root = new Context();\n const runtime: DoomCordisRuntimeService = Object.freeze({\n abiVersion: DOOM_CORDIS_HOST_ABI_VERSION,\n hostId: `doom-cordis:${crypto.randomUUID()}`,\n generation: `doom-runtime:${crypto.randomUUID()}`,\n mode: options.mode,\n });\n const runtimeFiber = root.plugin(runtimeProvider, runtime);\n const ready = runtimeFiber.await().then(() => undefined);\n let sessionFiber: Fiber | undefined;\n let sessionGeneration = 0;\n let sessionQueue = Promise.resolve();\n let leaseCount = 0;\n let shutdownPromise: Promise<void> | undefined;\n let responder: HostResponder;\n let disposeQuerySubscription = (): void => undefined;\n\n const controller: DoomCordisHostController = {\n root,\n runtime,\n shutdown() {\n shutdownPromise ??= (async () => {\n disposeQuerySubscription();\n await ready.catch(() => undefined);\n await sessionQueue.catch(() => undefined);\n await sessionFiber?.dispose();\n sessionFiber = undefined;\n await root.fiber.dispose();\n })();\n return shutdownPromise;\n },\n };\n\n responder = {\n protocol: HOST_PROTOCOL,\n abiVersion: DOOM_CORDIS_HOST_ABI_VERSION,\n hostId: runtime.hostId,\n root,\n runtime,\n ready,\n acquire() {\n if (shutdownPromise) throw new Error(`The Doom Cordis host is shutting down: ${runtime.hostId}.`);\n leaseCount += 1;\n let released = false;\n return {\n root,\n runtime,\n async dispose() {\n if (released) return;\n released = true;\n leaseCount -= 1;\n if (options.mode === 'standalone' && leaseCount === 0) await controller.shutdown();\n },\n };\n },\n shutdown: () => controller.shutdown(),\n };\n try {\n disposeQuerySubscription = pi.events.on(DOOM_CORDIS_HOST_QUERY_CHANNEL, (value) => {\n const query = asHostQuery(value);\n if (query) query.accept(responder);\n });\n pi.on('session_start', (event, context) => {\n sessionQueue = sessionQueue\n .catch(() => undefined)\n .then(async () => {\n // Pi owns its listener table and can retain this callback across a\n // replacement. A start delivered after finalization belongs to the\n // stale graph and must not revive or fail the next one.\n if (shutdownPromise) return;\n await sessionFiber?.dispose();\n sessionGeneration += 1;\n const service: DoomCordisSessionService = Object.freeze({\n sessionId: context.sessionManager.getSessionId(),\n generation: `${runtime.generation}:${String(sessionGeneration)}`,\n reason: event.reason,\n context,\n });\n sessionFiber = root.plugin((ctx: Context, value: DoomCordisSessionService) => {\n sessionProvider(ctx, value, pi);\n }, service);\n await sessionFiber.await();\n });\n return sessionQueue;\n });\n if (options.mode === 'standalone') {\n pi.on('session_shutdown', () => {\n disposeQuerySubscription();\n });\n }\n await ready;\n } catch (error) {\n await controller.shutdown();\n throw error;\n }\n return controller;\n}\n\n/** Resolves the composed host installed by the canonical runtime. */\nexport async function connectDoomCordisHost(\n pi: Pick<ExtensionAPI, 'events'>,\n source: string,\n): Promise<DoomCordisHostConnection> {\n const responder = exactlyOneHost(discoverHosts(pi, source), source);\n if (!responder)\n throw new Error('The composed Doom Cordis host is unavailable. Ensure cordisHost is the first extension.');\n await responder.ready;\n return responder.acquire();\n}\n\n/** Ends the host discovered on this runner. Repeated finalization is a no-op. */\nexport async function finalizeDoomCordisHost(pi: Pick<ExtensionAPI, 'events'>, source: string): Promise<void> {\n const responder = exactlyOneHost(discoverHosts(pi, source), source);\n await responder?.shutdown();\n}\n"],"mappings":"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"}
|
|
@@ -176,7 +176,7 @@ function definePiExtension(definition, factory) {
|
|
|
176
176
|
});
|
|
177
177
|
}
|
|
178
178
|
const on = pi.on.bind(pi);
|
|
179
|
-
for (const [event, handler] of Object.entries(contributions.events ?? {})) on(event, handler);
|
|
179
|
+
for (const [event, handler] of Object.entries(contributions.events ?? {})) lifecycle.own(on(event, handler));
|
|
180
180
|
for (const item of contributions.providers ?? []) pi.registerProvider(...item);
|
|
181
181
|
for (const item of contributions.messageRenderers ?? []) pi.registerMessageRenderer(...item);
|
|
182
182
|
for (const item of contributions.entryRenderers ?? []) pi.registerEntryRenderer(...item);
|
|
@@ -216,8 +216,11 @@ function definePiExtension(definition, factory) {
|
|
|
216
216
|
await install(context, pi, options, connection.runtime);
|
|
217
217
|
});
|
|
218
218
|
let completion;
|
|
219
|
+
let unsubscribeShutdown;
|
|
219
220
|
const dispose = () => completion ??= (async () => {
|
|
220
221
|
try {
|
|
222
|
+
unsubscribeShutdown?.();
|
|
223
|
+
unsubscribeShutdown = void 0;
|
|
221
224
|
await fiber.dispose();
|
|
222
225
|
} finally {
|
|
223
226
|
await connection.dispose();
|
|
@@ -225,7 +228,8 @@ function definePiExtension(definition, factory) {
|
|
|
225
228
|
})();
|
|
226
229
|
try {
|
|
227
230
|
await fiber;
|
|
228
|
-
pi.on("session_shutdown", dispose);
|
|
231
|
+
const shutdownRegistration = pi.on("session_shutdown", dispose);
|
|
232
|
+
if (typeof shutdownRegistration === "function") unsubscribeShutdown = shutdownRegistration;
|
|
229
233
|
} catch (error) {
|
|
230
234
|
try {
|
|
231
235
|
await dispose();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-pi-extension.cjs","names":["createPluginLifecycle","DOOM_HELP_SERVICE","requireDoomHelpService","DOOM_TOOL_SURFACE_SERVICE","requireDoomToolSurface","DOOM_TOOL_OVERRIDES_SERVICE","requireDoomToolOverrides","connectDoomCordisHost"],"sources":["../src/extensions/piExtension.ts"],"sourcesContent":["import type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ToolDefinition } from '@earendil-works/pi-coding-agent';\nimport type { TSchema } from 'typebox';\n\nimport { connectDoomCordisHost, type DoomCordisRuntimeService } from '../pi/cordisHost';\nimport { DOOM_HELP_SERVICE, requireDoomHelpService, type DoomHelpService } from '../schemas/help';\nimport type { PiToolDeclaration } from '../schemas/piTool';\nimport type { DoomPluginTool, DoomPluginCommand } from '../schemas/pluginContributions';\nimport {\n DOOM_TOOL_OVERRIDES_SERVICE,\n requireDoomToolOverrides,\n type DoomToolOverrideClaim,\n} from '../schemas/toolOverrides';\nimport type { DoomToolRestrictionDefinition } from '../schemas/toolSurface';\nimport { DOOM_TOOL_SURFACE_SERVICE, requireDoomToolSurface } from '../schemas/toolSurface';\nimport { createPluginLifecycle, type PluginLifecycleHooks } from '../services/pluginLifecycle';\n\n/** Extract native overloads without copying Pi event payload or result contracts. */\ntype NativeEventOverloads = ExtensionAPI['on'] extends {\n (event: infer E1 extends string, handler: infer H1): void;\n (event: infer E2 extends string, handler: infer H2): void;\n (event: infer E3 extends string, handler: infer H3): void;\n (event: infer E4 extends string, handler: infer H4): void;\n (event: infer E5 extends string, handler: infer H5): void;\n (event: infer E6 extends string, handler: infer H6): void;\n (event: infer E7 extends string, handler: infer H7): void;\n (event: infer E8 extends string, handler: infer H8): void;\n (event: infer E9 extends string, handler: infer H9): void;\n (event: infer E10 extends string, handler: infer H10): void;\n (event: infer E11 extends string, handler: infer H11): void;\n (event: infer E12 extends string, handler: infer H12): void;\n (event: infer E13 extends string, handler: infer H13): void;\n (event: infer E14 extends string, handler: infer H14): void;\n (event: infer E15 extends string, handler: infer H15): void;\n (event: infer E16 extends string, handler: infer H16): void;\n (event: infer E17 extends string, handler: infer H17): void;\n (event: infer E18 extends string, handler: infer H18): void;\n (event: infer E19 extends string, handler: infer H19): void;\n (event: infer E20 extends string, handler: infer H20): void;\n (event: infer E21 extends string, handler: infer H21): void;\n (event: infer E22 extends string, handler: infer H22): void;\n (event: infer E23 extends string, handler: infer H23): void;\n (event: infer E24 extends string, handler: infer H24): void;\n (event: infer E25 extends string, handler: infer H25): void;\n (event: infer E26 extends string, handler: infer H26): void;\n (event: infer E27 extends string, handler: infer H27): void;\n (event: infer E28 extends string, handler: infer H28): void;\n (event: infer E29 extends string, handler: infer H29): void;\n (event: infer E30 extends string, handler: infer H30): void;\n (event: infer E31 extends string, handler: infer H31): void;\n (event: infer E32 extends string, handler: infer H32): void;\n (event: infer E33 extends string, handler: infer H33): void;\n (event: infer E34 extends string, handler: infer H34): void;\n (event: infer E35 extends string, handler: infer H35): void;\n (event: infer E36 extends string, handler: infer H36): void;\n (event: infer E37 extends string, handler: infer H37): void;\n (event: infer E38 extends string, handler: infer H38): void;\n (event: infer E39 extends string, handler: infer H39): void;\n (event: infer E40 extends string, handler: infer H40): void;\n}\n ?\n | [E1, H1]\n | [E2, H2]\n | [E3, H3]\n | [E4, H4]\n | [E5, H5]\n | [E6, H6]\n | [E7, H7]\n | [E8, H8]\n | [E9, H9]\n | [E10, H10]\n | [E11, H11]\n | [E12, H12]\n | [E13, H13]\n | [E14, H14]\n | [E15, H15]\n | [E16, H16]\n | [E17, H17]\n | [E18, H18]\n | [E19, H19]\n | [E20, H20]\n | [E21, H21]\n | [E22, H22]\n | [E23, H23]\n | [E24, H24]\n | [E25, H25]\n | [E26, H26]\n | [E27, H27]\n | [E28, H28]\n | [E29, H29]\n | [E30, H30]\n | [E31, H31]\n | [E32, H32]\n | [E33, H33]\n | [E34, H34]\n | [E35, H35]\n | [E36, H36]\n | [E37, H37]\n | [E38, H38]\n | [E39, H39]\n | [E40, H40]\n : never;\n\nexport type PiEventHandlers = {\n readonly [Pair in NativeEventOverloads as Pair[0]]?: Pair[1];\n};\n\nexport interface PiPluginContext<TOptions = undefined> {\n readonly context: Context;\n readonly pi: ExtensionAPI;\n readonly options: TOptions | undefined;\n readonly runtime: DoomCordisRuntimeService | undefined;\n readonly signal: AbortSignal;\n}\n\nexport type PiToolRestriction = DoomToolRestrictionDefinition;\n\nexport interface PiPluginTool extends DoomPluginTool {\n readonly pi?: Pick<Parameters<ExtensionAPI['registerTool']>[0], 'renderShell' | 'renderCall' | 'renderResult'>;\n}\n\nexport interface PiToolOverride extends DoomToolOverrideClaim {\n /** Contributions registered only while this provider owns the override. */\n readonly tools: readonly string[];\n readonly replacements: readonly (PiToolDeclaration | Parameters<ExtensionAPI['registerTool']>[0])[];\n}\n\nexport type PiToolContribution = PiPluginTool | PiToolDeclaration | Parameters<ExtensionAPI['registerTool']>[0];\n\n/** Snapshots reuse immutable declarations. A registered name cannot adopt a different declaration until remount. */\nexport interface PiToolCollection {\n snapshot(): readonly PiToolContribution[];\n subscribe(listener: () => void): () => void;\n}\n\nexport interface PiPluginContributions<TOptions = undefined> extends PluginLifecycleHooks<PiPluginContext<TOptions>> {\n readonly services?: readonly Parameters<Context['plugin']>[0][];\n readonly tools?: readonly PiToolContribution[] | PiToolCollection;\n readonly commands?: readonly (DoomPluginCommand | readonly [...Parameters<ExtensionAPI['registerCommand']>])[];\n readonly events?: PiEventHandlers;\n readonly resources?: readonly Parameters<DoomHelpService['register']>[0][];\n readonly toolRestrictions?: readonly PiToolRestriction[];\n readonly toolOverrides?: readonly PiToolOverride[];\n readonly providers?: readonly (readonly [...Parameters<ExtensionAPI['registerProvider']>])[];\n readonly messageRenderers?: readonly (readonly [...Parameters<ExtensionAPI['registerMessageRenderer']>])[];\n readonly entryRenderers?: readonly (readonly [...Parameters<ExtensionAPI['registerEntryRenderer']>])[];\n readonly markdownTransformers?: readonly Parameters<ExtensionAPI['registerMarkdownTransformer']>[0][];\n readonly shortcuts?: readonly (readonly [...Parameters<ExtensionAPI['registerShortcut']>])[];\n readonly flags?: readonly (readonly [...Parameters<ExtensionAPI['registerFlag']>])[];\n}\n\nexport interface PiExtensionDefinition<TOptions = undefined> extends PiPluginContributions<TOptions> {\n readonly name: string;\n}\n\nexport interface DefinedPiExtension<TOptions = undefined> {\n (pi: ExtensionAPI, options?: TOptions): Promise<void>;\n install(\n this: void,\n context: Context,\n pi: ExtensionAPI,\n options?: TOptions,\n runtime?: DoomCordisRuntimeService,\n ): Promise<void>;\n}\n\nexport function definePiExtension<TOptions = undefined>(\n definition: PiExtensionDefinition<TOptions>,\n): DefinedPiExtension<TOptions>;\nexport function definePiExtension<TOptions = undefined>(\n name: string,\n factory: (\n context: PiPluginContext<TOptions>,\n ) => PiPluginContributions<TOptions> | Promise<PiPluginContributions<TOptions>>,\n): DefinedPiExtension<TOptions>;\nexport function definePiExtension<TOptions = undefined>(\n definition: string | PiExtensionDefinition<TOptions>,\n factory?: (\n context: PiPluginContext<TOptions>,\n ) => PiPluginContributions<TOptions> | Promise<PiPluginContributions<TOptions>>,\n): DefinedPiExtension<TOptions> {\n const name = typeof definition === 'string' ? definition : definition.name;\n const install = async (\n context: Context,\n pi: ExtensionAPI,\n options?: TOptions,\n runtime?: DoomCordisRuntimeService,\n ): Promise<void> => {\n const lifecycle = createPluginLifecycle((signal): PiPluginContext<TOptions> => ({\n context,\n pi,\n options,\n runtime,\n signal,\n }));\n context.effect(() => () => lifecycle.dispose(), `${name}/lifecycle`);\n const tool = (item: PiToolContribution, executionSignal?: () => AbortSignal): void => {\n if ('kind' in item && item.kind === 'pi-tool') {\n item.register(pi, executionSignal);\n return;\n }\n if (!('kind' in item)) {\n if (!executionSignal) {\n pi.registerTool(item);\n return;\n }\n pi.registerTool({\n ...item,\n async execute(toolCallId, input, signal, update, context) {\n const current = executionSignal();\n current.throwIfAborted();\n return item.execute(\n toolCallId,\n input,\n signal ? AbortSignal.any([signal, current]) : current,\n update,\n context,\n );\n },\n });\n return;\n }\n pi.registerTool({\n ...item.pi,\n name: item.name,\n label: item.label ?? item.name,\n description: item.description,\n parameters: item.parameters,\n promptSnippet: item.promptSnippet,\n promptGuidelines: item.promptGuidelines ? [...item.promptGuidelines] : undefined,\n executionMode: item.executionMode === 'serial' ? 'sequential' : item.executionMode,\n async execute(toolCallId, input, signal, update, execution) {\n const current = executionSignal?.() ?? lifecycle.context.signal;\n current.throwIfAborted();\n const result = await item.execute(input, {\n toolCallId,\n cwd: execution.cwd,\n signal: signal ? AbortSignal.any([signal, current]) : current,\n update: (result) => update?.({ ...result, details: result.details }),\n notify: (request) => {\n if (execution.hasUI) execution.ui.notify(request.body, request.level ?? 'info');\n },\n });\n return { ...result, details: result.details };\n },\n });\n };\n await lifecycle.mount(\n () => (typeof definition === 'string' ? factory!(lifecycle.context) : definition),\n async (contributions) => {\n for (const service of contributions.services ?? []) {\n const fiber = context.plugin(service);\n lifecycle.own(() => fiber.dispose());\n await fiber;\n }\n const tools = contributions.tools;\n if (tools && 'snapshot' in tools) {\n const registered = new Map<string, { readonly declaration: PiToolContribution; active?: AbortController }>();\n let disposed = false;\n let subscribing = true;\n let reconciling = false;\n let pending = false;\n const deactivate = (): void => {\n for (const entry of registered.values()) {\n entry.active?.abort();\n entry.active = undefined;\n }\n };\n lifecycle.own(() => {\n disposed = true;\n deactivate();\n });\n const reconcile = (): void => {\n pending = true;\n if (disposed || lifecycle.context.signal.aborted) {\n deactivate();\n return;\n }\n if (reconciling || subscribing) return;\n reconciling = true;\n try {\n do {\n pending = false;\n const snapshot = tools.snapshot();\n const names = new Map<string, PiToolContribution>();\n for (const declaration of snapshot) {\n if (names.has(declaration.name)) throw new Error(`Duplicate live tool name: ${declaration.name}`);\n names.set(declaration.name, declaration);\n }\n for (const [name, entry] of registered) {\n if (names.get(name) !== entry.declaration) {\n entry.active?.abort();\n entry.active = undefined;\n }\n }\n for (const declaration of snapshot) {\n let entry = registered.get(declaration.name);\n if (entry && entry.declaration !== declaration) entry = undefined;\n if (entry) {\n entry.active ??= new AbortController();\n continue;\n }\n entry = { declaration, active: new AbortController() };\n const current = entry;\n registered.set(declaration.name, entry);\n try {\n tool(declaration, () => {\n lifecycle.context.signal.throwIfAborted();\n if (!current.active || disposed)\n throw new Error(`Tool ${declaration.name} is unavailable in this plugin generation.`);\n return AbortSignal.any([lifecycle.context.signal, current.active.signal]);\n });\n } catch (error) {\n registered.delete(declaration.name);\n throw error;\n }\n }\n } while (pending && !disposed);\n } catch (error) {\n deactivate();\n throw error;\n } finally {\n reconciling = false;\n }\n };\n const unsubscribe = tools.subscribe(() => {\n try {\n reconcile();\n } catch {\n /* An invalid update leaves registered tools unavailable. */\n }\n });\n lifecycle.own(() => {\n disposed = true;\n deactivate();\n unsubscribe();\n });\n subscribing = false;\n reconcile();\n } else {\n for (const item of tools ?? []) tool(item);\n }\n for (const item of contributions.commands ?? []) {\n if (!('kind' in item)) {\n pi.registerCommand(...item);\n continue;\n }\n pi.registerCommand(item.name, {\n description: item.description,\n async handler(args, execution) {\n lifecycle.context.signal.throwIfAborted();\n await item.execute(args, {\n cwd: execution.cwd,\n signal: lifecycle.context.signal,\n notify: (request) => {\n if (execution.hasUI) execution.ui.notify(request.body, request.level ?? 'info');\n },\n });\n },\n });\n }\n // The public mapped handlers retain each native event's input and return type.\n const on = pi.on.bind(pi) as (event: string, handler: unknown) => void;\n for (const [event, handler] of Object.entries(contributions.events ?? {})) on(event, handler);\n for (const item of contributions.providers ?? []) pi.registerProvider(...item);\n for (const item of contributions.messageRenderers ?? []) pi.registerMessageRenderer(...item);\n for (const item of contributions.entryRenderers ?? []) pi.registerEntryRenderer(...item);\n for (const item of contributions.markdownTransformers ?? []) pi.registerMarkdownTransformer(item);\n for (const item of contributions.shortcuts ?? []) pi.registerShortcut(...item);\n for (const item of contributions.flags ?? []) pi.registerFlag(...item);\n const bind = (service: string, register: (child: Context) => void): void => {\n const fiber = context.inject([service], register);\n lifecycle.own(() => fiber.dispose());\n };\n if (contributions.resources?.length)\n bind(DOOM_HELP_SERVICE, (child) => {\n for (const resource of contributions.resources!) {\n const handle = requireDoomHelpService(child).register(resource);\n child.effect(() => () => handle.dispose());\n }\n });\n if (contributions.toolRestrictions?.length)\n bind(DOOM_TOOL_SURFACE_SERVICE, (child) => {\n for (const restriction of contributions.toolRestrictions!) {\n const handle = requireDoomToolSurface(child).register(restriction);\n child.effect(() => () => handle.dispose());\n const unsubscribe = restriction.subscribe?.(() => handle.update(restriction.restrict));\n if (unsubscribe) child.effect(() => unsubscribe);\n }\n });\n if (contributions.toolOverrides?.length)\n bind(DOOM_TOOL_OVERRIDES_SERVICE, (child) => {\n for (const override of contributions.toolOverrides!) {\n const handle = requireDoomToolOverrides(child).claim(override);\n child.effect(() => () => handle.dispose());\n if (handle.granted) for (const replacement of override.replacements) tool(replacement);\n }\n });\n },\n );\n };\n const activate = async (pi: ExtensionAPI, options?: TOptions): Promise<void> => {\n const connection = await connectDoomCordisHost(pi, name);\n const fiber = connection.root.plugin(async (context) => {\n await install(context, pi, options, connection.runtime);\n });\n let completion: Promise<void> | undefined;\n const dispose = (): Promise<void> =>\n (completion ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })());\n try {\n await fiber;\n pi.on('session_shutdown', dispose);\n } catch (error) {\n try {\n await dispose();\n } catch (cleanupError) {\n throw new AggregateError([error, cleanupError], `${name} startup and cleanup failed.`);\n }\n throw error;\n }\n };\n return Object.assign(activate, { install });\n}\n\n/**\n * What a CLI tool's presentation file supplies.\n *\n * The terminal is a frontend. `renderCall` and `renderResult` draw a tool call\n * into the TUI exactly as a cockpit tool renderer draws it into the browser,\n * so they are authored on the frontend side under a `.cli` platform suffix and\n * never alongside the tool's `execute`.\n */\nexport type PiToolRenderers<TParameters extends TSchema = TSchema, TDetails = unknown, TState = unknown> = Pick<\n ToolDefinition<TParameters, TDetails, TState>,\n 'renderShell' | 'renderCall' | 'renderResult'\n>;\n\n/** A terminal renderer declaration or a factory resolved from its session mount. */\nexport type PiToolRendererFile<\n TContext = unknown,\n TParameters extends TSchema = TSchema,\n TDetails = unknown,\n TState = unknown,\n> =\n | PiToolRenderers<TParameters, TDetails, TState>\n | ((context: TContext) => PiToolRenderers<TParameters, TDetails, TState>);\n/**\n * `(frontend)/tool/<name>.cli.tsx`. The filename names the tool these draw.\n *\n * Generic over the tool's schema, because a renderer reads the call it is\n * drawing: state the parameter type and `renderResult` sees the real arguments\n * instead of `unknown`, which is what the single-file version got for free.\n */\nexport function definePiToolRenderer<TParameters extends TSchema = TSchema, TDetails = unknown, TState = unknown>(\n file: PiToolRenderers<TParameters, TDetails, TState>,\n): PiToolRenderers<TParameters, TDetails, TState> {\n return file;\n}\n\n/** `(frontend)/tool/<name>.cli.tsx` when the renderer needs mount context. */\nexport function defineCliToolRenderer<\n TContext,\n TParameters extends TSchema = TSchema,\n TDetails = unknown,\n TState = unknown,\n>(\n file: PiToolRendererFile<TContext, TParameters, TDetails, TState>,\n): PiToolRendererFile<TContext, TParameters, TDetails, TState> {\n return file;\n}\n\n/**\n * `(frontend)/message/<name>.cli.tsx`. A renderer for one custom message type.\n *\n * The type is stated rather than derived from the filename, because it is a\n * protocol constant shared with whatever emits the message. A path-derived\n * name would silently stop matching the moment either side was renamed.\n */\nexport function defineMessageRenderer(\n messageType: Parameters<ExtensionAPI['registerMessageRenderer']>[0],\n render: Parameters<ExtensionAPI['registerMessageRenderer']>[1],\n): readonly [...Parameters<ExtensionAPI['registerMessageRenderer']>] {\n return [messageType, render];\n}\n\n/**\n * Attaches a presentation file's renderers to the tool its filename names.\n *\n * Three tool shapes reach a contribution array and each carries renderers in a\n * different place, so a generated entry cannot spell this merge itself. A\n * native Pi definition takes them at the top level, the portable shape nests\n * them under `pi`, and `definePiTool` owns its own registration, so that one\n * is reached by narrowing the host it registers against. `register` asks for\n * nothing but `registerTool`, which is what makes the last case a two-line\n * shim rather than a proxy over the whole extension API.\n */\nexport function withPiRenderers(tool: PiToolContribution, renderers: PiToolRenderers): PiToolContribution {\n if (!('kind' in tool)) return { ...tool, ...renderers };\n if (tool.kind !== 'pi-tool') return { ...tool, pi: { ...tool.pi, ...renderers } };\n return {\n ...tool,\n register(pi, executionSignal) {\n tool.register(\n { registerTool: (definition) => pi.registerTool({ ...definition, ...renderers }) },\n executionSignal,\n );\n },\n };\n}\n\n/**\n * Splits routed tool files into the two arrays the Pi host keeps apart.\n *\n * A tool that replaces a name Pi already ships is not a second registration,\n * it is a claim the override service arbitrates, and only the winner\n * registers. The folder convention keeps both in `tool/`, because from the\n * author's side both are \"this package provides grep\"; which one it is lives\n * in the value, through `definePiTool(definition, { overrides: true })`.\n *\n * A generated entry therefore cannot decide this from the path, and calls\n * this instead. Every static claim from one package is one atomic set, which\n * is what the override service expects. A live collection stays intact so its\n * subscription continues to drive registration changes.\n */\nexport function piToolContributions(\n source: string,\n items: readonly PiToolContribution[] | PiToolCollection,\n): Pick<PiPluginContributions, 'tools' | 'toolOverrides'> {\n if (!Array.isArray(items)) return { tools: items as PiToolCollection };\n const added: PiToolContribution[] = [];\n const claimed: PiToolDeclaration[] = [];\n for (const item of items) {\n // Only a native declaration may claim a name: a replacement is handed to\n // Pi's registry directly, which the portable shape is not.\n if ('kind' in item && item.kind === 'pi-tool' && item.overrides === true) claimed.push(item);\n else added.push(item);\n }\n if (claimed.length === 0) return { tools: added };\n return {\n tools: added,\n toolOverrides: [{ source, tools: claimed.map((item) => item.name), replacements: claimed }],\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtime-pi-extension.cjs","names":["createPluginLifecycle","DOOM_HELP_SERVICE","requireDoomHelpService","DOOM_TOOL_SURFACE_SERVICE","requireDoomToolSurface","DOOM_TOOL_OVERRIDES_SERVICE","requireDoomToolOverrides","connectDoomCordisHost"],"sources":["../src/extensions/piExtension.ts"],"sourcesContent":["import type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ToolDefinition } from '@earendil-works/pi-coding-agent';\nimport type { TSchema } from 'typebox';\n\nimport { connectDoomCordisHost, type DoomCordisRuntimeService } from '../pi/cordisHost';\nimport { DOOM_HELP_SERVICE, requireDoomHelpService, type DoomHelpService } from '../schemas/help';\nimport type { PiToolDeclaration } from '../schemas/piTool';\nimport type { DoomPluginTool, DoomPluginCommand } from '../schemas/pluginContributions';\nimport {\n DOOM_TOOL_OVERRIDES_SERVICE,\n requireDoomToolOverrides,\n type DoomToolOverrideClaim,\n} from '../schemas/toolOverrides';\nimport type { DoomToolRestrictionDefinition } from '../schemas/toolSurface';\nimport { DOOM_TOOL_SURFACE_SERVICE, requireDoomToolSurface } from '../schemas/toolSurface';\nimport { createPluginLifecycle, type PluginLifecycleHooks } from '../services/pluginLifecycle';\n\n/** Extract native overloads without copying Pi event payload or result contracts. */\ntype NativeEventOverloads = ExtensionAPI['on'] extends {\n (event: infer E1 extends string, handler: infer H1): void;\n (event: infer E2 extends string, handler: infer H2): void;\n (event: infer E3 extends string, handler: infer H3): void;\n (event: infer E4 extends string, handler: infer H4): void;\n (event: infer E5 extends string, handler: infer H5): void;\n (event: infer E6 extends string, handler: infer H6): void;\n (event: infer E7 extends string, handler: infer H7): void;\n (event: infer E8 extends string, handler: infer H8): void;\n (event: infer E9 extends string, handler: infer H9): void;\n (event: infer E10 extends string, handler: infer H10): void;\n (event: infer E11 extends string, handler: infer H11): void;\n (event: infer E12 extends string, handler: infer H12): void;\n (event: infer E13 extends string, handler: infer H13): void;\n (event: infer E14 extends string, handler: infer H14): void;\n (event: infer E15 extends string, handler: infer H15): void;\n (event: infer E16 extends string, handler: infer H16): void;\n (event: infer E17 extends string, handler: infer H17): void;\n (event: infer E18 extends string, handler: infer H18): void;\n (event: infer E19 extends string, handler: infer H19): void;\n (event: infer E20 extends string, handler: infer H20): void;\n (event: infer E21 extends string, handler: infer H21): void;\n (event: infer E22 extends string, handler: infer H22): void;\n (event: infer E23 extends string, handler: infer H23): void;\n (event: infer E24 extends string, handler: infer H24): void;\n (event: infer E25 extends string, handler: infer H25): void;\n (event: infer E26 extends string, handler: infer H26): void;\n (event: infer E27 extends string, handler: infer H27): void;\n (event: infer E28 extends string, handler: infer H28): void;\n (event: infer E29 extends string, handler: infer H29): void;\n (event: infer E30 extends string, handler: infer H30): void;\n (event: infer E31 extends string, handler: infer H31): void;\n (event: infer E32 extends string, handler: infer H32): void;\n (event: infer E33 extends string, handler: infer H33): void;\n (event: infer E34 extends string, handler: infer H34): void;\n (event: infer E35 extends string, handler: infer H35): void;\n (event: infer E36 extends string, handler: infer H36): void;\n (event: infer E37 extends string, handler: infer H37): void;\n (event: infer E38 extends string, handler: infer H38): void;\n (event: infer E39 extends string, handler: infer H39): void;\n (event: infer E40 extends string, handler: infer H40): void;\n}\n ?\n | [E1, H1]\n | [E2, H2]\n | [E3, H3]\n | [E4, H4]\n | [E5, H5]\n | [E6, H6]\n | [E7, H7]\n | [E8, H8]\n | [E9, H9]\n | [E10, H10]\n | [E11, H11]\n | [E12, H12]\n | [E13, H13]\n | [E14, H14]\n | [E15, H15]\n | [E16, H16]\n | [E17, H17]\n | [E18, H18]\n | [E19, H19]\n | [E20, H20]\n | [E21, H21]\n | [E22, H22]\n | [E23, H23]\n | [E24, H24]\n | [E25, H25]\n | [E26, H26]\n | [E27, H27]\n | [E28, H28]\n | [E29, H29]\n | [E30, H30]\n | [E31, H31]\n | [E32, H32]\n | [E33, H33]\n | [E34, H34]\n | [E35, H35]\n | [E36, H36]\n | [E37, H37]\n | [E38, H38]\n | [E39, H39]\n | [E40, H40]\n : never;\n\nexport type PiEventHandlers = {\n readonly [Pair in NativeEventOverloads as Pair[0]]?: Pair[1];\n};\n\nexport interface PiPluginContext<TOptions = undefined> {\n readonly context: Context;\n readonly pi: ExtensionAPI;\n readonly options: TOptions | undefined;\n readonly runtime: DoomCordisRuntimeService | undefined;\n readonly signal: AbortSignal;\n}\n\nexport type PiToolRestriction = DoomToolRestrictionDefinition;\n\nexport interface PiPluginTool extends DoomPluginTool {\n readonly pi?: Pick<Parameters<ExtensionAPI['registerTool']>[0], 'renderShell' | 'renderCall' | 'renderResult'>;\n}\n\nexport interface PiToolOverride extends DoomToolOverrideClaim {\n /** Contributions registered only while this provider owns the override. */\n readonly tools: readonly string[];\n readonly replacements: readonly (PiToolDeclaration | Parameters<ExtensionAPI['registerTool']>[0])[];\n}\n\nexport type PiToolContribution = PiPluginTool | PiToolDeclaration | Parameters<ExtensionAPI['registerTool']>[0];\n\n/** Snapshots reuse immutable declarations. A registered name cannot adopt a different declaration until remount. */\nexport interface PiToolCollection {\n snapshot(): readonly PiToolContribution[];\n subscribe(listener: () => void): () => void;\n}\n\nexport interface PiPluginContributions<TOptions = undefined> extends PluginLifecycleHooks<PiPluginContext<TOptions>> {\n readonly services?: readonly Parameters<Context['plugin']>[0][];\n readonly tools?: readonly PiToolContribution[] | PiToolCollection;\n readonly commands?: readonly (DoomPluginCommand | readonly [...Parameters<ExtensionAPI['registerCommand']>])[];\n readonly events?: PiEventHandlers;\n readonly resources?: readonly Parameters<DoomHelpService['register']>[0][];\n readonly toolRestrictions?: readonly PiToolRestriction[];\n readonly toolOverrides?: readonly PiToolOverride[];\n readonly providers?: readonly (readonly [...Parameters<ExtensionAPI['registerProvider']>])[];\n readonly messageRenderers?: readonly (readonly [...Parameters<ExtensionAPI['registerMessageRenderer']>])[];\n readonly entryRenderers?: readonly (readonly [...Parameters<ExtensionAPI['registerEntryRenderer']>])[];\n readonly markdownTransformers?: readonly Parameters<ExtensionAPI['registerMarkdownTransformer']>[0][];\n readonly shortcuts?: readonly (readonly [...Parameters<ExtensionAPI['registerShortcut']>])[];\n readonly flags?: readonly (readonly [...Parameters<ExtensionAPI['registerFlag']>])[];\n}\n\nexport interface PiExtensionDefinition<TOptions = undefined> extends PiPluginContributions<TOptions> {\n readonly name: string;\n}\n\nexport interface DefinedPiExtension<TOptions = undefined> {\n (pi: ExtensionAPI, options?: TOptions): Promise<void>;\n install(\n this: void,\n context: Context,\n pi: ExtensionAPI,\n options?: TOptions,\n runtime?: DoomCordisRuntimeService,\n ): Promise<void>;\n}\n\nexport function definePiExtension<TOptions = undefined>(\n definition: PiExtensionDefinition<TOptions>,\n): DefinedPiExtension<TOptions>;\nexport function definePiExtension<TOptions = undefined>(\n name: string,\n factory: (\n context: PiPluginContext<TOptions>,\n ) => PiPluginContributions<TOptions> | Promise<PiPluginContributions<TOptions>>,\n): DefinedPiExtension<TOptions>;\nexport function definePiExtension<TOptions = undefined>(\n definition: string | PiExtensionDefinition<TOptions>,\n factory?: (\n context: PiPluginContext<TOptions>,\n ) => PiPluginContributions<TOptions> | Promise<PiPluginContributions<TOptions>>,\n): DefinedPiExtension<TOptions> {\n const name = typeof definition === 'string' ? definition : definition.name;\n const install = async (\n context: Context,\n pi: ExtensionAPI,\n options?: TOptions,\n runtime?: DoomCordisRuntimeService,\n ): Promise<void> => {\n const lifecycle = createPluginLifecycle((signal): PiPluginContext<TOptions> => ({\n context,\n pi,\n options,\n runtime,\n signal,\n }));\n context.effect(() => () => lifecycle.dispose(), `${name}/lifecycle`);\n const tool = (item: PiToolContribution, executionSignal?: () => AbortSignal): void => {\n if ('kind' in item && item.kind === 'pi-tool') {\n item.register(pi, executionSignal);\n return;\n }\n if (!('kind' in item)) {\n if (!executionSignal) {\n pi.registerTool(item);\n return;\n }\n pi.registerTool({\n ...item,\n async execute(toolCallId, input, signal, update, context) {\n const current = executionSignal();\n current.throwIfAborted();\n return item.execute(\n toolCallId,\n input,\n signal ? AbortSignal.any([signal, current]) : current,\n update,\n context,\n );\n },\n });\n return;\n }\n pi.registerTool({\n ...item.pi,\n name: item.name,\n label: item.label ?? item.name,\n description: item.description,\n parameters: item.parameters,\n promptSnippet: item.promptSnippet,\n promptGuidelines: item.promptGuidelines ? [...item.promptGuidelines] : undefined,\n executionMode: item.executionMode === 'serial' ? 'sequential' : item.executionMode,\n async execute(toolCallId, input, signal, update, execution) {\n const current = executionSignal?.() ?? lifecycle.context.signal;\n current.throwIfAborted();\n const result = await item.execute(input, {\n toolCallId,\n cwd: execution.cwd,\n signal: signal ? AbortSignal.any([signal, current]) : current,\n update: (result) => update?.({ ...result, details: result.details }),\n notify: (request) => {\n if (execution.hasUI) execution.ui.notify(request.body, request.level ?? 'info');\n },\n });\n return { ...result, details: result.details };\n },\n });\n };\n await lifecycle.mount(\n () => (typeof definition === 'string' ? factory!(lifecycle.context) : definition),\n async (contributions) => {\n for (const service of contributions.services ?? []) {\n const fiber = context.plugin(service);\n lifecycle.own(() => fiber.dispose());\n await fiber;\n }\n const tools = contributions.tools;\n if (tools && 'snapshot' in tools) {\n const registered = new Map<string, { readonly declaration: PiToolContribution; active?: AbortController }>();\n let disposed = false;\n let subscribing = true;\n let reconciling = false;\n let pending = false;\n const deactivate = (): void => {\n for (const entry of registered.values()) {\n entry.active?.abort();\n entry.active = undefined;\n }\n };\n lifecycle.own(() => {\n disposed = true;\n deactivate();\n });\n const reconcile = (): void => {\n pending = true;\n if (disposed || lifecycle.context.signal.aborted) {\n deactivate();\n return;\n }\n if (reconciling || subscribing) return;\n reconciling = true;\n try {\n do {\n pending = false;\n const snapshot = tools.snapshot();\n const names = new Map<string, PiToolContribution>();\n for (const declaration of snapshot) {\n if (names.has(declaration.name)) throw new Error(`Duplicate live tool name: ${declaration.name}`);\n names.set(declaration.name, declaration);\n }\n for (const [name, entry] of registered) {\n if (names.get(name) !== entry.declaration) {\n entry.active?.abort();\n entry.active = undefined;\n }\n }\n for (const declaration of snapshot) {\n let entry = registered.get(declaration.name);\n if (entry && entry.declaration !== declaration) entry = undefined;\n if (entry) {\n entry.active ??= new AbortController();\n continue;\n }\n entry = { declaration, active: new AbortController() };\n const current = entry;\n registered.set(declaration.name, entry);\n try {\n tool(declaration, () => {\n lifecycle.context.signal.throwIfAborted();\n if (!current.active || disposed)\n throw new Error(`Tool ${declaration.name} is unavailable in this plugin generation.`);\n return AbortSignal.any([lifecycle.context.signal, current.active.signal]);\n });\n } catch (error) {\n registered.delete(declaration.name);\n throw error;\n }\n }\n } while (pending && !disposed);\n } catch (error) {\n deactivate();\n throw error;\n } finally {\n reconciling = false;\n }\n };\n const unsubscribe = tools.subscribe(() => {\n try {\n reconcile();\n } catch {\n /* An invalid update leaves registered tools unavailable. */\n }\n });\n lifecycle.own(() => {\n disposed = true;\n deactivate();\n unsubscribe();\n });\n subscribing = false;\n reconcile();\n } else {\n for (const item of tools ?? []) tool(item);\n }\n for (const item of contributions.commands ?? []) {\n if (!('kind' in item)) {\n pi.registerCommand(...item);\n continue;\n }\n pi.registerCommand(item.name, {\n description: item.description,\n async handler(args, execution) {\n lifecycle.context.signal.throwIfAborted();\n await item.execute(args, {\n cwd: execution.cwd,\n signal: lifecycle.context.signal,\n notify: (request) => {\n if (execution.hasUI) execution.ui.notify(request.body, request.level ?? 'info');\n },\n });\n },\n });\n }\n // The public mapped handlers retain each native event's input and return type.\n const on = pi.on.bind(pi) as (event: string, handler: unknown) => ReturnType<ExtensionAPI['on']>;\n for (const [event, handler] of Object.entries(contributions.events ?? {})) lifecycle.own(on(event, handler));\n for (const item of contributions.providers ?? []) pi.registerProvider(...item);\n for (const item of contributions.messageRenderers ?? []) pi.registerMessageRenderer(...item);\n for (const item of contributions.entryRenderers ?? []) pi.registerEntryRenderer(...item);\n for (const item of contributions.markdownTransformers ?? []) pi.registerMarkdownTransformer(item);\n for (const item of contributions.shortcuts ?? []) pi.registerShortcut(...item);\n for (const item of contributions.flags ?? []) pi.registerFlag(...item);\n const bind = (service: string, register: (child: Context) => void): void => {\n const fiber = context.inject([service], register);\n lifecycle.own(() => fiber.dispose());\n };\n if (contributions.resources?.length)\n bind(DOOM_HELP_SERVICE, (child) => {\n for (const resource of contributions.resources!) {\n const handle = requireDoomHelpService(child).register(resource);\n child.effect(() => () => handle.dispose());\n }\n });\n if (contributions.toolRestrictions?.length)\n bind(DOOM_TOOL_SURFACE_SERVICE, (child) => {\n for (const restriction of contributions.toolRestrictions!) {\n const handle = requireDoomToolSurface(child).register(restriction);\n child.effect(() => () => handle.dispose());\n const unsubscribe = restriction.subscribe?.(() => handle.update(restriction.restrict));\n if (unsubscribe) child.effect(() => unsubscribe);\n }\n });\n if (contributions.toolOverrides?.length)\n bind(DOOM_TOOL_OVERRIDES_SERVICE, (child) => {\n for (const override of contributions.toolOverrides!) {\n const handle = requireDoomToolOverrides(child).claim(override);\n child.effect(() => () => handle.dispose());\n if (handle.granted) for (const replacement of override.replacements) tool(replacement);\n }\n });\n },\n );\n };\n const activate = async (pi: ExtensionAPI, options?: TOptions): Promise<void> => {\n const connection = await connectDoomCordisHost(pi, name);\n const fiber = connection.root.plugin(async (context) => {\n await install(context, pi, options, connection.runtime);\n });\n let completion: Promise<void> | undefined;\n let unsubscribeShutdown: (() => void) | undefined;\n const dispose = (): Promise<void> =>\n (completion ??= (async () => {\n try {\n unsubscribeShutdown?.();\n unsubscribeShutdown = undefined;\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })());\n try {\n await fiber;\n const shutdownRegistration = pi.on('session_shutdown', dispose) as unknown;\n if (typeof shutdownRegistration === 'function') unsubscribeShutdown = shutdownRegistration as () => void;\n } catch (error) {\n try {\n await dispose();\n } catch (cleanupError) {\n throw new AggregateError([error, cleanupError], `${name} startup and cleanup failed.`);\n }\n throw error;\n }\n };\n return Object.assign(activate, { install });\n}\n\n/**\n * What a CLI tool's presentation file supplies.\n *\n * The terminal is a frontend. `renderCall` and `renderResult` draw a tool call\n * into the TUI exactly as a cockpit tool renderer draws it into the browser,\n * so they are authored on the frontend side under a `.cli` platform suffix and\n * never alongside the tool's `execute`.\n */\nexport type PiToolRenderers<TParameters extends TSchema = TSchema, TDetails = unknown, TState = unknown> = Pick<\n ToolDefinition<TParameters, TDetails, TState>,\n 'renderShell' | 'renderCall' | 'renderResult'\n>;\n\n/** A terminal renderer declaration or a factory resolved from its session mount. */\nexport type PiToolRendererFile<\n TContext = unknown,\n TParameters extends TSchema = TSchema,\n TDetails = unknown,\n TState = unknown,\n> =\n | PiToolRenderers<TParameters, TDetails, TState>\n | ((context: TContext) => PiToolRenderers<TParameters, TDetails, TState>);\n/**\n * `(frontend)/tool/<name>.cli.tsx`. The filename names the tool these draw.\n *\n * Generic over the tool's schema, because a renderer reads the call it is\n * drawing: state the parameter type and `renderResult` sees the real arguments\n * instead of `unknown`, which is what the single-file version got for free.\n */\nexport function definePiToolRenderer<TParameters extends TSchema = TSchema, TDetails = unknown, TState = unknown>(\n file: PiToolRenderers<TParameters, TDetails, TState>,\n): PiToolRenderers<TParameters, TDetails, TState> {\n return file;\n}\n\n/** `(frontend)/tool/<name>.cli.tsx` when the renderer needs mount context. */\nexport function defineCliToolRenderer<\n TContext,\n TParameters extends TSchema = TSchema,\n TDetails = unknown,\n TState = unknown,\n>(\n file: PiToolRendererFile<TContext, TParameters, TDetails, TState>,\n): PiToolRendererFile<TContext, TParameters, TDetails, TState> {\n return file;\n}\n\n/**\n * `(frontend)/message/<name>.cli.tsx`. A renderer for one custom message type.\n *\n * The type is stated rather than derived from the filename, because it is a\n * protocol constant shared with whatever emits the message. A path-derived\n * name would silently stop matching the moment either side was renamed.\n */\nexport function defineMessageRenderer(\n messageType: Parameters<ExtensionAPI['registerMessageRenderer']>[0],\n render: Parameters<ExtensionAPI['registerMessageRenderer']>[1],\n): readonly [...Parameters<ExtensionAPI['registerMessageRenderer']>] {\n return [messageType, render];\n}\n\n/**\n * Attaches a presentation file's renderers to the tool its filename names.\n *\n * Three tool shapes reach a contribution array and each carries renderers in a\n * different place, so a generated entry cannot spell this merge itself. A\n * native Pi definition takes them at the top level, the portable shape nests\n * them under `pi`, and `definePiTool` owns its own registration, so that one\n * is reached by narrowing the host it registers against. `register` asks for\n * nothing but `registerTool`, which is what makes the last case a two-line\n * shim rather than a proxy over the whole extension API.\n */\nexport function withPiRenderers(tool: PiToolContribution, renderers: PiToolRenderers): PiToolContribution {\n if (!('kind' in tool)) return { ...tool, ...renderers };\n if (tool.kind !== 'pi-tool') return { ...tool, pi: { ...tool.pi, ...renderers } };\n return {\n ...tool,\n register(pi, executionSignal) {\n tool.register(\n { registerTool: (definition) => pi.registerTool({ ...definition, ...renderers }) },\n executionSignal,\n );\n },\n };\n}\n\n/**\n * Splits routed tool files into the two arrays the Pi host keeps apart.\n *\n * A tool that replaces a name Pi already ships is not a second registration,\n * it is a claim the override service arbitrates, and only the winner\n * registers. The folder convention keeps both in `tool/`, because from the\n * author's side both are \"this package provides grep\"; which one it is lives\n * in the value, through `definePiTool(definition, { overrides: true })`.\n *\n * A generated entry therefore cannot decide this from the path, and calls\n * this instead. Every static claim from one package is one atomic set, which\n * is what the override service expects. A live collection stays intact so its\n * subscription continues to drive registration changes.\n */\nexport function piToolContributions(\n source: string,\n items: readonly PiToolContribution[] | PiToolCollection,\n): Pick<PiPluginContributions, 'tools' | 'toolOverrides'> {\n if (!Array.isArray(items)) return { tools: items as PiToolCollection };\n const added: PiToolContribution[] = [];\n const claimed: PiToolDeclaration[] = [];\n for (const item of items) {\n // Only a native declaration may claim a name: a replacement is handed to\n // Pi's registry directly, which the portable shape is not.\n if ('kind' in item && item.kind === 'pi-tool' && item.overrides === true) claimed.push(item);\n else added.push(item);\n }\n if (claimed.length === 0) return { tools: added };\n return {\n tools: added,\n toolOverrides: [{ source, tools: claimed.map((item) => item.name), replacements: claimed }],\n };\n}\n"],"mappings":";;;;;;;AA+KA,SAAgB,kBACd,YACA,SAG8B;CAC9B,MAAM,OAAO,OAAO,eAAe,WAAW,aAAa,WAAW;CACtE,MAAM,UAAU,OACd,SACA,IACA,SACA,YACkB;EAClB,MAAM,YAAYA,cAAAA,uBAAuB,YAAuC;GAC9E;GACA;GACA;GACA;GACA;EACF,EAAE;EACF,QAAQ,mBAAmB,UAAU,QAAQ,GAAG,GAAG,KAAK,WAAW;EACnE,MAAM,QAAQ,MAA0B,oBAA8C;GACpF,IAAI,UAAU,QAAQ,KAAK,SAAS,WAAW;IAC7C,KAAK,SAAS,IAAI,eAAe;IACjC;GACF;GACA,IAAI,EAAE,UAAU,OAAO;IACrB,IAAI,CAAC,iBAAiB;KACpB,GAAG,aAAa,IAAI;KACpB;IACF;IACA,GAAG,aAAa;KACd,GAAG;KACH,MAAM,QAAQ,YAAY,OAAO,QAAQ,QAAQ,SAAS;MACxD,MAAM,UAAU,gBAAgB;MAChC,QAAQ,eAAe;MACvB,OAAO,KAAK,QACV,YACA,OACA,SAAS,YAAY,IAAI,CAAC,QAAQ,OAAO,CAAC,IAAI,SAC9C,QACA,OACF;KACF;IACF,CAAC;IACD;GACF;GACA,GAAG,aAAa;IACd,GAAG,KAAK;IACR,MAAM,KAAK;IACX,OAAO,KAAK,SAAS,KAAK;IAC1B,aAAa,KAAK;IAClB,YAAY,KAAK;IACjB,eAAe,KAAK;IACpB,kBAAkB,KAAK,mBAAmB,CAAC,GAAG,KAAK,gBAAgB,IAAI,KAAA;IACvE,eAAe,KAAK,kBAAkB,WAAW,eAAe,KAAK;IACrE,MAAM,QAAQ,YAAY,OAAO,QAAQ,QAAQ,WAAW;KAC1D,MAAM,UAAU,kBAAkB,KAAK,UAAU,QAAQ;KACzD,QAAQ,eAAe;KACvB,MAAM,SAAS,MAAM,KAAK,QAAQ,OAAO;MACvC;MACA,KAAK,UAAU;MACf,QAAQ,SAAS,YAAY,IAAI,CAAC,QAAQ,OAAO,CAAC,IAAI;MACtD,SAAS,WAAW,SAAS;OAAE,GAAG;OAAQ,SAAS,OAAO;MAAQ,CAAC;MACnE,SAAS,YAAY;OACnB,IAAI,UAAU,OAAO,UAAU,GAAG,OAAO,QAAQ,MAAM,QAAQ,SAAS,MAAM;MAChF;KACF,CAAC;KACD,OAAO;MAAE,GAAG;MAAQ,SAAS,OAAO;KAAQ;IAC9C;GACF,CAAC;EACH;EACA,MAAM,UAAU,YACP,OAAO,eAAe,WAAW,QAAS,UAAU,OAAO,IAAI,YACtE,OAAO,kBAAkB;GACvB,KAAK,MAAM,WAAW,cAAc,YAAY,CAAC,GAAG;IAClD,MAAM,QAAQ,QAAQ,OAAO,OAAO;IACpC,UAAU,UAAU,MAAM,QAAQ,CAAC;IACnC,MAAM;GACR;GACA,MAAM,QAAQ,cAAc;GAC5B,IAAI,SAAS,cAAc,OAAO;IAChC,MAAM,6BAAa,IAAI,IAAoF;IAC3G,IAAI,WAAW;IACf,IAAI,cAAc;IAClB,IAAI,cAAc;IAClB,IAAI,UAAU;IACd,MAAM,mBAAyB;KAC7B,KAAK,MAAM,SAAS,WAAW,OAAO,GAAG;MACvC,MAAM,QAAQ,MAAM;MACpB,MAAM,SAAS,KAAA;KACjB;IACF;IACA,UAAU,UAAU;KAClB,WAAW;KACX,WAAW;IACb,CAAC;IACD,MAAM,kBAAwB;KAC5B,UAAU;KACV,IAAI,YAAY,UAAU,QAAQ,OAAO,SAAS;MAChD,WAAW;MACX;KACF;KACA,IAAI,eAAe,aAAa;KAChC,cAAc;KACd,IAAI;MACF,GAAG;OACD,UAAU;OACV,MAAM,WAAW,MAAM,SAAS;OAChC,MAAM,wBAAQ,IAAI,IAAgC;OAClD,KAAK,MAAM,eAAe,UAAU;QAClC,IAAI,MAAM,IAAI,YAAY,IAAI,GAAG,MAAM,IAAI,MAAM,6BAA6B,YAAY,MAAM;QAChG,MAAM,IAAI,YAAY,MAAM,WAAW;OACzC;OACA,KAAK,MAAM,CAAC,MAAM,UAAU,YAC1B,IAAI,MAAM,IAAI,IAAI,MAAM,MAAM,aAAa;QACzC,MAAM,QAAQ,MAAM;QACpB,MAAM,SAAS,KAAA;OACjB;OAEF,KAAK,MAAM,eAAe,UAAU;QAClC,IAAI,QAAQ,WAAW,IAAI,YAAY,IAAI;QAC3C,IAAI,SAAS,MAAM,gBAAgB,aAAa,QAAQ,KAAA;QACxD,IAAI,OAAO;SACT,MAAM,WAAW,IAAI,gBAAgB;SACrC;QACF;QACA,QAAQ;SAAE;SAAa,QAAQ,IAAI,gBAAgB;QAAE;QACrD,MAAM,UAAU;QAChB,WAAW,IAAI,YAAY,MAAM,KAAK;QACtC,IAAI;SACF,KAAK,mBAAmB;UACtB,UAAU,QAAQ,OAAO,eAAe;UACxC,IAAI,CAAC,QAAQ,UAAU,UACrB,MAAM,IAAI,MAAM,QAAQ,YAAY,KAAK,2CAA2C;UACtF,OAAO,YAAY,IAAI,CAAC,UAAU,QAAQ,QAAQ,QAAQ,OAAO,MAAM,CAAC;SAC1E,CAAC;QACH,SAAS,OAAO;SACd,WAAW,OAAO,YAAY,IAAI;SAClC,MAAM;QACR;OACF;MACF,SAAS,WAAW,CAAC;KACvB,SAAS,OAAO;MACd,WAAW;MACX,MAAM;KACR,UAAU;MACR,cAAc;KAChB;IACF;IACA,MAAM,cAAc,MAAM,gBAAgB;KACxC,IAAI;MACF,UAAU;KACZ,QAAQ,CAER;IACF,CAAC;IACD,UAAU,UAAU;KAClB,WAAW;KACX,WAAW;KACX,YAAY;IACd,CAAC;IACD,cAAc;IACd,UAAU;GACZ,OACE,KAAK,MAAM,QAAQ,SAAS,CAAC,GAAG,KAAK,IAAI;GAE3C,KAAK,MAAM,QAAQ,cAAc,YAAY,CAAC,GAAG;IAC/C,IAAI,EAAE,UAAU,OAAO;KACrB,GAAG,gBAAgB,GAAG,IAAI;KAC1B;IACF;IACA,GAAG,gBAAgB,KAAK,MAAM;KAC5B,aAAa,KAAK;KAClB,MAAM,QAAQ,MAAM,WAAW;MAC7B,UAAU,QAAQ,OAAO,eAAe;MACxC,MAAM,KAAK,QAAQ,MAAM;OACvB,KAAK,UAAU;OACf,QAAQ,UAAU,QAAQ;OAC1B,SAAS,YAAY;QACnB,IAAI,UAAU,OAAO,UAAU,GAAG,OAAO,QAAQ,MAAM,QAAQ,SAAS,MAAM;OAChF;MACF,CAAC;KACH;IACF,CAAC;GACH;GAEA,MAAM,KAAK,GAAG,GAAG,KAAK,EAAE;GACxB,KAAK,MAAM,CAAC,OAAO,YAAY,OAAO,QAAQ,cAAc,UAAU,CAAC,CAAC,GAAG,UAAU,IAAI,GAAG,OAAO,OAAO,CAAC;GAC3G,KAAK,MAAM,QAAQ,cAAc,aAAa,CAAC,GAAG,GAAG,iBAAiB,GAAG,IAAI;GAC7E,KAAK,MAAM,QAAQ,cAAc,oBAAoB,CAAC,GAAG,GAAG,wBAAwB,GAAG,IAAI;GAC3F,KAAK,MAAM,QAAQ,cAAc,kBAAkB,CAAC,GAAG,GAAG,sBAAsB,GAAG,IAAI;GACvF,KAAK,MAAM,QAAQ,cAAc,wBAAwB,CAAC,GAAG,GAAG,4BAA4B,IAAI;GAChG,KAAK,MAAM,QAAQ,cAAc,aAAa,CAAC,GAAG,GAAG,iBAAiB,GAAG,IAAI;GAC7E,KAAK,MAAM,QAAQ,cAAc,SAAS,CAAC,GAAG,GAAG,aAAa,GAAG,IAAI;GACrE,MAAM,QAAQ,SAAiB,aAA6C;IAC1E,MAAM,QAAQ,QAAQ,OAAO,CAAC,OAAO,GAAG,QAAQ;IAChD,UAAU,UAAU,MAAM,QAAQ,CAAC;GACrC;GACA,IAAI,cAAc,WAAW,QAC3B,KAAKC,aAAAA,oBAAoB,UAAU;IACjC,KAAK,MAAM,YAAY,cAAc,WAAY;KAC/C,MAAM,SAASC,aAAAA,uBAAuB,KAAK,CAAC,CAAC,SAAS,QAAQ;KAC9D,MAAM,mBAAmB,OAAO,QAAQ,CAAC;IAC3C;GACF,CAAC;GACH,IAAI,cAAc,kBAAkB,QAClC,KAAKC,oBAAAA,4BAA4B,UAAU;IACzC,KAAK,MAAM,eAAe,cAAc,kBAAmB;KACzD,MAAM,SAASC,oBAAAA,uBAAuB,KAAK,CAAC,CAAC,SAAS,WAAW;KACjE,MAAM,mBAAmB,OAAO,QAAQ,CAAC;KACzC,MAAM,cAAc,YAAY,kBAAkB,OAAO,OAAO,YAAY,QAAQ,CAAC;KACrF,IAAI,aAAa,MAAM,aAAa,WAAW;IACjD;GACF,CAAC;GACH,IAAI,cAAc,eAAe,QAC/B,KAAKC,sBAAAA,8BAA8B,UAAU;IAC3C,KAAK,MAAM,YAAY,cAAc,eAAgB;KACnD,MAAM,SAASC,sBAAAA,yBAAyB,KAAK,CAAC,CAAC,MAAM,QAAQ;KAC7D,MAAM,mBAAmB,OAAO,QAAQ,CAAC;KACzC,IAAI,OAAO,SAAS,KAAK,MAAM,eAAe,SAAS,cAAc,KAAK,WAAW;IACvF;GACF,CAAC;EACL,CACF;CACF;CACA,MAAM,WAAW,OAAO,IAAkB,YAAsC;EAC9E,MAAM,aAAa,MAAMC,4BAAAA,sBAAsB,IAAI,IAAI;EACvD,MAAM,QAAQ,WAAW,KAAK,OAAO,OAAO,YAAY;GACtD,MAAM,QAAQ,SAAS,IAAI,SAAS,WAAW,OAAO;EACxD,CAAC;EACD,IAAI;EACJ,IAAI;EACJ,MAAM,gBACH,gBAAgB,YAAY;GAC3B,IAAI;IACF,sBAAsB;IACtB,sBAAsB,KAAA;IACtB,MAAM,MAAM,QAAQ;GACtB,UAAU;IACR,MAAM,WAAW,QAAQ;GAC3B;EACF,EAAA,CAAG;EACL,IAAI;GACF,MAAM;GACN,MAAM,uBAAuB,GAAG,GAAG,oBAAoB,OAAO;GAC9D,IAAI,OAAO,yBAAyB,YAAY,sBAAsB;EACxE,SAAS,OAAO;GACd,IAAI;IACF,MAAM,QAAQ;GAChB,SAAS,cAAc;IACrB,MAAM,IAAI,eAAe,CAAC,OAAO,YAAY,GAAG,GAAG,KAAK,6BAA6B;GACvF;GACA,MAAM;EACR;CACF;CACA,OAAO,OAAO,OAAO,UAAU,EAAE,QAAQ,CAAC;AAC5C;;;;;;;;AA+BA,SAAgB,qBACd,MACgD;CAChD,OAAO;AACT;;AAGA,SAAgB,sBAMd,MAC6D;CAC7D,OAAO;AACT;;;;;;;;AASA,SAAgB,sBACd,aACA,QACmE;CACnE,OAAO,CAAC,aAAa,MAAM;AAC7B;;;;;;;;;;;;AAaA,SAAgB,gBAAgB,MAA0B,WAAgD;CACxG,IAAI,EAAE,UAAU,OAAO,OAAO;EAAE,GAAG;EAAM,GAAG;CAAU;CACtD,IAAI,KAAK,SAAS,WAAW,OAAO;EAAE,GAAG;EAAM,IAAI;GAAE,GAAG,KAAK;GAAI,GAAG;EAAU;CAAE;CAChF,OAAO;EACL,GAAG;EACH,SAAS,IAAI,iBAAiB;GAC5B,KAAK,SACH,EAAE,eAAe,eAAe,GAAG,aAAa;IAAE,GAAG;IAAY,GAAG;GAAU,CAAC,EAAE,GACjF,eACF;EACF;CACF;AACF;;;;;;;;;;;;;;;AAgBA,SAAgB,oBACd,QACA,OACwD;CACxD,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,OAAO,EAAE,OAAO,MAA0B;CACrE,MAAM,QAA8B,CAAC;CACrC,MAAM,UAA+B,CAAC;CACtC,KAAK,MAAM,QAAQ,OAGjB,IAAI,UAAU,QAAQ,KAAK,SAAS,aAAa,KAAK,cAAc,MAAM,QAAQ,KAAK,IAAI;MACtF,MAAM,KAAK,IAAI;CAEtB,IAAI,QAAQ,WAAW,GAAG,OAAO,EAAE,OAAO,MAAM;CAChD,OAAO;EACL,OAAO;EACP,eAAe,CAAC;GAAE;GAAQ,OAAO,QAAQ,KAAK,SAAS,KAAK,IAAI;GAAG,cAAc;EAAQ,CAAC;CAC5F;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-pi-extension.d.cts","names":[],"sources":["../src/extensions/piExtension.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"runtime-pi-extension.d.cts","names":[],"sources":["../src/extensions/piExtension.ts"],"mappings":";;;;;;;;;;;;KAkBK,uBAAuB;GACzB,aAAa,mBAAmB,eAAe;GAC/C,aAAa,mBAAmB,eAAe;GAC/C,aAAa,mBAAmB,eAAe;GAC/C,aAAa,mBAAmB,eAAe;GAC/C,aAAa,mBAAmB,eAAe;GAC/C,aAAa,mBAAmB,eAAe;GAC/C,aAAa,mBAAmB,eAAe;GAC/C,aAAa,mBAAmB,eAAe;GAC/C,aAAa,mBAAmB,eAAe;GAC/C,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;GAChD,aAAa,oBAAoB,eAAe;KAG1C,IAAI,OACJ,IAAI,OACJ,IAAI,OACJ,IAAI,OACJ,IAAI,OACJ,IAAI,OACJ,IAAI,OACJ,IAAI,OACJ,IAAI,OACJ,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK;YAGF,8BACA,QAAQ,wBAAwB,WAAW;iBAGtC,gBAAgB;WACtB,SAAS;WACT,IAAI;WACJ,SAAS;WACT,SAAS;WACT,QAAQ;;YAGP,oBAAoB;iBAEf,qBAAqB;WAC3B,KAAK,KAAK,WAAW;;iBAGf,uBAAuB;;WAE7B;WACA,wBAAwB,oBAAoB,WAAW;;YAGtD,qBAAqB,eAAe,oBAAoB,WAAW;;iBAG9D;EACf,qBAAqB;EACrB,UAAU;;iBAGK,sBAAsB,8BAA8B,qBAAqB,gBAAgB;WAC/F,oBAAoB,WAAW;WAC/B,iBAAiB,uBAAuB;WACxC,qBAAqB,iCAAiC,WAAW;WACjE,SAAS;WACT,qBAAqB,WAAW;WAChC,4BAA4B;WAC5B,yBAAyB;WACzB,mCAAmC,WAAW;WAC9C,0CAA0C,WAAW;WACrD,wCAAwC,WAAW;WACnD,gCAAgC,WAAW;WAC3C,mCAAmC,WAAW;WAC9C,+BAA+B,WAAW;;iBAGpC,sBAAsB,8BAA8B,sBAAsB;WAChF;;iBAGM,mBAAmB;GACjC,IAAI,cAAc,UAAU,WAAW;EACxC,QACE,YACA,SAAS,SACT,IAAI,cACJ,UAAU,UACV,UAAU,2BACT;;wBAGW,kBAAkB,sBAChC,YAAY,sBAAsB,YACjC,mBAAmB;wBACN,kBAAkB,sBAChC,cACA,UACE,SAAS,gBAAgB,cACtB,sBAAsB,YAAY,QAAQ,sBAAsB,aACpE,mBAAmB;;;;;;;;;YA4QV,gBAAgB,oBAAoB,UAAU,SAAS,oBAAoB,oBAAoB,KACzG,eAAe,aAAa,UAAU;;YAK5B,mBACV,oBACA,oBAAoB,UAAU,SAC9B,oBACA,oBAEE,gBAAgB,aAAa,UAAU,YACrC,SAAS,aAAa,gBAAgB,aAAa,UAAU;;;;;;;;wBAQnD,qBAAqB,oBAAoB,UAAU,SAAS,oBAAoB,kBAC9F,MAAM,gBAAgB,aAAa,UAAU,UAC5C,gBAAgB,aAAa,UAAU;;wBAK1B,sBACd,UACA,oBAAoB,UAAU,SAC9B,oBACA,kBAEA,MAAM,mBAAmB,UAAU,aAAa,UAAU,UACzD,mBAAmB,UAAU,aAAa,UAAU;;;;;;;;wBAWvC,sBACd,aAAa,WAAW,6CACxB,QAAQ,WAAW,2DACL,WAAW;;;;;;;;;;;;wBAeX,gBAAgB,MAAM,oBAAoB,WAAW,kBAAkB;;;;;;;;;;;;;;;wBA4BvE,oBACd,gBACA,gBAAgB,uBAAuB,mBACtC,KAAK"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-pi-extension.d.mts","names":[],"sources":["../src/extensions/piExtension.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"runtime-pi-extension.d.mts","names":[],"sources":["../src/extensions/piExtension.ts"],"mappings":"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"}
|
|
@@ -175,7 +175,7 @@ function definePiExtension(definition, factory) {
|
|
|
175
175
|
});
|
|
176
176
|
}
|
|
177
177
|
const on = pi.on.bind(pi);
|
|
178
|
-
for (const [event, handler] of Object.entries(contributions.events ?? {})) on(event, handler);
|
|
178
|
+
for (const [event, handler] of Object.entries(contributions.events ?? {})) lifecycle.own(on(event, handler));
|
|
179
179
|
for (const item of contributions.providers ?? []) pi.registerProvider(...item);
|
|
180
180
|
for (const item of contributions.messageRenderers ?? []) pi.registerMessageRenderer(...item);
|
|
181
181
|
for (const item of contributions.entryRenderers ?? []) pi.registerEntryRenderer(...item);
|
|
@@ -215,8 +215,11 @@ function definePiExtension(definition, factory) {
|
|
|
215
215
|
await install(context, pi, options, connection.runtime);
|
|
216
216
|
});
|
|
217
217
|
let completion;
|
|
218
|
+
let unsubscribeShutdown;
|
|
218
219
|
const dispose = () => completion ??= (async () => {
|
|
219
220
|
try {
|
|
221
|
+
unsubscribeShutdown?.();
|
|
222
|
+
unsubscribeShutdown = void 0;
|
|
220
223
|
await fiber.dispose();
|
|
221
224
|
} finally {
|
|
222
225
|
await connection.dispose();
|
|
@@ -224,7 +227,8 @@ function definePiExtension(definition, factory) {
|
|
|
224
227
|
})();
|
|
225
228
|
try {
|
|
226
229
|
await fiber;
|
|
227
|
-
pi.on("session_shutdown", dispose);
|
|
230
|
+
const shutdownRegistration = pi.on("session_shutdown", dispose);
|
|
231
|
+
if (typeof shutdownRegistration === "function") unsubscribeShutdown = shutdownRegistration;
|
|
228
232
|
} catch (error) {
|
|
229
233
|
try {
|
|
230
234
|
await dispose();
|