@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.
Files changed (333) hide show
  1. package/README.md +104 -46
  2. package/compositions/base.yml +54 -0
  3. package/compositions/interactive.yml +14 -0
  4. package/compositions/json.yml +6 -0
  5. package/compositions/print.yml +5 -0
  6. package/compositions/rpc.yml +12 -0
  7. package/compositions/webui.yml +9 -0
  8. package/dist/cli.d.ts +22 -1
  9. package/dist/cli.d.ts.map +1 -1
  10. package/dist/cli.js +97 -3
  11. package/dist/cli.js.map +1 -1
  12. package/dist/composition-loader-entry.d.ts +11 -0
  13. package/dist/composition-loader-entry.d.ts.map +1 -0
  14. package/dist/composition-loader-entry.js +12 -0
  15. package/dist/composition-loader-entry.js.map +1 -0
  16. package/dist/compositions.d.ts +32 -0
  17. package/dist/compositions.d.ts.map +1 -0
  18. package/dist/compositions.js +173 -0
  19. package/dist/compositions.js.map +1 -0
  20. package/dist/core/session/session-manager.d.ts +9 -2
  21. package/dist/core/session/session-manager.d.ts.map +1 -1
  22. package/dist/core/session/session-manager.js +28 -0
  23. package/dist/core/session/session-manager.js.map +1 -1
  24. package/dist/core/session/session-storage.d.ts.map +1 -1
  25. package/dist/core/session/session-storage.js +20 -3
  26. package/dist/core/session/session-storage.js.map +1 -1
  27. package/dist/core/session/types.d.ts +11 -2
  28. package/dist/core/session/types.d.ts.map +1 -1
  29. package/dist/core/session/types.js.map +1 -1
  30. package/dist/core/session-tools.d.ts +5 -0
  31. package/dist/core/session-tools.d.ts.map +1 -0
  32. package/dist/core/session-tools.js +17 -0
  33. package/dist/core/session-tools.js.map +1 -0
  34. package/dist/core/session.d.ts +19 -7
  35. package/dist/core/session.d.ts.map +1 -1
  36. package/dist/core/session.js +71 -39
  37. package/dist/core/session.js.map +1 -1
  38. package/dist/core/tools/bash.d.ts +1 -38
  39. package/dist/core/tools/bash.d.ts.map +1 -1
  40. package/dist/core/tools/bash.js +1 -207
  41. package/dist/core/tools/bash.js.map +1 -1
  42. package/dist/core/tools/edit-diff.d.ts +1 -24
  43. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  44. package/dist/core/tools/edit-diff.js +1 -135
  45. package/dist/core/tools/edit-diff.js.map +1 -1
  46. package/dist/core/tools/edit.d.ts +1 -26
  47. package/dist/core/tools/edit.d.ts.map +1 -1
  48. package/dist/core/tools/edit.js +1 -140
  49. package/dist/core/tools/edit.js.map +1 -1
  50. package/dist/core/tools/file-mutation-queue.d.ts +1 -1
  51. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  52. package/dist/core/tools/file-mutation-queue.js +1 -23
  53. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  54. package/dist/core/tools/file-search.d.ts +1 -13
  55. package/dist/core/tools/file-search.d.ts.map +1 -1
  56. package/dist/core/tools/file-search.js +1 -98
  57. package/dist/core/tools/file-search.js.map +1 -1
  58. package/dist/core/tools/glob.d.ts +1 -10
  59. package/dist/core/tools/glob.d.ts.map +1 -1
  60. package/dist/core/tools/glob.js +1 -43
  61. package/dist/core/tools/glob.js.map +1 -1
  62. package/dist/core/tools/grep.d.ts +1 -12
  63. package/dist/core/tools/grep.d.ts.map +1 -1
  64. package/dist/core/tools/grep.js +1 -66
  65. package/dist/core/tools/grep.js.map +1 -1
  66. package/dist/core/tools/load-skill.d.ts +1 -9
  67. package/dist/core/tools/load-skill.d.ts.map +1 -1
  68. package/dist/core/tools/load-skill.js +1 -21
  69. package/dist/core/tools/load-skill.js.map +1 -1
  70. package/dist/core/tools/path-boundary.d.ts +1 -4
  71. package/dist/core/tools/path-boundary.d.ts.map +1 -1
  72. package/dist/core/tools/path-boundary.js +1 -65
  73. package/dist/core/tools/path-boundary.js.map +1 -1
  74. package/dist/core/tools/read.d.ts +1 -16
  75. package/dist/core/tools/read.d.ts.map +1 -1
  76. package/dist/core/tools/read.js +1 -131
  77. package/dist/core/tools/read.js.map +1 -1
  78. package/dist/core/tools/write.d.ts +1 -16
  79. package/dist/core/tools/write.d.ts.map +1 -1
  80. package/dist/core/tools/write.js +1 -44
  81. package/dist/core/tools/write.js.map +1 -1
  82. package/dist/entry.js +30 -28
  83. package/dist/entry.js.map +1 -1
  84. package/dist/index.d.ts +6 -3
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +6 -3
  87. package/dist/index.js.map +1 -1
  88. package/dist/interactive/builtin.d.ts +17 -0
  89. package/dist/interactive/builtin.d.ts.map +1 -0
  90. package/dist/interactive/builtin.js +47 -0
  91. package/dist/interactive/builtin.js.map +1 -0
  92. package/dist/interactive/controller.d.ts +85 -0
  93. package/dist/interactive/controller.d.ts.map +1 -0
  94. package/dist/interactive/controller.js +211 -0
  95. package/dist/interactive/controller.js.map +1 -0
  96. package/dist/interactive/index.d.ts +3 -0
  97. package/dist/interactive/index.d.ts.map +1 -0
  98. package/dist/interactive/index.js +3 -0
  99. package/dist/interactive/index.js.map +1 -0
  100. package/dist/interactive-host-entry.d.ts +7 -0
  101. package/dist/interactive-host-entry.d.ts.map +1 -0
  102. package/dist/interactive-host-entry.js +123 -0
  103. package/dist/interactive-host-entry.js.map +1 -0
  104. package/dist/interactive-profile.d.ts +18 -0
  105. package/dist/interactive-profile.d.ts.map +1 -0
  106. package/dist/interactive-profile.js +290 -0
  107. package/dist/interactive-profile.js.map +1 -0
  108. package/dist/interactive-resources-entry.d.ts +7 -0
  109. package/dist/interactive-resources-entry.d.ts.map +1 -0
  110. package/dist/interactive-resources-entry.js +42 -0
  111. package/dist/interactive-resources-entry.js.map +1 -0
  112. package/dist/legacy-main.d.ts +39 -0
  113. package/dist/legacy-main.d.ts.map +1 -0
  114. package/dist/legacy-main.js +611 -0
  115. package/dist/legacy-main.js.map +1 -0
  116. package/dist/main.d.ts +15 -34
  117. package/dist/main.d.ts.map +1 -1
  118. package/dist/main.js +130 -518
  119. package/dist/main.js.map +1 -1
  120. package/dist/mcp/entries.d.ts +42 -0
  121. package/dist/mcp/entries.d.ts.map +1 -0
  122. package/dist/mcp/entries.js +98 -0
  123. package/dist/mcp/entries.js.map +1 -0
  124. package/dist/mcp-client-entry.d.ts +5 -0
  125. package/dist/mcp-client-entry.d.ts.map +1 -0
  126. package/dist/mcp-client-entry.js +6 -0
  127. package/dist/mcp-client-entry.js.map +1 -0
  128. package/dist/mcp-config-entry.d.ts +5 -0
  129. package/dist/mcp-config-entry.d.ts.map +1 -0
  130. package/dist/mcp-config-entry.js +6 -0
  131. package/dist/mcp-config-entry.js.map +1 -0
  132. package/dist/mcp-tools-entry.d.ts +5 -0
  133. package/dist/mcp-tools-entry.d.ts.map +1 -0
  134. package/dist/mcp-tools-entry.js +6 -0
  135. package/dist/mcp-tools-entry.js.map +1 -0
  136. package/dist/mcp-transport-entry.d.ts +5 -0
  137. package/dist/mcp-transport-entry.d.ts.map +1 -0
  138. package/dist/mcp-transport-entry.js +6 -0
  139. package/dist/mcp-transport-entry.js.map +1 -0
  140. package/dist/modes/interactive-entry.d.ts +18 -0
  141. package/dist/modes/interactive-entry.d.ts.map +1 -0
  142. package/dist/modes/interactive-entry.js +21 -0
  143. package/dist/modes/interactive-entry.js.map +1 -0
  144. package/dist/modes/interactive.d.ts +16 -6
  145. package/dist/modes/interactive.d.ts.map +1 -1
  146. package/dist/modes/interactive.js +81 -32
  147. package/dist/modes/interactive.js.map +1 -1
  148. package/dist/modes/json-entry.d.ts +13 -0
  149. package/dist/modes/json-entry.d.ts.map +1 -0
  150. package/dist/modes/json-entry.js +14 -0
  151. package/dist/modes/json-entry.js.map +1 -0
  152. package/dist/modes/json.d.ts +4 -1
  153. package/dist/modes/json.d.ts.map +1 -1
  154. package/dist/modes/json.js +3 -3
  155. package/dist/modes/json.js.map +1 -1
  156. package/dist/modes/print-entry.d.ts +10 -0
  157. package/dist/modes/print-entry.d.ts.map +1 -0
  158. package/dist/modes/print-entry.js +11 -0
  159. package/dist/modes/print-entry.js.map +1 -0
  160. package/dist/modes/tree-selector.d.ts.map +1 -1
  161. package/dist/modes/tree-selector.js +4 -0
  162. package/dist/modes/tree-selector.js.map +1 -1
  163. package/dist/plugin-dump-composition.d.ts +6 -0
  164. package/dist/plugin-dump-composition.d.ts.map +1 -0
  165. package/dist/plugin-dump-composition.js +7 -0
  166. package/dist/plugin-dump-composition.js.map +1 -0
  167. package/dist/plugin-inventory.d.ts +7 -0
  168. package/dist/plugin-inventory.d.ts.map +1 -0
  169. package/dist/plugin-inventory.js +8 -0
  170. package/dist/plugin-inventory.js.map +1 -0
  171. package/dist/plugin-manager.d.ts +6 -0
  172. package/dist/plugin-manager.d.ts.map +1 -0
  173. package/dist/plugin-manager.js +7 -0
  174. package/dist/plugin-manager.js.map +1 -0
  175. package/dist/plugin-trace.d.ts +6 -0
  176. package/dist/plugin-trace.d.ts.map +1 -0
  177. package/dist/plugin-trace.js +7 -0
  178. package/dist/plugin-trace.js.map +1 -0
  179. package/dist/plugins/dynamic-broker.d.ts +76 -0
  180. package/dist/plugins/dynamic-broker.d.ts.map +1 -0
  181. package/dist/plugins/dynamic-broker.js +852 -0
  182. package/dist/plugins/dynamic-broker.js.map +1 -0
  183. package/dist/plugins/profile.d.ts +15 -0
  184. package/dist/plugins/profile.d.ts.map +1 -0
  185. package/dist/plugins/profile.js +34 -0
  186. package/dist/plugins/profile.js.map +1 -0
  187. package/dist/plugins/runtime-host.d.ts +37 -0
  188. package/dist/plugins/runtime-host.d.ts.map +1 -0
  189. package/dist/plugins/runtime-host.js +95 -0
  190. package/dist/plugins/runtime-host.js.map +1 -0
  191. package/dist/plugins/trust.d.ts +8 -0
  192. package/dist/plugins/trust.d.ts.map +1 -0
  193. package/dist/plugins/trust.js +59 -0
  194. package/dist/plugins/trust.js.map +1 -0
  195. package/dist/project-trust-entry.d.ts +15 -0
  196. package/dist/project-trust-entry.d.ts.map +1 -0
  197. package/dist/project-trust-entry.js +15 -0
  198. package/dist/project-trust-entry.js.map +1 -0
  199. package/dist/rpc/client.d.ts +78 -6
  200. package/dist/rpc/client.d.ts.map +1 -1
  201. package/dist/rpc/client.js +172 -4
  202. package/dist/rpc/client.js.map +1 -1
  203. package/dist/rpc/dispatcher.d.ts +121 -0
  204. package/dist/rpc/dispatcher.d.ts.map +1 -0
  205. package/dist/rpc/dispatcher.js +994 -0
  206. package/dist/rpc/dispatcher.js.map +1 -0
  207. package/dist/rpc/index.d.ts +2 -0
  208. package/dist/rpc/index.d.ts.map +1 -1
  209. package/dist/rpc/index.js +2 -0
  210. package/dist/rpc/index.js.map +1 -1
  211. package/dist/rpc/lifecycle.d.ts +6 -0
  212. package/dist/rpc/lifecycle.d.ts.map +1 -0
  213. package/dist/rpc/lifecycle.js +24 -0
  214. package/dist/rpc/lifecycle.js.map +1 -0
  215. package/dist/rpc/protocol.d.ts +112 -31
  216. package/dist/rpc/protocol.d.ts.map +1 -1
  217. package/dist/rpc/protocol.js +569 -117
  218. package/dist/rpc/protocol.js.map +1 -1
  219. package/dist/rpc/server-service.d.ts +7 -0
  220. package/dist/rpc/server-service.d.ts.map +1 -0
  221. package/dist/rpc/server-service.js +3 -0
  222. package/dist/rpc/server-service.js.map +1 -0
  223. package/dist/rpc/server.d.ts +16 -19
  224. package/dist/rpc/server.d.ts.map +1 -1
  225. package/dist/rpc/server.js +59 -115
  226. package/dist/rpc/server.js.map +1 -1
  227. package/dist/rpc-client-sdk-entry.d.ts +12 -0
  228. package/dist/rpc-client-sdk-entry.d.ts.map +1 -0
  229. package/dist/rpc-client-sdk-entry.js +11 -0
  230. package/dist/rpc-client-sdk-entry.js.map +1 -0
  231. package/dist/rpc-entry.js +50 -18
  232. package/dist/rpc-entry.js.map +1 -1
  233. package/dist/rpc-server-entry.d.ts +8 -0
  234. package/dist/rpc-server-entry.d.ts.map +1 -0
  235. package/dist/rpc-server-entry.js +67 -0
  236. package/dist/rpc-server-entry.js.map +1 -0
  237. package/dist/runtime/attachment-store.d.ts +13 -0
  238. package/dist/runtime/attachment-store.d.ts.map +1 -0
  239. package/dist/runtime/attachment-store.js +93 -0
  240. package/dist/runtime/attachment-store.js.map +1 -0
  241. package/dist/runtime/bootstrap.d.ts +14 -0
  242. package/dist/runtime/bootstrap.d.ts.map +1 -0
  243. package/dist/runtime/bootstrap.js +29 -0
  244. package/dist/runtime/bootstrap.js.map +1 -0
  245. package/dist/runtime/interactive-host-service.d.ts +22 -0
  246. package/dist/runtime/interactive-host-service.d.ts.map +1 -0
  247. package/dist/runtime/interactive-host-service.js +2 -0
  248. package/dist/runtime/interactive-host-service.js.map +1 -0
  249. package/dist/runtime/interactive-resource-service.d.ts +11 -0
  250. package/dist/runtime/interactive-resource-service.d.ts.map +1 -0
  251. package/dist/runtime/interactive-resource-service.js +3 -0
  252. package/dist/runtime/interactive-resource-service.js.map +1 -0
  253. package/dist/runtime/plugin-inventory-entry.d.ts +5 -0
  254. package/dist/runtime/plugin-inventory-entry.d.ts.map +1 -0
  255. package/dist/runtime/plugin-inventory-entry.js +18 -0
  256. package/dist/runtime/plugin-inventory-entry.js.map +1 -0
  257. package/dist/runtime/plugin-inventory-service.d.ts +8 -0
  258. package/dist/runtime/plugin-inventory-service.d.ts.map +1 -0
  259. package/dist/runtime/plugin-inventory-service.js +3 -0
  260. package/dist/runtime/plugin-inventory-service.js.map +1 -0
  261. package/dist/runtime/plugin-manager-entry.d.ts +20 -0
  262. package/dist/runtime/plugin-manager-entry.d.ts.map +1 -0
  263. package/dist/runtime/plugin-manager-entry.js +96 -0
  264. package/dist/runtime/plugin-manager-entry.js.map +1 -0
  265. package/dist/runtime/plugin-observability-entry.d.ts +12 -0
  266. package/dist/runtime/plugin-observability-entry.d.ts.map +1 -0
  267. package/dist/runtime/plugin-observability-entry.js +73 -0
  268. package/dist/runtime/plugin-observability-entry.js.map +1 -0
  269. package/dist/runtime/product-host.d.ts +91 -0
  270. package/dist/runtime/product-host.d.ts.map +1 -0
  271. package/dist/runtime/product-host.js +529 -0
  272. package/dist/runtime/product-host.js.map +1 -0
  273. package/dist/runtime/session-factory.d.ts +17 -0
  274. package/dist/runtime/session-factory.d.ts.map +1 -0
  275. package/dist/runtime/session-factory.js +75 -0
  276. package/dist/runtime/session-factory.js.map +1 -0
  277. package/dist/runtime/session-host.d.ts +152 -0
  278. package/dist/runtime/session-host.d.ts.map +1 -0
  279. package/dist/runtime/session-host.js +895 -0
  280. package/dist/runtime/session-host.js.map +1 -0
  281. package/dist/runtime-core-entry.d.ts +11 -0
  282. package/dist/runtime-core-entry.d.ts.map +1 -0
  283. package/dist/runtime-core-entry.js +9 -0
  284. package/dist/runtime-core-entry.js.map +1 -0
  285. package/dist/session-factory-entry.d.ts +7 -0
  286. package/dist/session-factory-entry.d.ts.map +1 -0
  287. package/dist/session-factory-entry.js +9 -0
  288. package/dist/session-factory-entry.js.map +1 -0
  289. package/dist/session-store-jsonl-entry.d.ts +7 -0
  290. package/dist/session-store-jsonl-entry.d.ts.map +1 -0
  291. package/dist/session-store-jsonl-entry.js +33 -0
  292. package/dist/session-store-jsonl-entry.js.map +1 -0
  293. package/dist/startup.d.ts +12 -1
  294. package/dist/startup.d.ts.map +1 -1
  295. package/dist/startup.js +106 -15
  296. package/dist/startup.js.map +1 -1
  297. package/dist/subagents/index.d.ts +2 -0
  298. package/dist/subagents/index.d.ts.map +1 -0
  299. package/dist/subagents/index.js +2 -0
  300. package/dist/subagents/index.js.map +1 -0
  301. package/dist/subagents/service.d.ts +50 -0
  302. package/dist/subagents/service.d.ts.map +1 -0
  303. package/dist/subagents/service.js +521 -0
  304. package/dist/subagents/service.js.map +1 -0
  305. package/dist/ui-host.d.ts +125 -0
  306. package/dist/ui-host.d.ts.map +1 -0
  307. package/dist/ui-host.js +275 -0
  308. package/dist/ui-host.js.map +1 -0
  309. package/dist/web/assets/index-BwfuGMvv.css +1 -0
  310. package/dist/web/assets/index-DPUaJqFJ.js +41 -0
  311. package/dist/web/assets/index-DPUaJqFJ.js.map +1 -0
  312. package/dist/web/index.html +14 -0
  313. package/dist/web-command.d.ts +11 -0
  314. package/dist/web-command.d.ts.map +1 -0
  315. package/dist/web-command.js +114 -0
  316. package/dist/web-command.js.map +1 -0
  317. package/dist/web-frontend.d.ts +73 -0
  318. package/dist/web-frontend.d.ts.map +1 -0
  319. package/dist/web-frontend.js +249 -0
  320. package/dist/web-frontend.js.map +1 -0
  321. package/dist/web.d.ts +254 -0
  322. package/dist/web.d.ts.map +1 -0
  323. package/dist/web.js +740 -0
  324. package/dist/web.js.map +1 -0
  325. package/dist/webui-entry.d.ts +3 -0
  326. package/dist/webui-entry.d.ts.map +1 -0
  327. package/dist/webui-entry.js +73 -0
  328. package/dist/webui-entry.js.map +1 -0
  329. package/dist/webui.d.ts +91 -0
  330. package/dist/webui.d.ts.map +1 -0
  331. package/dist/webui.js +882 -0
  332. package/dist/webui.js.map +1 -0
  333. package/package.json +89 -8
