@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,16 @@
1
+ import { CompatibilityContext } from "../compatibilityContext.cjs";
2
+ import { adaptAntigravityMcpDefinition, antigravityCompatibilityArgs, launchAntigravity } from "./antigravity.cjs";
3
+ import { codexCompatibilityArgs, codexEnvironment, codexPluginDirectories, launchCodex, supportsCodexManagedProfile } from "./codex.cjs";
4
+ import { acquireDirectoryLock, forwardSignals, isFileSystemError, lockOwnerIsRunning, pathInside, runCaptured, runChecked, runInteractive, signalExitCode, waitForExit } from "./process.cjs";
5
+ import { mcpProxyArguments } from "./shared.cjs";
6
+
7
+ //#region src/services/compatibility/index.d.ts
8
+ /**
9
+ * Claude needs no state sync: everything it reads is passed as an argument, so
10
+ * a run leaves nothing behind to revert.
11
+ */
12
+ declare function claudeCompatibilityArgs(context: CompatibilityContext): string[];
13
+ declare function launchCompatibility(context: CompatibilityContext): Promise<number>;
14
+ //#endregion
15
+ export { acquireDirectoryLock, adaptAntigravityMcpDefinition, antigravityCompatibilityArgs, claudeCompatibilityArgs, codexCompatibilityArgs, codexEnvironment, codexPluginDirectories, forwardSignals, isFileSystemError, launchAntigravity, launchCodex, launchCompatibility, lockOwnerIsRunning, mcpProxyArguments, pathInside, runCaptured, runChecked, runInteractive, signalExitCode, supportsCodexManagedProfile, waitForExit };
16
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/services/compatibility/index.ts"],"mappings":";;;;;;;;;AAuCA;;iBAAgB,uBAAA,CAAwB,OAAA,EAAS,oBAAA;AAAA,iBAS3B,mBAAA,CAAoB,OAAA,EAAS,oBAAA,GAAuB,OAAA"}
@@ -0,0 +1,16 @@
1
+ import { CompatibilityContext } from "../compatibilityContext.mjs";
2
+ import { adaptAntigravityMcpDefinition, antigravityCompatibilityArgs, launchAntigravity } from "./antigravity.mjs";
3
+ import { codexCompatibilityArgs, codexEnvironment, codexPluginDirectories, launchCodex, supportsCodexManagedProfile } from "./codex.mjs";
4
+ import { acquireDirectoryLock, forwardSignals, isFileSystemError, lockOwnerIsRunning, pathInside, runCaptured, runChecked, runInteractive, signalExitCode, waitForExit } from "./process.mjs";
5
+ import { mcpProxyArguments } from "./shared.mjs";
6
+
7
+ //#region src/services/compatibility/index.d.ts
8
+ /**
9
+ * Claude needs no state sync: everything it reads is passed as an argument, so
10
+ * a run leaves nothing behind to revert.
11
+ */
12
+ declare function claudeCompatibilityArgs(context: CompatibilityContext): string[];
13
+ declare function launchCompatibility(context: CompatibilityContext): Promise<number>;
14
+ //#endregion
15
+ export { acquireDirectoryLock, adaptAntigravityMcpDefinition, antigravityCompatibilityArgs, claudeCompatibilityArgs, codexCompatibilityArgs, codexEnvironment, codexPluginDirectories, forwardSignals, isFileSystemError, launchAntigravity, launchCodex, launchCompatibility, lockOwnerIsRunning, mcpProxyArguments, pathInside, runCaptured, runChecked, runInteractive, signalExitCode, supportsCodexManagedProfile, waitForExit };
16
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/services/compatibility/index.ts"],"mappings":";;;;;;;;;AAuCA;;iBAAgB,uBAAA,CAAwB,OAAA,EAAS,oBAAA;AAAA,iBAS3B,mBAAA,CAAoB,OAAA,EAAS,oBAAA,GAAuB,OAAA"}
@@ -0,0 +1,2 @@
1
+ import{acquireDirectoryLock as e,forwardSignals as t,isFileSystemError as n,lockOwnerIsRunning as r,pathInside as i,runCaptured as a,runChecked as o,runInteractive as s,signalExitCode as c,waitForExit as l}from"./process.mjs";import{SKIP_PERMISSIONS_OPTION as u,additionalDirectoryArgs as d,mcpProxyArguments as f}from"./shared.mjs";import{adaptAntigravityMcpDefinition as p,antigravityCompatibilityArgs as m,launchAntigravity as h}from"./antigravity.mjs";import{codexCompatibilityArgs as g,codexEnvironment as _,codexPluginDirectories as v,launchCodex as y,supportsCodexManagedProfile as b}from"./codex.mjs";const x=`claude`;function S(e){let t=[u];for(let n of e.plugins)t.push(`--plugin-dir`,n.directory);return e.mcpAllowlist&&t.push(`--mcp-config`,e.mcpConfigPath,`--strict-mcp-config`),e.personaFile&&t.push(`--append-system-prompt-file`,e.personaFile),t.push(...d(e)),[...t,...e.options.providerArgs]}async function C(e){let t=e.options.provider;return t===x?s(x,S(e),e.options.currentDirectory,e.environment):t===`codex`?y(e):h(e)}export{e as acquireDirectoryLock,p as adaptAntigravityMcpDefinition,m as antigravityCompatibilityArgs,S as claudeCompatibilityArgs,g as codexCompatibilityArgs,_ as codexEnvironment,v as codexPluginDirectories,t as forwardSignals,n as isFileSystemError,h as launchAntigravity,y as launchCodex,C as launchCompatibility,r as lockOwnerIsRunning,f as mcpProxyArguments,i as pathInside,a as runCaptured,o as runChecked,s as runInteractive,c as signalExitCode,b as supportsCodexManagedProfile,l as waitForExit};
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/services/compatibility/index.ts"],"sourcesContent":["import type { CompatibilityProvider } from '../../interfaces/index.ts';\nimport type { CompatibilityContext } from '../compatibilityContext.ts';\nimport { launchAntigravity } from './antigravity.ts';\nimport { CODEX_PROVIDER, launchCodex } from './codex.ts';\nimport { runInteractive } from './process.ts';\nimport { SKIP_PERMISSIONS_OPTION, additionalDirectoryArgs } from './shared.ts';\n\nexport { adaptAntigravityMcpDefinition, antigravityCompatibilityArgs, launchAntigravity } from './antigravity.ts';\nexport {\n codexCompatibilityArgs,\n codexEnvironment,\n codexPluginDirectories,\n launchCodex,\n supportsCodexManagedProfile,\n} from './codex.ts';\nexport {\n acquireDirectoryLock,\n forwardSignals,\n isFileSystemError,\n lockOwnerIsRunning,\n pathInside,\n runCaptured,\n runChecked,\n runInteractive,\n signalExitCode,\n waitForExit,\n} from './process.ts';\nexport { mcpProxyArguments } from './shared.ts';\n\nconst CLAUDE_PROVIDER = 'claude';\nconst PLUGIN_DIRECTORY_OPTION = '--plugin-dir';\nconst MCP_CONFIG_OPTION = '--mcp-config';\nconst STRICT_MCP_CONFIG_OPTION = '--strict-mcp-config';\nconst APPEND_SYSTEM_PROMPT_FILE_OPTION = '--append-system-prompt-file';\n\n/**\n * Claude needs no state sync: everything it reads is passed as an argument, so\n * a run leaves nothing behind to revert.\n */\nexport function claudeCompatibilityArgs(context: CompatibilityContext): string[] {\n const args = [SKIP_PERMISSIONS_OPTION];\n for (const plugin of context.plugins) args.push(PLUGIN_DIRECTORY_OPTION, plugin.directory);\n if (context.mcpAllowlist) args.push(MCP_CONFIG_OPTION, context.mcpConfigPath, STRICT_MCP_CONFIG_OPTION);\n if (context.personaFile) args.push(APPEND_SYSTEM_PROMPT_FILE_OPTION, context.personaFile);\n args.push(...additionalDirectoryArgs(context));\n return [...args, ...context.options.providerArgs];\n}\n\nexport async function launchCompatibility(context: CompatibilityContext): Promise<number> {\n const provider: CompatibilityProvider = context.options.provider;\n if (provider === CLAUDE_PROVIDER) {\n return runInteractive(\n CLAUDE_PROVIDER,\n claudeCompatibilityArgs(context),\n context.options.currentDirectory,\n context.environment,\n );\n }\n if (provider === CODEX_PROVIDER) return launchCodex(context);\n return launchAntigravity(context);\n}\n"],"mappings":"imBA6BA,MAAM,EAAkB,SAUxB,SAAgB,EAAwB,EAAyC,CAC/E,IAAM,EAAO,CAAC,EAAwB,CACtC,IAAK,IAAM,KAAU,EAAQ,QAAS,EAAK,KAAK,eAAyB,EAAO,UAAU,CAI1F,OAHI,EAAQ,cAAc,EAAK,KAAK,eAAmB,EAAQ,cAAe,sBAAyB,CACnG,EAAQ,aAAa,EAAK,KAAK,8BAAkC,EAAQ,YAAY,CACzF,EAAK,KAAK,GAAG,EAAwB,EAAQ,CAAC,CACvC,CAAC,GAAG,EAAM,GAAG,EAAQ,QAAQ,aAAa,CAGnD,eAAsB,EAAoB,EAAgD,CACxF,IAAM,EAAkC,EAAQ,QAAQ,SAUxD,OATI,IAAa,EACR,EACL,EACA,EAAwB,EAAQ,CAChC,EAAQ,QAAQ,iBAChB,EAAQ,YACT,CAEC,IAAA,QAAoC,EAAY,EAAQ,CACrD,EAAkB,EAAQ"}
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../../_virtual/_rolldown/runtime.cjs`),t=require(`../../utils/json.cjs`);require(`../../utils/index.cjs`);let n=require(`node:path`);n=e.__toESM(n,1);let r=require(`node:fs`);r=e.__toESM(r,1);let i=require(`node:os`),a=require(`node:child_process`),o=require(`node:timers/promises`),s=require(`cross-spawn`);s=e.__toESM(s,1);const c=[`SIGINT`,`SIGTERM`,`SIGHUP`,`SIGQUIT`],l=`owner.json`;function u(e,t,n,r){let i=(0,a.spawnSync)(e,t,{cwd:n,encoding:`utf8`,env:r});if(i.error)throw i.error;if(i.stderr&&process.stderr.write(i.stderr),i.status!==0)throw Error(`${e} exited with status ${i.status??1}`);return i.stdout.trim()}function d(e,t,n,r){let i=(0,a.spawnSync)(e,t,{cwd:n,env:r,stdio:`inherit`});if(i.error)throw i.error;if(i.status!==0)throw Error(`${e} exited with status ${i.status??1}`)}function f(e){if(!e)return 1;let t=i.constants.signals[e];return t?128+t:1}function p(e){let t=t=>{e.exitCode===null&&e.signalCode===null&&e.kill(t)};for(let e of c)process.on(e,t);return()=>{for(let e of c)process.removeListener(e,t)}}function m(e){return new Promise((t,n)=>{e.once(`error`,n),e.once(`exit`,(e,n)=>t(e??f(n)))})}async function h(e,t,n,r){let i=(0,s.default)(e,t,{cwd:n,env:r,stdio:`inherit`}),a=p(i);try{return await m(i)}finally{a()}}function g(e){return e instanceof Error&&typeof e.code==`string`}function _(e){let r=t.readJson(n.default.join(e,l));if(typeof r.pid!=`number`||!Number.isSafeInteger(r.pid)||r.pid<=0)return!1;try{return process.kill(r.pid,0),!0}catch(e){return!g(e)||e.code!==`ESRCH`}}async function v(e){r.default.mkdirSync(n.default.dirname(e),{recursive:!0});let i=Date.now();for(;;)try{await r.default.promises.mkdir(e);try{t.writeJson(n.default.join(e,l),{pid:process.pid})}catch(t){throw await r.default.promises.rm(e,{recursive:!0,force:!0}),t}return()=>r.default.promises.rm(e,{recursive:!0,force:!0})}catch(t){if(!g(t)||t.code!==`EEXIST`)throw t;try{let t=await r.default.promises.stat(e);if(Date.now()-t.mtimeMs>=1e4&&!_(e)){await r.default.promises.rm(e,{recursive:!0,force:!0});continue}}catch(e){if(g(e)&&e.code===`ENOENT`)continue;throw e}if(Date.now()-i>=3e4)throw Error(`Timed out waiting for Antigravity state lock: ${e}`);await(0,o.setTimeout)(25)}}function y(e,t){let r=n.default.relative(e,t);return r===``||!r.startsWith(`..${n.default.sep}`)&&r!==`..`&&!n.default.isAbsolute(r)}exports.acquireDirectoryLock=v,exports.forwardSignals=p,exports.isFileSystemError=g,exports.lockOwnerIsRunning=_,exports.pathInside=y,exports.runCaptured=u,exports.runChecked=d,exports.runInteractive=h,exports.signalExitCode=f,exports.waitForExit=m;
2
+ //# sourceMappingURL=process.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.cjs","names":["osConstants","readJson","path","fs"],"sources":["../../../src/services/compatibility/process.ts"],"sourcesContent":["import { type ChildProcess, spawnSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport { constants as osConstants } from 'node:os';\nimport path from 'node:path';\nimport { setTimeout as delay } from 'node:timers/promises';\nimport spawn from 'cross-spawn';\nimport { readJson, writeJson } from '../../utils/index.ts';\n\n/**\n * Child process and cross-repository locking primitives.\n *\n * Shared by every compatibility provider and by the Pi launch command, so that\n * signal forwarding behaves the same however the harness starts a child.\n */\n\nconst FORWARDED_SIGNALS: NodeJS.Signals[] = ['SIGINT', 'SIGTERM', 'SIGHUP', 'SIGQUIT'];\nconst SIGNAL_EXIT_CODE_OFFSET = 128;\nconst UNKNOWN_SIGNAL_EXIT_CODE = 1;\nconst LOCK_RETRY_MS = 25;\nconst LOCK_STALE_MS = 10_000;\nconst LOCK_TIMEOUT_MS = 30_000;\nconst FILE_EXISTS_ERROR = 'EEXIST';\nconst FILE_NOT_FOUND_ERROR = 'ENOENT';\nconst PROCESS_NOT_FOUND_ERROR = 'ESRCH';\nconst LOCK_OWNER_FILENAME = 'owner.json';\n\n/** Runs a command and returns its trimmed stdout, throwing on a non-zero exit. */\nexport function runCaptured(command: string, args: string[], cwd: string, environment: NodeJS.ProcessEnv): string {\n const result = spawnSync(command, args, { cwd, encoding: 'utf8', env: environment });\n if (result.error) throw result.error;\n if (result.stderr) process.stderr.write(result.stderr);\n if (result.status !== 0) {\n throw new Error(`${command} exited with status ${result.status ?? 1}`);\n }\n return result.stdout.trim();\n}\n\n/** Runs a command with inherited stdio, throwing on a non-zero exit. */\nexport function runChecked(command: string, args: string[], cwd: string, environment: NodeJS.ProcessEnv): void {\n const result = spawnSync(command, args, { cwd, env: environment, stdio: 'inherit' });\n if (result.error) throw result.error;\n if (result.status !== 0) throw new Error(`${command} exited with status ${result.status ?? 1}`);\n}\n\n/** The conventional 128+n exit code for a child killed by a signal. */\nexport function signalExitCode(signal: NodeJS.Signals | null): number {\n if (!signal) return UNKNOWN_SIGNAL_EXIT_CODE;\n const signalNumber = osConstants.signals[signal];\n return signalNumber ? SIGNAL_EXIT_CODE_OFFSET + signalNumber : UNKNOWN_SIGNAL_EXIT_CODE;\n}\n\n/**\n * Runs an interactive child, forwarding terminal signals for its lifetime.\n *\n * Listeners are registered with `on` rather than `once` so a second Ctrl-C still\n * reaches the child, and removed in a finally so repeated launches in one\n * process do not accumulate handlers.\n */\nexport function forwardSignals(child: ChildProcess): () => void {\n const forward = (signal: NodeJS.Signals): void => {\n if (child.exitCode === null && child.signalCode === null) child.kill(signal);\n };\n for (const signal of FORWARDED_SIGNALS) process.on(signal, forward);\n return () => {\n for (const signal of FORWARDED_SIGNALS) process.removeListener(signal, forward);\n };\n}\n\n/** Resolves with the child's exit code, or the conventional code for its signal. */\nexport function waitForExit(child: ChildProcess): Promise<number> {\n return new Promise<number>((resolve, reject) => {\n child.once('error', reject);\n child.once('exit', (code, signal) => resolve(code ?? signalExitCode(signal)));\n });\n}\n\nexport async function runInteractive(\n command: string,\n args: string[],\n cwd: string,\n environment: NodeJS.ProcessEnv,\n): Promise<number> {\n const child = spawn(command, args, { cwd, env: environment, stdio: 'inherit' });\n const stopForwarding = forwardSignals(child);\n try {\n return await waitForExit(child);\n } finally {\n stopForwarding();\n }\n}\n\nexport function isFileSystemError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && typeof (error as NodeJS.ErrnoException).code === 'string';\n}\n\n/** True when the recorded lock owner is still a live process. */\nexport function lockOwnerIsRunning(lockPath: string): boolean {\n const owner = readJson(path.join(lockPath, LOCK_OWNER_FILENAME));\n if (typeof owner.pid !== 'number' || !Number.isSafeInteger(owner.pid) || owner.pid <= 0) return false;\n try {\n process.kill(owner.pid, 0);\n return true;\n } catch (error) {\n // Anything other than \"no such process\" means the pid exists but is not\n // ours to signal, so the lock is still held.\n return !isFileSystemError(error) || error.code !== PROCESS_NOT_FOUND_ERROR;\n }\n}\n\n/**\n * Takes an exclusive lock by creating a directory, which is atomic everywhere.\n *\n * A lock older than the stale window whose owner is gone is reclaimed, so a\n * harness killed mid-sync cannot block every other repository forever.\n */\nexport async function acquireDirectoryLock(lockPath: string): Promise<() => Promise<void>> {\n fs.mkdirSync(path.dirname(lockPath), { recursive: true });\n const startedAt = Date.now();\n\n while (true) {\n try {\n await fs.promises.mkdir(lockPath);\n try {\n writeJson(path.join(lockPath, LOCK_OWNER_FILENAME), { pid: process.pid });\n } catch (error) {\n await fs.promises.rm(lockPath, { recursive: true, force: true });\n throw error;\n }\n return () => fs.promises.rm(lockPath, { recursive: true, force: true });\n } catch (error) {\n if (!isFileSystemError(error) || error.code !== FILE_EXISTS_ERROR) throw error;\n try {\n const stat = await fs.promises.stat(lockPath);\n if (Date.now() - stat.mtimeMs >= LOCK_STALE_MS && !lockOwnerIsRunning(lockPath)) {\n await fs.promises.rm(lockPath, { recursive: true, force: true });\n continue;\n }\n } catch (statError) {\n // The holder released between the failed mkdir and this stat, so retry\n // immediately rather than waiting out the retry delay.\n if (isFileSystemError(statError) && statError.code === FILE_NOT_FOUND_ERROR) continue;\n throw statError;\n }\n if (Date.now() - startedAt >= LOCK_TIMEOUT_MS) {\n throw new Error(`Timed out waiting for Antigravity state lock: ${lockPath}`);\n }\n await delay(LOCK_RETRY_MS);\n }\n }\n}\n\n/** True when `candidate` is `root` itself or sits underneath it. */\nexport function pathInside(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return relative === '' || (!relative.startsWith(`..${path.sep}`) && relative !== '..' && !path.isAbsolute(relative));\n}\n"],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { ChildProcess } from "node:child_process";
2
+
3
+ //#region src/services/compatibility/process.d.ts
4
+ /** Runs a command and returns its trimmed stdout, throwing on a non-zero exit. */
5
+ declare function runCaptured(command: string, args: string[], cwd: string, environment: NodeJS.ProcessEnv): string;
6
+ /** Runs a command with inherited stdio, throwing on a non-zero exit. */
7
+ declare function runChecked(command: string, args: string[], cwd: string, environment: NodeJS.ProcessEnv): void;
8
+ /** The conventional 128+n exit code for a child killed by a signal. */
9
+ declare function signalExitCode(signal: NodeJS.Signals | null): number;
10
+ /**
11
+ * Runs an interactive child, forwarding terminal signals for its lifetime.
12
+ *
13
+ * Listeners are registered with `on` rather than `once` so a second Ctrl-C still
14
+ * reaches the child, and removed in a finally so repeated launches in one
15
+ * process do not accumulate handlers.
16
+ */
17
+ declare function forwardSignals(child: ChildProcess): () => void;
18
+ /** Resolves with the child's exit code, or the conventional code for its signal. */
19
+ declare function waitForExit(child: ChildProcess): Promise<number>;
20
+ declare function runInteractive(command: string, args: string[], cwd: string, environment: NodeJS.ProcessEnv): Promise<number>;
21
+ declare function isFileSystemError(error: unknown): error is NodeJS.ErrnoException;
22
+ /** True when the recorded lock owner is still a live process. */
23
+ declare function lockOwnerIsRunning(lockPath: string): boolean;
24
+ /**
25
+ * Takes an exclusive lock by creating a directory, which is atomic everywhere.
26
+ *
27
+ * A lock older than the stale window whose owner is gone is reclaimed, so a
28
+ * harness killed mid-sync cannot block every other repository forever.
29
+ */
30
+ declare function acquireDirectoryLock(lockPath: string): Promise<() => Promise<void>>;
31
+ /** True when `candidate` is `root` itself or sits underneath it. */
32
+ declare function pathInside(root: string, candidate: string): boolean;
33
+ //#endregion
34
+ export { acquireDirectoryLock, forwardSignals, isFileSystemError, lockOwnerIsRunning, pathInside, runCaptured, runChecked, runInteractive, signalExitCode, waitForExit };
35
+ //# sourceMappingURL=process.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.d.cts","names":[],"sources":["../../../src/services/compatibility/process.ts"],"mappings":";;;;iBA2BgB,WAAA,CAAY,OAAA,UAAiB,IAAA,YAAgB,GAAA,UAAa,WAAA,EAAa,MAAA,CAAO,UAAA;AAA9F;AAAA,iBAWgB,UAAA,CAAW,OAAA,UAAiB,IAAA,YAAgB,GAAA,UAAa,WAAA,EAAa,MAAA,CAAO,UAAA;;iBAO7E,cAAA,CAAe,MAAA,EAAQ,MAAA,CAAO,OAAA;;;;;;;;iBAa9B,cAAA,CAAe,KAAA,EAAO,YAAA;AApBtC;AAAA,iBA+BgB,WAAA,CAAY,KAAA,EAAO,YAAA,GAAe,OAAA;AAAA,iBAO5B,cAAA,CACpB,OAAA,UACA,IAAA,YACA,GAAA,UACA,WAAA,EAAa,MAAA,CAAO,UAAA,GACnB,OAAA;AAAA,iBAUa,iBAAA,CAAkB,KAAA,YAAiB,KAAA,IAAS,MAAA,CAAO,cAAA;;iBAKnD,kBAAA,CAAmB,QAAA;;;;;;;iBAmBb,oBAAA,CAAqB,QAAA,WAAmB,OAAA,OAAc,OAAA;;iBAqC5D,UAAA,CAAW,IAAA,UAAc,SAAA"}
@@ -0,0 +1,35 @@
1
+ import { ChildProcess } from "node:child_process";
2
+
3
+ //#region src/services/compatibility/process.d.ts
4
+ /** Runs a command and returns its trimmed stdout, throwing on a non-zero exit. */
5
+ declare function runCaptured(command: string, args: string[], cwd: string, environment: NodeJS.ProcessEnv): string;
6
+ /** Runs a command with inherited stdio, throwing on a non-zero exit. */
7
+ declare function runChecked(command: string, args: string[], cwd: string, environment: NodeJS.ProcessEnv): void;
8
+ /** The conventional 128+n exit code for a child killed by a signal. */
9
+ declare function signalExitCode(signal: NodeJS.Signals | null): number;
10
+ /**
11
+ * Runs an interactive child, forwarding terminal signals for its lifetime.
12
+ *
13
+ * Listeners are registered with `on` rather than `once` so a second Ctrl-C still
14
+ * reaches the child, and removed in a finally so repeated launches in one
15
+ * process do not accumulate handlers.
16
+ */
17
+ declare function forwardSignals(child: ChildProcess): () => void;
18
+ /** Resolves with the child's exit code, or the conventional code for its signal. */
19
+ declare function waitForExit(child: ChildProcess): Promise<number>;
20
+ declare function runInteractive(command: string, args: string[], cwd: string, environment: NodeJS.ProcessEnv): Promise<number>;
21
+ declare function isFileSystemError(error: unknown): error is NodeJS.ErrnoException;
22
+ /** True when the recorded lock owner is still a live process. */
23
+ declare function lockOwnerIsRunning(lockPath: string): boolean;
24
+ /**
25
+ * Takes an exclusive lock by creating a directory, which is atomic everywhere.
26
+ *
27
+ * A lock older than the stale window whose owner is gone is reclaimed, so a
28
+ * harness killed mid-sync cannot block every other repository forever.
29
+ */
30
+ declare function acquireDirectoryLock(lockPath: string): Promise<() => Promise<void>>;
31
+ /** True when `candidate` is `root` itself or sits underneath it. */
32
+ declare function pathInside(root: string, candidate: string): boolean;
33
+ //#endregion
34
+ export { acquireDirectoryLock, forwardSignals, isFileSystemError, lockOwnerIsRunning, pathInside, runCaptured, runChecked, runInteractive, signalExitCode, waitForExit };
35
+ //# sourceMappingURL=process.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.d.mts","names":[],"sources":["../../../src/services/compatibility/process.ts"],"mappings":";;;;iBA2BgB,WAAA,CAAY,OAAA,UAAiB,IAAA,YAAgB,GAAA,UAAa,WAAA,EAAa,MAAA,CAAO,UAAA;AAA9F;AAAA,iBAWgB,UAAA,CAAW,OAAA,UAAiB,IAAA,YAAgB,GAAA,UAAa,WAAA,EAAa,MAAA,CAAO,UAAA;;iBAO7E,cAAA,CAAe,MAAA,EAAQ,MAAA,CAAO,OAAA;;;;;;;;iBAa9B,cAAA,CAAe,KAAA,EAAO,YAAA;AApBtC;AAAA,iBA+BgB,WAAA,CAAY,KAAA,EAAO,YAAA,GAAe,OAAA;AAAA,iBAO5B,cAAA,CACpB,OAAA,UACA,IAAA,YACA,GAAA,UACA,WAAA,EAAa,MAAA,CAAO,UAAA,GACnB,OAAA;AAAA,iBAUa,iBAAA,CAAkB,KAAA,YAAiB,KAAA,IAAS,MAAA,CAAO,cAAA;;iBAKnD,kBAAA,CAAmB,QAAA;;;;;;;iBAmBb,oBAAA,CAAqB,QAAA,WAAmB,OAAA,OAAc,OAAA;;iBAqC5D,UAAA,CAAW,IAAA,UAAc,SAAA"}
@@ -0,0 +1,2 @@
1
+ import{readJson as e,writeJson as t}from"../../utils/json.mjs";import"../../utils/index.mjs";import n from"node:path";import r from"node:fs";import{constants as i}from"node:os";import{spawnSync as a}from"node:child_process";import{setTimeout as o}from"node:timers/promises";import s from"cross-spawn";const c=[`SIGINT`,`SIGTERM`,`SIGHUP`,`SIGQUIT`],l=`owner.json`;function u(e,t,n,r){let i=a(e,t,{cwd:n,encoding:`utf8`,env:r});if(i.error)throw i.error;if(i.stderr&&process.stderr.write(i.stderr),i.status!==0)throw Error(`${e} exited with status ${i.status??1}`);return i.stdout.trim()}function d(e,t,n,r){let i=a(e,t,{cwd:n,env:r,stdio:`inherit`});if(i.error)throw i.error;if(i.status!==0)throw Error(`${e} exited with status ${i.status??1}`)}function f(e){if(!e)return 1;let t=i.signals[e];return t?128+t:1}function p(e){let t=t=>{e.exitCode===null&&e.signalCode===null&&e.kill(t)};for(let e of c)process.on(e,t);return()=>{for(let e of c)process.removeListener(e,t)}}function m(e){return new Promise((t,n)=>{e.once(`error`,n),e.once(`exit`,(e,n)=>t(e??f(n)))})}async function h(e,t,n,r){let i=s(e,t,{cwd:n,env:r,stdio:`inherit`}),a=p(i);try{return await m(i)}finally{a()}}function g(e){return e instanceof Error&&typeof e.code==`string`}function _(t){let r=e(n.join(t,l));if(typeof r.pid!=`number`||!Number.isSafeInteger(r.pid)||r.pid<=0)return!1;try{return process.kill(r.pid,0),!0}catch(e){return!g(e)||e.code!==`ESRCH`}}async function v(e){r.mkdirSync(n.dirname(e),{recursive:!0});let i=Date.now();for(;;)try{await r.promises.mkdir(e);try{t(n.join(e,l),{pid:process.pid})}catch(t){throw await r.promises.rm(e,{recursive:!0,force:!0}),t}return()=>r.promises.rm(e,{recursive:!0,force:!0})}catch(t){if(!g(t)||t.code!==`EEXIST`)throw t;try{let t=await r.promises.stat(e);if(Date.now()-t.mtimeMs>=1e4&&!_(e)){await r.promises.rm(e,{recursive:!0,force:!0});continue}}catch(e){if(g(e)&&e.code===`ENOENT`)continue;throw e}if(Date.now()-i>=3e4)throw Error(`Timed out waiting for Antigravity state lock: ${e}`);await o(25)}}function y(e,t){let r=n.relative(e,t);return r===``||!r.startsWith(`..${n.sep}`)&&r!==`..`&&!n.isAbsolute(r)}export{v as acquireDirectoryLock,p as forwardSignals,g as isFileSystemError,_ as lockOwnerIsRunning,y as pathInside,u as runCaptured,d as runChecked,h as runInteractive,f as signalExitCode,m as waitForExit};
2
+ //# sourceMappingURL=process.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.mjs","names":["osConstants","spawn","delay"],"sources":["../../../src/services/compatibility/process.ts"],"sourcesContent":["import { type ChildProcess, spawnSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport { constants as osConstants } from 'node:os';\nimport path from 'node:path';\nimport { setTimeout as delay } from 'node:timers/promises';\nimport spawn from 'cross-spawn';\nimport { readJson, writeJson } from '../../utils/index.ts';\n\n/**\n * Child process and cross-repository locking primitives.\n *\n * Shared by every compatibility provider and by the Pi launch command, so that\n * signal forwarding behaves the same however the harness starts a child.\n */\n\nconst FORWARDED_SIGNALS: NodeJS.Signals[] = ['SIGINT', 'SIGTERM', 'SIGHUP', 'SIGQUIT'];\nconst SIGNAL_EXIT_CODE_OFFSET = 128;\nconst UNKNOWN_SIGNAL_EXIT_CODE = 1;\nconst LOCK_RETRY_MS = 25;\nconst LOCK_STALE_MS = 10_000;\nconst LOCK_TIMEOUT_MS = 30_000;\nconst FILE_EXISTS_ERROR = 'EEXIST';\nconst FILE_NOT_FOUND_ERROR = 'ENOENT';\nconst PROCESS_NOT_FOUND_ERROR = 'ESRCH';\nconst LOCK_OWNER_FILENAME = 'owner.json';\n\n/** Runs a command and returns its trimmed stdout, throwing on a non-zero exit. */\nexport function runCaptured(command: string, args: string[], cwd: string, environment: NodeJS.ProcessEnv): string {\n const result = spawnSync(command, args, { cwd, encoding: 'utf8', env: environment });\n if (result.error) throw result.error;\n if (result.stderr) process.stderr.write(result.stderr);\n if (result.status !== 0) {\n throw new Error(`${command} exited with status ${result.status ?? 1}`);\n }\n return result.stdout.trim();\n}\n\n/** Runs a command with inherited stdio, throwing on a non-zero exit. */\nexport function runChecked(command: string, args: string[], cwd: string, environment: NodeJS.ProcessEnv): void {\n const result = spawnSync(command, args, { cwd, env: environment, stdio: 'inherit' });\n if (result.error) throw result.error;\n if (result.status !== 0) throw new Error(`${command} exited with status ${result.status ?? 1}`);\n}\n\n/** The conventional 128+n exit code for a child killed by a signal. */\nexport function signalExitCode(signal: NodeJS.Signals | null): number {\n if (!signal) return UNKNOWN_SIGNAL_EXIT_CODE;\n const signalNumber = osConstants.signals[signal];\n return signalNumber ? SIGNAL_EXIT_CODE_OFFSET + signalNumber : UNKNOWN_SIGNAL_EXIT_CODE;\n}\n\n/**\n * Runs an interactive child, forwarding terminal signals for its lifetime.\n *\n * Listeners are registered with `on` rather than `once` so a second Ctrl-C still\n * reaches the child, and removed in a finally so repeated launches in one\n * process do not accumulate handlers.\n */\nexport function forwardSignals(child: ChildProcess): () => void {\n const forward = (signal: NodeJS.Signals): void => {\n if (child.exitCode === null && child.signalCode === null) child.kill(signal);\n };\n for (const signal of FORWARDED_SIGNALS) process.on(signal, forward);\n return () => {\n for (const signal of FORWARDED_SIGNALS) process.removeListener(signal, forward);\n };\n}\n\n/** Resolves with the child's exit code, or the conventional code for its signal. */\nexport function waitForExit(child: ChildProcess): Promise<number> {\n return new Promise<number>((resolve, reject) => {\n child.once('error', reject);\n child.once('exit', (code, signal) => resolve(code ?? signalExitCode(signal)));\n });\n}\n\nexport async function runInteractive(\n command: string,\n args: string[],\n cwd: string,\n environment: NodeJS.ProcessEnv,\n): Promise<number> {\n const child = spawn(command, args, { cwd, env: environment, stdio: 'inherit' });\n const stopForwarding = forwardSignals(child);\n try {\n return await waitForExit(child);\n } finally {\n stopForwarding();\n }\n}\n\nexport function isFileSystemError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && typeof (error as NodeJS.ErrnoException).code === 'string';\n}\n\n/** True when the recorded lock owner is still a live process. */\nexport function lockOwnerIsRunning(lockPath: string): boolean {\n const owner = readJson(path.join(lockPath, LOCK_OWNER_FILENAME));\n if (typeof owner.pid !== 'number' || !Number.isSafeInteger(owner.pid) || owner.pid <= 0) return false;\n try {\n process.kill(owner.pid, 0);\n return true;\n } catch (error) {\n // Anything other than \"no such process\" means the pid exists but is not\n // ours to signal, so the lock is still held.\n return !isFileSystemError(error) || error.code !== PROCESS_NOT_FOUND_ERROR;\n }\n}\n\n/**\n * Takes an exclusive lock by creating a directory, which is atomic everywhere.\n *\n * A lock older than the stale window whose owner is gone is reclaimed, so a\n * harness killed mid-sync cannot block every other repository forever.\n */\nexport async function acquireDirectoryLock(lockPath: string): Promise<() => Promise<void>> {\n fs.mkdirSync(path.dirname(lockPath), { recursive: true });\n const startedAt = Date.now();\n\n while (true) {\n try {\n await fs.promises.mkdir(lockPath);\n try {\n writeJson(path.join(lockPath, LOCK_OWNER_FILENAME), { pid: process.pid });\n } catch (error) {\n await fs.promises.rm(lockPath, { recursive: true, force: true });\n throw error;\n }\n return () => fs.promises.rm(lockPath, { recursive: true, force: true });\n } catch (error) {\n if (!isFileSystemError(error) || error.code !== FILE_EXISTS_ERROR) throw error;\n try {\n const stat = await fs.promises.stat(lockPath);\n if (Date.now() - stat.mtimeMs >= LOCK_STALE_MS && !lockOwnerIsRunning(lockPath)) {\n await fs.promises.rm(lockPath, { recursive: true, force: true });\n continue;\n }\n } catch (statError) {\n // The holder released between the failed mkdir and this stat, so retry\n // immediately rather than waiting out the retry delay.\n if (isFileSystemError(statError) && statError.code === FILE_NOT_FOUND_ERROR) continue;\n throw statError;\n }\n if (Date.now() - startedAt >= LOCK_TIMEOUT_MS) {\n throw new Error(`Timed out waiting for Antigravity state lock: ${lockPath}`);\n }\n await delay(LOCK_RETRY_MS);\n }\n }\n}\n\n/** True when `candidate` is `root` itself or sits underneath it. */\nexport function pathInside(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return relative === '' || (!relative.startsWith(`..${path.sep}`) && relative !== '..' && !path.isAbsolute(relative));\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=`--config`,t=`--add-dir`,n=`--proxy-mode`,r=`flat`,i=`${n}=${r}`;function a(t,a,o,s=!1){return[...o?[`-y`]:[],t,`mcp-serve`,`--type`,`stdio-http`,...s?[i]:[n,r],e,a]}function o(e){return e.options.additionalDirectories.flatMap(e=>[t,e])}exports.ADD_DIRECTORY_OPTION=t,exports.AGIFLOW_PROXY_SERVER_NAME=`agiflow-proxy`,exports.ANTIGRAVITY_MCP_PROXY_PACKAGE=`@agimon-ai/mcp-proxy`,exports.CORE_PLUGIN_NAME=`core`,exports.MCP_CONFIG_OPTION=e,exports.MCP_PRESTART_OPTION=`--prestart-http`,exports.MCP_PROXY_PACKAGE=`@agimon-ai/mcp-proxy@latest`,exports.MCP_SERVERS_KEY=`mcpServers`,exports.NPX_COMMAND=`npx`,exports.PLUGINS_DIRECTORY=`plugins`,exports.PLUGIN_MANIFEST_FILENAME=`plugin.json`,exports.SKILLS_DIRECTORY=`skills`,exports.SKIP_PERMISSIONS_OPTION=`--dangerously-skip-permissions`,exports.additionalDirectoryArgs=o,exports.mcpProxyArguments=a;
2
+ //# sourceMappingURL=shared.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.cjs","names":[],"sources":["../../../src/services/compatibility/shared.ts"],"sourcesContent":["import type { CompatibilityContext } from '../compatibilityContext.ts';\n\n/**\n * Values and argument builders shared by more than one provider.\n *\n * Kept separate from index.ts so the provider modules can import them without\n * depending on the dispatch that imports the provider modules.\n */\n\nexport const MCP_PROXY_PACKAGE = '@agimon-ai/mcp-proxy@latest';\nexport const ANTIGRAVITY_MCP_PROXY_PACKAGE = '@agimon-ai/mcp-proxy';\nexport const AGIFLOW_PROXY_SERVER_NAME = 'agiflow-proxy';\nexport const MCP_CONFIG_OPTION = '--config';\nexport const MCP_PRESTART_OPTION = '--prestart-http';\nexport const ADD_DIRECTORY_OPTION = '--add-dir';\nexport const SKIP_PERMISSIONS_OPTION = '--dangerously-skip-permissions';\nexport const NPX_COMMAND = 'npx';\nexport const PLUGINS_DIRECTORY = 'plugins';\nexport const SKILLS_DIRECTORY = 'skills';\nexport const MCP_SERVERS_KEY = 'mcpServers';\nexport const CORE_PLUGIN_NAME = 'core';\nexport const PLUGIN_MANIFEST_FILENAME = 'plugin.json';\n\nconst MCP_SERVE_COMMAND = 'mcp-serve';\nconst MCP_TYPE_OPTION = '--type';\nconst MCP_STDIO_HTTP_TYPE = 'stdio-http';\nconst MCP_PROXY_MODE_OPTION = '--proxy-mode';\nconst MCP_PROXY_MODE = 'flat';\nconst MCP_PROXY_MODE_ASSIGNMENT = `${MCP_PROXY_MODE_OPTION}=${MCP_PROXY_MODE}`;\nconst NPX_ASSUME_YES_OPTION = '-y';\n\n/**\n * Command line for the MCP proxy.\n *\n * `inlineProxyMode` picks `--proxy-mode=flat` over `--proxy-mode flat`, which\n * Codex needs because it receives the whole argument vector as one `-c` value.\n */\nexport function mcpProxyArguments(\n packageName: string,\n configPath: string,\n assumeYes: boolean,\n inlineProxyMode = false,\n): string[] {\n return [\n ...(assumeYes ? [NPX_ASSUME_YES_OPTION] : []),\n packageName,\n MCP_SERVE_COMMAND,\n MCP_TYPE_OPTION,\n MCP_STDIO_HTTP_TYPE,\n ...(inlineProxyMode ? [MCP_PROXY_MODE_ASSIGNMENT] : [MCP_PROXY_MODE_OPTION, MCP_PROXY_MODE]),\n MCP_CONFIG_OPTION,\n configPath,\n ];\n}\n\nexport function additionalDirectoryArgs(context: CompatibilityContext): string[] {\n return context.options.additionalDirectories.flatMap((directory) => [ADD_DIRECTORY_OPTION, directory]);\n}\n"],"mappings":"mEASA,MAGa,EAAoB,WAEpB,EAAuB,YAY9B,EAAwB,eACxB,EAAiB,OACjB,EAA4B,GAAG,EAAsB,GAAG,IAS9D,SAAgB,EACd,EACA,EACA,EACA,EAAkB,GACR,CACV,MAAO,CACL,GAAI,EAAY,CAAC,KAAsB,CAAG,EAAE,CAC5C,EACA,YACA,SACA,aACA,GAAI,EAAkB,CAAC,EAA0B,CAAG,CAAC,EAAuB,EAAe,CAC3F,EACA,EACD,CAGH,SAAgB,EAAwB,EAAyC,CAC/E,OAAO,EAAQ,QAAQ,sBAAsB,QAAS,GAAc,CAAC,EAAsB,EAAU,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { CompatibilityContext } from "../compatibilityContext.cjs";
2
+
3
+ //#region src/services/compatibility/shared.d.ts
4
+ /**
5
+ * Values and argument builders shared by more than one provider.
6
+ *
7
+ * Kept separate from index.ts so the provider modules can import them without
8
+ * depending on the dispatch that imports the provider modules.
9
+ */
10
+ declare const MCP_PROXY_PACKAGE = "@agimon-ai/mcp-proxy@latest";
11
+ declare const ANTIGRAVITY_MCP_PROXY_PACKAGE = "@agimon-ai/mcp-proxy";
12
+ declare const AGIFLOW_PROXY_SERVER_NAME = "agiflow-proxy";
13
+ declare const MCP_CONFIG_OPTION = "--config";
14
+ declare const MCP_PRESTART_OPTION = "--prestart-http";
15
+ declare const ADD_DIRECTORY_OPTION = "--add-dir";
16
+ declare const SKIP_PERMISSIONS_OPTION = "--dangerously-skip-permissions";
17
+ declare const NPX_COMMAND = "npx";
18
+ declare const PLUGINS_DIRECTORY = "plugins";
19
+ declare const SKILLS_DIRECTORY = "skills";
20
+ declare const MCP_SERVERS_KEY = "mcpServers";
21
+ declare const CORE_PLUGIN_NAME = "core";
22
+ declare const PLUGIN_MANIFEST_FILENAME = "plugin.json";
23
+ /**
24
+ * Command line for the MCP proxy.
25
+ *
26
+ * `inlineProxyMode` picks `--proxy-mode=flat` over `--proxy-mode flat`, which
27
+ * Codex needs because it receives the whole argument vector as one `-c` value.
28
+ */
29
+ declare function mcpProxyArguments(packageName: string, configPath: string, assumeYes: boolean, inlineProxyMode?: boolean): string[];
30
+ declare function additionalDirectoryArgs(context: CompatibilityContext): string[];
31
+ //#endregion
32
+ export { ADD_DIRECTORY_OPTION, AGIFLOW_PROXY_SERVER_NAME, ANTIGRAVITY_MCP_PROXY_PACKAGE, CORE_PLUGIN_NAME, MCP_CONFIG_OPTION, MCP_PRESTART_OPTION, MCP_PROXY_PACKAGE, MCP_SERVERS_KEY, NPX_COMMAND, PLUGINS_DIRECTORY, PLUGIN_MANIFEST_FILENAME, SKILLS_DIRECTORY, SKIP_PERMISSIONS_OPTION, additionalDirectoryArgs, mcpProxyArguments };
33
+ //# sourceMappingURL=shared.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.cts","names":[],"sources":["../../../src/services/compatibility/shared.ts"],"mappings":";;;;;AASA;;;;cAAa,iBAAA;AAAA,cACA,6BAAA;AAAA,cACA,yBAAA;AAAA,cACA,iBAAA;AAAA,cACA,mBAAA;AAAA,cACA,oBAAA;AAAA,cACA,uBAAA;AAAA,cACA,WAAA;AAAA,cACA,iBAAA;AAAA,cACA,gBAAA;AAAA,cACA,eAAA;AAAA,cACA,gBAAA;AAAA,cACA,wBAAA;;;;AARb;;;iBAwBgB,iBAAA,CACd,WAAA,UACA,UAAA,UACA,SAAA,WACA,eAAA;AAAA,iBAcc,uBAAA,CAAwB,OAAA,EAAS,oBAAA"}
@@ -0,0 +1,33 @@
1
+ import { CompatibilityContext } from "../compatibilityContext.mjs";
2
+
3
+ //#region src/services/compatibility/shared.d.ts
4
+ /**
5
+ * Values and argument builders shared by more than one provider.
6
+ *
7
+ * Kept separate from index.ts so the provider modules can import them without
8
+ * depending on the dispatch that imports the provider modules.
9
+ */
10
+ declare const MCP_PROXY_PACKAGE = "@agimon-ai/mcp-proxy@latest";
11
+ declare const ANTIGRAVITY_MCP_PROXY_PACKAGE = "@agimon-ai/mcp-proxy";
12
+ declare const AGIFLOW_PROXY_SERVER_NAME = "agiflow-proxy";
13
+ declare const MCP_CONFIG_OPTION = "--config";
14
+ declare const MCP_PRESTART_OPTION = "--prestart-http";
15
+ declare const ADD_DIRECTORY_OPTION = "--add-dir";
16
+ declare const SKIP_PERMISSIONS_OPTION = "--dangerously-skip-permissions";
17
+ declare const NPX_COMMAND = "npx";
18
+ declare const PLUGINS_DIRECTORY = "plugins";
19
+ declare const SKILLS_DIRECTORY = "skills";
20
+ declare const MCP_SERVERS_KEY = "mcpServers";
21
+ declare const CORE_PLUGIN_NAME = "core";
22
+ declare const PLUGIN_MANIFEST_FILENAME = "plugin.json";
23
+ /**
24
+ * Command line for the MCP proxy.
25
+ *
26
+ * `inlineProxyMode` picks `--proxy-mode=flat` over `--proxy-mode flat`, which
27
+ * Codex needs because it receives the whole argument vector as one `-c` value.
28
+ */
29
+ declare function mcpProxyArguments(packageName: string, configPath: string, assumeYes: boolean, inlineProxyMode?: boolean): string[];
30
+ declare function additionalDirectoryArgs(context: CompatibilityContext): string[];
31
+ //#endregion
32
+ export { ADD_DIRECTORY_OPTION, AGIFLOW_PROXY_SERVER_NAME, ANTIGRAVITY_MCP_PROXY_PACKAGE, CORE_PLUGIN_NAME, MCP_CONFIG_OPTION, MCP_PRESTART_OPTION, MCP_PROXY_PACKAGE, MCP_SERVERS_KEY, NPX_COMMAND, PLUGINS_DIRECTORY, PLUGIN_MANIFEST_FILENAME, SKILLS_DIRECTORY, SKIP_PERMISSIONS_OPTION, additionalDirectoryArgs, mcpProxyArguments };
33
+ //# sourceMappingURL=shared.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.mts","names":[],"sources":["../../../src/services/compatibility/shared.ts"],"mappings":";;;;;AASA;;;;cAAa,iBAAA;AAAA,cACA,6BAAA;AAAA,cACA,yBAAA;AAAA,cACA,iBAAA;AAAA,cACA,mBAAA;AAAA,cACA,oBAAA;AAAA,cACA,uBAAA;AAAA,cACA,WAAA;AAAA,cACA,iBAAA;AAAA,cACA,gBAAA;AAAA,cACA,eAAA;AAAA,cACA,gBAAA;AAAA,cACA,wBAAA;;;;AARb;;;iBAwBgB,iBAAA,CACd,WAAA,UACA,UAAA,UACA,SAAA,WACA,eAAA;AAAA,iBAcc,uBAAA,CAAwB,OAAA,EAAS,oBAAA"}
@@ -0,0 +1,2 @@
1
+ const e=`@agimon-ai/mcp-proxy@latest`,t=`@agimon-ai/mcp-proxy`,n=`agiflow-proxy`,r=`--config`,i=`--prestart-http`,a=`--add-dir`,o=`--dangerously-skip-permissions`,s=`npx`,c=`plugins`,l=`skills`,u=`mcpServers`,d=`core`,f=`plugin.json`,p=`--proxy-mode`,m=`flat`,h=`${p}=${m}`;function g(e,t,n,i=!1){return[...n?[`-y`]:[],e,`mcp-serve`,`--type`,`stdio-http`,...i?[h]:[p,m],r,t]}function _(e){return e.options.additionalDirectories.flatMap(e=>[a,e])}export{a as ADD_DIRECTORY_OPTION,n as AGIFLOW_PROXY_SERVER_NAME,t as ANTIGRAVITY_MCP_PROXY_PACKAGE,d as CORE_PLUGIN_NAME,r as MCP_CONFIG_OPTION,i as MCP_PRESTART_OPTION,e as MCP_PROXY_PACKAGE,u as MCP_SERVERS_KEY,s as NPX_COMMAND,c as PLUGINS_DIRECTORY,f as PLUGIN_MANIFEST_FILENAME,l as SKILLS_DIRECTORY,o as SKIP_PERMISSIONS_OPTION,_ as additionalDirectoryArgs,g as mcpProxyArguments};
2
+ //# sourceMappingURL=shared.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.mjs","names":[],"sources":["../../../src/services/compatibility/shared.ts"],"sourcesContent":["import type { CompatibilityContext } from '../compatibilityContext.ts';\n\n/**\n * Values and argument builders shared by more than one provider.\n *\n * Kept separate from index.ts so the provider modules can import them without\n * depending on the dispatch that imports the provider modules.\n */\n\nexport const MCP_PROXY_PACKAGE = '@agimon-ai/mcp-proxy@latest';\nexport const ANTIGRAVITY_MCP_PROXY_PACKAGE = '@agimon-ai/mcp-proxy';\nexport const AGIFLOW_PROXY_SERVER_NAME = 'agiflow-proxy';\nexport const MCP_CONFIG_OPTION = '--config';\nexport const MCP_PRESTART_OPTION = '--prestart-http';\nexport const ADD_DIRECTORY_OPTION = '--add-dir';\nexport const SKIP_PERMISSIONS_OPTION = '--dangerously-skip-permissions';\nexport const NPX_COMMAND = 'npx';\nexport const PLUGINS_DIRECTORY = 'plugins';\nexport const SKILLS_DIRECTORY = 'skills';\nexport const MCP_SERVERS_KEY = 'mcpServers';\nexport const CORE_PLUGIN_NAME = 'core';\nexport const PLUGIN_MANIFEST_FILENAME = 'plugin.json';\n\nconst MCP_SERVE_COMMAND = 'mcp-serve';\nconst MCP_TYPE_OPTION = '--type';\nconst MCP_STDIO_HTTP_TYPE = 'stdio-http';\nconst MCP_PROXY_MODE_OPTION = '--proxy-mode';\nconst MCP_PROXY_MODE = 'flat';\nconst MCP_PROXY_MODE_ASSIGNMENT = `${MCP_PROXY_MODE_OPTION}=${MCP_PROXY_MODE}`;\nconst NPX_ASSUME_YES_OPTION = '-y';\n\n/**\n * Command line for the MCP proxy.\n *\n * `inlineProxyMode` picks `--proxy-mode=flat` over `--proxy-mode flat`, which\n * Codex needs because it receives the whole argument vector as one `-c` value.\n */\nexport function mcpProxyArguments(\n packageName: string,\n configPath: string,\n assumeYes: boolean,\n inlineProxyMode = false,\n): string[] {\n return [\n ...(assumeYes ? [NPX_ASSUME_YES_OPTION] : []),\n packageName,\n MCP_SERVE_COMMAND,\n MCP_TYPE_OPTION,\n MCP_STDIO_HTTP_TYPE,\n ...(inlineProxyMode ? [MCP_PROXY_MODE_ASSIGNMENT] : [MCP_PROXY_MODE_OPTION, MCP_PROXY_MODE]),\n MCP_CONFIG_OPTION,\n configPath,\n ];\n}\n\nexport function additionalDirectoryArgs(context: CompatibilityContext): string[] {\n return context.options.additionalDirectories.flatMap((directory) => [ADD_DIRECTORY_OPTION, directory]);\n}\n"],"mappings":"AASA,MAAa,EAAoB,8BACpB,EAAgC,uBAChC,EAA4B,gBAC5B,EAAoB,WACpB,EAAsB,kBACtB,EAAuB,YACvB,EAA0B,iCAC1B,EAAc,MACd,EAAoB,UACpB,EAAmB,SACnB,EAAkB,aAClB,EAAmB,OACnB,EAA2B,cAKlC,EAAwB,eACxB,EAAiB,OACjB,EAA4B,GAAG,EAAsB,GAAG,IAS9D,SAAgB,EACd,EACA,EACA,EACA,EAAkB,GACR,CACV,MAAO,CACL,GAAI,EAAY,CAAC,KAAsB,CAAG,EAAE,CAC5C,EACA,YACA,SACA,aACA,GAAI,EAAkB,CAAC,EAA0B,CAAG,CAAC,EAAuB,EAAe,CAC3F,EACA,EACD,CAGH,SAAgB,EAAwB,EAAyC,CAC/E,OAAO,EAAQ,QAAQ,sBAAsB,QAAS,GAAc,CAAC,EAAsB,EAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../_virtual/_rolldown/runtime.cjs`);require(`../config/index.cjs`);const t=require(`./mcpFilter.cjs`),n=require(`./resourceCollector.cjs`);let r=require(`node:path`);r=e.__toESM(r,1);let i=require(`node:fs`);i=e.__toESM(i,1);let a=require(`node:os`);a=e.__toESM(a,1);let o=require(`@agimon-ai/doompi-config/majorModes`),s=require(`@agimon-ai/doompi-config/profiles`),c=require(`@agimon-ai/doompi-config/domains`),l=require(`@agimon-ai/doompi-config`);const u=`.mcp.json`;function d(e,t){let n=[r.default.join(e,u)];for(let e of t){if(e.mcp===!1)continue;let t=r.default.join(e.directory,u);i.default.existsSync(t)&&n.push(t)}return n}function f(e,n){let i=(e.mcpServers??{})[t.PROXY_SERVER_NAME],a=Array.isArray(i?.args)?i.args.map(String):[],o=a.indexOf(`--config`),s=o===-1?void 0:a[o+1];return s?r.default.resolve(n,s):r.default.join(n,`mcp-config.yaml`)}async function p(e,a,o,s){let c=await t.applyMcpAllowlist(n.mergeMcpConfigs(d(e,a)),o,e,s),l=r.default.join(s,`mcp.json`);return await i.default.promises.writeFile(l,`${JSON.stringify(c,null,2)}\n`,{mode:384}),{mcpConfigPath:l,proxyConfigPath:f(c,e)}}async function m(e){let n=(0,o.loadMajorModesConfig)(e.repoRoot),u=(0,o.resolveLayers)(n,e.majorMode),d=(0,o.layerHookGroups)(n,u),f=await i.default.promises.mkdtemp(r.default.join(a.default.tmpdir(),`doom-pi-compat-`));await i.default.promises.chmod(f,448);try{let n=e.profile?(0,s.resolveProfile)(e.repoRoot,e.profile):void 0,a=(0,c.resolvePluginEntries)(e.repoRoot,e.domains,[]),o=t.resolveMcpAllowlist(e.repoRoot,e.domains),m=await p(e.repoRoot,a,o,f),h={...process.env};h.NX_DAEMON??=`false`;let g=(0,s.applyProfileEnvironment)(h,n?.env??{}),_=n?.persona?(0,s.buildPersonaPrompt)(n.personaRoot,n.persona):void 0,v;return _&&(v=r.default.join(f,`persona.md`),await i.default.promises.writeFile(v,`${_}\n`,{mode:384})),(0,l.projectHarnessEnvironment)({root:e.repoRoot,majorMode:e.majorMode,temporaryDirectory:f,domains:e.domains,layers:u,profile:n?.name,profileEnvironment:g,hookGroups:d,mcpConfigPath:m.mcpConfigPath,personaFile:v,additionalDirectories:e.additionalDirectories,hooks:!0},h),h.DOOMPI_ADDITIONAL_DIRS=e.additionalDirectories.join(r.default.delimiter),h.CLAUDE_PROJECT_DIR=e.repoRoot,h.CODEX_REPO_ROOT=e.repoRoot,h.AGY_REPO_ROOT=e.repoRoot,h.ORIGINAL_REPO_PATH||=e.repoRoot,{options:e,environment:h,plugins:a,profile:n,personaFile:v,mcpAllowlist:o,mcpConfigPath:m.mcpConfigPath,proxyConfigPath:m.proxyConfigPath,selectedLayers:u,hookGroups:d,sharedSkills:(0,c.resolveSharedSkills)(e.repoRoot,e.domains),cleanup:()=>i.default.promises.rm(f,{recursive:!0,force:!0})}}catch(e){throw await i.default.promises.rm(f,{recursive:!0,force:!0}),e}}exports.buildCompatibilityContext=m;
2
+ //# sourceMappingURL=compatibilityContext.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibilityContext.cjs","names":["path","fs","PROXY_SERVER_NAME","applyMcpAllowlist","mergeMcpConfigs","os","resolveMcpAllowlist"],"sources":["../../src/services/compatibilityContext.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport {\n applyProfileEnvironment,\n buildPersonaPrompt,\n layerHookGroups,\n loadMajorModesConfig,\n resolveLayers,\n resolvePluginEntries,\n resolveProfile,\n resolveSharedSkills,\n projectHarnessEnvironment,\n type AgentProfile,\n type DomainMcpAllowlist,\n type PluginEntry,\n} from '../config/index.ts';\nimport type { CompatibilityOptions } from '../interfaces/index.ts';\nimport { PROXY_SERVER_NAME, applyMcpAllowlist, resolveMcpAllowlist } from './mcpFilter.ts';\nimport { mergeMcpConfigs } from './resourceCollector.ts';\n\ntype JsonObject = Record<string, unknown>;\n\nconst MCP_CONFIG_FILENAME = '.mcp.json';\nconst GENERATED_MCP_CONFIG_FILENAME = 'mcp.json';\nconst PROXY_CONFIG_FILENAME = 'mcp-config.yaml';\nconst PERSONA_FILENAME = 'persona.md';\nconst PRIVATE_FILE_MODE = 0o600;\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst CONFIG_OPTION = '--config';\nconst TEMPORARY_DIRECTORY_PREFIX = 'doom-pi-compat-';\nconst ADDITIONAL_DIRS_ENV = 'DOOMPI_ADDITIONAL_DIRS';\nconst CLAUDE_PROJECT_DIR_ENV = 'CLAUDE_PROJECT_DIR';\nconst CODEX_REPO_ROOT_ENV = 'CODEX_REPO_ROOT';\nconst AGY_REPO_ROOT_ENV = 'AGY_REPO_ROOT';\nconst ORIGINAL_REPO_PATH_ENV = 'ORIGINAL_REPO_PATH';\n\nexport interface CompatibilityContext {\n options: CompatibilityOptions;\n environment: NodeJS.ProcessEnv;\n plugins: PluginEntry[];\n profile?: AgentProfile;\n personaFile?: string;\n mcpAllowlist?: DomainMcpAllowlist;\n mcpConfigPath: string;\n proxyConfigPath: string;\n selectedLayers: string[];\n hookGroups: string[];\n sharedSkills: boolean;\n cleanup(): Promise<void>;\n}\n\nfunction pluginMcpPaths(repoRoot: string, plugins: PluginEntry[]): string[] {\n const paths = [path.join(repoRoot, MCP_CONFIG_FILENAME)];\n for (const plugin of plugins) {\n if (plugin.mcp === false) continue;\n const configPath = path.join(plugin.directory, MCP_CONFIG_FILENAME);\n if (fs.existsSync(configPath)) paths.push(configPath);\n }\n return paths;\n}\n\nfunction resolveProxyConfigPath(config: JsonObject, repoRoot: string): string {\n const servers = (config.mcpServers ?? {}) as Record<string, JsonObject>;\n const proxy = servers[PROXY_SERVER_NAME];\n const args = Array.isArray(proxy?.args) ? proxy.args.map(String) : [];\n const configIndex = args.indexOf(CONFIG_OPTION);\n const selected = configIndex === -1 ? undefined : args[configIndex + 1];\n return selected ? path.resolve(repoRoot, selected) : path.join(repoRoot, PROXY_CONFIG_FILENAME);\n}\n\nasync function writeCompatibilityMcpConfig(\n repoRoot: string,\n plugins: PluginEntry[],\n allowlist: DomainMcpAllowlist | undefined,\n temporaryDirectory: string,\n): Promise<{ mcpConfigPath: string; proxyConfigPath: string }> {\n const config = await applyMcpAllowlist(\n mergeMcpConfigs(pluginMcpPaths(repoRoot, plugins)),\n allowlist,\n repoRoot,\n temporaryDirectory,\n );\n const mcpConfigPath = path.join(temporaryDirectory, GENERATED_MCP_CONFIG_FILENAME);\n await fs.promises.writeFile(mcpConfigPath, `${JSON.stringify(config, null, 2)}\\n`, { mode: PRIVATE_FILE_MODE });\n return { mcpConfigPath, proxyConfigPath: resolveProxyConfigPath(config, repoRoot) };\n}\n\n/** Resolves only the resources shared by Pi and compatibility frontends. */\nexport async function buildCompatibilityContext(options: CompatibilityOptions): Promise<CompatibilityContext> {\n const majorModesConfig = loadMajorModesConfig(options.repoRoot);\n const selectedLayers = resolveLayers(majorModesConfig, options.majorMode);\n const hookGroups = layerHookGroups(majorModesConfig, selectedLayers);\n const temporaryDirectory = await fs.promises.mkdtemp(path.join(os.tmpdir(), TEMPORARY_DIRECTORY_PREFIX));\n await fs.promises.chmod(temporaryDirectory, PRIVATE_DIRECTORY_MODE);\n\n try {\n const profile = options.profile ? resolveProfile(options.repoRoot, options.profile) : undefined;\n const plugins = resolvePluginEntries(options.repoRoot, options.domains, []);\n const mcpAllowlist = resolveMcpAllowlist(options.repoRoot, options.domains);\n const mcp = await writeCompatibilityMcpConfig(options.repoRoot, plugins, mcpAllowlist, temporaryDirectory);\n const environment = { ...process.env };\n environment.NX_DAEMON ??= 'false';\n const profileEnvironment = applyProfileEnvironment(environment, profile?.env ?? {});\n const personaPrompt = profile?.persona ? buildPersonaPrompt(profile.personaRoot, profile.persona) : undefined;\n let personaFile: string | undefined;\n\n if (personaPrompt) {\n personaFile = path.join(temporaryDirectory, PERSONA_FILENAME);\n await fs.promises.writeFile(personaFile, `${personaPrompt}\\n`, { mode: PRIVATE_FILE_MODE });\n }\n\n // Projection only, with no state file: Claude, Codex and Antigravity read\n // an environment and never the store.\n projectHarnessEnvironment(\n {\n root: options.repoRoot,\n majorMode: options.majorMode,\n temporaryDirectory,\n domains: options.domains,\n layers: selectedLayers,\n profile: profile?.name,\n profileEnvironment,\n hookGroups,\n mcpConfigPath: mcp.mcpConfigPath,\n personaFile,\n additionalDirectories: options.additionalDirectories,\n hooks: true,\n },\n environment,\n );\n environment[ADDITIONAL_DIRS_ENV] = options.additionalDirectories.join(path.delimiter);\n environment[CLAUDE_PROJECT_DIR_ENV] = options.repoRoot;\n environment[CODEX_REPO_ROOT_ENV] = options.repoRoot;\n environment[AGY_REPO_ROOT_ENV] = options.repoRoot;\n environment[ORIGINAL_REPO_PATH_ENV] ||= options.repoRoot;\n\n return {\n options,\n environment,\n plugins,\n profile,\n personaFile,\n mcpAllowlist,\n mcpConfigPath: mcp.mcpConfigPath,\n proxyConfigPath: mcp.proxyConfigPath,\n selectedLayers,\n hookGroups,\n sharedSkills: resolveSharedSkills(options.repoRoot, options.domains),\n cleanup: () => fs.promises.rm(temporaryDirectory, { recursive: true, force: true }),\n };\n } catch (error) {\n await fs.promises.rm(temporaryDirectory, { recursive: true, force: true });\n throw error;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { CompatibilityOptions } from "../interfaces/compatibility.cjs";
2
+ import { AgentProfile, DomainMcpAllowlist, PluginEntry } from "../config/index.cjs";
3
+
4
+ //#region src/services/compatibilityContext.d.ts
5
+ interface CompatibilityContext {
6
+ options: CompatibilityOptions;
7
+ environment: NodeJS.ProcessEnv;
8
+ plugins: PluginEntry[];
9
+ profile?: AgentProfile;
10
+ personaFile?: string;
11
+ mcpAllowlist?: DomainMcpAllowlist;
12
+ mcpConfigPath: string;
13
+ proxyConfigPath: string;
14
+ selectedLayers: string[];
15
+ hookGroups: string[];
16
+ sharedSkills: boolean;
17
+ cleanup(): Promise<void>;
18
+ }
19
+ /** Resolves only the resources shared by Pi and compatibility frontends. */
20
+ declare function buildCompatibilityContext(options: CompatibilityOptions): Promise<CompatibilityContext>;
21
+ //#endregion
22
+ export { CompatibilityContext, buildCompatibilityContext };
23
+ //# sourceMappingURL=compatibilityContext.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibilityContext.d.cts","names":[],"sources":["../../src/services/compatibilityContext.ts"],"mappings":";;;;UAqCiB,oBAAA;EACf,OAAA,EAAS,oBAAA;EACT,WAAA,EAAa,MAAA,CAAO,UAAA;EACpB,OAAA,EAAS,WAAA;EACT,OAAA,GAAU,YAAA;EACV,WAAA;EACA,YAAA,GAAe,kBAAA;EACf,aAAA;EACA,eAAA;EACA,cAAA;EACA,UAAA;EACA,YAAA;EACA,OAAA,IAAW,OAAA;AAAA;;iBAwCS,yBAAA,CAA0B,OAAA,EAAS,oBAAA,GAAuB,OAAA,CAAQ,oBAAA"}
@@ -0,0 +1,23 @@
1
+ import { CompatibilityOptions } from "../interfaces/compatibility.mjs";
2
+ import { AgentProfile, DomainMcpAllowlist, PluginEntry } from "../config/index.mjs";
3
+
4
+ //#region src/services/compatibilityContext.d.ts
5
+ interface CompatibilityContext {
6
+ options: CompatibilityOptions;
7
+ environment: NodeJS.ProcessEnv;
8
+ plugins: PluginEntry[];
9
+ profile?: AgentProfile;
10
+ personaFile?: string;
11
+ mcpAllowlist?: DomainMcpAllowlist;
12
+ mcpConfigPath: string;
13
+ proxyConfigPath: string;
14
+ selectedLayers: string[];
15
+ hookGroups: string[];
16
+ sharedSkills: boolean;
17
+ cleanup(): Promise<void>;
18
+ }
19
+ /** Resolves only the resources shared by Pi and compatibility frontends. */
20
+ declare function buildCompatibilityContext(options: CompatibilityOptions): Promise<CompatibilityContext>;
21
+ //#endregion
22
+ export { CompatibilityContext, buildCompatibilityContext };
23
+ //# sourceMappingURL=compatibilityContext.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibilityContext.d.mts","names":[],"sources":["../../src/services/compatibilityContext.ts"],"mappings":";;;;UAqCiB,oBAAA;EACf,OAAA,EAAS,oBAAA;EACT,WAAA,EAAa,MAAA,CAAO,UAAA;EACpB,OAAA,EAAS,WAAA;EACT,OAAA,GAAU,YAAA;EACV,WAAA;EACA,YAAA,GAAe,kBAAA;EACf,aAAA;EACA,eAAA;EACA,cAAA;EACA,UAAA;EACA,YAAA;EACA,OAAA,IAAW,OAAA;AAAA;;iBAwCS,yBAAA,CAA0B,OAAA,EAAS,oBAAA,GAAuB,OAAA,CAAQ,oBAAA"}
@@ -0,0 +1,2 @@
1
+ import{projectHarnessEnvironment as e}from"../config/harnessState.mjs";import{applyProfileEnvironment as t,buildPersonaPrompt as n,layerHookGroups as r,loadMajorModesConfig as i,resolveLayers as a,resolvePluginEntries as o,resolveProfile as s,resolveSharedSkills as c}from"../config/index.mjs";import{PROXY_SERVER_NAME as l,applyMcpAllowlist as u,resolveMcpAllowlist as d}from"./mcpFilter.mjs";import{mergeMcpConfigs as f}from"./resourceCollector.mjs";import p from"node:path";import m from"node:fs";import h from"node:os";const g=`.mcp.json`;function _(e,t){let n=[p.join(e,g)];for(let e of t){if(e.mcp===!1)continue;let t=p.join(e.directory,g);m.existsSync(t)&&n.push(t)}return n}function v(e,t){let n=(e.mcpServers??{})[l],r=Array.isArray(n?.args)?n.args.map(String):[],i=r.indexOf(`--config`),a=i===-1?void 0:r[i+1];return a?p.resolve(t,a):p.join(t,`mcp-config.yaml`)}async function y(e,t,n,r){let i=await u(f(_(e,t)),n,e,r),a=p.join(r,`mcp.json`);return await m.promises.writeFile(a,`${JSON.stringify(i,null,2)}\n`,{mode:384}),{mcpConfigPath:a,proxyConfigPath:v(i,e)}}async function b(l){let u=i(l.repoRoot),f=a(u,l.majorMode),g=r(u,f),_=await m.promises.mkdtemp(p.join(h.tmpdir(),`doom-pi-compat-`));await m.promises.chmod(_,448);try{let r=l.profile?s(l.repoRoot,l.profile):void 0,i=o(l.repoRoot,l.domains,[]),a=d(l.repoRoot,l.domains),u=await y(l.repoRoot,i,a,_),h={...process.env};h.NX_DAEMON??=`false`;let v=t(h,r?.env??{}),b=r?.persona?n(r.personaRoot,r.persona):void 0,x;return b&&(x=p.join(_,`persona.md`),await m.promises.writeFile(x,`${b}\n`,{mode:384})),e({root:l.repoRoot,majorMode:l.majorMode,temporaryDirectory:_,domains:l.domains,layers:f,profile:r?.name,profileEnvironment:v,hookGroups:g,mcpConfigPath:u.mcpConfigPath,personaFile:x,additionalDirectories:l.additionalDirectories,hooks:!0},h),h.DOOMPI_ADDITIONAL_DIRS=l.additionalDirectories.join(p.delimiter),h.CLAUDE_PROJECT_DIR=l.repoRoot,h.CODEX_REPO_ROOT=l.repoRoot,h.AGY_REPO_ROOT=l.repoRoot,h.ORIGINAL_REPO_PATH||=l.repoRoot,{options:l,environment:h,plugins:i,profile:r,personaFile:x,mcpAllowlist:a,mcpConfigPath:u.mcpConfigPath,proxyConfigPath:u.proxyConfigPath,selectedLayers:f,hookGroups:g,sharedSkills:c(l.repoRoot,l.domains),cleanup:()=>m.promises.rm(_,{recursive:!0,force:!0})}}catch(e){throw await m.promises.rm(_,{recursive:!0,force:!0}),e}}export{b as buildCompatibilityContext};
2
+ //# sourceMappingURL=compatibilityContext.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibilityContext.mjs","names":[],"sources":["../../src/services/compatibilityContext.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport {\n applyProfileEnvironment,\n buildPersonaPrompt,\n layerHookGroups,\n loadMajorModesConfig,\n resolveLayers,\n resolvePluginEntries,\n resolveProfile,\n resolveSharedSkills,\n projectHarnessEnvironment,\n type AgentProfile,\n type DomainMcpAllowlist,\n type PluginEntry,\n} from '../config/index.ts';\nimport type { CompatibilityOptions } from '../interfaces/index.ts';\nimport { PROXY_SERVER_NAME, applyMcpAllowlist, resolveMcpAllowlist } from './mcpFilter.ts';\nimport { mergeMcpConfigs } from './resourceCollector.ts';\n\ntype JsonObject = Record<string, unknown>;\n\nconst MCP_CONFIG_FILENAME = '.mcp.json';\nconst GENERATED_MCP_CONFIG_FILENAME = 'mcp.json';\nconst PROXY_CONFIG_FILENAME = 'mcp-config.yaml';\nconst PERSONA_FILENAME = 'persona.md';\nconst PRIVATE_FILE_MODE = 0o600;\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst CONFIG_OPTION = '--config';\nconst TEMPORARY_DIRECTORY_PREFIX = 'doom-pi-compat-';\nconst ADDITIONAL_DIRS_ENV = 'DOOMPI_ADDITIONAL_DIRS';\nconst CLAUDE_PROJECT_DIR_ENV = 'CLAUDE_PROJECT_DIR';\nconst CODEX_REPO_ROOT_ENV = 'CODEX_REPO_ROOT';\nconst AGY_REPO_ROOT_ENV = 'AGY_REPO_ROOT';\nconst ORIGINAL_REPO_PATH_ENV = 'ORIGINAL_REPO_PATH';\n\nexport interface CompatibilityContext {\n options: CompatibilityOptions;\n environment: NodeJS.ProcessEnv;\n plugins: PluginEntry[];\n profile?: AgentProfile;\n personaFile?: string;\n mcpAllowlist?: DomainMcpAllowlist;\n mcpConfigPath: string;\n proxyConfigPath: string;\n selectedLayers: string[];\n hookGroups: string[];\n sharedSkills: boolean;\n cleanup(): Promise<void>;\n}\n\nfunction pluginMcpPaths(repoRoot: string, plugins: PluginEntry[]): string[] {\n const paths = [path.join(repoRoot, MCP_CONFIG_FILENAME)];\n for (const plugin of plugins) {\n if (plugin.mcp === false) continue;\n const configPath = path.join(plugin.directory, MCP_CONFIG_FILENAME);\n if (fs.existsSync(configPath)) paths.push(configPath);\n }\n return paths;\n}\n\nfunction resolveProxyConfigPath(config: JsonObject, repoRoot: string): string {\n const servers = (config.mcpServers ?? {}) as Record<string, JsonObject>;\n const proxy = servers[PROXY_SERVER_NAME];\n const args = Array.isArray(proxy?.args) ? proxy.args.map(String) : [];\n const configIndex = args.indexOf(CONFIG_OPTION);\n const selected = configIndex === -1 ? undefined : args[configIndex + 1];\n return selected ? path.resolve(repoRoot, selected) : path.join(repoRoot, PROXY_CONFIG_FILENAME);\n}\n\nasync function writeCompatibilityMcpConfig(\n repoRoot: string,\n plugins: PluginEntry[],\n allowlist: DomainMcpAllowlist | undefined,\n temporaryDirectory: string,\n): Promise<{ mcpConfigPath: string; proxyConfigPath: string }> {\n const config = await applyMcpAllowlist(\n mergeMcpConfigs(pluginMcpPaths(repoRoot, plugins)),\n allowlist,\n repoRoot,\n temporaryDirectory,\n );\n const mcpConfigPath = path.join(temporaryDirectory, GENERATED_MCP_CONFIG_FILENAME);\n await fs.promises.writeFile(mcpConfigPath, `${JSON.stringify(config, null, 2)}\\n`, { mode: PRIVATE_FILE_MODE });\n return { mcpConfigPath, proxyConfigPath: resolveProxyConfigPath(config, repoRoot) };\n}\n\n/** Resolves only the resources shared by Pi and compatibility frontends. */\nexport async function buildCompatibilityContext(options: CompatibilityOptions): Promise<CompatibilityContext> {\n const majorModesConfig = loadMajorModesConfig(options.repoRoot);\n const selectedLayers = resolveLayers(majorModesConfig, options.majorMode);\n const hookGroups = layerHookGroups(majorModesConfig, selectedLayers);\n const temporaryDirectory = await fs.promises.mkdtemp(path.join(os.tmpdir(), TEMPORARY_DIRECTORY_PREFIX));\n await fs.promises.chmod(temporaryDirectory, PRIVATE_DIRECTORY_MODE);\n\n try {\n const profile = options.profile ? resolveProfile(options.repoRoot, options.profile) : undefined;\n const plugins = resolvePluginEntries(options.repoRoot, options.domains, []);\n const mcpAllowlist = resolveMcpAllowlist(options.repoRoot, options.domains);\n const mcp = await writeCompatibilityMcpConfig(options.repoRoot, plugins, mcpAllowlist, temporaryDirectory);\n const environment = { ...process.env };\n environment.NX_DAEMON ??= 'false';\n const profileEnvironment = applyProfileEnvironment(environment, profile?.env ?? {});\n const personaPrompt = profile?.persona ? buildPersonaPrompt(profile.personaRoot, profile.persona) : undefined;\n let personaFile: string | undefined;\n\n if (personaPrompt) {\n personaFile = path.join(temporaryDirectory, PERSONA_FILENAME);\n await fs.promises.writeFile(personaFile, `${personaPrompt}\\n`, { mode: PRIVATE_FILE_MODE });\n }\n\n // Projection only, with no state file: Claude, Codex and Antigravity read\n // an environment and never the store.\n projectHarnessEnvironment(\n {\n root: options.repoRoot,\n majorMode: options.majorMode,\n temporaryDirectory,\n domains: options.domains,\n layers: selectedLayers,\n profile: profile?.name,\n profileEnvironment,\n hookGroups,\n mcpConfigPath: mcp.mcpConfigPath,\n personaFile,\n additionalDirectories: options.additionalDirectories,\n hooks: true,\n },\n environment,\n );\n environment[ADDITIONAL_DIRS_ENV] = options.additionalDirectories.join(path.delimiter);\n environment[CLAUDE_PROJECT_DIR_ENV] = options.repoRoot;\n environment[CODEX_REPO_ROOT_ENV] = options.repoRoot;\n environment[AGY_REPO_ROOT_ENV] = options.repoRoot;\n environment[ORIGINAL_REPO_PATH_ENV] ||= options.repoRoot;\n\n return {\n options,\n environment,\n plugins,\n profile,\n personaFile,\n mcpAllowlist,\n mcpConfigPath: mcp.mcpConfigPath,\n proxyConfigPath: mcp.proxyConfigPath,\n selectedLayers,\n hookGroups,\n sharedSkills: resolveSharedSkills(options.repoRoot, options.domains),\n cleanup: () => fs.promises.rm(temporaryDirectory, { recursive: true, force: true }),\n };\n } catch (error) {\n await fs.promises.rm(temporaryDirectory, { recursive: true, force: true });\n throw error;\n }\n}\n"],"mappings":"2gBAuBA,MAAM,EAAsB,YA6B5B,SAAS,EAAe,EAAkB,EAAkC,CAC1E,IAAM,EAAQ,CAAC,EAAK,KAAK,EAAU,EAAoB,CAAC,CACxD,IAAK,IAAM,KAAU,EAAS,CAC5B,GAAI,EAAO,MAAQ,GAAO,SAC1B,IAAM,EAAa,EAAK,KAAK,EAAO,UAAW,EAAoB,CAC/D,EAAG,WAAW,EAAW,EAAE,EAAM,KAAK,EAAW,CAEvD,OAAO,EAGT,SAAS,EAAuB,EAAoB,EAA0B,CAE5E,IAAM,GADW,EAAO,YAAc,EAAE,EAClB,GAChB,EAAO,MAAM,QAAQ,GAAO,KAAK,CAAG,EAAM,KAAK,IAAI,OAAO,CAAG,EAAE,CAC/D,EAAc,EAAK,QAAQ,WAAc,CACzC,EAAW,IAAgB,GAAK,IAAA,GAAY,EAAK,EAAc,GACrE,OAAO,EAAW,EAAK,QAAQ,EAAU,EAAS,CAAG,EAAK,KAAK,EAAU,kBAAsB,CAGjG,eAAe,EACb,EACA,EACA,EACA,EAC6D,CAC7D,IAAM,EAAS,MAAM,EACnB,EAAgB,EAAe,EAAU,EAAQ,CAAC,CAClD,EACA,EACA,EACD,CACK,EAAgB,EAAK,KAAK,EAAoB,WAA8B,CAElF,OADA,MAAM,EAAG,SAAS,UAAU,EAAe,GAAG,KAAK,UAAU,EAAQ,KAAM,EAAE,CAAC,IAAK,CAAE,KAAM,IAAmB,CAAC,CACxG,CAAE,gBAAe,gBAAiB,EAAuB,EAAQ,EAAS,CAAE,CAIrF,eAAsB,EAA0B,EAA8D,CAC5G,IAAM,EAAmB,EAAqB,EAAQ,SAAS,CACzD,EAAiB,EAAc,EAAkB,EAAQ,UAAU,CACnE,EAAa,EAAgB,EAAkB,EAAe,CAC9D,EAAqB,MAAM,EAAG,SAAS,QAAQ,EAAK,KAAK,EAAG,QAAQ,CAAE,kBAA2B,CAAC,CACxG,MAAM,EAAG,SAAS,MAAM,EAAoB,IAAuB,CAEnE,GAAI,CACF,IAAM,EAAU,EAAQ,QAAU,EAAe,EAAQ,SAAU,EAAQ,QAAQ,CAAG,IAAA,GAChF,EAAU,EAAqB,EAAQ,SAAU,EAAQ,QAAS,EAAE,CAAC,CACrE,EAAe,EAAoB,EAAQ,SAAU,EAAQ,QAAQ,CACrE,EAAM,MAAM,EAA4B,EAAQ,SAAU,EAAS,EAAc,EAAmB,CACpG,EAAc,CAAE,GAAG,QAAQ,IAAK,CACtC,EAAY,YAAc,QAC1B,IAAM,EAAqB,EAAwB,EAAa,GAAS,KAAO,EAAE,CAAC,CAC7E,EAAgB,GAAS,QAAU,EAAmB,EAAQ,YAAa,EAAQ,QAAQ,CAAG,IAAA,GAChG,EAgCJ,OA9BI,IACF,EAAc,EAAK,KAAK,EAAoB,aAAiB,CAC7D,MAAM,EAAG,SAAS,UAAU,EAAa,GAAG,EAAc,IAAK,CAAE,KAAM,IAAmB,CAAC,EAK7F,EACE,CACE,KAAM,EAAQ,SACd,UAAW,EAAQ,UACnB,qBACA,QAAS,EAAQ,QACjB,OAAQ,EACR,QAAS,GAAS,KAClB,qBACA,aACA,cAAe,EAAI,cACnB,cACA,sBAAuB,EAAQ,sBAC/B,MAAO,GACR,CACD,EACD,CACD,EAAY,uBAAuB,EAAQ,sBAAsB,KAAK,EAAK,UAAU,CACrF,EAAY,mBAA0B,EAAQ,SAC9C,EAAY,gBAAuB,EAAQ,SAC3C,EAAY,cAAqB,EAAQ,SACzC,EAAY,qBAA4B,EAAQ,SAEzC,CACL,UACA,cACA,UACA,UACA,cACA,eACA,cAAe,EAAI,cACnB,gBAAiB,EAAI,gBACrB,iBACA,aACA,aAAc,EAAoB,EAAQ,SAAU,EAAQ,QAAQ,CACpE,YAAe,EAAG,SAAS,GAAG,EAAoB,CAAE,UAAW,GAAM,MAAO,GAAM,CAAC,CACpF,OACM,EAAO,CAEd,MADA,MAAM,EAAG,SAAS,GAAG,EAAoB,CAAE,UAAW,GAAM,MAAO,GAAM,CAAC,CACpE"}
@@ -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(`../utils/repository.cjs`);require(`../utils/index.cjs`);const r=require(`./resourceCollector.cjs`),i=require(`./extensionAssembler.cjs`),a=require(`./harnessContext.cjs`),o=require(`./matrixSwitcher.cjs`),s=require(`./syncState.cjs`);let c=require(`node:path`);c=e.__toESM(c,1);let l=require(`node:fs`);l=e.__toESM(l,1);let u=require(`@agimon-ai/doompi-config/profiles`),d=require(`@agimon-ai/doompi-config/majorModes`),f=require(`node:url`),p=require(`@earendil-works/pi-coding-agent`),m=require(`@agimon-ai/doompi-config`);const h=`DOOMPI_COMPOSED`,g=`DOOMPI_MUTE`,_=`doompi is configured for Pi but this repository was never synced. Run doompi sync.`,v={majorMode:`major-mode`,domains:`domains`,profile:`profile`,mute:`mute`},y=`layer`;function b(e){return e instanceof Error?e.message:String(e)}function x(e=process.env){return e[h]===`1`}function S(e){try{return l.default.realpathSync(e)}catch{return c.default.resolve(e)}}function C(e,t){let{extensions:n}=(0,p.parseArgs)(e);if(!n||n.length===0)return!1;let r=new Set(Object.values(t).map(S));return n.some(e=>r.has(S(e)))}function w(e){if(l.default.existsSync(s.syncStatePath(e)))return e;try{let t=n.findRepositoryRoot(e);return l.default.existsSync(s.syncStatePath(t))?t:void 0}catch{return}}async function T(e,n,r=process.env){let i=await k(n),a={...t.readHarnessState({...e.env,...r}),...e.fileState,temporaryDirectory:i};(0,m.createHarnessSession)(a,{directory:i,environment:r});for(let[e,t]of Object.entries(a.profileEnvironment))r[e]===void 0&&(r[e]=t);return a}function E(e){let{unknownFlags:t}=(0,p.parseArgs)(e),n=e=>{let n=t.get(e);return typeof n==`string`&&n.trim()?n.trim():void 0},r=n(v.domains);return{majorMode:n(v.majorMode),domains:r?.split(`,`).map(e=>e.trim()).filter(Boolean),profile:n(v.profile),mute:t.get(v.mute)!==void 0,removedLayer:t.get(y)!==void 0}}function D(e){e.registerFlag(v.majorMode,{type:`string`,description:`Named major mode from .doom/modes.yaml`}),e.registerFlag(v.domains,{type:`string`,description:`Comma-separated content domains`}),e.registerFlag(v.profile,{type:`string`,description:`Persona and env from .doom/profiles.yaml`}),e.registerFlag(v.mute,{type:`boolean`,description:`Disable the notification extension`})}async function O(e,n,r,i){if(e.removedLayer&&i.push(`--${y} was replaced by --${v.majorMode}`),e.majorMode)try{o.applyMajorMode(n,e.majorMode,t.getHarnessState())}catch(t){i.push(`--${v.majorMode} ${e.majorMode}: ${b(t)}`)}if(e.domains&&e.domains.length>0)try{await o.applyDomains(e.domains,t.getHarnessState())}catch(t){i.push(`--domains ${e.domains.join(`,`)}: ${b(t)}`)}if(e.profile)try{await o.applyProfile((0,u.resolveProfile)(r,e.profile),t.getHarnessState())}catch(t){i.push(`--profile ${e.profile}: ${b(t)}`)}}async function k(e,n=process.env){let r=s.runDirectory(e);return await l.default.promises.mkdir(r,{mode:448,recursive:!0}),t.updateHarnessState({temporaryDirectory:r},n),r}async function A(e){await l.default.promises.rm(s.runDirectory(e),{recursive:!0,force:!0})}async function j(e,n=t.getHarnessState(),a=process.env){let o=n.root??e.root,l=s.createMapResolvers(e.resolved,e.compiled),u=n.mcp?l.optionalPackageEntry(i.CONTEXT_PACKAGES.mcp):void 0,f={agents:n.agents,autoStop:!1,preset:e.selection.preset,mcpEntry:u,personaEntry:l.ownEntry(i.PERSONA_ENTRY),workflowExtension:r.selectWorkflowExtensionForProcess(l.optionalPackageEntry(i.CONTEXT_PACKAGES.workflow),l.optionalPackageEntry(i.CONTEXT_PACKAGES.dispatcherWorkflow),a),layers:[...n.layers],majorModesConfig:(0,d.loadMajorModesConfig)(o),resolvers:l};return t.updateHarnessState({childExtensions:i.assembleChildExtensions({...f,agents:!1,mute:!0})},a),n.agents&&(a.PI_SUBAGENT_EXTRA_AGENT_DIRS=n.agentDirectories.join(c.default.delimiter),a.PI_SUBAGENT_EXTRA_SKILL_DIRS=n.skillDirectories.join(c.default.delimiter)),[...i.assembleExtensions({...f,mute:a[g]===`1`})].reverse()}async function M(e,t,n){let r=[];for(let i of t)try{let t=await import((0,f.pathToFileURL)(i).href);if(typeof t.default!=`function`){n.push(`${i}: does not export an extension factory`);continue}await t.default(e),r.push(i)}catch(e){n.push(`${i}: ${b(e)}`)}return r}async function N(e,t={}){let n=t.environment??process.env,r=[],i=w(t.cwd??process.cwd());if(!i)return{problems:[_],stale:!1,loaded:[]};let o;try{o=s.readSyncState(i)}catch(e){return{problems:[b(e)],stale:!1,loaded:[]}}if(!o)return{problems:[_],stale:!1,loaded:[]};let c=t.argv??process.argv.slice(2);if(C(c,o.resolved))return{problems:[],stale:!1,loaded:[]};if(a.configurePreset({preset:o.selection.preset,piArgs:[]},n),!x(n)){n[h]=`1`,await T(o,i,n);let e=E(c);e.mute&&(n[g]=`1`),await O(e,(0,d.loadMajorModesConfig)(i),i,r)}let l;try{l=await j(o,(0,m.loadHarnessState)(n).state,n)}catch(e){return{problems:[...r,b(e)],stale:!1,loaded:[]}}let u=await M(e,l,r);return{problems:r,stale:s.computeInputsHash(i,o.selection)!==o.inputsHash,loaded:u}}exports.COMPOSED_ENV=h,exports.DOOM_FLAGS=v,exports.MUTE_ENV=g,exports.REMOVED_LAYER_FLAG=y,exports.alreadyComposed=x,exports.applyStartupFlags=O,exports.cleanupRunDirectory=A,exports.composeDoomSession=N,exports.composeLoadOrder=j,exports.extensionsProvidedExternally=C,exports.findSyncedRoot=w,exports.loadComposedExtensions=M,exports.prepareRunDirectory=k,exports.readStartupFlags=E,exports.registerDoomFlags=D,exports.startSyncedSession=T;
2
+ //# sourceMappingURL=composer.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer.cjs","names":["fs","path","syncStatePath","findRepositoryRoot","readHarnessState","getHarnessState","applyDomains","applyProfile","runDirectory","createMapResolvers","CONTEXT_PACKAGES","PERSONA_ENTRY","selectWorkflowExtensionForProcess","assembleChildExtensions","assembleExtensions","readSyncState","computeInputsHash"],"sources":["../../src/services/composer.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { loadMajorModesConfig, type MajorModesConfig } from '@agimon-ai/doompi-config/majorModes';\nimport { resolveProfile } from '@agimon-ai/doompi-config/profiles';\nimport { parseArgs, type ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport {\n createHarnessSession,\n getHarnessState,\n loadHarnessState,\n readHarnessState,\n updateHarnessState,\n type HarnessState,\n} from '../config/harnessState.ts';\nimport type { HarnessPreset } from '../interfaces/index.ts';\nimport { findRepositoryRoot } from '../utils/index.ts';\nimport { CONTEXT_PACKAGES, PERSONA_ENTRY, assembleChildExtensions, assembleExtensions } from './extensionAssembler.ts';\nimport { configurePreset } from './harnessContext.ts';\nimport { applyDomains, applyMajorMode, applyProfile } from './matrixSwitcher.ts';\nimport { selectWorkflowExtensionForProcess } from './resourceCollector.ts';\nimport {\n computeInputsHash,\n createMapResolvers,\n readSyncState,\n runDirectory,\n syncStatePath,\n type SyncState,\n} from './syncState.ts';\n\n/**\n * The runtime half of `doom-pi sync`.\n *\n * Pi's own config carries a single entry, the doom-pi extension, and this is\n * what that entry runs: hydrate the harness environment, apply the startup\n * flags, then load the extension set the matrix selects. It runs again on every\n * `/reload`, which is what lets `/major-mode` swap the set without a restart,\n * since Pi rebuilds its extension runner from whatever a reload produced.\n */\n\n/** Marks a process whose extensions this module composed. */\nexport const COMPOSED_ENV = 'DOOMPI_COMPOSED';\n/** Survives reload, where argv is re-read but the startup flags must not be. */\nexport const MUTE_ENV = 'DOOMPI_MUTE';\nconst ENABLED_FLAG = '1';\nconst SUBAGENT_AGENT_DIRS_ENV = 'PI_SUBAGENT_EXTRA_AGENT_DIRS';\nconst SUBAGENT_SKILL_DIRS_ENV = 'PI_SUBAGENT_EXTRA_SKILL_DIRS';\nconst DOMAIN_SEPARATOR = ',';\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst NOT_SYNCED = 'doompi is configured for Pi but this repository was never synced. Run doompi sync.';\n\nexport const DOOM_FLAGS = {\n majorMode: 'major-mode',\n domains: 'domains',\n profile: 'profile',\n mute: 'mute',\n} as const;\n\n/** Removed flag, reported rather than ignored when a synced session passes it. */\nexport const REMOVED_LAYER_FLAG = 'layer';\n\nexport interface StartupFlags {\n majorMode?: string;\n domains?: string[];\n profile?: string;\n mute: boolean;\n /** True when the caller passed the removed `--layer` flag. */\n removedLayer: boolean;\n}\n\nexport interface ComposeOutcome {\n /** Everything that went wrong, reported once the session can show messages. */\n problems: string[];\n /** Config changed since the last sync, which is a prompt to re-sync. */\n stale: boolean;\n loaded: string[];\n}\n\nfunction message(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/** True when this process already applied the command line, so a reload does not. */\nexport function alreadyComposed(environment: NodeJS.ProcessEnv = process.env): boolean {\n return environment[COMPOSED_ENV] === ENABLED_FLAG;\n}\n\nfunction realPath(target: string): string {\n try {\n return fs.realpathSync(target);\n } catch {\n return path.resolve(target);\n }\n}\n\n/**\n * True when this process was handed the doom extension set on the command line.\n *\n * The launcher and detached Doom Team children both pass the composed list as\n * `--extension` arguments, and Pi merges those with whatever project settings\n * declare. Composing again here would load every extension twice, which Pi\n * reports as each tool and flag conflicting with itself.\n *\n * Matching against the synced paths rather than the mere presence of\n * `--extension` keeps an unrelated one-off, `pi -e ./debug.ts`, from silently\n * costing the user their whole setup.\n */\nexport function extensionsProvidedExternally(argv: string[], resolved: Record<string, string>): boolean {\n const { extensions } = parseArgs(argv);\n if (!extensions || extensions.length === 0) return false;\n const composed = new Set(Object.values(resolved).map(realPath));\n return extensions.some((entry) => composed.has(realPath(entry)));\n}\n\n/**\n * Finds the repository whose synced state applies to this session.\n *\n * Pi only reads `.pi/settings.json` from its own working directory, so that is\n * the first place to look; walking up covers a session started in a\n * subdirectory with the extension configured globally.\n */\nexport function findSyncedRoot(cwd: string): string | undefined {\n if (fs.existsSync(syncStatePath(cwd))) return cwd;\n try {\n const root = findRepositoryRoot(cwd);\n return fs.existsSync(syncStatePath(root)) ? root : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Opens this process's session from what sync pinned.\n *\n * The synced record is decoded underneath the live environment, so an inherited\n * value still wins: a launcher run, a nested session, or a CI override is more\n * specific than anything sync wrote. The result becomes the session's state\n * file, which is the authority from here on; the environment it publishes is\n * for the bash hooks and the packages that can only read one.\n */\nexport async function startSyncedSession(\n state: SyncState,\n repoRoot: string,\n environment: NodeJS.ProcessEnv = process.env,\n): Promise<HarnessState> {\n const directory = await prepareRunDirectory(repoRoot);\n const harness: HarnessState = {\n ...readHarnessState({ ...state.env, ...environment }),\n // Recorded separately because no variable carries them.\n ...state.fileState,\n temporaryDirectory: directory,\n };\n createHarnessSession(harness, { directory, environment });\n // The profile's own defaults, which the launcher applies at spawn. They are\n // recorded as a map rather than as variables so /profile can tell which ones\n // it owns when it swaps them out later.\n for (const [key, value] of Object.entries(harness.profileEnvironment)) {\n if (environment[key] === undefined) environment[key] = value;\n }\n return harness;\n}\n\n/**\n * Reads the doom flags off the command line.\n *\n * Pi collects unrecognized flags for extensions but hands their values back\n * only after every extension has loaded, which is too late to decide what to\n * load. Parsing argv with Pi's own parser keeps the value rules identical.\n */\nexport function readStartupFlags(argv: string[]): StartupFlags {\n const { unknownFlags } = parseArgs(argv);\n const text = (name: string): string | undefined => {\n const value = unknownFlags.get(name);\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n };\n const domains = text(DOOM_FLAGS.domains);\n return {\n majorMode: text(DOOM_FLAGS.majorMode),\n domains: domains\n ?.split(DOMAIN_SEPARATOR)\n .map((name) => name.trim())\n .filter(Boolean),\n profile: text(DOOM_FLAGS.profile),\n mute: unknownFlags.get(DOOM_FLAGS.mute) !== undefined,\n removedLayer: unknownFlags.get(REMOVED_LAYER_FLAG) !== undefined,\n };\n}\n\n/** Registers the flags so Pi accepts them and lists them in `pi --help`. */\nexport function registerDoomFlags(pi: Pick<ExtensionAPI, 'registerFlag'>): void {\n pi.registerFlag(DOOM_FLAGS.majorMode, {\n type: 'string',\n description: 'Named major mode from .doom/modes.yaml',\n });\n pi.registerFlag(DOOM_FLAGS.domains, { type: 'string', description: 'Comma-separated content domains' });\n pi.registerFlag(DOOM_FLAGS.profile, { type: 'string', description: 'Persona and env from .doom/profiles.yaml' });\n pi.registerFlag(DOOM_FLAGS.mute, { type: 'boolean', description: 'Disable the notification extension' });\n}\n\n/**\n * Applies the startup flags through the same switchers the slash commands use.\n *\n * A bad value is collected rather than thrown: a factory that throws takes the\n * whole doom setup down with it, which is far worse than one unapplied flag.\n */\nexport async function applyStartupFlags(\n flags: StartupFlags,\n majorModesConfig: MajorModesConfig,\n repoRoot: string,\n problems: string[],\n): Promise<void> {\n // Reported rather than ignored: Pi hands unrecognized flags to extensions, so\n // a stale `--layer dev` would otherwise start a session on the wrong mode\n // without saying anything.\n if (flags.removedLayer) problems.push(`--${REMOVED_LAYER_FLAG} was replaced by --${DOOM_FLAGS.majorMode}`);\n if (flags.majorMode) {\n try {\n applyMajorMode(majorModesConfig, flags.majorMode, getHarnessState());\n } catch (error) {\n problems.push(`--${DOOM_FLAGS.majorMode} ${flags.majorMode}: ${message(error)}`);\n }\n }\n if (flags.domains && flags.domains.length > 0) {\n try {\n await applyDomains(flags.domains, getHarnessState());\n } catch (error) {\n problems.push(`--domains ${flags.domains.join(DOMAIN_SEPARATOR)}: ${message(error)}`);\n }\n }\n if (flags.profile) {\n try {\n await applyProfile(resolveProfile(repoRoot, flags.profile), getHarnessState());\n } catch (error) {\n problems.push(`--profile ${flags.profile}: ${message(error)}`);\n }\n }\n}\n\n/**\n * Points harness state at a per-process directory before anything writes there.\n *\n * The synced directory is a baseline that every session reads; live switches\n * materialize into this one instead, so a second session in the same repository\n * cannot overwrite what the first is using.\n */\nexport async function prepareRunDirectory(\n repoRoot: string,\n environment: NodeJS.ProcessEnv = process.env,\n): Promise<string> {\n const directory = runDirectory(repoRoot);\n await fs.promises.mkdir(directory, { mode: PRIVATE_DIRECTORY_MODE, recursive: true });\n // Through the store rather than the environment: the state file is the\n // authority, and a switcher reading a stale directory would write a live\n // session's resources into the wrong place.\n updateHarnessState({ temporaryDirectory: directory }, environment);\n return directory;\n}\n\n/** Removes this session's scratch directory. */\nexport async function cleanupRunDirectory(repoRoot: string): Promise<void> {\n await fs.promises.rm(runDirectory(repoRoot), { recursive: true, force: true });\n}\n\n/**\n * Builds the ordered list of extensions to load for the current state.\n *\n * Returns them in Pi load order. `assembleExtensions` produces the order the\n * launcher passes to Pi, where the last element becomes the first `--extension`\n * argument, so reversing here keeps that rule stated in exactly one place.\n */\nexport async function composeLoadOrder(\n state: SyncState,\n harness: HarnessState = getHarnessState(),\n environment: NodeJS.ProcessEnv = process.env,\n): Promise<string[]> {\n const repoRoot = harness.root ?? state.root;\n const resolvers = createMapResolvers(state.resolved, state.compiled);\n // Resolved from the sync map rather than generated: doom-mcp reads the\n // repository and plugin layers itself, and the environment the launcher wrote\n // already tells it which plugins and allowlist this session selected.\n const mcpEntry = harness.mcp ? resolvers.optionalPackageEntry(CONTEXT_PACKAGES.mcp) : undefined;\n const context = {\n agents: harness.agents,\n // Exiting when the agent settles is a launcher decision with no synced\n // equivalent: a session started by hand is meant to stay open.\n autoStop: false,\n preset: state.selection.preset,\n mcpEntry,\n personaEntry: resolvers.ownEntry(PERSONA_ENTRY),\n workflowExtension: selectWorkflowExtensionForProcess(\n resolvers.optionalPackageEntry(CONTEXT_PACKAGES.workflow),\n resolvers.optionalPackageEntry(CONTEXT_PACKAGES.dispatcherWorkflow),\n environment,\n ),\n layers: [...harness.layers],\n majorModesConfig: loadMajorModesConfig(repoRoot),\n resolvers,\n };\n\n // A state field, so it goes through the store: Doom Team reads it from the\n // environment the store publishes when it builds a child's spawn snapshot.\n updateHarnessState(\n { childExtensions: assembleChildExtensions({ ...context, agents: false, mute: true }) },\n environment,\n );\n if (harness.agents) {\n environment[SUBAGENT_AGENT_DIRS_ENV] = harness.agentDirectories.join(path.delimiter);\n environment[SUBAGENT_SKILL_DIRS_ENV] = harness.skillDirectories.join(path.delimiter);\n }\n return [...assembleExtensions({ ...context, mute: environment[MUTE_ENV] === ENABLED_FLAG })].reverse();\n}\n\n/**\n * Imports each extension and hands it the same Pi API this module received.\n *\n * Every Pi extension entry is a factory of the same shape, so one extension can\n * activate the rest. Failures are per entry: one unloadable module must not\n * cost the session everything after it in the order.\n */\nexport async function loadComposedExtensions(\n pi: ExtensionAPI,\n entries: string[],\n problems: string[],\n): Promise<string[]> {\n const loaded: string[] = [];\n for (const entry of entries) {\n try {\n const module = (await import(pathToFileURL(entry).href)) as { default?: unknown };\n if (typeof module.default !== 'function') {\n problems.push(`${entry}: does not export an extension factory`);\n continue;\n }\n await (module.default as (api: ExtensionAPI) => void | Promise<void>)(pi);\n loaded.push(entry);\n } catch (error) {\n problems.push(`${entry}: ${message(error)}`);\n }\n }\n return loaded;\n}\n\nexport interface ComposeOptions {\n cwd?: string;\n argv?: string[];\n environment?: NodeJS.ProcessEnv;\n}\n\n/**\n * Runs the whole synced startup for one Pi session.\n *\n * Never throws: whatever fails is reported through the outcome so the session\n * still starts and can say what is wrong.\n */\nexport async function composeDoomSession(pi: ExtensionAPI, options: ComposeOptions = {}): Promise<ComposeOutcome> {\n const environment = options.environment ?? process.env;\n const problems: string[] = [];\n const repoRoot = findSyncedRoot(options.cwd ?? process.cwd());\n if (!repoRoot) return { problems: [NOT_SYNCED], stale: false, loaded: [] };\n\n let state: SyncState | undefined;\n try {\n state = readSyncState(repoRoot);\n } catch (error) {\n return { problems: [message(error)], stale: false, loaded: [] };\n }\n if (!state) return { problems: [NOT_SYNCED], stale: false, loaded: [] };\n\n const argv = options.argv ?? process.argv.slice(2);\n // The launcher and Doom Team children compose the set themselves and pass it\n // in, so this entry has nothing left to do but stay out of the way.\n if (extensionsProvidedExternally(argv, state.resolved)) return { problems: [], stale: false, loaded: [] };\n\n configurePreset({ preset: state.selection.preset as HarnessPreset, piArgs: [] }, environment);\n\n // Only the first load opens a session. A reload finds the pointer this set\n // and reads the file back, which is what carries a live /domains or /profile\n // switch across the reload instead of resetting it to what sync pinned.\n if (!alreadyComposed(environment)) {\n environment[COMPOSED_ENV] = ENABLED_FLAG;\n await startSyncedSession(state, repoRoot, environment);\n const flags = readStartupFlags(argv);\n if (flags.mute) environment[MUTE_ENV] = ENABLED_FLAG;\n await applyStartupFlags(flags, loadMajorModesConfig(repoRoot), repoRoot, problems);\n }\n\n let entries: string[];\n try {\n // Read back through the store rather than from this process: the startup\n // flags may have switched the layer or the domains a moment ago, and the\n // environment being managed is not always this process's own.\n entries = await composeLoadOrder(state, loadHarnessState(environment).state, environment);\n } catch (error) {\n return { problems: [...problems, message(error)], stale: false, loaded: [] };\n }\n\n const loaded = await loadComposedExtensions(pi, entries, problems);\n return { problems, stale: computeInputsHash(repoRoot, state.selection) !== state.inputsHash, loaded };\n}\n"],"mappings":"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"}