@di-code/coding-agent 0.1.9 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/compositions/base.yml +3 -0
- package/dist/compositions.d.ts.map +1 -1
- package/dist/compositions.js +2 -0
- package/dist/compositions.js.map +1 -1
- package/dist/core/image-input.d.ts +1 -1
- package/dist/core/image-input.d.ts.map +1 -1
- package/dist/core/image-input.js +15 -4
- package/dist/core/image-input.js.map +1 -1
- package/dist/core/session/session-manager.d.ts +18 -1
- package/dist/core/session/session-manager.d.ts.map +1 -1
- package/dist/core/session/session-manager.js +90 -1
- package/dist/core/session/session-manager.js.map +1 -1
- package/dist/core/session/session-storage.d.ts +2 -0
- package/dist/core/session/session-storage.d.ts.map +1 -1
- package/dist/core/session/session-storage.js +34 -2
- package/dist/core/session/session-storage.js.map +1 -1
- package/dist/core/session/types.d.ts +16 -1
- package/dist/core/session/types.d.ts.map +1 -1
- package/dist/core/session/types.js.map +1 -1
- package/dist/core/session.d.ts +27 -2
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +59 -0
- package/dist/core/session.js.map +1 -1
- package/dist/entry.js +1 -1
- package/dist/entry.js.map +1 -1
- package/dist/i18n.js +4 -4
- package/dist/i18n.js.map +1 -1
- package/dist/interactive-host-entry.d.ts.map +1 -1
- package/dist/interactive-host-entry.js +107 -12
- package/dist/interactive-host-entry.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +8 -1
- package/dist/main.js.map +1 -1
- package/dist/mcp/config.d.ts.map +1 -1
- package/dist/mcp/config.js +19 -0
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp-command-entry.d.ts +8 -0
- package/dist/mcp-command-entry.d.ts.map +1 -0
- package/dist/mcp-command-entry.js +56 -0
- package/dist/mcp-command-entry.js.map +1 -0
- package/dist/modes/interactive-components.d.ts +8 -0
- package/dist/modes/interactive-components.d.ts.map +1 -1
- package/dist/modes/interactive-components.js +7 -2
- package/dist/modes/interactive-components.js.map +1 -1
- package/dist/modes/interactive-state.d.ts.map +1 -1
- package/dist/modes/interactive-state.js +1 -4
- package/dist/modes/interactive-state.js.map +1 -1
- package/dist/modes/interactive.d.ts +4 -0
- package/dist/modes/interactive.d.ts.map +1 -1
- package/dist/modes/interactive.js +69 -0
- package/dist/modes/interactive.js.map +1 -1
- package/dist/modes/tree-selector.d.ts.map +1 -1
- package/dist/modes/tree-selector.js +5 -4
- package/dist/modes/tree-selector.js.map +1 -1
- package/dist/rpc/client.d.ts +2 -0
- package/dist/rpc/client.d.ts.map +1 -1
- package/dist/rpc/client.js +3 -0
- package/dist/rpc/client.js.map +1 -1
- package/dist/rpc/dispatcher.d.ts +14 -0
- package/dist/rpc/dispatcher.d.ts.map +1 -1
- package/dist/rpc/dispatcher.js +222 -7
- package/dist/rpc/dispatcher.js.map +1 -1
- package/dist/rpc/protocol.d.ts +12 -5
- package/dist/rpc/protocol.d.ts.map +1 -1
- package/dist/rpc/protocol.js +56 -0
- package/dist/rpc/protocol.js.map +1 -1
- package/dist/rpc/server.d.ts +5 -0
- package/dist/rpc/server.d.ts.map +1 -1
- package/dist/rpc/server.js +4 -0
- package/dist/rpc/server.js.map +1 -1
- package/dist/rpc-server-entry.d.ts.map +1 -1
- package/dist/rpc-server-entry.js +15 -1
- package/dist/rpc-server-entry.js.map +1 -1
- package/dist/runtime/product-host.d.ts +7 -0
- package/dist/runtime/product-host.d.ts.map +1 -1
- package/dist/runtime/product-host.js +29 -9
- package/dist/runtime/product-host.js.map +1 -1
- package/dist/runtime/session-factory.d.ts +18 -2
- package/dist/runtime/session-factory.d.ts.map +1 -1
- package/dist/runtime/session-factory.js +286 -23
- package/dist/runtime/session-factory.js.map +1 -1
- package/dist/runtime/session-host.d.ts +46 -1
- package/dist/runtime/session-host.d.ts.map +1 -1
- package/dist/runtime/session-host.js +38 -6
- package/dist/runtime/session-host.js.map +1 -1
- package/dist/ui-host.d.ts.map +1 -1
- package/dist/ui-host.js +3 -0
- package/dist/ui-host.js.map +1 -1
- package/dist/web/assets/index-C2SOU925.css +1 -0
- package/dist/web/assets/index-knXkInvO.js +41 -0
- package/dist/web/assets/index-knXkInvO.js.map +1 -0
- package/dist/web/index.html +2 -2
- package/dist/web-command.d.ts.map +1 -1
- package/dist/web-command.js +8 -1
- package/dist/web-command.js.map +1 -1
- package/dist/webui-entry.js +9 -1
- package/dist/webui-entry.js.map +1 -1
- package/dist/webui.d.ts +10 -0
- package/dist/webui.d.ts.map +1 -1
- package/dist/webui.js +21 -0
- package/dist/webui.js.map +1 -1
- package/package.json +11 -9
- package/dist/web/assets/index-BwfuGMvv.css +0 -1
- package/dist/web/assets/index-DPUaJqFJ.js +0 -41
- package/dist/web/assets/index-DPUaJqFJ.js.map +0 -1
package/dist/web/index.html
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<meta name="color-scheme" content="dark light" />
|
|
7
7
|
<title>di-code</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-knXkInvO.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/assets/index-C2SOU925.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
<div id="root"></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-command.d.ts","sourceRoot":"","sources":["../src/web-command.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"web-command.d.ts","sourceRoot":"","sources":["../src/web-command.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAS3C,OAAO,EAGN,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,MAAM,cAAc,CAAC;AAGtB,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC,CAAC;AAEhE,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,oBAAoB,GAAG,cAAc,CAMrF;AAgCD,iGAAiG;AACjG,wBAAsB,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAsDxE"}
|
package/dist/web-command.js
CHANGED
|
@@ -9,6 +9,7 @@ import { createRootContext } from "@di-code/plugin-runtime";
|
|
|
9
9
|
import { importCompositionModule, resolveCompositionEntries, resolveManagedCompositionEntries, } from "./compositions.js";
|
|
10
10
|
import { createProjectTrustStore } from "./project-trust-entry.js";
|
|
11
11
|
import { disposeRpcComposition } from "./rpc/lifecycle.js";
|
|
12
|
+
import { pluginInventoryKey } from "./runtime/plugin-inventory-service.js";
|
|
12
13
|
import { loadStartupConfiguration, resolveStartupRuntime, } from "./startup.js";
|
|
13
14
|
import { WebUiServer } from "./webui.js";
|
|
14
15
|
/** Starts the Web settings flow with Faux when no configured runtime can be created yet. */
|
|
@@ -63,7 +64,7 @@ export async function runWebCommand(command) {
|
|
|
63
64
|
...(await resolveCompositionEntries("webui", {
|
|
64
65
|
cwd: allowedRoot,
|
|
65
66
|
agentDir,
|
|
66
|
-
includeProjectComposition:
|
|
67
|
+
includeProjectComposition: true,
|
|
67
68
|
allowedRoot,
|
|
68
69
|
})),
|
|
69
70
|
...(await resolveManagedCompositionEntries(agentDir)),
|
|
@@ -74,6 +75,7 @@ export async function runWebCommand(command) {
|
|
|
74
75
|
let server;
|
|
75
76
|
try {
|
|
76
77
|
await loader.load();
|
|
78
|
+
context.require(pluginInventoryKey).set(loader.tree.snapshot());
|
|
77
79
|
const configuration = await loadStartupConfiguration(allowedRoot, process.env, agentDir);
|
|
78
80
|
const runtime = resolveWebRuntime(configuration);
|
|
79
81
|
server = new WebUiServer({
|
|
@@ -89,6 +91,11 @@ export async function runWebCommand(command) {
|
|
|
89
91
|
token: randomBytes(32).toString("base64url"),
|
|
90
92
|
staticRoot: await webAssetRoot(),
|
|
91
93
|
developmentOrigin: developmentOrigin(),
|
|
94
|
+
onProjectTrustChange: async (trusted) => {
|
|
95
|
+
if (trusted)
|
|
96
|
+
await loader.loadTrustedProjectEntries();
|
|
97
|
+
context.require(pluginInventoryKey).set(loader.tree.snapshot());
|
|
98
|
+
},
|
|
92
99
|
});
|
|
93
100
|
const address = await server.listen();
|
|
94
101
|
process.stdout.write(`Web server listening at http://${address.host}:${address.port}\n`);
|
package/dist/web-command.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-command.js","sourceRoot":"","sources":["../src/web-command.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"web-command.js","sourceRoot":"","sources":["../src/web-command.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { access } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { workspaceCapabilityKey } from \"@di-code/builtins\";\nimport { createCompositionLoader } from \"@di-code/plugin-loader\";\nimport { createRootContext } from \"@di-code/plugin-runtime\";\nimport type { CliCommand } from \"./cli.ts\";\nimport {\n\timportCompositionModule,\n\tresolveCompositionEntries,\n\tresolveManagedCompositionEntries,\n} from \"./compositions.ts\";\nimport { createProjectTrustStore } from \"./project-trust-entry.ts\";\nimport { disposeRpcComposition } from \"./rpc/lifecycle.ts\";\nimport { pluginInventoryKey } from \"./runtime/plugin-inventory-service.ts\";\nimport {\n\tloadStartupConfiguration,\n\tresolveStartupRuntime,\n\ttype StartupConfiguration,\n\ttype StartupRuntime,\n} from \"./startup.ts\";\nimport { WebUiServer } from \"./webui.ts\";\n\ntype WebCommand = Extract<CliCommand, { readonly kind: \"web\" }>;\n\n/** Starts the Web settings flow with Faux when no configured runtime can be created yet. */\nexport function resolveWebRuntime(configuration: StartupConfiguration): StartupRuntime {\n\ttry {\n\t\treturn resolveStartupRuntime(configuration.environment, configuration.providers, configuration.defaults);\n\t} catch {\n\t\treturn resolveStartupRuntime({ DI_CODE_PROVIDER: \"faux\" }, []);\n\t}\n}\n\nasync function webAssetRoot(): Promise<string> {\n\tif (process.env.DI_CODE_WEB_STATIC_ROOT) return await existingDirectory(process.env.DI_CODE_WEB_STATIC_ROOT);\n\tconst moduleDirectory = dirname(fileURLToPath(import.meta.url));\n\tfor (const candidate of [join(moduleDirectory, \"web\"), resolve(moduleDirectory, \"../dist/web\")]) {\n\t\ttry {\n\t\t\treturn await existingDirectory(candidate);\n\t\t} catch {}\n\t}\n\tthrow new Error(\"Web assets are missing. Reinstall @di-code/coding-agent or run npm run build.\");\n}\n\nasync function existingDirectory(path: string): Promise<string> {\n\tawait access(resolve(path));\n\treturn resolve(path);\n}\n\nfunction developmentOrigin(): string | undefined {\n\tconst value = process.env.DI_CODE_WEB_DEV_ORIGIN;\n\tif (!value) return undefined;\n\tlet origin: URL;\n\ttry {\n\t\torigin = new URL(value);\n\t} catch {\n\t\tthrow new Error(\"DI_CODE_WEB_DEV_ORIGIN must be an http loopback origin.\");\n\t}\n\tif (origin.protocol !== \"http:\" || (origin.hostname !== \"127.0.0.1\" && origin.hostname !== \"::1\"))\n\t\tthrow new Error(\"DI_CODE_WEB_DEV_ORIGIN must be an http loopback origin.\");\n\treturn origin.origin;\n}\n\n/** Starts the local same-origin SPA, HTTP/SSE RPC transport, boot route, and health endpoint. */\nexport async function runWebCommand(command: WebCommand): Promise<number> {\n\tconst allowedRoot = resolve(process.cwd());\n\tconst agentDir = resolve(join(homedir(), \".di-code\"));\n\tconst projectTrusted = (await createProjectTrustStore(join(agentDir, \"trust.json\")).get(allowedRoot)) === true;\n\tconst context = createRootContext({ id: \"web-profile\", mode: \"webui\", trustedProject: projectTrusted });\n\tconst loader = createCompositionLoader({\n\t\tcontext,\n\t\tentries: [\n\t\t\t...(await resolveCompositionEntries(\"webui\", {\n\t\t\t\tcwd: allowedRoot,\n\t\t\t\tagentDir,\n\t\t\t\tincludeProjectComposition: true,\n\t\t\t\tallowedRoot,\n\t\t\t})),\n\t\t\t...(await resolveManagedCompositionEntries(agentDir)),\n\t\t],\n\t\timportModule: importCompositionModule,\n\t\tprojectTrusted,\n\t});\n\tlet server: WebUiServer | undefined;\n\ttry {\n\t\tawait loader.load();\n\t\tcontext.require(pluginInventoryKey).set(loader.tree.snapshot());\n\t\tconst configuration = await loadStartupConfiguration(allowedRoot, process.env, agentDir);\n\t\tconst runtime = resolveWebRuntime(configuration);\n\t\tserver = new WebUiServer({\n\t\t\tcontext,\n\t\t\tallowedRoot: context.require(workspaceCapabilityKey).allowedRoot,\n\t\t\tallowedWorkspaces: command.workspaces,\n\t\t\tagentDir,\n\t\t\tworkspaceRegistryDir: resolve(join(homedir(), \".di-code\")),\n\t\t\tprovider: runtime.provider,\n\t\t\tmodel: runtime.model,\n\t\t\tprojectTrusted,\n\t\t\tport: command.port,\n\t\t\ttoken: randomBytes(32).toString(\"base64url\"),\n\t\t\tstaticRoot: await webAssetRoot(),\n\t\t\tdevelopmentOrigin: developmentOrigin(),\n\t\t\tonProjectTrustChange: async (trusted) => {\n\t\t\t\tif (trusted) await loader.loadTrustedProjectEntries();\n\t\t\t\tcontext.require(pluginInventoryKey).set(loader.tree.snapshot());\n\t\t\t},\n\t\t});\n\t\tconst address = await server.listen();\n\t\tprocess.stdout.write(`Web server listening at http://${address.host}:${address.port}\\n`);\n\t\tawait waitForSignal();\n\t\treturn 0;\n\t} finally {\n\t\tawait server?.close();\n\t\tawait disposeRpcComposition(\n\t\t\t() => loader.dispose(),\n\t\t\t() => context.dispose(),\n\t\t);\n\t}\n}\n\nfunction waitForSignal(): Promise<void> {\n\treturn new Promise((resolveSignal) => {\n\t\tconst done = (): void => {\n\t\t\tprocess.off(\"SIGINT\", done);\n\t\t\tprocess.off(\"SIGTERM\", done);\n\t\t\tresolveSignal();\n\t\t};\n\t\tprocess.once(\"SIGINT\", done);\n\t\tprocess.once(\"SIGTERM\", done);\n\t});\n}\n"]}
|
package/dist/webui-entry.js
CHANGED
|
@@ -7,6 +7,7 @@ import { createRootContext } from "@di-code/plugin-runtime";
|
|
|
7
7
|
import { importCompositionModule, resolveCompositionEntries, resolveManagedCompositionEntries, } from "./compositions.js";
|
|
8
8
|
import { createProjectTrustStore } from "./project-trust-entry.js";
|
|
9
9
|
import { disposeRpcComposition } from "./rpc/lifecycle.js";
|
|
10
|
+
import { pluginInventoryKey } from "./runtime/plugin-inventory-service.js";
|
|
10
11
|
import { loadStartupConfiguration, resolveStartupRuntime } from "./startup.js";
|
|
11
12
|
import { WebUiServer } from "./webui.js";
|
|
12
13
|
const allowedRoot = resolve(process.cwd());
|
|
@@ -31,7 +32,7 @@ try {
|
|
|
31
32
|
...(await resolveCompositionEntries("webui", {
|
|
32
33
|
cwd: allowedRoot,
|
|
33
34
|
agentDir,
|
|
34
|
-
includeProjectComposition:
|
|
35
|
+
includeProjectComposition: true,
|
|
35
36
|
allowedRoot,
|
|
36
37
|
})),
|
|
37
38
|
...(await resolveManagedCompositionEntries(agentDir)),
|
|
@@ -40,6 +41,7 @@ try {
|
|
|
40
41
|
projectTrusted,
|
|
41
42
|
});
|
|
42
43
|
await loader.load();
|
|
44
|
+
context.require(pluginInventoryKey).set(loader.tree.snapshot());
|
|
43
45
|
const configuration = await loadStartupConfiguration(allowedRoot, process.env, agentDir);
|
|
44
46
|
const runtime = resolveStartupRuntime(configuration.environment, configuration.providers, configuration.defaults);
|
|
45
47
|
server = new WebUiServer({
|
|
@@ -54,6 +56,12 @@ try {
|
|
|
54
56
|
port,
|
|
55
57
|
token,
|
|
56
58
|
allowRemote,
|
|
59
|
+
onProjectTrustChange: async (trusted) => {
|
|
60
|
+
if (trusted)
|
|
61
|
+
await loader?.loadTrustedProjectEntries();
|
|
62
|
+
if (loader && context)
|
|
63
|
+
context.require(pluginInventoryKey).set(loader.tree.snapshot());
|
|
64
|
+
},
|
|
57
65
|
});
|
|
58
66
|
const address = await server.listen();
|
|
59
67
|
process.stderr.write(`WebUI listening on http://${address.host}:${address.port}\n`);
|
package/dist/webui-entry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webui-entry.js","sourceRoot":"","sources":["../src/webui-entry.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EACN,uBAAuB,EACvB,yBAAyB,EACzB,gCAAgC,GAChC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;AACtD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;AAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,WAAW,CAAC;AAC3D,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,GAAG,CAAC;AACnE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;AACpH,IAAI,MAA+B,CAAC;AACpC,IAAI,MAA8D,CAAC;AACnE,IAAI,OAAyD,CAAC;AAE9D,IAAI,CAAC;IACJ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,MAAM;QAC3D,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC3D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;QAC3C,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC7E,MAAM,cAAc,GAAG,CAAC,MAAM,uBAAuB,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,KAAK,IAAI,CAAC;IAC/G,OAAO,GAAG,iBAAiB,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC;IACpG,MAAM,GAAG,uBAAuB,CAAC;QAChC,OAAO;QACP,OAAO,EAAE;YACR,GAAG,CAAC,MAAM,yBAAyB,CAAC,OAAO,EAAE;gBAC5C,GAAG,EAAE,WAAW;gBAChB,QAAQ;gBACR,yBAAyB,EAAE,
|
|
1
|
+
{"version":3,"file":"webui-entry.js","sourceRoot":"","sources":["../src/webui-entry.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { workspaceCapabilityKey } from \"@di-code/builtins\";\nimport { createCompositionLoader } from \"@di-code/plugin-loader\";\nimport { createRootContext } from \"@di-code/plugin-runtime\";\nimport {\n\timportCompositionModule,\n\tresolveCompositionEntries,\n\tresolveManagedCompositionEntries,\n} from \"./compositions.ts\";\nimport { createProjectTrustStore } from \"./project-trust-entry.ts\";\nimport { disposeRpcComposition } from \"./rpc/lifecycle.ts\";\nimport { pluginInventoryKey } from \"./runtime/plugin-inventory-service.ts\";\nimport { loadStartupConfiguration, resolveStartupRuntime } from \"./startup.ts\";\nimport { WebUiServer } from \"./webui.ts\";\n\nconst allowedRoot = resolve(process.cwd());\nconst agentDir = resolve(join(homedir(), \".di-code\"));\nconst token = process.env.DI_CODE_WEBUI_TOKEN;\nconst host = process.env.DI_CODE_WEBUI_HOST ?? \"127.0.0.1\";\nconst allowRemote = process.env.DI_CODE_WEBUI_ALLOW_REMOTE === \"1\";\nconst port = process.env.DI_CODE_WEBUI_PORT === undefined ? 0 : Number.parseInt(process.env.DI_CODE_WEBUI_PORT, 10);\nlet server: WebUiServer | undefined;\nlet loader: ReturnType<typeof createCompositionLoader> | undefined;\nlet context: ReturnType<typeof createRootContext> | undefined;\n\ntry {\n\tif (!Number.isSafeInteger(port) || port < 0 || port > 65_535)\n\t\tthrow new Error(\"DI_CODE_WEBUI_PORT must be a TCP port.\");\n\tif (token === undefined || token.length < 32)\n\t\tthrow new Error(\"DI_CODE_WEBUI_TOKEN must contain at least 32 characters.\");\n\tconst projectTrusted = (await createProjectTrustStore(join(agentDir, \"trust.json\")).get(allowedRoot)) === true;\n\tcontext = createRootContext({ id: \"webui-profile\", mode: \"webui\", trustedProject: projectTrusted });\n\tloader = createCompositionLoader({\n\t\tcontext,\n\t\tentries: [\n\t\t\t...(await resolveCompositionEntries(\"webui\", {\n\t\t\t\tcwd: allowedRoot,\n\t\t\t\tagentDir,\n\t\t\t\tincludeProjectComposition: true,\n\t\t\t\tallowedRoot,\n\t\t\t})),\n\t\t\t...(await resolveManagedCompositionEntries(agentDir)),\n\t\t],\n\t\timportModule: importCompositionModule,\n\t\tprojectTrusted,\n\t});\n\tawait loader.load();\n\tcontext.require(pluginInventoryKey).set(loader.tree.snapshot());\n\tconst configuration = await loadStartupConfiguration(allowedRoot, process.env, agentDir);\n\tconst runtime = resolveStartupRuntime(configuration.environment, configuration.providers, configuration.defaults);\n\tserver = new WebUiServer({\n\t\tcontext,\n\t\tallowedRoot: context.require(workspaceCapabilityKey).allowedRoot,\n\t\tagentDir,\n\t\tworkspaceRegistryDir: resolve(join(homedir(), \".di-code\")),\n\t\tprovider: runtime.provider,\n\t\tmodel: runtime.model,\n\t\tprojectTrusted,\n\t\thost,\n\t\tport,\n\t\ttoken,\n\t\tallowRemote,\n\t\tonProjectTrustChange: async (trusted) => {\n\t\t\tif (trusted) await loader?.loadTrustedProjectEntries();\n\t\t\tif (loader && context) context.require(pluginInventoryKey).set(loader.tree.snapshot());\n\t\t},\n\t});\n\tconst address = await server.listen();\n\tprocess.stderr.write(`WebUI listening on http://${address.host}:${address.port}\\n`);\n\tawait new Promise<void>((resolvePromise) => {\n\t\tprocess.once(\"SIGINT\", resolvePromise);\n\t\tprocess.once(\"SIGTERM\", resolvePromise);\n\t});\n} catch (cause) {\n\tprocess.stderr.write(`${cause instanceof Error ? cause.message : \"WebUI startup failed.\"}\\n`);\n\tprocess.exitCode = 1;\n} finally {\n\tawait server?.close();\n\tawait disposeRpcComposition(\n\t\t() => loader?.dispose(),\n\t\t() => context?.dispose(),\n\t);\n}\n"]}
|
package/dist/webui.d.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import type { Context } from "@di-code/plugin-runtime";
|
|
2
|
+
import { type UserInteractionInput, type UserInteractionResult } from "@di-code/plugin-sdk";
|
|
2
3
|
import { type SessionHostBootstrapOptions } from "./runtime/session-host.ts";
|
|
4
|
+
/** Web hosts expose the same structured interaction facade as RPC and TUI. */
|
|
5
|
+
export interface WebInteractionFacade {
|
|
6
|
+
readonly request: (input: Omit<UserInteractionInput, "requestId"> & {
|
|
7
|
+
readonly requestId?: string;
|
|
8
|
+
}, signal?: AbortSignal) => Promise<UserInteractionResult>;
|
|
9
|
+
readonly answer: (requestId: string, result: Omit<UserInteractionResult, "requestId">) => boolean;
|
|
10
|
+
}
|
|
3
11
|
export interface WebUiServerOptions extends Omit<SessionHostBootstrapOptions, "cwd" | "principal" | "toolApproval"> {
|
|
4
12
|
readonly context: Context;
|
|
5
13
|
readonly allowedRoot: string;
|
|
@@ -27,6 +35,8 @@ export interface WebUiServerOptions extends Omit<SessionHostBootstrapOptions, "c
|
|
|
27
35
|
readonly staticRoot?: string;
|
|
28
36
|
/** Additional same-origin development origin accepted by the API. */
|
|
29
37
|
readonly developmentOrigin?: string;
|
|
38
|
+
/** Loads project-local composition entries after the browser confirms workspace trust. */
|
|
39
|
+
readonly onProjectTrustChange?: (trusted: boolean) => Promise<void>;
|
|
30
40
|
}
|
|
31
41
|
/** Local-first HTTP/SSE adapter. It authenticates and queues transport messages; Agent work remains in RpcDispatcher. */
|
|
32
42
|
export declare class WebUiServer {
|
package/dist/webui.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webui.d.ts","sourceRoot":"","sources":["../src/webui.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"webui.d.ts","sourceRoot":"","sources":["../src/webui.ts"],"names":[],"mappings":"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"}
|
package/dist/webui.js
CHANGED
|
@@ -5,6 +5,7 @@ import { createServer } from "node:http";
|
|
|
5
5
|
import { basename, extname, relative, resolve, sep } from "node:path";
|
|
6
6
|
import { promisify } from "node:util";
|
|
7
7
|
import { commandRegistryKey } from "@di-code/builtins";
|
|
8
|
+
import { createUserInteraction } from "@di-code/plugin-sdk";
|
|
8
9
|
import { createProjectTrustStore } from "./project-trust-entry.js";
|
|
9
10
|
import { RpcDispatcher } from "./rpc/dispatcher.js";
|
|
10
11
|
import { parseRpcRequest, RPC_PROTOCOL_VERSION } from "./rpc/protocol.js";
|
|
@@ -411,6 +412,14 @@ export class WebUiServer {
|
|
|
411
412
|
const hostOptions = this.hostOptions(client.principal, allowed, this.resolveActorRuntime(startupConfiguration), projectTrusted);
|
|
412
413
|
let permissionMode = startupConfiguration.permissionMode ?? "ask";
|
|
413
414
|
let requestApproval;
|
|
415
|
+
let requestInteraction;
|
|
416
|
+
const interaction = createUserInteraction({
|
|
417
|
+
request: async (input, signal) => {
|
|
418
|
+
if (!requestInteraction)
|
|
419
|
+
throw new Error("User interaction is unavailable.");
|
|
420
|
+
return await requestInteraction(input, signal);
|
|
421
|
+
},
|
|
422
|
+
});
|
|
414
423
|
const toolApproval = {
|
|
415
424
|
request: async (toolName, parameters, signal) => {
|
|
416
425
|
if (permissionMode === "allow")
|
|
@@ -422,12 +431,16 @@ export class WebUiServer {
|
|
|
422
431
|
if (!(await requestApproval(toolName, parameters, signal)))
|
|
423
432
|
throw new Error("Tool approval denied.");
|
|
424
433
|
},
|
|
434
|
+
get interaction() {
|
|
435
|
+
return requestInteraction ? { request: requestInteraction } : undefined;
|
|
436
|
+
},
|
|
425
437
|
};
|
|
426
438
|
const actor = await this.hostManager.get({
|
|
427
439
|
...hostOptions,
|
|
428
440
|
principal: client.principal,
|
|
429
441
|
cwd: allowed,
|
|
430
442
|
...(toolApproval ? { toolApproval } : {}),
|
|
443
|
+
interaction,
|
|
431
444
|
});
|
|
432
445
|
if (!actor.state().activeSession)
|
|
433
446
|
await actor.createSession();
|
|
@@ -464,6 +477,8 @@ export class WebUiServer {
|
|
|
464
477
|
permissionMode = mode;
|
|
465
478
|
},
|
|
466
479
|
refreshResources: (projectTrusted) => actor.refreshResources(projectTrusted),
|
|
480
|
+
onProjectTrustChange: allowed.toLowerCase() === primary.toLowerCase() ? this.options.onProjectTrustChange : undefined,
|
|
481
|
+
includeProjectPluginInventory: allowed.toLowerCase() === primary.toLowerCase(),
|
|
467
482
|
});
|
|
468
483
|
const attachments = await createManagedAttachmentStore({
|
|
469
484
|
directory: resolve(this.clientTempRoot(client), "attachments"),
|
|
@@ -477,6 +492,7 @@ export class WebUiServer {
|
|
|
477
492
|
});
|
|
478
493
|
const actorDispatcher = dispatcher;
|
|
479
494
|
requestApproval = (toolName, parameters, signal) => actorDispatcher.requestToolApproval(toolName, parameters, signal);
|
|
495
|
+
requestInteraction = (input, signal) => actorDispatcher.requestInteraction(input, signal);
|
|
480
496
|
await actorDispatcher.dispatch({
|
|
481
497
|
version: RPC_PROTOCOL_VERSION,
|
|
482
498
|
kind: "request",
|
|
@@ -489,7 +505,9 @@ export class WebUiServer {
|
|
|
489
505
|
"snapshot_required",
|
|
490
506
|
"session_changed",
|
|
491
507
|
"tool_approval",
|
|
508
|
+
"interaction_request",
|
|
492
509
|
"product_audit",
|
|
510
|
+
"projection",
|
|
493
511
|
],
|
|
494
512
|
},
|
|
495
513
|
});
|
|
@@ -741,6 +759,9 @@ export class WebUiServer {
|
|
|
741
759
|
model: runtime?.model ?? this.options.model,
|
|
742
760
|
signal: this.options.signal,
|
|
743
761
|
compaction: this.options.compaction,
|
|
762
|
+
planMode: this.options.planMode ?? {
|
|
763
|
+
section: "You are in plan mode. Explore and design before presenting the complete plan through exit_plan_mode.",
|
|
764
|
+
},
|
|
744
765
|
};
|
|
745
766
|
}
|
|
746
767
|
clientTempRoot(client) {
|