@di-code/coding-agent 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/README.md +5 -0
  2. package/dist/core/session/session-manager.d.ts +18 -1
  3. package/dist/core/session/session-manager.d.ts.map +1 -1
  4. package/dist/core/session/session-manager.js +90 -1
  5. package/dist/core/session/session-manager.js.map +1 -1
  6. package/dist/core/session/session-storage.d.ts +2 -0
  7. package/dist/core/session/session-storage.d.ts.map +1 -1
  8. package/dist/core/session/session-storage.js +22 -1
  9. package/dist/core/session/session-storage.js.map +1 -1
  10. package/dist/core/session/types.d.ts +16 -1
  11. package/dist/core/session/types.d.ts.map +1 -1
  12. package/dist/core/session/types.js.map +1 -1
  13. package/dist/core/session.d.ts +27 -2
  14. package/dist/core/session.d.ts.map +1 -1
  15. package/dist/core/session.js +59 -0
  16. package/dist/core/session.js.map +1 -1
  17. package/dist/entry.js +1 -1
  18. package/dist/entry.js.map +1 -1
  19. package/dist/i18n.js +4 -4
  20. package/dist/i18n.js.map +1 -1
  21. package/dist/interactive-host-entry.d.ts.map +1 -1
  22. package/dist/interactive-host-entry.js +107 -12
  23. package/dist/interactive-host-entry.js.map +1 -1
  24. package/dist/main.d.ts.map +1 -1
  25. package/dist/main.js +3 -0
  26. package/dist/main.js.map +1 -1
  27. package/dist/modes/interactive-components.d.ts +8 -0
  28. package/dist/modes/interactive-components.d.ts.map +1 -1
  29. package/dist/modes/interactive-components.js +7 -2
  30. package/dist/modes/interactive-components.js.map +1 -1
  31. package/dist/modes/interactive.d.ts +4 -0
  32. package/dist/modes/interactive.d.ts.map +1 -1
  33. package/dist/modes/interactive.js +69 -0
  34. package/dist/modes/interactive.js.map +1 -1
  35. package/dist/modes/tree-selector.d.ts.map +1 -1
  36. package/dist/modes/tree-selector.js +4 -0
  37. package/dist/modes/tree-selector.js.map +1 -1
  38. package/dist/rpc/client.d.ts +2 -0
  39. package/dist/rpc/client.d.ts.map +1 -1
  40. package/dist/rpc/client.js +3 -0
  41. package/dist/rpc/client.js.map +1 -1
  42. package/dist/rpc/dispatcher.d.ts +14 -0
  43. package/dist/rpc/dispatcher.d.ts.map +1 -1
  44. package/dist/rpc/dispatcher.js +222 -7
  45. package/dist/rpc/dispatcher.js.map +1 -1
  46. package/dist/rpc/protocol.d.ts +12 -5
  47. package/dist/rpc/protocol.d.ts.map +1 -1
  48. package/dist/rpc/protocol.js +34 -0
  49. package/dist/rpc/protocol.js.map +1 -1
  50. package/dist/rpc/server.d.ts +5 -0
  51. package/dist/rpc/server.d.ts.map +1 -1
  52. package/dist/rpc/server.js +4 -0
  53. package/dist/rpc/server.js.map +1 -1
  54. package/dist/rpc-server-entry.d.ts.map +1 -1
  55. package/dist/rpc-server-entry.js +15 -1
  56. package/dist/rpc-server-entry.js.map +1 -1
  57. package/dist/runtime/product-host.d.ts +7 -0
  58. package/dist/runtime/product-host.d.ts.map +1 -1
  59. package/dist/runtime/product-host.js +29 -9
  60. package/dist/runtime/product-host.js.map +1 -1
  61. package/dist/runtime/session-factory.d.ts +18 -2
  62. package/dist/runtime/session-factory.d.ts.map +1 -1
  63. package/dist/runtime/session-factory.js +286 -24
  64. package/dist/runtime/session-factory.js.map +1 -1
  65. package/dist/runtime/session-host.d.ts +46 -1
  66. package/dist/runtime/session-host.d.ts.map +1 -1
  67. package/dist/runtime/session-host.js +38 -6
  68. package/dist/runtime/session-host.js.map +1 -1
  69. package/dist/ui-host.d.ts.map +1 -1
  70. package/dist/ui-host.js +3 -0
  71. package/dist/ui-host.js.map +1 -1
  72. package/dist/web/assets/index-C2SOU925.css +1 -0
  73. package/dist/web/assets/index-knXkInvO.js +41 -0
  74. package/dist/web/assets/index-knXkInvO.js.map +1 -0
  75. package/dist/web/index.html +2 -2
  76. package/dist/web-command.d.ts.map +1 -1
  77. package/dist/web-command.js +8 -1
  78. package/dist/web-command.js.map +1 -1
  79. package/dist/webui-entry.js +9 -1
  80. package/dist/webui-entry.js.map +1 -1
  81. package/dist/webui.d.ts +10 -0
  82. package/dist/webui.d.ts.map +1 -1
  83. package/dist/webui.js +21 -0
  84. package/dist/webui.js.map +1 -1
  85. package/package.json +11 -9
  86. package/dist/web/assets/index-C-NyCPxd.css +0 -1
  87. package/dist/web/assets/index-DgyxuNNG.js +0 -41
  88. package/dist/web/assets/index-DgyxuNNG.js.map +0 -1
@@ -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-DgyxuNNG.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-C-NyCPxd.css">
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;AAQ3C,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,CAiDxE"}
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"}
@@ -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: projectTrusted,
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`);
@@ -1 +1 @@
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 {\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: projectTrusted,\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\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});\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"]}
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"]}
@@ -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: projectTrusted,
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`);
@@ -1 +1 @@
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 { 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: projectTrusted,\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\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});\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"]}
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 {
@@ -1 +1 @@
1
- {"version":3,"file":"webui.d.ts","sourceRoot":"","sources":["../src/webui.ts"],"names":[],"mappings":"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"}
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) {