@di-code/coding-agent 0.1.7 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +104 -46
- 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,529 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { modelCatalogKey, providerRegistryKey } from "@di-code/builtins";
|
|
3
|
+
import { ProjectTrustStore } from "@di-code/plugin-loader";
|
|
4
|
+
import { addMcpConfig, listMcpConfig, removeMcpConfig } from "../mcp/config.js";
|
|
5
|
+
import { mcpClientServiceKey, mcpConfigServiceKey } from "../mcp/entries.js";
|
|
6
|
+
import { removeGlobalProviderApiKey, resolveStartupRuntime, saveGlobalCustomProvider, saveGlobalLocale, saveGlobalPermissionMode, saveGlobalProviderApiKey, saveScopedModelSelection, saveScopedThinkingLevel, } from "../startup.js";
|
|
7
|
+
import { interactiveResourceServiceKey } from "./interactive-resource-service.js";
|
|
8
|
+
import { pluginManagerKey } from "./plugin-manager-entry.js";
|
|
9
|
+
const BUILTIN_WEB_MANIFEST = Object.freeze({
|
|
10
|
+
protocolVersion: 1,
|
|
11
|
+
bundle: Object.freeze({ source: "builtin", csp: "default-src 'self'" }),
|
|
12
|
+
contributions: Object.freeze([
|
|
13
|
+
{
|
|
14
|
+
id: "workspace-status",
|
|
15
|
+
slot: "app.sidebar",
|
|
16
|
+
version: 1,
|
|
17
|
+
order: 10,
|
|
18
|
+
capability: "ui",
|
|
19
|
+
componentKey: "builtin.workspace-status",
|
|
20
|
+
data: { label: "Workspace status" },
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
id: "session-inspector",
|
|
24
|
+
slot: "session.tree",
|
|
25
|
+
version: 1,
|
|
26
|
+
order: 10,
|
|
27
|
+
capability: "session.read",
|
|
28
|
+
componentKey: "builtin.session-inspector",
|
|
29
|
+
data: { label: "Session inspector" },
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: "assistant-badge",
|
|
33
|
+
slot: "conversation.node",
|
|
34
|
+
version: 1,
|
|
35
|
+
order: 10,
|
|
36
|
+
capability: "conversation.read",
|
|
37
|
+
componentKey: "builtin.assistant-badge",
|
|
38
|
+
data: { label: "Agent activity" },
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
id: "tool-audit",
|
|
42
|
+
slot: "conversation.tool",
|
|
43
|
+
version: 1,
|
|
44
|
+
order: 10,
|
|
45
|
+
capability: "conversation.read",
|
|
46
|
+
componentKey: "builtin.tool-audit",
|
|
47
|
+
data: { label: "Tool audit" },
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: "plugin-diagnostics",
|
|
51
|
+
slot: "settings.panel",
|
|
52
|
+
version: 1,
|
|
53
|
+
order: 10,
|
|
54
|
+
capability: "settings.read",
|
|
55
|
+
componentKey: "builtin.plugin-diagnostics",
|
|
56
|
+
data: { label: "Plugin diagnostics" },
|
|
57
|
+
},
|
|
58
|
+
]),
|
|
59
|
+
});
|
|
60
|
+
const API_BY_PROVIDER = {
|
|
61
|
+
openai: "openai-responses",
|
|
62
|
+
deepseek: "openai-chat-completions",
|
|
63
|
+
kimi: "openai-chat-completions",
|
|
64
|
+
zhipu: "openai-chat-completions",
|
|
65
|
+
anthropic: "anthropic-messages",
|
|
66
|
+
};
|
|
67
|
+
const BUILTIN_PROVIDER_NAMES = {
|
|
68
|
+
openai: "OpenAI",
|
|
69
|
+
anthropic: "Anthropic",
|
|
70
|
+
deepseek: "DeepSeek",
|
|
71
|
+
kimi: "Kimi",
|
|
72
|
+
zhipu: "Zhipu AI",
|
|
73
|
+
};
|
|
74
|
+
const API_KEY_ENV_BY_PROVIDER = {
|
|
75
|
+
openai: "OPENAI_API_KEY",
|
|
76
|
+
anthropic: "ANTHROPIC_API_KEY",
|
|
77
|
+
deepseek: "DEEPSEEK_API_KEY",
|
|
78
|
+
kimi: "KIMI_API_KEY",
|
|
79
|
+
zhipu: "ZAI_API_KEY",
|
|
80
|
+
};
|
|
81
|
+
export function createProductHost(options) {
|
|
82
|
+
let projectTrusted = options.projectTrusted;
|
|
83
|
+
let manager;
|
|
84
|
+
let connected = new Map();
|
|
85
|
+
let disposed = false;
|
|
86
|
+
let startupConfiguration = options.startupConfiguration;
|
|
87
|
+
const listeners = new Set();
|
|
88
|
+
const trustStore = new ProjectTrustStore(join(options.agentDir, "trust.json"));
|
|
89
|
+
const registry = options.context.require(providerRegistryKey);
|
|
90
|
+
const modelCatalog = options.context.require(modelCatalogKey);
|
|
91
|
+
const availableProviders = () => {
|
|
92
|
+
const providers = registry.snapshot().map(({ provider }) => provider);
|
|
93
|
+
for (const [id, name] of Object.entries(BUILTIN_PROVIDER_NAMES)) {
|
|
94
|
+
if (providers.some((provider) => provider.id === id))
|
|
95
|
+
continue;
|
|
96
|
+
const models = modelCatalog.list(id);
|
|
97
|
+
if (models.length)
|
|
98
|
+
providers.push({ id, name, models });
|
|
99
|
+
}
|
|
100
|
+
for (const configured of startupConfiguration?.providers ?? []) {
|
|
101
|
+
if (!providers.some((provider) => provider.id === configured.id) && configured.models) {
|
|
102
|
+
providers.push({ id: configured.id, name: configured.name ?? configured.id, models: configured.models });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (options.provider && !providers.some((provider) => provider.id === options.provider?.id)) {
|
|
106
|
+
providers.push(options.provider);
|
|
107
|
+
}
|
|
108
|
+
return providers;
|
|
109
|
+
};
|
|
110
|
+
const selectRuntime = (providerId, modelId) => {
|
|
111
|
+
try {
|
|
112
|
+
return registry.select(providerId, modelId);
|
|
113
|
+
}
|
|
114
|
+
catch (cause) {
|
|
115
|
+
const provider = options.provider;
|
|
116
|
+
const model = provider?.id === providerId
|
|
117
|
+
? modelId === undefined
|
|
118
|
+
? provider.models[0]
|
|
119
|
+
: provider.models.find((candidate) => candidate.id === modelId)
|
|
120
|
+
: undefined;
|
|
121
|
+
if (provider && model)
|
|
122
|
+
return { provider, model };
|
|
123
|
+
const configured = startupConfiguration?.providers.find((candidate) => candidate.id === providerId);
|
|
124
|
+
if (configured) {
|
|
125
|
+
try {
|
|
126
|
+
return resolveStartupRuntime({}, [configured], { providerId, modelId });
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// Login supplies a credential after model selection, so an incomplete saved entry must not block it.
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const apiKeyEnvironmentVariable = API_KEY_ENV_BY_PROVIDER[providerId];
|
|
133
|
+
if (apiKeyEnvironmentVariable) {
|
|
134
|
+
return resolveStartupRuntime({
|
|
135
|
+
DI_CODE_PROVIDER: providerId,
|
|
136
|
+
...(modelId ? { DI_CODE_MODEL: modelId } : {}),
|
|
137
|
+
[apiKeyEnvironmentVariable]: "pending-web-provider-configuration",
|
|
138
|
+
}, []);
|
|
139
|
+
}
|
|
140
|
+
throw cause;
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
const ensureOpen = () => {
|
|
144
|
+
if (disposed)
|
|
145
|
+
throw new Error("ProductHost has been disposed.");
|
|
146
|
+
};
|
|
147
|
+
const throwIfAborted = (signal) => {
|
|
148
|
+
if (signal?.aborted)
|
|
149
|
+
throw signal.reason ?? new Error("ProductHost operation was cancelled.");
|
|
150
|
+
};
|
|
151
|
+
const emitAudit = (event) => {
|
|
152
|
+
for (const listener of listeners)
|
|
153
|
+
queueMicrotask(() => {
|
|
154
|
+
try {
|
|
155
|
+
Promise.resolve(listener({ type: "product_audit", ...event })).catch(() => undefined);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// Audit observers cannot interrupt a product configuration change.
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
};
|
|
162
|
+
const providerSummary = (provider) => ({
|
|
163
|
+
id: provider.id,
|
|
164
|
+
name: provider.name,
|
|
165
|
+
models: provider.models.map((model) => ({
|
|
166
|
+
id: model.id,
|
|
167
|
+
name: model.name,
|
|
168
|
+
input: [...model.input],
|
|
169
|
+
...(model.reasoningEfforts ? { reasoningEfforts: [...model.reasoningEfforts] } : {}),
|
|
170
|
+
})),
|
|
171
|
+
configured: isProviderConfigured(provider.id),
|
|
172
|
+
});
|
|
173
|
+
const settingsSnapshot = () => {
|
|
174
|
+
const configuration = startupConfiguration;
|
|
175
|
+
const runtime = options.runtimeSnapshot?.() ??
|
|
176
|
+
(options.provider
|
|
177
|
+
? { providerId: options.provider.id, modelId: options.model?.id ?? options.provider.models[0]?.id ?? "" }
|
|
178
|
+
: undefined);
|
|
179
|
+
const allProviders = availableProviders();
|
|
180
|
+
return {
|
|
181
|
+
providers: allProviders.map((provider) => {
|
|
182
|
+
const configured = configuration?.providers.find((item) => item.id === provider.id);
|
|
183
|
+
const key = configured?.apiKey;
|
|
184
|
+
const keySource = key?.match(/^\$\{?([A-Za-z_][A-Za-z0-9_]*)\}?$/)
|
|
185
|
+
? "environment"
|
|
186
|
+
: key
|
|
187
|
+
? "settings"
|
|
188
|
+
: "missing";
|
|
189
|
+
return {
|
|
190
|
+
...providerSummary(provider),
|
|
191
|
+
api: configured?.api ?? API_BY_PROVIDER[provider.id] ?? "",
|
|
192
|
+
...(configured?.baseUrl ? { baseUrl: configured.baseUrl } : {}),
|
|
193
|
+
apiKeySource: keySource,
|
|
194
|
+
};
|
|
195
|
+
}),
|
|
196
|
+
defaults: configuration?.defaults ?? {},
|
|
197
|
+
runtime: runtime ?? { providerId: "uninitialized", modelId: "uninitialized" },
|
|
198
|
+
...(configuration?.locale ? { locale: configuration.locale } : {}),
|
|
199
|
+
permissionMode: configuration?.permissionMode ?? "ask",
|
|
200
|
+
sources: {
|
|
201
|
+
provider: configuration?.environment.DI_CODE_PROVIDER ? "environment" : "settings",
|
|
202
|
+
model: configuration?.environment.DI_CODE_MODEL ? "environment" : "settings",
|
|
203
|
+
locale: configuration?.environment.DI_CODE_LOCALE
|
|
204
|
+
? "environment"
|
|
205
|
+
: configuration?.locale
|
|
206
|
+
? "settings"
|
|
207
|
+
: "default",
|
|
208
|
+
permissionMode: configuration?.permissionMode ? "settings" : "default",
|
|
209
|
+
runtime: "runtime",
|
|
210
|
+
},
|
|
211
|
+
};
|
|
212
|
+
};
|
|
213
|
+
const isProviderConfigured = (providerId) => {
|
|
214
|
+
if (providerId === "faux")
|
|
215
|
+
return options.provider?.id === "faux";
|
|
216
|
+
if (options.provider?.id === providerId)
|
|
217
|
+
return true;
|
|
218
|
+
try {
|
|
219
|
+
const configuration = startupConfiguration;
|
|
220
|
+
const configured = configuration?.providers.find((item) => item.id === providerId);
|
|
221
|
+
if (configuration && configured) {
|
|
222
|
+
resolveStartupRuntime(configuration.environment, [configured], {
|
|
223
|
+
providerId,
|
|
224
|
+
modelId: configured.models?.[0]?.id,
|
|
225
|
+
});
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
resolveStartupRuntime(configuration?.environment ?? process.env, [], { providerId });
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
const connect = async (signal) => {
|
|
236
|
+
throwIfAborted(signal);
|
|
237
|
+
const configurations = await options.context.require(mcpConfigServiceKey).load({
|
|
238
|
+
cwd: options.cwd,
|
|
239
|
+
projectTrusted,
|
|
240
|
+
});
|
|
241
|
+
const service = options.context.require(mcpClientServiceKey);
|
|
242
|
+
if (manager !== undefined)
|
|
243
|
+
await service.close(manager);
|
|
244
|
+
connected = new Map();
|
|
245
|
+
const result = await service.connect(configurations, { signal });
|
|
246
|
+
throwIfAborted(signal);
|
|
247
|
+
manager = result.manager;
|
|
248
|
+
for (const server of result.servers)
|
|
249
|
+
connected.set(server.config.id, {
|
|
250
|
+
tools: server.tools.length,
|
|
251
|
+
resources: server.resources.length,
|
|
252
|
+
prompts: server.prompts.length,
|
|
253
|
+
});
|
|
254
|
+
};
|
|
255
|
+
const listMcpServers = async (signal) => {
|
|
256
|
+
ensureOpen();
|
|
257
|
+
throwIfAborted(signal);
|
|
258
|
+
const configured = await Promise.all(["user", "project", "local"].map((scope) => listMcpConfig(options.cwd, scope)));
|
|
259
|
+
const seen = new Set();
|
|
260
|
+
const result = configured
|
|
261
|
+
.flat()
|
|
262
|
+
.filter((item) => {
|
|
263
|
+
if (seen.has(item.id))
|
|
264
|
+
return false;
|
|
265
|
+
seen.add(item.id);
|
|
266
|
+
return true;
|
|
267
|
+
})
|
|
268
|
+
.map((item) => {
|
|
269
|
+
const stats = connected.get(item.id);
|
|
270
|
+
return {
|
|
271
|
+
id: item.id,
|
|
272
|
+
scope: item.scope,
|
|
273
|
+
state: stats ? "connected" : "disconnected",
|
|
274
|
+
tools: stats?.tools ?? 0,
|
|
275
|
+
resources: stats?.resources ?? 0,
|
|
276
|
+
prompts: stats?.prompts ?? 0,
|
|
277
|
+
};
|
|
278
|
+
});
|
|
279
|
+
throwIfAborted(signal);
|
|
280
|
+
return result;
|
|
281
|
+
};
|
|
282
|
+
const listPlugins = async () => {
|
|
283
|
+
ensureOpen();
|
|
284
|
+
const manager = options.context.get(pluginManagerKey);
|
|
285
|
+
if (!manager)
|
|
286
|
+
return [];
|
|
287
|
+
return (await manager.list()).map((plugin) => ({
|
|
288
|
+
id: plugin.id,
|
|
289
|
+
version: plugin.manifest.version,
|
|
290
|
+
enabled: plugin.enabled,
|
|
291
|
+
installedAt: plugin.installedAt,
|
|
292
|
+
capabilities: Object.keys(plugin.manifest.capabilities).sort(),
|
|
293
|
+
}));
|
|
294
|
+
};
|
|
295
|
+
const getWebContributions = async () => {
|
|
296
|
+
ensureOpen();
|
|
297
|
+
const manager = options.context.get(pluginManagerKey);
|
|
298
|
+
const contributions = [...BUILTIN_WEB_MANIFEST.contributions];
|
|
299
|
+
if (manager && projectTrusted) {
|
|
300
|
+
for (const plugin of await manager.list()) {
|
|
301
|
+
if (plugin.enabled && plugin.manifest.web)
|
|
302
|
+
contributions.push(...plugin.manifest.web.contributions);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
return { ...BUILTIN_WEB_MANIFEST, contributions: Object.freeze(contributions) };
|
|
306
|
+
};
|
|
307
|
+
return {
|
|
308
|
+
state: () => ({ projectTrusted }),
|
|
309
|
+
listProviders: () => {
|
|
310
|
+
return availableProviders().map(providerSummary);
|
|
311
|
+
},
|
|
312
|
+
configureCustomProvider: async (input, signal) => {
|
|
313
|
+
ensureOpen();
|
|
314
|
+
throwIfAborted(signal);
|
|
315
|
+
const configuration = await saveGlobalCustomProvider(options.agentDir, input);
|
|
316
|
+
throwIfAborted(signal);
|
|
317
|
+
startupConfiguration = (await options.reloadConfiguration?.()) ?? startupConfiguration;
|
|
318
|
+
return {
|
|
319
|
+
id: configuration.id,
|
|
320
|
+
name: configuration.name ?? configuration.id,
|
|
321
|
+
models: (configuration.models ?? []).map((model) => ({
|
|
322
|
+
id: model.id,
|
|
323
|
+
name: model.name,
|
|
324
|
+
input: [...model.input],
|
|
325
|
+
})),
|
|
326
|
+
configured: true,
|
|
327
|
+
};
|
|
328
|
+
},
|
|
329
|
+
getSettings: settingsSnapshot,
|
|
330
|
+
setRuntimePreference: async (providerId, modelId) => {
|
|
331
|
+
ensureOpen();
|
|
332
|
+
const selection = selectRuntime(providerId, modelId);
|
|
333
|
+
await saveScopedModelSelection(options.cwd, options.agentDir, selection.provider.id, selection.model.id);
|
|
334
|
+
const refreshed = (await options.reloadRuntime?.()) ?? (await options.reloadConfiguration?.());
|
|
335
|
+
if (refreshed)
|
|
336
|
+
startupConfiguration = refreshed;
|
|
337
|
+
},
|
|
338
|
+
setThinkingLevelPreference: async (providerId, modelId, level) => {
|
|
339
|
+
ensureOpen();
|
|
340
|
+
const selection = selectRuntime(providerId, modelId);
|
|
341
|
+
if (!selection.model.reasoningEfforts?.includes(level))
|
|
342
|
+
throw new Error(`Thinking level "${level}" is not supported by model "${selection.model.id}".`);
|
|
343
|
+
await saveScopedThinkingLevel(options.cwd, options.agentDir, selection.provider.id, selection.model.id, level);
|
|
344
|
+
const refreshed = await options.reloadConfiguration?.();
|
|
345
|
+
if (refreshed)
|
|
346
|
+
startupConfiguration = refreshed;
|
|
347
|
+
},
|
|
348
|
+
setDefaultProvider: async (providerId) => {
|
|
349
|
+
const currentProvider = startupConfiguration?.defaults?.providerId;
|
|
350
|
+
const current = currentProvider === providerId ? startupConfiguration?.defaults?.modelId : undefined;
|
|
351
|
+
await saveScopedModelSelection(options.cwd, options.agentDir, providerId, current ?? selectRuntime(providerId).model.id);
|
|
352
|
+
const refreshed = await options.reloadConfiguration?.();
|
|
353
|
+
if (refreshed)
|
|
354
|
+
startupConfiguration = refreshed;
|
|
355
|
+
},
|
|
356
|
+
setDefaultModel: async (modelId) => {
|
|
357
|
+
const providerId = startupConfiguration?.defaults?.providerId ?? options.provider?.id;
|
|
358
|
+
if (!providerId)
|
|
359
|
+
throw new Error("A default Provider is required before selecting a model.");
|
|
360
|
+
await saveScopedModelSelection(options.cwd, options.agentDir, providerId, modelId);
|
|
361
|
+
const refreshed = await options.reloadConfiguration?.();
|
|
362
|
+
if (refreshed)
|
|
363
|
+
startupConfiguration = refreshed;
|
|
364
|
+
},
|
|
365
|
+
setLocale: async (locale) => {
|
|
366
|
+
await saveGlobalLocale(options.agentDir, locale);
|
|
367
|
+
const refreshed = await options.reloadConfiguration?.();
|
|
368
|
+
if (refreshed)
|
|
369
|
+
startupConfiguration = refreshed;
|
|
370
|
+
},
|
|
371
|
+
setPermissionMode: async (mode) => {
|
|
372
|
+
await saveGlobalPermissionMode(options.agentDir, mode);
|
|
373
|
+
const refreshed = await options.reloadConfiguration?.();
|
|
374
|
+
if (refreshed)
|
|
375
|
+
startupConfiguration = refreshed;
|
|
376
|
+
options.onPermissionModeChange?.(mode);
|
|
377
|
+
},
|
|
378
|
+
login: async (input, signal) => {
|
|
379
|
+
ensureOpen();
|
|
380
|
+
throwIfAborted(signal);
|
|
381
|
+
const selection = selectRuntime(input.providerId, input.modelId);
|
|
382
|
+
const api = (input.api ?? API_BY_PROVIDER[input.providerId]);
|
|
383
|
+
if (!api)
|
|
384
|
+
throw new Error("Provider login API is unavailable.");
|
|
385
|
+
await saveGlobalProviderApiKey(options.agentDir, input.providerId, api, input.apiKey, selection.model.id);
|
|
386
|
+
throwIfAborted(signal);
|
|
387
|
+
const refreshed = await options.reloadRuntime?.();
|
|
388
|
+
if (refreshed)
|
|
389
|
+
startupConfiguration = refreshed;
|
|
390
|
+
throwIfAborted(signal);
|
|
391
|
+
emitAudit({ action: "login", target: input.providerId });
|
|
392
|
+
return providerSummary(selection.provider);
|
|
393
|
+
},
|
|
394
|
+
logout: async (providerId, signal) => {
|
|
395
|
+
ensureOpen();
|
|
396
|
+
throwIfAborted(signal);
|
|
397
|
+
await removeGlobalProviderApiKey(options.agentDir, providerId);
|
|
398
|
+
throwIfAborted(signal);
|
|
399
|
+
const refreshed = await options.reloadRuntime?.();
|
|
400
|
+
if (refreshed)
|
|
401
|
+
startupConfiguration = refreshed;
|
|
402
|
+
emitAudit({ action: "logout", target: providerId });
|
|
403
|
+
},
|
|
404
|
+
getProjectTrust: () => projectTrusted,
|
|
405
|
+
setProjectTrust: async (trusted, signal) => {
|
|
406
|
+
ensureOpen();
|
|
407
|
+
throwIfAborted(signal);
|
|
408
|
+
await trustStore.set(options.cwd, trusted);
|
|
409
|
+
throwIfAborted(signal);
|
|
410
|
+
projectTrusted = trusted;
|
|
411
|
+
await connect(signal).catch((cause) => {
|
|
412
|
+
if (signal?.aborted)
|
|
413
|
+
throw cause;
|
|
414
|
+
});
|
|
415
|
+
await options.refreshResources?.(trusted, signal);
|
|
416
|
+
emitAudit({ action: "set_project_trust", projectTrusted });
|
|
417
|
+
return projectTrusted;
|
|
418
|
+
},
|
|
419
|
+
listContextFiles: async (signal) => {
|
|
420
|
+
ensureOpen();
|
|
421
|
+
throwIfAborted(signal);
|
|
422
|
+
const snapshot = await options.context
|
|
423
|
+
.require(interactiveResourceServiceKey)
|
|
424
|
+
.load({ cwd: options.cwd, agentDir: options.agentDir, projectTrusted });
|
|
425
|
+
const result = snapshot.resources.contextFiles.map((file) => ({
|
|
426
|
+
path: file.path,
|
|
427
|
+
scope: file.scope,
|
|
428
|
+
bytes: Buffer.byteLength(file.content, "utf8"),
|
|
429
|
+
}));
|
|
430
|
+
throwIfAborted(signal);
|
|
431
|
+
return result;
|
|
432
|
+
},
|
|
433
|
+
listMcpServers,
|
|
434
|
+
listPlugins,
|
|
435
|
+
getWebContributions,
|
|
436
|
+
setPluginEnabled: async (pluginId, enabled, signal) => {
|
|
437
|
+
ensureOpen();
|
|
438
|
+
throwIfAborted(signal);
|
|
439
|
+
const manager = options.context.get(pluginManagerKey);
|
|
440
|
+
if (!manager)
|
|
441
|
+
throw new Error("Plugin manager is unavailable.");
|
|
442
|
+
const plugin = enabled
|
|
443
|
+
? await manager.execute({
|
|
444
|
+
action: "enable",
|
|
445
|
+
argument: pluginId,
|
|
446
|
+
stdout: () => undefined,
|
|
447
|
+
stderr: () => undefined,
|
|
448
|
+
})
|
|
449
|
+
: await manager.execute({
|
|
450
|
+
action: "disable",
|
|
451
|
+
argument: pluginId,
|
|
452
|
+
stdout: () => undefined,
|
|
453
|
+
stderr: () => undefined,
|
|
454
|
+
});
|
|
455
|
+
if (plugin !== 0)
|
|
456
|
+
throw new Error(`Unable to ${enabled ? "enable" : "disable"} plugin.`);
|
|
457
|
+
throwIfAborted(signal);
|
|
458
|
+
const updated = (await manager.list()).find((item) => item.id === pluginId);
|
|
459
|
+
if (!updated)
|
|
460
|
+
throw new Error(`Unknown plugin: ${pluginId}`);
|
|
461
|
+
return {
|
|
462
|
+
id: updated.id,
|
|
463
|
+
version: updated.manifest.version,
|
|
464
|
+
enabled: updated.enabled,
|
|
465
|
+
installedAt: updated.installedAt,
|
|
466
|
+
capabilities: Object.keys(updated.manifest.capabilities).sort(),
|
|
467
|
+
};
|
|
468
|
+
},
|
|
469
|
+
configureMcpServer: async (input, signal) => {
|
|
470
|
+
ensureOpen();
|
|
471
|
+
throwIfAborted(signal);
|
|
472
|
+
await addMcpConfig(options.cwd, input.scope, input.serverId, input.config);
|
|
473
|
+
await connect(signal);
|
|
474
|
+
await options.refreshResources?.(undefined, signal);
|
|
475
|
+
emitAudit({ action: "configure_mcp_server", target: input.serverId });
|
|
476
|
+
return ((await listMcpServers()).find((server) => server.id === input.serverId) ?? {
|
|
477
|
+
id: input.serverId,
|
|
478
|
+
scope: input.scope,
|
|
479
|
+
state: "disconnected",
|
|
480
|
+
tools: 0,
|
|
481
|
+
resources: 0,
|
|
482
|
+
prompts: 0,
|
|
483
|
+
});
|
|
484
|
+
},
|
|
485
|
+
removeMcpServer: async (serverId, scope, signal) => {
|
|
486
|
+
ensureOpen();
|
|
487
|
+
throwIfAborted(signal);
|
|
488
|
+
await removeMcpConfig(options.cwd, scope, serverId);
|
|
489
|
+
await connect(signal);
|
|
490
|
+
await options.refreshResources?.(undefined, signal);
|
|
491
|
+
emitAudit({ action: "remove_mcp_server", target: serverId });
|
|
492
|
+
},
|
|
493
|
+
reconnectMcpServer: async (serverId, signal) => {
|
|
494
|
+
ensureOpen();
|
|
495
|
+
throwIfAborted(signal);
|
|
496
|
+
if (!manager)
|
|
497
|
+
await connect(signal);
|
|
498
|
+
if (!manager)
|
|
499
|
+
throw new Error("MCP manager is unavailable.");
|
|
500
|
+
const server = await manager.reconnect(serverId, signal);
|
|
501
|
+
connected.set(serverId, {
|
|
502
|
+
tools: server.tools.length,
|
|
503
|
+
resources: server.resources.length,
|
|
504
|
+
prompts: server.prompts.length,
|
|
505
|
+
});
|
|
506
|
+
await options.refreshResources?.(undefined, signal);
|
|
507
|
+
const info = (await listMcpServers()).find((item) => item.id === serverId);
|
|
508
|
+
if (!info)
|
|
509
|
+
throw new Error(`MCP server "${serverId}" was not found.`);
|
|
510
|
+
emitAudit({ action: "reconnect_mcp_server", target: serverId });
|
|
511
|
+
return info;
|
|
512
|
+
},
|
|
513
|
+
subscribe: (listener) => {
|
|
514
|
+
listeners.add(listener);
|
|
515
|
+
return () => listeners.delete(listener);
|
|
516
|
+
},
|
|
517
|
+
dispose: async () => {
|
|
518
|
+
if (disposed)
|
|
519
|
+
return;
|
|
520
|
+
disposed = true;
|
|
521
|
+
if (manager !== undefined)
|
|
522
|
+
await options.context.require(mcpClientServiceKey).close(manager);
|
|
523
|
+
manager = undefined;
|
|
524
|
+
connected.clear();
|
|
525
|
+
listeners.clear();
|
|
526
|
+
},
|
|
527
|
+
};
|
|
528
|
+
}
|
|
529
|
+
//# sourceMappingURL=product-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-host.js","sourceRoot":"","sources":["../../src/runtime/product-host.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport type { ModelApi, Provider } from \"@di-code/ai\";\nimport { modelCatalogKey, providerRegistryKey } from \"@di-code/builtins\";\nimport type { McpManager } from \"@di-code/mcp\";\nimport { ProjectTrustStore } from \"@di-code/plugin-loader\";\nimport type { Context, WebContribution, WebManifest } from \"@di-code/plugin-runtime\";\nimport { addMcpConfig, listMcpConfig, type McpConfigScope, removeMcpConfig } from \"../mcp/config.ts\";\nimport { mcpClientServiceKey, mcpConfigServiceKey } from \"../mcp/entries.ts\";\nimport type { RpcContextFileInfo, RpcMcpServerInfo, RpcProviderSummary, RpcSettingsSnapshot } from \"../rpc/protocol.ts\";\nimport {\n\tremoveGlobalProviderApiKey,\n\tresolveStartupRuntime,\n\ttype StartupConfiguration,\n\tsaveGlobalCustomProvider,\n\tsaveGlobalLocale,\n\tsaveGlobalPermissionMode,\n\tsaveGlobalProviderApiKey,\n\tsaveScopedModelSelection,\n\tsaveScopedThinkingLevel,\n} from \"../startup.ts\";\nimport { interactiveResourceServiceKey } from \"./interactive-resource-service.ts\";\nimport { pluginManagerKey } from \"./plugin-manager-entry.ts\";\n\nexport interface ProductHostOptions {\n\treadonly context: Context;\n\treadonly cwd: string;\n\treadonly agentDir: string;\n\treadonly projectTrusted: boolean;\n\t/** Current runtime is included even when a test or embeddable host supplied it outside the registry. */\n\treadonly provider?: Provider;\n\treadonly model?: import(\"@di-code/ai\").Model;\n\treadonly runtimeSnapshot?: () => {\n\t\treadonly providerId: string;\n\t\treadonly modelId: string;\n\t\treadonly thinkingLevel?: string;\n\t};\n\t/** Startup settings used to report whether each Provider is actually configured. */\n\treadonly startupConfiguration?: StartupConfiguration;\n\t/** Re-resolves settings and swaps an idle Session runtime after a persisted runtime change. */\n\treadonly reloadRuntime?: () => Promise<StartupConfiguration | undefined>;\n\t/** Re-reads persisted settings without replacing the active Session runtime. */\n\treadonly reloadConfiguration?: () => Promise<StartupConfiguration>;\n\t/** Applies a persisted permission change to the current Session actor. */\n\treadonly onPermissionModeChange?: (mode: \"ask\" | \"allow\" | \"deny\") => void;\n\t/** Refreshes the owning SessionHost after a trust or MCP configuration change. */\n\treadonly refreshResources?: (projectTrusted?: boolean, signal?: AbortSignal) => Promise<void>;\n}\n\nexport type ProductHostAuditAction =\n\t| \"login\"\n\t| \"logout\"\n\t| \"set_project_trust\"\n\t| \"configure_mcp_server\"\n\t| \"remove_mcp_server\"\n\t| \"reconnect_mcp_server\";\n\n/** Redacted state-change notification for UI audit trails. */\nexport interface ProductHostEvent {\n\treadonly type: \"product_audit\";\n\treadonly action: ProductHostAuditAction;\n\treadonly target?: string;\n\treadonly projectTrusted?: boolean;\n}\nexport type ProductHostListener = (event: ProductHostEvent) => void | Promise<void>;\n\nexport interface ProductHost {\n\treadonly state: () => { readonly projectTrusted: boolean };\n\treadonly listProviders: () => readonly RpcProviderSummary[];\n\treadonly getSettings: () => RpcSettingsSnapshot;\n\t/** Persists a validated runtime preference for future CLI and WebUI Sessions. */\n\treadonly setRuntimePreference: (providerId: string, modelId: string) => Promise<void>;\n\t/** Persists a validated per-model thinking preference for future CLI and WebUI Sessions. */\n\treadonly setThinkingLevelPreference: (\n\t\tproviderId: string,\n\t\tmodelId: string,\n\t\tlevel: import(\"@di-code/ai\").ThinkingLevel,\n\t) => Promise<void>;\n\treadonly setDefaultProvider: (providerId: string) => Promise<void>;\n\treadonly setDefaultModel: (modelId: string) => Promise<void>;\n\treadonly setLocale: (locale: \"en\" | \"zh-CN\") => Promise<void>;\n\treadonly setPermissionMode: (mode: \"ask\" | \"allow\" | \"deny\") => Promise<void>;\n\treadonly configureCustomProvider: (\n\t\tinput: {\n\t\t\treadonly api: Exclude<ModelApi, \"faux\">;\n\t\t\treadonly baseUrl: string;\n\t\t\treadonly apiKey: string;\n\t\t\treadonly modelId: string;\n\t\t},\n\t\tsignal?: AbortSignal,\n\t) => Promise<RpcProviderSummary>;\n\treadonly login: (\n\t\tinput: {\n\t\t\treadonly providerId: string;\n\t\t\treadonly apiKey: string;\n\t\t\treadonly modelId?: string;\n\t\t\treadonly api?: string;\n\t\t},\n\t\tsignal?: AbortSignal,\n\t) => Promise<RpcProviderSummary>;\n\treadonly logout: (providerId: string, signal?: AbortSignal) => Promise<void>;\n\treadonly getProjectTrust: () => boolean;\n\treadonly setProjectTrust: (trusted: boolean, signal?: AbortSignal) => Promise<boolean>;\n\treadonly listContextFiles: (signal?: AbortSignal) => Promise<readonly RpcContextFileInfo[]>;\n\treadonly listMcpServers: (signal?: AbortSignal) => Promise<readonly RpcMcpServerInfo[]>;\n\treadonly configureMcpServer: (\n\t\tinput: {\n\t\t\treadonly serverId: string;\n\t\t\treadonly scope: McpConfigScope;\n\t\t\treadonly config: Record<string, unknown>;\n\t\t},\n\t\tsignal?: AbortSignal,\n\t) => Promise<RpcMcpServerInfo>;\n\treadonly removeMcpServer: (serverId: string, scope: McpConfigScope, signal?: AbortSignal) => Promise<void>;\n\treadonly reconnectMcpServer: (serverId: string, signal?: AbortSignal) => Promise<RpcMcpServerInfo>;\n\treadonly listPlugins: () => Promise<readonly RpcPluginInfo[]>;\n\treadonly getWebContributions: () => Promise<WebManifest>;\n\treadonly setPluginEnabled: (pluginId: string, enabled: boolean, signal?: AbortSignal) => Promise<RpcPluginInfo>;\n\treadonly subscribe: (listener: ProductHostListener) => () => void;\n\treadonly dispose: () => Promise<void>;\n}\n\nexport interface RpcPluginInfo {\n\treadonly id: string;\n\treadonly version: string;\n\treadonly enabled: boolean;\n\treadonly installedAt: string;\n\treadonly capabilities: readonly string[];\n}\n\nconst BUILTIN_WEB_MANIFEST = Object.freeze({\n\tprotocolVersion: 1,\n\tbundle: Object.freeze({ source: \"builtin\", csp: \"default-src 'self'\" }),\n\tcontributions: Object.freeze([\n\t\t{\n\t\t\tid: \"workspace-status\",\n\t\t\tslot: \"app.sidebar\",\n\t\t\tversion: 1,\n\t\t\torder: 10,\n\t\t\tcapability: \"ui\",\n\t\t\tcomponentKey: \"builtin.workspace-status\",\n\t\t\tdata: { label: \"Workspace status\" },\n\t\t},\n\t\t{\n\t\t\tid: \"session-inspector\",\n\t\t\tslot: \"session.tree\",\n\t\t\tversion: 1,\n\t\t\torder: 10,\n\t\t\tcapability: \"session.read\",\n\t\t\tcomponentKey: \"builtin.session-inspector\",\n\t\t\tdata: { label: \"Session inspector\" },\n\t\t},\n\t\t{\n\t\t\tid: \"assistant-badge\",\n\t\t\tslot: \"conversation.node\",\n\t\t\tversion: 1,\n\t\t\torder: 10,\n\t\t\tcapability: \"conversation.read\",\n\t\t\tcomponentKey: \"builtin.assistant-badge\",\n\t\t\tdata: { label: \"Agent activity\" },\n\t\t},\n\t\t{\n\t\t\tid: \"tool-audit\",\n\t\t\tslot: \"conversation.tool\",\n\t\t\tversion: 1,\n\t\t\torder: 10,\n\t\t\tcapability: \"conversation.read\",\n\t\t\tcomponentKey: \"builtin.tool-audit\",\n\t\t\tdata: { label: \"Tool audit\" },\n\t\t},\n\t\t{\n\t\t\tid: \"plugin-diagnostics\",\n\t\t\tslot: \"settings.panel\",\n\t\t\tversion: 1,\n\t\t\torder: 10,\n\t\t\tcapability: \"settings.read\",\n\t\t\tcomponentKey: \"builtin.plugin-diagnostics\",\n\t\t\tdata: { label: \"Plugin diagnostics\" },\n\t\t},\n\t] as const),\n}) satisfies WebManifest;\n\nconst API_BY_PROVIDER: Readonly<Record<string, Exclude<ModelApi, \"faux\">>> = {\n\topenai: \"openai-responses\",\n\tdeepseek: \"openai-chat-completions\",\n\tkimi: \"openai-chat-completions\",\n\tzhipu: \"openai-chat-completions\",\n\tanthropic: \"anthropic-messages\",\n};\n\nconst BUILTIN_PROVIDER_NAMES: Readonly<Record<string, string>> = {\n\topenai: \"OpenAI\",\n\tanthropic: \"Anthropic\",\n\tdeepseek: \"DeepSeek\",\n\tkimi: \"Kimi\",\n\tzhipu: \"Zhipu AI\",\n};\n\nconst API_KEY_ENV_BY_PROVIDER: Readonly<Record<string, string>> = {\n\topenai: \"OPENAI_API_KEY\",\n\tanthropic: \"ANTHROPIC_API_KEY\",\n\tdeepseek: \"DEEPSEEK_API_KEY\",\n\tkimi: \"KIMI_API_KEY\",\n\tzhipu: \"ZAI_API_KEY\",\n};\n\nexport function createProductHost(options: ProductHostOptions): ProductHost {\n\tlet projectTrusted = options.projectTrusted;\n\tlet manager: McpManager | undefined;\n\tlet connected = new Map<string, { tools: number; resources: number; prompts: number }>();\n\tlet disposed = false;\n\tlet startupConfiguration = options.startupConfiguration;\n\tconst listeners = new Set<ProductHostListener>();\n\tconst trustStore = new ProjectTrustStore(join(options.agentDir, \"trust.json\"));\n\tconst registry = options.context.require(providerRegistryKey);\n\tconst modelCatalog = options.context.require(modelCatalogKey);\n\ttype ProviderSnapshot = Pick<Provider, \"id\" | \"name\" | \"models\">;\n\tconst availableProviders = (): ProviderSnapshot[] => {\n\t\tconst providers: ProviderSnapshot[] = registry.snapshot().map(({ provider }) => provider);\n\t\tfor (const [id, name] of Object.entries(BUILTIN_PROVIDER_NAMES)) {\n\t\t\tif (providers.some((provider) => provider.id === id)) continue;\n\t\t\tconst models = modelCatalog.list(id);\n\t\t\tif (models.length) providers.push({ id, name, models });\n\t\t}\n\t\tfor (const configured of startupConfiguration?.providers ?? []) {\n\t\t\tif (!providers.some((provider) => provider.id === configured.id) && configured.models) {\n\t\t\t\tproviders.push({ id: configured.id, name: configured.name ?? configured.id, models: configured.models });\n\t\t\t}\n\t\t}\n\t\tif (options.provider && !providers.some((provider) => provider.id === options.provider?.id)) {\n\t\t\tproviders.push(options.provider);\n\t\t}\n\t\treturn providers;\n\t};\n\tconst selectRuntime = (\n\t\tproviderId: string,\n\t\tmodelId?: string,\n\t): { readonly provider: Provider; readonly model: import(\"@di-code/ai\").Model } => {\n\t\ttry {\n\t\t\treturn registry.select(providerId, modelId);\n\t\t} catch (cause) {\n\t\t\tconst provider = options.provider;\n\t\t\tconst model =\n\t\t\t\tprovider?.id === providerId\n\t\t\t\t\t? modelId === undefined\n\t\t\t\t\t\t? provider.models[0]\n\t\t\t\t\t\t: provider.models.find((candidate) => candidate.id === modelId)\n\t\t\t\t\t: undefined;\n\t\t\tif (provider && model) return { provider, model };\n\t\t\tconst configured = startupConfiguration?.providers.find((candidate) => candidate.id === providerId);\n\t\t\tif (configured) {\n\t\t\t\ttry {\n\t\t\t\t\treturn resolveStartupRuntime({}, [configured], { providerId, modelId });\n\t\t\t\t} catch {\n\t\t\t\t\t// Login supplies a credential after model selection, so an incomplete saved entry must not block it.\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst apiKeyEnvironmentVariable = API_KEY_ENV_BY_PROVIDER[providerId];\n\t\t\tif (apiKeyEnvironmentVariable) {\n\t\t\t\treturn resolveStartupRuntime(\n\t\t\t\t\t{\n\t\t\t\t\t\tDI_CODE_PROVIDER: providerId,\n\t\t\t\t\t\t...(modelId ? { DI_CODE_MODEL: modelId } : {}),\n\t\t\t\t\t\t[apiKeyEnvironmentVariable]: \"pending-web-provider-configuration\",\n\t\t\t\t\t},\n\t\t\t\t\t[],\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow cause;\n\t\t}\n\t};\n\tconst ensureOpen = (): void => {\n\t\tif (disposed) throw new Error(\"ProductHost has been disposed.\");\n\t};\n\tconst throwIfAborted = (signal: AbortSignal | undefined): void => {\n\t\tif (signal?.aborted) throw signal.reason ?? new Error(\"ProductHost operation was cancelled.\");\n\t};\n\tconst emitAudit = (event: Omit<ProductHostEvent, \"type\">): 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({ type: \"product_audit\", ...event })).catch(() => undefined);\n\t\t\t\t} catch {\n\t\t\t\t\t// Audit observers cannot interrupt a product configuration change.\n\t\t\t\t}\n\t\t\t});\n\t};\n\tconst providerSummary = (provider: {\n\t\tid: string;\n\t\tname: string;\n\t\tmodels: readonly {\n\t\t\tid: string;\n\t\t\tname: string;\n\t\t\tinput: readonly string[];\n\t\t\treasoningEfforts?: readonly (\"low\" | \"medium\" | \"high\" | \"max\")[];\n\t\t}[];\n\t}): RpcProviderSummary => ({\n\t\tid: provider.id,\n\t\tname: provider.name,\n\t\tmodels: provider.models.map((model) => ({\n\t\t\tid: model.id,\n\t\t\tname: model.name,\n\t\t\tinput: [...model.input],\n\t\t\t...(model.reasoningEfforts ? { reasoningEfforts: [...model.reasoningEfforts] } : {}),\n\t\t})),\n\t\tconfigured: isProviderConfigured(provider.id),\n\t});\n\tconst settingsSnapshot = (): RpcSettingsSnapshot => {\n\t\tconst configuration = startupConfiguration;\n\t\tconst runtime =\n\t\t\toptions.runtimeSnapshot?.() ??\n\t\t\t(options.provider\n\t\t\t\t? { providerId: options.provider.id, modelId: options.model?.id ?? options.provider.models[0]?.id ?? \"\" }\n\t\t\t\t: undefined);\n\t\tconst allProviders = availableProviders();\n\t\treturn {\n\t\t\tproviders: allProviders.map((provider) => {\n\t\t\t\tconst configured = configuration?.providers.find((item) => item.id === provider.id);\n\t\t\t\tconst key = configured?.apiKey;\n\t\t\t\tconst keySource = key?.match(/^\\$\\{?([A-Za-z_][A-Za-z0-9_]*)\\}?$/)\n\t\t\t\t\t? \"environment\"\n\t\t\t\t\t: key\n\t\t\t\t\t\t? \"settings\"\n\t\t\t\t\t\t: \"missing\";\n\t\t\t\treturn {\n\t\t\t\t\t...providerSummary(provider),\n\t\t\t\t\tapi: configured?.api ?? API_BY_PROVIDER[provider.id] ?? \"\",\n\t\t\t\t\t...(configured?.baseUrl ? { baseUrl: configured.baseUrl } : {}),\n\t\t\t\t\tapiKeySource: keySource,\n\t\t\t\t};\n\t\t\t}),\n\t\t\tdefaults: configuration?.defaults ?? {},\n\t\t\truntime: runtime ?? { providerId: \"uninitialized\", modelId: \"uninitialized\" },\n\t\t\t...(configuration?.locale ? { locale: configuration.locale } : {}),\n\t\t\tpermissionMode: configuration?.permissionMode ?? \"ask\",\n\t\t\tsources: {\n\t\t\t\tprovider: configuration?.environment.DI_CODE_PROVIDER ? \"environment\" : \"settings\",\n\t\t\t\tmodel: configuration?.environment.DI_CODE_MODEL ? \"environment\" : \"settings\",\n\t\t\t\tlocale: configuration?.environment.DI_CODE_LOCALE\n\t\t\t\t\t? \"environment\"\n\t\t\t\t\t: configuration?.locale\n\t\t\t\t\t\t? \"settings\"\n\t\t\t\t\t\t: \"default\",\n\t\t\t\tpermissionMode: configuration?.permissionMode ? \"settings\" : \"default\",\n\t\t\t\truntime: \"runtime\",\n\t\t\t},\n\t\t};\n\t};\n\tconst isProviderConfigured = (providerId: string): boolean => {\n\t\tif (providerId === \"faux\") return options.provider?.id === \"faux\";\n\t\tif (options.provider?.id === providerId) return true;\n\t\ttry {\n\t\t\tconst configuration = startupConfiguration;\n\t\t\tconst configured = configuration?.providers.find((item) => item.id === providerId);\n\t\t\tif (configuration && configured) {\n\t\t\t\tresolveStartupRuntime(configuration.environment, [configured], {\n\t\t\t\t\tproviderId,\n\t\t\t\t\tmodelId: configured.models?.[0]?.id,\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tresolveStartupRuntime(configuration?.environment ?? process.env, [], { providerId });\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t};\n\tconst connect = async (signal?: AbortSignal): Promise<void> => {\n\t\tthrowIfAborted(signal);\n\t\tconst configurations = await options.context.require(mcpConfigServiceKey).load({\n\t\t\tcwd: options.cwd,\n\t\t\tprojectTrusted,\n\t\t});\n\t\tconst service = options.context.require(mcpClientServiceKey);\n\t\tif (manager !== undefined) await service.close(manager);\n\t\tconnected = new Map();\n\t\tconst result = await service.connect(configurations, { signal });\n\t\tthrowIfAborted(signal);\n\t\tmanager = result.manager;\n\t\tfor (const server of result.servers)\n\t\t\tconnected.set(server.config.id, {\n\t\t\t\ttools: server.tools.length,\n\t\t\t\tresources: server.resources.length,\n\t\t\t\tprompts: server.prompts.length,\n\t\t\t});\n\t};\n\tconst listMcpServers = async (signal?: AbortSignal): Promise<readonly RpcMcpServerInfo[]> => {\n\t\tensureOpen();\n\t\tthrowIfAborted(signal);\n\t\tconst configured = await Promise.all(\n\t\t\t([\"user\", \"project\", \"local\"] as const).map((scope) => listMcpConfig(options.cwd, scope)),\n\t\t);\n\t\tconst seen = new Set<string>();\n\t\tconst result = configured\n\t\t\t.flat()\n\t\t\t.filter((item) => {\n\t\t\t\tif (seen.has(item.id)) return false;\n\t\t\t\tseen.add(item.id);\n\t\t\t\treturn true;\n\t\t\t})\n\t\t\t.map((item) => {\n\t\t\t\tconst stats = connected.get(item.id);\n\t\t\t\treturn {\n\t\t\t\t\tid: item.id,\n\t\t\t\t\tscope: item.scope,\n\t\t\t\t\tstate: stats ? \"connected\" : \"disconnected\",\n\t\t\t\t\ttools: stats?.tools ?? 0,\n\t\t\t\t\tresources: stats?.resources ?? 0,\n\t\t\t\t\tprompts: stats?.prompts ?? 0,\n\t\t\t\t} satisfies RpcMcpServerInfo;\n\t\t\t});\n\t\tthrowIfAborted(signal);\n\t\treturn result;\n\t};\n\tconst listPlugins = async (): Promise<readonly RpcPluginInfo[]> => {\n\t\tensureOpen();\n\t\tconst manager = options.context.get(pluginManagerKey);\n\t\tif (!manager) return [];\n\t\treturn (await manager.list()).map((plugin) => ({\n\t\t\tid: plugin.id,\n\t\t\tversion: plugin.manifest.version,\n\t\t\tenabled: plugin.enabled,\n\t\t\tinstalledAt: plugin.installedAt,\n\t\t\tcapabilities: Object.keys(plugin.manifest.capabilities).sort(),\n\t\t}));\n\t};\n\tconst getWebContributions = async (): Promise<WebManifest> => {\n\t\tensureOpen();\n\t\tconst manager = options.context.get(pluginManagerKey);\n\t\tconst contributions: WebContribution[] = [...BUILTIN_WEB_MANIFEST.contributions];\n\t\tif (manager && projectTrusted) {\n\t\t\tfor (const plugin of await manager.list()) {\n\t\t\t\tif (plugin.enabled && plugin.manifest.web) contributions.push(...plugin.manifest.web.contributions);\n\t\t\t}\n\t\t}\n\t\treturn { ...BUILTIN_WEB_MANIFEST, contributions: Object.freeze(contributions) };\n\t};\n\treturn {\n\t\tstate: () => ({ projectTrusted }),\n\t\tlistProviders: () => {\n\t\t\treturn availableProviders().map(providerSummary);\n\t\t},\n\t\tconfigureCustomProvider: async (input, signal) => {\n\t\t\tensureOpen();\n\t\t\tthrowIfAborted(signal);\n\t\t\tconst configuration = await saveGlobalCustomProvider(options.agentDir, input);\n\t\t\tthrowIfAborted(signal);\n\t\t\tstartupConfiguration = (await options.reloadConfiguration?.()) ?? startupConfiguration;\n\t\t\treturn {\n\t\t\t\tid: configuration.id,\n\t\t\t\tname: configuration.name ?? configuration.id,\n\t\t\t\tmodels: (configuration.models ?? []).map((model) => ({\n\t\t\t\t\tid: model.id,\n\t\t\t\t\tname: model.name,\n\t\t\t\t\tinput: [...model.input],\n\t\t\t\t})),\n\t\t\t\tconfigured: true,\n\t\t\t};\n\t\t},\n\t\tgetSettings: settingsSnapshot,\n\t\tsetRuntimePreference: async (providerId, modelId) => {\n\t\t\tensureOpen();\n\t\t\tconst selection = selectRuntime(providerId, modelId);\n\t\t\tawait saveScopedModelSelection(options.cwd, options.agentDir, selection.provider.id, selection.model.id);\n\t\t\tconst refreshed = (await options.reloadRuntime?.()) ?? (await options.reloadConfiguration?.());\n\t\t\tif (refreshed) startupConfiguration = refreshed;\n\t\t},\n\t\tsetThinkingLevelPreference: async (providerId, modelId, level) => {\n\t\t\tensureOpen();\n\t\t\tconst selection = selectRuntime(providerId, modelId);\n\t\t\tif (!selection.model.reasoningEfforts?.includes(level))\n\t\t\t\tthrow new Error(`Thinking level \"${level}\" is not supported by model \"${selection.model.id}\".`);\n\t\t\tawait saveScopedThinkingLevel(options.cwd, options.agentDir, selection.provider.id, selection.model.id, level);\n\t\t\tconst refreshed = await options.reloadConfiguration?.();\n\t\t\tif (refreshed) startupConfiguration = refreshed;\n\t\t},\n\t\tsetDefaultProvider: async (providerId) => {\n\t\t\tconst currentProvider = startupConfiguration?.defaults?.providerId;\n\t\t\tconst current = currentProvider === providerId ? startupConfiguration?.defaults?.modelId : undefined;\n\t\t\tawait saveScopedModelSelection(\n\t\t\t\toptions.cwd,\n\t\t\t\toptions.agentDir,\n\t\t\t\tproviderId,\n\t\t\t\tcurrent ?? selectRuntime(providerId).model.id,\n\t\t\t);\n\t\t\tconst refreshed = await options.reloadConfiguration?.();\n\t\t\tif (refreshed) startupConfiguration = refreshed;\n\t\t},\n\t\tsetDefaultModel: async (modelId) => {\n\t\t\tconst providerId = startupConfiguration?.defaults?.providerId ?? options.provider?.id;\n\t\t\tif (!providerId) throw new Error(\"A default Provider is required before selecting a model.\");\n\t\t\tawait saveScopedModelSelection(options.cwd, options.agentDir, providerId, modelId);\n\t\t\tconst refreshed = await options.reloadConfiguration?.();\n\t\t\tif (refreshed) startupConfiguration = refreshed;\n\t\t},\n\t\tsetLocale: async (locale) => {\n\t\t\tawait saveGlobalLocale(options.agentDir, locale);\n\t\t\tconst refreshed = await options.reloadConfiguration?.();\n\t\t\tif (refreshed) startupConfiguration = refreshed;\n\t\t},\n\t\tsetPermissionMode: async (mode) => {\n\t\t\tawait saveGlobalPermissionMode(options.agentDir, mode);\n\t\t\tconst refreshed = await options.reloadConfiguration?.();\n\t\t\tif (refreshed) startupConfiguration = refreshed;\n\t\t\toptions.onPermissionModeChange?.(mode);\n\t\t},\n\t\tlogin: async (input, signal) => {\n\t\t\tensureOpen();\n\t\t\tthrowIfAborted(signal);\n\t\t\tconst selection = selectRuntime(input.providerId, input.modelId);\n\t\t\tconst api = (input.api ?? API_BY_PROVIDER[input.providerId]) as Exclude<ModelApi, \"faux\"> | undefined;\n\t\t\tif (!api) throw new Error(\"Provider login API is unavailable.\");\n\t\t\tawait saveGlobalProviderApiKey(options.agentDir, input.providerId, api, input.apiKey, selection.model.id);\n\t\t\tthrowIfAborted(signal);\n\t\t\tconst refreshed = await options.reloadRuntime?.();\n\t\t\tif (refreshed) startupConfiguration = refreshed;\n\t\t\tthrowIfAborted(signal);\n\t\t\temitAudit({ action: \"login\", target: input.providerId });\n\t\t\treturn providerSummary(selection.provider);\n\t\t},\n\t\tlogout: async (providerId, signal) => {\n\t\t\tensureOpen();\n\t\t\tthrowIfAborted(signal);\n\t\t\tawait removeGlobalProviderApiKey(options.agentDir, providerId);\n\t\t\tthrowIfAborted(signal);\n\t\t\tconst refreshed = await options.reloadRuntime?.();\n\t\t\tif (refreshed) startupConfiguration = refreshed;\n\t\t\temitAudit({ action: \"logout\", target: providerId });\n\t\t},\n\t\tgetProjectTrust: () => projectTrusted,\n\t\tsetProjectTrust: async (trusted, signal) => {\n\t\t\tensureOpen();\n\t\t\tthrowIfAborted(signal);\n\t\t\tawait trustStore.set(options.cwd, trusted);\n\t\t\tthrowIfAborted(signal);\n\t\t\tprojectTrusted = trusted;\n\t\t\tawait connect(signal).catch((cause) => {\n\t\t\t\tif (signal?.aborted) throw cause;\n\t\t\t});\n\t\t\tawait options.refreshResources?.(trusted, signal);\n\t\t\temitAudit({ action: \"set_project_trust\", projectTrusted });\n\t\t\treturn projectTrusted;\n\t\t},\n\t\tlistContextFiles: async (signal) => {\n\t\t\tensureOpen();\n\t\t\tthrowIfAborted(signal);\n\t\t\tconst snapshot = await options.context\n\t\t\t\t.require(interactiveResourceServiceKey)\n\t\t\t\t.load({ cwd: options.cwd, agentDir: options.agentDir, projectTrusted });\n\t\t\tconst result = snapshot.resources.contextFiles.map((file) => ({\n\t\t\t\tpath: file.path,\n\t\t\t\tscope: file.scope,\n\t\t\t\tbytes: Buffer.byteLength(file.content, \"utf8\"),\n\t\t\t}));\n\t\t\tthrowIfAborted(signal);\n\t\t\treturn result;\n\t\t},\n\t\tlistMcpServers,\n\t\tlistPlugins,\n\t\tgetWebContributions,\n\t\tsetPluginEnabled: async (pluginId, enabled, signal) => {\n\t\t\tensureOpen();\n\t\t\tthrowIfAborted(signal);\n\t\t\tconst manager = options.context.get(pluginManagerKey);\n\t\t\tif (!manager) throw new Error(\"Plugin manager is unavailable.\");\n\t\t\tconst plugin = enabled\n\t\t\t\t? await manager.execute({\n\t\t\t\t\t\taction: \"enable\",\n\t\t\t\t\t\targument: pluginId,\n\t\t\t\t\t\tstdout: () => undefined,\n\t\t\t\t\t\tstderr: () => undefined,\n\t\t\t\t\t})\n\t\t\t\t: await manager.execute({\n\t\t\t\t\t\taction: \"disable\",\n\t\t\t\t\t\targument: pluginId,\n\t\t\t\t\t\tstdout: () => undefined,\n\t\t\t\t\t\tstderr: () => undefined,\n\t\t\t\t\t});\n\t\t\tif (plugin !== 0) throw new Error(`Unable to ${enabled ? \"enable\" : \"disable\"} plugin.`);\n\t\t\tthrowIfAborted(signal);\n\t\t\tconst updated = (await manager.list()).find((item) => item.id === pluginId);\n\t\t\tif (!updated) throw new Error(`Unknown plugin: ${pluginId}`);\n\t\t\treturn {\n\t\t\t\tid: updated.id,\n\t\t\t\tversion: updated.manifest.version,\n\t\t\t\tenabled: updated.enabled,\n\t\t\t\tinstalledAt: updated.installedAt,\n\t\t\t\tcapabilities: Object.keys(updated.manifest.capabilities).sort(),\n\t\t\t};\n\t\t},\n\t\tconfigureMcpServer: async (input, signal) => {\n\t\t\tensureOpen();\n\t\t\tthrowIfAborted(signal);\n\t\t\tawait addMcpConfig(options.cwd, input.scope, input.serverId, input.config);\n\t\t\tawait connect(signal);\n\t\t\tawait options.refreshResources?.(undefined, signal);\n\t\t\temitAudit({ action: \"configure_mcp_server\", target: input.serverId });\n\t\t\treturn (\n\t\t\t\t(await listMcpServers()).find((server) => server.id === input.serverId) ?? {\n\t\t\t\t\tid: input.serverId,\n\t\t\t\t\tscope: input.scope,\n\t\t\t\t\tstate: \"disconnected\",\n\t\t\t\t\ttools: 0,\n\t\t\t\t\tresources: 0,\n\t\t\t\t\tprompts: 0,\n\t\t\t\t}\n\t\t\t);\n\t\t},\n\t\tremoveMcpServer: async (serverId, scope, signal) => {\n\t\t\tensureOpen();\n\t\t\tthrowIfAborted(signal);\n\t\t\tawait removeMcpConfig(options.cwd, scope, serverId);\n\t\t\tawait connect(signal);\n\t\t\tawait options.refreshResources?.(undefined, signal);\n\t\t\temitAudit({ action: \"remove_mcp_server\", target: serverId });\n\t\t},\n\t\treconnectMcpServer: async (serverId, signal) => {\n\t\t\tensureOpen();\n\t\t\tthrowIfAborted(signal);\n\t\t\tif (!manager) await connect(signal);\n\t\t\tif (!manager) throw new Error(\"MCP manager is unavailable.\");\n\t\t\tconst server = await manager.reconnect(serverId, signal);\n\t\t\tconnected.set(serverId, {\n\t\t\t\ttools: server.tools.length,\n\t\t\t\tresources: server.resources.length,\n\t\t\t\tprompts: server.prompts.length,\n\t\t\t});\n\t\t\tawait options.refreshResources?.(undefined, signal);\n\t\t\tconst info = (await listMcpServers()).find((item) => item.id === serverId);\n\t\t\tif (!info) throw new Error(`MCP server \"${serverId}\" was not found.`);\n\t\t\temitAudit({ action: \"reconnect_mcp_server\", target: serverId });\n\t\t\treturn info;\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\tif (manager !== undefined) await options.context.require(mcpClientServiceKey).close(manager);\n\t\t\tmanager = undefined;\n\t\t\tconnected.clear();\n\t\t\tlisteners.clear();\n\t\t},\n\t};\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ToolApprovalCapability } from "@di-code/builtins";
|
|
2
|
+
import { type Context, type Disposer } from "@di-code/plugin-runtime";
|
|
3
|
+
import type { SkillResource } from "../core/resources/types.ts";
|
|
4
|
+
import { type AgentSessionOptions, type AgentSessionTool } from "../core/session.ts";
|
|
5
|
+
export interface CompositionSessionOptions extends Omit<AgentSessionOptions, "tools" | "skills"> {
|
|
6
|
+
readonly skills?: readonly SkillResource[];
|
|
7
|
+
/** MCP tools already adapted by the product integration layer. */
|
|
8
|
+
readonly externalTools?: readonly AgentSessionTool[];
|
|
9
|
+
/** Per-session approval boundary; defaults to the composition capability. */
|
|
10
|
+
readonly toolApproval?: ToolApprovalCapability;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Installs the product AgentSession implementation behind the composition factory.
|
|
14
|
+
* Each session receives an isolated Context and immutable tool snapshot; the factory disposer releases all scopes.
|
|
15
|
+
*/
|
|
16
|
+
export declare function installAgentSessionFactory(context: Context): Disposer;
|
|
17
|
+
//# sourceMappingURL=session-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-factory.d.ts","sourceRoot":"","sources":["../../src/runtime/session-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAKN,KAAK,sBAAsB,EAM3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAgB,KAAK,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEnG,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,mBAAmB,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC/F,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,kEAAkE;IAClE,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACrD,6EAA6E;IAC7E,QAAQ,CAAC,YAAY,CAAC,EAAE,sBAAsB,CAAC;CAC/C;AAaD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAgErE"}
|