@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,12 @@
1
+ import{fileURLToPath as e,pathToFileURL as t}from"node:url";import n from"node:path";import r from"node:fs";import{formatSkillsForPrompt as i,getAgentDir as a,loadSkills as o,stripFrontmatter as s}from"@earendil-works/pi-coding-agent";import{Worker as c}from"node:worker_threads";const l=`@earendil-works/pi-coding-agent`,u=`package.json`;function d(){let i=[process.argv[1],e(import.meta.url),n.join(process.cwd(),u)];for(let e of i){if(!e)continue;let i=n.dirname(n.resolve(e));for(;;){let e=n.join(i,`node_modules`,l),a=n.join(e,u);try{let i=JSON.parse(r.readFileSync(a,`utf8`));if(typeof i.main==`string`){let a=n.resolve(e,i.main);if(r.existsSync(a))return t(a).href}}catch{}let o=n.dirname(i);if(o===i)break;i=o}}throw Error(`Cannot resolve ${l} from the DoomPi or host module trees`)}var f=class{#e;#t;constructor(e){this.#e=e}start(){if(this.#t)return this.#t;if(!this.#e.schedule&&!this.#e.load)return this.#t=this.#o(),this.#t;let e=this.#e.schedule??(e=>setImmediate(e));return this.#t=new Promise(t=>{let n=e=>{t(this.#i(e))};try{e(()=>{try{t(this.#a())}catch(e){n(e)}})}catch(e){n(e)}}),this.#t}ready(){return this.start()}#n(){return{cwd:this.#e.cwd,agentDir:this.#e.agentDir??a(),skillPaths:[...this.#e.skillPaths],includeDefaults:!1}}#r(e){return{skills:e.skills,diagnostics:e.diagnostics.map(e=>`${e.path??this.#e.cwd}: ${e.message}`)}}#i(e){return{skills:[],diagnostics:[`${this.#e.cwd}: ${e instanceof Error?e.message:String(e)}`]}}#a(){return this.#r((this.#e.load??o)(this.#n()))}#o(){return new Promise(e=>{let t=!1,n=n=>{t||(t=!0,e(n))},r;try{r=new c(`
2
+ const { parentPort, workerData } = require('node:worker_threads');
3
+ void (async () => {
4
+ try {
5
+ const { loadSkills } = await import(workerData.piModuleUrl);
6
+ parentPort.postMessage({ ok: true, result: loadSkills(workerData.loadOptions) });
7
+ } catch (error) {
8
+ parentPort.postMessage({ ok: false, error: error instanceof Error ? error.message : String(error) });
9
+ }
10
+ })();
11
+ `,{eval:!0,workerData:{piModuleUrl:this.#e.piModuleUrl??d(),loadOptions:this.#n()}})}catch(e){n(this.#i(e));return}r.unref(),r.once(`message`,e=>{if(!e.ok||!e.result){n(this.#i(e.error??`Skill worker failed`));return}n(this.#r(e.result))}),r.once(`error`,e=>n(this.#i(e))),r.once(`exit`,e=>{e!==0&&n(this.#i(`Skill worker exited with code ${e}`))})})}};function p(e,t,n){return t.selectedTools&&!t.selectedTools.includes(`read`)?e:`${e}${i(n)}`}function m(e,t){if(!e.startsWith(`/skill:`))return e;let n=e.indexOf(` `),i=n===-1?e.slice(7):e.slice(7,n),a=t.find(e=>e.name===i);if(!a)return e;try{let t=n===-1?``:e.slice(n+1).trim(),i=s(r.readFileSync(a.filePath,`utf8`)).trim(),o=`<skill name="${a.name}" location="${a.filePath}">\nReferences are relative to ${a.baseDir}.\n\n${i}\n</skill>`;return t?`${o}\n\n${t}`:o}catch{return e}}export{f as DeferredSkillLoader,p as buildPromptWithDeferredSkills,m as expandDeferredSkillCommand};
12
+ //# sourceMappingURL=deferredSkills.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deferredSkills.mjs","names":["#options","#promise","#loadInWorker","#failure","#load","#snapshot","#loadOptions"],"sources":["../../src/adapters/deferredSkills.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { Worker } from 'node:worker_threads';\nimport {\n type BuildSystemPromptOptions,\n formatSkillsForPrompt,\n getAgentDir,\n loadSkills,\n type Skill,\n stripFrontmatter,\n} from '@earendil-works/pi-coding-agent';\n\nexport interface DeferredSkillSnapshot {\n skills: Skill[];\n diagnostics: string[];\n}\n\nconst PI_PACKAGE = '@earendil-works/pi-coding-agent';\nconst PACKAGE_MANIFEST = 'package.json';\nconst SKILL_WORKER_SOURCE = `\nconst { parentPort, workerData } = require('node:worker_threads');\nvoid (async () => {\n try {\n const { loadSkills } = await import(workerData.piModuleUrl);\n parentPort.postMessage({ ok: true, result: loadSkills(workerData.loadOptions) });\n } catch (error) {\n parentPort.postMessage({ ok: false, error: error instanceof Error ? error.message : String(error) });\n }\n})();\n`;\n\nfunction installedPiModuleUrl(): string {\n const anchors = [process.argv[1], fileURLToPath(import.meta.url), path.join(process.cwd(), PACKAGE_MANIFEST)];\n for (const anchor of anchors) {\n if (!anchor) continue;\n let directory = path.dirname(path.resolve(anchor));\n while (true) {\n const packageRoot = path.join(directory, 'node_modules', PI_PACKAGE);\n const manifestPath = path.join(packageRoot, PACKAGE_MANIFEST);\n try {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as { main?: unknown };\n if (typeof manifest.main === 'string') {\n const entry = path.resolve(packageRoot, manifest.main);\n if (fs.existsSync(entry)) return pathToFileURL(entry).href;\n }\n } catch {\n // This anchor does not expose Pi at this level; continue up its module chain.\n }\n const parent = path.dirname(directory);\n if (parent === directory) break;\n directory = parent;\n }\n }\n throw new Error(`Cannot resolve ${PI_PACKAGE} from the DoomPi or host module trees`);\n}\n\ninterface SkillWorkerResult {\n ok: boolean;\n result?: { skills: Skill[]; diagnostics: Array<{ path?: string; message: string }> };\n error?: string;\n}\n\nexport interface DeferredSkillLoaderOptions {\n cwd: string;\n skillPaths: readonly string[];\n agentDir?: string;\n piModuleUrl?: string;\n schedule?: (load: () => void) => void;\n load?: (options: { cwd: string; agentDir: string; skillPaths: string[]; includeDefaults: boolean }) => {\n skills: Skill[];\n diagnostics: Array<{ path?: string; message: string }>;\n };\n}\n\n/**\n * One session's Doom-selected skill inventory.\n *\n * Construction is deliberately cheap. `start()` schedules the synchronous Pi\n * walker after session_start returns, while `ready()` is the single promise the\n * first input awaits before Pi expands `/skill:name`.\n */\nexport class DeferredSkillLoader {\n readonly #options: DeferredSkillLoaderOptions;\n #promise: Promise<DeferredSkillSnapshot> | undefined;\n\n constructor(options: DeferredSkillLoaderOptions) {\n this.#options = options;\n }\n\n start(): Promise<DeferredSkillSnapshot> {\n if (this.#promise) return this.#promise;\n\n if (!this.#options.schedule && !this.#options.load) {\n this.#promise = this.#loadInWorker();\n return this.#promise;\n }\n\n const schedule = this.#options.schedule ?? ((load: () => void) => setImmediate(load));\n this.#promise = new Promise((resolve) => {\n const fail = (error: unknown): void => {\n resolve(this.#failure(error));\n };\n try {\n schedule(() => {\n try {\n resolve(this.#load());\n } catch (error) {\n fail(error);\n }\n });\n } catch (error) {\n fail(error);\n }\n });\n return this.#promise;\n }\n\n ready(): Promise<DeferredSkillSnapshot> {\n return this.start();\n }\n\n #loadOptions(): { cwd: string; agentDir: string; skillPaths: string[]; includeDefaults: boolean } {\n return {\n cwd: this.#options.cwd,\n agentDir: this.#options.agentDir ?? getAgentDir(),\n skillPaths: [...this.#options.skillPaths],\n includeDefaults: false,\n };\n }\n\n #snapshot(result: {\n skills: Skill[];\n diagnostics: Array<{ path?: string; message: string }>;\n }): DeferredSkillSnapshot {\n return {\n skills: result.skills,\n diagnostics: result.diagnostics.map(\n (diagnostic) => `${diagnostic.path ?? this.#options.cwd}: ${diagnostic.message}`,\n ),\n };\n }\n\n #failure(error: unknown): DeferredSkillSnapshot {\n return {\n skills: [],\n diagnostics: [`${this.#options.cwd}: ${error instanceof Error ? error.message : String(error)}`],\n };\n }\n\n #load(): DeferredSkillSnapshot {\n return this.#snapshot((this.#options.load ?? loadSkills)(this.#loadOptions()));\n }\n\n #loadInWorker(): Promise<DeferredSkillSnapshot> {\n return new Promise((resolve) => {\n let settled = false;\n const settle = (snapshot: DeferredSkillSnapshot): void => {\n if (settled) return;\n settled = true;\n resolve(snapshot);\n };\n let worker: Worker;\n try {\n worker = new Worker(SKILL_WORKER_SOURCE, {\n eval: true,\n workerData: {\n piModuleUrl: this.#options.piModuleUrl ?? installedPiModuleUrl(),\n loadOptions: this.#loadOptions(),\n },\n });\n } catch (error) {\n settle(this.#failure(error));\n return;\n }\n worker.unref();\n worker.once('message', (message: SkillWorkerResult) => {\n if (!message.ok || !message.result) {\n settle(this.#failure(message.error ?? 'Skill worker failed'));\n return;\n }\n settle(this.#snapshot(message.result));\n });\n worker.once('error', (error) => settle(this.#failure(error)));\n worker.once('exit', (code) => {\n if (code !== 0) settle(this.#failure(`Skill worker exited with code ${code}`));\n });\n });\n }\n}\n\n/** Appends only the inventory Pi would append for these deferred skills. */\nexport function buildPromptWithDeferredSkills(\n systemPrompt: string,\n options: BuildSystemPromptOptions,\n skills: Skill[],\n): string {\n if (options.selectedTools && !options.selectedTools.includes('read')) return systemPrompt;\n return `${systemPrompt}${formatSkillsForPrompt(skills)}`;\n}\n\n/** Expands a deferred `/skill:name` before Pi consults its synchronous inventory. */\nexport function expandDeferredSkillCommand(text: string, skills: readonly Skill[]): string {\n if (!text.startsWith('/skill:')) return text;\n const spaceIndex = text.indexOf(' ');\n const skillName = spaceIndex === -1 ? text.slice(7) : text.slice(7, spaceIndex);\n const skill = skills.find((candidate) => candidate.name === skillName);\n if (!skill) return text;\n\n try {\n const args = spaceIndex === -1 ? '' : text.slice(spaceIndex + 1).trim();\n const body = stripFrontmatter(fs.readFileSync(skill.filePath, 'utf8')).trim();\n const skillBlock = `<skill name=\"${skill.name}\" location=\"${skill.filePath}\">\\nReferences are relative to ${skill.baseDir}.\\n\\n${body}\\n</skill>`;\n return args ? `${skillBlock}\\n\\n${args}` : skillBlock;\n } catch {\n // Pi uses the same literal-text fallback if a skill disappears between\n // discovery and submission; the agent can still respond to the command.\n return text;\n }\n}\n"],"mappings":"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"}
@@ -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=`@agimon-ai/doompi`;function i(e){try{let r=JSON.parse(n.default.readFileSync(t.default.join(e,`package.json`),`utf8`));return typeof r.name==`string`?r.name:void 0}catch{return}}function a(e){let r;try{r=n.default.statSync(e).isDirectory()?e:t.default.dirname(e)}catch{return}for(;;){let e=i(r);if(e!==void 0)return e;let n=t.default.dirname(r);if(n===r)return;r=n}}function o(e){return a(e)===r}exports.DOOM_PACKAGE_NAME=r,exports.isDoomPackagePath=o,exports.manifestName=i;
2
+ //# sourceMappingURL=doomPackage.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doomPackage.cjs","names":["fs","path"],"sources":["../../src/adapters/doomPackage.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\n/**\n * Recognizing an installed DoomPi package on disk.\n *\n * Pi resolves settings entries to paths rather than through Node, so the same\n * package is spelled differently in every scope: a bare name beside the user\n * config, a relative directory beside the project config, a file inside either.\n * Both the extension alias and the project settings reconciler have to decide\n * whether one of those spellings names this package, and they have to agree.\n */\n\nconst PACKAGE_MANIFEST = 'package.json';\n\n/** The package name Pi loads DoomPi under, in every settings scope. */\nexport const DOOM_PACKAGE_NAME = '@agimon-ai/doompi';\n\n/** The `name` field of the manifest in a directory, when it has a readable one. */\nexport function manifestName(directory: string): string | undefined {\n try {\n const parsed = JSON.parse(fs.readFileSync(path.join(directory, PACKAGE_MANIFEST), 'utf8')) as { name?: unknown };\n return typeof parsed.name === 'string' ? parsed.name : undefined;\n } catch {\n // A directory with no readable manifest simply is not a package root.\n return undefined;\n }\n}\n\n/**\n * Name of the nearest package a path belongs to, walking upward from it.\n *\n * The first manifest found wins rather than the first matching one, so a file\n * inside some other package nested under a DoomPi checkout is not mistaken for\n * DoomPi itself.\n */\nexport function enclosingPackageName(target: string): string | undefined {\n let directory: string;\n try {\n directory = fs.statSync(target).isDirectory() ? target : path.dirname(target);\n } catch {\n // Nothing at that path, so it names no package.\n return undefined;\n }\n\n while (true) {\n const name = manifestName(directory);\n if (name !== undefined) return name;\n const parent = path.dirname(directory);\n if (parent === directory) return undefined;\n directory = parent;\n }\n}\n\n/** True when a resolved path lives inside an installed DoomPi package. */\nexport function isDoomPackagePath(target: string): boolean {\n return enclosingPackageName(target) === DOOM_PACKAGE_NAME;\n}\n"],"mappings":"2IAaA,MAGa,EAAoB,oBAGjC,SAAgB,EAAa,EAAuC,CAClE,GAAI,CACF,IAAM,EAAS,KAAK,MAAMA,EAAAA,QAAG,aAAaC,EAAAA,QAAK,KAAK,EAAW,eAAiB,CAAE,OAAO,CAAC,CAC1F,OAAO,OAAO,EAAO,MAAS,SAAW,EAAO,KAAO,IAAA,QACjD,CAEN,QAWJ,SAAgB,EAAqB,EAAoC,CACvE,IAAI,EACJ,GAAI,CACF,EAAYD,EAAAA,QAAG,SAAS,EAAO,CAAC,aAAa,CAAG,EAASC,EAAAA,QAAK,QAAQ,EAAO,MACvE,CAEN,OAGF,OAAa,CACX,IAAM,EAAO,EAAa,EAAU,CACpC,GAAI,IAAS,IAAA,GAAW,OAAO,EAC/B,IAAM,EAASA,EAAAA,QAAK,QAAQ,EAAU,CACtC,GAAI,IAAW,EAAW,OAC1B,EAAY,GAKhB,SAAgB,EAAkB,EAAyB,CACzD,OAAO,EAAqB,EAAO,GAAK"}
@@ -0,0 +1,2 @@
1
+ import e from"node:path";import t from"node:fs";const n=`@agimon-ai/doompi`;function r(n){try{let r=JSON.parse(t.readFileSync(e.join(n,`package.json`),`utf8`));return typeof r.name==`string`?r.name:void 0}catch{return}}function i(n){let i;try{i=t.statSync(n).isDirectory()?n:e.dirname(n)}catch{return}for(;;){let t=r(i);if(t!==void 0)return t;let n=e.dirname(i);if(n===i)return;i=n}}function a(e){return i(e)===n}export{n as DOOM_PACKAGE_NAME,a as isDoomPackagePath,r as manifestName};
2
+ //# sourceMappingURL=doomPackage.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doomPackage.mjs","names":[],"sources":["../../src/adapters/doomPackage.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\n/**\n * Recognizing an installed DoomPi package on disk.\n *\n * Pi resolves settings entries to paths rather than through Node, so the same\n * package is spelled differently in every scope: a bare name beside the user\n * config, a relative directory beside the project config, a file inside either.\n * Both the extension alias and the project settings reconciler have to decide\n * whether one of those spellings names this package, and they have to agree.\n */\n\nconst PACKAGE_MANIFEST = 'package.json';\n\n/** The package name Pi loads DoomPi under, in every settings scope. */\nexport const DOOM_PACKAGE_NAME = '@agimon-ai/doompi';\n\n/** The `name` field of the manifest in a directory, when it has a readable one. */\nexport function manifestName(directory: string): string | undefined {\n try {\n const parsed = JSON.parse(fs.readFileSync(path.join(directory, PACKAGE_MANIFEST), 'utf8')) as { name?: unknown };\n return typeof parsed.name === 'string' ? parsed.name : undefined;\n } catch {\n // A directory with no readable manifest simply is not a package root.\n return undefined;\n }\n}\n\n/**\n * Name of the nearest package a path belongs to, walking upward from it.\n *\n * The first manifest found wins rather than the first matching one, so a file\n * inside some other package nested under a DoomPi checkout is not mistaken for\n * DoomPi itself.\n */\nexport function enclosingPackageName(target: string): string | undefined {\n let directory: string;\n try {\n directory = fs.statSync(target).isDirectory() ? target : path.dirname(target);\n } catch {\n // Nothing at that path, so it names no package.\n return undefined;\n }\n\n while (true) {\n const name = manifestName(directory);\n if (name !== undefined) return name;\n const parent = path.dirname(directory);\n if (parent === directory) return undefined;\n directory = parent;\n }\n}\n\n/** True when a resolved path lives inside an installed DoomPi package. */\nexport function isDoomPackagePath(target: string): boolean {\n return enclosingPackageName(target) === DOOM_PACKAGE_NAME;\n}\n"],"mappings":"gDAaA,MAGa,EAAoB,oBAGjC,SAAgB,EAAa,EAAuC,CAClE,GAAI,CACF,IAAM,EAAS,KAAK,MAAM,EAAG,aAAa,EAAK,KAAK,EAAW,eAAiB,CAAE,OAAO,CAAC,CAC1F,OAAO,OAAO,EAAO,MAAS,SAAW,EAAO,KAAO,IAAA,QACjD,CAEN,QAWJ,SAAgB,EAAqB,EAAoC,CACvE,IAAI,EACJ,GAAI,CACF,EAAY,EAAG,SAAS,EAAO,CAAC,aAAa,CAAG,EAAS,EAAK,QAAQ,EAAO,MACvE,CAEN,OAGF,OAAa,CACX,IAAM,EAAO,EAAa,EAAU,CACpC,GAAI,IAAS,IAAA,GAAW,OAAO,EAC/B,IAAM,EAAS,EAAK,QAAQ,EAAU,CACtC,GAAI,IAAW,EAAW,OAC1B,EAAY,GAKhB,SAAgB,EAAkB,EAAyB,CACzD,OAAO,EAAqB,EAAO,GAAK"}
@@ -0,0 +1,3 @@
1
+ const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`./dpiSettings.cjs`);let n=require(`node:path`);n=e.__toESM(n,1);let r=require(`@agimon-ai/doompi-config`);const i=`--force`,a=`PI_SUBAGENT_PI_BINARY`,o=/^dpi(?:\.[cm]?js|\.ts)?$/u;async function s(e){let t=await import(`@earendil-works/pi-coding-agent`);if(t.SettingsManager!==e.SettingsManager)throw Error(`DPI resolved more than one Pi settings runtime`);return t}function c(e=process.env,t=process.argv[1]){e.PI_CODING_AGENT=`true`,e.AI_AGENT=`pi`,!e[a]?.trim()&&t&&o.test(n.default.basename(t))&&(e[a]=n.default.resolve(t))}async function l(e){let n=await t.loadPiSettingsRuntime(),r=await s(n),i=t.installDpiSettingsOverlay(n);process.title=`dpi`,c(),process.emitWarning=(()=>void 0);try{await r.main(e);let t=process.exitCode;return typeof t==`number`?t:Number.parseInt(t??`0`,10)}finally{i()}}function u(e){return[`DoomPi repository configuration: ${e.directory}`,...e.created.length>0?[`created: ${e.created.join(`, `)}`]:[],...e.preserved.length>0?[`kept: ${e.preserved.join(`, `)}`]:[],...e.replaced.length>0?[`replaced: ${e.replaced.join(`, `)}`]:[],``,"Run `dpi sync` next.",``].join(`
2
+ `)}function d(e,t=process.cwd(),n=process.stdout){let a=e.slice(1),o=a.find(e=>e!==i);if(o!==void 0)throw Error(`dpi init does not accept ${o}`);let s=(0,r.initializeRepositoryDoomConfig)(t,{force:a.includes(i)});return n.write(u(s)),0}async function f(e){let{SyncPipeline:t}=await Promise.resolve().then(()=>require(`../commands/syncPipeline.cjs`));return new t({settingsMode:`embedded`}).execute(e)}const p={init:d,launchPi:l,sync:f};async function m(e,t=p){return e[0]===`init`?t.init(e):e[0]===`sync`?t.sync(e):t.launchPi(e)}exports.runDpi=m;
3
+ //# sourceMappingURL=dpiRunner.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dpiRunner.cjs","names":["path","loadPiSettingsRuntime","installDpiSettingsOverlay"],"sources":["../../src/adapters/dpiRunner.ts"],"sourcesContent":["import path from 'node:path';\nimport { initializeRepositoryDoomConfig, type RepositoryDoomInitResult } from '@agimon-ai/doompi-config';\nimport { installDpiSettingsOverlay, loadPiSettingsRuntime, type PiSettingsRuntime } from './dpiSettings.ts';\n\nconst INIT_COMMAND = 'init';\nconst SYNC_COMMAND = 'sync';\nconst FORCE_FLAG = '--force';\nconst PI_SUBAGENT_BINARY_ENV = 'PI_SUBAGENT_PI_BINARY';\nconst DPI_ENTRY_PATTERN = /^dpi(?:\\.[cm]?js|\\.ts)?$/u;\n\ntype PiModule = typeof import('@earendil-works/pi-coding-agent');\n\nexport interface DpiRunnerDependencies {\n init(args: string[]): number | Promise<number>;\n launchPi(args: string[]): Promise<number>;\n sync(args: string[]): Promise<number>;\n}\n\nasync function loadPiModule(settingsRuntime: PiSettingsRuntime): Promise<PiModule> {\n const loaded = await import('@earendil-works/pi-coding-agent');\n if (loaded.SettingsManager !== settingsRuntime.SettingsManager) {\n throw new Error('DPI resolved more than one Pi settings runtime');\n }\n return loaded;\n}\n\n/** Marks the process as Pi and keeps any CLI-based nested fallback on DPI. */\nexport function configureDpiEnvironment(\n environment: NodeJS.ProcessEnv = process.env,\n entryPoint: string | undefined = process.argv[1],\n): void {\n environment.PI_CODING_AGENT = 'true';\n environment.AI_AGENT = 'pi';\n if (!environment[PI_SUBAGENT_BINARY_ENV]?.trim() && entryPoint && DPI_ENTRY_PATTERN.test(path.basename(entryPoint))) {\n environment[PI_SUBAGENT_BINARY_ENV] = path.resolve(entryPoint);\n }\n}\n\n/** Runs the pinned upstream Pi entry point after installing DPI's settings view. */\nexport async function launchDpiPi(args: string[]): Promise<number> {\n const settingsRuntime = await loadPiSettingsRuntime();\n const pi = await loadPiModule(settingsRuntime);\n const restoreSettings = installDpiSettingsOverlay(settingsRuntime);\n process.title = 'dpi';\n configureDpiEnvironment();\n process.emitWarning = (() => undefined) as typeof process.emitWarning;\n\n try {\n await pi.main(args);\n const exitCode = process.exitCode;\n return typeof exitCode === 'number' ? exitCode : Number.parseInt(exitCode ?? '0', 10);\n } finally {\n restoreSettings();\n }\n}\n\nfunction formatDpiInitResult(result: RepositoryDoomInitResult): string {\n return [\n `DoomPi repository configuration: ${result.directory}`,\n ...(result.created.length > 0 ? [`created: ${result.created.join(', ')}`] : []),\n ...(result.preserved.length > 0 ? [`kept: ${result.preserved.join(', ')}`] : []),\n ...(result.replaced.length > 0 ? [`replaced: ${result.replaced.join(', ')}`] : []),\n '',\n 'Run `dpi sync` next.',\n '',\n ].join('\\n');\n}\n\n/** Seeds repository-local DoomPi configuration without registering anything with Pi. */\nexport function runDpiInit(\n args: string[],\n currentDirectory = process.cwd(),\n output: Pick<NodeJS.WritableStream, 'write'> = process.stdout,\n): number {\n const flags = args.slice(1);\n const unknown = flags.find((flag) => flag !== FORCE_FLAG);\n if (unknown !== undefined) throw new Error(`dpi init does not accept ${unknown}`);\n\n const result = initializeRepositoryDoomConfig(currentDirectory, { force: flags.includes(FORCE_FLAG) });\n output.write(formatDpiInitResult(result));\n return 0;\n}\n\n/** Runs DPI's private build → sync pipeline without persisting the settings overlay. */\nexport async function runDpiSync(args: string[]): Promise<number> {\n const { SyncPipeline } = await import('../commands/syncPipeline.ts');\n return new SyncPipeline({ settingsMode: 'embedded' }).execute(args);\n}\n\nconst DEFAULT_DEPENDENCIES: DpiRunnerDependencies = {\n init: runDpiInit,\n launchPi: launchDpiPi,\n sync: runDpiSync,\n};\n\n/** Dispatches DPI-owned setup commands and forwards every other argument to Pi. */\nexport async function runDpi(\n args: string[],\n dependencies: DpiRunnerDependencies = DEFAULT_DEPENDENCIES,\n): Promise<number> {\n if (args[0] === INIT_COMMAND) return dependencies.init(args);\n if (args[0] === SYNC_COMMAND) return dependencies.sync(args);\n return dependencies.launchPi(args);\n}\n"],"mappings":"0KAIA,MAEM,EAAa,UACb,EAAyB,wBACzB,EAAoB,4BAU1B,eAAe,EAAa,EAAuD,CACjF,IAAM,EAAS,MAAM,OAAO,mCAC5B,GAAI,EAAO,kBAAoB,EAAgB,gBAC7C,MAAU,MAAM,iDAAiD,CAEnE,OAAO,EAIT,SAAgB,EACd,EAAiC,QAAQ,IACzC,EAAiC,QAAQ,KAAK,GACxC,CACN,EAAY,gBAAkB,OAC9B,EAAY,SAAW,KACnB,CAAC,EAAY,IAAyB,MAAM,EAAI,GAAc,EAAkB,KAAKA,EAAAA,QAAK,SAAS,EAAW,CAAC,GACjH,EAAY,GAA0BA,EAAAA,QAAK,QAAQ,EAAW,EAKlE,eAAsB,EAAY,EAAiC,CACjE,IAAM,EAAkB,MAAMC,EAAAA,uBAAuB,CAC/C,EAAK,MAAM,EAAa,EAAgB,CACxC,EAAkBC,EAAAA,0BAA0B,EAAgB,CAClE,QAAQ,MAAQ,MAChB,GAAyB,CACzB,QAAQ,iBAAqB,IAAA,IAE7B,GAAI,CACF,MAAM,EAAG,KAAK,EAAK,CACnB,IAAM,EAAW,QAAQ,SACzB,OAAO,OAAO,GAAa,SAAW,EAAW,OAAO,SAAS,GAAY,IAAK,GAAG,QAC7E,CACR,GAAiB,EAIrB,SAAS,EAAoB,EAA0C,CACrE,MAAO,CACL,oCAAoC,EAAO,YAC3C,GAAI,EAAO,QAAQ,OAAS,EAAI,CAAC,aAAa,EAAO,QAAQ,KAAK,KAAK,GAAG,CAAG,EAAE,CAC/E,GAAI,EAAO,UAAU,OAAS,EAAI,CAAC,aAAa,EAAO,UAAU,KAAK,KAAK,GAAG,CAAG,EAAE,CACnF,GAAI,EAAO,SAAS,OAAS,EAAI,CAAC,aAAa,EAAO,SAAS,KAAK,KAAK,GAAG,CAAG,EAAE,CACjF,GACA,uBACA,GACD,CAAC,KAAK;EAAK,CAId,SAAgB,EACd,EACA,EAAmB,QAAQ,KAAK,CAChC,EAA+C,QAAQ,OAC/C,CACR,IAAM,EAAQ,EAAK,MAAM,EAAE,CACrB,EAAU,EAAM,KAAM,GAAS,IAAS,EAAW,CACzD,GAAI,IAAY,IAAA,GAAW,MAAU,MAAM,4BAA4B,IAAU,CAEjF,IAAM,GAAA,EAAA,EAAA,gCAAwC,EAAkB,CAAE,MAAO,EAAM,SAAS,EAAW,CAAE,CAAC,CAEtG,OADA,EAAO,MAAM,EAAoB,EAAO,CAAC,CAClC,EAIT,eAAsB,EAAW,EAAiC,CAChE,GAAM,CAAE,gBAAiB,MAAA,QAAA,SAAA,CAAA,SAAA,QAAM,+BAAA,CAAA,CAC/B,OAAO,IAAI,EAAa,CAAE,aAAc,WAAY,CAAC,CAAC,QAAQ,EAAK,CAGrE,MAAM,EAA8C,CAClD,KAAM,EACN,SAAU,EACV,KAAM,EACP,CAGD,eAAsB,EACpB,EACA,EAAsC,EACrB,CAGjB,OAFI,EAAK,KAAO,OAAqB,EAAa,KAAK,EAAK,CACxD,EAAK,KAAO,OAAqB,EAAa,KAAK,EAAK,CACrD,EAAa,SAAS,EAAK"}
@@ -0,0 +1,3 @@
1
+ import{installDpiSettingsOverlay as e,loadPiSettingsRuntime as t}from"./dpiSettings.mjs";import n from"node:path";import{initializeRepositoryDoomConfig as r}from"@agimon-ai/doompi-config";const i=`--force`,a=`PI_SUBAGENT_PI_BINARY`,o=/^dpi(?:\.[cm]?js|\.ts)?$/u;async function s(e){let t=await import(`@earendil-works/pi-coding-agent`);if(t.SettingsManager!==e.SettingsManager)throw Error(`DPI resolved more than one Pi settings runtime`);return t}function c(e=process.env,t=process.argv[1]){e.PI_CODING_AGENT=`true`,e.AI_AGENT=`pi`,!e[a]?.trim()&&t&&o.test(n.basename(t))&&(e[a]=n.resolve(t))}async function l(n){let r=await t(),i=await s(r),a=e(r);process.title=`dpi`,c(),process.emitWarning=(()=>void 0);try{await i.main(n);let e=process.exitCode;return typeof e==`number`?e:Number.parseInt(e??`0`,10)}finally{a()}}function u(e){return[`DoomPi repository configuration: ${e.directory}`,...e.created.length>0?[`created: ${e.created.join(`, `)}`]:[],...e.preserved.length>0?[`kept: ${e.preserved.join(`, `)}`]:[],...e.replaced.length>0?[`replaced: ${e.replaced.join(`, `)}`]:[],``,"Run `dpi sync` next.",``].join(`
2
+ `)}function d(e,t=process.cwd(),n=process.stdout){let a=e.slice(1),o=a.find(e=>e!==i);if(o!==void 0)throw Error(`dpi init does not accept ${o}`);let s=r(t,{force:a.includes(i)});return n.write(u(s)),0}async function f(e){let{SyncPipeline:t}=await import(`../commands/syncPipeline.mjs`);return new t({settingsMode:`embedded`}).execute(e)}const p={init:d,launchPi:l,sync:f};async function m(e,t=p){return e[0]===`init`?t.init(e):e[0]===`sync`?t.sync(e):t.launchPi(e)}export{m as runDpi};
3
+ //# sourceMappingURL=dpiRunner.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dpiRunner.mjs","names":[],"sources":["../../src/adapters/dpiRunner.ts"],"sourcesContent":["import path from 'node:path';\nimport { initializeRepositoryDoomConfig, type RepositoryDoomInitResult } from '@agimon-ai/doompi-config';\nimport { installDpiSettingsOverlay, loadPiSettingsRuntime, type PiSettingsRuntime } from './dpiSettings.ts';\n\nconst INIT_COMMAND = 'init';\nconst SYNC_COMMAND = 'sync';\nconst FORCE_FLAG = '--force';\nconst PI_SUBAGENT_BINARY_ENV = 'PI_SUBAGENT_PI_BINARY';\nconst DPI_ENTRY_PATTERN = /^dpi(?:\\.[cm]?js|\\.ts)?$/u;\n\ntype PiModule = typeof import('@earendil-works/pi-coding-agent');\n\nexport interface DpiRunnerDependencies {\n init(args: string[]): number | Promise<number>;\n launchPi(args: string[]): Promise<number>;\n sync(args: string[]): Promise<number>;\n}\n\nasync function loadPiModule(settingsRuntime: PiSettingsRuntime): Promise<PiModule> {\n const loaded = await import('@earendil-works/pi-coding-agent');\n if (loaded.SettingsManager !== settingsRuntime.SettingsManager) {\n throw new Error('DPI resolved more than one Pi settings runtime');\n }\n return loaded;\n}\n\n/** Marks the process as Pi and keeps any CLI-based nested fallback on DPI. */\nexport function configureDpiEnvironment(\n environment: NodeJS.ProcessEnv = process.env,\n entryPoint: string | undefined = process.argv[1],\n): void {\n environment.PI_CODING_AGENT = 'true';\n environment.AI_AGENT = 'pi';\n if (!environment[PI_SUBAGENT_BINARY_ENV]?.trim() && entryPoint && DPI_ENTRY_PATTERN.test(path.basename(entryPoint))) {\n environment[PI_SUBAGENT_BINARY_ENV] = path.resolve(entryPoint);\n }\n}\n\n/** Runs the pinned upstream Pi entry point after installing DPI's settings view. */\nexport async function launchDpiPi(args: string[]): Promise<number> {\n const settingsRuntime = await loadPiSettingsRuntime();\n const pi = await loadPiModule(settingsRuntime);\n const restoreSettings = installDpiSettingsOverlay(settingsRuntime);\n process.title = 'dpi';\n configureDpiEnvironment();\n process.emitWarning = (() => undefined) as typeof process.emitWarning;\n\n try {\n await pi.main(args);\n const exitCode = process.exitCode;\n return typeof exitCode === 'number' ? exitCode : Number.parseInt(exitCode ?? '0', 10);\n } finally {\n restoreSettings();\n }\n}\n\nfunction formatDpiInitResult(result: RepositoryDoomInitResult): string {\n return [\n `DoomPi repository configuration: ${result.directory}`,\n ...(result.created.length > 0 ? [`created: ${result.created.join(', ')}`] : []),\n ...(result.preserved.length > 0 ? [`kept: ${result.preserved.join(', ')}`] : []),\n ...(result.replaced.length > 0 ? [`replaced: ${result.replaced.join(', ')}`] : []),\n '',\n 'Run `dpi sync` next.',\n '',\n ].join('\\n');\n}\n\n/** Seeds repository-local DoomPi configuration without registering anything with Pi. */\nexport function runDpiInit(\n args: string[],\n currentDirectory = process.cwd(),\n output: Pick<NodeJS.WritableStream, 'write'> = process.stdout,\n): number {\n const flags = args.slice(1);\n const unknown = flags.find((flag) => flag !== FORCE_FLAG);\n if (unknown !== undefined) throw new Error(`dpi init does not accept ${unknown}`);\n\n const result = initializeRepositoryDoomConfig(currentDirectory, { force: flags.includes(FORCE_FLAG) });\n output.write(formatDpiInitResult(result));\n return 0;\n}\n\n/** Runs DPI's private build → sync pipeline without persisting the settings overlay. */\nexport async function runDpiSync(args: string[]): Promise<number> {\n const { SyncPipeline } = await import('../commands/syncPipeline.ts');\n return new SyncPipeline({ settingsMode: 'embedded' }).execute(args);\n}\n\nconst DEFAULT_DEPENDENCIES: DpiRunnerDependencies = {\n init: runDpiInit,\n launchPi: launchDpiPi,\n sync: runDpiSync,\n};\n\n/** Dispatches DPI-owned setup commands and forwards every other argument to Pi. */\nexport async function runDpi(\n args: string[],\n dependencies: DpiRunnerDependencies = DEFAULT_DEPENDENCIES,\n): Promise<number> {\n if (args[0] === INIT_COMMAND) return dependencies.init(args);\n if (args[0] === SYNC_COMMAND) return dependencies.sync(args);\n return dependencies.launchPi(args);\n}\n"],"mappings":"4LAIA,MAEM,EAAa,UACb,EAAyB,wBACzB,EAAoB,4BAU1B,eAAe,EAAa,EAAuD,CACjF,IAAM,EAAS,MAAM,OAAO,mCAC5B,GAAI,EAAO,kBAAoB,EAAgB,gBAC7C,MAAU,MAAM,iDAAiD,CAEnE,OAAO,EAIT,SAAgB,EACd,EAAiC,QAAQ,IACzC,EAAiC,QAAQ,KAAK,GACxC,CACN,EAAY,gBAAkB,OAC9B,EAAY,SAAW,KACnB,CAAC,EAAY,IAAyB,MAAM,EAAI,GAAc,EAAkB,KAAK,EAAK,SAAS,EAAW,CAAC,GACjH,EAAY,GAA0B,EAAK,QAAQ,EAAW,EAKlE,eAAsB,EAAY,EAAiC,CACjE,IAAM,EAAkB,MAAM,GAAuB,CAC/C,EAAK,MAAM,EAAa,EAAgB,CACxC,EAAkB,EAA0B,EAAgB,CAClE,QAAQ,MAAQ,MAChB,GAAyB,CACzB,QAAQ,iBAAqB,IAAA,IAE7B,GAAI,CACF,MAAM,EAAG,KAAK,EAAK,CACnB,IAAM,EAAW,QAAQ,SACzB,OAAO,OAAO,GAAa,SAAW,EAAW,OAAO,SAAS,GAAY,IAAK,GAAG,QAC7E,CACR,GAAiB,EAIrB,SAAS,EAAoB,EAA0C,CACrE,MAAO,CACL,oCAAoC,EAAO,YAC3C,GAAI,EAAO,QAAQ,OAAS,EAAI,CAAC,aAAa,EAAO,QAAQ,KAAK,KAAK,GAAG,CAAG,EAAE,CAC/E,GAAI,EAAO,UAAU,OAAS,EAAI,CAAC,aAAa,EAAO,UAAU,KAAK,KAAK,GAAG,CAAG,EAAE,CACnF,GAAI,EAAO,SAAS,OAAS,EAAI,CAAC,aAAa,EAAO,SAAS,KAAK,KAAK,GAAG,CAAG,EAAE,CACjF,GACA,uBACA,GACD,CAAC,KAAK;EAAK,CAId,SAAgB,EACd,EACA,EAAmB,QAAQ,KAAK,CAChC,EAA+C,QAAQ,OAC/C,CACR,IAAM,EAAQ,EAAK,MAAM,EAAE,CACrB,EAAU,EAAM,KAAM,GAAS,IAAS,EAAW,CACzD,GAAI,IAAY,IAAA,GAAW,MAAU,MAAM,4BAA4B,IAAU,CAEjF,IAAM,EAAS,EAA+B,EAAkB,CAAE,MAAO,EAAM,SAAS,EAAW,CAAE,CAAC,CAEtG,OADA,EAAO,MAAM,EAAoB,EAAO,CAAC,CAClC,EAIT,eAAsB,EAAW,EAAiC,CAChE,GAAM,CAAE,gBAAiB,MAAM,OAAO,gCACtC,OAAO,IAAI,EAAa,CAAE,aAAc,WAAY,CAAC,CAAC,QAAQ,EAAK,CAGrE,MAAM,EAA8C,CAClD,KAAM,EACN,SAAU,EACV,KAAM,EACP,CAGD,eAAsB,EACpB,EACA,EAAsC,EACrB,CAGjB,OAFI,EAAK,KAAO,OAAqB,EAAa,KAAK,EAAK,CACxD,EAAK,KAAO,OAAqB,EAAa,KAAK,EAAK,CACrD,EAAa,SAAS,EAAK"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`./modules/moduleResolution.cjs`),n=require(`./piSettings.cjs`);let r=require(`node:url`),i=require(`node:path`);i=e.__toESM(i,1);const a=[`extensions`,`themes`,`theme`,`quietStartup`],o={extensions:[`@agimon-ai/doompi`,`!extensions/**`],themes:[`themes/doom-pi-dark.json`],theme:`doom-pi-dark`,quietStartup:!0};function s(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function c(e){if(e===void 0)return{};let t=JSON.parse(e);if(!s(t))throw SyntaxError(`Pi settings must contain a JSON object`);return t}function l(e,t){if(e===`project`&&t===void 0)return;let n=c(t);if(e===`global`)Object.assign(n,o);else for(let e of a)delete n[e];return JSON.stringify(n,null,2)}function u(e,t){let n=c(e),r=c(t);for(let e of a)Object.hasOwn(n,e)?r[e]=n[e]:delete r[e];return JSON.stringify(r,null,2)}var d=class{backend;constructor(e){this.backend=e}withLock(e,t){this.backend.withLock(e,n=>{let r=t(l(e,n));return r===void 0?void 0:u(n,r)})}};function f(e){if(!s(e)||typeof e.FileSettingsStorage!=`function`)return!1;let t=e.SettingsManager;return typeof t==`function`?typeof Reflect.get(t,`create`)==`function`&&typeof Reflect.get(t,`fromStorage`)==`function`:!1}async function p(){let e=i.default.join(i.default.dirname(t.piCliPath()),`core`,`settings-manager.js`),n=await import((0,r.pathToFileURL)(e).href);if(!f(n))throw Error(`Unsupported Pi settings runtime: ${e}`);return n}function m(e,t=process.env){let r=e.SettingsManager.create;return e.SettingsManager.create=(r,i,a)=>{let o=i??n.piAgentDirectory(t),s=new e.FileSettingsStorage(r,o);return e.SettingsManager.fromStorage(new d(s),a)},()=>{e.SettingsManager.create=r}}exports.installDpiSettingsOverlay=m,exports.loadPiSettingsRuntime=p;
2
+ //# sourceMappingURL=dpiSettings.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dpiSettings.cjs","names":["path","piCliPath","piAgentDirectory"],"sources":["../../src/adapters/dpiSettings.ts"],"sourcesContent":["import path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport type { SettingsManager, SettingsManagerCreateOptions } from '@earendil-works/pi-coding-agent';\nimport { piCliPath } from './modules/moduleResolution.ts';\nimport { piAgentDirectory } from './piSettings.ts';\n\nconst GLOBAL_SCOPE = 'global';\nconst PROJECT_SCOPE = 'project';\nconst MANAGED_KEYS = ['extensions', 'themes', 'theme', 'quietStartup'] as const;\n\nexport const DPI_MANAGED_SETTINGS = {\n extensions: ['@agimon-ai/doompi', '!extensions/**'],\n themes: ['themes/doom-pi-dark.json'],\n theme: 'doom-pi-dark',\n quietStartup: true,\n};\n\nexport type DpiSettingsScope = typeof GLOBAL_SCOPE | typeof PROJECT_SCOPE;\n\nexport interface DpiSettingsStorageBackend {\n withLock(scope: DpiSettingsScope, callback: (current: string | undefined) => string | undefined): void;\n}\n\ninterface SettingsManagerClass {\n create(this: void, cwd: string, agentDir?: string, options?: SettingsManagerCreateOptions): SettingsManager;\n fromStorage(this: void, storage: DpiSettingsStorageBackend, options?: SettingsManagerCreateOptions): SettingsManager;\n}\n\ninterface FileSettingsStorageConstructor {\n new (cwd: string, agentDir: string): DpiSettingsStorageBackend;\n}\n\nexport interface PiSettingsRuntime {\n FileSettingsStorage: FileSettingsStorageConstructor;\n SettingsManager: SettingsManagerClass;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction parseSettings(content: string | undefined): Record<string, unknown> {\n if (content === undefined) return {};\n const parsed: unknown = JSON.parse(content);\n if (!isRecord(parsed)) throw new SyntaxError('Pi settings must contain a JSON object');\n return parsed;\n}\n\nfunction managedView(scope: DpiSettingsScope, current: string | undefined): string | undefined {\n if (scope === PROJECT_SCOPE && current === undefined) return undefined;\n const settings = parseSettings(current);\n if (scope === GLOBAL_SCOPE) Object.assign(settings, DPI_MANAGED_SETTINGS);\n else for (const key of MANAGED_KEYS) delete settings[key];\n return JSON.stringify(settings, null, 2);\n}\n\nfunction restorePersistedSettings(current: string | undefined, next: string): string {\n const persisted = parseSettings(current);\n const updated = parseSettings(next);\n for (const key of MANAGED_KEYS) {\n if (Object.hasOwn(persisted, key)) updated[key] = persisted[key];\n else delete updated[key];\n }\n return JSON.stringify(updated, null, 2);\n}\n\n/**\n * Presents DoomPi-owned settings to Pi without allowing that overlay to leak\n * into either the global or project settings file when Pi saves another key.\n */\nexport class DpiSettingsStorage implements DpiSettingsStorageBackend {\n private readonly backend: DpiSettingsStorageBackend;\n\n constructor(backend: DpiSettingsStorageBackend) {\n this.backend = backend;\n }\n\n withLock(scope: DpiSettingsScope, callback: (current: string | undefined) => string | undefined): void {\n this.backend.withLock(scope, (current) => {\n const next = callback(managedView(scope, current));\n return next === undefined ? undefined : restorePersistedSettings(current, next);\n });\n }\n}\n\nfunction isPiSettingsRuntime(value: unknown): value is PiSettingsRuntime {\n if (!isRecord(value) || typeof value.FileSettingsStorage !== 'function') return false;\n const settingsManager = value.SettingsManager;\n if (typeof settingsManager !== 'function') return false;\n return (\n typeof Reflect.get(settingsManager, 'create') === 'function' &&\n typeof Reflect.get(settingsManager, 'fromStorage') === 'function'\n );\n}\n\n/** Loads Pi's concrete file storage from the same pinned installation as its CLI. */\nexport async function loadPiSettingsRuntime(): Promise<PiSettingsRuntime> {\n const modulePath = path.join(path.dirname(piCliPath()), 'core', 'settings-manager.js');\n const loaded: unknown = await import(pathToFileURL(modulePath).href);\n if (!isPiSettingsRuntime(loaded)) throw new Error(`Unsupported Pi settings runtime: ${modulePath}`);\n return loaded;\n}\n\n/** Installs the process-local create() hook used by upstream Pi startup and reloads. */\nexport function installDpiSettingsOverlay(\n runtime: PiSettingsRuntime,\n environment: NodeJS.ProcessEnv = process.env,\n): () => void {\n const originalCreate = runtime.SettingsManager.create;\n runtime.SettingsManager.create = (cwd, agentDir, options) => {\n const resolvedAgentDirectory = agentDir ?? piAgentDirectory(environment);\n const storage = new runtime.FileSettingsStorage(cwd, resolvedAgentDirectory);\n return runtime.SettingsManager.fromStorage(new DpiSettingsStorage(storage), options);\n };\n\n return () => {\n runtime.SettingsManager.create = originalCreate;\n };\n}\n"],"mappings":"iMAMA,MAEM,EAAe,CAAC,aAAc,SAAU,QAAS,eAAe,CAEzD,EAAuB,CAClC,WAAY,CAAC,oBAAqB,iBAAiB,CACnD,OAAQ,CAAC,2BAA2B,CACpC,MAAO,eACP,aAAc,GACf,CAsBD,SAAS,EAAS,EAAkD,CAClE,OAAO,OAAO,GAAU,YAAY,GAAkB,CAAC,MAAM,QAAQ,EAAM,CAG7E,SAAS,EAAc,EAAsD,CAC3E,GAAI,IAAY,IAAA,GAAW,MAAO,EAAE,CACpC,IAAM,EAAkB,KAAK,MAAM,EAAQ,CAC3C,GAAI,CAAC,EAAS,EAAO,CAAE,MAAU,YAAY,yCAAyC,CACtF,OAAO,EAGT,SAAS,EAAY,EAAyB,EAAiD,CAC7F,GAAI,IAAU,WAAiB,IAAY,IAAA,GAAW,OACtD,IAAM,EAAW,EAAc,EAAQ,CACvC,GAAI,IAAU,SAAc,OAAO,OAAO,EAAU,EAAqB,MACpE,IAAK,IAAM,KAAO,EAAc,OAAO,EAAS,GACrD,OAAO,KAAK,UAAU,EAAU,KAAM,EAAE,CAG1C,SAAS,EAAyB,EAA6B,EAAsB,CACnF,IAAM,EAAY,EAAc,EAAQ,CAClC,EAAU,EAAc,EAAK,CACnC,IAAK,IAAM,KAAO,EACZ,OAAO,OAAO,EAAW,EAAI,CAAE,EAAQ,GAAO,EAAU,GACvD,OAAO,EAAQ,GAEtB,OAAO,KAAK,UAAU,EAAS,KAAM,EAAE,CAOzC,IAAa,EAAb,KAAqE,CACnE,QAEA,YAAY,EAAoC,CAC9C,KAAK,QAAU,EAGjB,SAAS,EAAyB,EAAqE,CACrG,KAAK,QAAQ,SAAS,EAAQ,GAAY,CACxC,IAAM,EAAO,EAAS,EAAY,EAAO,EAAQ,CAAC,CAClD,OAAO,IAAS,IAAA,GAAY,IAAA,GAAY,EAAyB,EAAS,EAAK,EAC/E,GAIN,SAAS,EAAoB,EAA4C,CACvE,GAAI,CAAC,EAAS,EAAM,EAAI,OAAO,EAAM,qBAAwB,WAAY,MAAO,GAChF,IAAM,EAAkB,EAAM,gBAE9B,OADI,OAAO,GAAoB,WAE7B,OAAO,QAAQ,IAAI,EAAiB,SAAS,EAAK,YAClD,OAAO,QAAQ,IAAI,EAAiB,cAAc,EAAK,WAHP,GAQpD,eAAsB,GAAoD,CACxE,IAAM,EAAaA,EAAAA,QAAK,KAAKA,EAAAA,QAAK,QAAQC,EAAAA,WAAW,CAAC,CAAE,OAAQ,sBAAsB,CAChF,EAAkB,MAAM,QAAA,EAAA,EAAA,eAAqB,EAAW,CAAC,MAC/D,GAAI,CAAC,EAAoB,EAAO,CAAE,MAAU,MAAM,oCAAoC,IAAa,CACnG,OAAO,EAIT,SAAgB,EACd,EACA,EAAiC,QAAQ,IAC7B,CACZ,IAAM,EAAiB,EAAQ,gBAAgB,OAO/C,MANA,GAAQ,gBAAgB,QAAU,EAAK,EAAU,IAAY,CAC3D,IAAM,EAAyB,GAAYC,EAAAA,iBAAiB,EAAY,CAClE,EAAU,IAAI,EAAQ,oBAAoB,EAAK,EAAuB,CAC5E,OAAO,EAAQ,gBAAgB,YAAY,IAAI,EAAmB,EAAQ,CAAE,EAAQ,MAGzE,CACX,EAAQ,gBAAgB,OAAS"}
@@ -0,0 +1,2 @@
1
+ import{piCliPath as e}from"./modules/moduleResolution.mjs";import{piAgentDirectory as t}from"./piSettings.mjs";import{pathToFileURL as n}from"node:url";import r from"node:path";const i=[`extensions`,`themes`,`theme`,`quietStartup`],a={extensions:[`@agimon-ai/doompi`,`!extensions/**`],themes:[`themes/doom-pi-dark.json`],theme:`doom-pi-dark`,quietStartup:!0};function o(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function s(e){if(e===void 0)return{};let t=JSON.parse(e);if(!o(t))throw SyntaxError(`Pi settings must contain a JSON object`);return t}function c(e,t){if(e===`project`&&t===void 0)return;let n=s(t);if(e===`global`)Object.assign(n,a);else for(let e of i)delete n[e];return JSON.stringify(n,null,2)}function l(e,t){let n=s(e),r=s(t);for(let e of i)Object.hasOwn(n,e)?r[e]=n[e]:delete r[e];return JSON.stringify(r,null,2)}var u=class{backend;constructor(e){this.backend=e}withLock(e,t){this.backend.withLock(e,n=>{let r=t(c(e,n));return r===void 0?void 0:l(n,r)})}};function d(e){if(!o(e)||typeof e.FileSettingsStorage!=`function`)return!1;let t=e.SettingsManager;return typeof t==`function`?typeof Reflect.get(t,`create`)==`function`&&typeof Reflect.get(t,`fromStorage`)==`function`:!1}async function f(){let t=r.join(r.dirname(e()),`core`,`settings-manager.js`),i=await import(n(t).href);if(!d(i))throw Error(`Unsupported Pi settings runtime: ${t}`);return i}function p(e,n=process.env){let r=e.SettingsManager.create;return e.SettingsManager.create=(r,i,a)=>{let o=i??t(n),s=new e.FileSettingsStorage(r,o);return e.SettingsManager.fromStorage(new u(s),a)},()=>{e.SettingsManager.create=r}}export{p as installDpiSettingsOverlay,f as loadPiSettingsRuntime};
2
+ //# sourceMappingURL=dpiSettings.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dpiSettings.mjs","names":[],"sources":["../../src/adapters/dpiSettings.ts"],"sourcesContent":["import path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport type { SettingsManager, SettingsManagerCreateOptions } from '@earendil-works/pi-coding-agent';\nimport { piCliPath } from './modules/moduleResolution.ts';\nimport { piAgentDirectory } from './piSettings.ts';\n\nconst GLOBAL_SCOPE = 'global';\nconst PROJECT_SCOPE = 'project';\nconst MANAGED_KEYS = ['extensions', 'themes', 'theme', 'quietStartup'] as const;\n\nexport const DPI_MANAGED_SETTINGS = {\n extensions: ['@agimon-ai/doompi', '!extensions/**'],\n themes: ['themes/doom-pi-dark.json'],\n theme: 'doom-pi-dark',\n quietStartup: true,\n};\n\nexport type DpiSettingsScope = typeof GLOBAL_SCOPE | typeof PROJECT_SCOPE;\n\nexport interface DpiSettingsStorageBackend {\n withLock(scope: DpiSettingsScope, callback: (current: string | undefined) => string | undefined): void;\n}\n\ninterface SettingsManagerClass {\n create(this: void, cwd: string, agentDir?: string, options?: SettingsManagerCreateOptions): SettingsManager;\n fromStorage(this: void, storage: DpiSettingsStorageBackend, options?: SettingsManagerCreateOptions): SettingsManager;\n}\n\ninterface FileSettingsStorageConstructor {\n new (cwd: string, agentDir: string): DpiSettingsStorageBackend;\n}\n\nexport interface PiSettingsRuntime {\n FileSettingsStorage: FileSettingsStorageConstructor;\n SettingsManager: SettingsManagerClass;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction parseSettings(content: string | undefined): Record<string, unknown> {\n if (content === undefined) return {};\n const parsed: unknown = JSON.parse(content);\n if (!isRecord(parsed)) throw new SyntaxError('Pi settings must contain a JSON object');\n return parsed;\n}\n\nfunction managedView(scope: DpiSettingsScope, current: string | undefined): string | undefined {\n if (scope === PROJECT_SCOPE && current === undefined) return undefined;\n const settings = parseSettings(current);\n if (scope === GLOBAL_SCOPE) Object.assign(settings, DPI_MANAGED_SETTINGS);\n else for (const key of MANAGED_KEYS) delete settings[key];\n return JSON.stringify(settings, null, 2);\n}\n\nfunction restorePersistedSettings(current: string | undefined, next: string): string {\n const persisted = parseSettings(current);\n const updated = parseSettings(next);\n for (const key of MANAGED_KEYS) {\n if (Object.hasOwn(persisted, key)) updated[key] = persisted[key];\n else delete updated[key];\n }\n return JSON.stringify(updated, null, 2);\n}\n\n/**\n * Presents DoomPi-owned settings to Pi without allowing that overlay to leak\n * into either the global or project settings file when Pi saves another key.\n */\nexport class DpiSettingsStorage implements DpiSettingsStorageBackend {\n private readonly backend: DpiSettingsStorageBackend;\n\n constructor(backend: DpiSettingsStorageBackend) {\n this.backend = backend;\n }\n\n withLock(scope: DpiSettingsScope, callback: (current: string | undefined) => string | undefined): void {\n this.backend.withLock(scope, (current) => {\n const next = callback(managedView(scope, current));\n return next === undefined ? undefined : restorePersistedSettings(current, next);\n });\n }\n}\n\nfunction isPiSettingsRuntime(value: unknown): value is PiSettingsRuntime {\n if (!isRecord(value) || typeof value.FileSettingsStorage !== 'function') return false;\n const settingsManager = value.SettingsManager;\n if (typeof settingsManager !== 'function') return false;\n return (\n typeof Reflect.get(settingsManager, 'create') === 'function' &&\n typeof Reflect.get(settingsManager, 'fromStorage') === 'function'\n );\n}\n\n/** Loads Pi's concrete file storage from the same pinned installation as its CLI. */\nexport async function loadPiSettingsRuntime(): Promise<PiSettingsRuntime> {\n const modulePath = path.join(path.dirname(piCliPath()), 'core', 'settings-manager.js');\n const loaded: unknown = await import(pathToFileURL(modulePath).href);\n if (!isPiSettingsRuntime(loaded)) throw new Error(`Unsupported Pi settings runtime: ${modulePath}`);\n return loaded;\n}\n\n/** Installs the process-local create() hook used by upstream Pi startup and reloads. */\nexport function installDpiSettingsOverlay(\n runtime: PiSettingsRuntime,\n environment: NodeJS.ProcessEnv = process.env,\n): () => void {\n const originalCreate = runtime.SettingsManager.create;\n runtime.SettingsManager.create = (cwd, agentDir, options) => {\n const resolvedAgentDirectory = agentDir ?? piAgentDirectory(environment);\n const storage = new runtime.FileSettingsStorage(cwd, resolvedAgentDirectory);\n return runtime.SettingsManager.fromStorage(new DpiSettingsStorage(storage), options);\n };\n\n return () => {\n runtime.SettingsManager.create = originalCreate;\n };\n}\n"],"mappings":"iLAMA,MAEM,EAAe,CAAC,aAAc,SAAU,QAAS,eAAe,CAEzD,EAAuB,CAClC,WAAY,CAAC,oBAAqB,iBAAiB,CACnD,OAAQ,CAAC,2BAA2B,CACpC,MAAO,eACP,aAAc,GACf,CAsBD,SAAS,EAAS,EAAkD,CAClE,OAAO,OAAO,GAAU,YAAY,GAAkB,CAAC,MAAM,QAAQ,EAAM,CAG7E,SAAS,EAAc,EAAsD,CAC3E,GAAI,IAAY,IAAA,GAAW,MAAO,EAAE,CACpC,IAAM,EAAkB,KAAK,MAAM,EAAQ,CAC3C,GAAI,CAAC,EAAS,EAAO,CAAE,MAAU,YAAY,yCAAyC,CACtF,OAAO,EAGT,SAAS,EAAY,EAAyB,EAAiD,CAC7F,GAAI,IAAU,WAAiB,IAAY,IAAA,GAAW,OACtD,IAAM,EAAW,EAAc,EAAQ,CACvC,GAAI,IAAU,SAAc,OAAO,OAAO,EAAU,EAAqB,MACpE,IAAK,IAAM,KAAO,EAAc,OAAO,EAAS,GACrD,OAAO,KAAK,UAAU,EAAU,KAAM,EAAE,CAG1C,SAAS,EAAyB,EAA6B,EAAsB,CACnF,IAAM,EAAY,EAAc,EAAQ,CAClC,EAAU,EAAc,EAAK,CACnC,IAAK,IAAM,KAAO,EACZ,OAAO,OAAO,EAAW,EAAI,CAAE,EAAQ,GAAO,EAAU,GACvD,OAAO,EAAQ,GAEtB,OAAO,KAAK,UAAU,EAAS,KAAM,EAAE,CAOzC,IAAa,EAAb,KAAqE,CACnE,QAEA,YAAY,EAAoC,CAC9C,KAAK,QAAU,EAGjB,SAAS,EAAyB,EAAqE,CACrG,KAAK,QAAQ,SAAS,EAAQ,GAAY,CACxC,IAAM,EAAO,EAAS,EAAY,EAAO,EAAQ,CAAC,CAClD,OAAO,IAAS,IAAA,GAAY,IAAA,GAAY,EAAyB,EAAS,EAAK,EAC/E,GAIN,SAAS,EAAoB,EAA4C,CACvE,GAAI,CAAC,EAAS,EAAM,EAAI,OAAO,EAAM,qBAAwB,WAAY,MAAO,GAChF,IAAM,EAAkB,EAAM,gBAE9B,OADI,OAAO,GAAoB,WAE7B,OAAO,QAAQ,IAAI,EAAiB,SAAS,EAAK,YAClD,OAAO,QAAQ,IAAI,EAAiB,cAAc,EAAK,WAHP,GAQpD,eAAsB,GAAoD,CACxE,IAAM,EAAa,EAAK,KAAK,EAAK,QAAQ,GAAW,CAAC,CAAE,OAAQ,sBAAsB,CAChF,EAAkB,MAAM,OAAO,EAAc,EAAW,CAAC,MAC/D,GAAI,CAAC,EAAoB,EAAO,CAAE,MAAU,MAAM,oCAAoC,IAAa,CACnG,OAAO,EAIT,SAAgB,EACd,EACA,EAAiC,QAAQ,IAC7B,CACZ,IAAM,EAAiB,EAAQ,gBAAgB,OAO/C,MANA,GAAQ,gBAAgB,QAAU,EAAK,EAAU,IAAY,CAC3D,IAAM,EAAyB,GAAY,EAAiB,EAAY,CAClE,EAAU,IAAI,EAAQ,oBAAoB,EAAK,EAAuB,CAC5E,OAAO,EAAQ,gBAAgB,YAAY,IAAI,EAAmB,EAAQ,CAAE,EAAQ,MAGzE,CACX,EAAQ,gBAAgB,OAAS"}
@@ -0,0 +1,3 @@
1
+ const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`./modules/moduleResolution.cjs`);require(`../utils/index.cjs`);const n=require(`./sharedBuildCache.cjs`);let r=require(`node:url`),i=require(`node:path`);i=e.__toESM(i,1);let a=require(`node:fs`);a=e.__toESM(a,1);let o=require(`node:crypto`),s=require(`node:module`);const c=[`.ts`,`.mts`,`.cts`],l=`.mjs`,u=`sets`,d=`\0doompi-extension-set`,f=`@agimon-ai/doompi-ui/extensionName`,p=`__DOOMPI_PATH_`,m=`repo/`,h=`external/`,g={"@mariozechner/pi-coding-agent":`@earendil-works/pi-coding-agent`,"@mariozechner/pi-tui":`@earendil-works/pi-tui`,"@mariozechner/pi-ai":`@earendil-works/pi-ai`,"@sinclair/typebox":`typebox`};function _(e){return c.some(t=>e.endsWith(t))}function v(e){for(let[t,n]of Object.entries(g)){if(e===t)return n;if(e.startsWith(`${t}/`))return`${n}${e.slice(t.length)}`}return e}const y=new Set([`@earendil-works/pi-coding-agent`,`@earendil-works/pi-tui`,`@earendil-works/pi-ai`]);function ee(e){let n=t.optionalPackageEntry(`@earendil-works/pi-coding-agent`);if(n)try{return(0,s.createRequire)(n).resolve(e)}catch{return}}const b=new Set([`@parcel/watcher`,`@napi-rs/keyring`,`better-sqlite3`,`canvas`,`fsevents`,`isolated-vm`,`keytar`,`node-pty`,`onnxruntime-node`,`playwright`,`playwright-core`,`puppeteer`,`sharp`,`typescript`]),x=new Set([`@agimon-ai/foundation-port-registry`,`@agimon-ai/foundation-process-registry`,`@agimon-ai/log-sink-mcp`,`@modelcontextprotocol/sdk`,`@narumitw/pi-tui-kit`,`@rmux/sdk`,`@tursodatabase/database`,`@tursodatabase/database-common`,`ajv`,`ajv-formats`,`gpt-tokenizer`,`highlight.js`,`hono`,`inversify`,`open`,`reflect-metadata`,`zod-to-json-schema`,`yaml`,`zod`]),S=new Set(s.builtinModules.flatMap(e=>[e,`node:${e}`]));function C(e){return e.trim().replace(/[^a-zA-Z0-9._-]+/g,`-`).replace(/^[-.]+|[-.]+$/g,``)||`doom-set`}function w(e){let t=e.startsWith(`@`)?e.indexOf(`/`,e.indexOf(`/`)+1):e.indexOf(`/`);return t===-1?e:e.slice(0,t)}function te(e){let t=i.default.dirname(e);for(;;){let e=i.default.join(t,`package.json`);if(a.default.existsSync(e))try{let t=JSON.parse(a.default.readFileSync(e,`utf8`));if(Z(t)&&typeof t.name==`string`)return t.name}catch{return}let n=i.default.dirname(t);if(n===t)return;t=n}}function T(e){let t=i.default.resolve(e);try{return a.default.realpathSync.native(t)}catch{return t}}function E(e,t){let n=i.default.relative(i.default.resolve(e),i.default.resolve(t));return n===``||!n.startsWith(`..`)&&!i.default.isAbsolute(n)}function D(e){return`${h}${(0,o.createHash)(`sha256`).update(e).digest(`hex`)}`}function O(e,t){let n=T(e);return E(t,n)?{logicalPath:`${m}${i.default.relative(t,n).split(i.default.sep).join(`/`)}`,target:n}:{logicalPath:D(n),target:n,sourcePath:n}}function k(e,t){if(e.logicalPath.startsWith(m)&&e.sourcePath===void 0){let n=i.default.resolve(t,e.logicalPath.slice(5));return E(t,n)?n:void 0}if(e.logicalPath.startsWith(h)&&e.sourcePath!==void 0&&e.logicalPath===D(e.sourcePath))return e.sourcePath}function A(e){try{let t=a.default.statSync(e);return t.isFile()?{path:e,size:t.size,mtimeMs:t.mtimeMs}:void 0}catch{return}}function j(e,t,n){return e.version===t&&e.output===n&&a.default.existsSync(n)&&e.artifacts.every(e=>a.default.existsSync(e))}function M(e,t){return!j(e,`v12`,e.output)||JSON.stringify(e.entries)!==JSON.stringify(t)?!1:e.inputs.every(e=>{let t=A(e.path);return t?.size===e.size&&t.mtimeMs===e.mtimeMs})}function N(e){try{let t=JSON.parse(a.default.readFileSync(e,`utf8`));return t&&typeof t.output==`string`&&Array.isArray(t.artifacts)?t:void 0}catch{return}}function P(e){let t=N(e);return t&&Array.isArray(t.entries)&&Array.isArray(t.inputs)?t:void 0}function F(e,t){a.default.mkdirSync(i.default.dirname(e),{recursive:!0});let n=`${e}.${process.pid}.${Date.now()}.tmp`;a.default.writeFileSync(n,t);try{a.default.renameSync(n,e)}catch(t){if(a.default.rmSync(n,{force:!0}),!a.default.existsSync(e))throw t}}function I(e){return{format:`esm`,sourcemap:!1,minify:!0,codeSplitting:!0,hashCharacters:`hex`,entryFileNames:e,chunkFileNames:`chunks/[name].[hash:16]${l}`,assetFileNames:`assets/[name].[hash:16][extname]`}}function L(e,t){let n=i.default.resolve(e,t.fileName),r=i.default.relative(e,n);if(r.startsWith(`..`)||i.default.isAbsolute(r))throw Error(`Rolldown emitted an artifact outside the output directory: ${t.fileName}`);return n}function R(e,t){try{let n=a.default.readFileSync(e),r=Buffer.from(t);return n.equals(r)}catch{return!1}}function z(e,t){let n=e.output.find(e=>e.type===`chunk`&&e.isEntry);if(!n||n.type!==`chunk`)throw Error(`Rolldown produced no extension entry`);let r=i.default.resolve(t),a=e.output.filter(e=>e!==n);for(let e of[...a,n]){let t=e.type===`chunk`?e.code:e.source,n=L(r,e);R(n,t)||F(n,t)}return{entry:L(r,n),artifacts:e.output.map(e=>L(r,e)).sort()}}function B(e,t){return(0,o.createHash)(`sha256`).update(`v3-rolldown-1.0.0-rc.17`).update(process.version).update(process.platform).update(process.arch).update(t).update(JSON.stringify(e.map(e=>e.logicalPath))).digest(`hex`)}function V(e,t){let r=[];for(let n of e)r.push(O(n,t));r.sort((e,t)=>e.logicalPath.localeCompare(t.logicalPath));let o=[{logicalPath:m,sha256:``,token:`${p}ROOT__`}],s=new Map([[t,`${p}ROOT__`]]),c=new Map;r.forEach((e,t)=>{let r=c.get(e.logicalPath),l=r??`${p}${String(t)}__`;r||(o.push({logicalPath:e.logicalPath,sha256:n.contentSha256(a.default.readFileSync(e.target)),token:l,...e.sourcePath?{sourcePath:e.sourcePath}:{}}),c.set(e.logicalPath,l)),s.set(i.default.resolve(e.target),l)});for(let n of e){let e=O(n,t),r=c.get(e.logicalPath);r&&s.set(i.default.resolve(n),r)}return{shared:o,byTarget:s}}function H(e,t){let n=new Map,i=[...t.entries()].sort(([e],[t])=>t.length-e.length);for(let t of e.output){if(t.type===`asset`){n.set(t.fileName,(t.source,t.source));continue}let e=t.code;for(let[t,n]of i)e=e.replaceAll((0,r.pathToFileURL)(t).href,`${n}:url`).replaceAll(q(t),n).replaceAll(t,n);n.set(t.fileName,e)}return n}function U(e,t,n,r,i){let a=[...i].map(A).filter(e=>e!==void 0).sort((e,t)=>e.path.localeCompare(t.path));F(e,`${JSON.stringify({version:`v12`,entries:t,output:n,artifacts:[...r].sort(),inputs:a},null,2)}\n`)}function W(e,t,r,a){let o=n.materializeSharedBuild(e,t),s=new Set(e.replacements.values());return U(r,a,o,e.manifest.artifacts.map(e=>i.default.join(t,e.path)),s),o}function G(e){return(0,o.createHash)(`sha256`).update(`v12`).update(JSON.stringify(e.map(e=>i.default.resolve(e)))).digest(`hex`).slice(0,16)}function K(e){let n=t.optionalPackageEntry(f);if(!n)throw Error(`Cannot resolve ${f}`);let r=e.map(e=>`() => import(${JSON.stringify(q(e))})`),i=e.map(e=>JSON.stringify(e));return[`import { withExtensionSource } from ${JSON.stringify(q(n))};`,`const loaders = [${r.join(`,`)}];`,`const names = [${i.join(`,`)}];`,`function report(index, phase, startedAt, error) {`,` const elapsed = (performance.now() - startedAt).toFixed(1);`,` const detail = error instanceof Error ? ": " + error.message : error === undefined ? "" : ": " + String(error);`,` process.stderr.write("[doompi:timing] " + phase + " " + elapsed + "ms " + names[index] + detail + "\\n");`,`}`,`export default async function doompiExtensionSet(pi) {`,` const timings = process.env.DOOMPI_TIMING === "1" || process.env.PI_TIMING === "1";`,` const loaded = await Promise.all(loaders.map(async (load, index) => {`,` const startedAt = performance.now();`,` try {`,` const extension = await load();`,` if (timings) report(index, "import", startedAt);`,` return extension;`,` } catch (error) {`,` report(index, "import-error", startedAt, error);`,` return undefined;`,` }`,` }));`,` for (let index = 0; index < loaded.length; index += 1) {`,` const extension = loaded[index];`,` if (!extension) continue;`,` const startedAt = performance.now();`,` try {`,` const factory = extension.default;`,` if (typeof factory !== 'function') throw new Error('does not export an extension factory');`,` await factory(withExtensionSource(pi, names[index]));`,` if (timings) report(index, "factory", startedAt);`,` } catch (error) {`,` report(index, "factory-error", startedAt, error);`,` }`,` }`,`}`].join(`
2
+ `)}function q(e){return i.default.resolve(e).split(i.default.sep).join(`/`)}function J(e){return{name:`doom-set-external`,async resolveId(n,r,a){if(n===d)return null;if(S.has(n)||n.startsWith(`node:`))return{id:n,external:!0};if(i.default.isAbsolute(n)){let t=te(n);return t&&(y.has(t)||b.has(t)||x.has(t))?(e.add(n),{id:n,external:!0}):null}if(n.startsWith(`.`))return null;let o=v(n),s=w(o);if(s&&y.has(s)){let n=t.optionalPackageEntry(o);if(n)return e.add(n),{id:n,external:!0}}if(s===`typebox`){let t=ee(o);if(t)return e.add(t),{id:t,external:!0}}if(s&&(b.has(s)||x.has(s))){let t=await this.resolve(o,r,a);if(t)return e.add(t.id),{id:t.id,external:!0}}return null}}}function Y(e){return{name:`doom-set-inputs`,load(t){return i.default.isAbsolute(t)&&a.default.existsSync(t)&&e.add(t),null}}}function X(e,t,n){t.code===`UNRESOLVED_IMPORT`&&n(`error`,t)}function Z(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Q(e,t){if(Array.isArray(e)){for(let n of e)Q(n,t);return}if(!Z(e))return;let n=e.object,r=e.property;if(e.type===`MemberExpression`&&e.computed===!1&&typeof e.start==`number`&&typeof e.end==`number`&&Z(n)&&n.type===`MetaProperty`&&Z(n.meta)&&n.meta.name===`import`&&Z(n.property)&&n.property.name===`meta`&&Z(r)&&r.name===`url`){t.push({start:e.start,end:e.end});return}for(let n of Object.values(e))Q(n,t)}function ne(){return{name:`doom-original-import-meta-url`,transform(e,t){if(!i.default.isAbsolute(t)||!e.includes(`import.meta.url`))return null;let n=i.default.extname(t).toLowerCase(),a=n===`.tsx`?`tsx`:n===`.jsx`?`jsx`:_(t)?`ts`:`js`,o=[];if(Q(this.parse(e,{lang:a}),o),o.length===0)return null;let s=JSON.stringify((0,r.pathToFileURL)(t).href),c=e;for(let e of o.sort((e,t)=>t.start-e.start))c=`${c.slice(0,e.start)}${s}${c.slice(e.end)}`;return c}}}function $(e,t,n={}){let r=G(e.map(e=>i.default.resolve(e))),a=i.default.resolve(n.outputDirectory??i.default.join(t,u)),s=C(n.outputName??`doom-set`),c=(0,o.createHash)(`sha256`).update(a).update(s).digest(`hex`).slice(0,16);return i.default.join(t,u,`${r}.${c}.json`)}async function re(e,t,r={}){if(e.length===0)throw Error(`Cannot compile an empty extension set`);let o=e.map(e=>i.default.resolve(e)),s=i.default.join(t,u);a.default.mkdirSync(s,{recursive:!0});let c=i.default.resolve(r.outputDirectory??s),f=C(r.outputName??`doom-set`);a.default.mkdirSync(c,{recursive:!0});let p=$(o,t,r),m=P(p);if(m&&M(m,o))return m.output;let h=async()=>{let e=new Set(o),t=K(o),{rolldown:n}=await import(`rolldown`),r=await n({input:d,platform:`node`,plugins:[{name:`doom-set-entry`,resolveId(e){return e===d?e:null},load(e){return e===d?t:null}},J(e),ne(),Y(e)],onLog:X});try{return{generated:await r.generate(I(`${f}.[hash:16]${l}`)),inputs:e}}finally{await r.close()}},g=r.repositoryRoot?T(r.repositoryRoot):void 0;if(g&&r.sharedCacheDirectory){let e=B(o.map(e=>O(e,g)),f),t=e=>k(e,g);return n.withSharedBuildLock(r.sharedCacheDirectory,e,async()=>{let i=n.findSharedBuild(r.sharedCacheDirectory,e,t);if(i)return W(i,c,p,o);let{generated:a,inputs:s}=await h(),l=V(s,g),u=H(a,l.byTarget);if([...u.values()].some(e=>typeof e==`string`&&e.includes(g)))throw Error(`Shared build graph still contains an absolute worktree path after tokenization`);let d=a.output.find(e=>e.type===`chunk`&&e.isEntry);if(!d)throw Error(`Rolldown produced no shared extension entry`);n.publishSharedBuild({cacheDirectory:r.sharedCacheDirectory,lookupKey:e,entry:d.fileName,inputs:l.shared,artifacts:u});let f=n.findSharedBuild(r.sharedCacheDirectory,e,t);if(!f)throw Error(`Published shared build could not be verified`);return W(f,c,p,o)})}let{generated:_,inputs:v}=await h(),y=z(_,c);return U(p,o,y.entry,y.artifacts,v),y.entry}exports.compileExtensionSet=re,exports.extensionSetKey=G,exports.extensionSetManifestPath=$;
3
+ //# sourceMappingURL=extensionCompiler.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensionCompiler.cjs","names":["optionalPackageEntry","builtinModules","path","fs","contentSha256","materializeSharedBuild","withSharedBuildLock","findSharedBuild"],"sources":["../../src/adapters/extensionCompiler.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport fs from 'node:fs';\nimport { builtinModules, createRequire } from 'node:module';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport type { LogLevel, LogOrStringHandler, OutputAsset, OutputChunk, RolldownLog, RolldownOutput } from 'rolldown';\nimport { optionalPackageEntry } from '../utils/index.ts';\nimport {\n contentSha256,\n findSharedBuild,\n materializeSharedBuild,\n publishSharedBuild,\n type ResolvedSharedBuild,\n type SharedBuildInput,\n withSharedBuildLock,\n} from './sharedBuildCache.ts';\n\n/**\n * Compiles TypeScript extensions into plain ESM ahead of the session.\n *\n * Pi loads extensions through jiti, which transpiles TypeScript at import time.\n * That works, but it costs a transform per module on a cold cache and makes Node\n * complain about type stripping under node_modules on every launch. Resolution\n * already knows the full extension list, so each TypeScript graph is compiled\n * to native ESM here and Pi imports it without a runtime transform. Lazy imports\n * remain separate content-addressed chunks so their evaluation semantics survive\n * compilation.\n *\n * Mode artifacts bundle their JavaScript dependencies. Node built-ins, native\n * packages, and Pi's shared runtime stay external; those imports are rewritten\n * to absolute paths so a worktree-local artifact never relies on its\n * generated directory having its own `node_modules` tree. Immutable build objects\n * may be shared by linked worktrees, but materialized output stays worktree-local.\n */\n\nconst TYPESCRIPT_SUFFIXES = ['.ts', '.mts', '.cts'] as const;\nconst COMPILED_SUFFIX = '.mjs';\nconst CACHE_VERSION = 'v4';\nconst SET_CACHE_VERSION = 'v12';\nconst HASH_LENGTH = 16;\nconst SET_DIRECTORY = 'sets';\nconst MANIFEST_SUFFIX = '.json';\nconst VIRTUAL_SET_ENTRY = '\\0doompi-extension-set';\nconst EXTENSION_SOURCE_HELPER = '@agimon-ai/doompi-ui/extensionName';\nconst SHARED_BUILD_VERSION = 'v3-rolldown-1.0.0-rc.17';\nconst SHARED_PATH_TOKEN_PREFIX = '__DOOMPI_PATH_';\nconst REPOSITORY_INPUT_PREFIX = 'repo/';\nconst EXTERNAL_INPUT_PREFIX = 'external/';\n\n/** Pi's former npm scope. The packages are the same, published under a new name. */\nconst PI_SCOPE_RENAMES: Readonly<Record<string, string>> = {\n '@mariozechner/pi-coding-agent': '@earendil-works/pi-coding-agent',\n '@mariozechner/pi-tui': '@earendil-works/pi-tui',\n '@mariozechner/pi-ai': '@earendil-works/pi-ai',\n '@sinclair/typebox': 'typebox',\n};\n\nexport function isTypeScriptEntry(entry: string): boolean {\n return TYPESCRIPT_SUFFIXES.some((suffix) => entry.endsWith(suffix));\n}\n\nfunction renameScope(specifier: string): string {\n for (const [before, after] of Object.entries(PI_SCOPE_RENAMES)) {\n if (specifier === before) return after;\n if (specifier.startsWith(`${before}/`)) return `${after}${specifier.slice(before.length)}`;\n }\n return specifier;\n}\n\n/**\n * Cache key for a compiled entry.\n *\n * The entry's own bytes are the only cheap signal that the extension changed; a\n * dependency edit is not visible without walking the graph, so an upgrade that\n * leaves the entry byte-identical is served from cache until the version below\n * is raised.\n */\nfunction cacheKey(entry: string): string {\n const source = fs.readFileSync(entry);\n return createHash('sha256').update(CACHE_VERSION).update(entry).update(source).digest('hex').slice(0, HASH_LENGTH);\n}\n\nfunction compiledName(entry: string, key: string): string {\n const base = path.basename(entry).replace(/\\.[cm]?ts$/, '');\n const parent = path.basename(path.dirname(entry));\n return `${parent}-${base}.${key}${COMPILED_SUFFIX}`;\n}\n\n/**\n * Packages that must resolve to the copy this harness runs, never to a second\n * one bundled into an extension. Pi owns the TUI and the session state, so a\n * duplicate renders into a different screen and mutates a different store.\n */\nconst HOSTED_PACKAGES = new Set(['@earendil-works/pi-coding-agent', '@earendil-works/pi-tui', '@earendil-works/pi-ai']);\n\n/**\n * Resolves packages Pi exposes to extensions as compatibility aliases.\n *\n * Extensions do not need to declare TypeBox themselves because Pi's loader\n * provides it as a virtual module. A dist bundle bypasses that loader, so it\n * resolves the same package against Pi's dependency tree and bundles it.\n */\nfunction piExtensionDependencyEntry(specifier: string): string | undefined {\n const piEntry = optionalPackageEntry('@earendil-works/pi-coding-agent');\n if (!piEntry) return undefined;\n try {\n return createRequire(piEntry).resolve(specifier);\n } catch {\n return undefined;\n }\n}\n\n/** Packages whose native binaries or runtime discovery cannot be rolled up. */\nconst NATIVE_PACKAGES = new Set([\n '@parcel/watcher',\n '@napi-rs/keyring',\n 'better-sqlite3',\n 'canvas',\n 'fsevents',\n 'isolated-vm',\n 'keytar',\n 'node-pty',\n 'onnxruntime-node',\n 'playwright',\n 'playwright-core',\n 'puppeteer',\n 'sharp',\n // TypeScript's Node system adapter reads CommonJS globals such as\n // __filename. Rolldown does not provide those globals when it folds the\n // adapter into the aggregate ESM extension, so keep the installed runtime\n // intact and import it by its resolved absolute path.\n 'typescript',\n]);\n\n/**\n * Dependency-heavy ESM runtimes that should retain their installed graph.\n *\n * Folding these packages into the aggregate creates dozens of generated chunks\n * that Node must parse and link before any extension factory can register. Node\n * can load the installed graph directly while still sharing its module cache.\n */\nconst STARTUP_EXTERNAL_PACKAGES = new Set([\n '@agimon-ai/foundation-port-registry',\n '@agimon-ai/foundation-process-registry',\n '@agimon-ai/log-sink-mcp',\n '@modelcontextprotocol/sdk',\n '@narumitw/pi-tui-kit',\n '@rmux/sdk',\n '@tursodatabase/database',\n '@tursodatabase/database-common',\n 'ajv',\n 'ajv-formats',\n 'gpt-tokenizer',\n 'highlight.js',\n 'hono',\n 'inversify',\n // open's CommonJS runtime resolves its bundled xdg-open helper through\n // __dirname, which is unavailable when Rolldown folds it into native ESM.\n 'open',\n 'reflect-metadata',\n 'zod-to-json-schema',\n 'yaml',\n 'zod',\n]);\nconst NODE_BUILTINS = new Set(builtinModules.flatMap((name) => [name, `node:${name}`]));\n\ninterface InputFingerprint {\n path: string;\n size: number;\n mtimeMs: number;\n}\n\ninterface CompiledExtensionManifest {\n version: string;\n output: string;\n artifacts: string[];\n}\n\ninterface ExtensionSetManifest extends CompiledExtensionManifest {\n entries: string[];\n inputs: InputFingerprint[];\n}\n\nexport interface CompileExtensionSetOptions {\n /** Persistent worktree artifact directory. Compiler manifests remain local. */\n outputDirectory?: string;\n /** Human-readable artifact prefix, normally the major-mode name. */\n outputName?: string;\n /** Canonical worktree root used to create relocatable logical input paths. */\n repositoryRoot?: string;\n /** Repository-level immutable cache shared by linked worktrees. */\n sharedCacheDirectory?: string;\n}\n\nfunction safeOutputName(value: string): string {\n const normalized = value\n .trim()\n .replace(/[^a-zA-Z0-9._-]+/g, '-')\n .replace(/^[-.]+|[-.]+$/g, '');\n return normalized || 'doom-set';\n}\n\nfunction packageRootOf(specifier: string): string | undefined {\n const slash = specifier.startsWith('@') ? specifier.indexOf('/', specifier.indexOf('/') + 1) : specifier.indexOf('/');\n return slash === -1 ? specifier : specifier.slice(0, slash);\n}\n\nfunction packageRootFromPath(target: string): string | undefined {\n let directory = path.dirname(target);\n while (true) {\n const manifestPath = path.join(directory, 'package.json');\n if (fs.existsSync(manifestPath)) {\n try {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as unknown;\n if (isRecord(manifest) && typeof manifest.name === 'string') return manifest.name;\n } catch {\n return undefined;\n }\n }\n const parent = path.dirname(directory);\n if (parent === directory) return undefined;\n directory = parent;\n }\n}\n\ninterface LogicalInput {\n logicalPath: string;\n target: string;\n sourcePath?: string;\n}\n\nfunction canonicalPath(target: string): string {\n const absolute = path.resolve(target);\n try {\n return fs.realpathSync.native(absolute);\n } catch {\n return absolute;\n }\n}\n\nfunction isInside(directory: string, target: string): boolean {\n const relative = path.relative(path.resolve(directory), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction externalLogicalPath(sourcePath: string): string {\n const identity = createHash('sha256').update(sourcePath).digest('hex');\n return `${EXTERNAL_INPUT_PREFIX}${identity}`;\n}\n\nfunction logicalInput(target: string, repositoryRoot: string): LogicalInput {\n const absolute = canonicalPath(target);\n if (isInside(repositoryRoot, absolute)) {\n return {\n logicalPath: `${REPOSITORY_INPUT_PREFIX}${path.relative(repositoryRoot, absolute).split(path.sep).join('/')}`,\n target: absolute,\n };\n }\n return {\n logicalPath: externalLogicalPath(absolute),\n target: absolute,\n sourcePath: absolute,\n };\n}\n\nfunction resolveLogicalInputPath(input: SharedBuildInput, repositoryRoot: string): string | undefined {\n if (input.logicalPath.startsWith(REPOSITORY_INPUT_PREFIX) && input.sourcePath === undefined) {\n const target = path.resolve(repositoryRoot, input.logicalPath.slice(REPOSITORY_INPUT_PREFIX.length));\n return isInside(repositoryRoot, target) ? target : undefined;\n }\n if (\n input.logicalPath.startsWith(EXTERNAL_INPUT_PREFIX) &&\n input.sourcePath !== undefined &&\n input.logicalPath === externalLogicalPath(input.sourcePath)\n ) {\n return input.sourcePath;\n }\n return undefined;\n}\n\nfunction externalResolver() {\n return {\n name: 'doom-external-absolute',\n async resolveId(\n this: { resolve: (id: string, importer?: string, options?: unknown) => Promise<{ id: string } | null> },\n specifier: string,\n importer: string | undefined,\n options: unknown,\n ): Promise<{ id: string; external: boolean } | null> {\n if (specifier.startsWith('.') || path.isAbsolute(specifier) || specifier.startsWith('node:')) return null;\n const renamed = renameScope(specifier);\n\n // Host packages are resolved from this module, the way the rest of the\n // harness resolves them, because an extension written against Pi's former\n // scope does not have the current one in its own dependency tree.\n const root = packageRootOf(renamed);\n if (root && HOSTED_PACKAGES.has(root)) {\n const hosted = optionalPackageEntry(renamed);\n if (hosted) return { id: hosted, external: true };\n }\n\n // Rolldown's resolver rather than `createRequire`, which cannot see an\n // ESM-only package that publishes no `require` condition and would send\n // Pi's own core into the bundle.\n const resolved = await this.resolve(renamed, importer, options);\n if (!resolved) return null;\n // A dependency that is itself TypeScript cannot be handed to Node either,\n // so it is bundled rather than externalised.\n if (isTypeScriptEntry(resolved.id)) return null;\n return { id: resolved.id, external: true };\n },\n };\n}\n\nfunction fingerprint(target: string): InputFingerprint | undefined {\n try {\n const stat = fs.statSync(target);\n if (!stat.isFile()) return undefined;\n return { path: target, size: stat.size, mtimeMs: stat.mtimeMs };\n } catch {\n return undefined;\n }\n}\n\nfunction artifactsAreFresh(manifest: CompiledExtensionManifest, version: string, output: string): boolean {\n return (\n manifest.version === version &&\n manifest.output === output &&\n fs.existsSync(output) &&\n manifest.artifacts.every((artifact) => fs.existsSync(artifact))\n );\n}\n\nfunction manifestIsFresh(manifest: ExtensionSetManifest, entries: string[]): boolean {\n if (!artifactsAreFresh(manifest, SET_CACHE_VERSION, manifest.output)) return false;\n if (JSON.stringify(manifest.entries) !== JSON.stringify(entries)) {\n return false;\n }\n return manifest.inputs.every((previous) => {\n const current = fingerprint(previous.path);\n return current?.size === previous.size && current.mtimeMs === previous.mtimeMs;\n });\n}\n\nfunction readCompiledExtensionManifest(manifestPath: string): CompiledExtensionManifest | undefined {\n try {\n const parsed = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as CompiledExtensionManifest;\n return parsed && typeof parsed.output === 'string' && Array.isArray(parsed.artifacts) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction readSetManifest(manifestPath: string): ExtensionSetManifest | undefined {\n const parsed = readCompiledExtensionManifest(manifestPath) as ExtensionSetManifest | undefined;\n return parsed && Array.isArray(parsed.entries) && Array.isArray(parsed.inputs) ? parsed : undefined;\n}\n\nfunction writeAtomic(target: string, contents: string | Uint8Array): void {\n fs.mkdirSync(path.dirname(target), { recursive: true });\n const temporary = `${target}.${process.pid}.${Date.now()}.tmp`;\n fs.writeFileSync(temporary, contents);\n try {\n fs.renameSync(temporary, target);\n } catch (error) {\n fs.rmSync(temporary, { force: true });\n if (!fs.existsSync(target)) throw error;\n }\n}\n\ninterface CompiledGraph {\n entry: string;\n artifacts: string[];\n}\n\nfunction splitOutputOptions(entryFileNames: string) {\n return {\n format: 'esm' as const,\n sourcemap: false,\n minify: true,\n codeSplitting: true,\n hashCharacters: 'hex' as const,\n entryFileNames,\n chunkFileNames: `chunks/[name].[hash:${HASH_LENGTH}]${COMPILED_SUFFIX}`,\n assetFileNames: `assets/[name].[hash:${HASH_LENGTH}][extname]`,\n };\n}\n\nfunction artifactTarget(outputDirectory: string, artifact: OutputAsset | OutputChunk): string {\n const target = path.resolve(outputDirectory, artifact.fileName);\n const relative = path.relative(outputDirectory, target);\n if (relative.startsWith('..') || path.isAbsolute(relative)) {\n throw new Error(`Rolldown emitted an artifact outside the output directory: ${artifact.fileName}`);\n }\n return target;\n}\n\nfunction artifactMatches(target: string, contents: string | Uint8Array): boolean {\n try {\n const current = fs.readFileSync(target);\n const generated = typeof contents === 'string' ? Buffer.from(contents) : Buffer.from(contents);\n return current.equals(generated);\n } catch {\n return false;\n }\n}\n\n/** Writes referenced chunks first so a visible entry always has a complete graph. */\nfunction writeCompiledGraph(generated: RolldownOutput, outputDirectory: string): CompiledGraph {\n const entry = generated.output.find((artifact) => artifact.type === 'chunk' && artifact.isEntry);\n if (!entry || entry.type !== 'chunk') throw new Error('Rolldown produced no extension entry');\n const root = path.resolve(outputDirectory);\n const remaining = generated.output.filter((artifact) => artifact !== entry);\n for (const artifact of [...remaining, entry]) {\n const contents = artifact.type === 'chunk' ? artifact.code : artifact.source;\n const target = artifactTarget(root, artifact);\n if (!artifactMatches(target, contents)) writeAtomic(target, contents);\n }\n return {\n entry: artifactTarget(root, entry),\n artifacts: generated.output.map((artifact) => artifactTarget(root, artifact)).sort(),\n };\n}\n\nfunction sharedLookupKey(entries: readonly LogicalInput[], outputName: string): string {\n return createHash('sha256')\n .update(SHARED_BUILD_VERSION)\n .update(process.version)\n .update(process.platform)\n .update(process.arch)\n .update(outputName)\n .update(JSON.stringify(entries.map((entry) => entry.logicalPath)))\n .digest('hex');\n}\n\ninterface TokenizedInputs {\n shared: SharedBuildInput[];\n byTarget: Map<string, string>;\n}\n\nfunction tokenizedInputs(inputs: ReadonlySet<string>, repositoryRoot: string): TokenizedInputs {\n const logical: LogicalInput[] = [];\n for (const target of inputs) logical.push(logicalInput(target, repositoryRoot));\n logical.sort((left, right) => left.logicalPath.localeCompare(right.logicalPath));\n const shared: SharedBuildInput[] = [\n { logicalPath: REPOSITORY_INPUT_PREFIX, sha256: '', token: `${SHARED_PATH_TOKEN_PREFIX}ROOT__` },\n ];\n const byTarget = new Map<string, string>([[repositoryRoot, `${SHARED_PATH_TOKEN_PREFIX}ROOT__`]]);\n const tokenByLogicalPath = new Map<string, string>();\n logical.forEach((input, index) => {\n const existing = tokenByLogicalPath.get(input.logicalPath);\n const token = existing ?? `${SHARED_PATH_TOKEN_PREFIX}${String(index)}__`;\n if (!existing) {\n shared.push({\n logicalPath: input.logicalPath,\n sha256: contentSha256(fs.readFileSync(input.target)),\n token,\n ...(input.sourcePath ? { sourcePath: input.sourcePath } : {}),\n });\n tokenByLogicalPath.set(input.logicalPath, token);\n }\n byTarget.set(path.resolve(input.target), token);\n });\n for (const target of inputs) {\n const input = logicalInput(target, repositoryRoot);\n const token = tokenByLogicalPath.get(input.logicalPath);\n if (token) byTarget.set(path.resolve(target), token);\n }\n return { shared, byTarget };\n}\n\nfunction tokenizedArtifactContents(\n generated: RolldownOutput,\n tokens: ReadonlyMap<string, string>,\n): Map<string, string | Uint8Array> {\n const artifacts = new Map<string, string | Uint8Array>();\n const replacements = [...tokens.entries()].sort(([left], [right]) => right.length - left.length);\n for (const artifact of generated.output) {\n if (artifact.type === 'asset') {\n artifacts.set(artifact.fileName, typeof artifact.source === 'string' ? artifact.source : artifact.source);\n continue;\n }\n let source = artifact.code;\n for (const [target, token] of replacements) {\n source = source\n .replaceAll(pathToFileURL(target).href, `${token}:url`)\n .replaceAll(pathToImportSpecifier(target), token)\n .replaceAll(target, token);\n }\n artifacts.set(artifact.fileName, source);\n }\n return artifacts;\n}\n\nfunction writeLocalSetManifest(\n manifestPath: string,\n entries: string[],\n output: string,\n artifacts: string[],\n inputs: ReadonlySet<string>,\n): void {\n const inputFingerprints = [...inputs]\n .map(fingerprint)\n .filter((value): value is InputFingerprint => value !== undefined)\n .sort((left, right) => left.path.localeCompare(right.path));\n writeAtomic(\n manifestPath,\n `${JSON.stringify(\n { version: SET_CACHE_VERSION, entries, output, artifacts: [...artifacts].sort(), inputs: inputFingerprints },\n null,\n 2,\n )}\\n`,\n );\n}\n\nfunction materializeSharedSet(\n build: ResolvedSharedBuild,\n outputDirectory: string,\n manifestPath: string,\n entries: string[],\n): string {\n const output = materializeSharedBuild(build, outputDirectory);\n const inputs = new Set(build.replacements.values());\n const artifacts = build.manifest.artifacts.map((artifact) => path.join(outputDirectory, artifact.path));\n writeLocalSetManifest(manifestPath, entries, output, artifacts, inputs);\n return output;\n}\n\n/** Stable lookup key for one exact Pi load order. */\nexport function extensionSetKey(entries: readonly string[]): string {\n return createHash('sha256')\n .update(SET_CACHE_VERSION)\n .update(JSON.stringify(entries.map((entry) => path.resolve(entry))))\n .digest('hex')\n .slice(0, HASH_LENGTH);\n}\n\nfunction extensionSetSource(entries: readonly string[]): string {\n const helper = optionalPackageEntry(EXTENSION_SOURCE_HELPER);\n if (!helper) throw new Error(`Cannot resolve ${EXTENSION_SOURCE_HELPER}`);\n const loaders = entries.map((entry) => `() => import(${JSON.stringify(pathToImportSpecifier(entry))})`);\n const names = entries.map((entry) => JSON.stringify(entry));\n return [\n `import { withExtensionSource } from ${JSON.stringify(pathToImportSpecifier(helper))};`,\n `const loaders = [${loaders.join(',')}];`,\n `const names = [${names.join(',')}];`,\n 'function report(index, phase, startedAt, error) {',\n ' const elapsed = (performance.now() - startedAt).toFixed(1);',\n ' const detail = error instanceof Error ? \": \" + error.message : error === undefined ? \"\" : \": \" + String(error);',\n ' process.stderr.write(\"[doompi:timing] \" + phase + \" \" + elapsed + \"ms \" + names[index] + detail + \"\\\\n\");',\n '}',\n 'export default async function doompiExtensionSet(pi) {',\n ' const timings = process.env.DOOMPI_TIMING === \"1\" || process.env.PI_TIMING === \"1\";',\n ' const loaded = await Promise.all(loaders.map(async (load, index) => {',\n ' const startedAt = performance.now();',\n ' try {',\n ' const extension = await load();',\n ' if (timings) report(index, \"import\", startedAt);',\n ' return extension;',\n ' } catch (error) {',\n ' report(index, \"import-error\", startedAt, error);',\n ' return undefined;',\n ' }',\n ' }));',\n ' for (let index = 0; index < loaded.length; index += 1) {',\n ' const extension = loaded[index];',\n ' if (!extension) continue;',\n ' const startedAt = performance.now();',\n ' try {',\n ' const factory = extension.default;',\n \" if (typeof factory !== 'function') throw new Error('does not export an extension factory');\",\n ' await factory(withExtensionSource(pi, names[index]));',\n ' if (timings) report(index, \"factory\", startedAt);',\n ' } catch (error) {',\n ' report(index, \"factory-error\", startedAt, error);',\n ' }',\n ' }',\n '}',\n ].join('\\n');\n}\n\nfunction pathToImportSpecifier(target: string): string {\n // Rolldown accepts absolute POSIX paths directly. Windows needs a file URL,\n // but replacing separators is enough for its platform-independent parser.\n return path.resolve(target).split(path.sep).join('/');\n}\n\nfunction setExternalResolver(inputs: Set<string>) {\n return {\n name: 'doom-set-external',\n async resolveId(\n this: { resolve: (id: string, importer?: string, options?: unknown) => Promise<{ id: string } | null> },\n specifier: string,\n importer: string | undefined,\n options: unknown,\n ): Promise<{ id: string; external: boolean } | null> {\n if (specifier === VIRTUAL_SET_ENTRY) return null;\n if (NODE_BUILTINS.has(specifier) || specifier.startsWith('node:')) {\n return { id: specifier, external: true };\n }\n\n if (path.isAbsolute(specifier)) {\n const root = packageRootFromPath(specifier);\n if (root && (HOSTED_PACKAGES.has(root) || NATIVE_PACKAGES.has(root) || STARTUP_EXTERNAL_PACKAGES.has(root))) {\n inputs.add(specifier);\n return { id: specifier, external: true };\n }\n return null;\n }\n if (specifier.startsWith('.')) return null;\n\n const renamed = renameScope(specifier);\n const root = packageRootOf(renamed);\n if (root && HOSTED_PACKAGES.has(root)) {\n const hosted = optionalPackageEntry(renamed);\n if (hosted) {\n inputs.add(hosted);\n return { id: hosted, external: true };\n }\n }\n if (root === 'typebox') {\n const typebox = piExtensionDependencyEntry(renamed);\n if (typebox) {\n inputs.add(typebox);\n return { id: typebox, external: true };\n }\n }\n if (root && (NATIVE_PACKAGES.has(root) || STARTUP_EXTERNAL_PACKAGES.has(root))) {\n const resolved = await this.resolve(renamed, importer, options);\n if (resolved) {\n inputs.add(resolved.id);\n return { id: resolved.id, external: true };\n }\n }\n return null;\n },\n };\n}\n\nfunction inputCollector(inputs: Set<string>) {\n return {\n name: 'doom-set-inputs',\n load(id: string): null {\n if (path.isAbsolute(id) && fs.existsSync(id)) inputs.add(id);\n return null;\n },\n };\n}\n\n/** An unresolved bare import would otherwise become a broken dist external. */\nfunction failUnresolvedImport(_level: LogLevel, log: RolldownLog, handler: LogOrStringHandler): void {\n if (log.code === 'UNRESOLVED_IMPORT') handler('error', log);\n}\n\ninterface SourceRange {\n start: number;\n end: number;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction collectImportMetaUrlRanges(value: unknown, ranges: SourceRange[]): void {\n if (Array.isArray(value)) {\n for (const item of value) collectImportMetaUrlRanges(item, ranges);\n return;\n }\n if (!isRecord(value)) return;\n\n const object = value.object;\n const property = value.property;\n if (\n value.type === 'MemberExpression' &&\n value.computed === false &&\n typeof value.start === 'number' &&\n typeof value.end === 'number' &&\n isRecord(object) &&\n object.type === 'MetaProperty' &&\n isRecord(object.meta) &&\n object.meta.name === 'import' &&\n isRecord(object.property) &&\n object.property.name === 'meta' &&\n isRecord(property) &&\n property.name === 'url'\n ) {\n ranges.push({ start: value.start, end: value.end });\n return;\n }\n\n for (const child of Object.values(value)) collectImportMetaUrlRanges(child, ranges);\n}\n\n/** Keeps package-owned resource lookup anchored to each original source file. */\nfunction preserveImportMetaUrl() {\n return {\n name: 'doom-original-import-meta-url',\n transform(\n this: {\n parse: (source: string, options?: { lang?: 'js' | 'jsx' | 'ts' | 'tsx' }) => unknown;\n },\n source: string,\n id: string,\n ): string | null {\n if (!path.isAbsolute(id) || !source.includes('import.meta.url')) return null;\n const extension = path.extname(id).toLowerCase();\n const lang = extension === '.tsx' ? 'tsx' : extension === '.jsx' ? 'jsx' : isTypeScriptEntry(id) ? 'ts' : 'js';\n const ranges: SourceRange[] = [];\n collectImportMetaUrlRanges(this.parse(source, { lang }), ranges);\n if (ranges.length === 0) return null;\n const replacement = JSON.stringify(pathToFileURL(id).href);\n let transformed = source;\n for (const range of ranges.sort((left, right) => right.start - left.start)) {\n transformed = `${transformed.slice(0, range.start)}${replacement}${transformed.slice(range.end)}`;\n }\n return transformed;\n },\n };\n}\n\n/** Location of the lightweight input-fingerprint record for one extension set. */\nexport function extensionSetManifestPath(\n entries: readonly string[],\n cacheDirectory: string,\n options: CompileExtensionSetOptions = {},\n): string {\n const normalized = entries.map((entry) => path.resolve(entry));\n const key = extensionSetKey(normalized);\n const outputDirectory = path.resolve(options.outputDirectory ?? path.join(cacheDirectory, SET_DIRECTORY));\n const outputName = safeOutputName(options.outputName ?? 'doom-set');\n // One graph can be emitted under several named mode artifacts. Keep their\n // cache records separate without changing extensionSetKey, which is the\n // runtime lookup key for an exact activation order.\n const outputKey = createHash('sha256').update(outputDirectory).update(outputName).digest('hex').slice(0, HASH_LENGTH);\n return path.join(cacheDirectory, SET_DIRECTORY, `${key}.${outputKey}${MANIFEST_SUFFIX}`);\n}\n\n/**\n * Compiles an ordered extension set into one native ESM entry.\n *\n * The generated entry starts every module load together, then invokes factories\n * sequentially in activation order. Its manifest records every loaded module,\n * so a dependency edit invalidates the cache without running the compiler.\n */\nexport async function compileExtensionSet(\n entries: readonly string[],\n cacheDirectory: string,\n options: CompileExtensionSetOptions = {},\n): Promise<string> {\n if (entries.length === 0) throw new Error('Cannot compile an empty extension set');\n const normalized = entries.map((entry) => path.resolve(entry));\n const setDirectory = path.join(cacheDirectory, SET_DIRECTORY);\n fs.mkdirSync(setDirectory, { recursive: true });\n const outputDirectory = path.resolve(options.outputDirectory ?? setDirectory);\n const outputName = safeOutputName(options.outputName ?? 'doom-set');\n fs.mkdirSync(outputDirectory, { recursive: true });\n const manifestPath = extensionSetManifestPath(normalized, cacheDirectory, options);\n const previous = readSetManifest(manifestPath);\n if (previous && manifestIsFresh(previous, normalized)) return previous.output;\n\n const generate = async (): Promise<{ generated: RolldownOutput; inputs: Set<string> }> => {\n const inputs = new Set(normalized);\n const source = extensionSetSource(normalized);\n const { rolldown } = await import('rolldown');\n const build = await rolldown({\n input: VIRTUAL_SET_ENTRY,\n platform: 'node',\n plugins: [\n {\n name: 'doom-set-entry',\n resolveId(id: string): string | null {\n return id === VIRTUAL_SET_ENTRY ? id : null;\n },\n load(id: string): string | null {\n return id === VIRTUAL_SET_ENTRY ? source : null;\n },\n },\n setExternalResolver(inputs),\n preserveImportMetaUrl(),\n inputCollector(inputs),\n ],\n onLog: failUnresolvedImport,\n });\n try {\n return {\n generated: await build.generate(splitOutputOptions(`${outputName}.[hash:${HASH_LENGTH}]${COMPILED_SUFFIX}`)),\n inputs,\n };\n } finally {\n await build.close();\n }\n };\n\n const repositoryRoot = options.repositoryRoot ? canonicalPath(options.repositoryRoot) : undefined;\n\n if (repositoryRoot && options.sharedCacheDirectory) {\n const logicalEntries = normalized.map((entry) => logicalInput(entry, repositoryRoot));\n const lookupKey = sharedLookupKey(logicalEntries, outputName);\n const resolveInput = (input: SharedBuildInput): string | undefined =>\n resolveLogicalInputPath(input, repositoryRoot);\n return withSharedBuildLock(options.sharedCacheDirectory, lookupKey, async () => {\n const cached = findSharedBuild(options.sharedCacheDirectory as string, lookupKey, resolveInput);\n if (cached) return materializeSharedSet(cached, outputDirectory, manifestPath, normalized);\n\n const { generated, inputs } = await generate();\n const tokenized = tokenizedInputs(inputs, repositoryRoot);\n const artifacts = tokenizedArtifactContents(generated, tokenized.byTarget);\n if (\n [...artifacts.values()].some((contents) => typeof contents === 'string' && contents.includes(repositoryRoot))\n ) {\n throw new Error('Shared build graph still contains an absolute worktree path after tokenization');\n }\n const entry = generated.output.find((artifact) => artifact.type === 'chunk' && artifact.isEntry);\n if (!entry) throw new Error('Rolldown produced no shared extension entry');\n publishSharedBuild({\n cacheDirectory: options.sharedCacheDirectory as string,\n lookupKey,\n entry: entry.fileName,\n inputs: tokenized.shared,\n artifacts,\n });\n const published = findSharedBuild(options.sharedCacheDirectory as string, lookupKey, resolveInput);\n if (!published) throw new Error('Published shared build could not be verified');\n return materializeSharedSet(published, outputDirectory, manifestPath, normalized);\n });\n }\n\n const { generated, inputs } = await generate();\n const compiled = writeCompiledGraph(generated, outputDirectory);\n writeLocalSetManifest(manifestPath, normalized, compiled.entry, compiled.artifacts, inputs);\n return compiled.entry;\n}\n\n/**\n * Bundles `entry` into `cacheDirectory` and returns the compiled path.\n *\n * Non-TypeScript entries are returned untouched. A cache hit skips the build.\n */\nexport async function compileExtension(entry: string, cacheDirectory: string): Promise<string> {\n if (!isTypeScriptEntry(entry)) return entry;\n\n fs.mkdirSync(cacheDirectory, { recursive: true });\n const outputName = compiledName(entry, cacheKey(entry));\n const output = path.join(cacheDirectory, outputName);\n const manifestPath = `${output}${MANIFEST_SUFFIX}`;\n const previous = readCompiledExtensionManifest(manifestPath);\n if (previous && artifactsAreFresh(previous, CACHE_VERSION, output)) return output;\n\n // Rolldown loads a native module and a sizeable parser graph. Sync is the\n // only command that needs it, and a cache hit does not, so keep it off every\n // other CLI startup path.\n const { rolldown } = await import('rolldown');\n const build = await rolldown({\n input: entry,\n platform: 'node',\n plugins: [externalResolver(), preserveImportMetaUrl()],\n onLog: failUnresolvedImport,\n });\n let compiled: CompiledGraph;\n try {\n const generated = await build.generate(splitOutputOptions(outputName));\n compiled = writeCompiledGraph(generated, cacheDirectory);\n } finally {\n await build.close();\n }\n writeAtomic(\n manifestPath,\n `${JSON.stringify({ version: CACHE_VERSION, output, artifacts: compiled.artifacts }, null, 2)}\\n`,\n );\n return output;\n}\n\n/**\n * Compiles every TypeScript entry in a resolution map, leaving the rest as-is.\n *\n * A failure is not fatal: the original path is kept so Pi falls back to loading\n * the TypeScript through jiti, which is what it did before this existed.\n */\nexport async function compileResolvedEntries(\n resolved: Record<string, string>,\n cacheDirectory: string,\n): Promise<Record<string, string>> {\n fs.mkdirSync(cacheDirectory, { recursive: true });\n const compiled: Record<string, string> = {};\n for (const [key, target] of Object.entries(resolved)) {\n try {\n compiled[key] = await compileExtension(target, cacheDirectory);\n } catch {\n compiled[key] = target;\n }\n }\n return compiled;\n}\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import{optionalPackageEntry as e}from"./modules/moduleResolution.mjs";import"../utils/index.mjs";import{contentSha256 as t,findSharedBuild as n,materializeSharedBuild as r,publishSharedBuild as i,withSharedBuildLock as a}from"./sharedBuildCache.mjs";import{builtinModules as o,createRequire as s}from"node:module";import{pathToFileURL as c}from"node:url";import l from"node:path";import u from"node:fs";import{createHash as d}from"node:crypto";const f=[`.ts`,`.mts`,`.cts`],p=`.mjs`,m=`sets`,h=`\0doompi-extension-set`,g=`@agimon-ai/doompi-ui/extensionName`,_=`__DOOMPI_PATH_`,v=`repo/`,y=`external/`,b={"@mariozechner/pi-coding-agent":`@earendil-works/pi-coding-agent`,"@mariozechner/pi-tui":`@earendil-works/pi-tui`,"@mariozechner/pi-ai":`@earendil-works/pi-ai`,"@sinclair/typebox":`typebox`};function x(e){return f.some(t=>e.endsWith(t))}function S(e){for(let[t,n]of Object.entries(b)){if(e===t)return n;if(e.startsWith(`${t}/`))return`${n}${e.slice(t.length)}`}return e}const C=new Set([`@earendil-works/pi-coding-agent`,`@earendil-works/pi-tui`,`@earendil-works/pi-ai`]);function w(t){let n=e(`@earendil-works/pi-coding-agent`);if(n)try{return s(n).resolve(t)}catch{return}}const T=new Set([`@parcel/watcher`,`@napi-rs/keyring`,`better-sqlite3`,`canvas`,`fsevents`,`isolated-vm`,`keytar`,`node-pty`,`onnxruntime-node`,`playwright`,`playwright-core`,`puppeteer`,`sharp`,`typescript`]),E=new Set([`@agimon-ai/foundation-port-registry`,`@agimon-ai/foundation-process-registry`,`@agimon-ai/log-sink-mcp`,`@modelcontextprotocol/sdk`,`@narumitw/pi-tui-kit`,`@rmux/sdk`,`@tursodatabase/database`,`@tursodatabase/database-common`,`ajv`,`ajv-formats`,`gpt-tokenizer`,`highlight.js`,`hono`,`inversify`,`open`,`reflect-metadata`,`zod-to-json-schema`,`yaml`,`zod`]),D=new Set(o.flatMap(e=>[e,`node:${e}`]));function O(e){return e.trim().replace(/[^a-zA-Z0-9._-]+/g,`-`).replace(/^[-.]+|[-.]+$/g,``)||`doom-set`}function k(e){let t=e.startsWith(`@`)?e.indexOf(`/`,e.indexOf(`/`)+1):e.indexOf(`/`);return t===-1?e:e.slice(0,t)}function A(e){let t=l.dirname(e);for(;;){let e=l.join(t,`package.json`);if(u.existsSync(e))try{let t=JSON.parse(u.readFileSync(e,`utf8`));if(Z(t)&&typeof t.name==`string`)return t.name}catch{return}let n=l.dirname(t);if(n===t)return;t=n}}function j(e){let t=l.resolve(e);try{return u.realpathSync.native(t)}catch{return t}}function M(e,t){let n=l.relative(l.resolve(e),l.resolve(t));return n===``||!n.startsWith(`..`)&&!l.isAbsolute(n)}function N(e){return`${y}${d(`sha256`).update(e).digest(`hex`)}`}function P(e,t){let n=j(e);return M(t,n)?{logicalPath:`${v}${l.relative(t,n).split(l.sep).join(`/`)}`,target:n}:{logicalPath:N(n),target:n,sourcePath:n}}function F(e,t){if(e.logicalPath.startsWith(v)&&e.sourcePath===void 0){let n=l.resolve(t,e.logicalPath.slice(5));return M(t,n)?n:void 0}if(e.logicalPath.startsWith(y)&&e.sourcePath!==void 0&&e.logicalPath===N(e.sourcePath))return e.sourcePath}function I(e){try{let t=u.statSync(e);return t.isFile()?{path:e,size:t.size,mtimeMs:t.mtimeMs}:void 0}catch{return}}function L(e,t,n){return e.version===t&&e.output===n&&u.existsSync(n)&&e.artifacts.every(e=>u.existsSync(e))}function ee(e,t){return!L(e,`v12`,e.output)||JSON.stringify(e.entries)!==JSON.stringify(t)?!1:e.inputs.every(e=>{let t=I(e.path);return t?.size===e.size&&t.mtimeMs===e.mtimeMs})}function te(e){try{let t=JSON.parse(u.readFileSync(e,`utf8`));return t&&typeof t.output==`string`&&Array.isArray(t.artifacts)?t:void 0}catch{return}}function ne(e){let t=te(e);return t&&Array.isArray(t.entries)&&Array.isArray(t.inputs)?t:void 0}function R(e,t){u.mkdirSync(l.dirname(e),{recursive:!0});let n=`${e}.${process.pid}.${Date.now()}.tmp`;u.writeFileSync(n,t);try{u.renameSync(n,e)}catch(t){if(u.rmSync(n,{force:!0}),!u.existsSync(e))throw t}}function z(e){return{format:`esm`,sourcemap:!1,minify:!0,codeSplitting:!0,hashCharacters:`hex`,entryFileNames:e,chunkFileNames:`chunks/[name].[hash:16]${p}`,assetFileNames:`assets/[name].[hash:16][extname]`}}function B(e,t){let n=l.resolve(e,t.fileName),r=l.relative(e,n);if(r.startsWith(`..`)||l.isAbsolute(r))throw Error(`Rolldown emitted an artifact outside the output directory: ${t.fileName}`);return n}function V(e,t){try{let n=u.readFileSync(e),r=Buffer.from(t);return n.equals(r)}catch{return!1}}function H(e,t){let n=e.output.find(e=>e.type===`chunk`&&e.isEntry);if(!n||n.type!==`chunk`)throw Error(`Rolldown produced no extension entry`);let r=l.resolve(t),i=e.output.filter(e=>e!==n);for(let e of[...i,n]){let t=e.type===`chunk`?e.code:e.source,n=B(r,e);V(n,t)||R(n,t)}return{entry:B(r,n),artifacts:e.output.map(e=>B(r,e)).sort()}}function U(e,t){return d(`sha256`).update(`v3-rolldown-1.0.0-rc.17`).update(process.version).update(process.platform).update(process.arch).update(t).update(JSON.stringify(e.map(e=>e.logicalPath))).digest(`hex`)}function W(e,n){let r=[];for(let t of e)r.push(P(t,n));r.sort((e,t)=>e.logicalPath.localeCompare(t.logicalPath));let i=[{logicalPath:v,sha256:``,token:`${_}ROOT__`}],a=new Map([[n,`${_}ROOT__`]]),o=new Map;r.forEach((e,n)=>{let r=o.get(e.logicalPath),s=r??`${_}${String(n)}__`;r||(i.push({logicalPath:e.logicalPath,sha256:t(u.readFileSync(e.target)),token:s,...e.sourcePath?{sourcePath:e.sourcePath}:{}}),o.set(e.logicalPath,s)),a.set(l.resolve(e.target),s)});for(let t of e){let e=P(t,n),r=o.get(e.logicalPath);r&&a.set(l.resolve(t),r)}return{shared:i,byTarget:a}}function G(e,t){let n=new Map,r=[...t.entries()].sort(([e],[t])=>t.length-e.length);for(let t of e.output){if(t.type===`asset`){n.set(t.fileName,(t.source,t.source));continue}let e=t.code;for(let[t,n]of r)e=e.replaceAll(c(t).href,`${n}:url`).replaceAll(X(t),n).replaceAll(t,n);n.set(t.fileName,e)}return n}function K(e,t,n,r,i){let a=[...i].map(I).filter(e=>e!==void 0).sort((e,t)=>e.path.localeCompare(t.path));R(e,`${JSON.stringify({version:`v12`,entries:t,output:n,artifacts:[...r].sort(),inputs:a},null,2)}\n`)}function q(e,t,n,i){let a=r(e,t),o=new Set(e.replacements.values());return K(n,i,a,e.manifest.artifacts.map(e=>l.join(t,e.path)),o),a}function J(e){return d(`sha256`).update(`v12`).update(JSON.stringify(e.map(e=>l.resolve(e)))).digest(`hex`).slice(0,16)}function Y(t){let n=e(g);if(!n)throw Error(`Cannot resolve ${g}`);let r=t.map(e=>`() => import(${JSON.stringify(X(e))})`),i=t.map(e=>JSON.stringify(e));return[`import { withExtensionSource } from ${JSON.stringify(X(n))};`,`const loaders = [${r.join(`,`)}];`,`const names = [${i.join(`,`)}];`,`function report(index, phase, startedAt, error) {`,` const elapsed = (performance.now() - startedAt).toFixed(1);`,` const detail = error instanceof Error ? ": " + error.message : error === undefined ? "" : ": " + String(error);`,` process.stderr.write("[doompi:timing] " + phase + " " + elapsed + "ms " + names[index] + detail + "\\n");`,`}`,`export default async function doompiExtensionSet(pi) {`,` const timings = process.env.DOOMPI_TIMING === "1" || process.env.PI_TIMING === "1";`,` const loaded = await Promise.all(loaders.map(async (load, index) => {`,` const startedAt = performance.now();`,` try {`,` const extension = await load();`,` if (timings) report(index, "import", startedAt);`,` return extension;`,` } catch (error) {`,` report(index, "import-error", startedAt, error);`,` return undefined;`,` }`,` }));`,` for (let index = 0; index < loaded.length; index += 1) {`,` const extension = loaded[index];`,` if (!extension) continue;`,` const startedAt = performance.now();`,` try {`,` const factory = extension.default;`,` if (typeof factory !== 'function') throw new Error('does not export an extension factory');`,` await factory(withExtensionSource(pi, names[index]));`,` if (timings) report(index, "factory", startedAt);`,` } catch (error) {`,` report(index, "factory-error", startedAt, error);`,` }`,` }`,`}`].join(`
2
+ `)}function X(e){return l.resolve(e).split(l.sep).join(`/`)}function re(t){return{name:`doom-set-external`,async resolveId(n,r,i){if(n===h)return null;if(D.has(n)||n.startsWith(`node:`))return{id:n,external:!0};if(l.isAbsolute(n)){let e=A(n);return e&&(C.has(e)||T.has(e)||E.has(e))?(t.add(n),{id:n,external:!0}):null}if(n.startsWith(`.`))return null;let a=S(n),o=k(a);if(o&&C.has(o)){let n=e(a);if(n)return t.add(n),{id:n,external:!0}}if(o===`typebox`){let e=w(a);if(e)return t.add(e),{id:e,external:!0}}if(o&&(T.has(o)||E.has(o))){let e=await this.resolve(a,r,i);if(e)return t.add(e.id),{id:e.id,external:!0}}return null}}}function ie(e){return{name:`doom-set-inputs`,load(t){return l.isAbsolute(t)&&u.existsSync(t)&&e.add(t),null}}}function ae(e,t,n){t.code===`UNRESOLVED_IMPORT`&&n(`error`,t)}function Z(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Q(e,t){if(Array.isArray(e)){for(let n of e)Q(n,t);return}if(!Z(e))return;let n=e.object,r=e.property;if(e.type===`MemberExpression`&&e.computed===!1&&typeof e.start==`number`&&typeof e.end==`number`&&Z(n)&&n.type===`MetaProperty`&&Z(n.meta)&&n.meta.name===`import`&&Z(n.property)&&n.property.name===`meta`&&Z(r)&&r.name===`url`){t.push({start:e.start,end:e.end});return}for(let n of Object.values(e))Q(n,t)}function oe(){return{name:`doom-original-import-meta-url`,transform(e,t){if(!l.isAbsolute(t)||!e.includes(`import.meta.url`))return null;let n=l.extname(t).toLowerCase(),r=n===`.tsx`?`tsx`:n===`.jsx`?`jsx`:x(t)?`ts`:`js`,i=[];if(Q(this.parse(e,{lang:r}),i),i.length===0)return null;let a=JSON.stringify(c(t).href),o=e;for(let e of i.sort((e,t)=>t.start-e.start))o=`${o.slice(0,e.start)}${a}${o.slice(e.end)}`;return o}}}function $(e,t,n={}){let r=J(e.map(e=>l.resolve(e))),i=l.resolve(n.outputDirectory??l.join(t,m)),a=O(n.outputName??`doom-set`),o=d(`sha256`).update(i).update(a).digest(`hex`).slice(0,16);return l.join(t,m,`${r}.${o}.json`)}async function se(e,t,r={}){if(e.length===0)throw Error(`Cannot compile an empty extension set`);let o=e.map(e=>l.resolve(e)),s=l.join(t,m);u.mkdirSync(s,{recursive:!0});let c=l.resolve(r.outputDirectory??s),d=O(r.outputName??`doom-set`);u.mkdirSync(c,{recursive:!0});let f=$(o,t,r),g=ne(f);if(g&&ee(g,o))return g.output;let _=async()=>{let e=new Set(o),t=Y(o),{rolldown:n}=await import(`rolldown`),r=await n({input:h,platform:`node`,plugins:[{name:`doom-set-entry`,resolveId(e){return e===h?e:null},load(e){return e===h?t:null}},re(e),oe(),ie(e)],onLog:ae});try{return{generated:await r.generate(z(`${d}.[hash:16]${p}`)),inputs:e}}finally{await r.close()}},v=r.repositoryRoot?j(r.repositoryRoot):void 0;if(v&&r.sharedCacheDirectory){let e=U(o.map(e=>P(e,v)),d),t=e=>F(e,v);return a(r.sharedCacheDirectory,e,async()=>{let a=n(r.sharedCacheDirectory,e,t);if(a)return q(a,c,f,o);let{generated:s,inputs:l}=await _(),u=W(l,v),d=G(s,u.byTarget);if([...d.values()].some(e=>typeof e==`string`&&e.includes(v)))throw Error(`Shared build graph still contains an absolute worktree path after tokenization`);let p=s.output.find(e=>e.type===`chunk`&&e.isEntry);if(!p)throw Error(`Rolldown produced no shared extension entry`);i({cacheDirectory:r.sharedCacheDirectory,lookupKey:e,entry:p.fileName,inputs:u.shared,artifacts:d});let m=n(r.sharedCacheDirectory,e,t);if(!m)throw Error(`Published shared build could not be verified`);return q(m,c,f,o)})}let{generated:y,inputs:b}=await _(),x=H(y,c);return K(f,o,x.entry,x.artifacts,b),x.entry}export{se as compileExtensionSet,J as extensionSetKey,$ as extensionSetManifestPath};
3
+ //# sourceMappingURL=extensionCompiler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensionCompiler.mjs","names":[],"sources":["../../src/adapters/extensionCompiler.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport fs from 'node:fs';\nimport { builtinModules, createRequire } from 'node:module';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport type { LogLevel, LogOrStringHandler, OutputAsset, OutputChunk, RolldownLog, RolldownOutput } from 'rolldown';\nimport { optionalPackageEntry } from '../utils/index.ts';\nimport {\n contentSha256,\n findSharedBuild,\n materializeSharedBuild,\n publishSharedBuild,\n type ResolvedSharedBuild,\n type SharedBuildInput,\n withSharedBuildLock,\n} from './sharedBuildCache.ts';\n\n/**\n * Compiles TypeScript extensions into plain ESM ahead of the session.\n *\n * Pi loads extensions through jiti, which transpiles TypeScript at import time.\n * That works, but it costs a transform per module on a cold cache and makes Node\n * complain about type stripping under node_modules on every launch. Resolution\n * already knows the full extension list, so each TypeScript graph is compiled\n * to native ESM here and Pi imports it without a runtime transform. Lazy imports\n * remain separate content-addressed chunks so their evaluation semantics survive\n * compilation.\n *\n * Mode artifacts bundle their JavaScript dependencies. Node built-ins, native\n * packages, and Pi's shared runtime stay external; those imports are rewritten\n * to absolute paths so a worktree-local artifact never relies on its\n * generated directory having its own `node_modules` tree. Immutable build objects\n * may be shared by linked worktrees, but materialized output stays worktree-local.\n */\n\nconst TYPESCRIPT_SUFFIXES = ['.ts', '.mts', '.cts'] as const;\nconst COMPILED_SUFFIX = '.mjs';\nconst CACHE_VERSION = 'v4';\nconst SET_CACHE_VERSION = 'v12';\nconst HASH_LENGTH = 16;\nconst SET_DIRECTORY = 'sets';\nconst MANIFEST_SUFFIX = '.json';\nconst VIRTUAL_SET_ENTRY = '\\0doompi-extension-set';\nconst EXTENSION_SOURCE_HELPER = '@agimon-ai/doompi-ui/extensionName';\nconst SHARED_BUILD_VERSION = 'v3-rolldown-1.0.0-rc.17';\nconst SHARED_PATH_TOKEN_PREFIX = '__DOOMPI_PATH_';\nconst REPOSITORY_INPUT_PREFIX = 'repo/';\nconst EXTERNAL_INPUT_PREFIX = 'external/';\n\n/** Pi's former npm scope. The packages are the same, published under a new name. */\nconst PI_SCOPE_RENAMES: Readonly<Record<string, string>> = {\n '@mariozechner/pi-coding-agent': '@earendil-works/pi-coding-agent',\n '@mariozechner/pi-tui': '@earendil-works/pi-tui',\n '@mariozechner/pi-ai': '@earendil-works/pi-ai',\n '@sinclair/typebox': 'typebox',\n};\n\nexport function isTypeScriptEntry(entry: string): boolean {\n return TYPESCRIPT_SUFFIXES.some((suffix) => entry.endsWith(suffix));\n}\n\nfunction renameScope(specifier: string): string {\n for (const [before, after] of Object.entries(PI_SCOPE_RENAMES)) {\n if (specifier === before) return after;\n if (specifier.startsWith(`${before}/`)) return `${after}${specifier.slice(before.length)}`;\n }\n return specifier;\n}\n\n/**\n * Cache key for a compiled entry.\n *\n * The entry's own bytes are the only cheap signal that the extension changed; a\n * dependency edit is not visible without walking the graph, so an upgrade that\n * leaves the entry byte-identical is served from cache until the version below\n * is raised.\n */\nfunction cacheKey(entry: string): string {\n const source = fs.readFileSync(entry);\n return createHash('sha256').update(CACHE_VERSION).update(entry).update(source).digest('hex').slice(0, HASH_LENGTH);\n}\n\nfunction compiledName(entry: string, key: string): string {\n const base = path.basename(entry).replace(/\\.[cm]?ts$/, '');\n const parent = path.basename(path.dirname(entry));\n return `${parent}-${base}.${key}${COMPILED_SUFFIX}`;\n}\n\n/**\n * Packages that must resolve to the copy this harness runs, never to a second\n * one bundled into an extension. Pi owns the TUI and the session state, so a\n * duplicate renders into a different screen and mutates a different store.\n */\nconst HOSTED_PACKAGES = new Set(['@earendil-works/pi-coding-agent', '@earendil-works/pi-tui', '@earendil-works/pi-ai']);\n\n/**\n * Resolves packages Pi exposes to extensions as compatibility aliases.\n *\n * Extensions do not need to declare TypeBox themselves because Pi's loader\n * provides it as a virtual module. A dist bundle bypasses that loader, so it\n * resolves the same package against Pi's dependency tree and bundles it.\n */\nfunction piExtensionDependencyEntry(specifier: string): string | undefined {\n const piEntry = optionalPackageEntry('@earendil-works/pi-coding-agent');\n if (!piEntry) return undefined;\n try {\n return createRequire(piEntry).resolve(specifier);\n } catch {\n return undefined;\n }\n}\n\n/** Packages whose native binaries or runtime discovery cannot be rolled up. */\nconst NATIVE_PACKAGES = new Set([\n '@parcel/watcher',\n '@napi-rs/keyring',\n 'better-sqlite3',\n 'canvas',\n 'fsevents',\n 'isolated-vm',\n 'keytar',\n 'node-pty',\n 'onnxruntime-node',\n 'playwright',\n 'playwright-core',\n 'puppeteer',\n 'sharp',\n // TypeScript's Node system adapter reads CommonJS globals such as\n // __filename. Rolldown does not provide those globals when it folds the\n // adapter into the aggregate ESM extension, so keep the installed runtime\n // intact and import it by its resolved absolute path.\n 'typescript',\n]);\n\n/**\n * Dependency-heavy ESM runtimes that should retain their installed graph.\n *\n * Folding these packages into the aggregate creates dozens of generated chunks\n * that Node must parse and link before any extension factory can register. Node\n * can load the installed graph directly while still sharing its module cache.\n */\nconst STARTUP_EXTERNAL_PACKAGES = new Set([\n '@agimon-ai/foundation-port-registry',\n '@agimon-ai/foundation-process-registry',\n '@agimon-ai/log-sink-mcp',\n '@modelcontextprotocol/sdk',\n '@narumitw/pi-tui-kit',\n '@rmux/sdk',\n '@tursodatabase/database',\n '@tursodatabase/database-common',\n 'ajv',\n 'ajv-formats',\n 'gpt-tokenizer',\n 'highlight.js',\n 'hono',\n 'inversify',\n // open's CommonJS runtime resolves its bundled xdg-open helper through\n // __dirname, which is unavailable when Rolldown folds it into native ESM.\n 'open',\n 'reflect-metadata',\n 'zod-to-json-schema',\n 'yaml',\n 'zod',\n]);\nconst NODE_BUILTINS = new Set(builtinModules.flatMap((name) => [name, `node:${name}`]));\n\ninterface InputFingerprint {\n path: string;\n size: number;\n mtimeMs: number;\n}\n\ninterface CompiledExtensionManifest {\n version: string;\n output: string;\n artifacts: string[];\n}\n\ninterface ExtensionSetManifest extends CompiledExtensionManifest {\n entries: string[];\n inputs: InputFingerprint[];\n}\n\nexport interface CompileExtensionSetOptions {\n /** Persistent worktree artifact directory. Compiler manifests remain local. */\n outputDirectory?: string;\n /** Human-readable artifact prefix, normally the major-mode name. */\n outputName?: string;\n /** Canonical worktree root used to create relocatable logical input paths. */\n repositoryRoot?: string;\n /** Repository-level immutable cache shared by linked worktrees. */\n sharedCacheDirectory?: string;\n}\n\nfunction safeOutputName(value: string): string {\n const normalized = value\n .trim()\n .replace(/[^a-zA-Z0-9._-]+/g, '-')\n .replace(/^[-.]+|[-.]+$/g, '');\n return normalized || 'doom-set';\n}\n\nfunction packageRootOf(specifier: string): string | undefined {\n const slash = specifier.startsWith('@') ? specifier.indexOf('/', specifier.indexOf('/') + 1) : specifier.indexOf('/');\n return slash === -1 ? specifier : specifier.slice(0, slash);\n}\n\nfunction packageRootFromPath(target: string): string | undefined {\n let directory = path.dirname(target);\n while (true) {\n const manifestPath = path.join(directory, 'package.json');\n if (fs.existsSync(manifestPath)) {\n try {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as unknown;\n if (isRecord(manifest) && typeof manifest.name === 'string') return manifest.name;\n } catch {\n return undefined;\n }\n }\n const parent = path.dirname(directory);\n if (parent === directory) return undefined;\n directory = parent;\n }\n}\n\ninterface LogicalInput {\n logicalPath: string;\n target: string;\n sourcePath?: string;\n}\n\nfunction canonicalPath(target: string): string {\n const absolute = path.resolve(target);\n try {\n return fs.realpathSync.native(absolute);\n } catch {\n return absolute;\n }\n}\n\nfunction isInside(directory: string, target: string): boolean {\n const relative = path.relative(path.resolve(directory), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction externalLogicalPath(sourcePath: string): string {\n const identity = createHash('sha256').update(sourcePath).digest('hex');\n return `${EXTERNAL_INPUT_PREFIX}${identity}`;\n}\n\nfunction logicalInput(target: string, repositoryRoot: string): LogicalInput {\n const absolute = canonicalPath(target);\n if (isInside(repositoryRoot, absolute)) {\n return {\n logicalPath: `${REPOSITORY_INPUT_PREFIX}${path.relative(repositoryRoot, absolute).split(path.sep).join('/')}`,\n target: absolute,\n };\n }\n return {\n logicalPath: externalLogicalPath(absolute),\n target: absolute,\n sourcePath: absolute,\n };\n}\n\nfunction resolveLogicalInputPath(input: SharedBuildInput, repositoryRoot: string): string | undefined {\n if (input.logicalPath.startsWith(REPOSITORY_INPUT_PREFIX) && input.sourcePath === undefined) {\n const target = path.resolve(repositoryRoot, input.logicalPath.slice(REPOSITORY_INPUT_PREFIX.length));\n return isInside(repositoryRoot, target) ? target : undefined;\n }\n if (\n input.logicalPath.startsWith(EXTERNAL_INPUT_PREFIX) &&\n input.sourcePath !== undefined &&\n input.logicalPath === externalLogicalPath(input.sourcePath)\n ) {\n return input.sourcePath;\n }\n return undefined;\n}\n\nfunction externalResolver() {\n return {\n name: 'doom-external-absolute',\n async resolveId(\n this: { resolve: (id: string, importer?: string, options?: unknown) => Promise<{ id: string } | null> },\n specifier: string,\n importer: string | undefined,\n options: unknown,\n ): Promise<{ id: string; external: boolean } | null> {\n if (specifier.startsWith('.') || path.isAbsolute(specifier) || specifier.startsWith('node:')) return null;\n const renamed = renameScope(specifier);\n\n // Host packages are resolved from this module, the way the rest of the\n // harness resolves them, because an extension written against Pi's former\n // scope does not have the current one in its own dependency tree.\n const root = packageRootOf(renamed);\n if (root && HOSTED_PACKAGES.has(root)) {\n const hosted = optionalPackageEntry(renamed);\n if (hosted) return { id: hosted, external: true };\n }\n\n // Rolldown's resolver rather than `createRequire`, which cannot see an\n // ESM-only package that publishes no `require` condition and would send\n // Pi's own core into the bundle.\n const resolved = await this.resolve(renamed, importer, options);\n if (!resolved) return null;\n // A dependency that is itself TypeScript cannot be handed to Node either,\n // so it is bundled rather than externalised.\n if (isTypeScriptEntry(resolved.id)) return null;\n return { id: resolved.id, external: true };\n },\n };\n}\n\nfunction fingerprint(target: string): InputFingerprint | undefined {\n try {\n const stat = fs.statSync(target);\n if (!stat.isFile()) return undefined;\n return { path: target, size: stat.size, mtimeMs: stat.mtimeMs };\n } catch {\n return undefined;\n }\n}\n\nfunction artifactsAreFresh(manifest: CompiledExtensionManifest, version: string, output: string): boolean {\n return (\n manifest.version === version &&\n manifest.output === output &&\n fs.existsSync(output) &&\n manifest.artifacts.every((artifact) => fs.existsSync(artifact))\n );\n}\n\nfunction manifestIsFresh(manifest: ExtensionSetManifest, entries: string[]): boolean {\n if (!artifactsAreFresh(manifest, SET_CACHE_VERSION, manifest.output)) return false;\n if (JSON.stringify(manifest.entries) !== JSON.stringify(entries)) {\n return false;\n }\n return manifest.inputs.every((previous) => {\n const current = fingerprint(previous.path);\n return current?.size === previous.size && current.mtimeMs === previous.mtimeMs;\n });\n}\n\nfunction readCompiledExtensionManifest(manifestPath: string): CompiledExtensionManifest | undefined {\n try {\n const parsed = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as CompiledExtensionManifest;\n return parsed && typeof parsed.output === 'string' && Array.isArray(parsed.artifacts) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction readSetManifest(manifestPath: string): ExtensionSetManifest | undefined {\n const parsed = readCompiledExtensionManifest(manifestPath) as ExtensionSetManifest | undefined;\n return parsed && Array.isArray(parsed.entries) && Array.isArray(parsed.inputs) ? parsed : undefined;\n}\n\nfunction writeAtomic(target: string, contents: string | Uint8Array): void {\n fs.mkdirSync(path.dirname(target), { recursive: true });\n const temporary = `${target}.${process.pid}.${Date.now()}.tmp`;\n fs.writeFileSync(temporary, contents);\n try {\n fs.renameSync(temporary, target);\n } catch (error) {\n fs.rmSync(temporary, { force: true });\n if (!fs.existsSync(target)) throw error;\n }\n}\n\ninterface CompiledGraph {\n entry: string;\n artifacts: string[];\n}\n\nfunction splitOutputOptions(entryFileNames: string) {\n return {\n format: 'esm' as const,\n sourcemap: false,\n minify: true,\n codeSplitting: true,\n hashCharacters: 'hex' as const,\n entryFileNames,\n chunkFileNames: `chunks/[name].[hash:${HASH_LENGTH}]${COMPILED_SUFFIX}`,\n assetFileNames: `assets/[name].[hash:${HASH_LENGTH}][extname]`,\n };\n}\n\nfunction artifactTarget(outputDirectory: string, artifact: OutputAsset | OutputChunk): string {\n const target = path.resolve(outputDirectory, artifact.fileName);\n const relative = path.relative(outputDirectory, target);\n if (relative.startsWith('..') || path.isAbsolute(relative)) {\n throw new Error(`Rolldown emitted an artifact outside the output directory: ${artifact.fileName}`);\n }\n return target;\n}\n\nfunction artifactMatches(target: string, contents: string | Uint8Array): boolean {\n try {\n const current = fs.readFileSync(target);\n const generated = typeof contents === 'string' ? Buffer.from(contents) : Buffer.from(contents);\n return current.equals(generated);\n } catch {\n return false;\n }\n}\n\n/** Writes referenced chunks first so a visible entry always has a complete graph. */\nfunction writeCompiledGraph(generated: RolldownOutput, outputDirectory: string): CompiledGraph {\n const entry = generated.output.find((artifact) => artifact.type === 'chunk' && artifact.isEntry);\n if (!entry || entry.type !== 'chunk') throw new Error('Rolldown produced no extension entry');\n const root = path.resolve(outputDirectory);\n const remaining = generated.output.filter((artifact) => artifact !== entry);\n for (const artifact of [...remaining, entry]) {\n const contents = artifact.type === 'chunk' ? artifact.code : artifact.source;\n const target = artifactTarget(root, artifact);\n if (!artifactMatches(target, contents)) writeAtomic(target, contents);\n }\n return {\n entry: artifactTarget(root, entry),\n artifacts: generated.output.map((artifact) => artifactTarget(root, artifact)).sort(),\n };\n}\n\nfunction sharedLookupKey(entries: readonly LogicalInput[], outputName: string): string {\n return createHash('sha256')\n .update(SHARED_BUILD_VERSION)\n .update(process.version)\n .update(process.platform)\n .update(process.arch)\n .update(outputName)\n .update(JSON.stringify(entries.map((entry) => entry.logicalPath)))\n .digest('hex');\n}\n\ninterface TokenizedInputs {\n shared: SharedBuildInput[];\n byTarget: Map<string, string>;\n}\n\nfunction tokenizedInputs(inputs: ReadonlySet<string>, repositoryRoot: string): TokenizedInputs {\n const logical: LogicalInput[] = [];\n for (const target of inputs) logical.push(logicalInput(target, repositoryRoot));\n logical.sort((left, right) => left.logicalPath.localeCompare(right.logicalPath));\n const shared: SharedBuildInput[] = [\n { logicalPath: REPOSITORY_INPUT_PREFIX, sha256: '', token: `${SHARED_PATH_TOKEN_PREFIX}ROOT__` },\n ];\n const byTarget = new Map<string, string>([[repositoryRoot, `${SHARED_PATH_TOKEN_PREFIX}ROOT__`]]);\n const tokenByLogicalPath = new Map<string, string>();\n logical.forEach((input, index) => {\n const existing = tokenByLogicalPath.get(input.logicalPath);\n const token = existing ?? `${SHARED_PATH_TOKEN_PREFIX}${String(index)}__`;\n if (!existing) {\n shared.push({\n logicalPath: input.logicalPath,\n sha256: contentSha256(fs.readFileSync(input.target)),\n token,\n ...(input.sourcePath ? { sourcePath: input.sourcePath } : {}),\n });\n tokenByLogicalPath.set(input.logicalPath, token);\n }\n byTarget.set(path.resolve(input.target), token);\n });\n for (const target of inputs) {\n const input = logicalInput(target, repositoryRoot);\n const token = tokenByLogicalPath.get(input.logicalPath);\n if (token) byTarget.set(path.resolve(target), token);\n }\n return { shared, byTarget };\n}\n\nfunction tokenizedArtifactContents(\n generated: RolldownOutput,\n tokens: ReadonlyMap<string, string>,\n): Map<string, string | Uint8Array> {\n const artifacts = new Map<string, string | Uint8Array>();\n const replacements = [...tokens.entries()].sort(([left], [right]) => right.length - left.length);\n for (const artifact of generated.output) {\n if (artifact.type === 'asset') {\n artifacts.set(artifact.fileName, typeof artifact.source === 'string' ? artifact.source : artifact.source);\n continue;\n }\n let source = artifact.code;\n for (const [target, token] of replacements) {\n source = source\n .replaceAll(pathToFileURL(target).href, `${token}:url`)\n .replaceAll(pathToImportSpecifier(target), token)\n .replaceAll(target, token);\n }\n artifacts.set(artifact.fileName, source);\n }\n return artifacts;\n}\n\nfunction writeLocalSetManifest(\n manifestPath: string,\n entries: string[],\n output: string,\n artifacts: string[],\n inputs: ReadonlySet<string>,\n): void {\n const inputFingerprints = [...inputs]\n .map(fingerprint)\n .filter((value): value is InputFingerprint => value !== undefined)\n .sort((left, right) => left.path.localeCompare(right.path));\n writeAtomic(\n manifestPath,\n `${JSON.stringify(\n { version: SET_CACHE_VERSION, entries, output, artifacts: [...artifacts].sort(), inputs: inputFingerprints },\n null,\n 2,\n )}\\n`,\n );\n}\n\nfunction materializeSharedSet(\n build: ResolvedSharedBuild,\n outputDirectory: string,\n manifestPath: string,\n entries: string[],\n): string {\n const output = materializeSharedBuild(build, outputDirectory);\n const inputs = new Set(build.replacements.values());\n const artifacts = build.manifest.artifacts.map((artifact) => path.join(outputDirectory, artifact.path));\n writeLocalSetManifest(manifestPath, entries, output, artifacts, inputs);\n return output;\n}\n\n/** Stable lookup key for one exact Pi load order. */\nexport function extensionSetKey(entries: readonly string[]): string {\n return createHash('sha256')\n .update(SET_CACHE_VERSION)\n .update(JSON.stringify(entries.map((entry) => path.resolve(entry))))\n .digest('hex')\n .slice(0, HASH_LENGTH);\n}\n\nfunction extensionSetSource(entries: readonly string[]): string {\n const helper = optionalPackageEntry(EXTENSION_SOURCE_HELPER);\n if (!helper) throw new Error(`Cannot resolve ${EXTENSION_SOURCE_HELPER}`);\n const loaders = entries.map((entry) => `() => import(${JSON.stringify(pathToImportSpecifier(entry))})`);\n const names = entries.map((entry) => JSON.stringify(entry));\n return [\n `import { withExtensionSource } from ${JSON.stringify(pathToImportSpecifier(helper))};`,\n `const loaders = [${loaders.join(',')}];`,\n `const names = [${names.join(',')}];`,\n 'function report(index, phase, startedAt, error) {',\n ' const elapsed = (performance.now() - startedAt).toFixed(1);',\n ' const detail = error instanceof Error ? \": \" + error.message : error === undefined ? \"\" : \": \" + String(error);',\n ' process.stderr.write(\"[doompi:timing] \" + phase + \" \" + elapsed + \"ms \" + names[index] + detail + \"\\\\n\");',\n '}',\n 'export default async function doompiExtensionSet(pi) {',\n ' const timings = process.env.DOOMPI_TIMING === \"1\" || process.env.PI_TIMING === \"1\";',\n ' const loaded = await Promise.all(loaders.map(async (load, index) => {',\n ' const startedAt = performance.now();',\n ' try {',\n ' const extension = await load();',\n ' if (timings) report(index, \"import\", startedAt);',\n ' return extension;',\n ' } catch (error) {',\n ' report(index, \"import-error\", startedAt, error);',\n ' return undefined;',\n ' }',\n ' }));',\n ' for (let index = 0; index < loaded.length; index += 1) {',\n ' const extension = loaded[index];',\n ' if (!extension) continue;',\n ' const startedAt = performance.now();',\n ' try {',\n ' const factory = extension.default;',\n \" if (typeof factory !== 'function') throw new Error('does not export an extension factory');\",\n ' await factory(withExtensionSource(pi, names[index]));',\n ' if (timings) report(index, \"factory\", startedAt);',\n ' } catch (error) {',\n ' report(index, \"factory-error\", startedAt, error);',\n ' }',\n ' }',\n '}',\n ].join('\\n');\n}\n\nfunction pathToImportSpecifier(target: string): string {\n // Rolldown accepts absolute POSIX paths directly. Windows needs a file URL,\n // but replacing separators is enough for its platform-independent parser.\n return path.resolve(target).split(path.sep).join('/');\n}\n\nfunction setExternalResolver(inputs: Set<string>) {\n return {\n name: 'doom-set-external',\n async resolveId(\n this: { resolve: (id: string, importer?: string, options?: unknown) => Promise<{ id: string } | null> },\n specifier: string,\n importer: string | undefined,\n options: unknown,\n ): Promise<{ id: string; external: boolean } | null> {\n if (specifier === VIRTUAL_SET_ENTRY) return null;\n if (NODE_BUILTINS.has(specifier) || specifier.startsWith('node:')) {\n return { id: specifier, external: true };\n }\n\n if (path.isAbsolute(specifier)) {\n const root = packageRootFromPath(specifier);\n if (root && (HOSTED_PACKAGES.has(root) || NATIVE_PACKAGES.has(root) || STARTUP_EXTERNAL_PACKAGES.has(root))) {\n inputs.add(specifier);\n return { id: specifier, external: true };\n }\n return null;\n }\n if (specifier.startsWith('.')) return null;\n\n const renamed = renameScope(specifier);\n const root = packageRootOf(renamed);\n if (root && HOSTED_PACKAGES.has(root)) {\n const hosted = optionalPackageEntry(renamed);\n if (hosted) {\n inputs.add(hosted);\n return { id: hosted, external: true };\n }\n }\n if (root === 'typebox') {\n const typebox = piExtensionDependencyEntry(renamed);\n if (typebox) {\n inputs.add(typebox);\n return { id: typebox, external: true };\n }\n }\n if (root && (NATIVE_PACKAGES.has(root) || STARTUP_EXTERNAL_PACKAGES.has(root))) {\n const resolved = await this.resolve(renamed, importer, options);\n if (resolved) {\n inputs.add(resolved.id);\n return { id: resolved.id, external: true };\n }\n }\n return null;\n },\n };\n}\n\nfunction inputCollector(inputs: Set<string>) {\n return {\n name: 'doom-set-inputs',\n load(id: string): null {\n if (path.isAbsolute(id) && fs.existsSync(id)) inputs.add(id);\n return null;\n },\n };\n}\n\n/** An unresolved bare import would otherwise become a broken dist external. */\nfunction failUnresolvedImport(_level: LogLevel, log: RolldownLog, handler: LogOrStringHandler): void {\n if (log.code === 'UNRESOLVED_IMPORT') handler('error', log);\n}\n\ninterface SourceRange {\n start: number;\n end: number;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction collectImportMetaUrlRanges(value: unknown, ranges: SourceRange[]): void {\n if (Array.isArray(value)) {\n for (const item of value) collectImportMetaUrlRanges(item, ranges);\n return;\n }\n if (!isRecord(value)) return;\n\n const object = value.object;\n const property = value.property;\n if (\n value.type === 'MemberExpression' &&\n value.computed === false &&\n typeof value.start === 'number' &&\n typeof value.end === 'number' &&\n isRecord(object) &&\n object.type === 'MetaProperty' &&\n isRecord(object.meta) &&\n object.meta.name === 'import' &&\n isRecord(object.property) &&\n object.property.name === 'meta' &&\n isRecord(property) &&\n property.name === 'url'\n ) {\n ranges.push({ start: value.start, end: value.end });\n return;\n }\n\n for (const child of Object.values(value)) collectImportMetaUrlRanges(child, ranges);\n}\n\n/** Keeps package-owned resource lookup anchored to each original source file. */\nfunction preserveImportMetaUrl() {\n return {\n name: 'doom-original-import-meta-url',\n transform(\n this: {\n parse: (source: string, options?: { lang?: 'js' | 'jsx' | 'ts' | 'tsx' }) => unknown;\n },\n source: string,\n id: string,\n ): string | null {\n if (!path.isAbsolute(id) || !source.includes('import.meta.url')) return null;\n const extension = path.extname(id).toLowerCase();\n const lang = extension === '.tsx' ? 'tsx' : extension === '.jsx' ? 'jsx' : isTypeScriptEntry(id) ? 'ts' : 'js';\n const ranges: SourceRange[] = [];\n collectImportMetaUrlRanges(this.parse(source, { lang }), ranges);\n if (ranges.length === 0) return null;\n const replacement = JSON.stringify(pathToFileURL(id).href);\n let transformed = source;\n for (const range of ranges.sort((left, right) => right.start - left.start)) {\n transformed = `${transformed.slice(0, range.start)}${replacement}${transformed.slice(range.end)}`;\n }\n return transformed;\n },\n };\n}\n\n/** Location of the lightweight input-fingerprint record for one extension set. */\nexport function extensionSetManifestPath(\n entries: readonly string[],\n cacheDirectory: string,\n options: CompileExtensionSetOptions = {},\n): string {\n const normalized = entries.map((entry) => path.resolve(entry));\n const key = extensionSetKey(normalized);\n const outputDirectory = path.resolve(options.outputDirectory ?? path.join(cacheDirectory, SET_DIRECTORY));\n const outputName = safeOutputName(options.outputName ?? 'doom-set');\n // One graph can be emitted under several named mode artifacts. Keep their\n // cache records separate without changing extensionSetKey, which is the\n // runtime lookup key for an exact activation order.\n const outputKey = createHash('sha256').update(outputDirectory).update(outputName).digest('hex').slice(0, HASH_LENGTH);\n return path.join(cacheDirectory, SET_DIRECTORY, `${key}.${outputKey}${MANIFEST_SUFFIX}`);\n}\n\n/**\n * Compiles an ordered extension set into one native ESM entry.\n *\n * The generated entry starts every module load together, then invokes factories\n * sequentially in activation order. Its manifest records every loaded module,\n * so a dependency edit invalidates the cache without running the compiler.\n */\nexport async function compileExtensionSet(\n entries: readonly string[],\n cacheDirectory: string,\n options: CompileExtensionSetOptions = {},\n): Promise<string> {\n if (entries.length === 0) throw new Error('Cannot compile an empty extension set');\n const normalized = entries.map((entry) => path.resolve(entry));\n const setDirectory = path.join(cacheDirectory, SET_DIRECTORY);\n fs.mkdirSync(setDirectory, { recursive: true });\n const outputDirectory = path.resolve(options.outputDirectory ?? setDirectory);\n const outputName = safeOutputName(options.outputName ?? 'doom-set');\n fs.mkdirSync(outputDirectory, { recursive: true });\n const manifestPath = extensionSetManifestPath(normalized, cacheDirectory, options);\n const previous = readSetManifest(manifestPath);\n if (previous && manifestIsFresh(previous, normalized)) return previous.output;\n\n const generate = async (): Promise<{ generated: RolldownOutput; inputs: Set<string> }> => {\n const inputs = new Set(normalized);\n const source = extensionSetSource(normalized);\n const { rolldown } = await import('rolldown');\n const build = await rolldown({\n input: VIRTUAL_SET_ENTRY,\n platform: 'node',\n plugins: [\n {\n name: 'doom-set-entry',\n resolveId(id: string): string | null {\n return id === VIRTUAL_SET_ENTRY ? id : null;\n },\n load(id: string): string | null {\n return id === VIRTUAL_SET_ENTRY ? source : null;\n },\n },\n setExternalResolver(inputs),\n preserveImportMetaUrl(),\n inputCollector(inputs),\n ],\n onLog: failUnresolvedImport,\n });\n try {\n return {\n generated: await build.generate(splitOutputOptions(`${outputName}.[hash:${HASH_LENGTH}]${COMPILED_SUFFIX}`)),\n inputs,\n };\n } finally {\n await build.close();\n }\n };\n\n const repositoryRoot = options.repositoryRoot ? canonicalPath(options.repositoryRoot) : undefined;\n\n if (repositoryRoot && options.sharedCacheDirectory) {\n const logicalEntries = normalized.map((entry) => logicalInput(entry, repositoryRoot));\n const lookupKey = sharedLookupKey(logicalEntries, outputName);\n const resolveInput = (input: SharedBuildInput): string | undefined =>\n resolveLogicalInputPath(input, repositoryRoot);\n return withSharedBuildLock(options.sharedCacheDirectory, lookupKey, async () => {\n const cached = findSharedBuild(options.sharedCacheDirectory as string, lookupKey, resolveInput);\n if (cached) return materializeSharedSet(cached, outputDirectory, manifestPath, normalized);\n\n const { generated, inputs } = await generate();\n const tokenized = tokenizedInputs(inputs, repositoryRoot);\n const artifacts = tokenizedArtifactContents(generated, tokenized.byTarget);\n if (\n [...artifacts.values()].some((contents) => typeof contents === 'string' && contents.includes(repositoryRoot))\n ) {\n throw new Error('Shared build graph still contains an absolute worktree path after tokenization');\n }\n const entry = generated.output.find((artifact) => artifact.type === 'chunk' && artifact.isEntry);\n if (!entry) throw new Error('Rolldown produced no shared extension entry');\n publishSharedBuild({\n cacheDirectory: options.sharedCacheDirectory as string,\n lookupKey,\n entry: entry.fileName,\n inputs: tokenized.shared,\n artifacts,\n });\n const published = findSharedBuild(options.sharedCacheDirectory as string, lookupKey, resolveInput);\n if (!published) throw new Error('Published shared build could not be verified');\n return materializeSharedSet(published, outputDirectory, manifestPath, normalized);\n });\n }\n\n const { generated, inputs } = await generate();\n const compiled = writeCompiledGraph(generated, outputDirectory);\n writeLocalSetManifest(manifestPath, normalized, compiled.entry, compiled.artifacts, inputs);\n return compiled.entry;\n}\n\n/**\n * Bundles `entry` into `cacheDirectory` and returns the compiled path.\n *\n * Non-TypeScript entries are returned untouched. A cache hit skips the build.\n */\nexport async function compileExtension(entry: string, cacheDirectory: string): Promise<string> {\n if (!isTypeScriptEntry(entry)) return entry;\n\n fs.mkdirSync(cacheDirectory, { recursive: true });\n const outputName = compiledName(entry, cacheKey(entry));\n const output = path.join(cacheDirectory, outputName);\n const manifestPath = `${output}${MANIFEST_SUFFIX}`;\n const previous = readCompiledExtensionManifest(manifestPath);\n if (previous && artifactsAreFresh(previous, CACHE_VERSION, output)) return output;\n\n // Rolldown loads a native module and a sizeable parser graph. Sync is the\n // only command that needs it, and a cache hit does not, so keep it off every\n // other CLI startup path.\n const { rolldown } = await import('rolldown');\n const build = await rolldown({\n input: entry,\n platform: 'node',\n plugins: [externalResolver(), preserveImportMetaUrl()],\n onLog: failUnresolvedImport,\n });\n let compiled: CompiledGraph;\n try {\n const generated = await build.generate(splitOutputOptions(outputName));\n compiled = writeCompiledGraph(generated, cacheDirectory);\n } finally {\n await build.close();\n }\n writeAtomic(\n manifestPath,\n `${JSON.stringify({ version: CACHE_VERSION, output, artifacts: compiled.artifacts }, null, 2)}\\n`,\n );\n return output;\n}\n\n/**\n * Compiles every TypeScript entry in a resolution map, leaving the rest as-is.\n *\n * A failure is not fatal: the original path is kept so Pi falls back to loading\n * the TypeScript through jiti, which is what it did before this existed.\n */\nexport async function compileResolvedEntries(\n resolved: Record<string, string>,\n cacheDirectory: string,\n): Promise<Record<string, string>> {\n fs.mkdirSync(cacheDirectory, { recursive: true });\n const compiled: Record<string, string> = {};\n for (const [key, target] of Object.entries(resolved)) {\n try {\n compiled[key] = await compileExtension(target, cacheDirectory);\n } catch {\n compiled[key] = target;\n }\n }\n return compiled;\n}\n"],"mappings":"4bAmCA,MAAM,EAAsB,CAAC,MAAO,OAAQ,OAAO,CAC7C,EAAkB,OAIlB,EAAgB,OAEhB,EAAoB,yBACpB,EAA0B,qCAE1B,EAA2B,iBAC3B,EAA0B,QAC1B,EAAwB,YAGxB,EAAqD,CACzD,gCAAiC,kCACjC,uBAAwB,yBACxB,sBAAuB,wBACvB,oBAAqB,UACtB,CAED,SAAgB,EAAkB,EAAwB,CACxD,OAAO,EAAoB,KAAM,GAAW,EAAM,SAAS,EAAO,CAAC,CAGrE,SAAS,EAAY,EAA2B,CAC9C,IAAK,GAAM,CAAC,EAAQ,KAAU,OAAO,QAAQ,EAAiB,CAAE,CAC9D,GAAI,IAAc,EAAQ,OAAO,EACjC,GAAI,EAAU,WAAW,GAAG,EAAO,GAAG,CAAE,MAAO,GAAG,IAAQ,EAAU,MAAM,EAAO,OAAO,GAE1F,OAAO,EA2BT,MAAM,EAAkB,IAAI,IAAI,CAAC,kCAAmC,yBAA0B,wBAAwB,CAAC,CASvH,SAAS,EAA2B,EAAuC,CACzE,IAAM,EAAU,EAAqB,kCAAkC,CAClE,KACL,GAAI,CACF,OAAO,EAAc,EAAQ,CAAC,QAAQ,EAAU,MAC1C,CACN,QAKJ,MAAM,EAAkB,IAAI,IAAI,CAC9B,kBACA,mBACA,iBACA,SACA,WACA,cACA,SACA,WACA,mBACA,aACA,kBACA,YACA,QAKA,aACD,CAAC,CASI,EAA4B,IAAI,IAAI,CACxC,sCACA,yCACA,0BACA,4BACA,uBACA,YACA,0BACA,iCACA,MACA,cACA,gBACA,eACA,OACA,YAGA,OACA,mBACA,qBACA,OACA,MACD,CAAC,CACI,EAAgB,IAAI,IAAI,EAAe,QAAS,GAAS,CAAC,EAAM,QAAQ,IAAO,CAAC,CAAC,CA8BvF,SAAS,EAAe,EAAuB,CAK7C,OAJmB,EAChB,MAAM,CACN,QAAQ,oBAAqB,IAAI,CACjC,QAAQ,iBAAkB,GACZ,EAAI,WAGvB,SAAS,EAAc,EAAuC,CAC5D,IAAM,EAAQ,EAAU,WAAW,IAAI,CAAG,EAAU,QAAQ,IAAK,EAAU,QAAQ,IAAI,CAAG,EAAE,CAAG,EAAU,QAAQ,IAAI,CACrH,OAAO,IAAU,GAAK,EAAY,EAAU,MAAM,EAAG,EAAM,CAG7D,SAAS,EAAoB,EAAoC,CAC/D,IAAI,EAAY,EAAK,QAAQ,EAAO,CACpC,OAAa,CACX,IAAM,EAAe,EAAK,KAAK,EAAW,eAAe,CACzD,GAAI,EAAG,WAAW,EAAa,CAC7B,GAAI,CACF,IAAM,EAAW,KAAK,MAAM,EAAG,aAAa,EAAc,OAAO,CAAC,CAClE,GAAI,EAAS,EAAS,EAAI,OAAO,EAAS,MAAS,SAAU,OAAO,EAAS,UACvE,CACN,OAGJ,IAAM,EAAS,EAAK,QAAQ,EAAU,CACtC,GAAI,IAAW,EAAW,OAC1B,EAAY,GAUhB,SAAS,EAAc,EAAwB,CAC7C,IAAM,EAAW,EAAK,QAAQ,EAAO,CACrC,GAAI,CACF,OAAO,EAAG,aAAa,OAAO,EAAS,MACjC,CACN,OAAO,GAIX,SAAS,EAAS,EAAmB,EAAyB,CAC5D,IAAM,EAAW,EAAK,SAAS,EAAK,QAAQ,EAAU,CAAE,EAAK,QAAQ,EAAO,CAAC,CAC7E,OAAO,IAAa,IAAO,CAAC,EAAS,WAAW,KAAK,EAAI,CAAC,EAAK,WAAW,EAAS,CAGrF,SAAS,EAAoB,EAA4B,CAEvD,MAAO,GAAG,IADO,EAAW,SAAS,CAAC,OAAO,EAAW,CAAC,OAAO,MACtB,GAG5C,SAAS,EAAa,EAAgB,EAAsC,CAC1E,IAAM,EAAW,EAAc,EAAO,CAOtC,OANI,EAAS,EAAgB,EAAS,CAC7B,CACL,YAAa,GAAG,IAA0B,EAAK,SAAS,EAAgB,EAAS,CAAC,MAAM,EAAK,IAAI,CAAC,KAAK,IAAI,GAC3G,OAAQ,EACT,CAEI,CACL,YAAa,EAAoB,EAAS,CAC1C,OAAQ,EACR,WAAY,EACb,CAGH,SAAS,EAAwB,EAAyB,EAA4C,CACpG,GAAI,EAAM,YAAY,WAAW,EAAwB,EAAI,EAAM,aAAe,IAAA,GAAW,CAC3F,IAAM,EAAS,EAAK,QAAQ,EAAgB,EAAM,YAAY,MAAM,EAA+B,CAAC,CACpG,OAAO,EAAS,EAAgB,EAAO,CAAG,EAAS,IAAA,GAErD,GACE,EAAM,YAAY,WAAW,EAAsB,EACnD,EAAM,aAAe,IAAA,IACrB,EAAM,cAAgB,EAAoB,EAAM,WAAW,CAE3D,OAAO,EAAM,WAuCjB,SAAS,EAAY,EAA8C,CACjE,GAAI,CACF,IAAM,EAAO,EAAG,SAAS,EAAO,CAEhC,OADK,EAAK,QAAQ,CACX,CAAE,KAAM,EAAQ,KAAM,EAAK,KAAM,QAAS,EAAK,QAAS,CAD3C,YAEd,CACN,QAIJ,SAAS,EAAkB,EAAqC,EAAiB,EAAyB,CACxG,OACE,EAAS,UAAY,GACrB,EAAS,SAAW,GACpB,EAAG,WAAW,EAAO,EACrB,EAAS,UAAU,MAAO,GAAa,EAAG,WAAW,EAAS,CAAC,CAInE,SAAS,GAAgB,EAAgC,EAA4B,CAKnF,MAJI,CAAC,EAAkB,EAAU,MAAmB,EAAS,OAAO,EAChE,KAAK,UAAU,EAAS,QAAQ,GAAK,KAAK,UAAU,EAAQ,CACvD,GAEF,EAAS,OAAO,MAAO,GAAa,CACzC,IAAM,EAAU,EAAY,EAAS,KAAK,CAC1C,OAAO,GAAS,OAAS,EAAS,MAAQ,EAAQ,UAAY,EAAS,SACvE,CAGJ,SAAS,GAA8B,EAA6D,CAClG,GAAI,CACF,IAAM,EAAS,KAAK,MAAM,EAAG,aAAa,EAAc,OAAO,CAAC,CAChE,OAAO,GAAU,OAAO,EAAO,QAAW,UAAY,MAAM,QAAQ,EAAO,UAAU,CAAG,EAAS,IAAA,QAC3F,CACN,QAIJ,SAAS,GAAgB,EAAwD,CAC/E,IAAM,EAAS,GAA8B,EAAa,CAC1D,OAAO,GAAU,MAAM,QAAQ,EAAO,QAAQ,EAAI,MAAM,QAAQ,EAAO,OAAO,CAAG,EAAS,IAAA,GAG5F,SAAS,EAAY,EAAgB,EAAqC,CACxE,EAAG,UAAU,EAAK,QAAQ,EAAO,CAAE,CAAE,UAAW,GAAM,CAAC,CACvD,IAAM,EAAY,GAAG,EAAO,GAAG,QAAQ,IAAI,GAAG,KAAK,KAAK,CAAC,MACzD,EAAG,cAAc,EAAW,EAAS,CACrC,GAAI,CACF,EAAG,WAAW,EAAW,EAAO,OACzB,EAAO,CAEd,GADA,EAAG,OAAO,EAAW,CAAE,MAAO,GAAM,CAAC,CACjC,CAAC,EAAG,WAAW,EAAO,CAAE,MAAM,GAStC,SAAS,EAAmB,EAAwB,CAClD,MAAO,CACL,OAAQ,MACR,UAAW,GACX,OAAQ,GACR,cAAe,GACf,eAAgB,MAChB,iBACA,eAAgB,0BAAsC,IACtD,eAAgB,mCACjB,CAGH,SAAS,EAAe,EAAyB,EAA6C,CAC5F,IAAM,EAAS,EAAK,QAAQ,EAAiB,EAAS,SAAS,CACzD,EAAW,EAAK,SAAS,EAAiB,EAAO,CACvD,GAAI,EAAS,WAAW,KAAK,EAAI,EAAK,WAAW,EAAS,CACxD,MAAU,MAAM,8DAA8D,EAAS,WAAW,CAEpG,OAAO,EAGT,SAAS,EAAgB,EAAgB,EAAwC,CAC/E,GAAI,CACF,IAAM,EAAU,EAAG,aAAa,EAAO,CACjC,EAA2C,OAAO,KAAK,EAAS,CACtE,OAAO,EAAQ,OAAO,EAAU,MAC1B,CACN,MAAO,IAKX,SAAS,EAAmB,EAA2B,EAAwC,CAC7F,IAAM,EAAQ,EAAU,OAAO,KAAM,GAAa,EAAS,OAAS,SAAW,EAAS,QAAQ,CAChG,GAAI,CAAC,GAAS,EAAM,OAAS,QAAS,MAAU,MAAM,uCAAuC,CAC7F,IAAM,EAAO,EAAK,QAAQ,EAAgB,CACpC,EAAY,EAAU,OAAO,OAAQ,GAAa,IAAa,EAAM,CAC3E,IAAK,IAAM,IAAY,CAAC,GAAG,EAAW,EAAM,CAAE,CAC5C,IAAM,EAAW,EAAS,OAAS,QAAU,EAAS,KAAO,EAAS,OAChE,EAAS,EAAe,EAAM,EAAS,CACxC,EAAgB,EAAQ,EAAS,EAAE,EAAY,EAAQ,EAAS,CAEvE,MAAO,CACL,MAAO,EAAe,EAAM,EAAM,CAClC,UAAW,EAAU,OAAO,IAAK,GAAa,EAAe,EAAM,EAAS,CAAC,CAAC,MAAM,CACrF,CAGH,SAAS,EAAgB,EAAkC,EAA4B,CACrF,OAAO,EAAW,SAAS,CACxB,OAAO,0BAAqB,CAC5B,OAAO,QAAQ,QAAQ,CACvB,OAAO,QAAQ,SAAS,CACxB,OAAO,QAAQ,KAAK,CACpB,OAAO,EAAW,CAClB,OAAO,KAAK,UAAU,EAAQ,IAAK,GAAU,EAAM,YAAY,CAAC,CAAC,CACjE,OAAO,MAAM,CAQlB,SAAS,EAAgB,EAA6B,EAAyC,CAC7F,IAAM,EAA0B,EAAE,CAClC,IAAK,IAAM,KAAU,EAAQ,EAAQ,KAAK,EAAa,EAAQ,EAAe,CAAC,CAC/E,EAAQ,MAAM,EAAM,IAAU,EAAK,YAAY,cAAc,EAAM,YAAY,CAAC,CAChF,IAAM,EAA6B,CACjC,CAAE,YAAa,EAAyB,OAAQ,GAAI,MAAO,GAAG,EAAyB,QAAS,CACjG,CACK,EAAW,IAAI,IAAoB,CAAC,CAAC,EAAgB,GAAG,EAAyB,QAAQ,CAAC,CAAC,CAC3F,EAAqB,IAAI,IAC/B,EAAQ,SAAS,EAAO,IAAU,CAChC,IAAM,EAAW,EAAmB,IAAI,EAAM,YAAY,CACpD,EAAQ,GAAY,GAAG,IAA2B,OAAO,EAAM,CAAC,IACjE,IACH,EAAO,KAAK,CACV,YAAa,EAAM,YACnB,OAAQ,EAAc,EAAG,aAAa,EAAM,OAAO,CAAC,CACpD,QACA,GAAI,EAAM,WAAa,CAAE,WAAY,EAAM,WAAY,CAAG,EAAE,CAC7D,CAAC,CACF,EAAmB,IAAI,EAAM,YAAa,EAAM,EAElD,EAAS,IAAI,EAAK,QAAQ,EAAM,OAAO,CAAE,EAAM,EAC/C,CACF,IAAK,IAAM,KAAU,EAAQ,CAC3B,IAAM,EAAQ,EAAa,EAAQ,EAAe,CAC5C,EAAQ,EAAmB,IAAI,EAAM,YAAY,CACnD,GAAO,EAAS,IAAI,EAAK,QAAQ,EAAO,CAAE,EAAM,CAEtD,MAAO,CAAE,SAAQ,WAAU,CAG7B,SAAS,EACP,EACA,EACkC,CAClC,IAAM,EAAY,IAAI,IAChB,EAAe,CAAC,GAAG,EAAO,SAAS,CAAC,CAAC,MAAM,CAAC,GAAO,CAAC,KAAW,EAAM,OAAS,EAAK,OAAO,CAChG,IAAK,IAAM,KAAY,EAAU,OAAQ,CACvC,GAAI,EAAS,OAAS,QAAS,CAC7B,EAAU,IAAI,EAAS,UAAiB,EAAS,OAAsB,EAAS,QAAyB,CACzG,SAEF,IAAI,EAAS,EAAS,KACtB,IAAK,GAAM,CAAC,EAAQ,KAAU,EAC5B,EAAS,EACN,WAAW,EAAc,EAAO,CAAC,KAAM,GAAG,EAAM,MAAM,CACtD,WAAW,EAAsB,EAAO,CAAE,EAAM,CAChD,WAAW,EAAQ,EAAM,CAE9B,EAAU,IAAI,EAAS,SAAU,EAAO,CAE1C,OAAO,EAGT,SAAS,EACP,EACA,EACA,EACA,EACA,EACM,CACN,IAAM,EAAoB,CAAC,GAAG,EAAO,CAClC,IAAI,EAAY,CAChB,OAAQ,GAAqC,IAAU,IAAA,GAAU,CACjE,MAAM,EAAM,IAAU,EAAK,KAAK,cAAc,EAAM,KAAK,CAAC,CAC7D,EACE,EACA,GAAG,KAAK,UACN,CAAE,QAAS,MAAmB,UAAS,SAAQ,UAAW,CAAC,GAAG,EAAU,CAAC,MAAM,CAAE,OAAQ,EAAmB,CAC5G,KACA,EACD,CAAC,IACH,CAGH,SAAS,EACP,EACA,EACA,EACA,EACQ,CACR,IAAM,EAAS,EAAuB,EAAO,EAAgB,CACvD,EAAS,IAAI,IAAI,EAAM,aAAa,QAAQ,CAAC,CAGnD,OADA,EAAsB,EAAc,EAAS,EAD3B,EAAM,SAAS,UAAU,IAAK,GAAa,EAAK,KAAK,EAAiB,EAAS,KAAK,CACxC,CAAE,EAAO,CAChE,EAIT,SAAgB,EAAgB,EAAoC,CAClE,OAAO,EAAW,SAAS,CACxB,OAAO,MAAkB,CACzB,OAAO,KAAK,UAAU,EAAQ,IAAK,GAAU,EAAK,QAAQ,EAAM,CAAC,CAAC,CAAC,CACnE,OAAO,MAAM,CACb,MAAM,EAAG,GAAY,CAG1B,SAAS,EAAmB,EAAoC,CAC9D,IAAM,EAAS,EAAqB,EAAwB,CAC5D,GAAI,CAAC,EAAQ,MAAU,MAAM,kBAAkB,IAA0B,CACzE,IAAM,EAAU,EAAQ,IAAK,GAAU,gBAAgB,KAAK,UAAU,EAAsB,EAAM,CAAC,CAAC,GAAG,CACjG,EAAQ,EAAQ,IAAK,GAAU,KAAK,UAAU,EAAM,CAAC,CAC3D,MAAO,CACL,uCAAuC,KAAK,UAAU,EAAsB,EAAO,CAAC,CAAC,GACrF,oBAAoB,EAAQ,KAAK,IAAI,CAAC,IACtC,kBAAkB,EAAM,KAAK,IAAI,CAAC,IAClC,oDACA,gEACA,oHACA,8GACA,IACA,yDACA,wFACA,0EACA,2CACA,YACA,wCACA,yDACA,0BACA,wBACA,yDACA,0BACA,QACA,SACA,6DACA,uCACA,gCACA,2CACA,YACA,2CACA,oGACA,8DACA,0DACA,wBACA,0DACA,QACA,MACA,IACD,CAAC,KAAK;EAAK,CAGd,SAAS,EAAsB,EAAwB,CAGrD,OAAO,EAAK,QAAQ,EAAO,CAAC,MAAM,EAAK,IAAI,CAAC,KAAK,IAAI,CAGvD,SAAS,GAAoB,EAAqB,CAChD,MAAO,CACL,KAAM,oBACN,MAAM,UAEJ,EACA,EACA,EACmD,CACnD,GAAI,IAAc,EAAmB,OAAO,KAC5C,GAAI,EAAc,IAAI,EAAU,EAAI,EAAU,WAAW,QAAQ,CAC/D,MAAO,CAAE,GAAI,EAAW,SAAU,GAAM,CAG1C,GAAI,EAAK,WAAW,EAAU,CAAE,CAC9B,IAAM,EAAO,EAAoB,EAAU,CAK3C,OAJI,IAAS,EAAgB,IAAI,EAAK,EAAI,EAAgB,IAAI,EAAK,EAAI,EAA0B,IAAI,EAAK,GACxG,EAAO,IAAI,EAAU,CACd,CAAE,GAAI,EAAW,SAAU,GAAM,EAEnC,KAET,GAAI,EAAU,WAAW,IAAI,CAAE,OAAO,KAEtC,IAAM,EAAU,EAAY,EAAU,CAChC,EAAO,EAAc,EAAQ,CACnC,GAAI,GAAQ,EAAgB,IAAI,EAAK,CAAE,CACrC,IAAM,EAAS,EAAqB,EAAQ,CAC5C,GAAI,EAEF,OADA,EAAO,IAAI,EAAO,CACX,CAAE,GAAI,EAAQ,SAAU,GAAM,CAGzC,GAAI,IAAS,UAAW,CACtB,IAAM,EAAU,EAA2B,EAAQ,CACnD,GAAI,EAEF,OADA,EAAO,IAAI,EAAQ,CACZ,CAAE,GAAI,EAAS,SAAU,GAAM,CAG1C,GAAI,IAAS,EAAgB,IAAI,EAAK,EAAI,EAA0B,IAAI,EAAK,EAAG,CAC9E,IAAM,EAAW,MAAM,KAAK,QAAQ,EAAS,EAAU,EAAQ,CAC/D,GAAI,EAEF,OADA,EAAO,IAAI,EAAS,GAAG,CAChB,CAAE,GAAI,EAAS,GAAI,SAAU,GAAM,CAG9C,OAAO,MAEV,CAGH,SAAS,GAAe,EAAqB,CAC3C,MAAO,CACL,KAAM,kBACN,KAAK,EAAkB,CAErB,OADI,EAAK,WAAW,EAAG,EAAI,EAAG,WAAW,EAAG,EAAE,EAAO,IAAI,EAAG,CACrD,MAEV,CAIH,SAAS,GAAqB,EAAkB,EAAkB,EAAmC,CAC/F,EAAI,OAAS,qBAAqB,EAAQ,QAAS,EAAI,CAQ7D,SAAS,EAAS,EAAkD,CAClE,OAAO,OAAO,GAAU,YAAY,GAAkB,CAAC,MAAM,QAAQ,EAAM,CAG7E,SAAS,EAA2B,EAAgB,EAA6B,CAC/E,GAAI,MAAM,QAAQ,EAAM,CAAE,CACxB,IAAK,IAAM,KAAQ,EAAO,EAA2B,EAAM,EAAO,CAClE,OAEF,GAAI,CAAC,EAAS,EAAM,CAAE,OAEtB,IAAM,EAAS,EAAM,OACf,EAAW,EAAM,SACvB,GACE,EAAM,OAAS,oBACf,EAAM,WAAa,IACnB,OAAO,EAAM,OAAU,UACvB,OAAO,EAAM,KAAQ,UACrB,EAAS,EAAO,EAChB,EAAO,OAAS,gBAChB,EAAS,EAAO,KAAK,EACrB,EAAO,KAAK,OAAS,UACrB,EAAS,EAAO,SAAS,EACzB,EAAO,SAAS,OAAS,QACzB,EAAS,EAAS,EAClB,EAAS,OAAS,MAClB,CACA,EAAO,KAAK,CAAE,MAAO,EAAM,MAAO,IAAK,EAAM,IAAK,CAAC,CACnD,OAGF,IAAK,IAAM,KAAS,OAAO,OAAO,EAAM,CAAE,EAA2B,EAAO,EAAO,CAIrF,SAAS,IAAwB,CAC/B,MAAO,CACL,KAAM,gCACN,UAIE,EACA,EACe,CACf,GAAI,CAAC,EAAK,WAAW,EAAG,EAAI,CAAC,EAAO,SAAS,kBAAkB,CAAE,OAAO,KACxE,IAAM,EAAY,EAAK,QAAQ,EAAG,CAAC,aAAa,CAC1C,EAAO,IAAc,OAAS,MAAQ,IAAc,OAAS,MAAQ,EAAkB,EAAG,CAAG,KAAO,KACpG,EAAwB,EAAE,CAEhC,GADA,EAA2B,KAAK,MAAM,EAAQ,CAAE,OAAM,CAAC,CAAE,EAAO,CAC5D,EAAO,SAAW,EAAG,OAAO,KAChC,IAAM,EAAc,KAAK,UAAU,EAAc,EAAG,CAAC,KAAK,CACtD,EAAc,EAClB,IAAK,IAAM,KAAS,EAAO,MAAM,EAAM,IAAU,EAAM,MAAQ,EAAK,MAAM,CACxE,EAAc,GAAG,EAAY,MAAM,EAAG,EAAM,MAAM,GAAG,IAAc,EAAY,MAAM,EAAM,IAAI,GAEjG,OAAO,GAEV,CAIH,SAAgB,EACd,EACA,EACA,EAAsC,EAAE,CAChC,CAER,IAAM,EAAM,EADO,EAAQ,IAAK,GAAU,EAAK,QAAQ,EAAM,CACvB,CAAC,CACjC,EAAkB,EAAK,QAAQ,EAAQ,iBAAmB,EAAK,KAAK,EAAgB,EAAc,CAAC,CACnG,EAAa,EAAe,EAAQ,YAAc,WAAW,CAI7D,EAAY,EAAW,SAAS,CAAC,OAAO,EAAgB,CAAC,OAAO,EAAW,CAAC,OAAO,MAAM,CAAC,MAAM,EAAG,GAAY,CACrH,OAAO,EAAK,KAAK,EAAgB,EAAe,GAAG,EAAI,GAAG,SAA8B,CAU1F,eAAsB,GACpB,EACA,EACA,EAAsC,EAAE,CACvB,CACjB,GAAI,EAAQ,SAAW,EAAG,MAAU,MAAM,wCAAwC,CAClF,IAAM,EAAa,EAAQ,IAAK,GAAU,EAAK,QAAQ,EAAM,CAAC,CACxD,EAAe,EAAK,KAAK,EAAgB,EAAc,CAC7D,EAAG,UAAU,EAAc,CAAE,UAAW,GAAM,CAAC,CAC/C,IAAM,EAAkB,EAAK,QAAQ,EAAQ,iBAAmB,EAAa,CACvE,EAAa,EAAe,EAAQ,YAAc,WAAW,CACnE,EAAG,UAAU,EAAiB,CAAE,UAAW,GAAM,CAAC,CAClD,IAAM,EAAe,EAAyB,EAAY,EAAgB,EAAQ,CAC5E,EAAW,GAAgB,EAAa,CAC9C,GAAI,GAAY,GAAgB,EAAU,EAAW,CAAE,OAAO,EAAS,OAEvE,IAAM,EAAW,SAAyE,CACxF,IAAM,EAAS,IAAI,IAAI,EAAW,CAC5B,EAAS,EAAmB,EAAW,CACvC,CAAE,YAAa,MAAM,OAAO,YAC5B,EAAQ,MAAM,EAAS,CAC3B,MAAO,EACP,SAAU,OACV,QAAS,CACP,CACE,KAAM,iBACN,UAAU,EAA2B,CACnC,OAAO,IAAO,EAAoB,EAAK,MAEzC,KAAK,EAA2B,CAC9B,OAAO,IAAO,EAAoB,EAAS,MAE9C,CACD,GAAoB,EAAO,CAC3B,IAAuB,CACvB,GAAe,EAAO,CACvB,CACD,MAAO,GACR,CAAC,CACF,GAAI,CACF,MAAO,CACL,UAAW,MAAM,EAAM,SAAS,EAAmB,GAAG,EAAW,YAAwB,IAAkB,CAAC,CAC5G,SACD,QACO,CACR,MAAM,EAAM,OAAO,GAIjB,EAAiB,EAAQ,eAAiB,EAAc,EAAQ,eAAe,CAAG,IAAA,GAExF,GAAI,GAAkB,EAAQ,qBAAsB,CAElD,IAAM,EAAY,EADK,EAAW,IAAK,GAAU,EAAa,EAAO,EAAe,CACpC,CAAE,EAAW,CACvD,EAAgB,GACpB,EAAwB,EAAO,EAAe,CAChD,OAAO,EAAoB,EAAQ,qBAAsB,EAAW,SAAY,CAC9E,IAAM,EAAS,EAAgB,EAAQ,qBAAgC,EAAW,EAAa,CAC/F,GAAI,EAAQ,OAAO,EAAqB,EAAQ,EAAiB,EAAc,EAAW,CAE1F,GAAM,CAAE,YAAW,UAAW,MAAM,GAAU,CACxC,EAAY,EAAgB,EAAQ,EAAe,CACnD,EAAY,EAA0B,EAAW,EAAU,SAAS,CAC1E,GACE,CAAC,GAAG,EAAU,QAAQ,CAAC,CAAC,KAAM,GAAa,OAAO,GAAa,UAAY,EAAS,SAAS,EAAe,CAAC,CAE7G,MAAU,MAAM,iFAAiF,CAEnG,IAAM,EAAQ,EAAU,OAAO,KAAM,GAAa,EAAS,OAAS,SAAW,EAAS,QAAQ,CAChG,GAAI,CAAC,EAAO,MAAU,MAAM,8CAA8C,CAC1E,EAAmB,CACjB,eAAgB,EAAQ,qBACxB,YACA,MAAO,EAAM,SACb,OAAQ,EAAU,OAClB,YACD,CAAC,CACF,IAAM,EAAY,EAAgB,EAAQ,qBAAgC,EAAW,EAAa,CAClG,GAAI,CAAC,EAAW,MAAU,MAAM,+CAA+C,CAC/E,OAAO,EAAqB,EAAW,EAAiB,EAAc,EAAW,EACjF,CAGJ,GAAM,CAAE,YAAW,UAAW,MAAM,GAAU,CACxC,EAAW,EAAmB,EAAW,EAAgB,CAE/D,OADA,EAAsB,EAAc,EAAY,EAAS,MAAO,EAAS,UAAW,EAAO,CACpF,EAAS"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`./syncLocation.cjs`),n=require(`./modules/moduleResolution.cjs`);require(`../utils/index.cjs`);const r=require(`../services/extensionAssembler.cjs`),i=require(`./telemetry/logSinkTelemetry.cjs`);require(`../services/config/index.cjs`);const a=require(`./mcpFilter.cjs`),o=require(`./pluginMaterializer.cjs`),s=require(`./resourceCollector.cjs`);let c=require(`node:path`);c=e.__toESM(c,1);let l=require(`node:fs`);l=e.__toESM(l,1);let u=require(`node:os`);u=e.__toESM(u,1);let d=require(`@agimon-ai/doompi-mcp`),f=require(`@agimon-ai/doompi-config/profiles`),p=require(`@agimon-ai/doompi-config/majorModes`),m=require(`@agimon-ai/doompi-config/domains`),h=require(`@agimon-ai/doompi-ui/theme`),g=require(`@agimon-ai/doompi-config/harnessStore`);const _=`ollama`,v=`resolve_config`,y=`collect_resources`;function b(e,t){if(e.preset===`kimi`&&(!t.KIMI_API_KEY&&t.KIMI_CODE_API_KEY&&(t.KIMI_API_KEY=t.KIMI_CODE_API_KEY),!t.KIMI_API_KEY))throw Error(`KIMI_API_KEY or KIMI_CODE_API_KEY is required for the kimi preset`);if(e.preset===_){if((e.piArgs.find(e=>e.startsWith(`${_}/`))?.endsWith(`:cloud`)??!1)&&!t.OLLAMA_API_KEY)throw Error(`OLLAMA_API_KEY is required for Ollama cloud models`);t.OLLAMA_API_KEY||=_,t.DOOMPI_OLLAMA_BASE_URL=t.OLLAMA_BASE_URL??t.ANTHROPIC_BASE_URL??`http://localhost:11434/v1`}}function x(e,t,n){return(0,d.sessionConfigEnvironment)({repoRoot:e.repoRoot,stagingDirectory:t.temporaryDirectory,...t.pluginMcpConfigPaths.length>0?{pluginConfigPaths:t.pluginMcpConfigPaths}:{},...n?{allowlist:n}:{}})}function S(e){return e.profile?(0,f.resolveProfile)(e.repoRoot,e.profile):void 0}async function C(e,d=i.createHarnessTelemetry()){let _=await d.runInSpan(`doom_pi.${v}`,{"harness.phase":v},async()=>{let t=(0,p.loadMajorModesConfig)(e.repoRoot),n=r.filterHookDisabledLayers((0,p.resolveLayers)(t,e.majorMode),e.hooks),i=S(e);if(!l.default.existsSync(e.cwd)||!l.default.statSync(e.cwd).isDirectory())throw Error(`Working directory does not exist: ${e.cwd}`);return{majorModesConfig:t,selectedLayers:n,hookGroups:(0,p.layerHookGroups)(t,n),profile:i,plugins:await o.materializePluginEntries((0,m.resolvePluginEntries)(e.repoRoot,e.domains,e.pluginDirectories)),mcpAllowlist:a.resolveMcpAllowlist(e.repoRoot,e.domains),sharedSkills:(0,m.resolveSharedSkills)(e.repoRoot,e.domains)}}).catch(async t=>{throw await d.recordError(i.HARNESS_EVENT.configLoadFailed,t,{"harness.phase":v,"harness.major_mode":e.majorMode,"harness.domain_count":e.domains.length}),t}),{majorModesConfig:C,selectedLayers:w,hookGroups:T,profile:E,plugins:D,mcpAllowlist:O}=_,k=E?.persona,A=E?.personaRoot??e.repoRoot,j=n.optionalPackageEntry(r.CONTEXT_PACKAGES.workflow),M=n.optionalPackageEntry(r.CONTEXT_PACKAGES.dispatcherWorkflow),N=await d.runInSpan(`doom_pi.${y}`,{"harness.plugin.count":D.length,"harness.agents":e.agents,"harness.mcp":e.mcp},()=>s.collectResources(e.repoRoot,D,{agents:e.agents,mcp:e.mcp,temporaryDirectory:e.resourceDirectory,skillCacheDirectory:c.default.join(e.resourceDirectory??t.resolveSyncLocation(e.repoRoot,e.homeDirectory??u.default.homedir()).directory,`cache`,`skills`),workflowExtension:j,dispatcherWorkflowExtension:M,mcpAllowlist:O,sharedSkills:_.sharedSkills})).catch(async e=>{throw await d.recordError(i.HARNESS_EVENT.resourceCollectionFailed,e,{"harness.phase":y,"harness.plugin.count":D.length}),e});try{let t=s.selectWorkflowExtensionForProcess(j,N.dispatcherWorkflowExtensionPath),i=await(0,h.writeDefaultTheme)(N.temporaryDirectory),a={...process.env},o=(0,f.applyProfileEnvironment)(a,E?.env??{});b(e,a),a.NX_DAEMON??=`false`,a.DOOMPI_THEME||=h.DEFAULT_THEME_NAME,a.CLAUDE_PROJECT_DIR=e.repoRoot,a.CODEX_REPO_ROOT=e.repoRoot,a.ORIGINAL_REPO_PATH||=e.repoRoot,a.MCP_UI_VIEWER=e.automation?`none`:a.MCP_UI_VIEWER??``;let u=n.ownEntry(r.PERSONA_ENTRY),d=k?(0,f.buildPersonaPrompt)(A,k):void 0,p;d&&(p=c.default.join(N.temporaryDirectory,`persona.md`),await l.default.promises.writeFile(p,`${d}\n`,{mode:384}));let m=e.mcp?n.packageEntry(r.CONTEXT_PACKAGES.mcp):void 0;return m&&Object.assign(a,x(e,N,O)),(0,g.createHarnessSession)({root:e.repoRoot,majorMode:e.majorMode,temporaryDirectory:N.temporaryDirectory,domains:e.domains,layers:w,profile:E?.name,profileEnvironment:o,personaFile:p,skillDirectories:N.skillDirectories,agentDirectories:N.agentDirectories,additionalDirectories:e.additionalDirectories,childExtensions:[],pluginDirectories:e.pluginDirectories,pluginHooks:N.pluginHooks,hookGroups:T,hooks:e.hooks,agents:e.agents,mcp:e.mcp,mcpConfigPath:N.mcpConfigPath,allowProtectedWrites:e.allowProtectedWrites,workflowExtension:j},{directory:N.temporaryDirectory,environment:a}),e.agents&&(a.PI_SUBAGENT_EXTRA_AGENT_DIRS=N.agentDirectories.join(c.default.delimiter),a.PI_SUBAGENT_EXTRA_SKILL_DIRS=N.skillDirectories.join(c.default.delimiter),a.PI_SUBAGENT_PI_BINARY=c.default.join(e.repoRoot,`pi.sh`)),{options:e,environment:a,resources:N,plugins:D,profile:E?.name,personaDirectory:k,personaRoot:A,mcpAllowlist:O,majorModesConfig:C,selectedLayers:w,hookGroups:T,mcpEntry:m,personaEntry:u,workflowExtension:t,defaultThemePath:i,cleanup:N.cleanup.bind(N)}}catch(t){throw await d.recordError(i.HARNESS_EVENT.contextBuildFailed,t,{"harness.phase":`build_context`,"harness.major_mode":e.majorMode,...E?.name?{"harness.profile":E.name}:{}}),await N.cleanup(),t}}exports.buildHarnessContext=C,exports.configurePreset=b,exports.mcpSessionEnvironment=x,exports.resolveHarnessProfile=S;
2
+ //# sourceMappingURL=harnessContext.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harnessContext.cjs","names":["createHarnessTelemetry","filterHookDisabledLayers","fs","materializePluginEntries","resolveMcpAllowlist","HARNESS_EVENT","optionalPackageEntry","CONTEXT_PACKAGES","collectResources","path","resolveSyncLocation","os","selectWorkflowExtensionForProcess","DEFAULT_THEME_NAME","ownEntry","PERSONA_ENTRY","packageEntry"],"sources":["../../src/adapters/harnessContext.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { sessionConfigEnvironment } from '@agimon-ai/doompi-mcp';\nimport {\n createHarnessTelemetry,\n HARNESS_EVENT,\n type HarnessTelemetry,\n} from '../adapters/telemetry/logSinkTelemetry.ts';\nimport {\n type AgentProfile,\n applyProfileEnvironment,\n buildPersonaPrompt,\n createHarnessSession,\n DEFAULT_THEME_NAME,\n type DomainMcpAllowlist,\n layerHookGroups,\n loadMajorModesConfig,\n type MajorModesConfig,\n type PluginEntry,\n resolveLayers,\n resolvePluginEntries,\n resolveProfile,\n resolveSharedSkills,\n writeDefaultTheme,\n} from '../services/config/index.ts';\nimport { CONTEXT_PACKAGES, filterHookDisabledLayers, PERSONA_ENTRY } from '../services/extensionAssembler.ts';\nimport type { HarnessOptions, HarnessResources } from '../types/interfaces/index.ts';\nimport { optionalPackageEntry, ownEntry, packageEntry } from '../utils/index.ts';\nimport { resolveMcpAllowlist } from './mcpFilter.ts';\nimport { materializePluginEntries } from './pluginMaterializer.ts';\nimport { collectResources, selectWorkflowExtensionForProcess } from './resourceCollector.ts';\nimport { resolveSyncLocation } from './syncLocation.ts';\n\nconst OLLAMA_PRESET = 'ollama';\nconst PRIVATE_FILE_MODE = 0o600;\nconst RESOLVE_CONFIG_PHASE = 'resolve_config';\nconst COLLECT_RESOURCES_PHASE = 'collect_resources';\nconst BUILD_CONTEXT_PHASE = 'build_context';\n\n/**\n * Everything a command needs, resolved once.\n *\n * All three commands need the same expensive preparation (domains resolved,\n * plugins collected into a temp directory, environment assembled), so it is\n * built here and handed to whichever command runs.\n */\nexport interface HarnessContext {\n options: HarnessOptions;\n environment: NodeJS.ProcessEnv;\n resources: HarnessResources;\n plugins: PluginEntry[];\n profile?: string;\n personaDirectory?: string;\n /** Root personaDirectory resolves against, when a profile supplied one. */\n personaRoot?: string;\n mcpAllowlist?: DomainMcpAllowlist;\n majorModesConfig: MajorModesConfig;\n selectedLayers: string[];\n hookGroups: string[];\n mcpEntry?: string;\n personaEntry?: string;\n workflowExtension?: string;\n defaultThemePath: string;\n cleanup(): Promise<void>;\n}\n\n/**\n * Applies the provider environment a preset needs.\n *\n * Exported because the synced Pi path has no launcher to do it: the doom-pi\n * extension applies the same rules in-process before anything reads them.\n * `piArgs` is only consulted to spot a selected cloud model.\n */\nexport function configurePreset(\n options: Pick<HarnessOptions, 'preset' | 'piArgs'>,\n environment: NodeJS.ProcessEnv,\n): void {\n if (options.preset === 'kimi') {\n if (!environment.KIMI_API_KEY && environment.KIMI_CODE_API_KEY) {\n environment.KIMI_API_KEY = environment.KIMI_CODE_API_KEY;\n }\n if (!environment.KIMI_API_KEY) {\n throw new Error('KIMI_API_KEY or KIMI_CODE_API_KEY is required for the kimi preset');\n }\n }\n if (options.preset === OLLAMA_PRESET) {\n const selected = options.piArgs.find((argument) => argument.startsWith(`${OLLAMA_PRESET}/`));\n const cloud = selected?.endsWith(':cloud') ?? false;\n if (cloud && !environment.OLLAMA_API_KEY) {\n throw new Error('OLLAMA_API_KEY is required for Ollama cloud models');\n }\n environment.OLLAMA_API_KEY ||= OLLAMA_PRESET;\n environment.DOOMPI_OLLAMA_BASE_URL =\n environment.OLLAMA_BASE_URL ?? environment.ANTHROPIC_BASE_URL ?? 'http://localhost:11434/v1';\n }\n}\n\n/**\n * Describes this run's MCP configuration for the doom-mcp extension.\n *\n * The extension runs inside the Pi child process and reads the layers itself, so\n * mcp-proxy owns discovery and merging. What travels here is only what the child\n * cannot work out on its own: which plugins this run selected, and the domain\n * allowlist. The merged config doom-pi writes is for external frontends.\n */\nexport function mcpSessionEnvironment(\n options: Pick<HarnessOptions, 'repoRoot'>,\n resources: HarnessResources,\n allowlist: DomainMcpAllowlist | undefined,\n): Record<string, string> {\n return sessionConfigEnvironment({\n repoRoot: options.repoRoot,\n stagingDirectory: resources.temporaryDirectory,\n ...(resources.pluginMcpConfigPaths.length > 0 ? { pluginConfigPaths: resources.pluginMcpConfigPaths } : {}),\n ...(allowlist ? { allowlist } : {}),\n });\n}\n\n/** Resolves the optional persona and environment profile selected for this run. */\nexport function resolveHarnessProfile(options: HarnessOptions): AgentProfile | undefined {\n return options.profile ? resolveProfile(options.repoRoot, options.profile) : undefined;\n}\n\n/**\n * Resolves the full matrix and stages every resource Pi will need.\n *\n * The caller owns the returned cleanup(): the temporary directory holding\n * skills, agents, and the generated MCP config has to outlive this function\n * and be removed once the selected command is done with it.\n */\nexport async function buildHarnessContext(\n options: HarnessOptions,\n telemetry: HarnessTelemetry = createHarnessTelemetry(),\n): Promise<HarnessContext> {\n // Everything up to collectResources reads configuration off disk, so a single\n // malformed modes.yaml or profiles.yaml surfaces here as a failed launch\n // with no other record.\n const configured = await telemetry\n .runInSpan(`doom_pi.${RESOLVE_CONFIG_PHASE}`, { 'harness.phase': RESOLVE_CONFIG_PHASE }, async () => {\n const majorModesConfig = loadMajorModesConfig(options.repoRoot);\n const selectedLayers = filterHookDisabledLayers(\n resolveLayers(majorModesConfig, options.majorMode),\n options.hooks,\n );\n const profile = resolveHarnessProfile(options);\n if (!fs.existsSync(options.cwd) || !fs.statSync(options.cwd).isDirectory()) {\n throw new Error(`Working directory does not exist: ${options.cwd}`);\n }\n return {\n majorModesConfig,\n selectedLayers,\n hookGroups: layerHookGroups(majorModesConfig, selectedLayers),\n profile,\n plugins: await materializePluginEntries(\n resolvePluginEntries(options.repoRoot, options.domains, options.pluginDirectories),\n ),\n mcpAllowlist: resolveMcpAllowlist(options.repoRoot, options.domains),\n sharedSkills: resolveSharedSkills(options.repoRoot, options.domains),\n };\n })\n .catch(async (error: unknown) => {\n await telemetry.recordError(HARNESS_EVENT.configLoadFailed, error, {\n 'harness.phase': RESOLVE_CONFIG_PHASE,\n 'harness.major_mode': options.majorMode,\n 'harness.domain_count': options.domains.length,\n });\n throw error;\n });\n\n const { majorModesConfig, selectedLayers, hookGroups, profile, plugins, mcpAllowlist } = configured;\n const personaDirectory = profile?.persona;\n // A global profile's persona lives beside the global config, not in the repo.\n const personaRoot = profile?.personaRoot ?? options.repoRoot;\n const workflowExtension = optionalPackageEntry(CONTEXT_PACKAGES.workflow);\n const dispatcherWorkflowExtension = optionalPackageEntry(CONTEXT_PACKAGES.dispatcherWorkflow);\n const resources = await telemetry\n .runInSpan(\n `doom_pi.${COLLECT_RESOURCES_PHASE}`,\n { 'harness.plugin.count': plugins.length, 'harness.agents': options.agents, 'harness.mcp': options.mcp },\n () =>\n collectResources(options.repoRoot, plugins, {\n agents: options.agents,\n mcp: options.mcp,\n // Set by `doom-pi sync`, which stages into a directory that outlives\n // the process rather than a temporary one.\n temporaryDirectory: options.resourceDirectory,\n skillCacheDirectory: path.join(\n options.resourceDirectory ??\n resolveSyncLocation(options.repoRoot, options.homeDirectory ?? os.homedir()).directory,\n 'cache',\n 'skills',\n ),\n workflowExtension,\n dispatcherWorkflowExtension,\n mcpAllowlist,\n sharedSkills: configured.sharedSkills,\n }),\n )\n .catch(async (error: unknown) => {\n // Conflicting skills, agents, or MCP servers all fail here, and the plugin\n // that caused it is only identifiable from the message.\n await telemetry.recordError(HARNESS_EVENT.resourceCollectionFailed, error, {\n 'harness.phase': COLLECT_RESOURCES_PHASE,\n 'harness.plugin.count': plugins.length,\n });\n throw error;\n });\n\n try {\n const activeWorkflowExtension = selectWorkflowExtensionForProcess(\n workflowExtension,\n resources.dispatcherWorkflowExtensionPath,\n );\n const defaultThemePath = await writeDefaultTheme(resources.temporaryDirectory);\n const environment = { ...process.env };\n const profileEnvironment = applyProfileEnvironment(environment, profile?.env ?? {});\n\n configurePreset(options, environment);\n environment.NX_DAEMON ??= 'false';\n environment.DOOMPI_THEME ||= DEFAULT_THEME_NAME;\n environment.CLAUDE_PROJECT_DIR = options.repoRoot;\n environment.CODEX_REPO_ROOT = options.repoRoot;\n environment.ORIGINAL_REPO_PATH ||= options.repoRoot;\n environment.MCP_UI_VIEWER = options.automation ? 'none' : (environment.MCP_UI_VIEWER ?? '');\n\n // Always loaded, even with no persona at launch: the extension no-ops\n // without a persona file, and /profile needs it present to load one later.\n // Pi freezes the --extension list at startup, so it cannot be added on demand.\n const personaEntry = ownEntry(PERSONA_ENTRY);\n const personaPrompt = personaDirectory ? buildPersonaPrompt(personaRoot, personaDirectory) : undefined;\n let personaFile: string | undefined;\n if (personaPrompt) {\n personaFile = path.join(resources.temporaryDirectory, 'persona.md');\n await fs.promises.writeFile(personaFile, `${personaPrompt}\\n`, { mode: PRIVATE_FILE_MODE });\n }\n\n // doom-mcp is a normal package entry rather than generated code: it reads the\n // repository and plugin layers itself, so there is nothing to codegen a path\n // into. `--no-mcp` still gates by leaving the entry out of the list.\n const mcpEntry = options.mcp ? packageEntry(CONTEXT_PACKAGES.mcp) : undefined;\n if (mcpEntry) Object.assign(environment, mcpSessionEnvironment(options, resources, mcpAllowlist));\n\n // One write, describing the child rather than this process. The state file\n // is the child's authority and the environment is what it projects for the\n // hooks and packages that can only read an environment.\n createHarnessSession(\n {\n root: options.repoRoot,\n majorMode: options.majorMode,\n temporaryDirectory: resources.temporaryDirectory,\n domains: options.domains,\n layers: selectedLayers,\n profile: profile?.name,\n profileEnvironment,\n personaFile,\n skillDirectories: resources.skillDirectories,\n agentDirectories: resources.agentDirectories,\n additionalDirectories: options.additionalDirectories,\n childExtensions: [],\n pluginDirectories: options.pluginDirectories,\n pluginHooks: resources.pluginHooks,\n hookGroups,\n hooks: options.hooks,\n agents: options.agents,\n mcp: options.mcp,\n mcpConfigPath: resources.mcpConfigPath,\n allowProtectedWrites: options.allowProtectedWrites,\n workflowExtension,\n },\n { directory: resources.temporaryDirectory, environment },\n );\n if (options.agents) {\n environment.PI_SUBAGENT_EXTRA_AGENT_DIRS = resources.agentDirectories.join(path.delimiter);\n environment.PI_SUBAGENT_EXTRA_SKILL_DIRS = resources.skillDirectories.join(path.delimiter);\n environment.PI_SUBAGENT_PI_BINARY = path.join(options.repoRoot, 'pi.sh');\n }\n\n // Core hook groups load regardless; hookGroups selects the rest. The initial\n // state write includes an empty list deliberately: unset means every group.\n\n return {\n options,\n environment,\n resources,\n plugins,\n profile: profile?.name,\n personaDirectory,\n personaRoot,\n mcpAllowlist,\n majorModesConfig,\n selectedLayers,\n hookGroups,\n mcpEntry,\n personaEntry,\n workflowExtension: activeWorkflowExtension,\n defaultThemePath,\n cleanup: resources.cleanup.bind(resources),\n };\n } catch (error) {\n // Preparation failed after the temp directory existed, so nothing will be\n // handed back to clean it up.\n await telemetry.recordError(HARNESS_EVENT.contextBuildFailed, error, {\n 'harness.phase': BUILD_CONTEXT_PHASE,\n 'harness.major_mode': options.majorMode,\n ...(profile?.name ? { 'harness.profile': profile.name } : {}),\n });\n await resources.cleanup();\n throw error;\n }\n}\n"],"mappings":"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"}