@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
package/dist/cli.js CHANGED
@@ -6,15 +6,22 @@ export class CliUsageError extends Error {
6
6
  }
7
7
  }
8
8
  export function parseCliArgs(args) {
9
+ if (args[0] === "web")
10
+ return parseWebArgs(args.slice(1));
11
+ if (args.length === 1 && args[0] === "--trace-plugins")
12
+ return { kind: "observe", action: "trace" };
13
+ if (args.length === 1 && args[0] === "--dump-composition")
14
+ return { kind: "observe", action: "dump-composition" };
9
15
  if (args[0] === "plugin") {
10
16
  const action = args[1];
11
17
  if (action !== "install" &&
12
18
  action !== "list" &&
19
+ action !== "get" &&
13
20
  action !== "enable" &&
14
21
  action !== "disable" &&
15
22
  action !== "update" &&
16
23
  action !== "remove")
17
- throw new CliUsageError("Plugin command must be install, list, enable, disable, update, or remove.");
24
+ throw new CliUsageError("Plugin command must be install, list, get, enable, disable, update, or remove.");
18
25
  const argument = args[2];
19
26
  if (args.length > 3 ||
20
27
  (action !== "list" && (argument === undefined || argument.trim() === "")) ||
@@ -38,6 +45,10 @@ export function parseCliArgs(args) {
38
45
  let continueSession = false;
39
46
  let noSkills = false;
40
47
  let noContextFiles = false;
48
+ let profile;
49
+ let compositionPath;
50
+ let noProjectPlugins = false;
51
+ let modeWasSelected = false;
41
52
  let projectTrust;
42
53
  const skillPaths = [];
43
54
  const imagePaths = [];
@@ -49,7 +60,11 @@ export function parseCliArgs(args) {
49
60
  continue;
50
61
  }
51
62
  if (argument === "--interactive") {
63
+ if (profile !== undefined && profile !== "interactive") {
64
+ throw new CliUsageError(`Cannot combine --profile ${profile} with --mode interactive.`);
65
+ }
52
66
  mode = "interactive";
67
+ modeWasSelected = true;
53
68
  continue;
54
69
  }
55
70
  if (argument === "-c" || argument === "--continue") {
@@ -64,6 +79,34 @@ export function parseCliArgs(args) {
64
79
  noContextFiles = true;
65
80
  continue;
66
81
  }
82
+ if (argument === "--no-project-plugins") {
83
+ noProjectPlugins = true;
84
+ continue;
85
+ }
86
+ if (argument === "--profile") {
87
+ const value = args[index + 1];
88
+ if (value !== "print" && value !== "json" && value !== "interactive") {
89
+ throw new CliUsageError("Option --profile expects print, json, or interactive.");
90
+ }
91
+ if (modeWasSelected && mode !== value) {
92
+ throw new CliUsageError(`Cannot combine --profile ${value} with --mode ${mode}.`);
93
+ }
94
+ profile = value;
95
+ mode = value;
96
+ index++;
97
+ continue;
98
+ }
99
+ if (argument === "--composition") {
100
+ const value = args[index + 1];
101
+ if (value === undefined || value.trim().length === 0) {
102
+ throw new CliUsageError("Option --composition requires a non-empty path.");
103
+ }
104
+ if (compositionPath !== undefined)
105
+ throw new CliUsageError("Option --composition may only be used once.");
106
+ compositionPath = value;
107
+ index++;
108
+ continue;
109
+ }
67
110
  if (argument === "--trust-project" || argument === "--untrust-project") {
68
111
  const nextTrust = argument === "--trust-project";
69
112
  if (projectTrust !== undefined && projectTrust !== nextTrust) {
@@ -98,7 +141,11 @@ export function parseCliArgs(args) {
98
141
  if (value !== "print" && value !== "json" && value !== "interactive") {
99
142
  throw new CliUsageError(`Unsupported mode "${value}". Expected print, json, or interactive.`);
100
143
  }
144
+ if (profile !== undefined && profile !== value) {
145
+ throw new CliUsageError(`Cannot combine --profile ${profile} with --mode ${value}.`);
146
+ }
101
147
  mode = value;
148
+ modeWasSelected = true;
102
149
  index++;
103
150
  continue;
104
151
  }
@@ -141,6 +188,9 @@ export function parseCliArgs(args) {
141
188
  ...(continueSession ? { continueSession: true } : {}),
142
189
  ...(noSkills ? { noSkills: true } : {}),
143
190
  ...(noContextFiles ? { noContextFiles: true } : {}),
191
+ ...(profile ? { profile } : {}),
192
+ ...(compositionPath ? { compositionPath } : {}),
193
+ ...(noProjectPlugins ? { noProjectPlugins: true } : {}),
144
194
  ...(skillPaths.length > 0 ? { skillPaths } : {}),
145
195
  ...(imagePaths.length > 0 ? { imagePaths } : {}),
146
196
  ...(projectTrust === undefined ? {} : { projectTrust }),
@@ -214,6 +264,30 @@ function parseMcpArgs(args) {
214
264
  throw new CliUsageError("MCP HTTP add requires <server-id> <url>.");
215
265
  return { kind: "mcp", action, transport, serverId: positional[0], url: positional[1], ...(scope ? { scope } : {}) };
216
266
  }
267
+ function parseWebArgs(args) {
268
+ let port = 0;
269
+ const workspaces = [];
270
+ for (let index = 0; index < args.length; index++) {
271
+ const arg = args[index];
272
+ if (arg === "--port") {
273
+ const value = args[++index];
274
+ if (value === undefined)
275
+ throw new CliUsageError("Option --port requires a value.");
276
+ port = Number(value);
277
+ }
278
+ else if (arg === "--workspace") {
279
+ const value = args[++index];
280
+ if (!value?.trim())
281
+ throw new CliUsageError("Option --workspace requires a path.");
282
+ workspaces.push(value);
283
+ }
284
+ else
285
+ throw new CliUsageError("Web command accepts --port <0-65535> and --workspace <path>.");
286
+ }
287
+ if (!Number.isSafeInteger(port) || port < 0 || port > 65_535)
288
+ throw new CliUsageError("Option --port expects a TCP port from 0 to 65535.");
289
+ return { kind: "web", port, ...(workspaces.length ? { workspaces } : {}) };
290
+ }
217
291
  export function helpText(locale) {
218
292
  const t = (key) => translate(locale, key);
219
293
  return `${t("usage")}
@@ -228,18 +302,31 @@ ${t("options")}
228
302
  --skill <path> ${t("skill")}
229
303
  --no-skills ${t("noSkills")}
230
304
  --no-context-files ${t("noContextFiles")}
305
+ --profile <profile> Select print, json, or interactive composition
306
+ --composition <path> Apply a JSON or YAML composition after project configuration
307
+ --no-project-plugins Skip .di-code/composition.yml for this run
231
308
  --trust-project ${t("trustProject")}
232
309
  --untrust-project ${t("untrustProject")}
233
310
  plugin <action> ${t("plugin")}
311
+ --trace-plugins Emit Loader phase, owner Fiber, capability, and failure diagnostics
312
+ --dump-composition Emit the resolved composition without configuration values
234
313
  mcp add|list|get|remove ${t("mcp")}
314
+ web [--port <port>] Start the local web application (default: an available port)
235
315
  -h, --help ${t("help")}
236
316
  -v, --version ${t("version")}
237
317
  `;
238
318
  }
319
+ /** Product-owned parser service consumed by the CLI composition entry. */
320
+ export function createCliParser() {
321
+ return {
322
+ parse: (args) => parseCliArgs(args),
323
+ help: (locale) => helpText(locale === "zh-CN" ? "zh-CN" : "en"),
324
+ };
325
+ }
239
326
  export async function runCli(args, dependencies) {
240
327
  let command;
241
328
  try {
242
- command = parseCliArgs(args);
329
+ command = dependencies.parser?.parse(args) ?? parseCliArgs(args);
243
330
  }
244
331
  catch (cause) {
245
332
  if (cause instanceof CliUsageError) {
@@ -250,12 +337,17 @@ export async function runCli(args, dependencies) {
250
337
  }
251
338
  switch (command.kind) {
252
339
  case "help":
253
- dependencies.stdout(helpText(dependencies.locale ?? DEFAULT_LOCALE));
340
+ dependencies.stdout(dependencies.parser?.help(dependencies.locale ?? DEFAULT_LOCALE) ??
341
+ helpText(dependencies.locale ?? DEFAULT_LOCALE));
254
342
  return 0;
255
343
  case "plugin":
256
344
  if (!dependencies.plugin)
257
345
  throw new Error("Plugin command handler is unavailable.");
258
346
  return dependencies.plugin(command);
347
+ case "observe":
348
+ if (!dependencies.observe)
349
+ throw new Error("Plugin observability command handler is unavailable.");
350
+ return dependencies.observe(command);
259
351
  case "mcp":
260
352
  if (!dependencies.mcp)
261
353
  throw new Error("MCP command handler is unavailable.");
@@ -265,6 +357,8 @@ export async function runCli(args, dependencies) {
265
357
  return 0;
266
358
  case "run":
267
359
  return dependencies.run(command);
360
+ case "web":
361
+ throw new Error("Web command must be handled by the executable entry point.");
268
362
  }
269
363
  }
270
364
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["import { DEFAULT_LOCALE, type Locale, translate } from \"./i18n.ts\";\n\nexport type OutputMode = \"print\" | \"json\" | \"interactive\";\n\nexport type CliCommand =\n\t| { kind: \"help\" }\n\t| { kind: \"version\" }\n\t| { kind: \"plugin\"; action: \"install\" | \"list\" | \"enable\" | \"disable\" | \"update\" | \"remove\"; argument?: string }\n\t| {\n\t\t\tkind: \"mcp\";\n\t\t\taction: \"add\" | \"list\" | \"get\" | \"remove\";\n\t\t\tscope?: \"local\" | \"project\" | \"user\";\n\t\t\tserverId?: string;\n\t\t\ttransport?: \"stdio\" | \"http\";\n\t\t\tcommand?: string;\n\t\t\targs?: readonly string[];\n\t\t\turl?: string;\n\t }\n\t| {\n\t\t\tkind: \"run\";\n\t\t\tmode: OutputMode;\n\t\t\tprompt: string;\n\t\t\tsessionPath?: string;\n\t\t\tcontinueSession?: true;\n\t\t\timagePaths?: readonly string[];\n\t\t\tnoSkills?: true;\n\t\t\tnoContextFiles?: true;\n\t\t\tskillPaths?: readonly string[];\n\t\t\tprojectTrust?: boolean;\n\t };\n\nexport class CliUsageError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"CliUsageError\";\n\t}\n}\n\nexport function parseCliArgs(args: readonly string[]): CliCommand {\n\tif (args[0] === \"plugin\") {\n\t\tconst action = args[1];\n\t\tif (\n\t\t\taction !== \"install\" &&\n\t\t\taction !== \"list\" &&\n\t\t\taction !== \"enable\" &&\n\t\t\taction !== \"disable\" &&\n\t\t\taction !== \"update\" &&\n\t\t\taction !== \"remove\"\n\t\t)\n\t\t\tthrow new CliUsageError(\"Plugin command must be install, list, enable, disable, update, or remove.\");\n\t\tconst argument = args[2];\n\t\tif (\n\t\t\targs.length > 3 ||\n\t\t\t(action !== \"list\" && (argument === undefined || argument.trim() === \"\")) ||\n\t\t\t(action === \"list\" && argument !== undefined)\n\t\t)\n\t\t\tthrow new CliUsageError(\"Plugin command has invalid arguments.\");\n\t\treturn { kind: \"plugin\", action, ...(argument ? { argument } : {}) };\n\t}\n\tif (args[0] === \"mcp\") return parseMcpArgs(args.slice(1));\n\tconst staticOption = args.find((argument) => [\"-h\", \"--help\", \"-v\", \"--version\"].includes(argument));\n\tif (staticOption !== undefined) {\n\t\tconst kind = staticOption === \"-h\" || staticOption === \"--help\" ? \"help\" : \"version\";\n\t\tif (args.length !== 1) {\n\t\t\tthrow new CliUsageError(`--${kind} must be used on its own.`);\n\t\t}\n\t\treturn { kind };\n\t}\n\n\tlet mode: OutputMode = \"print\";\n\tlet printAlias = false;\n\tlet sessionPath: string | undefined;\n\tlet continueSession = false;\n\tlet noSkills = false;\n\tlet noContextFiles = false;\n\tlet projectTrust: boolean | undefined;\n\tconst skillPaths: string[] = [];\n\tconst imagePaths: string[] = [];\n\tconst promptParts: string[] = [];\n\n\tfor (let index = 0; index < args.length; index++) {\n\t\tconst argument = args[index];\n\t\tif (argument === \"-p\" || argument === \"--print\") {\n\t\t\tprintAlias = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"--interactive\") {\n\t\t\tmode = \"interactive\";\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"-c\" || argument === \"--continue\") {\n\t\t\tcontinueSession = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"--no-skills\") {\n\t\t\tnoSkills = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"--no-context-files\") {\n\t\t\tnoContextFiles = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"--trust-project\" || argument === \"--untrust-project\") {\n\t\t\tconst nextTrust = argument === \"--trust-project\";\n\t\t\tif (projectTrust !== undefined && projectTrust !== nextTrust) {\n\t\t\t\tthrow new CliUsageError(\"Cannot combine --trust-project with --untrust-project.\");\n\t\t\t}\n\t\t\tprojectTrust = nextTrust;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"--skill\") {\n\t\t\tconst value = args[index + 1];\n\t\t\tif (value === undefined || value.trim().length === 0) {\n\t\t\t\tthrow new CliUsageError(\"Option --skill requires a non-empty value.\");\n\t\t\t}\n\t\t\tskillPaths.push(value);\n\t\t\tindex++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"--image\") {\n\t\t\tconst value = args[index + 1];\n\t\t\tif (value === undefined || value.trim().length === 0) {\n\t\t\t\tthrow new CliUsageError(\"Option --image requires a non-empty value.\");\n\t\t\t}\n\t\t\timagePaths.push(value);\n\t\t\tindex++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"--mode\") {\n\t\t\tconst value = args[index + 1];\n\t\t\tif (value === undefined) {\n\t\t\t\tthrow new CliUsageError(\"Option --mode requires a value.\");\n\t\t\t}\n\t\t\tif (value !== \"print\" && value !== \"json\" && value !== \"interactive\") {\n\t\t\t\tthrow new CliUsageError(`Unsupported mode \"${value}\". Expected print, json, or interactive.`);\n\t\t\t}\n\t\t\tmode = value;\n\t\t\tindex++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"--session\") {\n\t\t\tconst value = args[index + 1];\n\t\t\tif (value === undefined) {\n\t\t\t\tthrow new CliUsageError(\"Option --session requires a value.\");\n\t\t\t}\n\t\t\tif (value.trim().length === 0) {\n\t\t\t\tthrow new CliUsageError(\"Option --session requires a non-empty value.\");\n\t\t\t}\n\t\t\tsessionPath = value;\n\t\t\tindex++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument?.startsWith(\"-\")) {\n\t\t\tthrow new CliUsageError(`Unknown option \"${argument}\".`);\n\t\t}\n\t\tif (argument !== undefined) {\n\t\t\tpromptParts.push(argument);\n\t\t}\n\t}\n\n\tif (printAlias && mode !== \"print\") {\n\t\tthrow new CliUsageError(`Cannot combine --print with --mode ${mode}.`);\n\t}\n\tif (continueSession && sessionPath !== undefined) {\n\t\tthrow new CliUsageError(\"Cannot combine --continue with --session.\");\n\t}\n\tif (mode === \"interactive\" && imagePaths.length > 0) {\n\t\tthrow new CliUsageError(\"--image is not available in interactive mode.\");\n\t}\n\tif (promptParts.length === 0 && mode !== \"interactive\") {\n\t\tthrow new CliUsageError(\"A prompt is required.\");\n\t}\n\n\treturn {\n\t\tkind: \"run\",\n\t\tmode,\n\t\tprompt: promptParts.join(\" \"),\n\t\t...(sessionPath ? { sessionPath } : {}),\n\t\t...(continueSession ? { continueSession: true as const } : {}),\n\t\t...(noSkills ? { noSkills: true as const } : {}),\n\t\t...(noContextFiles ? { noContextFiles: true as const } : {}),\n\t\t...(skillPaths.length > 0 ? { skillPaths } : {}),\n\t\t...(imagePaths.length > 0 ? { imagePaths } : {}),\n\t\t...(projectTrust === undefined ? {} : { projectTrust }),\n\t};\n}\n\nfunction parseMcpArgs(args: readonly string[]): Extract<CliCommand, { kind: \"mcp\" }> {\n\tconst action = args[0];\n\tif (action !== \"add\" && action !== \"list\" && action !== \"get\" && action !== \"remove\")\n\t\tthrow new CliUsageError(\"MCP command must be add, list, get, or remove.\");\n\tlet scope: \"local\" | \"project\" | \"user\" | undefined;\n\tlet transport: \"stdio\" | \"http\" | undefined;\n\tconst positional: string[] = [];\n\tlet separator = -1;\n\tfor (let index = 1; index < args.length; index++) {\n\t\tconst argument = args[index];\n\t\tif (argument === \"--\") {\n\t\t\tseparator = index;\n\t\t\tbreak;\n\t\t}\n\t\tif (argument === \"--scope\") {\n\t\t\tconst value = args[++index];\n\t\t\tif (value !== \"local\" && value !== \"project\" && value !== \"user\")\n\t\t\t\tthrow new CliUsageError(\"Option --scope expects local, project, or user.\");\n\t\t\tif (scope !== undefined) throw new CliUsageError(\"Option --scope may only be used once.\");\n\t\t\tscope = value;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"--transport\") {\n\t\t\tconst value = args[++index];\n\t\t\tif (value !== \"stdio\" && value !== \"http\") throw new CliUsageError(\"Option --transport expects stdio or http.\");\n\t\t\tif (transport !== undefined) throw new CliUsageError(\"Option --transport may only be used once.\");\n\t\t\ttransport = value;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument.startsWith(\"-\")) throw new CliUsageError(`Unknown MCP option \"${argument}\".`);\n\t\tpositional.push(argument);\n\t}\n\tif (separator >= 0) positional.push(...args.slice(separator + 1));\n\tif (action === \"list\") {\n\t\tif (transport !== undefined || positional.length > 0)\n\t\t\tthrow new CliUsageError(\"MCP list accepts only an optional --scope.\");\n\t\treturn { kind: \"mcp\", action, ...(scope ? { scope } : {}) };\n\t}\n\tif (action === \"get\" || action === \"remove\") {\n\t\tif (transport !== undefined || positional.length !== 1 || positional[0].trim() === \"\")\n\t\t\tthrow new CliUsageError(`MCP ${action} requires exactly one server id.`);\n\t\treturn { kind: \"mcp\", action, serverId: positional[0], ...(scope ? { scope } : {}) };\n\t}\n\tconst selectedTransport = transport ?? (separator >= 0 ? \"stdio\" : undefined);\n\tif (selectedTransport === undefined)\n\t\tthrow new CliUsageError(\n\t\t\t\"MCP add requires <server-id> -- <command> [args...] or --transport http <server-id> <url>.\",\n\t\t);\n\tif (selectedTransport === \"stdio\") {\n\t\tif (positional.length < 2 || separator < 0)\n\t\t\tthrow new CliUsageError(\"MCP stdio add requires <server-id> -- <command> [args...].\");\n\t\treturn {\n\t\t\tkind: \"mcp\",\n\t\t\taction,\n\t\t\ttransport: \"stdio\",\n\t\t\tserverId: positional[0],\n\t\t\tcommand: positional[1],\n\t\t\t...(positional.length > 2 ? { args: positional.slice(2) } : {}),\n\t\t\t...(scope ? { scope } : {}),\n\t\t};\n\t}\n\tif (separator >= 0 || positional.length !== 2) throw new CliUsageError(\"MCP HTTP add requires <server-id> <url>.\");\n\treturn { kind: \"mcp\", action, transport, serverId: positional[0], url: positional[1], ...(scope ? { scope } : {}) };\n}\n\nexport function helpText(locale: Locale): string {\n\tconst t = (key: string) => translate(locale, key);\n\treturn `${t(\"usage\")}\n\n${t(\"options\")}\n -p, --print ${t(\"print\")}\n --mode <mode> ${t(\"mode\")}\n --interactive ${t(\"interactive\")}\n --continue, -c ${t(\"continueSession\")}\n --session <path> ${t(\"session\")}\n --image <path> ${t(\"image\")}\n --skill <path> ${t(\"skill\")}\n --no-skills ${t(\"noSkills\")}\n --no-context-files ${t(\"noContextFiles\")}\n --trust-project ${t(\"trustProject\")}\n --untrust-project ${t(\"untrustProject\")}\n plugin <action> ${t(\"plugin\")}\n mcp add|list|get|remove ${t(\"mcp\")}\n -h, --help ${t(\"help\")}\n -v, --version ${t(\"version\")}\n`;\n}\n\nexport interface CliDependencies {\n\tstdout(text: string): void;\n\tstderr(text: string): void;\n\trun(command: Extract<CliCommand, { kind: \"run\" }>): Promise<number>;\n\tplugin?(command: Extract<CliCommand, { kind: \"plugin\" }>): Promise<number>;\n\tmcp?(command: Extract<CliCommand, { kind: \"mcp\" }>): Promise<number>;\n\treadonly version: string;\n\treadonly locale?: Locale;\n}\n\nexport async function runCli(args: readonly string[], dependencies: CliDependencies): Promise<number> {\n\tlet command: CliCommand;\n\ttry {\n\t\tcommand = parseCliArgs(args);\n\t} catch (cause) {\n\t\tif (cause instanceof CliUsageError) {\n\t\t\tdependencies.stderr(`${cause.message}\\n`);\n\t\t\treturn 1;\n\t\t}\n\t\tthrow cause;\n\t}\n\n\tswitch (command.kind) {\n\t\tcase \"help\":\n\t\t\tdependencies.stdout(helpText(dependencies.locale ?? DEFAULT_LOCALE));\n\t\t\treturn 0;\n\t\tcase \"plugin\":\n\t\t\tif (!dependencies.plugin) throw new Error(\"Plugin command handler is unavailable.\");\n\t\t\treturn dependencies.plugin(command);\n\t\tcase \"mcp\":\n\t\t\tif (!dependencies.mcp) throw new Error(\"MCP command handler is unavailable.\");\n\t\t\treturn dependencies.mcp(command);\n\t\tcase \"version\":\n\t\t\tdependencies.stdout(`${dependencies.version}\\n`);\n\t\t\treturn 0;\n\t\tcase \"run\":\n\t\t\treturn dependencies.run(command);\n\t}\n}\n"]}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CliParser } from \"@di-code/builtins\";\nimport { DEFAULT_LOCALE, type Locale, translate } from \"./i18n.ts\";\n\nexport type OutputMode = \"print\" | \"json\" | \"interactive\";\nexport type CompositionProfile = OutputMode;\n\nexport type CliCommand =\n\t| { kind: \"help\" }\n\t| { kind: \"version\" }\n\t| { kind: \"web\"; port: number; workspaces?: readonly string[] }\n\t| { kind: \"observe\"; action: \"trace\" | \"dump-composition\" }\n\t| {\n\t\t\tkind: \"plugin\";\n\t\t\taction: \"install\" | \"list\" | \"get\" | \"enable\" | \"disable\" | \"update\" | \"remove\";\n\t\t\targument?: string;\n\t }\n\t| {\n\t\t\tkind: \"mcp\";\n\t\t\taction: \"add\" | \"list\" | \"get\" | \"remove\";\n\t\t\tscope?: \"local\" | \"project\" | \"user\";\n\t\t\tserverId?: string;\n\t\t\ttransport?: \"stdio\" | \"http\";\n\t\t\tcommand?: string;\n\t\t\targs?: readonly string[];\n\t\t\turl?: string;\n\t }\n\t| {\n\t\t\tkind: \"run\";\n\t\t\tmode: OutputMode;\n\t\t\tprompt: string;\n\t\t\tsessionPath?: string;\n\t\t\tcontinueSession?: true;\n\t\t\timagePaths?: readonly string[];\n\t\t\tnoSkills?: true;\n\t\t\tnoContextFiles?: true;\n\t\t\t/** Selects the composition matching the output mode. */\n\t\t\tprofile?: CompositionProfile;\n\t\t\t/** An explicit composition document applied after user and project layers. */\n\t\t\tcompositionPath?: string;\n\t\t\t/** Excludes the project composition layer without affecting user-managed plugins. */\n\t\t\tnoProjectPlugins?: true;\n\t\t\tskillPaths?: readonly string[];\n\t\t\tprojectTrust?: boolean;\n\t };\n\nexport class CliUsageError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"CliUsageError\";\n\t}\n}\n\nexport function parseCliArgs(args: readonly string[]): CliCommand {\n\tif (args[0] === \"web\") return parseWebArgs(args.slice(1));\n\tif (args.length === 1 && args[0] === \"--trace-plugins\") return { kind: \"observe\", action: \"trace\" };\n\tif (args.length === 1 && args[0] === \"--dump-composition\") return { kind: \"observe\", action: \"dump-composition\" };\n\tif (args[0] === \"plugin\") {\n\t\tconst action = args[1];\n\t\tif (\n\t\t\taction !== \"install\" &&\n\t\t\taction !== \"list\" &&\n\t\t\taction !== \"get\" &&\n\t\t\taction !== \"enable\" &&\n\t\t\taction !== \"disable\" &&\n\t\t\taction !== \"update\" &&\n\t\t\taction !== \"remove\"\n\t\t)\n\t\t\tthrow new CliUsageError(\"Plugin command must be install, list, get, enable, disable, update, or remove.\");\n\t\tconst argument = args[2];\n\t\tif (\n\t\t\targs.length > 3 ||\n\t\t\t(action !== \"list\" && (argument === undefined || argument.trim() === \"\")) ||\n\t\t\t(action === \"list\" && argument !== undefined)\n\t\t)\n\t\t\tthrow new CliUsageError(\"Plugin command has invalid arguments.\");\n\t\treturn { kind: \"plugin\", action, ...(argument ? { argument } : {}) };\n\t}\n\tif (args[0] === \"mcp\") return parseMcpArgs(args.slice(1));\n\tconst staticOption = args.find((argument) => [\"-h\", \"--help\", \"-v\", \"--version\"].includes(argument));\n\tif (staticOption !== undefined) {\n\t\tconst kind = staticOption === \"-h\" || staticOption === \"--help\" ? \"help\" : \"version\";\n\t\tif (args.length !== 1) {\n\t\t\tthrow new CliUsageError(`--${kind} must be used on its own.`);\n\t\t}\n\t\treturn { kind };\n\t}\n\n\tlet mode: OutputMode = \"print\";\n\tlet printAlias = false;\n\tlet sessionPath: string | undefined;\n\tlet continueSession = false;\n\tlet noSkills = false;\n\tlet noContextFiles = false;\n\tlet profile: CompositionProfile | undefined;\n\tlet compositionPath: string | undefined;\n\tlet noProjectPlugins = false;\n\tlet modeWasSelected = false;\n\tlet projectTrust: boolean | undefined;\n\tconst skillPaths: string[] = [];\n\tconst imagePaths: string[] = [];\n\tconst promptParts: string[] = [];\n\n\tfor (let index = 0; index < args.length; index++) {\n\t\tconst argument = args[index];\n\t\tif (argument === \"-p\" || argument === \"--print\") {\n\t\t\tprintAlias = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"--interactive\") {\n\t\t\tif (profile !== undefined && profile !== \"interactive\") {\n\t\t\t\tthrow new CliUsageError(`Cannot combine --profile ${profile} with --mode interactive.`);\n\t\t\t}\n\t\t\tmode = \"interactive\";\n\t\t\tmodeWasSelected = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"-c\" || argument === \"--continue\") {\n\t\t\tcontinueSession = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"--no-skills\") {\n\t\t\tnoSkills = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"--no-context-files\") {\n\t\t\tnoContextFiles = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"--no-project-plugins\") {\n\t\t\tnoProjectPlugins = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"--profile\") {\n\t\t\tconst value = args[index + 1];\n\t\t\tif (value !== \"print\" && value !== \"json\" && value !== \"interactive\") {\n\t\t\t\tthrow new CliUsageError(\"Option --profile expects print, json, or interactive.\");\n\t\t\t}\n\t\t\tif (modeWasSelected && mode !== value) {\n\t\t\t\tthrow new CliUsageError(`Cannot combine --profile ${value} with --mode ${mode}.`);\n\t\t\t}\n\t\t\tprofile = value;\n\t\t\tmode = value;\n\t\t\tindex++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"--composition\") {\n\t\t\tconst value = args[index + 1];\n\t\t\tif (value === undefined || value.trim().length === 0) {\n\t\t\t\tthrow new CliUsageError(\"Option --composition requires a non-empty path.\");\n\t\t\t}\n\t\t\tif (compositionPath !== undefined) throw new CliUsageError(\"Option --composition may only be used once.\");\n\t\t\tcompositionPath = value;\n\t\t\tindex++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"--trust-project\" || argument === \"--untrust-project\") {\n\t\t\tconst nextTrust = argument === \"--trust-project\";\n\t\t\tif (projectTrust !== undefined && projectTrust !== nextTrust) {\n\t\t\t\tthrow new CliUsageError(\"Cannot combine --trust-project with --untrust-project.\");\n\t\t\t}\n\t\t\tprojectTrust = nextTrust;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"--skill\") {\n\t\t\tconst value = args[index + 1];\n\t\t\tif (value === undefined || value.trim().length === 0) {\n\t\t\t\tthrow new CliUsageError(\"Option --skill requires a non-empty value.\");\n\t\t\t}\n\t\t\tskillPaths.push(value);\n\t\t\tindex++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"--image\") {\n\t\t\tconst value = args[index + 1];\n\t\t\tif (value === undefined || value.trim().length === 0) {\n\t\t\t\tthrow new CliUsageError(\"Option --image requires a non-empty value.\");\n\t\t\t}\n\t\t\timagePaths.push(value);\n\t\t\tindex++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"--mode\") {\n\t\t\tconst value = args[index + 1];\n\t\t\tif (value === undefined) {\n\t\t\t\tthrow new CliUsageError(\"Option --mode requires a value.\");\n\t\t\t}\n\t\t\tif (value !== \"print\" && value !== \"json\" && value !== \"interactive\") {\n\t\t\t\tthrow new CliUsageError(`Unsupported mode \"${value}\". Expected print, json, or interactive.`);\n\t\t\t}\n\t\t\tif (profile !== undefined && profile !== value) {\n\t\t\t\tthrow new CliUsageError(`Cannot combine --profile ${profile} with --mode ${value}.`);\n\t\t\t}\n\t\t\tmode = value;\n\t\t\tmodeWasSelected = true;\n\t\t\tindex++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"--session\") {\n\t\t\tconst value = args[index + 1];\n\t\t\tif (value === undefined) {\n\t\t\t\tthrow new CliUsageError(\"Option --session requires a value.\");\n\t\t\t}\n\t\t\tif (value.trim().length === 0) {\n\t\t\t\tthrow new CliUsageError(\"Option --session requires a non-empty value.\");\n\t\t\t}\n\t\t\tsessionPath = value;\n\t\t\tindex++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument?.startsWith(\"-\")) {\n\t\t\tthrow new CliUsageError(`Unknown option \"${argument}\".`);\n\t\t}\n\t\tif (argument !== undefined) {\n\t\t\tpromptParts.push(argument);\n\t\t}\n\t}\n\n\tif (printAlias && mode !== \"print\") {\n\t\tthrow new CliUsageError(`Cannot combine --print with --mode ${mode}.`);\n\t}\n\tif (continueSession && sessionPath !== undefined) {\n\t\tthrow new CliUsageError(\"Cannot combine --continue with --session.\");\n\t}\n\tif (mode === \"interactive\" && imagePaths.length > 0) {\n\t\tthrow new CliUsageError(\"--image is not available in interactive mode.\");\n\t}\n\tif (promptParts.length === 0 && mode !== \"interactive\") {\n\t\tthrow new CliUsageError(\"A prompt is required.\");\n\t}\n\n\treturn {\n\t\tkind: \"run\",\n\t\tmode,\n\t\tprompt: promptParts.join(\" \"),\n\t\t...(sessionPath ? { sessionPath } : {}),\n\t\t...(continueSession ? { continueSession: true as const } : {}),\n\t\t...(noSkills ? { noSkills: true as const } : {}),\n\t\t...(noContextFiles ? { noContextFiles: true as const } : {}),\n\t\t...(profile ? { profile } : {}),\n\t\t...(compositionPath ? { compositionPath } : {}),\n\t\t...(noProjectPlugins ? { noProjectPlugins: true as const } : {}),\n\t\t...(skillPaths.length > 0 ? { skillPaths } : {}),\n\t\t...(imagePaths.length > 0 ? { imagePaths } : {}),\n\t\t...(projectTrust === undefined ? {} : { projectTrust }),\n\t};\n}\n\nfunction parseMcpArgs(args: readonly string[]): Extract<CliCommand, { kind: \"mcp\" }> {\n\tconst action = args[0];\n\tif (action !== \"add\" && action !== \"list\" && action !== \"get\" && action !== \"remove\")\n\t\tthrow new CliUsageError(\"MCP command must be add, list, get, or remove.\");\n\tlet scope: \"local\" | \"project\" | \"user\" | undefined;\n\tlet transport: \"stdio\" | \"http\" | undefined;\n\tconst positional: string[] = [];\n\tlet separator = -1;\n\tfor (let index = 1; index < args.length; index++) {\n\t\tconst argument = args[index];\n\t\tif (argument === \"--\") {\n\t\t\tseparator = index;\n\t\t\tbreak;\n\t\t}\n\t\tif (argument === \"--scope\") {\n\t\t\tconst value = args[++index];\n\t\t\tif (value !== \"local\" && value !== \"project\" && value !== \"user\")\n\t\t\t\tthrow new CliUsageError(\"Option --scope expects local, project, or user.\");\n\t\t\tif (scope !== undefined) throw new CliUsageError(\"Option --scope may only be used once.\");\n\t\t\tscope = value;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument === \"--transport\") {\n\t\t\tconst value = args[++index];\n\t\t\tif (value !== \"stdio\" && value !== \"http\") throw new CliUsageError(\"Option --transport expects stdio or http.\");\n\t\t\tif (transport !== undefined) throw new CliUsageError(\"Option --transport may only be used once.\");\n\t\t\ttransport = value;\n\t\t\tcontinue;\n\t\t}\n\t\tif (argument.startsWith(\"-\")) throw new CliUsageError(`Unknown MCP option \"${argument}\".`);\n\t\tpositional.push(argument);\n\t}\n\tif (separator >= 0) positional.push(...args.slice(separator + 1));\n\tif (action === \"list\") {\n\t\tif (transport !== undefined || positional.length > 0)\n\t\t\tthrow new CliUsageError(\"MCP list accepts only an optional --scope.\");\n\t\treturn { kind: \"mcp\", action, ...(scope ? { scope } : {}) };\n\t}\n\tif (action === \"get\" || action === \"remove\") {\n\t\tif (transport !== undefined || positional.length !== 1 || positional[0].trim() === \"\")\n\t\t\tthrow new CliUsageError(`MCP ${action} requires exactly one server id.`);\n\t\treturn { kind: \"mcp\", action, serverId: positional[0], ...(scope ? { scope } : {}) };\n\t}\n\tconst selectedTransport = transport ?? (separator >= 0 ? \"stdio\" : undefined);\n\tif (selectedTransport === undefined)\n\t\tthrow new CliUsageError(\n\t\t\t\"MCP add requires <server-id> -- <command> [args...] or --transport http <server-id> <url>.\",\n\t\t);\n\tif (selectedTransport === \"stdio\") {\n\t\tif (positional.length < 2 || separator < 0)\n\t\t\tthrow new CliUsageError(\"MCP stdio add requires <server-id> -- <command> [args...].\");\n\t\treturn {\n\t\t\tkind: \"mcp\",\n\t\t\taction,\n\t\t\ttransport: \"stdio\",\n\t\t\tserverId: positional[0],\n\t\t\tcommand: positional[1],\n\t\t\t...(positional.length > 2 ? { args: positional.slice(2) } : {}),\n\t\t\t...(scope ? { scope } : {}),\n\t\t};\n\t}\n\tif (separator >= 0 || positional.length !== 2) throw new CliUsageError(\"MCP HTTP add requires <server-id> <url>.\");\n\treturn { kind: \"mcp\", action, transport, serverId: positional[0], url: positional[1], ...(scope ? { scope } : {}) };\n}\n\nfunction parseWebArgs(args: readonly string[]): Extract<CliCommand, { kind: \"web\" }> {\n\tlet port = 0;\n\tconst workspaces: string[] = [];\n\tfor (let index = 0; index < args.length; index++) {\n\t\tconst arg = args[index];\n\t\tif (arg === \"--port\") {\n\t\t\tconst value = args[++index];\n\t\t\tif (value === undefined) throw new CliUsageError(\"Option --port requires a value.\");\n\t\t\tport = Number(value);\n\t\t} else if (arg === \"--workspace\") {\n\t\t\tconst value = args[++index];\n\t\t\tif (!value?.trim()) throw new CliUsageError(\"Option --workspace requires a path.\");\n\t\t\tworkspaces.push(value);\n\t\t} else throw new CliUsageError(\"Web command accepts --port <0-65535> and --workspace <path>.\");\n\t}\n\tif (!Number.isSafeInteger(port) || port < 0 || port > 65_535)\n\t\tthrow new CliUsageError(\"Option --port expects a TCP port from 0 to 65535.\");\n\treturn { kind: \"web\", port, ...(workspaces.length ? { workspaces } : {}) };\n}\n\nexport function helpText(locale: Locale): string {\n\tconst t = (key: string) => translate(locale, key);\n\treturn `${t(\"usage\")}\n\n${t(\"options\")}\n -p, --print ${t(\"print\")}\n --mode <mode> ${t(\"mode\")}\n --interactive ${t(\"interactive\")}\n --continue, -c ${t(\"continueSession\")}\n --session <path> ${t(\"session\")}\n --image <path> ${t(\"image\")}\n --skill <path> ${t(\"skill\")}\n --no-skills ${t(\"noSkills\")}\n --no-context-files ${t(\"noContextFiles\")}\n --profile <profile> Select print, json, or interactive composition\n --composition <path> Apply a JSON or YAML composition after project configuration\n --no-project-plugins Skip .di-code/composition.yml for this run\n --trust-project ${t(\"trustProject\")}\n --untrust-project ${t(\"untrustProject\")}\n plugin <action> ${t(\"plugin\")}\n --trace-plugins Emit Loader phase, owner Fiber, capability, and failure diagnostics\n --dump-composition Emit the resolved composition without configuration values\n mcp add|list|get|remove ${t(\"mcp\")}\n web [--port <port>] Start the local web application (default: an available port)\n -h, --help ${t(\"help\")}\n -v, --version ${t(\"version\")}\n`;\n}\n\n/** Product-owned parser service consumed by the CLI composition entry. */\nexport function createCliParser(): CliParser<CliCommand> {\n\treturn {\n\t\tparse: (args) => parseCliArgs(args),\n\t\thelp: (locale) => helpText(locale === \"zh-CN\" ? \"zh-CN\" : \"en\"),\n\t};\n}\n\nexport interface CliDependencies {\n\tstdout(text: string): void;\n\tstderr(text: string): void;\n\trun(command: Extract<CliCommand, { kind: \"run\" }>): Promise<number>;\n\tplugin?(command: Extract<CliCommand, { kind: \"plugin\" }>): Promise<number>;\n\tobserve?(command: Extract<CliCommand, { kind: \"observe\" }>): Promise<number>;\n\tmcp?(command: Extract<CliCommand, { kind: \"mcp\" }>): Promise<number>;\n\treadonly version: string;\n\treadonly locale?: Locale;\n\treadonly parser?: CliParser<CliCommand>;\n}\n\nexport async function runCli(args: readonly string[], dependencies: CliDependencies): Promise<number> {\n\tlet command: CliCommand;\n\ttry {\n\t\tcommand = dependencies.parser?.parse(args) ?? parseCliArgs(args);\n\t} catch (cause) {\n\t\tif (cause instanceof CliUsageError) {\n\t\t\tdependencies.stderr(`${cause.message}\\n`);\n\t\t\treturn 1;\n\t\t}\n\t\tthrow cause;\n\t}\n\n\tswitch (command.kind) {\n\t\tcase \"help\":\n\t\t\tdependencies.stdout(\n\t\t\t\tdependencies.parser?.help(dependencies.locale ?? DEFAULT_LOCALE) ??\n\t\t\t\t\thelpText(dependencies.locale ?? DEFAULT_LOCALE),\n\t\t\t);\n\t\t\treturn 0;\n\t\tcase \"plugin\":\n\t\t\tif (!dependencies.plugin) throw new Error(\"Plugin command handler is unavailable.\");\n\t\t\treturn dependencies.plugin(command);\n\t\tcase \"observe\":\n\t\t\tif (!dependencies.observe) throw new Error(\"Plugin observability command handler is unavailable.\");\n\t\t\treturn dependencies.observe(command);\n\t\tcase \"mcp\":\n\t\t\tif (!dependencies.mcp) throw new Error(\"MCP command handler is unavailable.\");\n\t\t\treturn dependencies.mcp(command);\n\t\tcase \"version\":\n\t\t\tdependencies.stdout(`${dependencies.version}\\n`);\n\t\t\treturn 0;\n\t\tcase \"run\":\n\t\t\treturn dependencies.run(command);\n\t\tcase \"web\":\n\t\t\tthrow new Error(\"Web command must be handled by the executable entry point.\");\n\t}\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import { type CompositionEntry, createCompositionLoader, type PluginModule } from "@di-code/plugin-loader";
2
+ import { type PluginDefinition } from "@di-code/plugin-runtime";
3
+ export interface CompositionLoaderService {
4
+ readonly create: (entries: readonly CompositionEntry[], importModule: (name: string) => Promise<PluginModule>) => ReturnType<typeof createCompositionLoader>;
5
+ }
6
+ export declare const apiVersion: 1;
7
+ export declare const name = "composition-loader";
8
+ export declare const version = "0.1.7";
9
+ export declare const compositionLoaderKey: import("@di-code/plugin-runtime").ServiceKey<CompositionLoaderService>;
10
+ export declare const apply: PluginDefinition["apply"];
11
+ //# sourceMappingURL=composition-loader-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composition-loader-entry.d.ts","sourceRoot":"","sources":["../src/composition-loader-entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAE,uBAAuB,EAAE,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3G,OAAO,EAAkC,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhG,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,MAAM,EAAE,CAChB,OAAO,EAAE,SAAS,gBAAgB,EAAE,EACpC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,KACjD,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;CAChD;AAED,eAAO,MAAM,UAAU,EAAG,CAAU,CAAC;AACrC,eAAO,MAAM,IAAI,uBAAuB,CAAC;AACzC,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,oBAAoB,wEAAmE,CAAC;AACrG,eAAO,MAAM,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAI3C,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { createCompositionLoader } from "@di-code/plugin-loader";
2
+ import { createServiceKey } from "@di-code/plugin-runtime";
3
+ export const apiVersion = 1;
4
+ export const name = "composition-loader";
5
+ export const version = "0.1.7";
6
+ export const compositionLoaderKey = createServiceKey("composition-loader");
7
+ export const apply = (context) => {
8
+ context.set(compositionLoaderKey, {
9
+ create: (entries, importModule) => createCompositionLoader({ context, entries, importModule }),
10
+ });
11
+ };
12
+ //# sourceMappingURL=composition-loader-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composition-loader-entry.js","sourceRoot":"","sources":["../src/composition-loader-entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,uBAAuB,EAAqB,MAAM,wBAAwB,CAAC;AAC3G,OAAO,EAAgB,gBAAgB,EAAyB,MAAM,yBAAyB,CAAC;AAShG,MAAM,CAAC,MAAM,UAAU,GAAG,CAAU,CAAC;AACrC,MAAM,CAAC,MAAM,IAAI,GAAG,oBAAoB,CAAC;AACzC,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAC/B,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAA2B,oBAAoB,CAAC,CAAC;AACrG,MAAM,CAAC,MAAM,KAAK,GAA8B,CAAC,OAAgB,EAAE,EAAE;IACpE,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE;QACjC,MAAM,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,uBAAuB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;KAC9F,CAAC,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { type CompositionEntry, createCompositionLoader, type PluginModule } from \"@di-code/plugin-loader\";\nimport { type Context, createServiceKey, type PluginDefinition } from \"@di-code/plugin-runtime\";\n\nexport interface CompositionLoaderService {\n\treadonly create: (\n\t\tentries: readonly CompositionEntry[],\n\t\timportModule: (name: string) => Promise<PluginModule>,\n\t) => ReturnType<typeof createCompositionLoader>;\n}\n\nexport const apiVersion = 1 as const;\nexport const name = \"composition-loader\";\nexport const version = \"0.1.7\";\nexport const compositionLoaderKey = createServiceKey<CompositionLoaderService>(\"composition-loader\");\nexport const apply: PluginDefinition[\"apply\"] = (context: Context) => {\n\tcontext.set(compositionLoaderKey, {\n\t\tcreate: (entries, importModule) => createCompositionLoader({ context, entries, importModule }),\n\t});\n};\n"]}
@@ -0,0 +1,32 @@
1
+ import { type CompositionEntry, type PluginModule } from "@di-code/plugin-loader";
2
+ export type DefaultCompositionName = "base" | "interactive" | "print" | "json" | "rpc" | "webui";
3
+ export interface CompositionResolutionOptions {
4
+ /** Work root used for project composition discovery and the workspace capability. */
5
+ readonly cwd?: string;
6
+ /** User data root containing the optional user composition document. */
7
+ readonly agentDir?: string;
8
+ /** Explicit JSON or YAML composition document applied last. */
9
+ readonly compositionPath?: string;
10
+ /** Excludes the project composition document for this invocation. */
11
+ readonly includeProjectComposition?: boolean;
12
+ readonly observability?: boolean;
13
+ readonly allowedRoot?: string;
14
+ }
15
+ /** Resolves the package-owned base plus exactly one mode document. */
16
+ export declare function resolveDefaultComposition(name: DefaultCompositionName, options?: {
17
+ readonly observability?: boolean;
18
+ readonly allowedRoot?: string;
19
+ }): Promise<readonly CompositionEntry[]>;
20
+ /**
21
+ * Resolves built-in, user, project, and explicit composition layers in their fixed precedence order.
22
+ * Project entries are marked local so the Loader retains trust checks for entries added through project configuration.
23
+ */
24
+ export declare function resolveCompositionEntries(name: DefaultCompositionName, options?: CompositionResolutionOptions): Promise<readonly CompositionEntry[]>;
25
+ /**
26
+ * Resolves only enabled managed plugins before the Loader receives its entry list.
27
+ * Disabled manifests are not resolved or dynamically imported.
28
+ */
29
+ export declare function resolveManagedCompositionEntries(agentDir?: string): Promise<readonly CompositionEntry[]>;
30
+ /** Imports own composition entries from source in development; package exports handle published use. */
31
+ export declare function importCompositionModule(name: string): Promise<PluginModule>;
32
+ //# sourceMappingURL=compositions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compositions.d.ts","sourceRoot":"","sources":["../src/compositions.ts"],"names":[],"mappings":"AAGA,OAAO,EAEN,KAAK,gBAAgB,EAIrB,KAAK,YAAY,EAGjB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;AAEjG,MAAM,WAAW,4BAA4B;IAC5C,qFAAqF;IACrF,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,+DAA+D;IAC/D,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,qEAAqE;IACrE,QAAQ,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAC7C,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC9B;AAkBD,sEAAsE;AACtE,wBAAsB,yBAAyB,CAC9C,IAAI,EAAE,sBAAsB,EAC5B,OAAO,GAAE;IAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/E,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAetC;AAyDD;;;GAGG;AACH,wBAAsB,yBAAyB,CAC9C,IAAI,EAAE,sBAAsB,EAC5B,OAAO,GAAE,4BAAiC,GACxC,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC,CA2BtC;AAED;;;GAGG;AACH,wBAAsB,gCAAgC,CACrD,QAAQ,SAA8B,GACpC,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAatC;AAED,wGAAwG;AACxG,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAuC3E"}
@@ -0,0 +1,173 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ import { homedir } from "node:os";
10
+ import { join, resolve } from "node:path";
11
+ import { fileURLToPath, pathToFileURL } from "node:url";
12
+ import { mergeCompositionLayers, PluginInstallManager, readCompositionFile, resolvePackagePluginExport, } from "@di-code/plugin-loader";
13
+ const observabilityEntries = [
14
+ { id: "plugin-profiler", name: "@di-code/builtins/plugin-profiler", dependsOn: ["runtime"] },
15
+ { id: "plugin-invariants", name: "@di-code/builtins/plugin-invariants", dependsOn: ["runtime"] },
16
+ { id: "plugin-test-runtime", name: "@di-code/builtins/plugin-test-runtime", dependsOn: ["runtime"] },
17
+ { id: "plugin-trace", name: "@di-code/coding-agent/plugin-trace", dependsOn: ["plugin-inventory"] },
18
+ {
19
+ id: "plugin-dump-composition",
20
+ name: "@di-code/coding-agent/plugin-dump-composition",
21
+ dependsOn: ["plugin-inventory"],
22
+ },
23
+ ];
24
+ function builtinCompositionPath(name) {
25
+ return fileURLToPath(new URL(`../compositions/${name}.yml`, import.meta.url));
26
+ }
27
+ /** Resolves the package-owned base plus exactly one mode document. */
28
+ export async function resolveDefaultComposition(name, options = {}) {
29
+ const base = await readRequiredComposition(builtinCompositionPath("base"));
30
+ const mode = name === "base" ? { entries: [] } : await readRequiredComposition(builtinCompositionPath(name));
31
+ return Object.freeze(withWorkspaceRoot(mergeCompositionLayers([
32
+ { name: "base", document: base },
33
+ {
34
+ name: "mode",
35
+ document: { entries: [...(mode.entries ?? []), ...(options.observability ? observabilityEntries : [])] },
36
+ },
37
+ ]), options.allowedRoot));
38
+ }
39
+ function isJsonObject(value) {
40
+ return typeof value === "object" && value !== null && !Array.isArray(value);
41
+ }
42
+ function withWorkspaceRoot(entries, allowedRoot) {
43
+ if (allowedRoot === undefined)
44
+ return entries;
45
+ return entries.map((entry) => entry.id === "workspace"
46
+ ? { ...entry, config: { ...(isJsonObject(entry.config) ? entry.config : {}), allowedRoot } }
47
+ : entry);
48
+ }
49
+ function markProjectEntries(document) {
50
+ const mark = (entry) => ({ ...entry, projectLocal: true });
51
+ return {
52
+ ...(document.entries ? { entries: document.entries.map(mark) } : {}),
53
+ ...(document.patches
54
+ ? {
55
+ patches: document.patches.map((patch) => "entry" in patch && patch.entry !== undefined ? { ...patch, entry: mark(patch.entry) } : patch),
56
+ }
57
+ : {}),
58
+ };
59
+ }
60
+ function isMissingFile(cause) {
61
+ return typeof cause === "object" && cause !== null && "code" in cause && cause.code === "ENOENT";
62
+ }
63
+ async function readOptionalComposition(filePath) {
64
+ try {
65
+ return await readCompositionFile(filePath);
66
+ }
67
+ catch (cause) {
68
+ if (isMissingFile(cause))
69
+ return undefined;
70
+ const message = cause instanceof Error ? cause.message : String(cause);
71
+ throw new Error(`Failed to read composition ${filePath}: ${message}`, { cause });
72
+ }
73
+ }
74
+ async function readRequiredComposition(filePath) {
75
+ try {
76
+ return await readCompositionFile(filePath);
77
+ }
78
+ catch (cause) {
79
+ const message = cause instanceof Error ? cause.message : String(cause);
80
+ throw new Error(`Failed to read composition ${filePath}: ${message}`, { cause });
81
+ }
82
+ }
83
+ /**
84
+ * Resolves built-in, user, project, and explicit composition layers in their fixed precedence order.
85
+ * Project entries are marked local so the Loader retains trust checks for entries added through project configuration.
86
+ */
87
+ export async function resolveCompositionEntries(name, options = {}) {
88
+ const cwd = resolve(options.cwd ?? process.cwd());
89
+ const agentDir = resolve(options.agentDir ?? join(homedir(), ".di-code"));
90
+ const [base, mode] = await Promise.all([
91
+ readRequiredComposition(builtinCompositionPath("base")),
92
+ readRequiredComposition(builtinCompositionPath(name)),
93
+ ]);
94
+ const layers = [
95
+ { name: "base", document: base },
96
+ {
97
+ name: "mode",
98
+ document: {
99
+ entries: [...(mode.entries ?? []), ...(options.observability ? observabilityEntries : [])],
100
+ },
101
+ },
102
+ ];
103
+ const userComposition = await readOptionalComposition(join(agentDir, "composition.yml"));
104
+ if (userComposition !== undefined)
105
+ layers.push({ name: "user", document: userComposition });
106
+ if (options.includeProjectComposition !== false) {
107
+ const projectComposition = await readOptionalComposition(join(cwd, ".di-code", "composition.yml"));
108
+ if (projectComposition !== undefined)
109
+ layers.push({ name: "project", document: markProjectEntries(projectComposition) });
110
+ }
111
+ if (options.compositionPath !== undefined) {
112
+ layers.push({ name: "explicit", document: await readRequiredComposition(resolve(cwd, options.compositionPath)) });
113
+ }
114
+ return Object.freeze(withWorkspaceRoot(mergeCompositionLayers(layers), options.allowedRoot));
115
+ }
116
+ /**
117
+ * Resolves only enabled managed plugins before the Loader receives its entry list.
118
+ * Disabled manifests are not resolved or dynamically imported.
119
+ */
120
+ export async function resolveManagedCompositionEntries(agentDir = join(homedir(), ".di-code")) {
121
+ const manager = new PluginInstallManager({ managedRoot: join(resolve(agentDir), "plugins", "installed") });
122
+ const plugins = await manager.list();
123
+ return await Promise.all(plugins
124
+ .filter((plugin) => plugin.enabled)
125
+ .map(async (plugin) => ({
126
+ id: `managed.${plugin.id}`,
127
+ name: pathToFileURL(await resolvePackagePluginExport(plugin.installedPath, plugin.manifest.entry)).href,
128
+ dependsOn: ["Bootstrap"],
129
+ required: false,
130
+ })));
131
+ }
132
+ /** Imports own composition entries from source in development; package exports handle published use. */
133
+ export function importCompositionModule(name) {
134
+ switch (name) {
135
+ case "@di-code/coding-agent/plugin-manager":
136
+ return import("./plugin-manager.js");
137
+ case "@di-code/coding-agent/plugin-inventory":
138
+ return import("./plugin-inventory.js");
139
+ case "@di-code/coding-agent/plugin-trace":
140
+ return import("./plugin-trace.js");
141
+ case "@di-code/coding-agent/plugin-dump-composition":
142
+ return import("./plugin-dump-composition.js");
143
+ case "@di-code/coding-agent/mcp-config-entry":
144
+ return import("./mcp-config-entry.js");
145
+ case "@di-code/coding-agent/mcp-client-entry":
146
+ return import("./mcp-client-entry.js");
147
+ case "@di-code/coding-agent/mcp-transport-entry":
148
+ return import("./mcp-transport-entry.js");
149
+ case "@di-code/coding-agent/mcp-tools-entry":
150
+ return import("./mcp-tools-entry.js");
151
+ case "@di-code/coding-agent/session-factory-entry":
152
+ return import("./session-factory-entry.js");
153
+ case "@di-code/coding-agent/session-store-jsonl-entry":
154
+ return import("./session-store-jsonl-entry.js");
155
+ case "@di-code/coding-agent/rpc-server-entry":
156
+ return import("./rpc-server-entry.js");
157
+ case "@di-code/coding-agent/interactive-resources-entry":
158
+ return import("./interactive-resources-entry.js");
159
+ case "@di-code/coding-agent/interactive-host-entry":
160
+ return import("./interactive-host-entry.js");
161
+ case "@di-code/coding-agent/runtime-core-entry":
162
+ return import("./runtime-core-entry.js");
163
+ case "@di-code/coding-agent/composition-loader-entry":
164
+ return import("./composition-loader-entry.js");
165
+ case "@di-code/coding-agent/project-trust-entry":
166
+ return import("./project-trust-entry.js");
167
+ case "@di-code/coding-agent/rpc-client-sdk-entry":
168
+ return import("./rpc-client-sdk-entry.js");
169
+ default:
170
+ return import(__rewriteRelativeImportExtension(name));
171
+ }
172
+ }
173
+ //# sourceMappingURL=compositions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compositions.js","sourceRoot":"","sources":["../src/compositions.ts"],"names":[],"mappings":"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","sourcesContent":["import { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport {\n\ttype CompositionDocument,\n\ttype CompositionEntry,\n\ttype CompositionLayer,\n\tmergeCompositionLayers,\n\tPluginInstallManager,\n\ttype PluginModule,\n\treadCompositionFile,\n\tresolvePackagePluginExport,\n} from \"@di-code/plugin-loader\";\n\nexport type DefaultCompositionName = \"base\" | \"interactive\" | \"print\" | \"json\" | \"rpc\" | \"webui\";\n\nexport interface CompositionResolutionOptions {\n\t/** Work root used for project composition discovery and the workspace capability. */\n\treadonly cwd?: string;\n\t/** User data root containing the optional user composition document. */\n\treadonly agentDir?: string;\n\t/** Explicit JSON or YAML composition document applied last. */\n\treadonly compositionPath?: string;\n\t/** Excludes the project composition document for this invocation. */\n\treadonly includeProjectComposition?: boolean;\n\treadonly observability?: boolean;\n\treadonly allowedRoot?: string;\n}\n\nconst observabilityEntries = [\n\t{ id: \"plugin-profiler\", name: \"@di-code/builtins/plugin-profiler\", dependsOn: [\"runtime\"] },\n\t{ id: \"plugin-invariants\", name: \"@di-code/builtins/plugin-invariants\", dependsOn: [\"runtime\"] },\n\t{ id: \"plugin-test-runtime\", name: \"@di-code/builtins/plugin-test-runtime\", dependsOn: [\"runtime\"] },\n\t{ id: \"plugin-trace\", name: \"@di-code/coding-agent/plugin-trace\", dependsOn: [\"plugin-inventory\"] },\n\t{\n\t\tid: \"plugin-dump-composition\",\n\t\tname: \"@di-code/coding-agent/plugin-dump-composition\",\n\t\tdependsOn: [\"plugin-inventory\"],\n\t},\n] as const satisfies readonly CompositionEntry[];\n\nfunction builtinCompositionPath(name: DefaultCompositionName): string {\n\treturn fileURLToPath(new URL(`../compositions/${name}.yml`, import.meta.url));\n}\n\n/** Resolves the package-owned base plus exactly one mode document. */\nexport async function resolveDefaultComposition(\n\tname: DefaultCompositionName,\n\toptions: { readonly observability?: boolean; readonly allowedRoot?: string } = {},\n): Promise<readonly CompositionEntry[]> {\n\tconst base = await readRequiredComposition(builtinCompositionPath(\"base\"));\n\tconst mode = name === \"base\" ? { entries: [] } : await readRequiredComposition(builtinCompositionPath(name));\n\treturn Object.freeze(\n\t\twithWorkspaceRoot(\n\t\t\tmergeCompositionLayers([\n\t\t\t\t{ name: \"base\", document: base },\n\t\t\t\t{\n\t\t\t\t\tname: \"mode\",\n\t\t\t\t\tdocument: { entries: [...(mode.entries ?? []), ...(options.observability ? observabilityEntries : [])] },\n\t\t\t\t},\n\t\t\t]),\n\t\t\toptions.allowedRoot,\n\t\t),\n\t);\n}\n\nfunction isJsonObject(\n\tvalue: CompositionEntry[\"config\"],\n): value is Readonly<Record<string, import(\"@di-code/plugin-loader\").JsonValue>> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction withWorkspaceRoot(\n\tentries: readonly CompositionEntry[],\n\tallowedRoot: string | undefined,\n): readonly CompositionEntry[] {\n\tif (allowedRoot === undefined) return entries;\n\treturn entries.map((entry) =>\n\t\tentry.id === \"workspace\"\n\t\t\t? { ...entry, config: { ...(isJsonObject(entry.config) ? entry.config : {}), allowedRoot } }\n\t\t\t: entry,\n\t);\n}\n\nfunction markProjectEntries(document: CompositionDocument): CompositionDocument {\n\tconst mark = (entry: CompositionEntry): CompositionEntry => ({ ...entry, projectLocal: true });\n\treturn {\n\t\t...(document.entries ? { entries: document.entries.map(mark) } : {}),\n\t\t...(document.patches\n\t\t\t? {\n\t\t\t\t\tpatches: document.patches.map((patch) =>\n\t\t\t\t\t\t\"entry\" in patch && patch.entry !== undefined ? { ...patch, entry: mark(patch.entry) } : patch,\n\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n}\n\nfunction isMissingFile(cause: unknown): boolean {\n\treturn typeof cause === \"object\" && cause !== null && \"code\" in cause && cause.code === \"ENOENT\";\n}\n\nasync function readOptionalComposition(filePath: string): Promise<CompositionDocument | undefined> {\n\ttry {\n\t\treturn await readCompositionFile(filePath);\n\t} catch (cause) {\n\t\tif (isMissingFile(cause)) return undefined;\n\t\tconst message = cause instanceof Error ? cause.message : String(cause);\n\t\tthrow new Error(`Failed to read composition ${filePath}: ${message}`, { cause });\n\t}\n}\n\nasync function readRequiredComposition(filePath: string): Promise<CompositionDocument> {\n\ttry {\n\t\treturn await readCompositionFile(filePath);\n\t} catch (cause) {\n\t\tconst message = cause instanceof Error ? cause.message : String(cause);\n\t\tthrow new Error(`Failed to read composition ${filePath}: ${message}`, { cause });\n\t}\n}\n\n/**\n * Resolves built-in, user, project, and explicit composition layers in their fixed precedence order.\n * Project entries are marked local so the Loader retains trust checks for entries added through project configuration.\n */\nexport async function resolveCompositionEntries(\n\tname: DefaultCompositionName,\n\toptions: CompositionResolutionOptions = {},\n): Promise<readonly CompositionEntry[]> {\n\tconst cwd = resolve(options.cwd ?? process.cwd());\n\tconst agentDir = resolve(options.agentDir ?? join(homedir(), \".di-code\"));\n\tconst [base, mode] = await Promise.all([\n\t\treadRequiredComposition(builtinCompositionPath(\"base\")),\n\t\treadRequiredComposition(builtinCompositionPath(name)),\n\t]);\n\tconst layers: CompositionLayer[] = [\n\t\t{ name: \"base\", document: base },\n\t\t{\n\t\t\tname: \"mode\",\n\t\t\tdocument: {\n\t\t\t\tentries: [...(mode.entries ?? []), ...(options.observability ? observabilityEntries : [])],\n\t\t\t},\n\t\t},\n\t];\n\tconst userComposition = await readOptionalComposition(join(agentDir, \"composition.yml\"));\n\tif (userComposition !== undefined) layers.push({ name: \"user\", document: userComposition });\n\tif (options.includeProjectComposition !== false) {\n\t\tconst projectComposition = await readOptionalComposition(join(cwd, \".di-code\", \"composition.yml\"));\n\t\tif (projectComposition !== undefined)\n\t\t\tlayers.push({ name: \"project\", document: markProjectEntries(projectComposition) });\n\t}\n\tif (options.compositionPath !== undefined) {\n\t\tlayers.push({ name: \"explicit\", document: await readRequiredComposition(resolve(cwd, options.compositionPath)) });\n\t}\n\treturn Object.freeze(withWorkspaceRoot(mergeCompositionLayers(layers), options.allowedRoot));\n}\n\n/**\n * Resolves only enabled managed plugins before the Loader receives its entry list.\n * Disabled manifests are not resolved or dynamically imported.\n */\nexport async function resolveManagedCompositionEntries(\n\tagentDir = join(homedir(), \".di-code\"),\n): Promise<readonly CompositionEntry[]> {\n\tconst manager = new PluginInstallManager({ managedRoot: join(resolve(agentDir), \"plugins\", \"installed\") });\n\tconst plugins = await manager.list();\n\treturn await Promise.all(\n\t\tplugins\n\t\t\t.filter((plugin) => plugin.enabled)\n\t\t\t.map(async (plugin) => ({\n\t\t\t\tid: `managed.${plugin.id}`,\n\t\t\t\tname: pathToFileURL(await resolvePackagePluginExport(plugin.installedPath, plugin.manifest.entry)).href,\n\t\t\t\tdependsOn: [\"Bootstrap\"],\n\t\t\t\trequired: false,\n\t\t\t})),\n\t);\n}\n\n/** Imports own composition entries from source in development; package exports handle published use. */\nexport function importCompositionModule(name: string): Promise<PluginModule> {\n\tswitch (name) {\n\t\tcase \"@di-code/coding-agent/plugin-manager\":\n\t\t\treturn import(\"./plugin-manager.ts\") as Promise<PluginModule>;\n\t\tcase \"@di-code/coding-agent/plugin-inventory\":\n\t\t\treturn import(\"./plugin-inventory.ts\") as Promise<PluginModule>;\n\t\tcase \"@di-code/coding-agent/plugin-trace\":\n\t\t\treturn import(\"./plugin-trace.ts\") as Promise<PluginModule>;\n\t\tcase \"@di-code/coding-agent/plugin-dump-composition\":\n\t\t\treturn import(\"./plugin-dump-composition.ts\") as Promise<PluginModule>;\n\t\tcase \"@di-code/coding-agent/mcp-config-entry\":\n\t\t\treturn import(\"./mcp-config-entry.ts\") as Promise<PluginModule>;\n\t\tcase \"@di-code/coding-agent/mcp-client-entry\":\n\t\t\treturn import(\"./mcp-client-entry.ts\") as Promise<PluginModule>;\n\t\tcase \"@di-code/coding-agent/mcp-transport-entry\":\n\t\t\treturn import(\"./mcp-transport-entry.ts\") as Promise<PluginModule>;\n\t\tcase \"@di-code/coding-agent/mcp-tools-entry\":\n\t\t\treturn import(\"./mcp-tools-entry.ts\") as Promise<PluginModule>;\n\t\tcase \"@di-code/coding-agent/session-factory-entry\":\n\t\t\treturn import(\"./session-factory-entry.ts\") as Promise<PluginModule>;\n\t\tcase \"@di-code/coding-agent/session-store-jsonl-entry\":\n\t\t\treturn import(\"./session-store-jsonl-entry.ts\") as Promise<PluginModule>;\n\t\tcase \"@di-code/coding-agent/rpc-server-entry\":\n\t\t\treturn import(\"./rpc-server-entry.ts\") as Promise<PluginModule>;\n\t\tcase \"@di-code/coding-agent/interactive-resources-entry\":\n\t\t\treturn import(\"./interactive-resources-entry.ts\") as Promise<PluginModule>;\n\t\tcase \"@di-code/coding-agent/interactive-host-entry\":\n\t\t\treturn import(\"./interactive-host-entry.ts\") as Promise<PluginModule>;\n\t\tcase \"@di-code/coding-agent/runtime-core-entry\":\n\t\t\treturn import(\"./runtime-core-entry.ts\") as Promise<PluginModule>;\n\t\tcase \"@di-code/coding-agent/composition-loader-entry\":\n\t\t\treturn import(\"./composition-loader-entry.ts\") as Promise<PluginModule>;\n\t\tcase \"@di-code/coding-agent/project-trust-entry\":\n\t\t\treturn import(\"./project-trust-entry.ts\") as Promise<PluginModule>;\n\t\tcase \"@di-code/coding-agent/rpc-client-sdk-entry\":\n\t\t\treturn import(\"./rpc-client-sdk-entry.ts\") as Promise<PluginModule>;\n\t\tdefault:\n\t\t\treturn import(name) as Promise<PluginModule>;\n\t}\n}\n"]}
@@ -1,7 +1,7 @@
1
- import type { Message } from "@di-code/ai";
1
+ import type { JsonValue, Message } from "@di-code/ai";
2
2
  import { type BuiltSessionContext } from "../context-builder.ts";
3
3
  import { type SessionAppendOptions } from "./session-storage.ts";
4
- import { type SessionDiagnostic, type SessionEntry, type SessionHeader, type SessionMessageEntry, type SessionSummaryEntry, type SessionTreeNode } from "./types.ts";
4
+ import { type SessionDiagnostic, type SessionEntry, type SessionHeader, type SessionMessageEntry, type SessionPluginEntry, type SessionSummaryEntry, type SessionTreeNode } from "./types.ts";
5
5
  export interface SessionManagerCreateOptions {
6
6
  readonly filePath: string;
7
7
  readonly cwd: string;
@@ -50,6 +50,13 @@ export declare class SessionManager {
50
50
  readonly firstKeptEntryId: string;
51
51
  readonly tokensBefore: number;
52
52
  }): Promise<SessionSummaryEntry>;
53
+ /** Appends host-owned metadata without exposing it as a transcript message. */
54
+ appendPlugin(input: {
55
+ readonly pluginId: string;
56
+ readonly pluginVersion: string;
57
+ readonly schemaVersion: number;
58
+ readonly data: JsonValue;
59
+ }): Promise<SessionPluginEntry>;
53
60
  private addToIndexes;
54
61
  }
55
62
  //# sourceMappingURL=session-manager.d.ts.map