@di-code/coding-agent 0.1.9 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/README.md +7 -0
  2. package/compositions/base.yml +3 -0
  3. package/dist/compositions.d.ts.map +1 -1
  4. package/dist/compositions.js +2 -0
  5. package/dist/compositions.js.map +1 -1
  6. package/dist/core/image-input.d.ts +1 -1
  7. package/dist/core/image-input.d.ts.map +1 -1
  8. package/dist/core/image-input.js +15 -4
  9. package/dist/core/image-input.js.map +1 -1
  10. package/dist/core/session/session-manager.d.ts +18 -1
  11. package/dist/core/session/session-manager.d.ts.map +1 -1
  12. package/dist/core/session/session-manager.js +90 -1
  13. package/dist/core/session/session-manager.js.map +1 -1
  14. package/dist/core/session/session-storage.d.ts +2 -0
  15. package/dist/core/session/session-storage.d.ts.map +1 -1
  16. package/dist/core/session/session-storage.js +34 -2
  17. package/dist/core/session/session-storage.js.map +1 -1
  18. package/dist/core/session/types.d.ts +16 -1
  19. package/dist/core/session/types.d.ts.map +1 -1
  20. package/dist/core/session/types.js.map +1 -1
  21. package/dist/core/session.d.ts +27 -2
  22. package/dist/core/session.d.ts.map +1 -1
  23. package/dist/core/session.js +59 -0
  24. package/dist/core/session.js.map +1 -1
  25. package/dist/entry.js +1 -1
  26. package/dist/entry.js.map +1 -1
  27. package/dist/i18n.js +4 -4
  28. package/dist/i18n.js.map +1 -1
  29. package/dist/interactive-host-entry.d.ts.map +1 -1
  30. package/dist/interactive-host-entry.js +107 -12
  31. package/dist/interactive-host-entry.js.map +1 -1
  32. package/dist/main.d.ts.map +1 -1
  33. package/dist/main.js +8 -1
  34. package/dist/main.js.map +1 -1
  35. package/dist/mcp/config.d.ts.map +1 -1
  36. package/dist/mcp/config.js +19 -0
  37. package/dist/mcp/config.js.map +1 -1
  38. package/dist/mcp-command-entry.d.ts +8 -0
  39. package/dist/mcp-command-entry.d.ts.map +1 -0
  40. package/dist/mcp-command-entry.js +56 -0
  41. package/dist/mcp-command-entry.js.map +1 -0
  42. package/dist/modes/interactive-components.d.ts +8 -0
  43. package/dist/modes/interactive-components.d.ts.map +1 -1
  44. package/dist/modes/interactive-components.js +7 -2
  45. package/dist/modes/interactive-components.js.map +1 -1
  46. package/dist/modes/interactive-state.d.ts.map +1 -1
  47. package/dist/modes/interactive-state.js +1 -4
  48. package/dist/modes/interactive-state.js.map +1 -1
  49. package/dist/modes/interactive.d.ts +4 -0
  50. package/dist/modes/interactive.d.ts.map +1 -1
  51. package/dist/modes/interactive.js +69 -0
  52. package/dist/modes/interactive.js.map +1 -1
  53. package/dist/modes/tree-selector.d.ts.map +1 -1
  54. package/dist/modes/tree-selector.js +5 -4
  55. package/dist/modes/tree-selector.js.map +1 -1
  56. package/dist/rpc/client.d.ts +2 -0
  57. package/dist/rpc/client.d.ts.map +1 -1
  58. package/dist/rpc/client.js +3 -0
  59. package/dist/rpc/client.js.map +1 -1
  60. package/dist/rpc/dispatcher.d.ts +14 -0
  61. package/dist/rpc/dispatcher.d.ts.map +1 -1
  62. package/dist/rpc/dispatcher.js +222 -7
  63. package/dist/rpc/dispatcher.js.map +1 -1
  64. package/dist/rpc/protocol.d.ts +12 -5
  65. package/dist/rpc/protocol.d.ts.map +1 -1
  66. package/dist/rpc/protocol.js +56 -0
  67. package/dist/rpc/protocol.js.map +1 -1
  68. package/dist/rpc/server.d.ts +5 -0
  69. package/dist/rpc/server.d.ts.map +1 -1
  70. package/dist/rpc/server.js +4 -0
  71. package/dist/rpc/server.js.map +1 -1
  72. package/dist/rpc-server-entry.d.ts.map +1 -1
  73. package/dist/rpc-server-entry.js +15 -1
  74. package/dist/rpc-server-entry.js.map +1 -1
  75. package/dist/runtime/product-host.d.ts +7 -0
  76. package/dist/runtime/product-host.d.ts.map +1 -1
  77. package/dist/runtime/product-host.js +29 -9
  78. package/dist/runtime/product-host.js.map +1 -1
  79. package/dist/runtime/session-factory.d.ts +18 -2
  80. package/dist/runtime/session-factory.d.ts.map +1 -1
  81. package/dist/runtime/session-factory.js +286 -23
  82. package/dist/runtime/session-factory.js.map +1 -1
  83. package/dist/runtime/session-host.d.ts +46 -1
  84. package/dist/runtime/session-host.d.ts.map +1 -1
  85. package/dist/runtime/session-host.js +38 -6
  86. package/dist/runtime/session-host.js.map +1 -1
  87. package/dist/ui-host.d.ts.map +1 -1
  88. package/dist/ui-host.js +3 -0
  89. package/dist/ui-host.js.map +1 -1
  90. package/dist/web/assets/index-C2SOU925.css +1 -0
  91. package/dist/web/assets/index-knXkInvO.js +41 -0
  92. package/dist/web/assets/index-knXkInvO.js.map +1 -0
  93. package/dist/web/index.html +2 -2
  94. package/dist/web-command.d.ts.map +1 -1
  95. package/dist/web-command.js +8 -1
  96. package/dist/web-command.js.map +1 -1
  97. package/dist/webui-entry.js +9 -1
  98. package/dist/webui-entry.js.map +1 -1
  99. package/dist/webui.d.ts +10 -0
  100. package/dist/webui.d.ts.map +1 -1
  101. package/dist/webui.js +21 -0
  102. package/dist/webui.js.map +1 -1
  103. package/package.json +11 -9
  104. package/dist/web/assets/index-BwfuGMvv.css +0 -1
  105. package/dist/web/assets/index-DPUaJqFJ.js +0 -41
  106. package/dist/web/assets/index-DPUaJqFJ.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/rpc/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { AssistantMessage, Model, ThinkingLevel } from \"@di-code/ai\";\nimport { JsonlLineDecoder, serializeJsonLine } from \"./jsonl.ts\";\nimport {\n\ttype OperationState,\n\tparseRpcServerMessage,\n\tRPC_PROTOCOL_VERSION,\n\ttype RpcAttachmentInfo,\n\ttype RpcCapabilities,\n\ttype RpcContextFileInfo,\n\ttype RpcErrorCode,\n\ttype RpcEventRecord,\n\ttype RpcMcpServerInfo,\n\ttype RpcMethod,\n\ttype RpcProductState,\n\ttype RpcProviderSummary,\n\ttype RpcRequest,\n\ttype RpcSessionState,\n\ttype RpcSettingsSnapshot,\n\ttype RpcSuccessResult,\n} from \"./protocol.ts\";\n\nexport interface RpcTransport {\n\treadonly readable: Readable;\n\treadonly writable: Writable;\n\tonExit?(listener: (code: number | null, signal: NodeJS.Signals | null) => void): () => void;\n\tclose?(): void;\n}\n\nexport interface RpcPromptOptions {\n\treadonly signal?: AbortSignal;\n\t/** Attachments are uploaded explicitly and consumed by this request; requests are never replayed automatically. */\n\treadonly attachmentIds?: readonly string[];\n}\n\nexport interface RpcSessionInfo {\n\treadonly id: string;\n\treadonly label: string;\n\treadonly modifiedAt?: number;\n}\n\nexport interface RpcRuntimeSnapshot {\n\treadonly providerId: string;\n\treadonly modelId: string;\n\treadonly thinkingLevel?: ThinkingLevel;\n}\n\ninterface PendingRequest {\n\treadonly method: RpcMethod;\n\treadonly resolve: (result: RpcSuccessResult) => void;\n\treadonly reject: (error: Error) => void;\n}\n\nexport class RpcRemoteError extends Error {\n\treadonly code: RpcErrorCode;\n\n\tconstructor(code: RpcErrorCode, message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"RpcRemoteError\";\n\t\tthis.code = code;\n\t}\n}\n\nexport class RpcClient {\n\tprivate readonly transport: RpcTransport;\n\tprivate readonly decoder: JsonlLineDecoder;\n\tprivate readonly pending = new Map<string, PendingRequest>();\n\tprivate readonly listeners = new Set<(event: RpcEventRecord) => void>();\n\tprivate readonly removeExitListener?: () => void;\n\tprivate closed = false;\n\n\tconstructor(transport: RpcTransport) {\n\t\tthis.transport = transport;\n\t\tthis.decoder = new JsonlLineDecoder((line) => this.acceptLine(line));\n\t\ttransport.readable.on(\"data\", this.handleData);\n\t\ttransport.readable.once(\"end\", this.handleEnd);\n\t\ttransport.readable.once(\"error\", this.handleError);\n\t\ttransport.writable.once(\"error\", this.handleError);\n\t\tthis.removeExitListener = transport.onExit?.((code, signal) => {\n\t\t\tthis.fail(new RpcRemoteError(\"PROCESS_EXIT\", `RPC process exited (code=${code} signal=${signal})`));\n\t\t});\n\t}\n\n\tsubscribe(listener: (event: RpcEventRecord) => void): () => void {\n\t\tthis.listeners.add(listener);\n\t\treturn () => this.listeners.delete(listener);\n\t}\n\n\tasync getState(): Promise<RpcSessionState> {\n\t\tconst result = await this.send(\"get_state\", {});\n\t\tif (result.method !== \"get_state\") throw new Error(\"RPC get_state returned an incompatible result.\");\n\t\treturn result.state as RpcSessionState;\n\t}\n\n\tasync prompt(message: string, options: RpcPromptOptions = {}): Promise<AssistantMessage> {\n\t\tconst requestId = randomUUID();\n\t\tconst onAbort = () => {\n\t\t\tvoid this.cancel(requestId).catch(() => undefined);\n\t\t};\n\t\toptions.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\ttry {\n\t\t\tconst response = this.send(\n\t\t\t\t\"prompt\",\n\t\t\t\t{ message, ...(options.attachmentIds === undefined ? {} : { attachmentIds: [...options.attachmentIds] }) },\n\t\t\t\trequestId,\n\t\t\t);\n\t\t\tif (options.signal?.aborted) onAbort();\n\t\t\tconst result = await response;\n\t\t\tif (result.method !== \"prompt\") throw new Error(\"RPC prompt returned an incompatible result.\");\n\t\t\treturn result.message as AssistantMessage;\n\t\t} finally {\n\t\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t\t}\n\t}\n\n\tasync cancel(requestId: string): Promise<boolean> {\n\t\tconst result = await this.send(\"cancel\", { requestId });\n\t\tif (result.method !== \"cancel\") throw new Error(\"RPC cancel returned an incompatible result.\");\n\t\treturn result.cancelled as boolean;\n\t}\n\n\t/**\n\t * Sends an explicitly named, schema-validated RPC request. Consumers should negotiate capabilities\n\t * before using extended methods so old process servers remain usable.\n\t */\n\tcall(method: RpcMethod, params: Record<string, unknown> = {}, id?: string): Promise<RpcSuccessResult> {\n\t\treturn this.send(method, params, id);\n\t}\n\n\tasync getCapabilities(events: readonly string[] = []): Promise<RpcSuccessResult> {\n\t\tconst result = await this.send(\"get_capabilities\", { events: [...events] });\n\t\treturn result;\n\t}\n\n\tasync negotiate(events: readonly import(\"./protocol.ts\").RpcExtendedEventName[] = []): Promise<RpcCapabilities> {\n\t\tconst result = await this.getCapabilities(events);\n\t\treturn {\n\t\t\tmethods: result.methods as readonly RpcMethod[],\n\t\t\tevents: result.events as readonly import(\"./protocol.ts\").RpcExtendedEventName[],\n\t\t\teventBufferSize: result.eventBufferSize as number,\n\t\t};\n\t}\n\n\tasync resumeEvents(lastSequence?: number): Promise<{ readonly snapshotRequired: boolean }> {\n\t\tconst result = await this.send(\"resume_events\", lastSequence === undefined ? {} : { lastSequence });\n\t\treturn { snapshotRequired: result.snapshotRequired as boolean };\n\t}\n\n\tasync getOperation(requestId: string): Promise<OperationState> {\n\t\tconst result = await this.send(\"get_operation\", { requestId });\n\t\treturn result.operation as OperationState;\n\t}\n\n\tasync listSessions(): Promise<readonly RpcSessionInfo[]> {\n\t\tconst result = await this.send(\"list_sessions\", {});\n\t\treturn result.sessions as readonly RpcSessionInfo[];\n\t}\n\n\tasync newSession(): Promise<RpcSessionInfo> {\n\t\tconst result = await this.send(\"new_session\", {});\n\t\treturn result.session as RpcSessionInfo;\n\t}\n\n\tasync openSession(sessionId: string): Promise<RpcSessionInfo> {\n\t\tconst result = await this.send(\"open_session\", { sessionId });\n\t\treturn result.session as RpcSessionInfo;\n\t}\n\n\tasync getProductState(): Promise<RpcProductState> {\n\t\tconst result = await this.send(\"get_product_state\", {});\n\t\treturn result.state as RpcProductState;\n\t}\n\n\tasync getProjectTrust(): Promise<boolean> {\n\t\tconst result = await this.send(\"get_project_trust\", {});\n\t\treturn result.trusted as boolean;\n\t}\n\n\tasync getTranscript(\n\t\tparams: { readonly pageToken?: string; readonly pageSize?: number; readonly maxBytes?: number } = {},\n\t): Promise<RpcSuccessResult> {\n\t\treturn this.send(\"get_transcript\", params);\n\t}\n\n\tasync getTree(): Promise<RpcSuccessResult> {\n\t\treturn this.send(\"get_tree\", {});\n\t}\n\n\tasync navigateTree(entryId: string): Promise<RpcSuccessResult> {\n\t\treturn this.send(\"navigate_tree\", { entryId });\n\t}\n\n\tasync getModels(): Promise<readonly Model[]> {\n\t\tconst result = await this.send(\"get_models\", {});\n\t\treturn result.models as readonly Model[];\n\t}\n\n\tasync setModel(modelId: string): Promise<Model> {\n\t\tconst result = await this.send(\"set_model\", { modelId });\n\t\treturn result.model as Model;\n\t}\n\n\tasync getRuntime(): Promise<RpcRuntimeSnapshot> {\n\t\tconst result = await this.send(\"get_runtime\", {});\n\t\treturn {\n\t\t\tproviderId: result.providerId as string,\n\t\t\tmodelId: result.modelId as string,\n\t\t\t...(result.thinkingLevel === undefined ? {} : { thinkingLevel: result.thinkingLevel as ThinkingLevel }),\n\t\t};\n\t}\n\n\tasync setRuntime(providerId: string, modelId: string): Promise<Model> {\n\t\tconst result = await this.send(\"set_runtime\", { providerId, modelId });\n\t\treturn result.model as Model;\n\t}\n\n\tasync setThinkingLevel(level?: ThinkingLevel): Promise<ThinkingLevel | undefined> {\n\t\tconst result = await this.send(\"set_thinking_level\", level === undefined ? {} : { level });\n\t\treturn result.level as ThinkingLevel | undefined;\n\t}\n\n\tasync compact(): Promise<void> {\n\t\tawait this.send(\"compact\", {});\n\t}\n\n\tasync setCompactionEnabled(enabled: boolean): Promise<boolean> {\n\t\tconst result = await this.send(\"set_compaction_enabled\", { enabled });\n\t\treturn result.enabled as boolean;\n\t}\n\n\tasync getUsage(): Promise<RpcSuccessResult> {\n\t\treturn this.send(\"get_usage\", {});\n\t}\n\n\tasync listSkills(): Promise<RpcSuccessResult> {\n\t\treturn this.send(\"list_skills\", {});\n\t}\n\n\tasync getResources(): Promise<RpcSuccessResult> {\n\t\treturn this.send(\"get_resources\", {});\n\t}\n\n\tasync steer(message: string, options: RpcPromptOptions = {}): Promise<void> {\n\t\tconst result = await this.send(\"steer\", {\n\t\t\tmessage,\n\t\t\t...(options.attachmentIds === undefined ? {} : { attachmentIds: [...options.attachmentIds] }),\n\t\t});\n\t\tif (result.method !== \"steer\") throw new Error(\"RPC steer returned an incompatible result.\");\n\t}\n\n\tasync retry(targetRequestId: string): Promise<AssistantMessage> {\n\t\tconst result = await this.send(\"retry\", { targetRequestId });\n\t\tif (result.method !== \"retry\") throw new Error(\"RPC retry returned an incompatible result.\");\n\t\treturn result.message as AssistantMessage;\n\t}\n\n\tasync listProviders(): Promise<readonly RpcProviderSummary[]> {\n\t\tconst result = await this.send(\"list_providers\", {});\n\t\treturn result.providers as readonly RpcProviderSummary[];\n\t}\n\n\tasync getSettings(): Promise<RpcSettingsSnapshot> {\n\t\tconst result = await this.send(\"get_settings\", {});\n\t\treturn result.settings as RpcSettingsSnapshot;\n\t}\n\n\tasync setDefaultProvider(providerId: string): Promise<void> {\n\t\tawait this.send(\"set_default_provider\", { providerId });\n\t}\n\n\tasync setDefaultModel(modelId: string): Promise<void> {\n\t\tawait this.send(\"set_default_model\", { modelId });\n\t}\n\n\tasync setLocale(locale: \"en\" | \"zh-CN\"): Promise<void> {\n\t\tawait this.send(\"set_locale\", { locale });\n\t}\n\n\tasync setPermissionMode(permissionMode: \"ask\" | \"allow\" | \"deny\"): Promise<void> {\n\t\tawait this.send(\"set_permission_mode\", { permissionMode });\n\t}\n\n\tasync configureCustomProvider(input: {\n\t\treadonly api: \"openai-responses\" | \"openai-chat-completions\" | \"anthropic-messages\";\n\t\treadonly baseUrl: string;\n\t\treadonly apiKey: string;\n\t\treadonly modelId: string;\n\t}): Promise<RpcProviderSummary> {\n\t\tconst result = await this.send(\"configure_custom_provider\", input);\n\t\treturn result.provider as RpcProviderSummary;\n\t}\n\n\tasync login(\n\t\tproviderId: string,\n\t\tapiKey: string,\n\t\toptions: { readonly modelId?: string; readonly api?: string } = {},\n\t): Promise<RpcProviderSummary> {\n\t\tconst result = await this.send(\"login\", { providerId, apiKey, ...options });\n\t\treturn result.provider as RpcProviderSummary;\n\t}\n\n\tasync logout(providerId: string): Promise<void> {\n\t\tawait this.send(\"logout\", { providerId });\n\t}\n\n\tasync setProjectTrust(trusted: boolean): Promise<boolean> {\n\t\tconst result = await this.send(\"set_project_trust\", { trusted });\n\t\treturn result.trusted as boolean;\n\t}\n\n\tasync listContextFiles(): Promise<readonly RpcContextFileInfo[]> {\n\t\tconst result = await this.send(\"list_context_files\", {});\n\t\treturn result.files as readonly RpcContextFileInfo[];\n\t}\n\n\tasync listMcpServers(): Promise<readonly RpcMcpServerInfo[]> {\n\t\tconst result = await this.send(\"list_mcp_servers\", {});\n\t\treturn result.servers as readonly RpcMcpServerInfo[];\n\t}\n\n\tasync configureMcpServer(\n\t\tserverId: string,\n\t\tscope: \"user\" | \"project\" | \"local\",\n\t\tconfig: Record<string, unknown>,\n\t): Promise<RpcMcpServerInfo> {\n\t\tconst result = await this.send(\"configure_mcp_server\", { serverId, scope, config });\n\t\treturn result.server as RpcMcpServerInfo;\n\t}\n\n\tasync removeMcpServer(serverId: string, scope: \"user\" | \"project\" | \"local\" = \"project\"): Promise<void> {\n\t\tawait this.send(\"remove_mcp_server\", { serverId, scope });\n\t}\n\n\tasync reconnectMcpServer(serverId: string): Promise<RpcMcpServerInfo> {\n\t\tconst result = await this.send(\"reconnect_mcp_server\", { serverId });\n\t\treturn result.server as RpcMcpServerInfo;\n\t}\n\n\tasync createAttachment(\n\t\tname: string,\n\t\tcontentType: RpcAttachmentInfo[\"contentType\"],\n\t\tdata: string,\n\t): Promise<RpcAttachmentInfo> {\n\t\tconst result = await this.send(\"create_attachment\", { name, contentType, data });\n\t\treturn result.attachment as RpcAttachmentInfo;\n\t}\n\n\tclose(): void {\n\t\tif (this.closed) return;\n\t\tthis.closed = true;\n\t\tthis.detach();\n\t\tthis.transport.close?.();\n\t\tthis.rejectPending(new Error(\"RPC client is closed.\"));\n\t}\n\n\tprivate send(\n\t\tmethod: \"prompt\",\n\t\tparams: { readonly message: string; readonly attachmentIds?: readonly string[] },\n\t\tid?: string,\n\t): Promise<RpcSuccessResult>;\n\tprivate send(method: \"cancel\", params: { readonly requestId: string }, id?: string): Promise<RpcSuccessResult>;\n\tprivate send(method: \"get_state\", params: Record<string, never>, id?: string): Promise<RpcSuccessResult>;\n\tprivate send(method: RpcMethod, params: Record<string, unknown>, id?: string): Promise<RpcSuccessResult>;\n\tprivate send(method: RpcMethod, params: Record<string, unknown>, id = randomUUID()): Promise<RpcSuccessResult> {\n\t\tif (this.closed) return Promise.reject(new Error(\"RPC client is closed.\"));\n\t\tconst request = { version: RPC_PROTOCOL_VERSION, kind: \"request\", id, method, params } as RpcRequest;\n\t\treturn new Promise<RpcSuccessResult>((resolve, reject) => {\n\t\t\tthis.pending.set(id, { method, resolve, reject });\n\t\t\tthis.transport.writable.write(serializeJsonLine(request), (error) => {\n\t\t\t\tif (!error) return;\n\t\t\t\tthis.pending.delete(id);\n\t\t\t\treject(error);\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate readonly handleData = (chunk: string | Buffer): void => {\n\t\ttry {\n\t\t\tthis.decoder.push(chunk);\n\t\t} catch (cause) {\n\t\t\tthis.fail(cause instanceof Error ? cause : new Error(String(cause)));\n\t\t}\n\t};\n\n\tprivate readonly handleEnd = (): void => {\n\t\ttry {\n\t\t\tthis.decoder.end();\n\t\t} catch (cause) {\n\t\t\tthis.fail(cause instanceof Error ? cause : new Error(String(cause)));\n\t\t\treturn;\n\t\t}\n\t\tthis.fail(new Error(\"RPC output ended before the client was closed.\"));\n\t};\n\n\tprivate readonly handleError = (error: Error): void => this.fail(error);\n\n\tprivate acceptLine(line: string): void {\n\t\tconst message = parseRpcServerMessage(line);\n\t\tif (message.kind === \"event\") {\n\t\t\tfor (const listener of this.listeners) listener(structuredClone(message));\n\t\t\treturn;\n\t\t}\n\t\tif (!message.ok && message.id === undefined) {\n\t\t\tthis.fail(new Error(`${message.error.code}: ${message.error.message}`));\n\t\t\treturn;\n\t\t}\n\t\tif (message.id === undefined) return;\n\t\tconst pending = this.pending.get(message.id);\n\t\tif (!pending) return;\n\t\tthis.pending.delete(message.id);\n\t\tif (!message.ok) {\n\t\t\tpending.reject(new RpcRemoteError(message.error.code, message.error.message));\n\t\t\treturn;\n\t\t}\n\t\tif (message.result.method !== pending.method) {\n\t\t\tpending.reject(new Error(`RPC response method mismatch: expected ${pending.method}.`));\n\t\t\treturn;\n\t\t}\n\t\tpending.resolve(message.result);\n\t}\n\n\tprivate fail(error: Error): void {\n\t\tif (this.closed) return;\n\t\tthis.closed = true;\n\t\tthis.detach();\n\t\tthis.rejectPending(error);\n\t}\n\n\tprivate rejectPending(error: Error): void {\n\t\tfor (const pending of this.pending.values()) pending.reject(error);\n\t\tthis.pending.clear();\n\t}\n\n\tprivate detach(): void {\n\t\tthis.transport.readable.off(\"data\", this.handleData);\n\t\tthis.transport.readable.off(\"end\", this.handleEnd);\n\t\tthis.transport.readable.off(\"error\", this.handleError);\n\t\tthis.transport.writable.off(\"error\", this.handleError);\n\t\tthis.removeExitListener?.();\n\t}\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/rpc/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAEN,qBAAqB,EACrB,oBAAoB,GAcpB,MAAM,eAAe,CAAC;AAiCvB,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC/B,IAAI,CAAe;IAE5B,YAAY,IAAkB,EAAE,OAAe;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;CACD;AAED,MAAM,OAAO,SAAS;IACJ,SAAS,CAAe;IACxB,OAAO,CAAmB;IAC1B,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC5C,SAAS,GAAG,IAAI,GAAG,EAAmC,CAAC;IACvD,kBAAkB,CAAc;IACzC,MAAM,GAAG,KAAK,CAAC;IAEvB,YAAY,SAAuB;QAClC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QACrE,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/C,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACnD,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAC7D,IAAI,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,cAAc,EAAE,4BAA4B,IAAI,WAAW,MAAM,GAAG,CAAC,CAAC,CAAC;QACrG,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,QAAyC;QAClD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,QAAQ;QACb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAChD,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACrG,OAAO,MAAM,CAAC,KAAwB,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,UAA4B,EAAE;QAC3D,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,GAAG,EAAE;YACpB,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACpD,CAAC,CAAC;QACF,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CACzB,QAAQ,EACR,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,EAC1G,SAAS,CACT,CAAC;YACF,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;gBAAE,OAAO,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;YAC9B,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YAC/F,OAAO,MAAM,CAAC,OAA2B,CAAC;QAC3C,CAAC;gBAAS,CAAC;YACV,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;IACF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB;QAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC/F,OAAO,MAAM,CAAC,SAAoB,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,MAAiB,EAAE,SAAkC,EAAE,EAAE,EAAW;QACxE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,SAA4B,EAAE;QACnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5E,OAAO,MAAM,CAAC;IACf,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,SAAkE,EAAE;QACnF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAClD,OAAO;YACN,OAAO,EAAE,MAAM,CAAC,OAA+B;YAC/C,MAAM,EAAE,MAAM,CAAC,MAAiE;YAChF,eAAe,EAAE,MAAM,CAAC,eAAyB;SACjD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,YAAqB;QACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;QACpG,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,gBAA2B,EAAE,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAiB;QACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/D,OAAO,MAAM,CAAC,SAA2B,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,YAAY;QACjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QACpD,OAAO,MAAM,CAAC,QAAqC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,UAAU;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QAClD,OAAO,MAAM,CAAC,OAAyB,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB;QAClC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9D,OAAO,MAAM,CAAC,OAAyB,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,eAAe;QACpB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACxD,OAAO,MAAM,CAAC,KAAwB,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,eAAe;QACpB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACxD,OAAO,MAAM,CAAC,OAAkB,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,aAAa,CAClB,SAAkG,EAAE;QAEpG,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,OAAO;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,SAAS;QACd,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC,MAA0B,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe;QAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACzD,OAAO,MAAM,CAAC,KAAc,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,UAAU;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QAClD,OAAO;YACN,UAAU,EAAE,MAAM,CAAC,UAAoB;YACvC,OAAO,EAAE,MAAM,CAAC,OAAiB;YACjC,GAAG,CAAC,MAAM,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAA8B,EAAE,CAAC;SACvG,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAkB,EAAE,OAAe;QACnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;QACvE,OAAO,MAAM,CAAC,KAAc,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,KAAqB;QAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3F,OAAO,MAAM,CAAC,KAAkC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,OAAO;QACZ,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,OAAgB;QAC1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACtE,OAAO,MAAM,CAAC,OAAkB,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,QAAQ;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,UAAU;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,YAAY;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAe,EAAE,UAA4B,EAAE;QAC1D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACvC,OAAO;YACP,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;SAC7F,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC9F,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,eAAuB;QAClC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC7F,OAAO,MAAM,CAAC,OAA2B,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,aAAa;QAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC,SAA0C,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,WAAW;QAChB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,MAAM,CAAC,QAA+B,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAAkB;QAC1C,MAAM,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAe;QACpC,MAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAsB;QACrC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,cAAwC;QAC/D,MAAM,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,KAK7B;QACA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QACnE,OAAO,MAAM,CAAC,QAA8B,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,KAAK,CACV,UAAkB,EAClB,MAAc,EACd,UAAgE,EAAE;QAElE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;QAC5E,OAAO,MAAM,CAAC,QAA8B,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAkB;QAC9B,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAgB;QACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACjE,OAAO,MAAM,CAAC,OAAkB,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,gBAAgB;QACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;QACzD,OAAO,MAAM,CAAC,KAAsC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,cAAc;QACnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QACvD,OAAO,MAAM,CAAC,OAAsC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,kBAAkB,CACvB,QAAgB,EAChB,KAAmC,EACnC,MAA+B;QAE/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACpF,OAAO,MAAM,CAAC,MAA0B,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,QAAgB,EAAE,QAAsC,SAAS;QACtF,MAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,QAAgB;QACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrE,OAAO,MAAM,CAAC,MAA0B,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,gBAAgB,CACrB,IAAY,EACZ,WAA6C,EAC7C,IAAY;QAEZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,OAAO,MAAM,CAAC,UAA+B,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,kBAAkB,CACvB,SAAiB,EACjB,MAA+D;QAE/D,MAAM,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,KAAK;QACJ,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QACzB,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACxD,CAAC;IAUO,IAAI,CAAC,MAAiB,EAAE,MAA+B,EAAE,EAAE,GAAG,UAAU,EAAE;QACjF,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAgB,CAAC;QACrG,OAAO,IAAI,OAAO,CAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAClD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;gBACnE,IAAI,CAAC,KAAK;oBAAE,OAAO;gBACnB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,MAAM,CAAC,KAAK,CAAC,CAAC;YACf,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC;IAEgB,UAAU,GAAG,CAAC,KAAsB,EAAQ,EAAE;QAC9D,IAAI,CAAC;YACJ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtE,CAAC;IACF,CAAC,CAAC;IAEe,SAAS,GAAG,GAAS,EAAE;QACvC,IAAI,CAAC;YACJ,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACrE,OAAO;QACR,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC;IAEe,WAAW,GAAG,CAAC,KAAY,EAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEhE,UAAU,CAAC,IAAY;QAC9B,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC9B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS;gBAAE,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1E,OAAO;QACR,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACxE,OAAO;QACR,CAAC;QACD,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS;YAAE,OAAO;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAC9E,OAAO;QACR,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;YAC9C,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,0CAA0C,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACvF,OAAO;QACR,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAEO,IAAI,CAAC,KAAY;QACxB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAEO,aAAa,CAAC,KAAY;QACjC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAEO,MAAM;QACb,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACvD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACvD,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;IAC7B,CAAC;CACD","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { AssistantMessage, Model, ThinkingLevel } from \"@di-code/ai\";\nimport type { UserInteractionResult } from \"@di-code/plugin-sdk\";\nimport { JsonlLineDecoder, serializeJsonLine } from \"./jsonl.ts\";\nimport {\n\ttype OperationState,\n\tparseRpcServerMessage,\n\tRPC_PROTOCOL_VERSION,\n\ttype RpcAttachmentInfo,\n\ttype RpcCapabilities,\n\ttype RpcContextFileInfo,\n\ttype RpcErrorCode,\n\ttype RpcEventRecord,\n\ttype RpcMcpServerInfo,\n\ttype RpcMethod,\n\ttype RpcProductState,\n\ttype RpcProviderSummary,\n\ttype RpcRequest,\n\ttype RpcSessionState,\n\ttype RpcSettingsSnapshot,\n\ttype RpcSuccessResult,\n} from \"./protocol.ts\";\n\nexport interface RpcTransport {\n\treadonly readable: Readable;\n\treadonly writable: Writable;\n\tonExit?(listener: (code: number | null, signal: NodeJS.Signals | null) => void): () => void;\n\tclose?(): void;\n}\n\nexport interface RpcPromptOptions {\n\treadonly signal?: AbortSignal;\n\t/** Attachments are uploaded explicitly and consumed by this request; requests are never replayed automatically. */\n\treadonly attachmentIds?: readonly string[];\n}\n\nexport interface RpcSessionInfo {\n\treadonly id: string;\n\treadonly label: string;\n\treadonly modifiedAt?: number;\n}\n\nexport interface RpcRuntimeSnapshot {\n\treadonly providerId: string;\n\treadonly modelId: string;\n\treadonly thinkingLevel?: ThinkingLevel;\n}\n\ninterface PendingRequest {\n\treadonly method: RpcMethod;\n\treadonly resolve: (result: RpcSuccessResult) => void;\n\treadonly reject: (error: Error) => void;\n}\n\nexport class RpcRemoteError extends Error {\n\treadonly code: RpcErrorCode;\n\n\tconstructor(code: RpcErrorCode, message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"RpcRemoteError\";\n\t\tthis.code = code;\n\t}\n}\n\nexport class RpcClient {\n\tprivate readonly transport: RpcTransport;\n\tprivate readonly decoder: JsonlLineDecoder;\n\tprivate readonly pending = new Map<string, PendingRequest>();\n\tprivate readonly listeners = new Set<(event: RpcEventRecord) => void>();\n\tprivate readonly removeExitListener?: () => void;\n\tprivate closed = false;\n\n\tconstructor(transport: RpcTransport) {\n\t\tthis.transport = transport;\n\t\tthis.decoder = new JsonlLineDecoder((line) => this.acceptLine(line));\n\t\ttransport.readable.on(\"data\", this.handleData);\n\t\ttransport.readable.once(\"end\", this.handleEnd);\n\t\ttransport.readable.once(\"error\", this.handleError);\n\t\ttransport.writable.once(\"error\", this.handleError);\n\t\tthis.removeExitListener = transport.onExit?.((code, signal) => {\n\t\t\tthis.fail(new RpcRemoteError(\"PROCESS_EXIT\", `RPC process exited (code=${code} signal=${signal})`));\n\t\t});\n\t}\n\n\tsubscribe(listener: (event: RpcEventRecord) => void): () => void {\n\t\tthis.listeners.add(listener);\n\t\treturn () => this.listeners.delete(listener);\n\t}\n\n\tasync getState(): Promise<RpcSessionState> {\n\t\tconst result = await this.send(\"get_state\", {});\n\t\tif (result.method !== \"get_state\") throw new Error(\"RPC get_state returned an incompatible result.\");\n\t\treturn result.state as RpcSessionState;\n\t}\n\n\tasync prompt(message: string, options: RpcPromptOptions = {}): Promise<AssistantMessage> {\n\t\tconst requestId = randomUUID();\n\t\tconst onAbort = () => {\n\t\t\tvoid this.cancel(requestId).catch(() => undefined);\n\t\t};\n\t\toptions.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\ttry {\n\t\t\tconst response = this.send(\n\t\t\t\t\"prompt\",\n\t\t\t\t{ message, ...(options.attachmentIds === undefined ? {} : { attachmentIds: [...options.attachmentIds] }) },\n\t\t\t\trequestId,\n\t\t\t);\n\t\t\tif (options.signal?.aborted) onAbort();\n\t\t\tconst result = await response;\n\t\t\tif (result.method !== \"prompt\") throw new Error(\"RPC prompt returned an incompatible result.\");\n\t\t\treturn result.message as AssistantMessage;\n\t\t} finally {\n\t\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t\t}\n\t}\n\n\tasync cancel(requestId: string): Promise<boolean> {\n\t\tconst result = await this.send(\"cancel\", { requestId });\n\t\tif (result.method !== \"cancel\") throw new Error(\"RPC cancel returned an incompatible result.\");\n\t\treturn result.cancelled as boolean;\n\t}\n\n\t/**\n\t * Sends an explicitly named, schema-validated RPC request. Consumers should negotiate capabilities\n\t * before using extended methods so old process servers remain usable.\n\t */\n\tcall(method: RpcMethod, params: Record<string, unknown> = {}, id?: string): Promise<RpcSuccessResult> {\n\t\treturn this.send(method, params, id);\n\t}\n\n\tasync getCapabilities(events: readonly string[] = []): Promise<RpcSuccessResult> {\n\t\tconst result = await this.send(\"get_capabilities\", { events: [...events] });\n\t\treturn result;\n\t}\n\n\tasync negotiate(events: readonly import(\"./protocol.ts\").RpcExtendedEventName[] = []): Promise<RpcCapabilities> {\n\t\tconst result = await this.getCapabilities(events);\n\t\treturn {\n\t\t\tmethods: result.methods as readonly RpcMethod[],\n\t\t\tevents: result.events as readonly import(\"./protocol.ts\").RpcExtendedEventName[],\n\t\t\teventBufferSize: result.eventBufferSize as number,\n\t\t};\n\t}\n\n\tasync resumeEvents(lastSequence?: number): Promise<{ readonly snapshotRequired: boolean }> {\n\t\tconst result = await this.send(\"resume_events\", lastSequence === undefined ? {} : { lastSequence });\n\t\treturn { snapshotRequired: result.snapshotRequired as boolean };\n\t}\n\n\tasync getOperation(requestId: string): Promise<OperationState> {\n\t\tconst result = await this.send(\"get_operation\", { requestId });\n\t\treturn result.operation as OperationState;\n\t}\n\n\tasync listSessions(): Promise<readonly RpcSessionInfo[]> {\n\t\tconst result = await this.send(\"list_sessions\", {});\n\t\treturn result.sessions as readonly RpcSessionInfo[];\n\t}\n\n\tasync newSession(): Promise<RpcSessionInfo> {\n\t\tconst result = await this.send(\"new_session\", {});\n\t\treturn result.session as RpcSessionInfo;\n\t}\n\n\tasync openSession(sessionId: string): Promise<RpcSessionInfo> {\n\t\tconst result = await this.send(\"open_session\", { sessionId });\n\t\treturn result.session as RpcSessionInfo;\n\t}\n\n\tasync getProductState(): Promise<RpcProductState> {\n\t\tconst result = await this.send(\"get_product_state\", {});\n\t\treturn result.state as RpcProductState;\n\t}\n\n\tasync getProjectTrust(): Promise<boolean> {\n\t\tconst result = await this.send(\"get_project_trust\", {});\n\t\treturn result.trusted as boolean;\n\t}\n\n\tasync getTranscript(\n\t\tparams: { readonly pageToken?: string; readonly pageSize?: number; readonly maxBytes?: number } = {},\n\t): Promise<RpcSuccessResult> {\n\t\treturn this.send(\"get_transcript\", params);\n\t}\n\n\tasync getTree(): Promise<RpcSuccessResult> {\n\t\treturn this.send(\"get_tree\", {});\n\t}\n\n\tasync navigateTree(entryId: string): Promise<RpcSuccessResult> {\n\t\treturn this.send(\"navigate_tree\", { entryId });\n\t}\n\n\tasync getModels(): Promise<readonly Model[]> {\n\t\tconst result = await this.send(\"get_models\", {});\n\t\treturn result.models as readonly Model[];\n\t}\n\n\tasync setModel(modelId: string): Promise<Model> {\n\t\tconst result = await this.send(\"set_model\", { modelId });\n\t\treturn result.model as Model;\n\t}\n\n\tasync getRuntime(): Promise<RpcRuntimeSnapshot> {\n\t\tconst result = await this.send(\"get_runtime\", {});\n\t\treturn {\n\t\t\tproviderId: result.providerId as string,\n\t\t\tmodelId: result.modelId as string,\n\t\t\t...(result.thinkingLevel === undefined ? {} : { thinkingLevel: result.thinkingLevel as ThinkingLevel }),\n\t\t};\n\t}\n\n\tasync setRuntime(providerId: string, modelId: string): Promise<Model> {\n\t\tconst result = await this.send(\"set_runtime\", { providerId, modelId });\n\t\treturn result.model as Model;\n\t}\n\n\tasync setThinkingLevel(level?: ThinkingLevel): Promise<ThinkingLevel | undefined> {\n\t\tconst result = await this.send(\"set_thinking_level\", level === undefined ? {} : { level });\n\t\treturn result.level as ThinkingLevel | undefined;\n\t}\n\n\tasync compact(): Promise<void> {\n\t\tawait this.send(\"compact\", {});\n\t}\n\n\tasync setCompactionEnabled(enabled: boolean): Promise<boolean> {\n\t\tconst result = await this.send(\"set_compaction_enabled\", { enabled });\n\t\treturn result.enabled as boolean;\n\t}\n\n\tasync getUsage(): Promise<RpcSuccessResult> {\n\t\treturn this.send(\"get_usage\", {});\n\t}\n\n\tasync listSkills(): Promise<RpcSuccessResult> {\n\t\treturn this.send(\"list_skills\", {});\n\t}\n\n\tasync getResources(): Promise<RpcSuccessResult> {\n\t\treturn this.send(\"get_resources\", {});\n\t}\n\n\tasync steer(message: string, options: RpcPromptOptions = {}): Promise<void> {\n\t\tconst result = await this.send(\"steer\", {\n\t\t\tmessage,\n\t\t\t...(options.attachmentIds === undefined ? {} : { attachmentIds: [...options.attachmentIds] }),\n\t\t});\n\t\tif (result.method !== \"steer\") throw new Error(\"RPC steer returned an incompatible result.\");\n\t}\n\n\tasync retry(targetRequestId: string): Promise<AssistantMessage> {\n\t\tconst result = await this.send(\"retry\", { targetRequestId });\n\t\tif (result.method !== \"retry\") throw new Error(\"RPC retry returned an incompatible result.\");\n\t\treturn result.message as AssistantMessage;\n\t}\n\n\tasync listProviders(): Promise<readonly RpcProviderSummary[]> {\n\t\tconst result = await this.send(\"list_providers\", {});\n\t\treturn result.providers as readonly RpcProviderSummary[];\n\t}\n\n\tasync getSettings(): Promise<RpcSettingsSnapshot> {\n\t\tconst result = await this.send(\"get_settings\", {});\n\t\treturn result.settings as RpcSettingsSnapshot;\n\t}\n\n\tasync setDefaultProvider(providerId: string): Promise<void> {\n\t\tawait this.send(\"set_default_provider\", { providerId });\n\t}\n\n\tasync setDefaultModel(modelId: string): Promise<void> {\n\t\tawait this.send(\"set_default_model\", { modelId });\n\t}\n\n\tasync setLocale(locale: \"en\" | \"zh-CN\"): Promise<void> {\n\t\tawait this.send(\"set_locale\", { locale });\n\t}\n\n\tasync setPermissionMode(permissionMode: \"ask\" | \"allow\" | \"deny\"): Promise<void> {\n\t\tawait this.send(\"set_permission_mode\", { permissionMode });\n\t}\n\n\tasync configureCustomProvider(input: {\n\t\treadonly api: \"openai-responses\" | \"openai-chat-completions\" | \"anthropic-messages\";\n\t\treadonly baseUrl: string;\n\t\treadonly apiKey: string;\n\t\treadonly modelId: string;\n\t}): Promise<RpcProviderSummary> {\n\t\tconst result = await this.send(\"configure_custom_provider\", input);\n\t\treturn result.provider as RpcProviderSummary;\n\t}\n\n\tasync login(\n\t\tproviderId: string,\n\t\tapiKey: string,\n\t\toptions: { readonly modelId?: string; readonly api?: string } = {},\n\t): Promise<RpcProviderSummary> {\n\t\tconst result = await this.send(\"login\", { providerId, apiKey, ...options });\n\t\treturn result.provider as RpcProviderSummary;\n\t}\n\n\tasync logout(providerId: string): Promise<void> {\n\t\tawait this.send(\"logout\", { providerId });\n\t}\n\n\tasync setProjectTrust(trusted: boolean): Promise<boolean> {\n\t\tconst result = await this.send(\"set_project_trust\", { trusted });\n\t\treturn result.trusted as boolean;\n\t}\n\n\tasync listContextFiles(): Promise<readonly RpcContextFileInfo[]> {\n\t\tconst result = await this.send(\"list_context_files\", {});\n\t\treturn result.files as readonly RpcContextFileInfo[];\n\t}\n\n\tasync listMcpServers(): Promise<readonly RpcMcpServerInfo[]> {\n\t\tconst result = await this.send(\"list_mcp_servers\", {});\n\t\treturn result.servers as readonly RpcMcpServerInfo[];\n\t}\n\n\tasync configureMcpServer(\n\t\tserverId: string,\n\t\tscope: \"user\" | \"project\" | \"local\",\n\t\tconfig: Record<string, unknown>,\n\t): Promise<RpcMcpServerInfo> {\n\t\tconst result = await this.send(\"configure_mcp_server\", { serverId, scope, config });\n\t\treturn result.server as RpcMcpServerInfo;\n\t}\n\n\tasync removeMcpServer(serverId: string, scope: \"user\" | \"project\" | \"local\" = \"project\"): Promise<void> {\n\t\tawait this.send(\"remove_mcp_server\", { serverId, scope });\n\t}\n\n\tasync reconnectMcpServer(serverId: string): Promise<RpcMcpServerInfo> {\n\t\tconst result = await this.send(\"reconnect_mcp_server\", { serverId });\n\t\treturn result.server as RpcMcpServerInfo;\n\t}\n\n\tasync createAttachment(\n\t\tname: string,\n\t\tcontentType: RpcAttachmentInfo[\"contentType\"],\n\t\tdata: string,\n\t): Promise<RpcAttachmentInfo> {\n\t\tconst result = await this.send(\"create_attachment\", { name, contentType, data });\n\t\treturn result.attachment as RpcAttachmentInfo;\n\t}\n\n\tasync respondInteraction(\n\t\trequestId: string,\n\t\tresult: Omit<UserInteractionResult, \"requestId\" | \"toolCallId\">,\n\t): Promise<void> {\n\t\tawait this.send(\"respond_interaction\", { requestId, ...result });\n\t}\n\n\tclose(): void {\n\t\tif (this.closed) return;\n\t\tthis.closed = true;\n\t\tthis.detach();\n\t\tthis.transport.close?.();\n\t\tthis.rejectPending(new Error(\"RPC client is closed.\"));\n\t}\n\n\tprivate send(\n\t\tmethod: \"prompt\",\n\t\tparams: { readonly message: string; readonly attachmentIds?: readonly string[] },\n\t\tid?: string,\n\t): Promise<RpcSuccessResult>;\n\tprivate send(method: \"cancel\", params: { readonly requestId: string }, id?: string): Promise<RpcSuccessResult>;\n\tprivate send(method: \"get_state\", params: Record<string, never>, id?: string): Promise<RpcSuccessResult>;\n\tprivate send(method: RpcMethod, params: Record<string, unknown>, id?: string): Promise<RpcSuccessResult>;\n\tprivate send(method: RpcMethod, params: Record<string, unknown>, id = randomUUID()): Promise<RpcSuccessResult> {\n\t\tif (this.closed) return Promise.reject(new Error(\"RPC client is closed.\"));\n\t\tconst request = { version: RPC_PROTOCOL_VERSION, kind: \"request\", id, method, params } as RpcRequest;\n\t\treturn new Promise<RpcSuccessResult>((resolve, reject) => {\n\t\t\tthis.pending.set(id, { method, resolve, reject });\n\t\t\tthis.transport.writable.write(serializeJsonLine(request), (error) => {\n\t\t\t\tif (!error) return;\n\t\t\t\tthis.pending.delete(id);\n\t\t\t\treject(error);\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate readonly handleData = (chunk: string | Buffer): void => {\n\t\ttry {\n\t\t\tthis.decoder.push(chunk);\n\t\t} catch (cause) {\n\t\t\tthis.fail(cause instanceof Error ? cause : new Error(String(cause)));\n\t\t}\n\t};\n\n\tprivate readonly handleEnd = (): void => {\n\t\ttry {\n\t\t\tthis.decoder.end();\n\t\t} catch (cause) {\n\t\t\tthis.fail(cause instanceof Error ? cause : new Error(String(cause)));\n\t\t\treturn;\n\t\t}\n\t\tthis.fail(new Error(\"RPC output ended before the client was closed.\"));\n\t};\n\n\tprivate readonly handleError = (error: Error): void => this.fail(error);\n\n\tprivate acceptLine(line: string): void {\n\t\tconst message = parseRpcServerMessage(line);\n\t\tif (message.kind === \"event\") {\n\t\t\tfor (const listener of this.listeners) listener(structuredClone(message));\n\t\t\treturn;\n\t\t}\n\t\tif (!message.ok && message.id === undefined) {\n\t\t\tthis.fail(new Error(`${message.error.code}: ${message.error.message}`));\n\t\t\treturn;\n\t\t}\n\t\tif (message.id === undefined) return;\n\t\tconst pending = this.pending.get(message.id);\n\t\tif (!pending) return;\n\t\tthis.pending.delete(message.id);\n\t\tif (!message.ok) {\n\t\t\tpending.reject(new RpcRemoteError(message.error.code, message.error.message));\n\t\t\treturn;\n\t\t}\n\t\tif (message.result.method !== pending.method) {\n\t\t\tpending.reject(new Error(`RPC response method mismatch: expected ${pending.method}.`));\n\t\t\treturn;\n\t\t}\n\t\tpending.resolve(message.result);\n\t}\n\n\tprivate fail(error: Error): void {\n\t\tif (this.closed) return;\n\t\tthis.closed = true;\n\t\tthis.detach();\n\t\tthis.rejectPending(error);\n\t}\n\n\tprivate rejectPending(error: Error): void {\n\t\tfor (const pending of this.pending.values()) pending.reject(error);\n\t\tthis.pending.clear();\n\t}\n\n\tprivate detach(): void {\n\t\tthis.transport.readable.off(\"data\", this.handleData);\n\t\tthis.transport.readable.off(\"end\", this.handleEnd);\n\t\tthis.transport.readable.off(\"error\", this.handleError);\n\t\tthis.transport.writable.off(\"error\", this.handleError);\n\t\tthis.removeExitListener?.();\n\t}\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import type { AssistantMessage, ImageContent, Message } from "@di-code/ai";
