@agimon-ai/doompi 0.0.1-alpha.0

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 (448) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +546 -0
  3. package/dist/_virtual/_rolldown/runtime.cjs +1 -0
  4. package/dist/bin/cli.cjs +3 -0
  5. package/dist/bin/cli.cjs.map +1 -0
  6. package/dist/bin/cli.d.cts +1 -0
  7. package/dist/bin/cli.d.mts +1 -0
  8. package/dist/bin/cli.mjs +3 -0
  9. package/dist/bin/cli.mjs.map +1 -0
  10. package/dist/bin/doomRunner.cjs +3 -0
  11. package/dist/bin/doomRunner.cjs.map +1 -0
  12. package/dist/bin/doomRunner.d.cts +1 -0
  13. package/dist/bin/doomRunner.d.mts +1 -0
  14. package/dist/bin/doomRunner.mjs +3 -0
  15. package/dist/bin/doomRunner.mjs.map +1 -0
  16. package/dist/cli/cliApp.cjs +2 -0
  17. package/dist/cli/cliApp.cjs.map +1 -0
  18. package/dist/cli/cliApp.d.cts +50 -0
  19. package/dist/cli/cliApp.d.cts.map +1 -0
  20. package/dist/cli/cliApp.d.mts +50 -0
  21. package/dist/cli/cliApp.d.mts.map +1 -0
  22. package/dist/cli/cliApp.mjs +2 -0
  23. package/dist/cli/cliApp.mjs.map +1 -0
  24. package/dist/cli/compatibilityOptions.cjs +2 -0
  25. package/dist/cli/compatibilityOptions.cjs.map +1 -0
  26. package/dist/cli/compatibilityOptions.d.cts +15 -0
  27. package/dist/cli/compatibilityOptions.d.cts.map +1 -0
  28. package/dist/cli/compatibilityOptions.d.mts +15 -0
  29. package/dist/cli/compatibilityOptions.d.mts.map +1 -0
  30. package/dist/cli/compatibilityOptions.mjs +2 -0
  31. package/dist/cli/compatibilityOptions.mjs.map +1 -0
  32. package/dist/cli/help.cjs +61 -0
  33. package/dist/cli/help.cjs.map +1 -0
  34. package/dist/cli/help.d.cts +6 -0
  35. package/dist/cli/help.d.cts.map +1 -0
  36. package/dist/cli/help.d.mts +6 -0
  37. package/dist/cli/help.d.mts.map +1 -0
  38. package/dist/cli/help.mjs +61 -0
  39. package/dist/cli/help.mjs.map +1 -0
  40. package/dist/cli/index.cjs +1 -0
  41. package/dist/cli/index.d.cts +5 -0
  42. package/dist/cli/index.d.mts +5 -0
  43. package/dist/cli/index.mjs +1 -0
  44. package/dist/cli/matrixOptions.cjs +2 -0
  45. package/dist/cli/matrixOptions.cjs.map +1 -0
  46. package/dist/cli/matrixOptions.d.cts +99 -0
  47. package/dist/cli/matrixOptions.d.cts.map +1 -0
  48. package/dist/cli/matrixOptions.d.mts +99 -0
  49. package/dist/cli/matrixOptions.d.mts.map +1 -0
  50. package/dist/cli/matrixOptions.mjs +2 -0
  51. package/dist/cli/matrixOptions.mjs.map +1 -0
  52. package/dist/cli/options.cjs +2 -0
  53. package/dist/cli/options.cjs.map +1 -0
  54. package/dist/cli/options.d.cts +7 -0
  55. package/dist/cli/options.d.cts.map +1 -0
  56. package/dist/cli/options.d.mts +7 -0
  57. package/dist/cli/options.d.mts.map +1 -0
  58. package/dist/cli/options.mjs +2 -0
  59. package/dist/cli/options.mjs.map +1 -0
  60. package/dist/commands/baseCommand.cjs +2 -0
  61. package/dist/commands/baseCommand.cjs.map +1 -0
  62. package/dist/commands/baseCommand.d.cts +36 -0
  63. package/dist/commands/baseCommand.d.cts.map +1 -0
  64. package/dist/commands/baseCommand.d.mts +36 -0
  65. package/dist/commands/baseCommand.d.mts.map +1 -0
  66. package/dist/commands/baseCommand.mjs +2 -0
  67. package/dist/commands/baseCommand.mjs.map +1 -0
  68. package/dist/commands/compatibilityCommand.cjs +2 -0
  69. package/dist/commands/compatibilityCommand.cjs.map +1 -0
  70. package/dist/commands/compatibilityCommand.d.cts +14 -0
  71. package/dist/commands/compatibilityCommand.d.cts.map +1 -0
  72. package/dist/commands/compatibilityCommand.d.mts +14 -0
  73. package/dist/commands/compatibilityCommand.d.mts.map +1 -0
  74. package/dist/commands/compatibilityCommand.mjs +2 -0
  75. package/dist/commands/compatibilityCommand.mjs.map +1 -0
  76. package/dist/commands/emitMcpCommand.cjs +2 -0
  77. package/dist/commands/emitMcpCommand.cjs.map +1 -0
  78. package/dist/commands/emitMcpCommand.d.cts +19 -0
  79. package/dist/commands/emitMcpCommand.d.cts.map +1 -0
  80. package/dist/commands/emitMcpCommand.d.mts +19 -0
  81. package/dist/commands/emitMcpCommand.d.mts.map +1 -0
  82. package/dist/commands/emitMcpCommand.mjs +2 -0
  83. package/dist/commands/emitMcpCommand.mjs.map +1 -0
  84. package/dist/commands/explainCommand.cjs +21 -0
  85. package/dist/commands/explainCommand.cjs.map +1 -0
  86. package/dist/commands/explainCommand.d.cts +63 -0
  87. package/dist/commands/explainCommand.d.cts.map +1 -0
  88. package/dist/commands/explainCommand.d.mts +63 -0
  89. package/dist/commands/explainCommand.d.mts.map +1 -0
  90. package/dist/commands/explainCommand.mjs +21 -0
  91. package/dist/commands/explainCommand.mjs.map +1 -0
  92. package/dist/commands/index.cjs +1 -0
  93. package/dist/commands/index.d.cts +8 -0
  94. package/dist/commands/index.d.mts +8 -0
  95. package/dist/commands/index.mjs +1 -0
  96. package/dist/commands/initCommand.cjs +3 -0
  97. package/dist/commands/initCommand.cjs.map +1 -0
  98. package/dist/commands/initCommand.d.cts +11 -0
  99. package/dist/commands/initCommand.d.cts.map +1 -0
  100. package/dist/commands/initCommand.d.mts +11 -0
  101. package/dist/commands/initCommand.d.mts.map +1 -0
  102. package/dist/commands/initCommand.mjs +3 -0
  103. package/dist/commands/initCommand.mjs.map +1 -0
  104. package/dist/commands/launchCommand.cjs +2 -0
  105. package/dist/commands/launchCommand.cjs.map +1 -0
  106. package/dist/commands/launchCommand.d.cts +31 -0
  107. package/dist/commands/launchCommand.d.cts.map +1 -0
  108. package/dist/commands/launchCommand.d.mts +31 -0
  109. package/dist/commands/launchCommand.d.mts.map +1 -0
  110. package/dist/commands/launchCommand.mjs +2 -0
  111. package/dist/commands/launchCommand.mjs.map +1 -0
  112. package/dist/commands/syncCommand.cjs +6 -0
  113. package/dist/commands/syncCommand.cjs.map +1 -0
  114. package/dist/commands/syncCommand.d.cts +37 -0
  115. package/dist/commands/syncCommand.d.cts.map +1 -0
  116. package/dist/commands/syncCommand.d.mts +37 -0
  117. package/dist/commands/syncCommand.d.mts.map +1 -0
  118. package/dist/commands/syncCommand.mjs +6 -0
  119. package/dist/commands/syncCommand.mjs.map +1 -0
  120. package/dist/config/harnessState.cjs +2 -0
  121. package/dist/config/harnessState.cjs.map +1 -0
  122. package/dist/config/harnessState.d.cts +24 -0
  123. package/dist/config/harnessState.d.cts.map +1 -0
  124. package/dist/config/harnessState.d.mts +24 -0
  125. package/dist/config/harnessState.d.mts.map +1 -0
  126. package/dist/config/harnessState.mjs +2 -0
  127. package/dist/config/harnessState.mjs.map +1 -0
  128. package/dist/config/index.cjs +1 -0
  129. package/dist/config/index.d.cts +7 -0
  130. package/dist/config/index.d.mts +7 -0
  131. package/dist/config/index.mjs +1 -0
  132. package/dist/config/projectTrust.cjs +2 -0
  133. package/dist/config/projectTrust.cjs.map +1 -0
  134. package/dist/config/projectTrust.d.cts +14 -0
  135. package/dist/config/projectTrust.d.cts.map +1 -0
  136. package/dist/config/projectTrust.d.mts +14 -0
  137. package/dist/config/projectTrust.d.mts.map +1 -0
  138. package/dist/config/projectTrust.mjs +2 -0
  139. package/dist/config/projectTrust.mjs.map +1 -0
  140. package/dist/entries/autoStop.cjs +2 -0
  141. package/dist/entries/autoStop.cjs.map +1 -0
  142. package/dist/entries/autoStop.d.cts +6 -0
  143. package/dist/entries/autoStop.d.cts.map +1 -0
  144. package/dist/entries/autoStop.d.mts +7 -0
  145. package/dist/entries/autoStop.d.mts.map +1 -0
  146. package/dist/entries/autoStop.mjs +2 -0
  147. package/dist/entries/autoStop.mjs.map +1 -0
  148. package/dist/entries/components/matrixPicker.cjs +2 -0
  149. package/dist/entries/components/matrixPicker.cjs.map +1 -0
  150. package/dist/entries/components/matrixPicker.d.cts +55 -0
  151. package/dist/entries/components/matrixPicker.d.cts.map +1 -0
  152. package/dist/entries/components/matrixPicker.d.mts +55 -0
  153. package/dist/entries/components/matrixPicker.d.mts.map +1 -0
  154. package/dist/entries/components/matrixPicker.mjs +2 -0
  155. package/dist/entries/components/matrixPicker.mjs.map +1 -0
  156. package/dist/entries/components/skillsOverlay.cjs +4 -0
  157. package/dist/entries/components/skillsOverlay.cjs.map +1 -0
  158. package/dist/entries/components/skillsOverlay.d.cts +58 -0
  159. package/dist/entries/components/skillsOverlay.d.cts.map +1 -0
  160. package/dist/entries/components/skillsOverlay.d.mts +58 -0
  161. package/dist/entries/components/skillsOverlay.d.mts.map +1 -0
  162. package/dist/entries/components/skillsOverlay.mjs +4 -0
  163. package/dist/entries/components/skillsOverlay.mjs.map +1 -0
  164. package/dist/entries/domains.cjs +2 -0
  165. package/dist/entries/domains.cjs.map +1 -0
  166. package/dist/entries/domains.d.cts +10 -0
  167. package/dist/entries/domains.d.cts.map +1 -0
  168. package/dist/entries/domains.d.mts +10 -0
  169. package/dist/entries/domains.d.mts.map +1 -0
  170. package/dist/entries/domains.mjs +2 -0
  171. package/dist/entries/domains.mjs.map +1 -0
  172. package/dist/entries/doom.cjs +2 -0
  173. package/dist/entries/doom.cjs.map +1 -0
  174. package/dist/entries/doom.d.cts +13 -0
  175. package/dist/entries/doom.d.cts.map +1 -0
  176. package/dist/entries/doom.d.mts +14 -0
  177. package/dist/entries/doom.d.mts.map +1 -0
  178. package/dist/entries/doom.mjs +2 -0
  179. package/dist/entries/doom.mjs.map +1 -0
  180. package/dist/entries/effort.cjs +2 -0
  181. package/dist/entries/effort.cjs.map +1 -0
  182. package/dist/entries/effort.d.cts +10 -0
  183. package/dist/entries/effort.d.cts.map +1 -0
  184. package/dist/entries/effort.d.mts +10 -0
  185. package/dist/entries/effort.d.mts.map +1 -0
  186. package/dist/entries/effort.mjs +2 -0
  187. package/dist/entries/effort.mjs.map +1 -0
  188. package/dist/entries/majorMode.cjs +6 -0
  189. package/dist/entries/majorMode.cjs.map +1 -0
  190. package/dist/entries/majorMode.d.cts +29 -0
  191. package/dist/entries/majorMode.d.cts.map +1 -0
  192. package/dist/entries/majorMode.d.mts +29 -0
  193. package/dist/entries/majorMode.d.mts.map +1 -0
  194. package/dist/entries/majorMode.mjs +6 -0
  195. package/dist/entries/majorMode.mjs.map +1 -0
  196. package/dist/entries/notifications.cjs +2 -0
  197. package/dist/entries/notifications.cjs.map +1 -0
  198. package/dist/entries/notifications.d.cts +13 -0
  199. package/dist/entries/notifications.d.cts.map +1 -0
  200. package/dist/entries/notifications.d.mts +13 -0
  201. package/dist/entries/notifications.d.mts.map +1 -0
  202. package/dist/entries/notifications.mjs +2 -0
  203. package/dist/entries/notifications.mjs.map +1 -0
  204. package/dist/entries/ollamaProvider.cjs +2 -0
  205. package/dist/entries/ollamaProvider.cjs.map +1 -0
  206. package/dist/entries/ollamaProvider.d.cts +6 -0
  207. package/dist/entries/ollamaProvider.d.cts.map +1 -0
  208. package/dist/entries/ollamaProvider.d.mts +7 -0
  209. package/dist/entries/ollamaProvider.d.mts.map +1 -0
  210. package/dist/entries/ollamaProvider.mjs +2 -0
  211. package/dist/entries/ollamaProvider.mjs.map +1 -0
  212. package/dist/entries/persona.cjs +2 -0
  213. package/dist/entries/persona.cjs.map +1 -0
  214. package/dist/entries/persona.d.cts +14 -0
  215. package/dist/entries/persona.d.cts.map +1 -0
  216. package/dist/entries/persona.d.mts +15 -0
  217. package/dist/entries/persona.d.mts.map +1 -0
  218. package/dist/entries/persona.mjs +2 -0
  219. package/dist/entries/persona.mjs.map +1 -0
  220. package/dist/entries/profile.cjs +3 -0
  221. package/dist/entries/profile.cjs.map +1 -0
  222. package/dist/entries/profile.d.cts +16 -0
  223. package/dist/entries/profile.d.cts.map +1 -0
  224. package/dist/entries/profile.d.mts +16 -0
  225. package/dist/entries/profile.d.mts.map +1 -0
  226. package/dist/entries/profile.mjs +3 -0
  227. package/dist/entries/profile.mjs.map +1 -0
  228. package/dist/entries/repositoryHooks.cjs +9 -0
  229. package/dist/entries/repositoryHooks.cjs.map +1 -0
  230. package/dist/entries/repositoryHooks.d.cts +7 -0
  231. package/dist/entries/repositoryHooks.d.cts.map +1 -0
  232. package/dist/entries/repositoryHooks.d.mts +8 -0
  233. package/dist/entries/repositoryHooks.d.mts.map +1 -0
  234. package/dist/entries/repositoryHooks.mjs +9 -0
  235. package/dist/entries/repositoryHooks.mjs.map +1 -0
  236. package/dist/entries/skills.cjs +2 -0
  237. package/dist/entries/skills.cjs.map +1 -0
  238. package/dist/entries/skills.d.cts +34 -0
  239. package/dist/entries/skills.d.cts.map +1 -0
  240. package/dist/entries/skills.d.mts +34 -0
  241. package/dist/entries/skills.d.mts.map +1 -0
  242. package/dist/entries/skills.mjs +2 -0
  243. package/dist/entries/skills.mjs.map +1 -0
  244. package/dist/entries/styleSystem.cjs +4 -0
  245. package/dist/entries/styleSystem.cjs.map +1 -0
  246. package/dist/entries/styleSystem.d.cts +32 -0
  247. package/dist/entries/styleSystem.d.cts.map +1 -0
  248. package/dist/entries/styleSystem.d.mts +32 -0
  249. package/dist/entries/styleSystem.d.mts.map +1 -0
  250. package/dist/entries/styleSystem.mjs +4 -0
  251. package/dist/entries/styleSystem.mjs.map +1 -0
  252. package/dist/index.cjs +1 -0
  253. package/dist/index.d.cts +34 -0
  254. package/dist/index.d.mts +34 -0
  255. package/dist/index.mjs +1 -0
  256. package/dist/interfaces/compatibility.d.cts +23 -0
  257. package/dist/interfaces/compatibility.d.cts.map +1 -0
  258. package/dist/interfaces/compatibility.d.mts +23 -0
  259. package/dist/interfaces/compatibility.d.mts.map +1 -0
  260. package/dist/interfaces/harness.d.cts +83 -0
  261. package/dist/interfaces/harness.d.cts.map +1 -0
  262. package/dist/interfaces/harness.d.mts +83 -0
  263. package/dist/interfaces/harness.d.mts.map +1 -0
  264. package/dist/logSinkTelemetry.cjs +2 -0
  265. package/dist/logSinkTelemetry.cjs.map +1 -0
  266. package/dist/logSinkTelemetry.d.cts +49 -0
  267. package/dist/logSinkTelemetry.d.cts.map +1 -0
  268. package/dist/logSinkTelemetry.d.mts +49 -0
  269. package/dist/logSinkTelemetry.d.mts.map +1 -0
  270. package/dist/logSinkTelemetry.mjs +2 -0
  271. package/dist/logSinkTelemetry.mjs.map +1 -0
  272. package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.cjs +2 -0
  273. package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.cjs.map +1 -0
  274. package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.mjs +2 -0
  275. package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.mjs.map +1 -0
  276. package/dist/services/compatibility/antigravity.cjs +2 -0
  277. package/dist/services/compatibility/antigravity.cjs.map +1 -0
  278. package/dist/services/compatibility/antigravity.d.cts +11 -0
  279. package/dist/services/compatibility/antigravity.d.cts.map +1 -0
  280. package/dist/services/compatibility/antigravity.d.mts +11 -0
  281. package/dist/services/compatibility/antigravity.d.mts.map +1 -0
  282. package/dist/services/compatibility/antigravity.mjs +2 -0
  283. package/dist/services/compatibility/antigravity.mjs.map +1 -0
  284. package/dist/services/compatibility/codex.cjs +2 -0
  285. package/dist/services/compatibility/codex.cjs.map +1 -0
  286. package/dist/services/compatibility/codex.d.cts +19 -0
  287. package/dist/services/compatibility/codex.d.cts.map +1 -0
  288. package/dist/services/compatibility/codex.d.mts +19 -0
  289. package/dist/services/compatibility/codex.d.mts.map +1 -0
  290. package/dist/services/compatibility/codex.mjs +2 -0
  291. package/dist/services/compatibility/codex.mjs.map +1 -0
  292. package/dist/services/compatibility/index.cjs +2 -0
  293. package/dist/services/compatibility/index.cjs.map +1 -0
  294. package/dist/services/compatibility/index.d.cts +16 -0
  295. package/dist/services/compatibility/index.d.cts.map +1 -0
  296. package/dist/services/compatibility/index.d.mts +16 -0
  297. package/dist/services/compatibility/index.d.mts.map +1 -0
  298. package/dist/services/compatibility/index.mjs +2 -0
  299. package/dist/services/compatibility/index.mjs.map +1 -0
  300. package/dist/services/compatibility/process.cjs +2 -0
  301. package/dist/services/compatibility/process.cjs.map +1 -0
  302. package/dist/services/compatibility/process.d.cts +35 -0
  303. package/dist/services/compatibility/process.d.cts.map +1 -0
  304. package/dist/services/compatibility/process.d.mts +35 -0
  305. package/dist/services/compatibility/process.d.mts.map +1 -0
  306. package/dist/services/compatibility/process.mjs +2 -0
  307. package/dist/services/compatibility/process.mjs.map +1 -0
  308. package/dist/services/compatibility/shared.cjs +2 -0
  309. package/dist/services/compatibility/shared.cjs.map +1 -0
  310. package/dist/services/compatibility/shared.d.cts +33 -0
  311. package/dist/services/compatibility/shared.d.cts.map +1 -0
  312. package/dist/services/compatibility/shared.d.mts +33 -0
  313. package/dist/services/compatibility/shared.d.mts.map +1 -0
  314. package/dist/services/compatibility/shared.mjs +2 -0
  315. package/dist/services/compatibility/shared.mjs.map +1 -0
  316. package/dist/services/compatibilityContext.cjs +2 -0
  317. package/dist/services/compatibilityContext.cjs.map +1 -0
  318. package/dist/services/compatibilityContext.d.cts +23 -0
  319. package/dist/services/compatibilityContext.d.cts.map +1 -0
  320. package/dist/services/compatibilityContext.d.mts +23 -0
  321. package/dist/services/compatibilityContext.d.mts.map +1 -0
  322. package/dist/services/compatibilityContext.mjs +2 -0
  323. package/dist/services/compatibilityContext.mjs.map +1 -0
  324. package/dist/services/composer.cjs +2 -0
  325. package/dist/services/composer.cjs.map +1 -0
  326. package/dist/services/composer.d.cts +133 -0
  327. package/dist/services/composer.d.cts.map +1 -0
  328. package/dist/services/composer.d.mts +133 -0
  329. package/dist/services/composer.d.mts.map +1 -0
  330. package/dist/services/composer.mjs +2 -0
  331. package/dist/services/composer.mjs.map +1 -0
  332. package/dist/services/extensionAssembler.cjs +2 -0
  333. package/dist/services/extensionAssembler.cjs.map +1 -0
  334. package/dist/services/extensionAssembler.d.cts +72 -0
  335. package/dist/services/extensionAssembler.d.cts.map +1 -0
  336. package/dist/services/extensionAssembler.d.mts +72 -0
  337. package/dist/services/extensionAssembler.d.mts.map +1 -0
  338. package/dist/services/extensionAssembler.mjs +2 -0
  339. package/dist/services/extensionAssembler.mjs.map +1 -0
  340. package/dist/services/extensionCompiler.cjs +2 -0
  341. package/dist/services/extensionCompiler.cjs.map +1 -0
  342. package/dist/services/extensionCompiler.mjs +2 -0
  343. package/dist/services/extensionCompiler.mjs.map +1 -0
  344. package/dist/services/harnessContext.cjs +2 -0
  345. package/dist/services/harnessContext.cjs.map +1 -0
  346. package/dist/services/harnessContext.d.cts +61 -0
  347. package/dist/services/harnessContext.d.cts.map +1 -0
  348. package/dist/services/harnessContext.d.mts +61 -0
  349. package/dist/services/harnessContext.d.mts.map +1 -0
  350. package/dist/services/harnessContext.mjs +2 -0
  351. package/dist/services/harnessContext.mjs.map +1 -0
  352. package/dist/services/index.cjs +1 -0
  353. package/dist/services/index.d.cts +14 -0
  354. package/dist/services/index.d.mts +14 -0
  355. package/dist/services/index.mjs +1 -0
  356. package/dist/services/matrixSwitcher.cjs +2 -0
  357. package/dist/services/matrixSwitcher.cjs.map +1 -0
  358. package/dist/services/matrixSwitcher.d.cts +46 -0
  359. package/dist/services/matrixSwitcher.d.cts.map +1 -0
  360. package/dist/services/matrixSwitcher.d.mts +46 -0
  361. package/dist/services/matrixSwitcher.d.mts.map +1 -0
  362. package/dist/services/matrixSwitcher.mjs +2 -0
  363. package/dist/services/matrixSwitcher.mjs.map +1 -0
  364. package/dist/services/mcpFilter.cjs +3 -0
  365. package/dist/services/mcpFilter.cjs.map +1 -0
  366. package/dist/services/mcpFilter.d.cts +40 -0
  367. package/dist/services/mcpFilter.d.cts.map +1 -0
  368. package/dist/services/mcpFilter.d.mts +40 -0
  369. package/dist/services/mcpFilter.d.mts.map +1 -0
  370. package/dist/services/mcpFilter.mjs +3 -0
  371. package/dist/services/mcpFilter.mjs.map +1 -0
  372. package/dist/services/piSettings.cjs +2 -0
  373. package/dist/services/piSettings.cjs.map +1 -0
  374. package/dist/services/piSettings.d.cts +24 -0
  375. package/dist/services/piSettings.d.cts.map +1 -0
  376. package/dist/services/piSettings.d.mts +24 -0
  377. package/dist/services/piSettings.d.mts.map +1 -0
  378. package/dist/services/piSettings.mjs +2 -0
  379. package/dist/services/piSettings.mjs.map +1 -0
  380. package/dist/services/resourceCollector.cjs +3 -0
  381. package/dist/services/resourceCollector.cjs.map +1 -0
  382. package/dist/services/resourceCollector.d.cts +16 -0
  383. package/dist/services/resourceCollector.d.cts.map +1 -0
  384. package/dist/services/resourceCollector.d.mts +16 -0
  385. package/dist/services/resourceCollector.d.mts.map +1 -0
  386. package/dist/services/resourceCollector.mjs +3 -0
  387. package/dist/services/resourceCollector.mjs.map +1 -0
  388. package/dist/services/skillCatalog.cjs +2 -0
  389. package/dist/services/skillCatalog.cjs.map +1 -0
  390. package/dist/services/skillCatalog.d.cts +56 -0
  391. package/dist/services/skillCatalog.d.cts.map +1 -0
  392. package/dist/services/skillCatalog.d.mts +56 -0
  393. package/dist/services/skillCatalog.d.mts.map +1 -0
  394. package/dist/services/skillCatalog.mjs +2 -0
  395. package/dist/services/skillCatalog.mjs.map +1 -0
  396. package/dist/services/skillSources.cjs +2 -0
  397. package/dist/services/skillSources.cjs.map +1 -0
  398. package/dist/services/skillSources.d.cts +24 -0
  399. package/dist/services/skillSources.d.cts.map +1 -0
  400. package/dist/services/skillSources.d.mts +24 -0
  401. package/dist/services/skillSources.d.mts.map +1 -0
  402. package/dist/services/skillSources.mjs +2 -0
  403. package/dist/services/skillSources.mjs.map +1 -0
  404. package/dist/services/syncState.cjs +2 -0
  405. package/dist/services/syncState.cjs.map +1 -0
  406. package/dist/services/syncState.d.cts +130 -0
  407. package/dist/services/syncState.d.cts.map +1 -0
  408. package/dist/services/syncState.d.mts +130 -0
  409. package/dist/services/syncState.d.mts.map +1 -0
  410. package/dist/services/syncState.mjs +2 -0
  411. package/dist/services/syncState.mjs.map +1 -0
  412. package/dist/utils/index.cjs +1 -0
  413. package/dist/utils/index.d.cts +5 -0
  414. package/dist/utils/index.d.mts +5 -0
  415. package/dist/utils/index.mjs +1 -0
  416. package/dist/utils/json.cjs +2 -0
  417. package/dist/utils/json.cjs.map +1 -0
  418. package/dist/utils/json.d.cts +23 -0
  419. package/dist/utils/json.d.cts.map +1 -0
  420. package/dist/utils/json.d.mts +23 -0
  421. package/dist/utils/json.d.mts.map +1 -0
  422. package/dist/utils/json.mjs +2 -0
  423. package/dist/utils/json.mjs.map +1 -0
  424. package/dist/utils/moduleResolution.cjs +2 -0
  425. package/dist/utils/moduleResolution.cjs.map +1 -0
  426. package/dist/utils/moduleResolution.d.cts +56 -0
  427. package/dist/utils/moduleResolution.d.cts.map +1 -0
  428. package/dist/utils/moduleResolution.d.mts +56 -0
  429. package/dist/utils/moduleResolution.d.mts.map +1 -0
  430. package/dist/utils/moduleResolution.mjs +2 -0
  431. package/dist/utils/moduleResolution.mjs.map +1 -0
  432. package/dist/utils/repository.cjs +2 -0
  433. package/dist/utils/repository.cjs.map +1 -0
  434. package/dist/utils/repository.d.cts +21 -0
  435. package/dist/utils/repository.d.cts.map +1 -0
  436. package/dist/utils/repository.d.mts +21 -0
  437. package/dist/utils/repository.d.mts.map +1 -0
  438. package/dist/utils/repository.mjs +2 -0
  439. package/dist/utils/repository.mjs.map +1 -0
  440. package/dist/utils/toolNames.cjs +2 -0
  441. package/dist/utils/toolNames.cjs.map +1 -0
  442. package/dist/utils/toolNames.d.cts +25 -0
  443. package/dist/utils/toolNames.d.cts.map +1 -0
  444. package/dist/utils/toolNames.d.mts +25 -0
  445. package/dist/utils/toolNames.d.mts.map +1 -0
  446. package/dist/utils/toolNames.mjs +2 -0
  447. package/dist/utils/toolNames.mjs.map +1 -0
  448. package/package.json +369 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensionCompiler.mjs","names":[],"sources":["../../src/services/extensionCompiler.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { rolldown } from 'rolldown';\nimport { optionalPackageEntry } from '../utils/index.ts';\n\n/**\n * Compiles TypeScript extensions into plain ESM ahead of the session.\n *\n * Pi loads extensions through jiti, which transpiles TypeScript at import time.\n * That works, but it costs a transform per module on a cold cache and makes Node\n * complain about type stripping under node_modules on every launch. Resolution\n * already knows the full extension list, so each TypeScript entry is bundled to\n * a single `.mjs` here and Pi imports it natively.\n *\n * Only the extension's own sources are bundled. Every bare specifier stays\n * external and is rewritten to the absolute file the entry itself resolves to,\n * which keeps one copy of Pi's runtime and survives being imported from a cache\n * directory that has no node_modules of its own.\n */\n\nconst TYPESCRIPT_SUFFIXES = ['.ts', '.mts', '.cts'] as const;\nconst COMPILED_SUFFIX = '.mjs';\nconst CACHE_VERSION = 'v1';\nconst HASH_LENGTH = 16;\n\n/** Pi's former npm scope. The packages are the same, published under a new name. */\nconst PI_SCOPE_RENAMES: Readonly<Record<string, string>> = {\n '@mariozechner/pi-coding-agent': '@earendil-works/pi-coding-agent',\n '@mariozechner/pi-tui': '@earendil-works/pi-tui',\n '@mariozechner/pi-ai': '@earendil-works/pi-ai',\n '@sinclair/typebox': 'typebox',\n};\n\nexport function isTypeScriptEntry(entry: string): boolean {\n return TYPESCRIPT_SUFFIXES.some((suffix) => entry.endsWith(suffix));\n}\n\nfunction renameScope(specifier: string): string {\n for (const [before, after] of Object.entries(PI_SCOPE_RENAMES)) {\n if (specifier === before) return after;\n if (specifier.startsWith(`${before}/`)) return `${after}${specifier.slice(before.length)}`;\n }\n return specifier;\n}\n\n/**\n * Cache key for a compiled entry.\n *\n * The entry's own bytes are the only cheap signal that the extension changed; a\n * dependency edit is not visible without walking the graph, so an upgrade that\n * leaves the entry byte-identical is served from cache until the version below\n * is raised.\n */\nfunction cacheKey(entry: string): string {\n const source = fs.readFileSync(entry);\n return createHash('sha256').update(CACHE_VERSION).update(entry).update(source).digest('hex').slice(0, HASH_LENGTH);\n}\n\nfunction compiledName(entry: string, key: string): string {\n const base = path.basename(entry).replace(/\\.[cm]?ts$/, '');\n const parent = path.basename(path.dirname(entry));\n return `${parent}-${base}.${key}${COMPILED_SUFFIX}`;\n}\n\n/**\n * Packages that must resolve to the copy this harness runs, never to a second\n * one bundled into an extension. Pi owns the TUI and the session state, so a\n * duplicate renders into a different screen and mutates a different store.\n */\nconst HOSTED_PACKAGES = new Set([\n '@earendil-works/pi-coding-agent',\n '@earendil-works/pi-tui',\n '@earendil-works/pi-ai',\n 'typebox',\n]);\n\nfunction packageRootOf(specifier: string): string | undefined {\n const slash = specifier.startsWith('@') ? specifier.indexOf('/', specifier.indexOf('/') + 1) : specifier.indexOf('/');\n return slash === -1 ? specifier : specifier.slice(0, slash);\n}\n\nfunction externalResolver() {\n return {\n name: 'doom-external-absolute',\n async resolveId(\n this: { resolve: (id: string, importer?: string, options?: unknown) => Promise<{ id: string } | null> },\n specifier: string,\n importer: string | undefined,\n options: unknown,\n ): Promise<{ id: string; external: boolean } | null> {\n if (specifier.startsWith('.') || path.isAbsolute(specifier) || specifier.startsWith('node:')) return null;\n const renamed = renameScope(specifier);\n\n // Host packages are resolved from this module, the way the rest of the\n // harness resolves them, because an extension written against Pi's former\n // scope does not have the current one in its own dependency tree.\n const root = packageRootOf(renamed);\n if (root && HOSTED_PACKAGES.has(root)) {\n const hosted = optionalPackageEntry(renamed);\n if (hosted) return { id: hosted, external: true };\n }\n\n // Rolldown's resolver rather than `createRequire`, which cannot see an\n // ESM-only package that publishes no `require` condition and would send\n // Pi's own core into the bundle.\n const resolved = await this.resolve(renamed, importer, options);\n if (!resolved) return null;\n // A dependency that is itself TypeScript cannot be handed to Node either,\n // so it is bundled rather than externalised.\n if (isTypeScriptEntry(resolved.id)) return null;\n return { id: resolved.id, external: true };\n },\n };\n}\n\n/**\n * Bundles `entry` into `cacheDirectory` and returns the compiled path.\n *\n * Non-TypeScript entries are returned untouched. A cache hit skips the build.\n */\nexport async function compileExtension(entry: string, cacheDirectory: string): Promise<string> {\n if (!isTypeScriptEntry(entry)) return entry;\n\n const output = path.join(cacheDirectory, compiledName(entry, cacheKey(entry)));\n if (fs.existsSync(output)) return output;\n\n const build = await rolldown({\n input: entry,\n platform: 'node',\n plugins: [externalResolver()],\n logLevel: 'silent',\n });\n try {\n // One file per extension. Several of them import lazily, and code splitting\n // would emit sibling chunks that a single output path cannot describe.\n await build.write({ file: output, format: 'esm', sourcemap: false, minify: true, codeSplitting: false });\n } finally {\n await build.close();\n }\n return output;\n}\n\n/**\n * Compiles every TypeScript entry in a resolution map, leaving the rest as-is.\n *\n * A failure is not fatal: the original path is kept so Pi falls back to loading\n * the TypeScript through jiti, which is what it did before this existed.\n */\nexport async function compileResolvedEntries(\n resolved: Record<string, string>,\n cacheDirectory: string,\n): Promise<Record<string, string>> {\n fs.mkdirSync(cacheDirectory, { recursive: true });\n const compiled: Record<string, string> = {};\n for (const [key, target] of Object.entries(resolved)) {\n try {\n compiled[key] = await compileExtension(target, cacheDirectory);\n } catch {\n compiled[key] = target;\n }\n }\n return compiled;\n}\n"],"mappings":"6NAqBA,MAAM,EAAsB,CAAC,MAAO,OAAQ,OAAO,CAM7C,EAAqD,CACzD,gCAAiC,kCACjC,uBAAwB,yBACxB,sBAAuB,wBACvB,oBAAqB,UACtB,CAED,SAAgB,EAAkB,EAAwB,CACxD,OAAO,EAAoB,KAAM,GAAW,EAAM,SAAS,EAAO,CAAC,CAGrE,SAAS,EAAY,EAA2B,CAC9C,IAAK,GAAM,CAAC,EAAQ,KAAU,OAAO,QAAQ,EAAiB,CAAE,CAC9D,GAAI,IAAc,EAAQ,OAAO,EACjC,GAAI,EAAU,WAAW,GAAG,EAAO,GAAG,CAAE,MAAO,GAAG,IAAQ,EAAU,MAAM,EAAO,OAAO,GAE1F,OAAO,EAWT,SAAS,EAAS,EAAuB,CACvC,IAAM,EAAS,EAAG,aAAa,EAAM,CACrC,OAAO,EAAW,SAAS,CAAC,OAAO,KAAc,CAAC,OAAO,EAAM,CAAC,OAAO,EAAO,CAAC,OAAO,MAAM,CAAC,MAAM,EAAG,GAAY,CAGpH,SAAS,EAAa,EAAe,EAAqB,CACxD,IAAM,EAAO,EAAK,SAAS,EAAM,CAAC,QAAQ,aAAc,GAAG,CAE3D,MAAO,GADQ,EAAK,SAAS,EAAK,QAAQ,EAAM,CAChC,CAAC,GAAG,EAAK,GAAG,QAQ9B,MAAM,EAAkB,IAAI,IAAI,CAC9B,kCACA,yBACA,wBACA,UACD,CAAC,CAEF,SAAS,EAAc,EAAuC,CAC5D,IAAM,EAAQ,EAAU,WAAW,IAAI,CAAG,EAAU,QAAQ,IAAK,EAAU,QAAQ,IAAI,CAAG,EAAE,CAAG,EAAU,QAAQ,IAAI,CACrH,OAAO,IAAU,GAAK,EAAY,EAAU,MAAM,EAAG,EAAM,CAG7D,SAAS,GAAmB,CAC1B,MAAO,CACL,KAAM,yBACN,MAAM,UAEJ,EACA,EACA,EACmD,CACnD,GAAI,EAAU,WAAW,IAAI,EAAI,EAAK,WAAW,EAAU,EAAI,EAAU,WAAW,QAAQ,CAAE,OAAO,KACrG,IAAM,EAAU,EAAY,EAAU,CAKhC,EAAO,EAAc,EAAQ,CACnC,GAAI,GAAQ,EAAgB,IAAI,EAAK,CAAE,CACrC,IAAM,EAAS,EAAqB,EAAQ,CAC5C,GAAI,EAAQ,MAAO,CAAE,GAAI,EAAQ,SAAU,GAAM,CAMnD,IAAM,EAAW,MAAM,KAAK,QAAQ,EAAS,EAAU,EAAQ,CAK/D,MAJI,CAAC,GAGD,EAAkB,EAAS,GAAG,CAAS,KACpC,CAAE,GAAI,EAAS,GAAI,SAAU,GAAM,EAE7C,CAQH,eAAsB,EAAiB,EAAe,EAAyC,CAC7F,GAAI,CAAC,EAAkB,EAAM,CAAE,OAAO,EAEtC,IAAM,EAAS,EAAK,KAAK,EAAgB,EAAa,EAAO,EAAS,EAAM,CAAC,CAAC,CAC9E,GAAI,EAAG,WAAW,EAAO,CAAE,OAAO,EAElC,IAAM,EAAQ,MAAM,EAAS,CAC3B,MAAO,EACP,SAAU,OACV,QAAS,CAAC,GAAkB,CAAC,CAC7B,SAAU,SACX,CAAC,CACF,GAAI,CAGF,MAAM,EAAM,MAAM,CAAE,KAAM,EAAQ,OAAQ,MAAO,UAAW,GAAO,OAAQ,GAAM,cAAe,GAAO,CAAC,QAChG,CACR,MAAM,EAAM,OAAO,CAErB,OAAO,EAST,eAAsB,EACpB,EACA,EACiC,CACjC,EAAG,UAAU,EAAgB,CAAE,UAAW,GAAM,CAAC,CACjD,IAAM,EAAmC,EAAE,CAC3C,IAAK,GAAM,CAAC,EAAK,KAAW,OAAO,QAAQ,EAAS,CAClD,GAAI,CACF,EAAS,GAAO,MAAM,EAAiB,EAAQ,EAAe,MACxD,CACN,EAAS,GAAO,EAGpB,OAAO"}
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../logSinkTelemetry.cjs`);require(`../config/index.cjs`);const n=require(`./mcpFilter.cjs`),r=require(`../utils/moduleResolution.cjs`);require(`../utils/index.cjs`);const i=require(`./resourceCollector.cjs`),a=require(`./extensionAssembler.cjs`);let o=require(`node:path`);o=e.__toESM(o,1);let s=require(`node:fs`);s=e.__toESM(s,1);let c=require(`@agimon-ai/doompi-mcp`),l=require(`@agimon-ai/doompi-config/profiles`),u=require(`@agimon-ai/doompi-config/majorModes`),d=require(`@agimon-ai/doompi-config/domains`),f=require(`@agimon-ai/doompi-ui/theme`),p=require(`@agimon-ai/doompi-config`);const m=`ollama`,h=`resolve_config`,g=`collect_resources`;function _(e,t){if(e.preset===`kimi`&&(!t.KIMI_API_KEY&&t.KIMI_CODE_API_KEY&&(t.KIMI_API_KEY=t.KIMI_CODE_API_KEY),!t.KIMI_API_KEY))throw Error(`KIMI_API_KEY or KIMI_CODE_API_KEY is required for the kimi preset`);if(e.preset===m){if((e.piArgs.find(e=>e.startsWith(`${m}/`))?.endsWith(`:cloud`)??!1)&&!t.OLLAMA_API_KEY)throw Error(`OLLAMA_API_KEY is required for Ollama cloud models`);t.OLLAMA_API_KEY||=m,t.DOOMPI_OLLAMA_BASE_URL=t.OLLAMA_BASE_URL??t.ANTHROPIC_BASE_URL??`http://localhost:11434/v1`}}function v(e,t,n){return(0,c.sessionConfigEnvironment)({repoRoot:e.repoRoot,stagingDirectory:t.temporaryDirectory,...t.pluginMcpConfigPaths.length>0?{pluginConfigPaths:t.pluginMcpConfigPaths}:{},...n?{allowlist:n}:{}})}function y(e){return e.profile?(0,l.resolveProfile)(e.repoRoot,e.profile):void 0}async function b(e,c=t.createHarnessTelemetry()){let m=await c.runInSpan(`doom_pi.${h}`,{"harness.phase":h},async()=>{let t=(0,u.loadMajorModesConfig)(e.repoRoot),r=a.filterHookDisabledLayers((0,u.resolveLayers)(t,e.majorMode),e.hooks),i=y(e);if(!s.default.existsSync(e.cwd)||!s.default.statSync(e.cwd).isDirectory())throw Error(`Working directory does not exist: ${e.cwd}`);return{majorModesConfig:t,selectedLayers:r,hookGroups:(0,u.layerHookGroups)(t,r),profile:i,plugins:(0,d.resolvePluginEntries)(e.repoRoot,e.domains,e.pluginDirectories),mcpAllowlist:n.resolveMcpAllowlist(e.repoRoot,e.domains),sharedSkills:(0,d.resolveSharedSkills)(e.repoRoot,e.domains)}}).catch(async n=>{throw await c.recordError(t.HARNESS_EVENT.configLoadFailed,n,{"harness.phase":h,"harness.major_mode":e.majorMode,"harness.domain_count":e.domains.length}),n}),{majorModesConfig:b,selectedLayers:x,hookGroups:S,profile:C,plugins:w,mcpAllowlist:T}=m,E=C?.persona,D=C?.personaRoot??e.repoRoot,O=r.optionalPackageEntry(a.CONTEXT_PACKAGES.workflow),k=r.optionalPackageEntry(a.CONTEXT_PACKAGES.dispatcherWorkflow),A=await c.runInSpan(`doom_pi.${g}`,{"harness.plugin.count":w.length,"harness.agents":e.agents,"harness.mcp":e.mcp},()=>i.collectResources(e.repoRoot,w,{agents:e.agents,mcp:e.mcp,temporaryDirectory:e.resourceDirectory,workflowExtension:O,dispatcherWorkflowExtension:k,mcpAllowlist:T,sharedSkills:m.sharedSkills})).catch(async e=>{throw await c.recordError(t.HARNESS_EVENT.resourceCollectionFailed,e,{"harness.phase":g,"harness.plugin.count":w.length}),e});try{let t=i.selectWorkflowExtensionForProcess(O,A.dispatcherWorkflowExtensionPath),n=await(0,f.writeDefaultTheme)(A.temporaryDirectory),c={...process.env},u=(0,l.applyProfileEnvironment)(c,C?.env??{});_(e,c),c.NX_DAEMON??=`false`,c.DOOMPI_THEME||=f.DEFAULT_THEME_NAME,c.CLAUDE_PROJECT_DIR=e.repoRoot,c.CODEX_REPO_ROOT=e.repoRoot,c.ORIGINAL_REPO_PATH||=e.repoRoot,c.MCP_UI_VIEWER=e.automation?`none`:c.MCP_UI_VIEWER??``;let d=r.ownEntry(a.PERSONA_ENTRY),m=E?(0,l.buildPersonaPrompt)(D,E):void 0,h;m&&(h=o.default.join(A.temporaryDirectory,`persona.md`),await s.default.promises.writeFile(h,`${m}\n`,{mode:384}));let g=e.mcp?r.packageEntry(a.CONTEXT_PACKAGES.mcp):void 0;return g&&Object.assign(c,v(e,A,T)),(0,p.createHarnessSession)({root:e.repoRoot,majorMode:e.majorMode,temporaryDirectory:A.temporaryDirectory,domains:e.domains,layers:x,profile:C?.name,profileEnvironment:u,personaFile:h,skillDirectories:A.skillDirectories,agentDirectories:A.agentDirectories,additionalDirectories:e.additionalDirectories,childExtensions:[],pluginDirectories:e.pluginDirectories,pluginHooks:A.pluginHooks,hookGroups:S,hooks:e.hooks,agents:e.agents,mcp:e.mcp,mcpConfigPath:A.mcpConfigPath,allowProtectedWrites:e.allowProtectedWrites,workflowExtension:O},{directory:A.temporaryDirectory,environment:c}),e.agents&&(c.PI_SUBAGENT_EXTRA_AGENT_DIRS=A.agentDirectories.join(o.default.delimiter),c.PI_SUBAGENT_EXTRA_SKILL_DIRS=A.skillDirectories.join(o.default.delimiter),c.PI_SUBAGENT_PI_BINARY=o.default.join(e.repoRoot,`pi.sh`)),{options:e,environment:c,resources:A,plugins:w,profile:C?.name,personaDirectory:E,personaRoot:D,mcpAllowlist:T,majorModesConfig:b,selectedLayers:x,hookGroups:S,mcpEntry:g,personaEntry:d,workflowExtension:t,defaultThemePath:n,cleanup:A.cleanup.bind(A)}}catch(n){throw await c.recordError(t.HARNESS_EVENT.contextBuildFailed,n,{"harness.phase":`build_context`,"harness.major_mode":e.majorMode,...C?.name?{"harness.profile":C.name}:{}}),await A.cleanup(),n}}exports.buildHarnessContext=b,exports.configurePreset=_,exports.mcpSessionEnvironment=v,exports.resolveHarnessProfile=y;
2
+ //# sourceMappingURL=harnessContext.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harnessContext.cjs","names":["createHarnessTelemetry","filterHookDisabledLayers","fs","resolveMcpAllowlist","HARNESS_EVENT","optionalPackageEntry","CONTEXT_PACKAGES","collectResources","selectWorkflowExtensionForProcess","DEFAULT_THEME_NAME","ownEntry","PERSONA_ENTRY","path","packageEntry"],"sources":["../../src/services/harnessContext.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { sessionConfigEnvironment } from '@agimon-ai/doompi-mcp';\nimport {\n type AgentProfile,\n type DomainMcpAllowlist,\n type MajorModesConfig,\n type PluginEntry,\n DEFAULT_THEME_NAME,\n applyProfileEnvironment,\n buildPersonaPrompt,\n createHarnessSession,\n layerHookGroups,\n loadMajorModesConfig,\n resolveLayers,\n resolvePluginEntries,\n resolveProfile,\n resolveSharedSkills,\n writeDefaultTheme,\n} from '../config/index.ts';\nimport type { HarnessOptions, HarnessResources } from '../interfaces/index.ts';\nimport { createHarnessTelemetry, HARNESS_EVENT, type HarnessTelemetry } from '../logSinkTelemetry.ts';\nimport { optionalPackageEntry, ownEntry, packageEntry } from '../utils/index.ts';\nimport { CONTEXT_PACKAGES, PERSONA_ENTRY, filterHookDisabledLayers } from './extensionAssembler.ts';\nimport { resolveMcpAllowlist } from './mcpFilter.ts';\nimport { collectResources, selectWorkflowExtensionForProcess } from './resourceCollector.ts';\n\nconst OLLAMA_PRESET = 'ollama';\nconst PRIVATE_FILE_MODE = 0o600;\nconst RESOLVE_CONFIG_PHASE = 'resolve_config';\nconst COLLECT_RESOURCES_PHASE = 'collect_resources';\nconst BUILD_CONTEXT_PHASE = 'build_context';\n\n/**\n * Everything a command needs, resolved once.\n *\n * All three commands need the same expensive preparation (domains resolved,\n * plugins collected into a temp directory, environment assembled), so it is\n * built here and handed to whichever command runs.\n */\nexport interface HarnessContext {\n options: HarnessOptions;\n environment: NodeJS.ProcessEnv;\n resources: HarnessResources;\n plugins: PluginEntry[];\n profile?: string;\n personaDirectory?: string;\n /** Root personaDirectory resolves against, when a profile supplied one. */\n personaRoot?: string;\n mcpAllowlist?: DomainMcpAllowlist;\n majorModesConfig: MajorModesConfig;\n selectedLayers: string[];\n hookGroups: string[];\n mcpEntry?: string;\n personaEntry?: string;\n workflowExtension?: string;\n defaultThemePath: string;\n cleanup(): Promise<void>;\n}\n\n/**\n * Applies the provider environment a preset needs.\n *\n * Exported because the synced Pi path has no launcher to do it: the doom-pi\n * extension applies the same rules in-process before anything reads them.\n * `piArgs` is only consulted to spot a selected cloud model.\n */\nexport function configurePreset(\n options: Pick<HarnessOptions, 'preset' | 'piArgs'>,\n environment: NodeJS.ProcessEnv,\n): void {\n if (options.preset === 'kimi') {\n if (!environment.KIMI_API_KEY && environment.KIMI_CODE_API_KEY) {\n environment.KIMI_API_KEY = environment.KIMI_CODE_API_KEY;\n }\n if (!environment.KIMI_API_KEY) {\n throw new Error('KIMI_API_KEY or KIMI_CODE_API_KEY is required for the kimi preset');\n }\n }\n if (options.preset === OLLAMA_PRESET) {\n const selected = options.piArgs.find((argument) => argument.startsWith(`${OLLAMA_PRESET}/`));\n const cloud = selected?.endsWith(':cloud') ?? false;\n if (cloud && !environment.OLLAMA_API_KEY) {\n throw new Error('OLLAMA_API_KEY is required for Ollama cloud models');\n }\n environment.OLLAMA_API_KEY ||= OLLAMA_PRESET;\n environment.DOOMPI_OLLAMA_BASE_URL =\n environment.OLLAMA_BASE_URL ?? environment.ANTHROPIC_BASE_URL ?? 'http://localhost:11434/v1';\n }\n}\n\n/**\n * Describes this run's MCP configuration for the doom-mcp extension.\n *\n * The extension runs inside the Pi child process and reads the layers itself, so\n * mcp-proxy owns discovery and merging. What travels here is only what the child\n * cannot work out on its own: which plugins this run selected, and the domain\n * allowlist. The merged config doom-pi writes is for external frontends.\n */\nexport function mcpSessionEnvironment(\n options: Pick<HarnessOptions, 'repoRoot'>,\n resources: HarnessResources,\n allowlist: DomainMcpAllowlist | undefined,\n): Record<string, string> {\n return sessionConfigEnvironment({\n repoRoot: options.repoRoot,\n stagingDirectory: resources.temporaryDirectory,\n ...(resources.pluginMcpConfigPaths.length > 0 ? { pluginConfigPaths: resources.pluginMcpConfigPaths } : {}),\n ...(allowlist ? { allowlist } : {}),\n });\n}\n\n/** Resolves the optional persona and environment profile selected for this run. */\nexport function resolveHarnessProfile(options: HarnessOptions): AgentProfile | undefined {\n return options.profile ? resolveProfile(options.repoRoot, options.profile) : undefined;\n}\n\n/**\n * Resolves the full matrix and stages every resource Pi will need.\n *\n * The caller owns the returned cleanup(): the temporary directory holding\n * skills, agents, and the generated MCP config has to outlive this function\n * and be removed once the selected command is done with it.\n */\nexport async function buildHarnessContext(\n options: HarnessOptions,\n telemetry: HarnessTelemetry = createHarnessTelemetry(),\n): Promise<HarnessContext> {\n // Everything up to collectResources reads configuration off disk, so a single\n // malformed modes.yaml or profiles.yaml surfaces here as a failed launch\n // with no other record.\n const configured = await telemetry\n .runInSpan(`doom_pi.${RESOLVE_CONFIG_PHASE}`, { 'harness.phase': RESOLVE_CONFIG_PHASE }, async () => {\n const majorModesConfig = loadMajorModesConfig(options.repoRoot);\n const selectedLayers = filterHookDisabledLayers(\n resolveLayers(majorModesConfig, options.majorMode),\n options.hooks,\n );\n const profile = resolveHarnessProfile(options);\n if (!fs.existsSync(options.cwd) || !fs.statSync(options.cwd).isDirectory()) {\n throw new Error(`Working directory does not exist: ${options.cwd}`);\n }\n return {\n majorModesConfig,\n selectedLayers,\n hookGroups: layerHookGroups(majorModesConfig, selectedLayers),\n profile,\n plugins: resolvePluginEntries(options.repoRoot, options.domains, options.pluginDirectories),\n mcpAllowlist: resolveMcpAllowlist(options.repoRoot, options.domains),\n sharedSkills: resolveSharedSkills(options.repoRoot, options.domains),\n };\n })\n .catch(async (error: unknown) => {\n await telemetry.recordError(HARNESS_EVENT.configLoadFailed, error, {\n 'harness.phase': RESOLVE_CONFIG_PHASE,\n 'harness.major_mode': options.majorMode,\n 'harness.domain_count': options.domains.length,\n });\n throw error;\n });\n\n const { majorModesConfig, selectedLayers, hookGroups, profile, plugins, mcpAllowlist } = configured;\n const personaDirectory = profile?.persona;\n // A global profile's persona lives beside the global config, not in the repo.\n const personaRoot = profile?.personaRoot ?? options.repoRoot;\n const workflowExtension = optionalPackageEntry(CONTEXT_PACKAGES.workflow);\n const dispatcherWorkflowExtension = optionalPackageEntry(CONTEXT_PACKAGES.dispatcherWorkflow);\n const resources = await telemetry\n .runInSpan(\n `doom_pi.${COLLECT_RESOURCES_PHASE}`,\n { 'harness.plugin.count': plugins.length, 'harness.agents': options.agents, 'harness.mcp': options.mcp },\n () =>\n collectResources(options.repoRoot, plugins, {\n agents: options.agents,\n mcp: options.mcp,\n // Set by `doom-pi sync`, which stages into a directory that outlives\n // the process rather than a temporary one.\n temporaryDirectory: options.resourceDirectory,\n workflowExtension,\n dispatcherWorkflowExtension,\n mcpAllowlist,\n sharedSkills: configured.sharedSkills,\n }),\n )\n .catch(async (error: unknown) => {\n // Conflicting skills, agents, or MCP servers all fail here, and the plugin\n // that caused it is only identifiable from the message.\n await telemetry.recordError(HARNESS_EVENT.resourceCollectionFailed, error, {\n 'harness.phase': COLLECT_RESOURCES_PHASE,\n 'harness.plugin.count': plugins.length,\n });\n throw error;\n });\n\n try {\n const activeWorkflowExtension = selectWorkflowExtensionForProcess(\n workflowExtension,\n resources.dispatcherWorkflowExtensionPath,\n );\n const defaultThemePath = await writeDefaultTheme(resources.temporaryDirectory);\n const environment = { ...process.env };\n const profileEnvironment = applyProfileEnvironment(environment, profile?.env ?? {});\n\n configurePreset(options, environment);\n environment.NX_DAEMON ??= 'false';\n environment.DOOMPI_THEME ||= DEFAULT_THEME_NAME;\n environment.CLAUDE_PROJECT_DIR = options.repoRoot;\n environment.CODEX_REPO_ROOT = options.repoRoot;\n environment.ORIGINAL_REPO_PATH ||= options.repoRoot;\n environment.MCP_UI_VIEWER = options.automation ? 'none' : (environment.MCP_UI_VIEWER ?? '');\n\n // Always loaded, even with no persona at launch: the extension no-ops\n // without a persona file, and /profile needs it present to load one later.\n // Pi freezes the --extension list at startup, so it cannot be added on demand.\n const personaEntry = ownEntry(PERSONA_ENTRY);\n const personaPrompt = personaDirectory ? buildPersonaPrompt(personaRoot, personaDirectory) : undefined;\n let personaFile: string | undefined;\n if (personaPrompt) {\n personaFile = path.join(resources.temporaryDirectory, 'persona.md');\n await fs.promises.writeFile(personaFile, `${personaPrompt}\\n`, { mode: PRIVATE_FILE_MODE });\n }\n\n // doom-mcp is a normal package entry rather than generated code: it reads the\n // repository and plugin layers itself, so there is nothing to codegen a path\n // into. `--no-mcp` still gates by leaving the entry out of the list.\n const mcpEntry = options.mcp ? packageEntry(CONTEXT_PACKAGES.mcp) : undefined;\n if (mcpEntry) Object.assign(environment, mcpSessionEnvironment(options, resources, mcpAllowlist));\n\n // One write, describing the child rather than this process. The state file\n // is the child's authority and the environment is what it projects for the\n // hooks and packages that can only read an environment.\n createHarnessSession(\n {\n root: options.repoRoot,\n majorMode: options.majorMode,\n temporaryDirectory: resources.temporaryDirectory,\n domains: options.domains,\n layers: selectedLayers,\n profile: profile?.name,\n profileEnvironment,\n personaFile,\n skillDirectories: resources.skillDirectories,\n agentDirectories: resources.agentDirectories,\n additionalDirectories: options.additionalDirectories,\n childExtensions: [],\n pluginDirectories: options.pluginDirectories,\n pluginHooks: resources.pluginHooks,\n hookGroups,\n hooks: options.hooks,\n agents: options.agents,\n mcp: options.mcp,\n mcpConfigPath: resources.mcpConfigPath,\n allowProtectedWrites: options.allowProtectedWrites,\n workflowExtension,\n },\n { directory: resources.temporaryDirectory, environment },\n );\n if (options.agents) {\n environment.PI_SUBAGENT_EXTRA_AGENT_DIRS = resources.agentDirectories.join(path.delimiter);\n environment.PI_SUBAGENT_EXTRA_SKILL_DIRS = resources.skillDirectories.join(path.delimiter);\n environment.PI_SUBAGENT_PI_BINARY = path.join(options.repoRoot, 'pi.sh');\n }\n\n // Core hook groups load regardless; hookGroups selects the rest. The initial\n // state write includes an empty list deliberately: unset means every group.\n\n return {\n options,\n environment,\n resources,\n plugins,\n profile: profile?.name,\n personaDirectory,\n personaRoot,\n mcpAllowlist,\n majorModesConfig,\n selectedLayers,\n hookGroups,\n mcpEntry,\n personaEntry,\n workflowExtension: activeWorkflowExtension,\n defaultThemePath,\n cleanup: resources.cleanup.bind(resources),\n };\n } catch (error) {\n // Preparation failed after the temp directory existed, so nothing will be\n // handed back to clean it up.\n await telemetry.recordError(HARNESS_EVENT.contextBuildFailed, error, {\n 'harness.phase': BUILD_CONTEXT_PHASE,\n 'harness.major_mode': options.majorMode,\n ...(profile?.name ? { 'harness.profile': profile.name } : {}),\n });\n await resources.cleanup();\n throw error;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { HarnessOptions, HarnessResources } from "../interfaces/harness.cjs";
2
+ import { HarnessTelemetry } from "../logSinkTelemetry.cjs";
3
+ import { AgentProfile, DomainMcpAllowlist, MajorModesConfig, PluginEntry } from "../config/index.cjs";
4
+
5
+ //#region src/services/harnessContext.d.ts
6
+ /**
7
+ * Everything a command needs, resolved once.
8
+ *
9
+ * All three commands need the same expensive preparation (domains resolved,
10
+ * plugins collected into a temp directory, environment assembled), so it is
11
+ * built here and handed to whichever command runs.
12
+ */
13
+ interface HarnessContext {
14
+ options: HarnessOptions;
15
+ environment: NodeJS.ProcessEnv;
16
+ resources: HarnessResources;
17
+ plugins: PluginEntry[];
18
+ profile?: string;
19
+ personaDirectory?: string;
20
+ /** Root personaDirectory resolves against, when a profile supplied one. */
21
+ personaRoot?: string;
22
+ mcpAllowlist?: DomainMcpAllowlist;
23
+ majorModesConfig: MajorModesConfig;
24
+ selectedLayers: string[];
25
+ hookGroups: string[];
26
+ mcpEntry?: string;
27
+ personaEntry?: string;
28
+ workflowExtension?: string;
29
+ defaultThemePath: string;
30
+ cleanup(): Promise<void>;
31
+ }
32
+ /**
33
+ * Applies the provider environment a preset needs.
34
+ *
35
+ * Exported because the synced Pi path has no launcher to do it: the doom-pi
36
+ * extension applies the same rules in-process before anything reads them.
37
+ * `piArgs` is only consulted to spot a selected cloud model.
38
+ */
39
+ declare function configurePreset(options: Pick<HarnessOptions, 'preset' | 'piArgs'>, environment: NodeJS.ProcessEnv): void;
40
+ /**
41
+ * Describes this run's MCP configuration for the doom-mcp extension.
42
+ *
43
+ * The extension runs inside the Pi child process and reads the layers itself, so
44
+ * mcp-proxy owns discovery and merging. What travels here is only what the child
45
+ * cannot work out on its own: which plugins this run selected, and the domain
46
+ * allowlist. The merged config doom-pi writes is for external frontends.
47
+ */
48
+ declare function mcpSessionEnvironment(options: Pick<HarnessOptions, 'repoRoot'>, resources: HarnessResources, allowlist: DomainMcpAllowlist | undefined): Record<string, string>;
49
+ /** Resolves the optional persona and environment profile selected for this run. */
50
+ declare function resolveHarnessProfile(options: HarnessOptions): AgentProfile | undefined;
51
+ /**
52
+ * Resolves the full matrix and stages every resource Pi will need.
53
+ *
54
+ * The caller owns the returned cleanup(): the temporary directory holding
55
+ * skills, agents, and the generated MCP config has to outlive this function
56
+ * and be removed once the selected command is done with it.
57
+ */
58
+ declare function buildHarnessContext(options: HarnessOptions, telemetry?: HarnessTelemetry): Promise<HarnessContext>;
59
+ //#endregion
60
+ export { HarnessContext, buildHarnessContext, configurePreset, mcpSessionEnvironment, resolveHarnessProfile };
61
+ //# sourceMappingURL=harnessContext.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harnessContext.d.cts","names":[],"sources":["../../src/services/harnessContext.ts"],"mappings":";;;;;;;AAwCA;;;;;UAAiB,cAAA;EACf,OAAA,EAAS,cAAA;EACT,WAAA,EAAa,MAAA,CAAO,UAAA;EACpB,SAAA,EAAW,gBAAA;EACX,OAAA,EAAS,WAAA;EACT,OAAA;EACA,gBAAA;EALA;EAOA,WAAA;EACA,YAAA,GAAe,kBAAA;EACf,gBAAA,EAAkB,gBAAA;EAClB,cAAA;EACA,UAAA;EACA,QAAA;EACA,YAAA;EACA,iBAAA;EACA,gBAAA;EACA,OAAA,IAAW,OAAA;AAAA;;;;;;;;iBAUG,eAAA,CACd,OAAA,EAAS,IAAA,CAAK,cAAA,wBACd,WAAA,EAAa,MAAA,CAAO,UAAA;;;;;;;AAFtB;;iBAgCgB,qBAAA,CACd,OAAA,EAAS,IAAA,CAAK,cAAA,eACd,SAAA,EAAW,gBAAA,EACX,SAAA,EAAW,kBAAA,eACV,MAAA;;iBAUa,qBAAA,CAAsB,OAAA,EAAS,cAAA,GAAiB,YAAA;;;;;;;;iBAW1C,mBAAA,CACpB,OAAA,EAAS,cAAA,EACT,SAAA,GAAW,gBAAA,GACV,OAAA,CAAQ,cAAA"}
@@ -0,0 +1,61 @@
1
+ import { HarnessOptions, HarnessResources } from "../interfaces/harness.mjs";
2
+ import { HarnessTelemetry } from "../logSinkTelemetry.mjs";
3
+ import { AgentProfile, DomainMcpAllowlist, MajorModesConfig, PluginEntry } from "../config/index.mjs";
4
+
5
+ //#region src/services/harnessContext.d.ts
6
+ /**
7
+ * Everything a command needs, resolved once.
8
+ *
9
+ * All three commands need the same expensive preparation (domains resolved,
10
+ * plugins collected into a temp directory, environment assembled), so it is
11
+ * built here and handed to whichever command runs.
12
+ */
13
+ interface HarnessContext {
14
+ options: HarnessOptions;
15
+ environment: NodeJS.ProcessEnv;
16
+ resources: HarnessResources;
17
+ plugins: PluginEntry[];
18
+ profile?: string;
19
+ personaDirectory?: string;
20
+ /** Root personaDirectory resolves against, when a profile supplied one. */
21
+ personaRoot?: string;
22
+ mcpAllowlist?: DomainMcpAllowlist;
23
+ majorModesConfig: MajorModesConfig;
24
+ selectedLayers: string[];
25
+ hookGroups: string[];
26
+ mcpEntry?: string;
27
+ personaEntry?: string;
28
+ workflowExtension?: string;
29
+ defaultThemePath: string;
30
+ cleanup(): Promise<void>;
31
+ }
32
+ /**
33
+ * Applies the provider environment a preset needs.
34
+ *
35
+ * Exported because the synced Pi path has no launcher to do it: the doom-pi
36
+ * extension applies the same rules in-process before anything reads them.
37
+ * `piArgs` is only consulted to spot a selected cloud model.
38
+ */
39
+ declare function configurePreset(options: Pick<HarnessOptions, 'preset' | 'piArgs'>, environment: NodeJS.ProcessEnv): void;
40
+ /**
41
+ * Describes this run's MCP configuration for the doom-mcp extension.
42
+ *
43
+ * The extension runs inside the Pi child process and reads the layers itself, so
44
+ * mcp-proxy owns discovery and merging. What travels here is only what the child
45
+ * cannot work out on its own: which plugins this run selected, and the domain
46
+ * allowlist. The merged config doom-pi writes is for external frontends.
47
+ */
48
+ declare function mcpSessionEnvironment(options: Pick<HarnessOptions, 'repoRoot'>, resources: HarnessResources, allowlist: DomainMcpAllowlist | undefined): Record<string, string>;
49
+ /** Resolves the optional persona and environment profile selected for this run. */
50
+ declare function resolveHarnessProfile(options: HarnessOptions): AgentProfile | undefined;
51
+ /**
52
+ * Resolves the full matrix and stages every resource Pi will need.
53
+ *
54
+ * The caller owns the returned cleanup(): the temporary directory holding
55
+ * skills, agents, and the generated MCP config has to outlive this function
56
+ * and be removed once the selected command is done with it.
57
+ */
58
+ declare function buildHarnessContext(options: HarnessOptions, telemetry?: HarnessTelemetry): Promise<HarnessContext>;
59
+ //#endregion
60
+ export { HarnessContext, buildHarnessContext, configurePreset, mcpSessionEnvironment, resolveHarnessProfile };
61
+ //# sourceMappingURL=harnessContext.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harnessContext.d.mts","names":[],"sources":["../../src/services/harnessContext.ts"],"mappings":";;;;;;;AAwCA;;;;;UAAiB,cAAA;EACf,OAAA,EAAS,cAAA;EACT,WAAA,EAAa,MAAA,CAAO,UAAA;EACpB,SAAA,EAAW,gBAAA;EACX,OAAA,EAAS,WAAA;EACT,OAAA;EACA,gBAAA;EALA;EAOA,WAAA;EACA,YAAA,GAAe,kBAAA;EACf,gBAAA,EAAkB,gBAAA;EAClB,cAAA;EACA,UAAA;EACA,QAAA;EACA,YAAA;EACA,iBAAA;EACA,gBAAA;EACA,OAAA,IAAW,OAAA;AAAA;;;;;;;;iBAUG,eAAA,CACd,OAAA,EAAS,IAAA,CAAK,cAAA,wBACd,WAAA,EAAa,MAAA,CAAO,UAAA;;;;;;;AAFtB;;iBAgCgB,qBAAA,CACd,OAAA,EAAS,IAAA,CAAK,cAAA,eACd,SAAA,EAAW,gBAAA,EACX,SAAA,EAAW,kBAAA,eACV,MAAA;;iBAUa,qBAAA,CAAsB,OAAA,EAAS,cAAA,GAAiB,YAAA;;;;;;;;iBAW1C,mBAAA,CACpB,OAAA,EAAS,cAAA,EACT,SAAA,GAAW,gBAAA,GACV,OAAA,CAAQ,cAAA"}
@@ -0,0 +1,2 @@
1
+ import{HARNESS_EVENT as e,createHarnessTelemetry as t}from"../logSinkTelemetry.mjs";import{createHarnessSession as n}from"../config/harnessState.mjs";import{DEFAULT_THEME_NAME as r,applyProfileEnvironment as i,buildPersonaPrompt as a,layerHookGroups as o,loadMajorModesConfig as s,resolveLayers as c,resolvePluginEntries as l,resolveProfile as u,resolveSharedSkills as d,writeDefaultTheme as f}from"../config/index.mjs";import{resolveMcpAllowlist as p}from"./mcpFilter.mjs";import{optionalPackageEntry as m,ownEntry as h,packageEntry as g}from"../utils/moduleResolution.mjs";import"../utils/index.mjs";import{collectResources as _,selectWorkflowExtensionForProcess as v}from"./resourceCollector.mjs";import{CONTEXT_PACKAGES as y,PERSONA_ENTRY as b,filterHookDisabledLayers as x}from"./extensionAssembler.mjs";import S from"node:path";import C from"node:fs";import{sessionConfigEnvironment as w}from"@agimon-ai/doompi-mcp";const T=`ollama`,E=`resolve_config`,D=`collect_resources`;function O(e,t){if(e.preset===`kimi`&&(!t.KIMI_API_KEY&&t.KIMI_CODE_API_KEY&&(t.KIMI_API_KEY=t.KIMI_CODE_API_KEY),!t.KIMI_API_KEY))throw Error(`KIMI_API_KEY or KIMI_CODE_API_KEY is required for the kimi preset`);if(e.preset===T){if((e.piArgs.find(e=>e.startsWith(`${T}/`))?.endsWith(`:cloud`)??!1)&&!t.OLLAMA_API_KEY)throw Error(`OLLAMA_API_KEY is required for Ollama cloud models`);t.OLLAMA_API_KEY||=T,t.DOOMPI_OLLAMA_BASE_URL=t.OLLAMA_BASE_URL??t.ANTHROPIC_BASE_URL??`http://localhost:11434/v1`}}function k(e,t,n){return w({repoRoot:e.repoRoot,stagingDirectory:t.temporaryDirectory,...t.pluginMcpConfigPaths.length>0?{pluginConfigPaths:t.pluginMcpConfigPaths}:{},...n?{allowlist:n}:{}})}function A(e){return e.profile?u(e.repoRoot,e.profile):void 0}async function j(u,w=t()){let T=await w.runInSpan(`doom_pi.${E}`,{"harness.phase":E},async()=>{let e=s(u.repoRoot),t=x(c(e,u.majorMode),u.hooks),n=A(u);if(!C.existsSync(u.cwd)||!C.statSync(u.cwd).isDirectory())throw Error(`Working directory does not exist: ${u.cwd}`);return{majorModesConfig:e,selectedLayers:t,hookGroups:o(e,t),profile:n,plugins:l(u.repoRoot,u.domains,u.pluginDirectories),mcpAllowlist:p(u.repoRoot,u.domains),sharedSkills:d(u.repoRoot,u.domains)}}).catch(async t=>{throw await w.recordError(e.configLoadFailed,t,{"harness.phase":E,"harness.major_mode":u.majorMode,"harness.domain_count":u.domains.length}),t}),{majorModesConfig:j,selectedLayers:M,hookGroups:N,profile:P,plugins:F,mcpAllowlist:I}=T,L=P?.persona,R=P?.personaRoot??u.repoRoot,z=m(y.workflow),B=m(y.dispatcherWorkflow),V=await w.runInSpan(`doom_pi.${D}`,{"harness.plugin.count":F.length,"harness.agents":u.agents,"harness.mcp":u.mcp},()=>_(u.repoRoot,F,{agents:u.agents,mcp:u.mcp,temporaryDirectory:u.resourceDirectory,workflowExtension:z,dispatcherWorkflowExtension:B,mcpAllowlist:I,sharedSkills:T.sharedSkills})).catch(async t=>{throw await w.recordError(e.resourceCollectionFailed,t,{"harness.phase":D,"harness.plugin.count":F.length}),t});try{let e=v(z,V.dispatcherWorkflowExtensionPath),t=await f(V.temporaryDirectory),o={...process.env},s=i(o,P?.env??{});O(u,o),o.NX_DAEMON??=`false`,o.DOOMPI_THEME||=r,o.CLAUDE_PROJECT_DIR=u.repoRoot,o.CODEX_REPO_ROOT=u.repoRoot,o.ORIGINAL_REPO_PATH||=u.repoRoot,o.MCP_UI_VIEWER=u.automation?`none`:o.MCP_UI_VIEWER??``;let c=h(b),l=L?a(R,L):void 0,d;l&&(d=S.join(V.temporaryDirectory,`persona.md`),await C.promises.writeFile(d,`${l}\n`,{mode:384}));let p=u.mcp?g(y.mcp):void 0;return p&&Object.assign(o,k(u,V,I)),n({root:u.repoRoot,majorMode:u.majorMode,temporaryDirectory:V.temporaryDirectory,domains:u.domains,layers:M,profile:P?.name,profileEnvironment:s,personaFile:d,skillDirectories:V.skillDirectories,agentDirectories:V.agentDirectories,additionalDirectories:u.additionalDirectories,childExtensions:[],pluginDirectories:u.pluginDirectories,pluginHooks:V.pluginHooks,hookGroups:N,hooks:u.hooks,agents:u.agents,mcp:u.mcp,mcpConfigPath:V.mcpConfigPath,allowProtectedWrites:u.allowProtectedWrites,workflowExtension:z},{directory:V.temporaryDirectory,environment:o}),u.agents&&(o.PI_SUBAGENT_EXTRA_AGENT_DIRS=V.agentDirectories.join(S.delimiter),o.PI_SUBAGENT_EXTRA_SKILL_DIRS=V.skillDirectories.join(S.delimiter),o.PI_SUBAGENT_PI_BINARY=S.join(u.repoRoot,`pi.sh`)),{options:u,environment:o,resources:V,plugins:F,profile:P?.name,personaDirectory:L,personaRoot:R,mcpAllowlist:I,majorModesConfig:j,selectedLayers:M,hookGroups:N,mcpEntry:p,personaEntry:c,workflowExtension:e,defaultThemePath:t,cleanup:V.cleanup.bind(V)}}catch(t){throw await w.recordError(e.contextBuildFailed,t,{"harness.phase":`build_context`,"harness.major_mode":u.majorMode,...P?.name?{"harness.profile":P.name}:{}}),await V.cleanup(),t}}export{j as buildHarnessContext,O as configurePreset,k as mcpSessionEnvironment,A as resolveHarnessProfile};
2
+ //# sourceMappingURL=harnessContext.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harnessContext.mjs","names":[],"sources":["../../src/services/harnessContext.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { sessionConfigEnvironment } from '@agimon-ai/doompi-mcp';\nimport {\n type AgentProfile,\n type DomainMcpAllowlist,\n type MajorModesConfig,\n type PluginEntry,\n DEFAULT_THEME_NAME,\n applyProfileEnvironment,\n buildPersonaPrompt,\n createHarnessSession,\n layerHookGroups,\n loadMajorModesConfig,\n resolveLayers,\n resolvePluginEntries,\n resolveProfile,\n resolveSharedSkills,\n writeDefaultTheme,\n} from '../config/index.ts';\nimport type { HarnessOptions, HarnessResources } from '../interfaces/index.ts';\nimport { createHarnessTelemetry, HARNESS_EVENT, type HarnessTelemetry } from '../logSinkTelemetry.ts';\nimport { optionalPackageEntry, ownEntry, packageEntry } from '../utils/index.ts';\nimport { CONTEXT_PACKAGES, PERSONA_ENTRY, filterHookDisabledLayers } from './extensionAssembler.ts';\nimport { resolveMcpAllowlist } from './mcpFilter.ts';\nimport { collectResources, selectWorkflowExtensionForProcess } from './resourceCollector.ts';\n\nconst OLLAMA_PRESET = 'ollama';\nconst PRIVATE_FILE_MODE = 0o600;\nconst RESOLVE_CONFIG_PHASE = 'resolve_config';\nconst COLLECT_RESOURCES_PHASE = 'collect_resources';\nconst BUILD_CONTEXT_PHASE = 'build_context';\n\n/**\n * Everything a command needs, resolved once.\n *\n * All three commands need the same expensive preparation (domains resolved,\n * plugins collected into a temp directory, environment assembled), so it is\n * built here and handed to whichever command runs.\n */\nexport interface HarnessContext {\n options: HarnessOptions;\n environment: NodeJS.ProcessEnv;\n resources: HarnessResources;\n plugins: PluginEntry[];\n profile?: string;\n personaDirectory?: string;\n /** Root personaDirectory resolves against, when a profile supplied one. */\n personaRoot?: string;\n mcpAllowlist?: DomainMcpAllowlist;\n majorModesConfig: MajorModesConfig;\n selectedLayers: string[];\n hookGroups: string[];\n mcpEntry?: string;\n personaEntry?: string;\n workflowExtension?: string;\n defaultThemePath: string;\n cleanup(): Promise<void>;\n}\n\n/**\n * Applies the provider environment a preset needs.\n *\n * Exported because the synced Pi path has no launcher to do it: the doom-pi\n * extension applies the same rules in-process before anything reads them.\n * `piArgs` is only consulted to spot a selected cloud model.\n */\nexport function configurePreset(\n options: Pick<HarnessOptions, 'preset' | 'piArgs'>,\n environment: NodeJS.ProcessEnv,\n): void {\n if (options.preset === 'kimi') {\n if (!environment.KIMI_API_KEY && environment.KIMI_CODE_API_KEY) {\n environment.KIMI_API_KEY = environment.KIMI_CODE_API_KEY;\n }\n if (!environment.KIMI_API_KEY) {\n throw new Error('KIMI_API_KEY or KIMI_CODE_API_KEY is required for the kimi preset');\n }\n }\n if (options.preset === OLLAMA_PRESET) {\n const selected = options.piArgs.find((argument) => argument.startsWith(`${OLLAMA_PRESET}/`));\n const cloud = selected?.endsWith(':cloud') ?? false;\n if (cloud && !environment.OLLAMA_API_KEY) {\n throw new Error('OLLAMA_API_KEY is required for Ollama cloud models');\n }\n environment.OLLAMA_API_KEY ||= OLLAMA_PRESET;\n environment.DOOMPI_OLLAMA_BASE_URL =\n environment.OLLAMA_BASE_URL ?? environment.ANTHROPIC_BASE_URL ?? 'http://localhost:11434/v1';\n }\n}\n\n/**\n * Describes this run's MCP configuration for the doom-mcp extension.\n *\n * The extension runs inside the Pi child process and reads the layers itself, so\n * mcp-proxy owns discovery and merging. What travels here is only what the child\n * cannot work out on its own: which plugins this run selected, and the domain\n * allowlist. The merged config doom-pi writes is for external frontends.\n */\nexport function mcpSessionEnvironment(\n options: Pick<HarnessOptions, 'repoRoot'>,\n resources: HarnessResources,\n allowlist: DomainMcpAllowlist | undefined,\n): Record<string, string> {\n return sessionConfigEnvironment({\n repoRoot: options.repoRoot,\n stagingDirectory: resources.temporaryDirectory,\n ...(resources.pluginMcpConfigPaths.length > 0 ? { pluginConfigPaths: resources.pluginMcpConfigPaths } : {}),\n ...(allowlist ? { allowlist } : {}),\n });\n}\n\n/** Resolves the optional persona and environment profile selected for this run. */\nexport function resolveHarnessProfile(options: HarnessOptions): AgentProfile | undefined {\n return options.profile ? resolveProfile(options.repoRoot, options.profile) : undefined;\n}\n\n/**\n * Resolves the full matrix and stages every resource Pi will need.\n *\n * The caller owns the returned cleanup(): the temporary directory holding\n * skills, agents, and the generated MCP config has to outlive this function\n * and be removed once the selected command is done with it.\n */\nexport async function buildHarnessContext(\n options: HarnessOptions,\n telemetry: HarnessTelemetry = createHarnessTelemetry(),\n): Promise<HarnessContext> {\n // Everything up to collectResources reads configuration off disk, so a single\n // malformed modes.yaml or profiles.yaml surfaces here as a failed launch\n // with no other record.\n const configured = await telemetry\n .runInSpan(`doom_pi.${RESOLVE_CONFIG_PHASE}`, { 'harness.phase': RESOLVE_CONFIG_PHASE }, async () => {\n const majorModesConfig = loadMajorModesConfig(options.repoRoot);\n const selectedLayers = filterHookDisabledLayers(\n resolveLayers(majorModesConfig, options.majorMode),\n options.hooks,\n );\n const profile = resolveHarnessProfile(options);\n if (!fs.existsSync(options.cwd) || !fs.statSync(options.cwd).isDirectory()) {\n throw new Error(`Working directory does not exist: ${options.cwd}`);\n }\n return {\n majorModesConfig,\n selectedLayers,\n hookGroups: layerHookGroups(majorModesConfig, selectedLayers),\n profile,\n plugins: resolvePluginEntries(options.repoRoot, options.domains, options.pluginDirectories),\n mcpAllowlist: resolveMcpAllowlist(options.repoRoot, options.domains),\n sharedSkills: resolveSharedSkills(options.repoRoot, options.domains),\n };\n })\n .catch(async (error: unknown) => {\n await telemetry.recordError(HARNESS_EVENT.configLoadFailed, error, {\n 'harness.phase': RESOLVE_CONFIG_PHASE,\n 'harness.major_mode': options.majorMode,\n 'harness.domain_count': options.domains.length,\n });\n throw error;\n });\n\n const { majorModesConfig, selectedLayers, hookGroups, profile, plugins, mcpAllowlist } = configured;\n const personaDirectory = profile?.persona;\n // A global profile's persona lives beside the global config, not in the repo.\n const personaRoot = profile?.personaRoot ?? options.repoRoot;\n const workflowExtension = optionalPackageEntry(CONTEXT_PACKAGES.workflow);\n const dispatcherWorkflowExtension = optionalPackageEntry(CONTEXT_PACKAGES.dispatcherWorkflow);\n const resources = await telemetry\n .runInSpan(\n `doom_pi.${COLLECT_RESOURCES_PHASE}`,\n { 'harness.plugin.count': plugins.length, 'harness.agents': options.agents, 'harness.mcp': options.mcp },\n () =>\n collectResources(options.repoRoot, plugins, {\n agents: options.agents,\n mcp: options.mcp,\n // Set by `doom-pi sync`, which stages into a directory that outlives\n // the process rather than a temporary one.\n temporaryDirectory: options.resourceDirectory,\n workflowExtension,\n dispatcherWorkflowExtension,\n mcpAllowlist,\n sharedSkills: configured.sharedSkills,\n }),\n )\n .catch(async (error: unknown) => {\n // Conflicting skills, agents, or MCP servers all fail here, and the plugin\n // that caused it is only identifiable from the message.\n await telemetry.recordError(HARNESS_EVENT.resourceCollectionFailed, error, {\n 'harness.phase': COLLECT_RESOURCES_PHASE,\n 'harness.plugin.count': plugins.length,\n });\n throw error;\n });\n\n try {\n const activeWorkflowExtension = selectWorkflowExtensionForProcess(\n workflowExtension,\n resources.dispatcherWorkflowExtensionPath,\n );\n const defaultThemePath = await writeDefaultTheme(resources.temporaryDirectory);\n const environment = { ...process.env };\n const profileEnvironment = applyProfileEnvironment(environment, profile?.env ?? {});\n\n configurePreset(options, environment);\n environment.NX_DAEMON ??= 'false';\n environment.DOOMPI_THEME ||= DEFAULT_THEME_NAME;\n environment.CLAUDE_PROJECT_DIR = options.repoRoot;\n environment.CODEX_REPO_ROOT = options.repoRoot;\n environment.ORIGINAL_REPO_PATH ||= options.repoRoot;\n environment.MCP_UI_VIEWER = options.automation ? 'none' : (environment.MCP_UI_VIEWER ?? '');\n\n // Always loaded, even with no persona at launch: the extension no-ops\n // without a persona file, and /profile needs it present to load one later.\n // Pi freezes the --extension list at startup, so it cannot be added on demand.\n const personaEntry = ownEntry(PERSONA_ENTRY);\n const personaPrompt = personaDirectory ? buildPersonaPrompt(personaRoot, personaDirectory) : undefined;\n let personaFile: string | undefined;\n if (personaPrompt) {\n personaFile = path.join(resources.temporaryDirectory, 'persona.md');\n await fs.promises.writeFile(personaFile, `${personaPrompt}\\n`, { mode: PRIVATE_FILE_MODE });\n }\n\n // doom-mcp is a normal package entry rather than generated code: it reads the\n // repository and plugin layers itself, so there is nothing to codegen a path\n // into. `--no-mcp` still gates by leaving the entry out of the list.\n const mcpEntry = options.mcp ? packageEntry(CONTEXT_PACKAGES.mcp) : undefined;\n if (mcpEntry) Object.assign(environment, mcpSessionEnvironment(options, resources, mcpAllowlist));\n\n // One write, describing the child rather than this process. The state file\n // is the child's authority and the environment is what it projects for the\n // hooks and packages that can only read an environment.\n createHarnessSession(\n {\n root: options.repoRoot,\n majorMode: options.majorMode,\n temporaryDirectory: resources.temporaryDirectory,\n domains: options.domains,\n layers: selectedLayers,\n profile: profile?.name,\n profileEnvironment,\n personaFile,\n skillDirectories: resources.skillDirectories,\n agentDirectories: resources.agentDirectories,\n additionalDirectories: options.additionalDirectories,\n childExtensions: [],\n pluginDirectories: options.pluginDirectories,\n pluginHooks: resources.pluginHooks,\n hookGroups,\n hooks: options.hooks,\n agents: options.agents,\n mcp: options.mcp,\n mcpConfigPath: resources.mcpConfigPath,\n allowProtectedWrites: options.allowProtectedWrites,\n workflowExtension,\n },\n { directory: resources.temporaryDirectory, environment },\n );\n if (options.agents) {\n environment.PI_SUBAGENT_EXTRA_AGENT_DIRS = resources.agentDirectories.join(path.delimiter);\n environment.PI_SUBAGENT_EXTRA_SKILL_DIRS = resources.skillDirectories.join(path.delimiter);\n environment.PI_SUBAGENT_PI_BINARY = path.join(options.repoRoot, 'pi.sh');\n }\n\n // Core hook groups load regardless; hookGroups selects the rest. The initial\n // state write includes an empty list deliberately: unset means every group.\n\n return {\n options,\n environment,\n resources,\n plugins,\n profile: profile?.name,\n personaDirectory,\n personaRoot,\n mcpAllowlist,\n majorModesConfig,\n selectedLayers,\n hookGroups,\n mcpEntry,\n personaEntry,\n workflowExtension: activeWorkflowExtension,\n defaultThemePath,\n cleanup: resources.cleanup.bind(resources),\n };\n } catch (error) {\n // Preparation failed after the temp directory existed, so nothing will be\n // handed back to clean it up.\n await telemetry.recordError(HARNESS_EVENT.contextBuildFailed, error, {\n 'harness.phase': BUILD_CONTEXT_PHASE,\n 'harness.major_mode': options.majorMode,\n ...(profile?.name ? { 'harness.profile': profile.name } : {}),\n });\n await resources.cleanup();\n throw error;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./mcpFilter.cjs`),t=require(`./resourceCollector.cjs`),n=require(`./compatibilityContext.cjs`),r=require(`./compatibility/process.cjs`),i=require(`./compatibility/antigravity.cjs`),a=require(`./compatibility/codex.cjs`),o=require(`./compatibility/index.cjs`),s=require(`./extensionAssembler.cjs`),c=require(`./harnessContext.cjs`),l=require(`./matrixSwitcher.cjs`),u=require(`./syncState.cjs`),d=require(`./composer.cjs`),f=require(`./piSettings.cjs`);exports.COMPOSED_ENV=d.COMPOSED_ENV,exports.CONTEXT_PACKAGES=s.CONTEXT_PACKAGES,exports.DISPATCHER_AGENT_NAME=t.DISPATCHER_AGENT_NAME,exports.DOOM_FLAGS=d.DOOM_FLAGS,exports.LAYER_RESOLVERS=s.LAYER_RESOLVERS,exports.MUTE_ENV=d.MUTE_ENV,exports.OLLAMA_PRESET=s.OLLAMA_PRESET,exports.PERSONA_ENTRY=s.PERSONA_ENTRY,exports.PROXY_SERVER_NAME=e.PROXY_SERVER_NAME,exports.adaptAgentDefinition=t.adaptAgentDefinition,exports.adaptAntigravityMcpDefinition=i.adaptAntigravityMcpDefinition,exports.alreadyComposed=d.alreadyComposed,exports.antigravityCompatibilityArgs=i.antigravityCompatibilityArgs,exports.applyDomains=l.applyDomains,exports.applyMajorMode=l.applyMajorMode,exports.applyMcpAllowlist=e.applyMcpAllowlist,exports.applyPersona=l.applyPersona,exports.applyProfile=l.applyProfile,exports.assembleChildExtensions=s.assembleChildExtensions,exports.assembleExtensions=s.assembleExtensions,exports.buildCompatibilityContext=n.buildCompatibilityContext,exports.buildHarnessContext=c.buildHarnessContext,exports.claudeCompatibilityArgs=o.claudeCompatibilityArgs,exports.cleanupRunDirectory=d.cleanupRunDirectory,exports.codexCompatibilityArgs=a.codexCompatibilityArgs,exports.collectResources=t.collectResources,exports.composeDoomSession=d.composeDoomSession,exports.composeLoadOrder=d.composeLoadOrder,exports.computeInputsHash=u.computeInputsHash,exports.configurePreset=c.configurePreset,exports.createMapResolvers=u.createMapResolvers,exports.createRecordingResolvers=u.createRecordingResolvers,exports.extensionLayers=l.extensionLayers,exports.extensionsProvidedExternally=d.extensionsProvidedExternally,exports.filterHookDisabledLayers=s.filterHookDisabledLayers,exports.filterMcpServers=e.filterMcpServers,exports.filterProxyConfig=e.filterProxyConfig,exports.findSyncedRoot=d.findSyncedRoot,exports.launchCompatibility=o.launchCompatibility,exports.loadComposedExtensions=d.loadComposedExtensions,exports.mergeMcpConfigs=t.mergeMcpConfigs,exports.mergePiSettings=f.mergePiSettings,exports.needsRelaunch=l.needsRelaunch,exports.persistMcpConfig=e.persistMcpConfig,exports.piSettingsPath=f.piSettingsPath,exports.prepareRunDirectory=d.prepareRunDirectory,exports.readMcpServerNames=u.readMcpServerNames,exports.readPiSettings=f.readPiSettings,exports.readStartupFlags=d.readStartupFlags,exports.readSyncState=u.readSyncState,exports.recordResolvedEntries=u.recordResolvedEntries,exports.registerDoomFlags=d.registerDoomFlags,exports.resolveHarnessProfile=c.resolveHarnessProfile,exports.resolveMcpAllowlist=e.resolveMcpAllowlist,exports.runDirectory=u.runDirectory,exports.runInteractive=r.runInteractive,exports.selectWorkflowExtensionForProcess=t.selectWorkflowExtensionForProcess,exports.serializePiSettings=f.serializePiSettings,exports.serializeSyncState=u.serializeSyncState,exports.settingsRelativePath=u.settingsRelativePath,exports.signalExitCode=r.signalExitCode,exports.startSyncedSession=d.startSyncedSession,exports.supportsCodexManagedProfile=a.supportsCodexManagedProfile,exports.syncDirectory=u.syncDirectory,exports.syncStatePath=u.syncStatePath,exports.writePiSettings=f.writePiSettings,exports.writeSyncState=u.writeSyncState;
@@ -0,0 +1,14 @@
1
+ import { CompatibilityContext, buildCompatibilityContext } from "./compatibilityContext.cjs";
2
+ import { adaptAntigravityMcpDefinition, antigravityCompatibilityArgs } from "./compatibility/antigravity.cjs";
3
+ import { codexCompatibilityArgs, supportsCodexManagedProfile } from "./compatibility/codex.cjs";
4
+ import { runInteractive, signalExitCode } from "./compatibility/process.cjs";
5
+ import { claudeCompatibilityArgs, launchCompatibility } from "./compatibility/index.cjs";
6
+ import { CONTEXT_PACKAGES, ExtensionContext, LAYER_RESOLVERS, OLLAMA_PRESET, PERSONA_ENTRY, assembleChildExtensions, assembleExtensions, filterHookDisabledLayers } from "./extensionAssembler.cjs";
7
+ import { SyncBaseline, SyncSelection, SyncState, computeInputsHash, createMapResolvers, createRecordingResolvers, readMcpServerNames, readSyncState, recordResolvedEntries, runDirectory, serializeSyncState, settingsRelativePath, syncDirectory, syncStatePath, writeSyncState } from "./syncState.cjs";
8
+ import { COMPOSED_ENV, ComposeOutcome, DOOM_FLAGS, MUTE_ENV, StartupFlags, alreadyComposed, cleanupRunDirectory, composeDoomSession, composeLoadOrder, extensionsProvidedExternally, findSyncedRoot, loadComposedExtensions, prepareRunDirectory, readStartupFlags, registerDoomFlags, startSyncedSession } from "./composer.cjs";
9
+ import { HarnessContext, buildHarnessContext, configurePreset, resolveHarnessProfile } from "./harnessContext.cjs";
10
+ import { PiSettingsUpdate, mergePiSettings, piSettingsPath, readPiSettings, serializePiSettings, writePiSettings } from "./piSettings.cjs";
11
+ import { PROXY_SERVER_NAME, applyMcpAllowlist, filterMcpServers, filterProxyConfig, persistMcpConfig, resolveMcpAllowlist } from "./mcpFilter.cjs";
12
+ import { DISPATCHER_AGENT_NAME, adaptAgentDefinition, collectResources, mergeMcpConfigs, selectWorkflowExtensionForProcess } from "./resourceCollector.cjs";
13
+ import { applyDomains, applyMajorMode, applyPersona, applyProfile, extensionLayers, needsRelaunch } from "./matrixSwitcher.cjs";
14
+ export { COMPOSED_ENV, CONTEXT_PACKAGES, type CompatibilityContext, type ComposeOutcome, DISPATCHER_AGENT_NAME, DOOM_FLAGS, type ExtensionContext, type HarnessContext, LAYER_RESOLVERS, MUTE_ENV, OLLAMA_PRESET, PERSONA_ENTRY, PROXY_SERVER_NAME, type PiSettingsUpdate, type StartupFlags, type SyncBaseline, type SyncSelection, type SyncState, adaptAgentDefinition, adaptAntigravityMcpDefinition, alreadyComposed, antigravityCompatibilityArgs, applyDomains, applyMajorMode, applyMcpAllowlist, applyPersona, applyProfile, assembleChildExtensions, assembleExtensions, buildCompatibilityContext, buildHarnessContext, claudeCompatibilityArgs, cleanupRunDirectory, codexCompatibilityArgs, collectResources, composeDoomSession, composeLoadOrder, computeInputsHash, configurePreset, createMapResolvers, createRecordingResolvers, extensionLayers, extensionsProvidedExternally, filterHookDisabledLayers, filterMcpServers, filterProxyConfig, findSyncedRoot, launchCompatibility, loadComposedExtensions, mergeMcpConfigs, mergePiSettings, needsRelaunch, persistMcpConfig, piSettingsPath, prepareRunDirectory, readMcpServerNames, readPiSettings, readStartupFlags, readSyncState, recordResolvedEntries, registerDoomFlags, resolveHarnessProfile, resolveMcpAllowlist, runDirectory, runInteractive, selectWorkflowExtensionForProcess, serializePiSettings, serializeSyncState, settingsRelativePath, signalExitCode, startSyncedSession, supportsCodexManagedProfile, syncDirectory, syncStatePath, writePiSettings, writeSyncState };
@@ -0,0 +1,14 @@
1
+ import { CompatibilityContext, buildCompatibilityContext } from "./compatibilityContext.mjs";
2
+ import { adaptAntigravityMcpDefinition, antigravityCompatibilityArgs } from "./compatibility/antigravity.mjs";
3
+ import { codexCompatibilityArgs, supportsCodexManagedProfile } from "./compatibility/codex.mjs";
4
+ import { runInteractive, signalExitCode } from "./compatibility/process.mjs";
5
+ import { claudeCompatibilityArgs, launchCompatibility } from "./compatibility/index.mjs";
6
+ import { CONTEXT_PACKAGES, ExtensionContext, LAYER_RESOLVERS, OLLAMA_PRESET, PERSONA_ENTRY, assembleChildExtensions, assembleExtensions, filterHookDisabledLayers } from "./extensionAssembler.mjs";
7
+ import { SyncBaseline, SyncSelection, SyncState, computeInputsHash, createMapResolvers, createRecordingResolvers, readMcpServerNames, readSyncState, recordResolvedEntries, runDirectory, serializeSyncState, settingsRelativePath, syncDirectory, syncStatePath, writeSyncState } from "./syncState.mjs";
8
+ import { COMPOSED_ENV, ComposeOutcome, DOOM_FLAGS, MUTE_ENV, StartupFlags, alreadyComposed, cleanupRunDirectory, composeDoomSession, composeLoadOrder, extensionsProvidedExternally, findSyncedRoot, loadComposedExtensions, prepareRunDirectory, readStartupFlags, registerDoomFlags, startSyncedSession } from "./composer.mjs";
9
+ import { HarnessContext, buildHarnessContext, configurePreset, resolveHarnessProfile } from "./harnessContext.mjs";
10
+ import { PiSettingsUpdate, mergePiSettings, piSettingsPath, readPiSettings, serializePiSettings, writePiSettings } from "./piSettings.mjs";
11
+ import { PROXY_SERVER_NAME, applyMcpAllowlist, filterMcpServers, filterProxyConfig, persistMcpConfig, resolveMcpAllowlist } from "./mcpFilter.mjs";
12
+ import { DISPATCHER_AGENT_NAME, adaptAgentDefinition, collectResources, mergeMcpConfigs, selectWorkflowExtensionForProcess } from "./resourceCollector.mjs";
13
+ import { applyDomains, applyMajorMode, applyPersona, applyProfile, extensionLayers, needsRelaunch } from "./matrixSwitcher.mjs";
14
+ export { COMPOSED_ENV, CONTEXT_PACKAGES, type CompatibilityContext, type ComposeOutcome, DISPATCHER_AGENT_NAME, DOOM_FLAGS, type ExtensionContext, type HarnessContext, LAYER_RESOLVERS, MUTE_ENV, OLLAMA_PRESET, PERSONA_ENTRY, PROXY_SERVER_NAME, type PiSettingsUpdate, type StartupFlags, type SyncBaseline, type SyncSelection, type SyncState, adaptAgentDefinition, adaptAntigravityMcpDefinition, alreadyComposed, antigravityCompatibilityArgs, applyDomains, applyMajorMode, applyMcpAllowlist, applyPersona, applyProfile, assembleChildExtensions, assembleExtensions, buildCompatibilityContext, buildHarnessContext, claudeCompatibilityArgs, cleanupRunDirectory, codexCompatibilityArgs, collectResources, composeDoomSession, composeLoadOrder, computeInputsHash, configurePreset, createMapResolvers, createRecordingResolvers, extensionLayers, extensionsProvidedExternally, filterHookDisabledLayers, filterMcpServers, filterProxyConfig, findSyncedRoot, launchCompatibility, loadComposedExtensions, mergeMcpConfigs, mergePiSettings, needsRelaunch, persistMcpConfig, piSettingsPath, prepareRunDirectory, readMcpServerNames, readPiSettings, readStartupFlags, readSyncState, recordResolvedEntries, registerDoomFlags, resolveHarnessProfile, resolveMcpAllowlist, runDirectory, runInteractive, selectWorkflowExtensionForProcess, serializePiSettings, serializeSyncState, settingsRelativePath, signalExitCode, startSyncedSession, supportsCodexManagedProfile, syncDirectory, syncStatePath, writePiSettings, writeSyncState };
@@ -0,0 +1 @@
1
+ import{PROXY_SERVER_NAME as e,applyMcpAllowlist as t,filterMcpServers as n,filterProxyConfig as r,persistMcpConfig as i,resolveMcpAllowlist as a}from"./mcpFilter.mjs";import{DISPATCHER_AGENT_NAME as o,adaptAgentDefinition as s,collectResources as c,mergeMcpConfigs as l,selectWorkflowExtensionForProcess as u}from"./resourceCollector.mjs";import{buildCompatibilityContext as d}from"./compatibilityContext.mjs";import{runInteractive as f,signalExitCode as p}from"./compatibility/process.mjs";import{adaptAntigravityMcpDefinition as m,antigravityCompatibilityArgs as h}from"./compatibility/antigravity.mjs";import{codexCompatibilityArgs as g,supportsCodexManagedProfile as _}from"./compatibility/codex.mjs";import{claudeCompatibilityArgs as v,launchCompatibility as y}from"./compatibility/index.mjs";import{CONTEXT_PACKAGES as b,LAYER_RESOLVERS as x,OLLAMA_PRESET as S,PERSONA_ENTRY as C,assembleChildExtensions as w,assembleExtensions as T,filterHookDisabledLayers as E}from"./extensionAssembler.mjs";import{buildHarnessContext as D,configurePreset as O,resolveHarnessProfile as k}from"./harnessContext.mjs";import{applyDomains as A,applyMajorMode as j,applyPersona as M,applyProfile as N,extensionLayers as P,needsRelaunch as F}from"./matrixSwitcher.mjs";import{computeInputsHash as I,createMapResolvers as L,createRecordingResolvers as R,readMcpServerNames as z,readSyncState as B,recordResolvedEntries as V,runDirectory as H,serializeSyncState as U,settingsRelativePath as W,syncDirectory as G,syncStatePath as K,writeSyncState as q}from"./syncState.mjs";import{COMPOSED_ENV as J,DOOM_FLAGS as Y,MUTE_ENV as X,alreadyComposed as Z,cleanupRunDirectory as Q,composeDoomSession as $,composeLoadOrder as ee,extensionsProvidedExternally as te,findSyncedRoot as ne,loadComposedExtensions as re,prepareRunDirectory as ie,readStartupFlags as ae,registerDoomFlags as oe,startSyncedSession as se}from"./composer.mjs";import{mergePiSettings as ce,piSettingsPath as le,readPiSettings as ue,serializePiSettings as de,writePiSettings as fe}from"./piSettings.mjs";export{J as COMPOSED_ENV,b as CONTEXT_PACKAGES,o as DISPATCHER_AGENT_NAME,Y as DOOM_FLAGS,x as LAYER_RESOLVERS,X as MUTE_ENV,S as OLLAMA_PRESET,C as PERSONA_ENTRY,e as PROXY_SERVER_NAME,s as adaptAgentDefinition,m as adaptAntigravityMcpDefinition,Z as alreadyComposed,h as antigravityCompatibilityArgs,A as applyDomains,j as applyMajorMode,t as applyMcpAllowlist,M as applyPersona,N as applyProfile,w as assembleChildExtensions,T as assembleExtensions,d as buildCompatibilityContext,D as buildHarnessContext,v as claudeCompatibilityArgs,Q as cleanupRunDirectory,g as codexCompatibilityArgs,c as collectResources,$ as composeDoomSession,ee as composeLoadOrder,I as computeInputsHash,O as configurePreset,L as createMapResolvers,R as createRecordingResolvers,P as extensionLayers,te as extensionsProvidedExternally,E as filterHookDisabledLayers,n as filterMcpServers,r as filterProxyConfig,ne as findSyncedRoot,y as launchCompatibility,re as loadComposedExtensions,l as mergeMcpConfigs,ce as mergePiSettings,F as needsRelaunch,i as persistMcpConfig,le as piSettingsPath,ie as prepareRunDirectory,z as readMcpServerNames,ue as readPiSettings,ae as readStartupFlags,B as readSyncState,V as recordResolvedEntries,oe as registerDoomFlags,k as resolveHarnessProfile,a as resolveMcpAllowlist,H as runDirectory,f as runInteractive,u as selectWorkflowExtensionForProcess,de as serializePiSettings,U as serializeSyncState,W as settingsRelativePath,p as signalExitCode,se as startSyncedSession,_ as supportsCodexManagedProfile,G as syncDirectory,K as syncStatePath,fe as writePiSettings,q as writeSyncState};
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../config/harnessState.cjs`),n=require(`./mcpFilter.cjs`),r=require(`./resourceCollector.cjs`),i=require(`./extensionAssembler.cjs`);let a=require(`node:path`);a=e.__toESM(a,1);let o=require(`node:fs`);o=e.__toESM(o,1);let s=require(`@agimon-ai/doompi-config/domains`),c=require(`@agimon-ai/doompi-config/profiles`),l=require(`@agimon-ai/doompi-config/majorModes`),u=require(`@agimon-ai/doompi-config`);async function d(e,i){let{root:o,temporaryDirectory:c}=(0,u.requireHarnessPaths)(i),l=await r.collectResources(o,(0,s.resolvePluginEntries)(o,e,[...i.pluginDirectories]),{agents:i.agents,mcp:i.mcp,temporaryDirectory:c,workflowExtension:i.workflowExtension,sharedSkills:(0,s.resolveSharedSkills)(o,e),mcpAllowlist:n.resolveMcpAllowlist(o,e)}),d=t.updateHarnessState({domains:e,skillDirectories:l.skillDirectories,pluginHooks:l.pluginHooks,mcpConfigPath:l.mcpConfigPath});return process.env.PI_SUBAGENT_EXTRA_AGENT_DIRS=l.agentDirectories.join(a.default.delimiter),process.env.PI_SUBAGENT_EXTRA_SKILL_DIRS=l.skillDirectories.join(a.default.delimiter),d}function f(e,n,r){let a=i.filterHookDisabledLayers((0,l.resolveLayers)(e,n),r.hooks);return t.updateHarnessState({majorMode:n,layers:a,hookGroups:(0,l.layerHookGroups)(e,a)})}function p(e,t){return t.filter(t=>{let n=e.layers[t];return!!(n&&((n.extensions?.length??0)>0||(n.packages?.length??0)>0))}).sort()}function m(e,t,n){return p(e,t).join(`,`)!==p(e,n).join(`,`)}async function h(e,n,r){let{root:i,temporaryDirectory:s}=(0,u.requireHarnessPaths)(n),l=(0,c.buildPersonaPrompt)(r??i,e);if(!l)return!1;let d=a.default.join(s,`persona.md`);return await o.default.promises.writeFile(d,`${l}\n`,{mode:384}),t.updateHarnessState({personaFile:d}),!0}async function g(e,n){if(!await h(e.persona,n,e.personaRoot))throw Error(`Profile ${e.name} has no readable persona files`);let r=(0,c.replaceProfileEnvironment)(process.env,n.profileEnvironment,e.env);t.updateHarnessState({profile:e.name,profileEnvironment:r});let i=Object.keys(e.env).sort(),a=i.length>0?`; env defaults ${i.join(`, `)}`:``;return`Loaded ${e.name}: persona ${e.persona}${a}.`}exports.applyDomains=d,exports.applyMajorMode=f,exports.applyPersona=h,exports.applyProfile=g,exports.extensionLayers=p,exports.needsRelaunch=m;
2
+ //# sourceMappingURL=matrixSwitcher.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matrixSwitcher.cjs","names":["collectResources","resolveMcpAllowlist","updateHarnessState","path","filterHookDisabledLayers","fs"],"sources":["../../src/services/matrixSwitcher.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport type { DoomHarnessContext } from '@agimon-ai/doompi-config';\nimport { resolvePluginEntries, resolveSharedSkills } from '@agimon-ai/doompi-config/domains';\nimport { type AgentProfile, buildPersonaPrompt, replaceProfileEnvironment } from '@agimon-ai/doompi-config/profiles';\nimport { requireHarnessPaths, type HarnessState, updateHarnessState } from '../config/harnessState.ts';\nimport { type MajorModesConfig, layerHookGroups, resolveLayers } from '@agimon-ai/doompi-config/majorModes';\nimport { filterHookDisabledLayers } from './extensionAssembler.ts';\nimport { collectResources } from './resourceCollector.ts';\nimport { resolveMcpAllowlist } from './mcpFilter.ts';\n\nconst PERSONA_FILE = 'persona.md';\n\n/**\n * Live matrix switching.\n *\n * Every axis writes through the harness state module and relies on Pi's reload\n * re-executing extension modules, which drops their module-level caches and\n * makes them re-read the environment. That is the same path /domains has always\n * used; major mode and profile persona changes now share it.\n *\n * What reload cannot do is change the SET of loaded extensions: Pi freezes the\n * CLI --extension list at construction (resource-loader.js:164) and re-resolves\n * that same array on every reload. Callers report those parts as needing a\n * relaunch instead of pretending they applied.\n */\n\n/** Domains: skills, plugin hooks, MCP config, and subagent directories. */\nexport async function applyDomains(domainNames: string[], state: DoomHarnessContext): Promise<HarnessState> {\n const { root, temporaryDirectory } = requireHarnessPaths(state);\n\n const pluginEntries = resolvePluginEntries(root, domainNames, [...state.pluginDirectories]);\n const resources = await collectResources(root, pluginEntries, {\n agents: state.agents,\n mcp: state.mcp,\n temporaryDirectory,\n workflowExtension: state.workflowExtension,\n sharedSkills: resolveSharedSkills(root, domainNames),\n mcpAllowlist: resolveMcpAllowlist(root, domainNames),\n });\n\n const updated = updateHarnessState({\n domains: domainNames,\n skillDirectories: resources.skillDirectories,\n pluginHooks: resources.pluginHooks,\n mcpConfigPath: resources.mcpConfigPath,\n });\n process.env.PI_SUBAGENT_EXTRA_AGENT_DIRS = resources.agentDirectories.join(path.delimiter);\n process.env.PI_SUBAGENT_EXTRA_SKILL_DIRS = resources.skillDirectories.join(path.delimiter);\n return updated;\n}\n\n/** Applies one major mode and the hook groups its effective layers contribute. */\nexport function applyMajorMode(config: MajorModesConfig, majorMode: string, state: DoomHarnessContext): HarnessState {\n const selected = filterHookDisabledLayers(resolveLayers(config, majorMode), state.hooks);\n return updateHarnessState({ majorMode, layers: selected, hookGroups: layerHookGroups(config, selected) });\n}\n\n/** Layers that contribute extensions or packages, which reload cannot swap. */\nexport function extensionLayers(config: MajorModesConfig, names: string[]): string[] {\n return names\n .filter((name) => {\n const layer = config.layers[name];\n return Boolean(layer && ((layer.extensions?.length ?? 0) > 0 || (layer.packages?.length ?? 0) > 0));\n })\n .sort();\n}\n\n/** Whether a mode change alters the extension set, and so needs a relaunch. */\nexport function needsRelaunch(config: MajorModesConfig, before: string[], after: string[]): boolean {\n return extensionLayers(config, before).join(',') !== extensionLayers(config, after).join(',');\n}\n\n/**\n * Persona: rewrites the assembled prompt file that the persona extension reads.\n *\n * The extension re-reads the file on reload and appends its block to whatever\n * system prompt it is given, so the repository's own AGENTS.md keeps applying\n * underneath. Returns false when the directories hold no readable persona.\n */\nexport async function applyPersona(\n personaDirectory: string,\n state: DoomHarnessContext,\n personaRoot?: string,\n): Promise<boolean> {\n const { root, temporaryDirectory } = requireHarnessPaths(state);\n\n const prompt = buildPersonaPrompt(personaRoot ?? root, personaDirectory);\n if (!prompt) return false;\n\n const personaPath = path.join(temporaryDirectory, PERSONA_FILE);\n await fs.promises.writeFile(personaPath, `${prompt}\\n`, { mode: 0o600 });\n updateHarnessState({ personaFile: personaPath });\n return true;\n}\n\n/**\n * Profile: one persona plus the environment defaults it declares.\n *\n * Lives beside the other switchers rather than in the /profile command,\n * because the synced Pi path applies the same switch from its `--profile` flag\n * before any command exists to run it.\n */\nexport async function applyProfile(profile: AgentProfile, state: DoomHarnessContext): Promise<string> {\n const appliedPersona = await applyPersona(profile.persona, state, profile.personaRoot);\n if (!appliedPersona) throw new Error(`Profile ${profile.name} has no readable persona files`);\n\n const profileEnvironment = replaceProfileEnvironment(process.env, state.profileEnvironment, profile.env);\n updateHarnessState({ profile: profile.name, profileEnvironment });\n\n const environmentKeys = Object.keys(profile.env).sort();\n const environmentSummary = environmentKeys.length > 0 ? `; env defaults ${environmentKeys.join(', ')}` : '';\n return `Loaded ${profile.name}: persona ${profile.persona}${environmentSummary}.`;\n}\n"],"mappings":"shBA4BA,eAAsB,EAAa,EAAuB,EAAkD,CAC1G,GAAM,CAAE,OAAM,uBAAA,EAAA,EAAA,qBAA2C,EAAM,CAGzD,EAAY,MAAMA,EAAAA,iBAAiB,GAAA,EAAA,EAAA,sBADE,EAAM,EAAa,CAAC,GAAG,EAAM,kBAAkB,CAC9B,CAAE,CAC5D,OAAQ,EAAM,OACd,IAAK,EAAM,IACX,qBACA,kBAAmB,EAAM,kBACzB,cAAA,EAAA,EAAA,qBAAkC,EAAM,EAAY,CACpD,aAAcC,EAAAA,oBAAoB,EAAM,EAAY,CACrD,CAAC,CAEI,EAAUC,EAAAA,mBAAmB,CACjC,QAAS,EACT,iBAAkB,EAAU,iBAC5B,YAAa,EAAU,YACvB,cAAe,EAAU,cAC1B,CAAC,CAGF,MAFA,SAAQ,IAAI,6BAA+B,EAAU,iBAAiB,KAAKC,EAAAA,QAAK,UAAU,CAC1F,QAAQ,IAAI,6BAA+B,EAAU,iBAAiB,KAAKA,EAAAA,QAAK,UAAU,CACnF,EAIT,SAAgB,EAAe,EAA0B,EAAmB,EAAyC,CACnH,IAAM,EAAWC,EAAAA,0BAAAA,EAAAA,EAAAA,eAAuC,EAAQ,EAAU,CAAE,EAAM,MAAM,CACxF,OAAOF,EAAAA,mBAAmB,CAAE,YAAW,OAAQ,EAAU,YAAA,EAAA,EAAA,iBAA4B,EAAQ,EAAS,CAAE,CAAC,CAI3G,SAAgB,EAAgB,EAA0B,EAA2B,CACnF,OAAO,EACJ,OAAQ,GAAS,CAChB,IAAM,EAAQ,EAAO,OAAO,GAC5B,MAAO,GAAQ,KAAW,EAAM,YAAY,QAAU,GAAK,IAAM,EAAM,UAAU,QAAU,GAAK,KAChG,CACD,MAAM,CAIX,SAAgB,EAAc,EAA0B,EAAkB,EAA0B,CAClG,OAAO,EAAgB,EAAQ,EAAO,CAAC,KAAK,IAAI,GAAK,EAAgB,EAAQ,EAAM,CAAC,KAAK,IAAI,CAU/F,eAAsB,EACpB,EACA,EACA,EACkB,CAClB,GAAM,CAAE,OAAM,uBAAA,EAAA,EAAA,qBAA2C,EAAM,CAEzD,GAAA,EAAA,EAAA,oBAA4B,GAAe,EAAM,EAAiB,CACxE,GAAI,CAAC,EAAQ,MAAO,GAEpB,IAAM,EAAcC,EAAAA,QAAK,KAAK,EAAoB,aAAa,CAG/D,OAFA,MAAME,EAAAA,QAAG,SAAS,UAAU,EAAa,GAAG,EAAO,IAAK,CAAE,KAAM,IAAO,CAAC,CACxE,EAAA,mBAAmB,CAAE,YAAa,EAAa,CAAC,CACzC,GAUT,eAAsB,EAAa,EAAuB,EAA4C,CAEpG,GAAI,CAAC,MADwB,EAAa,EAAQ,QAAS,EAAO,EAAQ,YAAY,CACjE,MAAU,MAAM,WAAW,EAAQ,KAAK,gCAAgC,CAE7F,IAAM,GAAA,EAAA,EAAA,2BAA+C,QAAQ,IAAK,EAAM,mBAAoB,EAAQ,IAAI,CACxG,EAAA,mBAAmB,CAAE,QAAS,EAAQ,KAAM,qBAAoB,CAAC,CAEjE,IAAM,EAAkB,OAAO,KAAK,EAAQ,IAAI,CAAC,MAAM,CACjD,EAAqB,EAAgB,OAAS,EAAI,kBAAkB,EAAgB,KAAK,KAAK,GAAK,GACzG,MAAO,UAAU,EAAQ,KAAK,YAAY,EAAQ,UAAU,EAAmB"}
@@ -0,0 +1,46 @@
1
+ import { HarnessState as HarnessState$1 } from "../config/harnessState.cjs";
2
+ import { DoomHarnessContext } from "@agimon-ai/doompi-config";
3
+ import { AgentProfile } from "@agimon-ai/doompi-config/profiles";
4
+ import { MajorModesConfig } from "@agimon-ai/doompi-config/majorModes";
5
+
6
+ //#region src/services/matrixSwitcher.d.ts
7
+ /**
8
+ * Live matrix switching.
9
+ *
10
+ * Every axis writes through the harness state module and relies on Pi's reload
11
+ * re-executing extension modules, which drops their module-level caches and
12
+ * makes them re-read the environment. That is the same path /domains has always
13
+ * used; major mode and profile persona changes now share it.
14
+ *
15
+ * What reload cannot do is change the SET of loaded extensions: Pi freezes the
16
+ * CLI --extension list at construction (resource-loader.js:164) and re-resolves
17
+ * that same array on every reload. Callers report those parts as needing a
18
+ * relaunch instead of pretending they applied.
19
+ */
20
+ /** Domains: skills, plugin hooks, MCP config, and subagent directories. */
21
+ declare function applyDomains(domainNames: string[], state: DoomHarnessContext): Promise<HarnessState$1>;
22
+ /** Applies one major mode and the hook groups its effective layers contribute. */
23
+ declare function applyMajorMode(config: MajorModesConfig, majorMode: string, state: DoomHarnessContext): HarnessState$1;
24
+ /** Layers that contribute extensions or packages, which reload cannot swap. */
25
+ declare function extensionLayers(config: MajorModesConfig, names: string[]): string[];
26
+ /** Whether a mode change alters the extension set, and so needs a relaunch. */
27
+ declare function needsRelaunch(config: MajorModesConfig, before: string[], after: string[]): boolean;
28
+ /**
29
+ * Persona: rewrites the assembled prompt file that the persona extension reads.
30
+ *
31
+ * The extension re-reads the file on reload and appends its block to whatever
32
+ * system prompt it is given, so the repository's own AGENTS.md keeps applying
33
+ * underneath. Returns false when the directories hold no readable persona.
34
+ */
35
+ declare function applyPersona(personaDirectory: string, state: DoomHarnessContext, personaRoot?: string): Promise<boolean>;
36
+ /**
37
+ * Profile: one persona plus the environment defaults it declares.
38
+ *
39
+ * Lives beside the other switchers rather than in the /profile command,
40
+ * because the synced Pi path applies the same switch from its `--profile` flag
41
+ * before any command exists to run it.
42
+ */
43
+ declare function applyProfile(profile: AgentProfile, state: DoomHarnessContext): Promise<string>;
44
+ //#endregion
45
+ export { applyDomains, applyMajorMode, applyPersona, applyProfile, extensionLayers, needsRelaunch };
46
+ //# sourceMappingURL=matrixSwitcher.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matrixSwitcher.d.cts","names":[],"sources":["../../src/services/matrixSwitcher.ts"],"mappings":";;;;;;;;AA4BA;;;;;;;;;;;;iBAAsB,YAAA,CAAa,WAAA,YAAuB,KAAA,EAAO,kBAAA,GAAqB,OAAA,CAAQ,cAAA;;iBAyB9E,cAAA,CAAe,MAAA,EAAQ,gBAAA,EAAkB,SAAA,UAAmB,KAAA,EAAO,kBAAA,GAAqB,cAAA;AAAxG;AAAA,iBAMgB,eAAA,CAAgB,MAAA,EAAQ,gBAAA,EAAkB,KAAA;;iBAU1C,aAAA,CAAc,MAAA,EAAQ,gBAAA,EAAkB,MAAA,YAAkB,KAAA;;;;;;;;iBAWpD,YAAA,CACpB,gBAAA,UACA,KAAA,EAAO,kBAAA,EACP,WAAA,YACC,OAAA;;;;;AAzBH;;;iBA4CsB,YAAA,CAAa,OAAA,EAAS,YAAA,EAAc,KAAA,EAAO,kBAAA,GAAqB,OAAA"}
@@ -0,0 +1,46 @@
1
+ import { HarnessState as HarnessState$1 } from "../config/harnessState.mjs";
2
+ import { DoomHarnessContext } from "@agimon-ai/doompi-config";
3
+ import { AgentProfile } from "@agimon-ai/doompi-config/profiles";
4
+ import { MajorModesConfig } from "@agimon-ai/doompi-config/majorModes";
5
+
6
+ //#region src/services/matrixSwitcher.d.ts
7
+ /**
8
+ * Live matrix switching.
9
+ *
10
+ * Every axis writes through the harness state module and relies on Pi's reload
11
+ * re-executing extension modules, which drops their module-level caches and
12
+ * makes them re-read the environment. That is the same path /domains has always
13
+ * used; major mode and profile persona changes now share it.
14
+ *
15
+ * What reload cannot do is change the SET of loaded extensions: Pi freezes the
16
+ * CLI --extension list at construction (resource-loader.js:164) and re-resolves
17
+ * that same array on every reload. Callers report those parts as needing a
18
+ * relaunch instead of pretending they applied.
19
+ */
20
+ /** Domains: skills, plugin hooks, MCP config, and subagent directories. */
21
+ declare function applyDomains(domainNames: string[], state: DoomHarnessContext): Promise<HarnessState$1>;
22
+ /** Applies one major mode and the hook groups its effective layers contribute. */
23
+ declare function applyMajorMode(config: MajorModesConfig, majorMode: string, state: DoomHarnessContext): HarnessState$1;
24
+ /** Layers that contribute extensions or packages, which reload cannot swap. */
25
+ declare function extensionLayers(config: MajorModesConfig, names: string[]): string[];
26
+ /** Whether a mode change alters the extension set, and so needs a relaunch. */
27
+ declare function needsRelaunch(config: MajorModesConfig, before: string[], after: string[]): boolean;
28
+ /**
29
+ * Persona: rewrites the assembled prompt file that the persona extension reads.
30
+ *
31
+ * The extension re-reads the file on reload and appends its block to whatever
32
+ * system prompt it is given, so the repository's own AGENTS.md keeps applying
33
+ * underneath. Returns false when the directories hold no readable persona.
34
+ */
35
+ declare function applyPersona(personaDirectory: string, state: DoomHarnessContext, personaRoot?: string): Promise<boolean>;
36
+ /**
37
+ * Profile: one persona plus the environment defaults it declares.
38
+ *
39
+ * Lives beside the other switchers rather than in the /profile command,
40
+ * because the synced Pi path applies the same switch from its `--profile` flag
41
+ * before any command exists to run it.
42
+ */
43
+ declare function applyProfile(profile: AgentProfile, state: DoomHarnessContext): Promise<string>;
44
+ //#endregion
45
+ export { applyDomains, applyMajorMode, applyPersona, applyProfile, extensionLayers, needsRelaunch };
46
+ //# sourceMappingURL=matrixSwitcher.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matrixSwitcher.d.mts","names":[],"sources":["../../src/services/matrixSwitcher.ts"],"mappings":";;;;;;;;AA4BA;;;;;;;;;;;;iBAAsB,YAAA,CAAa,WAAA,YAAuB,KAAA,EAAO,kBAAA,GAAqB,OAAA,CAAQ,cAAA;;iBAyB9E,cAAA,CAAe,MAAA,EAAQ,gBAAA,EAAkB,SAAA,UAAmB,KAAA,EAAO,kBAAA,GAAqB,cAAA;AAAxG;AAAA,iBAMgB,eAAA,CAAgB,MAAA,EAAQ,gBAAA,EAAkB,KAAA;;iBAU1C,aAAA,CAAc,MAAA,EAAQ,gBAAA,EAAkB,MAAA,YAAkB,KAAA;;;;;;;;iBAWpD,YAAA,CACpB,gBAAA,UACA,KAAA,EAAO,kBAAA,EACP,WAAA,YACC,OAAA;;;;;AAzBH;;;iBA4CsB,YAAA,CAAa,OAAA,EAAS,YAAA,EAAc,KAAA,EAAO,kBAAA,GAAqB,OAAA"}
@@ -0,0 +1,2 @@
1
+ import{requireHarnessPaths as e,updateHarnessState as t}from"../config/harnessState.mjs";import{resolveMcpAllowlist as n}from"./mcpFilter.mjs";import{collectResources as r}from"./resourceCollector.mjs";import{filterHookDisabledLayers as i}from"./extensionAssembler.mjs";import a from"node:path";import o from"node:fs";import{resolvePluginEntries as s,resolveSharedSkills as c}from"@agimon-ai/doompi-config/domains";import{buildPersonaPrompt as l,replaceProfileEnvironment as u}from"@agimon-ai/doompi-config/profiles";import{layerHookGroups as d,resolveLayers as f}from"@agimon-ai/doompi-config/majorModes";async function p(i,o){let{root:l,temporaryDirectory:u}=e(o),d=await r(l,s(l,i,[...o.pluginDirectories]),{agents:o.agents,mcp:o.mcp,temporaryDirectory:u,workflowExtension:o.workflowExtension,sharedSkills:c(l,i),mcpAllowlist:n(l,i)}),f=t({domains:i,skillDirectories:d.skillDirectories,pluginHooks:d.pluginHooks,mcpConfigPath:d.mcpConfigPath});return process.env.PI_SUBAGENT_EXTRA_AGENT_DIRS=d.agentDirectories.join(a.delimiter),process.env.PI_SUBAGENT_EXTRA_SKILL_DIRS=d.skillDirectories.join(a.delimiter),f}function m(e,n,r){let a=i(f(e,n),r.hooks);return t({majorMode:n,layers:a,hookGroups:d(e,a)})}function h(e,t){return t.filter(t=>{let n=e.layers[t];return!!(n&&((n.extensions?.length??0)>0||(n.packages?.length??0)>0))}).sort()}function g(e,t,n){return h(e,t).join(`,`)!==h(e,n).join(`,`)}async function _(n,r,i){let{root:s,temporaryDirectory:c}=e(r),u=l(i??s,n);if(!u)return!1;let d=a.join(c,`persona.md`);return await o.promises.writeFile(d,`${u}\n`,{mode:384}),t({personaFile:d}),!0}async function v(e,n){if(!await _(e.persona,n,e.personaRoot))throw Error(`Profile ${e.name} has no readable persona files`);let r=u(process.env,n.profileEnvironment,e.env);t({profile:e.name,profileEnvironment:r});let i=Object.keys(e.env).sort(),a=i.length>0?`; env defaults ${i.join(`, `)}`:``;return`Loaded ${e.name}: persona ${e.persona}${a}.`}export{p as applyDomains,m as applyMajorMode,_ as applyPersona,v as applyProfile,h as extensionLayers,g as needsRelaunch};
2
+ //# sourceMappingURL=matrixSwitcher.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matrixSwitcher.mjs","names":[],"sources":["../../src/services/matrixSwitcher.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport type { DoomHarnessContext } from '@agimon-ai/doompi-config';\nimport { resolvePluginEntries, resolveSharedSkills } from '@agimon-ai/doompi-config/domains';\nimport { type AgentProfile, buildPersonaPrompt, replaceProfileEnvironment } from '@agimon-ai/doompi-config/profiles';\nimport { requireHarnessPaths, type HarnessState, updateHarnessState } from '../config/harnessState.ts';\nimport { type MajorModesConfig, layerHookGroups, resolveLayers } from '@agimon-ai/doompi-config/majorModes';\nimport { filterHookDisabledLayers } from './extensionAssembler.ts';\nimport { collectResources } from './resourceCollector.ts';\nimport { resolveMcpAllowlist } from './mcpFilter.ts';\n\nconst PERSONA_FILE = 'persona.md';\n\n/**\n * Live matrix switching.\n *\n * Every axis writes through the harness state module and relies on Pi's reload\n * re-executing extension modules, which drops their module-level caches and\n * makes them re-read the environment. That is the same path /domains has always\n * used; major mode and profile persona changes now share it.\n *\n * What reload cannot do is change the SET of loaded extensions: Pi freezes the\n * CLI --extension list at construction (resource-loader.js:164) and re-resolves\n * that same array on every reload. Callers report those parts as needing a\n * relaunch instead of pretending they applied.\n */\n\n/** Domains: skills, plugin hooks, MCP config, and subagent directories. */\nexport async function applyDomains(domainNames: string[], state: DoomHarnessContext): Promise<HarnessState> {\n const { root, temporaryDirectory } = requireHarnessPaths(state);\n\n const pluginEntries = resolvePluginEntries(root, domainNames, [...state.pluginDirectories]);\n const resources = await collectResources(root, pluginEntries, {\n agents: state.agents,\n mcp: state.mcp,\n temporaryDirectory,\n workflowExtension: state.workflowExtension,\n sharedSkills: resolveSharedSkills(root, domainNames),\n mcpAllowlist: resolveMcpAllowlist(root, domainNames),\n });\n\n const updated = updateHarnessState({\n domains: domainNames,\n skillDirectories: resources.skillDirectories,\n pluginHooks: resources.pluginHooks,\n mcpConfigPath: resources.mcpConfigPath,\n });\n process.env.PI_SUBAGENT_EXTRA_AGENT_DIRS = resources.agentDirectories.join(path.delimiter);\n process.env.PI_SUBAGENT_EXTRA_SKILL_DIRS = resources.skillDirectories.join(path.delimiter);\n return updated;\n}\n\n/** Applies one major mode and the hook groups its effective layers contribute. */\nexport function applyMajorMode(config: MajorModesConfig, majorMode: string, state: DoomHarnessContext): HarnessState {\n const selected = filterHookDisabledLayers(resolveLayers(config, majorMode), state.hooks);\n return updateHarnessState({ majorMode, layers: selected, hookGroups: layerHookGroups(config, selected) });\n}\n\n/** Layers that contribute extensions or packages, which reload cannot swap. */\nexport function extensionLayers(config: MajorModesConfig, names: string[]): string[] {\n return names\n .filter((name) => {\n const layer = config.layers[name];\n return Boolean(layer && ((layer.extensions?.length ?? 0) > 0 || (layer.packages?.length ?? 0) > 0));\n })\n .sort();\n}\n\n/** Whether a mode change alters the extension set, and so needs a relaunch. */\nexport function needsRelaunch(config: MajorModesConfig, before: string[], after: string[]): boolean {\n return extensionLayers(config, before).join(',') !== extensionLayers(config, after).join(',');\n}\n\n/**\n * Persona: rewrites the assembled prompt file that the persona extension reads.\n *\n * The extension re-reads the file on reload and appends its block to whatever\n * system prompt it is given, so the repository's own AGENTS.md keeps applying\n * underneath. Returns false when the directories hold no readable persona.\n */\nexport async function applyPersona(\n personaDirectory: string,\n state: DoomHarnessContext,\n personaRoot?: string,\n): Promise<boolean> {\n const { root, temporaryDirectory } = requireHarnessPaths(state);\n\n const prompt = buildPersonaPrompt(personaRoot ?? root, personaDirectory);\n if (!prompt) return false;\n\n const personaPath = path.join(temporaryDirectory, PERSONA_FILE);\n await fs.promises.writeFile(personaPath, `${prompt}\\n`, { mode: 0o600 });\n updateHarnessState({ personaFile: personaPath });\n return true;\n}\n\n/**\n * Profile: one persona plus the environment defaults it declares.\n *\n * Lives beside the other switchers rather than in the /profile command,\n * because the synced Pi path applies the same switch from its `--profile` flag\n * before any command exists to run it.\n */\nexport async function applyProfile(profile: AgentProfile, state: DoomHarnessContext): Promise<string> {\n const appliedPersona = await applyPersona(profile.persona, state, profile.personaRoot);\n if (!appliedPersona) throw new Error(`Profile ${profile.name} has no readable persona files`);\n\n const profileEnvironment = replaceProfileEnvironment(process.env, state.profileEnvironment, profile.env);\n updateHarnessState({ profile: profile.name, profileEnvironment });\n\n const environmentKeys = Object.keys(profile.env).sort();\n const environmentSummary = environmentKeys.length > 0 ? `; env defaults ${environmentKeys.join(', ')}` : '';\n return `Loaded ${profile.name}: persona ${profile.persona}${environmentSummary}.`;\n}\n"],"mappings":"8lBA4BA,eAAsB,EAAa,EAAuB,EAAkD,CAC1G,GAAM,CAAE,OAAM,sBAAuB,EAAoB,EAAM,CAGzD,EAAY,MAAM,EAAiB,EADnB,EAAqB,EAAM,EAAa,CAAC,GAAG,EAAM,kBAAkB,CAC9B,CAAE,CAC5D,OAAQ,EAAM,OACd,IAAK,EAAM,IACX,qBACA,kBAAmB,EAAM,kBACzB,aAAc,EAAoB,EAAM,EAAY,CACpD,aAAc,EAAoB,EAAM,EAAY,CACrD,CAAC,CAEI,EAAU,EAAmB,CACjC,QAAS,EACT,iBAAkB,EAAU,iBAC5B,YAAa,EAAU,YACvB,cAAe,EAAU,cAC1B,CAAC,CAGF,MAFA,SAAQ,IAAI,6BAA+B,EAAU,iBAAiB,KAAK,EAAK,UAAU,CAC1F,QAAQ,IAAI,6BAA+B,EAAU,iBAAiB,KAAK,EAAK,UAAU,CACnF,EAIT,SAAgB,EAAe,EAA0B,EAAmB,EAAyC,CACnH,IAAM,EAAW,EAAyB,EAAc,EAAQ,EAAU,CAAE,EAAM,MAAM,CACxF,OAAO,EAAmB,CAAE,YAAW,OAAQ,EAAU,WAAY,EAAgB,EAAQ,EAAS,CAAE,CAAC,CAI3G,SAAgB,EAAgB,EAA0B,EAA2B,CACnF,OAAO,EACJ,OAAQ,GAAS,CAChB,IAAM,EAAQ,EAAO,OAAO,GAC5B,MAAO,GAAQ,KAAW,EAAM,YAAY,QAAU,GAAK,IAAM,EAAM,UAAU,QAAU,GAAK,KAChG,CACD,MAAM,CAIX,SAAgB,EAAc,EAA0B,EAAkB,EAA0B,CAClG,OAAO,EAAgB,EAAQ,EAAO,CAAC,KAAK,IAAI,GAAK,EAAgB,EAAQ,EAAM,CAAC,KAAK,IAAI,CAU/F,eAAsB,EACpB,EACA,EACA,EACkB,CAClB,GAAM,CAAE,OAAM,sBAAuB,EAAoB,EAAM,CAEzD,EAAS,EAAmB,GAAe,EAAM,EAAiB,CACxE,GAAI,CAAC,EAAQ,MAAO,GAEpB,IAAM,EAAc,EAAK,KAAK,EAAoB,aAAa,CAG/D,OAFA,MAAM,EAAG,SAAS,UAAU,EAAa,GAAG,EAAO,IAAK,CAAE,KAAM,IAAO,CAAC,CACxE,EAAmB,CAAE,YAAa,EAAa,CAAC,CACzC,GAUT,eAAsB,EAAa,EAAuB,EAA4C,CAEpG,GAAI,CAAC,MADwB,EAAa,EAAQ,QAAS,EAAO,EAAQ,YAAY,CACjE,MAAU,MAAM,WAAW,EAAQ,KAAK,gCAAgC,CAE7F,IAAM,EAAqB,EAA0B,QAAQ,IAAK,EAAM,mBAAoB,EAAQ,IAAI,CACxG,EAAmB,CAAE,QAAS,EAAQ,KAAM,qBAAoB,CAAC,CAEjE,IAAM,EAAkB,OAAO,KAAK,EAAQ,IAAI,CAAC,MAAM,CACjD,EAAqB,EAAgB,OAAS,EAAI,kBAAkB,EAAgB,KAAK,KAAK,GAAK,GACzG,MAAO,UAAU,EAAQ,KAAK,YAAY,EAAQ,UAAU,EAAmB"}
@@ -0,0 +1,3 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../_virtual/_rolldown/runtime.cjs`);let t=require(`node:path`);t=e.__toESM(t,1);let n=require(`node:fs`);n=e.__toESM(n,1);let r=require(`@agimon-ai/doompi-config/domains`),i=require(`yaml`);const a=`agiflow-proxy`;function o(e,t){let n=(0,r.loadDomains)(e),i=(0,r.expandDomainNames)(n,t);if(i.length===0)return;let a=new Set,o=new Set;for(let e of i){let t=n.domains[e]?.mcp;if(!t)return;for(let e of t.servers??[])a.add(e);for(let e of t.proxy??[])o.add(e)}return{servers:[...a],proxy:[...o]}}function s(e,t){if(!t||t.length===0)return e;let n=e.mcpServers??{},r={};for(let[e,i]of Object.entries(n))t.includes(e)&&(r[e]=i);return{...e,mcpServers:r}}function c(e,t){if(!t||t.length===0)return e;let n=(0,i.parse)(e)??{},r=n.mcpServers??{},a={},o=[];for(let[e,n]of Object.entries(r))t.includes(e)?a[e]=n:o.push(e);return`${[`# Generated by doompi for this run. Do not edit.`,`# Upstreams kept: ${Object.keys(a).join(`, `)||`(none)`}`,`# Upstreams removed by the domain allowlist: ${o.join(`, `)||`(none)`}`,``].join(`
2
+ `)}${(0,i.stringify)({...n,mcpServers:a})}`}async function l(e,r,i){await n.default.promises.mkdir(i,{recursive:!0});let o=JSON.parse(n.default.readFileSync(e,`utf8`)),s=o.mcpServers??{},c=s[a],l=t.default.join(r,`mcp-config.yaml`);if(c&&n.default.existsSync(l)){let e=[...c.args??[]],r=e.indexOf(`--config`);if(r!==-1){let o=t.default.join(i,`mcp-config.yaml`);await n.default.promises.copyFile(l,o),e[r+1]=o,s[a]={...c,args:e}}}let u=t.default.join(i,`mcp.json`);return await n.default.promises.writeFile(u,`${JSON.stringify({...o,mcpServers:s},null,2)}\n`,{mode:384}),u}async function u(e,r,i,o){if(!r)return e;let l=s(e,r.servers),u=l.mcpServers??{},d=u[a];if(!d||!r.proxy||r.proxy.length===0)return l;let f=[...d.args??[]],p=f.indexOf(`--config`);if(p===-1||!f[p+1])return l;let m=t.default.resolve(i,f[p+1]);if(!n.default.existsSync(m))return l;let h=t.default.join(o,`mcp-config.yaml`);return await n.default.promises.writeFile(h,c(n.default.readFileSync(m,`utf8`),r.proxy),{mode:384}),f[p+1]=h,{...l,mcpServers:{...u,[a]:{...d,args:f}}}}exports.PROXY_SERVER_NAME=a,exports.applyMcpAllowlist=u,exports.filterMcpServers=s,exports.filterProxyConfig=c,exports.persistMcpConfig=l,exports.resolveMcpAllowlist=o;
3
+ //# sourceMappingURL=mcpFilter.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpFilter.cjs","names":["fs","path"],"sources":["../../src/services/mcpFilter.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { type DomainMcpAllowlist, expandDomainNames, loadDomains } from '@agimon-ai/doompi-config/domains';\n\n/** Server name in .mcp.json whose upstreams are declared in mcp-config.yaml. */\nexport const PROXY_SERVER_NAME = 'agiflow-proxy';\n\ntype JsonObject = Record<string, unknown>;\n\n/**\n * Unions the mcp allowlists of the selected domains.\n *\n * Returns undefined when any selected domain omits `mcp`, which means \"give me\n * everything\". Filtering only kicks in once every selected domain has opted in,\n * so a domain that has not been migrated yet cannot silently lose its tools.\n */\nexport function resolveMcpAllowlist(repoRoot: string, domainNames: string[]): DomainMcpAllowlist | undefined {\n const manifest = loadDomains(repoRoot);\n const expanded = expandDomainNames(manifest, domainNames);\n if (expanded.length === 0) return undefined;\n\n const servers = new Set<string>();\n const proxy = new Set<string>();\n for (const name of expanded) {\n const allowlist = manifest.domains[name]?.mcp;\n if (!allowlist) return undefined;\n for (const server of allowlist.servers ?? []) servers.add(server);\n for (const upstream of allowlist.proxy ?? []) proxy.add(upstream);\n }\n return { servers: [...servers], proxy: [...proxy] };\n}\n\n/** Drops servers that are not on the allowlist. An empty list means keep all. */\nexport function filterMcpServers(config: JsonObject, allowed?: string[]): JsonObject {\n if (!allowed || allowed.length === 0) return config;\n const servers = (config.mcpServers ?? {}) as Record<string, unknown>;\n const kept: Record<string, unknown> = {};\n for (const [name, definition] of Object.entries(servers)) {\n if (allowed.includes(name)) kept[name] = definition;\n }\n return { ...config, mcpServers: kept };\n}\n\n/**\n * Rewrites the proxy's upstream list, keeping only allowed servers.\n *\n * Entries are removed rather than marked disabled so a filtered upstream cannot\n * be reached even if the proxy ignores the disabled flag. Comments in the\n * source file are not preserved; the result is a per-run temporary file.\n */\nexport function filterProxyConfig(yamlText: string, allowed?: string[]): string {\n if (!allowed || allowed.length === 0) return yamlText;\n const config = (parseYaml(yamlText) ?? {}) as JsonObject;\n const servers = (config.mcpServers ?? {}) as Record<string, unknown>;\n const kept: Record<string, unknown> = {};\n const dropped: string[] = [];\n for (const [name, definition] of Object.entries(servers)) {\n if (allowed.includes(name)) kept[name] = definition;\n else dropped.push(name);\n }\n const header = [\n '# Generated by doompi for this run. Do not edit.',\n `# Upstreams kept: ${Object.keys(kept).join(', ') || '(none)'}`,\n `# Upstreams removed by the domain allowlist: ${dropped.join(', ') || '(none)'}`,\n '',\n ].join('\\n');\n return `${header}${stringifyYaml({ ...config, mcpServers: kept })}`;\n}\n\n/**\n * Copies a generated MCP config out of the run directory so another frontend\n * can use it, keeping the proxy's --config pointing at the copy.\n *\n * The run directory is deleted when the harness exits, so emitting for\n * claude.sh or codex.sh has to relocate both files together.\n */\nexport async function persistMcpConfig(\n sourceConfigPath: string,\n temporaryDirectory: string,\n targetDirectory: string,\n): Promise<string> {\n await fs.promises.mkdir(targetDirectory, { recursive: true });\n const config = JSON.parse(fs.readFileSync(sourceConfigPath, 'utf8')) as JsonObject;\n const servers = (config.mcpServers ?? {}) as Record<string, JsonObject>;\n const proxy = servers[PROXY_SERVER_NAME];\n const generatedProxyConfig = path.join(temporaryDirectory, 'mcp-config.yaml');\n\n if (proxy && fs.existsSync(generatedProxyConfig)) {\n const args = [...((proxy.args ?? []) as string[])];\n const configIndex = args.indexOf('--config');\n if (configIndex !== -1) {\n const targetProxyConfig = path.join(targetDirectory, 'mcp-config.yaml');\n await fs.promises.copyFile(generatedProxyConfig, targetProxyConfig);\n args[configIndex + 1] = targetProxyConfig;\n servers[PROXY_SERVER_NAME] = { ...proxy, args };\n }\n }\n\n const targetPath = path.join(targetDirectory, 'mcp.json');\n await fs.promises.writeFile(targetPath, `${JSON.stringify({ ...config, mcpServers: servers }, null, 2)}\\n`, {\n mode: 0o600,\n });\n return targetPath;\n}\n\n/**\n * Applies the allowlist to a merged MCP config, writing a filtered proxy config\n * into the run directory and repointing the proxy at it when needed.\n */\nexport async function applyMcpAllowlist(\n config: JsonObject,\n allowlist: DomainMcpAllowlist | undefined,\n repoRoot: string,\n temporaryDirectory: string,\n): Promise<JsonObject> {\n if (!allowlist) return config;\n const filtered = filterMcpServers(config, allowlist.servers);\n const servers = (filtered.mcpServers ?? {}) as Record<string, JsonObject>;\n const proxy = servers[PROXY_SERVER_NAME];\n if (!proxy || !allowlist.proxy || allowlist.proxy.length === 0) return filtered;\n\n const args = [...((proxy.args ?? []) as string[])];\n const configIndex = args.indexOf('--config');\n if (configIndex === -1 || !args[configIndex + 1]) return filtered;\n\n const sourcePath = path.resolve(repoRoot, args[configIndex + 1]);\n if (!fs.existsSync(sourcePath)) return filtered;\n const targetPath = path.join(temporaryDirectory, 'mcp-config.yaml');\n await fs.promises.writeFile(targetPath, filterProxyConfig(fs.readFileSync(sourcePath, 'utf8'), allowlist.proxy), {\n mode: 0o600,\n });\n args[configIndex + 1] = targetPath;\n return { ...filtered, mcpServers: { ...servers, [PROXY_SERVER_NAME]: { ...proxy, args } } };\n}\n"],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { DomainMcpAllowlist } from "@agimon-ai/doompi-config/domains";
2
+
3
+ //#region src/services/mcpFilter.d.ts
4
+ /** Server name in .mcp.json whose upstreams are declared in mcp-config.yaml. */
5
+ declare const PROXY_SERVER_NAME = "agiflow-proxy";
6
+ type JsonObject = Record<string, unknown>;
7
+ /**
8
+ * Unions the mcp allowlists of the selected domains.
9
+ *
10
+ * Returns undefined when any selected domain omits `mcp`, which means "give me
11
+ * everything". Filtering only kicks in once every selected domain has opted in,
12
+ * so a domain that has not been migrated yet cannot silently lose its tools.
13
+ */
14
+ declare function resolveMcpAllowlist(repoRoot: string, domainNames: string[]): DomainMcpAllowlist | undefined;
15
+ /** Drops servers that are not on the allowlist. An empty list means keep all. */
16
+ declare function filterMcpServers(config: JsonObject, allowed?: string[]): JsonObject;
17
+ /**
18
+ * Rewrites the proxy's upstream list, keeping only allowed servers.
19
+ *
20
+ * Entries are removed rather than marked disabled so a filtered upstream cannot
21
+ * be reached even if the proxy ignores the disabled flag. Comments in the
22
+ * source file are not preserved; the result is a per-run temporary file.
23
+ */
24
+ declare function filterProxyConfig(yamlText: string, allowed?: string[]): string;
25
+ /**
26
+ * Copies a generated MCP config out of the run directory so another frontend
27
+ * can use it, keeping the proxy's --config pointing at the copy.
28
+ *
29
+ * The run directory is deleted when the harness exits, so emitting for
30
+ * claude.sh or codex.sh has to relocate both files together.
31
+ */
32
+ declare function persistMcpConfig(sourceConfigPath: string, temporaryDirectory: string, targetDirectory: string): Promise<string>;
33
+ /**
34
+ * Applies the allowlist to a merged MCP config, writing a filtered proxy config
35
+ * into the run directory and repointing the proxy at it when needed.
36
+ */
37
+ declare function applyMcpAllowlist(config: JsonObject, allowlist: DomainMcpAllowlist | undefined, repoRoot: string, temporaryDirectory: string): Promise<JsonObject>;
38
+ //#endregion
39
+ export { PROXY_SERVER_NAME, applyMcpAllowlist, filterMcpServers, filterProxyConfig, persistMcpConfig, resolveMcpAllowlist };
40
+ //# sourceMappingURL=mcpFilter.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpFilter.d.cts","names":[],"sources":["../../src/services/mcpFilter.ts"],"mappings":";;;;cAMa,iBAAA;AAAA,KAER,UAAA,GAAa,MAAA;;;;;AAF+B;;;iBAWjC,mBAAA,CAAoB,QAAA,UAAkB,WAAA,aAAwB,kBAAA;;iBAiB9D,gBAAA,CAAiB,MAAA,EAAQ,UAAA,EAAY,OAAA,cAAqB,UAAA;;;;;;;;iBAiB1D,iBAAA,CAAkB,QAAA,UAAkB,OAAA;AAjBpD;;;;;;;AAAA,iBA2CsB,gBAAA,CACpB,gBAAA,UACA,kBAAA,UACA,eAAA,WACC,OAAA;;;AA9BH;;iBA2DsB,iBAAA,CACpB,MAAA,EAAQ,UAAA,EACR,SAAA,EAAW,kBAAA,cACX,QAAA,UACA,kBAAA,WACC,OAAA,CAAQ,UAAA"}