@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,61 @@
1
+ import { SkillSourceEntry } from "./skillSources.mjs";
2
+ import { Skill } from "@earendil-works/pi-coding-agent";
3
+
4
+ //#region src/adapters/skillCatalog.d.ts
5
+ type SkillGroupKey = 'extensions' | 'help' | 'plugins' | 'default';
6
+ interface SkillEntry {
7
+ name: string;
8
+ description: string;
9
+ filePath: string;
10
+ baseDir: string;
11
+ group: SkillGroupKey;
12
+ /** Package name for an extension, plugin directory name, or `.claude/skills`. */
13
+ owner: string;
14
+ modelInvocable: boolean;
15
+ }
16
+ interface SkillOwnerNode {
17
+ owner: string;
18
+ skills: SkillEntry[];
19
+ }
20
+ interface SkillGroup {
21
+ key: SkillGroupKey;
22
+ label: string;
23
+ owners: SkillOwnerNode[];
24
+ }
25
+ interface SkillCatalog {
26
+ groups: SkillGroup[];
27
+ skillCount: number;
28
+ /** Tokens the `<available_skills>` prompt block costs on every request. */
29
+ promptTokens: number;
30
+ /** Tokens every loaded SKILL.md costs in full, if all of them were read. */
31
+ bodyTokens: number;
32
+ /** Frontmatter and read failures, surfaced instead of thrown. */
33
+ diagnostics: string[];
34
+ }
35
+ interface SkillCatalogOptions {
36
+ repoRoot: string;
37
+ /** Exact files the current selection resolved to, from `HarnessState.skillDirectories`. */
38
+ activeSkillDirectories: readonly string[];
39
+ extensionSources: readonly SkillSourceEntry[];
40
+ /** Activation-gated wrappers already accepted by the merged active-skill view. */
41
+ helpSkills?: readonly Skill[];
42
+ /** Bounded Help activation and collision diagnostics. */
43
+ helpDiagnostics?: readonly string[];
44
+ }
45
+ declare function counter(): Promise<(text: string) => number>;
46
+ /**
47
+ * Every skill this session actually loaded, grouped by where it comes from,
48
+ * priced in tokens.
49
+ *
50
+ * Discovery runs over `loadSkillsFromDir` from Pi rather than the harness's own
51
+ * walker so the listing matches what Pi would load, including its ignore-file
52
+ * handling; the same skills are then handed to Pi's `formatSkillsForPrompt` so
53
+ * the always-on figure is the real prompt block rather than a reconstruction of
54
+ * it.
55
+ */
56
+ declare function buildSkillCatalog(options: SkillCatalogOptions): Promise<SkillCatalog>;
57
+ /** The skills a name resolves to, used to decide what `enter` can invoke. */
58
+ declare function findSkill(catalog: SkillCatalog, name: string): SkillEntry | undefined;
59
+ //#endregion
60
+ export { SkillCatalog, SkillCatalogOptions, SkillEntry, SkillGroup, SkillGroupKey, SkillOwnerNode, buildSkillCatalog, counter, findSkill };
61
+ //# sourceMappingURL=skillCatalog.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillCatalog.d.mts","names":[],"sources":["../../src/adapters/skillCatalog.ts"],"mappings":";;;;KAUY,aAAA;AAAA,UAEK,UAAA;EACf,IAAA;EACA,WAAA;EACA,QAAA;EACA,OAAA;EACA,KAAA,EAAO,aAAA;EALQ;EAOf,KAAA;EACA,cAAA;AAAA;AAAA,UAGe,cAAA;EACf,KAAA;EACA,MAAA,EAAQ,UAAA;AAAA;AAAA,UAGO,UAAA;EACf,GAAA,EAAK,aAAA;EACL,KAAA;EACA,MAAA,EAAQ,cAAA;AAAA;AAAA,UAGO,YAAA;EACf,MAAA,EAAQ,UAAA;EACR,UAAA;;EAEA,YAAA;EAdA;EAgBA,UAAA;EAfQ;EAiBR,WAAA;AAAA;AAAA,UAGe,mBAAA;EACf,QAAA;;EAEA,sBAAA;EACA,gBAAA,WAA2B,gBAAA;EApBtB;EAsBL,UAAA,YAAsB,KAAA;EApBtB;EAsBA,eAAA;AAAA;AAAA,iBAaoB,OAAA,CAAA,GAAW,OAAA,EAAS,IAAA;AAhC1C;;;;;;;;;;AAAA,iBAkJsB,iBAAA,CAAkB,OAAA,EAAS,mBAAA,GAAsB,OAAA,CAAQ,YAAA;;iBAyD/D,SAAA,CAAU,OAAA,EAAS,YAAA,EAAc,IAAA,WAAe,UAAA"}
@@ -0,0 +1,2 @@
1
+ import{materializePluginEntries as e}from"./pluginMaterializer.mjs";import t from"node:path";import n from"node:fs";import{listDomainNames as r,resolvePluginEntries as i}from"@agimon-ai/doompi-config/domains";import{formatSkillsForPrompt as a,loadSkillsFromDir as o}from"@earendil-works/pi-coding-agent";const s=`skills`,c=`.claude/skills`;let l;async function u(){return l??=import(`gpt-tokenizer`),(await l).countTokens}function d(e){let n=e.map(e=>t.resolve(e));return e=>{let r=t.resolve(e);return n.some(e=>e===r||e.startsWith(`${r}${t.sep}`)||r.startsWith(`${e}${t.sep}`))}}function f(e,n,r,i,a,s,c=`recursive`){let l=o({dir:e,source:r});for(let t of l.diagnostics)s.push(`${t.path??e}: ${t.message}`);let u=t.resolve(e),d=l.skills.filter(e=>{let n=t.dirname(e.filePath);return c===`direct-children`&&t.dirname(n)!==u?!1:i(n)});return a.push(...d),d.map(e=>({name:e.name,description:e.description,filePath:e.filePath,baseDir:e.baseDir,group:n,owner:r,modelInvocable:!e.disableModelInvocation})).sort((e,t)=>e.name.localeCompare(t.name))}function p(e){return e.sort((e,t)=>e.owner.localeCompare(t.owner))}function m(e,t,n){let r=new Set(t.map(e=>e.name)),i=new Map,a=[...e].sort((e,t)=>e.sourceInfo.source.localeCompare(t.sourceInfo.source)||e.name.localeCompare(t.name)||e.filePath.localeCompare(t.filePath));for(let e of a){if(r.has(e.name)){n.push(`Help ${e.sourceInfo.source} [HELP_SKILL_COLLISION]: '${e.name}' was ignored because a normal skill wins.`);continue}r.add(e.name),t.push(e);let a=e.sourceInfo.source,o=i.get(a)??[];o.push({name:e.name,description:e.description,filePath:e.filePath,baseDir:e.baseDir,group:`help`,owner:a,modelInvocable:!e.disableModelInvocation}),i.set(a,o)}return p([...i.entries()].map(([e,t])=>({owner:e,skills:t.sort((e,t)=>e.name.localeCompare(t.name))})))}async function h(o){let{repoRoot:l}=o,h=d(o.activeSkillDirectories),g=[...o.helpDiagnostics??[]],_=[],v=[];for(let e of o.extensionSources){let t=e.directories.flatMap(t=>f(t,`extensions`,e.source,()=>!0,_,g));t.length>0&&v.push({owner:e.source,skills:t})}let y=[],b=await e(i(l,r(l),[]));for(let e of b){let r=t.join(e.directory,s);if(!n.existsSync(r))continue;let i=t.basename(e.directory),a=f(r,`plugins`,i,h,_,g,e.skillDiscovery);a.length>0&&y.push({owner:i,skills:a})}let x=f(t.join(l,`.claude`,s),`default`,c,h,_,g),S=x.length>0?[{owner:c,skills:x}]:[],C=m(o.helpSkills??[],_,g),w=[{key:`extensions`,label:`extensions`,owners:p(v)},{key:`help`,label:`Help`,owners:C},{key:`plugins`,label:`plugins`,owners:p(y)},{key:`default`,label:`default`,owners:S}],T=await u(),E=a(_),D=0;for(let e of _)try{D+=T(n.readFileSync(e.filePath,`utf8`))}catch(t){g.push(`${e.filePath}: ${t instanceof Error?t.message:String(t)}`)}return{groups:w,skillCount:_.length,promptTokens:E?T(E):0,bodyTokens:D,diagnostics:g}}function g(e,t){for(let n of e.groups)for(let e of n.owners){let n=e.skills.find(e=>e.name===t);if(n)return n}}export{h as buildSkillCatalog,u as counter,g as findSkill};
2
+ //# sourceMappingURL=skillCatalog.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillCatalog.mjs","names":[],"sources":["../../src/adapters/skillCatalog.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { listDomainNames, type PluginSkillDiscovery, resolvePluginEntries } from '@agimon-ai/doompi-config/domains';\nimport { formatSkillsForPrompt, loadSkillsFromDir, type Skill } from '@earendil-works/pi-coding-agent';\nimport { materializePluginEntries } from './pluginMaterializer.ts';\nimport type { SkillSourceEntry } from './skillSources.ts';\n\nconst SKILLS_DIRECTORY = 'skills';\nconst SHARED_SKILLS_OWNER = '.claude/skills';\n\nexport type SkillGroupKey = 'extensions' | 'help' | 'plugins' | 'default';\n\nexport interface SkillEntry {\n name: string;\n description: string;\n filePath: string;\n baseDir: string;\n group: SkillGroupKey;\n /** Package name for an extension, plugin directory name, or `.claude/skills`. */\n owner: string;\n modelInvocable: boolean;\n}\n\nexport interface SkillOwnerNode {\n owner: string;\n skills: SkillEntry[];\n}\n\nexport interface SkillGroup {\n key: SkillGroupKey;\n label: string;\n owners: SkillOwnerNode[];\n}\n\nexport interface SkillCatalog {\n groups: SkillGroup[];\n skillCount: number;\n /** Tokens the `<available_skills>` prompt block costs on every request. */\n promptTokens: number;\n /** Tokens every loaded SKILL.md costs in full, if all of them were read. */\n bodyTokens: number;\n /** Frontmatter and read failures, surfaced instead of thrown. */\n diagnostics: string[];\n}\n\nexport interface SkillCatalogOptions {\n repoRoot: string;\n /** Exact files the current selection resolved to, from `HarnessState.skillDirectories`. */\n activeSkillDirectories: readonly string[];\n extensionSources: readonly SkillSourceEntry[];\n /** Activation-gated wrappers already accepted by the merged active-skill view. */\n helpSkills?: readonly Skill[];\n /** Bounded Help activation and collision diagnostics. */\n helpDiagnostics?: readonly string[];\n}\n\n/**\n * The tokenizer, loaded on first use rather than at import.\n *\n * `gpt-tokenizer` carries its whole vocabulary and costs about a tenth of a\n * second to load. This module is reachable from the skills extension, which Pi\n * loads at session start, so a top-level import would charge every session for\n * a surface most of them never open.\n */\nlet tokenizer: Promise<typeof import('gpt-tokenizer')> | undefined;\n\nexport async function counter(): Promise<(text: string) => number> {\n tokenizer ??= import('gpt-tokenizer');\n return (await tokenizer).countTokens;\n}\n\n/**\n * Matches a directory against the active set.\n *\n * A domain that lists a plugin subset puts individual skill directories in the\n * set rather than the plugin's `skills` root, so containment has to be checked\n * both ways: the set may hold an ancestor of the directory, or a descendant of\n * it.\n */\nfunction createActiveMatcher(directories: readonly string[]): (directory: string) => boolean {\n const active = directories.map((directory) => path.resolve(directory));\n return (directory) => {\n const resolved = path.resolve(directory);\n return active.some(\n (entry) =>\n entry === resolved || entry.startsWith(`${resolved}${path.sep}`) || resolved.startsWith(`${entry}${path.sep}`),\n );\n };\n}\n\nfunction collect(\n directory: string,\n group: SkillGroupKey,\n owner: string,\n isActive: (directory: string) => boolean,\n loaded: Skill[],\n diagnostics: string[],\n discovery: PluginSkillDiscovery = 'recursive',\n): SkillEntry[] {\n const result = loadSkillsFromDir({ dir: directory, source: owner });\n for (const diagnostic of result.diagnostics) {\n diagnostics.push(`${diagnostic.path ?? directory}: ${diagnostic.message}`);\n }\n // Checked per skill, not per root: a subset domain selects some of a plugin's\n // skills and leaves the rest on disk, unloaded and therefore not listed.\n const root = path.resolve(directory);\n const kept = result.skills.filter((skill) => {\n const skillDirectory = path.dirname(skill.filePath);\n if (discovery === 'direct-children' && path.dirname(skillDirectory) !== root) return false;\n return isActive(skillDirectory);\n });\n // Kept in their loaded form as well, because the prompt-block cost is measured\n // by handing them back to Pi's own formatter.\n loaded.push(...kept);\n return kept\n .map((skill) => ({\n name: skill.name,\n description: skill.description,\n filePath: skill.filePath,\n baseDir: skill.baseDir,\n group,\n owner,\n modelInvocable: !skill.disableModelInvocation,\n }))\n .sort((left, right) => left.name.localeCompare(right.name));\n}\n\nfunction sortOwners(owners: SkillOwnerNode[]): SkillOwnerNode[] {\n return owners.sort((left, right) => left.owner.localeCompare(right.owner));\n}\n\nfunction collectHelpSkills(skills: readonly Skill[], loaded: Skill[], diagnostics: string[]): SkillOwnerNode[] {\n const occupiedNames = new Set(loaded.map((skill) => skill.name));\n const owners = new Map<string, SkillEntry[]>();\n const candidates = [...skills].sort(\n (left, right) =>\n left.sourceInfo.source.localeCompare(right.sourceInfo.source) ||\n left.name.localeCompare(right.name) ||\n left.filePath.localeCompare(right.filePath),\n );\n for (const skill of candidates) {\n if (occupiedNames.has(skill.name)) {\n diagnostics.push(\n `Help ${skill.sourceInfo.source} [HELP_SKILL_COLLISION]: '${skill.name}' was ignored because a normal skill wins.`,\n );\n continue;\n }\n occupiedNames.add(skill.name);\n loaded.push(skill);\n const owner = skill.sourceInfo.source;\n const entries = owners.get(owner) ?? [];\n entries.push({\n name: skill.name,\n description: skill.description,\n filePath: skill.filePath,\n baseDir: skill.baseDir,\n group: 'help',\n owner,\n modelInvocable: !skill.disableModelInvocation,\n });\n owners.set(owner, entries);\n }\n return sortOwners(\n [...owners.entries()].map(([owner, entries]) => ({\n owner,\n skills: entries.sort((left, right) => left.name.localeCompare(right.name)),\n })),\n );\n}\n\n/**\n * Every skill this session actually loaded, grouped by where it comes from,\n * priced in tokens.\n *\n * Discovery runs over `loadSkillsFromDir` from Pi rather than the harness's own\n * walker so the listing matches what Pi would load, including its ignore-file\n * handling; the same skills are then handed to Pi's `formatSkillsForPrompt` so\n * the always-on figure is the real prompt block rather than a reconstruction of\n * it.\n */\nexport async function buildSkillCatalog(options: SkillCatalogOptions): Promise<SkillCatalog> {\n const { repoRoot } = options;\n const isActive = createActiveMatcher(options.activeSkillDirectories);\n const diagnostics: string[] = [...(options.helpDiagnostics ?? [])];\n const loaded: Skill[] = [];\n\n const extensionOwners: SkillOwnerNode[] = [];\n for (const entry of options.extensionSources) {\n const skills = entry.directories.flatMap((directory) =>\n collect(directory, 'extensions', entry.source, () => true, loaded, diagnostics),\n );\n if (skills.length > 0) extensionOwners.push({ owner: entry.source, skills });\n }\n\n const pluginOwners: SkillOwnerNode[] = [];\n const domainPlugins = await materializePluginEntries(resolvePluginEntries(repoRoot, listDomainNames(repoRoot), []));\n for (const entry of domainPlugins) {\n const directory = path.join(entry.directory, SKILLS_DIRECTORY);\n if (!fs.existsSync(directory)) continue;\n const owner = path.basename(entry.directory);\n const skills = collect(directory, 'plugins', owner, isActive, loaded, diagnostics, entry.skillDiscovery);\n if (skills.length > 0) pluginOwners.push({ owner, skills });\n }\n\n const sharedDirectory = path.join(repoRoot, '.claude', SKILLS_DIRECTORY);\n const sharedSkills = collect(sharedDirectory, 'default', SHARED_SKILLS_OWNER, isActive, loaded, diagnostics);\n const defaultOwners = sharedSkills.length > 0 ? [{ owner: SHARED_SKILLS_OWNER, skills: sharedSkills }] : [];\n const helpOwners = collectHelpSkills(options.helpSkills ?? [], loaded, diagnostics);\n\n const groups: SkillGroup[] = [\n { key: 'extensions', label: 'extensions', owners: sortOwners(extensionOwners) },\n { key: 'help', label: 'Help', owners: helpOwners },\n { key: 'plugins', label: 'plugins', owners: sortOwners(pluginOwners) },\n { key: 'default', label: 'default', owners: defaultOwners },\n ];\n\n const countTokens = await counter();\n const prompt = formatSkillsForPrompt(loaded);\n let bodyTokens = 0;\n for (const skill of loaded) {\n try {\n bodyTokens += countTokens(fs.readFileSync(skill.filePath, 'utf8'));\n } catch (error) {\n diagnostics.push(`${skill.filePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n return {\n groups,\n skillCount: loaded.length,\n promptTokens: prompt ? countTokens(prompt) : 0,\n bodyTokens,\n diagnostics,\n };\n}\n\n/** The skills a name resolves to, used to decide what `enter` can invoke. */\nexport function findSkill(catalog: SkillCatalog, name: string): SkillEntry | undefined {\n for (const group of catalog.groups) {\n for (const owner of group.owners) {\n const match = owner.skills.find((skill) => skill.name === name);\n if (match) return match;\n }\n }\n return undefined;\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);let r=require(`@agimon-ai/doompi-extension-contracts/protocol`),i=require(`@agimon-ai/doompi-extension-contracts/skills`);function a(e){let a=new Map,o=new Map,s=0,c,l=()=>{c?.(),c=void 0};return e.on(`session_start`,(u,d)=>{l(),a.clear(),o.clear();let f=(0,r.createProtocolRuntime)({bus:e.events,source:`@agimon-ai/doompi`,sessionId:d.sessionManager.getSessionId()}),p=f.provide(i.SkillSourceRegistrationProtocol,({contribution:e})=>{let r=e.directories.filter(e=>t.default.isAbsolute(e)&&n.default.existsSync(e)),i=`skill-source-${++s}`,c=a.get(e.source);return c&&o.delete(c.handleId),a.set(e.source,{handleId:i,directories:r}),o.set(i,e.source),{handleId:i}}),m=f.provide(i.SkillSourceUnregistrationProtocol,({handleId:e})=>{let t=o.get(e);return t?(o.delete(e),a.get(t)?.handleId===e&&a.delete(t),{removed:!0}):{removed:!1}});c=()=>{p(),m()}}),e.on(`session_shutdown`,()=>{l(),a.clear(),o.clear()}),{list(){return[...a.entries()].map(([e,t])=>({source:e,directories:[...t.directories]})).sort((e,t)=>e.source.localeCompare(t.source))},dispose(){l(),a.clear(),o.clear()}}}exports.provideSkillSources=a;
2
+ //# sourceMappingURL=skillSources.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"skillSources.cjs","names":["SkillSourceRegistrationProtocol","path","fs","SkillSourceUnregistrationProtocol"],"sources":["../../src/services/skillSources.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport {\n SkillSourceRegistrationProtocol,\n SkillSourceUnregistrationProtocol,\n} from '@agimon-ai/doompi-extension-contracts/skills';\nimport { createProtocolRuntime } from '@agimon-ai/doompi-extension-contracts/protocol';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\nconst HOST_SOURCE = '@agimon-ai/doompi';\n\nexport interface SkillSourceEntry {\n source: string;\n directories: string[];\n}\n\nexport interface SkillSourceRegistry {\n /** Registered sources, sorted by name so the catalogue order is stable. */\n list(): readonly SkillSourceEntry[];\n dispose(): void;\n}\n\n/**\n * Hosts the registry extensions publish their skill directories to.\n *\n * Contributions are keyed by source rather than by handle, so a reload that\n * re-registers the same package replaces its entry instead of doubling it. The\n * handle is still tracked, because an unregistration that arrives after a\n * replacement must not take the newer entry down with it.\n */\nexport function provideSkillSources(pi: Pick<ExtensionAPI, 'events' | 'on'>): SkillSourceRegistry {\n const bySource = new Map<string, { handleId: string; directories: string[] }>();\n const sourceByHandle = new Map<string, string>();\n let handleSequence = 0;\n let disposeProviders: (() => void) | undefined;\n\n const stopProviders = (): void => {\n disposeProviders?.();\n disposeProviders = undefined;\n };\n\n pi.on('session_start', (_event, ctx) => {\n stopProviders();\n bySource.clear();\n sourceByHandle.clear();\n const runtime = createProtocolRuntime({\n bus: pi.events,\n source: HOST_SOURCE,\n sessionId: ctx.sessionManager.getSessionId(),\n });\n\n const stopRegister = runtime.provide(SkillSourceRegistrationProtocol, ({ contribution }) => {\n // A path that does not resolve is dropped rather than rejected: the\n // contributor guards on existence too, and failing its registration would\n // surface as a session-start error for a directory nobody can browse.\n const directories = contribution.directories.filter(\n (directory) => path.isAbsolute(directory) && fs.existsSync(directory),\n );\n const handleId = `skill-source-${++handleSequence}`;\n const previous = bySource.get(contribution.source);\n if (previous) sourceByHandle.delete(previous.handleId);\n bySource.set(contribution.source, { handleId, directories });\n sourceByHandle.set(handleId, contribution.source);\n return { handleId };\n });\n\n const stopUnregister = runtime.provide(SkillSourceUnregistrationProtocol, ({ handleId }) => {\n const source = sourceByHandle.get(handleId);\n if (!source) return { removed: false };\n sourceByHandle.delete(handleId);\n // Guarded so a late unregistration cannot remove the replacement that\n // already took this source's slot.\n if (bySource.get(source)?.handleId === handleId) bySource.delete(source);\n return { removed: true };\n });\n\n disposeProviders = () => {\n stopRegister();\n stopUnregister();\n };\n });\n\n pi.on('session_shutdown', () => {\n stopProviders();\n bySource.clear();\n sourceByHandle.clear();\n });\n\n return {\n list() {\n return [...bySource.entries()]\n .map(([source, entry]) => ({ source, directories: [...entry.directories] }))\n .sort((left, right) => left.source.localeCompare(right.source));\n },\n dispose() {\n stopProviders();\n bySource.clear();\n sourceByHandle.clear();\n },\n };\n}\n"],"mappings":"wUA8BA,SAAgB,EAAoB,EAA8D,CAChG,IAAM,EAAW,IAAI,IACf,EAAiB,IAAI,IACvB,EAAiB,EACjB,EAEE,MAA4B,CAChC,KAAoB,CACpB,EAAmB,IAAA,IAkDrB,OA/CA,EAAG,GAAG,iBAAkB,EAAQ,IAAQ,CACtC,GAAe,CACf,EAAS,OAAO,CAChB,EAAe,OAAO,CACtB,IAAM,GAAA,EAAA,EAAA,uBAAgC,CACpC,IAAK,EAAG,OACR,OAAQ,oBACR,UAAW,EAAI,eAAe,cAAc,CAC7C,CAAC,CAEI,EAAe,EAAQ,QAAQA,EAAAA,iCAAkC,CAAE,kBAAmB,CAI1F,IAAM,EAAc,EAAa,YAAY,OAC1C,GAAcC,EAAAA,QAAK,WAAW,EAAU,EAAIC,EAAAA,QAAG,WAAW,EAAU,CACtE,CACK,EAAW,gBAAgB,EAAE,IAC7B,EAAW,EAAS,IAAI,EAAa,OAAO,CAIlD,OAHI,GAAU,EAAe,OAAO,EAAS,SAAS,CACtD,EAAS,IAAI,EAAa,OAAQ,CAAE,WAAU,cAAa,CAAC,CAC5D,EAAe,IAAI,EAAU,EAAa,OAAO,CAC1C,CAAE,WAAU,EACnB,CAEI,EAAiB,EAAQ,QAAQC,EAAAA,mCAAoC,CAAE,cAAe,CAC1F,IAAM,EAAS,EAAe,IAAI,EAAS,CAM3C,OALK,GACL,EAAe,OAAO,EAAS,CAG3B,EAAS,IAAI,EAAO,EAAE,WAAa,GAAU,EAAS,OAAO,EAAO,CACjE,CAAE,QAAS,GAAM,EALJ,CAAE,QAAS,GAAO,EAMtC,CAEF,MAAyB,CACvB,GAAc,CACd,GAAgB,GAElB,CAEF,EAAG,GAAG,uBAA0B,CAC9B,GAAe,CACf,EAAS,OAAO,CAChB,EAAe,OAAO,EACtB,CAEK,CACL,MAAO,CACL,MAAO,CAAC,GAAG,EAAS,SAAS,CAAC,CAC3B,KAAK,CAAC,EAAQ,MAAY,CAAE,SAAQ,YAAa,CAAC,GAAG,EAAM,YAAY,CAAE,EAAE,CAC3E,MAAM,EAAM,IAAU,EAAK,OAAO,cAAc,EAAM,OAAO,CAAC,EAEnE,SAAU,CACR,GAAe,CACf,EAAS,OAAO,CAChB,EAAe,OAAO,EAEzB"}
1
+ {"version":3,"file":"skillSources.cjs","names":["SkillSourceRegistrationProtocol","path","fs","SkillSourceUnregistrationProtocol"],"sources":["../../src/adapters/skillSources.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { createProtocolRuntime } from '@agimon-ai/doompi-extension-contracts/protocol';\nimport {\n SkillSourceRegistrationProtocol,\n SkillSourceUnregistrationProtocol,\n} from '@agimon-ai/doompi-extension-contracts/skills';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\nconst HOST_SOURCE = '@agimon-ai/doompi';\n\nexport interface SkillSourceEntry {\n source: string;\n directories: string[];\n}\n\nexport interface SkillSourceRegistry {\n /** Registered sources, sorted by name so the catalogue order is stable. */\n list(): readonly SkillSourceEntry[];\n dispose(): void;\n}\n\n/**\n * Hosts the registry extensions publish their skill directories to.\n *\n * Contributions are keyed by source rather than by handle, so a reload that\n * re-registers the same package replaces its entry instead of doubling it. The\n * handle is still tracked, because an unregistration that arrives after a\n * replacement must not take the newer entry down with it.\n */\nexport function provideSkillSources(pi: Pick<ExtensionAPI, 'events' | 'on'>): SkillSourceRegistry {\n const bySource = new Map<string, { handleId: string; directories: string[] }>();\n const sourceByHandle = new Map<string, string>();\n let handleSequence = 0;\n let disposeProviders: (() => void) | undefined;\n\n const stopProviders = (): void => {\n disposeProviders?.();\n disposeProviders = undefined;\n };\n\n pi.on('session_start', (_event, ctx) => {\n stopProviders();\n bySource.clear();\n sourceByHandle.clear();\n const runtime = createProtocolRuntime({\n bus: pi.events,\n source: HOST_SOURCE,\n sessionId: ctx.sessionManager.getSessionId(),\n });\n\n const stopRegister = runtime.provide(SkillSourceRegistrationProtocol, ({ contribution }) => {\n // A path that does not resolve is dropped rather than rejected: the\n // contributor guards on existence too, and failing its registration would\n // surface as a session-start error for a directory nobody can browse.\n const directories = contribution.directories.filter(\n (directory) => path.isAbsolute(directory) && fs.existsSync(directory),\n );\n const handleId = `skill-source-${++handleSequence}`;\n const previous = bySource.get(contribution.source);\n if (previous) sourceByHandle.delete(previous.handleId);\n bySource.set(contribution.source, { handleId, directories });\n sourceByHandle.set(handleId, contribution.source);\n return { handleId };\n });\n\n const stopUnregister = runtime.provide(SkillSourceUnregistrationProtocol, ({ handleId }) => {\n const source = sourceByHandle.get(handleId);\n if (!source) return { removed: false };\n sourceByHandle.delete(handleId);\n // Guarded so a late unregistration cannot remove the replacement that\n // already took this source's slot.\n if (bySource.get(source)?.handleId === handleId) bySource.delete(source);\n return { removed: true };\n });\n\n disposeProviders = () => {\n stopRegister();\n stopUnregister();\n };\n });\n\n pi.on('session_shutdown', () => {\n stopProviders();\n bySource.clear();\n sourceByHandle.clear();\n });\n\n return {\n list() {\n return [...bySource.entries()]\n .map(([source, entry]) => ({ source, directories: [...entry.directories] }))\n .sort((left, right) => left.source.localeCompare(right.source));\n },\n dispose() {\n stopProviders();\n bySource.clear();\n sourceByHandle.clear();\n },\n };\n}\n"],"mappings":"qQA8BA,SAAgB,EAAoB,EAA8D,CAChG,IAAM,EAAW,IAAI,IACf,EAAiB,IAAI,IACvB,EAAiB,EACjB,EAEE,MAA4B,CAChC,KAAoB,CACpB,EAAmB,IAAA,IAkDrB,OA/CA,EAAG,GAAG,iBAAkB,EAAQ,IAAQ,CACtC,GAAe,CACf,EAAS,OAAO,CAChB,EAAe,OAAO,CACtB,IAAM,GAAA,EAAA,EAAA,uBAAgC,CACpC,IAAK,EAAG,OACR,OAAQ,oBACR,UAAW,EAAI,eAAe,cAAc,CAC7C,CAAC,CAEI,EAAe,EAAQ,QAAQA,EAAAA,iCAAkC,CAAE,kBAAmB,CAI1F,IAAM,EAAc,EAAa,YAAY,OAC1C,GAAcC,EAAAA,QAAK,WAAW,EAAU,EAAIC,EAAAA,QAAG,WAAW,EAAU,CACtE,CACK,EAAW,gBAAgB,EAAE,IAC7B,EAAW,EAAS,IAAI,EAAa,OAAO,CAIlD,OAHI,GAAU,EAAe,OAAO,EAAS,SAAS,CACtD,EAAS,IAAI,EAAa,OAAQ,CAAE,WAAU,cAAa,CAAC,CAC5D,EAAe,IAAI,EAAU,EAAa,OAAO,CAC1C,CAAE,WAAU,EACnB,CAEI,EAAiB,EAAQ,QAAQC,EAAAA,mCAAoC,CAAE,cAAe,CAC1F,IAAM,EAAS,EAAe,IAAI,EAAS,CAM3C,OALK,GACL,EAAe,OAAO,EAAS,CAG3B,EAAS,IAAI,EAAO,EAAE,WAAa,GAAU,EAAS,OAAO,EAAO,CACjE,CAAE,QAAS,GAAM,EALJ,CAAE,QAAS,GAAO,EAMtC,CAEF,MAAyB,CACvB,GAAc,CACd,GAAgB,GAElB,CAEF,EAAG,GAAG,uBAA0B,CAC9B,GAAe,CACf,EAAS,OAAO,CAChB,EAAe,OAAO,EACtB,CAEK,CACL,MAAO,CACL,MAAO,CAAC,GAAG,EAAS,SAAS,CAAC,CAC3B,KAAK,CAAC,EAAQ,MAAY,CAAE,SAAQ,YAAa,CAAC,GAAG,EAAM,YAAY,CAAE,EAAE,CAC3E,MAAM,EAAM,IAAU,EAAK,OAAO,cAAc,EAAM,OAAO,CAAC,EAEnE,SAAU,CACR,GAAe,CACf,EAAS,OAAO,CAChB,EAAe,OAAO,EAEzB"}
@@ -0,0 +1,24 @@
1
+ import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+
3
+ //#region src/adapters/skillSources.d.ts
4
+ interface SkillSourceEntry {
5
+ source: string;
6
+ directories: string[];
7
+ }
8
+ interface SkillSourceRegistry {
9
+ /** Registered sources, sorted by name so the catalogue order is stable. */
10
+ list(): readonly SkillSourceEntry[];
11
+ dispose(): void;
12
+ }
13
+ /**
14
+ * Hosts the registry extensions publish their skill directories to.
15
+ *
16
+ * Contributions are keyed by source rather than by handle, so a reload that
17
+ * re-registers the same package replaces its entry instead of doubling it. The
18
+ * handle is still tracked, because an unregistration that arrives after a
19
+ * replacement must not take the newer entry down with it.
20
+ */
21
+ declare function provideSkillSources(pi: Pick<ExtensionAPI, 'events' | 'on'>): SkillSourceRegistry;
22
+ //#endregion
23
+ export { SkillSourceEntry, SkillSourceRegistry, provideSkillSources };
24
+ //# sourceMappingURL=skillSources.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skillSources.d.cts","names":[],"sources":["../../src/services/skillSources.ts"],"mappings":";;;UAWiB,gBAAA;EACf,MAAA;EACA,WAAA;AAAA;AAAA,UAGe,mBAAA;EAJf;EAMA,IAAA,aAAiB,gBAAA;EACjB,OAAA;AAAA;;;;;;;;AAWF;iBAAgB,mBAAA,CAAoB,EAAA,EAAI,IAAA,CAAK,YAAA,qBAAiC,mBAAA"}
1
+ {"version":3,"file":"skillSources.d.cts","names":[],"sources":["../../src/adapters/skillSources.ts"],"mappings":";;;UAWiB,gBAAA;EACf,MAAA;EACA,WAAA;AAAA;AAAA,UAGe,mBAAA;EAJf;EAMA,IAAA,aAAiB,gBAAA;EACjB,OAAA;AAAA;;;;;;;;AAWF;iBAAgB,mBAAA,CAAoB,EAAA,EAAI,IAAA,CAAK,YAAA,qBAAiC,mBAAA"}
@@ -0,0 +1,24 @@
1
+ import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+
3
+ //#region src/adapters/skillSources.d.ts
4
+ interface SkillSourceEntry {
5
+ source: string;
6
+ directories: string[];
7
+ }
8
+ interface SkillSourceRegistry {
9
+ /** Registered sources, sorted by name so the catalogue order is stable. */
10
+ list(): readonly SkillSourceEntry[];
11
+ dispose(): void;
12
+ }
13
+ /**
14
+ * Hosts the registry extensions publish their skill directories to.
15
+ *
16
+ * Contributions are keyed by source rather than by handle, so a reload that
17
+ * re-registers the same package replaces its entry instead of doubling it. The
18
+ * handle is still tracked, because an unregistration that arrives after a
19
+ * replacement must not take the newer entry down with it.
20
+ */
21
+ declare function provideSkillSources(pi: Pick<ExtensionAPI, 'events' | 'on'>): SkillSourceRegistry;
22
+ //#endregion
23
+ export { SkillSourceEntry, SkillSourceRegistry, provideSkillSources };
24
+ //# sourceMappingURL=skillSources.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skillSources.d.mts","names":[],"sources":["../../src/services/skillSources.ts"],"mappings":";;;UAWiB,gBAAA;EACf,MAAA;EACA,WAAA;AAAA;AAAA,UAGe,mBAAA;EAJf;EAMA,IAAA,aAAiB,gBAAA;EACjB,OAAA;AAAA;;;;;;;;AAWF;iBAAgB,mBAAA,CAAoB,EAAA,EAAI,IAAA,CAAK,YAAA,qBAAiC,mBAAA"}
1
+ {"version":3,"file":"skillSources.d.mts","names":[],"sources":["../../src/adapters/skillSources.ts"],"mappings":";;;UAWiB,gBAAA;EACf,MAAA;EACA,WAAA;AAAA;AAAA,UAGe,mBAAA;EAJf;EAMA,IAAA,aAAiB,gBAAA;EACjB,OAAA;AAAA;;;;;;;;AAWF;iBAAgB,mBAAA,CAAoB,EAAA,EAAI,IAAA,CAAK,YAAA,qBAAiC,mBAAA"}
@@ -0,0 +1,2 @@
1
+ import e from"node:path";import t from"node:fs";import{createProtocolRuntime as n}from"@agimon-ai/doompi-extension-contracts/protocol";import{SkillSourceRegistrationProtocol as r,SkillSourceUnregistrationProtocol as i}from"@agimon-ai/doompi-extension-contracts/skills";function a(a){let o=new Map,s=new Map,c=0,l,u=()=>{l?.(),l=void 0};return a.on(`session_start`,(d,f)=>{u(),o.clear(),s.clear();let p=n({bus:a.events,source:`@agimon-ai/doompi`,sessionId:f.sessionManager.getSessionId()}),m=p.provide(r,({contribution:n})=>{let r=n.directories.filter(n=>e.isAbsolute(n)&&t.existsSync(n)),i=`skill-source-${++c}`,a=o.get(n.source);return a&&s.delete(a.handleId),o.set(n.source,{handleId:i,directories:r}),s.set(i,n.source),{handleId:i}}),h=p.provide(i,({handleId:e})=>{let t=s.get(e);return t?(s.delete(e),o.get(t)?.handleId===e&&o.delete(t),{removed:!0}):{removed:!1}});l=()=>{m(),h()}}),a.on(`session_shutdown`,()=>{u(),o.clear(),s.clear()}),{list(){return[...o.entries()].map(([e,t])=>({source:e,directories:[...t.directories]})).sort((e,t)=>e.source.localeCompare(t.source))},dispose(){u(),o.clear(),s.clear()}}}export{a as provideSkillSources};
2
+ //# sourceMappingURL=skillSources.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"skillSources.mjs","names":[],"sources":["../../src/services/skillSources.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport {\n SkillSourceRegistrationProtocol,\n SkillSourceUnregistrationProtocol,\n} from '@agimon-ai/doompi-extension-contracts/skills';\nimport { createProtocolRuntime } from '@agimon-ai/doompi-extension-contracts/protocol';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\nconst HOST_SOURCE = '@agimon-ai/doompi';\n\nexport interface SkillSourceEntry {\n source: string;\n directories: string[];\n}\n\nexport interface SkillSourceRegistry {\n /** Registered sources, sorted by name so the catalogue order is stable. */\n list(): readonly SkillSourceEntry[];\n dispose(): void;\n}\n\n/**\n * Hosts the registry extensions publish their skill directories to.\n *\n * Contributions are keyed by source rather than by handle, so a reload that\n * re-registers the same package replaces its entry instead of doubling it. The\n * handle is still tracked, because an unregistration that arrives after a\n * replacement must not take the newer entry down with it.\n */\nexport function provideSkillSources(pi: Pick<ExtensionAPI, 'events' | 'on'>): SkillSourceRegistry {\n const bySource = new Map<string, { handleId: string; directories: string[] }>();\n const sourceByHandle = new Map<string, string>();\n let handleSequence = 0;\n let disposeProviders: (() => void) | undefined;\n\n const stopProviders = (): void => {\n disposeProviders?.();\n disposeProviders = undefined;\n };\n\n pi.on('session_start', (_event, ctx) => {\n stopProviders();\n bySource.clear();\n sourceByHandle.clear();\n const runtime = createProtocolRuntime({\n bus: pi.events,\n source: HOST_SOURCE,\n sessionId: ctx.sessionManager.getSessionId(),\n });\n\n const stopRegister = runtime.provide(SkillSourceRegistrationProtocol, ({ contribution }) => {\n // A path that does not resolve is dropped rather than rejected: the\n // contributor guards on existence too, and failing its registration would\n // surface as a session-start error for a directory nobody can browse.\n const directories = contribution.directories.filter(\n (directory) => path.isAbsolute(directory) && fs.existsSync(directory),\n );\n const handleId = `skill-source-${++handleSequence}`;\n const previous = bySource.get(contribution.source);\n if (previous) sourceByHandle.delete(previous.handleId);\n bySource.set(contribution.source, { handleId, directories });\n sourceByHandle.set(handleId, contribution.source);\n return { handleId };\n });\n\n const stopUnregister = runtime.provide(SkillSourceUnregistrationProtocol, ({ handleId }) => {\n const source = sourceByHandle.get(handleId);\n if (!source) return { removed: false };\n sourceByHandle.delete(handleId);\n // Guarded so a late unregistration cannot remove the replacement that\n // already took this source's slot.\n if (bySource.get(source)?.handleId === handleId) bySource.delete(source);\n return { removed: true };\n });\n\n disposeProviders = () => {\n stopRegister();\n stopUnregister();\n };\n });\n\n pi.on('session_shutdown', () => {\n stopProviders();\n bySource.clear();\n sourceByHandle.clear();\n });\n\n return {\n list() {\n return [...bySource.entries()]\n .map(([source, entry]) => ({ source, directories: [...entry.directories] }))\n .sort((left, right) => left.source.localeCompare(right.source));\n },\n dispose() {\n stopProviders();\n bySource.clear();\n sourceByHandle.clear();\n },\n };\n}\n"],"mappings":"6QA8BA,SAAgB,EAAoB,EAA8D,CAChG,IAAM,EAAW,IAAI,IACf,EAAiB,IAAI,IACvB,EAAiB,EACjB,EAEE,MAA4B,CAChC,KAAoB,CACpB,EAAmB,IAAA,IAkDrB,OA/CA,EAAG,GAAG,iBAAkB,EAAQ,IAAQ,CACtC,GAAe,CACf,EAAS,OAAO,CAChB,EAAe,OAAO,CACtB,IAAM,EAAU,EAAsB,CACpC,IAAK,EAAG,OACR,OAAQ,oBACR,UAAW,EAAI,eAAe,cAAc,CAC7C,CAAC,CAEI,EAAe,EAAQ,QAAQ,GAAkC,CAAE,kBAAmB,CAI1F,IAAM,EAAc,EAAa,YAAY,OAC1C,GAAc,EAAK,WAAW,EAAU,EAAI,EAAG,WAAW,EAAU,CACtE,CACK,EAAW,gBAAgB,EAAE,IAC7B,EAAW,EAAS,IAAI,EAAa,OAAO,CAIlD,OAHI,GAAU,EAAe,OAAO,EAAS,SAAS,CACtD,EAAS,IAAI,EAAa,OAAQ,CAAE,WAAU,cAAa,CAAC,CAC5D,EAAe,IAAI,EAAU,EAAa,OAAO,CAC1C,CAAE,WAAU,EACnB,CAEI,EAAiB,EAAQ,QAAQ,GAAoC,CAAE,cAAe,CAC1F,IAAM,EAAS,EAAe,IAAI,EAAS,CAM3C,OALK,GACL,EAAe,OAAO,EAAS,CAG3B,EAAS,IAAI,EAAO,EAAE,WAAa,GAAU,EAAS,OAAO,EAAO,CACjE,CAAE,QAAS,GAAM,EALJ,CAAE,QAAS,GAAO,EAMtC,CAEF,MAAyB,CACvB,GAAc,CACd,GAAgB,GAElB,CAEF,EAAG,GAAG,uBAA0B,CAC9B,GAAe,CACf,EAAS,OAAO,CAChB,EAAe,OAAO,EACtB,CAEK,CACL,MAAO,CACL,MAAO,CAAC,GAAG,EAAS,SAAS,CAAC,CAC3B,KAAK,CAAC,EAAQ,MAAY,CAAE,SAAQ,YAAa,CAAC,GAAG,EAAM,YAAY,CAAE,EAAE,CAC3E,MAAM,EAAM,IAAU,EAAK,OAAO,cAAc,EAAM,OAAO,CAAC,EAEnE,SAAU,CACR,GAAe,CACf,EAAS,OAAO,CAChB,EAAe,OAAO,EAEzB"}
1
+ {"version":3,"file":"skillSources.mjs","names":[],"sources":["../../src/adapters/skillSources.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { createProtocolRuntime } from '@agimon-ai/doompi-extension-contracts/protocol';\nimport {\n SkillSourceRegistrationProtocol,\n SkillSourceUnregistrationProtocol,\n} from '@agimon-ai/doompi-extension-contracts/skills';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\nconst HOST_SOURCE = '@agimon-ai/doompi';\n\nexport interface SkillSourceEntry {\n source: string;\n directories: string[];\n}\n\nexport interface SkillSourceRegistry {\n /** Registered sources, sorted by name so the catalogue order is stable. */\n list(): readonly SkillSourceEntry[];\n dispose(): void;\n}\n\n/**\n * Hosts the registry extensions publish their skill directories to.\n *\n * Contributions are keyed by source rather than by handle, so a reload that\n * re-registers the same package replaces its entry instead of doubling it. The\n * handle is still tracked, because an unregistration that arrives after a\n * replacement must not take the newer entry down with it.\n */\nexport function provideSkillSources(pi: Pick<ExtensionAPI, 'events' | 'on'>): SkillSourceRegistry {\n const bySource = new Map<string, { handleId: string; directories: string[] }>();\n const sourceByHandle = new Map<string, string>();\n let handleSequence = 0;\n let disposeProviders: (() => void) | undefined;\n\n const stopProviders = (): void => {\n disposeProviders?.();\n disposeProviders = undefined;\n };\n\n pi.on('session_start', (_event, ctx) => {\n stopProviders();\n bySource.clear();\n sourceByHandle.clear();\n const runtime = createProtocolRuntime({\n bus: pi.events,\n source: HOST_SOURCE,\n sessionId: ctx.sessionManager.getSessionId(),\n });\n\n const stopRegister = runtime.provide(SkillSourceRegistrationProtocol, ({ contribution }) => {\n // A path that does not resolve is dropped rather than rejected: the\n // contributor guards on existence too, and failing its registration would\n // surface as a session-start error for a directory nobody can browse.\n const directories = contribution.directories.filter(\n (directory) => path.isAbsolute(directory) && fs.existsSync(directory),\n );\n const handleId = `skill-source-${++handleSequence}`;\n const previous = bySource.get(contribution.source);\n if (previous) sourceByHandle.delete(previous.handleId);\n bySource.set(contribution.source, { handleId, directories });\n sourceByHandle.set(handleId, contribution.source);\n return { handleId };\n });\n\n const stopUnregister = runtime.provide(SkillSourceUnregistrationProtocol, ({ handleId }) => {\n const source = sourceByHandle.get(handleId);\n if (!source) return { removed: false };\n sourceByHandle.delete(handleId);\n // Guarded so a late unregistration cannot remove the replacement that\n // already took this source's slot.\n if (bySource.get(source)?.handleId === handleId) bySource.delete(source);\n return { removed: true };\n });\n\n disposeProviders = () => {\n stopRegister();\n stopUnregister();\n };\n });\n\n pi.on('session_shutdown', () => {\n stopProviders();\n bySource.clear();\n sourceByHandle.clear();\n });\n\n return {\n list() {\n return [...bySource.entries()]\n .map(([source, entry]) => ({ source, directories: [...entry.directories] }))\n .sort((left, right) => left.source.localeCompare(right.source));\n },\n dispose() {\n stopProviders();\n bySource.clear();\n sourceByHandle.clear();\n },\n };\n}\n"],"mappings":"6QA8BA,SAAgB,EAAoB,EAA8D,CAChG,IAAM,EAAW,IAAI,IACf,EAAiB,IAAI,IACvB,EAAiB,EACjB,EAEE,MAA4B,CAChC,KAAoB,CACpB,EAAmB,IAAA,IAkDrB,OA/CA,EAAG,GAAG,iBAAkB,EAAQ,IAAQ,CACtC,GAAe,CACf,EAAS,OAAO,CAChB,EAAe,OAAO,CACtB,IAAM,EAAU,EAAsB,CACpC,IAAK,EAAG,OACR,OAAQ,oBACR,UAAW,EAAI,eAAe,cAAc,CAC7C,CAAC,CAEI,EAAe,EAAQ,QAAQ,GAAkC,CAAE,kBAAmB,CAI1F,IAAM,EAAc,EAAa,YAAY,OAC1C,GAAc,EAAK,WAAW,EAAU,EAAI,EAAG,WAAW,EAAU,CACtE,CACK,EAAW,gBAAgB,EAAE,IAC7B,EAAW,EAAS,IAAI,EAAa,OAAO,CAIlD,OAHI,GAAU,EAAe,OAAO,EAAS,SAAS,CACtD,EAAS,IAAI,EAAa,OAAQ,CAAE,WAAU,cAAa,CAAC,CAC5D,EAAe,IAAI,EAAU,EAAa,OAAO,CAC1C,CAAE,WAAU,EACnB,CAEI,EAAiB,EAAQ,QAAQ,GAAoC,CAAE,cAAe,CAC1F,IAAM,EAAS,EAAe,IAAI,EAAS,CAM3C,OALK,GACL,EAAe,OAAO,EAAS,CAG3B,EAAS,IAAI,EAAO,EAAE,WAAa,GAAU,EAAS,OAAO,EAAO,CACjE,CAAE,QAAS,GAAM,EALJ,CAAE,QAAS,GAAO,EAMtC,CAEF,MAAyB,CACvB,GAAc,CACd,GAAgB,GAElB,CAEF,EAAG,GAAG,uBAA0B,CAC9B,GAAe,CACf,EAAS,OAAO,CAChB,EAAe,OAAO,EACtB,CAEK,CACL,MAAO,CACL,MAAO,CAAC,GAAG,EAAS,SAAS,CAAC,CAC3B,KAAK,CAAC,EAAQ,MAAY,CAAE,SAAQ,YAAa,CAAC,GAAG,EAAM,YAAY,CAAE,EAAE,CAC3E,MAAM,EAAM,IAAU,EAAK,OAAO,cAAc,EAAM,OAAO,CAAC,EAEnE,SAAU,CACR,GAAe,CACf,EAAS,OAAO,CAChB,EAAe,OAAO,EAEzB"}
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`./syncStateContract.cjs`),n=require(`./syncState.cjs`),r=require(`./bootstrapLocator.cjs`);let i=require(`node:url`),a=require(`node:path`);a=e.__toESM(a,1);let o=require(`node:fs`);o=e.__toESM(o,1);let s=require(`node:os`);s=e.__toESM(s,1);let c=require(`node:crypto`),l=0;function u(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function d(e){try{return o.default.realpathSync(e)}catch{return a.default.resolve(e)}}function f(e=require(`url`).pathToFileURL(__filename).href){let t=e.endsWith(`.ts`)?`ts`:`mjs`,n=a.default.dirname(a.default.dirname((0,i.fileURLToPath)(e)));return a.default.join(n,`extensions`,`entries`,`doom.${t}`)}function p(e){return`export { default } from ${JSON.stringify((0,i.pathToFileURL)(e).href)};\n`}function m(e){return`bootstrap.native.${(0,c.createHash)(`sha256`).update(d(e)).digest(`hex`).slice(0,16)}.mjs`}function h(e,t){let r=n.readLocatedSyncState(e,t);if(!r||r.layout!==`global`)throw Error(`Doom sync state requires migration to home-scoped storage. Run doompi sync.`);let i=r.state;if(i.version!==9||!u(i.selection)||!u(i.resolved))throw Error(`Doom sync state at ${r.location.statePath} changed while preparing startup. Run doompi sync.`);return i}function g(e){return JSON.stringify({inputsHash:e.inputsHash,selection:e.selection,resolved:e.resolved})}function _(e,t){o.default.mkdirSync(a.default.dirname(e),{recursive:!0}),l+=1;let n=`${e}.${process.pid}.${String(l)}.tmp`;try{o.default.writeFileSync(n,t,{mode:384}),o.default.renameSync(n,e)}catch(e){throw o.default.rmSync(n,{force:!0}),e}}function v(e,i=s.default.homedir()){let c=h(e,i),l=f();if(!o.default.existsSync(l))throw Error(`DoomPi package entry is missing: ${l}`);let u=n.syncStatePath(e,i),d=a.default.join(a.default.dirname(u),`dist`,m(l)),v=p(l);(!o.default.existsSync(d)||o.default.readFileSync(d,`utf8`)!==v)&&_(d,v);let y=r.readBootstrapStatus(e,l,i);if(y.fresh&&y.bootstrap)return{bootstrap:y.bootstrap};let b=h(e,i);if(g(c)!==g(b))throw Error(`DoomPi synchronization changed while preparing ${e}; restart Pi.`);let x={...b,bundles:{},bootstrap:d,precompile:{version:2,strategy:t.NATIVE_PRECOMPILE_STRATEGY,bootstrapEntry:l,manifests:[]}};return delete x.compiled,_(u,`${JSON.stringify(x,null,2)}\n`),{bootstrap:d}}exports.precompileSyncedRuntime=v;
2
+ //# sourceMappingURL=startupPrecompiler.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startupPrecompiler.cjs","names":["fs","path","readLocatedSyncState","os","syncStatePath","readBootstrapStatus","NATIVE_PRECOMPILE_STRATEGY"],"sources":["../../src/adapters/startupPrecompiler.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { readBootstrapStatus } from './bootstrapLocator.ts';\nimport { readLocatedSyncState, syncStatePath } from './syncState.ts';\nimport { NATIVE_PRECOMPILE_STRATEGY, PRECOMPILE_STATE_VERSION, SYNC_STATE_VERSION } from './syncStateContract.ts';\n\nconst NATIVE_BOOTSTRAP_PREFIX = 'bootstrap.native';\nconst COMPILED_SUFFIX = '.mjs';\nconst ENTRY_HASH_LENGTH = 16;\nconst PRIVATE_FILE_MODE = 0o600;\nlet writeSequence = 0;\n\nexport interface StartupPrecompileResult {\n bootstrap: string;\n}\n\ninterface StartupState extends Record<string, unknown> {\n version: number;\n root: string;\n inputsHash: string;\n selection: Record<string, unknown>;\n resolved: Record<string, unknown>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction canonicalPath(target: string): string {\n try {\n return fs.realpathSync(target);\n } catch {\n return path.resolve(target);\n }\n}\n\nfunction packagedDoomEntry(moduleUrl: string = import.meta.url): string {\n const extension = moduleUrl.endsWith('.ts') ? 'ts' : 'mjs';\n const sourceRoot = path.dirname(path.dirname(fileURLToPath(moduleUrl)));\n return path.join(sourceRoot, 'extensions', 'entries', `doom.${extension}`);\n}\n\nfunction nativeBootstrapSource(entry: string): string {\n return `export { default } from ${JSON.stringify(pathToFileURL(entry).href)};\\n`;\n}\n\n/**\n * Shim file name derived from the entry it re-exports.\n *\n * One fixed name would be a shared target: two DoomPi installs registered from\n * different settings scopes overwrite each other's shim, and because Node keys\n * its module cache on the URL, the second import then hands back the first\n * install's module. Naming per entry, the way the bundled strategy already\n * names its output, keeps the two apart.\n */\nfunction nativeBootstrapName(entry: string): string {\n const digest = createHash('sha256').update(canonicalPath(entry)).digest('hex').slice(0, ENTRY_HASH_LENGTH);\n return `${NATIVE_BOOTSTRAP_PREFIX}.${digest}${COMPILED_SUFFIX}`;\n}\n\nfunction readStartupState(repoRoot: string, homeDirectory: string): StartupState {\n const located = readLocatedSyncState(repoRoot, homeDirectory);\n if (!located || located.layout !== 'global') {\n throw new Error(`Doom sync state requires migration to home-scoped storage. Run doompi sync.`);\n }\n const state = located.state;\n if (state.version !== SYNC_STATE_VERSION || !isRecord(state.selection) || !isRecord(state.resolved)) {\n throw new Error(\n `Doom sync state at ${located.location.statePath} changed while preparing startup. Run doompi sync.`,\n );\n }\n return state as unknown as StartupState;\n}\n\nfunction compilationInputs(state: StartupState): string {\n return JSON.stringify({\n inputsHash: state.inputsHash,\n selection: state.selection,\n resolved: state.resolved,\n });\n}\n\nfunction writeAtomic(target: string, contents: string): void {\n fs.mkdirSync(path.dirname(target), { recursive: true });\n writeSequence += 1;\n const temporary = `${target}.${process.pid}.${String(writeSequence)}.tmp`;\n try {\n fs.writeFileSync(temporary, contents, { mode: PRIVATE_FILE_MODE });\n fs.renameSync(temporary, target);\n } catch (error) {\n fs.rmSync(temporary, { force: true });\n throw error;\n }\n}\n\n/**\n * Generates a native ESM bootstrap without traversing or bundling the runtime.\n * Packaged Doom modules are already JavaScript, so this cache miss stays below\n * the startup budget while the sync pipeline performs full bundling ahead of time.\n */\nexport function precompileSyncedRuntime(\n repoRoot: string,\n homeDirectory: string = os.homedir(),\n): StartupPrecompileResult {\n const before = readStartupState(repoRoot, homeDirectory);\n const bootstrapEntry = packagedDoomEntry();\n if (!fs.existsSync(bootstrapEntry)) {\n throw new Error(`DoomPi package entry is missing: ${bootstrapEntry}`);\n }\n\n const statePath = syncStatePath(repoRoot, homeDirectory);\n const bootstrap = path.join(path.dirname(statePath), 'dist', nativeBootstrapName(bootstrapEntry));\n const source = nativeBootstrapSource(bootstrapEntry);\n if (!fs.existsSync(bootstrap) || fs.readFileSync(bootstrap, 'utf8') !== source) {\n writeAtomic(bootstrap, source);\n }\n\n // A concurrent explicit build may have published a better graph while the\n // native bootstrap was being written. Keep it rather than replacing it.\n const concurrent = readBootstrapStatus(repoRoot, bootstrapEntry, homeDirectory);\n if (concurrent.fresh && concurrent.bootstrap) return { bootstrap: concurrent.bootstrap };\n\n const current = readStartupState(repoRoot, homeDirectory);\n if (compilationInputs(before) !== compilationInputs(current)) {\n throw new Error(`DoomPi synchronization changed while preparing ${repoRoot}; restart Pi.`);\n }\n\n const next: Record<string, unknown> = {\n ...current,\n bundles: {},\n bootstrap,\n precompile: {\n version: PRECOMPILE_STATE_VERSION,\n strategy: NATIVE_PRECOMPILE_STRATEGY,\n bootstrapEntry,\n manifests: [],\n },\n };\n delete next.compiled;\n writeAtomic(statePath, `${JSON.stringify(next, null, 2)}\\n`);\n return { bootstrap };\n}\n"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ //#region src/adapters/startupPrecompiler.d.ts
2
+ interface StartupPrecompileResult {
3
+ bootstrap: string;
4
+ }
5
+ /**
6
+ * Generates a native ESM bootstrap without traversing or bundling the runtime.
7
+ * Packaged Doom modules are already JavaScript, so this cache miss stays below
8
+ * the startup budget while the sync pipeline performs full bundling ahead of time.
9
+ */
10
+ declare function precompileSyncedRuntime(repoRoot: string, homeDirectory?: string): StartupPrecompileResult;
11
+ //#endregion
12
+ export { StartupPrecompileResult, precompileSyncedRuntime };
13
+ //# sourceMappingURL=startupPrecompiler.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startupPrecompiler.d.cts","names":[],"sources":["../../src/adapters/startupPrecompiler.ts"],"mappings":";UAeiB,uBAAA;EACf,SAAA;AAAA;;;;AAuFF;;iBAAgB,uBAAA,CACd,QAAA,UACA,aAAA,YACC,uBAAA"}
@@ -0,0 +1,13 @@
1
+ //#region src/adapters/startupPrecompiler.d.ts
2
+ interface StartupPrecompileResult {
3
+ bootstrap: string;
4
+ }
5
+ /**
6
+ * Generates a native ESM bootstrap without traversing or bundling the runtime.
7
+ * Packaged Doom modules are already JavaScript, so this cache miss stays below
8
+ * the startup budget while the sync pipeline performs full bundling ahead of time.
9
+ */
10
+ declare function precompileSyncedRuntime(repoRoot: string, homeDirectory?: string): StartupPrecompileResult;
11
+ //#endregion
12
+ export { StartupPrecompileResult, precompileSyncedRuntime };
13
+ //# sourceMappingURL=startupPrecompiler.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startupPrecompiler.d.mts","names":[],"sources":["../../src/adapters/startupPrecompiler.ts"],"mappings":";UAeiB,uBAAA;EACf,SAAA;AAAA;;;;AAuFF;;iBAAgB,uBAAA,CACd,QAAA,UACA,aAAA,YACC,uBAAA"}
@@ -0,0 +1,2 @@
1
+ import{NATIVE_PRECOMPILE_STRATEGY as e}from"./syncStateContract.mjs";import{readLocatedSyncState as t,syncStatePath as n}from"./syncState.mjs";import{readBootstrapStatus as r}from"./bootstrapLocator.mjs";import{fileURLToPath as i,pathToFileURL as a}from"node:url";import o from"node:path";import s from"node:fs";import c from"node:os";import{createHash as l}from"node:crypto";let u=0;function d(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function f(e){try{return s.realpathSync(e)}catch{return o.resolve(e)}}function p(e=import.meta.url){let t=e.endsWith(`.ts`)?`ts`:`mjs`,n=o.dirname(o.dirname(i(e)));return o.join(n,`extensions`,`entries`,`doom.${t}`)}function m(e){return`export { default } from ${JSON.stringify(a(e).href)};\n`}function h(e){return`bootstrap.native.${l(`sha256`).update(f(e)).digest(`hex`).slice(0,16)}.mjs`}function g(e,n){let r=t(e,n);if(!r||r.layout!==`global`)throw Error(`Doom sync state requires migration to home-scoped storage. Run doompi sync.`);let i=r.state;if(i.version!==9||!d(i.selection)||!d(i.resolved))throw Error(`Doom sync state at ${r.location.statePath} changed while preparing startup. Run doompi sync.`);return i}function _(e){return JSON.stringify({inputsHash:e.inputsHash,selection:e.selection,resolved:e.resolved})}function v(e,t){s.mkdirSync(o.dirname(e),{recursive:!0}),u+=1;let n=`${e}.${process.pid}.${String(u)}.tmp`;try{s.writeFileSync(n,t,{mode:384}),s.renameSync(n,e)}catch(e){throw s.rmSync(n,{force:!0}),e}}function y(t,i=c.homedir()){let a=g(t,i),l=p();if(!s.existsSync(l))throw Error(`DoomPi package entry is missing: ${l}`);let u=n(t,i),d=o.join(o.dirname(u),`dist`,h(l)),f=m(l);(!s.existsSync(d)||s.readFileSync(d,`utf8`)!==f)&&v(d,f);let y=r(t,l,i);if(y.fresh&&y.bootstrap)return{bootstrap:y.bootstrap};let b=g(t,i);if(_(a)!==_(b))throw Error(`DoomPi synchronization changed while preparing ${t}; restart Pi.`);let x={...b,bundles:{},bootstrap:d,precompile:{version:2,strategy:e,bootstrapEntry:l,manifests:[]}};return delete x.compiled,v(u,`${JSON.stringify(x,null,2)}\n`),{bootstrap:d}}export{y as precompileSyncedRuntime};
2
+ //# sourceMappingURL=startupPrecompiler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startupPrecompiler.mjs","names":[],"sources":["../../src/adapters/startupPrecompiler.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { readBootstrapStatus } from './bootstrapLocator.ts';\nimport { readLocatedSyncState, syncStatePath } from './syncState.ts';\nimport { NATIVE_PRECOMPILE_STRATEGY, PRECOMPILE_STATE_VERSION, SYNC_STATE_VERSION } from './syncStateContract.ts';\n\nconst NATIVE_BOOTSTRAP_PREFIX = 'bootstrap.native';\nconst COMPILED_SUFFIX = '.mjs';\nconst ENTRY_HASH_LENGTH = 16;\nconst PRIVATE_FILE_MODE = 0o600;\nlet writeSequence = 0;\n\nexport interface StartupPrecompileResult {\n bootstrap: string;\n}\n\ninterface StartupState extends Record<string, unknown> {\n version: number;\n root: string;\n inputsHash: string;\n selection: Record<string, unknown>;\n resolved: Record<string, unknown>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction canonicalPath(target: string): string {\n try {\n return fs.realpathSync(target);\n } catch {\n return path.resolve(target);\n }\n}\n\nfunction packagedDoomEntry(moduleUrl: string = import.meta.url): string {\n const extension = moduleUrl.endsWith('.ts') ? 'ts' : 'mjs';\n const sourceRoot = path.dirname(path.dirname(fileURLToPath(moduleUrl)));\n return path.join(sourceRoot, 'extensions', 'entries', `doom.${extension}`);\n}\n\nfunction nativeBootstrapSource(entry: string): string {\n return `export { default } from ${JSON.stringify(pathToFileURL(entry).href)};\\n`;\n}\n\n/**\n * Shim file name derived from the entry it re-exports.\n *\n * One fixed name would be a shared target: two DoomPi installs registered from\n * different settings scopes overwrite each other's shim, and because Node keys\n * its module cache on the URL, the second import then hands back the first\n * install's module. Naming per entry, the way the bundled strategy already\n * names its output, keeps the two apart.\n */\nfunction nativeBootstrapName(entry: string): string {\n const digest = createHash('sha256').update(canonicalPath(entry)).digest('hex').slice(0, ENTRY_HASH_LENGTH);\n return `${NATIVE_BOOTSTRAP_PREFIX}.${digest}${COMPILED_SUFFIX}`;\n}\n\nfunction readStartupState(repoRoot: string, homeDirectory: string): StartupState {\n const located = readLocatedSyncState(repoRoot, homeDirectory);\n if (!located || located.layout !== 'global') {\n throw new Error(`Doom sync state requires migration to home-scoped storage. Run doompi sync.`);\n }\n const state = located.state;\n if (state.version !== SYNC_STATE_VERSION || !isRecord(state.selection) || !isRecord(state.resolved)) {\n throw new Error(\n `Doom sync state at ${located.location.statePath} changed while preparing startup. Run doompi sync.`,\n );\n }\n return state as unknown as StartupState;\n}\n\nfunction compilationInputs(state: StartupState): string {\n return JSON.stringify({\n inputsHash: state.inputsHash,\n selection: state.selection,\n resolved: state.resolved,\n });\n}\n\nfunction writeAtomic(target: string, contents: string): void {\n fs.mkdirSync(path.dirname(target), { recursive: true });\n writeSequence += 1;\n const temporary = `${target}.${process.pid}.${String(writeSequence)}.tmp`;\n try {\n fs.writeFileSync(temporary, contents, { mode: PRIVATE_FILE_MODE });\n fs.renameSync(temporary, target);\n } catch (error) {\n fs.rmSync(temporary, { force: true });\n throw error;\n }\n}\n\n/**\n * Generates a native ESM bootstrap without traversing or bundling the runtime.\n * Packaged Doom modules are already JavaScript, so this cache miss stays below\n * the startup budget while the sync pipeline performs full bundling ahead of time.\n */\nexport function precompileSyncedRuntime(\n repoRoot: string,\n homeDirectory: string = os.homedir(),\n): StartupPrecompileResult {\n const before = readStartupState(repoRoot, homeDirectory);\n const bootstrapEntry = packagedDoomEntry();\n if (!fs.existsSync(bootstrapEntry)) {\n throw new Error(`DoomPi package entry is missing: ${bootstrapEntry}`);\n }\n\n const statePath = syncStatePath(repoRoot, homeDirectory);\n const bootstrap = path.join(path.dirname(statePath), 'dist', nativeBootstrapName(bootstrapEntry));\n const source = nativeBootstrapSource(bootstrapEntry);\n if (!fs.existsSync(bootstrap) || fs.readFileSync(bootstrap, 'utf8') !== source) {\n writeAtomic(bootstrap, source);\n }\n\n // A concurrent explicit build may have published a better graph while the\n // native bootstrap was being written. Keep it rather than replacing it.\n const concurrent = readBootstrapStatus(repoRoot, bootstrapEntry, homeDirectory);\n if (concurrent.fresh && concurrent.bootstrap) return { bootstrap: concurrent.bootstrap };\n\n const current = readStartupState(repoRoot, homeDirectory);\n if (compilationInputs(before) !== compilationInputs(current)) {\n throw new Error(`DoomPi synchronization changed while preparing ${repoRoot}; restart Pi.`);\n }\n\n const next: Record<string, unknown> = {\n ...current,\n bundles: {},\n bootstrap,\n precompile: {\n version: PRECOMPILE_STATE_VERSION,\n strategy: NATIVE_PRECOMPILE_STRATEGY,\n bootstrapEntry,\n manifests: [],\n },\n };\n delete next.compiled;\n writeAtomic(statePath, `${JSON.stringify(next, null, 2)}\\n`);\n return { bootstrap };\n}\n"],"mappings":"wXAaA,IAAI,EAAgB,EAcpB,SAAS,EAAS,EAAkD,CAClE,OAAO,OAAO,GAAU,YAAY,GAAkB,CAAC,MAAM,QAAQ,EAAM,CAG7E,SAAS,EAAc,EAAwB,CAC7C,GAAI,CACF,OAAO,EAAG,aAAa,EAAO,MACxB,CACN,OAAO,EAAK,QAAQ,EAAO,EAI/B,SAAS,EAAkB,EAAoB,OAAO,KAAK,IAAa,CACtE,IAAM,EAAY,EAAU,SAAS,MAAM,CAAG,KAAO,MAC/C,EAAa,EAAK,QAAQ,EAAK,QAAQ,EAAc,EAAU,CAAC,CAAC,CACvE,OAAO,EAAK,KAAK,EAAY,aAAc,UAAW,QAAQ,IAAY,CAG5E,SAAS,EAAsB,EAAuB,CACpD,MAAO,2BAA2B,KAAK,UAAU,EAAc,EAAM,CAAC,KAAK,CAAC,KAY9E,SAAS,EAAoB,EAAuB,CAElD,MAAO,oBADQ,EAAW,SAAS,CAAC,OAAO,EAAc,EAAM,CAAC,CAAC,OAAO,MAAM,CAAC,MAAM,EAAG,GAC7C,OAG7C,SAAS,EAAiB,EAAkB,EAAqC,CAC/E,IAAM,EAAU,EAAqB,EAAU,EAAc,CAC7D,GAAI,CAAC,GAAW,EAAQ,SAAW,SACjC,MAAU,MAAM,8EAA8E,CAEhG,IAAM,EAAQ,EAAQ,MACtB,GAAI,EAAM,UAAA,GAAkC,CAAC,EAAS,EAAM,UAAU,EAAI,CAAC,EAAS,EAAM,SAAS,CACjG,MAAU,MACR,sBAAsB,EAAQ,SAAS,UAAU,oDAClD,CAEH,OAAO,EAGT,SAAS,EAAkB,EAA6B,CACtD,OAAO,KAAK,UAAU,CACpB,WAAY,EAAM,WAClB,UAAW,EAAM,UACjB,SAAU,EAAM,SACjB,CAAC,CAGJ,SAAS,EAAY,EAAgB,EAAwB,CAC3D,EAAG,UAAU,EAAK,QAAQ,EAAO,CAAE,CAAE,UAAW,GAAM,CAAC,CACvD,GAAiB,EACjB,IAAM,EAAY,GAAG,EAAO,GAAG,QAAQ,IAAI,GAAG,OAAO,EAAc,CAAC,MACpE,GAAI,CACF,EAAG,cAAc,EAAW,EAAU,CAAE,KAAM,IAAmB,CAAC,CAClE,EAAG,WAAW,EAAW,EAAO,OACzB,EAAO,CAEd,MADA,EAAG,OAAO,EAAW,CAAE,MAAO,GAAM,CAAC,CAC/B,GASV,SAAgB,EACd,EACA,EAAwB,EAAG,SAAS,CACX,CACzB,IAAM,EAAS,EAAiB,EAAU,EAAc,CAClD,EAAiB,GAAmB,CAC1C,GAAI,CAAC,EAAG,WAAW,EAAe,CAChC,MAAU,MAAM,oCAAoC,IAAiB,CAGvE,IAAM,EAAY,EAAc,EAAU,EAAc,CAClD,EAAY,EAAK,KAAK,EAAK,QAAQ,EAAU,CAAE,OAAQ,EAAoB,EAAe,CAAC,CAC3F,EAAS,EAAsB,EAAe,EAChD,CAAC,EAAG,WAAW,EAAU,EAAI,EAAG,aAAa,EAAW,OAAO,GAAK,IACtE,EAAY,EAAW,EAAO,CAKhC,IAAM,EAAa,EAAoB,EAAU,EAAgB,EAAc,CAC/E,GAAI,EAAW,OAAS,EAAW,UAAW,MAAO,CAAE,UAAW,EAAW,UAAW,CAExF,IAAM,EAAU,EAAiB,EAAU,EAAc,CACzD,GAAI,EAAkB,EAAO,GAAK,EAAkB,EAAQ,CAC1D,MAAU,MAAM,kDAAkD,EAAS,eAAe,CAG5F,IAAM,EAAgC,CACpC,GAAG,EACH,QAAS,EAAE,CACX,YACA,WAAY,CACV,QAAA,EACA,SAAU,EACV,iBACA,UAAW,EAAE,CACd,CACF,CAGD,OAFA,OAAO,EAAK,SACZ,EAAY,EAAW,GAAG,KAAK,UAAU,EAAM,KAAM,EAAE,CAAC,IAAI,CACrD,CAAE,YAAW"}
@@ -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);let r=require(`node:os`);r=e.__toESM(r,1);let i=require(`node:crypto`);i=e.__toESM(i,1);const a=`.git`,o=`repo`;function s(e){let r=t.default.resolve(e);try{return n.default.realpathSync.native(r)}catch{return r}}function c(e){let r=t.default.join(e,a);try{let i=n.default.statSync(r);if(i.isDirectory())return s(r);if(!i.isFile())return;let a=/^gitdir:\s*(.+)$/imu.exec(n.default.readFileSync(r,`utf8`).trim());return a?.[1]?s(t.default.resolve(e,a[1].trim())):void 0}catch{return}}function l(e){let r=c(e);if(r)try{let e=n.default.readFileSync(t.default.join(r,`commondir`),`utf8`).trim();return e?s(t.default.resolve(r,e)):r}catch{return r}}function u(e){return i.default.createHash(`sha256`).update(e,`utf8`).digest(`hex`).slice(0,32)}function d(e,t){let n=e.normalize(`NFKD`).replace(/[\u0300-\u036f]/gu,``).replace(/[^A-Za-z0-9._-]+/gu,`-`).replace(/^[._-]+|[._-]+$/gu,``).slice(0,48).replace(/[._-]+$/gu,``);return n===``||n===`.`||n===`..`?t:n}function f(e,n){if(!e)return d(t.default.basename(n),o);let r=t.default.basename(e);return d(r===a?t.default.basename(t.default.dirname(e)):r,o)}function p(e,n=r.default.homedir()){let i=s(e),a=l(i),o=a?`git:${a}`:`root:${i}`,c={repositoryId:u(o),worktreeId:u(`${o}\0worktree:${i}`)},p=f(a,i),m=d(t.default.basename(i),`worktree`),h=t.default.join(t.default.resolve(n),`.pi`,`.doom`,`sync`),g=t.default.join(h,`${p}--${c.repositoryId}`),_=t.default.join(g,`worktrees`,`${m}--${c.worktreeId}`),v=t.default.join(i,`.pi`,`doom`);return{identity:c,repositoryLabel:p,worktreeLabel:m,repositoryDirectory:g,sharedCacheDirectory:t.default.join(g,`shared-cache`),directory:_,statePath:t.default.join(_,`state.json`),legacyDirectory:v,legacyStatePath:t.default.join(v,`state.json`)}}function m(e){try{if(n.default.lstatSync(e).isSymbolicLink())throw Error(`Doom sync namespace must not contain a symbolic link: ${e}`)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;throw e}}function h(e){try{let t=n.default.statSync(e);Date.now()-t.mtimeMs>3e5&&n.default.rmSync(e,{force:!0})}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}}async function g(e){_(e),await n.default.promises.mkdir(e.directory,{mode:448,recursive:!0}),await n.default.promises.chmod(e.directory,448);let r=t.default.join(e.directory,`.sync.lock`);h(r);let i;try{i=await n.default.promises.open(r,`wx`,384)}catch(t){throw t instanceof Error&&`code`in t&&t.code===`EEXIST`?Error(`Another Doom sync is already publishing ${e.directory}`):t}return await i.writeFile(`${process.pid}\n`),async()=>{await i.close(),await n.default.promises.rm(r,{force:!0})}}function _(e){let n=t.default.dirname(e.repositoryDirectory),r=t.default.dirname(n),i=t.default.dirname(r),a=t.default.dirname(e.directory);for(let t of[i,r,n,e.repositoryDirectory,a,e.directory])m(t)}exports.acquireSyncLocationLock=g,exports.assertSyncLocationSafe=_,exports.resolveSyncLocation=p;
2
+ //# sourceMappingURL=syncLocation.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncLocation.cjs","names":["path","fs","crypto","os"],"sources":["../../src/adapters/syncLocation.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nconst PI_DIRECTORY = '.pi';\nconst DOOM_CONFIG_DIRECTORY = '.doom';\nconst SYNC_DIRECTORY = 'sync';\nconst WORKTREES_DIRECTORY = 'worktrees';\nconst SHARED_CACHE_DIRECTORY = 'shared-cache';\nconst LEGACY_DOOM_DIRECTORY = 'doom';\nconst GIT_DIRECTORY = '.git';\nconst COMMON_DIRECTORY_FILE = 'commondir';\nconst IDENTITY_HEX_LENGTH = 32;\nconst LABEL_MAX_LENGTH = 48;\nconst DEFAULT_REPOSITORY_LABEL = 'repo';\nconst DEFAULT_WORKTREE_LABEL = 'worktree';\nconst LOCK_FILE = '.sync.lock';\nconst STALE_LOCK_MS = 5 * 60 * 1000;\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst PRIVATE_FILE_MODE = 0o600;\n\nexport interface SyncIdentity {\n repositoryId: string;\n worktreeId: string;\n}\n\nexport interface SyncLocation {\n identity: SyncIdentity;\n repositoryLabel: string;\n worktreeLabel: string;\n repositoryDirectory: string;\n sharedCacheDirectory: string;\n directory: string;\n statePath: string;\n legacyDirectory: string;\n legacyStatePath: 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 readGitDirectory(repositoryRoot: string): string | undefined {\n const gitPath = path.join(repositoryRoot, GIT_DIRECTORY);\n try {\n const stat = fs.statSync(gitPath);\n if (stat.isDirectory()) return canonicalPath(gitPath);\n if (!stat.isFile()) return undefined;\n const match = /^gitdir:\\s*(.+)$/imu.exec(fs.readFileSync(gitPath, 'utf8').trim());\n return match?.[1] ? canonicalPath(path.resolve(repositoryRoot, match[1].trim())) : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction gitCommonDirectory(repositoryRoot: string): string | undefined {\n const gitDirectory = readGitDirectory(repositoryRoot);\n if (!gitDirectory) return undefined;\n try {\n const relative = fs.readFileSync(path.join(gitDirectory, COMMON_DIRECTORY_FILE), 'utf8').trim();\n return relative ? canonicalPath(path.resolve(gitDirectory, relative)) : gitDirectory;\n } catch {\n return gitDirectory;\n }\n}\n\nfunction identityHash(value: string): string {\n return crypto.createHash('sha256').update(value, 'utf8').digest('hex').slice(0, IDENTITY_HEX_LENGTH);\n}\n\nexport function sanitizeSyncLabel(value: string, fallback: string): string {\n const normalized = value\n .normalize('NFKD')\n .replace(/[\\u0300-\\u036f]/gu, '')\n .replace(/[^A-Za-z0-9._-]+/gu, '-')\n .replace(/^[._-]+|[._-]+$/gu, '')\n .slice(0, LABEL_MAX_LENGTH)\n .replace(/[._-]+$/gu, '');\n return normalized === '' || normalized === '.' || normalized === '..' ? fallback : normalized;\n}\n\nfunction repositoryLabel(commonDirectory: string | undefined, repositoryRoot: string): string {\n if (!commonDirectory) return sanitizeSyncLabel(path.basename(repositoryRoot), DEFAULT_REPOSITORY_LABEL);\n const base = path.basename(commonDirectory);\n const source = base === GIT_DIRECTORY ? path.basename(path.dirname(commonDirectory)) : base;\n return sanitizeSyncLabel(source, DEFAULT_REPOSITORY_LABEL);\n}\n\nexport function resolveSyncLocation(repositoryRoot: string, homeDirectory: string = os.homedir()): SyncLocation {\n const root = canonicalPath(repositoryRoot);\n const commonDirectory = gitCommonDirectory(root);\n const repositoryToken = commonDirectory ? `git:${commonDirectory}` : `root:${root}`;\n const identity: SyncIdentity = {\n repositoryId: identityHash(repositoryToken),\n worktreeId: identityHash(`${repositoryToken}\\0worktree:${root}`),\n };\n const repoLabel = repositoryLabel(commonDirectory, root);\n const worktreeLabel = sanitizeSyncLabel(path.basename(root), DEFAULT_WORKTREE_LABEL);\n const generatedRoot = path.join(path.resolve(homeDirectory), PI_DIRECTORY, DOOM_CONFIG_DIRECTORY, SYNC_DIRECTORY);\n const repositoryDirectory = path.join(generatedRoot, `${repoLabel}--${identity.repositoryId}`);\n const directory = path.join(repositoryDirectory, WORKTREES_DIRECTORY, `${worktreeLabel}--${identity.worktreeId}`);\n const legacyDirectory = path.join(root, PI_DIRECTORY, LEGACY_DOOM_DIRECTORY);\n return {\n identity,\n repositoryLabel: repoLabel,\n worktreeLabel,\n repositoryDirectory,\n sharedCacheDirectory: path.join(repositoryDirectory, SHARED_CACHE_DIRECTORY),\n directory,\n statePath: path.join(directory, 'state.json'),\n legacyDirectory,\n legacyStatePath: path.join(legacyDirectory, 'state.json'),\n };\n}\n\nfunction rejectSymlink(target: string): void {\n try {\n if (fs.lstatSync(target).isSymbolicLink()) {\n throw new Error(`Doom sync namespace must not contain a symbolic link: ${target}`);\n }\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') return;\n throw error;\n }\n}\n\nfunction removeStaleLock(lockPath: string): void {\n try {\n const stat = fs.statSync(lockPath);\n if (Date.now() - stat.mtimeMs > STALE_LOCK_MS) fs.rmSync(lockPath, { force: true });\n } catch (error) {\n if (!(error instanceof Error && 'code' in error && error.code === 'ENOENT')) throw error;\n }\n}\n\n/** Acquires the exclusive publisher lock for one worktree namespace. */\nexport async function acquireSyncLocationLock(location: SyncLocation): Promise<() => Promise<void>> {\n assertSyncLocationSafe(location);\n await fs.promises.mkdir(location.directory, { mode: PRIVATE_DIRECTORY_MODE, recursive: true });\n await fs.promises.chmod(location.directory, PRIVATE_DIRECTORY_MODE);\n const lockPath = path.join(location.directory, LOCK_FILE);\n removeStaleLock(lockPath);\n let handle: fs.promises.FileHandle;\n try {\n handle = await fs.promises.open(lockPath, 'wx', PRIVATE_FILE_MODE);\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 'EEXIST') {\n throw new Error(`Another Doom sync is already publishing ${location.directory}`);\n }\n throw error;\n }\n await handle.writeFile(`${process.pid}\\n`);\n return async () => {\n await handle.close();\n await fs.promises.rm(lockPath, { force: true });\n };\n}\n\n/** Refuses generated namespace redirection before a writer creates or prunes it. */\nexport function assertSyncLocationSafe(location: SyncLocation): void {\n const syncRoot = path.dirname(location.repositoryDirectory);\n const doomRoot = path.dirname(syncRoot);\n const piRoot = path.dirname(doomRoot);\n const worktreesRoot = path.dirname(location.directory);\n for (const target of [piRoot, doomRoot, syncRoot, location.repositoryDirectory, worktreesRoot, location.directory]) {\n rejectSymlink(target);\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ //#region src/adapters/syncLocation.d.ts
2
+ interface SyncIdentity {
3
+ repositoryId: string;
4
+ worktreeId: string;
5
+ }
6
+ interface SyncLocation {
7
+ identity: SyncIdentity;
8
+ repositoryLabel: string;
9
+ worktreeLabel: string;
10
+ repositoryDirectory: string;
11
+ sharedCacheDirectory: string;
12
+ directory: string;
13
+ statePath: string;
14
+ legacyDirectory: string;
15
+ legacyStatePath: string;
16
+ }
17
+ //#endregion
18
+ export { SyncIdentity, SyncLocation };
19
+ //# sourceMappingURL=syncLocation.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncLocation.d.cts","names":[],"sources":["../../src/adapters/syncLocation.ts"],"mappings":";UAsBiB,YAAA;EACf,YAAA;EACA,UAAA;AAAA;AAAA,UAGe,YAAA;EACf,QAAA,EAAU,YAAA;EACV,eAAA;EACA,aAAA;EACA,mBAAA;EACA,oBAAA;EACA,SAAA;EACA,SAAA;EACA,eAAA;EACA,eAAA;AAAA"}
@@ -0,0 +1,19 @@
1
+ //#region src/adapters/syncLocation.d.ts
2
+ interface SyncIdentity {
3
+ repositoryId: string;
4
+ worktreeId: string;
5
+ }
6
+ interface SyncLocation {
7
+ identity: SyncIdentity;
8
+ repositoryLabel: string;
9
+ worktreeLabel: string;
10
+ repositoryDirectory: string;
11
+ sharedCacheDirectory: string;
12
+ directory: string;
13
+ statePath: string;
14
+ legacyDirectory: string;
15
+ legacyStatePath: string;
16
+ }
17
+ //#endregion
18
+ export { SyncIdentity, SyncLocation };
19
+ //# sourceMappingURL=syncLocation.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncLocation.d.mts","names":[],"sources":["../../src/adapters/syncLocation.ts"],"mappings":";UAsBiB,YAAA;EACf,YAAA;EACA,UAAA;AAAA;AAAA,UAGe,YAAA;EACf,QAAA,EAAU,YAAA;EACV,eAAA;EACA,aAAA;EACA,mBAAA;EACA,oBAAA;EACA,SAAA;EACA,SAAA;EACA,eAAA;EACA,eAAA;AAAA"}
@@ -0,0 +1,2 @@
1
+ import e from"node:path";import t from"node:fs";import n from"node:os";import r from"node:crypto";const i=`.git`,a=`repo`;function o(n){let r=e.resolve(n);try{return t.realpathSync.native(r)}catch{return r}}function s(n){let r=e.join(n,i);try{let i=t.statSync(r);if(i.isDirectory())return o(r);if(!i.isFile())return;let a=/^gitdir:\s*(.+)$/imu.exec(t.readFileSync(r,`utf8`).trim());return a?.[1]?o(e.resolve(n,a[1].trim())):void 0}catch{return}}function c(n){let r=s(n);if(r)try{let n=t.readFileSync(e.join(r,`commondir`),`utf8`).trim();return n?o(e.resolve(r,n)):r}catch{return r}}function l(e){return r.createHash(`sha256`).update(e,`utf8`).digest(`hex`).slice(0,32)}function u(e,t){let n=e.normalize(`NFKD`).replace(/[\u0300-\u036f]/gu,``).replace(/[^A-Za-z0-9._-]+/gu,`-`).replace(/^[._-]+|[._-]+$/gu,``).slice(0,48).replace(/[._-]+$/gu,``);return n===``||n===`.`||n===`..`?t:n}function d(t,n){if(!t)return u(e.basename(n),a);let r=e.basename(t);return u(r===i?e.basename(e.dirname(t)):r,a)}function f(t,r=n.homedir()){let i=o(t),a=c(i),s=a?`git:${a}`:`root:${i}`,f={repositoryId:l(s),worktreeId:l(`${s}\0worktree:${i}`)},p=d(a,i),m=u(e.basename(i),`worktree`),h=e.join(e.resolve(r),`.pi`,`.doom`,`sync`),g=e.join(h,`${p}--${f.repositoryId}`),_=e.join(g,`worktrees`,`${m}--${f.worktreeId}`),v=e.join(i,`.pi`,`doom`);return{identity:f,repositoryLabel:p,worktreeLabel:m,repositoryDirectory:g,sharedCacheDirectory:e.join(g,`shared-cache`),directory:_,statePath:e.join(_,`state.json`),legacyDirectory:v,legacyStatePath:e.join(v,`state.json`)}}function p(e){try{if(t.lstatSync(e).isSymbolicLink())throw Error(`Doom sync namespace must not contain a symbolic link: ${e}`)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;throw e}}function m(e){try{let n=t.statSync(e);Date.now()-n.mtimeMs>3e5&&t.rmSync(e,{force:!0})}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}}async function h(n){g(n),await t.promises.mkdir(n.directory,{mode:448,recursive:!0}),await t.promises.chmod(n.directory,448);let r=e.join(n.directory,`.sync.lock`);m(r);let i;try{i=await t.promises.open(r,`wx`,384)}catch(e){throw e instanceof Error&&`code`in e&&e.code===`EEXIST`?Error(`Another Doom sync is already publishing ${n.directory}`):e}return await i.writeFile(`${process.pid}\n`),async()=>{await i.close(),await t.promises.rm(r,{force:!0})}}function g(t){let n=e.dirname(t.repositoryDirectory),r=e.dirname(n),i=e.dirname(r),a=e.dirname(t.directory);for(let e of[i,r,n,t.repositoryDirectory,a,t.directory])p(e)}export{h as acquireSyncLocationLock,g as assertSyncLocationSafe,f as resolveSyncLocation};
2
+ //# sourceMappingURL=syncLocation.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncLocation.mjs","names":[],"sources":["../../src/adapters/syncLocation.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nconst PI_DIRECTORY = '.pi';\nconst DOOM_CONFIG_DIRECTORY = '.doom';\nconst SYNC_DIRECTORY = 'sync';\nconst WORKTREES_DIRECTORY = 'worktrees';\nconst SHARED_CACHE_DIRECTORY = 'shared-cache';\nconst LEGACY_DOOM_DIRECTORY = 'doom';\nconst GIT_DIRECTORY = '.git';\nconst COMMON_DIRECTORY_FILE = 'commondir';\nconst IDENTITY_HEX_LENGTH = 32;\nconst LABEL_MAX_LENGTH = 48;\nconst DEFAULT_REPOSITORY_LABEL = 'repo';\nconst DEFAULT_WORKTREE_LABEL = 'worktree';\nconst LOCK_FILE = '.sync.lock';\nconst STALE_LOCK_MS = 5 * 60 * 1000;\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst PRIVATE_FILE_MODE = 0o600;\n\nexport interface SyncIdentity {\n repositoryId: string;\n worktreeId: string;\n}\n\nexport interface SyncLocation {\n identity: SyncIdentity;\n repositoryLabel: string;\n worktreeLabel: string;\n repositoryDirectory: string;\n sharedCacheDirectory: string;\n directory: string;\n statePath: string;\n legacyDirectory: string;\n legacyStatePath: 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 readGitDirectory(repositoryRoot: string): string | undefined {\n const gitPath = path.join(repositoryRoot, GIT_DIRECTORY);\n try {\n const stat = fs.statSync(gitPath);\n if (stat.isDirectory()) return canonicalPath(gitPath);\n if (!stat.isFile()) return undefined;\n const match = /^gitdir:\\s*(.+)$/imu.exec(fs.readFileSync(gitPath, 'utf8').trim());\n return match?.[1] ? canonicalPath(path.resolve(repositoryRoot, match[1].trim())) : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction gitCommonDirectory(repositoryRoot: string): string | undefined {\n const gitDirectory = readGitDirectory(repositoryRoot);\n if (!gitDirectory) return undefined;\n try {\n const relative = fs.readFileSync(path.join(gitDirectory, COMMON_DIRECTORY_FILE), 'utf8').trim();\n return relative ? canonicalPath(path.resolve(gitDirectory, relative)) : gitDirectory;\n } catch {\n return gitDirectory;\n }\n}\n\nfunction identityHash(value: string): string {\n return crypto.createHash('sha256').update(value, 'utf8').digest('hex').slice(0, IDENTITY_HEX_LENGTH);\n}\n\nexport function sanitizeSyncLabel(value: string, fallback: string): string {\n const normalized = value\n .normalize('NFKD')\n .replace(/[\\u0300-\\u036f]/gu, '')\n .replace(/[^A-Za-z0-9._-]+/gu, '-')\n .replace(/^[._-]+|[._-]+$/gu, '')\n .slice(0, LABEL_MAX_LENGTH)\n .replace(/[._-]+$/gu, '');\n return normalized === '' || normalized === '.' || normalized === '..' ? fallback : normalized;\n}\n\nfunction repositoryLabel(commonDirectory: string | undefined, repositoryRoot: string): string {\n if (!commonDirectory) return sanitizeSyncLabel(path.basename(repositoryRoot), DEFAULT_REPOSITORY_LABEL);\n const base = path.basename(commonDirectory);\n const source = base === GIT_DIRECTORY ? path.basename(path.dirname(commonDirectory)) : base;\n return sanitizeSyncLabel(source, DEFAULT_REPOSITORY_LABEL);\n}\n\nexport function resolveSyncLocation(repositoryRoot: string, homeDirectory: string = os.homedir()): SyncLocation {\n const root = canonicalPath(repositoryRoot);\n const commonDirectory = gitCommonDirectory(root);\n const repositoryToken = commonDirectory ? `git:${commonDirectory}` : `root:${root}`;\n const identity: SyncIdentity = {\n repositoryId: identityHash(repositoryToken),\n worktreeId: identityHash(`${repositoryToken}\\0worktree:${root}`),\n };\n const repoLabel = repositoryLabel(commonDirectory, root);\n const worktreeLabel = sanitizeSyncLabel(path.basename(root), DEFAULT_WORKTREE_LABEL);\n const generatedRoot = path.join(path.resolve(homeDirectory), PI_DIRECTORY, DOOM_CONFIG_DIRECTORY, SYNC_DIRECTORY);\n const repositoryDirectory = path.join(generatedRoot, `${repoLabel}--${identity.repositoryId}`);\n const directory = path.join(repositoryDirectory, WORKTREES_DIRECTORY, `${worktreeLabel}--${identity.worktreeId}`);\n const legacyDirectory = path.join(root, PI_DIRECTORY, LEGACY_DOOM_DIRECTORY);\n return {\n identity,\n repositoryLabel: repoLabel,\n worktreeLabel,\n repositoryDirectory,\n sharedCacheDirectory: path.join(repositoryDirectory, SHARED_CACHE_DIRECTORY),\n directory,\n statePath: path.join(directory, 'state.json'),\n legacyDirectory,\n legacyStatePath: path.join(legacyDirectory, 'state.json'),\n };\n}\n\nfunction rejectSymlink(target: string): void {\n try {\n if (fs.lstatSync(target).isSymbolicLink()) {\n throw new Error(`Doom sync namespace must not contain a symbolic link: ${target}`);\n }\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') return;\n throw error;\n }\n}\n\nfunction removeStaleLock(lockPath: string): void {\n try {\n const stat = fs.statSync(lockPath);\n if (Date.now() - stat.mtimeMs > STALE_LOCK_MS) fs.rmSync(lockPath, { force: true });\n } catch (error) {\n if (!(error instanceof Error && 'code' in error && error.code === 'ENOENT')) throw error;\n }\n}\n\n/** Acquires the exclusive publisher lock for one worktree namespace. */\nexport async function acquireSyncLocationLock(location: SyncLocation): Promise<() => Promise<void>> {\n assertSyncLocationSafe(location);\n await fs.promises.mkdir(location.directory, { mode: PRIVATE_DIRECTORY_MODE, recursive: true });\n await fs.promises.chmod(location.directory, PRIVATE_DIRECTORY_MODE);\n const lockPath = path.join(location.directory, LOCK_FILE);\n removeStaleLock(lockPath);\n let handle: fs.promises.FileHandle;\n try {\n handle = await fs.promises.open(lockPath, 'wx', PRIVATE_FILE_MODE);\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 'EEXIST') {\n throw new Error(`Another Doom sync is already publishing ${location.directory}`);\n }\n throw error;\n }\n await handle.writeFile(`${process.pid}\\n`);\n return async () => {\n await handle.close();\n await fs.promises.rm(lockPath, { force: true });\n };\n}\n\n/** Refuses generated namespace redirection before a writer creates or prunes it. */\nexport function assertSyncLocationSafe(location: SyncLocation): void {\n const syncRoot = path.dirname(location.repositoryDirectory);\n const doomRoot = path.dirname(syncRoot);\n const piRoot = path.dirname(doomRoot);\n const worktreesRoot = path.dirname(location.directory);\n for (const target of [piRoot, doomRoot, syncRoot, location.repositoryDirectory, worktreesRoot, location.directory]) {\n rejectSymlink(target);\n }\n}\n"],"mappings":"kGAKA,MAMM,EAAgB,OAIhB,EAA2B,OAwBjC,SAAS,EAAc,EAAwB,CAC7C,IAAM,EAAW,EAAK,QAAQ,EAAO,CACrC,GAAI,CACF,OAAO,EAAG,aAAa,OAAO,EAAS,MACjC,CACN,OAAO,GAIX,SAAS,EAAiB,EAA4C,CACpE,IAAM,EAAU,EAAK,KAAK,EAAgB,EAAc,CACxD,GAAI,CACF,IAAM,EAAO,EAAG,SAAS,EAAQ,CACjC,GAAI,EAAK,aAAa,CAAE,OAAO,EAAc,EAAQ,CACrD,GAAI,CAAC,EAAK,QAAQ,CAAE,OACpB,IAAM,EAAQ,sBAAsB,KAAK,EAAG,aAAa,EAAS,OAAO,CAAC,MAAM,CAAC,CACjF,OAAO,IAAQ,GAAK,EAAc,EAAK,QAAQ,EAAgB,EAAM,GAAG,MAAM,CAAC,CAAC,CAAG,IAAA,QAC7E,CACN,QAIJ,SAAS,EAAmB,EAA4C,CACtE,IAAM,EAAe,EAAiB,EAAe,CAChD,KACL,GAAI,CACF,IAAM,EAAW,EAAG,aAAa,EAAK,KAAK,EAAc,YAAsB,CAAE,OAAO,CAAC,MAAM,CAC/F,OAAO,EAAW,EAAc,EAAK,QAAQ,EAAc,EAAS,CAAC,CAAG,OAClE,CACN,OAAO,GAIX,SAAS,EAAa,EAAuB,CAC3C,OAAO,EAAO,WAAW,SAAS,CAAC,OAAO,EAAO,OAAO,CAAC,OAAO,MAAM,CAAC,MAAM,EAAG,GAAoB,CAGtG,SAAgB,EAAkB,EAAe,EAA0B,CACzE,IAAM,EAAa,EAChB,UAAU,OAAO,CACjB,QAAQ,oBAAqB,GAAG,CAChC,QAAQ,qBAAsB,IAAI,CAClC,QAAQ,oBAAqB,GAAG,CAChC,MAAM,EAAG,GAAiB,CAC1B,QAAQ,YAAa,GAAG,CAC3B,OAAO,IAAe,IAAM,IAAe,KAAO,IAAe,KAAO,EAAW,EAGrF,SAAS,EAAgB,EAAqC,EAAgC,CAC5F,GAAI,CAAC,EAAiB,OAAO,EAAkB,EAAK,SAAS,EAAe,CAAE,EAAyB,CACvG,IAAM,EAAO,EAAK,SAAS,EAAgB,CAE3C,OAAO,EADQ,IAAS,EAAgB,EAAK,SAAS,EAAK,QAAQ,EAAgB,CAAC,CAAG,EACtD,EAAyB,CAG5D,SAAgB,EAAoB,EAAwB,EAAwB,EAAG,SAAS,CAAgB,CAC9G,IAAM,EAAO,EAAc,EAAe,CACpC,EAAkB,EAAmB,EAAK,CAC1C,EAAkB,EAAkB,OAAO,IAAoB,QAAQ,IACvE,EAAyB,CAC7B,aAAc,EAAa,EAAgB,CAC3C,WAAY,EAAa,GAAG,EAAgB,aAAa,IAAO,CACjE,CACK,EAAY,EAAgB,EAAiB,EAAK,CAClD,EAAgB,EAAkB,EAAK,SAAS,EAAK,CAAE,WAAuB,CAC9E,EAAgB,EAAK,KAAK,EAAK,QAAQ,EAAc,CAAE,MAAc,QAAuB,OAAe,CAC3G,EAAsB,EAAK,KAAK,EAAe,GAAG,EAAU,IAAI,EAAS,eAAe,CACxF,EAAY,EAAK,KAAK,EAAqB,YAAqB,GAAG,EAAc,IAAI,EAAS,aAAa,CAC3G,EAAkB,EAAK,KAAK,EAAM,MAAc,OAAsB,CAC5E,MAAO,CACL,WACA,gBAAiB,EACjB,gBACA,sBACA,qBAAsB,EAAK,KAAK,EAAqB,eAAuB,CAC5E,YACA,UAAW,EAAK,KAAK,EAAW,aAAa,CAC7C,kBACA,gBAAiB,EAAK,KAAK,EAAiB,aAAa,CAC1D,CAGH,SAAS,EAAc,EAAsB,CAC3C,GAAI,CACF,GAAI,EAAG,UAAU,EAAO,CAAC,gBAAgB,CACvC,MAAU,MAAM,yDAAyD,IAAS,OAE7E,EAAO,CACd,GAAI,aAAiB,OAAS,SAAU,GAAS,EAAM,OAAS,SAAU,OAC1E,MAAM,GAIV,SAAS,EAAgB,EAAwB,CAC/C,GAAI,CACF,IAAM,EAAO,EAAG,SAAS,EAAS,CAC9B,KAAK,KAAK,CAAG,EAAK,QAAU,KAAe,EAAG,OAAO,EAAU,CAAE,MAAO,GAAM,CAAC,OAC5E,EAAO,CACd,GAAI,EAAE,aAAiB,OAAS,SAAU,GAAS,EAAM,OAAS,UAAW,MAAM,GAKvF,eAAsB,EAAwB,EAAsD,CAClG,EAAuB,EAAS,CAChC,MAAM,EAAG,SAAS,MAAM,EAAS,UAAW,CAAE,KAAM,IAAwB,UAAW,GAAM,CAAC,CAC9F,MAAM,EAAG,SAAS,MAAM,EAAS,UAAW,IAAuB,CACnE,IAAM,EAAW,EAAK,KAAK,EAAS,UAAW,aAAU,CACzD,EAAgB,EAAS,CACzB,IAAI,EACJ,GAAI,CACF,EAAS,MAAM,EAAG,SAAS,KAAK,EAAU,KAAM,IAAkB,OAC3D,EAAO,CAId,MAHI,aAAiB,OAAS,SAAU,GAAS,EAAM,OAAS,SACpD,MAAM,2CAA2C,EAAS,YAAY,CAE5E,EAGR,OADA,MAAM,EAAO,UAAU,GAAG,QAAQ,IAAI,IAAI,CACnC,SAAY,CACjB,MAAM,EAAO,OAAO,CACpB,MAAM,EAAG,SAAS,GAAG,EAAU,CAAE,MAAO,GAAM,CAAC,EAKnD,SAAgB,EAAuB,EAA8B,CACnE,IAAM,EAAW,EAAK,QAAQ,EAAS,oBAAoB,CACrD,EAAW,EAAK,QAAQ,EAAS,CACjC,EAAS,EAAK,QAAQ,EAAS,CAC/B,EAAgB,EAAK,QAAQ,EAAS,UAAU,CACtD,IAAK,IAAM,IAAU,CAAC,EAAQ,EAAU,EAAU,EAAS,oBAAqB,EAAe,EAAS,UAAU,CAChH,EAAc,EAAO"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`./syncLocation.cjs`),n=require(`./serialization/json.cjs`);require(`../utils/index.cjs`);const r=require(`../services/extensionAssembler.cjs`);require(`./syncStateContract.cjs`);let i=require(`node:path`);i=e.__toESM(i,1);let a=require(`node:fs`);a=e.__toESM(a,1);let o=require(`node:os`);o=e.__toESM(o,1);let s=require(`node:crypto`);s=e.__toESM(s,1);let c=require(`@agimon-ai/doompi-config/domains`),l=require(`@agimon-ai/doompi-config/profiles`);const u=`.doom`,d=`:entry:`,f=[`config.yaml`,`modes.yaml`,`domains.yaml`,`profiles.yaml`,`hooks.yaml`];function p(e,n=o.default.homedir()){return t.resolveSyncLocation(e,n).directory}function m(e,n=o.default.homedir()){return t.resolveSyncLocation(e,n).statePath}function h(e){return t.resolveSyncLocation(e).legacyDirectory}function g(e){return t.resolveSyncLocation(e).legacyStatePath}function _(e){let t=i.default.resolve(e);try{return a.default.realpathSync(t)}catch{let e=i.default.dirname(t);return e===t?t:i.default.join(_(e),i.default.basename(t))}}function v(e,t){let n=i.default.relative(_(e),_(t));return n===``||!n.startsWith(`..`)&&!i.default.isAbsolute(n)}function y(e,t){return _(e)===_(t)}function b(e,t=process.pid,n=o.default.homedir()){return i.default.join(p(e,n),`run`,String(t))}function x(e,t){let n=i.default.relative(e,t);return n.startsWith(`..`)||i.default.isAbsolute(n)?t:i.default.relative(i.default.join(e,`.pi`),t).split(i.default.sep).join(`/`)}function S(e){return a.default.existsSync(e)?a.default.readFileSync(e,`utf8`):``}function C(e,t,n=o.default.homedir()){let r=s.default.createHash(`sha256`);r.update(JSON.stringify({...t,domains:[...t.domains].sort()}));for(let t of[i.default.join(n,`.pi`,u),i.default.join(e,u)])for(let e of f)r.update(S(i.default.join(t,e)));let a=(0,c.loadDomains)(e,n).plugins;for(let e of a.roots)r.update(e);for(let e of a.diagnostics)r.update(e);for(let e of a.marketplaces)r.update(e),r.update(S(e));for(let[e,t]of Object.entries(a.entries).sort(([e],[t])=>e.localeCompare(t)))r.update(e),r.update(JSON.stringify(t.source)),t.manifest&&(r.update(t.manifest.path),r.update(S(t.manifest.path)));for(let t of(0,l.loadProfiles)(e,n)){r.update(t.name),r.update(t.personaRoot),r.update(t.persona),r.update(JSON.stringify(t.env));let e=i.default.resolve(t.personaRoot,t.persona);for(let t of l.PERSONA_FILES){let n=i.default.join(e,t);r.update(n),r.update(S(n))}}return r.digest(`hex`)}function w(e,t,r){if(!n.isRecord(e))throw Error(`Doom sync state at ${r} requires ${t} to be an object`);return Object.fromEntries(Object.entries(e).filter(e=>typeof e[1]==`string`))}function T(e,t){if(!n.isRecord(e)||typeof e.version!=`number`||e.strategy!==`native`&&e.strategy!==`bundle`||typeof e.bootstrapEntry!=`string`||e.bootstrapManifest!==void 0&&typeof e.bootstrapManifest!=`string`||!Array.isArray(e.manifests)||e.manifests.some(e=>typeof e!=`string`))throw Error(`Doom sync state at ${t} has an invalid precompile record`);return{version:e.version,strategy:e.strategy,bootstrapEntry:e.bootstrapEntry,bootstrapManifest:e.bootstrapManifest,manifests:e.manifests}}function E(e,t){return e.repositoryId===t.repositoryId&&e.worktreeId===t.worktreeId}function D(e,t){if(!n.isRecord(e)||typeof e.repositoryId!=`string`||typeof e.worktreeId!=`string`)throw Error(`Doom sync state at ${t} requires repository and worktree identity`);return{repositoryId:e.repositoryId,worktreeId:e.worktreeId}}function O(e,t,r){let i;try{i=JSON.parse(e)}catch(e){throw Error(`Doom sync state at ${t} is not valid JSON`,{cause:e})}if(!n.isRecord(i))throw Error(`Doom sync state at ${t} must be an object`);let a=r.legacy?new Set([8,9]):new Set([9]);if(typeof i.version!=`number`||!a.has(i.version))throw Error(`Doom sync state at ${t} has version ${String(i.version)}, expected 9. Run doompi sync.`);if(typeof i.root!=`string`||typeof i.inputsHash!=`string`)throw Error(`Doom sync state at ${t} requires string root and inputsHash`);if(!y(r.repoRoot,i.root))throw Error(`Doom sync state at ${t} belongs to a different repository: ${i.root}`);let o=i.identity===void 0&&r.legacy?r.location.identity:D(i.identity,t);if(!E(o,r.location.identity))throw Error(`Doom sync state at ${t} belongs to a different repository or worktree identity`);if(!n.isRecord(i.selection)||typeof i.selection.majorMode!=`string`)throw Error(`Doom sync state at ${t} requires a selection with a majorMode`);if(!n.isRecord(i.baseline)||typeof i.baseline.themePath!=`string`)throw Error(`Doom sync state at ${t} requires a baseline with a themePath`);let{majorMode:s,domains:c,profile:l,preset:u}=i.selection,d=n.isRecord(i.fileState)?i.fileState:{},f=r.legacy?r.location.legacyDirectory:r.location.directory,p=i.compiled===void 0?void 0:w(i.compiled,`compiled`,t),m=i.bundles===void 0?void 0:w(i.bundles,`bundles`,t),h=typeof i.bootstrap==`string`?i.bootstrap:void 0;if([h,...Object.values(p??{}),...Object.values(m??{})].filter(e=>e!==void 0).some(e=>!v(f,e)))throw Error(`Doom sync state at ${t} references generated material outside ${f}`);return{version:i.version,root:i.root,identity:o,inputsHash:i.inputsHash,selection:{majorMode:s,domains:Array.isArray(c)?c.filter(e=>typeof e==`string`):[],profile:typeof l==`string`?l:void 0,preset:typeof u==`string`?u:`default`},env:w(i.env,`env`,t),fileState:{profileEnvironment:n.isRecord(d.profileEnvironment)?d.profileEnvironment:{},pluginHooks:Array.isArray(d.pluginHooks)?d.pluginHooks:[]},resolved:w(i.resolved,`resolved`,t),compiled:p,bundles:m,bootstrap:h,precompile:i.precompile===void 0?void 0:T(i.precompile,t),baseline:i.baseline}}function k(e,n=o.default.homedir()){let r=t.resolveSyncLocation(e,n);if(a.default.existsSync(r.statePath))return{state:O(a.default.readFileSync(r.statePath,`utf8`),r.statePath,{repoRoot:e,location:r,legacy:!1}),location:r,layout:`global`};if(a.default.existsSync(r.legacyStatePath))return{state:O(a.default.readFileSync(r.legacyStatePath,`utf8`),r.legacyStatePath,{repoRoot:e,location:r,legacy:!0}),location:r,layout:`legacy`}}function A(e,t=o.default.homedir()){return k(e,t)?.state}function j(e){return`${JSON.stringify(e,null,2)}\n`}async function M(e,n,r=o.default.homedir()){let i=t.resolveSyncLocation(e,r);if(n.version!==9)throw Error(`Doom sync state writes require version 9`);if(!y(e,n.root)||!E(n.identity,i.identity))throw Error(`Refusing to write Doom sync state for a different repository or worktree`);t.assertSyncLocationSafe(i),await a.default.promises.mkdir(i.directory,{mode:448,recursive:!0});let c=`${i.statePath}.${process.pid}.${s.default.randomUUID()}.tmp`;try{await a.default.promises.writeFile(c,j(n),{mode:384}),await a.default.promises.rename(c,i.statePath)}catch(e){throw await a.default.promises.rm(c,{force:!0}),e}return i.statePath}function N(e){return`own:${e}`}function P(e){return`pkg:${e}`}function F(e,t){return t===0?P(e):`${P(e)}${d}${t}`}function I(e,t){return`local:${i.default.resolve(t,e)}`}function L(e,t,n){return n===0?I(e,t):`${I(e,t)}${d}${n}`}function R(e,t){return`local-package-name:${i.default.resolve(t,e)}`}function z(e=r.LAYER_RESOLVERS){let t={},n=e,i=(e,n)=>(e.forEach((e,r)=>{t[n(r)]=e}),e);return{resolved:t,ownEntry(n){let r=e.ownEntry(n);return t[N(n)]=r,r},packageEntry(n){let r=e.packageEntry(n);return t[P(n)]=r,r},optionalPackageEntry(n){let r=e.optionalPackageEntry(n);return r&&(t[P(n)]=r),r},packageEntries(t){return i(n.packageEntries?.(t)??[e.packageEntry(t)],e=>F(t,e))},optionalPackageEntries(t){let r=n.optionalPackageEntries?.(t);if(r===void 0){let n=e.optionalPackageEntry(t);r=n?[n]:void 0}return r?i(r,e=>F(t,e)):void 0},localEntry(n,r){let i=e.localEntry(n,r);return i&&(t[I(n,r)]=i),i},localEntries(t,r){let a=n.localEntries?.(t,r);if(a===void 0){let n=e.localEntry(t,r);a=n?[n]:void 0}return a?i(a,e=>L(t,r,e)):void 0},localPackageName(e,r){let i=n.localPackageName?.(e,r);return i&&(t[R(e,r)]=i),i}}}function B(e,t=r.LAYER_RESOLVERS){let n=z(t);for(let e of Object.values(r.CONTEXT_PACKAGES))n.optionalPackageEntry(e);return n.ownEntry(r.PERSONA_ENTRY),r.assembleExtensions({agents:!0,autoStop:!0,mute:!1,preset:r.OLLAMA_PRESET,layers:Object.keys(e.layers),majorModesConfig:e,resolvers:n}),r.assembleChildExtensions({agents:!1,autoStop:!1,mute:!0,preset:r.OLLAMA_PRESET,layers:Object.keys(e.layers),majorModesConfig:e,resolvers:n}),n.resolved}function V(e,t={}){let n=n=>t[n]??e[n],r=(e,t)=>{let r=n(e);if(!r)throw Error(`${t} is missing from the doompi sync state. Run doompi sync.`);return r},i=e=>{let t=n(e(0));if(!t)return;let r=[t];for(let t=1;;t+=1){let i=n(e(t));if(!i)break;r.push(i)}return r};return{ownEntry:e=>r(N(e),e),packageEntry:e=>r(P(e),e),optionalPackageEntry:e=>n(P(e)),packageEntries:e=>{let t=i(t=>F(e,t));if(!t)throw Error(`${e} is missing from the doompi sync state. Run doompi sync.`);return t},optionalPackageEntries:e=>i(t=>F(e,t)),localEntry:(e,t)=>n(I(e,t)),localEntries:(e,t)=>i(n=>L(e,t,n)),localPackageName:(t,n)=>e[R(t,n)]}}function H(e){if(!a.default.existsSync(e))return[];let t=JSON.parse(a.default.readFileSync(e,`utf8`));return n.isRecord(t.mcpServers)?Object.keys(t.mcpServers):[]}exports.computeInputsHash=C,exports.createMapResolvers=V,exports.createRecordingResolvers=z,exports.legacySyncDirectory=h,exports.legacySyncStatePath=g,exports.localEntryKey=L,exports.localKey=I,exports.localPackageNameKey=R,exports.ownKey=N,exports.packageEntryKey=F,exports.packageKey=P,exports.readLocatedSyncState=k,exports.readMcpServerNames=H,exports.readSyncState=A,exports.recordResolvedEntries=B,exports.runDirectory=b,exports.serializeSyncState=j,exports.settingsRelativePath=x,exports.syncDirectory=p,exports.syncStatePath=m,exports.syncStateRootMatches=y,exports.writeSyncState=M;
2
+ //# sourceMappingURL=syncState.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncState.cjs","names":["os","resolveSyncLocation","path","fs","crypto","PERSONA_FILES","isRecord","LAYER_RESOLVERS","CONTEXT_PACKAGES","PERSONA_ENTRY","OLLAMA_PRESET"],"sources":["../../src/adapters/syncState.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { loadDomains } from '@agimon-ai/doompi-config/domains';\nimport type { LayerResolvers, MajorModesConfig } from '@agimon-ai/doompi-config/majorModes';\nimport { loadProfiles, PERSONA_FILES } from '@agimon-ai/doompi-config/profiles';\nimport type { HarnessState } from '@agimon-ai/doompi-config/types';\nimport {\n assembleChildExtensions,\n assembleExtensions,\n CONTEXT_PACKAGES,\n type ExtensionLayerResolvers,\n LAYER_RESOLVERS,\n OLLAMA_PRESET,\n PERSONA_ENTRY,\n} from '../services/extensionAssembler.ts';\nimport { isRecord, type JsonObject } from '../utils/index.ts';\nimport { assertSyncLocationSafe, resolveSyncLocation, type SyncIdentity, type SyncLocation } from './syncLocation.ts';\nimport { SYNC_STATE_VERSION } from './syncStateContract.ts';\n\nexport { SYNC_STATE_VERSION } from './syncStateContract.ts';\n\n/**\n * The file `doom-pi sync` writes and the doom-pi Pi extension reads back.\n *\n * This is the whole contract between the two halves of the synced path. Sync\n * runs in plain Node, where module resolution and the repository config are\n * available; the extension runs inside a Pi session, where neither can be\n * relied on. Everything the extension needs is therefore resolved once here,\n * and everything in this file has to survive JSON.\n */\n\nconst PI_DIRECTORY = '.pi';\n/** The `.doom` config directory name, under both the repo root and `~/.pi`. */\nconst DOOM_CONFIG_DIRECTORY = '.doom';\nconst RUN_DIRECTORY = 'run';\nconst DEFAULT_PRESET = 'default';\nconst PRIVATE_FILE_MODE = 0o600;\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst OWN_PREFIX = 'own:';\nconst PACKAGE_PREFIX = 'pkg:';\nconst LOCAL_PREFIX = 'local:';\nconst LOCAL_PACKAGE_NAME_PREFIX = 'local-package-name:';\nconst ENTRY_INDEX_SEPARATOR = ':entry:';\nconst LEGACY_SYNC_STATE_VERSION = 8;\n\n/** Config that feeds a sync, in the order the hash reads it. */\nconst HASHED_CONFIG_FILES = ['config.yaml', 'modes.yaml', 'domains.yaml', 'profiles.yaml', 'hooks.yaml'] as const;\n\nexport interface SyncSelection {\n majorMode: string;\n domains: string[];\n profile?: string;\n preset: string;\n}\n\n/** Paths to the resources sync staged, before any live switch replaces them. */\nexport interface SyncBaseline {\n mcpConfigPath?: string;\n personaFile?: string;\n themePath: string;\n themeName: string;\n}\n\nexport interface SyncPrecompileState {\n /** Version of the lightweight freshness contract used by package startup. */\n version: number;\n strategy: 'native' | 'bundle';\n /** Package entry the generated bootstrap delegates to or bundles. */\n bootstrapEntry: string;\n /** Compiler manifest whose output is a graph-bundled package bootstrap. */\n bootstrapManifest?: string;\n /** Compiler manifests covering optional graph-bundled output. */\n manifests: string[];\n}\n\nexport interface SyncState {\n version: number;\n root: string;\n /** Canonical repository and worktree namespace that owns this state. */\n identity: SyncIdentity;\n /** Hash of the config that produced this state, for the staleness warning. */\n inputsHash: string;\n selection: SyncSelection;\n /** Harness environment the extension applies when the values are unset. */\n env: Record<string, string>;\n /**\n * State the environment does not carry, so it has to be recorded on its own.\n *\n * Plugin hooks and the profile's environment defaults live in the session\n * state file rather than in variables. Without them here a synced session\n * would start with no plugin hooks at all, which fails silently.\n */\n fileState: Pick<HarnessState, 'profileEnvironment' | 'pluginHooks'>;\n /** Entry name to absolute path, covering every layer, not just the selected mode's. */\n resolved: Record<string, string>;\n /**\n * The same entries after TypeScript ones were bundled to plain ESM.\n *\n * Kept apart from `resolved` so the staleness check still compares resolution\n * against resolution; a state written before this existed simply has none and\n * falls back to loading the source.\n */\n compiled?: Record<string, string>;\n /** Aggregate entry by ordered extension-set key. */\n bundles?: Record<string, string>;\n /** Graph-compiled synced bootstrap dynamically loaded by the package entry. */\n bootstrap?: string;\n /** Inputs used to validate generated artifacts without loading the compiler. */\n precompile?: SyncPrecompileState;\n baseline: SyncBaseline;\n}\n\nexport function syncDirectory(repoRoot: string, homeDirectory: string = os.homedir()): string {\n return resolveSyncLocation(repoRoot, homeDirectory).directory;\n}\n\nexport function syncStatePath(repoRoot: string, homeDirectory: string = os.homedir()): string {\n return resolveSyncLocation(repoRoot, homeDirectory).statePath;\n}\n\nexport function legacySyncDirectory(repoRoot: string): string {\n return resolveSyncLocation(repoRoot).legacyDirectory;\n}\n\nexport function legacySyncStatePath(repoRoot: string): string {\n return resolveSyncLocation(repoRoot).legacyStatePath;\n}\n\nfunction canonicalPath(target: string): string {\n const absolute = path.resolve(target);\n try {\n return fs.realpathSync(absolute);\n } catch {\n const parent = path.dirname(absolute);\n if (parent === absolute) return absolute;\n return path.join(canonicalPath(parent), path.basename(absolute));\n }\n}\n\nfunction isInside(directory: string, target: string): boolean {\n const relative = path.relative(canonicalPath(directory), canonicalPath(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\n/** Whether generated state belongs to the repository that is reading it. */\nexport function syncStateRootMatches(repoRoot: string, stateRoot: string): boolean {\n return canonicalPath(repoRoot) === canonicalPath(stateRoot);\n}\n\n/**\n * Per-process scratch directory for live `/domains` and `/profile` switches.\n *\n * Switching rewrites the MCP config and the persona prompt. Writing those back\n * into the synced directory would both mutate the pinned baseline and let two\n * Pi sessions in one repository overwrite each other, which the launcher avoids\n * by giving every run its own temporary directory.\n */\nexport function runDirectory(\n repoRoot: string,\n processId: number = process.pid,\n homeDirectory: string = os.homedir(),\n): string {\n return path.join(syncDirectory(repoRoot, homeDirectory), RUN_DIRECTORY, String(processId));\n}\n\n/**\n * How a Pi project settings file should refer to a generated path.\n *\n * Relative to `.pi` when the target lives in the repository, which keeps the\n * committed settings file identical on every machine. A doom-pi installed\n * outside the repository stays absolute: Pi accepts both, and a relative path\n * climbing out of the project would be neither portable nor readable.\n */\nexport function settingsRelativePath(repoRoot: string, target: string): string {\n const relative = path.relative(repoRoot, target);\n if (relative.startsWith('..') || path.isAbsolute(relative)) return target;\n return path.relative(path.join(repoRoot, PI_DIRECTORY), target).split(path.sep).join('/');\n}\n\nfunction readIfPresent(filePath: string): string {\n return fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf8') : '';\n}\n\n/**\n * Hashes the configuration a sync consumed.\n *\n * Deliberately cheap: the extension recomputes this on every session start, so\n * it reads config, marketplace, local plugin manifests, and profile persona text\n * without downloading plugins or re-resolving packages. A dependency upgrade that\n * moves a package path therefore does not show up here; `doom-pi sync --check`\n * re-resolves and is the check that catches that.\n */\nexport function computeInputsHash(\n repoRoot: string,\n selection: SyncSelection,\n homeDirectory: string = os.homedir(),\n): string {\n const hash = crypto.createHash('sha256');\n hash.update(JSON.stringify({ ...selection, domains: [...selection.domains].sort() }));\n // Every .doom document layers the global copy under the repository one, so an\n // edit in either location is a real change.\n for (const directory of [\n path.join(homeDirectory, PI_DIRECTORY, DOOM_CONFIG_DIRECTORY),\n path.join(repoRoot, DOOM_CONFIG_DIRECTORY),\n ]) {\n for (const fileName of HASHED_CONFIG_FILES) hash.update(readIfPresent(path.join(directory, fileName)));\n }\n\n const catalog = loadDomains(repoRoot, homeDirectory).plugins;\n for (const root of catalog.roots) hash.update(root);\n for (const diagnostic of catalog.diagnostics) hash.update(diagnostic);\n for (const marketplace of catalog.marketplaces) {\n hash.update(marketplace);\n hash.update(readIfPresent(marketplace));\n }\n for (const [name, plugin] of Object.entries(catalog.entries).sort(([left], [right]) => left.localeCompare(right))) {\n hash.update(name);\n hash.update(JSON.stringify(plugin.source));\n if (plugin.manifest) {\n hash.update(plugin.manifest.path);\n hash.update(readIfPresent(plugin.manifest.path));\n }\n }\n\n for (const profile of loadProfiles(repoRoot, homeDirectory)) {\n hash.update(profile.name);\n hash.update(profile.personaRoot);\n hash.update(profile.persona);\n hash.update(JSON.stringify(profile.env));\n const personaDirectory = path.resolve(profile.personaRoot, profile.persona);\n for (const fileName of PERSONA_FILES) {\n const filePath = path.join(personaDirectory, fileName);\n hash.update(filePath);\n hash.update(readIfPresent(filePath));\n }\n }\n return hash.digest('hex');\n}\n\nfunction stringRecord(value: unknown, field: string, statePath: string): Record<string, string> {\n if (!isRecord(value)) throw new Error(`Doom sync state at ${statePath} requires ${field} to be an object`);\n return Object.fromEntries(\n Object.entries(value).filter((entry): entry is [string, string] => typeof entry[1] === 'string'),\n );\n}\n\nfunction parsePrecompileState(value: unknown, statePath: string): SyncPrecompileState {\n if (\n !isRecord(value) ||\n typeof value.version !== 'number' ||\n (value.strategy !== 'native' && value.strategy !== 'bundle') ||\n typeof value.bootstrapEntry !== 'string' ||\n (value.bootstrapManifest !== undefined && typeof value.bootstrapManifest !== 'string') ||\n !Array.isArray(value.manifests) ||\n value.manifests.some((manifest) => typeof manifest !== 'string')\n ) {\n throw new Error(`Doom sync state at ${statePath} has an invalid precompile record`);\n }\n return {\n version: value.version,\n strategy: value.strategy,\n bootstrapEntry: value.bootstrapEntry,\n bootstrapManifest: value.bootstrapManifest as string | undefined,\n manifests: value.manifests as string[],\n };\n}\n\ninterface ParseSyncStateOptions {\n repoRoot: string;\n location: SyncLocation;\n legacy: boolean;\n}\n\nfunction identityMatches(left: SyncIdentity, right: SyncIdentity): boolean {\n return left.repositoryId === right.repositoryId && left.worktreeId === right.worktreeId;\n}\n\nfunction parseSyncIdentity(value: unknown, statePath: string): SyncIdentity {\n if (!isRecord(value) || typeof value.repositoryId !== 'string' || typeof value.worktreeId !== 'string') {\n throw new Error(`Doom sync state at ${statePath} requires repository and worktree identity`);\n }\n return { repositoryId: value.repositoryId, worktreeId: value.worktreeId };\n}\n\nfunction parseSyncState(source: string, statePath: string, options: ParseSyncStateOptions): SyncState {\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch (error) {\n throw new Error(`Doom sync state at ${statePath} is not valid JSON`, { cause: error });\n }\n if (!isRecord(parsed)) throw new Error(`Doom sync state at ${statePath} must be an object`);\n const acceptedVersions = options.legacy\n ? new Set([LEGACY_SYNC_STATE_VERSION, SYNC_STATE_VERSION])\n : new Set([SYNC_STATE_VERSION]);\n if (typeof parsed.version !== 'number' || !acceptedVersions.has(parsed.version)) {\n throw new Error(\n `Doom sync state at ${statePath} has version ${String(parsed.version)}, expected ${SYNC_STATE_VERSION}. Run doompi sync.`,\n );\n }\n if (typeof parsed.root !== 'string' || typeof parsed.inputsHash !== 'string') {\n throw new Error(`Doom sync state at ${statePath} requires string root and inputsHash`);\n }\n if (!syncStateRootMatches(options.repoRoot, parsed.root)) {\n throw new Error(`Doom sync state at ${statePath} belongs to a different repository: ${parsed.root}`);\n }\n const identity =\n parsed.identity === undefined && options.legacy\n ? options.location.identity\n : parseSyncIdentity(parsed.identity, statePath);\n if (!identityMatches(identity, options.location.identity)) {\n throw new Error(`Doom sync state at ${statePath} belongs to a different repository or worktree identity`);\n }\n if (!isRecord(parsed.selection) || typeof parsed.selection.majorMode !== 'string') {\n throw new Error(`Doom sync state at ${statePath} requires a selection with a majorMode`);\n }\n if (!isRecord(parsed.baseline) || typeof parsed.baseline.themePath !== 'string') {\n throw new Error(`Doom sync state at ${statePath} requires a baseline with a themePath`);\n }\n const { majorMode, domains, profile, preset } = parsed.selection;\n const fileState = isRecord(parsed.fileState) ? parsed.fileState : {};\n const generatedDirectory = options.legacy ? options.location.legacyDirectory : options.location.directory;\n const compiled = parsed.compiled === undefined ? undefined : stringRecord(parsed.compiled, 'compiled', statePath);\n const bundles = parsed.bundles === undefined ? undefined : stringRecord(parsed.bundles, 'bundles', statePath);\n const bootstrap = typeof parsed.bootstrap === 'string' ? parsed.bootstrap : undefined;\n const generatedPaths = [bootstrap, ...Object.values(compiled ?? {}), ...Object.values(bundles ?? {})].filter(\n (entry): entry is string => entry !== undefined,\n );\n if (generatedPaths.some((entry) => !isInside(generatedDirectory, entry))) {\n throw new Error(`Doom sync state at ${statePath} references generated material outside ${generatedDirectory}`);\n }\n return {\n version: parsed.version,\n root: parsed.root,\n identity,\n inputsHash: parsed.inputsHash,\n selection: {\n majorMode,\n domains: Array.isArray(domains) ? domains.filter((name): name is string => typeof name === 'string') : [],\n profile: typeof profile === 'string' ? profile : undefined,\n preset: typeof preset === 'string' ? preset : DEFAULT_PRESET,\n },\n env: stringRecord(parsed.env, 'env', statePath),\n fileState: {\n profileEnvironment: isRecord(fileState.profileEnvironment)\n ? (fileState.profileEnvironment as Record<string, string>)\n : {},\n pluginHooks: Array.isArray(fileState.pluginHooks) ? (fileState.pluginHooks as HarnessState['pluginHooks']) : [],\n },\n resolved: stringRecord(parsed.resolved, 'resolved', statePath),\n compiled,\n bundles,\n bootstrap,\n precompile: parsed.precompile === undefined ? undefined : parsePrecompileState(parsed.precompile, statePath),\n baseline: parsed.baseline as unknown as SyncBaseline,\n };\n}\n\nexport interface LocatedSyncState {\n state: SyncState;\n location: SyncLocation;\n layout: 'global' | 'legacy';\n}\n\n/** Reads global state first, with a read-only fallback to validated legacy state. */\nexport function readLocatedSyncState(\n repoRoot: string,\n homeDirectory: string = os.homedir(),\n): LocatedSyncState | undefined {\n const location = resolveSyncLocation(repoRoot, homeDirectory);\n if (fs.existsSync(location.statePath)) {\n return {\n state: parseSyncState(fs.readFileSync(location.statePath, 'utf8'), location.statePath, {\n repoRoot,\n location,\n legacy: false,\n }),\n location,\n layout: 'global',\n };\n }\n if (!fs.existsSync(location.legacyStatePath)) return undefined;\n return {\n state: parseSyncState(fs.readFileSync(location.legacyStatePath, 'utf8'), location.legacyStatePath, {\n repoRoot,\n location,\n legacy: true,\n }),\n location,\n layout: 'legacy',\n };\n}\n\n/** Reads the synced state, or undefined when the repository was never synced. */\nexport function readSyncState(repoRoot: string, homeDirectory: string = os.homedir()): SyncState | undefined {\n return readLocatedSyncState(repoRoot, homeDirectory)?.state;\n}\n\nexport function serializeSyncState(state: SyncState): string {\n return `${JSON.stringify(state, null, 2)}\\n`;\n}\n\nexport async function writeSyncState(\n repoRoot: string,\n state: SyncState,\n homeDirectory: string = os.homedir(),\n): Promise<string> {\n const location = resolveSyncLocation(repoRoot, homeDirectory);\n if (state.version !== SYNC_STATE_VERSION) {\n throw new Error(`Doom sync state writes require version ${SYNC_STATE_VERSION}`);\n }\n if (!syncStateRootMatches(repoRoot, state.root) || !identityMatches(state.identity, location.identity)) {\n throw new Error('Refusing to write Doom sync state for a different repository or worktree');\n }\n assertSyncLocationSafe(location);\n await fs.promises.mkdir(location.directory, { mode: PRIVATE_DIRECTORY_MODE, recursive: true });\n const temporaryPath = `${location.statePath}.${process.pid}.${crypto.randomUUID()}.tmp`;\n try {\n await fs.promises.writeFile(temporaryPath, serializeSyncState(state), { mode: PRIVATE_FILE_MODE });\n await fs.promises.rename(temporaryPath, location.statePath);\n } catch (error) {\n await fs.promises.rm(temporaryPath, { force: true });\n throw error;\n }\n return location.statePath;\n}\n\nexport function ownKey(name: string): string {\n return `${OWN_PREFIX}${name}`;\n}\n\nexport function packageKey(specifier: string): string {\n return `${PACKAGE_PREFIX}${specifier}`;\n}\n\nexport function packageEntryKey(specifier: string, index: number): string {\n return index === 0 ? packageKey(specifier) : `${packageKey(specifier)}${ENTRY_INDEX_SEPARATOR}${index}`;\n}\n\n/**\n * Keyed by the absolute target, because the same relative specifier means\n * different files under the repository and the global config directory.\n */\nexport function localKey(specifier: string, baseDirectory: string): string {\n return `${LOCAL_PREFIX}${path.resolve(baseDirectory, specifier)}`;\n}\n\nexport function localEntryKey(specifier: string, baseDirectory: string, index: number): string {\n return index === 0\n ? localKey(specifier, baseDirectory)\n : `${localKey(specifier, baseDirectory)}${ENTRY_INDEX_SEPARATOR}${index}`;\n}\n\nexport function localPackageNameKey(specifier: string, baseDirectory: string): string {\n return `${LOCAL_PACKAGE_NAME_PREFIX}${path.resolve(baseDirectory, specifier)}`;\n}\n\nexport interface RecordingResolvers extends ExtensionLayerResolvers {\n /** Every name this resolver was asked for, keyed for the state file. */\n readonly resolved: Record<string, string>;\n packageEntries(name: string): string[];\n optionalPackageEntries(name: string): string[] | undefined;\n localEntries(specifier: string, baseDirectory: string): string[] | undefined;\n}\n\n/**\n * Resolvers that record what they resolve.\n *\n * Sync composes once with every layer selected and hands the recording to the\n * state file, so the extension never has to resolve a specifier itself.\n */\nexport function createRecordingResolvers(base: LayerResolvers = LAYER_RESOLVERS): RecordingResolvers {\n const resolved: Record<string, string> = {};\n const extensionBase = base as ExtensionLayerResolvers;\n const recordEntries = (entries: string[], keyFor: (index: number) => string): string[] => {\n entries.forEach((entry, index) => {\n resolved[keyFor(index)] = entry;\n });\n return entries;\n };\n return {\n resolved,\n ownEntry(name) {\n const entry = base.ownEntry(name);\n resolved[ownKey(name)] = entry;\n return entry;\n },\n packageEntry(name) {\n const entry = base.packageEntry(name);\n resolved[packageKey(name)] = entry;\n return entry;\n },\n optionalPackageEntry(name) {\n const entry = base.optionalPackageEntry(name);\n // A miss is recorded by omission, which is what later makes the extension\n // treat it as absent instead of failing the whole composition.\n if (entry) resolved[packageKey(name)] = entry;\n return entry;\n },\n packageEntries(name) {\n const entries = extensionBase.packageEntries?.(name) ?? [base.packageEntry(name)];\n return recordEntries(entries, (index) => packageEntryKey(name, index));\n },\n optionalPackageEntries(name) {\n let entries = extensionBase.optionalPackageEntries?.(name);\n if (entries === undefined) {\n const entry = base.optionalPackageEntry(name);\n entries = entry ? [entry] : undefined;\n }\n return entries ? recordEntries(entries, (index) => packageEntryKey(name, index)) : undefined;\n },\n localEntry(specifier, baseDirectory) {\n const entry = base.localEntry(specifier, baseDirectory);\n if (entry) resolved[localKey(specifier, baseDirectory)] = entry;\n return entry;\n },\n localEntries(specifier, baseDirectory) {\n let entries = extensionBase.localEntries?.(specifier, baseDirectory);\n if (entries === undefined) {\n const entry = base.localEntry(specifier, baseDirectory);\n entries = entry ? [entry] : undefined;\n }\n return entries ? recordEntries(entries, (index) => localEntryKey(specifier, baseDirectory, index)) : undefined;\n },\n localPackageName(specifier, baseDirectory) {\n const name = extensionBase.localPackageName?.(specifier, baseDirectory);\n if (name) resolved[localPackageNameKey(specifier, baseDirectory)] = name;\n return name;\n },\n };\n}\n\n/**\n * Resolves every entry any layer could contribute, in one pass.\n *\n * Composing with every layer selected and the widest options is what makes the\n * map complete: a later `/mode` switch inside a Pi session can then pick a\n * different set without resolving anything itself. The context packages and the\n * persona entry are asked for separately because they reach `assembleExtensions`\n * as already-resolved paths rather than through the resolvers.\n */\nexport function recordResolvedEntries(\n majorModesConfig: MajorModesConfig,\n base: LayerResolvers = LAYER_RESOLVERS,\n): Record<string, string> {\n const recording = createRecordingResolvers(base);\n for (const specifier of Object.values(CONTEXT_PACKAGES)) recording.optionalPackageEntry(specifier);\n recording.ownEntry(PERSONA_ENTRY);\n assembleExtensions({\n agents: true,\n autoStop: true,\n mute: false,\n // The one preset that contributes an extension of its own.\n preset: OLLAMA_PRESET,\n layers: Object.keys(majorModesConfig.layers),\n majorModesConfig,\n resolvers: recording,\n });\n assembleChildExtensions({\n agents: false,\n autoStop: false,\n mute: true,\n preset: OLLAMA_PRESET,\n layers: Object.keys(majorModesConfig.layers),\n majorModesConfig,\n resolvers: recording,\n });\n return recording.resolved;\n}\n\n/** Resolvers backed by a synced map, for composing inside a Pi session. */\nexport function createMapResolvers(\n resolved: Record<string, string>,\n compiled: Record<string, string> = {},\n): ExtensionLayerResolvers {\n // The compiled bundle when this entry has one, the source otherwise.\n const entryFor = (key: string): string | undefined => compiled[key] ?? resolved[key];\n const lookup = (key: string, name: string): string => {\n const entry = entryFor(key);\n if (!entry) throw new Error(`${name} is missing from the doompi sync state. Run doompi sync.`);\n return entry;\n };\n const indexedEntries = (keyFor: (index: number) => string): string[] | undefined => {\n const first = entryFor(keyFor(0));\n if (!first) return undefined;\n const entries = [first];\n for (let index = 1; ; index += 1) {\n const entry = entryFor(keyFor(index));\n if (!entry) break;\n entries.push(entry);\n }\n return entries;\n };\n return {\n ownEntry: (name) => lookup(ownKey(name), name),\n packageEntry: (name) => lookup(packageKey(name), name),\n optionalPackageEntry: (name) => entryFor(packageKey(name)),\n packageEntries: (name) => {\n const entries = indexedEntries((index) => packageEntryKey(name, index));\n if (!entries) throw new Error(`${name} is missing from the doompi sync state. Run doompi sync.`);\n return entries;\n },\n optionalPackageEntries: (name) => indexedEntries((index) => packageEntryKey(name, index)),\n localEntry: (specifier, baseDirectory) => entryFor(localKey(specifier, baseDirectory)),\n localEntries: (specifier, baseDirectory) =>\n indexedEntries((index) => localEntryKey(specifier, baseDirectory, index)),\n localPackageName: (specifier, baseDirectory) => resolved[localPackageNameKey(specifier, baseDirectory)],\n };\n}\n\n/** Reads the resolved MCP servers back out of a generated config. */\nexport function readMcpServerNames(configPath: string): string[] {\n if (!fs.existsSync(configPath)) return [];\n const config = JSON.parse(fs.readFileSync(configPath, 'utf8')) as JsonObject;\n return isRecord(config.mcpServers) ? Object.keys(config.mcpServers) : [];\n}\n"],"mappings":"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"}