@agimon-ai/doompi-core 0.0.1-alpha.76 → 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-hub.cjs +107 -7
- package/dist/headless-hub.cjs.map +1 -1
- package/dist/headless-hub.d.cts +10 -0
- package/dist/headless-hub.d.cts.map +1 -1
- package/dist/headless-hub.d.mts +10 -0
- package/dist/headless-hub.d.mts.map +1 -1
- package/dist/headless-hub.mjs +107 -7
- package/dist/headless-hub.mjs.map +1 -1
- package/dist/headless-server.cjs +63 -6
- package/dist/headless-server.cjs.map +1 -1
- package/dist/headless-server.d.cts +2 -0
- package/dist/headless-server.d.cts.map +1 -1
- package/dist/headless-server.d.mts +2 -0
- package/dist/headless-server.d.mts.map +1 -1
- package/dist/headless-server.mjs +64 -7
- package/dist/headless-server.mjs.map +1 -1
- package/dist/headless-session-host.d.cts +5 -0
- package/dist/headless-session-host.d.cts.map +1 -1
- package/dist/headless-session-host.d.mts +5 -0
- package/dist/headless-session-host.d.mts.map +1 -1
- package/dist/headless.d.cts +2 -2
- package/dist/headless.d.mts +2 -2
- package/dist/history-import.cjs +1 -1
- package/dist/history-import.mjs +1 -1
- package/dist/history-ownership.cjs +1 -1
- package/dist/history-ownership.mjs +1 -1
- package/dist/history.cjs +2 -0
- package/dist/history.d.cts +2 -1
- package/dist/history.d.mts +2 -1
- package/dist/history.mjs +2 -1
- package/dist/hub-channel.d.cts +2 -2
- package/dist/hub-channel.d.mts +2 -2
- package/dist/jsonl-session-repo.cjs +1 -1
- package/dist/jsonl-session-repo.mjs +1 -1
- package/dist/mcp-facet.cjs +11 -0
- package/dist/mcp-facet.d.cts +4 -0
- package/dist/mcp-facet.d.mts +4 -0
- package/dist/mcp-facet.mjs +4 -0
- package/dist/mcp-schema-cost.cjs +2 -2
- package/dist/mcp-schema-cost.mjs +1 -1
- package/dist/package-api-server.cjs +13 -1
- package/dist/package-api-server.cjs.map +1 -1
- package/dist/package-api-server.mjs +13 -1
- package/dist/package-api-server.mjs.map +1 -1
- package/dist/remote-runtime.cjs +11 -3
- package/dist/remote-runtime.cjs.map +1 -1
- package/dist/remote-runtime.d.cts.map +1 -1
- package/dist/remote-runtime.d.mts.map +1 -1
- package/dist/remote-runtime.mjs +12 -4
- package/dist/remote-runtime.mjs.map +1 -1
- 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-identity.cjs +1 -1
- package/dist/runtime-identity.mjs +1 -1
- package/dist/runtime-json.cjs +1 -1
- package/dist/runtime-json.mjs +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/httpApiContracts.cjs +27 -3
- package/dist/schemas/httpApiContracts.cjs.map +1 -1
- package/dist/schemas/httpApiContracts.mjs +25 -4
- package/dist/schemas/httpApiContracts.mjs.map +1 -1
- package/dist/schemas/hubChannel.d.cts +12 -0
- package/dist/schemas/hubChannel.d.cts.map +1 -1
- package/dist/schemas/hubChannel.d.mts +12 -0
- package/dist/schemas/hubChannel.d.mts.map +1 -1
- package/dist/schemas/mcpBundle.cjs +67 -0
- package/dist/schemas/mcpBundle.cjs.map +1 -0
- package/dist/schemas/mcpBundle.d.cts +21 -0
- package/dist/schemas/mcpBundle.d.cts.map +1 -0
- package/dist/schemas/mcpBundle.d.mts +21 -0
- package/dist/schemas/mcpBundle.d.mts.map +1 -0
- package/dist/schemas/mcpBundle.mjs +65 -0
- package/dist/schemas/mcpBundle.mjs.map +1 -0
- package/dist/schemas/mcpFacet.cjs +19 -0
- package/dist/schemas/mcpFacet.cjs.map +1 -0
- package/dist/schemas/mcpFacet.d.cts +66 -0
- package/dist/schemas/mcpFacet.d.cts.map +1 -0
- package/dist/schemas/mcpFacet.d.mts +66 -0
- package/dist/schemas/mcpFacet.d.mts.map +1 -0
- package/dist/schemas/mcpFacet.mjs +17 -0
- package/dist/schemas/mcpFacet.mjs.map +1 -0
- package/dist/schemas/packageApi.cjs.map +1 -1
- package/dist/schemas/packageApi.d.cts +3 -1
- package/dist/schemas/packageApi.d.cts.map +1 -1
- package/dist/schemas/packageApi.d.mts +3 -1
- package/dist/schemas/packageApi.d.mts.map +1 -1
- package/dist/schemas/packageApi.mjs.map +1 -1
- package/dist/schemas/sessionApiContracts.cjs +3 -0
- package/dist/schemas/sessionApiContracts.cjs.map +1 -1
- package/dist/schemas/sessionApiContracts.d.cts.map +1 -1
- package/dist/schemas/sessionApiContracts.d.mts.map +1 -1
- package/dist/schemas/sessionApiContracts.mjs +3 -0
- package/dist/schemas/sessionApiContracts.mjs.map +1 -1
- package/dist/server/headlessProtocol.cjs +26 -0
- package/dist/server/headlessProtocol.cjs.map +1 -1
- package/dist/server/headlessProtocol.mjs +26 -0
- package/dist/server/headlessProtocol.mjs.map +1 -1
- package/dist/server/mcpBundleLoader.cjs +56 -0
- package/dist/server/mcpBundleLoader.cjs.map +1 -0
- package/dist/server/mcpBundleLoader.d.cts +27 -0
- package/dist/server/mcpBundleLoader.d.cts.map +1 -0
- package/dist/server/mcpBundleLoader.d.mts +27 -0
- package/dist/server/mcpBundleLoader.d.mts.map +1 -0
- package/dist/server/mcpBundleLoader.mjs +52 -0
- package/dist/server/mcpBundleLoader.mjs.map +1 -0
- package/dist/server/sessionMcpHandler.cjs +75 -16
- package/dist/server/sessionMcpHandler.cjs.map +1 -1
- package/dist/server/sessionMcpHandler.d.cts.map +1 -1
- package/dist/server/sessionMcpHandler.d.mts.map +1 -1
- package/dist/server/sessionMcpHandler.mjs +76 -17
- package/dist/server/sessionMcpHandler.mjs.map +1 -1
- package/dist/server/sessionMcpRoutes.cjs +14 -7
- package/dist/server/sessionMcpRoutes.cjs.map +1 -1
- package/dist/server/sessionMcpRoutes.mjs +14 -7
- package/dist/server/sessionMcpRoutes.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/services/webauthnPolicy/index.cjs +1 -1
- package/dist/services/webauthnPolicy/index.cjs.map +1 -1
- package/dist/services/webauthnPolicy/index.mjs +1 -1
- package/dist/services/webauthnPolicy/index.mjs.map +1 -1
- package/dist/services/workspaceRegistry/index.cjs +90 -0
- package/dist/services/workspaceRegistry/index.cjs.map +1 -0
- package/dist/services/workspaceRegistry/index.d.cts +18 -0
- package/dist/services/workspaceRegistry/index.d.cts.map +1 -0
- package/dist/services/workspaceRegistry/index.d.mts +18 -0
- package/dist/services/workspaceRegistry/index.d.mts.map +1 -0
- package/dist/services/workspaceRegistry/index.mjs +87 -0
- package/dist/services/workspaceRegistry/index.mjs.map +1 -0
- package/dist/sqlite-session-storage.cjs +1 -1
- package/dist/sqlite-session-storage.mjs +1 -1
- package/dist/sync-location.cjs +2 -2
- package/dist/sync-location.mjs +1 -1
- package/dist/sync-registration.cjs +19 -5
- package/dist/sync-registration.cjs.map +1 -1
- package/dist/sync-registration.d.cts +3 -0
- package/dist/sync-registration.d.cts.map +1 -1
- package/dist/sync-registration.d.mts +3 -0
- package/dist/sync-registration.d.mts.map +1 -1
- package/dist/sync-registration.mjs +18 -4
- package/dist/sync-registration.mjs.map +1 -1
- package/dist/systems/child/adapters/headlessChildSessionService.cjs +1 -1
- package/dist/systems/child/adapters/headlessChildSessionService.mjs +1 -1
- package/dist/systems/main/adapters/headlessHost.cjs +3 -1
- package/dist/systems/main/adapters/headlessHost.cjs.map +1 -1
- package/dist/systems/main/adapters/headlessHost.d.cts.map +1 -1
- package/dist/systems/main/adapters/headlessHost.d.mts.map +1 -1
- package/dist/systems/main/adapters/headlessHost.mjs +3 -1
- package/dist/systems/main/adapters/headlessHost.mjs.map +1 -1
- package/dist/systems/main/adapters/headlessSessionHost.cjs +248 -89
- 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 +247 -89
- package/dist/systems/main/adapters/headlessSessionHost.mjs.map +1 -1
- package/dist/terminal-pi-child-session-service.cjs +1 -1
- package/dist/terminal-pi-child-session-service.mjs +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 +5 -2
- package/dist/types/server/sessionToolSurface.d.cts.map +1 -1
- package/dist/types/server/sessionToolSurface.d.mts +5 -2
- package/dist/types/server/sessionToolSurface.d.mts.map +1 -1
- package/dist/v3-export.cjs +1 -1
- package/dist/v3-export.mjs +1 -1
- package/dist/web/types/webPlugin.d.cts +8 -0
- package/dist/web/types/webPlugin.d.cts.map +1 -1
- package/dist/web/types/webPlugin.d.mts +8 -0
- package/dist/web/types/webPlugin.d.mts.map +1 -1
- package/dist/web-compositions.cjs +2 -2
- package/dist/web-compositions.mjs +1 -1
- package/dist/web.d.cts +2 -2
- package/dist/web.d.mts +2 -2
- package/package.json +19 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"httpApiContracts.cjs","names":["Type","ITEM_ROUTE","API_BASE_PATH"],"sources":["../../src/schemas/httpApiContracts.ts"],"sourcesContent":["import { Type, type TSchema } from 'typebox';\n\nimport { API_BASE_PATH, ITEM_ROUTE } from '../constants/contextApi';\nimport type { DoomHttpContract } from './apiContracts';\n\nconst Text = Type.String();\nconst Optional = Type.Optional;\nconst Strings = Type.Array(Text);\nconst Flag = Type.Boolean();\nconst NumberValue = Type.Number();\nexport const ApiErrorSchema = Type.Object({ error: Text, hash: Optional(Text) });\nexport const ApiOkSchema = Type.Object({ ok: Type.Literal(true) });\nconst Json = Type.Unknown({ description: 'Value whose schema is supplied by the selected runtime contribution.' });\n\n/** Common JSON response construction; status and payload remain explicit at the declaration. */\nexport function jsonApiResponses(schema: object | boolean, status = 200): DoomHttpContract['responses'] {\n return {\n [status]: { description: 'Successful response', contentType: 'application/json', schema },\n '400': { description: 'Invalid request', schema: ApiErrorSchema },\n '401': { description: 'Authentication required', schema: ApiErrorSchema },\n '403': { description: 'Request is not authorized', schema: ApiErrorSchema },\n '404': { description: 'Resource or capability unavailable', schema: ApiErrorSchema },\n '409': { description: 'Conflicting state', schema: ApiErrorSchema },\n '422': { description: 'Invalid operation', schema: ApiErrorSchema },\n '500': { description: 'Host operation failed', schema: ApiErrorSchema },\n '502': { description: 'Provider failed', schema: ApiErrorSchema },\n '503': { description: 'Service unavailable', schema: ApiErrorSchema },\n };\n}\nexport const WebCompositionSchema = Type.Object({\n id: Text,\n scope: Type.Union([Type.Literal('global'), Type.Literal('workspace'), Type.Literal('session')]),\n revision: NumberValue,\n manifestUrl: Text,\n rawAssetBaseUrl: Text,\n verifiedAssetBaseUrl: Text,\n entryPath: Text,\n stylePaths: Strings,\n channels: Strings,\n});\nexport const SessionSummarySchema = Type.Object({\n id: Text,\n workspaceId: Optional(Text),\n webComposition: Optional(WebCompositionSchema),\n name: Text,\n cwd: Text,\n createdAt: Text,\n updatedAt: Text,\n phase: Type.Union([Type.Literal('idle'), Type.Literal('turn'), Type.Literal('compaction'), Type.Literal('retry')]),\n phaseSince: Text,\n attach: Type.Literal('attached'),\n pendingMessageCount: NumberValue,\n everPrompted: Flag,\n awaitingInput: Flag,\n lastSettledAt: Optional(Text),\n parentSessionId: Optional(Text),\n sessionProvenance: Optional(Text),\n /** Present and true for a recorded session the server has not reopened yet. */\n dormant: Optional(Flag),\n});\nexport const HubSnapshotFrameSchema = Type.Object({\n type: Type.Literal('sessions_snapshot'),\n sessions: Type.Array(SessionSummarySchema),\n});\nexport const HubUpsertFrameSchema = Type.Object({\n type: Type.Literal('session_upsert'),\n session: SessionSummarySchema,\n});\nexport const HubRemovedFrameSchema = Type.Object({ type: Type.Literal('session_removed'), sessionId: Text });\nconst Workspace = Type.Object({ id: Text, root: Text });\nconst SavedSession = Type.Object({\n id: Text,\n name: Optional(Text),\n firstMessage: Text,\n createdAt: Text,\n updatedAt: Text,\n messageCount: NumberValue,\n});\nconst query = (\n name: string,\n schema: TSchema = Text,\n required = false,\n): NonNullable<DoomHttpContract['parameters']>[number] => ({ name, in: 'query', required, schema });\nconst body = (schema: TSchema): NonNullable<DoomHttpContract['body']> => ({\n contentType: 'application/json',\n required: true,\n schema,\n});\nconst host = (\n id: string,\n path: string,\n method: DoomHttpContract['method'],\n result: TSchema,\n extra: Partial<DoomHttpContract> = {},\n): DoomHttpContract => ({\n id,\n path,\n method,\n scope: 'global',\n authentication: 'owner',\n description: id,\n responses: jsonApiResponses(result),\n ...extra,\n});\nconst Binary = Type.String({ contentEncoding: 'binary' });\nexport const headlessHttpContracts: DoomHttpContract[] = [\n host(\n 'health',\n '/api/health',\n 'GET',\n Type.Object({\n ok: Type.Literal(true),\n role: Type.Literal('hub'),\n protocol: Type.Literal(1),\n sessions: NumberValue,\n }),\n { authentication: 'none' },\n ),\n host('telemetry.browser', '/api/telemetry/browser', 'POST', ApiOkSchema, {\n body: body(\n Type.Object({\n v: Type.Literal(1),\n events: Type.Array(\n Type.Object({\n name: Type.String({ pattern: '^web\\\\.browser\\\\.[a-z_]{1,40}$' }),\n duration_ms: Optional(NumberValue),\n count: Optional(NumberValue),\n }),\n { maxItems: 10 },\n ),\n }),\n ),\n }),\n host(\n 'compositions',\n '/api/compositions',\n 'GET',\n Type.Object({\n global: Optional(WebCompositionSchema),\n publicKey: Optional(Text),\n shell: Optional(Type.Object({ publicKey: Text, revision: NumberValue })),\n workspaces: Type.Array(Type.Object({ id: Text, root: Text, webComposition: Optional(WebCompositionSchema) })),\n }),\n ),\n host('directories', '/api/directories', 'GET', Type.Object({ directories: Strings }), { parameters: [query('q')] }),\n host(\n 'sessions.list',\n '/api/workspaces/{workspaceId}/sessions',\n 'GET',\n Type.Object({ sessions: Type.Array(SessionSummarySchema) }),\n ),\n host('sessions.create', '/api/workspaces/{workspaceId}/sessions', 'POST', Type.Object({ sessionId: Text }), {\n body: body(Type.Object({ name: Optional(Text) })),\n responses: jsonApiResponses(Type.Object({ sessionId: Text }), 201),\n }),\n host('sessions.get', '/api/workspaces/{workspaceId}/sessions/{sessionId}', 'GET', SessionSummarySchema),\n host('sessions.delete', '/api/workspaces/{workspaceId}/sessions/{sessionId}', 'DELETE', ApiOkSchema),\n host(\n 'sessions.history',\n '/api/workspaces/{workspaceId}/sessions/{sessionId}/history',\n 'GET',\n Type.Object({ sessions: Type.Array(SavedSession) }),\n { availability: 'Host provides sessionHistory' },\n ),\n host('sessions.restart', '/api/workspaces/{workspaceId}/sessions/{sessionId}/restart', 'POST', ApiOkSchema, {\n availability: 'Host provides restartSession',\n }),\n host('sessions.revive', '/api/workspaces/{workspaceId}/sessions/{sessionId}/revive', 'POST', ApiOkSchema, {\n availability: 'Host provides reviveSession',\n }),\n host(\n 'sessions.resume',\n '/api/workspaces/{workspaceId}/sessions/{sessionId}/resume',\n 'POST',\n Type.Object({ sessionId: Text }),\n {\n availability: 'Host provides resumeSession',\n body: body(Type.Object({ targetSessionId: Type.String({ pattern: '^[A-Za-z0-9_-]+$' }) })),\n },\n ),\n host('sessions.file', '/api/workspaces/{workspaceId}/sessions/{sessionId}/file', 'GET', Binary, {\n parameters: [query('path', Text, true)],\n responses: {\n ...jsonApiResponses(Binary),\n '200': { description: 'File bytes, MIME type follows the file extension', contentType: '*/*', schema: Binary },\n },\n }),\n host(\n 'sessions.channels',\n '/api/workspaces/{workspaceId}/sessions/{sessionId}/channels',\n 'GET',\n Type.Object({ channels: Type.Array(Type.Object({ type: Text, sessionId: Text, payload: Json })) }),\n ),\n host(\n 'sessions.channel.send',\n '/api/workspaces/{workspaceId}/sessions/{sessionId}/channel/{frameType}',\n 'POST',\n ApiOkSchema,\n {\n body: body(Json),\n responses: jsonApiResponses(ApiOkSchema, 202),\n description: 'Deliver a payload to the selected channel contract identified by frameType.',\n },\n ),\n host('workspaces.list', '/api/workspaces', 'GET', Type.Object({ workspaces: Type.Array(Workspace) })),\n host('workspaces.admit', '/api/workspaces', 'POST', Type.Object({ workspace: Workspace }), {\n body: body(Type.Object({ root: Text })),\n responses: jsonApiResponses(Type.Object({ workspace: Workspace }), 201),\n }),\n host('workspaces.get', '/api/workspaces/{workspaceId}', 'GET', Type.Object({ workspace: Workspace })),\n host('workspaces.remove', '/api/workspaces/{workspaceId}', 'DELETE', ApiOkSchema),\n host('events', '/api/events', 'GET', Text, {\n responses: {\n '200': {\n description:\n 'SSE sessions_snapshot, session_upsert, session_removed and selected channel frames. Selected extension channel payloads are defined by the corresponding AsyncAPI channel operations.',\n events: {\n sessions_snapshot: HubSnapshotFrameSchema,\n session_upsert: HubUpsertFrameSchema,\n session_removed: HubRemovedFrameSchema,\n },\n contentType: 'text/event-stream',\n schema: Text,\n },\n '401': { description: 'Authentication required', schema: ApiErrorSchema },\n },\n }),\n];\nconst AuthType = Type.Union([Type.Literal('api_key'), Type.Literal('oauth')]);\nconst Provider = Type.Object({\n id: Text,\n name: Text,\n methods: Type.Array(Type.Object({ type: AuthType, label: Text })),\n authenticated: Optional(Type.Object({ type: AuthType, source: Optional(Text) })),\n});\nconst LoginEvent = Type.Union([\n Type.Object({\n type: Type.Literal('info'),\n message: Text,\n links: Optional(Type.Array(Type.Object({ url: Text, label: Optional(Text) }))),\n }),\n Type.Object({ type: Type.Literal('auth_url'), url: Text, instructions: Optional(Text) }),\n Type.Object({\n type: Type.Literal('device_code'),\n userCode: Text,\n verificationUri: Text,\n intervalSeconds: Optional(NumberValue),\n expiresInSeconds: Optional(NumberValue),\n }),\n Type.Object({ type: Type.Literal('progress'), message: Text }),\n]);\nexport const LoginFlowSchema = Type.Object({\n id: Text,\n providerId: Text,\n providerName: Text,\n type: AuthType,\n status: Type.Union([\n Type.Literal('running'),\n Type.Literal('succeeded'),\n Type.Literal('failed'),\n Type.Literal('cancelled'),\n ]),\n events: Type.Array(LoginEvent),\n prompt: Optional(\n Type.Object({\n id: Text,\n type: Type.Union([\n Type.Literal('text'),\n Type.Literal('secret'),\n Type.Literal('select'),\n Type.Literal('manual_code'),\n ]),\n message: Text,\n placeholder: Optional(Text),\n options: Optional(Type.Array(Type.Object({ id: Text, label: Text, description: Optional(Text) }))),\n }),\n ),\n remote: Optional(Flag),\n error: Optional(Text),\n});\nconst Flow = Type.Object({ flow: LoginFlowSchema });\nexport const machineHttpContracts: DoomHttpContract[] = [\n host('providers.list', '/providers', 'GET', Type.Object({ providers: Type.Array(Provider) })),\n host(\n 'models.list',\n '/models',\n 'GET',\n Type.Object({ models: Type.Array(Type.Object({ value: Text, label: Text, group: Text })) }),\n ),\n host('providers.logout', '/providers/{providerId}', 'DELETE', ApiOkSchema),\n host('logins.create', '/logins', 'POST', Flow, {\n body: body(Type.Object({ providerId: Text, type: AuthType })),\n responses: jsonApiResponses(Flow, 201),\n }),\n host('logins.get', '/logins/{flowId}', 'GET', Flow),\n host('logins.cancel', '/logins/{flowId}', 'DELETE', Flow),\n host('logins.answer', '/logins/{flowId}/answer', 'POST', Flow, {\n body: body(Type.Object({ promptId: Text, value: Text })),\n }),\n].map((route) => ({ ...route, basePath: 'doompi' }));\nconst Source = Type.Union([\n Type.Literal('extension'),\n Type.Literal('mcp'),\n Type.Literal('plugin'),\n Type.Literal('core'),\n]);\nconst Detail = Type.Union([\n Type.Object({\n itemKind: Type.Literal('tool'),\n name: Text,\n owner: Text,\n source: Source,\n active: Flag,\n tokens: Type.Object({ schemaTokens: NumberValue, promptTokens: NumberValue, totalTokens: NumberValue }),\n description: Optional(Text),\n promptSnippet: Optional(Text),\n promptGuidelines: Optional(Strings),\n parameters: Optional(Json),\n }),\n Type.Object({\n itemKind: Type.Literal('skill'),\n name: Text,\n owner: Text,\n source: Source,\n active: Type.Literal(true),\n tokens: NumberValue,\n description: Text,\n filePath: Optional(Text),\n modelInvocable: Flag,\n }),\n Type.Object({\n itemKind: Type.Literal('prompt'),\n name: Type.Literal('system'),\n tokens: NumberValue,\n stage: Type.Union([Type.Literal('base'), Type.Literal('effective')]),\n text: Text,\n }),\n]);\nexport const sessionHttpContracts: DoomHttpContract[] = [\n {\n ...host('context.item', ITEM_ROUTE, 'GET', Type.Object({ revision: NumberValue, item: Detail }), {\n parameters: [\n query('kind', Type.Union([Type.Literal('tool'), Type.Literal('skill'), Type.Literal('prompt')]), true),\n query('name', Text, true),\n ],\n }),\n scope: 'session',\n basePath: API_BASE_PATH,\n },\n {\n ...host('files.complete', '/', 'GET', Type.Object({ files: Strings }), {\n parameters: [query('q', Type.String({ maxLength: 256 }))],\n }),\n scope: 'session',\n basePath: 'files',\n },\n];\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"httpApiContracts.cjs","names":["Type","ITEM_ROUTE","API_BASE_PATH"],"sources":["../../src/schemas/httpApiContracts.ts"],"sourcesContent":["import { Type, type TSchema } from 'typebox';\n\nimport { API_BASE_PATH, ITEM_ROUTE } from '../constants/contextApi';\nimport type { DoomHttpContract } from './apiContracts';\n\nconst Text = Type.String();\nconst Optional = Type.Optional;\nconst Strings = Type.Array(Text);\nconst Flag = Type.Boolean();\nconst NumberValue = Type.Number();\nexport const ApiErrorSchema = Type.Object({ error: Text, hash: Optional(Text) });\nexport const ApiOkSchema = Type.Object({ ok: Type.Literal(true) });\nconst Json = Type.Unknown({ description: 'Value whose schema is supplied by the selected runtime contribution.' });\n\n/** Common JSON response construction; status and payload remain explicit at the declaration. */\nexport function jsonApiResponses(schema: object | boolean, status = 200): DoomHttpContract['responses'] {\n return {\n [status]: { description: 'Successful response', contentType: 'application/json', schema },\n '400': { description: 'Invalid request', schema: ApiErrorSchema },\n '401': { description: 'Authentication required', schema: ApiErrorSchema },\n '403': { description: 'Request is not authorized', schema: ApiErrorSchema },\n '404': { description: 'Resource or capability unavailable', schema: ApiErrorSchema },\n '409': { description: 'Conflicting state', schema: ApiErrorSchema },\n '422': { description: 'Invalid operation', schema: ApiErrorSchema },\n '500': { description: 'Host operation failed', schema: ApiErrorSchema },\n '502': { description: 'Provider failed', schema: ApiErrorSchema },\n '503': { description: 'Service unavailable', schema: ApiErrorSchema },\n };\n}\nexport const WebCompositionSchema = Type.Object({\n id: Text,\n scope: Type.Union([Type.Literal('global'), Type.Literal('workspace'), Type.Literal('session')]),\n revision: NumberValue,\n manifestUrl: Text,\n rawAssetBaseUrl: Text,\n verifiedAssetBaseUrl: Text,\n entryPath: Text,\n stylePaths: Strings,\n channels: Strings,\n});\nexport const SessionSummarySchema = Type.Object({\n id: Text,\n workspaceId: Optional(Text),\n webComposition: Optional(WebCompositionSchema),\n name: Text,\n cwd: Text,\n createdAt: Text,\n updatedAt: Text,\n phase: Type.Union([Type.Literal('idle'), Type.Literal('turn'), Type.Literal('compaction'), Type.Literal('retry')]),\n phaseSince: Text,\n attach: Type.Literal('attached'),\n pendingMessageCount: NumberValue,\n everPrompted: Flag,\n awaitingInput: Flag,\n lastSettledAt: Optional(Text),\n parentSessionId: Optional(Text),\n sessionProvenance: Optional(Text),\n /** Present and true for a recorded session the server has not reopened yet. */\n dormant: Optional(Flag),\n});\nexport const HubSnapshotFrameSchema = Type.Object({\n type: Type.Literal('sessions_snapshot'),\n sessions: Type.Array(SessionSummarySchema),\n});\nexport const HubUpsertFrameSchema = Type.Object({\n type: Type.Literal('session_upsert'),\n session: SessionSummarySchema,\n});\nexport const HubRemovedFrameSchema = Type.Object({ type: Type.Literal('session_removed'), sessionId: Text });\nconst Workspace = Type.Object({ id: Text, root: Text, available: Optional(Flag) });\nexport const WorkspaceSnapshotFrameSchema = Type.Object({\n type: Type.Literal('workspaces_snapshot'),\n workspaces: Type.Array(Workspace),\n});\nexport const WorkspaceUpsertFrameSchema = Type.Object({\n type: Type.Literal('workspace_upsert'),\n workspace: Workspace,\n});\nexport const WorkspaceRemovedFrameSchema = Type.Object({\n type: Type.Literal('workspace_removed'),\n workspaceId: Text,\n});\nconst SavedSession = Type.Object({\n id: Text,\n name: Optional(Text),\n firstMessage: Text,\n createdAt: Text,\n updatedAt: Text,\n messageCount: NumberValue,\n});\nconst query = (\n name: string,\n schema: TSchema = Text,\n required = false,\n): NonNullable<DoomHttpContract['parameters']>[number] => ({ name, in: 'query', required, schema });\nconst body = (schema: TSchema): NonNullable<DoomHttpContract['body']> => ({\n contentType: 'application/json',\n required: true,\n schema,\n});\nconst host = (\n id: string,\n path: string,\n method: DoomHttpContract['method'],\n result: TSchema,\n extra: Partial<DoomHttpContract> = {},\n): DoomHttpContract => ({\n id,\n path,\n method,\n scope: 'global',\n authentication: 'owner',\n description: id,\n responses: jsonApiResponses(result),\n ...extra,\n});\nconst Binary = Type.String({ contentEncoding: 'binary' });\nexport const headlessHttpContracts: DoomHttpContract[] = [\n host(\n 'health',\n '/api/health',\n 'GET',\n Type.Object({\n ok: Type.Literal(true),\n role: Type.Literal('hub'),\n protocol: Type.Literal(1),\n sessions: NumberValue,\n }),\n { authentication: 'none' },\n ),\n host('telemetry.browser', '/api/telemetry/browser', 'POST', ApiOkSchema, {\n body: body(\n Type.Object({\n v: Type.Literal(1),\n events: Type.Array(\n Type.Object({\n name: Type.String({ pattern: '^web\\\\.browser\\\\.[a-z_]{1,40}$' }),\n duration_ms: Optional(NumberValue),\n count: Optional(NumberValue),\n }),\n { maxItems: 10 },\n ),\n }),\n ),\n }),\n host(\n 'compositions',\n '/api/compositions',\n 'GET',\n Type.Object({\n global: Optional(WebCompositionSchema),\n publicKey: Optional(Text),\n shell: Optional(Type.Object({ publicKey: Text, revision: NumberValue })),\n workspaces: Type.Array(Type.Object({ id: Text, root: Text, webComposition: Optional(WebCompositionSchema) })),\n }),\n ),\n host('directories', '/api/directories', 'GET', Type.Object({ directories: Strings }), { parameters: [query('q')] }),\n host(\n 'sessions.list',\n '/api/workspaces/{workspaceId}/sessions',\n 'GET',\n Type.Object({ sessions: Type.Array(SessionSummarySchema) }),\n ),\n host('sessions.create', '/api/workspaces/{workspaceId}/sessions', 'POST', Type.Object({ sessionId: Text }), {\n body: body(Type.Object({ name: Optional(Text) })),\n responses: jsonApiResponses(Type.Object({ sessionId: Text }), 201),\n }),\n host('sessions.get', '/api/workspaces/{workspaceId}/sessions/{sessionId}', 'GET', SessionSummarySchema),\n host('sessions.delete', '/api/workspaces/{workspaceId}/sessions/{sessionId}', 'DELETE', ApiOkSchema),\n host(\n 'sessions.history',\n '/api/workspaces/{workspaceId}/sessions/{sessionId}/history',\n 'GET',\n Type.Object({ sessions: Type.Array(SavedSession) }),\n { availability: 'Host provides sessionHistory' },\n ),\n host('sessions.restart', '/api/workspaces/{workspaceId}/sessions/{sessionId}/restart', 'POST', ApiOkSchema, {\n availability: 'Host provides restartSession',\n }),\n host('sessions.revive', '/api/workspaces/{workspaceId}/sessions/{sessionId}/revive', 'POST', ApiOkSchema, {\n availability: 'Host provides reviveSession',\n }),\n host(\n 'sessions.resume',\n '/api/workspaces/{workspaceId}/sessions/{sessionId}/resume',\n 'POST',\n Type.Object({ sessionId: Text }),\n {\n availability: 'Host provides resumeSession',\n body: body(Type.Object({ targetSessionId: Type.String({ pattern: '^[A-Za-z0-9_-]+$' }) })),\n },\n ),\n host('sessions.file', '/api/workspaces/{workspaceId}/sessions/{sessionId}/file', 'GET', Binary, {\n parameters: [query('path', Text, true)],\n responses: {\n ...jsonApiResponses(Binary),\n '200': { description: 'File bytes, MIME type follows the file extension', contentType: '*/*', schema: Binary },\n },\n }),\n host(\n 'sessions.channels',\n '/api/workspaces/{workspaceId}/sessions/{sessionId}/channels',\n 'GET',\n Type.Object({ channels: Type.Array(Type.Object({ type: Text, sessionId: Text, payload: Json })) }),\n ),\n host(\n 'sessions.channel.send',\n '/api/workspaces/{workspaceId}/sessions/{sessionId}/channel/{frameType}',\n 'POST',\n ApiOkSchema,\n {\n body: body(Json),\n responses: jsonApiResponses(ApiOkSchema, 202),\n description: 'Deliver a payload to the selected channel contract identified by frameType.',\n },\n ),\n host('workspaces.list', '/api/workspaces', 'GET', Type.Object({ workspaces: Type.Array(Workspace) })),\n host('workspaces.admit', '/api/workspaces', 'POST', Type.Object({ workspace: Workspace }), {\n body: body(Type.Object({ root: Text })),\n responses: jsonApiResponses(Type.Object({ workspace: Workspace }), 201),\n }),\n host('workspaces.get', '/api/workspaces/{workspaceId}', 'GET', Type.Object({ workspace: Workspace })),\n host(\n 'workspaces.history',\n '/api/workspaces/{workspaceId}/history',\n 'GET',\n Type.Object({ sessions: Type.Array(SavedSession) }),\n {\n availability: 'Host provides workspaceHistory',\n },\n ),\n host('workspaces.resume', '/api/workspaces/{workspaceId}/resume', 'POST', Type.Object({ sessionId: Text }), {\n availability: 'Host provides resumeWorkspaceSession',\n body: body(Type.Object({ targetSessionId: Type.String({ pattern: '^[A-Za-z0-9_-]+$' }) })),\n }),\n host('workspaces.remove', '/api/workspaces/{workspaceId}', 'DELETE', ApiOkSchema),\n host('events', '/api/events', 'GET', Text, {\n responses: {\n '200': {\n description:\n 'SSE session and workspace snapshots, membership changes, and selected channel frames. Selected extension channel payloads are defined by the corresponding AsyncAPI channel operations.',\n events: {\n sessions_snapshot: HubSnapshotFrameSchema,\n session_upsert: HubUpsertFrameSchema,\n session_removed: HubRemovedFrameSchema,\n workspaces_snapshot: WorkspaceSnapshotFrameSchema,\n workspace_upsert: WorkspaceUpsertFrameSchema,\n workspace_removed: WorkspaceRemovedFrameSchema,\n },\n contentType: 'text/event-stream',\n schema: Text,\n },\n '401': { description: 'Authentication required', schema: ApiErrorSchema },\n },\n }),\n];\nconst AuthType = Type.Union([Type.Literal('api_key'), Type.Literal('oauth')]);\nconst Provider = Type.Object({\n id: Text,\n name: Text,\n methods: Type.Array(Type.Object({ type: AuthType, label: Text })),\n authenticated: Optional(Type.Object({ type: AuthType, source: Optional(Text) })),\n});\nconst LoginEvent = Type.Union([\n Type.Object({\n type: Type.Literal('info'),\n message: Text,\n links: Optional(Type.Array(Type.Object({ url: Text, label: Optional(Text) }))),\n }),\n Type.Object({ type: Type.Literal('auth_url'), url: Text, instructions: Optional(Text) }),\n Type.Object({\n type: Type.Literal('device_code'),\n userCode: Text,\n verificationUri: Text,\n intervalSeconds: Optional(NumberValue),\n expiresInSeconds: Optional(NumberValue),\n }),\n Type.Object({ type: Type.Literal('progress'), message: Text }),\n]);\nexport const LoginFlowSchema = Type.Object({\n id: Text,\n providerId: Text,\n providerName: Text,\n type: AuthType,\n status: Type.Union([\n Type.Literal('running'),\n Type.Literal('succeeded'),\n Type.Literal('failed'),\n Type.Literal('cancelled'),\n ]),\n events: Type.Array(LoginEvent),\n prompt: Optional(\n Type.Object({\n id: Text,\n type: Type.Union([\n Type.Literal('text'),\n Type.Literal('secret'),\n Type.Literal('select'),\n Type.Literal('manual_code'),\n ]),\n message: Text,\n placeholder: Optional(Text),\n options: Optional(Type.Array(Type.Object({ id: Text, label: Text, description: Optional(Text) }))),\n }),\n ),\n remote: Optional(Flag),\n error: Optional(Text),\n});\nconst Flow = Type.Object({ flow: LoginFlowSchema });\nexport const machineHttpContracts: DoomHttpContract[] = [\n host('providers.list', '/providers', 'GET', Type.Object({ providers: Type.Array(Provider) })),\n host(\n 'models.list',\n '/models',\n 'GET',\n Type.Object({ models: Type.Array(Type.Object({ value: Text, label: Text, group: Text })) }),\n ),\n host('providers.logout', '/providers/{providerId}', 'DELETE', ApiOkSchema),\n host('logins.create', '/logins', 'POST', Flow, {\n body: body(Type.Object({ providerId: Text, type: AuthType })),\n responses: jsonApiResponses(Flow, 201),\n }),\n host('logins.get', '/logins/{flowId}', 'GET', Flow),\n host('logins.cancel', '/logins/{flowId}', 'DELETE', Flow),\n host('logins.answer', '/logins/{flowId}/answer', 'POST', Flow, {\n body: body(Type.Object({ promptId: Text, value: Text })),\n }),\n].map((route) => ({ ...route, basePath: 'doompi' }));\nconst Source = Type.Union([\n Type.Literal('extension'),\n Type.Literal('mcp'),\n Type.Literal('plugin'),\n Type.Literal('core'),\n]);\nconst Detail = Type.Union([\n Type.Object({\n itemKind: Type.Literal('tool'),\n name: Text,\n owner: Text,\n source: Source,\n active: Flag,\n tokens: Type.Object({ schemaTokens: NumberValue, promptTokens: NumberValue, totalTokens: NumberValue }),\n description: Optional(Text),\n promptSnippet: Optional(Text),\n promptGuidelines: Optional(Strings),\n parameters: Optional(Json),\n }),\n Type.Object({\n itemKind: Type.Literal('skill'),\n name: Text,\n owner: Text,\n source: Source,\n active: Type.Literal(true),\n tokens: NumberValue,\n description: Text,\n filePath: Optional(Text),\n modelInvocable: Flag,\n }),\n Type.Object({\n itemKind: Type.Literal('prompt'),\n name: Type.Literal('system'),\n tokens: NumberValue,\n stage: Type.Union([Type.Literal('base'), Type.Literal('effective')]),\n text: Text,\n }),\n]);\nexport const sessionHttpContracts: DoomHttpContract[] = [\n {\n ...host('context.item', ITEM_ROUTE, 'GET', Type.Object({ revision: NumberValue, item: Detail }), {\n parameters: [\n query('kind', Type.Union([Type.Literal('tool'), Type.Literal('skill'), Type.Literal('prompt')]), true),\n query('name', Text, true),\n ],\n }),\n scope: 'session',\n basePath: API_BASE_PATH,\n },\n {\n ...host('files.complete', '/', 'GET', Type.Object({ files: Strings }), {\n parameters: [query('q', Type.String({ maxLength: 256 }))],\n }),\n scope: 'session',\n basePath: 'files',\n },\n];\n"],"mappings":"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"}
|
|
@@ -112,7 +112,20 @@ const HubRemovedFrameSchema = Type.Object({
|
|
|
112
112
|
});
|
|
113
113
|
const Workspace = Type.Object({
|
|
114
114
|
id: Text,
|
|
115
|
-
root: Text
|
|
115
|
+
root: Text,
|
|
116
|
+
available: Optional(Flag)
|
|
117
|
+
});
|
|
118
|
+
const WorkspaceSnapshotFrameSchema = Type.Object({
|
|
119
|
+
type: Type.Literal("workspaces_snapshot"),
|
|
120
|
+
workspaces: Type.Array(Workspace)
|
|
121
|
+
});
|
|
122
|
+
const WorkspaceUpsertFrameSchema = Type.Object({
|
|
123
|
+
type: Type.Literal("workspace_upsert"),
|
|
124
|
+
workspace: Workspace
|
|
125
|
+
});
|
|
126
|
+
const WorkspaceRemovedFrameSchema = Type.Object({
|
|
127
|
+
type: Type.Literal("workspace_removed"),
|
|
128
|
+
workspaceId: Text
|
|
116
129
|
});
|
|
117
130
|
const SavedSession = Type.Object({
|
|
118
131
|
id: Text,
|
|
@@ -214,14 +227,22 @@ const headlessHttpContracts = [
|
|
|
214
227
|
responses: jsonApiResponses(Type.Object({ workspace: Workspace }), 201)
|
|
215
228
|
}),
|
|
216
229
|
host("workspaces.get", "/api/workspaces/{workspaceId}", "GET", Type.Object({ workspace: Workspace })),
|
|
230
|
+
host("workspaces.history", "/api/workspaces/{workspaceId}/history", "GET", Type.Object({ sessions: Type.Array(SavedSession) }), { availability: "Host provides workspaceHistory" }),
|
|
231
|
+
host("workspaces.resume", "/api/workspaces/{workspaceId}/resume", "POST", Type.Object({ sessionId: Text }), {
|
|
232
|
+
availability: "Host provides resumeWorkspaceSession",
|
|
233
|
+
body: body(Type.Object({ targetSessionId: Type.String({ pattern: "^[A-Za-z0-9_-]+$" }) }))
|
|
234
|
+
}),
|
|
217
235
|
host("workspaces.remove", "/api/workspaces/{workspaceId}", "DELETE", ApiOkSchema),
|
|
218
236
|
host("events", "/api/events", "GET", Text, { responses: {
|
|
219
237
|
"200": {
|
|
220
|
-
description: "SSE
|
|
238
|
+
description: "SSE session and workspace snapshots, membership changes, and selected channel frames. Selected extension channel payloads are defined by the corresponding AsyncAPI channel operations.",
|
|
221
239
|
events: {
|
|
222
240
|
sessions_snapshot: HubSnapshotFrameSchema,
|
|
223
241
|
session_upsert: HubUpsertFrameSchema,
|
|
224
|
-
session_removed: HubRemovedFrameSchema
|
|
242
|
+
session_removed: HubRemovedFrameSchema,
|
|
243
|
+
workspaces_snapshot: WorkspaceSnapshotFrameSchema,
|
|
244
|
+
workspace_upsert: WorkspaceUpsertFrameSchema,
|
|
245
|
+
workspace_removed: WorkspaceRemovedFrameSchema
|
|
225
246
|
},
|
|
226
247
|
contentType: "text/event-stream",
|
|
227
248
|
schema: Text
|
|
@@ -387,6 +408,6 @@ const sessionHttpContracts = [{
|
|
|
387
408
|
basePath: "files"
|
|
388
409
|
}];
|
|
389
410
|
//#endregion
|
|
390
|
-
export { ApiErrorSchema, ApiOkSchema, HubRemovedFrameSchema, HubSnapshotFrameSchema, HubUpsertFrameSchema, LoginFlowSchema, SessionSummarySchema, WebCompositionSchema, headlessHttpContracts, jsonApiResponses, machineHttpContracts, sessionHttpContracts };
|
|
411
|
+
export { ApiErrorSchema, ApiOkSchema, HubRemovedFrameSchema, HubSnapshotFrameSchema, HubUpsertFrameSchema, LoginFlowSchema, SessionSummarySchema, WebCompositionSchema, WorkspaceRemovedFrameSchema, WorkspaceSnapshotFrameSchema, WorkspaceUpsertFrameSchema, headlessHttpContracts, jsonApiResponses, machineHttpContracts, sessionHttpContracts };
|
|
391
412
|
|
|
392
413
|
//# sourceMappingURL=httpApiContracts.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"httpApiContracts.mjs","names":[],"sources":["../../src/schemas/httpApiContracts.ts"],"sourcesContent":["import { Type, type TSchema } from 'typebox';\n\nimport { API_BASE_PATH, ITEM_ROUTE } from '../constants/contextApi';\nimport type { DoomHttpContract } from './apiContracts';\n\nconst Text = Type.String();\nconst Optional = Type.Optional;\nconst Strings = Type.Array(Text);\nconst Flag = Type.Boolean();\nconst NumberValue = Type.Number();\nexport const ApiErrorSchema = Type.Object({ error: Text, hash: Optional(Text) });\nexport const ApiOkSchema = Type.Object({ ok: Type.Literal(true) });\nconst Json = Type.Unknown({ description: 'Value whose schema is supplied by the selected runtime contribution.' });\n\n/** Common JSON response construction; status and payload remain explicit at the declaration. */\nexport function jsonApiResponses(schema: object | boolean, status = 200): DoomHttpContract['responses'] {\n return {\n [status]: { description: 'Successful response', contentType: 'application/json', schema },\n '400': { description: 'Invalid request', schema: ApiErrorSchema },\n '401': { description: 'Authentication required', schema: ApiErrorSchema },\n '403': { description: 'Request is not authorized', schema: ApiErrorSchema },\n '404': { description: 'Resource or capability unavailable', schema: ApiErrorSchema },\n '409': { description: 'Conflicting state', schema: ApiErrorSchema },\n '422': { description: 'Invalid operation', schema: ApiErrorSchema },\n '500': { description: 'Host operation failed', schema: ApiErrorSchema },\n '502': { description: 'Provider failed', schema: ApiErrorSchema },\n '503': { description: 'Service unavailable', schema: ApiErrorSchema },\n };\n}\nexport const WebCompositionSchema = Type.Object({\n id: Text,\n scope: Type.Union([Type.Literal('global'), Type.Literal('workspace'), Type.Literal('session')]),\n revision: NumberValue,\n manifestUrl: Text,\n rawAssetBaseUrl: Text,\n verifiedAssetBaseUrl: Text,\n entryPath: Text,\n stylePaths: Strings,\n channels: Strings,\n});\nexport const SessionSummarySchema = Type.Object({\n id: Text,\n workspaceId: Optional(Text),\n webComposition: Optional(WebCompositionSchema),\n name: Text,\n cwd: Text,\n createdAt: Text,\n updatedAt: Text,\n phase: Type.Union([Type.Literal('idle'), Type.Literal('turn'), Type.Literal('compaction'), Type.Literal('retry')]),\n phaseSince: Text,\n attach: Type.Literal('attached'),\n pendingMessageCount: NumberValue,\n everPrompted: Flag,\n awaitingInput: Flag,\n lastSettledAt: Optional(Text),\n parentSessionId: Optional(Text),\n sessionProvenance: Optional(Text),\n /** Present and true for a recorded session the server has not reopened yet. */\n dormant: Optional(Flag),\n});\nexport const HubSnapshotFrameSchema = Type.Object({\n type: Type.Literal('sessions_snapshot'),\n sessions: Type.Array(SessionSummarySchema),\n});\nexport const HubUpsertFrameSchema = Type.Object({\n type: Type.Literal('session_upsert'),\n session: SessionSummarySchema,\n});\nexport const HubRemovedFrameSchema = Type.Object({ type: Type.Literal('session_removed'), sessionId: Text });\nconst Workspace = Type.Object({ id: Text, root: Text });\nconst SavedSession = Type.Object({\n id: Text,\n name: Optional(Text),\n firstMessage: Text,\n createdAt: Text,\n updatedAt: Text,\n messageCount: NumberValue,\n});\nconst query = (\n name: string,\n schema: TSchema = Text,\n required = false,\n): NonNullable<DoomHttpContract['parameters']>[number] => ({ name, in: 'query', required, schema });\nconst body = (schema: TSchema): NonNullable<DoomHttpContract['body']> => ({\n contentType: 'application/json',\n required: true,\n schema,\n});\nconst host = (\n id: string,\n path: string,\n method: DoomHttpContract['method'],\n result: TSchema,\n extra: Partial<DoomHttpContract> = {},\n): DoomHttpContract => ({\n id,\n path,\n method,\n scope: 'global',\n authentication: 'owner',\n description: id,\n responses: jsonApiResponses(result),\n ...extra,\n});\nconst Binary = Type.String({ contentEncoding: 'binary' });\nexport const headlessHttpContracts: DoomHttpContract[] = [\n host(\n 'health',\n '/api/health',\n 'GET',\n Type.Object({\n ok: Type.Literal(true),\n role: Type.Literal('hub'),\n protocol: Type.Literal(1),\n sessions: NumberValue,\n }),\n { authentication: 'none' },\n ),\n host('telemetry.browser', '/api/telemetry/browser', 'POST', ApiOkSchema, {\n body: body(\n Type.Object({\n v: Type.Literal(1),\n events: Type.Array(\n Type.Object({\n name: Type.String({ pattern: '^web\\\\.browser\\\\.[a-z_]{1,40}$' }),\n duration_ms: Optional(NumberValue),\n count: Optional(NumberValue),\n }),\n { maxItems: 10 },\n ),\n }),\n ),\n }),\n host(\n 'compositions',\n '/api/compositions',\n 'GET',\n Type.Object({\n global: Optional(WebCompositionSchema),\n publicKey: Optional(Text),\n shell: Optional(Type.Object({ publicKey: Text, revision: NumberValue })),\n workspaces: Type.Array(Type.Object({ id: Text, root: Text, webComposition: Optional(WebCompositionSchema) })),\n }),\n ),\n host('directories', '/api/directories', 'GET', Type.Object({ directories: Strings }), { parameters: [query('q')] }),\n host(\n 'sessions.list',\n '/api/workspaces/{workspaceId}/sessions',\n 'GET',\n Type.Object({ sessions: Type.Array(SessionSummarySchema) }),\n ),\n host('sessions.create', '/api/workspaces/{workspaceId}/sessions', 'POST', Type.Object({ sessionId: Text }), {\n body: body(Type.Object({ name: Optional(Text) })),\n responses: jsonApiResponses(Type.Object({ sessionId: Text }), 201),\n }),\n host('sessions.get', '/api/workspaces/{workspaceId}/sessions/{sessionId}', 'GET', SessionSummarySchema),\n host('sessions.delete', '/api/workspaces/{workspaceId}/sessions/{sessionId}', 'DELETE', ApiOkSchema),\n host(\n 'sessions.history',\n '/api/workspaces/{workspaceId}/sessions/{sessionId}/history',\n 'GET',\n Type.Object({ sessions: Type.Array(SavedSession) }),\n { availability: 'Host provides sessionHistory' },\n ),\n host('sessions.restart', '/api/workspaces/{workspaceId}/sessions/{sessionId}/restart', 'POST', ApiOkSchema, {\n availability: 'Host provides restartSession',\n }),\n host('sessions.revive', '/api/workspaces/{workspaceId}/sessions/{sessionId}/revive', 'POST', ApiOkSchema, {\n availability: 'Host provides reviveSession',\n }),\n host(\n 'sessions.resume',\n '/api/workspaces/{workspaceId}/sessions/{sessionId}/resume',\n 'POST',\n Type.Object({ sessionId: Text }),\n {\n availability: 'Host provides resumeSession',\n body: body(Type.Object({ targetSessionId: Type.String({ pattern: '^[A-Za-z0-9_-]+$' }) })),\n },\n ),\n host('sessions.file', '/api/workspaces/{workspaceId}/sessions/{sessionId}/file', 'GET', Binary, {\n parameters: [query('path', Text, true)],\n responses: {\n ...jsonApiResponses(Binary),\n '200': { description: 'File bytes, MIME type follows the file extension', contentType: '*/*', schema: Binary },\n },\n }),\n host(\n 'sessions.channels',\n '/api/workspaces/{workspaceId}/sessions/{sessionId}/channels',\n 'GET',\n Type.Object({ channels: Type.Array(Type.Object({ type: Text, sessionId: Text, payload: Json })) }),\n ),\n host(\n 'sessions.channel.send',\n '/api/workspaces/{workspaceId}/sessions/{sessionId}/channel/{frameType}',\n 'POST',\n ApiOkSchema,\n {\n body: body(Json),\n responses: jsonApiResponses(ApiOkSchema, 202),\n description: 'Deliver a payload to the selected channel contract identified by frameType.',\n },\n ),\n host('workspaces.list', '/api/workspaces', 'GET', Type.Object({ workspaces: Type.Array(Workspace) })),\n host('workspaces.admit', '/api/workspaces', 'POST', Type.Object({ workspace: Workspace }), {\n body: body(Type.Object({ root: Text })),\n responses: jsonApiResponses(Type.Object({ workspace: Workspace }), 201),\n }),\n host('workspaces.get', '/api/workspaces/{workspaceId}', 'GET', Type.Object({ workspace: Workspace })),\n host('workspaces.remove', '/api/workspaces/{workspaceId}', 'DELETE', ApiOkSchema),\n host('events', '/api/events', 'GET', Text, {\n responses: {\n '200': {\n description:\n 'SSE sessions_snapshot, session_upsert, session_removed and selected channel frames. Selected extension channel payloads are defined by the corresponding AsyncAPI channel operations.',\n events: {\n sessions_snapshot: HubSnapshotFrameSchema,\n session_upsert: HubUpsertFrameSchema,\n session_removed: HubRemovedFrameSchema,\n },\n contentType: 'text/event-stream',\n schema: Text,\n },\n '401': { description: 'Authentication required', schema: ApiErrorSchema },\n },\n }),\n];\nconst AuthType = Type.Union([Type.Literal('api_key'), Type.Literal('oauth')]);\nconst Provider = Type.Object({\n id: Text,\n name: Text,\n methods: Type.Array(Type.Object({ type: AuthType, label: Text })),\n authenticated: Optional(Type.Object({ type: AuthType, source: Optional(Text) })),\n});\nconst LoginEvent = Type.Union([\n Type.Object({\n type: Type.Literal('info'),\n message: Text,\n links: Optional(Type.Array(Type.Object({ url: Text, label: Optional(Text) }))),\n }),\n Type.Object({ type: Type.Literal('auth_url'), url: Text, instructions: Optional(Text) }),\n Type.Object({\n type: Type.Literal('device_code'),\n userCode: Text,\n verificationUri: Text,\n intervalSeconds: Optional(NumberValue),\n expiresInSeconds: Optional(NumberValue),\n }),\n Type.Object({ type: Type.Literal('progress'), message: Text }),\n]);\nexport const LoginFlowSchema = Type.Object({\n id: Text,\n providerId: Text,\n providerName: Text,\n type: AuthType,\n status: Type.Union([\n Type.Literal('running'),\n Type.Literal('succeeded'),\n Type.Literal('failed'),\n Type.Literal('cancelled'),\n ]),\n events: Type.Array(LoginEvent),\n prompt: Optional(\n Type.Object({\n id: Text,\n type: Type.Union([\n Type.Literal('text'),\n Type.Literal('secret'),\n Type.Literal('select'),\n Type.Literal('manual_code'),\n ]),\n message: Text,\n placeholder: Optional(Text),\n options: Optional(Type.Array(Type.Object({ id: Text, label: Text, description: Optional(Text) }))),\n }),\n ),\n remote: Optional(Flag),\n error: Optional(Text),\n});\nconst Flow = Type.Object({ flow: LoginFlowSchema });\nexport const machineHttpContracts: DoomHttpContract[] = [\n host('providers.list', '/providers', 'GET', Type.Object({ providers: Type.Array(Provider) })),\n host(\n 'models.list',\n '/models',\n 'GET',\n Type.Object({ models: Type.Array(Type.Object({ value: Text, label: Text, group: Text })) }),\n ),\n host('providers.logout', '/providers/{providerId}', 'DELETE', ApiOkSchema),\n host('logins.create', '/logins', 'POST', Flow, {\n body: body(Type.Object({ providerId: Text, type: AuthType })),\n responses: jsonApiResponses(Flow, 201),\n }),\n host('logins.get', '/logins/{flowId}', 'GET', Flow),\n host('logins.cancel', '/logins/{flowId}', 'DELETE', Flow),\n host('logins.answer', '/logins/{flowId}/answer', 'POST', Flow, {\n body: body(Type.Object({ promptId: Text, value: Text })),\n }),\n].map((route) => ({ ...route, basePath: 'doompi' }));\nconst Source = Type.Union([\n Type.Literal('extension'),\n Type.Literal('mcp'),\n Type.Literal('plugin'),\n Type.Literal('core'),\n]);\nconst Detail = Type.Union([\n Type.Object({\n itemKind: Type.Literal('tool'),\n name: Text,\n owner: Text,\n source: Source,\n active: Flag,\n tokens: Type.Object({ schemaTokens: NumberValue, promptTokens: NumberValue, totalTokens: NumberValue }),\n description: Optional(Text),\n promptSnippet: Optional(Text),\n promptGuidelines: Optional(Strings),\n parameters: Optional(Json),\n }),\n Type.Object({\n itemKind: Type.Literal('skill'),\n name: Text,\n owner: Text,\n source: Source,\n active: Type.Literal(true),\n tokens: NumberValue,\n description: Text,\n filePath: Optional(Text),\n modelInvocable: Flag,\n }),\n Type.Object({\n itemKind: Type.Literal('prompt'),\n name: Type.Literal('system'),\n tokens: NumberValue,\n stage: Type.Union([Type.Literal('base'), Type.Literal('effective')]),\n text: Text,\n }),\n]);\nexport const sessionHttpContracts: DoomHttpContract[] = [\n {\n ...host('context.item', ITEM_ROUTE, 'GET', Type.Object({ revision: NumberValue, item: Detail }), {\n parameters: [\n query('kind', Type.Union([Type.Literal('tool'), Type.Literal('skill'), Type.Literal('prompt')]), true),\n query('name', Text, true),\n ],\n }),\n scope: 'session',\n basePath: API_BASE_PATH,\n },\n {\n ...host('files.complete', '/', 'GET', Type.Object({ files: Strings }), {\n parameters: [query('q', Type.String({ maxLength: 256 }))],\n }),\n scope: 'session',\n basePath: 'files',\n },\n];\n"],"mappings":";;;AAKA,MAAM,OAAO,KAAK,OAAO;AACzB,MAAM,WAAW,KAAK;AACtB,MAAM,UAAU,KAAK,MAAM,IAAI;AAC/B,MAAM,OAAO,KAAK,QAAQ;AAC1B,MAAM,cAAc,KAAK,OAAO;AAChC,MAAa,iBAAiB,KAAK,OAAO;CAAE,OAAO;CAAM,MAAM,SAAS,IAAI;AAAE,CAAC;AAC/E,MAAa,cAAc,KAAK,OAAO,EAAE,IAAI,KAAK,QAAQ,IAAI,EAAE,CAAC;AACjE,MAAM,OAAO,KAAK,QAAQ,EAAE,aAAa,uEAAuE,CAAC;;AAGjH,SAAgB,iBAAiB,QAA0B,SAAS,KAAoC;CACtG,OAAO;GACJ,SAAS;GAAE,aAAa;GAAuB,aAAa;GAAoB;EAAO;EACxF,OAAO;GAAE,aAAa;GAAmB,QAAQ;EAAe;EAChE,OAAO;GAAE,aAAa;GAA2B,QAAQ;EAAe;EACxE,OAAO;GAAE,aAAa;GAA6B,QAAQ;EAAe;EAC1E,OAAO;GAAE,aAAa;GAAsC,QAAQ;EAAe;EACnF,OAAO;GAAE,aAAa;GAAqB,QAAQ;EAAe;EAClE,OAAO;GAAE,aAAa;GAAqB,QAAQ;EAAe;EAClE,OAAO;GAAE,aAAa;GAAyB,QAAQ;EAAe;EACtE,OAAO;GAAE,aAAa;GAAmB,QAAQ;EAAe;EAChE,OAAO;GAAE,aAAa;GAAuB,QAAQ;EAAe;CACtE;AACF;AACA,MAAa,uBAAuB,KAAK,OAAO;CAC9C,IAAI;CACJ,OAAO,KAAK,MAAM;EAAC,KAAK,QAAQ,QAAQ;EAAG,KAAK,QAAQ,WAAW;EAAG,KAAK,QAAQ,SAAS;CAAC,CAAC;CAC9F,UAAU;CACV,aAAa;CACb,iBAAiB;CACjB,sBAAsB;CACtB,WAAW;CACX,YAAY;CACZ,UAAU;AACZ,CAAC;AACD,MAAa,uBAAuB,KAAK,OAAO;CAC9C,IAAI;CACJ,aAAa,SAAS,IAAI;CAC1B,gBAAgB,SAAS,oBAAoB;CAC7C,MAAM;CACN,KAAK;CACL,WAAW;CACX,WAAW;CACX,OAAO,KAAK,MAAM;EAAC,KAAK,QAAQ,MAAM;EAAG,KAAK,QAAQ,MAAM;EAAG,KAAK,QAAQ,YAAY;EAAG,KAAK,QAAQ,OAAO;CAAC,CAAC;CACjH,YAAY;CACZ,QAAQ,KAAK,QAAQ,UAAU;CAC/B,qBAAqB;CACrB,cAAc;CACd,eAAe;CACf,eAAe,SAAS,IAAI;CAC5B,iBAAiB,SAAS,IAAI;CAC9B,mBAAmB,SAAS,IAAI;;CAEhC,SAAS,SAAS,IAAI;AACxB,CAAC;AACD,MAAa,yBAAyB,KAAK,OAAO;CAChD,MAAM,KAAK,QAAQ,mBAAmB;CACtC,UAAU,KAAK,MAAM,oBAAoB;AAC3C,CAAC;AACD,MAAa,uBAAuB,KAAK,OAAO;CAC9C,MAAM,KAAK,QAAQ,gBAAgB;CACnC,SAAS;AACX,CAAC;AACD,MAAa,wBAAwB,KAAK,OAAO;CAAE,MAAM,KAAK,QAAQ,iBAAiB;CAAG,WAAW;AAAK,CAAC;AAC3G,MAAM,YAAY,KAAK,OAAO;CAAE,IAAI;CAAM,MAAM;AAAK,CAAC;AACtD,MAAM,eAAe,KAAK,OAAO;CAC/B,IAAI;CACJ,MAAM,SAAS,IAAI;CACnB,cAAc;CACd,WAAW;CACX,WAAW;CACX,cAAc;AAChB,CAAC;AACD,MAAM,SACJ,MACA,SAAkB,MAClB,WAAW,WAC8C;CAAE;CAAM,IAAI;CAAS;CAAU;AAAO;AACjG,MAAM,QAAQ,YAA4D;CACxE,aAAa;CACb,UAAU;CACV;AACF;AACA,MAAM,QACJ,IACA,MACA,QACA,QACA,QAAmC,CAAC,OACd;CACtB;CACA;CACA;CACA,OAAO;CACP,gBAAgB;CAChB,aAAa;CACb,WAAW,iBAAiB,MAAM;CAClC,GAAG;AACL;AACA,MAAM,SAAS,KAAK,OAAO,EAAE,iBAAiB,SAAS,CAAC;AACxD,MAAa,wBAA4C;CACvD,KACE,UACA,eACA,OACA,KAAK,OAAO;EACV,IAAI,KAAK,QAAQ,IAAI;EACrB,MAAM,KAAK,QAAQ,KAAK;EACxB,UAAU,KAAK,QAAQ,CAAC;EACxB,UAAU;CACZ,CAAC,GACD,EAAE,gBAAgB,OAAO,CAC3B;CACA,KAAK,qBAAqB,0BAA0B,QAAQ,aAAa,EACvE,MAAM,KACJ,KAAK,OAAO;EACV,GAAG,KAAK,QAAQ,CAAC;EACjB,QAAQ,KAAK,MACX,KAAK,OAAO;GACV,MAAM,KAAK,OAAO,EAAE,SAAS,iCAAiC,CAAC;GAC/D,aAAa,SAAS,WAAW;GACjC,OAAO,SAAS,WAAW;EAC7B,CAAC,GACD,EAAE,UAAU,GAAG,CACjB;CACF,CAAC,CACH,EACF,CAAC;CACD,KACE,gBACA,qBACA,OACA,KAAK,OAAO;EACV,QAAQ,SAAS,oBAAoB;EACrC,WAAW,SAAS,IAAI;EACxB,OAAO,SAAS,KAAK,OAAO;GAAE,WAAW;GAAM,UAAU;EAAY,CAAC,CAAC;EACvE,YAAY,KAAK,MAAM,KAAK,OAAO;GAAE,IAAI;GAAM,MAAM;GAAM,gBAAgB,SAAS,oBAAoB;EAAE,CAAC,CAAC;CAC9G,CAAC,CACH;CACA,KAAK,eAAe,oBAAoB,OAAO,KAAK,OAAO,EAAE,aAAa,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;CAClH,KACE,iBACA,0CACA,OACA,KAAK,OAAO,EAAE,UAAU,KAAK,MAAM,oBAAoB,EAAE,CAAC,CAC5D;CACA,KAAK,mBAAmB,0CAA0C,QAAQ,KAAK,OAAO,EAAE,WAAW,KAAK,CAAC,GAAG;EAC1G,MAAM,KAAK,KAAK,OAAO,EAAE,MAAM,SAAS,IAAI,EAAE,CAAC,CAAC;EAChD,WAAW,iBAAiB,KAAK,OAAO,EAAE,WAAW,KAAK,CAAC,GAAG,GAAG;CACnE,CAAC;CACD,KAAK,gBAAgB,sDAAsD,OAAO,oBAAoB;CACtG,KAAK,mBAAmB,sDAAsD,UAAU,WAAW;CACnG,KACE,oBACA,8DACA,OACA,KAAK,OAAO,EAAE,UAAU,KAAK,MAAM,YAAY,EAAE,CAAC,GAClD,EAAE,cAAc,+BAA+B,CACjD;CACA,KAAK,oBAAoB,8DAA8D,QAAQ,aAAa,EAC1G,cAAc,+BAChB,CAAC;CACD,KAAK,mBAAmB,6DAA6D,QAAQ,aAAa,EACxG,cAAc,8BAChB,CAAC;CACD,KACE,mBACA,6DACA,QACA,KAAK,OAAO,EAAE,WAAW,KAAK,CAAC,GAC/B;EACE,cAAc;EACd,MAAM,KAAK,KAAK,OAAO,EAAE,iBAAiB,KAAK,OAAO,EAAE,SAAS,mBAAmB,CAAC,EAAE,CAAC,CAAC;CAC3F,CACF;CACA,KAAK,iBAAiB,2DAA2D,OAAO,QAAQ;EAC9F,YAAY,CAAC,MAAM,QAAQ,MAAM,IAAI,CAAC;EACtC,WAAW;GACT,GAAG,iBAAiB,MAAM;GAC1B,OAAO;IAAE,aAAa;IAAoD,aAAa;IAAO,QAAQ;GAAO;EAC/G;CACF,CAAC;CACD,KACE,qBACA,+DACA,OACA,KAAK,OAAO,EAAE,UAAU,KAAK,MAAM,KAAK,OAAO;EAAE,MAAM;EAAM,WAAW;EAAM,SAAS;CAAK,CAAC,CAAC,EAAE,CAAC,CACnG;CACA,KACE,yBACA,0EACA,QACA,aACA;EACE,MAAM,KAAK,IAAI;EACf,WAAW,iBAAiB,aAAa,GAAG;EAC5C,aAAa;CACf,CACF;CACA,KAAK,mBAAmB,mBAAmB,OAAO,KAAK,OAAO,EAAE,YAAY,KAAK,MAAM,SAAS,EAAE,CAAC,CAAC;CACpG,KAAK,oBAAoB,mBAAmB,QAAQ,KAAK,OAAO,EAAE,WAAW,UAAU,CAAC,GAAG;EACzF,MAAM,KAAK,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC,CAAC;EACtC,WAAW,iBAAiB,KAAK,OAAO,EAAE,WAAW,UAAU,CAAC,GAAG,GAAG;CACxE,CAAC;CACD,KAAK,kBAAkB,iCAAiC,OAAO,KAAK,OAAO,EAAE,WAAW,UAAU,CAAC,CAAC;CACpG,KAAK,qBAAqB,iCAAiC,UAAU,WAAW;CAChF,KAAK,UAAU,eAAe,OAAO,MAAM,EACzC,WAAW;EACT,OAAO;GACL,aACE;GACF,QAAQ;IACN,mBAAmB;IACnB,gBAAgB;IAChB,iBAAiB;GACnB;GACA,aAAa;GACb,QAAQ;EACV;EACA,OAAO;GAAE,aAAa;GAA2B,QAAQ;EAAe;CAC1E,EACF,CAAC;AACH;AACA,MAAM,WAAW,KAAK,MAAM,CAAC,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,OAAO,CAAC,CAAC;AAC5E,MAAM,WAAW,KAAK,OAAO;CAC3B,IAAI;CACJ,MAAM;CACN,SAAS,KAAK,MAAM,KAAK,OAAO;EAAE,MAAM;EAAU,OAAO;CAAK,CAAC,CAAC;CAChE,eAAe,SAAS,KAAK,OAAO;EAAE,MAAM;EAAU,QAAQ,SAAS,IAAI;CAAE,CAAC,CAAC;AACjF,CAAC;AACD,MAAM,aAAa,KAAK,MAAM;CAC5B,KAAK,OAAO;EACV,MAAM,KAAK,QAAQ,MAAM;EACzB,SAAS;EACT,OAAO,SAAS,KAAK,MAAM,KAAK,OAAO;GAAE,KAAK;GAAM,OAAO,SAAS,IAAI;EAAE,CAAC,CAAC,CAAC;CAC/E,CAAC;CACD,KAAK,OAAO;EAAE,MAAM,KAAK,QAAQ,UAAU;EAAG,KAAK;EAAM,cAAc,SAAS,IAAI;CAAE,CAAC;CACvF,KAAK,OAAO;EACV,MAAM,KAAK,QAAQ,aAAa;EAChC,UAAU;EACV,iBAAiB;EACjB,iBAAiB,SAAS,WAAW;EACrC,kBAAkB,SAAS,WAAW;CACxC,CAAC;CACD,KAAK,OAAO;EAAE,MAAM,KAAK,QAAQ,UAAU;EAAG,SAAS;CAAK,CAAC;AAC/D,CAAC;AACD,MAAa,kBAAkB,KAAK,OAAO;CACzC,IAAI;CACJ,YAAY;CACZ,cAAc;CACd,MAAM;CACN,QAAQ,KAAK,MAAM;EACjB,KAAK,QAAQ,SAAS;EACtB,KAAK,QAAQ,WAAW;EACxB,KAAK,QAAQ,QAAQ;EACrB,KAAK,QAAQ,WAAW;CAC1B,CAAC;CACD,QAAQ,KAAK,MAAM,UAAU;CAC7B,QAAQ,SACN,KAAK,OAAO;EACV,IAAI;EACJ,MAAM,KAAK,MAAM;GACf,KAAK,QAAQ,MAAM;GACnB,KAAK,QAAQ,QAAQ;GACrB,KAAK,QAAQ,QAAQ;GACrB,KAAK,QAAQ,aAAa;EAC5B,CAAC;EACD,SAAS;EACT,aAAa,SAAS,IAAI;EAC1B,SAAS,SAAS,KAAK,MAAM,KAAK,OAAO;GAAE,IAAI;GAAM,OAAO;GAAM,aAAa,SAAS,IAAI;EAAE,CAAC,CAAC,CAAC;CACnG,CAAC,CACH;CACA,QAAQ,SAAS,IAAI;CACrB,OAAO,SAAS,IAAI;AACtB,CAAC;AACD,MAAM,OAAO,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAClD,MAAa,uBAA2C;CACtD,KAAK,kBAAkB,cAAc,OAAO,KAAK,OAAO,EAAE,WAAW,KAAK,MAAM,QAAQ,EAAE,CAAC,CAAC;CAC5F,KACE,eACA,WACA,OACA,KAAK,OAAO,EAAE,QAAQ,KAAK,MAAM,KAAK,OAAO;EAAE,OAAO;EAAM,OAAO;EAAM,OAAO;CAAK,CAAC,CAAC,EAAE,CAAC,CAC5F;CACA,KAAK,oBAAoB,2BAA2B,UAAU,WAAW;CACzE,KAAK,iBAAiB,WAAW,QAAQ,MAAM;EAC7C,MAAM,KAAK,KAAK,OAAO;GAAE,YAAY;GAAM,MAAM;EAAS,CAAC,CAAC;EAC5D,WAAW,iBAAiB,MAAM,GAAG;CACvC,CAAC;CACD,KAAK,cAAc,oBAAoB,OAAO,IAAI;CAClD,KAAK,iBAAiB,oBAAoB,UAAU,IAAI;CACxD,KAAK,iBAAiB,2BAA2B,QAAQ,MAAM,EAC7D,MAAM,KAAK,KAAK,OAAO;EAAE,UAAU;EAAM,OAAO;CAAK,CAAC,CAAC,EACzD,CAAC;AACH,CAAC,CAAC,KAAK,WAAW;CAAE,GAAG;CAAO,UAAU;AAAS,EAAE;AACnD,MAAM,SAAS,KAAK,MAAM;CACxB,KAAK,QAAQ,WAAW;CACxB,KAAK,QAAQ,KAAK;CAClB,KAAK,QAAQ,QAAQ;CACrB,KAAK,QAAQ,MAAM;AACrB,CAAC;AACD,MAAM,SAAS,KAAK,MAAM;CACxB,KAAK,OAAO;EACV,UAAU,KAAK,QAAQ,MAAM;EAC7B,MAAM;EACN,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,QAAQ,KAAK,OAAO;GAAE,cAAc;GAAa,cAAc;GAAa,aAAa;EAAY,CAAC;EACtG,aAAa,SAAS,IAAI;EAC1B,eAAe,SAAS,IAAI;EAC5B,kBAAkB,SAAS,OAAO;EAClC,YAAY,SAAS,IAAI;CAC3B,CAAC;CACD,KAAK,OAAO;EACV,UAAU,KAAK,QAAQ,OAAO;EAC9B,MAAM;EACN,OAAO;EACP,QAAQ;EACR,QAAQ,KAAK,QAAQ,IAAI;EACzB,QAAQ;EACR,aAAa;EACb,UAAU,SAAS,IAAI;EACvB,gBAAgB;CAClB,CAAC;CACD,KAAK,OAAO;EACV,UAAU,KAAK,QAAQ,QAAQ;EAC/B,MAAM,KAAK,QAAQ,QAAQ;EAC3B,QAAQ;EACR,OAAO,KAAK,MAAM,CAAC,KAAK,QAAQ,MAAM,GAAG,KAAK,QAAQ,WAAW,CAAC,CAAC;EACnE,MAAM;CACR,CAAC;AACH,CAAC;AACD,MAAa,uBAA2C,CACtD;CACE,GAAG,KAAK,gBAAgB,YAAY,OAAO,KAAK,OAAO;EAAE,UAAU;EAAa,MAAM;CAAO,CAAC,GAAG,EAC/F,YAAY,CACV,MAAM,QAAQ,KAAK,MAAM;EAAC,KAAK,QAAQ,MAAM;EAAG,KAAK,QAAQ,OAAO;EAAG,KAAK,QAAQ,QAAQ;CAAC,CAAC,GAAG,IAAI,GACrG,MAAM,QAAQ,MAAM,IAAI,CAC1B,EACF,CAAC;CACD,OAAO;CACP,UAAU;AACZ,GACA;CACE,GAAG,KAAK,kBAAkB,KAAK,OAAO,KAAK,OAAO,EAAE,OAAO,QAAQ,CAAC,GAAG,EACrE,YAAY,CAAC,MAAM,KAAK,KAAK,OAAO,EAAE,WAAW,IAAI,CAAC,CAAC,CAAC,EAC1D,CAAC;CACD,OAAO;CACP,UAAU;AACZ,CACF"}
|
|
1
|
+
{"version":3,"file":"httpApiContracts.mjs","names":[],"sources":["../../src/schemas/httpApiContracts.ts"],"sourcesContent":["import { Type, type TSchema } from 'typebox';\n\nimport { API_BASE_PATH, ITEM_ROUTE } from '../constants/contextApi';\nimport type { DoomHttpContract } from './apiContracts';\n\nconst Text = Type.String();\nconst Optional = Type.Optional;\nconst Strings = Type.Array(Text);\nconst Flag = Type.Boolean();\nconst NumberValue = Type.Number();\nexport const ApiErrorSchema = Type.Object({ error: Text, hash: Optional(Text) });\nexport const ApiOkSchema = Type.Object({ ok: Type.Literal(true) });\nconst Json = Type.Unknown({ description: 'Value whose schema is supplied by the selected runtime contribution.' });\n\n/** Common JSON response construction; status and payload remain explicit at the declaration. */\nexport function jsonApiResponses(schema: object | boolean, status = 200): DoomHttpContract['responses'] {\n return {\n [status]: { description: 'Successful response', contentType: 'application/json', schema },\n '400': { description: 'Invalid request', schema: ApiErrorSchema },\n '401': { description: 'Authentication required', schema: ApiErrorSchema },\n '403': { description: 'Request is not authorized', schema: ApiErrorSchema },\n '404': { description: 'Resource or capability unavailable', schema: ApiErrorSchema },\n '409': { description: 'Conflicting state', schema: ApiErrorSchema },\n '422': { description: 'Invalid operation', schema: ApiErrorSchema },\n '500': { description: 'Host operation failed', schema: ApiErrorSchema },\n '502': { description: 'Provider failed', schema: ApiErrorSchema },\n '503': { description: 'Service unavailable', schema: ApiErrorSchema },\n };\n}\nexport const WebCompositionSchema = Type.Object({\n id: Text,\n scope: Type.Union([Type.Literal('global'), Type.Literal('workspace'), Type.Literal('session')]),\n revision: NumberValue,\n manifestUrl: Text,\n rawAssetBaseUrl: Text,\n verifiedAssetBaseUrl: Text,\n entryPath: Text,\n stylePaths: Strings,\n channels: Strings,\n});\nexport const SessionSummarySchema = Type.Object({\n id: Text,\n workspaceId: Optional(Text),\n webComposition: Optional(WebCompositionSchema),\n name: Text,\n cwd: Text,\n createdAt: Text,\n updatedAt: Text,\n phase: Type.Union([Type.Literal('idle'), Type.Literal('turn'), Type.Literal('compaction'), Type.Literal('retry')]),\n phaseSince: Text,\n attach: Type.Literal('attached'),\n pendingMessageCount: NumberValue,\n everPrompted: Flag,\n awaitingInput: Flag,\n lastSettledAt: Optional(Text),\n parentSessionId: Optional(Text),\n sessionProvenance: Optional(Text),\n /** Present and true for a recorded session the server has not reopened yet. */\n dormant: Optional(Flag),\n});\nexport const HubSnapshotFrameSchema = Type.Object({\n type: Type.Literal('sessions_snapshot'),\n sessions: Type.Array(SessionSummarySchema),\n});\nexport const HubUpsertFrameSchema = Type.Object({\n type: Type.Literal('session_upsert'),\n session: SessionSummarySchema,\n});\nexport const HubRemovedFrameSchema = Type.Object({ type: Type.Literal('session_removed'), sessionId: Text });\nconst Workspace = Type.Object({ id: Text, root: Text, available: Optional(Flag) });\nexport const WorkspaceSnapshotFrameSchema = Type.Object({\n type: Type.Literal('workspaces_snapshot'),\n workspaces: Type.Array(Workspace),\n});\nexport const WorkspaceUpsertFrameSchema = Type.Object({\n type: Type.Literal('workspace_upsert'),\n workspace: Workspace,\n});\nexport const WorkspaceRemovedFrameSchema = Type.Object({\n type: Type.Literal('workspace_removed'),\n workspaceId: Text,\n});\nconst SavedSession = Type.Object({\n id: Text,\n name: Optional(Text),\n firstMessage: Text,\n createdAt: Text,\n updatedAt: Text,\n messageCount: NumberValue,\n});\nconst query = (\n name: string,\n schema: TSchema = Text,\n required = false,\n): NonNullable<DoomHttpContract['parameters']>[number] => ({ name, in: 'query', required, schema });\nconst body = (schema: TSchema): NonNullable<DoomHttpContract['body']> => ({\n contentType: 'application/json',\n required: true,\n schema,\n});\nconst host = (\n id: string,\n path: string,\n method: DoomHttpContract['method'],\n result: TSchema,\n extra: Partial<DoomHttpContract> = {},\n): DoomHttpContract => ({\n id,\n path,\n method,\n scope: 'global',\n authentication: 'owner',\n description: id,\n responses: jsonApiResponses(result),\n ...extra,\n});\nconst Binary = Type.String({ contentEncoding: 'binary' });\nexport const headlessHttpContracts: DoomHttpContract[] = [\n host(\n 'health',\n '/api/health',\n 'GET',\n Type.Object({\n ok: Type.Literal(true),\n role: Type.Literal('hub'),\n protocol: Type.Literal(1),\n sessions: NumberValue,\n }),\n { authentication: 'none' },\n ),\n host('telemetry.browser', '/api/telemetry/browser', 'POST', ApiOkSchema, {\n body: body(\n Type.Object({\n v: Type.Literal(1),\n events: Type.Array(\n Type.Object({\n name: Type.String({ pattern: '^web\\\\.browser\\\\.[a-z_]{1,40}$' }),\n duration_ms: Optional(NumberValue),\n count: Optional(NumberValue),\n }),\n { maxItems: 10 },\n ),\n }),\n ),\n }),\n host(\n 'compositions',\n '/api/compositions',\n 'GET',\n Type.Object({\n global: Optional(WebCompositionSchema),\n publicKey: Optional(Text),\n shell: Optional(Type.Object({ publicKey: Text, revision: NumberValue })),\n workspaces: Type.Array(Type.Object({ id: Text, root: Text, webComposition: Optional(WebCompositionSchema) })),\n }),\n ),\n host('directories', '/api/directories', 'GET', Type.Object({ directories: Strings }), { parameters: [query('q')] }),\n host(\n 'sessions.list',\n '/api/workspaces/{workspaceId}/sessions',\n 'GET',\n Type.Object({ sessions: Type.Array(SessionSummarySchema) }),\n ),\n host('sessions.create', '/api/workspaces/{workspaceId}/sessions', 'POST', Type.Object({ sessionId: Text }), {\n body: body(Type.Object({ name: Optional(Text) })),\n responses: jsonApiResponses(Type.Object({ sessionId: Text }), 201),\n }),\n host('sessions.get', '/api/workspaces/{workspaceId}/sessions/{sessionId}', 'GET', SessionSummarySchema),\n host('sessions.delete', '/api/workspaces/{workspaceId}/sessions/{sessionId}', 'DELETE', ApiOkSchema),\n host(\n 'sessions.history',\n '/api/workspaces/{workspaceId}/sessions/{sessionId}/history',\n 'GET',\n Type.Object({ sessions: Type.Array(SavedSession) }),\n { availability: 'Host provides sessionHistory' },\n ),\n host('sessions.restart', '/api/workspaces/{workspaceId}/sessions/{sessionId}/restart', 'POST', ApiOkSchema, {\n availability: 'Host provides restartSession',\n }),\n host('sessions.revive', '/api/workspaces/{workspaceId}/sessions/{sessionId}/revive', 'POST', ApiOkSchema, {\n availability: 'Host provides reviveSession',\n }),\n host(\n 'sessions.resume',\n '/api/workspaces/{workspaceId}/sessions/{sessionId}/resume',\n 'POST',\n Type.Object({ sessionId: Text }),\n {\n availability: 'Host provides resumeSession',\n body: body(Type.Object({ targetSessionId: Type.String({ pattern: '^[A-Za-z0-9_-]+$' }) })),\n },\n ),\n host('sessions.file', '/api/workspaces/{workspaceId}/sessions/{sessionId}/file', 'GET', Binary, {\n parameters: [query('path', Text, true)],\n responses: {\n ...jsonApiResponses(Binary),\n '200': { description: 'File bytes, MIME type follows the file extension', contentType: '*/*', schema: Binary },\n },\n }),\n host(\n 'sessions.channels',\n '/api/workspaces/{workspaceId}/sessions/{sessionId}/channels',\n 'GET',\n Type.Object({ channels: Type.Array(Type.Object({ type: Text, sessionId: Text, payload: Json })) }),\n ),\n host(\n 'sessions.channel.send',\n '/api/workspaces/{workspaceId}/sessions/{sessionId}/channel/{frameType}',\n 'POST',\n ApiOkSchema,\n {\n body: body(Json),\n responses: jsonApiResponses(ApiOkSchema, 202),\n description: 'Deliver a payload to the selected channel contract identified by frameType.',\n },\n ),\n host('workspaces.list', '/api/workspaces', 'GET', Type.Object({ workspaces: Type.Array(Workspace) })),\n host('workspaces.admit', '/api/workspaces', 'POST', Type.Object({ workspace: Workspace }), {\n body: body(Type.Object({ root: Text })),\n responses: jsonApiResponses(Type.Object({ workspace: Workspace }), 201),\n }),\n host('workspaces.get', '/api/workspaces/{workspaceId}', 'GET', Type.Object({ workspace: Workspace })),\n host(\n 'workspaces.history',\n '/api/workspaces/{workspaceId}/history',\n 'GET',\n Type.Object({ sessions: Type.Array(SavedSession) }),\n {\n availability: 'Host provides workspaceHistory',\n },\n ),\n host('workspaces.resume', '/api/workspaces/{workspaceId}/resume', 'POST', Type.Object({ sessionId: Text }), {\n availability: 'Host provides resumeWorkspaceSession',\n body: body(Type.Object({ targetSessionId: Type.String({ pattern: '^[A-Za-z0-9_-]+$' }) })),\n }),\n host('workspaces.remove', '/api/workspaces/{workspaceId}', 'DELETE', ApiOkSchema),\n host('events', '/api/events', 'GET', Text, {\n responses: {\n '200': {\n description:\n 'SSE session and workspace snapshots, membership changes, and selected channel frames. Selected extension channel payloads are defined by the corresponding AsyncAPI channel operations.',\n events: {\n sessions_snapshot: HubSnapshotFrameSchema,\n session_upsert: HubUpsertFrameSchema,\n session_removed: HubRemovedFrameSchema,\n workspaces_snapshot: WorkspaceSnapshotFrameSchema,\n workspace_upsert: WorkspaceUpsertFrameSchema,\n workspace_removed: WorkspaceRemovedFrameSchema,\n },\n contentType: 'text/event-stream',\n schema: Text,\n },\n '401': { description: 'Authentication required', schema: ApiErrorSchema },\n },\n }),\n];\nconst AuthType = Type.Union([Type.Literal('api_key'), Type.Literal('oauth')]);\nconst Provider = Type.Object({\n id: Text,\n name: Text,\n methods: Type.Array(Type.Object({ type: AuthType, label: Text })),\n authenticated: Optional(Type.Object({ type: AuthType, source: Optional(Text) })),\n});\nconst LoginEvent = Type.Union([\n Type.Object({\n type: Type.Literal('info'),\n message: Text,\n links: Optional(Type.Array(Type.Object({ url: Text, label: Optional(Text) }))),\n }),\n Type.Object({ type: Type.Literal('auth_url'), url: Text, instructions: Optional(Text) }),\n Type.Object({\n type: Type.Literal('device_code'),\n userCode: Text,\n verificationUri: Text,\n intervalSeconds: Optional(NumberValue),\n expiresInSeconds: Optional(NumberValue),\n }),\n Type.Object({ type: Type.Literal('progress'), message: Text }),\n]);\nexport const LoginFlowSchema = Type.Object({\n id: Text,\n providerId: Text,\n providerName: Text,\n type: AuthType,\n status: Type.Union([\n Type.Literal('running'),\n Type.Literal('succeeded'),\n Type.Literal('failed'),\n Type.Literal('cancelled'),\n ]),\n events: Type.Array(LoginEvent),\n prompt: Optional(\n Type.Object({\n id: Text,\n type: Type.Union([\n Type.Literal('text'),\n Type.Literal('secret'),\n Type.Literal('select'),\n Type.Literal('manual_code'),\n ]),\n message: Text,\n placeholder: Optional(Text),\n options: Optional(Type.Array(Type.Object({ id: Text, label: Text, description: Optional(Text) }))),\n }),\n ),\n remote: Optional(Flag),\n error: Optional(Text),\n});\nconst Flow = Type.Object({ flow: LoginFlowSchema });\nexport const machineHttpContracts: DoomHttpContract[] = [\n host('providers.list', '/providers', 'GET', Type.Object({ providers: Type.Array(Provider) })),\n host(\n 'models.list',\n '/models',\n 'GET',\n Type.Object({ models: Type.Array(Type.Object({ value: Text, label: Text, group: Text })) }),\n ),\n host('providers.logout', '/providers/{providerId}', 'DELETE', ApiOkSchema),\n host('logins.create', '/logins', 'POST', Flow, {\n body: body(Type.Object({ providerId: Text, type: AuthType })),\n responses: jsonApiResponses(Flow, 201),\n }),\n host('logins.get', '/logins/{flowId}', 'GET', Flow),\n host('logins.cancel', '/logins/{flowId}', 'DELETE', Flow),\n host('logins.answer', '/logins/{flowId}/answer', 'POST', Flow, {\n body: body(Type.Object({ promptId: Text, value: Text })),\n }),\n].map((route) => ({ ...route, basePath: 'doompi' }));\nconst Source = Type.Union([\n Type.Literal('extension'),\n Type.Literal('mcp'),\n Type.Literal('plugin'),\n Type.Literal('core'),\n]);\nconst Detail = Type.Union([\n Type.Object({\n itemKind: Type.Literal('tool'),\n name: Text,\n owner: Text,\n source: Source,\n active: Flag,\n tokens: Type.Object({ schemaTokens: NumberValue, promptTokens: NumberValue, totalTokens: NumberValue }),\n description: Optional(Text),\n promptSnippet: Optional(Text),\n promptGuidelines: Optional(Strings),\n parameters: Optional(Json),\n }),\n Type.Object({\n itemKind: Type.Literal('skill'),\n name: Text,\n owner: Text,\n source: Source,\n active: Type.Literal(true),\n tokens: NumberValue,\n description: Text,\n filePath: Optional(Text),\n modelInvocable: Flag,\n }),\n Type.Object({\n itemKind: Type.Literal('prompt'),\n name: Type.Literal('system'),\n tokens: NumberValue,\n stage: Type.Union([Type.Literal('base'), Type.Literal('effective')]),\n text: Text,\n }),\n]);\nexport const sessionHttpContracts: DoomHttpContract[] = [\n {\n ...host('context.item', ITEM_ROUTE, 'GET', Type.Object({ revision: NumberValue, item: Detail }), {\n parameters: [\n query('kind', Type.Union([Type.Literal('tool'), Type.Literal('skill'), Type.Literal('prompt')]), true),\n query('name', Text, true),\n ],\n }),\n scope: 'session',\n basePath: API_BASE_PATH,\n },\n {\n ...host('files.complete', '/', 'GET', Type.Object({ files: Strings }), {\n parameters: [query('q', Type.String({ maxLength: 256 }))],\n }),\n scope: 'session',\n basePath: 'files',\n },\n];\n"],"mappings":"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"}
|
|
@@ -30,11 +30,23 @@ export interface DoomHubSessionCreateRequest {
|
|
|
30
30
|
readonly sessionProvenance?: string;
|
|
31
31
|
readonly signal?: AbortSignal;
|
|
32
32
|
}
|
|
33
|
+
/** Host-bound inter-session events. The source identity is attached by the hub, never by payload data. */
|
|
34
|
+
export interface DoomSessionCommunicationEndpoint {
|
|
35
|
+
readonly sessionId: string;
|
|
36
|
+
publish(targetSessionId: string, type: string, payload: unknown): boolean;
|
|
37
|
+
subscribe(type: string, listener: (sourceSessionId: string, payload: unknown) => void): () => void;
|
|
38
|
+
onPeerReady(listener: (peerSessionId: string) => void): () => void;
|
|
39
|
+
close(): void;
|
|
40
|
+
}
|
|
33
41
|
/** Direct lifecycle owned by the canonical headless hub, never by a package transport. */
|
|
34
42
|
export interface DoomHubSessionService {
|
|
35
43
|
create(request: DoomHubSessionCreateRequest): Promise<DoomHubSessionScope>;
|
|
36
44
|
close(sessionId: string): Promise<void>;
|
|
37
45
|
isLive(sessionId: string): boolean;
|
|
46
|
+
/** True only when both live sessions have a direct parent-child relationship. */
|
|
47
|
+
canCommunicate?(sourceSessionId: string, targetSessionId: string): boolean;
|
|
48
|
+
/** Core host hook. Session API construction removes this method before exposing the service to extensions. */
|
|
49
|
+
bindCommunication?(sessionId: string): DoomSessionCommunicationEndpoint;
|
|
38
50
|
}
|
|
39
51
|
export interface DoomHubSessionApiRequest {
|
|
40
52
|
basePath: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hubChannel.d.cts","names":[],"sources":["../../src/schemas/hubChannel.ts"],"mappings":";iBAAiB;EACf;EACA;EACA;;;iBAIe;;WAEN;;iBAGM;EACf,QAAQ,mBAAmB,mBAAmB;EAC9C,UACE,mBACA,mBACA,WAAW,2BACX,UAAU;;EAGZ,cAAc;EACd;;iBAGe;EACf;EACA;EACA;;EAEA,cAAc,SAAS;;iBAGR;WACN;WACA;WACA;WACA;WACA,SAAS;;;iBAIH;EACf,OAAO,SAAS,8BAA8B,QAAQ;EACtD,MAAM,oBAAoB;EAC1B,OAAO;;
|
|
1
|
+
{"version":3,"file":"hubChannel.d.cts","names":[],"sources":["../../src/schemas/hubChannel.ts"],"mappings":";iBAAiB;EACf;EACA;EACA;;;iBAIe;;WAEN;;iBAGM;EACf,QAAQ,mBAAmB,mBAAmB;EAC9C,UACE,mBACA,mBACA,WAAW,2BACX,UAAU;;EAGZ,cAAc;EACd;;iBAGe;EACf;EACA;EACA;;EAEA,cAAc,SAAS;;iBAGR;WACN;WACA;WACA;WACA;WACA,SAAS;;;iBAIH;WACN;EACT,QAAQ,yBAAyB,cAAc;EAC/C,UAAU,cAAc,WAAW,yBAAyB;EAC5D,YAAY,WAAW;EACvB;;;iBAGe;EACf,OAAO,SAAS,8BAA8B,QAAQ;EACtD,MAAM,oBAAoB;EAC1B,OAAO;;EAEP,gBAAgB,yBAAyB;;EAEzC,mBAAmB,oBAAoB;;iBAGxB;EACf;EACA;EACA;EACA,gBAAgB,WAAW;EAC3B,SAAS;;EAET,UAAU;;YAGA;iBAEK;WACN,WAAW;WACX;WACA,SAAS;;iBAGH;WACN;EACT,QAAQ,OAAO,qBAAqB,SAAS,6BAA6B;EAC1E;;iBAGe;EACf;;iBAGe;EACf,qBAAqB;;EAErB,iBAAiB;;WAER,cAAc;EACvB,QAAQ,mBAAmB;EAC3B,qBAAqB,sBAAsB,mBAAmB;EAC9D,kBAAkB,OAAO,qBAAqB,SAAS,2BAA2B,QAAQ;EAC1F,cAAc;EACd,SAAS;;iBAGM;EACf,WAAW,OAAO;EAClB,cAAc,OAAO;EACrB,gBAAgB;EAChB,eAAe,OAAO,qBAAqB;EAC3C;;YAGU;iBAEK;EACf;EACA,YAAY;EACZ,MAAM,MAAM,qBAAqB;EACjC;EACA,SAAS,OAAO,qBAAqB,kBAAkB,YAAY;EACnE,cAAc,YAAY"}
|
|
@@ -30,11 +30,23 @@ export interface DoomHubSessionCreateRequest {
|
|
|
30
30
|
readonly sessionProvenance?: string;
|
|
31
31
|
readonly signal?: AbortSignal;
|
|
32
32
|
}
|
|
33
|
+
/** Host-bound inter-session events. The source identity is attached by the hub, never by payload data. */
|
|
34
|
+
export interface DoomSessionCommunicationEndpoint {
|
|
35
|
+
readonly sessionId: string;
|
|
36
|
+
publish(targetSessionId: string, type: string, payload: unknown): boolean;
|
|
37
|
+
subscribe(type: string, listener: (sourceSessionId: string, payload: unknown) => void): () => void;
|
|
38
|
+
onPeerReady(listener: (peerSessionId: string) => void): () => void;
|
|
39
|
+
close(): void;
|
|
40
|
+
}
|
|
33
41
|
/** Direct lifecycle owned by the canonical headless hub, never by a package transport. */
|
|
34
42
|
export interface DoomHubSessionService {
|
|
35
43
|
create(request: DoomHubSessionCreateRequest): Promise<DoomHubSessionScope>;
|
|
36
44
|
close(sessionId: string): Promise<void>;
|
|
37
45
|
isLive(sessionId: string): boolean;
|
|
46
|
+
/** True only when both live sessions have a direct parent-child relationship. */
|
|
47
|
+
canCommunicate?(sourceSessionId: string, targetSessionId: string): boolean;
|
|
48
|
+
/** Core host hook. Session API construction removes this method before exposing the service to extensions. */
|
|
49
|
+
bindCommunication?(sessionId: string): DoomSessionCommunicationEndpoint;
|
|
38
50
|
}
|
|
39
51
|
export interface DoomHubSessionApiRequest {
|
|
40
52
|
basePath: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hubChannel.d.mts","names":[],"sources":["../../src/schemas/hubChannel.ts"],"mappings":";iBAAiB;EACf;EACA;EACA;;;iBAIe;;WAEN;;iBAGM;EACf,QAAQ,mBAAmB,mBAAmB;EAC9C,UACE,mBACA,mBACA,WAAW,2BACX,UAAU;;EAGZ,cAAc;EACd;;iBAGe;EACf;EACA;EACA;;EAEA,cAAc,SAAS;;iBAGR;WACN;WACA;WACA;WACA;WACA,SAAS;;;iBAIH;EACf,OAAO,SAAS,8BAA8B,QAAQ;EACtD,MAAM,oBAAoB;EAC1B,OAAO;;
|
|
1
|
+
{"version":3,"file":"hubChannel.d.mts","names":[],"sources":["../../src/schemas/hubChannel.ts"],"mappings":";iBAAiB;EACf;EACA;EACA;;;iBAIe;;WAEN;;iBAGM;EACf,QAAQ,mBAAmB,mBAAmB;EAC9C,UACE,mBACA,mBACA,WAAW,2BACX,UAAU;;EAGZ,cAAc;EACd;;iBAGe;EACf;EACA;EACA;;EAEA,cAAc,SAAS;;iBAGR;WACN;WACA;WACA;WACA;WACA,SAAS;;;iBAIH;WACN;EACT,QAAQ,yBAAyB,cAAc;EAC/C,UAAU,cAAc,WAAW,yBAAyB;EAC5D,YAAY,WAAW;EACvB;;;iBAGe;EACf,OAAO,SAAS,8BAA8B,QAAQ;EACtD,MAAM,oBAAoB;EAC1B,OAAO;;EAEP,gBAAgB,yBAAyB;;EAEzC,mBAAmB,oBAAoB;;iBAGxB;EACf;EACA;EACA;EACA,gBAAgB,WAAW;EAC3B,SAAS;;EAET,UAAU;;YAGA;iBAEK;WACN,WAAW;WACX;WACA,SAAS;;iBAGH;WACN;EACT,QAAQ,OAAO,qBAAqB,SAAS,6BAA6B;EAC1E;;iBAGe;EACf;;iBAGe;EACf,qBAAqB;;EAErB,iBAAiB;;WAER,cAAc;EACvB,QAAQ,mBAAmB;EAC3B,qBAAqB,sBAAsB,mBAAmB;EAC9D,kBAAkB,OAAO,qBAAqB,SAAS,2BAA2B,QAAQ;EAC1F,cAAc;EACd,SAAS;;iBAGM;EACf,WAAW,OAAO;EAClB,cAAc,OAAO;EACrB,gBAAgB;EAChB,eAAe,OAAO,qBAAqB;EAC3C;;YAGU;iBAEK;EACf;EACA,YAAY;EACZ,MAAM,MAAM,qBAAqB;EACjC;EACA,SAAS,OAAO,qBAAqB,kBAAkB,YAAY;EACnE,cAAc,YAAY"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
//#region src/schemas/mcpBundle.ts
|
|
2
|
+
const DOOM_MCP_BUNDLE_VERSION = 1;
|
|
3
|
+
const DOOM_MCP_BUNDLE_FILE = "mcp.bundle.json";
|
|
4
|
+
function record(value) {
|
|
5
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6
|
+
}
|
|
7
|
+
function text(value, field) {
|
|
8
|
+
if (typeof value !== "string" || value.trim() === "" || value.includes("\0")) throw new Error(`Invalid MCP bundle ${field}`);
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
function relativeFile(value, field) {
|
|
12
|
+
const file = text(value, field);
|
|
13
|
+
const segments = file.slice(2).split("/");
|
|
14
|
+
if (!file.startsWith("./") || /[\\%?#]/u.test(file) || segments.some((segment) => segment === "" || segment === "." || segment === "..")) throw new Error(`Invalid MCP bundle ${field}: expected a contained ./file path`);
|
|
15
|
+
return file;
|
|
16
|
+
}
|
|
17
|
+
/** Validates the admitted descriptor before importing any package code. */
|
|
18
|
+
function parseDoomMcpBundle(value) {
|
|
19
|
+
if (!record(value) || value.version !== 1) throw new Error("Unsupported MCP bundle version");
|
|
20
|
+
const generation = text(value.generation, "generation");
|
|
21
|
+
const fingerprint = text(value.fingerprint, "fingerprint");
|
|
22
|
+
if (!/^[a-f0-9]{64}$/u.test(fingerprint)) throw new Error("Invalid MCP bundle fingerprint");
|
|
23
|
+
if (!Array.isArray(value.entries)) throw new Error("Invalid MCP bundle entries");
|
|
24
|
+
const names = /* @__PURE__ */ new Set();
|
|
25
|
+
return {
|
|
26
|
+
version: 1,
|
|
27
|
+
generation,
|
|
28
|
+
fingerprint,
|
|
29
|
+
entries: value.entries.map((candidate) => {
|
|
30
|
+
if (!record(candidate)) throw new Error("Invalid MCP bundle entry");
|
|
31
|
+
const packageName = text(candidate.packageName, "packageName");
|
|
32
|
+
if (names.has(packageName)) throw new Error(`Duplicate MCP bundle package: ${packageName}`);
|
|
33
|
+
names.add(packageName);
|
|
34
|
+
const entry = relativeFile(candidate.entry, `${packageName} entry`);
|
|
35
|
+
const module = relativeFile(candidate.module, `${packageName} module`);
|
|
36
|
+
if (!module.endsWith(".mjs")) throw new Error(`Invalid MCP bundle ${packageName} module: expected .mjs`);
|
|
37
|
+
const sha256 = text(candidate.sha256, `${packageName} sha256`);
|
|
38
|
+
if (!/^[a-f0-9]{64}$/u.test(sha256)) throw new Error(`Invalid MCP bundle ${packageName} sha256`);
|
|
39
|
+
if (!Array.isArray(candidate.owners) || candidate.owners.length === 0) throw new Error(`Invalid MCP bundle ${packageName} owners`);
|
|
40
|
+
const ownership = /* @__PURE__ */ new Set();
|
|
41
|
+
return {
|
|
42
|
+
packageName,
|
|
43
|
+
entry,
|
|
44
|
+
module,
|
|
45
|
+
sha256,
|
|
46
|
+
owners: candidate.owners.map((owner) => {
|
|
47
|
+
if (!record(owner)) throw new Error(`Invalid MCP bundle ${packageName} owner`);
|
|
48
|
+
const majorMode = text(owner.majorMode, `${packageName} majorMode`);
|
|
49
|
+
const layer = text(owner.layer, `${packageName} layer`);
|
|
50
|
+
const key = JSON.stringify([majorMode, layer]);
|
|
51
|
+
if (ownership.has(key)) throw new Error(`Duplicate MCP bundle ${packageName} owner`);
|
|
52
|
+
ownership.add(key);
|
|
53
|
+
return {
|
|
54
|
+
majorMode,
|
|
55
|
+
layer
|
|
56
|
+
};
|
|
57
|
+
})
|
|
58
|
+
};
|
|
59
|
+
})
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//#endregion
|
|
63
|
+
exports.DOOM_MCP_BUNDLE_FILE = DOOM_MCP_BUNDLE_FILE;
|
|
64
|
+
exports.DOOM_MCP_BUNDLE_VERSION = DOOM_MCP_BUNDLE_VERSION;
|
|
65
|
+
exports.parseDoomMcpBundle = parseDoomMcpBundle;
|
|
66
|
+
|
|
67
|
+
//# sourceMappingURL=mcpBundle.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcpBundle.cjs","names":[],"sources":["../../src/schemas/mcpBundle.ts"],"sourcesContent":["import type { DoomServerBundleOwner } from './serverBundle';\n\nexport const DOOM_MCP_BUNDLE_VERSION = 1;\nexport const DOOM_MCP_BUNDLE_FILE = 'mcp.bundle.json';\n\nexport interface DoomMcpBundleEntry {\n readonly packageName: string;\n readonly entry: string;\n readonly module: string;\n readonly sha256: string;\n readonly owners: readonly DoomServerBundleOwner[];\n}\n\nexport interface DoomMcpBundle {\n readonly version: typeof DOOM_MCP_BUNDLE_VERSION;\n readonly generation: string;\n readonly fingerprint: string;\n readonly entries: readonly DoomMcpBundleEntry[];\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction text(value: unknown, field: string): string {\n if (typeof value !== 'string' || value.trim() === '' || value.includes('\\0'))\n throw new Error(`Invalid MCP bundle ${field}`);\n return value;\n}\n\nfunction relativeFile(value: unknown, field: string): string {\n const file = text(value, field);\n const segments = file.slice(2).split('/');\n if (\n !file.startsWith('./') ||\n /[\\\\%?#]/u.test(file) ||\n segments.some((segment) => segment === '' || segment === '.' || segment === '..')\n )\n throw new Error(`Invalid MCP bundle ${field}: expected a contained ./file path`);\n return file;\n}\n\n/** Validates the admitted descriptor before importing any package code. */\nexport function parseDoomMcpBundle(value: unknown): DoomMcpBundle {\n if (!record(value) || value.version !== DOOM_MCP_BUNDLE_VERSION) throw new Error('Unsupported MCP bundle version');\n const generation = text(value.generation, 'generation');\n const fingerprint = text(value.fingerprint, 'fingerprint');\n if (!/^[a-f0-9]{64}$/u.test(fingerprint)) throw new Error('Invalid MCP bundle fingerprint');\n if (!Array.isArray(value.entries)) throw new Error('Invalid MCP bundle entries');\n const names = new Set<string>();\n const entries = value.entries.map((candidate: unknown): DoomMcpBundleEntry => {\n if (!record(candidate)) throw new Error('Invalid MCP bundle entry');\n const packageName = text(candidate.packageName, 'packageName');\n if (names.has(packageName)) throw new Error(`Duplicate MCP bundle package: ${packageName}`);\n names.add(packageName);\n const entry = relativeFile(candidate.entry, `${packageName} entry`);\n const module = relativeFile(candidate.module, `${packageName} module`);\n if (!module.endsWith('.mjs')) throw new Error(`Invalid MCP bundle ${packageName} module: expected .mjs`);\n const sha256 = text(candidate.sha256, `${packageName} sha256`);\n if (!/^[a-f0-9]{64}$/u.test(sha256)) throw new Error(`Invalid MCP bundle ${packageName} sha256`);\n if (!Array.isArray(candidate.owners) || candidate.owners.length === 0)\n throw new Error(`Invalid MCP bundle ${packageName} owners`);\n const ownership = new Set<string>();\n const owners = candidate.owners.map((owner: unknown): DoomServerBundleOwner => {\n if (!record(owner)) throw new Error(`Invalid MCP bundle ${packageName} owner`);\n const majorMode = text(owner.majorMode, `${packageName} majorMode`);\n const layer = text(owner.layer, `${packageName} layer`);\n const key = JSON.stringify([majorMode, layer]);\n if (ownership.has(key)) throw new Error(`Duplicate MCP bundle ${packageName} owner`);\n ownership.add(key);\n return { majorMode, layer };\n });\n return { packageName, entry, module, sha256, owners };\n });\n return { version: DOOM_MCP_BUNDLE_VERSION, generation, fingerprint, entries };\n}\n"],"mappings":";AAEA,MAAa,0BAA0B;AACvC,MAAa,uBAAuB;AAiBpC,SAAS,OAAO,OAAkD;CAChE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,KAAK,OAAgB,OAAuB;CACnD,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,MAAM,MAAM,SAAS,IAAI,GACzE,MAAM,IAAI,MAAM,sBAAsB,OAAO;CAC/C,OAAO;AACT;AAEA,SAAS,aAAa,OAAgB,OAAuB;CAC3D,MAAM,OAAO,KAAK,OAAO,KAAK;CAC9B,MAAM,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG;CACxC,IACE,CAAC,KAAK,WAAW,IAAI,KACrB,WAAW,KAAK,IAAI,KACpB,SAAS,MAAM,YAAY,YAAY,MAAM,YAAY,OAAO,YAAY,IAAI,GAEhF,MAAM,IAAI,MAAM,sBAAsB,MAAM,mCAAmC;CACjF,OAAO;AACT;;AAGA,SAAgB,mBAAmB,OAA+B;CAChE,IAAI,CAAC,OAAO,KAAK,KAAK,MAAM,YAAA,GAAqC,MAAM,IAAI,MAAM,gCAAgC;CACjH,MAAM,aAAa,KAAK,MAAM,YAAY,YAAY;CACtD,MAAM,cAAc,KAAK,MAAM,aAAa,aAAa;CACzD,IAAI,CAAC,kBAAkB,KAAK,WAAW,GAAG,MAAM,IAAI,MAAM,gCAAgC;CAC1F,IAAI,CAAC,MAAM,QAAQ,MAAM,OAAO,GAAG,MAAM,IAAI,MAAM,4BAA4B;CAC/E,MAAM,wBAAQ,IAAI,IAAY;CAyB9B,OAAO;EAAE,SAAA;EAAkC;EAAY;EAAa,SAxBpD,MAAM,QAAQ,KAAK,cAA2C;GAC5E,IAAI,CAAC,OAAO,SAAS,GAAG,MAAM,IAAI,MAAM,0BAA0B;GAClE,MAAM,cAAc,KAAK,UAAU,aAAa,aAAa;GAC7D,IAAI,MAAM,IAAI,WAAW,GAAG,MAAM,IAAI,MAAM,iCAAiC,aAAa;GAC1F,MAAM,IAAI,WAAW;GACrB,MAAM,QAAQ,aAAa,UAAU,OAAO,GAAG,YAAY,OAAO;GAClE,MAAM,SAAS,aAAa,UAAU,QAAQ,GAAG,YAAY,QAAQ;GACrE,IAAI,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,IAAI,MAAM,sBAAsB,YAAY,uBAAuB;GACvG,MAAM,SAAS,KAAK,UAAU,QAAQ,GAAG,YAAY,QAAQ;GAC7D,IAAI,CAAC,kBAAkB,KAAK,MAAM,GAAG,MAAM,IAAI,MAAM,sBAAsB,YAAY,QAAQ;GAC/F,IAAI,CAAC,MAAM,QAAQ,UAAU,MAAM,KAAK,UAAU,OAAO,WAAW,GAClE,MAAM,IAAI,MAAM,sBAAsB,YAAY,QAAQ;GAC5D,MAAM,4BAAY,IAAI,IAAY;GAUlC,OAAO;IAAE;IAAa;IAAO;IAAQ;IAAQ,QAT9B,UAAU,OAAO,KAAK,UAA0C;KAC7E,IAAI,CAAC,OAAO,KAAK,GAAG,MAAM,IAAI,MAAM,sBAAsB,YAAY,OAAO;KAC7E,MAAM,YAAY,KAAK,MAAM,WAAW,GAAG,YAAY,WAAW;KAClE,MAAM,QAAQ,KAAK,MAAM,OAAO,GAAG,YAAY,OAAO;KACtD,MAAM,MAAM,KAAK,UAAU,CAAC,WAAW,KAAK,CAAC;KAC7C,IAAI,UAAU,IAAI,GAAG,GAAG,MAAM,IAAI,MAAM,wBAAwB,YAAY,OAAO;KACnF,UAAU,IAAI,GAAG;KACjB,OAAO;MAAE;MAAW;KAAM;IAC5B,CACkD;GAAE;EACtD,CACoE;CAAQ;AAC9E"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { DoomServerBundleOwner } from "./serverBundle.cjs";
|
|
2
|
+
//#region src/schemas/mcpBundle.d.ts
|
|
3
|
+
export declare const DOOM_MCP_BUNDLE_VERSION = 1;
|
|
4
|
+
export declare const DOOM_MCP_BUNDLE_FILE = "mcp.bundle.json";
|
|
5
|
+
export interface DoomMcpBundleEntry {
|
|
6
|
+
readonly packageName: string;
|
|
7
|
+
readonly entry: string;
|
|
8
|
+
readonly module: string;
|
|
9
|
+
readonly sha256: string;
|
|
10
|
+
readonly owners: readonly DoomServerBundleOwner[];
|
|
11
|
+
}
|
|
12
|
+
export interface DoomMcpBundle {
|
|
13
|
+
readonly version: typeof DOOM_MCP_BUNDLE_VERSION;
|
|
14
|
+
readonly generation: string;
|
|
15
|
+
readonly fingerprint: string;
|
|
16
|
+
readonly entries: readonly DoomMcpBundleEntry[];
|
|
17
|
+
}
|
|
18
|
+
/** Validates the admitted descriptor before importing any package code. */
|
|
19
|
+
export declare function parseDoomMcpBundle(value: unknown): DoomMcpBundle;
|
|
20
|
+
//#endregion
|
|
21
|
+
//# sourceMappingURL=mcpBundle.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcpBundle.d.cts","names":[],"sources":["../../src/schemas/mcpBundle.ts"],"mappings":";;qBAEa;qBACA;iBAEI;WACN;WACA;WACA;WACA;WACA,iBAAiB;;iBAGX;WACN,gBAAgB;WAChB;WACA;WACA,kBAAkB;;;wBA0Bb,mBAAmB,iBAAiB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { DoomServerBundleOwner } from "./serverBundle.mjs";
|
|
2
|
+
//#region src/schemas/mcpBundle.d.ts
|
|
3
|
+
export declare const DOOM_MCP_BUNDLE_VERSION = 1;
|
|
4
|
+
export declare const DOOM_MCP_BUNDLE_FILE = "mcp.bundle.json";
|
|
5
|
+
export interface DoomMcpBundleEntry {
|
|
6
|
+
readonly packageName: string;
|
|
7
|
+
readonly entry: string;
|
|
8
|
+
readonly module: string;
|
|
9
|
+
readonly sha256: string;
|
|
10
|
+
readonly owners: readonly DoomServerBundleOwner[];
|
|
11
|
+
}
|
|
12
|
+
export interface DoomMcpBundle {
|
|
13
|
+
readonly version: typeof DOOM_MCP_BUNDLE_VERSION;
|
|
14
|
+
readonly generation: string;
|
|
15
|
+
readonly fingerprint: string;
|
|
16
|
+
readonly entries: readonly DoomMcpBundleEntry[];
|
|
17
|
+
}
|
|
18
|
+
/** Validates the admitted descriptor before importing any package code. */
|
|
19
|
+
export declare function parseDoomMcpBundle(value: unknown): DoomMcpBundle;
|
|
20
|
+
//#endregion
|
|
21
|
+
//# sourceMappingURL=mcpBundle.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcpBundle.d.mts","names":[],"sources":["../../src/schemas/mcpBundle.ts"],"mappings":";;qBAEa;qBACA;iBAEI;WACN;WACA;WACA;WACA;WACA,iBAAiB;;iBAGX;WACN,gBAAgB;WAChB;WACA;WACA,kBAAkB;;;wBA0Bb,mBAAmB,iBAAiB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
//#region src/schemas/mcpBundle.ts
|
|
2
|
+
const DOOM_MCP_BUNDLE_VERSION = 1;
|
|
3
|
+
const DOOM_MCP_BUNDLE_FILE = "mcp.bundle.json";
|
|
4
|
+
function record(value) {
|
|
5
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6
|
+
}
|
|
7
|
+
function text(value, field) {
|
|
8
|
+
if (typeof value !== "string" || value.trim() === "" || value.includes("\0")) throw new Error(`Invalid MCP bundle ${field}`);
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
function relativeFile(value, field) {
|
|
12
|
+
const file = text(value, field);
|
|
13
|
+
const segments = file.slice(2).split("/");
|
|
14
|
+
if (!file.startsWith("./") || /[\\%?#]/u.test(file) || segments.some((segment) => segment === "" || segment === "." || segment === "..")) throw new Error(`Invalid MCP bundle ${field}: expected a contained ./file path`);
|
|
15
|
+
return file;
|
|
16
|
+
}
|
|
17
|
+
/** Validates the admitted descriptor before importing any package code. */
|
|
18
|
+
function parseDoomMcpBundle(value) {
|
|
19
|
+
if (!record(value) || value.version !== 1) throw new Error("Unsupported MCP bundle version");
|
|
20
|
+
const generation = text(value.generation, "generation");
|
|
21
|
+
const fingerprint = text(value.fingerprint, "fingerprint");
|
|
22
|
+
if (!/^[a-f0-9]{64}$/u.test(fingerprint)) throw new Error("Invalid MCP bundle fingerprint");
|
|
23
|
+
if (!Array.isArray(value.entries)) throw new Error("Invalid MCP bundle entries");
|
|
24
|
+
const names = /* @__PURE__ */ new Set();
|
|
25
|
+
return {
|
|
26
|
+
version: 1,
|
|
27
|
+
generation,
|
|
28
|
+
fingerprint,
|
|
29
|
+
entries: value.entries.map((candidate) => {
|
|
30
|
+
if (!record(candidate)) throw new Error("Invalid MCP bundle entry");
|
|
31
|
+
const packageName = text(candidate.packageName, "packageName");
|
|
32
|
+
if (names.has(packageName)) throw new Error(`Duplicate MCP bundle package: ${packageName}`);
|
|
33
|
+
names.add(packageName);
|
|
34
|
+
const entry = relativeFile(candidate.entry, `${packageName} entry`);
|
|
35
|
+
const module = relativeFile(candidate.module, `${packageName} module`);
|
|
36
|
+
if (!module.endsWith(".mjs")) throw new Error(`Invalid MCP bundle ${packageName} module: expected .mjs`);
|
|
37
|
+
const sha256 = text(candidate.sha256, `${packageName} sha256`);
|
|
38
|
+
if (!/^[a-f0-9]{64}$/u.test(sha256)) throw new Error(`Invalid MCP bundle ${packageName} sha256`);
|
|
39
|
+
if (!Array.isArray(candidate.owners) || candidate.owners.length === 0) throw new Error(`Invalid MCP bundle ${packageName} owners`);
|
|
40
|
+
const ownership = /* @__PURE__ */ new Set();
|
|
41
|
+
return {
|
|
42
|
+
packageName,
|
|
43
|
+
entry,
|
|
44
|
+
module,
|
|
45
|
+
sha256,
|
|
46
|
+
owners: candidate.owners.map((owner) => {
|
|
47
|
+
if (!record(owner)) throw new Error(`Invalid MCP bundle ${packageName} owner`);
|
|
48
|
+
const majorMode = text(owner.majorMode, `${packageName} majorMode`);
|
|
49
|
+
const layer = text(owner.layer, `${packageName} layer`);
|
|
50
|
+
const key = JSON.stringify([majorMode, layer]);
|
|
51
|
+
if (ownership.has(key)) throw new Error(`Duplicate MCP bundle ${packageName} owner`);
|
|
52
|
+
ownership.add(key);
|
|
53
|
+
return {
|
|
54
|
+
majorMode,
|
|
55
|
+
layer
|
|
56
|
+
};
|
|
57
|
+
})
|
|
58
|
+
};
|
|
59
|
+
})
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//#endregion
|
|
63
|
+
export { DOOM_MCP_BUNDLE_FILE, DOOM_MCP_BUNDLE_VERSION, parseDoomMcpBundle };
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=mcpBundle.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcpBundle.mjs","names":[],"sources":["../../src/schemas/mcpBundle.ts"],"sourcesContent":["import type { DoomServerBundleOwner } from './serverBundle';\n\nexport const DOOM_MCP_BUNDLE_VERSION = 1;\nexport const DOOM_MCP_BUNDLE_FILE = 'mcp.bundle.json';\n\nexport interface DoomMcpBundleEntry {\n readonly packageName: string;\n readonly entry: string;\n readonly module: string;\n readonly sha256: string;\n readonly owners: readonly DoomServerBundleOwner[];\n}\n\nexport interface DoomMcpBundle {\n readonly version: typeof DOOM_MCP_BUNDLE_VERSION;\n readonly generation: string;\n readonly fingerprint: string;\n readonly entries: readonly DoomMcpBundleEntry[];\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction text(value: unknown, field: string): string {\n if (typeof value !== 'string' || value.trim() === '' || value.includes('\\0'))\n throw new Error(`Invalid MCP bundle ${field}`);\n return value;\n}\n\nfunction relativeFile(value: unknown, field: string): string {\n const file = text(value, field);\n const segments = file.slice(2).split('/');\n if (\n !file.startsWith('./') ||\n /[\\\\%?#]/u.test(file) ||\n segments.some((segment) => segment === '' || segment === '.' || segment === '..')\n )\n throw new Error(`Invalid MCP bundle ${field}: expected a contained ./file path`);\n return file;\n}\n\n/** Validates the admitted descriptor before importing any package code. */\nexport function parseDoomMcpBundle(value: unknown): DoomMcpBundle {\n if (!record(value) || value.version !== DOOM_MCP_BUNDLE_VERSION) throw new Error('Unsupported MCP bundle version');\n const generation = text(value.generation, 'generation');\n const fingerprint = text(value.fingerprint, 'fingerprint');\n if (!/^[a-f0-9]{64}$/u.test(fingerprint)) throw new Error('Invalid MCP bundle fingerprint');\n if (!Array.isArray(value.entries)) throw new Error('Invalid MCP bundle entries');\n const names = new Set<string>();\n const entries = value.entries.map((candidate: unknown): DoomMcpBundleEntry => {\n if (!record(candidate)) throw new Error('Invalid MCP bundle entry');\n const packageName = text(candidate.packageName, 'packageName');\n if (names.has(packageName)) throw new Error(`Duplicate MCP bundle package: ${packageName}`);\n names.add(packageName);\n const entry = relativeFile(candidate.entry, `${packageName} entry`);\n const module = relativeFile(candidate.module, `${packageName} module`);\n if (!module.endsWith('.mjs')) throw new Error(`Invalid MCP bundle ${packageName} module: expected .mjs`);\n const sha256 = text(candidate.sha256, `${packageName} sha256`);\n if (!/^[a-f0-9]{64}$/u.test(sha256)) throw new Error(`Invalid MCP bundle ${packageName} sha256`);\n if (!Array.isArray(candidate.owners) || candidate.owners.length === 0)\n throw new Error(`Invalid MCP bundle ${packageName} owners`);\n const ownership = new Set<string>();\n const owners = candidate.owners.map((owner: unknown): DoomServerBundleOwner => {\n if (!record(owner)) throw new Error(`Invalid MCP bundle ${packageName} owner`);\n const majorMode = text(owner.majorMode, `${packageName} majorMode`);\n const layer = text(owner.layer, `${packageName} layer`);\n const key = JSON.stringify([majorMode, layer]);\n if (ownership.has(key)) throw new Error(`Duplicate MCP bundle ${packageName} owner`);\n ownership.add(key);\n return { majorMode, layer };\n });\n return { packageName, entry, module, sha256, owners };\n });\n return { version: DOOM_MCP_BUNDLE_VERSION, generation, fingerprint, entries };\n}\n"],"mappings":";AAEA,MAAa,0BAA0B;AACvC,MAAa,uBAAuB;AAiBpC,SAAS,OAAO,OAAkD;CAChE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,KAAK,OAAgB,OAAuB;CACnD,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,MAAM,MAAM,SAAS,IAAI,GACzE,MAAM,IAAI,MAAM,sBAAsB,OAAO;CAC/C,OAAO;AACT;AAEA,SAAS,aAAa,OAAgB,OAAuB;CAC3D,MAAM,OAAO,KAAK,OAAO,KAAK;CAC9B,MAAM,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG;CACxC,IACE,CAAC,KAAK,WAAW,IAAI,KACrB,WAAW,KAAK,IAAI,KACpB,SAAS,MAAM,YAAY,YAAY,MAAM,YAAY,OAAO,YAAY,IAAI,GAEhF,MAAM,IAAI,MAAM,sBAAsB,MAAM,mCAAmC;CACjF,OAAO;AACT;;AAGA,SAAgB,mBAAmB,OAA+B;CAChE,IAAI,CAAC,OAAO,KAAK,KAAK,MAAM,YAAA,GAAqC,MAAM,IAAI,MAAM,gCAAgC;CACjH,MAAM,aAAa,KAAK,MAAM,YAAY,YAAY;CACtD,MAAM,cAAc,KAAK,MAAM,aAAa,aAAa;CACzD,IAAI,CAAC,kBAAkB,KAAK,WAAW,GAAG,MAAM,IAAI,MAAM,gCAAgC;CAC1F,IAAI,CAAC,MAAM,QAAQ,MAAM,OAAO,GAAG,MAAM,IAAI,MAAM,4BAA4B;CAC/E,MAAM,wBAAQ,IAAI,IAAY;CAyB9B,OAAO;EAAE,SAAA;EAAkC;EAAY;EAAa,SAxBpD,MAAM,QAAQ,KAAK,cAA2C;GAC5E,IAAI,CAAC,OAAO,SAAS,GAAG,MAAM,IAAI,MAAM,0BAA0B;GAClE,MAAM,cAAc,KAAK,UAAU,aAAa,aAAa;GAC7D,IAAI,MAAM,IAAI,WAAW,GAAG,MAAM,IAAI,MAAM,iCAAiC,aAAa;GAC1F,MAAM,IAAI,WAAW;GACrB,MAAM,QAAQ,aAAa,UAAU,OAAO,GAAG,YAAY,OAAO;GAClE,MAAM,SAAS,aAAa,UAAU,QAAQ,GAAG,YAAY,QAAQ;GACrE,IAAI,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,IAAI,MAAM,sBAAsB,YAAY,uBAAuB;GACvG,MAAM,SAAS,KAAK,UAAU,QAAQ,GAAG,YAAY,QAAQ;GAC7D,IAAI,CAAC,kBAAkB,KAAK,MAAM,GAAG,MAAM,IAAI,MAAM,sBAAsB,YAAY,QAAQ;GAC/F,IAAI,CAAC,MAAM,QAAQ,UAAU,MAAM,KAAK,UAAU,OAAO,WAAW,GAClE,MAAM,IAAI,MAAM,sBAAsB,YAAY,QAAQ;GAC5D,MAAM,4BAAY,IAAI,IAAY;GAUlC,OAAO;IAAE;IAAa;IAAO;IAAQ;IAAQ,QAT9B,UAAU,OAAO,KAAK,UAA0C;KAC7E,IAAI,CAAC,OAAO,KAAK,GAAG,MAAM,IAAI,MAAM,sBAAsB,YAAY,OAAO;KAC7E,MAAM,YAAY,KAAK,MAAM,WAAW,GAAG,YAAY,WAAW;KAClE,MAAM,QAAQ,KAAK,MAAM,OAAO,GAAG,YAAY,OAAO;KACtD,MAAM,MAAM,KAAK,UAAU,CAAC,WAAW,KAAK,CAAC;KAC7C,IAAI,UAAU,IAAI,GAAG,GAAG,MAAM,IAAI,MAAM,wBAAwB,YAAY,OAAO;KACnF,UAAU,IAAI,GAAG;KACjB,OAAO;MAAE;MAAW;KAAM;IAC5B,CACkD;GAAE;EACtD,CACoE;CAAQ;AAC9E"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/schemas/mcpFacet.ts
|
|
2
|
+
/** Makes an MCP declaration's contract explicit without registering it locally. */
|
|
3
|
+
function defineMcpPlugin(definition) {
|
|
4
|
+
return definition;
|
|
5
|
+
}
|
|
6
|
+
/** `tool/[name].mcp.ts`. Keeps the declaration independently typed. */
|
|
7
|
+
function defineMcpTool(tool) {
|
|
8
|
+
return tool;
|
|
9
|
+
}
|
|
10
|
+
/** `skill/[name].mcp.ts`. Keeps remote guidance out of the local prompt surface. */
|
|
11
|
+
function defineMcpSkill(skill) {
|
|
12
|
+
return skill;
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
exports.defineMcpPlugin = defineMcpPlugin;
|
|
16
|
+
exports.defineMcpSkill = defineMcpSkill;
|
|
17
|
+
exports.defineMcpTool = defineMcpTool;
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=mcpFacet.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcpFacet.cjs","names":[],"sources":["../../src/schemas/mcpFacet.ts"],"sourcesContent":["import type { TSchema } from 'typebox';\n\nimport type {\n DoomHeadlessExecutionContext,\n DoomHeadlessSelection,\n DoomHeadlessSelectionChange,\n DoomHeadlessTool,\n} from './headless';\n\n/** Repository-scoped instructions and applied selection safe to disclose to a remote MCP client. */\nexport interface DoomMcpContextSnapshot {\n readonly session: { readonly id: string; readonly revision: number };\n readonly repository: { readonly root: string; readonly cwd: string };\n readonly selection: {\n readonly profile: string | null;\n readonly domains: readonly string[];\n readonly majorMode: string;\n readonly activeLayers: readonly string[];\n };\n readonly instructions: readonly { readonly path: string; readonly content: string }[];\n readonly persona: string | null;\n}\n\n/** A lazy Markdown resource available only to remote MCP clients. */\nexport interface DoomMcpSkill {\n readonly name: string;\n readonly description: string;\n read(context: DoomHeadlessExecutionContext): string | Promise<string>;\n}\n\n/** A dedicated remote surface, deliberately separate from local agent registrations. */\nexport interface DoomMcpSessionPlugin {\n readonly tools?: readonly DoomHeadlessTool<TSchema>[];\n readonly skills?: readonly DoomMcpSkill[];\n}\n\nexport interface DoomMcpServiceScope {\n /** Reads a service already mounted in this session without exposing host registration APIs. */\n get<T>(name: string): T | undefined;\n}\n\nexport interface DoomMcpPluginContext {\n readonly execution: DoomHeadlessExecutionContext;\n readonly services: DoomMcpServiceScope;\n readonly selection: {\n read(): DoomHeadlessSelection;\n change(change: DoomHeadlessSelectionChange): Promise<void>;\n };\n /** Reads the allowlisted repository context from the current applied session selection. */\n loadContext(): DoomMcpContextSnapshot;\n /** Aborted when this plugin surface is replaced or the session closes. */\n readonly signal: AbortSignal;\n /** Rebuilds the remote surface after a live MCP catalog changes. */\n refresh(): void;\n}\n\nexport interface DoomMcpPluginDefinition {\n readonly name: string;\n readonly session:\n | DoomMcpSessionPlugin\n | ((context: DoomMcpPluginContext) => DoomMcpSessionPlugin | Promise<DoomMcpSessionPlugin>);\n}\n\n/** Makes an MCP declaration's contract explicit without registering it locally. */\nexport function defineMcpPlugin(definition: DoomMcpPluginDefinition): DoomMcpPluginDefinition {\n return definition;\n}\n\n/** `tool/[name].mcp.ts`. Keeps the declaration independently typed. */\nexport function defineMcpTool<TParameters extends TSchema = TSchema, TContext = unknown>(\n tool: DoomHeadlessTool<TParameters> | ((context: TContext) => DoomHeadlessTool<TParameters>),\n): DoomHeadlessTool<TParameters> | ((context: TContext) => DoomHeadlessTool<TParameters>) {\n return tool;\n}\n\n/** `skill/[name].mcp.ts`. Keeps remote guidance out of the local prompt surface. */\nexport function defineMcpSkill<TContext = unknown>(\n skill: DoomMcpSkill | ((context: TContext) => DoomMcpSkill),\n): DoomMcpSkill | ((context: TContext) => DoomMcpSkill) {\n return skill;\n}\n"],"mappings":";;AAgEA,SAAgB,gBAAgB,YAA8D;CAC5F,OAAO;AACT;;AAGA,SAAgB,cACd,MACwF;CACxF,OAAO;AACT;;AAGA,SAAgB,eACd,OACsD;CACtD,OAAO;AACT"}
|