@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.
- package/README.md +7 -0
- package/compositions/base.yml +3 -0
- package/dist/compositions.d.ts.map +1 -1
- package/dist/compositions.js +2 -0
- package/dist/compositions.js.map +1 -1
- package/dist/core/image-input.d.ts +1 -1
- package/dist/core/image-input.d.ts.map +1 -1
- package/dist/core/image-input.js +15 -4
- package/dist/core/image-input.js.map +1 -1
- package/dist/core/session/session-manager.d.ts +18 -1
- package/dist/core/session/session-manager.d.ts.map +1 -1
- package/dist/core/session/session-manager.js +90 -1
- package/dist/core/session/session-manager.js.map +1 -1
- package/dist/core/session/session-storage.d.ts +2 -0
- package/dist/core/session/session-storage.d.ts.map +1 -1
- package/dist/core/session/session-storage.js +34 -2
- package/dist/core/session/session-storage.js.map +1 -1
- package/dist/core/session/types.d.ts +16 -1
- package/dist/core/session/types.d.ts.map +1 -1
- package/dist/core/session/types.js.map +1 -1
- package/dist/core/session.d.ts +27 -2
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +59 -0
- package/dist/core/session.js.map +1 -1
- package/dist/entry.js +1 -1
- package/dist/entry.js.map +1 -1
- package/dist/i18n.js +4 -4
- package/dist/i18n.js.map +1 -1
- package/dist/interactive-host-entry.d.ts.map +1 -1
- package/dist/interactive-host-entry.js +107 -12
- package/dist/interactive-host-entry.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +8 -1
- package/dist/main.js.map +1 -1
- package/dist/mcp/config.d.ts.map +1 -1
- package/dist/mcp/config.js +19 -0
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp-command-entry.d.ts +8 -0
- package/dist/mcp-command-entry.d.ts.map +1 -0
- package/dist/mcp-command-entry.js +56 -0
- package/dist/mcp-command-entry.js.map +1 -0
- package/dist/modes/interactive-components.d.ts +8 -0
- package/dist/modes/interactive-components.d.ts.map +1 -1
- package/dist/modes/interactive-components.js +7 -2
- package/dist/modes/interactive-components.js.map +1 -1
- package/dist/modes/interactive-state.d.ts.map +1 -1
- package/dist/modes/interactive-state.js +1 -4
- package/dist/modes/interactive-state.js.map +1 -1
- package/dist/modes/interactive.d.ts +4 -0
- package/dist/modes/interactive.d.ts.map +1 -1
- package/dist/modes/interactive.js +69 -0
- package/dist/modes/interactive.js.map +1 -1
- package/dist/modes/tree-selector.d.ts.map +1 -1
- package/dist/modes/tree-selector.js +5 -4
- package/dist/modes/tree-selector.js.map +1 -1
- package/dist/rpc/client.d.ts +2 -0
- package/dist/rpc/client.d.ts.map +1 -1
- package/dist/rpc/client.js +3 -0
- package/dist/rpc/client.js.map +1 -1
- package/dist/rpc/dispatcher.d.ts +14 -0
- package/dist/rpc/dispatcher.d.ts.map +1 -1
- package/dist/rpc/dispatcher.js +222 -7
- package/dist/rpc/dispatcher.js.map +1 -1
- package/dist/rpc/protocol.d.ts +12 -5
- package/dist/rpc/protocol.d.ts.map +1 -1
- package/dist/rpc/protocol.js +56 -0
- package/dist/rpc/protocol.js.map +1 -1
- package/dist/rpc/server.d.ts +5 -0
- package/dist/rpc/server.d.ts.map +1 -1
- package/dist/rpc/server.js +4 -0
- package/dist/rpc/server.js.map +1 -1
- package/dist/rpc-server-entry.d.ts.map +1 -1
- package/dist/rpc-server-entry.js +15 -1
- package/dist/rpc-server-entry.js.map +1 -1
- package/dist/runtime/product-host.d.ts +7 -0
- package/dist/runtime/product-host.d.ts.map +1 -1
- package/dist/runtime/product-host.js +29 -9
- package/dist/runtime/product-host.js.map +1 -1
- package/dist/runtime/session-factory.d.ts +18 -2
- package/dist/runtime/session-factory.d.ts.map +1 -1
- package/dist/runtime/session-factory.js +286 -23
- package/dist/runtime/session-factory.js.map +1 -1
- package/dist/runtime/session-host.d.ts +46 -1
- package/dist/runtime/session-host.d.ts.map +1 -1
- package/dist/runtime/session-host.js +38 -6
- package/dist/runtime/session-host.js.map +1 -1
- package/dist/ui-host.d.ts.map +1 -1
- package/dist/ui-host.js +3 -0
- package/dist/ui-host.js.map +1 -1
- package/dist/web/assets/index-C2SOU925.css +1 -0
- package/dist/web/assets/index-knXkInvO.js +41 -0
- package/dist/web/assets/index-knXkInvO.js.map +1 -0
- package/dist/web/index.html +2 -2
- package/dist/web-command.d.ts.map +1 -1
- package/dist/web-command.js +8 -1
- package/dist/web-command.js.map +1 -1
- package/dist/webui-entry.js +9 -1
- package/dist/webui-entry.js.map +1 -1
- package/dist/webui.d.ts +10 -0
- package/dist/webui.d.ts.map +1 -1
- package/dist/webui.js +21 -0
- package/dist/webui.js.map +1 -1
- package/package.json +11 -9
- package/dist/web/assets/index-BwfuGMvv.css +0 -1
- package/dist/web/assets/index-DPUaJqFJ.js +0 -41
- package/dist/web/assets/index-DPUaJqFJ.js.map +0 -1
package/dist/rpc/client.js.map
CHANGED
|
@@ -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":"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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 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"]}
|
package/dist/rpc/dispatcher.d.ts
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/rpc/dispatcher.ts"],"names":[],"mappings":"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"}
|
package/dist/rpc/dispatcher.js
CHANGED
|
@@ -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
|
|
263
|
-
|
|
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
|
|
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
|
-
|
|
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",
|