@di-code/coding-agent 0.1.6 → 0.1.8
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/README.md +112 -68
- package/compositions/base.yml +54 -0
- package/compositions/interactive.yml +14 -0
- package/compositions/json.yml +6 -0
- package/compositions/print.yml +5 -0
- package/compositions/rpc.yml +12 -0
- package/compositions/webui.yml +9 -0
- package/dist/cli.d.ts +22 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +97 -3
- package/dist/cli.js.map +1 -1
- package/dist/composition-loader-entry.d.ts +11 -0
- package/dist/composition-loader-entry.d.ts.map +1 -0
- package/dist/composition-loader-entry.js +12 -0
- package/dist/composition-loader-entry.js.map +1 -0
- package/dist/compositions.d.ts +32 -0
- package/dist/compositions.d.ts.map +1 -0
- package/dist/compositions.js +173 -0
- package/dist/compositions.js.map +1 -0
- package/dist/core/session/session-manager.d.ts +9 -2
- package/dist/core/session/session-manager.d.ts.map +1 -1
- package/dist/core/session/session-manager.js +28 -0
- package/dist/core/session/session-manager.js.map +1 -1
- package/dist/core/session/session-storage.d.ts.map +1 -1
- package/dist/core/session/session-storage.js +20 -3
- package/dist/core/session/session-storage.js.map +1 -1
- package/dist/core/session/types.d.ts +11 -2
- package/dist/core/session/types.d.ts.map +1 -1
- package/dist/core/session/types.js.map +1 -1
- package/dist/core/session-tools.d.ts +5 -0
- package/dist/core/session-tools.d.ts.map +1 -0
- package/dist/core/session-tools.js +17 -0
- package/dist/core/session-tools.js.map +1 -0
- package/dist/core/session.d.ts +21 -7
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +77 -41
- package/dist/core/session.js.map +1 -1
- package/dist/core/tools/bash.d.ts +1 -38
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +1 -207
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts +1 -24
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +1 -135
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts +1 -26
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +1 -140
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js +1 -23
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/file-search.d.ts +1 -13
- package/dist/core/tools/file-search.d.ts.map +1 -1
- package/dist/core/tools/file-search.js +1 -98
- package/dist/core/tools/file-search.js.map +1 -1
- package/dist/core/tools/glob.d.ts +1 -10
- package/dist/core/tools/glob.d.ts.map +1 -1
- package/dist/core/tools/glob.js +1 -43
- package/dist/core/tools/glob.js.map +1 -1
- package/dist/core/tools/grep.d.ts +1 -12
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +1 -66
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/load-skill.d.ts +1 -9
- package/dist/core/tools/load-skill.d.ts.map +1 -1
- package/dist/core/tools/load-skill.js +1 -21
- package/dist/core/tools/load-skill.js.map +1 -1
- package/dist/core/tools/path-boundary.d.ts +1 -4
- package/dist/core/tools/path-boundary.d.ts.map +1 -1
- package/dist/core/tools/path-boundary.js +1 -65
- package/dist/core/tools/path-boundary.js.map +1 -1
- package/dist/core/tools/read.d.ts +1 -16
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +1 -131
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/write.d.ts +1 -16
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +1 -44
- package/dist/core/tools/write.js.map +1 -1
- package/dist/entry.js +30 -28
- package/dist/entry.js.map +1 -1
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +2 -0
- package/dist/i18n.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/interactive/builtin.d.ts +17 -0
- package/dist/interactive/builtin.d.ts.map +1 -0
- package/dist/interactive/builtin.js +47 -0
- package/dist/interactive/builtin.js.map +1 -0
- package/dist/interactive/controller.d.ts +85 -0
- package/dist/interactive/controller.d.ts.map +1 -0
- package/dist/interactive/controller.js +211 -0
- package/dist/interactive/controller.js.map +1 -0
- package/dist/interactive/index.d.ts +3 -0
- package/dist/interactive/index.d.ts.map +1 -0
- package/dist/interactive/index.js +3 -0
- package/dist/interactive/index.js.map +1 -0
- package/dist/interactive-host-entry.d.ts +7 -0
- package/dist/interactive-host-entry.d.ts.map +1 -0
- package/dist/interactive-host-entry.js +123 -0
- package/dist/interactive-host-entry.js.map +1 -0
- package/dist/interactive-profile.d.ts +18 -0
- package/dist/interactive-profile.d.ts.map +1 -0
- package/dist/interactive-profile.js +290 -0
- package/dist/interactive-profile.js.map +1 -0
- package/dist/interactive-resources-entry.d.ts +7 -0
- package/dist/interactive-resources-entry.d.ts.map +1 -0
- package/dist/interactive-resources-entry.js +42 -0
- package/dist/interactive-resources-entry.js.map +1 -0
- package/dist/legacy-main.d.ts +39 -0
- package/dist/legacy-main.d.ts.map +1 -0
- package/dist/legacy-main.js +611 -0
- package/dist/legacy-main.js.map +1 -0
- package/dist/main.d.ts +15 -34
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +130 -513
- package/dist/main.js.map +1 -1
- package/dist/mcp/entries.d.ts +42 -0
- package/dist/mcp/entries.d.ts.map +1 -0
- package/dist/mcp/entries.js +98 -0
- package/dist/mcp/entries.js.map +1 -0
- package/dist/mcp-client-entry.d.ts +5 -0
- package/dist/mcp-client-entry.d.ts.map +1 -0
- package/dist/mcp-client-entry.js +6 -0
- package/dist/mcp-client-entry.js.map +1 -0
- package/dist/mcp-config-entry.d.ts +5 -0
- package/dist/mcp-config-entry.d.ts.map +1 -0
- package/dist/mcp-config-entry.js +6 -0
- package/dist/mcp-config-entry.js.map +1 -0
- package/dist/mcp-tools-entry.d.ts +5 -0
- package/dist/mcp-tools-entry.d.ts.map +1 -0
- package/dist/mcp-tools-entry.js +6 -0
- package/dist/mcp-tools-entry.js.map +1 -0
- package/dist/mcp-transport-entry.d.ts +5 -0
- package/dist/mcp-transport-entry.d.ts.map +1 -0
- package/dist/mcp-transport-entry.js +6 -0
- package/dist/mcp-transport-entry.js.map +1 -0
- package/dist/modes/interactive-entry.d.ts +18 -0
- package/dist/modes/interactive-entry.d.ts.map +1 -0
- package/dist/modes/interactive-entry.js +21 -0
- package/dist/modes/interactive-entry.js.map +1 -0
- package/dist/modes/interactive-state.js +1 -1
- package/dist/modes/interactive-state.js.map +1 -1
- package/dist/modes/interactive.d.ts +16 -6
- package/dist/modes/interactive.d.ts.map +1 -1
- package/dist/modes/interactive.js +99 -33
- package/dist/modes/interactive.js.map +1 -1
- package/dist/modes/json-entry.d.ts +13 -0
- package/dist/modes/json-entry.d.ts.map +1 -0
- package/dist/modes/json-entry.js +14 -0
- package/dist/modes/json-entry.js.map +1 -0
- package/dist/modes/json.d.ts +4 -1
- package/dist/modes/json.d.ts.map +1 -1
- package/dist/modes/json.js +3 -3
- package/dist/modes/json.js.map +1 -1
- package/dist/modes/print-entry.d.ts +10 -0
- package/dist/modes/print-entry.d.ts.map +1 -0
- package/dist/modes/print-entry.js +11 -0
- package/dist/modes/print-entry.js.map +1 -0
- package/dist/modes/tree-selector.d.ts.map +1 -1
- package/dist/modes/tree-selector.js +4 -0
- package/dist/modes/tree-selector.js.map +1 -1
- package/dist/plugin-dump-composition.d.ts +6 -0
- package/dist/plugin-dump-composition.d.ts.map +1 -0
- package/dist/plugin-dump-composition.js +7 -0
- package/dist/plugin-dump-composition.js.map +1 -0
- package/dist/plugin-inventory.d.ts +7 -0
- package/dist/plugin-inventory.d.ts.map +1 -0
- package/dist/plugin-inventory.js +8 -0
- package/dist/plugin-inventory.js.map +1 -0
- package/dist/plugin-manager.d.ts +6 -0
- package/dist/plugin-manager.d.ts.map +1 -0
- package/dist/plugin-manager.js +7 -0
- package/dist/plugin-manager.js.map +1 -0
- package/dist/plugin-trace.d.ts +6 -0
- package/dist/plugin-trace.d.ts.map +1 -0
- package/dist/plugin-trace.js +7 -0
- package/dist/plugin-trace.js.map +1 -0
- package/dist/plugins/dynamic-broker.d.ts +76 -0
- package/dist/plugins/dynamic-broker.d.ts.map +1 -0
- package/dist/plugins/dynamic-broker.js +852 -0
- package/dist/plugins/dynamic-broker.js.map +1 -0
- package/dist/plugins/profile.d.ts +15 -0
- package/dist/plugins/profile.d.ts.map +1 -0
- package/dist/plugins/profile.js +34 -0
- package/dist/plugins/profile.js.map +1 -0
- package/dist/plugins/runtime-host.d.ts +37 -0
- package/dist/plugins/runtime-host.d.ts.map +1 -0
- package/dist/plugins/runtime-host.js +95 -0
- package/dist/plugins/runtime-host.js.map +1 -0
- package/dist/plugins/trust.d.ts +8 -0
- package/dist/plugins/trust.d.ts.map +1 -0
- package/dist/plugins/trust.js +59 -0
- package/dist/plugins/trust.js.map +1 -0
- package/dist/project-trust-entry.d.ts +15 -0
- package/dist/project-trust-entry.d.ts.map +1 -0
- package/dist/project-trust-entry.js +15 -0
- package/dist/project-trust-entry.js.map +1 -0
- package/dist/rpc/client.d.ts +78 -6
- package/dist/rpc/client.d.ts.map +1 -1
- package/dist/rpc/client.js +172 -4
- package/dist/rpc/client.js.map +1 -1
- package/dist/rpc/dispatcher.d.ts +121 -0
- package/dist/rpc/dispatcher.d.ts.map +1 -0
- package/dist/rpc/dispatcher.js +994 -0
- package/dist/rpc/dispatcher.js.map +1 -0
- package/dist/rpc/index.d.ts +2 -0
- package/dist/rpc/index.d.ts.map +1 -1
- package/dist/rpc/index.js +2 -0
- package/dist/rpc/index.js.map +1 -1
- package/dist/rpc/lifecycle.d.ts +6 -0
- package/dist/rpc/lifecycle.d.ts.map +1 -0
- package/dist/rpc/lifecycle.js +24 -0
- package/dist/rpc/lifecycle.js.map +1 -0
- package/dist/rpc/protocol.d.ts +112 -31
- package/dist/rpc/protocol.d.ts.map +1 -1
- package/dist/rpc/protocol.js +569 -117
- package/dist/rpc/protocol.js.map +1 -1
- package/dist/rpc/server-service.d.ts +7 -0
- package/dist/rpc/server-service.d.ts.map +1 -0
- package/dist/rpc/server-service.js +3 -0
- package/dist/rpc/server-service.js.map +1 -0
- package/dist/rpc/server.d.ts +16 -19
- package/dist/rpc/server.d.ts.map +1 -1
- package/dist/rpc/server.js +59 -115
- package/dist/rpc/server.js.map +1 -1
- package/dist/rpc-client-sdk-entry.d.ts +12 -0
- package/dist/rpc-client-sdk-entry.d.ts.map +1 -0
- package/dist/rpc-client-sdk-entry.js +11 -0
- package/dist/rpc-client-sdk-entry.js.map +1 -0
- package/dist/rpc-entry.js +50 -18
- package/dist/rpc-entry.js.map +1 -1
- package/dist/rpc-server-entry.d.ts +8 -0
- package/dist/rpc-server-entry.d.ts.map +1 -0
- package/dist/rpc-server-entry.js +67 -0
- package/dist/rpc-server-entry.js.map +1 -0
- package/dist/runtime/attachment-store.d.ts +13 -0
- package/dist/runtime/attachment-store.d.ts.map +1 -0
- package/dist/runtime/attachment-store.js +93 -0
- package/dist/runtime/attachment-store.js.map +1 -0
- package/dist/runtime/bootstrap.d.ts +14 -0
- package/dist/runtime/bootstrap.d.ts.map +1 -0
- package/dist/runtime/bootstrap.js +29 -0
- package/dist/runtime/bootstrap.js.map +1 -0
- package/dist/runtime/interactive-host-service.d.ts +22 -0
- package/dist/runtime/interactive-host-service.d.ts.map +1 -0
- package/dist/runtime/interactive-host-service.js +2 -0
- package/dist/runtime/interactive-host-service.js.map +1 -0
- package/dist/runtime/interactive-resource-service.d.ts +11 -0
- package/dist/runtime/interactive-resource-service.d.ts.map +1 -0
- package/dist/runtime/interactive-resource-service.js +3 -0
- package/dist/runtime/interactive-resource-service.js.map +1 -0
- package/dist/runtime/plugin-inventory-entry.d.ts +5 -0
- package/dist/runtime/plugin-inventory-entry.d.ts.map +1 -0
- package/dist/runtime/plugin-inventory-entry.js +18 -0
- package/dist/runtime/plugin-inventory-entry.js.map +1 -0
- package/dist/runtime/plugin-inventory-service.d.ts +8 -0
- package/dist/runtime/plugin-inventory-service.d.ts.map +1 -0
- package/dist/runtime/plugin-inventory-service.js +3 -0
- package/dist/runtime/plugin-inventory-service.js.map +1 -0
- package/dist/runtime/plugin-manager-entry.d.ts +20 -0
- package/dist/runtime/plugin-manager-entry.d.ts.map +1 -0
- package/dist/runtime/plugin-manager-entry.js +96 -0
- package/dist/runtime/plugin-manager-entry.js.map +1 -0
- package/dist/runtime/plugin-observability-entry.d.ts +12 -0
- package/dist/runtime/plugin-observability-entry.d.ts.map +1 -0
- package/dist/runtime/plugin-observability-entry.js +73 -0
- package/dist/runtime/plugin-observability-entry.js.map +1 -0
- package/dist/runtime/product-host.d.ts +91 -0
- package/dist/runtime/product-host.d.ts.map +1 -0
- package/dist/runtime/product-host.js +529 -0
- package/dist/runtime/product-host.js.map +1 -0
- package/dist/runtime/session-factory.d.ts +17 -0
- package/dist/runtime/session-factory.d.ts.map +1 -0
- package/dist/runtime/session-factory.js +75 -0
- package/dist/runtime/session-factory.js.map +1 -0
- package/dist/runtime/session-host.d.ts +152 -0
- package/dist/runtime/session-host.d.ts.map +1 -0
- package/dist/runtime/session-host.js +895 -0
- package/dist/runtime/session-host.js.map +1 -0
- package/dist/runtime-core-entry.d.ts +11 -0
- package/dist/runtime-core-entry.d.ts.map +1 -0
- package/dist/runtime-core-entry.js +9 -0
- package/dist/runtime-core-entry.js.map +1 -0
- package/dist/session-factory-entry.d.ts +7 -0
- package/dist/session-factory-entry.d.ts.map +1 -0
- package/dist/session-factory-entry.js +9 -0
- package/dist/session-factory-entry.js.map +1 -0
- package/dist/session-store-jsonl-entry.d.ts +7 -0
- package/dist/session-store-jsonl-entry.d.ts.map +1 -0
- package/dist/session-store-jsonl-entry.js +33 -0
- package/dist/session-store-jsonl-entry.js.map +1 -0
- package/dist/startup.d.ts +21 -1
- package/dist/startup.d.ts.map +1 -1
- package/dist/startup.js +179 -10
- package/dist/startup.js.map +1 -1
- package/dist/subagents/index.d.ts +2 -0
- package/dist/subagents/index.d.ts.map +1 -0
- package/dist/subagents/index.js +2 -0
- package/dist/subagents/index.js.map +1 -0
- package/dist/subagents/service.d.ts +50 -0
- package/dist/subagents/service.d.ts.map +1 -0
- package/dist/subagents/service.js +521 -0
- package/dist/subagents/service.js.map +1 -0
- package/dist/ui-host.d.ts +125 -0
- package/dist/ui-host.d.ts.map +1 -0
- package/dist/ui-host.js +275 -0
- package/dist/ui-host.js.map +1 -0
- package/dist/web/assets/index-BwfuGMvv.css +1 -0
- package/dist/web/assets/index-DPUaJqFJ.js +41 -0
- package/dist/web/assets/index-DPUaJqFJ.js.map +1 -0
- package/dist/web/index.html +14 -0
- package/dist/web-command.d.ts +11 -0
- package/dist/web-command.d.ts.map +1 -0
- package/dist/web-command.js +114 -0
- package/dist/web-command.js.map +1 -0
- package/dist/web-frontend.d.ts +73 -0
- package/dist/web-frontend.d.ts.map +1 -0
- package/dist/web-frontend.js +249 -0
- package/dist/web-frontend.js.map +1 -0
- package/dist/web.d.ts +254 -0
- package/dist/web.d.ts.map +1 -0
- package/dist/web.js +740 -0
- package/dist/web.js.map +1 -0
- package/dist/webui-entry.d.ts +3 -0
- package/dist/webui-entry.d.ts.map +1 -0
- package/dist/webui-entry.js +73 -0
- package/dist/webui-entry.js.map +1 -0
- package/dist/webui.d.ts +91 -0
- package/dist/webui.d.ts.map +1 -0
- package/dist/webui.js +882 -0
- package/dist/webui.js.map +1 -0
- package/package.json +89 -8
package/dist/web.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ImageContent } from \"@di-code/ai\";\nimport type { InteractiveController, InteractiveInput, InteractiveViewEvent } from \"./interactive/controller.ts\";\n\nexport const WEB_PROTOCOL_VERSION = 1 as const;\nexport const WEB_MAX_ID_LENGTH = 128;\nexport const WEB_MAX_TOKEN_LENGTH = 4096;\nexport const WEB_MAX_PAYLOAD_BYTES = 1_048_576;\nexport const WEB_DEFAULT_REPLAY_LIMIT = 256;\n\nexport type WebAction =\n\t| { readonly type: \"submit\"; readonly input: InteractiveInput }\n\t| { readonly type: \"steer\"; readonly input: InteractiveInput }\n\t| { readonly type: \"cancel\" }\n\t| { readonly type: \"retry\" }\n\t| { readonly type: \"run_command\"; readonly name: string; readonly args: string }\n\t| { readonly type: \"select_model\"; readonly modelId: string }\n\t| { readonly type: \"open_session\"; readonly sessionId: string }\n\t| { readonly type: \"create_session\" }\n\t| { readonly type: \"compact\" }\n\t| { readonly type: \"slot_action\"; readonly slotId: string; readonly payload?: unknown };\nexport type WebActionType = WebAction[\"type\"];\n\nexport type WebClientMessage =\n\t| {\n\t\t\treadonly version: typeof WEB_PROTOCOL_VERSION;\n\t\t\treadonly kind: \"connect\";\n\t\t\treadonly requestId: string;\n\t\t\treadonly token: string;\n\t\t\treadonly frontendId: string;\n\t\t\treadonly lastEventId?: number;\n\t }\n\t| {\n\t\t\treadonly version: typeof WEB_PROTOCOL_VERSION;\n\t\t\treadonly kind: \"action\";\n\t\t\treadonly requestId: string;\n\t\t\treadonly action: WebAction;\n\t\t\treadonly baseEventId?: number;\n\t }\n\t| { readonly version: typeof WEB_PROTOCOL_VERSION; readonly kind: \"disconnect\"; readonly requestId: string };\n\nexport interface WebSlot {\n\treadonly id: string;\n\treadonly title: string;\n\treadonly data: unknown;\n}\n\nexport interface WebServerHello {\n\treadonly version: typeof WEB_PROTOCOL_VERSION;\n\treadonly kind: \"hello\";\n\treadonly requestId: string;\n\treadonly connectionId: string;\n\treadonly sessionId: string;\n\treadonly state: unknown;\n\treadonly slots: readonly WebSlot[];\n\treadonly eventId: number;\n\treadonly replayedFrom?: number;\n\treadonly resyncRequired?: boolean;\n}\n\nexport interface WebServerEvent {\n\treadonly version: typeof WEB_PROTOCOL_VERSION;\n\treadonly kind: \"event\";\n\treadonly eventId: number;\n\treadonly event: InteractiveViewEvent;\n}\n\nexport interface WebServerMessage {\n\treadonly version: typeof WEB_PROTOCOL_VERSION;\n\treadonly kind: \"hello\" | \"event\" | \"slots\" | \"response\" | \"error\" | \"closed\";\n\treadonly requestId?: string;\n\treadonly eventId?: number;\n\treadonly ok?: boolean;\n\treadonly result?: unknown;\n\treadonly code?: WebErrorCode;\n\treadonly message?: string;\n\treadonly connectionId?: string;\n\treadonly sessionId?: string;\n\treadonly state?: unknown;\n\treadonly slots?: readonly WebSlot[];\n\treadonly replayedFrom?: number;\n\treadonly resyncRequired?: boolean;\n\treadonly event?: InteractiveViewEvent;\n}\n\nexport type WebErrorCode =\n\t| \"INVALID_MESSAGE\"\n\t| \"UNAUTHORIZED\"\n\t| \"FORBIDDEN\"\n\t| \"EXPIRED\"\n\t| \"STALE_EVENT\"\n\t| \"INVALID_ACTION\"\n\t| \"INTERNAL_ERROR\";\n\nexport interface WebTransport {\n\tsend(message: string): void;\n\tclose?(code?: number, reason?: string): void;\n\tonMessage(listener: (message: string) => void): () => void;\n\tonClose(listener: () => void): () => void;\n}\n\n/** Minimal WebSocket shape shared by browsers and popular Node WebSocket clients. */\nexport interface WebSocketLike {\n\treadonly readyState?: number;\n\tsend(message: string): void;\n\tclose?(code?: number, reason?: string): void;\n\taddEventListener?(type: \"open\" | \"message\" | \"close\", listener: (event: unknown) => void): void;\n\tremoveEventListener?(type: \"open\" | \"message\" | \"close\", listener: (event: unknown) => void): void;\n\ton?(type: \"open\" | \"message\" | \"close\", listener: (event: unknown) => void): void;\n\toff?(type: \"open\" | \"message\" | \"close\", listener: (event: unknown) => void): void;\n\tonopen?: (() => void) | null;\n\tonmessage?: ((event: unknown) => void) | null;\n\tonclose?: ((event: unknown) => void) | null;\n}\n\nfunction webSocketPayload(event: unknown): string {\n\tif (typeof event === \"string\") return event;\n\tif (event instanceof Uint8Array) return new TextDecoder().decode(event);\n\tconst record = objectRecord(event);\n\tif (record && typeof record.data === \"string\") return record.data;\n\tif (record && record.data instanceof Uint8Array) return new TextDecoder().decode(record.data);\n\treturn String(event);\n}\n\nfunction webSocketListener(\n\tsocket: WebSocketLike,\n\ttype: \"open\" | \"message\" | \"close\",\n\tlistener: (event: unknown) => void,\n): () => void {\n\tif (socket.addEventListener) {\n\t\tsocket.addEventListener(type, listener);\n\t\treturn () => socket.removeEventListener?.(type, listener);\n\t}\n\tif (socket.on) {\n\t\tsocket.on(type, listener);\n\t\treturn () => socket.off?.(type, listener);\n\t}\n\tconst property = type === \"message\" ? \"onmessage\" : type === \"close\" ? \"onclose\" : \"onopen\";\n\tconst eventProperties = socket as unknown as Record<string, unknown>;\n\tconst previous = eventProperties[property];\n\teventProperties[property] = listener;\n\treturn () => {\n\t\tif (eventProperties[property] === listener) eventProperties[property] = previous ?? null;\n\t};\n}\n\n/** Adapts a browser WebSocket or a Node `ws` instance to the host-neutral transport. */\nexport class WebSocketTransport implements WebTransport {\n\tprivate readonly socket: WebSocketLike;\n\tprivate readonly removeMessage: () => void;\n\tprivate readonly removeClose: () => void;\n\n\tconstructor(socket: WebSocketLike) {\n\t\tthis.socket = socket;\n\t\tthis.messageListeners = new Set();\n\t\tthis.closeListeners = new Set();\n\t\tthis.removeMessage = webSocketListener(socket, \"message\", (event) => {\n\t\t\tconst payload = webSocketPayload(event);\n\t\t\tfor (const listener of this.messageListeners) listener(payload);\n\t\t});\n\t\tthis.removeClose = webSocketListener(socket, \"close\", () => {\n\t\t\tfor (const listener of this.closeListeners) listener();\n\t\t});\n\t}\n\n\tprivate readonly messageListeners: Set<(message: string) => void>;\n\tprivate readonly closeListeners: Set<() => void>;\n\n\tsend(message: string): void {\n\t\tthis.socket.send(message);\n\t}\n\n\tclose(code?: number, reason?: string): void {\n\t\tthis.removeMessage();\n\t\tthis.removeClose();\n\t\tthis.socket.close?.(code, reason);\n\t}\n\n\tonMessage(listener: (message: string) => void): () => void {\n\t\tthis.messageListeners.add(listener);\n\t\treturn () => this.messageListeners.delete(listener);\n\t}\n\n\tonClose(listener: () => void): () => void {\n\t\tthis.closeListeners.add(listener);\n\t\treturn () => this.closeListeners.delete(listener);\n\t}\n}\n\nexport interface WebSocketConstructor {\n\tnew (url: string, protocols?: string | string[]): WebSocketLike;\n}\n\n/** Opens a browser WebSocket and resolves once its handshake is ready. */\nexport function connectWebSocketTransport(\n\turl: string,\n\toptions: { readonly protocols?: string | string[]; readonly WebSocket?: WebSocketConstructor } = {},\n): Promise<WebSocketTransport> {\n\tconst WebSocketClass = options.WebSocket ?? (globalThis as { WebSocket?: WebSocketConstructor }).WebSocket;\n\tif (!WebSocketClass) return Promise.reject(new Error(\"WebSocket is not available in this runtime.\"));\n\treturn new Promise((resolve, reject) => {\n\t\tconst socket = new WebSocketClass(url, options.protocols);\n\t\tlet settled = false;\n\t\tconst removeClose = webSocketListener(socket, \"close\", () => {\n\t\t\tif (!settled) {\n\t\t\t\tsettled = true;\n\t\t\t\treject(new Error(\"WebSocket closed before connection.\"));\n\t\t\t}\n\t\t});\n\t\tconst record = socket;\n\t\tconst onOpen = () => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tremoveClose();\n\t\t\tresolve(new WebSocketTransport(socket));\n\t\t};\n\t\twebSocketListener(record, \"open\", onOpen);\n\t});\n}\n\nexport interface WebAuthorization {\n\treadonly token: string;\n\treadonly allowedFrontendIds: readonly string[];\n\treadonly allowedSlotIds: readonly string[];\n\treadonly allowedActions?: readonly WebActionType[];\n\treadonly expiresAt?: number;\n}\n\nexport interface WebFrontendHostOptions {\n\treadonly controller: InteractiveController;\n\treadonly authorization: WebAuthorization;\n\treadonly replayLimit?: number;\n\treadonly now?: () => number;\n\treadonly slotActions?: Readonly<\n\t\tRecord<string, (payload: unknown, context: { readonly sessionId: string }) => void | Promise<void>>\n\t>;\n}\n\nexport class WebProtocolError extends Error {\n\treadonly code: WebErrorCode;\n\tconstructor(code: WebErrorCode, message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"WebProtocolError\";\n\t\tthis.code = code;\n\t}\n}\n\nfunction objectRecord(value: unknown): Record<string, unknown> | undefined {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value)\n\t\t? (value as Record<string, unknown>)\n\t\t: undefined;\n}\n\nfunction utf8ByteLength(value: string): number {\n\treturn typeof TextEncoder === \"function\" ? new TextEncoder().encode(value).byteLength : value.length;\n}\n\nfunction requiredId(value: unknown, field: string): string {\n\tif (\n\t\ttypeof value !== \"string\" ||\n\t\tvalue.length === 0 ||\n\t\tvalue.length > WEB_MAX_ID_LENGTH ||\n\t\tvalue.trim() !== value ||\n\t\t[...value].some((character) => {\n\t\t\tconst code = character.codePointAt(0) ?? 0;\n\t\t\treturn code <= 0x1f || code === 0x7f;\n\t\t})\n\t)\n\t\tthrow new WebProtocolError(\"INVALID_MESSAGE\", `${field} must be a non-empty identifier.`);\n\treturn value;\n}\n\nfunction optionalEventId(value: unknown, field: string): number | undefined {\n\tif (value === undefined) return undefined;\n\tif (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 0)\n\t\tthrow new WebProtocolError(\"INVALID_MESSAGE\", `${field} must be a non-negative safe integer.`);\n\treturn value;\n}\n\nfunction inputValue(value: unknown, field: string): InteractiveInput {\n\tif (typeof value === \"string\") {\n\t\tif (!value.trim()) throw new WebProtocolError(\"INVALID_ACTION\", `${field} must not be empty.`);\n\t\treturn value;\n\t}\n\tconst record = objectRecord(value);\n\tif (!record || typeof record.text !== \"string\" || !record.text.trim())\n\t\tthrow new WebProtocolError(\"INVALID_ACTION\", `${field} must contain non-empty text.`);\n\tif (record.images === undefined) return { text: record.text };\n\tif (!Array.isArray(record.images) || record.images.length > 4)\n\t\tthrow new WebProtocolError(\"INVALID_ACTION\", `${field}.images must contain at most four images.`);\n\tconst images = record.images.map((image, index) => {\n\t\tconst item = objectRecord(image);\n\t\tif (\n\t\t\t!item ||\n\t\t\titem.type !== \"image\" ||\n\t\t\ttypeof item.mimeType !== \"string\" ||\n\t\t\ttypeof item.data !== \"string\" ||\n\t\t\titem.data.length === 0\n\t\t)\n\t\t\tthrow new WebProtocolError(\"INVALID_ACTION\", `${field}.images[${index}] is invalid.`);\n\t\treturn { type: \"image\", mimeType: item.mimeType, data: item.data } satisfies ImageContent;\n\t});\n\treturn { text: record.text, images };\n}\n\nexport function parseWebClientMessage(input: string | unknown): WebClientMessage {\n\tlet value: unknown = input;\n\tif (typeof input === \"string\") {\n\t\tif (utf8ByteLength(input) > WEB_MAX_PAYLOAD_BYTES)\n\t\t\tthrow new WebProtocolError(\"INVALID_MESSAGE\", \"Web message is too large.\");\n\t\ttry {\n\t\t\tvalue = JSON.parse(input);\n\t\t} catch {\n\t\t\tthrow new WebProtocolError(\"INVALID_MESSAGE\", \"Web message must be valid JSON.\");\n\t\t}\n\t}\n\tconst record = objectRecord(value);\n\tif (!record || record.version !== WEB_PROTOCOL_VERSION)\n\t\tthrow new WebProtocolError(\"INVALID_MESSAGE\", \"Unsupported web protocol message.\");\n\tconst requestId = requiredId(record.requestId, \"requestId\");\n\tif (record.kind === \"connect\") {\n\t\tconst token = record.token;\n\t\tif (typeof token !== \"string\" || token.length === 0 || token.length > WEB_MAX_TOKEN_LENGTH)\n\t\t\tthrow new WebProtocolError(\"INVALID_MESSAGE\", \"connect.token is invalid.\");\n\t\treturn {\n\t\t\tversion: WEB_PROTOCOL_VERSION,\n\t\t\tkind: \"connect\",\n\t\t\trequestId,\n\t\t\ttoken,\n\t\t\tfrontendId: requiredId(record.frontendId, \"frontendId\"),\n\t\t\t...(optionalEventId(record.lastEventId, \"lastEventId\") === undefined\n\t\t\t\t? {}\n\t\t\t\t: { lastEventId: record.lastEventId as number }),\n\t\t};\n\t}\n\tif (record.kind === \"disconnect\") return { version: WEB_PROTOCOL_VERSION, kind: \"disconnect\", requestId };\n\tif (record.kind !== \"action\") throw new WebProtocolError(\"INVALID_MESSAGE\", \"Unknown web message kind.\");\n\tconst action = objectRecord(record.action);\n\tif (!action || typeof action.type !== \"string\")\n\t\tthrow new WebProtocolError(\"INVALID_ACTION\", \"Web action is invalid.\");\n\tlet normalized: WebAction;\n\tswitch (action.type) {\n\t\tcase \"submit\":\n\t\t\tnormalized = { type: \"submit\", input: inputValue(action.input, \"submit.input\") };\n\t\t\tbreak;\n\t\tcase \"steer\":\n\t\t\tnormalized = { type: \"steer\", input: inputValue(action.input, \"steer.input\") };\n\t\t\tbreak;\n\t\tcase \"cancel\":\n\t\tcase \"retry\":\n\t\tcase \"create_session\":\n\t\tcase \"compact\":\n\t\t\tnormalized = { type: action.type };\n\t\t\tbreak;\n\t\tcase \"run_command\":\n\t\t\tnormalized = {\n\t\t\t\ttype: action.type,\n\t\t\t\tname: requiredId(action.name, \"action.name\"),\n\t\t\t\targs: typeof action.args === \"string\" ? action.args : \"\",\n\t\t\t};\n\t\t\tbreak;\n\t\tcase \"select_model\":\n\t\t\tnormalized = { type: action.type, modelId: requiredId(action.modelId, \"action.modelId\") };\n\t\t\tbreak;\n\t\tcase \"open_session\":\n\t\t\tnormalized = { type: action.type, sessionId: requiredId(action.sessionId, \"action.sessionId\") };\n\t\t\tbreak;\n\t\tcase \"slot_action\":\n\t\t\tnormalized = { type: action.type, slotId: requiredId(action.slotId, \"action.slotId\"), payload: action.payload };\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new WebProtocolError(\"INVALID_ACTION\", \"Unknown web action.\");\n\t}\n\treturn {\n\t\tversion: WEB_PROTOCOL_VERSION,\n\t\tkind: \"action\",\n\t\trequestId,\n\t\taction: normalized,\n\t\t...(optionalEventId(record.baseEventId, \"baseEventId\") === undefined\n\t\t\t? {}\n\t\t\t: { baseEventId: record.baseEventId as number }),\n\t};\n}\n\nexport function parseWebServerMessage(input: string | unknown): WebServerMessage {\n\tlet value: unknown = input;\n\tif (typeof input === \"string\") {\n\t\tif (utf8ByteLength(input) > WEB_MAX_PAYLOAD_BYTES)\n\t\t\tthrow new WebProtocolError(\"INVALID_MESSAGE\", \"Web message is too large.\");\n\t\ttry {\n\t\t\tvalue = JSON.parse(input);\n\t\t} catch {\n\t\t\tthrow new WebProtocolError(\"INVALID_MESSAGE\", \"Web message must be valid JSON.\");\n\t\t}\n\t}\n\tconst record = objectRecord(value);\n\tif (!record || record.version !== WEB_PROTOCOL_VERSION || typeof record.kind !== \"string\")\n\t\tthrow new WebProtocolError(\"INVALID_MESSAGE\", \"Web server message is invalid.\");\n\tif (![\"hello\", \"event\", \"slots\", \"response\", \"error\", \"closed\"].includes(record.kind))\n\t\tthrow new WebProtocolError(\"INVALID_MESSAGE\", \"Unknown web server message kind.\");\n\tif (record.kind === \"event\") {\n\t\tif (optionalEventId(record.eventId, \"eventId\") === undefined)\n\t\t\tthrow new WebProtocolError(\"INVALID_MESSAGE\", \"Web event message must contain eventId.\");\n\t\tconst event = objectRecord(record.event);\n\t\tif (!event || typeof event.type !== \"string\")\n\t\t\tthrow new WebProtocolError(\"INVALID_MESSAGE\", \"Web event message is invalid.\");\n\t}\n\tif (record.kind === \"slots\") {\n\t\tif (!Array.isArray(record.slots)) throw new WebProtocolError(\"INVALID_MESSAGE\", \"Web slots message is invalid.\");\n\t\tfor (const slot of record.slots) {\n\t\t\tconst item = objectRecord(slot);\n\t\t\tif (!item || typeof item.id !== \"string\" || typeof item.title !== \"string\" || !Object.hasOwn(item, \"data\"))\n\t\t\t\tthrow new WebProtocolError(\"INVALID_MESSAGE\", \"Web slot is invalid.\");\n\t\t\trequiredId(item.id, \"slot.id\");\n\t\t}\n\t}\n\tif (record.kind === \"error\") {\n\t\tif (\n\t\t\ttypeof record.code !== \"string\" ||\n\t\t\t![\n\t\t\t\t\"INVALID_MESSAGE\",\n\t\t\t\t\"UNAUTHORIZED\",\n\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\"EXPIRED\",\n\t\t\t\t\"STALE_EVENT\",\n\t\t\t\t\"INVALID_ACTION\",\n\t\t\t\t\"INTERNAL_ERROR\",\n\t\t\t].includes(record.code) ||\n\t\t\ttypeof record.message !== \"string\" ||\n\t\t\trecord.message.length === 0\n\t\t)\n\t\t\tthrow new WebProtocolError(\"INVALID_MESSAGE\", \"Web error message is invalid.\");\n\t}\n\tif (record.kind === \"response\") {\n\t\trequiredId(record.requestId, \"requestId\");\n\t\tif (record.ok !== true) throw new WebProtocolError(\"INVALID_MESSAGE\", \"Web response message is invalid.\");\n\t}\n\tif (record.kind === \"hello\") {\n\t\trequiredId(record.requestId, \"requestId\");\n\t\trequiredId(record.connectionId, \"connectionId\");\n\t\trequiredId(record.sessionId, \"sessionId\");\n\t\toptionalEventId(record.eventId, \"eventId\");\n\t\tif (!Array.isArray(record.slots) || !objectRecord(record.state))\n\t\t\tthrow new WebProtocolError(\"INVALID_MESSAGE\", \"Web hello message is invalid.\");\n\t}\n\treturn record as unknown as WebServerMessage;\n}\n\nfunction sameSecret(actual: string, expected: string): boolean {\n\tif (actual.length !== expected.length) return false;\n\tlet difference = 0;\n\tfor (let index = 0; index < actual.length; index++)\n\t\tdifference |= actual.charCodeAt(index) ^ expected.charCodeAt(index);\n\treturn difference === 0;\n}\n\nfunction connectionId(): string {\n\tconst cryptoObject = globalThis.crypto as { readonly randomUUID?: () => string } | undefined;\n\tif (typeof cryptoObject?.randomUUID === \"function\") return cryptoObject.randomUUID();\n\treturn `web-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nfunction validateAuthorization(value: WebAuthorization): void {\n\tif (typeof value.token !== \"string\" || value.token.length === 0 || value.token.length > WEB_MAX_TOKEN_LENGTH)\n\t\tthrow new Error(\"Web authorization token is invalid.\");\n\tif ([...value.token].some((character) => (character.codePointAt(0) ?? 0) <= 0x1f || character === \"\\u007f\"))\n\t\tthrow new Error(\"Web authorization token contains a control character.\");\n\tfor (const id of value.allowedFrontendIds) requiredId(id, \"allowedFrontendIds item\");\n\tfor (const id of value.allowedSlotIds) requiredId(id, \"allowedSlotIds item\");\n\tif (\n\t\tvalue.allowedActions?.some(\n\t\t\t(action) =>\n\t\t\t\t![\n\t\t\t\t\t\"submit\",\n\t\t\t\t\t\"steer\",\n\t\t\t\t\t\"cancel\",\n\t\t\t\t\t\"retry\",\n\t\t\t\t\t\"run_command\",\n\t\t\t\t\t\"select_model\",\n\t\t\t\t\t\"open_session\",\n\t\t\t\t\t\"create_session\",\n\t\t\t\t\t\"compact\",\n\t\t\t\t\t\"slot_action\",\n\t\t\t\t].includes(action),\n\t\t)\n\t)\n\t\tthrow new Error(\"Web authorization contains an unknown action.\");\n\tif (value.expiresAt !== undefined && (!Number.isSafeInteger(value.expiresAt) || value.expiresAt < 0))\n\t\tthrow new Error(\"Web authorization expiry must be a non-negative safe integer.\");\n}\n\nfunction cloneSlots(controller: InteractiveController, allowed: readonly string[]): WebSlot[] {\n\tconst allow = new Set(allowed);\n\tconst slots: WebSlot[] = [];\n\tfor (const panel of controller.ui.panels) {\n\t\tif (!allow.has(panel.id)) continue;\n\t\ttry {\n\t\t\tslots.push({ id: panel.id, title: panel.title, data: structuredClone(panel.data) });\n\t\t} catch {\n\t\t\t// Non-serializable plugin panel data is not exposed to the browser.\n\t\t}\n\t}\n\treturn slots;\n}\n\ninterface EventEnvelope {\n\treadonly eventId: number;\n\treadonly event: InteractiveViewEvent;\n}\n\n/** Versioned Web projection. Disconnecting a page only detaches its transport. */\nexport class WebFrontendHost {\n\tprivate readonly controller: InteractiveController;\n\tprivate readonly authorization: WebAuthorization;\n\tprivate readonly replayLimit: number;\n\tprivate readonly now: () => number;\n\tprivate readonly slotActions: WebFrontendHostOptions[\"slotActions\"];\n\tprivate readonly events: EventEnvelope[] = [];\n\tprivate readonly connections = new Set<WebConnection>();\n\tprivate eventId = 0;\n\tprivate disposed = false;\n\tprivate readonly unsubscribeController: { dispose(): void };\n\n\tconstructor(options: WebFrontendHostOptions) {\n\t\tvalidateAuthorization(options.authorization);\n\t\tthis.controller = options.controller;\n\t\tthis.authorization = {\n\t\t\t...options.authorization,\n\t\t\tallowedFrontendIds: [...options.authorization.allowedFrontendIds],\n\t\t\tallowedSlotIds: [...options.authorization.allowedSlotIds],\n\t\t\t...(options.authorization.allowedActions === undefined\n\t\t\t\t? {}\n\t\t\t\t: { allowedActions: [...options.authorization.allowedActions] }),\n\t\t};\n\t\tthis.replayLimit = Math.max(1, Math.min(options.replayLimit ?? WEB_DEFAULT_REPLAY_LIMIT, 4096));\n\t\tthis.now = options.now ?? Date.now;\n\t\tthis.slotActions = options.slotActions;\n\t\tthis.unsubscribeController = options.controller.subscribe((event) => this.publish(event));\n\t}\n\n\tattach(transport: WebTransport): WebConnection {\n\t\tif (this.disposed) throw new Error(\"Web frontend host is disposed.\");\n\t\tconst connection = new WebConnection(this, transport);\n\t\tthis.connections.add(connection);\n\t\tconnection.onDispose = () => this.connections.delete(connection);\n\t\treturn connection;\n\t}\n\n\tget latestEventId(): number {\n\t\treturn this.eventId;\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tfor (const connection of [...this.connections]) connection.dispose();\n\t\tthis.unsubscribeController.dispose();\n\t\tthis.controller.dispose();\n\t}\n\n\tprivate publish(event: InteractiveViewEvent): void {\n\t\tif (this.disposed) return;\n\t\tconst envelope = { eventId: ++this.eventId, event: structuredClone(event) };\n\t\tthis.events.push(envelope);\n\t\twhile (this.events.length > this.replayLimit) this.events.shift();\n\t\tfor (const connection of this.connections) {\n\t\t\tconnection.sendEvent(envelope);\n\t\t\tif (connection.authorized) connection.sendSlots(cloneSlots(this.controller, this.authorization.allowedSlotIds));\n\t\t}\n\t}\n\n\tprivate authorize(token: string, frontendId: string): void {\n\t\tif (this.authorization.expiresAt !== undefined && this.now() >= this.authorization.expiresAt)\n\t\t\tthrow new WebProtocolError(\"EXPIRED\", \"Web authorization has expired.\");\n\t\tif (!sameSecret(token, this.authorization.token))\n\t\t\tthrow new WebProtocolError(\"UNAUTHORIZED\", \"Web authorization failed.\");\n\t\tif (!this.authorization.allowedFrontendIds.includes(frontendId))\n\t\t\tthrow new WebProtocolError(\"FORBIDDEN\", \"Frontend is not authorized.\");\n\t}\n\n\t_handleConnect(connection: WebConnection, request: Extract<WebClientMessage, { kind: \"connect\" }>): void {\n\t\tthis.authorize(request.token, request.frontendId);\n\t\tconnection.authorized = true;\n\t\tconst current = this.eventId;\n\t\tconst replayFrom = request.lastEventId;\n\t\tconst oldest = this.events[0]?.eventId;\n\t\tconst canReplay = replayFrom !== undefined && (oldest === undefined || replayFrom >= oldest - 1);\n\t\tconnection.send({\n\t\t\tversion: WEB_PROTOCOL_VERSION,\n\t\t\tkind: \"hello\",\n\t\t\trequestId: request.requestId,\n\t\t\tconnectionId: connection.id,\n\t\t\tsessionId: this.controller.state.sessionId,\n\t\t\tstate: structuredClone(this.controller.state),\n\t\t\tslots: cloneSlots(this.controller, this.authorization.allowedSlotIds),\n\t\t\teventId: current,\n\t\t\t...(canReplay && replayFrom !== undefined ? { replayedFrom: replayFrom } : {}),\n\t\t\t...(replayFrom !== undefined && !canReplay ? { resyncRequired: true } : {}),\n\t\t});\n\t\tif (canReplay && replayFrom !== undefined)\n\t\t\tfor (const event of this.events) if (event.eventId > replayFrom) connection.sendEvent(event);\n\t}\n\n\tasync _handleAction(\n\t\tconnection: WebConnection,\n\t\trequest: Extract<WebClientMessage, { kind: \"action\" }>,\n\t): Promise<void> {\n\t\tif (!connection.authorized) throw new WebProtocolError(\"UNAUTHORIZED\", \"Connect before sending actions.\");\n\t\tif (\n\t\t\tthis.authorization.allowedActions !== undefined &&\n\t\t\t!this.authorization.allowedActions.includes(request.action.type)\n\t\t)\n\t\t\tthrow new WebProtocolError(\"FORBIDDEN\", \"Web action is not authorized.\");\n\t\tif (request.baseEventId !== undefined && request.baseEventId < this.eventId - this.replayLimit)\n\t\t\tthrow new WebProtocolError(\"STALE_EVENT\", \"Action references an expired event.\");\n\t\tconst action = request.action;\n\t\tswitch (action.type) {\n\t\t\tcase \"submit\":\n\t\t\t\tawait this.controller.submit(action.input);\n\t\t\t\tbreak;\n\t\t\tcase \"steer\":\n\t\t\t\tthis.controller.steer(action.input);\n\t\t\t\tbreak;\n\t\t\tcase \"cancel\":\n\t\t\t\tthis.controller.cancel();\n\t\t\t\tbreak;\n\t\t\tcase \"retry\":\n\t\t\t\tawait this.controller.retry();\n\t\t\t\tbreak;\n\t\t\tcase \"run_command\":\n\t\t\t\tawait this.controller.runCommand(action.name, action.args);\n\t\t\t\tbreak;\n\t\t\tcase \"select_model\":\n\t\t\t\tthis.controller.selectModel(action.modelId);\n\t\t\t\tbreak;\n\t\t\tcase \"open_session\":\n\t\t\t\tawait this.controller.openSession(action.sessionId);\n\t\t\t\tbreak;\n\t\t\tcase \"create_session\":\n\t\t\t\tawait this.controller.createSession();\n\t\t\t\tbreak;\n\t\t\tcase \"compact\":\n\t\t\t\tawait this.controller.requestCompaction();\n\t\t\t\tbreak;\n\t\t\tcase \"slot_action\":\n\t\t\t\tif (!this.authorization.allowedSlotIds.includes(action.slotId) || !this.slotActions?.[action.slotId])\n\t\t\t\t\tthrow new WebProtocolError(\"FORBIDDEN\", \"Slot action is not authorized.\");\n\t\t\t\tawait this.slotActions[action.slotId](action.payload, { sessionId: this.controller.state.sessionId });\n\t\t\t\tbreak;\n\t\t}\n\t\tconnection.send({\n\t\t\tversion: WEB_PROTOCOL_VERSION,\n\t\t\tkind: \"response\",\n\t\t\trequestId: request.requestId,\n\t\t\tok: true,\n\t\t\tresult: { accepted: true, eventId: this.eventId },\n\t\t});\n\t}\n}\n\nexport class WebConnection {\n\treadonly id = connectionId();\n\tauthorized = false;\n\tonDispose?: () => void;\n\tprivate readonly transport: WebTransport;\n\tprivate readonly removeMessage: () => void;\n\tprivate readonly removeClose: () => void;\n\tprivate disposed = false;\n\tconstructor(host: WebFrontendHost, transport: WebTransport) {\n\t\tthis.transport = transport;\n\t\tthis.removeMessage = transport.onMessage((raw) => {\n\t\t\ttry {\n\t\t\t\tconst message = parseWebClientMessage(raw);\n\t\t\t\tif (message.kind === \"connect\") host._handleConnect(this, message);\n\t\t\t\telse if (message.kind === \"disconnect\") this.dispose();\n\t\t\t\telse void host._handleAction(this, message).catch((cause) => this.error(cause));\n\t\t\t} catch (cause) {\n\t\t\t\tthis.error(cause);\n\t\t\t}\n\t\t});\n\t\tthis.removeClose = transport.onClose(() => this.dispose());\n\t}\n\tsend(message: WebServerMessage): void {\n\t\tif (!this.disposed) this.transport.send(JSON.stringify(message));\n\t}\n\tsendEvent(envelope: EventEnvelope): void {\n\t\tthis.send({ version: WEB_PROTOCOL_VERSION, kind: \"event\", eventId: envelope.eventId, event: envelope.event });\n\t}\n\tsendSlots(slots: readonly WebSlot[]): void {\n\t\tthis.send({ version: WEB_PROTOCOL_VERSION, kind: \"slots\", slots });\n\t}\n\tdispose(): void {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\ttry {\n\t\t\tthis.transport.send(JSON.stringify({ version: WEB_PROTOCOL_VERSION, kind: \"closed\" } satisfies WebServerMessage));\n\t\t} catch {\n\t\t\t// The page may already have disappeared; cleanup must still run.\n\t\t} finally {\n\t\t\tthis.removeMessage();\n\t\t\tthis.removeClose();\n\t\t\ttry {\n\t\t\t\tthis.transport.close?.(1000, \"page detached\");\n\t\t\t} catch {\n\t\t\t\t// Transport teardown is best effort.\n\t\t\t} finally {\n\t\t\t\tthis.onDispose?.();\n\t\t\t}\n\t\t}\n\t}\n\tprivate error(cause: unknown): void {\n\t\tconst error =\n\t\t\tcause instanceof WebProtocolError\n\t\t\t\t? cause\n\t\t\t\t: new WebProtocolError(\"INTERNAL_ERROR\", cause instanceof Error ? cause.message : String(cause));\n\t\tthis.send({ version: WEB_PROTOCOL_VERSION, kind: \"error\", code: error.code, message: error.message });\n\t}\n}\n\nexport type WebClientEvent =\n\t| { readonly type: \"hello\"; readonly message: WebServerHello }\n\t| { readonly type: \"event\"; readonly message: WebServerEvent }\n\t| { readonly type: \"slots\"; readonly slots: readonly WebSlot[] }\n\t| { readonly type: \"error\"; readonly code: WebErrorCode; readonly message: string }\n\t| { readonly type: \"closed\" };\n\n/** Small browser-side state adapter. It never owns or disposes the Host. */\nexport class WebClient {\n\tprivate transport: WebTransport;\n\tprivate readonly listeners = new Set<(event: WebClientEvent) => void>();\n\tprivate readonly pending = new Map<string, { resolve: (value: unknown) => void; reject: (cause: Error) => void }>();\n\tprivate removeMessage: () => void;\n\tprivate removeClose: () => void;\n\tprivate closed = false;\n\tprivate transportClosed = false;\n\tprivate _state: unknown;\n\tprivate _slots: readonly WebSlot[] = [];\n\tprivate _eventId = 0;\n\tconstructor(transport: WebTransport) {\n\t\tthis.transport = transport;\n\t\tthis.removeMessage = () => undefined;\n\t\tthis.removeClose = () => undefined;\n\t\tthis.installTransport(transport);\n\t}\n\tget state(): unknown {\n\t\treturn this._state;\n\t}\n\tget slots(): readonly WebSlot[] {\n\t\treturn this._slots;\n\t}\n\tget eventId(): number {\n\t\treturn this._eventId;\n\t}\n\tsubscribe(listener: (event: WebClientEvent) => void): () => void {\n\t\tthis.listeners.add(listener);\n\t\treturn () => this.listeners.delete(listener);\n\t}\n\tconnect(token: string, frontendId: string, lastEventId?: number): Promise<WebServerHello> {\n\t\tthis.transportClosed = false;\n\t\treturn this.request({\n\t\t\tversion: WEB_PROTOCOL_VERSION,\n\t\t\tkind: \"connect\",\n\t\t\trequestId: connectionId(),\n\t\t\ttoken,\n\t\t\tfrontendId,\n\t\t\t...(lastEventId === undefined ? {} : { lastEventId }),\n\t\t}).then((message) => message as WebServerHello);\n\t}\n\n\t/** Replaces a disconnected transport and requests a snapshot/replay from the last event. */\n\treconnect(transport: WebTransport, token: string, frontendId: string): Promise<WebServerHello> {\n\t\tif (this.closed) return Promise.reject(new Error(\"Web client is closed.\"));\n\t\tthis.removeTransport();\n\t\tthis.transport = transport;\n\t\tthis.transportClosed = false;\n\t\tthis.installTransport(transport);\n\t\treturn this.connect(token, frontendId, this._eventId);\n\t}\n\taction(action: WebAction, baseEventId = this._eventId): Promise<void> {\n\t\treturn this.request({\n\t\t\tversion: WEB_PROTOCOL_VERSION,\n\t\t\tkind: \"action\",\n\t\t\trequestId: connectionId(),\n\t\t\taction,\n\t\t\tbaseEventId,\n\t\t}).then(() => undefined);\n\t}\n\tclose(): void {\n\t\tif (this.closed) return;\n\t\tthis.closed = true;\n\t\tthis.removeTransport();\n\t\tthis.transport.close?.(1000, \"client closed\");\n\t\tfor (const pending of this.pending.values()) pending.reject(new Error(\"Web client is closed.\"));\n\t\tthis.pending.clear();\n\t}\n\tprivate request(message: WebClientMessage): Promise<unknown> {\n\t\tif (this.closed) return Promise.reject(new Error(\"Web client is closed.\"));\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.pending.set(message.requestId, { resolve, reject });\n\t\t\ttry {\n\t\t\t\tthis.transport.send(JSON.stringify(message));\n\t\t\t} catch (cause) {\n\t\t\t\tthis.pending.delete(message.requestId);\n\t\t\t\treject(cause instanceof Error ? cause : new Error(String(cause)));\n\t\t\t}\n\t\t});\n\t}\n\tprivate accept(raw: string): void {\n\t\ttry {\n\t\t\tconst message = parseWebServerMessage(raw);\n\t\t\tif (message.kind === \"hello\") {\n\t\t\t\tthis._state = structuredClone(message.state);\n\t\t\t\tthis._slots = [...(message.slots ?? [])];\n\t\t\t\tthis._eventId = message.eventId ?? this._eventId;\n\t\t\t\tthis.resolve(message.requestId, message);\n\t\t\t\tthis.emit({ type: \"hello\", message: message as WebServerHello });\n\t\t\t} else if (message.kind === \"event\") {\n\t\t\t\tthis._eventId = Math.max(this._eventId, message.eventId ?? 0);\n\t\t\t\tthis.emit({ type: \"event\", message: message as WebServerEvent });\n\t\t\t} else if (message.kind === \"slots\") {\n\t\t\t\tthis._slots = [...(message.slots ?? [])];\n\t\t\t\tthis.emit({ type: \"slots\", slots: this._slots });\n\t\t\t} else if (message.kind === \"response\") this.resolve(message.requestId, message);\n\t\t\telse if (message.kind === \"error\") {\n\t\t\t\tconst error = new WebProtocolError(message.code ?? \"INTERNAL_ERROR\", message.message ?? \"Web request failed.\");\n\t\t\t\tthis.reject(message.requestId, error);\n\t\t\t\tthis.emit({ type: \"error\", code: error.code, message: error.message });\n\t\t\t} else this.emit({ type: \"closed\" });\n\t\t} catch (cause) {\n\t\t\tthis.fail(cause instanceof Error ? cause : new Error(String(cause)));\n\t\t}\n\t}\n\tprivate resolve(requestId: string | undefined, value: unknown): void {\n\t\tif (!requestId) return;\n\t\tconst pending = this.pending.get(requestId);\n\t\tif (pending) {\n\t\t\tthis.pending.delete(requestId);\n\t\t\tpending.resolve(value);\n\t\t}\n\t}\n\tprivate reject(requestId: string | undefined, cause: Error): void {\n\t\tif (!requestId) return;\n\t\tconst pending = this.pending.get(requestId);\n\t\tif (pending) {\n\t\t\tthis.pending.delete(requestId);\n\t\t\tpending.reject(cause);\n\t\t}\n\t}\n\tprivate emit(event: WebClientEvent): void {\n\t\tfor (const listener of this.listeners) listener(event);\n\t}\n\tprivate fail(cause: Error): void {\n\t\tif (this.closed || this.transportClosed) return;\n\t\tthis.transportClosed = true;\n\t\tthis.removeTransport();\n\t\tfor (const pending of this.pending.values()) pending.reject(cause);\n\t\tthis.pending.clear();\n\t\tthis.emit({ type: \"error\", code: \"INTERNAL_ERROR\", message: cause.message });\n\t}\n\tprivate installTransport(transport: WebTransport): void {\n\t\tthis.removeMessage = transport.onMessage((raw) => this.accept(raw));\n\t\tthis.removeClose = transport.onClose(() => this.fail(new Error(\"Web transport closed.\")));\n\t}\n\tprivate removeTransport(): void {\n\t\tthis.removeMessage();\n\t\tthis.removeClose();\n\t\tthis.removeMessage = () => undefined;\n\t\tthis.removeClose = () => undefined;\n\t}\n}\n\nexport function createWebAuthorization(\n\toptions: Omit<WebAuthorization, \"allowedFrontendIds\" | \"allowedSlotIds\"> & {\n\t\tallowedFrontendIds?: readonly string[];\n\t\tallowedSlotIds?: readonly string[];\n\t},\n): WebAuthorization {\n\tconst value: WebAuthorization = {\n\t\ttoken: options.token,\n\t\tallowedFrontendIds: [...(options.allowedFrontendIds ?? [])],\n\t\tallowedSlotIds: [...(options.allowedSlotIds ?? [])],\n\t\t...(options.expiresAt === undefined ? {} : { expiresAt: options.expiresAt }),\n\t};\n\tvalidateAuthorization(value);\n\treturn value;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webui-entry.d.ts","sourceRoot":"","sources":["../src/webui-entry.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
|
+
import { workspaceCapabilityKey } from "@di-code/builtins";
|
|
5
|
+
import { createCompositionLoader } from "@di-code/plugin-loader";
|
|
6
|
+
import { createRootContext } from "@di-code/plugin-runtime";
|
|
7
|
+
import { importCompositionModule, resolveCompositionEntries, resolveManagedCompositionEntries, } from "./compositions.js";
|
|
8
|
+
import { createProjectTrustStore } from "./project-trust-entry.js";
|
|
9
|
+
import { disposeRpcComposition } from "./rpc/lifecycle.js";
|
|
10
|
+
import { loadStartupConfiguration, resolveStartupRuntime } from "./startup.js";
|
|
11
|
+
import { WebUiServer } from "./webui.js";
|
|
12
|
+
const allowedRoot = resolve(process.cwd());
|
|
13
|
+
const agentDir = resolve(join(homedir(), ".di-code"));
|
|
14
|
+
const token = process.env.DI_CODE_WEBUI_TOKEN;
|
|
15
|
+
const host = process.env.DI_CODE_WEBUI_HOST ?? "127.0.0.1";
|
|
16
|
+
const allowRemote = process.env.DI_CODE_WEBUI_ALLOW_REMOTE === "1";
|
|
17
|
+
const port = process.env.DI_CODE_WEBUI_PORT === undefined ? 0 : Number.parseInt(process.env.DI_CODE_WEBUI_PORT, 10);
|
|
18
|
+
let server;
|
|
19
|
+
let loader;
|
|
20
|
+
let context;
|
|
21
|
+
try {
|
|
22
|
+
if (!Number.isSafeInteger(port) || port < 0 || port > 65_535)
|
|
23
|
+
throw new Error("DI_CODE_WEBUI_PORT must be a TCP port.");
|
|
24
|
+
if (token === undefined || token.length < 32)
|
|
25
|
+
throw new Error("DI_CODE_WEBUI_TOKEN must contain at least 32 characters.");
|
|
26
|
+
const projectTrusted = (await createProjectTrustStore(join(agentDir, "trust.json")).get(allowedRoot)) === true;
|
|
27
|
+
context = createRootContext({ id: "webui-profile", mode: "webui", trustedProject: projectTrusted });
|
|
28
|
+
loader = createCompositionLoader({
|
|
29
|
+
context,
|
|
30
|
+
entries: [
|
|
31
|
+
...(await resolveCompositionEntries("webui", {
|
|
32
|
+
cwd: allowedRoot,
|
|
33
|
+
agentDir,
|
|
34
|
+
includeProjectComposition: projectTrusted,
|
|
35
|
+
allowedRoot,
|
|
36
|
+
})),
|
|
37
|
+
...(await resolveManagedCompositionEntries(agentDir)),
|
|
38
|
+
],
|
|
39
|
+
importModule: importCompositionModule,
|
|
40
|
+
projectTrusted,
|
|
41
|
+
});
|
|
42
|
+
await loader.load();
|
|
43
|
+
const configuration = await loadStartupConfiguration(allowedRoot, process.env, agentDir);
|
|
44
|
+
const runtime = resolveStartupRuntime(configuration.environment, configuration.providers, configuration.defaults);
|
|
45
|
+
server = new WebUiServer({
|
|
46
|
+
context,
|
|
47
|
+
allowedRoot: context.require(workspaceCapabilityKey).allowedRoot,
|
|
48
|
+
agentDir,
|
|
49
|
+
workspaceRegistryDir: resolve(join(homedir(), ".di-code")),
|
|
50
|
+
provider: runtime.provider,
|
|
51
|
+
model: runtime.model,
|
|
52
|
+
projectTrusted,
|
|
53
|
+
host,
|
|
54
|
+
port,
|
|
55
|
+
token,
|
|
56
|
+
allowRemote,
|
|
57
|
+
});
|
|
58
|
+
const address = await server.listen();
|
|
59
|
+
process.stderr.write(`WebUI listening on http://${address.host}:${address.port}\n`);
|
|
60
|
+
await new Promise((resolvePromise) => {
|
|
61
|
+
process.once("SIGINT", resolvePromise);
|
|
62
|
+
process.once("SIGTERM", resolvePromise);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch (cause) {
|
|
66
|
+
process.stderr.write(`${cause instanceof Error ? cause.message : "WebUI startup failed."}\n`);
|
|
67
|
+
process.exitCode = 1;
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
await server?.close();
|
|
71
|
+
await disposeRpcComposition(() => loader?.dispose(), () => context?.dispose());
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=webui-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webui-entry.js","sourceRoot":"","sources":["../src/webui-entry.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { workspaceCapabilityKey } from \"@di-code/builtins\";\nimport { createCompositionLoader } from \"@di-code/plugin-loader\";\nimport { createRootContext } from \"@di-code/plugin-runtime\";\nimport {\n\timportCompositionModule,\n\tresolveCompositionEntries,\n\tresolveManagedCompositionEntries,\n} from \"./compositions.ts\";\nimport { createProjectTrustStore } from \"./project-trust-entry.ts\";\nimport { disposeRpcComposition } from \"./rpc/lifecycle.ts\";\nimport { loadStartupConfiguration, resolveStartupRuntime } from \"./startup.ts\";\nimport { WebUiServer } from \"./webui.ts\";\n\nconst allowedRoot = resolve(process.cwd());\nconst agentDir = resolve(join(homedir(), \".di-code\"));\nconst token = process.env.DI_CODE_WEBUI_TOKEN;\nconst host = process.env.DI_CODE_WEBUI_HOST ?? \"127.0.0.1\";\nconst allowRemote = process.env.DI_CODE_WEBUI_ALLOW_REMOTE === \"1\";\nconst port = process.env.DI_CODE_WEBUI_PORT === undefined ? 0 : Number.parseInt(process.env.DI_CODE_WEBUI_PORT, 10);\nlet server: WebUiServer | undefined;\nlet loader: ReturnType<typeof createCompositionLoader> | undefined;\nlet context: ReturnType<typeof createRootContext> | undefined;\n\ntry {\n\tif (!Number.isSafeInteger(port) || port < 0 || port > 65_535)\n\t\tthrow new Error(\"DI_CODE_WEBUI_PORT must be a TCP port.\");\n\tif (token === undefined || token.length < 32)\n\t\tthrow new Error(\"DI_CODE_WEBUI_TOKEN must contain at least 32 characters.\");\n\tconst projectTrusted = (await createProjectTrustStore(join(agentDir, \"trust.json\")).get(allowedRoot)) === true;\n\tcontext = createRootContext({ id: \"webui-profile\", mode: \"webui\", trustedProject: projectTrusted });\n\tloader = createCompositionLoader({\n\t\tcontext,\n\t\tentries: [\n\t\t\t...(await resolveCompositionEntries(\"webui\", {\n\t\t\t\tcwd: allowedRoot,\n\t\t\t\tagentDir,\n\t\t\t\tincludeProjectComposition: projectTrusted,\n\t\t\t\tallowedRoot,\n\t\t\t})),\n\t\t\t...(await resolveManagedCompositionEntries(agentDir)),\n\t\t],\n\t\timportModule: importCompositionModule,\n\t\tprojectTrusted,\n\t});\n\tawait loader.load();\n\tconst configuration = await loadStartupConfiguration(allowedRoot, process.env, agentDir);\n\tconst runtime = resolveStartupRuntime(configuration.environment, configuration.providers, configuration.defaults);\n\tserver = new WebUiServer({\n\t\tcontext,\n\t\tallowedRoot: context.require(workspaceCapabilityKey).allowedRoot,\n\t\tagentDir,\n\t\tworkspaceRegistryDir: resolve(join(homedir(), \".di-code\")),\n\t\tprovider: runtime.provider,\n\t\tmodel: runtime.model,\n\t\tprojectTrusted,\n\t\thost,\n\t\tport,\n\t\ttoken,\n\t\tallowRemote,\n\t});\n\tconst address = await server.listen();\n\tprocess.stderr.write(`WebUI listening on http://${address.host}:${address.port}\\n`);\n\tawait new Promise<void>((resolvePromise) => {\n\t\tprocess.once(\"SIGINT\", resolvePromise);\n\t\tprocess.once(\"SIGTERM\", resolvePromise);\n\t});\n} catch (cause) {\n\tprocess.stderr.write(`${cause instanceof Error ? cause.message : \"WebUI startup failed.\"}\\n`);\n\tprocess.exitCode = 1;\n} finally {\n\tawait server?.close();\n\tawait disposeRpcComposition(\n\t\t() => loader?.dispose(),\n\t\t() => context?.dispose(),\n\t);\n}\n"]}
|
package/dist/webui.d.ts
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { Context } from "@di-code/plugin-runtime";
|
|
2
|
+
import { type SessionHostBootstrapOptions } from "./runtime/session-host.ts";
|
|
3
|
+
export interface WebUiServerOptions extends Omit<SessionHostBootstrapOptions, "cwd" | "principal" | "toolApproval"> {
|
|
4
|
+
readonly context: Context;
|
|
5
|
+
readonly allowedRoot: string;
|
|
6
|
+
/** User-level directory shared by WebUI restarts for workspace registrations. */
|
|
7
|
+
readonly workspaceRegistryDir?: string;
|
|
8
|
+
/** Additional workspace roots explicitly authorized by the launcher. */
|
|
9
|
+
readonly allowedWorkspaces?: readonly string[];
|
|
10
|
+
readonly host?: string;
|
|
11
|
+
readonly port?: number;
|
|
12
|
+
readonly token?: string;
|
|
13
|
+
readonly allowRemote?: boolean;
|
|
14
|
+
readonly origins?: readonly string[];
|
|
15
|
+
readonly maxBodyBytes?: number;
|
|
16
|
+
readonly rateLimit?: {
|
|
17
|
+
readonly windowMs: number;
|
|
18
|
+
readonly maxRequests: number;
|
|
19
|
+
};
|
|
20
|
+
/** Maximum simultaneous SSE subscriptions for one authenticated client. */
|
|
21
|
+
readonly maxSseConnectionsPerClient?: number;
|
|
22
|
+
/** Maximum simultaneous SSE subscriptions across the server. */
|
|
23
|
+
readonly maxSseConnections?: number;
|
|
24
|
+
/** Lifetime of a reconnect credential; defaults to ten minutes. */
|
|
25
|
+
readonly resumeTokenTtlMs?: number;
|
|
26
|
+
/** Optional SPA asset directory. API routes remain isolated under `/api`. */
|
|
27
|
+
readonly staticRoot?: string;
|
|
28
|
+
/** Additional same-origin development origin accepted by the API. */
|
|
29
|
+
readonly developmentOrigin?: string;
|
|
30
|
+
}
|
|
31
|
+
/** Local-first HTTP/SSE adapter. It authenticates and queues transport messages; Agent work remains in RpcDispatcher. */
|
|
32
|
+
export declare class WebUiServer {
|
|
33
|
+
private readonly options;
|
|
34
|
+
private readonly hostManager;
|
|
35
|
+
private readonly clients;
|
|
36
|
+
private readonly clientsByResumeToken;
|
|
37
|
+
private readonly server;
|
|
38
|
+
private readonly addedWorkspaceRoots;
|
|
39
|
+
private readonly removedWorkspaceRoots;
|
|
40
|
+
private workspaceRegistryLoaded;
|
|
41
|
+
private readonly workspaceNames;
|
|
42
|
+
private tokenValue;
|
|
43
|
+
private sseConnections;
|
|
44
|
+
private disposed;
|
|
45
|
+
constructor(options: WebUiServerOptions);
|
|
46
|
+
get token(): string;
|
|
47
|
+
rotateToken(): string;
|
|
48
|
+
revokeToken(): void;
|
|
49
|
+
listen(): Promise<{
|
|
50
|
+
readonly host: string;
|
|
51
|
+
readonly port: number;
|
|
52
|
+
}>;
|
|
53
|
+
close(): Promise<void>;
|
|
54
|
+
private handle;
|
|
55
|
+
private authenticate;
|
|
56
|
+
private rotateResumeToken;
|
|
57
|
+
private revokeResumeToken;
|
|
58
|
+
private hostAllowed;
|
|
59
|
+
private originAllowed;
|
|
60
|
+
private setCors;
|
|
61
|
+
private rateAllowed;
|
|
62
|
+
private staticAsset;
|
|
63
|
+
private fileOrFallback;
|
|
64
|
+
private setWebCookie;
|
|
65
|
+
private isDevelopmentSessionRequest;
|
|
66
|
+
private boot;
|
|
67
|
+
private actor;
|
|
68
|
+
private authorizedWorkspaces;
|
|
69
|
+
private addWorkspaceRoute;
|
|
70
|
+
private renameWorkspaceRoute;
|
|
71
|
+
private deleteWorkspaceRoute;
|
|
72
|
+
private workspaceById;
|
|
73
|
+
private pickWorkspaceRoute;
|
|
74
|
+
private pickWorkspacePath;
|
|
75
|
+
private runWorkspacePicker;
|
|
76
|
+
/** Adds a validated local directory to this server's explicitly authorized workspace set. */
|
|
77
|
+
private addWorkspace;
|
|
78
|
+
private workspaceRegistryPath;
|
|
79
|
+
private loadWorkspaceRegistry;
|
|
80
|
+
private saveWorkspaceRegistry;
|
|
81
|
+
private resolveWorkspace;
|
|
82
|
+
private resolveActorRuntime;
|
|
83
|
+
private hostOptions;
|
|
84
|
+
private clientTempRoot;
|
|
85
|
+
private rpc;
|
|
86
|
+
private attachments;
|
|
87
|
+
private events;
|
|
88
|
+
private closeConnections;
|
|
89
|
+
private closeClient;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=webui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webui.d.ts","sourceRoot":"","sources":["../src/webui.ts"],"names":[],"mappings":"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"}
|