2
2
  import type { CommandRegistry } from "@di-code/builtins";
3
+ import type { UserInteractionInput, UserInteractionResult } from "@di-code/plugin-sdk";
3
4
  import type { AgentSessionListener } from "../core/session.ts";
4
5
  import type { ProductHost } from "../runtime/product-host.ts";
5
6
  import type { SessionHost } from "../runtime/session-host.ts";
@@ -60,6 +61,7 @@ export declare class RpcDispatcher {
60
61
  private readonly methods?;
61
62
  private readonly onError;
62
63
  private readonly approvals;
64
+ private readonly interactions;
63
65
  private readonly maxEvents;
64
66
  private productState;
65
67
  private readonly productHost?;
@@ -80,11 +82,23 @@ export declare class RpcDispatcher {
80
82
  private sequence;
81
83
  constructor(options: RpcDispatcherOptions);
82
84
  subscribe(listener: (message: RpcServerMessage) => void): () => void;
85
+ /** Publishes a versioned projection only to clients that negotiated projection events. */
86
+ emitProjection(input: {
87
+ readonly namespace: string;
88
+ readonly projectionName: string;
89
+ readonly version: number;
90
+ readonly state: unknown;
91
+ readonly requestId?: string;
92
+ }): void;
83
93
  dispatch(request: RpcRequest): Promise<RpcResponse>;
84
94
  dispose(): Promise<void>;
85
95
  private execute;
86
96
  /** Waits for the browser to approve a specific tool invocation. */
87
97
  requestToolApproval(toolName: string, parameters: unknown, signal?: AbortSignal): Promise<boolean>;
98
+ /** Requests a structured user response through the negotiated interaction channel. */
99
+ requestInteraction(input: Omit<UserInteractionInput, "requestId"> & {
100
+ readonly requestId?: string;
101
+ }, signal?: AbortSignal): Promise<UserInteractionResult>;
88
102
  private runOperation;
89
103
  private transcript;
90
104
  private requireProduct;
@@ -1 +1 @@
1
- {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/rpc/dispatcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzD,OAAO,KAAK,EAAqB,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAoB,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAIN,KAAK,iBAAiB,EAMtB,KAAK,eAAe,EAEpB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,gBAAgB,EAGrB,MAAM,eAAe,CAAC;AAEvB,4EAA4E;AAC5E,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,SAAS,OAAO,EAAE,CAAC;IACxC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtE,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,IAAI,CAAC;CAC7D;AAED,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACxC;AACD,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,WAAW,CAAC;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,kFAAkF;IAClF,QAAQ,CAAC,YAAY,CAAC,EAAE,eAAe,CAAC;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC1C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,eAAe,CAAC,EAAE,kBAAkB,CAAC;IAC9C,iFAAiF;IACjF,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;IAC3C,+EAA+E;IAC/E,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,uFAAuF;IACvF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IAClC,MAAM,CAAC,KAAK,EAAE;QACb,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC,aAAa,CAAC,CAAC;QACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AA8HD;;;GAGG;AACH,qBAAa,aAAa;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwE;IAClG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAkB;IACnD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkD;IAC5E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsC;IACjE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqB;IACtD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAa;IACjD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAK;gBAET,OAAO,EAAE,oBAAoB;IAsCzC,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI;IAK9D,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IA2BnD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAYhB,OAAO;IA0IrB,mEAAmE;IAC7D,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;YAkC1F,YAAY;IAsO1B,OAAO,CAAC,UAAU;IAgClB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,iBAAiB;YAIX,kBAAkB;YAMlB,MAAM;YAaN,gBAAgB;YAiBhB,eAAe;IAK7B,OAAO,CAAC,IAAI;IAKZ,OAAO,CAAC,KAAK;IAoBb,OAAO,CAAC,eAAe;IAGvB,OAAO,CAAC,WAAW;IA2BnB,OAAO,CAAC,YAAY;YAcN,UAAU;IAqBxB,OAAO,CAAC,OAAO;IAGf,OAAO,CAAC,OAAO;IAGf,OAAO,CAAC,YAAY;IAuBpB,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,YAAY;YAON,YAAY;YAUZ,UAAU;YAYV,WAAW;YAYX,cAAc;YAkBd,aAAa;YAIb,aAAa;YAIb,aAAa;IAO3B,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,IAAI;CASZ"}
1
+ {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/rpc/dispatcher.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { redactSensitiveText } from "@di-code/plugin-runtime";
3
3
  import { RPC_PROTOCOL_VERSION, RpcProtocolError, } from "./protocol.js";
4
+ const MAX_PROJECTION_BYTES = 256 * 1024;
5
+ const FORBIDDEN_PROJECTION_KEYS = /(?:^|[_-])(path|cwd|root|token|secret|authorization|api[_-]?key)(?:$|[_-])/iu;
4
6
  function transcriptEntryIds(tree, leafId) {
5
7
  if (!leafId)
6
8
  return [];
@@ -108,6 +110,7 @@ export class RpcDispatcher {
108
110
  methods;
109
111
  onError;
110
112
  approvals = new Map();
113
+ interactions = new Map();
111
114
  maxEvents;
112
115
  productState;
113
116
  productHost;
@@ -168,6 +171,33 @@ export class RpcDispatcher {
168
171
  this.listeners.add(listener);
169
172
  return () => this.listeners.delete(listener);
170
173
  }
174
+ /** Publishes a versioned projection only to clients that negotiated projection events. */
175
+ emitProjection(input) {
176
+ if (!this.negotiatedEvents.has("projection"))
177
+ return;
178
+ if (!isBrowserSafeProjection(input.state)) {
179
+ this.onError(new Error("Skipped an unsafe extension projection."));
180
+ return;
181
+ }
182
+ const record = {
183
+ version: RPC_PROTOCOL_VERSION,
184
+ kind: "event",
185
+ requestId: input.requestId ?? "projection",
186
+ sessionId: this.activeSessionId(),
187
+ sequence: ++this.sequence,
188
+ event: {
189
+ type: "projection",
190
+ namespace: input.namespace,
191
+ projectionName: input.projectionName,
192
+ version: input.version,
193
+ state: structuredClone(input.state),
194
+ },
195
+ };
196
+ this.events.push(record);
197
+ if (this.events.length > this.maxEvents)
198
+ this.events.shift();
199
+ this.emit(record);
200
+ }
171
201
  async dispatch(request) {
172
202
  this.pruneOperations();
173
203
  if (this.disposed)
@@ -203,6 +233,16 @@ export class RpcDispatcher {
203
233
  for (const operation of this.operations.values())
204
234
  if (operation.status === "queued" || operation.status === "running")
205
235
  operation.controller.abort();
236
+ for (const pending of this.approvals.values())
237
+ pending.resolve(false);
238
+ this.approvals.clear();
239
+ for (const pending of this.interactions.values())
240
+ pending.resolve({
241
+ requestId: pending.request.requestId,
242
+ toolCallId: pending.request.toolCallId,
243
+ status: "disposed",
244
+ });
245
+ this.interactions.clear();
206
246
  await Promise.allSettled([...this.operations.values()].map((operation) => operation.promise));
207
247
  await this.attachments.dispose();
208
248
  this.listeners.clear();
@@ -256,13 +296,19 @@ export class RpcDispatcher {
256
296
  });
257
297
  case "get_usage":
258
298
  return this.success(request.id, { method: "get_usage", usage: this.host().usage() });
259
- case "list_skills":
299
+ case "list_skills": {
300
+ const host = this.host();
301
+ const ui = host.ui();
302
+ const skills = ui.availableSkills.map(({ name, description, scope }) => ({ name, description, scope }));
303
+ const projectResourcesDetected = host
304
+ .startupStatus()
305
+ .resourceDiagnostics.some((diagnostic) => diagnostic.kind === "skill" && diagnostic.stage === "trust");
260
306
  return this.success(request.id, {
261
307
  method: "list_skills",
262
- skills: this.host()
263
- .ui()
264
- .availableSkills.map(({ name, description, scope }) => ({ name, description, scope })),
308
+ skills,
309
+ projectResourcesDetected,
265
310
  });
311
+ }
266
312
  case "get_resources":
267
313
  return this.success(request.id, {
268
314
  method: "get_resources",
@@ -331,6 +377,22 @@ export class RpcDispatcher {
331
377
  approvalId: request.params.approvalId,
332
378
  approved: request.params.approved,
333
379
  });
380
+ case "respond_interaction": {
381
+ const interactionId = request.params.requestId;
382
+ const pending = this.interactions.get(interactionId);
383
+ if (pending) {
384
+ this.interactions.delete(interactionId);
385
+ pending.resolve({
386
+ requestId: interactionId,
387
+ toolCallId: pending.request.toolCallId,
388
+ status: request.params.status,
389
+ ...(typeof request.params.approved === "boolean" ? { approved: request.params.approved } : {}),
390
+ ...(typeof request.params.value === "string" ? { value: request.params.value } : {}),
391
+ ...(typeof request.params.feedback === "string" ? { feedback: request.params.feedback } : {}),
392
+ });
393
+ }
394
+ return this.success(request.id, { method: "respond_interaction", requestId: interactionId });
395
+ }
334
396
  case "run_command":
335
397
  return this.failure(request.id, "METHOD_NOT_FOUND", "Command execution requires operation dispatch.");
336
398
  default:
@@ -343,8 +405,12 @@ export class RpcDispatcher {
343
405
  }
344
406
  /** Waits for the browser to approve a specific tool invocation. */
345
407
  async requestToolApproval(toolName, parameters, signal) {
346
- if (!this.negotiatedEvents.has("tool_approval"))
347
- return true;
408
+ if (!this.negotiatedEvents.has("tool_approval") && !this.negotiatedEvents.has("interaction_request"))
409
+ return false;
410
+ if (this.negotiatedEvents.has("interaction_request")) {
411
+ const result = await this.requestInteraction({ kind: "approval", prompt: `Allow tool ${toolName}?`, toolCallId: randomUUID(), intent: "tool-approval" }, signal);
412
+ return result.status === "answered" && result.approved === true;
413
+ }
348
414
  const approvalId = randomUUID();
349
415
  const requestId = [...this.operations.values()].find((operation) => operation.status === "running")?.requestId ?? approvalId;
350
416
  return await new Promise((resolve, reject) => {
@@ -361,7 +427,7 @@ export class RpcDispatcher {
361
427
  resolve(approved);
362
428
  },
363
429
  });
364
- this.emit({
430
+ const record = {
365
431
  version: RPC_PROTOCOL_VERSION,
366
432
  kind: "event",
367
433
  requestId,
@@ -373,7 +439,71 @@ export class RpcDispatcher {
373
439
  toolName,
374
440
  arguments: typeof parameters === "object" && parameters !== null ? parameters : {},
375
441
  },
442
+ };
443
+ this.events.push(record);
444
+ if (this.events.length > this.maxEvents)
445
+ this.events.shift();
446
+ this.emit(record);
447
+ });
448
+ }
449
+ /** Requests a structured user response through the negotiated interaction channel. */
450
+ async requestInteraction(input, signal) {
451
+ if (!this.negotiatedEvents.has("interaction_request")) {
452
+ throw Object.assign(new Error("No user interaction channel is available."), { code: "INTERACTION_UNAVAILABLE" });
453
+ }
454
+ const requestId = input.requestId ?? randomUUID();
455
+ const request = { ...input, requestId };
456
+ const existing = this.interactions.get(requestId);
457
+ if (existing)
458
+ return await new Promise((resolve) => {
459
+ const original = existing.resolve;
460
+ existing.resolve = (result) => {
461
+ original(result);
462
+ resolve(result);
463
+ };
464
+ });
465
+ return await new Promise((resolve, reject) => {
466
+ let timer;
467
+ const abort = () => {
468
+ this.interactions.delete(requestId);
469
+ if (timer !== undefined)
470
+ clearTimeout(timer);
471
+ reject(Object.assign(new Error("User interaction was cancelled."), { code: "CANCELLED" }));
472
+ };
473
+ if (signal?.aborted)
474
+ return abort();
475
+ signal?.addEventListener("abort", abort, { once: true });
476
+ this.interactions.set(requestId, {
477
+ request,
478
+ resolve: (result) => {
479
+ signal?.removeEventListener("abort", abort);
480
+ if (timer !== undefined)
481
+ clearTimeout(timer);
482
+ resolve(result);
483
+ },
376
484
  });
485
+ if (input.timeoutMs !== undefined) {
486
+ timer = setTimeout(() => {
487
+ const current = this.interactions.get(requestId);
488
+ if (!current)
489
+ return;
490
+ this.interactions.delete(requestId);
491
+ signal?.removeEventListener("abort", abort);
492
+ resolve({ requestId, toolCallId: input.toolCallId, status: "timeout" });
493
+ }, input.timeoutMs);
494
+ }
495
+ const record = {
496
+ version: RPC_PROTOCOL_VERSION,
497
+ kind: "event",
498
+ requestId,
499
+ sessionId: this.activeSessionId(),
500
+ sequence: ++this.sequence,
501
+ event: { type: "interaction_request", interactionRequestId: requestId, ...request },
502
+ };
503
+ this.events.push(record);
504
+ if (this.events.length > this.maxEvents)
505
+ this.events.shift();
506
+ this.emit(record);
377
507
  });
378
508
  }
379
509
  async runOperation(operation, request) {
@@ -729,11 +859,27 @@ export class RpcDispatcher {
729
859
  description: skill.description,
730
860
  kind: "skill",
731
861
  }));
862
+ if (sessionHost(this.session) && !commands.some((command) => command.name === "plan")) {
863
+ commands.push({ name: "plan", description: "Enter or leave plan mode.", kind: "command" });
864
+ }
732
865
  return [...commands, ...skills].sort((left, right) => left.name.localeCompare(right.name));
733
866
  }
734
867
  async runCommand(request, signal) {
735
868
  const name = request.params.name;
736
869
  const args = request.params.args ?? "";
870
+ if (name === "plan" && sessionHost(this.session)) {
871
+ await this.session.planCommand(args);
872
+ const projection = this.session.planMode();
873
+ if (projection)
874
+ this.emitProjection({
875
+ namespace: "plan",
876
+ projectionName: "mode",
877
+ version: 1,
878
+ state: projection,
879
+ requestId: request.id,
880
+ });
881
+ return { method: "run_command", command: name, action: { command: name, args } };
882
+ }
737
883
  if (!this.commandRegistry?.list().some((command) => command.name === name))
738
884
  throw new RpcProtocolError("NOT_FOUND", `Unknown command: /${name}`, request.id);
739
885
  let action;
@@ -765,9 +911,32 @@ export class RpcDispatcher {
765
911
  "snapshot_required",
766
912
  "session_changed",
767
913
  "tool_approval",
914
+ "interaction_request",
768
915
  "product_audit",
916
+ "projection",
769
917
  ].includes(event))
770
918
  this.negotiatedEvents.add(event);
919
+ if (this.negotiatedEvents.has("projection") && sessionHost(this.session)) {
920
+ const host = this.session;
921
+ const plan = host.planMode?.();
922
+ if (plan)
923
+ this.emitProjection({ namespace: "plan", projectionName: "mode", version: 1, state: plan });
924
+ for (const projection of host.projections?.() ?? [])
925
+ this.emitProjection({
926
+ namespace: projection.namespace,
927
+ projectionName: projection.projectionName,
928
+ version: projection.version,
929
+ state: projection.state,
930
+ });
931
+ const extensions = host.extensions?.();
932
+ if (extensions)
933
+ this.emitProjection({
934
+ namespace: "extension",
935
+ projectionName: "ui",
936
+ version: extensions.apiVersion,
937
+ state: { badges: extensions.badges, ui: extensions.ui },
938
+ });
939
+ }
771
940
  return this.success(request.id, {
772
941
  method: "get_capabilities",
773
942
  methods: RPC_METHODS_FOR_CAPABILITIES,
@@ -858,6 +1027,7 @@ export class RpcDispatcher {
858
1027
  },
859
1028
  transcript: snapshot.transcript,
860
1029
  tree: snapshot.tree,
1030
+ ...(snapshot.events ? { events: snapshot.events } : {}),
861
1031
  stats: snapshot.stats,
862
1032
  readOnly: true,
863
1033
  },
@@ -912,6 +1082,27 @@ export class RpcDispatcher {
912
1082
  });
913
1083
  }
914
1084
  onSessionEvent(event) {
1085
+ if (sessionHost(this.session) && this.negotiatedEvents.has("projection")) {
1086
+ const host = this.session;
1087
+ const plan = host.planMode?.();
1088
+ if (plan)
1089
+ this.emitProjection({ namespace: "plan", projectionName: "mode", version: 1, state: plan });
1090
+ for (const projection of host.projections?.() ?? [])
1091
+ this.emitProjection({
1092
+ namespace: projection.namespace,
1093
+ projectionName: projection.projectionName,
1094
+ version: projection.version,
1095
+ state: projection.state,
1096
+ });
1097
+ const extensions = host.extensions?.();
1098
+ if (extensions)
1099
+ this.emitProjection({
1100
+ namespace: "extension",
1101
+ projectionName: "ui",
1102
+ version: extensions.apiVersion,
1103
+ state: { badges: extensions.badges, ui: extensions.ui },
1104
+ });
1105
+ }
915
1106
  const operation = [...this.operations.values()].find((item) => item.status === "running");
916
1107
  const extended = event.type === "session_changed";
917
1108
  if (extended && !this.negotiatedEvents.has("session_changed"))
@@ -943,6 +1134,30 @@ export class RpcDispatcher {
943
1134
  }
944
1135
  }
945
1136
  }
1137
+ function isBrowserSafeProjection(value) {
1138
+ const visit = (candidate) => {
1139
+ if (candidate === null || typeof candidate === "string" || typeof candidate === "boolean")
1140
+ return true;
1141
+ if (typeof candidate === "number")
1142
+ return Number.isFinite(candidate);
1143
+ if (Array.isArray(candidate))
1144
+ return candidate.every(visit);
1145
+ if (typeof candidate !== "object")
1146
+ return false;
1147
+ for (const [key, item] of Object.entries(candidate))
1148
+ if (FORBIDDEN_PROJECTION_KEYS.test(key) || !visit(item))
1149
+ return false;
1150
+ return true;
1151
+ };
1152
+ if (!visit(value))
1153
+ return false;
1154
+ try {
1155
+ return Buffer.byteLength(JSON.stringify(value), "utf8") <= MAX_PROJECTION_BYTES;
1156
+ }
1157
+ catch {
1158
+ return false;
1159
+ }
1160
+ }
946
1161
  const RPC_METHODS_FOR_CAPABILITIES = [
947
1162
  "get_state",
948
1163
  "get_capabilities",