@@ -0,0 +1,96 @@
1
+ import { homedir } from "node:os";
2
+ import { join, resolve } from "node:path";
3
+ import { hostCommandRegistryKey } from "@di-code/builtins";
4
+ import { PluginInstallManager } from "@di-code/plugin-loader";
5
+ import { createServiceKey, redactSensitiveText } from "@di-code/plugin-runtime";
6
+ export const pluginManagerKey = createServiceKey("plugin-manager");
7
+ function safeMessage(cause) {
8
+ return redactSensitiveText(cause instanceof Error ? cause.message : String(cause));
9
+ }
10
+ function publicPlugin(plugin) {
11
+ return {
12
+ id: plugin.id,
13
+ enabled: plugin.enabled,
14
+ version: plugin.manifest.version,
15
+ installedAt: plugin.installedAt,
16
+ capabilities: Object.keys(plugin.manifest.capabilities).sort(),
17
+ };
18
+ }
19
+ function isPluginManagementCommand(value) {
20
+ return (typeof value === "object" &&
21
+ value !== null &&
22
+ "action" in value &&
23
+ typeof value.action === "string" &&
24
+ "stdout" in value &&
25
+ typeof value.stdout === "function" &&
26
+ "stderr" in value &&
27
+ typeof value.stderr === "function");
28
+ }
29
+ /** Registers the composition-owned, non-provider plugin management command. */
30
+ export const pluginManager = {
31
+ apiVersion: 1,
32
+ name: "plugin-manager",
33
+ version: "0.1.7",
34
+ apply(context, config, fiber) {
35
+ const agentDir = resolve(config?.agentDir ?? join(homedir(), ".di-code"));
36
+ const manager = new PluginInstallManager({ managedRoot: join(agentDir, "plugins", "installed") });
37
+ const service = {
38
+ list: () => manager.list(),
39
+ execute: async (command) => {
40
+ try {
41
+ switch (command.action) {
42
+ case "list":
43
+ for (const plugin of await manager.list())
44
+ command.stdout(`${plugin.id}\t${plugin.enabled ? "enabled" : "disabled"}\t${plugin.manifest.version}\n`);
45
+ return 0;
46
+ case "get": {
47
+ const plugin = (await manager.list()).find((item) => item.id === command.argument);
48
+ if (!plugin)
49
+ throw new Error(`Unknown plugin: ${command.argument ?? ""}`);
50
+ command.stdout(`${JSON.stringify(publicPlugin(plugin))}\n`);
51
+ return 0;
52
+ }
53
+ case "install": {
54
+ const plugin = await manager.install(command.argument ?? "");
55
+ command.stdout(`Installed ${plugin.id}\n`);
56
+ return 0;
57
+ }
58
+ case "enable":
59
+ await manager.enable(command.argument ?? "");
60
+ return 0;
61
+ case "disable":
62
+ await manager.disable(command.argument ?? "");
63
+ return 0;
64
+ case "update":
65
+ {
66
+ const current = (await manager.list()).find((item) => item.id === command.argument);
67
+ if (!current)
68
+ throw new Error(`Unknown plugin: ${command.argument ?? ""}`);
69
+ const updated = await manager.install(current.source);
70
+ if (!current.enabled)
71
+ await manager.disable(updated.id);
72
+ }
73
+ return 0;
74
+ case "remove":
75
+ await manager.remove(command.argument ?? "");
76
+ return 0;
77
+ }
78
+ }
79
+ catch (cause) {
80
+ command.stderr(`${safeMessage(cause)}\n`);
81
+ return 1;
82
+ }
83
+ },
84
+ };
85
+ context.set(pluginManagerKey, service);
86
+ const hostCommands = context.get(hostCommandRegistryKey);
87
+ if (hostCommands) {
88
+ fiber.addDisposer(hostCommands.register("plugin", (input) => {
89
+ if (!isPluginManagementCommand(input))
90
+ return Promise.reject(new Error("Plugin command input is invalid"));
91
+ return service.execute(input);
92
+ }));
93
+ }
94
+ },
95
+ };
96
+ //# sourceMappingURL=plugin-manager-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-manager-entry.js","sourceRoot":"","sources":["../../src/runtime/plugin-manager-entry.ts"],"names":[],"mappings":"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","sourcesContent":["import { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { hostCommandRegistryKey } from \"@di-code/builtins\";\nimport { type ManagedPlugin, PluginInstallManager } from \"@di-code/plugin-loader\";\nimport { createServiceKey, type PluginDefinition, redactSensitiveText } from \"@di-code/plugin-runtime\";\n\nexport type PluginManagementAction = \"install\" | \"list\" | \"get\" | \"enable\" | \"disable\" | \"update\" | \"remove\";\n\nexport interface PluginManagementCommand {\n\treadonly action: PluginManagementAction;\n\treadonly argument?: string;\n\treadonly stdout: (text: string) => void;\n\treadonly stderr: (text: string) => void;\n}\n\nexport interface PluginManagerService {\n\treadonly execute: (command: PluginManagementCommand) => Promise<number>;\n\treadonly list: () => Promise<readonly ManagedPlugin[]>;\n}\n\nexport interface PluginManagerEntryConfig {\n\treadonly agentDir?: string;\n}\n\nexport const pluginManagerKey = createServiceKey<PluginManagerService>(\"plugin-manager\");\n\nfunction safeMessage(cause: unknown): string {\n\treturn redactSensitiveText(cause instanceof Error ? cause.message : String(cause));\n}\n\nfunction publicPlugin(plugin: ManagedPlugin): Readonly<Record<string, unknown>> {\n\treturn {\n\t\tid: plugin.id,\n\t\tenabled: plugin.enabled,\n\t\tversion: plugin.manifest.version,\n\t\tinstalledAt: plugin.installedAt,\n\t\tcapabilities: Object.keys(plugin.manifest.capabilities).sort(),\n\t};\n}\n\nfunction isPluginManagementCommand(value: unknown): value is PluginManagementCommand {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"action\" in value &&\n\t\ttypeof value.action === \"string\" &&\n\t\t\"stdout\" in value &&\n\t\ttypeof value.stdout === \"function\" &&\n\t\t\"stderr\" in value &&\n\t\ttypeof value.stderr === \"function\"\n\t);\n}\n\n/** Registers the composition-owned, non-provider plugin management command. */\nexport const pluginManager: PluginDefinition<PluginManagerEntryConfig> = {\n\tapiVersion: 1,\n\tname: \"plugin-manager\",\n\tversion: \"0.1.7\",\n\tapply(context, config, fiber) {\n\t\tconst agentDir = resolve(config?.agentDir ?? join(homedir(), \".di-code\"));\n\t\tconst manager = new PluginInstallManager({ managedRoot: join(agentDir, \"plugins\", \"installed\") });\n\t\tconst service: PluginManagerService = {\n\t\t\tlist: () => manager.list(),\n\t\t\texecute: async (command) => {\n\t\t\t\ttry {\n\t\t\t\t\tswitch (command.action) {\n\t\t\t\t\t\tcase \"list\":\n\t\t\t\t\t\t\tfor (const plugin of await manager.list())\n\t\t\t\t\t\t\t\tcommand.stdout(\n\t\t\t\t\t\t\t\t\t`${plugin.id}\\t${plugin.enabled ? \"enabled\" : \"disabled\"}\\t${plugin.manifest.version}\\n`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\tcase \"get\": {\n\t\t\t\t\t\t\tconst plugin = (await manager.list()).find((item) => item.id === command.argument);\n\t\t\t\t\t\t\tif (!plugin) throw new Error(`Unknown plugin: ${command.argument ?? \"\"}`);\n\t\t\t\t\t\t\tcommand.stdout(`${JSON.stringify(publicPlugin(plugin))}\\n`);\n\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase \"install\": {\n\t\t\t\t\t\t\tconst plugin = await manager.install(command.argument ?? \"\");\n\t\t\t\t\t\t\tcommand.stdout(`Installed ${plugin.id}\\n`);\n\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase \"enable\":\n\t\t\t\t\t\t\tawait manager.enable(command.argument ?? \"\");\n\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\tcase \"disable\":\n\t\t\t\t\t\t\tawait manager.disable(command.argument ?? \"\");\n\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tconst current = (await manager.list()).find((item) => item.id === command.argument);\n\t\t\t\t\t\t\t\tif (!current) throw new Error(`Unknown plugin: ${command.argument ?? \"\"}`);\n\t\t\t\t\t\t\t\tconst updated = await manager.install(current.source);\n\t\t\t\t\t\t\t\tif (!current.enabled) await manager.disable(updated.id);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\tcase \"remove\":\n\t\t\t\t\t\t\tawait manager.remove(command.argument ?? \"\");\n\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t} catch (cause) {\n\t\t\t\t\tcommand.stderr(`${safeMessage(cause)}\\n`);\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t\tcontext.set(pluginManagerKey, service);\n\t\tconst hostCommands = context.get(hostCommandRegistryKey);\n\t\tif (hostCommands) {\n\t\t\tfiber.addDisposer(\n\t\t\t\thostCommands.register(\"plugin\", (input) => {\n\t\t\t\t\tif (!isPluginManagementCommand(input)) return Promise.reject(new Error(\"Plugin command input is invalid\"));\n\t\t\t\t\treturn service.execute(input);\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t},\n};\n"]}
@@ -0,0 +1,12 @@
1
+ import type { PluginInventory } from "@di-code/plugin-loader";
2
+ import { type PluginDefinition } from "@di-code/plugin-runtime";
3
+ export interface PluginObservationService {
4
+ readonly render: (inventory: PluginInventory) => string;
5
+ }
6
+ export declare const pluginTraceKey: import("@di-code/plugin-runtime").ServiceKey<PluginObservationService>;
7
+ export declare const pluginDumpCompositionKey: import("@di-code/plugin-runtime").ServiceKey<PluginObservationService>;
8
+ /** Opt-in development entry that serializes actual Loader phases and Fiber ownership. */
9
+ export declare const pluginTrace: PluginDefinition;
10
+ /** Opt-in development entry that dumps the resolved composition without entry config values. */
11
+ export declare const pluginDumpComposition: PluginDefinition;
12
+ //# sourceMappingURL=plugin-observability-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-observability-entry.d.ts","sourceRoot":"","sources":["../../src/runtime/plugin-observability-entry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAe,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAoB,KAAK,gBAAgB,EAAuB,MAAM,yBAAyB,CAAC;AAoBvG,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,MAAM,CAAC;CACxD;AAMD,eAAO,MAAM,cAAc,wEAA6D,CAAC;AACzF,eAAO,MAAM,wBAAwB,wEAAwE,CAAC;AAwD9G,yFAAyF;AACzF,eAAO,MAAM,WAAW,EAAE,gBASzB,CAAC;AAEF,gGAAgG;AAChG,eAAO,MAAM,qBAAqB,EAAE,gBASnC,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { hostCommandRegistryKey } from "@di-code/builtins";
2
+ import { createServiceKey, redactSensitiveText } from "@di-code/plugin-runtime";
3
+ import { pluginInventoryKey } from "./plugin-inventory-service.js";
4
+ export const pluginTraceKey = createServiceKey("plugin-trace");
5
+ export const pluginDumpCompositionKey = createServiceKey("plugin-dump-composition");
6
+ function observe(record) {
7
+ const fiber = record.fiber;
8
+ const declared = fiber ? [...fiber.capabilities.declared].sort() : [];
9
+ const managed = record.entry.id.startsWith("managed.");
10
+ const module = managed ? `managed:${record.entry.id.slice("managed.".length)}` : record.entry.name;
11
+ const failure = record.error
12
+ ? redactSensitiveText(record.error.message).replaceAll(record.entry.name, module)
13
+ : undefined;
14
+ return {
15
+ id: record.entry.id,
16
+ module,
17
+ phase: record.status,
18
+ required: record.entry.required !== false,
19
+ dependencies: [...(record.entry.dependsOn ?? [])],
20
+ ownerFiber: fiber ? { id: fiber.id, plugin: fiber.pluginName, status: fiber.status } : null,
21
+ capabilityAudit: {
22
+ trustedProject: fiber?.capabilities.trustedProject ?? false,
23
+ declared,
24
+ granted: declared.filter((capability) => fiber?.capabilities.has(capability) ?? false),
25
+ },
26
+ ...(failure ? { failure } : {}),
27
+ };
28
+ }
29
+ function service(kind) {
30
+ return {
31
+ render: (inventory) => JSON.stringify({
32
+ type: kind,
33
+ resolvedTree: inventory.entries.map(observe),
34
+ }),
35
+ };
36
+ }
37
+ function registerHostCommand(context, fiber, name, service) {
38
+ const hostCommands = context.get(hostCommandRegistryKey);
39
+ if (!hostCommands)
40
+ return;
41
+ fiber.addDisposer(hostCommands.register(name, (input) => {
42
+ if (typeof input !== "object" || input === null || !("stdout" in input) || typeof input.stdout !== "function")
43
+ return Promise.reject(new Error(`${name} command input is invalid`));
44
+ const inventory = context.require(pluginInventoryKey).snapshot();
45
+ if (!inventory)
46
+ return Promise.reject(new Error("Plugin inventory is unavailable"));
47
+ input.stdout(`${service.render(inventory)}\n`);
48
+ return Promise.resolve(0);
49
+ }));
50
+ }
51
+ /** Opt-in development entry that serializes actual Loader phases and Fiber ownership. */
52
+ export const pluginTrace = {
53
+ apiVersion: 1,
54
+ name: "plugin-trace",
55
+ version: "0.1.7",
56
+ apply(context, _config, fiber) {
57
+ const observation = service("plugin_trace");
58
+ context.set(pluginTraceKey, observation);
59
+ registerHostCommand(context, fiber, "trace-plugins", observation);
60
+ },
61
+ };
62
+ /** Opt-in development entry that dumps the resolved composition without entry config values. */
63
+ export const pluginDumpComposition = {
64
+ apiVersion: 1,
65
+ name: "plugin-dump-composition",
66
+ version: "0.1.7",
67
+ apply(context, _config, fiber) {
68
+ const observation = service("plugin_dump_composition");
69
+ context.set(pluginDumpCompositionKey, observation);
70
+ registerHostCommand(context, fiber, "dump-composition", observation);
71
+ },
72
+ };
73
+ //# sourceMappingURL=plugin-observability-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-observability-entry.js","sourceRoot":"","sources":["../../src/runtime/plugin-observability-entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,gBAAgB,EAAyB,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACvG,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AA2BnE,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAA2B,cAAc,CAAC,CAAC;AACzF,MAAM,CAAC,MAAM,wBAAwB,GAAG,gBAAgB,CAA2B,yBAAyB,CAAC,CAAC;AAE9G,SAAS,OAAO,CAAC,MAAmB;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;IACnG,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK;QAC3B,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;QACjF,CAAC,CAAC,SAAS,CAAC;IACb,OAAO;QACN,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;QACnB,MAAM;QACN,KAAK,EAAE,MAAM,CAAC,MAAM;QACpB,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,KAAK;QACzC,YAAY,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QACjD,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI;QAC3F,eAAe,EAAE;YAChB,cAAc,EAAE,KAAK,EAAE,YAAY,CAAC,cAAc,IAAI,KAAK;YAC3D,QAAQ;YACR,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC;SACtF;QACD,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/B,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,IAAqB;IACrC,OAAO;QACN,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,CACrB,IAAI,CAAC,SAAS,CAAC;YACd,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;SAC5C,CAAC;KACH,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC3B,OAAiD,EACjD,KAA+C,EAC/C,IAA0C,EAC1C,OAAiC;IAEjC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACzD,IAAI,CAAC,YAAY;QAAE,OAAO;IAC1B,KAAK,CAAC,WAAW,CAChB,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;QACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,UAAU;YAC5G,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,2BAA2B,CAAC,CAAC,CAAC;QACtE,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE,CAAC;QACjE,IAAI,CAAC,SAAS;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;QACnF,KAAkC,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7E,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CACF,CAAC;AACH,CAAC;AAED,yFAAyF;AACzF,MAAM,CAAC,MAAM,WAAW,GAAqB;IAC5C,UAAU,EAAE,CAAC;IACb,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,OAAO;IAChB,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK;QAC5B,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QACzC,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,WAAW,CAAC,CAAC;IACnE,CAAC;CACD,CAAC;AAEF,gGAAgG;AAChG,MAAM,CAAC,MAAM,qBAAqB,GAAqB;IACtD,UAAU,EAAE,CAAC;IACb,IAAI,EAAE,yBAAyB;IAC/B,OAAO,EAAE,OAAO;IAChB,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK;QAC5B,MAAM,WAAW,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,WAAW,CAAC,CAAC;QACnD,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,CAAC,CAAC;IACtE,CAAC;CACD,CAAC","sourcesContent":["import { hostCommandRegistryKey } from \"@di-code/builtins\";\nimport type { EntryRecord, PluginInventory } from \"@di-code/plugin-loader\";\nimport { createServiceKey, type PluginDefinition, redactSensitiveText } from \"@di-code/plugin-runtime\";\nimport { pluginInventoryKey } from \"./plugin-inventory-service.ts\";\n\ntype ObservationKind = \"plugin_trace\" | \"plugin_dump_composition\";\n\ninterface ObservedEntry {\n\treadonly id: string;\n\treadonly module: string;\n\treadonly phase: EntryRecord[\"status\"];\n\treadonly required: boolean;\n\treadonly dependencies: readonly string[];\n\treadonly ownerFiber: { readonly id: string; readonly plugin: string; readonly status: string } | null;\n\treadonly capabilityAudit: {\n\t\treadonly trustedProject: boolean;\n\t\treadonly declared: readonly string[];\n\t\treadonly granted: readonly string[];\n\t};\n\treadonly failure?: string;\n}\n\nexport interface PluginObservationService {\n\treadonly render: (inventory: PluginInventory) => string;\n}\n\ninterface PluginObservationRequest {\n\treadonly stdout: (text: string) => void;\n}\n\nexport const pluginTraceKey = createServiceKey<PluginObservationService>(\"plugin-trace\");\nexport const pluginDumpCompositionKey = createServiceKey<PluginObservationService>(\"plugin-dump-composition\");\n\nfunction observe(record: EntryRecord): ObservedEntry {\n\tconst fiber = record.fiber;\n\tconst declared = fiber ? [...fiber.capabilities.declared].sort() : [];\n\tconst managed = record.entry.id.startsWith(\"managed.\");\n\tconst module = managed ? `managed:${record.entry.id.slice(\"managed.\".length)}` : record.entry.name;\n\tconst failure = record.error\n\t\t? redactSensitiveText(record.error.message).replaceAll(record.entry.name, module)\n\t\t: undefined;\n\treturn {\n\t\tid: record.entry.id,\n\t\tmodule,\n\t\tphase: record.status,\n\t\trequired: record.entry.required !== false,\n\t\tdependencies: [...(record.entry.dependsOn ?? [])],\n\t\townerFiber: fiber ? { id: fiber.id, plugin: fiber.pluginName, status: fiber.status } : null,\n\t\tcapabilityAudit: {\n\t\t\ttrustedProject: fiber?.capabilities.trustedProject ?? false,\n\t\t\tdeclared,\n\t\t\tgranted: declared.filter((capability) => fiber?.capabilities.has(capability) ?? false),\n\t\t},\n\t\t...(failure ? { failure } : {}),\n\t};\n}\n\nfunction service(kind: ObservationKind): PluginObservationService {\n\treturn {\n\t\trender: (inventory) =>\n\t\t\tJSON.stringify({\n\t\t\t\ttype: kind,\n\t\t\t\tresolvedTree: inventory.entries.map(observe),\n\t\t\t}),\n\t};\n}\n\nfunction registerHostCommand(\n\tcontext: Parameters<PluginDefinition[\"apply\"]>[0],\n\tfiber: Parameters<PluginDefinition[\"apply\"]>[2],\n\tname: \"trace-plugins\" | \"dump-composition\",\n\tservice: PluginObservationService,\n): void {\n\tconst hostCommands = context.get(hostCommandRegistryKey);\n\tif (!hostCommands) return;\n\tfiber.addDisposer(\n\t\thostCommands.register(name, (input) => {\n\t\t\tif (typeof input !== \"object\" || input === null || !(\"stdout\" in input) || typeof input.stdout !== \"function\")\n\t\t\t\treturn Promise.reject(new Error(`${name} command input is invalid`));\n\t\t\tconst inventory = context.require(pluginInventoryKey).snapshot();\n\t\t\tif (!inventory) return Promise.reject(new Error(\"Plugin inventory is unavailable\"));\n\t\t\t(input as PluginObservationRequest).stdout(`${service.render(inventory)}\\n`);\n\t\t\treturn Promise.resolve(0);\n\t\t}),\n\t);\n}\n\n/** Opt-in development entry that serializes actual Loader phases and Fiber ownership. */\nexport const pluginTrace: PluginDefinition = {\n\tapiVersion: 1,\n\tname: \"plugin-trace\",\n\tversion: \"0.1.7\",\n\tapply(context, _config, fiber) {\n\t\tconst observation = service(\"plugin_trace\");\n\t\tcontext.set(pluginTraceKey, observation);\n\t\tregisterHostCommand(context, fiber, \"trace-plugins\", observation);\n\t},\n};\n\n/** Opt-in development entry that dumps the resolved composition without entry config values. */\nexport const pluginDumpComposition: PluginDefinition = {\n\tapiVersion: 1,\n\tname: \"plugin-dump-composition\",\n\tversion: \"0.1.7\",\n\tapply(context, _config, fiber) {\n\t\tconst observation = service(\"plugin_dump_composition\");\n\t\tcontext.set(pluginDumpCompositionKey, observation);\n\t\tregisterHostCommand(context, fiber, \"dump-composition\", observation);\n\t},\n};\n"]}
@@ -0,0 +1,91 @@
1
+ import type { ModelApi, Provider } from "@di-code/ai";
2
+ import type { Context, WebManifest } from "@di-code/plugin-runtime";
3
+ import { type McpConfigScope } from "../mcp/config.ts";
4
+ import type { RpcContextFileInfo, RpcMcpServerInfo, RpcProviderSummary, RpcSettingsSnapshot } from "../rpc/protocol.ts";
5
+ import { type StartupConfiguration } from "../startup.ts";
6
+ export interface ProductHostOptions {
7
+ readonly context: Context;
8
+ readonly cwd: string;
9
+ readonly agentDir: string;
10
+ readonly projectTrusted: boolean;
11
+ /** Current runtime is included even when a test or embeddable host supplied it outside the registry. */
12
+ readonly provider?: Provider;
13
+ readonly model?: import("@di-code/ai").Model;
14
+ readonly runtimeSnapshot?: () => {
15
+ readonly providerId: string;
16
+ readonly modelId: string;
17
+ readonly thinkingLevel?: string;
18
+ };
19
+ /** Startup settings used to report whether each Provider is actually configured. */
20
+ readonly startupConfiguration?: StartupConfiguration;
21
+ /** Re-resolves settings and swaps an idle Session runtime after a persisted runtime change. */
22
+ readonly reloadRuntime?: () => Promise<StartupConfiguration | undefined>;
23
+ /** Re-reads persisted settings without replacing the active Session runtime. */
24
+ readonly reloadConfiguration?: () => Promise<StartupConfiguration>;
25
+ /** Applies a persisted permission change to the current Session actor. */
26
+ readonly onPermissionModeChange?: (mode: "ask" | "allow" | "deny") => void;
27
+ /** Refreshes the owning SessionHost after a trust or MCP configuration change. */
28
+ readonly refreshResources?: (projectTrusted?: boolean, signal?: AbortSignal) => Promise<void>;
29
+ }
30
+ export type ProductHostAuditAction = "login" | "logout" | "set_project_trust" | "configure_mcp_server" | "remove_mcp_server" | "reconnect_mcp_server";
31
+ /** Redacted state-change notification for UI audit trails. */
32
+ export interface ProductHostEvent {
33
+ readonly type: "product_audit";
34
+ readonly action: ProductHostAuditAction;
35
+ readonly target?: string;
36
+ readonly projectTrusted?: boolean;
37
+ }
38
+ export type ProductHostListener = (event: ProductHostEvent) => void | Promise<void>;
39
+ export interface ProductHost {
40
+ readonly state: () => {
41
+ readonly projectTrusted: boolean;
42
+ };
43
+ readonly listProviders: () => readonly RpcProviderSummary[];
44
+ readonly getSettings: () => RpcSettingsSnapshot;
45
+ /** Persists a validated runtime preference for future CLI and WebUI Sessions. */
46
+ readonly setRuntimePreference: (providerId: string, modelId: string) => Promise<void>;
47
+ /** Persists a validated per-model thinking preference for future CLI and WebUI Sessions. */
48
+ readonly setThinkingLevelPreference: (providerId: string, modelId: string, level: import("@di-code/ai").ThinkingLevel) => Promise<void>;
49
+ readonly setDefaultProvider: (providerId: string) => Promise<void>;
50
+ readonly setDefaultModel: (modelId: string) => Promise<void>;
51
+ readonly setLocale: (locale: "en" | "zh-CN") => Promise<void>;
52
+ readonly setPermissionMode: (mode: "ask" | "allow" | "deny") => Promise<void>;
53
+ readonly configureCustomProvider: (input: {
54
+ readonly api: Exclude<ModelApi, "faux">;
55
+ readonly baseUrl: string;
56
+ readonly apiKey: string;
57
+ readonly modelId: string;
58
+ }, signal?: AbortSignal) => Promise<RpcProviderSummary>;
59
+ readonly login: (input: {
60
+ readonly providerId: string;
61
+ readonly apiKey: string;
62
+ readonly modelId?: string;
63
+ readonly api?: string;
64
+ }, signal?: AbortSignal) => Promise<RpcProviderSummary>;
65
+ readonly logout: (providerId: string, signal?: AbortSignal) => Promise<void>;
66
+ readonly getProjectTrust: () => boolean;
67
+ readonly setProjectTrust: (trusted: boolean, signal?: AbortSignal) => Promise<boolean>;
68
+ readonly listContextFiles: (signal?: AbortSignal) => Promise<readonly RpcContextFileInfo[]>;
69
+ readonly listMcpServers: (signal?: AbortSignal) => Promise<readonly RpcMcpServerInfo[]>;
70
+ readonly configureMcpServer: (input: {
71
+ readonly serverId: string;
72
+ readonly scope: McpConfigScope;
73
+ readonly config: Record<string, unknown>;
74
+ }, signal?: AbortSignal) => Promise<RpcMcpServerInfo>;
75
+ readonly removeMcpServer: (serverId: string, scope: McpConfigScope, signal?: AbortSignal) => Promise<void>;
76
+ readonly reconnectMcpServer: (serverId: string, signal?: AbortSignal) => Promise<RpcMcpServerInfo>;
77
+ readonly listPlugins: () => Promise<readonly RpcPluginInfo[]>;
78
+ readonly getWebContributions: () => Promise<WebManifest>;
79
+ readonly setPluginEnabled: (pluginId: string, enabled: boolean, signal?: AbortSignal) => Promise<RpcPluginInfo>;
80
+ readonly subscribe: (listener: ProductHostListener) => () => void;
81
+ readonly dispose: () => Promise<void>;
82
+ }
83
+ export interface RpcPluginInfo {
84
+ readonly id: string;
85
+ readonly version: string;
86
+ readonly enabled: boolean;
87
+ readonly installedAt: string;
88
+ readonly capabilities: readonly string[];
89
+ }
90
+ export declare function createProductHost(options: ProductHostOptions): ProductHost;
91
+ //# sourceMappingURL=product-host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-host.d.ts","sourceRoot":"","sources":["../../src/runtime/product-host.ts"],"names":[],"mappings":"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"}