@di-code/coding-agent 0.1.7 → 0.1.9
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 +54 -567
- package/compositions/base.yml +54 -0
- package/compositions/interactive.yml +14 -0
- package/compositions/json.yml +6 -0
- package/compositions/print.yml +5 -0
- package/compositions/rpc.yml +12 -0
- package/compositions/webui.yml +9 -0
- package/dist/cli.d.ts +22 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +97 -3
- package/dist/cli.js.map +1 -1
- package/dist/composition-loader-entry.d.ts +11 -0
- package/dist/composition-loader-entry.d.ts.map +1 -0
- package/dist/composition-loader-entry.js +12 -0
- package/dist/composition-loader-entry.js.map +1 -0
- package/dist/compositions.d.ts +32 -0
- package/dist/compositions.d.ts.map +1 -0
- package/dist/compositions.js +173 -0
- package/dist/compositions.js.map +1 -0
- package/dist/core/session/session-manager.d.ts +9 -2
- package/dist/core/session/session-manager.d.ts.map +1 -1
- package/dist/core/session/session-manager.js +28 -0
- package/dist/core/session/session-manager.js.map +1 -1
- package/dist/core/session/session-storage.d.ts.map +1 -1
- package/dist/core/session/session-storage.js +20 -3
- package/dist/core/session/session-storage.js.map +1 -1
- package/dist/core/session/types.d.ts +11 -2
- package/dist/core/session/types.d.ts.map +1 -1
- package/dist/core/session/types.js.map +1 -1
- package/dist/core/session-tools.d.ts +5 -0
- package/dist/core/session-tools.d.ts.map +1 -0
- package/dist/core/session-tools.js +17 -0
- package/dist/core/session-tools.js.map +1 -0
- package/dist/core/session.d.ts +19 -7
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +71 -39
- package/dist/core/session.js.map +1 -1
- package/dist/core/tools/bash.d.ts +1 -38
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +1 -207
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts +1 -24
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +1 -135
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts +1 -26
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +1 -140
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js +1 -23
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/file-search.d.ts +1 -13
- package/dist/core/tools/file-search.d.ts.map +1 -1
- package/dist/core/tools/file-search.js +1 -98
- package/dist/core/tools/file-search.js.map +1 -1
- package/dist/core/tools/glob.d.ts +1 -10
- package/dist/core/tools/glob.d.ts.map +1 -1
- package/dist/core/tools/glob.js +1 -43
- package/dist/core/tools/glob.js.map +1 -1
- package/dist/core/tools/grep.d.ts +1 -12
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +1 -66
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/load-skill.d.ts +1 -9
- package/dist/core/tools/load-skill.d.ts.map +1 -1
- package/dist/core/tools/load-skill.js +1 -21
- package/dist/core/tools/load-skill.js.map +1 -1
- package/dist/core/tools/path-boundary.d.ts +1 -4
- package/dist/core/tools/path-boundary.d.ts.map +1 -1
- package/dist/core/tools/path-boundary.js +1 -65
- package/dist/core/tools/path-boundary.js.map +1 -1
- package/dist/core/tools/read.d.ts +1 -16
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +1 -131
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/write.d.ts +1 -16
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +1 -44
- package/dist/core/tools/write.js.map +1 -1
- package/dist/entry.js +30 -28
- package/dist/entry.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/interactive/builtin.d.ts +17 -0
- package/dist/interactive/builtin.d.ts.map +1 -0
- package/dist/interactive/builtin.js +47 -0
- package/dist/interactive/builtin.js.map +1 -0
- package/dist/interactive/controller.d.ts +85 -0
- package/dist/interactive/controller.d.ts.map +1 -0
- package/dist/interactive/controller.js +211 -0
- package/dist/interactive/controller.js.map +1 -0
- package/dist/interactive/index.d.ts +3 -0
- package/dist/interactive/index.d.ts.map +1 -0
- package/dist/interactive/index.js +3 -0
- package/dist/interactive/index.js.map +1 -0
- package/dist/interactive-host-entry.d.ts +7 -0
- package/dist/interactive-host-entry.d.ts.map +1 -0
- package/dist/interactive-host-entry.js +123 -0
- package/dist/interactive-host-entry.js.map +1 -0
- package/dist/interactive-profile.d.ts +18 -0
- package/dist/interactive-profile.d.ts.map +1 -0
- package/dist/interactive-profile.js +290 -0
- package/dist/interactive-profile.js.map +1 -0
- package/dist/interactive-resources-entry.d.ts +7 -0
- package/dist/interactive-resources-entry.d.ts.map +1 -0
- package/dist/interactive-resources-entry.js +42 -0
- package/dist/interactive-resources-entry.js.map +1 -0
- package/dist/legacy-main.d.ts +39 -0
- package/dist/legacy-main.d.ts.map +1 -0
- package/dist/legacy-main.js +611 -0
- package/dist/legacy-main.js.map +1 -0
- package/dist/main.d.ts +15 -34
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +130 -518
- package/dist/main.js.map +1 -1
- package/dist/mcp/entries.d.ts +42 -0
- package/dist/mcp/entries.d.ts.map +1 -0
- package/dist/mcp/entries.js +98 -0
- package/dist/mcp/entries.js.map +1 -0
- package/dist/mcp-client-entry.d.ts +5 -0
- package/dist/mcp-client-entry.d.ts.map +1 -0
- package/dist/mcp-client-entry.js +6 -0
- package/dist/mcp-client-entry.js.map +1 -0
- package/dist/mcp-config-entry.d.ts +5 -0
- package/dist/mcp-config-entry.d.ts.map +1 -0
- package/dist/mcp-config-entry.js +6 -0
- package/dist/mcp-config-entry.js.map +1 -0
- package/dist/mcp-tools-entry.d.ts +5 -0
- package/dist/mcp-tools-entry.d.ts.map +1 -0
- package/dist/mcp-tools-entry.js +6 -0
- package/dist/mcp-tools-entry.js.map +1 -0
- package/dist/mcp-transport-entry.d.ts +5 -0
- package/dist/mcp-transport-entry.d.ts.map +1 -0
- package/dist/mcp-transport-entry.js +6 -0
- package/dist/mcp-transport-entry.js.map +1 -0
- package/dist/modes/interactive-entry.d.ts +18 -0
- package/dist/modes/interactive-entry.d.ts.map +1 -0
- package/dist/modes/interactive-entry.js +21 -0
- package/dist/modes/interactive-entry.js.map +1 -0
- package/dist/modes/interactive.d.ts +16 -6
- package/dist/modes/interactive.d.ts.map +1 -1
- package/dist/modes/interactive.js +81 -32
- package/dist/modes/interactive.js.map +1 -1
- package/dist/modes/json-entry.d.ts +13 -0
- package/dist/modes/json-entry.d.ts.map +1 -0
- package/dist/modes/json-entry.js +14 -0
- package/dist/modes/json-entry.js.map +1 -0
- package/dist/modes/json.d.ts +4 -1
- package/dist/modes/json.d.ts.map +1 -1
- package/dist/modes/json.js +3 -3
- package/dist/modes/json.js.map +1 -1
- package/dist/modes/print-entry.d.ts +10 -0
- package/dist/modes/print-entry.d.ts.map +1 -0
- package/dist/modes/print-entry.js +11 -0
- package/dist/modes/print-entry.js.map +1 -0
- package/dist/modes/tree-selector.d.ts.map +1 -1
- package/dist/modes/tree-selector.js +4 -0
- package/dist/modes/tree-selector.js.map +1 -1
- package/dist/plugin-dump-composition.d.ts +6 -0
- package/dist/plugin-dump-composition.d.ts.map +1 -0
- package/dist/plugin-dump-composition.js +7 -0
- package/dist/plugin-dump-composition.js.map +1 -0
- package/dist/plugin-inventory.d.ts +7 -0
- package/dist/plugin-inventory.d.ts.map +1 -0
- package/dist/plugin-inventory.js +8 -0
- package/dist/plugin-inventory.js.map +1 -0
- package/dist/plugin-manager.d.ts +6 -0
- package/dist/plugin-manager.d.ts.map +1 -0
- package/dist/plugin-manager.js +7 -0
- package/dist/plugin-manager.js.map +1 -0
- package/dist/plugin-trace.d.ts +6 -0
- package/dist/plugin-trace.d.ts.map +1 -0
- package/dist/plugin-trace.js +7 -0
- package/dist/plugin-trace.js.map +1 -0
- package/dist/plugins/dynamic-broker.d.ts +76 -0
- package/dist/plugins/dynamic-broker.d.ts.map +1 -0
- package/dist/plugins/dynamic-broker.js +852 -0
- package/dist/plugins/dynamic-broker.js.map +1 -0
- package/dist/plugins/profile.d.ts +15 -0
- package/dist/plugins/profile.d.ts.map +1 -0
- package/dist/plugins/profile.js +34 -0
- package/dist/plugins/profile.js.map +1 -0
- package/dist/plugins/runtime-host.d.ts +37 -0
- package/dist/plugins/runtime-host.d.ts.map +1 -0
- package/dist/plugins/runtime-host.js +95 -0
- package/dist/plugins/runtime-host.js.map +1 -0
- package/dist/plugins/trust.d.ts +8 -0
- package/dist/plugins/trust.d.ts.map +1 -0
- package/dist/plugins/trust.js +59 -0
- package/dist/plugins/trust.js.map +1 -0
- package/dist/project-trust-entry.d.ts +15 -0
- package/dist/project-trust-entry.d.ts.map +1 -0
- package/dist/project-trust-entry.js +15 -0
- package/dist/project-trust-entry.js.map +1 -0
- package/dist/rpc/client.d.ts +78 -6
- package/dist/rpc/client.d.ts.map +1 -1
- package/dist/rpc/client.js +172 -4
- package/dist/rpc/client.js.map +1 -1
- package/dist/rpc/dispatcher.d.ts +121 -0
- package/dist/rpc/dispatcher.d.ts.map +1 -0
- package/dist/rpc/dispatcher.js +994 -0
- package/dist/rpc/dispatcher.js.map +1 -0
- package/dist/rpc/index.d.ts +2 -0
- package/dist/rpc/index.d.ts.map +1 -1
- package/dist/rpc/index.js +2 -0
- package/dist/rpc/index.js.map +1 -1
- package/dist/rpc/lifecycle.d.ts +6 -0
- package/dist/rpc/lifecycle.d.ts.map +1 -0
- package/dist/rpc/lifecycle.js +24 -0
- package/dist/rpc/lifecycle.js.map +1 -0
- package/dist/rpc/protocol.d.ts +112 -31
- package/dist/rpc/protocol.d.ts.map +1 -1
- package/dist/rpc/protocol.js +569 -117
- package/dist/rpc/protocol.js.map +1 -1
- package/dist/rpc/server-service.d.ts +7 -0
- package/dist/rpc/server-service.d.ts.map +1 -0
- package/dist/rpc/server-service.js +3 -0
- package/dist/rpc/server-service.js.map +1 -0
- package/dist/rpc/server.d.ts +16 -19
- package/dist/rpc/server.d.ts.map +1 -1
- package/dist/rpc/server.js +59 -115
- package/dist/rpc/server.js.map +1 -1
- package/dist/rpc-client-sdk-entry.d.ts +12 -0
- package/dist/rpc-client-sdk-entry.d.ts.map +1 -0
- package/dist/rpc-client-sdk-entry.js +11 -0
- package/dist/rpc-client-sdk-entry.js.map +1 -0
- package/dist/rpc-entry.js +50 -18
- package/dist/rpc-entry.js.map +1 -1
- package/dist/rpc-server-entry.d.ts +8 -0
- package/dist/rpc-server-entry.d.ts.map +1 -0
- package/dist/rpc-server-entry.js +67 -0
- package/dist/rpc-server-entry.js.map +1 -0
- package/dist/runtime/attachment-store.d.ts +13 -0
- package/dist/runtime/attachment-store.d.ts.map +1 -0
- package/dist/runtime/attachment-store.js +93 -0
- package/dist/runtime/attachment-store.js.map +1 -0
- package/dist/runtime/bootstrap.d.ts +14 -0
- package/dist/runtime/bootstrap.d.ts.map +1 -0
- package/dist/runtime/bootstrap.js +29 -0
- package/dist/runtime/bootstrap.js.map +1 -0
- package/dist/runtime/interactive-host-service.d.ts +22 -0
- package/dist/runtime/interactive-host-service.d.ts.map +1 -0
- package/dist/runtime/interactive-host-service.js +2 -0
- package/dist/runtime/interactive-host-service.js.map +1 -0
- package/dist/runtime/interactive-resource-service.d.ts +11 -0
- package/dist/runtime/interactive-resource-service.d.ts.map +1 -0
- package/dist/runtime/interactive-resource-service.js +3 -0
- package/dist/runtime/interactive-resource-service.js.map +1 -0
- package/dist/runtime/plugin-inventory-entry.d.ts +5 -0
- package/dist/runtime/plugin-inventory-entry.d.ts.map +1 -0
- package/dist/runtime/plugin-inventory-entry.js +18 -0
- package/dist/runtime/plugin-inventory-entry.js.map +1 -0
- package/dist/runtime/plugin-inventory-service.d.ts +8 -0
- package/dist/runtime/plugin-inventory-service.d.ts.map +1 -0
- package/dist/runtime/plugin-inventory-service.js +3 -0
- package/dist/runtime/plugin-inventory-service.js.map +1 -0
- package/dist/runtime/plugin-manager-entry.d.ts +20 -0
- package/dist/runtime/plugin-manager-entry.d.ts.map +1 -0
- package/dist/runtime/plugin-manager-entry.js +96 -0
- package/dist/runtime/plugin-manager-entry.js.map +1 -0
- package/dist/runtime/plugin-observability-entry.d.ts +12 -0
- package/dist/runtime/plugin-observability-entry.d.ts.map +1 -0
- package/dist/runtime/plugin-observability-entry.js +73 -0
- package/dist/runtime/plugin-observability-entry.js.map +1 -0
- package/dist/runtime/product-host.d.ts +91 -0
- package/dist/runtime/product-host.d.ts.map +1 -0
- package/dist/runtime/product-host.js +529 -0
- package/dist/runtime/product-host.js.map +1 -0
- package/dist/runtime/session-factory.d.ts +17 -0
- package/dist/runtime/session-factory.d.ts.map +1 -0
- package/dist/runtime/session-factory.js +75 -0
- package/dist/runtime/session-factory.js.map +1 -0
- package/dist/runtime/session-host.d.ts +152 -0
- package/dist/runtime/session-host.d.ts.map +1 -0
- package/dist/runtime/session-host.js +895 -0
- package/dist/runtime/session-host.js.map +1 -0
- package/dist/runtime-core-entry.d.ts +11 -0
- package/dist/runtime-core-entry.d.ts.map +1 -0
- package/dist/runtime-core-entry.js +9 -0
- package/dist/runtime-core-entry.js.map +1 -0
- package/dist/session-factory-entry.d.ts +7 -0
- package/dist/session-factory-entry.d.ts.map +1 -0
- package/dist/session-factory-entry.js +9 -0
- package/dist/session-factory-entry.js.map +1 -0
- package/dist/session-store-jsonl-entry.d.ts +7 -0
- package/dist/session-store-jsonl-entry.d.ts.map +1 -0
- package/dist/session-store-jsonl-entry.js +33 -0
- package/dist/session-store-jsonl-entry.js.map +1 -0
- package/dist/startup.d.ts +12 -1
- package/dist/startup.d.ts.map +1 -1
- package/dist/startup.js +106 -15
- package/dist/startup.js.map +1 -1
- package/dist/subagents/index.d.ts +2 -0
- package/dist/subagents/index.d.ts.map +1 -0
- package/dist/subagents/index.js +2 -0
- package/dist/subagents/index.js.map +1 -0
- package/dist/subagents/service.d.ts +50 -0
- package/dist/subagents/service.d.ts.map +1 -0
- package/dist/subagents/service.js +521 -0
- package/dist/subagents/service.js.map +1 -0
- package/dist/ui-host.d.ts +125 -0
- package/dist/ui-host.d.ts.map +1 -0
- package/dist/ui-host.js +275 -0
- package/dist/ui-host.js.map +1 -0
- package/dist/web/assets/index-BwfuGMvv.css +1 -0
- package/dist/web/assets/index-DPUaJqFJ.js +41 -0
- package/dist/web/assets/index-DPUaJqFJ.js.map +1 -0
- package/dist/web/index.html +14 -0
- package/dist/web-command.d.ts +11 -0
- package/dist/web-command.d.ts.map +1 -0
- package/dist/web-command.js +114 -0
- package/dist/web-command.js.map +1 -0
- package/dist/web-frontend.d.ts +73 -0
- package/dist/web-frontend.d.ts.map +1 -0
- package/dist/web-frontend.js +249 -0
- package/dist/web-frontend.js.map +1 -0
- package/dist/web.d.ts +254 -0
- package/dist/web.d.ts.map +1 -0
- package/dist/web.js +740 -0
- package/dist/web.js.map +1 -0
- package/dist/webui-entry.d.ts +3 -0
- package/dist/webui-entry.d.ts.map +1 -0
- package/dist/webui-entry.js +73 -0
- package/dist/webui-entry.js.map +1 -0
- package/dist/webui.d.ts +91 -0
- package/dist/webui.d.ts.map +1 -0
- package/dist/webui.js +882 -0
- package/dist/webui.js.map +1 -0
- package/package.json +89 -8
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-host.js","sourceRoot":"","sources":["../../src/runtime/session-host.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { constants as fsConstants } from \"node:fs\";\nimport { access, lstat, mkdir, open, readdir, readFile, realpath, rename, unlink } from \"node:fs/promises\";\nimport { basename, dirname, extname, join, resolve } from \"node:path\";\nimport type { AssistantMessage, ImageContent, Message, Model, Provider, ThinkingLevel } from \"@di-code/ai\";\nimport {\n\tagentSessionKey,\n\tproviderRegistryKey,\n\truntimeSelectionKey,\n\tsessionStoreRegistryKey,\n\ttype ToolApprovalCapability,\n} from \"@di-code/builtins\";\nimport type { Context } from \"@di-code/plugin-runtime\";\nimport { SessionManager } from \"../core/session/session-manager.ts\";\nimport type { SessionTreeNode } from \"../core/session/types.ts\";\nimport {\n\tAgentSession,\n\ttype AgentSessionCompactionOptions,\n\ttype AgentSessionEvent,\n\ttype AgentSessionTool,\n\ttype SessionUsage,\n\ttype TreeNavigationResult,\n} from \"../core/session.ts\";\nimport { workspaceStorageKey } from \"../core/user-data.ts\";\nimport { mcpClientServiceKey, mcpConfigServiceKey, mcpToolServiceKey } from \"../mcp/entries.ts\";\nimport { interactiveResourceServiceKey } from \"./interactive-resource-service.ts\";\n\nexport type SessionId = string & { readonly __sessionId: unique symbol };\nexport type RequestId = string & { readonly __requestId: unique symbol };\n\nexport interface SessionInfo {\n\treadonly id: SessionId;\n\treadonly displayId?: string;\n\treadonly cwd: string;\n\treadonly label: string;\n\treadonly modifiedAt?: number;\n\treadonly stats?: SessionStats;\n}\n\nexport interface SessionStats {\n\treadonly entryCount: number;\n\treadonly messageCount: number;\n\treadonly branchCount: number;\n}\n\nexport interface SessionSnapshot {\n\treadonly session: SessionInfo;\n\treadonly transcript: readonly Message[];\n\treadonly tree: readonly SessionTreeNode[];\n\treadonly stats: SessionStats;\n\treadonly readOnly: true;\n}\n\nexport interface SessionHostState {\n\treadonly disposed: boolean;\n\treadonly workspace: string;\n\treadonly activeSession?: SessionInfo;\n\treadonly busy: boolean;\n\treadonly operations: readonly { readonly requestId: RequestId; readonly kind: SessionOperationKind }[];\n}\n\nexport type SessionOperationKind = \"prompt\" | \"steer\" | \"retry\" | \"compact\" | \"tree\" | \"session\";\nexport type SessionHostEvent = AgentSessionEvent | { readonly type: \"session_changed\"; readonly session?: SessionInfo };\nexport type SessionHostListener = (event: SessionHostEvent) => void | Promise<void>;\n\nexport interface PromptInput {\n\treadonly text: string;\n\treadonly requestId?: string;\n}\n\nexport interface RetryInput {\n\treadonly targetRequestId: string;\n}\n\nexport interface SessionHostBootstrapOptions {\n\treadonly cwd: string;\n\treadonly agentDir: string;\n\treadonly projectTrusted?: boolean;\n\treadonly noSkills?: boolean;\n\treadonly noContextFiles?: boolean;\n\treadonly skillPaths?: readonly string[];\n\treadonly provider?: Provider;\n\treadonly model?: Model;\n\treadonly signal?: AbortSignal;\n\treadonly compaction?: AgentSessionCompactionOptions;\n\t/** Per-host approval boundary captured by each created AgentSession. */\n\treadonly toolApproval?: ToolApprovalCapability;\n\t/** Optional managed JSONL file to open before the host is returned. */\n\treadonly initialSessionPath?: string;\n}\n\nexport interface SessionHost {\n\treadonly state: () => SessionHostState;\n\treadonly listSessions: () => Promise<readonly SessionInfo[]>;\n\treadonly createSession: () => Promise<SessionInfo>;\n\treadonly openSession: (sessionId: string) => Promise<SessionInfo>;\n\treadonly inspectSession: (sessionId: string) => Promise<SessionSnapshot>;\n\treadonly renameSession: (sessionId: string, label: string) => Promise<SessionInfo>;\n\treadonly deleteSession: (sessionId: string, confirmation: string) => Promise<void>;\n\treadonly branchSession: (sessionId?: string, entryId?: string) => Promise<SessionInfo>;\n\treadonly closeSession: () => Promise<void>;\n\treadonly prompt: (input: PromptInput | string, signal?: AbortSignal) => Promise<AssistantMessage>;\n\treadonly promptWithImages: (\n\t\ttext: string,\n\t\timages: readonly ImageContent[],\n\t\tsignal?: AbortSignal,\n\t) => Promise<AssistantMessage>;\n\treadonly steer: (input: PromptInput | string, signal?: AbortSignal) => Promise<void>;\n\treadonly steerWithImages: (text: string, images: readonly ImageContent[], signal?: AbortSignal) => Promise<void>;\n\treadonly retry: (input?: RetryInput | AbortSignal, signal?: AbortSignal) => Promise<AssistantMessage>;\n\treadonly cancel: (requestId: string) => boolean;\n\treadonly transcript: () => readonly import(\"@di-code/ai\").Message[];\n\treadonly tree: () => readonly SessionTreeNode[];\n\treadonly navigateTree: (entryId: string) => Promise<TreeNavigationResult>;\n\treadonly setModel: (modelId: string) => Model;\n\treadonly setRuntime: (providerId: string, modelId: string) => Model;\n\t/** Applies an already-resolved runtime without requiring it in the registry. */\n\treadonly setRuntimeValue: (provider: Provider, model: Model) => Model;\n\treadonly setThinkingLevel: (level: ThinkingLevel) => ThinkingLevel;\n\treadonly cycleThinkingLevel: () => ThinkingLevel | undefined;\n\treadonly compact: (signal?: AbortSignal) => Promise<void>;\n\treadonly setCompactionEnabled: (enabled: boolean) => boolean;\n\t/** Reloads Skills, context and MCP tools after an explicit product-configuration change. */\n\treadonly refreshResources: (projectTrusted?: boolean, signal?: AbortSignal) => Promise<void>;\n\treadonly usage: () => SessionUsage;\n\treadonly ui: () => SessionHostUi;\n\treadonly subscribe: (listener: SessionHostListener) => () => void;\n\treadonly dispose: () => Promise<void>;\n}\n\nconst RETRY_PLUGIN_ID = \"di-code.retry\";\nconst RETRY_PLUGIN_VERSION = \"1\";\nconst RETRY_PLUGIN_SCHEMA_VERSION = 1;\ninterface FailedPrompt {\n\treadonly requestId: string;\n\treadonly text: string;\n}\n\n/** Internal presentation facade. It exposes snapshots and host-owned operations, never Session internals. */\nexport interface SessionHostUi {\n\treadonly allowedRoot: string;\n\treadonly modelId: string;\n\treadonly providerId: string;\n\treadonly thinkingLevel?: ThinkingLevel;\n\treadonly availableModels: readonly Model[];\n\treadonly availableSkills: readonly import(\"../core/resources/types.ts\").SkillResource[];\n\treadonly compactionEnabled: boolean;\n\treadonly sessionFile?: string;\n\treadonly sessionTree: readonly SessionTreeNode[];\n\treadonly sessionLeafId?: string;\n\treadonly transcript: readonly Message[];\n\treadonly usage: SessionUsage;\n\treadonly promptWithImages: SessionHost[\"promptWithImages\"];\n\treadonly retry: SessionHost[\"retry\"];\n\treadonly steerWithImages: SessionHost[\"steerWithImages\"];\n\treadonly subscribeSession: (listener: (event: AgentSessionEvent) => void | Promise<void>) => () => void;\n\treadonly setModel: SessionHost[\"setModel\"];\n\treadonly setRuntime: (provider: Provider, model: Model) => Model;\n\treadonly cycleThinkingLevel: SessionHost[\"cycleThinkingLevel\"];\n\treadonly setCompactionEnabled: SessionHost[\"setCompactionEnabled\"];\n\treadonly navigateTree: SessionHost[\"navigateTree\"];\n\treadonly compact: SessionHost[\"compact\"];\n}\n\nexport class SessionHostError extends Error {\n\treadonly code:\n\t\t| \"INVALID_WORKSPACE\"\n\t\t| \"NOT_FOUND\"\n\t\t| \"BUSY\"\n\t\t| \"SESSION_IN_USE\"\n\t\t| \"DISPOSED\"\n\t\t| \"INVALID_INPUT\"\n\t\t| \"INTERNAL\";\n\tconstructor(code: SessionHostError[\"code\"], message: string, options?: { readonly cause?: unknown }) {\n\t\tsuper(message, { cause: options?.cause });\n\t\tthis.name = \"SessionHostError\";\n\t\tthis.code = code;\n\t}\n}\n\ninterface Operation {\n\treadonly controller: AbortController;\n\treadonly kind: SessionOperationKind;\n\tpromise?: Promise<unknown>;\n}\n\ninterface HostInternals {\n\treadonly workspace: string;\n\treadonly sessionDirectory: string;\n\treadonly provider: Provider;\n\treadonly model: Model;\n\treadonly skills: readonly import(\"../core/resources/types.ts\").SkillResource[];\n\treadonly systemPrompt: string;\n\treadonly externalTools: readonly AgentSessionTool[];\n\treadonly closeMcp: () => Promise<void>;\n}\n\nasync function validateDataRoot(path: string): Promise<string> {\n\tconst requested = resolve(path);\n\tawait mkdir(requested, { recursive: true });\n\tconst stats = await lstat(requested);\n\tif (!stats.isDirectory() || stats.isSymbolicLink()) {\n\t\tthrow new SessionHostError(\"INVALID_WORKSPACE\", `Agent data root must be a real directory: \"${requested}\".`);\n\t}\n\tconst root = await realpath(requested);\n\tawait access(root, fsConstants.R_OK | fsConstants.W_OK | fsConstants.X_OK);\n\treturn root;\n}\n\nasync function ensureRealChildDirectory(parent: string, name: string): Promise<string> {\n\tconst path = join(parent, name);\n\ttry {\n\t\tconst stats = await lstat(path);\n\t\tif (!stats.isDirectory() || stats.isSymbolicLink()) {\n\t\t\tthrow new SessionHostError(\"INVALID_WORKSPACE\", `Managed data path must be a real directory: \"${path}\".`);\n\t\t}\n\t} catch (cause) {\n\t\tif (!(cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\")) throw cause;\n\t\tawait mkdir(path);\n\t}\n\tconst real = await realpath(path);\n\tif (dirname(real) !== parent)\n\t\tthrow new SessionHostError(\"INVALID_WORKSPACE\", `Managed data path escaped its parent: \"${path}\".`);\n\treturn real;\n}\n\nfunction asId(value: string): SessionId {\n\treturn value as SessionId;\n}\n\nfunction asRequestId(value: string): RequestId {\n\treturn value as RequestId;\n}\n\nfunction messageText(message: import(\"@di-code/ai\").Message): string {\n\tif (message.role !== \"user\") return \"\";\n\treturn message.content\n\t\t.filter((item) => item.type === \"text\")\n\t\t.map((item) => item.text)\n\t\t.join(\" \")\n\t\t.trim();\n}\n\nfunction sessionLabel(manager: SessionManager): string {\n\tfor (const entry of [...manager.entries].reverse()) {\n\t\tif (entry.type !== \"plugin\" || entry.pluginId !== \"di-code.session-label\") continue;\n\t\tconst data = entry.data;\n\t\tif (\n\t\t\ttypeof data === \"object\" &&\n\t\t\tdata !== null &&\n\t\t\t!Array.isArray(data) &&\n\t\t\ttypeof (data as Record<string, unknown>).label === \"string\"\n\t\t) {\n\t\t\tconst label = (data as Record<string, unknown>).label as string;\n\t\t\tif (label.trim()) return label;\n\t\t}\n\t}\n\tconst first = manager.entries.find((entry) => entry.type === \"message\" && entry.message.role === \"user\");\n\treturn first?.type === \"message\"\n\t\t? messageText(first.message) || basename(manager.filePath, extname(manager.filePath))\n\t\t: basename(manager.filePath, extname(manager.filePath));\n}\n\nasync function validateWorkspace(cwd: string): Promise<string> {\n\tconst requested = resolve(cwd);\n\tlet root: string;\n\ttry {\n\t\tconst stats = await lstat(requested);\n\t\tif (!stats.isDirectory() || stats.isSymbolicLink()) throw new Error(\"Workspace must be a real directory.\");\n\t\troot = await realpath(requested);\n\t\tawait access(root, fsConstants.R_OK | fsConstants.W_OK | fsConstants.X_OK);\n\t} catch (cause) {\n\t\tthrow new SessionHostError(\"INVALID_WORKSPACE\", `Workspace is not an accessible real directory: \"${requested}\".`, {\n\t\t\tcause,\n\t\t});\n\t}\n\treturn root;\n}\n\nasync function lockSession(filePath: string): Promise<() => Promise<void>> {\n\tconst lockPath = `${filePath}.host.lock`;\n\tconst token = `${process.pid}:${randomUUID()}`;\n\ttry {\n\t\tconst handle = await open(lockPath, \"wx\");\n\t\tawait handle.writeFile(token, \"utf8\");\n\t\treturn async () => {\n\t\t\tlet releaseError: unknown;\n\t\t\ttry {\n\t\t\t\tconst owner = await readFile(lockPath, \"utf8\");\n\t\t\t\tif (owner !== token) releaseError = new Error(`Session lock ownership changed: \"${lockPath}\".`);\n\t\t\t} catch (cause) {\n\t\t\t\tif (!(cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\")) releaseError = cause;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait handle.close();\n\t\t\t} catch (cause) {\n\t\t\t\treleaseError = cause;\n\t\t\t}\n\t\t\tif (releaseError === undefined) {\n\t\t\t\ttry {\n\t\t\t\t\tawait unlink(lockPath);\n\t\t\t\t} catch (cause) {\n\t\t\t\t\tif (!(cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\")) releaseError = cause;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (releaseError !== undefined) throw releaseError;\n\t\t};\n\t} catch (cause) {\n\t\tif (cause instanceof Error && \"code\" in cause && cause.code === \"EEXIST\") {\n\t\t\ttry {\n\t\t\t\tconst owner = await readFile(lockPath, \"utf8\");\n\t\t\t\tconst ownerPid = Number.parseInt(owner.split(\":\", 1)[0] ?? \"\", 10);\n\t\t\t\tif (Number.isSafeInteger(ownerPid) && ownerPid > 0) process.kill(ownerPid, 0);\n\t\t\t} catch (ownerCause) {\n\t\t\t\tif (ownerCause instanceof Error && \"code\" in ownerCause && ownerCause.code === \"ESRCH\") {\n\t\t\t\t\tconst stalePath = `${lockPath}.stale-${randomUUID()}`;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait rename(lockPath, stalePath);\n\t\t\t\t\t\tawait unlink(stalePath);\n\t\t\t\t\t\treturn await lockSession(filePath);\n\t\t\t\t\t} catch (reclaimCause) {\n\t\t\t\t\t\tif (reclaimCause instanceof Error && \"code\" in reclaimCause && reclaimCause.code === \"ENOENT\")\n\t\t\t\t\t\t\treturn await lockSession(filePath);\n\t\t\t\t\t\tthrow new SessionHostError(\"INTERNAL\", `Unable to reclaim stale Session lock: \"${filePath}\".`, {\n\t\t\t\t\t\t\tcause: reclaimCause,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow new SessionHostError(\"SESSION_IN_USE\", `Session is already open: \"${filePath}\".`, { cause });\n\t\t}\n\t\tthrow new SessionHostError(\"INTERNAL\", `Unable to lock session: \"${filePath}\".`, { cause });\n\t}\n}\n\nasync function createBootstrap(context: Context, options: SessionHostBootstrapOptions): Promise<HostInternals> {\n\tconst workspace = await validateWorkspace(options.cwd);\n\tconst agentDir = await validateDataRoot(options.agentDir);\n\tconst sessionsRoot = await ensureRealChildDirectory(agentDir, \"sessions\");\n\t// Preserve the CLI's historical workspace hash (which uses the user-supplied path casing/alias).\n\tconst sessionDirectory = await ensureRealChildDirectory(sessionsRoot, workspaceStorageKey(options.cwd));\n\tconst resources = await context.require(interactiveResourceServiceKey).load({\n\t\tcwd: workspace,\n\t\tagentDir,\n\t\tprojectTrusted: options.projectTrusted ?? false,\n\t\tnoSkills: options.noSkills,\n\t\tnoContextFiles: options.noContextFiles,\n\t\tskillPaths: options.skillPaths,\n\t});\n\tconst runtime =\n\t\toptions.provider && options.model\n\t\t\t? { provider: options.provider, model: options.model }\n\t\t\t: context.require(runtimeSelectionKey).selected();\n\tconst mcpConfig = context.require(mcpConfigServiceKey);\n\tconst mcpClient = context.require(mcpClientServiceKey);\n\tconst configurations = await mcpConfig.load({ cwd: workspace, projectTrusted: options.projectTrusted ?? false });\n\tconst mcp = await mcpClient.connect(configurations, { signal: options.signal });\n\tlet externalTools: readonly AgentSessionTool[];\n\ttry {\n\t\texternalTools = context\n\t\t\t.require(mcpToolServiceKey)\n\t\t\t.create(mcp.servers, [\"read\", \"write\", \"edit\", \"glob\", \"grep\", \"bash\", \"load_skill\"]);\n\t} catch (cause) {\n\t\tawait mcpClient.close(mcp.manager);\n\t\tthrow cause;\n\t}\n\treturn {\n\t\tworkspace,\n\t\tsessionDirectory,\n\t\tprovider: runtime.provider,\n\t\tmodel: runtime.model,\n\t\tskills: resources.resources.skills,\n\t\tsystemPrompt: resources.systemPrompt,\n\t\texternalTools,\n\t\tcloseMcp: () => mcpClient.close(mcp.manager),\n\t};\n}\n\nexport async function createSessionHost(context: Context, options: SessionHostBootstrapOptions): Promise<SessionHost> {\n\tlet bootstrap = await createBootstrap(context, options);\n\ttry {\n\t\tawait mkdir(bootstrap.sessionDirectory, { recursive: true });\n\t} catch (cause) {\n\t\tawait bootstrap.closeMcp();\n\t\tthrow cause;\n\t}\n\tconst store = context.require(sessionStoreRegistryKey).get(\"jsonl\");\n\tif (!store) {\n\t\tawait bootstrap.closeMcp();\n\t\tthrow new SessionHostError(\"INTERNAL\", \"JSONL SessionStore is unavailable.\");\n\t}\n\tconst sessions = new Map<\n\t\tSessionId,\n\t\t{\n\t\t\treadonly manager: SessionManager;\n\t\t\treadonly session: AgentSession;\n\t\t\treadonly unsubscribe: () => void;\n\t\t\treadonly unlock: () => Promise<void>;\n\t\t\treadonly info: SessionInfo;\n\t\t}\n\t>();\n\tconst operations = new Map<RequestId, Operation>();\n\tconst listeners = new Set<SessionHostListener>();\n\tlet activeId: SessionId | undefined;\n\tconst failedPrompts = new Map<SessionId, FailedPrompt | undefined>();\n\tlet resourceProjectTrusted = options.projectTrusted;\n\tlet disposed = false;\n\n\tconst ensureOpen = (): void => {\n\t\tif (disposed) throw new SessionHostError(\"DISPOSED\", \"SessionHost has been disposed.\");\n\t};\n\tconst current = () => {\n\t\tif (!activeId) throw new SessionHostError(\"NOT_FOUND\", \"No Session is open.\");\n\t\tconst value = sessions.get(activeId);\n\t\tif (!value) throw new SessionHostError(\"NOT_FOUND\", \"No Session is open.\");\n\t\treturn value;\n\t};\n\tconst emit = (event: SessionHostEvent): void => {\n\t\tfor (const listener of listeners) {\n\t\t\tqueueMicrotask(() => {\n\t\t\t\ttry {\n\t\t\t\t\tPromise.resolve(listener(structuredClone(event))).catch(() => undefined);\n\t\t\t\t} catch {\n\t\t\t\t\t// Observers cannot fail the Agent loop or persistence path.\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n\tconst infoFor = (manager: SessionManager): SessionInfo => ({\n\t\tid: asId(manager.header.id),\n\t\tdisplayId: basename(manager.filePath, extname(manager.filePath)),\n\t\tcwd: manager.header.cwd,\n\t\tlabel: sessionLabel(manager),\n\t\tmodifiedAt: Date.parse(manager.header.timestamp),\n\t\tstats: statsFor(manager),\n\t});\n\tconst statsFor = (manager: SessionManager): SessionStats => {\n\t\tconst entries = manager.entries;\n\t\tconst parentIds = new Set(entries.map((entry) => entry.parentId));\n\t\treturn {\n\t\t\tentryCount: entries.length,\n\t\t\tmessageCount: entries.filter((entry) => entry.type === \"message\").length,\n\t\t\tbranchCount: [...parentIds].filter((parent) => entries.filter((entry) => entry.parentId === parent).length > 1)\n\t\t\t\t.length,\n\t\t};\n\t};\n\tconst retryState = (manager: SessionManager): FailedPrompt | undefined => {\n\t\tfor (const entry of [...manager.getBranch()].reverse()) {\n\t\t\tif (\n\t\t\t\tentry.type !== \"plugin\" ||\n\t\t\t\tentry.pluginId !== RETRY_PLUGIN_ID ||\n\t\t\t\tentry.schemaVersion !== RETRY_PLUGIN_SCHEMA_VERSION\n\t\t\t)\n\t\t\t\tcontinue;\n\t\t\tconst data = entry.data;\n\t\t\tif (typeof data !== \"object\" || data === null || Array.isArray(data)) return undefined;\n\t\t\tconst value = data as Record<string, unknown>;\n\t\t\tif (value.active !== true || typeof value.text !== \"string\" || typeof value.requestId !== \"string\")\n\t\t\t\treturn undefined;\n\t\t\treturn { requestId: value.requestId, text: value.text };\n\t\t}\n\t\treturn undefined;\n\t};\n\tconst persistRetryState = async (manager: SessionManager, state: FailedPrompt | undefined): Promise<void> => {\n\t\tawait manager.appendPlugin({\n\t\t\tpluginId: RETRY_PLUGIN_ID,\n\t\t\tpluginVersion: RETRY_PLUGIN_VERSION,\n\t\t\tschemaVersion: RETRY_PLUGIN_SCHEMA_VERSION,\n\t\t\tdata: state ? { active: true, requestId: state.requestId, text: state.text } : { active: false },\n\t\t});\n\t};\n\tconst createAgent = async (manager: SessionManager, resources = bootstrap): Promise<AgentSession> => {\n\t\tconst created = await context.require(agentSessionKey).create({\n\t\t\t// The host owns the workspace boundary. Reading the root from the shared\n\t\t\t// composition context would pin every WebUI actor to the startup folder.\n\t\t\tallowedRoot: resources.workspace,\n\t\t\tprovider: resources.provider,\n\t\t\tmodel: resources.model,\n\t\t\tsystemPrompt: resources.systemPrompt,\n\t\t\tskills: resources.skills,\n\t\t\tsessionManager: manager,\n\t\t\texternalTools: resources.externalTools,\n\t\t\tcompaction: options.compaction,\n\t\t\ttoolApproval: options.toolApproval,\n\t\t});\n\t\tif (!(created instanceof AgentSession))\n\t\t\tthrow new SessionHostError(\"INTERNAL\", \"SessionFactory returned an incompatible session.\");\n\t\treturn created;\n\t};\n\tconst assertIdle = (kind: string): void => {\n\t\tif (operations.size > 0)\n\t\t\tthrow new SessionHostError(\"BUSY\", `Cannot ${kind} while another Session operation is running.`);\n\t};\n\tconst withOperation = async <T>(\n\t\tkind: SessionOperationKind,\n\t\trequestId: string | undefined,\n\t\tsignal: AbortSignal | undefined,\n\t\taction: (signal: AbortSignal) => Promise<T>,\n\t): Promise<T> => {\n\t\tensureOpen();\n\t\tconst id = asRequestId(requestId?.trim() || randomUUID());\n\t\tif (operations.has(id)) throw new SessionHostError(\"BUSY\", `Request ID is already active: \"${id}\".`);\n\t\tconst controller = new AbortController();\n\t\tconst abort = () => controller.abort(signal?.reason);\n\t\tif (signal?.aborted) abort();\n\t\telse signal?.addEventListener(\"abort\", abort, { once: true });\n\t\tconst operation: Operation = { controller, kind };\n\t\toperations.set(id, operation);\n\t\tconst promise = (async () => {\n\t\t\ttry {\n\t\t\t\treturn await action(controller.signal);\n\t\t\t} catch (cause) {\n\t\t\t\tif (cause instanceof SessionHostError) throw cause;\n\t\t\t\tif (cause instanceof Error && (cause.name === \"AbortError\" || controller.signal.aborted)) throw cause;\n\t\t\t\tthrow new SessionHostError(\"INTERNAL\", cause instanceof Error ? cause.message : String(cause), { cause });\n\t\t\t} finally {\n\t\t\t\toperations.delete(id);\n\t\t\t\tsignal?.removeEventListener(\"abort\", abort);\n\t\t\t}\n\t\t})();\n\t\toperation.promise = promise;\n\t\treturn await promise;\n\t};\n\tconst openManager = async (manager: SessionManager): Promise<SessionInfo> => {\n\t\tlet sessionWorkspace: string;\n\t\ttry {\n\t\t\tsessionWorkspace = await realpath(manager.header.cwd);\n\t\t} catch (cause) {\n\t\t\tthrow new SessionHostError(\"INVALID_WORKSPACE\", \"Session workspace is unavailable.\", { cause });\n\t\t}\n\t\tif (sessionWorkspace !== bootstrap.workspace)\n\t\t\tthrow new SessionHostError(\"INVALID_WORKSPACE\", \"Session workspace does not match the Host workspace.\");\n\t\tconst id = asId(manager.header.id);\n\t\tconst unlock = await lockSession(manager.filePath);\n\t\ttry {\n\t\t\tconst session = await createAgent(manager);\n\t\t\tconst info = infoFor(manager);\n\t\t\tconst previous = activeId;\n\t\t\tif (previous !== undefined) {\n\t\t\t\tconst old = sessions.get(previous);\n\t\t\t\tif (old) {\n\t\t\t\t\told.unsubscribe();\n\t\t\t\t\tawait old.session.dispose();\n\t\t\t\t\tawait old.unlock();\n\t\t\t\t}\n\t\t\t\tsessions.delete(previous);\n\t\t\t}\n\t\t\tconst unsubscribe = session.subscribeSession(emit);\n\t\t\tsessions.set(id, { manager, session, unsubscribe, unlock, info });\n\t\t\tfailedPrompts.set(id, retryState(manager));\n\t\t\tactiveId = id;\n\t\t\temit({ type: \"session_changed\", session: info });\n\t\t\treturn info;\n\t\t} catch (cause) {\n\t\t\tawait unlock();\n\t\t\tthrow cause;\n\t\t}\n\t};\n\tconst findSessionPath = async (id: string): Promise<string> => {\n\t\tlet entries: readonly import(\"node:fs\").Dirent<string>[];\n\t\ttry {\n\t\t\tentries = await readdir(bootstrap.sessionDirectory, { withFileTypes: true, encoding: \"utf8\" });\n\t\t} catch (cause) {\n\t\t\tif (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\")\n\t\t\t\tthrow new SessionHostError(\"NOT_FOUND\", `Session not found: \"${id}\".`);\n\t\t\tthrow cause;\n\t\t}\n\t\tconst managedDirectory = await realpath(bootstrap.sessionDirectory);\n\t\tfor (const entry of entries) {\n\t\t\tif (!entry.isFile() || extname(entry.name) !== \".jsonl\") continue;\n\t\t\tconst path = join(bootstrap.sessionDirectory, entry.name);\n\t\t\tif (dirname(await realpath(path)) !== managedDirectory) continue;\n\t\t\ttry {\n\t\t\t\tconst manager = await store.open(path);\n\t\t\t\tif (manager instanceof SessionManager && manager.header.id === id) return path;\n\t\t\t} catch {\n\t\t\t\t// Damaged sessions remain listable only through their file diagnostics; they cannot match an opaque ID.\n\t\t\t}\n\t\t}\n\t\tthrow new SessionHostError(\"NOT_FOUND\", `Session not found: \"${id}\".`);\n\t};\n\tconst api: SessionHost = {\n\t\tstate: () => ({\n\t\t\tdisposed,\n\t\t\tworkspace: bootstrap.workspace,\n\t\t\tactiveSession: activeId ? sessions.get(activeId)?.info : undefined,\n\t\t\tbusy: operations.size > 0,\n\t\t\toperations: [...operations].map(([requestId, op]) => ({ requestId, kind: op.kind })),\n\t\t}),\n\t\tlistSessions: async () => {\n\t\t\tensureOpen();\n\t\t\tlet entries: readonly import(\"node:fs\").Dirent<string>[] = [];\n\t\t\ttry {\n\t\t\t\tentries = await readdir(bootstrap.sessionDirectory, { withFileTypes: true, encoding: \"utf8\" });\n\t\t\t} catch (cause) {\n\t\t\t\tif (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") return [];\n\t\t\t\tthrow cause;\n\t\t\t}\n\t\t\tconst result: SessionInfo[] = [];\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (!entry.isFile() || extname(entry.name) !== \".jsonl\") continue;\n\t\t\t\tconst path = join(bootstrap.sessionDirectory, entry.name);\n\t\t\t\tconst real = await realpath(path);\n\t\t\t\tif (dirname(real) !== (await realpath(bootstrap.sessionDirectory)))\n\t\t\t\t\tthrow new SessionHostError(\"INVALID_WORKSPACE\", \"Session path escaped its managed directory.\");\n\t\t\t\tconst manager = await store.open(path);\n\t\t\t\tif (!(manager instanceof SessionManager)) continue;\n\t\t\t\tlet managerWorkspace: string;\n\t\t\t\ttry {\n\t\t\t\t\tmanagerWorkspace = await realpath(manager.header.cwd);\n\t\t\t\t} catch {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (managerWorkspace.toLowerCase() !== bootstrap.workspace.toLowerCase()) continue;\n\t\t\t\tresult.push(infoFor(manager));\n\t\t\t}\n\t\t\treturn result.sort((left, right) => {\n\t\t\t\tconst rightModified = right.modifiedAt ?? 0;\n\t\t\t\tconst leftModified = left.modifiedAt ?? 0;\n\t\t\t\treturn rightModified - leftModified || right.id.localeCompare(left.id);\n\t\t\t});\n\t\t},\n\t\tcreateSession: async () => {\n\t\t\tensureOpen();\n\t\t\tassertIdle(\"create a Session\");\n\t\t\tconst manager = await store.create({\n\t\t\t\tfilePath: join(\n\t\t\t\t\tbootstrap.sessionDirectory,\n\t\t\t\t\t`${new Date().toISOString().replaceAll(/[:.]/g, \"-\")}-${randomUUID()}.jsonl`,\n\t\t\t\t),\n\t\t\t\tcwd: bootstrap.workspace,\n\t\t\t\tdeferCreate: true,\n\t\t\t});\n\t\t\tif (!(manager instanceof SessionManager))\n\t\t\t\tthrow new SessionHostError(\"INTERNAL\", \"JSONL SessionStore returned an incompatible SessionManager.\");\n\t\t\treturn await openManager(manager);\n\t\t},\n\t\topenSession: async (id) => {\n\t\t\tensureOpen();\n\t\t\tassertIdle(\"open a Session\");\n\t\t\tif (!/^[A-Za-z0-9](?:[A-Za-z0-9._-]*[A-Za-z0-9])?$/.test(id))\n\t\t\t\tthrow new SessionHostError(\"INVALID_INPUT\", \"Session ID is invalid.\");\n\t\t\tif (activeId === id) return current().info;\n\t\t\tconst path = await findSessionPath(id);\n\t\t\ttry {\n\t\t\t\tif ((await lstat(path)).isSymbolicLink()) throw new Error(\"symlink\");\n\t\t\t} catch (cause) {\n\t\t\t\tif (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\")\n\t\t\t\t\tthrow new SessionHostError(\"NOT_FOUND\", `Session not found: \"${id}\".`);\n\t\t\t\tthrow new SessionHostError(\"INVALID_WORKSPACE\", \"Session path is not a regular file.\", { cause });\n\t\t\t}\n\t\t\tconst managedDirectory = await realpath(bootstrap.sessionDirectory);\n\t\t\tif (dirname(await realpath(path)) !== managedDirectory)\n\t\t\t\tthrow new SessionHostError(\"INVALID_WORKSPACE\", \"Session path escaped its managed directory.\");\n\t\t\tconst manager = await store.open(path);\n\t\t\tif (!(manager instanceof SessionManager))\n\t\t\t\tthrow new SessionHostError(\"INTERNAL\", \"JSONL SessionStore returned an incompatible SessionManager.\");\n\t\t\treturn await openManager(manager);\n\t\t},\n\t\tinspectSession: async (id) => {\n\t\t\tensureOpen();\n\t\t\tconst path = await findSessionPath(id);\n\t\t\tconst manager = await store.open(path);\n\t\t\tif (!(manager instanceof SessionManager)) throw new SessionHostError(\"INTERNAL\", \"Invalid SessionManager.\");\n\t\t\tconst info = infoFor(manager);\n\t\t\treturn {\n\t\t\t\tsession: info,\n\t\t\t\ttranscript: manager.messages,\n\t\t\t\ttree: manager.getTree(),\n\t\t\t\tstats: statsFor(manager),\n\t\t\t\treadOnly: true,\n\t\t\t};\n\t\t},\n\t\trenameSession: async (id, label) => {\n\t\t\tensureOpen();\n\t\t\tassertIdle(\"rename a Session\");\n\t\t\tif (!label.trim() || label.length > 200) throw new SessionHostError(\"INVALID_INPUT\", \"Session label is invalid.\");\n\t\t\tconst path = await findSessionPath(id);\n\t\t\tconst manager = await store.open(path);\n\t\t\tif (!(manager instanceof SessionManager)) throw new SessionHostError(\"INTERNAL\", \"Invalid SessionManager.\");\n\t\t\tconst active = sessions.get(asId(id));\n\t\t\tconst unlock = active ? undefined : await lockSession(path);\n\t\t\ttry {\n\t\t\t\tawait manager.appendPlugin({\n\t\t\t\t\tpluginId: \"di-code.session-label\",\n\t\t\t\t\tpluginVersion: \"1\",\n\t\t\t\t\tschemaVersion: 1,\n\t\t\t\t\tdata: { label: label.trim() },\n\t\t\t\t});\n\t\t\t} finally {\n\t\t\t\tif (unlock) await unlock();\n\t\t\t}\n\t\t\tconst info = infoFor(manager);\n\t\t\tconst existing = sessions.get(asId(id));\n\t\t\tif (existing) sessions.set(asId(id), { ...existing, info });\n\t\t\treturn info;\n\t\t},\n\t\tdeleteSession: async (id, confirmation) => {\n\t\t\tensureOpen();\n\t\t\tassertIdle(\"delete a Session\");\n\t\t\tif (confirmation !== id) throw new SessionHostError(\"INVALID_INPUT\", \"Session deletion requires confirmation.\");\n\t\t\tif (activeId === id) await api.closeSession();\n\t\t\tconst path = await findSessionPath(id);\n\t\t\tconst unlock = await lockSession(path);\n\t\t\ttry {\n\t\t\t\tawait unlink(path);\n\t\t\t} finally {\n\t\t\t\tawait unlock();\n\t\t\t}\n\t\t},\n\t\tbranchSession: async (id, entryId) => {\n\t\t\tensureOpen();\n\t\t\tassertIdle(\"branch a Session\");\n\t\t\tconst sourceId = id ?? activeId;\n\t\t\tif (!sourceId) throw new SessionHostError(\"NOT_FOUND\", \"No Session is open.\");\n\t\t\tconst sourcePath = await findSessionPath(sourceId);\n\t\t\tconst source = await store.open(sourcePath);\n\t\t\tif (!(source instanceof SessionManager)) throw new SessionHostError(\"INTERNAL\", \"Invalid SessionManager.\");\n\t\t\tconst branch = await store.create({\n\t\t\t\tfilePath: join(\n\t\t\t\t\tbootstrap.sessionDirectory,\n\t\t\t\t\t`${new Date().toISOString().replaceAll(/[:.]/g, \"-\")}-${randomUUID()}.jsonl`,\n\t\t\t\t),\n\t\t\t\tcwd: bootstrap.workspace,\n\t\t\t\tdeferCreate: true,\n\t\t\t});\n\t\t\tif (!(branch instanceof SessionManager)) throw new SessionHostError(\"INTERNAL\", \"Invalid SessionManager.\");\n\t\t\tconst selected = entryId ? source.getEntry(entryId) : undefined;\n\t\t\tif (entryId && !selected) throw new SessionHostError(\"NOT_FOUND\", \"Session tree entry was not found.\");\n\t\t\tconst messages = source\n\t\t\t\t.getBranch(entryId ?? source.leafId)\n\t\t\t\t.filter((entry) => entry.type === \"message\")\n\t\t\t\t.map((entry) => entry.message);\n\t\t\tfor (const message of messages) await branch.appendMessage(message);\n\t\t\treturn await openManager(branch);\n\t\t},\n\t\tcloseSession: async () => {\n\t\t\tensureOpen();\n\t\t\tassertIdle(\"close the Session\");\n\t\t\tif (!activeId) return;\n\t\t\tconst value = current();\n\t\t\tsessions.delete(activeId);\n\t\t\tactiveId = undefined;\n\t\t\tvalue.unsubscribe();\n\t\t\tawait value.session.dispose();\n\t\t\tawait value.unlock();\n\t\t\temit({ type: \"session_changed\" });\n\t\t},\n\t\tprompt: (input, signal) => {\n\t\t\tconst parsed = typeof input === \"string\" ? { text: input } : input;\n\t\t\tif (!parsed.text?.trim())\n\t\t\t\treturn Promise.reject(new SessionHostError(\"INVALID_INPUT\", \"Prompt text must not be empty.\"));\n\t\t\tassertIdle(\"start a prompt\");\n\t\t\treturn withOperation(\"prompt\", parsed.requestId, signal, async (operationSignal) => {\n\t\t\t\tconst value = current();\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await value.session.prompt(parsed.text, operationSignal);\n\t\t\t\t\tconst failed = result.stopReason === \"error\" || result.stopReason === \"aborted\";\n\t\t\t\t\tfailedPrompts.set(\n\t\t\t\t\t\tvalue.info.id,\n\t\t\t\t\t\tfailed ? { requestId: parsed.requestId ?? \"\", text: parsed.text } : undefined,\n\t\t\t\t\t);\n\t\t\t\t\tawait persistRetryState(value.manager, failed ? failedPrompts.get(value.info.id) : undefined);\n\t\t\t\t\treturn result;\n\t\t\t\t} catch (cause) {\n\t\t\t\t\tconst failed = { requestId: parsed.requestId ?? \"\", text: parsed.text };\n\t\t\t\t\tfailedPrompts.set(value.info.id, failed);\n\t\t\t\t\tawait persistRetryState(value.manager, failed).catch(() => undefined);\n\t\t\t\t\tthrow cause;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tpromptWithImages: (text, images, signal) => {\n\t\t\tif (!text?.trim()) return Promise.reject(new SessionHostError(\"INVALID_INPUT\", \"Prompt text must not be empty.\"));\n\t\t\tassertIdle(\"start a prompt\");\n\t\t\treturn withOperation(\"prompt\", undefined, signal, async (operationSignal) => {\n\t\t\t\tconst value = current();\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await value.session.promptWithImages(text, images, operationSignal);\n\t\t\t\t\tconst failed = result.stopReason === \"error\" || result.stopReason === \"aborted\";\n\t\t\t\t\tconst state = failed ? { requestId: randomUUID(), text } : undefined;\n\t\t\t\t\tfailedPrompts.set(value.info.id, state);\n\t\t\t\t\tawait persistRetryState(value.manager, state);\n\t\t\t\t\treturn result;\n\t\t\t\t} catch (cause) {\n\t\t\t\t\tconst failed = { requestId: randomUUID(), text };\n\t\t\t\t\tfailedPrompts.set(value.info.id, failed);\n\t\t\t\t\tawait persistRetryState(value.manager, failed).catch(() => undefined);\n\t\t\t\t\tthrow cause;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tsteer: (input, signal) => {\n\t\t\tconst parsed = typeof input === \"string\" ? { text: input } : input;\n\t\t\tif (!parsed.text?.trim())\n\t\t\t\treturn Promise.reject(new SessionHostError(\"INVALID_INPUT\", \"Steering text must not be empty.\"));\n\t\t\treturn withOperation(\"steer\", parsed.requestId, signal, async (operationSignal) => {\n\t\t\t\tawait current().session.steer(parsed.text, operationSignal);\n\t\t\t});\n\t\t},\n\t\tsteerWithImages: (text, images, signal) =>\n\t\t\twithOperation(\"steer\", undefined, signal, async (operationSignal) => {\n\t\t\t\tawait current().session.steerWithImages(text, images, operationSignal);\n\t\t\t}),\n\t\tretry: (input, signal) => {\n\t\t\tensureOpen();\n\t\t\tassertIdle(\"retry\");\n\t\t\tconst target =\n\t\t\t\ttypeof input === \"object\" && input !== null && !(input instanceof AbortSignal)\n\t\t\t\t\t? input.targetRequestId\n\t\t\t\t\t: undefined;\n\t\t\tconst operationSignal = input instanceof AbortSignal ? input : signal;\n\t\t\tconst value = current();\n\t\t\tconst retry = failedPrompts.get(value.info.id);\n\t\t\tif (!retry || (target !== undefined && target !== retry.requestId))\n\t\t\t\treturn Promise.reject(new SessionHostError(\"INVALID_INPUT\", \"No failed prompt is available to retry.\"));\n\t\t\treturn withOperation(\"retry\", target, operationSignal, async (operationSignal) => {\n\t\t\t\tconst result = await value.session.prompt(retry.text, operationSignal);\n\t\t\t\tif (result.stopReason === \"error\" || result.stopReason === \"aborted\") {\n\t\t\t\t\tawait persistRetryState(value.manager, retry);\n\t\t\t\t} else {\n\t\t\t\t\tfailedPrompts.set(value.info.id, undefined);\n\t\t\t\t\tawait persistRetryState(value.manager, undefined);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t});\n\t\t},\n\t\tcancel: (id) => {\n\t\t\tconst operation = operations.get(asRequestId(id));\n\t\t\tif (!operation) return false;\n\t\t\toperation.controller.abort();\n\t\t\treturn true;\n\t\t},\n\t\ttranscript: () => structuredClone(current().session.transcript),\n\t\ttree: () => structuredClone(current().session.sessionTree),\n\t\tnavigateTree: (entryId) => {\n\t\t\tensureOpen();\n\t\t\tassertIdle(\"navigate the Session tree\");\n\t\t\treturn withOperation(\"tree\", undefined, undefined, async () => current().session.navigateTree(entryId));\n\t\t},\n\t\tsetModel: (modelId) => {\n\t\t\tensureOpen();\n\t\t\tassertIdle(\"change model\");\n\t\t\treturn current().session.setModel(modelId);\n\t\t},\n\t\tsetRuntime: (providerId, modelId) => {\n\t\t\tensureOpen();\n\t\t\tassertIdle(\"change runtime\");\n\t\t\ttry {\n\t\t\t\tconst selection = context.require(providerRegistryKey).select(providerId, modelId);\n\t\t\t\treturn api.setRuntimeValue(selection.provider, selection.model);\n\t\t\t} catch (cause) {\n\t\t\t\tconst provider = bootstrap.provider;\n\t\t\t\tconst model =\n\t\t\t\t\tprovider.id === providerId ? provider.models.find((candidate) => candidate.id === modelId) : undefined;\n\t\t\t\tif (model) return api.setRuntimeValue(provider, model);\n\t\t\t\tthrow cause;\n\t\t\t}\n\t\t},\n\t\tsetRuntimeValue: (provider, model) => {\n\t\t\tensureOpen();\n\t\t\tassertIdle(\"change runtime\");\n\t\t\treturn current().session.setRuntime(provider, model);\n\t\t},\n\t\tsetThinkingLevel: (level) => {\n\t\t\tensureOpen();\n\t\t\tassertIdle(\"change thinking level\");\n\t\t\treturn current().session.setThinkingLevel(level);\n\t\t},\n\t\tcycleThinkingLevel: () => {\n\t\t\tensureOpen();\n\t\t\tassertIdle(\"change thinking level\");\n\t\t\treturn current().session.cycleThinkingLevel();\n\t\t},\n\t\tcompact: (signal) => {\n\t\t\tensureOpen();\n\t\t\tassertIdle(\"compact the Session\");\n\t\t\treturn withOperation(\"compact\", undefined, signal, async (operationSignal) =>\n\t\t\t\tcurrent().session.compact(operationSignal),\n\t\t\t);\n\t\t},\n\t\tsetCompactionEnabled: (enabled) => {\n\t\t\tensureOpen();\n\t\t\tassertIdle(\"change compaction\");\n\t\t\treturn current().session.setCompactionEnabled(enabled);\n\t\t},\n\t\trefreshResources: (projectTrusted, signal) => {\n\t\t\tensureOpen();\n\t\t\tassertIdle(\"refresh product resources\");\n\t\t\treturn withOperation(\"session\", undefined, signal, async () => {\n\t\t\t\tconst next = await createBootstrap(context, {\n\t\t\t\t\t...options,\n\t\t\t\t\tprojectTrusted: projectTrusted ?? resourceProjectTrusted,\n\t\t\t\t});\n\t\t\t\tif (next.workspace !== bootstrap.workspace) {\n\t\t\t\t\tawait next.closeMcp();\n\t\t\t\t\tthrow new SessionHostError(\"INVALID_WORKSPACE\", \"Product resources changed the Host workspace.\");\n\t\t\t\t}\n\t\t\t\tconst active = activeId === undefined ? undefined : current();\n\t\t\t\tif (!active) {\n\t\t\t\t\tconst previous = bootstrap;\n\t\t\t\t\tbootstrap = next;\n\t\t\t\t\tresourceProjectTrusted = projectTrusted ?? resourceProjectTrusted;\n\t\t\t\t\tawait previous.closeMcp();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst session = await createAgent(active.manager, next);\n\t\t\t\t\tconst unsubscribe = session.subscribeSession(emit);\n\t\t\t\t\tconst previous = bootstrap;\n\t\t\t\t\tbootstrap = next;\n\t\t\t\t\tresourceProjectTrusted = projectTrusted ?? resourceProjectTrusted;\n\t\t\t\t\tsessions.set(active.info.id, { ...active, session, unsubscribe });\n\t\t\t\t\tactive.unsubscribe();\n\t\t\t\t\tawait active.session.dispose();\n\t\t\t\t\tawait previous.closeMcp();\n\t\t\t\t} catch (cause) {\n\t\t\t\t\tawait next.closeMcp();\n\t\t\t\t\tthrow cause;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tusage: () => current().session.usage,\n\t\tui: () => {\n\t\t\tconst session = current().session;\n\t\t\treturn {\n\t\t\t\tget allowedRoot() {\n\t\t\t\t\treturn session.allowedRoot;\n\t\t\t\t},\n\t\t\t\tget modelId() {\n\t\t\t\t\treturn session.modelId;\n\t\t\t\t},\n\t\t\t\tget providerId() {\n\t\t\t\t\treturn session.providerId;\n\t\t\t\t},\n\t\t\t\tget thinkingLevel() {\n\t\t\t\t\treturn session.thinkingLevel;\n\t\t\t\t},\n\t\t\t\tget availableModels() {\n\t\t\t\t\treturn session.availableModels;\n\t\t\t\t},\n\t\t\t\tget availableSkills() {\n\t\t\t\t\treturn session.availableSkills;\n\t\t\t\t},\n\t\t\t\tget compactionEnabled() {\n\t\t\t\t\treturn session.compactionEnabled;\n\t\t\t\t},\n\t\t\t\tget sessionFile() {\n\t\t\t\t\treturn session.sessionFile;\n\t\t\t\t},\n\t\t\t\tget sessionTree() {\n\t\t\t\t\treturn session.sessionTree;\n\t\t\t\t},\n\t\t\t\tget sessionLeafId() {\n\t\t\t\t\treturn session.sessionLeafId;\n\t\t\t\t},\n\t\t\t\tget transcript() {\n\t\t\t\t\treturn session.transcript;\n\t\t\t\t},\n\t\t\t\tget usage() {\n\t\t\t\t\treturn session.usage;\n\t\t\t\t},\n\t\t\t\tpromptWithImages: api.promptWithImages,\n\t\t\t\tretry: api.retry,\n\t\t\t\tsteerWithImages: api.steerWithImages,\n\t\t\t\tsubscribeSession: (listener) =>\n\t\t\t\t\tapi.subscribe((event) => {\n\t\t\t\t\t\tif (event.type !== \"session_changed\") return listener(event);\n\t\t\t\t\t}),\n\t\t\t\tsetModel: api.setModel,\n\t\t\t\tsetRuntime: (provider, model) => api.setRuntime(provider.id, model.id),\n\t\t\t\tcycleThinkingLevel: api.cycleThinkingLevel,\n\t\t\t\tsetCompactionEnabled: api.setCompactionEnabled,\n\t\t\t\tnavigateTree: api.navigateTree,\n\t\t\t\tcompact: api.compact,\n\t\t\t} satisfies SessionHostUi;\n\t\t},\n\t\tsubscribe: (listener) => {\n\t\t\tlisteners.add(listener);\n\t\t\treturn () => listeners.delete(listener);\n\t\t},\n\t\tdispose: async () => {\n\t\t\tif (disposed) return;\n\t\t\tdisposed = true;\n\t\t\tconst pending = [...operations.values()]\n\t\t\t\t.map((operation) => operation.promise)\n\t\t\t\t.filter((promise): promise is Promise<unknown> => promise !== undefined);\n\t\t\tfor (const operation of operations.values()) operation.controller.abort();\n\t\t\tawait Promise.allSettled(pending);\n\t\t\tfor (const value of sessions.values()) {\n\t\t\t\tvalue.unsubscribe();\n\t\t\t\tawait value.session.dispose();\n\t\t\t\tawait value.unlock();\n\t\t\t}\n\t\t\tsessions.clear();\n\t\t\tfailedPrompts.clear();\n\t\t\tactiveId = undefined;\n\t\t\tlisteners.clear();\n\t\t\tawait bootstrap.closeMcp();\n\t\t},\n\t};\n\tif (options.initialSessionPath !== undefined) {\n\t\tconst initialPath = resolve(options.initialSessionPath);\n\t\tif (dirname(await realpath(initialPath)) !== (await realpath(bootstrap.sessionDirectory)))\n\t\t\tthrow new SessionHostError(\"INVALID_WORKSPACE\", \"Initial Session path escaped its managed directory.\");\n\t\tconst initial = await store.open(initialPath);\n\t\tif (!(initial instanceof SessionManager))\n\t\t\tthrow new SessionHostError(\"INTERNAL\", \"JSONL SessionStore returned an incompatible SessionManager.\");\n\t\tawait openManager(initial);\n\t}\n\treturn api;\n}\n\nexport interface SessionActor extends SessionHost {\n\treadonly principal: string;\n\treadonly workspace: string;\n}\nexport interface HostManagerOptions extends SessionHostBootstrapOptions {\n\treadonly principal: string;\n}\n\nexport class HostManager {\n\tprivate readonly actors = new Map<string, SessionActor>();\n\tprivate disposed = false;\n\tprivate readonly context: Context;\n\tconstructor(context: Context) {\n\t\tthis.context = context;\n\t}\n\tasync get(options: HostManagerOptions): Promise<SessionActor> {\n\t\tif (this.disposed) throw new SessionHostError(\"DISPOSED\", \"HostManager has been disposed.\");\n\t\tconst workspace = await validateWorkspace(options.cwd);\n\t\tconst key = `${options.principal}\\n${workspace}`;\n\t\tconst existing = this.actors.get(key);\n\t\tif (existing) return existing;\n\t\tconst host = await createSessionHost(this.context, { ...options, cwd: workspace });\n\t\tconst actor = Object.assign(host, { principal: options.principal, workspace });\n\t\tthis.actors.set(key, actor);\n\t\treturn actor;\n\t}\n\tasync dispose(): Promise<void> {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tawait Promise.all([...this.actors.values()].map((actor) => actor.dispose()));\n\t\tthis.actors.clear();\n\t}\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Context, type PluginDefinition } from "@di-code/plugin-runtime";
|
|
2
|
+
export interface RuntimeCoreService {
|
|
3
|
+
readonly context: Context;
|
|
4
|
+
readonly mode: Context["mode"];
|
|
5
|
+
}
|
|
6
|
+
export declare const apiVersion: 1;
|
|
7
|
+
export declare const name = "runtime-core";
|
|
8
|
+
export declare const version = "0.1.7";
|
|
9
|
+
export declare const runtimeCoreKey: import("@di-code/plugin-runtime").ServiceKey<RuntimeCoreService>;
|
|
10
|
+
export declare const apply: PluginDefinition["apply"];
|
|
11
|
+
//# sourceMappingURL=runtime-core-entry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-core-entry.d.ts","sourceRoot":"","sources":["../src/runtime-core-entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhG,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/B;AAED,eAAO,MAAM,UAAU,EAAG,CAAU,CAAC;AACrC,eAAO,MAAM,IAAI,iBAAiB,CAAC;AACnC,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,cAAc,kEAAuD,CAAC;AACnF,eAAO,MAAM,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAE3C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createServiceKey } from "@di-code/plugin-runtime";
|
|
2
|
+
export const apiVersion = 1;
|
|
3
|
+
export const name = "runtime-core";
|
|
4
|
+
export const version = "0.1.7";
|
|
5
|
+
export const runtimeCoreKey = createServiceKey("runtime-core");
|
|
6
|
+
export const apply = (context) => {
|
|
7
|
+
context.set(runtimeCoreKey, { context, mode: context.mode });
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=runtime-core-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-core-entry.js","sourceRoot":"","sources":["../src/runtime-core-entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,gBAAgB,EAAyB,MAAM,yBAAyB,CAAC;AAOhG,MAAM,CAAC,MAAM,UAAU,GAAG,CAAU,CAAC;AACrC,MAAM,CAAC,MAAM,IAAI,GAAG,cAAc,CAAC;AACnC,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAC/B,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAqB,cAAc,CAAC,CAAC;AACnF,MAAM,CAAC,MAAM,KAAK,GAA8B,CAAC,OAAO,EAAE,EAAE;IAC3D,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9D,CAAC,CAAC","sourcesContent":["import { type Context, createServiceKey, type PluginDefinition } from \"@di-code/plugin-runtime\";\n\nexport interface RuntimeCoreService {\n\treadonly context: Context;\n\treadonly mode: Context[\"mode\"];\n}\n\nexport const apiVersion = 1 as const;\nexport const name = \"runtime-core\";\nexport const version = \"0.1.7\";\nexport const runtimeCoreKey = createServiceKey<RuntimeCoreService>(\"runtime-core\");\nexport const apply: PluginDefinition[\"apply\"] = (context) => {\n\tcontext.set(runtimeCoreKey, { context, mode: context.mode });\n};\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PluginDefinition } from "@di-code/plugin-runtime";
|
|
2
|
+
/** Installs the product SessionFactory as a composition-owned entry. */
|
|
3
|
+
export declare const apiVersion: 1;
|
|
4
|
+
export declare const name = "session-factory";
|
|
5
|
+
export declare const version = "0.1.7";
|
|
6
|
+
export declare const apply: PluginDefinition["apply"];
|
|
7
|
+
//# sourceMappingURL=session-factory-entry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-factory-entry.d.ts","sourceRoot":"","sources":["../src/session-factory-entry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,wEAAwE;AACxE,eAAO,MAAM,UAAU,EAAG,CAAU,CAAC;AACrC,eAAO,MAAM,IAAI,oBAAoB,CAAC;AACtC,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAE3C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { installAgentSessionFactory } from "./runtime/session-factory.js";
|
|
2
|
+
/** Installs the product SessionFactory as a composition-owned entry. */
|
|
3
|
+
export const apiVersion = 1;
|
|
4
|
+
export const name = "session-factory";
|
|
5
|
+
export const version = "0.1.7";
|
|
6
|
+
export const apply = (context, _config, fiber) => {
|
|
7
|
+
fiber.addDisposer(installAgentSessionFactory(context));
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=session-factory-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-factory-entry.js","sourceRoot":"","sources":["../src/session-factory-entry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,wEAAwE;AACxE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAU,CAAC;AACrC,MAAM,CAAC,MAAM,IAAI,GAAG,iBAAiB,CAAC;AACtC,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAC/B,MAAM,CAAC,MAAM,KAAK,GAA8B,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;IAC3E,KAAK,CAAC,WAAW,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC","sourcesContent":["import type { PluginDefinition } from \"@di-code/plugin-runtime\";\nimport { installAgentSessionFactory } from \"./runtime/session-factory.ts\";\n\n/** Installs the product SessionFactory as a composition-owned entry. */\nexport const apiVersion = 1 as const;\nexport const name = \"session-factory\";\nexport const version = \"0.1.7\";\nexport const apply: PluginDefinition[\"apply\"] = (context, _config, fiber) => {\n\tfiber.addDisposer(installAgentSessionFactory(context));\n};\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PluginDefinition } from "@di-code/plugin-runtime";
|
|
2
|
+
/** Registers the product JSONL SessionStore implementation behind the public registry. */
|
|
3
|
+
export declare const apiVersion: 1;
|
|
4
|
+
export declare const name = "session-store-jsonl";
|
|
5
|
+
export declare const version = "0.1.7";
|
|
6
|
+
export declare const apply: PluginDefinition["apply"];
|
|
7
|
+
//# sourceMappingURL=session-store-jsonl-entry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-store-jsonl-entry.d.ts","sourceRoot":"","sources":["../src/session-store-jsonl-entry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,0FAA0F;AAC1F,eAAO,MAAM,UAAU,EAAG,CAAU,CAAC;AACrC,eAAO,MAAM,IAAI,wBAAwB,CAAC;AAC1C,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAe3C,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { sessionMigrationRegistryKey, sessionStoreRegistryKey } from "@di-code/builtins";
|
|
2
|
+
import { SessionManager } from "./core/session/session-manager.js";
|
|
3
|
+
/** Registers the product JSONL SessionStore implementation behind the public registry. */
|
|
4
|
+
export const apiVersion = 1;
|
|
5
|
+
export const name = "session-store-jsonl";
|
|
6
|
+
export const version = "0.1.7";
|
|
7
|
+
export const apply = (context, _config, fiber) => {
|
|
8
|
+
const registry = context.require(sessionStoreRegistryKey);
|
|
9
|
+
const migrations = context.require(sessionMigrationRegistryKey);
|
|
10
|
+
fiber.addDisposer(registry.register("jsonl", {
|
|
11
|
+
create: (options) => {
|
|
12
|
+
if (!isCreateOptions(options))
|
|
13
|
+
throw new TypeError("JSONL SessionStore create options are invalid");
|
|
14
|
+
return SessionManager.create(options);
|
|
15
|
+
},
|
|
16
|
+
open: async (filePath, options) => {
|
|
17
|
+
await migrations.migrate(filePath);
|
|
18
|
+
return await SessionManager.open(filePath, isOpenOptions(options) ? options : {});
|
|
19
|
+
},
|
|
20
|
+
}));
|
|
21
|
+
};
|
|
22
|
+
function isCreateOptions(value) {
|
|
23
|
+
return (typeof value === "object" &&
|
|
24
|
+
value !== null &&
|
|
25
|
+
"filePath" in value &&
|
|
26
|
+
typeof value.filePath === "string" &&
|
|
27
|
+
"cwd" in value &&
|
|
28
|
+
typeof value.cwd === "string");
|
|
29
|
+
}
|
|
30
|
+
function isOpenOptions(value) {
|
|
31
|
+
return value === undefined || (typeof value === "object" && value !== null);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=session-store-jsonl-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-store-jsonl-entry.js","sourceRoot":"","sources":["../src/session-store-jsonl-entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAEzF,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAEnE,0FAA0F;AAC1F,MAAM,CAAC,MAAM,UAAU,GAAG,CAAU,CAAC;AACrC,MAAM,CAAC,MAAM,IAAI,GAAG,qBAAqB,CAAC;AAC1C,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAC/B,MAAM,CAAC,MAAM,KAAK,GAA8B,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;IAC3E,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAChE,KAAK,CAAC,WAAW,CAChB,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE;QAC1B,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;YACnB,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;gBAAE,MAAM,IAAI,SAAS,CAAC,+CAA+C,CAAC,CAAC;YACpG,OAAO,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;YACjC,MAAM,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACnC,OAAO,MAAM,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnF,CAAC;KACD,CAAC,CACF,CAAC;AACH,CAAC,CAAC;AAEF,SAAS,eAAe,CACvB,KAAc;IAEd,OAAO,CACN,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,UAAU,IAAI,KAAK;QACnB,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAClC,KAAK,IAAI,KAAK;QACd,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,CAC7B,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACpC,OAAO,KAAK,KAAK,SAAS,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC;AAC7E,CAAC","sourcesContent":["import { sessionMigrationRegistryKey, sessionStoreRegistryKey } from \"@di-code/builtins\";\nimport type { PluginDefinition } from \"@di-code/plugin-runtime\";\nimport { SessionManager } from \"./core/session/session-manager.ts\";\n\n/** Registers the product JSONL SessionStore implementation behind the public registry. */\nexport const apiVersion = 1 as const;\nexport const name = \"session-store-jsonl\";\nexport const version = \"0.1.7\";\nexport const apply: PluginDefinition[\"apply\"] = (context, _config, fiber) => {\n\tconst registry = context.require(sessionStoreRegistryKey);\n\tconst migrations = context.require(sessionMigrationRegistryKey);\n\tfiber.addDisposer(\n\t\tregistry.register(\"jsonl\", {\n\t\t\tcreate: (options) => {\n\t\t\t\tif (!isCreateOptions(options)) throw new TypeError(\"JSONL SessionStore create options are invalid\");\n\t\t\t\treturn SessionManager.create(options);\n\t\t\t},\n\t\t\topen: async (filePath, options) => {\n\t\t\t\tawait migrations.migrate(filePath);\n\t\t\t\treturn await SessionManager.open(filePath, isOpenOptions(options) ? options : {});\n\t\t\t},\n\t\t}),\n\t);\n};\n\nfunction isCreateOptions(\n\tvalue: unknown,\n): value is { readonly filePath: string; readonly cwd: string; readonly deferCreate?: boolean } {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"filePath\" in value &&\n\t\ttypeof value.filePath === \"string\" &&\n\t\t\"cwd\" in value &&\n\t\ttypeof value.cwd === \"string\"\n\t);\n}\n\nfunction isOpenOptions(value: unknown): value is Record<string, unknown> {\n\treturn value === undefined || (typeof value === \"object\" && value !== null);\n}\n"]}
|
package/dist/startup.d.ts
CHANGED
|
@@ -16,10 +16,12 @@ export interface StartupConfiguration {
|
|
|
16
16
|
readonly environment: Environment;
|
|
17
17
|
readonly providers: readonly StartupProviderConfiguration[];
|
|
18
18
|
readonly defaults?: StartupDefaults;
|
|
19
|
-
/**
|
|
19
|
+
/** Per-provider/model thinking-level preferences after workspace overrides. */
|
|
20
20
|
readonly thinkingLevels?: ThinkingLevelPreferences;
|
|
21
21
|
readonly locale?: Locale;
|
|
22
|
+
readonly permissionMode?: PermissionMode;
|
|
22
23
|
}
|
|
24
|
+
export type PermissionMode = "ask" | "allow" | "deny";
|
|
23
25
|
export interface StartupDefaults {
|
|
24
26
|
readonly providerId?: string;
|
|
25
27
|
readonly modelId?: string;
|
|
@@ -39,11 +41,20 @@ export declare function validateCustomBaseUrl(value: string): string;
|
|
|
39
41
|
export declare function createCustomProviderConfiguration(input: CustomProviderInput): StartupProviderConfiguration;
|
|
40
42
|
/** Persists a user-level terminal language preference without changing project settings. */
|
|
41
43
|
export declare function saveGlobalLocale(agentDir: string, locale: Locale): Promise<void>;
|
|
44
|
+
/** Persists the default permission mode; the active Session keeps its own runtime until next turn. */
|
|
45
|
+
export declare function saveGlobalPermissionMode(agentDir: string, permissionMode: PermissionMode): Promise<void>;
|
|
42
46
|
export declare function saveGlobalProviderApiKey(agentDir: string, providerId: string, api: Exclude<ModelApi, "faux">, apiKey: string, modelId?: string): Promise<void>;
|
|
43
47
|
/** Persists the interactive model selection without changing credentials or Provider configuration. */
|
|
44
48
|
export declare function saveGlobalModelSelection(agentDir: string, providerId: string, modelId: string): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Persists a runtime preference in an existing workspace settings file, falling back to user settings when the
|
|
51
|
+
* workspace has no settings file. This keeps an explicit WebUI selection aligned with startup resolution.
|
|
52
|
+
*/
|
|
53
|
+
export declare function saveScopedModelSelection(cwd: string, agentDir: string, providerId: string, modelId: string): Promise<void>;
|
|
45
54
|
/** Persists a per-provider/model thinking preference in user settings. */
|
|
46
55
|
export declare function saveGlobalThinkingLevel(agentDir: string, providerId: string, modelId: string, level: ThinkingLevel): Promise<void>;
|
|
56
|
+
/** Persists a thinking preference beside an existing workspace model selection, or in user settings as a fallback. */
|
|
57
|
+
export declare function saveScopedThinkingLevel(cwd: string, agentDir: string, providerId: string, modelId: string, level: ThinkingLevel): Promise<void>;
|
|
47
58
|
/**
|
|
48
59
|
* Replaces the user-managed `custom` provider while retaining other global
|
|
49
60
|
* providers and preferences. The key is intentionally stored only here, never
|
package/dist/startup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startup.d.ts","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"startup.d.ts","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"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"}
|
package/dist/startup.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
|
|
2
3
|
import { homedir } from "node:os";
|
|
3
4
|
import { join } from "node:path";
|
|
4
5
|
import { createAnthropicProvider, createDeepSeekProvider, createFauxProvider, createKimiProvider, createOpenAIChatCompletionsProvider, createOpenAIProvider, createZhipuProvider, findBuiltinModel, } from "@di-code/ai";
|
|
@@ -148,6 +149,11 @@ function parseModels(value, path, providerId, providerApi, providerBaseUrl, sett
|
|
|
148
149
|
if (chatCompletionsCompat !== undefined && typedApi !== "openai-chat-completions") {
|
|
149
150
|
throw new Error(`${settingsPath}: ${modelPath}.chatCompletionsCompat requires api "openai-chat-completions"`);
|
|
150
151
|
}
|
|
152
|
+
const contextWindow = positiveInteger(model.contextWindow, `${modelPath}.contextWindow`, 128_000, settingsPath);
|
|
153
|
+
const maxOutputTokens = positiveInteger(model.maxTokens ?? model.maxOutputTokens, `${modelPath}.maxTokens`, 16_384, settingsPath);
|
|
154
|
+
if (maxOutputTokens >= contextWindow) {
|
|
155
|
+
throw new Error(`${settingsPath}: ${modelPath}.maxTokens must be smaller than contextWindow`);
|
|
156
|
+
}
|
|
151
157
|
return {
|
|
152
158
|
id,
|
|
153
159
|
name: requiredString(model.name ?? id, `${modelPath}.name`, settingsPath),
|
|
@@ -163,8 +169,8 @@ function parseModels(value, path, providerId, providerApi, providerBaseUrl, sett
|
|
|
163
169
|
...(chatCompletionsCompat ? { chatCompletionsCompat } : {}),
|
|
164
170
|
...(model.cacheRetention === "long" ? { cacheRetention: "long" } : {}),
|
|
165
171
|
...(model.sessionAffinity === "codex" ? { sessionAffinity: "codex" } : {}),
|
|
166
|
-
contextWindow
|
|
167
|
-
maxOutputTokens
|
|
172
|
+
contextWindow,
|
|
173
|
+
maxOutputTokens,
|
|
168
174
|
cost: {
|
|
169
175
|
input: nonNegativeNumber(prices.input, `${modelPath}.cost.input`, 0, settingsPath) / 1_000_000,
|
|
170
176
|
output: nonNegativeNumber(prices.output, `${modelPath}.cost.output`, 0, settingsPath) / 1_000_000,
|
|
@@ -276,12 +282,19 @@ function parseSettings(value, settingsPath) {
|
|
|
276
282
|
if (record.locale !== undefined && !isLocale(record.locale)) {
|
|
277
283
|
throw new Error(`${settingsPath}: locale must be "en" or "zh-CN"`);
|
|
278
284
|
}
|
|
285
|
+
if (record.permissionMode !== undefined &&
|
|
286
|
+
record.permissionMode !== "ask" &&
|
|
287
|
+
record.permissionMode !== "allow" &&
|
|
288
|
+
record.permissionMode !== "deny") {
|
|
289
|
+
throw new Error(`${settingsPath}: permissionMode must be "ask", "allow", or "deny"`);
|
|
290
|
+
}
|
|
279
291
|
return {
|
|
280
292
|
providers,
|
|
281
293
|
...(defaultProvider === undefined ? {} : { defaultProvider }),
|
|
282
294
|
...(defaultModel === undefined ? {} : { defaultModel }),
|
|
283
295
|
...(thinkingLevels === undefined ? {} : { thinkingLevels }),
|
|
284
296
|
...(record.locale === undefined ? {} : { locale: record.locale }),
|
|
297
|
+
...(record.permissionMode === undefined ? {} : { permissionMode: record.permissionMode }),
|
|
285
298
|
};
|
|
286
299
|
}
|
|
287
300
|
function parseThinkingLevels(value, settingsPath) {
|
|
@@ -340,15 +353,45 @@ function mergeSettings(globalSettings, projectSettings) {
|
|
|
340
353
|
const defaultProvider = projectSettings?.defaultProvider ?? globalSettings?.defaultProvider;
|
|
341
354
|
const defaultModel = projectSettings?.defaultModel ??
|
|
342
355
|
(projectSettings?.defaultProvider === undefined ? globalSettings?.defaultModel : undefined);
|
|
356
|
+
const thinkingLevels = mergeThinkingLevels(globalSettings?.thinkingLevels, projectSettings?.thinkingLevels);
|
|
343
357
|
const locale = globalSettings?.locale;
|
|
344
358
|
return {
|
|
345
359
|
providers,
|
|
346
360
|
...(defaultProvider === undefined ? {} : { defaultProvider }),
|
|
347
361
|
...(defaultModel === undefined ? {} : { defaultModel }),
|
|
348
|
-
...(
|
|
362
|
+
...(thinkingLevels === undefined ? {} : { thinkingLevels }),
|
|
349
363
|
...(locale === undefined ? {} : { locale }),
|
|
364
|
+
...(globalSettings?.permissionMode === undefined ? {} : { permissionMode: globalSettings.permissionMode }),
|
|
350
365
|
};
|
|
351
366
|
}
|
|
367
|
+
function mergeThinkingLevels(globalPreferences, workspacePreferences) {
|
|
368
|
+
if (globalPreferences === undefined && workspacePreferences === undefined)
|
|
369
|
+
return undefined;
|
|
370
|
+
const result = {};
|
|
371
|
+
for (const [providerId, models] of Object.entries(globalPreferences ?? {}))
|
|
372
|
+
result[providerId] = { ...models };
|
|
373
|
+
for (const [providerId, models] of Object.entries(workspacePreferences ?? {})) {
|
|
374
|
+
result[providerId] = { ...result[providerId], ...models };
|
|
375
|
+
}
|
|
376
|
+
return result;
|
|
377
|
+
}
|
|
378
|
+
async function writeSettingsFile(agentDir, settings) {
|
|
379
|
+
const settingsFilePath = join(agentDir, SETTINGS_FILE_NAME);
|
|
380
|
+
await mkdir(agentDir, { recursive: true, mode: 0o700 });
|
|
381
|
+
const temporaryPath = `${settingsFilePath}.tmp-${randomUUID()}`;
|
|
382
|
+
try {
|
|
383
|
+
await writeFile(temporaryPath, `${JSON.stringify(settings, null, "\t")}\n`, { encoding: "utf8", mode: 0o600 });
|
|
384
|
+
await rename(temporaryPath, settingsFilePath);
|
|
385
|
+
}
|
|
386
|
+
finally {
|
|
387
|
+
try {
|
|
388
|
+
await unlink(temporaryPath);
|
|
389
|
+
}
|
|
390
|
+
catch {
|
|
391
|
+
// The temporary file was renamed or was never created.
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
352
395
|
/** Persists a user-level terminal language preference without changing project settings. */
|
|
353
396
|
export async function saveGlobalLocale(agentDir, locale) {
|
|
354
397
|
const settingsFilePath = join(agentDir, SETTINGS_FILE_NAME);
|
|
@@ -359,9 +402,17 @@ export async function saveGlobalLocale(agentDir, locale) {
|
|
|
359
402
|
...(existingSettings?.defaultModel === undefined ? {} : { defaultModel: existingSettings.defaultModel }),
|
|
360
403
|
...(existingSettings?.thinkingLevels === undefined ? {} : { thinkingLevels: existingSettings.thinkingLevels }),
|
|
361
404
|
locale,
|
|
405
|
+
...(existingSettings?.permissionMode === undefined ? {} : { permissionMode: existingSettings.permissionMode }),
|
|
362
406
|
};
|
|
363
|
-
await
|
|
364
|
-
|
|
407
|
+
await writeSettingsFile(agentDir, settings);
|
|
408
|
+
}
|
|
409
|
+
/** Persists the default permission mode; the active Session keeps its own runtime until next turn. */
|
|
410
|
+
export async function saveGlobalPermissionMode(agentDir, permissionMode) {
|
|
411
|
+
const settingsFilePath = join(agentDir, SETTINGS_FILE_NAME);
|
|
412
|
+
const existingSettings = await readSettingsFile(settingsFilePath, settingsFilePath);
|
|
413
|
+
if (permissionMode !== "ask" && permissionMode !== "allow" && permissionMode !== "deny")
|
|
414
|
+
throw new Error(`${settingsFilePath}: permissionMode must be "ask", "allow", or "deny"`);
|
|
415
|
+
await writeSettingsFile(agentDir, { ...mergeSettings(existingSettings, undefined), permissionMode });
|
|
365
416
|
}
|
|
366
417
|
export async function saveGlobalProviderApiKey(agentDir, providerId, api, apiKey, modelId) {
|
|
367
418
|
const settingsFilePath = join(agentDir, SETTINGS_FILE_NAME);
|
|
@@ -374,8 +425,7 @@ export async function saveGlobalProviderApiKey(agentDir, providerId, api, apiKey
|
|
|
374
425
|
defaultProvider: providerId,
|
|
375
426
|
...(modelId === undefined ? {} : { defaultModel: modelId }),
|
|
376
427
|
});
|
|
377
|
-
await
|
|
378
|
-
await writeFile(settingsFilePath, `${JSON.stringify(settings, null, "\t")}\n`, { encoding: "utf8", mode: 0o600 });
|
|
428
|
+
await writeSettingsFile(agentDir, settings);
|
|
379
429
|
}
|
|
380
430
|
/** Persists the interactive model selection without changing credentials or Provider configuration. */
|
|
381
431
|
export async function saveGlobalModelSelection(agentDir, providerId, modelId) {
|
|
@@ -388,8 +438,27 @@ export async function saveGlobalModelSelection(agentDir, providerId, modelId) {
|
|
|
388
438
|
defaultProvider: normalizedProviderId,
|
|
389
439
|
defaultModel: normalizedModelId,
|
|
390
440
|
});
|
|
391
|
-
await
|
|
392
|
-
|
|
441
|
+
await writeSettingsFile(agentDir, settings);
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Persists a runtime preference in an existing workspace settings file, falling back to user settings when the
|
|
445
|
+
* workspace has no settings file. This keeps an explicit WebUI selection aligned with startup resolution.
|
|
446
|
+
*/
|
|
447
|
+
export async function saveScopedModelSelection(cwd, agentDir, providerId, modelId) {
|
|
448
|
+
const workspaceDir = join(cwd, ".di-code");
|
|
449
|
+
const workspacePath = join(cwd, SETTINGS_PATH);
|
|
450
|
+
const workspaceSettings = await readSettingsFile(workspacePath, SETTINGS_PATH);
|
|
451
|
+
if (workspaceSettings === undefined) {
|
|
452
|
+
await saveGlobalModelSelection(agentDir, providerId, modelId);
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
const normalizedProviderId = requiredString(providerId, "providerId", SETTINGS_PATH);
|
|
456
|
+
const normalizedModelId = requiredString(modelId, "modelId", SETTINGS_PATH);
|
|
457
|
+
await writeSettingsFile(workspaceDir, {
|
|
458
|
+
...workspaceSettings,
|
|
459
|
+
defaultProvider: normalizedProviderId,
|
|
460
|
+
defaultModel: normalizedModelId,
|
|
461
|
+
});
|
|
393
462
|
}
|
|
394
463
|
/** Persists a per-provider/model thinking preference in user settings. */
|
|
395
464
|
export async function saveGlobalThinkingLevel(agentDir, providerId, modelId, level) {
|
|
@@ -407,8 +476,29 @@ export async function saveGlobalThinkingLevel(agentDir, providerId, modelId, lev
|
|
|
407
476
|
},
|
|
408
477
|
},
|
|
409
478
|
};
|
|
410
|
-
await
|
|
411
|
-
|
|
479
|
+
await writeSettingsFile(agentDir, settings);
|
|
480
|
+
}
|
|
481
|
+
/** Persists a thinking preference beside an existing workspace model selection, or in user settings as a fallback. */
|
|
482
|
+
export async function saveScopedThinkingLevel(cwd, agentDir, providerId, modelId, level) {
|
|
483
|
+
const workspaceDir = join(cwd, ".di-code");
|
|
484
|
+
const workspacePath = join(cwd, SETTINGS_PATH);
|
|
485
|
+
const workspaceSettings = await readSettingsFile(workspacePath, SETTINGS_PATH);
|
|
486
|
+
if (workspaceSettings === undefined) {
|
|
487
|
+
await saveGlobalThinkingLevel(agentDir, providerId, modelId, level);
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
const normalizedProviderId = requiredString(providerId, "providerId", SETTINGS_PATH);
|
|
491
|
+
const normalizedModelId = requiredString(modelId, "modelId", SETTINGS_PATH);
|
|
492
|
+
await writeSettingsFile(workspaceDir, {
|
|
493
|
+
...workspaceSettings,
|
|
494
|
+
thinkingLevels: {
|
|
495
|
+
...(workspaceSettings.thinkingLevels ?? {}),
|
|
496
|
+
[normalizedProviderId]: {
|
|
497
|
+
...(workspaceSettings.thinkingLevels?.[normalizedProviderId] ?? {}),
|
|
498
|
+
[normalizedModelId]: level,
|
|
499
|
+
},
|
|
500
|
+
},
|
|
501
|
+
});
|
|
412
502
|
}
|
|
413
503
|
/**
|
|
414
504
|
* Replaces the user-managed `custom` provider while retaining other global
|
|
@@ -432,8 +522,7 @@ export async function saveGlobalCustomProvider(agentDir, input) {
|
|
|
432
522
|
defaultProvider: "custom",
|
|
433
523
|
defaultModel: configuration.models?.[0]?.id,
|
|
434
524
|
});
|
|
435
|
-
await
|
|
436
|
-
await writeFile(settingsFilePath, `${JSON.stringify(settings, null, "\t")}\n`, { encoding: "utf8", mode: 0o600 });
|
|
525
|
+
await writeSettingsFile(agentDir, settings);
|
|
437
526
|
return configuration;
|
|
438
527
|
}
|
|
439
528
|
/**
|
|
@@ -461,8 +550,9 @@ export async function removeGlobalProviderApiKey(agentDir, providerId) {
|
|
|
461
550
|
: { defaultModel: existingSettings.defaultModel }),
|
|
462
551
|
...(existingSettings.thinkingLevels === undefined ? {} : { thinkingLevels: existingSettings.thinkingLevels }),
|
|
463
552
|
...(existingSettings.locale === undefined ? {} : { locale: existingSettings.locale }),
|
|
553
|
+
...(existingSettings.permissionMode === undefined ? {} : { permissionMode: existingSettings.permissionMode }),
|
|
464
554
|
};
|
|
465
|
-
await
|
|
555
|
+
await writeSettingsFile(agentDir, settings);
|
|
466
556
|
return true;
|
|
467
557
|
}
|
|
468
558
|
function resolveConfigValue(value, env) {
|
|
@@ -665,6 +755,7 @@ export async function loadStartupConfiguration(cwd, environment = process.env, a
|
|
|
665
755
|
providers,
|
|
666
756
|
...(settings.thinkingLevels === undefined ? {} : { thinkingLevels: settings.thinkingLevels }),
|
|
667
757
|
...(locale === undefined ? {} : { locale }),
|
|
758
|
+
...(settings.permissionMode === undefined ? {} : { permissionMode: settings.permissionMode }),
|
|
668
759
|
...(defaults === undefined ? {} : { defaults }),
|
|
669
760
|
};
|
|
670
761
|
}
|