@agimon-ai/doompi 0.0.1-alpha.2 → 0.0.1-alpha.21

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 (944) hide show
  1. package/README.md +437 -452
  2. package/assets/doompi-tui.png +0 -0
  3. package/dist/adapters/bootstrapClaim.cjs +2 -0
  4. package/dist/adapters/bootstrapClaim.cjs.map +1 -0
  5. package/dist/adapters/bootstrapClaim.mjs +2 -0
  6. package/dist/adapters/bootstrapClaim.mjs.map +1 -0
  7. package/dist/adapters/bootstrapLocator.cjs +2 -0
  8. package/dist/adapters/bootstrapLocator.cjs.map +1 -0
  9. package/dist/adapters/bootstrapLocator.d.cts +6 -0
  10. package/dist/adapters/bootstrapLocator.d.cts.map +1 -0
  11. package/dist/adapters/bootstrapLocator.d.mts +6 -0
  12. package/dist/adapters/bootstrapLocator.d.mts.map +1 -0
  13. package/dist/adapters/bootstrapLocator.mjs +2 -0
  14. package/dist/adapters/bootstrapLocator.mjs.map +1 -0
  15. package/dist/adapters/compatibility/antigravity.cjs +2 -0
  16. package/dist/{services → adapters}/compatibility/antigravity.cjs.map +1 -1
  17. package/dist/adapters/compatibility/antigravity.d.cts +11 -0
  18. package/dist/{services → adapters}/compatibility/antigravity.d.cts.map +1 -1
  19. package/dist/adapters/compatibility/antigravity.d.mts +11 -0
  20. package/dist/{services → adapters}/compatibility/antigravity.d.mts.map +1 -1
  21. package/dist/adapters/compatibility/antigravity.mjs +2 -0
  22. package/dist/{services → adapters}/compatibility/antigravity.mjs.map +1 -1
  23. package/dist/adapters/compatibility/codex.cjs +2 -0
  24. package/dist/{services → adapters}/compatibility/codex.cjs.map +1 -1
  25. package/dist/adapters/compatibility/codex.d.cts +19 -0
  26. package/dist/{services → adapters}/compatibility/codex.d.cts.map +1 -1
  27. package/dist/adapters/compatibility/codex.d.mts +19 -0
  28. package/dist/{services → adapters}/compatibility/codex.d.mts.map +1 -1
  29. package/dist/adapters/compatibility/codex.mjs +2 -0
  30. package/dist/{services → adapters}/compatibility/codex.mjs.map +1 -1
  31. package/dist/adapters/compatibility/index.cjs +2 -0
  32. package/dist/adapters/compatibility/index.cjs.map +1 -0
  33. package/dist/adapters/compatibility/index.d.cts +16 -0
  34. package/dist/{services → adapters}/compatibility/index.d.cts.map +1 -1
  35. package/dist/adapters/compatibility/index.d.mts +16 -0
  36. package/dist/{services → adapters}/compatibility/index.d.mts.map +1 -1
  37. package/dist/adapters/compatibility/index.mjs +2 -0
  38. package/dist/adapters/compatibility/index.mjs.map +1 -0
  39. package/dist/adapters/compatibility/process.cjs +2 -0
  40. package/dist/{services → adapters}/compatibility/process.cjs.map +1 -1
  41. package/dist/adapters/compatibility/process.d.cts +35 -0
  42. package/dist/{services → adapters}/compatibility/process.d.cts.map +1 -1
  43. package/dist/adapters/compatibility/process.d.mts +35 -0
  44. package/dist/{services → adapters}/compatibility/process.d.mts.map +1 -1
  45. package/dist/adapters/compatibility/process.mjs +2 -0
  46. package/dist/{services → adapters}/compatibility/process.mjs.map +1 -1
  47. package/dist/adapters/compatibility/shared.cjs +2 -0
  48. package/dist/{services → adapters}/compatibility/shared.cjs.map +1 -1
  49. package/dist/adapters/compatibility/shared.d.cts +33 -0
  50. package/dist/{services → adapters}/compatibility/shared.d.cts.map +1 -1
  51. package/dist/adapters/compatibility/shared.d.mts +33 -0
  52. package/dist/{services → adapters}/compatibility/shared.d.mts.map +1 -1
  53. package/dist/adapters/compatibility/shared.mjs +2 -0
  54. package/dist/{services → adapters}/compatibility/shared.mjs.map +1 -1
  55. package/dist/adapters/compatibilityContext.cjs +2 -0
  56. package/dist/adapters/compatibilityContext.cjs.map +1 -0
  57. package/dist/adapters/compatibilityContext.d.cts +23 -0
  58. package/dist/{services → adapters}/compatibilityContext.d.cts.map +1 -1
  59. package/dist/adapters/compatibilityContext.d.mts +23 -0
  60. package/dist/{services → adapters}/compatibilityContext.d.mts.map +1 -1
  61. package/dist/adapters/compatibilityContext.mjs +2 -0
  62. package/dist/adapters/compatibilityContext.mjs.map +1 -0
  63. package/dist/adapters/composer.cjs +2 -0
  64. package/dist/adapters/composer.cjs.map +1 -0
  65. package/dist/adapters/composer.d.cts +113 -0
  66. package/dist/adapters/composer.d.cts.map +1 -0
  67. package/dist/adapters/composer.d.mts +113 -0
  68. package/dist/adapters/composer.d.mts.map +1 -0
  69. package/dist/adapters/composer.mjs +2 -0
  70. package/dist/adapters/composer.mjs.map +1 -0
  71. package/dist/adapters/compositionState.cjs +2 -0
  72. package/dist/adapters/compositionState.cjs.map +1 -0
  73. package/dist/adapters/compositionState.d.cts +12 -0
  74. package/dist/adapters/compositionState.d.cts.map +1 -0
  75. package/dist/adapters/compositionState.d.mts +12 -0
  76. package/dist/adapters/compositionState.d.mts.map +1 -0
  77. package/dist/adapters/compositionState.mjs +2 -0
  78. package/dist/adapters/compositionState.mjs.map +1 -0
  79. package/dist/adapters/config/harnessState.cjs +2 -0
  80. package/dist/adapters/config/harnessState.cjs.map +1 -0
  81. package/dist/adapters/config/harnessState.d.cts +26 -0
  82. package/dist/adapters/config/harnessState.d.cts.map +1 -0
  83. package/dist/adapters/config/harnessState.d.mts +26 -0
  84. package/dist/adapters/config/harnessState.d.mts.map +1 -0
  85. package/dist/adapters/config/harnessState.mjs +2 -0
  86. package/dist/adapters/config/harnessState.mjs.map +1 -0
  87. package/dist/adapters/deferredSkills.cjs +12 -0
  88. package/dist/adapters/deferredSkills.cjs.map +1 -0
  89. package/dist/adapters/deferredSkills.mjs +12 -0
  90. package/dist/adapters/deferredSkills.mjs.map +1 -0
  91. package/dist/adapters/doomPackage.cjs +2 -0
  92. package/dist/adapters/doomPackage.cjs.map +1 -0
  93. package/dist/adapters/doomPackage.mjs +2 -0
  94. package/dist/adapters/doomPackage.mjs.map +1 -0
  95. package/dist/adapters/dpiRunner.cjs +3 -0
  96. package/dist/adapters/dpiRunner.cjs.map +1 -0
  97. package/dist/adapters/dpiRunner.mjs +3 -0
  98. package/dist/adapters/dpiRunner.mjs.map +1 -0
  99. package/dist/adapters/dpiSettings.cjs +2 -0
  100. package/dist/adapters/dpiSettings.cjs.map +1 -0
  101. package/dist/adapters/dpiSettings.mjs +2 -0
  102. package/dist/adapters/dpiSettings.mjs.map +1 -0
  103. package/dist/adapters/extensionCompiler.cjs +3 -0
  104. package/dist/adapters/extensionCompiler.cjs.map +1 -0
  105. package/dist/adapters/extensionCompiler.mjs +3 -0
  106. package/dist/adapters/extensionCompiler.mjs.map +1 -0
  107. package/dist/adapters/harnessContext.cjs +2 -0
  108. package/dist/adapters/harnessContext.cjs.map +1 -0
  109. package/dist/adapters/harnessContext.d.cts +61 -0
  110. package/dist/{services → adapters}/harnessContext.d.cts.map +1 -1
  111. package/dist/adapters/harnessContext.d.mts +61 -0
  112. package/dist/{services → adapters}/harnessContext.d.mts.map +1 -1
  113. package/dist/adapters/harnessContext.mjs +2 -0
  114. package/dist/adapters/harnessContext.mjs.map +1 -0
  115. package/dist/adapters/helpSkills.cjs +2 -0
  116. package/dist/adapters/helpSkills.cjs.map +1 -0
  117. package/dist/adapters/helpSkills.mjs +2 -0
  118. package/dist/adapters/helpSkills.mjs.map +1 -0
  119. package/dist/adapters/layerPackageInstaller.cjs +2 -0
  120. package/dist/adapters/layerPackageInstaller.cjs.map +1 -0
  121. package/dist/adapters/layerPackageInstaller.mjs +2 -0
  122. package/dist/adapters/layerPackageInstaller.mjs.map +1 -0
  123. package/dist/adapters/matrixSwitcher.cjs +2 -0
  124. package/dist/adapters/matrixSwitcher.cjs.map +1 -0
  125. package/dist/adapters/matrixSwitcher.d.cts +46 -0
  126. package/dist/{services → adapters}/matrixSwitcher.d.cts.map +1 -1
  127. package/dist/adapters/matrixSwitcher.d.mts +46 -0
  128. package/dist/{services → adapters}/matrixSwitcher.d.mts.map +1 -1
  129. package/dist/adapters/matrixSwitcher.mjs +2 -0
  130. package/dist/adapters/matrixSwitcher.mjs.map +1 -0
  131. package/dist/adapters/mcpFilter.cjs +3 -0
  132. package/dist/adapters/mcpFilter.cjs.map +1 -0
  133. package/dist/adapters/mcpFilter.d.cts +40 -0
  134. package/dist/adapters/mcpFilter.d.cts.map +1 -0
  135. package/dist/adapters/mcpFilter.d.mts +40 -0
  136. package/dist/adapters/mcpFilter.d.mts.map +1 -0
  137. package/dist/adapters/mcpFilter.mjs +3 -0
  138. package/dist/adapters/mcpFilter.mjs.map +1 -0
  139. package/dist/adapters/modules/moduleResolution.cjs +2 -0
  140. package/dist/adapters/modules/moduleResolution.cjs.map +1 -0
  141. package/dist/adapters/modules/moduleResolution.d.cts +69 -0
  142. package/dist/adapters/modules/moduleResolution.d.cts.map +1 -0
  143. package/dist/adapters/modules/moduleResolution.d.mts +69 -0
  144. package/dist/adapters/modules/moduleResolution.d.mts.map +1 -0
  145. package/dist/adapters/modules/moduleResolution.mjs +2 -0
  146. package/dist/adapters/modules/moduleResolution.mjs.map +1 -0
  147. package/dist/adapters/packageBootstrap.cjs +2 -0
  148. package/dist/adapters/packageBootstrap.cjs.map +1 -0
  149. package/dist/adapters/packageBootstrap.d.cts +8 -0
  150. package/dist/adapters/packageBootstrap.d.cts.map +1 -0
  151. package/dist/adapters/packageBootstrap.d.mts +8 -0
  152. package/dist/adapters/packageBootstrap.d.mts.map +1 -0
  153. package/dist/adapters/packageBootstrap.mjs +2 -0
  154. package/dist/adapters/packageBootstrap.mjs.map +1 -0
  155. package/dist/adapters/piExtensionAlias.cjs +2 -0
  156. package/dist/adapters/piExtensionAlias.cjs.map +1 -0
  157. package/dist/adapters/piExtensionAlias.mjs +2 -0
  158. package/dist/adapters/piExtensionAlias.mjs.map +1 -0
  159. package/dist/adapters/piSettings.cjs +2 -0
  160. package/dist/adapters/piSettings.cjs.map +1 -0
  161. package/dist/adapters/piSettings.d.cts +25 -0
  162. package/dist/adapters/piSettings.d.cts.map +1 -0
  163. package/dist/adapters/piSettings.d.mts +25 -0
  164. package/dist/adapters/piSettings.d.mts.map +1 -0
  165. package/dist/adapters/piSettings.mjs +2 -0
  166. package/dist/adapters/piSettings.mjs.map +1 -0
  167. package/dist/adapters/pluginMaterializer.cjs +2 -0
  168. package/dist/adapters/pluginMaterializer.cjs.map +1 -0
  169. package/dist/adapters/pluginMaterializer.mjs +2 -0
  170. package/dist/adapters/pluginMaterializer.mjs.map +1 -0
  171. package/dist/adapters/projectPiSettings.cjs +2 -0
  172. package/dist/adapters/projectPiSettings.cjs.map +1 -0
  173. package/dist/adapters/projectPiSettings.d.cts +29 -0
  174. package/dist/adapters/projectPiSettings.d.cts.map +1 -0
  175. package/dist/adapters/projectPiSettings.d.mts +29 -0
  176. package/dist/adapters/projectPiSettings.d.mts.map +1 -0
  177. package/dist/adapters/projectPiSettings.mjs +2 -0
  178. package/dist/adapters/projectPiSettings.mjs.map +1 -0
  179. package/dist/adapters/repository/repository.cjs +2 -0
  180. package/dist/adapters/repository/repository.cjs.map +1 -0
  181. package/dist/adapters/repository/repository.d.cts +21 -0
  182. package/dist/adapters/repository/repository.d.cts.map +1 -0
  183. package/dist/adapters/repository/repository.d.mts +21 -0
  184. package/dist/adapters/repository/repository.d.mts.map +1 -0
  185. package/dist/adapters/repository/repository.mjs +2 -0
  186. package/dist/adapters/repository/repository.mjs.map +1 -0
  187. package/dist/adapters/resourceCollector.cjs +3 -0
  188. package/dist/adapters/resourceCollector.cjs.map +1 -0
  189. package/dist/adapters/resourceCollector.d.cts +25 -0
  190. package/dist/adapters/resourceCollector.d.cts.map +1 -0
  191. package/dist/adapters/resourceCollector.d.mts +25 -0
  192. package/dist/adapters/resourceCollector.d.mts.map +1 -0
  193. package/dist/adapters/resourceCollector.mjs +3 -0
  194. package/dist/adapters/resourceCollector.mjs.map +1 -0
  195. package/dist/adapters/runtimeBundle.cjs +2 -0
  196. package/dist/adapters/runtimeBundle.cjs.map +1 -0
  197. package/dist/{services → adapters}/runtimeBundle.d.cts +4 -2
  198. package/dist/adapters/runtimeBundle.d.cts.map +1 -0
  199. package/dist/{services → adapters}/runtimeBundle.d.mts +4 -2
  200. package/dist/adapters/runtimeBundle.d.mts.map +1 -0
  201. package/dist/adapters/runtimeBundle.mjs +2 -0
  202. package/dist/adapters/runtimeBundle.mjs.map +1 -0
  203. package/dist/adapters/serialization/json.cjs +2 -0
  204. package/dist/adapters/serialization/json.cjs.map +1 -0
  205. package/dist/adapters/serialization/json.d.cts +23 -0
  206. package/dist/adapters/serialization/json.d.cts.map +1 -0
  207. package/dist/adapters/serialization/json.d.mts +23 -0
  208. package/dist/adapters/serialization/json.d.mts.map +1 -0
  209. package/dist/adapters/serialization/json.mjs +2 -0
  210. package/dist/adapters/serialization/json.mjs.map +1 -0
  211. package/dist/adapters/sharedBuildCache.cjs +2 -0
  212. package/dist/adapters/sharedBuildCache.cjs.map +1 -0
  213. package/dist/adapters/sharedBuildCache.mjs +2 -0
  214. package/dist/adapters/sharedBuildCache.mjs.map +1 -0
  215. package/dist/adapters/skillCatalog.cjs +2 -0
  216. package/dist/adapters/skillCatalog.cjs.map +1 -0
  217. package/dist/adapters/skillCatalog.d.cts +61 -0
  218. package/dist/adapters/skillCatalog.d.cts.map +1 -0
  219. package/dist/adapters/skillCatalog.d.mts +61 -0
  220. package/dist/adapters/skillCatalog.d.mts.map +1 -0
  221. package/dist/adapters/skillCatalog.mjs +2 -0
  222. package/dist/adapters/skillCatalog.mjs.map +1 -0
  223. package/dist/adapters/skillSources.cjs +2 -0
  224. package/dist/{services → adapters}/skillSources.cjs.map +1 -1
  225. package/dist/adapters/skillSources.d.cts +24 -0
  226. package/dist/{services → adapters}/skillSources.d.cts.map +1 -1
  227. package/dist/adapters/skillSources.d.mts +24 -0
  228. package/dist/{services → adapters}/skillSources.d.mts.map +1 -1
  229. package/dist/adapters/skillSources.mjs +2 -0
  230. package/dist/{services → adapters}/skillSources.mjs.map +1 -1
  231. package/dist/adapters/startupPrecompiler.cjs +2 -0
  232. package/dist/adapters/startupPrecompiler.cjs.map +1 -0
  233. package/dist/adapters/startupPrecompiler.d.cts +13 -0
  234. package/dist/adapters/startupPrecompiler.d.cts.map +1 -0
  235. package/dist/adapters/startupPrecompiler.d.mts +13 -0
  236. package/dist/adapters/startupPrecompiler.d.mts.map +1 -0
  237. package/dist/adapters/startupPrecompiler.mjs +2 -0
  238. package/dist/adapters/startupPrecompiler.mjs.map +1 -0
  239. package/dist/adapters/syncLocation.cjs +2 -0
  240. package/dist/adapters/syncLocation.cjs.map +1 -0
  241. package/dist/adapters/syncLocation.d.cts +19 -0
  242. package/dist/adapters/syncLocation.d.cts.map +1 -0
  243. package/dist/adapters/syncLocation.d.mts +19 -0
  244. package/dist/adapters/syncLocation.d.mts.map +1 -0
  245. package/dist/adapters/syncLocation.mjs +2 -0
  246. package/dist/adapters/syncLocation.mjs.map +1 -0
  247. package/dist/adapters/syncState.cjs +2 -0
  248. package/dist/adapters/syncState.cjs.map +1 -0
  249. package/dist/adapters/syncState.d.cts +153 -0
  250. package/dist/adapters/syncState.d.cts.map +1 -0
  251. package/dist/adapters/syncState.d.mts +153 -0
  252. package/dist/adapters/syncState.d.mts.map +1 -0
  253. package/dist/adapters/syncState.mjs +2 -0
  254. package/dist/adapters/syncState.mjs.map +1 -0
  255. package/dist/adapters/syncStateContract.cjs +2 -0
  256. package/dist/adapters/syncStateContract.cjs.map +1 -0
  257. package/dist/adapters/syncStateContract.d.cts +13 -0
  258. package/dist/adapters/syncStateContract.d.cts.map +1 -0
  259. package/dist/adapters/syncStateContract.d.mts +13 -0
  260. package/dist/adapters/syncStateContract.d.mts.map +1 -0
  261. package/dist/adapters/syncStateContract.mjs +2 -0
  262. package/dist/adapters/syncStateContract.mjs.map +1 -0
  263. package/dist/adapters/syncedRuntimeBuilder.cjs +2 -0
  264. package/dist/adapters/syncedRuntimeBuilder.cjs.map +1 -0
  265. package/dist/adapters/syncedRuntimeBuilder.d.cts +11 -0
  266. package/dist/adapters/syncedRuntimeBuilder.d.cts.map +1 -0
  267. package/dist/adapters/syncedRuntimeBuilder.d.mts +11 -0
  268. package/dist/adapters/syncedRuntimeBuilder.d.mts.map +1 -0
  269. package/dist/adapters/syncedRuntimeBuilder.mjs +2 -0
  270. package/dist/adapters/syncedRuntimeBuilder.mjs.map +1 -0
  271. package/dist/adapters/telemetry/logSinkTelemetry.cjs +2 -0
  272. package/dist/adapters/telemetry/logSinkTelemetry.cjs.map +1 -0
  273. package/dist/adapters/telemetry/logSinkTelemetry.d.cts +51 -0
  274. package/dist/adapters/telemetry/logSinkTelemetry.d.cts.map +1 -0
  275. package/dist/adapters/telemetry/logSinkTelemetry.d.mts +51 -0
  276. package/dist/adapters/telemetry/logSinkTelemetry.d.mts.map +1 -0
  277. package/dist/adapters/telemetry/logSinkTelemetry.mjs +2 -0
  278. package/dist/adapters/telemetry/logSinkTelemetry.mjs.map +1 -0
  279. package/dist/bin/cli.cjs +1 -1
  280. package/dist/bin/cli.cjs.map +1 -1
  281. package/dist/bin/cli.mjs +1 -1
  282. package/dist/bin/cli.mjs.map +1 -1
  283. package/dist/bin/dpi.cjs +3 -0
  284. package/dist/bin/dpi.cjs.map +1 -0
  285. package/dist/bin/dpi.d.cts +1 -0
  286. package/dist/bin/dpi.d.mts +1 -0
  287. package/dist/bin/dpi.mjs +3 -0
  288. package/dist/bin/dpi.mjs.map +1 -0
  289. package/dist/cli/cliApp.cjs +1 -2
  290. package/dist/cli/cliApp.d.cts +2 -45
  291. package/dist/cli/cliApp.d.mts +2 -45
  292. package/dist/cli/cliApp.mjs +1 -2
  293. package/dist/cli/compatibilityOptions.cjs +1 -2
  294. package/dist/cli/compatibilityOptions.d.cts +2 -15
  295. package/dist/cli/compatibilityOptions.d.mts +2 -15
  296. package/dist/cli/compatibilityOptions.mjs +1 -2
  297. package/dist/cli/help.cjs +1 -63
  298. package/dist/cli/help.d.cts +2 -6
  299. package/dist/cli/help.d.mts +2 -6
  300. package/dist/cli/help.mjs +1 -63
  301. package/dist/cli/index.cjs +1 -1
  302. package/dist/cli/index.d.cts +4 -4
  303. package/dist/cli/index.d.mts +4 -4
  304. package/dist/cli/index.mjs +1 -1
  305. package/dist/cli/matrixOptions.cjs +1 -2
  306. package/dist/cli/matrixOptions.d.cts +2 -99
  307. package/dist/cli/matrixOptions.d.mts +2 -99
  308. package/dist/cli/matrixOptions.mjs +1 -2
  309. package/dist/cli/options.cjs +1 -2
  310. package/dist/cli/options.d.cts +2 -7
  311. package/dist/cli/options.d.mts +2 -7
  312. package/dist/cli/options.mjs +1 -2
  313. package/dist/commands/baseCommand.cjs.map +1 -1
  314. package/dist/commands/baseCommand.d.cts +3 -3
  315. package/dist/commands/baseCommand.d.mts +3 -3
  316. package/dist/commands/baseCommand.mjs.map +1 -1
  317. package/dist/commands/buildCommand.cjs +2 -2
  318. package/dist/commands/buildCommand.cjs.map +1 -1
  319. package/dist/commands/buildCommand.mjs +2 -2
  320. package/dist/commands/buildCommand.mjs.map +1 -1
  321. package/dist/commands/cli/cliApp.cjs +2 -0
  322. package/dist/commands/cli/cliApp.cjs.map +1 -0
  323. package/dist/commands/cli/cliApp.d.cts +45 -0
  324. package/dist/commands/cli/cliApp.d.cts.map +1 -0
  325. package/dist/commands/cli/cliApp.d.mts +45 -0
  326. package/dist/commands/cli/cliApp.d.mts.map +1 -0
  327. package/dist/commands/cli/cliApp.mjs +2 -0
  328. package/dist/commands/cli/cliApp.mjs.map +1 -0
  329. package/dist/commands/cli/compatibilityOptions.cjs +2 -0
  330. package/dist/commands/cli/compatibilityOptions.cjs.map +1 -0
  331. package/dist/commands/cli/compatibilityOptions.d.cts +15 -0
  332. package/dist/commands/cli/compatibilityOptions.d.cts.map +1 -0
  333. package/dist/commands/cli/compatibilityOptions.d.mts +15 -0
  334. package/dist/commands/cli/compatibilityOptions.d.mts.map +1 -0
  335. package/dist/commands/cli/compatibilityOptions.mjs +2 -0
  336. package/dist/commands/cli/compatibilityOptions.mjs.map +1 -0
  337. package/dist/commands/cli/help.cjs +68 -0
  338. package/dist/{cli → commands/cli}/help.cjs.map +1 -1
  339. package/dist/commands/cli/help.d.cts +6 -0
  340. package/dist/commands/cli/help.d.cts.map +1 -0
  341. package/dist/commands/cli/help.d.mts +6 -0
  342. package/dist/commands/cli/help.d.mts.map +1 -0
  343. package/dist/commands/cli/help.mjs +68 -0
  344. package/dist/{cli → commands/cli}/help.mjs.map +1 -1
  345. package/dist/commands/cli/index.cjs +1 -0
  346. package/dist/commands/cli/index.d.cts +4 -0
  347. package/dist/commands/cli/index.d.mts +4 -0
  348. package/dist/commands/cli/index.mjs +1 -0
  349. package/dist/commands/cli/matrixOptions.cjs +2 -0
  350. package/dist/commands/cli/matrixOptions.cjs.map +1 -0
  351. package/dist/commands/cli/matrixOptions.d.cts +99 -0
  352. package/dist/commands/cli/matrixOptions.d.cts.map +1 -0
  353. package/dist/commands/cli/matrixOptions.d.mts +99 -0
  354. package/dist/commands/cli/matrixOptions.d.mts.map +1 -0
  355. package/dist/commands/cli/matrixOptions.mjs +2 -0
  356. package/dist/commands/cli/matrixOptions.mjs.map +1 -0
  357. package/dist/commands/cli/options.cjs +2 -0
  358. package/dist/commands/cli/options.cjs.map +1 -0
  359. package/dist/commands/cli/options.d.cts +7 -0
  360. package/dist/commands/cli/options.d.cts.map +1 -0
  361. package/dist/commands/cli/options.d.mts +7 -0
  362. package/dist/commands/cli/options.d.mts.map +1 -0
  363. package/dist/commands/cli/options.mjs +2 -0
  364. package/dist/commands/cli/options.mjs.map +1 -0
  365. package/dist/commands/compatibilityCommand.cjs +1 -1
  366. package/dist/commands/compatibilityCommand.cjs.map +1 -1
  367. package/dist/commands/compatibilityCommand.d.cts +1 -1
  368. package/dist/commands/compatibilityCommand.d.cts.map +1 -1
  369. package/dist/commands/compatibilityCommand.d.mts +1 -1
  370. package/dist/commands/compatibilityCommand.d.mts.map +1 -1
  371. package/dist/commands/compatibilityCommand.mjs +1 -1
  372. package/dist/commands/compatibilityCommand.mjs.map +1 -1
  373. package/dist/commands/emitMcpCommand.cjs +1 -1
  374. package/dist/commands/emitMcpCommand.cjs.map +1 -1
  375. package/dist/commands/emitMcpCommand.d.cts +2 -2
  376. package/dist/commands/emitMcpCommand.d.mts +2 -2
  377. package/dist/commands/emitMcpCommand.mjs +1 -1
  378. package/dist/commands/emitMcpCommand.mjs.map +1 -1
  379. package/dist/commands/explainCommand.cjs +2 -2
  380. package/dist/commands/explainCommand.cjs.map +1 -1
  381. package/dist/commands/explainCommand.d.cts +2 -2
  382. package/dist/commands/explainCommand.d.mts +2 -2
  383. package/dist/commands/explainCommand.mjs +2 -2
  384. package/dist/commands/explainCommand.mjs.map +1 -1
  385. package/dist/commands/index.cjs +1 -1
  386. package/dist/commands/index.d.cts +2 -3
  387. package/dist/commands/index.d.mts +2 -3
  388. package/dist/commands/index.mjs +1 -1
  389. package/dist/commands/initCommand.cjs +1 -2
  390. package/dist/commands/initCommand.cjs.map +1 -1
  391. package/dist/commands/initCommand.d.cts +4 -3
  392. package/dist/commands/initCommand.d.cts.map +1 -1
  393. package/dist/commands/initCommand.d.mts +4 -3
  394. package/dist/commands/initCommand.d.mts.map +1 -1
  395. package/dist/commands/initCommand.mjs +1 -2
  396. package/dist/commands/initCommand.mjs.map +1 -1
  397. package/dist/commands/initPresenter.cjs +3 -0
  398. package/dist/commands/initPresenter.cjs.map +1 -0
  399. package/dist/commands/initPresenter.d.cts +8 -0
  400. package/dist/commands/initPresenter.d.cts.map +1 -0
  401. package/dist/commands/initPresenter.d.mts +8 -0
  402. package/dist/commands/initPresenter.d.mts.map +1 -0
  403. package/dist/commands/initPresenter.mjs +3 -0
  404. package/dist/commands/initPresenter.mjs.map +1 -0
  405. package/dist/commands/launchCommand.cjs +1 -1
  406. package/dist/commands/launchCommand.cjs.map +1 -1
  407. package/dist/commands/launchCommand.d.cts +6 -4
  408. package/dist/commands/launchCommand.d.cts.map +1 -1
  409. package/dist/commands/launchCommand.d.mts +6 -4
  410. package/dist/commands/launchCommand.d.mts.map +1 -1
  411. package/dist/commands/launchCommand.mjs +1 -1
  412. package/dist/commands/launchCommand.mjs.map +1 -1
  413. package/dist/commands/syncCommand.cjs +5 -5
  414. package/dist/commands/syncCommand.cjs.map +1 -1
  415. package/dist/commands/syncCommand.d.cts +19 -7
  416. package/dist/commands/syncCommand.d.cts.map +1 -1
  417. package/dist/commands/syncCommand.d.mts +19 -7
  418. package/dist/commands/syncCommand.d.mts.map +1 -1
  419. package/dist/commands/syncCommand.mjs +5 -5
  420. package/dist/commands/syncCommand.mjs.map +1 -1
  421. package/dist/commands/syncPipeline.cjs +2 -0
  422. package/dist/commands/syncPipeline.cjs.map +1 -0
  423. package/dist/commands/syncPipeline.mjs +2 -0
  424. package/dist/commands/syncPipeline.mjs.map +1 -0
  425. package/dist/config/harnessState.cjs +1 -2
  426. package/dist/config/harnessState.d.cts +2 -24
  427. package/dist/config/harnessState.d.mts +2 -24
  428. package/dist/config/harnessState.mjs +1 -2
  429. package/dist/config/index.cjs +1 -1
  430. package/dist/config/index.d.cts +4 -7
  431. package/dist/config/index.d.mts +4 -7
  432. package/dist/config/index.mjs +1 -1
  433. package/dist/config/projectTrust.cjs +1 -2
  434. package/dist/config/projectTrust.d.cts +2 -14
  435. package/dist/config/projectTrust.d.mts +2 -14
  436. package/dist/config/projectTrust.mjs +1 -2
  437. package/dist/entries/autoStop.cjs +1 -2
  438. package/dist/entries/autoStop.d.cts +2 -6
  439. package/dist/entries/autoStop.d.mts +2 -7
  440. package/dist/entries/autoStop.mjs +1 -2
  441. package/dist/entries/components/matrixPicker.cjs +1 -2
  442. package/dist/entries/components/matrixPicker.d.cts +2 -55
  443. package/dist/entries/components/matrixPicker.d.mts +2 -55
  444. package/dist/entries/components/matrixPicker.mjs +1 -2
  445. package/dist/entries/components/skillsOverlay.cjs +1 -4
  446. package/dist/entries/components/skillsOverlay.d.cts +2 -58
  447. package/dist/entries/components/skillsOverlay.d.mts +2 -58
  448. package/dist/entries/components/skillsOverlay.mjs +1 -4
  449. package/dist/entries/domains.cjs +1 -2
  450. package/dist/entries/domains.d.cts +2 -10
  451. package/dist/entries/domains.d.mts +2 -10
  452. package/dist/entries/domains.mjs +1 -2
  453. package/dist/entries/doom.cjs +1 -2
  454. package/dist/entries/doom.d.cts +2 -13
  455. package/dist/entries/doom.d.mts +2 -14
  456. package/dist/entries/doom.mjs +1 -2
  457. package/dist/entries/effort.cjs +1 -2
  458. package/dist/entries/effort.d.cts +2 -10
  459. package/dist/entries/effort.d.mts +2 -10
  460. package/dist/entries/effort.mjs +1 -2
  461. package/dist/entries/majorMode.cjs +1 -6
  462. package/dist/entries/majorMode.d.cts +2 -29
  463. package/dist/entries/majorMode.d.mts +2 -29
  464. package/dist/entries/majorMode.mjs +1 -6
  465. package/dist/entries/modeCatalog.cjs +1 -0
  466. package/dist/entries/modeCatalog.d.cts +2 -0
  467. package/dist/entries/modeCatalog.d.mts +2 -0
  468. package/dist/entries/modeCatalog.mjs +1 -0
  469. package/dist/entries/notifications.cjs +1 -2
  470. package/dist/entries/notifications.d.cts +2 -13
  471. package/dist/entries/notifications.d.mts +2 -13
  472. package/dist/entries/notifications.mjs +1 -2
  473. package/dist/entries/ollamaProvider.cjs +1 -2
  474. package/dist/entries/ollamaProvider.d.cts +2 -6
  475. package/dist/entries/ollamaProvider.d.mts +2 -7
  476. package/dist/entries/ollamaProvider.mjs +1 -2
  477. package/dist/entries/persona.cjs +1 -2
  478. package/dist/entries/persona.d.cts +2 -14
  479. package/dist/entries/persona.d.mts +2 -15
  480. package/dist/entries/persona.mjs +1 -2
  481. package/dist/entries/profile.cjs +1 -3
  482. package/dist/entries/profile.d.cts +2 -16
  483. package/dist/entries/profile.d.mts +2 -16
  484. package/dist/entries/profile.mjs +1 -3
  485. package/dist/entries/repositoryHooks.cjs +1 -9
  486. package/dist/entries/repositoryHooks.d.cts +2 -7
  487. package/dist/entries/repositoryHooks.d.mts +2 -8
  488. package/dist/entries/repositoryHooks.mjs +1 -9
  489. package/dist/entries/skills.cjs +1 -2
  490. package/dist/entries/skills.d.cts +2 -34
  491. package/dist/entries/skills.d.mts +2 -34
  492. package/dist/entries/skills.mjs +1 -2
  493. package/dist/entries/styleSystem.cjs +1 -4
  494. package/dist/entries/styleSystem.d.cts +2 -32
  495. package/dist/entries/styleSystem.d.mts +2 -32
  496. package/dist/entries/styleSystem.mjs +1 -4
  497. package/dist/extensions/entries/autoStop.cjs +2 -0
  498. package/dist/extensions/entries/autoStop.cjs.map +1 -0
  499. package/dist/extensions/entries/autoStop.d.cts +7 -0
  500. package/dist/extensions/entries/autoStop.d.cts.map +1 -0
  501. package/dist/extensions/entries/autoStop.d.mts +7 -0
  502. package/dist/extensions/entries/autoStop.d.mts.map +1 -0
  503. package/dist/extensions/entries/autoStop.mjs +2 -0
  504. package/dist/extensions/entries/autoStop.mjs.map +1 -0
  505. package/dist/extensions/entries/cacheOptimizer.mjs +2 -0
  506. package/dist/extensions/entries/cacheOptimizer.mjs.map +1 -0
  507. package/dist/extensions/entries/components/matrixPicker.cjs +2 -0
  508. package/dist/extensions/entries/components/matrixPicker.cjs.map +1 -0
  509. package/dist/extensions/entries/components/matrixPicker.d.cts +55 -0
  510. package/dist/extensions/entries/components/matrixPicker.d.cts.map +1 -0
  511. package/dist/extensions/entries/components/matrixPicker.d.mts +55 -0
  512. package/dist/extensions/entries/components/matrixPicker.d.mts.map +1 -0
  513. package/dist/extensions/entries/components/matrixPicker.mjs +2 -0
  514. package/dist/extensions/entries/components/matrixPicker.mjs.map +1 -0
  515. package/dist/extensions/entries/components/skillsOverlay.cjs +4 -0
  516. package/dist/extensions/entries/components/skillsOverlay.cjs.map +1 -0
  517. package/dist/extensions/entries/components/skillsOverlay.d.cts +58 -0
  518. package/dist/extensions/entries/components/skillsOverlay.d.cts.map +1 -0
  519. package/dist/extensions/entries/components/skillsOverlay.d.mts +58 -0
  520. package/dist/extensions/entries/components/skillsOverlay.d.mts.map +1 -0
  521. package/dist/extensions/entries/components/skillsOverlay.mjs +4 -0
  522. package/dist/extensions/entries/components/skillsOverlay.mjs.map +1 -0
  523. package/dist/extensions/entries/domains.cjs +2 -0
  524. package/dist/extensions/entries/domains.cjs.map +1 -0
  525. package/dist/extensions/entries/domains.d.cts +18 -0
  526. package/dist/extensions/entries/domains.d.cts.map +1 -0
  527. package/dist/extensions/entries/domains.d.mts +18 -0
  528. package/dist/extensions/entries/domains.d.mts.map +1 -0
  529. package/dist/extensions/entries/domains.mjs +2 -0
  530. package/dist/extensions/entries/domains.mjs.map +1 -0
  531. package/dist/extensions/entries/doom.cjs +2 -0
  532. package/dist/extensions/entries/doom.cjs.map +1 -0
  533. package/dist/extensions/entries/doom.d.cts +14 -0
  534. package/dist/extensions/entries/doom.d.cts.map +1 -0
  535. package/dist/extensions/entries/doom.d.mts +14 -0
  536. package/dist/extensions/entries/doom.d.mts.map +1 -0
  537. package/dist/extensions/entries/doom.mjs +2 -0
  538. package/dist/extensions/entries/doom.mjs.map +1 -0
  539. package/dist/extensions/entries/effort.cjs +2 -0
  540. package/dist/extensions/entries/effort.cjs.map +1 -0
  541. package/dist/extensions/entries/effort.d.cts +10 -0
  542. package/dist/extensions/entries/effort.d.cts.map +1 -0
  543. package/dist/extensions/entries/effort.d.mts +10 -0
  544. package/dist/extensions/entries/effort.d.mts.map +1 -0
  545. package/dist/extensions/entries/effort.mjs +2 -0
  546. package/dist/extensions/entries/effort.mjs.map +1 -0
  547. package/dist/extensions/entries/majorMode.cjs +6 -0
  548. package/dist/extensions/entries/majorMode.cjs.map +1 -0
  549. package/dist/extensions/entries/majorMode.d.cts +27 -0
  550. package/dist/extensions/entries/majorMode.d.cts.map +1 -0
  551. package/dist/extensions/entries/majorMode.d.mts +27 -0
  552. package/dist/extensions/entries/majorMode.d.mts.map +1 -0
  553. package/dist/extensions/entries/majorMode.mjs +6 -0
  554. package/dist/extensions/entries/majorMode.mjs.map +1 -0
  555. package/dist/extensions/entries/modeCatalog.cjs +2 -0
  556. package/dist/extensions/entries/modeCatalog.cjs.map +1 -0
  557. package/dist/extensions/entries/modeCatalog.d.cts +7 -0
  558. package/dist/extensions/entries/modeCatalog.d.cts.map +1 -0
  559. package/dist/extensions/entries/modeCatalog.d.mts +7 -0
  560. package/dist/extensions/entries/modeCatalog.d.mts.map +1 -0
  561. package/dist/extensions/entries/modeCatalog.mjs +2 -0
  562. package/dist/extensions/entries/modeCatalog.mjs.map +1 -0
  563. package/dist/extensions/entries/notifications.cjs +2 -0
  564. package/dist/extensions/entries/notifications.cjs.map +1 -0
  565. package/dist/extensions/entries/notifications.d.cts +14 -0
  566. package/dist/extensions/entries/notifications.d.cts.map +1 -0
  567. package/dist/extensions/entries/notifications.d.mts +14 -0
  568. package/dist/extensions/entries/notifications.d.mts.map +1 -0
  569. package/dist/extensions/entries/notifications.mjs +2 -0
  570. package/dist/extensions/entries/notifications.mjs.map +1 -0
  571. package/dist/extensions/entries/ollamaProvider.cjs +2 -0
  572. package/dist/extensions/entries/ollamaProvider.cjs.map +1 -0
  573. package/dist/extensions/entries/ollamaProvider.d.cts +7 -0
  574. package/dist/extensions/entries/ollamaProvider.d.cts.map +1 -0
  575. package/dist/extensions/entries/ollamaProvider.d.mts +7 -0
  576. package/dist/extensions/entries/ollamaProvider.d.mts.map +1 -0
  577. package/dist/extensions/entries/ollamaProvider.mjs +2 -0
  578. package/dist/extensions/entries/ollamaProvider.mjs.map +1 -0
  579. package/dist/extensions/entries/persona.cjs +2 -0
  580. package/dist/extensions/entries/persona.cjs.map +1 -0
  581. package/dist/extensions/entries/persona.d.cts +15 -0
  582. package/dist/extensions/entries/persona.d.cts.map +1 -0
  583. package/dist/extensions/entries/persona.d.mts +15 -0
  584. package/dist/extensions/entries/persona.d.mts.map +1 -0
  585. package/dist/extensions/entries/persona.mjs +2 -0
  586. package/dist/extensions/entries/persona.mjs.map +1 -0
  587. package/dist/extensions/entries/profile.cjs +3 -0
  588. package/dist/extensions/entries/profile.cjs.map +1 -0
  589. package/dist/extensions/entries/profile.d.cts +18 -0
  590. package/dist/extensions/entries/profile.d.cts.map +1 -0
  591. package/dist/extensions/entries/profile.d.mts +18 -0
  592. package/dist/extensions/entries/profile.d.mts.map +1 -0
  593. package/dist/extensions/entries/profile.mjs +3 -0
  594. package/dist/extensions/entries/profile.mjs.map +1 -0
  595. package/dist/extensions/entries/repositoryHooks.cjs +9 -0
  596. package/dist/extensions/entries/repositoryHooks.cjs.map +1 -0
  597. package/dist/extensions/entries/repositoryHooks.d.cts +8 -0
  598. package/dist/extensions/entries/repositoryHooks.d.cts.map +1 -0
  599. package/dist/extensions/entries/repositoryHooks.d.mts +8 -0
  600. package/dist/extensions/entries/repositoryHooks.d.mts.map +1 -0
  601. package/dist/extensions/entries/repositoryHooks.mjs +9 -0
  602. package/dist/extensions/entries/repositoryHooks.mjs.map +1 -0
  603. package/dist/extensions/entries/shellTitleController.cjs +27 -0
  604. package/dist/extensions/entries/shellTitleController.cjs.map +1 -0
  605. package/dist/extensions/entries/shellTitleController.d.cts +11 -0
  606. package/dist/extensions/entries/shellTitleController.d.cts.map +1 -0
  607. package/dist/extensions/entries/shellTitleController.d.mts +11 -0
  608. package/dist/extensions/entries/shellTitleController.d.mts.map +1 -0
  609. package/dist/extensions/entries/shellTitleController.mjs +27 -0
  610. package/dist/extensions/entries/shellTitleController.mjs.map +1 -0
  611. package/dist/extensions/entries/skills.cjs +4 -0
  612. package/dist/extensions/entries/skills.cjs.map +1 -0
  613. package/dist/extensions/entries/skills.d.cts +34 -0
  614. package/dist/extensions/entries/skills.d.cts.map +1 -0
  615. package/dist/extensions/entries/skills.d.mts +34 -0
  616. package/dist/extensions/entries/skills.d.mts.map +1 -0
  617. package/dist/extensions/entries/skills.mjs +4 -0
  618. package/dist/extensions/entries/skills.mjs.map +1 -0
  619. package/dist/extensions/entries/styleSystem.cjs +4 -0
  620. package/dist/extensions/entries/styleSystem.cjs.map +1 -0
  621. package/dist/extensions/entries/styleSystem.d.cts +32 -0
  622. package/dist/extensions/entries/styleSystem.d.cts.map +1 -0
  623. package/dist/extensions/entries/styleSystem.d.mts +32 -0
  624. package/dist/extensions/entries/styleSystem.d.mts.map +1 -0
  625. package/dist/extensions/entries/styleSystem.mjs +4 -0
  626. package/dist/{entries/styleSystem.cjs.map → extensions/entries/styleSystem.mjs.map} +1 -1
  627. package/dist/extensions/pi.cjs +1 -0
  628. package/dist/extensions/pi.d.cts +2 -0
  629. package/dist/extensions/pi.d.mts +2 -0
  630. package/dist/extensions/pi.mjs +1 -0
  631. package/dist/extensions/services/domainSwitchHandoff.cjs +2 -0
  632. package/dist/extensions/services/domainSwitchHandoff.cjs.map +1 -0
  633. package/dist/extensions/services/domainSwitchHandoff.mjs +2 -0
  634. package/dist/extensions/services/domainSwitchHandoff.mjs.map +1 -0
  635. package/dist/index.cjs +1 -1
  636. package/dist/index.d.cts +33 -29
  637. package/dist/index.d.mts +33 -29
  638. package/dist/index.mjs +1 -1
  639. package/dist/logSinkTelemetry.cjs +1 -2
  640. package/dist/logSinkTelemetry.d.cts +2 -51
  641. package/dist/logSinkTelemetry.d.mts +2 -51
  642. package/dist/logSinkTelemetry.mjs +1 -2
  643. package/dist/pi-cache-optimizer-D9beVnnH.mjs +50 -0
  644. package/dist/pi-cache-optimizer-D9beVnnH.mjs.map +1 -0
  645. package/dist/schemas/domainVoiceTools.cjs +2 -0
  646. package/dist/schemas/domainVoiceTools.cjs.map +1 -0
  647. package/dist/schemas/domainVoiceTools.mjs +2 -0
  648. package/dist/schemas/domainVoiceTools.mjs.map +1 -0
  649. package/dist/schemas/majorModeVoiceTools.cjs +2 -0
  650. package/dist/schemas/majorModeVoiceTools.cjs.map +1 -0
  651. package/dist/schemas/majorModeVoiceTools.mjs +2 -0
  652. package/dist/schemas/majorModeVoiceTools.mjs.map +1 -0
  653. package/dist/services/compatibility/antigravity.cjs +1 -2
  654. package/dist/services/compatibility/antigravity.d.cts +2 -11
  655. package/dist/services/compatibility/antigravity.d.mts +2 -11
  656. package/dist/services/compatibility/antigravity.mjs +1 -2
  657. package/dist/services/compatibility/codex.cjs +1 -2
  658. package/dist/services/compatibility/codex.d.cts +2 -19
  659. package/dist/services/compatibility/codex.d.mts +2 -19
  660. package/dist/services/compatibility/codex.mjs +1 -2
  661. package/dist/services/compatibility/index.cjs +1 -2
  662. package/dist/services/compatibility/index.d.cts +6 -16
  663. package/dist/services/compatibility/index.d.mts +6 -16
  664. package/dist/services/compatibility/index.mjs +1 -2
  665. package/dist/services/compatibility/process.cjs +1 -2
  666. package/dist/services/compatibility/process.d.cts +2 -35
  667. package/dist/services/compatibility/process.d.mts +2 -35
  668. package/dist/services/compatibility/process.mjs +1 -2
  669. package/dist/services/compatibility/shared.cjs +1 -2
  670. package/dist/services/compatibility/shared.d.cts +2 -33
  671. package/dist/services/compatibility/shared.d.mts +2 -33
  672. package/dist/services/compatibility/shared.mjs +1 -2
  673. package/dist/services/compatibilityContext.cjs +1 -2
  674. package/dist/services/compatibilityContext.d.cts +2 -23
  675. package/dist/services/compatibilityContext.d.mts +2 -23
  676. package/dist/services/compatibilityContext.mjs +1 -2
  677. package/dist/services/composer.cjs +1 -2
  678. package/dist/services/composer.d.cts +4 -135
  679. package/dist/services/composer.d.mts +4 -135
  680. package/dist/services/composer.mjs +1 -2
  681. package/dist/services/config/index.cjs +1 -0
  682. package/dist/services/config/index.d.cts +7 -0
  683. package/dist/services/config/index.d.mts +7 -0
  684. package/dist/services/config/index.mjs +1 -0
  685. package/dist/services/config/projectTrust.cjs +2 -0
  686. package/dist/services/config/projectTrust.cjs.map +1 -0
  687. package/dist/services/config/projectTrust.d.cts +14 -0
  688. package/dist/services/config/projectTrust.d.cts.map +1 -0
  689. package/dist/services/config/projectTrust.d.mts +14 -0
  690. package/dist/services/config/projectTrust.d.mts.map +1 -0
  691. package/dist/services/config/projectTrust.mjs +2 -0
  692. package/dist/services/config/projectTrust.mjs.map +1 -0
  693. package/dist/services/extensionAssembler.cjs +1 -1
  694. package/dist/services/extensionAssembler.cjs.map +1 -1
  695. package/dist/services/extensionAssembler.d.cts +13 -6
  696. package/dist/services/extensionAssembler.d.cts.map +1 -1
  697. package/dist/services/extensionAssembler.d.mts +13 -6
  698. package/dist/services/extensionAssembler.d.mts.map +1 -1
  699. package/dist/services/extensionAssembler.mjs +1 -1
  700. package/dist/services/extensionAssembler.mjs.map +1 -1
  701. package/dist/services/harnessContext.cjs +1 -2
  702. package/dist/services/harnessContext.d.cts +2 -61
  703. package/dist/services/harnessContext.d.mts +2 -61
  704. package/dist/services/harnessContext.mjs +1 -2
  705. package/dist/services/index.cjs +1 -1
  706. package/dist/services/index.d.cts +18 -14
  707. package/dist/services/index.d.mts +18 -14
  708. package/dist/services/index.mjs +1 -1
  709. package/dist/services/matrixSwitcher.cjs +1 -2
  710. package/dist/services/matrixSwitcher.d.cts +2 -46
  711. package/dist/services/matrixSwitcher.d.mts +2 -46
  712. package/dist/services/matrixSwitcher.mjs +1 -2
  713. package/dist/services/mcpFilter.cjs +1 -3
  714. package/dist/services/mcpFilter.d.cts +2 -40
  715. package/dist/services/mcpFilter.d.mts +2 -40
  716. package/dist/services/mcpFilter.mjs +1 -3
  717. package/dist/services/modeCatalog.cjs +2 -0
  718. package/dist/services/modeCatalog.cjs.map +1 -0
  719. package/dist/services/modeCatalog.d.cts +18 -0
  720. package/dist/services/modeCatalog.d.cts.map +1 -0
  721. package/dist/services/modeCatalog.d.mts +18 -0
  722. package/dist/services/modeCatalog.d.mts.map +1 -0
  723. package/dist/services/modeCatalog.mjs +2 -0
  724. package/dist/services/modeCatalog.mjs.map +1 -0
  725. package/dist/services/piSettings.cjs +1 -2
  726. package/dist/services/piSettings.d.cts +2 -24
  727. package/dist/services/piSettings.d.mts +2 -24
  728. package/dist/services/piSettings.mjs +1 -2
  729. package/dist/services/resourceCollector.cjs +1 -3
  730. package/dist/services/resourceCollector.d.cts +2 -23
  731. package/dist/services/resourceCollector.d.mts +2 -23
  732. package/dist/services/resourceCollector.mjs +1 -3
  733. package/dist/services/skillCatalog.cjs +1 -2
  734. package/dist/services/skillCatalog.d.cts +2 -56
  735. package/dist/services/skillCatalog.d.mts +2 -56
  736. package/dist/services/skillCatalog.mjs +1 -2
  737. package/dist/services/skillSources.cjs +1 -2
  738. package/dist/services/skillSources.d.cts +2 -24
  739. package/dist/services/skillSources.d.mts +2 -24
  740. package/dist/services/skillSources.mjs +1 -2
  741. package/dist/services/syncState.cjs +1 -2
  742. package/dist/services/syncState.d.cts +3 -133
  743. package/dist/services/syncState.d.mts +3 -133
  744. package/dist/services/syncState.mjs +1 -2
  745. package/dist/services/tools/toolNames.cjs +2 -0
  746. package/dist/services/tools/toolNames.cjs.map +1 -0
  747. package/dist/services/tools/toolNames.d.cts +25 -0
  748. package/dist/services/tools/toolNames.d.cts.map +1 -0
  749. package/dist/services/tools/toolNames.d.mts +25 -0
  750. package/dist/services/tools/toolNames.d.mts.map +1 -0
  751. package/dist/services/tools/toolNames.mjs +2 -0
  752. package/dist/services/tools/toolNames.mjs.map +1 -0
  753. package/dist/{interfaces → types/interfaces}/compatibility.d.cts +1 -1
  754. package/dist/types/interfaces/compatibility.d.cts.map +1 -0
  755. package/dist/{interfaces → types/interfaces}/compatibility.d.mts +1 -1
  756. package/dist/types/interfaces/compatibility.d.mts.map +1 -0
  757. package/dist/{interfaces → types/interfaces}/harness.d.cts +6 -2
  758. package/dist/types/interfaces/harness.d.cts.map +1 -0
  759. package/dist/{interfaces → types/interfaces}/harness.d.mts +6 -2
  760. package/dist/types/interfaces/harness.d.mts.map +1 -0
  761. package/dist/utils/index.cjs +1 -1
  762. package/dist/utils/index.d.cts +5 -5
  763. package/dist/utils/index.d.mts +5 -5
  764. package/dist/utils/index.mjs +1 -1
  765. package/dist/utils/json.cjs +1 -2
  766. package/dist/utils/json.d.cts +2 -23
  767. package/dist/utils/json.d.mts +2 -23
  768. package/dist/utils/json.mjs +1 -2
  769. package/dist/utils/moduleResolution.cjs +1 -2
  770. package/dist/utils/moduleResolution.d.cts +2 -56
  771. package/dist/utils/moduleResolution.d.mts +2 -56
  772. package/dist/utils/moduleResolution.mjs +1 -2
  773. package/dist/utils/repository.cjs +1 -2
  774. package/dist/utils/repository.d.cts +2 -21
  775. package/dist/utils/repository.d.mts +2 -21
  776. package/dist/utils/repository.mjs +1 -2
  777. package/dist/utils/toolNames.cjs +1 -2
  778. package/dist/utils/toolNames.d.cts +2 -25
  779. package/dist/utils/toolNames.d.mts +2 -25
  780. package/dist/utils/toolNames.mjs +1 -2
  781. package/package.json +59 -37
  782. package/dist/cli/cliApp.cjs.map +0 -1
  783. package/dist/cli/cliApp.d.cts.map +0 -1
  784. package/dist/cli/cliApp.d.mts.map +0 -1
  785. package/dist/cli/cliApp.mjs.map +0 -1
  786. package/dist/cli/compatibilityOptions.cjs.map +0 -1
  787. package/dist/cli/compatibilityOptions.d.cts.map +0 -1
  788. package/dist/cli/compatibilityOptions.d.mts.map +0 -1
  789. package/dist/cli/compatibilityOptions.mjs.map +0 -1
  790. package/dist/cli/help.d.cts.map +0 -1
  791. package/dist/cli/help.d.mts.map +0 -1
  792. package/dist/cli/matrixOptions.cjs.map +0 -1
  793. package/dist/cli/matrixOptions.d.cts.map +0 -1
  794. package/dist/cli/matrixOptions.d.mts.map +0 -1
  795. package/dist/cli/matrixOptions.mjs.map +0 -1
  796. package/dist/cli/options.cjs.map +0 -1
  797. package/dist/cli/options.d.cts.map +0 -1
  798. package/dist/cli/options.d.mts.map +0 -1
  799. package/dist/cli/options.mjs.map +0 -1
  800. package/dist/commands/buildCommand.d.cts +0 -23
  801. package/dist/commands/buildCommand.d.cts.map +0 -1
  802. package/dist/commands/buildCommand.d.mts +0 -23
  803. package/dist/commands/buildCommand.d.mts.map +0 -1
  804. package/dist/config/harnessState.cjs.map +0 -1
  805. package/dist/config/harnessState.d.cts.map +0 -1
  806. package/dist/config/harnessState.d.mts.map +0 -1
  807. package/dist/config/harnessState.mjs.map +0 -1
  808. package/dist/config/projectTrust.cjs.map +0 -1
  809. package/dist/config/projectTrust.d.cts.map +0 -1
  810. package/dist/config/projectTrust.d.mts.map +0 -1
  811. package/dist/config/projectTrust.mjs.map +0 -1
  812. package/dist/entries/addDirCompatibility.cjs +0 -2
  813. package/dist/entries/addDirCompatibility.cjs.map +0 -1
  814. package/dist/entries/addDirCompatibility.d.cts +0 -13
  815. package/dist/entries/addDirCompatibility.d.cts.map +0 -1
  816. package/dist/entries/addDirCompatibility.d.mts +0 -14
  817. package/dist/entries/addDirCompatibility.d.mts.map +0 -1
  818. package/dist/entries/addDirCompatibility.mjs +0 -2
  819. package/dist/entries/addDirCompatibility.mjs.map +0 -1
  820. package/dist/entries/autoStop.cjs.map +0 -1
  821. package/dist/entries/autoStop.d.cts.map +0 -1
  822. package/dist/entries/autoStop.d.mts.map +0 -1
  823. package/dist/entries/autoStop.mjs.map +0 -1
  824. package/dist/entries/components/matrixPicker.cjs.map +0 -1
  825. package/dist/entries/components/matrixPicker.d.cts.map +0 -1
  826. package/dist/entries/components/matrixPicker.d.mts.map +0 -1
  827. package/dist/entries/components/matrixPicker.mjs.map +0 -1
  828. package/dist/entries/components/skillsOverlay.cjs.map +0 -1
  829. package/dist/entries/components/skillsOverlay.d.cts.map +0 -1
  830. package/dist/entries/components/skillsOverlay.d.mts.map +0 -1
  831. package/dist/entries/components/skillsOverlay.mjs.map +0 -1
  832. package/dist/entries/domains.cjs.map +0 -1
  833. package/dist/entries/domains.d.cts.map +0 -1
  834. package/dist/entries/domains.d.mts.map +0 -1
  835. package/dist/entries/domains.mjs.map +0 -1
  836. package/dist/entries/doom.cjs.map +0 -1
  837. package/dist/entries/doom.d.cts.map +0 -1
  838. package/dist/entries/doom.d.mts.map +0 -1
  839. package/dist/entries/doom.mjs.map +0 -1
  840. package/dist/entries/effort.cjs.map +0 -1
  841. package/dist/entries/effort.d.cts.map +0 -1
  842. package/dist/entries/effort.d.mts.map +0 -1
  843. package/dist/entries/effort.mjs.map +0 -1
  844. package/dist/entries/majorMode.cjs.map +0 -1
  845. package/dist/entries/majorMode.d.cts.map +0 -1
  846. package/dist/entries/majorMode.d.mts.map +0 -1
  847. package/dist/entries/majorMode.mjs.map +0 -1
  848. package/dist/entries/notifications.cjs.map +0 -1
  849. package/dist/entries/notifications.d.cts.map +0 -1
  850. package/dist/entries/notifications.d.mts.map +0 -1
  851. package/dist/entries/notifications.mjs.map +0 -1
  852. package/dist/entries/ollamaProvider.cjs.map +0 -1
  853. package/dist/entries/ollamaProvider.d.cts.map +0 -1
  854. package/dist/entries/ollamaProvider.d.mts.map +0 -1
  855. package/dist/entries/ollamaProvider.mjs.map +0 -1
  856. package/dist/entries/persona.cjs.map +0 -1
  857. package/dist/entries/persona.d.cts.map +0 -1
  858. package/dist/entries/persona.d.mts.map +0 -1
  859. package/dist/entries/persona.mjs.map +0 -1
  860. package/dist/entries/profile.cjs.map +0 -1
  861. package/dist/entries/profile.d.cts.map +0 -1
  862. package/dist/entries/profile.d.mts.map +0 -1
  863. package/dist/entries/profile.mjs.map +0 -1
  864. package/dist/entries/repositoryHooks.cjs.map +0 -1
  865. package/dist/entries/repositoryHooks.d.cts.map +0 -1
  866. package/dist/entries/repositoryHooks.d.mts.map +0 -1
  867. package/dist/entries/repositoryHooks.mjs.map +0 -1
  868. package/dist/entries/skills.cjs.map +0 -1
  869. package/dist/entries/skills.d.cts.map +0 -1
  870. package/dist/entries/skills.d.mts.map +0 -1
  871. package/dist/entries/skills.mjs.map +0 -1
  872. package/dist/entries/styleSystem.d.cts.map +0 -1
  873. package/dist/entries/styleSystem.d.mts.map +0 -1
  874. package/dist/entries/styleSystem.mjs.map +0 -1
  875. package/dist/interfaces/compatibility.d.cts.map +0 -1
  876. package/dist/interfaces/compatibility.d.mts.map +0 -1
  877. package/dist/interfaces/harness.d.cts.map +0 -1
  878. package/dist/interfaces/harness.d.mts.map +0 -1
  879. package/dist/logSinkTelemetry.cjs.map +0 -1
  880. package/dist/logSinkTelemetry.d.cts.map +0 -1
  881. package/dist/logSinkTelemetry.d.mts.map +0 -1
  882. package/dist/logSinkTelemetry.mjs.map +0 -1
  883. 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 +0 -2
  884. 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 +0 -1
  885. 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 +0 -2
  886. 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 +0 -1
  887. package/dist/services/compatibility/index.cjs.map +0 -1
  888. package/dist/services/compatibility/index.mjs.map +0 -1
  889. package/dist/services/compatibilityContext.cjs.map +0 -1
  890. package/dist/services/compatibilityContext.mjs.map +0 -1
  891. package/dist/services/composer.cjs.map +0 -1
  892. package/dist/services/composer.d.cts.map +0 -1
  893. package/dist/services/composer.d.mts.map +0 -1
  894. package/dist/services/composer.mjs.map +0 -1
  895. package/dist/services/extensionCompiler.cjs +0 -3
  896. package/dist/services/extensionCompiler.cjs.map +0 -1
  897. package/dist/services/extensionCompiler.mjs +0 -3
  898. package/dist/services/extensionCompiler.mjs.map +0 -1
  899. package/dist/services/harnessContext.cjs.map +0 -1
  900. package/dist/services/harnessContext.mjs.map +0 -1
  901. package/dist/services/matrixSwitcher.cjs.map +0 -1
  902. package/dist/services/matrixSwitcher.mjs.map +0 -1
  903. package/dist/services/mcpFilter.cjs.map +0 -1
  904. package/dist/services/mcpFilter.d.cts.map +0 -1
  905. package/dist/services/mcpFilter.d.mts.map +0 -1
  906. package/dist/services/mcpFilter.mjs.map +0 -1
  907. package/dist/services/piSettings.cjs.map +0 -1
  908. package/dist/services/piSettings.d.cts.map +0 -1
  909. package/dist/services/piSettings.d.mts.map +0 -1
  910. package/dist/services/piSettings.mjs.map +0 -1
  911. package/dist/services/resourceCollector.cjs.map +0 -1
  912. package/dist/services/resourceCollector.d.cts.map +0 -1
  913. package/dist/services/resourceCollector.d.mts.map +0 -1
  914. package/dist/services/resourceCollector.mjs.map +0 -1
  915. package/dist/services/runtimeBundle.cjs +0 -2
  916. package/dist/services/runtimeBundle.cjs.map +0 -1
  917. package/dist/services/runtimeBundle.d.cts.map +0 -1
  918. package/dist/services/runtimeBundle.d.mts.map +0 -1
  919. package/dist/services/runtimeBundle.mjs +0 -2
  920. package/dist/services/runtimeBundle.mjs.map +0 -1
  921. package/dist/services/skillCatalog.cjs.map +0 -1
  922. package/dist/services/skillCatalog.d.cts.map +0 -1
  923. package/dist/services/skillCatalog.d.mts.map +0 -1
  924. package/dist/services/skillCatalog.mjs.map +0 -1
  925. package/dist/services/syncState.cjs.map +0 -1
  926. package/dist/services/syncState.d.cts.map +0 -1
  927. package/dist/services/syncState.d.mts.map +0 -1
  928. package/dist/services/syncState.mjs.map +0 -1
  929. package/dist/utils/json.cjs.map +0 -1
  930. package/dist/utils/json.d.cts.map +0 -1
  931. package/dist/utils/json.d.mts.map +0 -1
  932. package/dist/utils/json.mjs.map +0 -1
  933. package/dist/utils/moduleResolution.cjs.map +0 -1
  934. package/dist/utils/moduleResolution.d.cts.map +0 -1
  935. package/dist/utils/moduleResolution.d.mts.map +0 -1
  936. package/dist/utils/moduleResolution.mjs.map +0 -1
  937. package/dist/utils/repository.cjs.map +0 -1
  938. package/dist/utils/repository.d.cts.map +0 -1
  939. package/dist/utils/repository.d.mts.map +0 -1
  940. package/dist/utils/repository.mjs.map +0 -1
  941. package/dist/utils/toolNames.cjs.map +0 -1
  942. package/dist/utils/toolNames.d.cts.map +0 -1
  943. package/dist/utils/toolNames.d.mts.map +0 -1
  944. package/dist/utils/toolNames.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginMaterializer.cjs","names":["path","fs"],"sources":["../../src/adapters/pluginMaterializer.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport {\n findPluginManifestPath,\n type GitPluginSource,\n isRemotePluginSource,\n type NpmPluginSource,\n type PluginEntry,\n type PluginSkillDiscovery,\n} from '@agimon-ai/doompi-config/domains';\n\nconst AGENT_PLUGIN_SCHEMA = 'https://agent-plugins.org/schemas/1.0.0/plugin.schema.json';\nconst INSTALL_MARKER = '.doompi-plugin.json';\nconst INSTALL_MARKER_VERSION = 1;\nconst OUTPUT_LIMIT = 64 * 1024;\n\ninterface CommandOptions {\n cwd?: string;\n environment?: NodeJS.ProcessEnv;\n}\n\ninterface InstallMarker {\n version: number;\n source: GitPluginSource | NpmPluginSource;\n}\n\nexport interface PluginSourceMaterializers {\n git: (source: GitPluginSource, workspace: string) => Promise<string>;\n npm: (source: NpmPluginSource, workspace: string) => Promise<string>;\n}\n\nexport interface PluginMaterializerOptions {\n materializers?: Partial<PluginSourceMaterializers>;\n}\n\nfunction appendOutput(current: string, chunk: Buffer): string {\n const next = current + chunk.toString('utf8');\n return next.length <= OUTPUT_LIMIT ? next : next.slice(-OUTPUT_LIMIT);\n}\n\nfunction runCommand(command: string, args: string[], options: CommandOptions = {}): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: options.environment ?? process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n let stdout = '';\n let stderr = '';\n child.stdout.on('data', (chunk: Buffer) => {\n stdout = appendOutput(stdout, chunk);\n });\n child.stderr.on('data', (chunk: Buffer) => {\n stderr = appendOutput(stderr, chunk);\n });\n child.once('error', (error) => {\n reject(new Error(`Failed to run ${command}: ${error.message}`, { cause: error }));\n });\n child.once('close', (code, signal) => {\n if (code === 0) {\n resolve(stdout.trim());\n return;\n }\n const outcome = signal ? `signal ${signal}` : `exit code ${code ?? 'unknown'}`;\n const details = stderr.trim() || stdout.trim();\n reject(new Error(`${command} ${args.join(' ')} failed with ${outcome}${details ? `\\n${details}` : ''}`));\n });\n });\n}\n\nfunction assertContained(root: string, candidate: string, label: string): void {\n const relative = path.relative(root, candidate);\n if (relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative))) return;\n throw new Error(`${label} resolves outside ${root}`);\n}\n\nasync function materializeGitSource(source: GitPluginSource, workspace: string): Promise<string> {\n const checkout = path.join(workspace, 'checkout');\n const cloneArgs = ['clone', '--filter=blob:none'];\n if (source.path) cloneArgs.push('--sparse', '--no-checkout');\n cloneArgs.push(source.url, checkout);\n const environment = { ...process.env, GIT_TERMINAL_PROMPT: '0' };\n await runCommand('git', cloneArgs, { environment });\n\n if (source.path) {\n await runCommand('git', ['sparse-checkout', 'set', '--no-cone', '--', source.path], {\n cwd: checkout,\n environment,\n });\n }\n if (source.sha) {\n await runCommand('git', ['checkout', source.sha], { cwd: checkout, environment });\n const checkedOutSha = await runCommand('git', ['rev-parse', 'HEAD'], { cwd: checkout, environment });\n if (checkedOutSha.toLowerCase() !== source.sha.toLowerCase()) {\n throw new Error(`Checked out Git SHA ${checkedOutSha} does not match requested SHA ${source.sha}`);\n }\n } else if (source.ref) {\n await runCommand('git', ['checkout', source.ref], { cwd: checkout, environment });\n } else if (source.path) {\n await runCommand('git', ['checkout'], { cwd: checkout, environment });\n }\n\n const pluginRoot = source.path ? path.resolve(checkout, source.path) : checkout;\n assertContained(checkout, pluginRoot, 'Git plugin path');\n return pluginRoot;\n}\n\nasync function materializeNpmSource(source: NpmPluginSource, workspace: string): Promise<string> {\n const prefix = path.join(workspace, 'npm');\n const packageSpecifier = source.version ? `${source.package}@${source.version}` : source.package;\n const args = [\n 'install',\n '--ignore-scripts',\n '--no-audit',\n '--no-fund',\n '--package-lock=false',\n '--prefix',\n prefix,\n packageSpecifier,\n ];\n if (source.registry) args.push('--registry', source.registry);\n await runCommand('npm', args, {\n environment: {\n ...process.env,\n NPM_CONFIG_AUDIT: 'false',\n NPM_CONFIG_FUND: 'false',\n NPM_CONFIG_IGNORE_SCRIPTS: 'true',\n },\n });\n const pluginRoot = path.resolve(prefix, 'node_modules', ...source.package.split('/'));\n assertContained(path.join(prefix, 'node_modules'), pluginRoot, 'npm plugin package');\n return pluginRoot;\n}\n\nconst DEFAULT_MATERIALIZERS: PluginSourceMaterializers = {\n git: materializeGitSource,\n npm: materializeNpmSource,\n};\n\nasync function pathType(target: string): Promise<'directory' | 'missing' | 'other'> {\n try {\n const stat = await fs.promises.lstat(target);\n return stat.isDirectory() ? 'directory' : 'other';\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return 'missing';\n throw error;\n }\n}\n\nfunction validatePluginManifest(pluginRoot: string, manifestPath: string): PluginSkillDiscovery {\n try {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as unknown;\n if (typeof manifest !== 'object' || manifest === null || Array.isArray(manifest)) {\n throw new Error('manifest must contain a JSON object');\n }\n return manifestPath === path.join(pluginRoot, 'plugin.json') &&\n '$schema' in manifest &&\n manifest.$schema === AGENT_PLUGIN_SCHEMA\n ? 'direct-children'\n : 'recursive';\n } catch (error) {\n throw new Error(\n `Invalid plugin manifest ${manifestPath}: ${error instanceof Error ? error.message : String(error)}`,\n {\n cause: error,\n },\n );\n }\n}\n\nasync function inspectInstallation(entry: PluginEntry): Promise<PluginSkillDiscovery | false> {\n const type = await pathType(entry.directory);\n if (type === 'missing') return false;\n if (type !== 'directory') throw new Error(`Remote plugin cache path is not a directory: ${entry.directory}`);\n if (!entry.source || !isRemotePluginSource(entry.source)) {\n throw new Error(`Remote plugin entry is missing its source: ${entry.name ?? entry.directory}`);\n }\n\n let marker: InstallMarker;\n try {\n marker = JSON.parse(\n await fs.promises.readFile(path.join(entry.directory, INSTALL_MARKER), 'utf8'),\n ) as InstallMarker;\n } catch (error) {\n throw new Error(`Remote plugin cache is not managed by DoomPi: ${entry.directory}`, { cause: error });\n }\n if (marker.version !== INSTALL_MARKER_VERSION || JSON.stringify(marker.source) !== JSON.stringify(entry.source)) {\n throw new Error(`Remote plugin cache metadata does not match ${entry.name ?? entry.directory}: ${entry.directory}`);\n }\n const manifestPath = findPluginManifestPath(entry.directory);\n if (!manifestPath) {\n throw new Error(`Remote plugin cache is missing a supported plugin manifest: ${entry.directory}`);\n }\n return validatePluginManifest(entry.directory, manifestPath);\n}\n\nasync function copyPluginSource(sourceRoot: string, destination: string): Promise<void> {\n if ((await pathType(sourceRoot)) !== 'directory') {\n throw new Error(`Materialized plugin source is not a directory: ${sourceRoot}`);\n }\n await fs.promises.cp(sourceRoot, destination, {\n recursive: true,\n filter: (candidate) => path.basename(candidate) !== '.git',\n });\n}\n\nfunction isRenameRace(error: unknown): boolean {\n const code = (error as NodeJS.ErrnoException).code;\n return code === 'EEXIST' || code === 'ENOTEMPTY';\n}\n\nasync function installRemotePlugin(entry: PluginEntry, materializers: PluginSourceMaterializers): Promise<PluginEntry> {\n if (!entry.source || !isRemotePluginSource(entry.source)) return entry;\n const existingDiscovery = await inspectInstallation(entry);\n if (existingDiscovery) return { ...entry, skillDiscovery: existingDiscovery };\n\n const parent = path.dirname(entry.directory);\n await fs.promises.mkdir(parent, { recursive: true, mode: 0o700 });\n if ((await pathType(parent)) !== 'directory') {\n throw new Error(`Remote plugin cache root is not a directory: ${parent}`);\n }\n await fs.promises.chmod(parent, 0o700);\n const workspace = await fs.promises.mkdtemp(path.join(parent, '.plugin-staging-'));\n const installation = path.join(workspace, 'installation');\n try {\n const sourceRoot =\n entry.source.type === 'git'\n ? await materializers.git(entry.source, workspace)\n : await materializers.npm(entry.source, workspace);\n await copyPluginSource(sourceRoot, installation);\n const manifestPath = findPluginManifestPath(installation);\n if (!manifestPath) {\n throw new Error(`Remote plugin ${entry.name ?? entry.directory} does not contain a supported plugin manifest`);\n }\n const skillDiscovery = validatePluginManifest(installation, manifestPath);\n const markerPath = path.join(installation, INSTALL_MARKER);\n if ((await pathType(markerPath)) !== 'missing') {\n throw new Error(`Remote plugin contains reserved cache metadata path: ${INSTALL_MARKER}`);\n }\n const marker: InstallMarker = { version: INSTALL_MARKER_VERSION, source: entry.source };\n await fs.promises.writeFile(markerPath, `${JSON.stringify(marker, null, 2)}\\n`, {\n flag: 'wx',\n mode: 0o600,\n });\n try {\n await fs.promises.rename(installation, entry.directory);\n } catch (error) {\n if (!isRenameRace(error)) throw error;\n await fs.promises.rm(installation, { recursive: true, force: true });\n const racedDiscovery = await inspectInstallation(entry);\n if (!racedDiscovery) throw new Error(`Remote plugin installation race left no cache: ${entry.directory}`);\n }\n return { ...entry, skillDiscovery };\n } catch (error) {\n throw new Error(\n `Failed to install remote plugin ${entry.name ?? entry.directory}: ${error instanceof Error ? error.message : String(error)}`,\n {\n cause: error,\n },\n );\n } finally {\n await fs.promises.rm(workspace, { recursive: true, force: true });\n }\n}\n\n/** Downloads selected remote plugins once into their content-addressed cache directories. */\nexport async function materializePluginEntries(\n entries: readonly PluginEntry[],\n options: PluginMaterializerOptions = {},\n): Promise<PluginEntry[]> {\n const materializers: PluginSourceMaterializers = {\n git: options.materializers?.git ?? DEFAULT_MATERIALIZERS.git,\n npm: options.materializers?.npm ?? DEFAULT_MATERIALIZERS.npm,\n };\n return Promise.all(entries.map((entry) => installRemotePlugin(entry, materializers)));\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import e from"node:path";import t from"node:fs";import{findPluginManifestPath as n,isRemotePluginSource as r}from"@agimon-ai/doompi-config/domains";import{spawn as i}from"node:child_process";const a=`.doompi-plugin.json`,o=64*1024;function s(e,t){let n=e+t.toString(`utf8`);return n.length<=o?n:n.slice(-o)}function c(e,t,n={}){return new Promise((r,a)=>{let o=i(e,t,{cwd:n.cwd,env:n.environment??process.env,stdio:[`ignore`,`pipe`,`pipe`]}),c=``,l=``;o.stdout.on(`data`,e=>{c=s(c,e)}),o.stderr.on(`data`,e=>{l=s(l,e)}),o.once(`error`,t=>{a(Error(`Failed to run ${e}: ${t.message}`,{cause:t}))}),o.once(`close`,(n,i)=>{if(n===0){r(c.trim());return}let o=i?`signal ${i}`:`exit code ${n??`unknown`}`,s=l.trim()||c.trim();a(Error(`${e} ${t.join(` `)} failed with ${o}${s?`\n${s}`:``}`))})})}function l(t,n,r){let i=e.relative(t,n);if(!(i===``||!i.startsWith(`..`)&&!e.isAbsolute(i)))throw Error(`${r} resolves outside ${t}`)}async function u(t,n){let r=e.join(n,`checkout`),i=[`clone`,`--filter=blob:none`];t.path&&i.push(`--sparse`,`--no-checkout`),i.push(t.url,r);let a={...process.env,GIT_TERMINAL_PROMPT:`0`};if(await c(`git`,i,{environment:a}),t.path&&await c(`git`,[`sparse-checkout`,`set`,`--no-cone`,`--`,t.path],{cwd:r,environment:a}),t.sha){await c(`git`,[`checkout`,t.sha],{cwd:r,environment:a});let e=await c(`git`,[`rev-parse`,`HEAD`],{cwd:r,environment:a});if(e.toLowerCase()!==t.sha.toLowerCase())throw Error(`Checked out Git SHA ${e} does not match requested SHA ${t.sha}`)}else t.ref?await c(`git`,[`checkout`,t.ref],{cwd:r,environment:a}):t.path&&await c(`git`,[`checkout`],{cwd:r,environment:a});let o=t.path?e.resolve(r,t.path):r;return l(r,o,`Git plugin path`),o}async function d(t,n){let r=e.join(n,`npm`),i=[`install`,`--ignore-scripts`,`--no-audit`,`--no-fund`,`--package-lock=false`,`--prefix`,r,t.version?`${t.package}@${t.version}`:t.package];t.registry&&i.push(`--registry`,t.registry),await c(`npm`,i,{environment:{...process.env,NPM_CONFIG_AUDIT:`false`,NPM_CONFIG_FUND:`false`,NPM_CONFIG_IGNORE_SCRIPTS:`true`}});let a=e.resolve(r,`node_modules`,...t.package.split(`/`));return l(e.join(r,`node_modules`),a,`npm plugin package`),a}const f={git:u,npm:d};async function p(e){try{return(await t.promises.lstat(e)).isDirectory()?`directory`:`other`}catch(e){if(e.code===`ENOENT`)return`missing`;throw e}}function m(n,r){try{let i=JSON.parse(t.readFileSync(r,`utf8`));if(typeof i!=`object`||!i||Array.isArray(i))throw Error(`manifest must contain a JSON object`);return r===e.join(n,`plugin.json`)&&`$schema`in i&&i.$schema===`https://agent-plugins.org/schemas/1.0.0/plugin.schema.json`?`direct-children`:`recursive`}catch(e){throw Error(`Invalid plugin manifest ${r}: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async function h(i){let o=await p(i.directory);if(o===`missing`)return!1;if(o!==`directory`)throw Error(`Remote plugin cache path is not a directory: ${i.directory}`);if(!i.source||!r(i.source))throw Error(`Remote plugin entry is missing its source: ${i.name??i.directory}`);let s;try{s=JSON.parse(await t.promises.readFile(e.join(i.directory,a),`utf8`))}catch(e){throw Error(`Remote plugin cache is not managed by DoomPi: ${i.directory}`,{cause:e})}if(s.version!==1||JSON.stringify(s.source)!==JSON.stringify(i.source))throw Error(`Remote plugin cache metadata does not match ${i.name??i.directory}: ${i.directory}`);let c=n(i.directory);if(!c)throw Error(`Remote plugin cache is missing a supported plugin manifest: ${i.directory}`);return m(i.directory,c)}async function g(n,r){if(await p(n)!==`directory`)throw Error(`Materialized plugin source is not a directory: ${n}`);await t.promises.cp(n,r,{recursive:!0,filter:t=>e.basename(t)!==`.git`})}function _(e){let t=e.code;return t===`EEXIST`||t===`ENOTEMPTY`}async function v(i,o){if(!i.source||!r(i.source))return i;let s=await h(i);if(s)return{...i,skillDiscovery:s};let c=e.dirname(i.directory);if(await t.promises.mkdir(c,{recursive:!0,mode:448}),await p(c)!==`directory`)throw Error(`Remote plugin cache root is not a directory: ${c}`);await t.promises.chmod(c,448);let l=await t.promises.mkdtemp(e.join(c,`.plugin-staging-`)),u=e.join(l,`installation`);try{await g(i.source.type===`git`?await o.git(i.source,l):await o.npm(i.source,l),u);let r=n(u);if(!r)throw Error(`Remote plugin ${i.name??i.directory} does not contain a supported plugin manifest`);let s=m(u,r),c=e.join(u,a);if(await p(c)!==`missing`)throw Error(`Remote plugin contains reserved cache metadata path: ${a}`);let d={version:1,source:i.source};await t.promises.writeFile(c,`${JSON.stringify(d,null,2)}\n`,{flag:`wx`,mode:384});try{await t.promises.rename(u,i.directory)}catch(e){if(!_(e))throw e;if(await t.promises.rm(u,{recursive:!0,force:!0}),!await h(i))throw Error(`Remote plugin installation race left no cache: ${i.directory}`)}return{...i,skillDiscovery:s}}catch(e){throw Error(`Failed to install remote plugin ${i.name??i.directory}: ${e instanceof Error?e.message:String(e)}`,{cause:e})}finally{await t.promises.rm(l,{recursive:!0,force:!0})}}async function y(e,t={}){let n={git:t.materializers?.git??f.git,npm:t.materializers?.npm??f.npm};return Promise.all(e.map(e=>v(e,n)))}export{y as materializePluginEntries};
2
+ //# sourceMappingURL=pluginMaterializer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginMaterializer.mjs","names":[],"sources":["../../src/adapters/pluginMaterializer.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport {\n findPluginManifestPath,\n type GitPluginSource,\n isRemotePluginSource,\n type NpmPluginSource,\n type PluginEntry,\n type PluginSkillDiscovery,\n} from '@agimon-ai/doompi-config/domains';\n\nconst AGENT_PLUGIN_SCHEMA = 'https://agent-plugins.org/schemas/1.0.0/plugin.schema.json';\nconst INSTALL_MARKER = '.doompi-plugin.json';\nconst INSTALL_MARKER_VERSION = 1;\nconst OUTPUT_LIMIT = 64 * 1024;\n\ninterface CommandOptions {\n cwd?: string;\n environment?: NodeJS.ProcessEnv;\n}\n\ninterface InstallMarker {\n version: number;\n source: GitPluginSource | NpmPluginSource;\n}\n\nexport interface PluginSourceMaterializers {\n git: (source: GitPluginSource, workspace: string) => Promise<string>;\n npm: (source: NpmPluginSource, workspace: string) => Promise<string>;\n}\n\nexport interface PluginMaterializerOptions {\n materializers?: Partial<PluginSourceMaterializers>;\n}\n\nfunction appendOutput(current: string, chunk: Buffer): string {\n const next = current + chunk.toString('utf8');\n return next.length <= OUTPUT_LIMIT ? next : next.slice(-OUTPUT_LIMIT);\n}\n\nfunction runCommand(command: string, args: string[], options: CommandOptions = {}): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: options.environment ?? process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n let stdout = '';\n let stderr = '';\n child.stdout.on('data', (chunk: Buffer) => {\n stdout = appendOutput(stdout, chunk);\n });\n child.stderr.on('data', (chunk: Buffer) => {\n stderr = appendOutput(stderr, chunk);\n });\n child.once('error', (error) => {\n reject(new Error(`Failed to run ${command}: ${error.message}`, { cause: error }));\n });\n child.once('close', (code, signal) => {\n if (code === 0) {\n resolve(stdout.trim());\n return;\n }\n const outcome = signal ? `signal ${signal}` : `exit code ${code ?? 'unknown'}`;\n const details = stderr.trim() || stdout.trim();\n reject(new Error(`${command} ${args.join(' ')} failed with ${outcome}${details ? `\\n${details}` : ''}`));\n });\n });\n}\n\nfunction assertContained(root: string, candidate: string, label: string): void {\n const relative = path.relative(root, candidate);\n if (relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative))) return;\n throw new Error(`${label} resolves outside ${root}`);\n}\n\nasync function materializeGitSource(source: GitPluginSource, workspace: string): Promise<string> {\n const checkout = path.join(workspace, 'checkout');\n const cloneArgs = ['clone', '--filter=blob:none'];\n if (source.path) cloneArgs.push('--sparse', '--no-checkout');\n cloneArgs.push(source.url, checkout);\n const environment = { ...process.env, GIT_TERMINAL_PROMPT: '0' };\n await runCommand('git', cloneArgs, { environment });\n\n if (source.path) {\n await runCommand('git', ['sparse-checkout', 'set', '--no-cone', '--', source.path], {\n cwd: checkout,\n environment,\n });\n }\n if (source.sha) {\n await runCommand('git', ['checkout', source.sha], { cwd: checkout, environment });\n const checkedOutSha = await runCommand('git', ['rev-parse', 'HEAD'], { cwd: checkout, environment });\n if (checkedOutSha.toLowerCase() !== source.sha.toLowerCase()) {\n throw new Error(`Checked out Git SHA ${checkedOutSha} does not match requested SHA ${source.sha}`);\n }\n } else if (source.ref) {\n await runCommand('git', ['checkout', source.ref], { cwd: checkout, environment });\n } else if (source.path) {\n await runCommand('git', ['checkout'], { cwd: checkout, environment });\n }\n\n const pluginRoot = source.path ? path.resolve(checkout, source.path) : checkout;\n assertContained(checkout, pluginRoot, 'Git plugin path');\n return pluginRoot;\n}\n\nasync function materializeNpmSource(source: NpmPluginSource, workspace: string): Promise<string> {\n const prefix = path.join(workspace, 'npm');\n const packageSpecifier = source.version ? `${source.package}@${source.version}` : source.package;\n const args = [\n 'install',\n '--ignore-scripts',\n '--no-audit',\n '--no-fund',\n '--package-lock=false',\n '--prefix',\n prefix,\n packageSpecifier,\n ];\n if (source.registry) args.push('--registry', source.registry);\n await runCommand('npm', args, {\n environment: {\n ...process.env,\n NPM_CONFIG_AUDIT: 'false',\n NPM_CONFIG_FUND: 'false',\n NPM_CONFIG_IGNORE_SCRIPTS: 'true',\n },\n });\n const pluginRoot = path.resolve(prefix, 'node_modules', ...source.package.split('/'));\n assertContained(path.join(prefix, 'node_modules'), pluginRoot, 'npm plugin package');\n return pluginRoot;\n}\n\nconst DEFAULT_MATERIALIZERS: PluginSourceMaterializers = {\n git: materializeGitSource,\n npm: materializeNpmSource,\n};\n\nasync function pathType(target: string): Promise<'directory' | 'missing' | 'other'> {\n try {\n const stat = await fs.promises.lstat(target);\n return stat.isDirectory() ? 'directory' : 'other';\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return 'missing';\n throw error;\n }\n}\n\nfunction validatePluginManifest(pluginRoot: string, manifestPath: string): PluginSkillDiscovery {\n try {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as unknown;\n if (typeof manifest !== 'object' || manifest === null || Array.isArray(manifest)) {\n throw new Error('manifest must contain a JSON object');\n }\n return manifestPath === path.join(pluginRoot, 'plugin.json') &&\n '$schema' in manifest &&\n manifest.$schema === AGENT_PLUGIN_SCHEMA\n ? 'direct-children'\n : 'recursive';\n } catch (error) {\n throw new Error(\n `Invalid plugin manifest ${manifestPath}: ${error instanceof Error ? error.message : String(error)}`,\n {\n cause: error,\n },\n );\n }\n}\n\nasync function inspectInstallation(entry: PluginEntry): Promise<PluginSkillDiscovery | false> {\n const type = await pathType(entry.directory);\n if (type === 'missing') return false;\n if (type !== 'directory') throw new Error(`Remote plugin cache path is not a directory: ${entry.directory}`);\n if (!entry.source || !isRemotePluginSource(entry.source)) {\n throw new Error(`Remote plugin entry is missing its source: ${entry.name ?? entry.directory}`);\n }\n\n let marker: InstallMarker;\n try {\n marker = JSON.parse(\n await fs.promises.readFile(path.join(entry.directory, INSTALL_MARKER), 'utf8'),\n ) as InstallMarker;\n } catch (error) {\n throw new Error(`Remote plugin cache is not managed by DoomPi: ${entry.directory}`, { cause: error });\n }\n if (marker.version !== INSTALL_MARKER_VERSION || JSON.stringify(marker.source) !== JSON.stringify(entry.source)) {\n throw new Error(`Remote plugin cache metadata does not match ${entry.name ?? entry.directory}: ${entry.directory}`);\n }\n const manifestPath = findPluginManifestPath(entry.directory);\n if (!manifestPath) {\n throw new Error(`Remote plugin cache is missing a supported plugin manifest: ${entry.directory}`);\n }\n return validatePluginManifest(entry.directory, manifestPath);\n}\n\nasync function copyPluginSource(sourceRoot: string, destination: string): Promise<void> {\n if ((await pathType(sourceRoot)) !== 'directory') {\n throw new Error(`Materialized plugin source is not a directory: ${sourceRoot}`);\n }\n await fs.promises.cp(sourceRoot, destination, {\n recursive: true,\n filter: (candidate) => path.basename(candidate) !== '.git',\n });\n}\n\nfunction isRenameRace(error: unknown): boolean {\n const code = (error as NodeJS.ErrnoException).code;\n return code === 'EEXIST' || code === 'ENOTEMPTY';\n}\n\nasync function installRemotePlugin(entry: PluginEntry, materializers: PluginSourceMaterializers): Promise<PluginEntry> {\n if (!entry.source || !isRemotePluginSource(entry.source)) return entry;\n const existingDiscovery = await inspectInstallation(entry);\n if (existingDiscovery) return { ...entry, skillDiscovery: existingDiscovery };\n\n const parent = path.dirname(entry.directory);\n await fs.promises.mkdir(parent, { recursive: true, mode: 0o700 });\n if ((await pathType(parent)) !== 'directory') {\n throw new Error(`Remote plugin cache root is not a directory: ${parent}`);\n }\n await fs.promises.chmod(parent, 0o700);\n const workspace = await fs.promises.mkdtemp(path.join(parent, '.plugin-staging-'));\n const installation = path.join(workspace, 'installation');\n try {\n const sourceRoot =\n entry.source.type === 'git'\n ? await materializers.git(entry.source, workspace)\n : await materializers.npm(entry.source, workspace);\n await copyPluginSource(sourceRoot, installation);\n const manifestPath = findPluginManifestPath(installation);\n if (!manifestPath) {\n throw new Error(`Remote plugin ${entry.name ?? entry.directory} does not contain a supported plugin manifest`);\n }\n const skillDiscovery = validatePluginManifest(installation, manifestPath);\n const markerPath = path.join(installation, INSTALL_MARKER);\n if ((await pathType(markerPath)) !== 'missing') {\n throw new Error(`Remote plugin contains reserved cache metadata path: ${INSTALL_MARKER}`);\n }\n const marker: InstallMarker = { version: INSTALL_MARKER_VERSION, source: entry.source };\n await fs.promises.writeFile(markerPath, `${JSON.stringify(marker, null, 2)}\\n`, {\n flag: 'wx',\n mode: 0o600,\n });\n try {\n await fs.promises.rename(installation, entry.directory);\n } catch (error) {\n if (!isRenameRace(error)) throw error;\n await fs.promises.rm(installation, { recursive: true, force: true });\n const racedDiscovery = await inspectInstallation(entry);\n if (!racedDiscovery) throw new Error(`Remote plugin installation race left no cache: ${entry.directory}`);\n }\n return { ...entry, skillDiscovery };\n } catch (error) {\n throw new Error(\n `Failed to install remote plugin ${entry.name ?? entry.directory}: ${error instanceof Error ? error.message : String(error)}`,\n {\n cause: error,\n },\n );\n } finally {\n await fs.promises.rm(workspace, { recursive: true, force: true });\n }\n}\n\n/** Downloads selected remote plugins once into their content-addressed cache directories. */\nexport async function materializePluginEntries(\n entries: readonly PluginEntry[],\n options: PluginMaterializerOptions = {},\n): Promise<PluginEntry[]> {\n const materializers: PluginSourceMaterializers = {\n git: options.materializers?.git ?? DEFAULT_MATERIALIZERS.git,\n npm: options.materializers?.npm ?? DEFAULT_MATERIALIZERS.npm,\n };\n return Promise.all(entries.map((entry) => installRemotePlugin(entry, materializers)));\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`./serialization/json.cjs`);require(`../utils/index.cjs`);const n=require(`./doomPackage.cjs`),r=require(`./piExtensionAlias.cjs`);let i=require(`node:path`);i=e.__toESM(i,1);let a=require(`node:fs`);a=e.__toESM(a,1);let o=require(`node:os`);o=e.__toESM(o,1);const s=`source`,c=[`!`,`+`,`-`];function l(e){return i.default.join(e,`.pi`)}function u(e){return i.default.join(l(e),`settings.json`)}function d(e,t,n){return e===`~`?n:e.startsWith(`~/`)?i.default.join(n,e.slice(2)):i.default.resolve(t,e)}function f(e,t,r){let i=e.replaceAll(`\\`,`/`).trim();return i===`@agimon-ai/doompi`?!0:c.some(e=>i.startsWith(e))?!1:n.isDoomPackagePath(d(i,t,r))}function p(e){if(typeof e==`string`)return e;if(t.isRecord(e)&&typeof e[s]==`string`)return e[s]}function m(e,t,n){if(!Array.isArray(e))return e;let r=e.filter(e=>{let r=p(e);return r===void 0||!f(r,t,n)});return r.length===e.length?e:r.length>0?r:void 0}function h(e,t,n=o.default.homedir()){let r=l(t),i={...e};for(let e of[`extensions`,`packages`]){if(!(e in i))continue;let t=m(i[e],r,n);t===void 0?delete i[e]:i[e]=t}return i}function g(e){let n=u(e);if(!a.default.existsSync(n))return;let r=t.readJson(n);return t.isRecord(r)?r:{}}function _(e){return`${JSON.stringify(e,null,2)}\n`}function v(e,t=o.default.homedir()){let n=g(e);return n?_(h(n,e,t))!==_(n):!1}function y(e){let t=r.piExtensionAliasPath(l(e));a.default.lstatSync(t,{throwIfNoEntry:!1})?.isSymbolicLink()&&a.default.rmSync(t,{force:!0})}function b(e,n=o.default.homedir()){let r=g(e);if(y(e),!r)return;let i=_(h(r,e,n));if(i===_(r))return;let a=u(e);return t.writeFileAtomic(a,i),a}exports.DUPLICATE_REGISTRATION_DRIFT=`duplicate DoomPi registration in .pi/settings.json`,exports.mergeProjectPiSettings=h,exports.projectPiSettingsPath=u,exports.projectRegistersDoom=v,exports.readProjectPiSettings=g,exports.serializeProjectPiSettings=_,exports.writeProjectPiSettings=b;
2
+ //# sourceMappingURL=projectPiSettings.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectPiSettings.cjs","names":["path","isDoomPackagePath","isRecord","os","fs","readJson","piExtensionAliasPath"],"sources":["../../src/adapters/projectPiSettings.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { isRecord, type JsonObject, readJson, writeFileAtomic } from '../utils/index.ts';\nimport { DOOM_PACKAGE_NAME, isDoomPackagePath } from './doomPackage.ts';\nimport { piExtensionAliasPath } from './piExtensionAlias.ts';\n\n/**\n * Pi's project settings, as `doompi sync` reconciles them.\n *\n * Pi documents project settings as overriding user settings, but resource\n * resolution unions the two scopes and dedupes only by the resolved file's real\n * path. A repository that registers DoomPi alongside the stable user entry\n * therefore loads two installs of the same package against one home-scoped\n * worktree state. Sync removes the redundant project registration and leaves every\n * other key alone: the repository still overrides the user scope, through its own\n * `.doom` configuration and the runtime staged under `~/.pi/.doom/sync`.\n */\n\nconst PI_DIRECTORY = '.pi';\nconst SETTINGS_FILE = 'settings.json';\nconst EXTENSIONS_KEY = 'extensions';\nconst PACKAGES_KEY = 'packages';\nconst PACKAGE_SOURCE_KEY = 'source';\nconst HOME_ALIAS = '~';\nconst HOME_ALIAS_PREFIX = '~/';\n/** Pattern-form entries Pi filters with rather than resolves. */\nconst PATTERN_PREFIXES = ['!', '+', '-'] as const;\n\n/**\n * Reported by `sync --check` and `build`, and repaired by `sync`.\n *\n * Lives here rather than with either command because both report the same\n * finding about the same file, and the detector below is what decides it.\n */\nexport const DUPLICATE_REGISTRATION_DRIFT = 'duplicate DoomPi registration in .pi/settings.json';\n\n/** Pi's project configuration directory, the base its relative paths resolve against. */\nexport function projectPiDirectory(repoRoot: string): string {\n return path.join(repoRoot, PI_DIRECTORY);\n}\n\nexport function projectPiSettingsPath(repoRoot: string): string {\n return path.join(projectPiDirectory(repoRoot), SETTINGS_FILE);\n}\n\nfunction resolveSettingsPath(value: string, baseDirectory: string, homeDirectory: string): string {\n if (value === HOME_ALIAS) return homeDirectory;\n if (value.startsWith(HOME_ALIAS_PREFIX)) return path.join(homeDirectory, value.slice(HOME_ALIAS_PREFIX.length));\n return path.resolve(baseDirectory, value);\n}\n\n/**\n * Whether one settings entry names this package.\n *\n * The bare package name is matched textually because that is the spelling sync\n * writes into the user scope, and a resolved path is matched by walking to the\n * package it belongs to, which is what catches `../packages/cli/doompi` and a\n * direct reference to a file inside it. Pattern entries select among already\n * resolved paths rather than naming one, so they are left for the user to own.\n */\nfunction isDoomEntry(value: string, baseDirectory: string, homeDirectory: string): boolean {\n const normalized = value.replaceAll('\\\\', '/').trim();\n if (normalized === DOOM_PACKAGE_NAME) return true;\n if (PATTERN_PREFIXES.some((prefix) => normalized.startsWith(prefix))) return false;\n return isDoomPackagePath(resolveSettingsPath(normalized, baseDirectory, homeDirectory));\n}\n\nfunction packageSource(entry: unknown): string | undefined {\n if (typeof entry === 'string') return entry;\n if (isRecord(entry) && typeof entry[PACKAGE_SOURCE_KEY] === 'string') return entry[PACKAGE_SOURCE_KEY];\n return undefined;\n}\n\n/**\n * Drops DoomPi from one resource list, or reports that the key should go.\n *\n * A list that empties out is removed rather than left behind: an empty array is\n * indistinguishable from an absent one to Pi, and keeping it would leave the\n * repository looking like it still configures something.\n */\nfunction withoutDoomEntries(value: unknown, baseDirectory: string, homeDirectory: string): unknown {\n if (!Array.isArray(value)) return value;\n const kept = value.filter((entry) => {\n const source = packageSource(entry);\n return source === undefined || !isDoomEntry(source, baseDirectory, homeDirectory);\n });\n if (kept.length === value.length) return value;\n return kept.length > 0 ? kept : undefined;\n}\n\n/** Produces the project settings content for a reconciliation, without writing it. */\nexport function mergeProjectPiSettings(\n current: JsonObject,\n repoRoot: string,\n homeDirectory: string = os.homedir(),\n): JsonObject {\n const baseDirectory = projectPiDirectory(repoRoot);\n const merged: JsonObject = { ...current };\n for (const key of [EXTENSIONS_KEY, PACKAGES_KEY]) {\n if (!(key in merged)) continue;\n const next = withoutDoomEntries(merged[key], baseDirectory, homeDirectory);\n if (next === undefined) delete merged[key];\n else merged[key] = next;\n }\n return merged;\n}\n\n/** Reads Pi's project settings, or nothing when the repository declares none. */\nexport function readProjectPiSettings(repoRoot: string): JsonObject | undefined {\n const settingsPath = projectPiSettingsPath(repoRoot);\n if (!fs.existsSync(settingsPath)) return undefined;\n const settings = readJson(settingsPath);\n return isRecord(settings) ? settings : {};\n}\n\nexport function serializeProjectPiSettings(settings: JsonObject): string {\n return `${JSON.stringify(settings, null, 2)}\\n`;\n}\n\n/** True when the repository still registers DoomPi alongside the user scope. */\nexport function projectRegistersDoom(repoRoot: string, homeDirectory: string = os.homedir()): boolean {\n const settings = readProjectPiSettings(repoRoot);\n if (!settings) return false;\n return (\n serializeProjectPiSettings(mergeProjectPiSettings(settings, repoRoot, homeDirectory)) !==\n serializeProjectPiSettings(settings)\n );\n}\n\n/**\n * Removes the alias a repository-scoped registration needed.\n *\n * Only a symbolic link is removed, for the same reason sync refuses to replace\n * one: anything else at that path was not created here.\n */\nfunction removeProjectExtensionAlias(repoRoot: string): void {\n const aliasPath = piExtensionAliasPath(projectPiDirectory(repoRoot));\n if (fs.lstatSync(aliasPath, { throwIfNoEntry: false })?.isSymbolicLink()) {\n fs.rmSync(aliasPath, { force: true });\n }\n}\n\n/**\n * Reconciles the repository's Pi settings with the user-scope registration.\n *\n * The file is never created and never deleted, only rewritten: an absent one\n * means the repository registers nothing, and an existing one is a repository\n * root marker that other DoomPi code walks up to find.\n */\nexport function writeProjectPiSettings(repoRoot: string, homeDirectory: string = os.homedir()): string | undefined {\n const settings = readProjectPiSettings(repoRoot);\n removeProjectExtensionAlias(repoRoot);\n if (!settings) return undefined;\n\n const merged = mergeProjectPiSettings(settings, repoRoot, homeDirectory);\n const serialized = serializeProjectPiSettings(merged);\n if (serialized === serializeProjectPiSettings(settings)) return undefined;\n\n const settingsPath = projectPiSettingsPath(repoRoot);\n writeFileAtomic(settingsPath, serialized);\n return settingsPath;\n}\n"],"mappings":"kUAmBA,MAIM,EAAqB,SAIrB,EAAmB,CAAC,IAAK,IAAK,IAAI,CAWxC,SAAgB,EAAmB,EAA0B,CAC3D,OAAOA,EAAAA,QAAK,KAAK,EAAU,MAAa,CAG1C,SAAgB,EAAsB,EAA0B,CAC9D,OAAOA,EAAAA,QAAK,KAAK,EAAmB,EAAS,CAAE,gBAAc,CAG/D,SAAS,EAAoB,EAAe,EAAuB,EAA+B,CAGhG,OAFI,IAAU,IAAmB,EAC7B,EAAM,WAAW,KAAkB,CAASA,EAAAA,QAAK,KAAK,EAAe,EAAM,MAAM,EAAyB,CAAC,CACxGA,EAAAA,QAAK,QAAQ,EAAe,EAAM,CAY3C,SAAS,EAAY,EAAe,EAAuB,EAAgC,CACzF,IAAM,EAAa,EAAM,WAAW,KAAM,IAAI,CAAC,MAAM,CAGrD,OAFI,IAAA,oBAAyC,GACzC,EAAiB,KAAM,GAAW,EAAW,WAAW,EAAO,CAAC,CAAS,GACtEC,EAAAA,kBAAkB,EAAoB,EAAY,EAAe,EAAc,CAAC,CAGzF,SAAS,EAAc,EAAoC,CACzD,GAAI,OAAO,GAAU,SAAU,OAAO,EACtC,GAAIC,EAAAA,SAAS,EAAM,EAAI,OAAO,EAAM,IAAwB,SAAU,OAAO,EAAM,GAWrF,SAAS,EAAmB,EAAgB,EAAuB,EAAgC,CACjG,GAAI,CAAC,MAAM,QAAQ,EAAM,CAAE,OAAO,EAClC,IAAM,EAAO,EAAM,OAAQ,GAAU,CACnC,IAAM,EAAS,EAAc,EAAM,CACnC,OAAO,IAAW,IAAA,IAAa,CAAC,EAAY,EAAQ,EAAe,EAAc,EACjF,CAEF,OADI,EAAK,SAAW,EAAM,OAAe,EAClC,EAAK,OAAS,EAAI,EAAO,IAAA,GAIlC,SAAgB,EACd,EACA,EACA,EAAwBC,EAAAA,QAAG,SAAS,CACxB,CACZ,IAAM,EAAgB,EAAmB,EAAS,CAC5C,EAAqB,CAAE,GAAG,EAAS,CACzC,IAAK,IAAM,IAAO,CAAC,aAAgB,WAAa,CAAE,CAChD,GAAI,EAAE,KAAO,GAAS,SACtB,IAAM,EAAO,EAAmB,EAAO,GAAM,EAAe,EAAc,CACtE,IAAS,IAAA,GAAW,OAAO,EAAO,GACjC,EAAO,GAAO,EAErB,OAAO,EAIT,SAAgB,EAAsB,EAA0C,CAC9E,IAAM,EAAe,EAAsB,EAAS,CACpD,GAAI,CAACC,EAAAA,QAAG,WAAW,EAAa,CAAE,OAClC,IAAM,EAAWC,EAAAA,SAAS,EAAa,CACvC,OAAOH,EAAAA,SAAS,EAAS,CAAG,EAAW,EAAE,CAG3C,SAAgB,EAA2B,EAA8B,CACvE,MAAO,GAAG,KAAK,UAAU,EAAU,KAAM,EAAE,CAAC,IAI9C,SAAgB,EAAqB,EAAkB,EAAwBC,EAAAA,QAAG,SAAS,CAAW,CACpG,IAAM,EAAW,EAAsB,EAAS,CAEhD,OADK,EAEH,EAA2B,EAAuB,EAAU,EAAU,EAAc,CAAC,GACrF,EAA2B,EAAS,CAHhB,GAaxB,SAAS,EAA4B,EAAwB,CAC3D,IAAM,EAAYG,EAAAA,qBAAqB,EAAmB,EAAS,CAAC,CAChEF,EAAAA,QAAG,UAAU,EAAW,CAAE,eAAgB,GAAO,CAAC,EAAE,gBAAgB,EACtE,EAAA,QAAG,OAAO,EAAW,CAAE,MAAO,GAAM,CAAC,CAWzC,SAAgB,EAAuB,EAAkB,EAAwBD,EAAAA,QAAG,SAAS,CAAsB,CACjH,IAAM,EAAW,EAAsB,EAAS,CAEhD,GADA,EAA4B,EAAS,CACjC,CAAC,EAAU,OAGf,IAAM,EAAa,EADJ,EAAuB,EAAU,EAAU,EACN,CAAC,CACrD,GAAI,IAAe,EAA2B,EAAS,CAAE,OAEzD,IAAM,EAAe,EAAsB,EAAS,CAEpD,OADA,EAAA,gBAAgB,EAAc,EAAW,CAClC"}
@@ -0,0 +1,29 @@
1
+ import { JsonObject } from "./serialization/json.cjs";
2
+
3
+ //#region src/adapters/projectPiSettings.d.ts
4
+ /**
5
+ * Reported by `sync --check` and `build`, and repaired by `sync`.
6
+ *
7
+ * Lives here rather than with either command because both report the same
8
+ * finding about the same file, and the detector below is what decides it.
9
+ */
10
+ declare const DUPLICATE_REGISTRATION_DRIFT = "duplicate DoomPi registration in .pi/settings.json";
11
+ declare function projectPiSettingsPath(repoRoot: string): string;
12
+ /** Produces the project settings content for a reconciliation, without writing it. */
13
+ declare function mergeProjectPiSettings(current: JsonObject, repoRoot: string, homeDirectory?: string): JsonObject;
14
+ /** Reads Pi's project settings, or nothing when the repository declares none. */
15
+ declare function readProjectPiSettings(repoRoot: string): JsonObject | undefined;
16
+ declare function serializeProjectPiSettings(settings: JsonObject): string;
17
+ /** True when the repository still registers DoomPi alongside the user scope. */
18
+ declare function projectRegistersDoom(repoRoot: string, homeDirectory?: string): boolean;
19
+ /**
20
+ * Reconciles the repository's Pi settings with the user-scope registration.
21
+ *
22
+ * The file is never created and never deleted, only rewritten: an absent one
23
+ * means the repository registers nothing, and an existing one is a repository
24
+ * root marker that other DoomPi code walks up to find.
25
+ */
26
+ declare function writeProjectPiSettings(repoRoot: string, homeDirectory?: string): string | undefined;
27
+ //#endregion
28
+ export { DUPLICATE_REGISTRATION_DRIFT, mergeProjectPiSettings, projectPiSettingsPath, projectRegistersDoom, readProjectPiSettings, serializeProjectPiSettings, writeProjectPiSettings };
29
+ //# sourceMappingURL=projectPiSettings.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectPiSettings.d.cts","names":[],"sources":["../../src/adapters/projectPiSettings.ts"],"mappings":";;;;;AAmCA;;;;cAAa,4BAAA;AAAA,iBAOG,qBAAA,CAAsB,QAAA;;iBAkDtB,sBAAA,CACd,OAAA,EAAS,UAAA,EACT,QAAA,UACA,aAAA,YACC,UAAA;AAJH;AAAA,iBAiBgB,qBAAA,CAAsB,QAAA,WAAmB,UAAA;AAAA,iBAOzC,0BAAA,CAA2B,QAAA,EAAU,UAAA;;iBAKrC,oBAAA,CAAqB,QAAA,UAAkB,aAAA;;;;;;;AAZvD;iBAyCgB,sBAAA,CAAuB,QAAA,UAAkB,aAAA"}
@@ -0,0 +1,29 @@
1
+ import { JsonObject } from "./serialization/json.mjs";
2
+
3
+ //#region src/adapters/projectPiSettings.d.ts
4
+ /**
5
+ * Reported by `sync --check` and `build`, and repaired by `sync`.
6
+ *
7
+ * Lives here rather than with either command because both report the same
8
+ * finding about the same file, and the detector below is what decides it.
9
+ */
10
+ declare const DUPLICATE_REGISTRATION_DRIFT = "duplicate DoomPi registration in .pi/settings.json";
11
+ declare function projectPiSettingsPath(repoRoot: string): string;
12
+ /** Produces the project settings content for a reconciliation, without writing it. */
13
+ declare function mergeProjectPiSettings(current: JsonObject, repoRoot: string, homeDirectory?: string): JsonObject;
14
+ /** Reads Pi's project settings, or nothing when the repository declares none. */
15
+ declare function readProjectPiSettings(repoRoot: string): JsonObject | undefined;
16
+ declare function serializeProjectPiSettings(settings: JsonObject): string;
17
+ /** True when the repository still registers DoomPi alongside the user scope. */
18
+ declare function projectRegistersDoom(repoRoot: string, homeDirectory?: string): boolean;
19
+ /**
20
+ * Reconciles the repository's Pi settings with the user-scope registration.
21
+ *
22
+ * The file is never created and never deleted, only rewritten: an absent one
23
+ * means the repository registers nothing, and an existing one is a repository
24
+ * root marker that other DoomPi code walks up to find.
25
+ */
26
+ declare function writeProjectPiSettings(repoRoot: string, homeDirectory?: string): string | undefined;
27
+ //#endregion
28
+ export { DUPLICATE_REGISTRATION_DRIFT, mergeProjectPiSettings, projectPiSettingsPath, projectRegistersDoom, readProjectPiSettings, serializeProjectPiSettings, writeProjectPiSettings };
29
+ //# sourceMappingURL=projectPiSettings.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectPiSettings.d.mts","names":[],"sources":["../../src/adapters/projectPiSettings.ts"],"mappings":";;;;;AAmCA;;;;cAAa,4BAAA;AAAA,iBAOG,qBAAA,CAAsB,QAAA;;iBAkDtB,sBAAA,CACd,OAAA,EAAS,UAAA,EACT,QAAA,UACA,aAAA,YACC,UAAA;AAJH;AAAA,iBAiBgB,qBAAA,CAAsB,QAAA,WAAmB,UAAA;AAAA,iBAOzC,0BAAA,CAA2B,QAAA,EAAU,UAAA;;iBAKrC,oBAAA,CAAqB,QAAA,UAAkB,aAAA;;;;;;;AAZvD;iBAyCgB,sBAAA,CAAuB,QAAA,UAAkB,aAAA"}
@@ -0,0 +1,2 @@
1
+ import{isRecord as e,readJson as t,writeFileAtomic as n}from"./serialization/json.mjs";import"../utils/index.mjs";import{isDoomPackagePath as r}from"./doomPackage.mjs";import{piExtensionAliasPath as i}from"./piExtensionAlias.mjs";import a from"node:path";import o from"node:fs";import s from"node:os";const c=`source`,l=[`!`,`+`,`-`],u=`duplicate DoomPi registration in .pi/settings.json`;function d(e){return a.join(e,`.pi`)}function f(e){return a.join(d(e),`settings.json`)}function p(e,t,n){return e===`~`?n:e.startsWith(`~/`)?a.join(n,e.slice(2)):a.resolve(t,e)}function m(e,t,n){let i=e.replaceAll(`\\`,`/`).trim();return i===`@agimon-ai/doompi`?!0:l.some(e=>i.startsWith(e))?!1:r(p(i,t,n))}function h(t){if(typeof t==`string`)return t;if(e(t)&&typeof t[c]==`string`)return t[c]}function g(e,t,n){if(!Array.isArray(e))return e;let r=e.filter(e=>{let r=h(e);return r===void 0||!m(r,t,n)});return r.length===e.length?e:r.length>0?r:void 0}function _(e,t,n=s.homedir()){let r=d(t),i={...e};for(let e of[`extensions`,`packages`]){if(!(e in i))continue;let t=g(i[e],r,n);t===void 0?delete i[e]:i[e]=t}return i}function v(n){let r=f(n);if(!o.existsSync(r))return;let i=t(r);return e(i)?i:{}}function y(e){return`${JSON.stringify(e,null,2)}\n`}function b(e,t=s.homedir()){let n=v(e);return n?y(_(n,e,t))!==y(n):!1}function x(e){let t=i(d(e));o.lstatSync(t,{throwIfNoEntry:!1})?.isSymbolicLink()&&o.rmSync(t,{force:!0})}function S(e,t=s.homedir()){let r=v(e);if(x(e),!r)return;let i=y(_(r,e,t));if(i===y(r))return;let a=f(e);return n(a,i),a}export{u as DUPLICATE_REGISTRATION_DRIFT,_ as mergeProjectPiSettings,f as projectPiSettingsPath,b as projectRegistersDoom,v as readProjectPiSettings,y as serializeProjectPiSettings,S as writeProjectPiSettings};
2
+ //# sourceMappingURL=projectPiSettings.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectPiSettings.mjs","names":[],"sources":["../../src/adapters/projectPiSettings.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { isRecord, type JsonObject, readJson, writeFileAtomic } from '../utils/index.ts';\nimport { DOOM_PACKAGE_NAME, isDoomPackagePath } from './doomPackage.ts';\nimport { piExtensionAliasPath } from './piExtensionAlias.ts';\n\n/**\n * Pi's project settings, as `doompi sync` reconciles them.\n *\n * Pi documents project settings as overriding user settings, but resource\n * resolution unions the two scopes and dedupes only by the resolved file's real\n * path. A repository that registers DoomPi alongside the stable user entry\n * therefore loads two installs of the same package against one home-scoped\n * worktree state. Sync removes the redundant project registration and leaves every\n * other key alone: the repository still overrides the user scope, through its own\n * `.doom` configuration and the runtime staged under `~/.pi/.doom/sync`.\n */\n\nconst PI_DIRECTORY = '.pi';\nconst SETTINGS_FILE = 'settings.json';\nconst EXTENSIONS_KEY = 'extensions';\nconst PACKAGES_KEY = 'packages';\nconst PACKAGE_SOURCE_KEY = 'source';\nconst HOME_ALIAS = '~';\nconst HOME_ALIAS_PREFIX = '~/';\n/** Pattern-form entries Pi filters with rather than resolves. */\nconst PATTERN_PREFIXES = ['!', '+', '-'] as const;\n\n/**\n * Reported by `sync --check` and `build`, and repaired by `sync`.\n *\n * Lives here rather than with either command because both report the same\n * finding about the same file, and the detector below is what decides it.\n */\nexport const DUPLICATE_REGISTRATION_DRIFT = 'duplicate DoomPi registration in .pi/settings.json';\n\n/** Pi's project configuration directory, the base its relative paths resolve against. */\nexport function projectPiDirectory(repoRoot: string): string {\n return path.join(repoRoot, PI_DIRECTORY);\n}\n\nexport function projectPiSettingsPath(repoRoot: string): string {\n return path.join(projectPiDirectory(repoRoot), SETTINGS_FILE);\n}\n\nfunction resolveSettingsPath(value: string, baseDirectory: string, homeDirectory: string): string {\n if (value === HOME_ALIAS) return homeDirectory;\n if (value.startsWith(HOME_ALIAS_PREFIX)) return path.join(homeDirectory, value.slice(HOME_ALIAS_PREFIX.length));\n return path.resolve(baseDirectory, value);\n}\n\n/**\n * Whether one settings entry names this package.\n *\n * The bare package name is matched textually because that is the spelling sync\n * writes into the user scope, and a resolved path is matched by walking to the\n * package it belongs to, which is what catches `../packages/cli/doompi` and a\n * direct reference to a file inside it. Pattern entries select among already\n * resolved paths rather than naming one, so they are left for the user to own.\n */\nfunction isDoomEntry(value: string, baseDirectory: string, homeDirectory: string): boolean {\n const normalized = value.replaceAll('\\\\', '/').trim();\n if (normalized === DOOM_PACKAGE_NAME) return true;\n if (PATTERN_PREFIXES.some((prefix) => normalized.startsWith(prefix))) return false;\n return isDoomPackagePath(resolveSettingsPath(normalized, baseDirectory, homeDirectory));\n}\n\nfunction packageSource(entry: unknown): string | undefined {\n if (typeof entry === 'string') return entry;\n if (isRecord(entry) && typeof entry[PACKAGE_SOURCE_KEY] === 'string') return entry[PACKAGE_SOURCE_KEY];\n return undefined;\n}\n\n/**\n * Drops DoomPi from one resource list, or reports that the key should go.\n *\n * A list that empties out is removed rather than left behind: an empty array is\n * indistinguishable from an absent one to Pi, and keeping it would leave the\n * repository looking like it still configures something.\n */\nfunction withoutDoomEntries(value: unknown, baseDirectory: string, homeDirectory: string): unknown {\n if (!Array.isArray(value)) return value;\n const kept = value.filter((entry) => {\n const source = packageSource(entry);\n return source === undefined || !isDoomEntry(source, baseDirectory, homeDirectory);\n });\n if (kept.length === value.length) return value;\n return kept.length > 0 ? kept : undefined;\n}\n\n/** Produces the project settings content for a reconciliation, without writing it. */\nexport function mergeProjectPiSettings(\n current: JsonObject,\n repoRoot: string,\n homeDirectory: string = os.homedir(),\n): JsonObject {\n const baseDirectory = projectPiDirectory(repoRoot);\n const merged: JsonObject = { ...current };\n for (const key of [EXTENSIONS_KEY, PACKAGES_KEY]) {\n if (!(key in merged)) continue;\n const next = withoutDoomEntries(merged[key], baseDirectory, homeDirectory);\n if (next === undefined) delete merged[key];\n else merged[key] = next;\n }\n return merged;\n}\n\n/** Reads Pi's project settings, or nothing when the repository declares none. */\nexport function readProjectPiSettings(repoRoot: string): JsonObject | undefined {\n const settingsPath = projectPiSettingsPath(repoRoot);\n if (!fs.existsSync(settingsPath)) return undefined;\n const settings = readJson(settingsPath);\n return isRecord(settings) ? settings : {};\n}\n\nexport function serializeProjectPiSettings(settings: JsonObject): string {\n return `${JSON.stringify(settings, null, 2)}\\n`;\n}\n\n/** True when the repository still registers DoomPi alongside the user scope. */\nexport function projectRegistersDoom(repoRoot: string, homeDirectory: string = os.homedir()): boolean {\n const settings = readProjectPiSettings(repoRoot);\n if (!settings) return false;\n return (\n serializeProjectPiSettings(mergeProjectPiSettings(settings, repoRoot, homeDirectory)) !==\n serializeProjectPiSettings(settings)\n );\n}\n\n/**\n * Removes the alias a repository-scoped registration needed.\n *\n * Only a symbolic link is removed, for the same reason sync refuses to replace\n * one: anything else at that path was not created here.\n */\nfunction removeProjectExtensionAlias(repoRoot: string): void {\n const aliasPath = piExtensionAliasPath(projectPiDirectory(repoRoot));\n if (fs.lstatSync(aliasPath, { throwIfNoEntry: false })?.isSymbolicLink()) {\n fs.rmSync(aliasPath, { force: true });\n }\n}\n\n/**\n * Reconciles the repository's Pi settings with the user-scope registration.\n *\n * The file is never created and never deleted, only rewritten: an absent one\n * means the repository registers nothing, and an existing one is a repository\n * root marker that other DoomPi code walks up to find.\n */\nexport function writeProjectPiSettings(repoRoot: string, homeDirectory: string = os.homedir()): string | undefined {\n const settings = readProjectPiSettings(repoRoot);\n removeProjectExtensionAlias(repoRoot);\n if (!settings) return undefined;\n\n const merged = mergeProjectPiSettings(settings, repoRoot, homeDirectory);\n const serialized = serializeProjectPiSettings(merged);\n if (serialized === serializeProjectPiSettings(settings)) return undefined;\n\n const settingsPath = projectPiSettingsPath(repoRoot);\n writeFileAtomic(settingsPath, serialized);\n return settingsPath;\n}\n"],"mappings":"6SAmBA,MAIM,EAAqB,SAIrB,EAAmB,CAAC,IAAK,IAAK,IAAI,CAQ3B,EAA+B,qDAG5C,SAAgB,EAAmB,EAA0B,CAC3D,OAAO,EAAK,KAAK,EAAU,MAAa,CAG1C,SAAgB,EAAsB,EAA0B,CAC9D,OAAO,EAAK,KAAK,EAAmB,EAAS,CAAE,gBAAc,CAG/D,SAAS,EAAoB,EAAe,EAAuB,EAA+B,CAGhG,OAFI,IAAU,IAAmB,EAC7B,EAAM,WAAW,KAAkB,CAAS,EAAK,KAAK,EAAe,EAAM,MAAM,EAAyB,CAAC,CACxG,EAAK,QAAQ,EAAe,EAAM,CAY3C,SAAS,EAAY,EAAe,EAAuB,EAAgC,CACzF,IAAM,EAAa,EAAM,WAAW,KAAM,IAAI,CAAC,MAAM,CAGrD,OAFI,IAAA,oBAAyC,GACzC,EAAiB,KAAM,GAAW,EAAW,WAAW,EAAO,CAAC,CAAS,GACtE,EAAkB,EAAoB,EAAY,EAAe,EAAc,CAAC,CAGzF,SAAS,EAAc,EAAoC,CACzD,GAAI,OAAO,GAAU,SAAU,OAAO,EACtC,GAAI,EAAS,EAAM,EAAI,OAAO,EAAM,IAAwB,SAAU,OAAO,EAAM,GAWrF,SAAS,EAAmB,EAAgB,EAAuB,EAAgC,CACjG,GAAI,CAAC,MAAM,QAAQ,EAAM,CAAE,OAAO,EAClC,IAAM,EAAO,EAAM,OAAQ,GAAU,CACnC,IAAM,EAAS,EAAc,EAAM,CACnC,OAAO,IAAW,IAAA,IAAa,CAAC,EAAY,EAAQ,EAAe,EAAc,EACjF,CAEF,OADI,EAAK,SAAW,EAAM,OAAe,EAClC,EAAK,OAAS,EAAI,EAAO,IAAA,GAIlC,SAAgB,EACd,EACA,EACA,EAAwB,EAAG,SAAS,CACxB,CACZ,IAAM,EAAgB,EAAmB,EAAS,CAC5C,EAAqB,CAAE,GAAG,EAAS,CACzC,IAAK,IAAM,IAAO,CAAC,aAAgB,WAAa,CAAE,CAChD,GAAI,EAAE,KAAO,GAAS,SACtB,IAAM,EAAO,EAAmB,EAAO,GAAM,EAAe,EAAc,CACtE,IAAS,IAAA,GAAW,OAAO,EAAO,GACjC,EAAO,GAAO,EAErB,OAAO,EAIT,SAAgB,EAAsB,EAA0C,CAC9E,IAAM,EAAe,EAAsB,EAAS,CACpD,GAAI,CAAC,EAAG,WAAW,EAAa,CAAE,OAClC,IAAM,EAAW,EAAS,EAAa,CACvC,OAAO,EAAS,EAAS,CAAG,EAAW,EAAE,CAG3C,SAAgB,EAA2B,EAA8B,CACvE,MAAO,GAAG,KAAK,UAAU,EAAU,KAAM,EAAE,CAAC,IAI9C,SAAgB,EAAqB,EAAkB,EAAwB,EAAG,SAAS,CAAW,CACpG,IAAM,EAAW,EAAsB,EAAS,CAEhD,OADK,EAEH,EAA2B,EAAuB,EAAU,EAAU,EAAc,CAAC,GACrF,EAA2B,EAAS,CAHhB,GAaxB,SAAS,EAA4B,EAAwB,CAC3D,IAAM,EAAY,EAAqB,EAAmB,EAAS,CAAC,CAChE,EAAG,UAAU,EAAW,CAAE,eAAgB,GAAO,CAAC,EAAE,gBAAgB,EACtE,EAAG,OAAO,EAAW,CAAE,MAAO,GAAM,CAAC,CAWzC,SAAgB,EAAuB,EAAkB,EAAwB,EAAG,SAAS,CAAsB,CACjH,IAAM,EAAW,EAAsB,EAAS,CAEhD,GADA,EAA4B,EAAS,CACjC,CAAC,EAAU,OAGf,IAAM,EAAa,EADJ,EAAuB,EAAU,EAAU,EACN,CAAC,CACrD,GAAI,IAAe,EAA2B,EAAS,CAAE,OAEzD,IAAM,EAAe,EAAsB,EAAS,CAEpD,OADA,EAAgB,EAAc,EAAW,CAClC"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../../_virtual/_rolldown/runtime.cjs`);let t=require(`node:path`);t=e.__toESM(t,1);let n=require(`node:fs`);n=e.__toESM(n,1);const r=t.default.join(`.pi`,`settings.json`);function i(e){try{return n.default.statSync(e).isDirectory()}catch{return!1}}function a(e){try{return n.default.statSync(e).isFile()}catch{return!1}}function o(e){return i(t.default.join(e,`.doom`))||a(t.default.join(e,r))}function s(e){let n=t.default.resolve(e);for(;;){if(o(n))return n;let r=t.default.dirname(n);if(r===n)throw Error(`Could not find repository root from ${e}`);n=r}}exports.findRepositoryRoot=s,exports.isRepositoryRoot=o;
2
+ //# sourceMappingURL=repository.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.cjs","names":["path","fs"],"sources":["../../../src/adapters/repository/repository.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\n/** Doom's own repository configuration directory. */\nconst DOOM_DIRECTORY = '.doom';\n/** A Pi project that has been configured, rather than any stray `.pi` folder. */\nconst PI_SETTINGS = path.join('.pi', 'settings.json');\n\nfunction isDirectory(target: string): boolean {\n try {\n return fs.statSync(target).isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction isFile(target: string): boolean {\n try {\n return fs.statSync(target).isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * True when a directory carries a marker Doom Pi is willing to treat as a root.\n *\n * Only Doom's own directory or an existing Pi settings file count. Build tooling\n * markers are deliberately not consulted: a consumer repository has no Nx, pnpm\n * workspace, or plugins profile to offer, and trusting arbitrary project config\n * would let an unapproved directory decide what gets loaded.\n */\nexport function isRepositoryRoot(directory: string): boolean {\n return isDirectory(path.join(directory, DOOM_DIRECTORY)) || isFile(path.join(directory, PI_SETTINGS));\n}\n\n/**\n * Walks up from `start` looking for the repository root.\n *\n * The nearest marked ancestor wins, so a session started in a subdirectory\n * resolves to the repository that configured Doom rather than to a parent\n * checkout that happens to sit above it.\n */\nexport function findRepositoryRoot(start: string): string {\n let directory = path.resolve(start);\n while (true) {\n if (isRepositoryRoot(directory)) return directory;\n const parent = path.dirname(directory);\n if (parent === directory) throw new Error(`Could not find repository root from ${start}`);\n directory = parent;\n }\n}\n"],"mappings":"8IAIA,MAEM,EAAcA,EAAAA,QAAK,KAAK,MAAO,gBAAgB,CAErD,SAAS,EAAY,EAAyB,CAC5C,GAAI,CACF,OAAOC,EAAAA,QAAG,SAAS,EAAO,CAAC,aAAa,MAClC,CACN,MAAO,IAIX,SAAS,EAAO,EAAyB,CACvC,GAAI,CACF,OAAOA,EAAAA,QAAG,SAAS,EAAO,CAAC,QAAQ,MAC7B,CACN,MAAO,IAYX,SAAgB,EAAiB,EAA4B,CAC3D,OAAO,EAAYD,EAAAA,QAAK,KAAK,EAAW,QAAe,CAAC,EAAI,EAAOA,EAAAA,QAAK,KAAK,EAAW,EAAY,CAAC,CAUvG,SAAgB,EAAmB,EAAuB,CACxD,IAAI,EAAYA,EAAAA,QAAK,QAAQ,EAAM,CACnC,OAAa,CACX,GAAI,EAAiB,EAAU,CAAE,OAAO,EACxC,IAAM,EAASA,EAAAA,QAAK,QAAQ,EAAU,CACtC,GAAI,IAAW,EAAW,MAAU,MAAM,uCAAuC,IAAQ,CACzF,EAAY"}
@@ -0,0 +1,21 @@
1
+ //#region src/adapters/repository/repository.d.ts
2
+ /**
3
+ * True when a directory carries a marker Doom Pi is willing to treat as a root.
4
+ *
5
+ * Only Doom's own directory or an existing Pi settings file count. Build tooling
6
+ * markers are deliberately not consulted: a consumer repository has no Nx, pnpm
7
+ * workspace, or plugins profile to offer, and trusting arbitrary project config
8
+ * would let an unapproved directory decide what gets loaded.
9
+ */
10
+ declare function isRepositoryRoot(directory: string): boolean;
11
+ /**
12
+ * Walks up from `start` looking for the repository root.
13
+ *
14
+ * The nearest marked ancestor wins, so a session started in a subdirectory
15
+ * resolves to the repository that configured Doom rather than to a parent
16
+ * checkout that happens to sit above it.
17
+ */
18
+ declare function findRepositoryRoot(start: string): string;
19
+ //#endregion
20
+ export { findRepositoryRoot, isRepositoryRoot };
21
+ //# sourceMappingURL=repository.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.d.cts","names":[],"sources":["../../../src/adapters/repository/repository.ts"],"mappings":";;AAgCA;;;;;AAWA;;iBAXgB,gBAAA,CAAiB,SAAA;;;;;;;;iBAWjB,kBAAA,CAAmB,KAAA"}
@@ -0,0 +1,21 @@
1
+ //#region src/adapters/repository/repository.d.ts
2
+ /**
3
+ * True when a directory carries a marker Doom Pi is willing to treat as a root.
4
+ *
5
+ * Only Doom's own directory or an existing Pi settings file count. Build tooling
6
+ * markers are deliberately not consulted: a consumer repository has no Nx, pnpm
7
+ * workspace, or plugins profile to offer, and trusting arbitrary project config
8
+ * would let an unapproved directory decide what gets loaded.
9
+ */
10
+ declare function isRepositoryRoot(directory: string): boolean;
11
+ /**
12
+ * Walks up from `start` looking for the repository root.
13
+ *
14
+ * The nearest marked ancestor wins, so a session started in a subdirectory
15
+ * resolves to the repository that configured Doom rather than to a parent
16
+ * checkout that happens to sit above it.
17
+ */
18
+ declare function findRepositoryRoot(start: string): string;
19
+ //#endregion
20
+ export { findRepositoryRoot, isRepositoryRoot };
21
+ //# sourceMappingURL=repository.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.d.mts","names":[],"sources":["../../../src/adapters/repository/repository.ts"],"mappings":";;AAgCA;;;;;AAWA;;iBAXgB,gBAAA,CAAiB,SAAA;;;;;;;;iBAWjB,kBAAA,CAAmB,KAAA"}
@@ -0,0 +1,2 @@
1
+ import e from"node:path";import t from"node:fs";const n=e.join(`.pi`,`settings.json`);function r(e){try{return t.statSync(e).isDirectory()}catch{return!1}}function i(e){try{return t.statSync(e).isFile()}catch{return!1}}function a(t){return r(e.join(t,`.doom`))||i(e.join(t,n))}function o(t){let n=e.resolve(t);for(;;){if(a(n))return n;let r=e.dirname(n);if(r===n)throw Error(`Could not find repository root from ${t}`);n=r}}export{o as findRepositoryRoot,a as isRepositoryRoot};
2
+ //# sourceMappingURL=repository.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.mjs","names":[],"sources":["../../../src/adapters/repository/repository.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\n/** Doom's own repository configuration directory. */\nconst DOOM_DIRECTORY = '.doom';\n/** A Pi project that has been configured, rather than any stray `.pi` folder. */\nconst PI_SETTINGS = path.join('.pi', 'settings.json');\n\nfunction isDirectory(target: string): boolean {\n try {\n return fs.statSync(target).isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction isFile(target: string): boolean {\n try {\n return fs.statSync(target).isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * True when a directory carries a marker Doom Pi is willing to treat as a root.\n *\n * Only Doom's own directory or an existing Pi settings file count. Build tooling\n * markers are deliberately not consulted: a consumer repository has no Nx, pnpm\n * workspace, or plugins profile to offer, and trusting arbitrary project config\n * would let an unapproved directory decide what gets loaded.\n */\nexport function isRepositoryRoot(directory: string): boolean {\n return isDirectory(path.join(directory, DOOM_DIRECTORY)) || isFile(path.join(directory, PI_SETTINGS));\n}\n\n/**\n * Walks up from `start` looking for the repository root.\n *\n * The nearest marked ancestor wins, so a session started in a subdirectory\n * resolves to the repository that configured Doom rather than to a parent\n * checkout that happens to sit above it.\n */\nexport function findRepositoryRoot(start: string): string {\n let directory = path.resolve(start);\n while (true) {\n if (isRepositoryRoot(directory)) return directory;\n const parent = path.dirname(directory);\n if (parent === directory) throw new Error(`Could not find repository root from ${start}`);\n directory = parent;\n }\n}\n"],"mappings":"gDAIA,MAEM,EAAc,EAAK,KAAK,MAAO,gBAAgB,CAErD,SAAS,EAAY,EAAyB,CAC5C,GAAI,CACF,OAAO,EAAG,SAAS,EAAO,CAAC,aAAa,MAClC,CACN,MAAO,IAIX,SAAS,EAAO,EAAyB,CACvC,GAAI,CACF,OAAO,EAAG,SAAS,EAAO,CAAC,QAAQ,MAC7B,CACN,MAAO,IAYX,SAAgB,EAAiB,EAA4B,CAC3D,OAAO,EAAY,EAAK,KAAK,EAAW,QAAe,CAAC,EAAI,EAAO,EAAK,KAAK,EAAW,EAAY,CAAC,CAUvG,SAAgB,EAAmB,EAAuB,CACxD,IAAI,EAAY,EAAK,QAAQ,EAAM,CACnC,OAAa,CACX,GAAI,EAAiB,EAAU,CAAE,OAAO,EACxC,IAAM,EAAS,EAAK,QAAQ,EAAU,CACtC,GAAI,IAAW,EAAW,MAAU,MAAM,uCAAuC,IAAQ,CACzF,EAAY"}
@@ -0,0 +1,3 @@
1
+ const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`./syncLocation.cjs`),n=require(`../services/tools/toolNames.cjs`);require(`../utils/index.cjs`);const r=require(`./mcpFilter.cjs`);let i=require(`node:path`);i=e.__toESM(i,1);let a=require(`node:fs`);a=e.__toESM(a,1);let o=require(`node:os`);o=e.__toESM(o,1);let s=require(`node:crypto`),c=require(`yaml`);const l=`agiflow-dispatcher`,u=[`read`,`grep`,`find`,`ls`,`bash`,`launch_workflow`,`list_workflows`],d=i.default.join(`cache`,`skills`);function f(e,t,n=process.env){return n.PI_SUBAGENT_CHILD_AGENT===`agiflow-dispatcher`&&n.PI_SUBAGENT_PARENT_SESSION&&t?t:e}function p(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);if(!t)throw Error(`Resource is missing YAML frontmatter`);return{attributes:(0,c.parse)(t[1]),body:t[2]??``}}const m={sonnet:`anthropic/claude-sonnet-4-6`,opus:`anthropic/claude-opus-4-6`,haiku:`anthropic/claude-haiku-4-5`};function h(e){let t=e.trim();if(!t||t!==e||t===`.`||t===`..`||t.includes(`\0`)||/[\\/]/.test(t))throw Error(`Unsafe agent name: ${JSON.stringify(e)}`);return t}function g(e){return typeof e==`string`?m[e.toLowerCase()]??e:Array.isArray(e)?e.map(e=>g(e)):e}function _(e){let{attributes:t,body:r}=p(e),i=typeof t.name==`string`?t.name:void 0;if(!i)throw Error(`Agent definition requires a name`);let a=h(i),o=Object.hasOwn(t,`tools`),s=Array.isArray(t.tools)?t.tools.map(String):typeof t.tools==`string`?t.tools.split(`,`).map(e=>e.trim()).filter(Boolean):[],l=[...new Set(s.map(n.toPiToolName).filter(e=>!!e))],u={...t,inheritProjectContext:!0,inheritSkills:!0,systemPromptMode:t.systemPromptMode??`replace`};if(o?u.tools=Array.isArray(t.tools)?l:l.join(`, `):delete u.tools,u.model!==void 0&&(u.model=g(u.model)),u.fallbackModels!==void 0&&(u.fallbackModels=g(u.fallbackModels)),u.memory===`project`||u.memory===`user`)u.memory={scope:u.memory,path:a};else if(u.memory!==void 0&&(typeof u.memory!=`object`||u.memory===null||Array.isArray(u.memory)))throw Error(`Unsupported memory declaration`);return delete u.permissionMode,{name:a,content:`---\n${(0,c.stringify)(u).trim()}\n---\n\n${r.trimStart()}`}}function v(e,n,r,a){let o=(0,s.createHash)(`sha256`).update(`${i.default.resolve(n)}\0${r}`).digest(`hex`).slice(0,16),c=a??i.default.join(t.resolveSyncLocation(e).directory,d);return i.default.join(c,`${o}.json`)}function y(e){try{let t=a.default.statSync(e.path);return t.isFile()&&t.size===e.size&&t.mtimeMs===e.mtimeMs&&t.ctimeMs===e.ctimeMs}catch{return!1}}function b(e){try{let t=a.default.statSync(e.path);return t.isDirectory()&&t.mtimeMs===e.mtimeMs&&t.ctimeMs===e.ctimeMs}catch{return!1}}function x(e,t,n){try{let r=JSON.parse(a.default.readFileSync(e,`utf8`));return r.version!==2||r.root!==i.default.resolve(t)||r.discovery!==n||!Array.isArray(r.files)||!Array.isArray(r.directories)||!r.files.every(y)||!r.directories.every(b)?void 0:r}catch{return}}function S(e,t){a.default.mkdirSync(i.default.dirname(e),{recursive:!0,mode:448});let n=`${e}.${process.pid}.${Date.now()}.tmp`;a.default.writeFileSync(n,`${JSON.stringify(t,null,2)}\n`,{mode:384});try{a.default.renameSync(n,e)}catch(t){if(a.default.rmSync(n,{force:!0}),!a.default.existsSync(e))throw t}}async function C(e){try{return await a.default.promises.access(e),!0}catch{return!1}}async function w(e,t,n){try{let r=JSON.parse(await a.default.promises.readFile(e,`utf8`));if(r.version!==2||r.root!==i.default.resolve(t)||r.discovery!==n||!Array.isArray(r.files)||!Array.isArray(r.directories))return;for(let e of r.files){let t=await a.default.promises.stat(e.path);if(!t.isFile()||t.size!==e.size||t.mtimeMs!==e.mtimeMs||t.ctimeMs!==e.ctimeMs)return}for(let e of r.directories){let t=await a.default.promises.stat(e.path);if(!t.isDirectory()||t.mtimeMs!==e.mtimeMs||t.ctimeMs!==e.ctimeMs)return}return r}catch{return}}async function T(e,t){await a.default.promises.mkdir(i.default.dirname(e),{recursive:!0,mode:448});let n=`${e}.${process.pid}.${Date.now()}.tmp`;await a.default.promises.writeFile(n,`${JSON.stringify(t,null,2)}\n`,{mode:384});try{await a.default.promises.rename(n,e)}catch(t){if(await a.default.promises.rm(n,{force:!0}),!await C(e))throw t}}function E(e,t){let n=[],r=[],o=(e,c)=>{if(!a.default.existsSync(e))return;let l=a.default.statSync(e);n.push({path:e,mtimeMs:l.mtimeMs,ctimeMs:l.ctimeMs});for(let n of a.default.readdirSync(e,{withFileTypes:!0})){let l=i.default.join(e,n.name);if(n.isDirectory()){(t===`recursive`||c===0)&&o(l,c+1);continue}if(!n.isFile()||n.name!==`SKILL.md`||t===`direct-children`&&c!==1)continue;let u=a.default.readFileSync(l,`utf8`),{attributes:d}=p(u);if(typeof d.name!=`string`)throw Error(`Resource requires a name: ${l}`);let f=a.default.statSync(l);r.push({path:l,name:d.name,digest:(0,s.createHash)(`sha256`).update(u).digest(`hex`),size:f.size,mtimeMs:f.mtimeMs,ctimeMs:f.ctimeMs})}},c=i.default.resolve(e);return o(c,0),r.sort((e,t)=>e.path.localeCompare(t.path)),n.sort((e,t)=>e.path.localeCompare(t.path)),{version:2,root:c,discovery:t,files:r,directories:n}}function D(e,t,n=`recursive`,r){if(!a.default.existsSync(t))return[];let i=v(e,t,n,r),o=x(i,t,n),s=o??E(t,n);return o||S(i,s),s.files.map(({name:e,path:t,digest:n})=>({name:e,path:t,digest:n}))}async function O(e,t){let n=[],r=[],o=async(e,c)=>{let l;try{let t=await a.default.promises.stat(e);n.push({path:e,mtimeMs:t.mtimeMs,ctimeMs:t.ctimeMs}),l=await a.default.promises.readdir(e,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return;throw e}for(let n of l){let l=i.default.join(e,n.name);if(n.isDirectory()){(t===`recursive`||c===0)&&await o(l,c+1);continue}if(!n.isFile()||n.name!==`SKILL.md`||t===`direct-children`&&c!==1)continue;let u=await a.default.promises.readFile(l,`utf8`),{attributes:d}=p(u);if(typeof d.name!=`string`)throw Error(`Resource requires a name: ${l}`);let f=await a.default.promises.stat(l);r.push({path:l,name:d.name,digest:(0,s.createHash)(`sha256`).update(u).digest(`hex`),size:f.size,mtimeMs:f.mtimeMs,ctimeMs:f.ctimeMs})}},c=i.default.resolve(e);return await o(c,0),r.sort((e,t)=>e.path.localeCompare(t.path)),n.sort((e,t)=>e.path.localeCompare(t.path)),{version:2,root:c,discovery:t,files:r,directories:n}}async function k(e,t,n=`recursive`,r){if(!await C(t))return[];let i=v(e,t,n,r),a=await w(i,t,n),o=a??await O(t,n);return a||await T(i,o),o.files.map(({name:e,path:t,digest:n})=>({name:e,path:t,digest:n}))}async function A(e){let t;try{t=await a.default.promises.readdir(e,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return[];throw e}let n=[];for(let r of t){let t=i.default.join(e,r.name);r.isDirectory()&&n.push(...await A(t)),r.isFile()&&r.name.endsWith(`.md`)&&n.push(t)}return n}async function j(e){let{attributes:t}=p(await a.default.promises.readFile(e,`utf8`));if(typeof t.name!=`string`)throw Error(`Resource requires a name: ${e}`);return t.name}async function M(e,t){let n=new Map,r=new Map;for(let i of e){let e=n.get(i.name),o=i.digest??(0,s.createHash)(`sha256`).update(await a.default.promises.readFile(i.path)).digest(`hex`);if(e&&r.get(i.name)!==o)throw Error(`Conflicting ${t} "${i.name}": ${e} and ${i.path}`);n.set(i.name,i.path),r.set(i.name,o)}}function N(e){let t={name:l,description:`Selects and launches Agiflow workflows for one loop pass without implementing the work.`,thinking:`high`,systemPromptMode:`replace`,inheritProjectContext:!0,inheritSkills:!0,tools:u.join(`, `),extensions:[e],defaultContext:`fresh`,defaultProgress:!1},n=[`You are the Agiflow workflow dispatcher.`,`Reason about the supplied dispatch context and launch eligible workflows.`,`Launch workflows without monitoring them. After dispatching, report and exit.`,`Follow the task restrictions exactly. Do not implement jobs or edit repository files.`].join(`
2
+ `);return`---\n${(0,c.stringify)(t).trim()}\n---\n\n${n}\n`}function P(e){let t={mcpServers:{}},n=t.mcpServers,r=new Map;for(let t of e){if(!a.default.existsSync(t))continue;let e=JSON.parse(a.default.readFileSync(t,`utf8`)).mcpServers??{};for(let[i,a]of Object.entries(e)){let e=n[i];if(e&&JSON.stringify(e)!==JSON.stringify(a))throw Error(`Conflicting MCP server "${i}": ${r.get(i)} and ${t}`);n[i]=a,r.set(i,t)}}return t}async function F(e){let t={mcpServers:{}},n=t.mcpServers,r=new Map;for(let t of e){let e;try{e=await a.default.promises.readFile(t,`utf8`)}catch(e){if(e.code===`ENOENT`)continue;throw e}let i=JSON.parse(e).mcpServers??{};for(let[e,a]of Object.entries(i)){let i=n[e];if(i&&JSON.stringify(i)!==JSON.stringify(a))throw Error(`Conflicting MCP server "${e}": ${r.get(e)} and ${t}`);n[e]=a,r.set(e,t)}}return t}function I(e,t){return e?e.some(e=>e.includes(`*`)?RegExp(`^${e.split(`*`).map(L).join(`.*`)}$`).test(t):e===t):!0}function L(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}async function R(e,t,n){let s=t.map(e=>typeof e==`string`?{directory:e}:e),c=n.temporaryDirectory===void 0,u=n.temporaryDirectory??await a.default.promises.mkdtemp(i.default.join(o.default.tmpdir(),`doom-pi-`));await a.default.promises.mkdir(u,{mode:448,recursive:!0}),await a.default.promises.chmod(u,448);let d=i.default.join(e,`.claude`,`skills`),f=n.sharedSkills===!1?[]:await k(e,d,`recursive`,n.skillCacheDirectory),p=[],m=[],g=[],v=[],y=[],b=[i.default.join(e,`.mcp.json`)];for(let t of s){let r=t.directory,a=i.default.join(r,`skills`);if(await C(a)){let r=(await k(e,a,t.skillDiscovery??`recursive`,n.skillCacheDirectory)).filter(e=>I(t.skills,e.name));p.push(...r.map(e=>e.path)),m.push(...r)}let o=await A(i.default.join(r,`agents`)),s=await Promise.all(o.map(e=>j(e)));g.push(...o.map((e,t)=>({name:s[t]??``,path:e})).filter(e=>I(t.agents,e.name)));let c=i.default.join(r,`hooks`,`hooks.json`);t.hooks!==!1&&await C(c)&&v.push({pluginRoot:r,configPath:c});let l=i.default.join(r,`.mcp.json`);t.mcp!==!1&&await C(l)&&(b.push(l),y.push(l))}await M(m,`skill`),await M(f,`skill`);let x=new Set(m.map(e=>e.name)),S=f.filter(e=>!x.has(e.name));if(p.push(...S.map(e=>e.path)),m.push(...S),await M(g,`agent`),g.some(e=>e.name===`agiflow-dispatcher`))throw Error(`Conflicting agent "${l}": reserved by the agent harness`);let w=[],T,E=i.default.join(u,`agents`);if(await a.default.promises.rm(E,{recursive:!0,force:!0}),n.agents&&(g.length>0||n.dispatcherWorkflowExtension)){await a.default.promises.mkdir(E,{mode:448});for(let e of g){let t=_(await a.default.promises.readFile(e.path,`utf8`));await a.default.promises.writeFile(i.default.join(E,`${h(t.name)}.md`),t.content,{mode:384})}n.dispatcherWorkflowExtension&&(T=n.dispatcherWorkflowExtension,await a.default.promises.writeFile(i.default.join(E,`${l}.md`),N(n.dispatcherWorkflowExtension),{mode:384})),w.push(E)}let D;if(n.mcp){D=i.default.join(u,`mcp.json`);let t=await r.applyMcpAllowlist(await F(b),n.mcpAllowlist,e,u);await a.default.promises.writeFile(D,`${JSON.stringify(t,null,2)}\n`,{mode:384})}return{temporaryDirectory:u,skillDirectories:p,skillCount:m.length,agentCount:g.length,agentDirectories:w,pluginHooks:v,dispatcherWorkflowExtensionPath:T,mcpConfigPath:D,pluginMcpConfigPaths:y,cleanup:()=>c?a.default.promises.rm(u,{recursive:!0,force:!0}):Promise.resolve()}}exports.DISPATCHER_AGENT_NAME=l,exports.adaptAgentDefinition=_,exports.collectResources=R,exports.discoverSkills=D,exports.discoverSkillsAsync=k,exports.mergeMcpConfigs=P,exports.mergeMcpConfigsAsync=F,exports.selectWorkflowExtensionForProcess=f;
3
+ //# sourceMappingURL=resourceCollector.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resourceCollector.cjs","names":["path","toPiToolName","resolveSyncLocation","fs","os","applyMcpAllowlist"],"sources":["../../src/adapters/resourceCollector.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport type { PluginEntry, PluginSkillDiscovery } from '@agimon-ai/doompi-config/domains';\nimport { parse, stringify } from 'yaml';\nimport type { HarnessResourceOptions, HarnessResources, PluginHookSource } from '../types/interfaces/index.ts';\nimport { type JsonObject, toPiToolName } from '../utils/index.ts';\nimport { applyMcpAllowlist } from './mcpFilter.ts';\nimport { resolveSyncLocation } from './syncLocation.ts';\n\nexport const DISPATCHER_AGENT_NAME = 'agiflow-dispatcher';\nconst DISPATCHER_TOOLS = ['read', 'grep', 'find', 'ls', 'bash', 'launch_workflow', 'list_workflows'];\nconst SKILL_MANIFEST_VERSION = 2;\nconst SKILL_MANIFEST_HASH_LENGTH = 16;\nconst SKILL_MANIFEST_DIRECTORY = path.join('cache', 'skills');\n\ninterface NamedResource {\n name: string;\n path: string;\n digest?: string;\n}\n\ninterface SkillManifestFile {\n path: string;\n name: string;\n digest: string;\n size: number;\n mtimeMs: number;\n ctimeMs: number;\n}\n\ninterface SkillManifestDirectory {\n path: string;\n mtimeMs: number;\n ctimeMs: number;\n}\n\ninterface SkillManifest {\n version: number;\n root: string;\n discovery: PluginSkillDiscovery;\n files: SkillManifestFile[];\n directories: SkillManifestDirectory[];\n}\n\nexport function selectWorkflowExtensionForProcess(\n workflowExtension: string | undefined,\n dispatcherWorkflowExtension: string | undefined,\n environment: NodeJS.ProcessEnv = process.env,\n): string | undefined {\n const isDispatcherChild =\n environment.PI_SUBAGENT_CHILD_AGENT === DISPATCHER_AGENT_NAME && Boolean(environment.PI_SUBAGENT_PARENT_SESSION);\n return isDispatcherChild && dispatcherWorkflowExtension ? dispatcherWorkflowExtension : workflowExtension;\n}\n\nfunction splitFrontmatter(content: string): { attributes: JsonObject; body: string } {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/);\n if (!match) throw new Error('Resource is missing YAML frontmatter');\n return { attributes: parse(match[1]!) as JsonObject, body: match[2] ?? '' };\n}\n\nconst CLAUDE_MODEL_ALIASES: Record<string, string> = {\n sonnet: 'anthropic/claude-sonnet-4-6',\n opus: 'anthropic/claude-opus-4-6',\n haiku: 'anthropic/claude-haiku-4-5',\n};\n\nfunction assertSafeAgentName(name: string): string {\n const trimmed = name.trim();\n if (\n !trimmed ||\n trimmed !== name ||\n trimmed === '.' ||\n trimmed === '..' ||\n trimmed.includes('\\0') ||\n /[\\\\/]/.test(trimmed)\n ) {\n throw new Error(`Unsafe agent name: ${JSON.stringify(name)}`);\n }\n return trimmed;\n}\n\nfunction normalizeClaudeModel(value: unknown): unknown {\n if (typeof value === 'string') return CLAUDE_MODEL_ALIASES[value.toLowerCase()] ?? value;\n if (Array.isArray(value)) return value.map((entry) => normalizeClaudeModel(entry));\n return value;\n}\n\nexport function adaptAgentDefinition(content: string): { name: string; content: string } {\n const { attributes, body } = splitFrontmatter(content);\n const rawName = typeof attributes.name === 'string' ? attributes.name : undefined;\n if (!rawName) throw new Error('Agent definition requires a name');\n const name = assertSafeAgentName(rawName);\n const hasTools = Object.hasOwn(attributes, 'tools');\n const rawTools = Array.isArray(attributes.tools)\n ? attributes.tools.map(String)\n : typeof attributes.tools === 'string'\n ? attributes.tools\n .split(',')\n .map((tool) => tool.trim())\n .filter(Boolean)\n : [];\n const mappedTools = [...new Set(rawTools.map(toPiToolName).filter((tool): tool is string => Boolean(tool)))];\n const converted: JsonObject = {\n ...attributes,\n inheritProjectContext: true,\n inheritSkills: true,\n systemPromptMode: attributes.systemPromptMode ?? 'replace',\n };\n if (hasTools) converted.tools = Array.isArray(attributes.tools) ? mappedTools : mappedTools.join(', ');\n else delete converted.tools;\n if (converted.model !== undefined) converted.model = normalizeClaudeModel(converted.model);\n if (converted.fallbackModels !== undefined) converted.fallbackModels = normalizeClaudeModel(converted.fallbackModels);\n if (converted.memory === 'project' || converted.memory === 'user')\n converted.memory = { scope: converted.memory, path: name };\n else if (\n converted.memory !== undefined &&\n (typeof converted.memory !== 'object' || converted.memory === null || Array.isArray(converted.memory))\n )\n throw new Error('Unsupported memory declaration');\n delete converted.permissionMode;\n return { name, content: `---\\n${stringify(converted).trim()}\\n---\\n\\n${body.trimStart()}` };\n}\n\nfunction skillManifestPath(\n repoRoot: string,\n skillRoot: string,\n discovery: PluginSkillDiscovery,\n cacheDirectory?: string,\n): string {\n const key = createHash('sha256')\n .update(`${path.resolve(skillRoot)}\\0${discovery}`)\n .digest('hex')\n .slice(0, SKILL_MANIFEST_HASH_LENGTH);\n const directory = cacheDirectory ?? path.join(resolveSyncLocation(repoRoot).directory, SKILL_MANIFEST_DIRECTORY);\n return path.join(directory, `${key}.json`);\n}\n\nfunction fileMatches(previous: SkillManifestFile): boolean {\n try {\n const stat = fs.statSync(previous.path);\n return (\n stat.isFile() &&\n stat.size === previous.size &&\n stat.mtimeMs === previous.mtimeMs &&\n stat.ctimeMs === previous.ctimeMs\n );\n } catch {\n return false;\n }\n}\n\nfunction directoryMatches(previous: SkillManifestDirectory): boolean {\n try {\n const stat = fs.statSync(previous.path);\n return stat.isDirectory() && stat.mtimeMs === previous.mtimeMs && stat.ctimeMs === previous.ctimeMs;\n } catch {\n return false;\n }\n}\n\nfunction readSkillManifest(\n manifestPath: string,\n root: string,\n discovery: PluginSkillDiscovery,\n): SkillManifest | undefined {\n try {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as SkillManifest;\n if (\n manifest.version !== SKILL_MANIFEST_VERSION ||\n manifest.root !== path.resolve(root) ||\n manifest.discovery !== discovery ||\n !Array.isArray(manifest.files) ||\n !Array.isArray(manifest.directories) ||\n !manifest.files.every(fileMatches) ||\n !manifest.directories.every(directoryMatches)\n ) {\n return undefined;\n }\n return manifest;\n } catch {\n return undefined;\n }\n}\n\nfunction writeSkillManifest(manifestPath: string, manifest: SkillManifest): void {\n fs.mkdirSync(path.dirname(manifestPath), { recursive: true, mode: 0o700 });\n const temporary = `${manifestPath}.${process.pid}.${Date.now()}.tmp`;\n fs.writeFileSync(temporary, `${JSON.stringify(manifest, null, 2)}\\n`, { mode: 0o600 });\n try {\n fs.renameSync(temporary, manifestPath);\n } catch (error) {\n fs.rmSync(temporary, { force: true });\n if (!fs.existsSync(manifestPath)) throw error;\n }\n}\n\nasync function pathExists(target: string): Promise<boolean> {\n try {\n await fs.promises.access(target);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readSkillManifestAsync(\n manifestPath: string,\n root: string,\n discovery: PluginSkillDiscovery,\n): Promise<SkillManifest | undefined> {\n try {\n const manifest = JSON.parse(await fs.promises.readFile(manifestPath, 'utf8')) as SkillManifest;\n if (\n manifest.version !== SKILL_MANIFEST_VERSION ||\n manifest.root !== path.resolve(root) ||\n manifest.discovery !== discovery ||\n !Array.isArray(manifest.files) ||\n !Array.isArray(manifest.directories)\n ) {\n return undefined;\n }\n for (const previous of manifest.files) {\n const stat = await fs.promises.stat(previous.path);\n if (\n !stat.isFile() ||\n stat.size !== previous.size ||\n stat.mtimeMs !== previous.mtimeMs ||\n stat.ctimeMs !== previous.ctimeMs\n ) {\n return undefined;\n }\n }\n for (const previous of manifest.directories) {\n const stat = await fs.promises.stat(previous.path);\n if (!stat.isDirectory() || stat.mtimeMs !== previous.mtimeMs || stat.ctimeMs !== previous.ctimeMs) {\n return undefined;\n }\n }\n return manifest;\n } catch {\n return undefined;\n }\n}\n\nasync function writeSkillManifestAsync(manifestPath: string, manifest: SkillManifest): Promise<void> {\n await fs.promises.mkdir(path.dirname(manifestPath), { recursive: true, mode: 0o700 });\n const temporary = `${manifestPath}.${process.pid}.${Date.now()}.tmp`;\n await fs.promises.writeFile(temporary, `${JSON.stringify(manifest, null, 2)}\\n`, { mode: 0o600 });\n try {\n await fs.promises.rename(temporary, manifestPath);\n } catch (error) {\n await fs.promises.rm(temporary, { force: true });\n if (!(await pathExists(manifestPath))) throw error;\n }\n}\n\nfunction scanSkillManifest(root: string, discovery: PluginSkillDiscovery): SkillManifest {\n const directories: SkillManifestDirectory[] = [];\n const files: SkillManifestFile[] = [];\n const walk = (directory: string, depth: number): void => {\n if (!fs.existsSync(directory)) return;\n const directoryStat = fs.statSync(directory);\n directories.push({ path: directory, mtimeMs: directoryStat.mtimeMs, ctimeMs: directoryStat.ctimeMs });\n for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {\n const candidate = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n if (discovery === 'recursive' || depth === 0) walk(candidate, depth + 1);\n continue;\n }\n if (!entry.isFile() || entry.name !== 'SKILL.md' || (discovery === 'direct-children' && depth !== 1)) {\n continue;\n }\n const content = fs.readFileSync(candidate, 'utf8');\n const { attributes } = splitFrontmatter(content);\n if (typeof attributes.name !== 'string') throw new Error(`Resource requires a name: ${candidate}`);\n const stat = fs.statSync(candidate);\n files.push({\n path: candidate,\n name: attributes.name,\n digest: createHash('sha256').update(content).digest('hex'),\n size: stat.size,\n mtimeMs: stat.mtimeMs,\n ctimeMs: stat.ctimeMs,\n });\n }\n };\n const resolvedRoot = path.resolve(root);\n walk(resolvedRoot, 0);\n files.sort((left, right) => left.path.localeCompare(right.path));\n directories.sort((left, right) => left.path.localeCompare(right.path));\n return { version: SKILL_MANIFEST_VERSION, root: resolvedRoot, discovery, files, directories };\n}\n\n/** Cached skill metadata and exact files, ready for Pi without a second tree walk. */\nexport function discoverSkills(\n repoRoot: string,\n root: string,\n discovery: PluginSkillDiscovery = 'recursive',\n cacheDirectory?: string,\n): NamedResource[] {\n if (!fs.existsSync(root)) return [];\n const manifestPath = skillManifestPath(repoRoot, root, discovery, cacheDirectory);\n const cached = readSkillManifest(manifestPath, root, discovery);\n const manifest = cached ?? scanSkillManifest(root, discovery);\n if (!cached) writeSkillManifest(manifestPath, manifest);\n return manifest.files.map(({ name, path: filePath, digest }) => ({ name, path: filePath, digest }));\n}\n\nasync function scanSkillManifestAsync(root: string, discovery: PluginSkillDiscovery): Promise<SkillManifest> {\n const directories: SkillManifestDirectory[] = [];\n const files: SkillManifestFile[] = [];\n const walk = async (directory: string, depth: number): Promise<void> => {\n let entries: fs.Dirent[];\n try {\n const directoryStat = await fs.promises.stat(directory);\n directories.push({ path: directory, mtimeMs: directoryStat.mtimeMs, ctimeMs: directoryStat.ctimeMs });\n entries = await fs.promises.readdir(directory, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return;\n throw error;\n }\n for (const entry of entries) {\n const candidate = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n if (discovery === 'recursive' || depth === 0) await walk(candidate, depth + 1);\n continue;\n }\n if (!entry.isFile() || entry.name !== 'SKILL.md' || (discovery === 'direct-children' && depth !== 1)) {\n continue;\n }\n const content = await fs.promises.readFile(candidate, 'utf8');\n const { attributes } = splitFrontmatter(content);\n if (typeof attributes.name !== 'string') throw new Error(`Resource requires a name: ${candidate}`);\n const stat = await fs.promises.stat(candidate);\n files.push({\n path: candidate,\n name: attributes.name,\n digest: createHash('sha256').update(content).digest('hex'),\n size: stat.size,\n mtimeMs: stat.mtimeMs,\n ctimeMs: stat.ctimeMs,\n });\n }\n };\n const resolvedRoot = path.resolve(root);\n await walk(resolvedRoot, 0);\n files.sort((left, right) => left.path.localeCompare(right.path));\n directories.sort((left, right) => left.path.localeCompare(right.path));\n return { version: SKILL_MANIFEST_VERSION, root: resolvedRoot, discovery, files, directories };\n}\n\nexport async function discoverSkillsAsync(\n repoRoot: string,\n root: string,\n discovery: PluginSkillDiscovery = 'recursive',\n cacheDirectory?: string,\n): Promise<NamedResource[]> {\n if (!(await pathExists(root))) return [];\n const manifestPath = skillManifestPath(repoRoot, root, discovery, cacheDirectory);\n const cached = await readSkillManifestAsync(manifestPath, root, discovery);\n const manifest = cached ?? (await scanSkillManifestAsync(root, discovery));\n if (!cached) await writeSkillManifestAsync(manifestPath, manifest);\n return manifest.files.map(({ name, path: filePath, digest }) => ({ name, path: filePath, digest }));\n}\n\nasync function markdownFilesAsync(directory: string): Promise<string[]> {\n let entries: fs.Dirent[];\n try {\n entries = await fs.promises.readdir(directory, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw error;\n }\n const results: string[] = [];\n for (const entry of entries) {\n const candidate = path.join(directory, entry.name);\n if (entry.isDirectory()) results.push(...(await markdownFilesAsync(candidate)));\n if (entry.isFile() && entry.name.endsWith('.md')) results.push(candidate);\n }\n return results;\n}\n\nasync function frontmatterNameAsync(filePath: string): Promise<string> {\n const { attributes } = splitFrontmatter(await fs.promises.readFile(filePath, 'utf8'));\n if (typeof attributes.name !== 'string') throw new Error(`Resource requires a name: ${filePath}`);\n return attributes.name;\n}\n\nasync function assertUniqueAsync(resources: NamedResource[], kind: string): Promise<void> {\n const seen = new Map<string, string>();\n const digestByName = new Map<string, string>();\n for (const resource of resources) {\n const previous = seen.get(resource.name);\n const digest =\n resource.digest ??\n createHash('sha256')\n .update(await fs.promises.readFile(resource.path))\n .digest('hex');\n if (previous && digestByName.get(resource.name) !== digest) {\n throw new Error(`Conflicting ${kind} \"${resource.name}\": ${previous} and ${resource.path}`);\n }\n seen.set(resource.name, resource.path);\n digestByName.set(resource.name, digest);\n }\n}\n\nfunction dispatcherAgentSource(dispatcherWorkflowExtension: string): string {\n const attributes: JsonObject = {\n name: DISPATCHER_AGENT_NAME,\n description: 'Selects and launches Agiflow workflows for one loop pass without implementing the work.',\n thinking: 'high',\n systemPromptMode: 'replace',\n inheritProjectContext: true,\n inheritSkills: true,\n tools: DISPATCHER_TOOLS.join(', '),\n extensions: [dispatcherWorkflowExtension],\n defaultContext: 'fresh',\n defaultProgress: false,\n };\n const body = [\n 'You are the Agiflow workflow dispatcher.',\n 'Reason about the supplied dispatch context and launch eligible workflows.',\n 'Launch workflows without monitoring them. After dispatching, report and exit.',\n 'Follow the task restrictions exactly. Do not implement jobs or edit repository files.',\n ].join('\\n');\n return `---\\n${stringify(attributes).trim()}\\n---\\n\\n${body}\\n`;\n}\n\nexport function mergeMcpConfigs(configPaths: string[]): JsonObject {\n const merged: JsonObject = { mcpServers: {} };\n const servers = merged.mcpServers as Record<string, unknown>;\n const sources = new Map<string, string>();\n for (const configPath of configPaths) {\n if (!fs.existsSync(configPath)) continue;\n const config = JSON.parse(fs.readFileSync(configPath, 'utf8')) as JsonObject;\n const incoming = (config.mcpServers ?? {}) as Record<string, unknown>;\n for (const [name, definition] of Object.entries(incoming)) {\n const previous = servers[name];\n if (previous && JSON.stringify(previous) !== JSON.stringify(definition)) {\n throw new Error(`Conflicting MCP server \"${name}\": ${sources.get(name)} and ${configPath}`);\n }\n servers[name] = definition;\n sources.set(name, configPath);\n }\n }\n return merged;\n}\n\nexport async function mergeMcpConfigsAsync(configPaths: string[]): Promise<JsonObject> {\n const merged: JsonObject = { mcpServers: {} };\n const servers = merged.mcpServers as Record<string, unknown>;\n const sources = new Map<string, string>();\n for (const configPath of configPaths) {\n let content: string;\n try {\n content = await fs.promises.readFile(configPath, 'utf8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') continue;\n throw error;\n }\n const config = JSON.parse(content) as JsonObject;\n const incoming = (config.mcpServers ?? {}) as Record<string, unknown>;\n for (const [name, definition] of Object.entries(incoming)) {\n const previous = servers[name];\n if (previous && JSON.stringify(previous) !== JSON.stringify(definition)) {\n throw new Error(`Conflicting MCP server \"${name}\": ${sources.get(name)} and ${configPath}`);\n }\n servers[name] = definition;\n sources.set(name, configPath);\n }\n }\n return merged;\n}\n\n/** Matches a resource name against a subset filter. Undefined keeps everything. */\nfunction keepsName(allowed: string[] | undefined, name: string): boolean {\n if (!allowed) return true;\n return allowed.some((pattern) =>\n pattern.includes('*')\n ? new RegExp(`^${pattern.split('*').map(escapeRegExp).join('.*')}$`).test(name)\n : pattern === name,\n );\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport async function collectResources(\n repoRoot: string,\n plugins: Array<string | PluginEntry>,\n options: HarnessResourceOptions,\n): Promise<HarnessResources> {\n const pluginEntries: PluginEntry[] = plugins.map((plugin) =>\n typeof plugin === 'string' ? { directory: plugin } : plugin,\n );\n // A caller-supplied directory is owned by the caller: it is either a live\n // session's directory or the synced one, and removing it here would delete\n // resources that outlive this collection.\n const ownsDirectory = options.temporaryDirectory === undefined;\n const temporaryDirectory =\n options.temporaryDirectory ?? (await fs.promises.mkdtemp(path.join(os.tmpdir(), 'doom-pi-')));\n await fs.promises.mkdir(temporaryDirectory, { mode: 0o700, recursive: true });\n await fs.promises.chmod(temporaryDirectory, 0o700);\n const sharedSkills = path.join(repoRoot, '.claude', 'skills');\n // A domain can opt out of the always-on shared skills to keep its context small.\n const sharedSkillSources =\n options.sharedSkills === false\n ? []\n : await discoverSkillsAsync(repoRoot, sharedSkills, 'recursive', options.skillCacheDirectory);\n const skillDirectories: string[] = [];\n const skillSources: NamedResource[] = [];\n const agentSources: Array<{ name: string; path: string }> = [];\n const pluginHooks: PluginHookSource[] = [];\n const pluginMcpConfigPaths: string[] = [];\n const mcpPaths = [path.join(repoRoot, '.mcp.json')];\n\n for (const entry of pluginEntries) {\n const pluginDirectory = entry.directory;\n const skills = path.join(pluginDirectory, 'skills');\n if (await pathExists(skills)) {\n const found = (\n await discoverSkillsAsync(repoRoot, skills, entry.skillDiscovery ?? 'recursive', options.skillCacheDirectory)\n ).filter((skill) => keepsName(entry.skills, skill.name));\n // Exact files let Pi skip another recursive traversal and make a plugin\n // subset unambiguous without staging copies of the skill bodies.\n skillDirectories.push(...found.map((skill) => skill.path));\n skillSources.push(...found);\n }\n const agents = path.join(pluginDirectory, 'agents');\n const agentFiles = await markdownFilesAsync(agents);\n const agentNames = await Promise.all(agentFiles.map((filePath) => frontmatterNameAsync(filePath)));\n agentSources.push(\n ...agentFiles\n .map((filePath, index) => ({ name: agentNames[index] ?? '', path: filePath }))\n .filter((agent) => keepsName(entry.agents, agent.name)),\n );\n const hookConfig = path.join(pluginDirectory, 'hooks', 'hooks.json');\n if (entry.hooks !== false && (await pathExists(hookConfig))) {\n pluginHooks.push({ pluginRoot: pluginDirectory, configPath: hookConfig });\n }\n const mcpConfig = path.join(pluginDirectory, '.mcp.json');\n if (entry.mcp !== false && (await pathExists(mcpConfig))) {\n mcpPaths.push(mcpConfig);\n pluginMcpConfigPaths.push(mcpConfig);\n }\n }\n\n await assertUniqueAsync(skillSources, 'skill');\n await assertUniqueAsync(sharedSkillSources, 'skill');\n // Pi keeps the first skill for a duplicated name. Selected domain plugins are\n // authoritative; shared Claude skills remain fallbacks for names no plugin owns.\n const pluginSkillNames = new Set(skillSources.map((skill) => skill.name));\n const fallbackSharedSkills = sharedSkillSources.filter((skill) => !pluginSkillNames.has(skill.name));\n skillDirectories.push(...fallbackSharedSkills.map((skill) => skill.path));\n skillSources.push(...fallbackSharedSkills);\n\n await assertUniqueAsync(agentSources, 'agent');\n if (agentSources.some((source) => source.name === DISPATCHER_AGENT_NAME)) {\n throw new Error(`Conflicting agent \"${DISPATCHER_AGENT_NAME}\": reserved by the agent harness`);\n }\n\n const agentDirectories: string[] = [];\n let dispatcherWorkflowExtensionPath: string | undefined;\n const outputDirectory = path.join(temporaryDirectory, 'agents');\n await fs.promises.rm(outputDirectory, { recursive: true, force: true });\n if (options.agents && (agentSources.length > 0 || options.dispatcherWorkflowExtension)) {\n await fs.promises.mkdir(outputDirectory, { mode: 0o700 });\n for (const source of agentSources) {\n const adapted = adaptAgentDefinition(await fs.promises.readFile(source.path, 'utf8'));\n await fs.promises.writeFile(\n path.join(outputDirectory, `${assertSafeAgentName(adapted.name)}.md`),\n adapted.content,\n { mode: 0o600 },\n );\n }\n if (options.dispatcherWorkflowExtension) {\n dispatcherWorkflowExtensionPath = options.dispatcherWorkflowExtension;\n await fs.promises.writeFile(\n path.join(outputDirectory, `${DISPATCHER_AGENT_NAME}.md`),\n dispatcherAgentSource(options.dispatcherWorkflowExtension),\n { mode: 0o600 },\n );\n }\n agentDirectories.push(outputDirectory);\n }\n\n let mcpConfigPath: string | undefined;\n if (options.mcp) {\n mcpConfigPath = path.join(temporaryDirectory, 'mcp.json');\n // Domains without an mcp allowlist resolve to undefined here, which leaves\n // the merged config untouched.\n const merged = await applyMcpAllowlist(\n await mergeMcpConfigsAsync(mcpPaths),\n options.mcpAllowlist,\n repoRoot,\n temporaryDirectory,\n );\n await fs.promises.writeFile(mcpConfigPath, `${JSON.stringify(merged, null, 2)}\\n`, {\n mode: 0o600,\n });\n }\n\n return {\n temporaryDirectory,\n skillDirectories,\n skillCount: skillSources.length,\n agentCount: agentSources.length,\n agentDirectories,\n pluginHooks,\n dispatcherWorkflowExtensionPath,\n mcpConfigPath,\n pluginMcpConfigPaths,\n cleanup: () =>\n ownsDirectory ? fs.promises.rm(temporaryDirectory, { recursive: true, force: true }) : Promise.resolve(),\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { HarnessResourceOptions, HarnessResources } from "../types/interfaces/harness.cjs";
2
+ import { JsonObject } from "./serialization/json.cjs";
3
+ import { PluginEntry, PluginSkillDiscovery } from "@agimon-ai/doompi-config/domains";
4
+
5
+ //#region src/adapters/resourceCollector.d.ts
6
+ declare const DISPATCHER_AGENT_NAME = "agiflow-dispatcher";
7
+ interface NamedResource {
8
+ name: string;
9
+ path: string;
10
+ digest?: string;
11
+ }
12
+ declare function selectWorkflowExtensionForProcess(workflowExtension: string | undefined, dispatcherWorkflowExtension: string | undefined, environment?: NodeJS.ProcessEnv): string | undefined;
13
+ declare function adaptAgentDefinition(content: string): {
14
+ name: string;
15
+ content: string;
16
+ };
17
+ /** Cached skill metadata and exact files, ready for Pi without a second tree walk. */
18
+ declare function discoverSkills(repoRoot: string, root: string, discovery?: PluginSkillDiscovery, cacheDirectory?: string): NamedResource[];
19
+ declare function discoverSkillsAsync(repoRoot: string, root: string, discovery?: PluginSkillDiscovery, cacheDirectory?: string): Promise<NamedResource[]>;
20
+ declare function mergeMcpConfigs(configPaths: string[]): JsonObject;
21
+ declare function mergeMcpConfigsAsync(configPaths: string[]): Promise<JsonObject>;
22
+ declare function collectResources(repoRoot: string, plugins: Array<string | PluginEntry>, options: HarnessResourceOptions): Promise<HarnessResources>;
23
+ //#endregion
24
+ export { DISPATCHER_AGENT_NAME, adaptAgentDefinition, collectResources, discoverSkills, discoverSkillsAsync, mergeMcpConfigs, mergeMcpConfigsAsync, selectWorkflowExtensionForProcess };
25
+ //# sourceMappingURL=resourceCollector.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resourceCollector.d.cts","names":[],"sources":["../../src/adapters/resourceCollector.ts"],"mappings":";;;;;cAWa,qBAAA;AAAA,UAMH,aAAA;EACR,IAAA;EACA,IAAA;EACA,MAAA;AAAA;AAAA,iBA0Bc,iCAAA,CACd,iBAAA,sBACA,2BAAA,sBACA,WAAA,GAAa,MAAA,CAAO,UAAA;AAAA,iBAwCN,oBAAA,CAAqB,OAAA;EAAoB,IAAA;EAAc,OAAA;AAAA;;iBA+MvD,cAAA,CACd,QAAA,UACA,IAAA,UACA,SAAA,GAAW,oBAAA,EACX,cAAA,YACC,aAAA;AAAA,iBAoDmB,mBAAA,CACpB,QAAA,UACA,IAAA,UACA,SAAA,GAAW,oBAAA,EACX,cAAA,YACC,OAAA,CAAQ,aAAA;AAAA,iBAwEK,eAAA,CAAgB,WAAA,aAAwB,UAAA;AAAA,iBAoBlC,oBAAA,CAAqB,WAAA,aAAwB,OAAA,CAAQ,UAAA;AAAA,iBAwCrD,gBAAA,CACpB,QAAA,UACA,OAAA,EAAS,KAAA,UAAe,WAAA,GACxB,OAAA,EAAS,sBAAA,GACR,OAAA,CAAQ,gBAAA"}
@@ -0,0 +1,25 @@
1
+ import { HarnessResourceOptions, HarnessResources } from "../types/interfaces/harness.mjs";
2
+ import { JsonObject } from "./serialization/json.mjs";
3
+ import { PluginEntry, PluginSkillDiscovery } from "@agimon-ai/doompi-config/domains";
4
+
5
+ //#region src/adapters/resourceCollector.d.ts
6
+ declare const DISPATCHER_AGENT_NAME = "agiflow-dispatcher";
7
+ interface NamedResource {
8
+ name: string;
9
+ path: string;
10
+ digest?: string;
11
+ }
12
+ declare function selectWorkflowExtensionForProcess(workflowExtension: string | undefined, dispatcherWorkflowExtension: string | undefined, environment?: NodeJS.ProcessEnv): string | undefined;
13
+ declare function adaptAgentDefinition(content: string): {
14
+ name: string;
15
+ content: string;
16
+ };
17
+ /** Cached skill metadata and exact files, ready for Pi without a second tree walk. */
18
+ declare function discoverSkills(repoRoot: string, root: string, discovery?: PluginSkillDiscovery, cacheDirectory?: string): NamedResource[];
19
+ declare function discoverSkillsAsync(repoRoot: string, root: string, discovery?: PluginSkillDiscovery, cacheDirectory?: string): Promise<NamedResource[]>;
20
+ declare function mergeMcpConfigs(configPaths: string[]): JsonObject;
21
+ declare function mergeMcpConfigsAsync(configPaths: string[]): Promise<JsonObject>;
22
+ declare function collectResources(repoRoot: string, plugins: Array<string | PluginEntry>, options: HarnessResourceOptions): Promise<HarnessResources>;
23
+ //#endregion
24
+ export { DISPATCHER_AGENT_NAME, adaptAgentDefinition, collectResources, discoverSkills, discoverSkillsAsync, mergeMcpConfigs, mergeMcpConfigsAsync, selectWorkflowExtensionForProcess };
25
+ //# sourceMappingURL=resourceCollector.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resourceCollector.d.mts","names":[],"sources":["../../src/adapters/resourceCollector.ts"],"mappings":";;;;;cAWa,qBAAA;AAAA,UAMH,aAAA;EACR,IAAA;EACA,IAAA;EACA,MAAA;AAAA;AAAA,iBA0Bc,iCAAA,CACd,iBAAA,sBACA,2BAAA,sBACA,WAAA,GAAa,MAAA,CAAO,UAAA;AAAA,iBAwCN,oBAAA,CAAqB,OAAA;EAAoB,IAAA;EAAc,OAAA;AAAA;;iBA+MvD,cAAA,CACd,QAAA,UACA,IAAA,UACA,SAAA,GAAW,oBAAA,EACX,cAAA,YACC,aAAA;AAAA,iBAoDmB,mBAAA,CACpB,QAAA,UACA,IAAA,UACA,SAAA,GAAW,oBAAA,EACX,cAAA,YACC,OAAA,CAAQ,aAAA;AAAA,iBAwEK,eAAA,CAAgB,WAAA,aAAwB,UAAA;AAAA,iBAoBlC,oBAAA,CAAqB,WAAA,aAAwB,OAAA,CAAQ,UAAA;AAAA,iBAwCrD,gBAAA,CACpB,QAAA,UACA,OAAA,EAAS,KAAA,UAAe,WAAA,GACxB,OAAA,EAAS,sBAAA,GACR,OAAA,CAAQ,gBAAA"}
@@ -0,0 +1,3 @@
1
+ import{resolveSyncLocation as e}from"./syncLocation.mjs";import{toPiToolName as t}from"../services/tools/toolNames.mjs";import"../utils/index.mjs";import{applyMcpAllowlist as n}from"./mcpFilter.mjs";import r from"node:path";import i from"node:fs";import a from"node:os";import{createHash as o}from"node:crypto";import{parse as s,stringify as c}from"yaml";const l=`agiflow-dispatcher`,u=[`read`,`grep`,`find`,`ls`,`bash`,`launch_workflow`,`list_workflows`],d=r.join(`cache`,`skills`);function f(e,t,n=process.env){return n.PI_SUBAGENT_CHILD_AGENT===`agiflow-dispatcher`&&n.PI_SUBAGENT_PARENT_SESSION&&t?t:e}function p(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);if(!t)throw Error(`Resource is missing YAML frontmatter`);return{attributes:s(t[1]),body:t[2]??``}}const m={sonnet:`anthropic/claude-sonnet-4-6`,opus:`anthropic/claude-opus-4-6`,haiku:`anthropic/claude-haiku-4-5`};function h(e){let t=e.trim();if(!t||t!==e||t===`.`||t===`..`||t.includes(`\0`)||/[\\/]/.test(t))throw Error(`Unsafe agent name: ${JSON.stringify(e)}`);return t}function g(e){return typeof e==`string`?m[e.toLowerCase()]??e:Array.isArray(e)?e.map(e=>g(e)):e}function _(e){let{attributes:n,body:r}=p(e),i=typeof n.name==`string`?n.name:void 0;if(!i)throw Error(`Agent definition requires a name`);let a=h(i),o=Object.hasOwn(n,`tools`),s=Array.isArray(n.tools)?n.tools.map(String):typeof n.tools==`string`?n.tools.split(`,`).map(e=>e.trim()).filter(Boolean):[],l=[...new Set(s.map(t).filter(e=>!!e))],u={...n,inheritProjectContext:!0,inheritSkills:!0,systemPromptMode:n.systemPromptMode??`replace`};if(o?u.tools=Array.isArray(n.tools)?l:l.join(`, `):delete u.tools,u.model!==void 0&&(u.model=g(u.model)),u.fallbackModels!==void 0&&(u.fallbackModels=g(u.fallbackModels)),u.memory===`project`||u.memory===`user`)u.memory={scope:u.memory,path:a};else if(u.memory!==void 0&&(typeof u.memory!=`object`||u.memory===null||Array.isArray(u.memory)))throw Error(`Unsupported memory declaration`);return delete u.permissionMode,{name:a,content:`---\n${c(u).trim()}\n---\n\n${r.trimStart()}`}}function v(t,n,i,a){let s=o(`sha256`).update(`${r.resolve(n)}\0${i}`).digest(`hex`).slice(0,16),c=a??r.join(e(t).directory,d);return r.join(c,`${s}.json`)}function y(e){try{let t=i.statSync(e.path);return t.isFile()&&t.size===e.size&&t.mtimeMs===e.mtimeMs&&t.ctimeMs===e.ctimeMs}catch{return!1}}function b(e){try{let t=i.statSync(e.path);return t.isDirectory()&&t.mtimeMs===e.mtimeMs&&t.ctimeMs===e.ctimeMs}catch{return!1}}function x(e,t,n){try{let a=JSON.parse(i.readFileSync(e,`utf8`));return a.version!==2||a.root!==r.resolve(t)||a.discovery!==n||!Array.isArray(a.files)||!Array.isArray(a.directories)||!a.files.every(y)||!a.directories.every(b)?void 0:a}catch{return}}function S(e,t){i.mkdirSync(r.dirname(e),{recursive:!0,mode:448});let n=`${e}.${process.pid}.${Date.now()}.tmp`;i.writeFileSync(n,`${JSON.stringify(t,null,2)}\n`,{mode:384});try{i.renameSync(n,e)}catch(t){if(i.rmSync(n,{force:!0}),!i.existsSync(e))throw t}}async function C(e){try{return await i.promises.access(e),!0}catch{return!1}}async function w(e,t,n){try{let a=JSON.parse(await i.promises.readFile(e,`utf8`));if(a.version!==2||a.root!==r.resolve(t)||a.discovery!==n||!Array.isArray(a.files)||!Array.isArray(a.directories))return;for(let e of a.files){let t=await i.promises.stat(e.path);if(!t.isFile()||t.size!==e.size||t.mtimeMs!==e.mtimeMs||t.ctimeMs!==e.ctimeMs)return}for(let e of a.directories){let t=await i.promises.stat(e.path);if(!t.isDirectory()||t.mtimeMs!==e.mtimeMs||t.ctimeMs!==e.ctimeMs)return}return a}catch{return}}async function T(e,t){await i.promises.mkdir(r.dirname(e),{recursive:!0,mode:448});let n=`${e}.${process.pid}.${Date.now()}.tmp`;await i.promises.writeFile(n,`${JSON.stringify(t,null,2)}\n`,{mode:384});try{await i.promises.rename(n,e)}catch(t){if(await i.promises.rm(n,{force:!0}),!await C(e))throw t}}function E(e,t){let n=[],a=[],s=(e,c)=>{if(!i.existsSync(e))return;let l=i.statSync(e);n.push({path:e,mtimeMs:l.mtimeMs,ctimeMs:l.ctimeMs});for(let n of i.readdirSync(e,{withFileTypes:!0})){let l=r.join(e,n.name);if(n.isDirectory()){(t===`recursive`||c===0)&&s(l,c+1);continue}if(!n.isFile()||n.name!==`SKILL.md`||t===`direct-children`&&c!==1)continue;let u=i.readFileSync(l,`utf8`),{attributes:d}=p(u);if(typeof d.name!=`string`)throw Error(`Resource requires a name: ${l}`);let f=i.statSync(l);a.push({path:l,name:d.name,digest:o(`sha256`).update(u).digest(`hex`),size:f.size,mtimeMs:f.mtimeMs,ctimeMs:f.ctimeMs})}},c=r.resolve(e);return s(c,0),a.sort((e,t)=>e.path.localeCompare(t.path)),n.sort((e,t)=>e.path.localeCompare(t.path)),{version:2,root:c,discovery:t,files:a,directories:n}}function D(e,t,n=`recursive`,r){if(!i.existsSync(t))return[];let a=v(e,t,n,r),o=x(a,t,n),s=o??E(t,n);return o||S(a,s),s.files.map(({name:e,path:t,digest:n})=>({name:e,path:t,digest:n}))}async function O(e,t){let n=[],a=[],s=async(e,c)=>{let l;try{let t=await i.promises.stat(e);n.push({path:e,mtimeMs:t.mtimeMs,ctimeMs:t.ctimeMs}),l=await i.promises.readdir(e,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return;throw e}for(let n of l){let l=r.join(e,n.name);if(n.isDirectory()){(t===`recursive`||c===0)&&await s(l,c+1);continue}if(!n.isFile()||n.name!==`SKILL.md`||t===`direct-children`&&c!==1)continue;let u=await i.promises.readFile(l,`utf8`),{attributes:d}=p(u);if(typeof d.name!=`string`)throw Error(`Resource requires a name: ${l}`);let f=await i.promises.stat(l);a.push({path:l,name:d.name,digest:o(`sha256`).update(u).digest(`hex`),size:f.size,mtimeMs:f.mtimeMs,ctimeMs:f.ctimeMs})}},c=r.resolve(e);return await s(c,0),a.sort((e,t)=>e.path.localeCompare(t.path)),n.sort((e,t)=>e.path.localeCompare(t.path)),{version:2,root:c,discovery:t,files:a,directories:n}}async function k(e,t,n=`recursive`,r){if(!await C(t))return[];let i=v(e,t,n,r),a=await w(i,t,n),o=a??await O(t,n);return a||await T(i,o),o.files.map(({name:e,path:t,digest:n})=>({name:e,path:t,digest:n}))}async function A(e){let t;try{t=await i.promises.readdir(e,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return[];throw e}let n=[];for(let i of t){let t=r.join(e,i.name);i.isDirectory()&&n.push(...await A(t)),i.isFile()&&i.name.endsWith(`.md`)&&n.push(t)}return n}async function j(e){let{attributes:t}=p(await i.promises.readFile(e,`utf8`));if(typeof t.name!=`string`)throw Error(`Resource requires a name: ${e}`);return t.name}async function M(e,t){let n=new Map,r=new Map;for(let a of e){let e=n.get(a.name),s=a.digest??o(`sha256`).update(await i.promises.readFile(a.path)).digest(`hex`);if(e&&r.get(a.name)!==s)throw Error(`Conflicting ${t} "${a.name}": ${e} and ${a.path}`);n.set(a.name,a.path),r.set(a.name,s)}}function N(e){let t={name:l,description:`Selects and launches Agiflow workflows for one loop pass without implementing the work.`,thinking:`high`,systemPromptMode:`replace`,inheritProjectContext:!0,inheritSkills:!0,tools:u.join(`, `),extensions:[e],defaultContext:`fresh`,defaultProgress:!1},n=[`You are the Agiflow workflow dispatcher.`,`Reason about the supplied dispatch context and launch eligible workflows.`,`Launch workflows without monitoring them. After dispatching, report and exit.`,`Follow the task restrictions exactly. Do not implement jobs or edit repository files.`].join(`
2
+ `);return`---\n${c(t).trim()}\n---\n\n${n}\n`}function P(e){let t={mcpServers:{}},n=t.mcpServers,r=new Map;for(let t of e){if(!i.existsSync(t))continue;let e=JSON.parse(i.readFileSync(t,`utf8`)).mcpServers??{};for(let[i,a]of Object.entries(e)){let e=n[i];if(e&&JSON.stringify(e)!==JSON.stringify(a))throw Error(`Conflicting MCP server "${i}": ${r.get(i)} and ${t}`);n[i]=a,r.set(i,t)}}return t}async function F(e){let t={mcpServers:{}},n=t.mcpServers,r=new Map;for(let t of e){let e;try{e=await i.promises.readFile(t,`utf8`)}catch(e){if(e.code===`ENOENT`)continue;throw e}let a=JSON.parse(e).mcpServers??{};for(let[e,i]of Object.entries(a)){let a=n[e];if(a&&JSON.stringify(a)!==JSON.stringify(i))throw Error(`Conflicting MCP server "${e}": ${r.get(e)} and ${t}`);n[e]=i,r.set(e,t)}}return t}function I(e,t){return e?e.some(e=>e.includes(`*`)?RegExp(`^${e.split(`*`).map(L).join(`.*`)}$`).test(t):e===t):!0}function L(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}async function R(e,t,o){let s=t.map(e=>typeof e==`string`?{directory:e}:e),c=o.temporaryDirectory===void 0,u=o.temporaryDirectory??await i.promises.mkdtemp(r.join(a.tmpdir(),`doom-pi-`));await i.promises.mkdir(u,{mode:448,recursive:!0}),await i.promises.chmod(u,448);let d=r.join(e,`.claude`,`skills`),f=o.sharedSkills===!1?[]:await k(e,d,`recursive`,o.skillCacheDirectory),p=[],m=[],g=[],v=[],y=[],b=[r.join(e,`.mcp.json`)];for(let t of s){let n=t.directory,i=r.join(n,`skills`);if(await C(i)){let n=(await k(e,i,t.skillDiscovery??`recursive`,o.skillCacheDirectory)).filter(e=>I(t.skills,e.name));p.push(...n.map(e=>e.path)),m.push(...n)}let a=await A(r.join(n,`agents`)),s=await Promise.all(a.map(e=>j(e)));g.push(...a.map((e,t)=>({name:s[t]??``,path:e})).filter(e=>I(t.agents,e.name)));let c=r.join(n,`hooks`,`hooks.json`);t.hooks!==!1&&await C(c)&&v.push({pluginRoot:n,configPath:c});let l=r.join(n,`.mcp.json`);t.mcp!==!1&&await C(l)&&(b.push(l),y.push(l))}await M(m,`skill`),await M(f,`skill`);let x=new Set(m.map(e=>e.name)),S=f.filter(e=>!x.has(e.name));if(p.push(...S.map(e=>e.path)),m.push(...S),await M(g,`agent`),g.some(e=>e.name===`agiflow-dispatcher`))throw Error(`Conflicting agent "${l}": reserved by the agent harness`);let w=[],T,E=r.join(u,`agents`);if(await i.promises.rm(E,{recursive:!0,force:!0}),o.agents&&(g.length>0||o.dispatcherWorkflowExtension)){await i.promises.mkdir(E,{mode:448});for(let e of g){let t=_(await i.promises.readFile(e.path,`utf8`));await i.promises.writeFile(r.join(E,`${h(t.name)}.md`),t.content,{mode:384})}o.dispatcherWorkflowExtension&&(T=o.dispatcherWorkflowExtension,await i.promises.writeFile(r.join(E,`${l}.md`),N(o.dispatcherWorkflowExtension),{mode:384})),w.push(E)}let D;if(o.mcp){D=r.join(u,`mcp.json`);let t=await n(await F(b),o.mcpAllowlist,e,u);await i.promises.writeFile(D,`${JSON.stringify(t,null,2)}\n`,{mode:384})}return{temporaryDirectory:u,skillDirectories:p,skillCount:m.length,agentCount:g.length,agentDirectories:w,pluginHooks:v,dispatcherWorkflowExtensionPath:T,mcpConfigPath:D,pluginMcpConfigPaths:y,cleanup:()=>c?i.promises.rm(u,{recursive:!0,force:!0}):Promise.resolve()}}export{l as DISPATCHER_AGENT_NAME,_ as adaptAgentDefinition,R as collectResources,D as discoverSkills,k as discoverSkillsAsync,P as mergeMcpConfigs,F as mergeMcpConfigsAsync,f as selectWorkflowExtensionForProcess};
3
+ //# sourceMappingURL=resourceCollector.mjs.map