@agimon-ai/doompi 0.0.1-alpha.13 → 0.0.1-alpha.14

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 (230) hide show
  1. package/README.md +46 -19
  2. package/dist/adapters/bootstrapClaim.cjs +2 -0
  3. package/dist/adapters/bootstrapClaim.cjs.map +1 -0
  4. package/dist/adapters/bootstrapClaim.mjs +2 -0
  5. package/dist/adapters/bootstrapClaim.mjs.map +1 -0
  6. package/dist/adapters/bootstrapLocator.cjs +1 -1
  7. package/dist/adapters/bootstrapLocator.cjs.map +1 -1
  8. package/dist/adapters/bootstrapLocator.d.cts.map +1 -1
  9. package/dist/adapters/bootstrapLocator.d.mts.map +1 -1
  10. package/dist/adapters/bootstrapLocator.mjs +1 -1
  11. package/dist/adapters/bootstrapLocator.mjs.map +1 -1
  12. package/dist/adapters/compatibility/antigravity.cjs +1 -1
  13. package/dist/adapters/compatibility/antigravity.mjs +1 -1
  14. package/dist/adapters/compatibility/codex.cjs +1 -1
  15. package/dist/adapters/compatibility/codex.mjs +1 -1
  16. package/dist/adapters/compatibility/process.cjs +1 -1
  17. package/dist/adapters/compatibility/process.mjs +1 -1
  18. package/dist/adapters/compatibilityContext.cjs +1 -1
  19. package/dist/adapters/compatibilityContext.mjs +1 -1
  20. package/dist/adapters/composer.cjs +1 -1
  21. package/dist/adapters/composer.cjs.map +1 -1
  22. package/dist/adapters/composer.mjs +1 -1
  23. package/dist/adapters/composer.mjs.map +1 -1
  24. package/dist/adapters/compositionState.cjs +1 -1
  25. package/dist/adapters/compositionState.cjs.map +1 -1
  26. package/dist/adapters/compositionState.d.cts.map +1 -1
  27. package/dist/adapters/compositionState.d.mts.map +1 -1
  28. package/dist/adapters/compositionState.mjs +1 -1
  29. package/dist/adapters/compositionState.mjs.map +1 -1
  30. package/dist/adapters/deferredSkills.cjs +4 -4
  31. package/dist/adapters/deferredSkills.cjs.map +1 -1
  32. package/dist/adapters/deferredSkills.mjs +4 -4
  33. package/dist/adapters/deferredSkills.mjs.map +1 -1
  34. package/dist/adapters/doomPackage.cjs +2 -0
  35. package/dist/adapters/doomPackage.cjs.map +1 -0
  36. package/dist/adapters/doomPackage.mjs +2 -0
  37. package/dist/adapters/doomPackage.mjs.map +1 -0
  38. package/dist/adapters/extensionCompiler.cjs +2 -2
  39. package/dist/adapters/extensionCompiler.cjs.map +1 -1
  40. package/dist/adapters/extensionCompiler.mjs +2 -2
  41. package/dist/adapters/extensionCompiler.mjs.map +1 -1
  42. package/dist/adapters/harnessContext.cjs +1 -1
  43. package/dist/adapters/harnessContext.cjs.map +1 -1
  44. package/dist/adapters/harnessContext.mjs +1 -1
  45. package/dist/adapters/matrixSwitcher.cjs +1 -1
  46. package/dist/adapters/matrixSwitcher.mjs +1 -1
  47. package/dist/adapters/mcpFilter.cjs +2 -2
  48. package/dist/adapters/mcpFilter.mjs +2 -2
  49. package/dist/adapters/modules/moduleResolution.cjs +1 -1
  50. package/dist/adapters/modules/moduleResolution.cjs.map +1 -1
  51. package/dist/adapters/modules/moduleResolution.d.cts +10 -1
  52. package/dist/adapters/modules/moduleResolution.d.cts.map +1 -1
  53. package/dist/adapters/modules/moduleResolution.d.mts +10 -1
  54. package/dist/adapters/modules/moduleResolution.d.mts.map +1 -1
  55. package/dist/adapters/modules/moduleResolution.mjs +1 -1
  56. package/dist/adapters/modules/moduleResolution.mjs.map +1 -1
  57. package/dist/adapters/packageBootstrap.cjs +1 -1
  58. package/dist/adapters/packageBootstrap.cjs.map +1 -1
  59. package/dist/adapters/packageBootstrap.d.cts +1 -1
  60. package/dist/adapters/packageBootstrap.d.cts.map +1 -1
  61. package/dist/adapters/packageBootstrap.d.mts +1 -1
  62. package/dist/adapters/packageBootstrap.d.mts.map +1 -1
  63. package/dist/adapters/packageBootstrap.mjs +1 -1
  64. package/dist/adapters/packageBootstrap.mjs.map +1 -1
  65. package/dist/adapters/piExtensionAlias.cjs +1 -1
  66. package/dist/adapters/piExtensionAlias.cjs.map +1 -1
  67. package/dist/adapters/piExtensionAlias.mjs +1 -1
  68. package/dist/adapters/piExtensionAlias.mjs.map +1 -1
  69. package/dist/adapters/piSettings.cjs +1 -1
  70. package/dist/adapters/piSettings.cjs.map +1 -1
  71. package/dist/adapters/piSettings.d.cts +11 -12
  72. package/dist/adapters/piSettings.d.cts.map +1 -1
  73. package/dist/adapters/piSettings.d.mts +11 -12
  74. package/dist/adapters/piSettings.d.mts.map +1 -1
  75. package/dist/adapters/piSettings.mjs +1 -1
  76. package/dist/adapters/piSettings.mjs.map +1 -1
  77. package/dist/adapters/projectPiSettings.cjs +2 -0
  78. package/dist/adapters/projectPiSettings.cjs.map +1 -0
  79. package/dist/adapters/projectPiSettings.d.cts +29 -0
  80. package/dist/adapters/projectPiSettings.d.cts.map +1 -0
  81. package/dist/adapters/projectPiSettings.d.mts +29 -0
  82. package/dist/adapters/projectPiSettings.d.mts.map +1 -0
  83. package/dist/adapters/projectPiSettings.mjs +2 -0
  84. package/dist/adapters/projectPiSettings.mjs.map +1 -0
  85. package/dist/adapters/repository/repository.cjs +1 -1
  86. package/dist/adapters/repository/repository.mjs +1 -1
  87. package/dist/adapters/resourceCollector.cjs +2 -2
  88. package/dist/adapters/resourceCollector.mjs +2 -2
  89. package/dist/adapters/serialization/json.cjs +1 -1
  90. package/dist/adapters/serialization/json.mjs +1 -1
  91. package/dist/adapters/skillCatalog.cjs +1 -1
  92. package/dist/adapters/skillCatalog.mjs +1 -1
  93. package/dist/adapters/skillSources.cjs +1 -1
  94. package/dist/adapters/skillSources.mjs +1 -1
  95. package/dist/adapters/startupPrecompiler.cjs +2 -0
  96. package/dist/adapters/startupPrecompiler.cjs.map +1 -0
  97. package/dist/adapters/startupPrecompiler.d.cts +13 -0
  98. package/dist/adapters/startupPrecompiler.d.cts.map +1 -0
  99. package/dist/adapters/startupPrecompiler.d.mts +13 -0
  100. package/dist/adapters/startupPrecompiler.d.mts.map +1 -0
  101. package/dist/adapters/startupPrecompiler.mjs +2 -0
  102. package/dist/adapters/startupPrecompiler.mjs.map +1 -0
  103. package/dist/adapters/syncState.cjs +1 -1
  104. package/dist/adapters/syncState.cjs.map +1 -1
  105. package/dist/adapters/syncState.d.cts +18 -3
  106. package/dist/adapters/syncState.d.cts.map +1 -1
  107. package/dist/adapters/syncState.d.mts +18 -3
  108. package/dist/adapters/syncState.d.mts.map +1 -1
  109. package/dist/adapters/syncState.mjs +1 -1
  110. package/dist/adapters/syncState.mjs.map +1 -1
  111. package/dist/adapters/syncStateContract.cjs +1 -1
  112. package/dist/adapters/syncStateContract.cjs.map +1 -1
  113. package/dist/adapters/syncStateContract.d.cts +5 -4
  114. package/dist/adapters/syncStateContract.d.cts.map +1 -1
  115. package/dist/adapters/syncStateContract.d.mts +5 -4
  116. package/dist/adapters/syncStateContract.d.mts.map +1 -1
  117. package/dist/adapters/syncStateContract.mjs +1 -1
  118. package/dist/adapters/syncStateContract.mjs.map +1 -1
  119. package/dist/adapters/syncedRuntimeBuilder.cjs +2 -0
  120. package/dist/adapters/syncedRuntimeBuilder.cjs.map +1 -0
  121. package/dist/adapters/syncedRuntimeBuilder.d.cts +11 -0
  122. package/dist/adapters/syncedRuntimeBuilder.d.cts.map +1 -0
  123. package/dist/adapters/syncedRuntimeBuilder.d.mts +11 -0
  124. package/dist/adapters/syncedRuntimeBuilder.d.mts.map +1 -0
  125. package/dist/adapters/syncedRuntimeBuilder.mjs +2 -0
  126. package/dist/adapters/syncedRuntimeBuilder.mjs.map +1 -0
  127. package/dist/commands/buildCommand.cjs +2 -2
  128. package/dist/commands/buildCommand.cjs.map +1 -1
  129. package/dist/commands/buildCommand.d.cts +4 -0
  130. package/dist/commands/buildCommand.d.cts.map +1 -1
  131. package/dist/commands/buildCommand.d.mts +4 -0
  132. package/dist/commands/buildCommand.d.mts.map +1 -1
  133. package/dist/commands/buildCommand.mjs +2 -2
  134. package/dist/commands/buildCommand.mjs.map +1 -1
  135. package/dist/commands/cli/help.cjs +2 -2
  136. package/dist/commands/cli/help.cjs.map +1 -1
  137. package/dist/commands/cli/help.mjs +2 -2
  138. package/dist/commands/cli/help.mjs.map +1 -1
  139. package/dist/commands/compatibilityCommand.cjs +1 -1
  140. package/dist/commands/compatibilityCommand.mjs +1 -1
  141. package/dist/commands/explainCommand.cjs +3 -3
  142. package/dist/commands/explainCommand.mjs +3 -3
  143. package/dist/commands/launchCommand.cjs +1 -1
  144. package/dist/commands/launchCommand.cjs.map +1 -1
  145. package/dist/commands/launchCommand.mjs +1 -1
  146. package/dist/commands/launchCommand.mjs.map +1 -1
  147. package/dist/commands/syncCommand.cjs +5 -5
  148. package/dist/commands/syncCommand.cjs.map +1 -1
  149. package/dist/commands/syncCommand.d.cts +4 -2
  150. package/dist/commands/syncCommand.d.cts.map +1 -1
  151. package/dist/commands/syncCommand.d.mts +4 -2
  152. package/dist/commands/syncCommand.d.mts.map +1 -1
  153. package/dist/commands/syncCommand.mjs +4 -4
  154. package/dist/commands/syncCommand.mjs.map +1 -1
  155. package/dist/entries/doom.cjs +1 -1
  156. package/dist/entries/doom.d.cts +1 -1
  157. package/dist/entries/doom.d.mts +1 -1
  158. package/dist/entries/doom.mjs +1 -1
  159. package/dist/entries/modeCatalog.cjs +1 -0
  160. package/dist/entries/modeCatalog.d.cts +2 -0
  161. package/dist/entries/modeCatalog.d.mts +2 -0
  162. package/dist/entries/modeCatalog.mjs +1 -0
  163. package/dist/extensions/entries/cacheOptimizer.mjs +2 -0
  164. package/dist/extensions/entries/cacheOptimizer.mjs.map +1 -0
  165. package/dist/extensions/entries/components/skillsOverlay.cjs +2 -2
  166. package/dist/extensions/entries/components/skillsOverlay.mjs +2 -2
  167. package/dist/extensions/entries/doom.cjs +1 -1
  168. package/dist/extensions/entries/doom.cjs.map +1 -1
  169. package/dist/extensions/entries/doom.d.cts.map +1 -1
  170. package/dist/extensions/entries/doom.d.mts.map +1 -1
  171. package/dist/extensions/entries/doom.mjs +1 -1
  172. package/dist/extensions/entries/doom.mjs.map +1 -1
  173. package/dist/extensions/entries/modeCatalog.cjs +2 -0
  174. package/dist/extensions/entries/modeCatalog.cjs.map +1 -0
  175. package/dist/extensions/entries/modeCatalog.d.cts +7 -0
  176. package/dist/extensions/entries/modeCatalog.d.cts.map +1 -0
  177. package/dist/extensions/entries/modeCatalog.d.mts +7 -0
  178. package/dist/extensions/entries/modeCatalog.d.mts.map +1 -0
  179. package/dist/extensions/entries/modeCatalog.mjs +2 -0
  180. package/dist/extensions/entries/modeCatalog.mjs.map +1 -0
  181. package/dist/extensions/entries/styleSystem.cjs +2 -2
  182. package/dist/extensions/entries/styleSystem.mjs +2 -2
  183. package/dist/index.cjs +1 -1
  184. package/dist/index.d.cts +5 -3
  185. package/dist/index.d.mts +5 -3
  186. package/dist/index.mjs +1 -1
  187. package/dist/pi-cache-optimizer-D9beVnnH.mjs +50 -0
  188. package/dist/pi-cache-optimizer-D9beVnnH.mjs.map +1 -0
  189. package/dist/schemas/modeCatalog.cjs +2 -0
  190. package/dist/schemas/modeCatalog.cjs.map +1 -0
  191. package/dist/schemas/modeCatalog.mjs +2 -0
  192. package/dist/schemas/modeCatalog.mjs.map +1 -0
  193. package/dist/services/config/index.d.mts +2 -2
  194. package/dist/services/extensionAssembler.cjs +1 -1
  195. package/dist/services/extensionAssembler.cjs.map +1 -1
  196. package/dist/services/extensionAssembler.d.cts +8 -4
  197. package/dist/services/extensionAssembler.d.cts.map +1 -1
  198. package/dist/services/extensionAssembler.d.mts +8 -4
  199. package/dist/services/extensionAssembler.d.mts.map +1 -1
  200. package/dist/services/extensionAssembler.mjs +1 -1
  201. package/dist/services/extensionAssembler.mjs.map +1 -1
  202. package/dist/services/index.cjs +1 -1
  203. package/dist/services/index.d.cts +4 -2
  204. package/dist/services/index.d.mts +4 -2
  205. package/dist/services/index.mjs +1 -1
  206. package/dist/services/modeCatalog.cjs +2 -0
  207. package/dist/services/modeCatalog.cjs.map +1 -0
  208. package/dist/services/modeCatalog.d.cts +18 -0
  209. package/dist/services/modeCatalog.d.cts.map +1 -0
  210. package/dist/services/modeCatalog.d.mts +18 -0
  211. package/dist/services/modeCatalog.d.mts.map +1 -0
  212. package/dist/services/modeCatalog.mjs +2 -0
  213. package/dist/services/modeCatalog.mjs.map +1 -0
  214. package/dist/services/piSettings.cjs +1 -1
  215. package/dist/services/piSettings.d.cts +2 -2
  216. package/dist/services/piSettings.d.mts +2 -2
  217. package/dist/services/piSettings.mjs +1 -1
  218. package/dist/services/syncState.cjs +1 -1
  219. package/dist/services/syncState.d.cts +2 -2
  220. package/dist/services/syncState.d.mts +2 -2
  221. package/dist/services/syncState.mjs +1 -1
  222. package/dist/utils/index.cjs +1 -1
  223. package/dist/utils/index.d.cts +2 -2
  224. package/dist/utils/index.d.mts +2 -2
  225. package/dist/utils/index.mjs +1 -1
  226. package/dist/utils/moduleResolution.cjs +1 -1
  227. package/dist/utils/moduleResolution.d.cts +2 -2
  228. package/dist/utils/moduleResolution.d.mts +2 -2
  229. package/dist/utils/moduleResolution.mjs +1 -1
  230. package/package.json +28 -18
package/README.md CHANGED
@@ -102,9 +102,9 @@ result where Pi looks, then run `pi` yourself.
102
102
 
103
103
  ```bash
104
104
  doompi init # seed ~/.pi/.doom, once per machine
105
- doompi build # warm the selected launch bundle and skill cache
106
- doompi sync # resolve the selection into .pi/
107
- pi # the agent
105
+ doompi sync # resolve the selection and register DoomPi with Pi
106
+ doompi build # optional: warm launch and synchronized bundles
107
+ pi # auto-build stale output, then start the agent
108
108
 
109
109
  doompi sync --check # exit non-zero when the synced config is out of date
110
110
  ```
@@ -118,18 +118,36 @@ Both paths compose the extension set from the same function, `assembleExtensions
118
118
  owns load order. Two things differ. A synced session forces `--auto-stop` off, and it
119
119
  reads mute from `DOOMPI_MUTE` instead of an argument.
120
120
 
121
- `doompi build` is the launcher warm-up step, analogous to `doom build`: it resolves the
122
- selected matrix, compiles its exact extension graph into one `.pi/doom/dist` ESM file,
123
- and warms the persistent skill manifest without starting Pi or changing
124
- `.pi/settings.json`. A sidecar manifest retains every original extension and exact
125
- `SKILL.md` path, so resource discovery never depends on the bundle's location.
126
- Launch still builds on a cache miss, so the command is optional; run it after installing
127
- or upgrading Doom packages when first-input latency matters.
121
+ `doompi build` is an optional warm-up step, analogous to `doom build`: it resolves the
122
+ selected launcher matrix, compiles its exact extension graph, and—after a sync—warms the
123
+ synchronized bootstrap and mode bundles in `.pi/doom/dist`. A sidecar manifest retains
124
+ every original extension and exact `SKILL.md` path, so resource discovery never depends
125
+ on the bundle's location. Without that command, plain `pi` writes a tiny native ESM
126
+ bootstrap instead of running the graph bundler; cache-miss preparation stays under 200 ms
127
+ and then loads the package's already-built JavaScript. Run `doompi build` only when you
128
+ want the lower steady-state cost of flattened mode bundles.
128
129
 
129
130
  Syncing does not disturb the launcher. Pi merges the extensions a project declares with
130
131
  the ones passed on the command line, so the synced entry stands down whenever it sees the
131
132
  composed set already there, which is what the launcher and every detached subagent pass.
132
133
 
134
+ ### Two settings scopes, one registration
135
+
136
+ Pi reads user settings from `$PI_CODING_AGENT_DIR/settings.json` and project settings from
137
+ `<repo>/.pi/settings.json`. Project settings override user settings key by key, but
138
+ resource resolution is the exception: Pi collects the `extensions` and `packages` of both
139
+ scopes and dedupes only by the resolved file's real path. A repository that registers Doom
140
+ Pi as well as the user scope therefore loads two _installs_ of the same package against one
141
+ `.pi/doom` state, and two installs at different versions disagree about the state contract.
142
+
143
+ Doom Pi settles that in both places. At load time the package entry claims the repository
144
+ for the whole process, so the first factory owns the cycle and every later one stands down
145
+ without reading, compiling, or writing anything. Pi resolves project resources before user
146
+ ones, which makes the owner the repository-local install: the repository wins, as it does
147
+ everywhere else. `doompi sync` then removes the redundant registration from
148
+ `.pi/settings.json`, keeping the file and every unrelated key, and `doompi sync --check`
149
+ and `doompi build` report it until it is gone.
150
+
133
151
  ## For humans
134
152
 
135
153
  ### Leader Space
@@ -461,11 +479,13 @@ Under the launcher, everything is resolved per run and nothing is written back i
461
479
  repository. Editing a YAML file is the entire change.
462
480
 
463
481
  `doompi sync` trades that for a pinned setup: the same resolution runs once and lands in
464
- `.pi/doom/`, while `.pi/settings.json` keeps the stable `@agimon-ai/doompi` extension name.
465
- An internal `.pi/@agimon-ai/doompi` package alias lets Pi resolve that stable name; the
466
- package entry then locates and dynamically loads the generated bootstrap from synced state.
467
- Edit a YAML file and the next session says the config changed, the way doom emacs asks you
468
- to re-run `doom sync`.
482
+ `.pi/doom/`, while Pi's user settings (`$PI_CODING_AGENT_DIR/settings.json`, defaulting to
483
+ `~/.pi/agent/settings.json`) keep the stable `@agimon-ai/doompi` extension name. An
484
+ internal user-directory alias lets Pi resolve that stable name. The lightweight package
485
+ entry validates generated output, writes or refreshes a native bootstrap within a 200 ms
486
+ budget, and only then loads the synchronized runtime graph. An explicit `doompi build`
487
+ replaces that shim with fingerprinted graph bundles. Edit a YAML file and the next session says the
488
+ config changed, the way Doom Emacs asks you to re-run `doom sync`.
469
489
 
470
490
  `doompi init` seeds `~/.pi/.doom` with all five file names, but only `config.yaml` from
471
491
  there is read at runtime. Major modes, domains, profiles, and hooks are always read from the
@@ -515,15 +535,22 @@ All Doompi configuration lives in `.doom/`, committed to git.
515
535
  agents/<product>/<person>/ persona source, referenced never copied
516
536
  ```
517
537
 
518
- `doompi sync` writes into `.pi/`:
538
+ `doompi sync` writes repository state into `.pi/doom/` and registers the stable package
539
+ and theme in Pi's user directory. Older project-local Doom registrations are removed while
540
+ unrelated project settings are preserved.
519
541
 
520
542
  ```
521
- .pi/settings.json committed; sync owns extensions, themes, and theme
522
543
  .pi/doom/ generated and gitignored
523
- state.json environment, resolved paths, and the inputs hash
524
- mcp.json mcp-extension.ts agents/ persona.md doom-pi-dark.json
544
+ state.json environment, resolved paths, inputs, and build pointers
545
+ cache/ dist/ content-addressed precompile output
546
+ mcp.json mcp-extension.ts agents/ persona.md
525
547
  run/<pid>/ one session's live switches, never the baseline
526
548
  harness-state.json that session's own state, owned by its process
549
+
550
+ ~/.pi/agent/ or $PI_CODING_AGENT_DIR
551
+ settings.json stable @agimon-ai/doompi entry; other keys preserved
552
+ themes/doom-pi-dark.json synchronized Doom theme
553
+ @agimon-ai/doompi internal link to the installed package
527
554
  ```
528
555
 
529
556
  ### One owner for the state
@@ -0,0 +1,2 @@
1
+ const e=require(`../_virtual/_rolldown/runtime.cjs`);let t=require(`node:path`);t=e.__toESM(t,1);const n=Symbol.for(`@agimon-ai/doompi:bootstrap-claim`);function r(){let e=Reflect.get(globalThis,n);if(e instanceof Map)return e;let t=new Map;return Reflect.set(globalThis,n,t),t}function i(e){let n=r(),i=t.default.resolve(e);if(n.has(i))return;let a=Symbol(`doompi-bootstrap`);return n.set(i,a),()=>{n.get(i)===a&&n.delete(i)}}exports.acquireBootstrapClaim=i;
2
+ //# sourceMappingURL=bootstrapClaim.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrapClaim.cjs","names":["path"],"sources":["../../src/adapters/bootstrapClaim.ts"],"sourcesContent":["import path from 'node:path';\n\n/**\n * Process-wide ownership of one repository's DoomPi load cycle.\n *\n * Pi unions the extension lists of its user and project settings scopes and\n * dedupes only by the resolved file's real path, so registering DoomPi in both\n * scopes loads two separate installs of the same package. Each one would\n * otherwise read, recompile, and rewrite the same `.pi/doom` state for the same\n * repository, and two installs at different versions disagree about the state\n * contract. A process-global symbol survives the distinct module URLs those\n * installs have, so the first factory owns the cycle and the rest stand down.\n * Pi resolves project resources before user ones, which makes the owner the\n * repository-local install whenever both scopes register the package.\n */\n\nconst BOOTSTRAP_CLAIM_KEY = Symbol.for('@agimon-ai/doompi:bootstrap-claim');\n\nexport type ReleaseBootstrapClaim = () => void;\n\n/**\n * The registry shared by every DoomPi install in this process.\n *\n * The symbol description is part of the cross-install contract and must stay\n * exactly as written: two installs only meet here when they compute the same\n * key. A value of another shape belongs to an install that spelled the\n * registry differently, so this one starts its own rather than corrupting it.\n */\nfunction claimRegistry(): Map<string, symbol> {\n const existing = Reflect.get(globalThis, BOOTSTRAP_CLAIM_KEY);\n if (existing instanceof Map) return existing as Map<string, symbol>;\n const created = new Map<string, symbol>();\n Reflect.set(globalThis, BOOTSTRAP_CLAIM_KEY, created);\n return created;\n}\n\n/**\n * Claims the load cycle for one repository, or reports that it is already owned.\n *\n * Callers must acquire before their first `await`, because releasing happens on\n * `session_start` and an interleaved second factory would otherwise slip in.\n */\nexport function acquireBootstrapClaim(repoRoot: string): ReleaseBootstrapClaim | undefined {\n const registry = claimRegistry();\n const key = path.resolve(repoRoot);\n if (registry.has(key)) return undefined;\n\n const claim = Symbol('doompi-bootstrap');\n registry.set(key, claim);\n return () => {\n if (registry.get(key) === claim) registry.delete(key);\n };\n}\n"],"mappings":"iGAgBA,MAAM,EAAsB,OAAO,IAAI,oCAAoC,CAY3E,SAAS,GAAqC,CAC5C,IAAM,EAAW,QAAQ,IAAI,WAAY,EAAoB,CAC7D,GAAI,aAAoB,IAAK,OAAO,EACpC,IAAM,EAAU,IAAI,IAEpB,OADA,QAAQ,IAAI,WAAY,EAAqB,EAAQ,CAC9C,EAST,SAAgB,EAAsB,EAAqD,CACzF,IAAM,EAAW,GAAe,CAC1B,EAAMA,EAAAA,QAAK,QAAQ,EAAS,CAClC,GAAI,EAAS,IAAI,EAAI,CAAE,OAEvB,IAAM,EAAQ,OAAO,mBAAmB,CAExC,OADA,EAAS,IAAI,EAAK,EAAM,KACX,CACP,EAAS,IAAI,EAAI,GAAK,GAAO,EAAS,OAAO,EAAI"}
@@ -0,0 +1,2 @@
1
+ import e from"node:path";const t=Symbol.for(`@agimon-ai/doompi:bootstrap-claim`);function n(){let e=Reflect.get(globalThis,t);if(e instanceof Map)return e;let n=new Map;return Reflect.set(globalThis,t,n),n}function r(t){let r=n(),i=e.resolve(t);if(r.has(i))return;let a=Symbol(`doompi-bootstrap`);return r.set(i,a),()=>{r.get(i)===a&&r.delete(i)}}export{r as acquireBootstrapClaim};
2
+ //# sourceMappingURL=bootstrapClaim.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrapClaim.mjs","names":[],"sources":["../../src/adapters/bootstrapClaim.ts"],"sourcesContent":["import path from 'node:path';\n\n/**\n * Process-wide ownership of one repository's DoomPi load cycle.\n *\n * Pi unions the extension lists of its user and project settings scopes and\n * dedupes only by the resolved file's real path, so registering DoomPi in both\n * scopes loads two separate installs of the same package. Each one would\n * otherwise read, recompile, and rewrite the same `.pi/doom` state for the same\n * repository, and two installs at different versions disagree about the state\n * contract. A process-global symbol survives the distinct module URLs those\n * installs have, so the first factory owns the cycle and the rest stand down.\n * Pi resolves project resources before user ones, which makes the owner the\n * repository-local install whenever both scopes register the package.\n */\n\nconst BOOTSTRAP_CLAIM_KEY = Symbol.for('@agimon-ai/doompi:bootstrap-claim');\n\nexport type ReleaseBootstrapClaim = () => void;\n\n/**\n * The registry shared by every DoomPi install in this process.\n *\n * The symbol description is part of the cross-install contract and must stay\n * exactly as written: two installs only meet here when they compute the same\n * key. A value of another shape belongs to an install that spelled the\n * registry differently, so this one starts its own rather than corrupting it.\n */\nfunction claimRegistry(): Map<string, symbol> {\n const existing = Reflect.get(globalThis, BOOTSTRAP_CLAIM_KEY);\n if (existing instanceof Map) return existing as Map<string, symbol>;\n const created = new Map<string, symbol>();\n Reflect.set(globalThis, BOOTSTRAP_CLAIM_KEY, created);\n return created;\n}\n\n/**\n * Claims the load cycle for one repository, or reports that it is already owned.\n *\n * Callers must acquire before their first `await`, because releasing happens on\n * `session_start` and an interleaved second factory would otherwise slip in.\n */\nexport function acquireBootstrapClaim(repoRoot: string): ReleaseBootstrapClaim | undefined {\n const registry = claimRegistry();\n const key = path.resolve(repoRoot);\n if (registry.has(key)) return undefined;\n\n const claim = Symbol('doompi-bootstrap');\n registry.set(key, claim);\n return () => {\n if (registry.get(key) === claim) registry.delete(key);\n };\n}\n"],"mappings":"yBAgBA,MAAM,EAAsB,OAAO,IAAI,oCAAoC,CAY3E,SAAS,GAAqC,CAC5C,IAAM,EAAW,QAAQ,IAAI,WAAY,EAAoB,CAC7D,GAAI,aAAoB,IAAK,OAAO,EACpC,IAAM,EAAU,IAAI,IAEpB,OADA,QAAQ,IAAI,WAAY,EAAqB,EAAQ,CAC9C,EAST,SAAgB,EAAsB,EAAqD,CACzF,IAAM,EAAW,GAAe,CAC1B,EAAM,EAAK,QAAQ,EAAS,CAClC,GAAI,EAAS,IAAI,EAAI,CAAE,OAEvB,IAAM,EAAQ,OAAO,mBAAmB,CAExC,OADA,EAAS,IAAI,EAAK,EAAM,KACX,CACP,EAAS,IAAI,EAAI,GAAK,GAAO,EAAS,OAAO,EAAI"}
@@ -1,2 +1,2 @@
1
- const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`./repository/repository.cjs`);require(`./syncStateContract.cjs`);let n=require(`node:fs`);n=e.__toESM(n,1);let r=require(`node:path`);r=e.__toESM(r,1);const i=r.default.join(`.pi`,`doom`,`state.json`);function a(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function o(e){return r.default.join(e,i)}function s(e){if(n.default.existsSync(o(e)))return e;try{let r=t.findRepositoryRoot(e);return n.default.existsSync(o(r))?r:void 0}catch{return}}function c(e){let t=o(e);if(!n.default.existsSync(t))return;let r;try{r=JSON.parse(n.default.readFileSync(t,`utf8`))}catch(e){throw Error(`Doom sync state at ${t} is not valid JSON`,{cause:e})}if(!a(r))throw Error(`Doom sync state at ${t} must be an object`);if(r.version!==6)throw Error(`Doom sync state at ${t} has version ${String(r.version)}, expected 6. Run doompi sync.`);if(typeof r.root!=`string`||typeof r.inputsHash!=`string`)throw Error(`Doom sync state at ${t} requires string root and inputsHash`);if(!a(r.selection)||typeof r.selection.majorMode!=`string`)throw Error(`Doom sync state at ${t} requires a selection with a majorMode`);if(!a(r.baseline)||typeof r.baseline.themePath!=`string`)throw Error(`Doom sync state at ${t} requires a baseline with a themePath`);if(!a(r.env))throw Error(`Doom sync state at ${t} requires env to be an object`);if(!a(r.resolved))throw Error(`Doom sync state at ${t} requires resolved to be an object`);if(r.compiled!==void 0&&!a(r.compiled))throw Error(`Doom sync state at ${t} requires compiled to be an object`);if(r.bundles!==void 0&&!a(r.bundles))throw Error(`Doom sync state at ${t} requires bundles to be an object`);return typeof r.bootstrap==`string`?r.bootstrap:void 0}exports.findSyncedRoot=s,exports.readBootstrapPointer=c;
1
+ const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`./repository/repository.cjs`);require(`./syncStateContract.cjs`);let n=require(`node:url`),r=require(`node:path`);r=e.__toESM(r,1);let i=require(`node:fs`);i=e.__toESM(i,1);const a=r.default.join(`.pi`,`doom`,`state.json`);function o(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function s(e){return o(e)?Object.fromEntries(Object.entries(e).filter(e=>typeof e[1]==`string`)):{}}function c(e){try{return i.default.realpathSync(e)}catch{return r.default.resolve(e)}}function l(e,t){let n=r.default.relative(c(e),c(t));return n===``||!n.startsWith(`..`)&&!r.default.isAbsolute(n)}function u(e=require(`url`).pathToFileURL(__filename).href){let t=e.endsWith(`.ts`)?`ts`:`mjs`,i=r.default.dirname(r.default.dirname((0,n.fileURLToPath)(e)));return r.default.join(i,`extensions`,`entries`,`doom.${t}`)}function d(e){return`export { default } from ${JSON.stringify((0,n.pathToFileURL)(e).href)};\n`}function f(e){return r.default.join(e,a)}function p(e){if(i.default.existsSync(f(e)))return e;try{let n=t.findRepositoryRoot(e);return i.default.existsSync(f(n))?n:void 0}catch{return}}function m(e){let t=f(e);if(!i.default.existsSync(t))return;let n;try{n=JSON.parse(i.default.readFileSync(t,`utf8`))}catch(e){throw Error(`Doom sync state at ${t} is not valid JSON`,{cause:e})}if(!o(n))throw Error(`Doom sync state at ${t} must be an object`);if(n.version!==8)throw Error(`Doom sync state at ${t} has version ${String(n.version)}, expected 8. Run doompi sync.`);if(typeof n.root!=`string`||typeof n.inputsHash!=`string`)throw Error(`Doom sync state at ${t} requires string root and inputsHash`);if(c(n.root)!==c(e))throw Error(`Doom sync state at ${t} belongs to a different repository: ${n.root}`);if(!o(n.selection)||typeof n.selection.majorMode!=`string`)throw Error(`Doom sync state at ${t} requires a selection with a majorMode`);if(!o(n.baseline)||typeof n.baseline.themePath!=`string`)throw Error(`Doom sync state at ${t} requires a baseline with a themePath`);if(!o(n.env))throw Error(`Doom sync state at ${t} requires env to be an object`);if(!o(n.resolved))throw Error(`Doom sync state at ${t} requires resolved to be an object`);if(n.compiled!==void 0&&!o(n.compiled))throw Error(`Doom sync state at ${t} requires compiled to be an object`);if(n.bundles!==void 0&&!o(n.bundles))throw Error(`Doom sync state at ${t} requires bundles to be an object`);let a=r.default.dirname(t),u=typeof n.bootstrap==`string`?n.bootstrap:void 0;if(u&&!l(a,u))throw Error(`Doom bootstrap must stay inside ${a}: ${u}`);let d;if(n.precompile!==void 0){if(!o(n.precompile)||typeof n.precompile.version!=`number`||n.precompile.strategy!==`native`&&n.precompile.strategy!==`bundle`||typeof n.precompile.bootstrapEntry!=`string`||n.precompile.bootstrapManifest!==void 0&&typeof n.precompile.bootstrapManifest!=`string`||!Array.isArray(n.precompile.manifests)||n.precompile.manifests.some(e=>typeof e!=`string`))throw Error(`Doom sync state at ${t} has an invalid precompile record`);d={version:n.precompile.version,strategy:n.precompile.strategy,bootstrapEntry:n.precompile.bootstrapEntry,bootstrapManifest:n.precompile.bootstrapManifest,manifests:n.precompile.manifests}}return{bootstrap:u,bundles:s(n.bundles),precompile:d}}function h(e,t){if(l(t,e))try{let n=JSON.parse(i.default.readFileSync(e,`utf8`));if(!o(n)||typeof n.output!=`string`||!Array.isArray(n.artifacts)||n.artifacts.some(e=>typeof e!=`string`)||!Array.isArray(n.entries)||n.entries.some(e=>typeof e!=`string`)||!Array.isArray(n.inputs))return;let r=[];for(let e of n.inputs){if(!o(e)||typeof e.path!=`string`||typeof e.size!=`number`||typeof e.mtimeMs!=`number`)return;r.push({path:e.path,size:e.size,mtimeMs:e.mtimeMs})}let a=n.artifacts,s=n.entries;return!l(t,n.output)||a.some(e=>!l(t,e))?void 0:{output:n.output,artifacts:a,entries:s,inputs:r}}catch{return}}function g(e){return!i.default.existsSync(e.output)||e.artifacts.some(e=>!i.default.existsSync(e))?!1:e.inputs.every(e=>{try{let t=i.default.statSync(e.path);return t.isFile()&&t.size===e.size&&t.mtimeMs===e.mtimeMs}catch{return!1}})}function _(e,t=u()){let n=m(e);if(!n?.bootstrap||!n.precompile)return{bootstrap:n?.bootstrap,fresh:!1};if(n.precompile.version!==2||c(n.precompile.bootstrapEntry)!==c(t))return{bootstrap:n.bootstrap,fresh:!1};if(n.precompile.strategy===`native`){let e=Object.keys(n.bundles).length===0;try{e&&=i.default.readFileSync(n.bootstrap,`utf8`)===d(t)}catch{e=!1}return{bootstrap:n.bootstrap,fresh:e}}if(n.precompile.strategy!==`bundle`||!n.precompile.bootstrapManifest)return{bootstrap:n.bootstrap,fresh:!1};let a=[...new Set(n.precompile.manifests)];if(a.length===0||a.length!==n.precompile.manifests.length||!a.includes(n.precompile.bootstrapManifest))return{bootstrap:n.bootstrap,fresh:!1};let o=r.default.dirname(f(e)),s=a.map(e=>h(e,o));if(s.some(e=>!e||!g(e)))return{bootstrap:n.bootstrap,fresh:!1};let l=s[a.indexOf(n.precompile.bootstrapManifest)];if(!l||l.output!==n.bootstrap||l.entries.length!==1||c(l.entries[0]??``)!==c(t))return{bootstrap:n.bootstrap,fresh:!1};let p=new Set(s.flatMap(e=>e?[e.output]:[])),_=Object.values(n.bundles).every(e=>p.has(e));return{bootstrap:n.bootstrap,fresh:_}}exports.bootstrapStatePath=f,exports.findSyncedRoot=p,exports.readBootstrapStatus=_;
2
2
  //# sourceMappingURL=bootstrapLocator.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrapLocator.cjs","names":["path","fs","findRepositoryRoot"],"sources":["../../src/adapters/bootstrapLocator.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { findRepositoryRoot } from './repository/repository.ts';\nimport { SYNC_STATE_VERSION } from './syncStateContract.ts';\n\nconst STATE_PATH = path.join('.pi', 'doom', 'state.json');\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function bootstrapStatePath(repoRoot: string): string {\n return path.join(repoRoot, STATE_PATH);\n}\n\n/** Finds the nearest configured repository with generated Doom sync state. */\nexport function findSyncedRoot(cwd: string): string | undefined {\n if (fs.existsSync(bootstrapStatePath(cwd))) return cwd;\n try {\n const root = findRepositoryRoot(cwd);\n return fs.existsSync(bootstrapStatePath(root)) ? root : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Reads only the generated bootstrap pointer while retaining state validation. */\nexport function readBootstrapPointer(repoRoot: string): string | undefined {\n const statePath = bootstrapStatePath(repoRoot);\n if (!fs.existsSync(statePath)) return undefined;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(fs.readFileSync(statePath, 'utf8'));\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 if (parsed.version !== SYNC_STATE_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 (!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 if (!isRecord(parsed.env)) throw new Error(`Doom sync state at ${statePath} requires env to be an object`);\n if (!isRecord(parsed.resolved)) throw new Error(`Doom sync state at ${statePath} requires resolved to be an object`);\n if (parsed.compiled !== undefined && !isRecord(parsed.compiled)) {\n throw new Error(`Doom sync state at ${statePath} requires compiled to be an object`);\n }\n if (parsed.bundles !== undefined && !isRecord(parsed.bundles)) {\n throw new Error(`Doom sync state at ${statePath} requires bundles to be an object`);\n }\n return typeof parsed.bootstrap === 'string' ? parsed.bootstrap : undefined;\n}\n"],"mappings":"uNAKA,MAAM,EAAaA,EAAAA,QAAK,KAAK,MAAO,OAAQ,aAAa,CAEzD,SAAS,EAAS,EAAkD,CAClE,OAAO,OAAO,GAAU,YAAY,GAAkB,CAAC,MAAM,QAAQ,EAAM,CAG7E,SAAgB,EAAmB,EAA0B,CAC3D,OAAOA,EAAAA,QAAK,KAAK,EAAU,EAAW,CAIxC,SAAgB,EAAe,EAAiC,CAC9D,GAAIC,EAAAA,QAAG,WAAW,EAAmB,EAAI,CAAC,CAAE,OAAO,EACnD,GAAI,CACF,IAAM,EAAOC,EAAAA,mBAAmB,EAAI,CACpC,OAAOD,EAAAA,QAAG,WAAW,EAAmB,EAAK,CAAC,CAAG,EAAO,IAAA,QAClD,CACN,QAKJ,SAAgB,EAAqB,EAAsC,CACzE,IAAM,EAAY,EAAmB,EAAS,CAC9C,GAAI,CAACA,EAAAA,QAAG,WAAW,EAAU,CAAE,OAE/B,IAAI,EACJ,GAAI,CACF,EAAS,KAAK,MAAMA,EAAAA,QAAG,aAAa,EAAW,OAAO,CAAC,OAChD,EAAO,CACd,MAAU,MAAM,sBAAsB,EAAU,oBAAqB,CAAE,MAAO,EAAO,CAAC,CAExF,GAAI,CAAC,EAAS,EAAO,CAAE,MAAU,MAAM,sBAAsB,EAAU,oBAAoB,CAC3F,GAAI,EAAO,UAAA,EACT,MAAU,MACR,sBAAsB,EAAU,eAAe,OAAO,EAAO,QAAQ,CAAC,gCACvE,CAEH,GAAI,OAAO,EAAO,MAAS,UAAY,OAAO,EAAO,YAAe,SAClE,MAAU,MAAM,sBAAsB,EAAU,sCAAsC,CAExF,GAAI,CAAC,EAAS,EAAO,UAAU,EAAI,OAAO,EAAO,UAAU,WAAc,SACvE,MAAU,MAAM,sBAAsB,EAAU,wCAAwC,CAE1F,GAAI,CAAC,EAAS,EAAO,SAAS,EAAI,OAAO,EAAO,SAAS,WAAc,SACrE,MAAU,MAAM,sBAAsB,EAAU,uCAAuC,CAEzF,GAAI,CAAC,EAAS,EAAO,IAAI,CAAE,MAAU,MAAM,sBAAsB,EAAU,+BAA+B,CAC1G,GAAI,CAAC,EAAS,EAAO,SAAS,CAAE,MAAU,MAAM,sBAAsB,EAAU,oCAAoC,CACpH,GAAI,EAAO,WAAa,IAAA,IAAa,CAAC,EAAS,EAAO,SAAS,CAC7D,MAAU,MAAM,sBAAsB,EAAU,oCAAoC,CAEtF,GAAI,EAAO,UAAY,IAAA,IAAa,CAAC,EAAS,EAAO,QAAQ,CAC3D,MAAU,MAAM,sBAAsB,EAAU,mCAAmC,CAErF,OAAO,OAAO,EAAO,WAAc,SAAW,EAAO,UAAY,IAAA"}
1
+ {"version":3,"file":"bootstrapLocator.cjs","names":["path","fs","findRepositoryRoot"],"sources":["../../src/adapters/bootstrapLocator.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { findRepositoryRoot } from './repository/repository.ts';\nimport {\n BUNDLED_PRECOMPILE_STRATEGY,\n NATIVE_PRECOMPILE_STRATEGY,\n PRECOMPILE_STATE_VERSION,\n SYNC_STATE_VERSION,\n} from './syncStateContract.ts';\n\nconst STATE_PATH = path.join('.pi', 'doom', 'state.json');\n\ninterface InputFingerprint {\n path: string;\n size: number;\n mtimeMs: number;\n}\n\ninterface CompilerManifest {\n output: string;\n artifacts: string[];\n entries: string[];\n inputs: InputFingerprint[];\n}\n\ninterface BootstrapState {\n bootstrap?: string;\n bundles: Record<string, string>;\n precompile?: {\n version: number;\n strategy: 'native' | 'bundle';\n bootstrapEntry: string;\n bootstrapManifest?: string;\n manifests: string[];\n };\n}\n\nexport interface BootstrapStatus {\n bootstrap?: string;\n fresh: boolean;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction stringRecord(value: unknown): Record<string, string> {\n if (!isRecord(value)) return {};\n return Object.fromEntries(\n Object.entries(value).filter((entry): entry is [string, string] => typeof entry[1] === 'string'),\n );\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 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\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\nexport function bootstrapStatePath(repoRoot: string): string {\n return path.join(repoRoot, STATE_PATH);\n}\n\n/** Finds the nearest configured repository with generated Doom sync state. */\nexport function findSyncedRoot(cwd: string): string | undefined {\n if (fs.existsSync(bootstrapStatePath(cwd))) return cwd;\n try {\n const root = findRepositoryRoot(cwd);\n return fs.existsSync(bootstrapStatePath(root)) ? root : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction readBootstrapState(repoRoot: string): BootstrapState | undefined {\n const statePath = bootstrapStatePath(repoRoot);\n if (!fs.existsSync(statePath)) return undefined;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(fs.readFileSync(statePath, 'utf8'));\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 if (parsed.version !== SYNC_STATE_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 (canonicalPath(parsed.root) !== canonicalPath(repoRoot)) {\n throw new Error(`Doom sync state at ${statePath} belongs to a different repository: ${parsed.root}`);\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 if (!isRecord(parsed.env)) throw new Error(`Doom sync state at ${statePath} requires env to be an object`);\n if (!isRecord(parsed.resolved)) throw new Error(`Doom sync state at ${statePath} requires resolved to be an object`);\n if (parsed.compiled !== undefined && !isRecord(parsed.compiled)) {\n throw new Error(`Doom sync state at ${statePath} requires compiled to be an object`);\n }\n if (parsed.bundles !== undefined && !isRecord(parsed.bundles)) {\n throw new Error(`Doom sync state at ${statePath} requires bundles to be an object`);\n }\n\n const generatedDirectory = path.dirname(statePath);\n const bootstrap = typeof parsed.bootstrap === 'string' ? parsed.bootstrap : undefined;\n if (bootstrap && !isInside(generatedDirectory, bootstrap)) {\n throw new Error(`Doom bootstrap must stay inside ${generatedDirectory}: ${bootstrap}`);\n }\n\n let precompile: BootstrapState['precompile'];\n if (parsed.precompile !== undefined) {\n if (\n !isRecord(parsed.precompile) ||\n typeof parsed.precompile.version !== 'number' ||\n (parsed.precompile.strategy !== NATIVE_PRECOMPILE_STRATEGY &&\n parsed.precompile.strategy !== BUNDLED_PRECOMPILE_STRATEGY) ||\n typeof parsed.precompile.bootstrapEntry !== 'string' ||\n (parsed.precompile.bootstrapManifest !== undefined && typeof parsed.precompile.bootstrapManifest !== 'string') ||\n !Array.isArray(parsed.precompile.manifests) ||\n parsed.precompile.manifests.some((manifest) => typeof manifest !== 'string')\n ) {\n throw new Error(`Doom sync state at ${statePath} has an invalid precompile record`);\n }\n precompile = {\n version: parsed.precompile.version,\n strategy: parsed.precompile.strategy,\n bootstrapEntry: parsed.precompile.bootstrapEntry,\n bootstrapManifest: parsed.precompile.bootstrapManifest as string | undefined,\n manifests: parsed.precompile.manifests as string[],\n };\n }\n\n return { bootstrap, bundles: stringRecord(parsed.bundles), precompile };\n}\n\nfunction readCompilerManifest(manifestPath: string, generatedDirectory: string): CompilerManifest | undefined {\n if (!isInside(generatedDirectory, manifestPath)) return undefined;\n try {\n const parsed = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as unknown;\n if (\n !isRecord(parsed) ||\n typeof parsed.output !== 'string' ||\n !Array.isArray(parsed.artifacts) ||\n parsed.artifacts.some((artifact) => typeof artifact !== 'string') ||\n !Array.isArray(parsed.entries) ||\n parsed.entries.some((entry) => typeof entry !== 'string') ||\n !Array.isArray(parsed.inputs)\n ) {\n return undefined;\n }\n const inputs: InputFingerprint[] = [];\n for (const input of parsed.inputs) {\n if (\n !isRecord(input) ||\n typeof input.path !== 'string' ||\n typeof input.size !== 'number' ||\n typeof input.mtimeMs !== 'number'\n ) {\n return undefined;\n }\n inputs.push({ path: input.path, size: input.size, mtimeMs: input.mtimeMs });\n }\n const artifacts = parsed.artifacts as string[];\n const entries = parsed.entries as string[];\n if (\n !isInside(generatedDirectory, parsed.output) ||\n artifacts.some((artifact) => !isInside(generatedDirectory, artifact))\n ) {\n return undefined;\n }\n return { output: parsed.output, artifacts, entries, inputs };\n } catch {\n return undefined;\n }\n}\n\nfunction compilerManifestIsFresh(manifest: CompilerManifest): boolean {\n if (!fs.existsSync(manifest.output) || manifest.artifacts.some((artifact) => !fs.existsSync(artifact))) return false;\n return manifest.inputs.every((input) => {\n try {\n const stat = fs.statSync(input.path);\n return stat.isFile() && stat.size === input.size && stat.mtimeMs === input.mtimeMs;\n } catch {\n return false;\n }\n });\n}\n\n/** Reads the generated pointer and validates every compiler input without loading the compiler. */\nexport function readBootstrapStatus(\n repoRoot: string,\n expectedBootstrapEntry: string = packagedDoomEntry(),\n): BootstrapStatus {\n const state = readBootstrapState(repoRoot);\n if (!state?.bootstrap || !state.precompile) return { bootstrap: state?.bootstrap, fresh: false };\n if (\n state.precompile.version !== PRECOMPILE_STATE_VERSION ||\n canonicalPath(state.precompile.bootstrapEntry) !== canonicalPath(expectedBootstrapEntry)\n ) {\n return { bootstrap: state.bootstrap, fresh: false };\n }\n if (state.precompile.strategy === NATIVE_PRECOMPILE_STRATEGY) {\n let fresh = Object.keys(state.bundles).length === 0;\n try {\n fresh = fresh && fs.readFileSync(state.bootstrap, 'utf8') === nativeBootstrapSource(expectedBootstrapEntry);\n } catch {\n fresh = false;\n }\n return { bootstrap: state.bootstrap, fresh };\n }\n if (state.precompile.strategy !== BUNDLED_PRECOMPILE_STRATEGY || !state.precompile.bootstrapManifest) {\n return { bootstrap: state.bootstrap, fresh: false };\n }\n\n const manifests = [...new Set(state.precompile.manifests)];\n if (\n manifests.length === 0 ||\n manifests.length !== state.precompile.manifests.length ||\n !manifests.includes(state.precompile.bootstrapManifest)\n ) {\n return { bootstrap: state.bootstrap, fresh: false };\n }\n\n const generatedDirectory = path.dirname(bootstrapStatePath(repoRoot));\n const records = manifests.map((manifest) => readCompilerManifest(manifest, generatedDirectory));\n if (records.some((record) => !record || !compilerManifestIsFresh(record))) {\n return { bootstrap: state.bootstrap, fresh: false };\n }\n\n const bootstrapIndex = manifests.indexOf(state.precompile.bootstrapManifest);\n const bootstrapRecord = records[bootstrapIndex];\n if (\n !bootstrapRecord ||\n bootstrapRecord.output !== state.bootstrap ||\n bootstrapRecord.entries.length !== 1 ||\n canonicalPath(bootstrapRecord.entries[0] ?? '') !== canonicalPath(expectedBootstrapEntry)\n ) {\n return { bootstrap: state.bootstrap, fresh: false };\n }\n const outputs = new Set(records.flatMap((record) => (record ? [record.output] : [])));\n const fresh = Object.values(state.bundles).every((bundle) => outputs.has(bundle));\n return { bootstrap: state.bootstrap, fresh };\n}\n\n/** Reads only the generated bootstrap pointer while retaining state validation. */\nexport function readBootstrapPointer(repoRoot: string): string | undefined {\n return readBootstrapState(repoRoot)?.bootstrap;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrapLocator.d.cts","names":[],"sources":["../../src/adapters/bootstrapLocator.ts"],"mappings":";AAgBA;AAAA,iBAAgB,cAAA,CAAe,GAAA"}
1
+ {"version":3,"file":"bootstrapLocator.d.cts","names":[],"sources":["../../src/adapters/bootstrapLocator.ts"],"mappings":";;iBAkFgB,cAAA,CAAe,GAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrapLocator.d.mts","names":[],"sources":["../../src/adapters/bootstrapLocator.ts"],"mappings":";AAgBA;AAAA,iBAAgB,cAAA,CAAe,GAAA"}
1
+ {"version":3,"file":"bootstrapLocator.d.mts","names":[],"sources":["../../src/adapters/bootstrapLocator.ts"],"mappings":";;iBAkFgB,cAAA,CAAe,GAAA"}
@@ -1,2 +1,2 @@
1
- import{findRepositoryRoot as e}from"./repository/repository.mjs";import"./syncStateContract.mjs";import t from"node:fs";import n from"node:path";const r=n.join(`.pi`,`doom`,`state.json`);function i(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function a(e){return n.join(e,r)}function o(n){if(t.existsSync(a(n)))return n;try{let r=e(n);return t.existsSync(a(r))?r:void 0}catch{return}}function s(e){let n=a(e);if(!t.existsSync(n))return;let r;try{r=JSON.parse(t.readFileSync(n,`utf8`))}catch(e){throw Error(`Doom sync state at ${n} is not valid JSON`,{cause:e})}if(!i(r))throw Error(`Doom sync state at ${n} must be an object`);if(r.version!==6)throw Error(`Doom sync state at ${n} has version ${String(r.version)}, expected 6. Run doompi sync.`);if(typeof r.root!=`string`||typeof r.inputsHash!=`string`)throw Error(`Doom sync state at ${n} requires string root and inputsHash`);if(!i(r.selection)||typeof r.selection.majorMode!=`string`)throw Error(`Doom sync state at ${n} requires a selection with a majorMode`);if(!i(r.baseline)||typeof r.baseline.themePath!=`string`)throw Error(`Doom sync state at ${n} requires a baseline with a themePath`);if(!i(r.env))throw Error(`Doom sync state at ${n} requires env to be an object`);if(!i(r.resolved))throw Error(`Doom sync state at ${n} requires resolved to be an object`);if(r.compiled!==void 0&&!i(r.compiled))throw Error(`Doom sync state at ${n} requires compiled to be an object`);if(r.bundles!==void 0&&!i(r.bundles))throw Error(`Doom sync state at ${n} requires bundles to be an object`);return typeof r.bootstrap==`string`?r.bootstrap:void 0}export{o as findSyncedRoot,s as readBootstrapPointer};
1
+ import{findRepositoryRoot as e}from"./repository/repository.mjs";import"./syncStateContract.mjs";import{fileURLToPath as t,pathToFileURL as n}from"node:url";import r from"node:path";import i from"node:fs";const a=r.join(`.pi`,`doom`,`state.json`);function o(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function s(e){return o(e)?Object.fromEntries(Object.entries(e).filter(e=>typeof e[1]==`string`)):{}}function c(e){try{return i.realpathSync(e)}catch{return r.resolve(e)}}function l(e,t){let n=r.relative(c(e),c(t));return n===``||!n.startsWith(`..`)&&!r.isAbsolute(n)}function u(e=import.meta.url){let n=e.endsWith(`.ts`)?`ts`:`mjs`,i=r.dirname(r.dirname(t(e)));return r.join(i,`extensions`,`entries`,`doom.${n}`)}function d(e){return`export { default } from ${JSON.stringify(n(e).href)};\n`}function f(e){return r.join(e,a)}function p(t){if(i.existsSync(f(t)))return t;try{let n=e(t);return i.existsSync(f(n))?n:void 0}catch{return}}function m(e){let t=f(e);if(!i.existsSync(t))return;let n;try{n=JSON.parse(i.readFileSync(t,`utf8`))}catch(e){throw Error(`Doom sync state at ${t} is not valid JSON`,{cause:e})}if(!o(n))throw Error(`Doom sync state at ${t} must be an object`);if(n.version!==8)throw Error(`Doom sync state at ${t} has version ${String(n.version)}, expected 8. Run doompi sync.`);if(typeof n.root!=`string`||typeof n.inputsHash!=`string`)throw Error(`Doom sync state at ${t} requires string root and inputsHash`);if(c(n.root)!==c(e))throw Error(`Doom sync state at ${t} belongs to a different repository: ${n.root}`);if(!o(n.selection)||typeof n.selection.majorMode!=`string`)throw Error(`Doom sync state at ${t} requires a selection with a majorMode`);if(!o(n.baseline)||typeof n.baseline.themePath!=`string`)throw Error(`Doom sync state at ${t} requires a baseline with a themePath`);if(!o(n.env))throw Error(`Doom sync state at ${t} requires env to be an object`);if(!o(n.resolved))throw Error(`Doom sync state at ${t} requires resolved to be an object`);if(n.compiled!==void 0&&!o(n.compiled))throw Error(`Doom sync state at ${t} requires compiled to be an object`);if(n.bundles!==void 0&&!o(n.bundles))throw Error(`Doom sync state at ${t} requires bundles to be an object`);let a=r.dirname(t),u=typeof n.bootstrap==`string`?n.bootstrap:void 0;if(u&&!l(a,u))throw Error(`Doom bootstrap must stay inside ${a}: ${u}`);let d;if(n.precompile!==void 0){if(!o(n.precompile)||typeof n.precompile.version!=`number`||n.precompile.strategy!==`native`&&n.precompile.strategy!==`bundle`||typeof n.precompile.bootstrapEntry!=`string`||n.precompile.bootstrapManifest!==void 0&&typeof n.precompile.bootstrapManifest!=`string`||!Array.isArray(n.precompile.manifests)||n.precompile.manifests.some(e=>typeof e!=`string`))throw Error(`Doom sync state at ${t} has an invalid precompile record`);d={version:n.precompile.version,strategy:n.precompile.strategy,bootstrapEntry:n.precompile.bootstrapEntry,bootstrapManifest:n.precompile.bootstrapManifest,manifests:n.precompile.manifests}}return{bootstrap:u,bundles:s(n.bundles),precompile:d}}function h(e,t){if(l(t,e))try{let n=JSON.parse(i.readFileSync(e,`utf8`));if(!o(n)||typeof n.output!=`string`||!Array.isArray(n.artifacts)||n.artifacts.some(e=>typeof e!=`string`)||!Array.isArray(n.entries)||n.entries.some(e=>typeof e!=`string`)||!Array.isArray(n.inputs))return;let r=[];for(let e of n.inputs){if(!o(e)||typeof e.path!=`string`||typeof e.size!=`number`||typeof e.mtimeMs!=`number`)return;r.push({path:e.path,size:e.size,mtimeMs:e.mtimeMs})}let a=n.artifacts,s=n.entries;return!l(t,n.output)||a.some(e=>!l(t,e))?void 0:{output:n.output,artifacts:a,entries:s,inputs:r}}catch{return}}function g(e){return!i.existsSync(e.output)||e.artifacts.some(e=>!i.existsSync(e))?!1:e.inputs.every(e=>{try{let t=i.statSync(e.path);return t.isFile()&&t.size===e.size&&t.mtimeMs===e.mtimeMs}catch{return!1}})}function _(e,t=u()){let n=m(e);if(!n?.bootstrap||!n.precompile)return{bootstrap:n?.bootstrap,fresh:!1};if(n.precompile.version!==2||c(n.precompile.bootstrapEntry)!==c(t))return{bootstrap:n.bootstrap,fresh:!1};if(n.precompile.strategy===`native`){let e=Object.keys(n.bundles).length===0;try{e&&=i.readFileSync(n.bootstrap,`utf8`)===d(t)}catch{e=!1}return{bootstrap:n.bootstrap,fresh:e}}if(n.precompile.strategy!==`bundle`||!n.precompile.bootstrapManifest)return{bootstrap:n.bootstrap,fresh:!1};let a=[...new Set(n.precompile.manifests)];if(a.length===0||a.length!==n.precompile.manifests.length||!a.includes(n.precompile.bootstrapManifest))return{bootstrap:n.bootstrap,fresh:!1};let o=r.dirname(f(e)),s=a.map(e=>h(e,o));if(s.some(e=>!e||!g(e)))return{bootstrap:n.bootstrap,fresh:!1};let l=s[a.indexOf(n.precompile.bootstrapManifest)];if(!l||l.output!==n.bootstrap||l.entries.length!==1||c(l.entries[0]??``)!==c(t))return{bootstrap:n.bootstrap,fresh:!1};let p=new Set(s.flatMap(e=>e?[e.output]:[])),_=Object.values(n.bundles).every(e=>p.has(e));return{bootstrap:n.bootstrap,fresh:_}}export{f as bootstrapStatePath,p as findSyncedRoot,_ as readBootstrapStatus};
2
2
  //# sourceMappingURL=bootstrapLocator.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrapLocator.mjs","names":[],"sources":["../../src/adapters/bootstrapLocator.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { findRepositoryRoot } from './repository/repository.ts';\nimport { SYNC_STATE_VERSION } from './syncStateContract.ts';\n\nconst STATE_PATH = path.join('.pi', 'doom', 'state.json');\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function bootstrapStatePath(repoRoot: string): string {\n return path.join(repoRoot, STATE_PATH);\n}\n\n/** Finds the nearest configured repository with generated Doom sync state. */\nexport function findSyncedRoot(cwd: string): string | undefined {\n if (fs.existsSync(bootstrapStatePath(cwd))) return cwd;\n try {\n const root = findRepositoryRoot(cwd);\n return fs.existsSync(bootstrapStatePath(root)) ? root : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Reads only the generated bootstrap pointer while retaining state validation. */\nexport function readBootstrapPointer(repoRoot: string): string | undefined {\n const statePath = bootstrapStatePath(repoRoot);\n if (!fs.existsSync(statePath)) return undefined;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(fs.readFileSync(statePath, 'utf8'));\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 if (parsed.version !== SYNC_STATE_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 (!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 if (!isRecord(parsed.env)) throw new Error(`Doom sync state at ${statePath} requires env to be an object`);\n if (!isRecord(parsed.resolved)) throw new Error(`Doom sync state at ${statePath} requires resolved to be an object`);\n if (parsed.compiled !== undefined && !isRecord(parsed.compiled)) {\n throw new Error(`Doom sync state at ${statePath} requires compiled to be an object`);\n }\n if (parsed.bundles !== undefined && !isRecord(parsed.bundles)) {\n throw new Error(`Doom sync state at ${statePath} requires bundles to be an object`);\n }\n return typeof parsed.bootstrap === 'string' ? parsed.bootstrap : undefined;\n}\n"],"mappings":"iJAKA,MAAM,EAAa,EAAK,KAAK,MAAO,OAAQ,aAAa,CAEzD,SAAS,EAAS,EAAkD,CAClE,OAAO,OAAO,GAAU,YAAY,GAAkB,CAAC,MAAM,QAAQ,EAAM,CAG7E,SAAgB,EAAmB,EAA0B,CAC3D,OAAO,EAAK,KAAK,EAAU,EAAW,CAIxC,SAAgB,EAAe,EAAiC,CAC9D,GAAI,EAAG,WAAW,EAAmB,EAAI,CAAC,CAAE,OAAO,EACnD,GAAI,CACF,IAAM,EAAO,EAAmB,EAAI,CACpC,OAAO,EAAG,WAAW,EAAmB,EAAK,CAAC,CAAG,EAAO,IAAA,QAClD,CACN,QAKJ,SAAgB,EAAqB,EAAsC,CACzE,IAAM,EAAY,EAAmB,EAAS,CAC9C,GAAI,CAAC,EAAG,WAAW,EAAU,CAAE,OAE/B,IAAI,EACJ,GAAI,CACF,EAAS,KAAK,MAAM,EAAG,aAAa,EAAW,OAAO,CAAC,OAChD,EAAO,CACd,MAAU,MAAM,sBAAsB,EAAU,oBAAqB,CAAE,MAAO,EAAO,CAAC,CAExF,GAAI,CAAC,EAAS,EAAO,CAAE,MAAU,MAAM,sBAAsB,EAAU,oBAAoB,CAC3F,GAAI,EAAO,UAAA,EACT,MAAU,MACR,sBAAsB,EAAU,eAAe,OAAO,EAAO,QAAQ,CAAC,gCACvE,CAEH,GAAI,OAAO,EAAO,MAAS,UAAY,OAAO,EAAO,YAAe,SAClE,MAAU,MAAM,sBAAsB,EAAU,sCAAsC,CAExF,GAAI,CAAC,EAAS,EAAO,UAAU,EAAI,OAAO,EAAO,UAAU,WAAc,SACvE,MAAU,MAAM,sBAAsB,EAAU,wCAAwC,CAE1F,GAAI,CAAC,EAAS,EAAO,SAAS,EAAI,OAAO,EAAO,SAAS,WAAc,SACrE,MAAU,MAAM,sBAAsB,EAAU,uCAAuC,CAEzF,GAAI,CAAC,EAAS,EAAO,IAAI,CAAE,MAAU,MAAM,sBAAsB,EAAU,+BAA+B,CAC1G,GAAI,CAAC,EAAS,EAAO,SAAS,CAAE,MAAU,MAAM,sBAAsB,EAAU,oCAAoC,CACpH,GAAI,EAAO,WAAa,IAAA,IAAa,CAAC,EAAS,EAAO,SAAS,CAC7D,MAAU,MAAM,sBAAsB,EAAU,oCAAoC,CAEtF,GAAI,EAAO,UAAY,IAAA,IAAa,CAAC,EAAS,EAAO,QAAQ,CAC3D,MAAU,MAAM,sBAAsB,EAAU,mCAAmC,CAErF,OAAO,OAAO,EAAO,WAAc,SAAW,EAAO,UAAY,IAAA"}
1
+ {"version":3,"file":"bootstrapLocator.mjs","names":[],"sources":["../../src/adapters/bootstrapLocator.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { findRepositoryRoot } from './repository/repository.ts';\nimport {\n BUNDLED_PRECOMPILE_STRATEGY,\n NATIVE_PRECOMPILE_STRATEGY,\n PRECOMPILE_STATE_VERSION,\n SYNC_STATE_VERSION,\n} from './syncStateContract.ts';\n\nconst STATE_PATH = path.join('.pi', 'doom', 'state.json');\n\ninterface InputFingerprint {\n path: string;\n size: number;\n mtimeMs: number;\n}\n\ninterface CompilerManifest {\n output: string;\n artifacts: string[];\n entries: string[];\n inputs: InputFingerprint[];\n}\n\ninterface BootstrapState {\n bootstrap?: string;\n bundles: Record<string, string>;\n precompile?: {\n version: number;\n strategy: 'native' | 'bundle';\n bootstrapEntry: string;\n bootstrapManifest?: string;\n manifests: string[];\n };\n}\n\nexport interface BootstrapStatus {\n bootstrap?: string;\n fresh: boolean;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction stringRecord(value: unknown): Record<string, string> {\n if (!isRecord(value)) return {};\n return Object.fromEntries(\n Object.entries(value).filter((entry): entry is [string, string] => typeof entry[1] === 'string'),\n );\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 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\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\nexport function bootstrapStatePath(repoRoot: string): string {\n return path.join(repoRoot, STATE_PATH);\n}\n\n/** Finds the nearest configured repository with generated Doom sync state. */\nexport function findSyncedRoot(cwd: string): string | undefined {\n if (fs.existsSync(bootstrapStatePath(cwd))) return cwd;\n try {\n const root = findRepositoryRoot(cwd);\n return fs.existsSync(bootstrapStatePath(root)) ? root : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction readBootstrapState(repoRoot: string): BootstrapState | undefined {\n const statePath = bootstrapStatePath(repoRoot);\n if (!fs.existsSync(statePath)) return undefined;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(fs.readFileSync(statePath, 'utf8'));\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 if (parsed.version !== SYNC_STATE_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 (canonicalPath(parsed.root) !== canonicalPath(repoRoot)) {\n throw new Error(`Doom sync state at ${statePath} belongs to a different repository: ${parsed.root}`);\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 if (!isRecord(parsed.env)) throw new Error(`Doom sync state at ${statePath} requires env to be an object`);\n if (!isRecord(parsed.resolved)) throw new Error(`Doom sync state at ${statePath} requires resolved to be an object`);\n if (parsed.compiled !== undefined && !isRecord(parsed.compiled)) {\n throw new Error(`Doom sync state at ${statePath} requires compiled to be an object`);\n }\n if (parsed.bundles !== undefined && !isRecord(parsed.bundles)) {\n throw new Error(`Doom sync state at ${statePath} requires bundles to be an object`);\n }\n\n const generatedDirectory = path.dirname(statePath);\n const bootstrap = typeof parsed.bootstrap === 'string' ? parsed.bootstrap : undefined;\n if (bootstrap && !isInside(generatedDirectory, bootstrap)) {\n throw new Error(`Doom bootstrap must stay inside ${generatedDirectory}: ${bootstrap}`);\n }\n\n let precompile: BootstrapState['precompile'];\n if (parsed.precompile !== undefined) {\n if (\n !isRecord(parsed.precompile) ||\n typeof parsed.precompile.version !== 'number' ||\n (parsed.precompile.strategy !== NATIVE_PRECOMPILE_STRATEGY &&\n parsed.precompile.strategy !== BUNDLED_PRECOMPILE_STRATEGY) ||\n typeof parsed.precompile.bootstrapEntry !== 'string' ||\n (parsed.precompile.bootstrapManifest !== undefined && typeof parsed.precompile.bootstrapManifest !== 'string') ||\n !Array.isArray(parsed.precompile.manifests) ||\n parsed.precompile.manifests.some((manifest) => typeof manifest !== 'string')\n ) {\n throw new Error(`Doom sync state at ${statePath} has an invalid precompile record`);\n }\n precompile = {\n version: parsed.precompile.version,\n strategy: parsed.precompile.strategy,\n bootstrapEntry: parsed.precompile.bootstrapEntry,\n bootstrapManifest: parsed.precompile.bootstrapManifest as string | undefined,\n manifests: parsed.precompile.manifests as string[],\n };\n }\n\n return { bootstrap, bundles: stringRecord(parsed.bundles), precompile };\n}\n\nfunction readCompilerManifest(manifestPath: string, generatedDirectory: string): CompilerManifest | undefined {\n if (!isInside(generatedDirectory, manifestPath)) return undefined;\n try {\n const parsed = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as unknown;\n if (\n !isRecord(parsed) ||\n typeof parsed.output !== 'string' ||\n !Array.isArray(parsed.artifacts) ||\n parsed.artifacts.some((artifact) => typeof artifact !== 'string') ||\n !Array.isArray(parsed.entries) ||\n parsed.entries.some((entry) => typeof entry !== 'string') ||\n !Array.isArray(parsed.inputs)\n ) {\n return undefined;\n }\n const inputs: InputFingerprint[] = [];\n for (const input of parsed.inputs) {\n if (\n !isRecord(input) ||\n typeof input.path !== 'string' ||\n typeof input.size !== 'number' ||\n typeof input.mtimeMs !== 'number'\n ) {\n return undefined;\n }\n inputs.push({ path: input.path, size: input.size, mtimeMs: input.mtimeMs });\n }\n const artifacts = parsed.artifacts as string[];\n const entries = parsed.entries as string[];\n if (\n !isInside(generatedDirectory, parsed.output) ||\n artifacts.some((artifact) => !isInside(generatedDirectory, artifact))\n ) {\n return undefined;\n }\n return { output: parsed.output, artifacts, entries, inputs };\n } catch {\n return undefined;\n }\n}\n\nfunction compilerManifestIsFresh(manifest: CompilerManifest): boolean {\n if (!fs.existsSync(manifest.output) || manifest.artifacts.some((artifact) => !fs.existsSync(artifact))) return false;\n return manifest.inputs.every((input) => {\n try {\n const stat = fs.statSync(input.path);\n return stat.isFile() && stat.size === input.size && stat.mtimeMs === input.mtimeMs;\n } catch {\n return false;\n }\n });\n}\n\n/** Reads the generated pointer and validates every compiler input without loading the compiler. */\nexport function readBootstrapStatus(\n repoRoot: string,\n expectedBootstrapEntry: string = packagedDoomEntry(),\n): BootstrapStatus {\n const state = readBootstrapState(repoRoot);\n if (!state?.bootstrap || !state.precompile) return { bootstrap: state?.bootstrap, fresh: false };\n if (\n state.precompile.version !== PRECOMPILE_STATE_VERSION ||\n canonicalPath(state.precompile.bootstrapEntry) !== canonicalPath(expectedBootstrapEntry)\n ) {\n return { bootstrap: state.bootstrap, fresh: false };\n }\n if (state.precompile.strategy === NATIVE_PRECOMPILE_STRATEGY) {\n let fresh = Object.keys(state.bundles).length === 0;\n try {\n fresh = fresh && fs.readFileSync(state.bootstrap, 'utf8') === nativeBootstrapSource(expectedBootstrapEntry);\n } catch {\n fresh = false;\n }\n return { bootstrap: state.bootstrap, fresh };\n }\n if (state.precompile.strategy !== BUNDLED_PRECOMPILE_STRATEGY || !state.precompile.bootstrapManifest) {\n return { bootstrap: state.bootstrap, fresh: false };\n }\n\n const manifests = [...new Set(state.precompile.manifests)];\n if (\n manifests.length === 0 ||\n manifests.length !== state.precompile.manifests.length ||\n !manifests.includes(state.precompile.bootstrapManifest)\n ) {\n return { bootstrap: state.bootstrap, fresh: false };\n }\n\n const generatedDirectory = path.dirname(bootstrapStatePath(repoRoot));\n const records = manifests.map((manifest) => readCompilerManifest(manifest, generatedDirectory));\n if (records.some((record) => !record || !compilerManifestIsFresh(record))) {\n return { bootstrap: state.bootstrap, fresh: false };\n }\n\n const bootstrapIndex = manifests.indexOf(state.precompile.bootstrapManifest);\n const bootstrapRecord = records[bootstrapIndex];\n if (\n !bootstrapRecord ||\n bootstrapRecord.output !== state.bootstrap ||\n bootstrapRecord.entries.length !== 1 ||\n canonicalPath(bootstrapRecord.entries[0] ?? '') !== canonicalPath(expectedBootstrapEntry)\n ) {\n return { bootstrap: state.bootstrap, fresh: false };\n }\n const outputs = new Set(records.flatMap((record) => (record ? [record.output] : [])));\n const fresh = Object.values(state.bundles).every((bundle) => outputs.has(bundle));\n return { bootstrap: state.bootstrap, fresh };\n}\n\n/** Reads only the generated bootstrap pointer while retaining state validation. */\nexport function readBootstrapPointer(repoRoot: string): string | undefined {\n return readBootstrapState(repoRoot)?.bootstrap;\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require(`../../_virtual/_rolldown/runtime.cjs`),t=require(`../serialization/json.cjs`);require(`../../utils/index.cjs`);const n=require(`./process.cjs`),r=require(`./shared.cjs`);let i=require(`node:fs`);i=e.__toESM(i,1);let a=require(`node:path`);a=e.__toESM(a,1);const o=`.doom-pi-managed.json`,s=`mcp-proxy`,c=`project-mcp`,l=`pencil`,u=`.agents`,d=`_agents`,f=`mcp_config.json`,p=`hooks.json`,m=`plugins`,h=`.gemini`,g=`antigravity-cli`;function _(e,t){if(typeof e.command==`string`){let n={...e,command:e.command,args:Array.isArray(e.args)?e.args.map(String):[],cwd:typeof e.cwd==`string`?e.cwd:t};return delete n.type,n}let n=typeof e.url==`string`?e.url:void 0;if(!n)return;let r={...e,serverUrl:n};return delete r.type,delete r.url,r}function v(e){let n=e.options.repoRoot,d=a.default.join(n,u,f),p=a.default.join(n,u,o),m=t.readJson(d),g=m[r.MCP_SERVERS_KEY],v=t.isRecord(g)?{...g}:{},y=t.readJson(p),b=y[r.MCP_SERVERS_KEY],x=Array.isArray(b)?b.map(String):[];for(let e of new Set([...x,s,c,l]))delete v[e];let S=t.readJson(e.mcpConfigPath)[r.MCP_SERVERS_KEY],C=t.isRecord(S)?S:{},w=e.mcpAllowlist?.servers,T=e=>!w||w.length===0||w.includes(e),E=[];T(`agiflow-proxy`)&&(v[s]={command:`npx`,args:r.mcpProxyArguments(r.ANTIGRAVITY_MCP_PROXY_PACKAGE,e.proxyConfigPath,!0),cwd:n,timeout:12e5},E.push(s));let D=e.mcpAllowlist?w??[]:[c,l];for(let e of D){if(e===`agiflow-proxy`)continue;let r=C[e];if(!t.isRecord(r))continue;let i=_(r,n);i&&(v[e]=i,E.push(e))}t.writeJson(d,{...m,[r.MCP_SERVERS_KEY]:v}),t.writeJson(p,{...y,[r.MCP_SERVERS_KEY]:E});let O=e.environment.HOME;if(O)for(let e of[a.default.join(O,h,`config`,f),a.default.join(O,h,`config`,r.PLUGINS_DIRECTORY,`shared`,f)]){if(!i.default.existsSync(e))continue;let n=t.readJson(e),a=n[r.MCP_SERVERS_KEY],o=t.isRecord(a)?{...a}:{};for(let e of[s,r.AGIFLOW_PROXY_SERVER_NAME,c,l])delete o[e];t.writeJson(e,{...n,[r.MCP_SERVERS_KEY]:o})}}function y(e){return a.default.join(e,h,g,`settings.json`)}function b(e){let n=e.environment.HOME;if(!n)throw Error(`HOME is required for Antigravity compatibility`);let r=y(n),i=t.readJson(r);i.model||=e.environment.AGY_MODEL??`Gemini 3.5 Flash`;let a=Array.isArray(i.trustedWorkspaces)?i.trustedWorkspaces.map(String):[];a.includes(e.options.repoRoot)||a.push(e.options.repoRoot),i.trustedWorkspaces=a,t.writeJson(r,i)}function x(e){let t=i.default.lstatSync(e,{throwIfNoEntry:!1});if(t&&!t.isDirectory())throw Error(`Refusing to use unmanaged Antigravity path: ${e}`);t||i.default.mkdirSync(e,{recursive:!0})}function S(e,t){if(i.default.existsSync(e)||i.default.lstatSync(e,{throwIfNoEntry:!1})){if(!i.default.lstatSync(e).isSymbolicLink())throw Error(`Refusing to replace unmanaged Antigravity path: ${e}`);i.default.rmSync(e,{force:!0})}i.default.symlinkSync(t,e,`dir`)}function C(e){let s=e.options.repoRoot,c=a.default.join(s,r.PLUGINS_DIRECTORY),l=a.default.join(s,d),f=a.default.join(l,r.PLUGINS_DIRECTORY),p=a.default.join(s,u,o),h=t.readJson(p),g=h[m],_=new Set(Array.isArray(g)?g.map(String):[]);x(l),x(f);let v=new Set;for(let n of e.plugins){let e=a.default.join(n.directory,`.codex-plugin`,r.PLUGIN_MANIFEST_FILENAME);if(!i.default.existsSync(e))continue;let o=t.readJson(e),s=typeof o.name==`string`&&o.name?o.name:a.default.basename(n.directory);if(s===`.`||s===`..`||s.toLowerCase()===`core`||s.includes(`/`)||s.includes(`\\`))throw Error(`Invalid Antigravity plugin name: ${s}`);let c=a.default.join(f,s);v.add(s),x(c),t.writeJson(a.default.join(c,r.PLUGIN_MANIFEST_FILENAME),{name:s});let l=a.default.join(n.directory,r.SKILLS_DIRECTORY),u=a.default.join(c,r.SKILLS_DIRECTORY);i.default.existsSync(l)?S(u,l):i.default.lstatSync(u,{throwIfNoEntry:!1})?.isSymbolicLink()&&i.default.rmSync(u,{force:!0})}for(let e of i.default.readdirSync(f,{withFileTypes:!0})){if(e.name===`core`||v.has(e.name))continue;let t=a.default.join(f,e.name);if(_.has(e.name)){i.default.rmSync(t,{recursive:!0,force:!0});continue}if(!e.isDirectory())continue;let o=a.default.join(t,r.SKILLS_DIRECTORY);i.default.lstatSync(o,{throwIfNoEntry:!1})?.isSymbolicLink()&&n.pathInside(c,a.default.resolve(a.default.dirname(o),i.default.readlinkSync(o)))&&i.default.rmSync(t,{recursive:!0,force:!0})}t.writeJson(p,{...h,[m]:[...v]})}function w(e){t.readJson(a.default.join(e,`plugin.json`)).name===`core`&&i.default.rmSync(e,{recursive:!0,force:!0})}function T(e){let n=a.default.join(e.options.repoRoot,d,r.PLUGINS_DIRECTORY,r.CORE_PLUGIN_NAME);if(i.default.lstatSync(n,{throwIfNoEntry:!1})?.isSymbolicLink())throw Error(`Refusing to use unmanaged Antigravity path: ${n}`);if(!e.sharedSkills){w(n);return}let o=a.default.join(e.options.repoRoot,`.claude`,r.SKILLS_DIRECTORY);if(!i.default.existsSync(o)){w(n);return}x(n);let s=a.default.join(n,r.SKILLS_DIRECTORY);x(s),t.writeJson(a.default.join(n,r.PLUGIN_MANIFEST_FILENAME),{name:r.CORE_PLUGIN_NAME});let c=new Set;for(let e of i.default.readdirSync(o,{withFileTypes:!0}))e.isDirectory()&&(c.add(e.name),S(a.default.join(s,e.name),a.default.join(o,e.name)));for(let e of i.default.readdirSync(s)){if(c.has(e))continue;let t=a.default.join(s,e);i.default.lstatSync(t).isSymbolicLink()&&i.default.rmSync(t,{force:!0})}}function E(e){let n=a.default.join(e.options.repoRoot,`.antigravity-local`,p),r=a.default.join(e.options.repoRoot,u,p),s=a.default.join(e.options.repoRoot,u,o),c=t.readJson(s);if(!i.default.existsSync(n)){c.hooks===!0&&i.default.rmSync(r,{force:!0}),t.writeJson(s,{...c,hooks:!1});return}let l=i.default.readFileSync(n,`utf8`).replaceAll(`$AGY_REPO_ROOT`,e.options.repoRoot),d=i.default.lstatSync(r,{throwIfNoEntry:!1});if(d&&c.hooks!==!0&&(!d.isFile()||i.default.readFileSync(r,`utf8`)!==l))throw Error(`Refusing to replace unmanaged Antigravity path: ${r}`);t.writeFileAtomic(r,l),t.writeJson(s,{...c,hooks:!0})}function D(e){return[r.SKIP_PERMISSIONS_OPTION,...r.additionalDirectoryArgs(e),...e.options.providerArgs]}async function O(e){let t=e.environment.HOME;if(!t)throw Error(`HOME is required for Antigravity compatibility`);let r=await n.acquireDirectoryLock(a.default.join(t,h,g,`.doom-pi-sync.lock`));try{v(e),b(e),C(e),T(e),E(e)}finally{await r()}return n.runInteractive(`agy`,D(e),e.options.repoRoot,e.environment)}exports.adaptAntigravityMcpDefinition=_,exports.antigravityCompatibilityArgs=D,exports.launchAntigravity=O;
1
+ const e=require(`../../_virtual/_rolldown/runtime.cjs`),t=require(`../serialization/json.cjs`);require(`../../utils/index.cjs`);const n=require(`./process.cjs`),r=require(`./shared.cjs`);let i=require(`node:path`);i=e.__toESM(i,1);let a=require(`node:fs`);a=e.__toESM(a,1);const o=`.doom-pi-managed.json`,s=`mcp-proxy`,c=`project-mcp`,l=`pencil`,u=`.agents`,d=`_agents`,f=`mcp_config.json`,p=`hooks.json`,m=`plugins`,h=`.gemini`,g=`antigravity-cli`;function _(e,t){if(typeof e.command==`string`){let n={...e,command:e.command,args:Array.isArray(e.args)?e.args.map(String):[],cwd:typeof e.cwd==`string`?e.cwd:t};return delete n.type,n}let n=typeof e.url==`string`?e.url:void 0;if(!n)return;let r={...e,serverUrl:n};return delete r.type,delete r.url,r}function v(e){let n=e.options.repoRoot,d=i.default.join(n,u,f),p=i.default.join(n,u,o),m=t.readJson(d),g=m[r.MCP_SERVERS_KEY],v=t.isRecord(g)?{...g}:{},y=t.readJson(p),b=y[r.MCP_SERVERS_KEY],x=Array.isArray(b)?b.map(String):[];for(let e of new Set([...x,s,c,l]))delete v[e];let S=t.readJson(e.mcpConfigPath)[r.MCP_SERVERS_KEY],C=t.isRecord(S)?S:{},w=e.mcpAllowlist?.servers,T=e=>!w||w.length===0||w.includes(e),E=[];T(`agiflow-proxy`)&&(v[s]={command:`npx`,args:r.mcpProxyArguments(r.ANTIGRAVITY_MCP_PROXY_PACKAGE,e.proxyConfigPath,!0),cwd:n,timeout:12e5},E.push(s));let D=e.mcpAllowlist?w??[]:[c,l];for(let e of D){if(e===`agiflow-proxy`)continue;let r=C[e];if(!t.isRecord(r))continue;let i=_(r,n);i&&(v[e]=i,E.push(e))}t.writeJson(d,{...m,[r.MCP_SERVERS_KEY]:v}),t.writeJson(p,{...y,[r.MCP_SERVERS_KEY]:E});let O=e.environment.HOME;if(O)for(let e of[i.default.join(O,h,`config`,f),i.default.join(O,h,`config`,r.PLUGINS_DIRECTORY,`shared`,f)]){if(!a.default.existsSync(e))continue;let n=t.readJson(e),i=n[r.MCP_SERVERS_KEY],o=t.isRecord(i)?{...i}:{};for(let e of[s,r.AGIFLOW_PROXY_SERVER_NAME,c,l])delete o[e];t.writeJson(e,{...n,[r.MCP_SERVERS_KEY]:o})}}function y(e){return i.default.join(e,h,g,`settings.json`)}function b(e){let n=e.environment.HOME;if(!n)throw Error(`HOME is required for Antigravity compatibility`);let r=y(n),i=t.readJson(r);i.model||=e.environment.AGY_MODEL??`Gemini 3.5 Flash`;let a=Array.isArray(i.trustedWorkspaces)?i.trustedWorkspaces.map(String):[];a.includes(e.options.repoRoot)||a.push(e.options.repoRoot),i.trustedWorkspaces=a,t.writeJson(r,i)}function x(e){let t=a.default.lstatSync(e,{throwIfNoEntry:!1});if(t&&!t.isDirectory())throw Error(`Refusing to use unmanaged Antigravity path: ${e}`);t||a.default.mkdirSync(e,{recursive:!0})}function S(e,t){if(a.default.existsSync(e)||a.default.lstatSync(e,{throwIfNoEntry:!1})){if(!a.default.lstatSync(e).isSymbolicLink())throw Error(`Refusing to replace unmanaged Antigravity path: ${e}`);a.default.rmSync(e,{force:!0})}a.default.symlinkSync(t,e,`dir`)}function C(e){let s=e.options.repoRoot,c=i.default.join(s,r.PLUGINS_DIRECTORY),l=i.default.join(s,d),f=i.default.join(l,r.PLUGINS_DIRECTORY),p=i.default.join(s,u,o),h=t.readJson(p),g=h[m],_=new Set(Array.isArray(g)?g.map(String):[]);x(l),x(f);let v=new Set;for(let n of e.plugins){let e=i.default.join(n.directory,`.codex-plugin`,r.PLUGIN_MANIFEST_FILENAME);if(!a.default.existsSync(e))continue;let o=t.readJson(e),s=typeof o.name==`string`&&o.name?o.name:i.default.basename(n.directory);if(s===`.`||s===`..`||s.toLowerCase()===`core`||s.includes(`/`)||s.includes(`\\`))throw Error(`Invalid Antigravity plugin name: ${s}`);let c=i.default.join(f,s);v.add(s),x(c),t.writeJson(i.default.join(c,r.PLUGIN_MANIFEST_FILENAME),{name:s});let l=i.default.join(n.directory,r.SKILLS_DIRECTORY),u=i.default.join(c,r.SKILLS_DIRECTORY);a.default.existsSync(l)?S(u,l):a.default.lstatSync(u,{throwIfNoEntry:!1})?.isSymbolicLink()&&a.default.rmSync(u,{force:!0})}for(let e of a.default.readdirSync(f,{withFileTypes:!0})){if(e.name===`core`||v.has(e.name))continue;let t=i.default.join(f,e.name);if(_.has(e.name)){a.default.rmSync(t,{recursive:!0,force:!0});continue}if(!e.isDirectory())continue;let o=i.default.join(t,r.SKILLS_DIRECTORY);a.default.lstatSync(o,{throwIfNoEntry:!1})?.isSymbolicLink()&&n.pathInside(c,i.default.resolve(i.default.dirname(o),a.default.readlinkSync(o)))&&a.default.rmSync(t,{recursive:!0,force:!0})}t.writeJson(p,{...h,[m]:[...v]})}function w(e){t.readJson(i.default.join(e,`plugin.json`)).name===`core`&&a.default.rmSync(e,{recursive:!0,force:!0})}function T(e){let n=i.default.join(e.options.repoRoot,d,r.PLUGINS_DIRECTORY,r.CORE_PLUGIN_NAME);if(a.default.lstatSync(n,{throwIfNoEntry:!1})?.isSymbolicLink())throw Error(`Refusing to use unmanaged Antigravity path: ${n}`);if(!e.sharedSkills){w(n);return}let o=i.default.join(e.options.repoRoot,`.claude`,r.SKILLS_DIRECTORY);if(!a.default.existsSync(o)){w(n);return}x(n);let s=i.default.join(n,r.SKILLS_DIRECTORY);x(s),t.writeJson(i.default.join(n,r.PLUGIN_MANIFEST_FILENAME),{name:r.CORE_PLUGIN_NAME});let c=new Set;for(let e of a.default.readdirSync(o,{withFileTypes:!0}))e.isDirectory()&&(c.add(e.name),S(i.default.join(s,e.name),i.default.join(o,e.name)));for(let e of a.default.readdirSync(s)){if(c.has(e))continue;let t=i.default.join(s,e);a.default.lstatSync(t).isSymbolicLink()&&a.default.rmSync(t,{force:!0})}}function E(e){let n=i.default.join(e.options.repoRoot,`.antigravity-local`,p),r=i.default.join(e.options.repoRoot,u,p),s=i.default.join(e.options.repoRoot,u,o),c=t.readJson(s);if(!a.default.existsSync(n)){c.hooks===!0&&a.default.rmSync(r,{force:!0}),t.writeJson(s,{...c,hooks:!1});return}let l=a.default.readFileSync(n,`utf8`).replaceAll(`$AGY_REPO_ROOT`,e.options.repoRoot),d=a.default.lstatSync(r,{throwIfNoEntry:!1});if(d&&c.hooks!==!0&&(!d.isFile()||a.default.readFileSync(r,`utf8`)!==l))throw Error(`Refusing to replace unmanaged Antigravity path: ${r}`);t.writeFileAtomic(r,l),t.writeJson(s,{...c,hooks:!0})}function D(e){return[r.SKIP_PERMISSIONS_OPTION,...r.additionalDirectoryArgs(e),...e.options.providerArgs]}async function O(e){let t=e.environment.HOME;if(!t)throw Error(`HOME is required for Antigravity compatibility`);let r=await n.acquireDirectoryLock(i.default.join(t,h,g,`.doom-pi-sync.lock`));try{v(e),b(e),C(e),T(e),E(e)}finally{await r()}return n.runInteractive(`agy`,D(e),e.options.repoRoot,e.environment)}exports.adaptAntigravityMcpDefinition=_,exports.antigravityCompatibilityArgs=D,exports.launchAntigravity=O;
2
2
  //# sourceMappingURL=antigravity.cjs.map
@@ -1,2 +1,2 @@
1
- import{isRecord as e,readJson as t,writeFileAtomic as n,writeJson as r}from"../serialization/json.mjs";import"../../utils/index.mjs";import{acquireDirectoryLock as i,pathInside as a,runInteractive as o}from"./process.mjs";import{AGIFLOW_PROXY_SERVER_NAME as s,ANTIGRAVITY_MCP_PROXY_PACKAGE as c,CORE_PLUGIN_NAME as l,MCP_SERVERS_KEY as u,PLUGINS_DIRECTORY as d,PLUGIN_MANIFEST_FILENAME as f,SKILLS_DIRECTORY as p,SKIP_PERMISSIONS_OPTION as m,additionalDirectoryArgs as h,mcpProxyArguments as g}from"./shared.mjs";import _ from"node:fs";import v from"node:path";const y=`.doom-pi-managed.json`,b=`mcp-proxy`,x=`project-mcp`,S=`pencil`,C=`.agents`,w=`_agents`,T=`mcp_config.json`,E=`hooks.json`,D=`plugins`,O=`.gemini`,k=`antigravity-cli`;function A(e,t){if(typeof e.command==`string`){let n={...e,command:e.command,args:Array.isArray(e.args)?e.args.map(String):[],cwd:typeof e.cwd==`string`?e.cwd:t};return delete n.type,n}let n=typeof e.url==`string`?e.url:void 0;if(!n)return;let r={...e,serverUrl:n};return delete r.type,delete r.url,r}function j(n){let i=n.options.repoRoot,a=v.join(i,C,T),o=v.join(i,C,y),l=t(a),f=l[u],p=e(f)?{...f}:{},m=t(o),h=m[u],w=Array.isArray(h)?h.map(String):[];for(let e of new Set([...w,b,x,S]))delete p[e];let E=t(n.mcpConfigPath)[u],D=e(E)?E:{},k=n.mcpAllowlist?.servers,j=e=>!k||k.length===0||k.includes(e),M=[];j(`agiflow-proxy`)&&(p[b]={command:`npx`,args:g(c,n.proxyConfigPath,!0),cwd:i,timeout:12e5},M.push(b));let N=n.mcpAllowlist?k??[]:[x,S];for(let t of N){if(t===`agiflow-proxy`)continue;let n=D[t];if(!e(n))continue;let r=A(n,i);r&&(p[t]=r,M.push(t))}r(a,{...l,[u]:p}),r(o,{...m,[u]:M});let P=n.environment.HOME;if(P)for(let n of[v.join(P,O,`config`,T),v.join(P,O,`config`,d,`shared`,T)]){if(!_.existsSync(n))continue;let i=t(n),a=i[u],o=e(a)?{...a}:{};for(let e of[b,s,x,S])delete o[e];r(n,{...i,[u]:o})}}function M(e){return v.join(e,O,k,`settings.json`)}function N(e){let n=e.environment.HOME;if(!n)throw Error(`HOME is required for Antigravity compatibility`);let i=M(n),a=t(i);a.model||=e.environment.AGY_MODEL??`Gemini 3.5 Flash`;let o=Array.isArray(a.trustedWorkspaces)?a.trustedWorkspaces.map(String):[];o.includes(e.options.repoRoot)||o.push(e.options.repoRoot),a.trustedWorkspaces=o,r(i,a)}function P(e){let t=_.lstatSync(e,{throwIfNoEntry:!1});if(t&&!t.isDirectory())throw Error(`Refusing to use unmanaged Antigravity path: ${e}`);t||_.mkdirSync(e,{recursive:!0})}function F(e,t){if(_.existsSync(e)||_.lstatSync(e,{throwIfNoEntry:!1})){if(!_.lstatSync(e).isSymbolicLink())throw Error(`Refusing to replace unmanaged Antigravity path: ${e}`);_.rmSync(e,{force:!0})}_.symlinkSync(t,e,`dir`)}function I(e){let n=e.options.repoRoot,i=v.join(n,d),o=v.join(n,w),s=v.join(o,d),c=v.join(n,C,y),l=t(c),u=l[D],m=new Set(Array.isArray(u)?u.map(String):[]);P(o),P(s);let h=new Set;for(let n of e.plugins){let e=v.join(n.directory,`.codex-plugin`,f);if(!_.existsSync(e))continue;let i=t(e),a=typeof i.name==`string`&&i.name?i.name:v.basename(n.directory);if(a===`.`||a===`..`||a.toLowerCase()===`core`||a.includes(`/`)||a.includes(`\\`))throw Error(`Invalid Antigravity plugin name: ${a}`);let o=v.join(s,a);h.add(a),P(o),r(v.join(o,f),{name:a});let c=v.join(n.directory,p),l=v.join(o,p);_.existsSync(c)?F(l,c):_.lstatSync(l,{throwIfNoEntry:!1})?.isSymbolicLink()&&_.rmSync(l,{force:!0})}for(let e of _.readdirSync(s,{withFileTypes:!0})){if(e.name===`core`||h.has(e.name))continue;let t=v.join(s,e.name);if(m.has(e.name)){_.rmSync(t,{recursive:!0,force:!0});continue}if(!e.isDirectory())continue;let n=v.join(t,p);_.lstatSync(n,{throwIfNoEntry:!1})?.isSymbolicLink()&&a(i,v.resolve(v.dirname(n),_.readlinkSync(n)))&&_.rmSync(t,{recursive:!0,force:!0})}r(c,{...l,[D]:[...h]})}function L(e){t(v.join(e,`plugin.json`)).name===`core`&&_.rmSync(e,{recursive:!0,force:!0})}function R(e){let t=v.join(e.options.repoRoot,w,d,l);if(_.lstatSync(t,{throwIfNoEntry:!1})?.isSymbolicLink())throw Error(`Refusing to use unmanaged Antigravity path: ${t}`);if(!e.sharedSkills){L(t);return}let n=v.join(e.options.repoRoot,`.claude`,p);if(!_.existsSync(n)){L(t);return}P(t);let i=v.join(t,p);P(i),r(v.join(t,f),{name:l});let a=new Set;for(let e of _.readdirSync(n,{withFileTypes:!0}))e.isDirectory()&&(a.add(e.name),F(v.join(i,e.name),v.join(n,e.name)));for(let e of _.readdirSync(i)){if(a.has(e))continue;let t=v.join(i,e);_.lstatSync(t).isSymbolicLink()&&_.rmSync(t,{force:!0})}}function z(e){let i=v.join(e.options.repoRoot,`.antigravity-local`,E),a=v.join(e.options.repoRoot,C,E),o=v.join(e.options.repoRoot,C,y),s=t(o);if(!_.existsSync(i)){s.hooks===!0&&_.rmSync(a,{force:!0}),r(o,{...s,hooks:!1});return}let c=_.readFileSync(i,`utf8`).replaceAll(`$AGY_REPO_ROOT`,e.options.repoRoot),l=_.lstatSync(a,{throwIfNoEntry:!1});if(l&&s.hooks!==!0&&(!l.isFile()||_.readFileSync(a,`utf8`)!==c))throw Error(`Refusing to replace unmanaged Antigravity path: ${a}`);n(a,c),r(o,{...s,hooks:!0})}function B(e){return[m,...h(e),...e.options.providerArgs]}async function V(e){let t=e.environment.HOME;if(!t)throw Error(`HOME is required for Antigravity compatibility`);let n=await i(v.join(t,O,k,`.doom-pi-sync.lock`));try{j(e),N(e),I(e),R(e),z(e)}finally{await n()}return o(`agy`,B(e),e.options.repoRoot,e.environment)}export{A as adaptAntigravityMcpDefinition,B as antigravityCompatibilityArgs,V as launchAntigravity};
1
+ import{isRecord as e,readJson as t,writeFileAtomic as n,writeJson as r}from"../serialization/json.mjs";import"../../utils/index.mjs";import{acquireDirectoryLock as i,pathInside as a,runInteractive as o}from"./process.mjs";import{AGIFLOW_PROXY_SERVER_NAME as s,ANTIGRAVITY_MCP_PROXY_PACKAGE as c,CORE_PLUGIN_NAME as l,MCP_SERVERS_KEY as u,PLUGINS_DIRECTORY as d,PLUGIN_MANIFEST_FILENAME as f,SKILLS_DIRECTORY as p,SKIP_PERMISSIONS_OPTION as m,additionalDirectoryArgs as h,mcpProxyArguments as g}from"./shared.mjs";import _ from"node:path";import v from"node:fs";const y=`.doom-pi-managed.json`,b=`mcp-proxy`,x=`project-mcp`,S=`pencil`,C=`.agents`,w=`_agents`,T=`mcp_config.json`,E=`hooks.json`,D=`plugins`,O=`.gemini`,k=`antigravity-cli`;function A(e,t){if(typeof e.command==`string`){let n={...e,command:e.command,args:Array.isArray(e.args)?e.args.map(String):[],cwd:typeof e.cwd==`string`?e.cwd:t};return delete n.type,n}let n=typeof e.url==`string`?e.url:void 0;if(!n)return;let r={...e,serverUrl:n};return delete r.type,delete r.url,r}function j(n){let i=n.options.repoRoot,a=_.join(i,C,T),o=_.join(i,C,y),l=t(a),f=l[u],p=e(f)?{...f}:{},m=t(o),h=m[u],w=Array.isArray(h)?h.map(String):[];for(let e of new Set([...w,b,x,S]))delete p[e];let E=t(n.mcpConfigPath)[u],D=e(E)?E:{},k=n.mcpAllowlist?.servers,j=e=>!k||k.length===0||k.includes(e),M=[];j(`agiflow-proxy`)&&(p[b]={command:`npx`,args:g(c,n.proxyConfigPath,!0),cwd:i,timeout:12e5},M.push(b));let N=n.mcpAllowlist?k??[]:[x,S];for(let t of N){if(t===`agiflow-proxy`)continue;let n=D[t];if(!e(n))continue;let r=A(n,i);r&&(p[t]=r,M.push(t))}r(a,{...l,[u]:p}),r(o,{...m,[u]:M});let P=n.environment.HOME;if(P)for(let n of[_.join(P,O,`config`,T),_.join(P,O,`config`,d,`shared`,T)]){if(!v.existsSync(n))continue;let i=t(n),a=i[u],o=e(a)?{...a}:{};for(let e of[b,s,x,S])delete o[e];r(n,{...i,[u]:o})}}function M(e){return _.join(e,O,k,`settings.json`)}function N(e){let n=e.environment.HOME;if(!n)throw Error(`HOME is required for Antigravity compatibility`);let i=M(n),a=t(i);a.model||=e.environment.AGY_MODEL??`Gemini 3.5 Flash`;let o=Array.isArray(a.trustedWorkspaces)?a.trustedWorkspaces.map(String):[];o.includes(e.options.repoRoot)||o.push(e.options.repoRoot),a.trustedWorkspaces=o,r(i,a)}function P(e){let t=v.lstatSync(e,{throwIfNoEntry:!1});if(t&&!t.isDirectory())throw Error(`Refusing to use unmanaged Antigravity path: ${e}`);t||v.mkdirSync(e,{recursive:!0})}function F(e,t){if(v.existsSync(e)||v.lstatSync(e,{throwIfNoEntry:!1})){if(!v.lstatSync(e).isSymbolicLink())throw Error(`Refusing to replace unmanaged Antigravity path: ${e}`);v.rmSync(e,{force:!0})}v.symlinkSync(t,e,`dir`)}function I(e){let n=e.options.repoRoot,i=_.join(n,d),o=_.join(n,w),s=_.join(o,d),c=_.join(n,C,y),l=t(c),u=l[D],m=new Set(Array.isArray(u)?u.map(String):[]);P(o),P(s);let h=new Set;for(let n of e.plugins){let e=_.join(n.directory,`.codex-plugin`,f);if(!v.existsSync(e))continue;let i=t(e),a=typeof i.name==`string`&&i.name?i.name:_.basename(n.directory);if(a===`.`||a===`..`||a.toLowerCase()===`core`||a.includes(`/`)||a.includes(`\\`))throw Error(`Invalid Antigravity plugin name: ${a}`);let o=_.join(s,a);h.add(a),P(o),r(_.join(o,f),{name:a});let c=_.join(n.directory,p),l=_.join(o,p);v.existsSync(c)?F(l,c):v.lstatSync(l,{throwIfNoEntry:!1})?.isSymbolicLink()&&v.rmSync(l,{force:!0})}for(let e of v.readdirSync(s,{withFileTypes:!0})){if(e.name===`core`||h.has(e.name))continue;let t=_.join(s,e.name);if(m.has(e.name)){v.rmSync(t,{recursive:!0,force:!0});continue}if(!e.isDirectory())continue;let n=_.join(t,p);v.lstatSync(n,{throwIfNoEntry:!1})?.isSymbolicLink()&&a(i,_.resolve(_.dirname(n),v.readlinkSync(n)))&&v.rmSync(t,{recursive:!0,force:!0})}r(c,{...l,[D]:[...h]})}function L(e){t(_.join(e,`plugin.json`)).name===`core`&&v.rmSync(e,{recursive:!0,force:!0})}function R(e){let t=_.join(e.options.repoRoot,w,d,l);if(v.lstatSync(t,{throwIfNoEntry:!1})?.isSymbolicLink())throw Error(`Refusing to use unmanaged Antigravity path: ${t}`);if(!e.sharedSkills){L(t);return}let n=_.join(e.options.repoRoot,`.claude`,p);if(!v.existsSync(n)){L(t);return}P(t);let i=_.join(t,p);P(i),r(_.join(t,f),{name:l});let a=new Set;for(let e of v.readdirSync(n,{withFileTypes:!0}))e.isDirectory()&&(a.add(e.name),F(_.join(i,e.name),_.join(n,e.name)));for(let e of v.readdirSync(i)){if(a.has(e))continue;let t=_.join(i,e);v.lstatSync(t).isSymbolicLink()&&v.rmSync(t,{force:!0})}}function z(e){let i=_.join(e.options.repoRoot,`.antigravity-local`,E),a=_.join(e.options.repoRoot,C,E),o=_.join(e.options.repoRoot,C,y),s=t(o);if(!v.existsSync(i)){s.hooks===!0&&v.rmSync(a,{force:!0}),r(o,{...s,hooks:!1});return}let c=v.readFileSync(i,`utf8`).replaceAll(`$AGY_REPO_ROOT`,e.options.repoRoot),l=v.lstatSync(a,{throwIfNoEntry:!1});if(l&&s.hooks!==!0&&(!l.isFile()||v.readFileSync(a,`utf8`)!==c))throw Error(`Refusing to replace unmanaged Antigravity path: ${a}`);n(a,c),r(o,{...s,hooks:!0})}function B(e){return[m,...h(e),...e.options.providerArgs]}async function V(e){let t=e.environment.HOME;if(!t)throw Error(`HOME is required for Antigravity compatibility`);let n=await i(_.join(t,O,k,`.doom-pi-sync.lock`));try{j(e),N(e),I(e),R(e),z(e)}finally{await n()}return o(`agy`,B(e),e.options.repoRoot,e.environment)}export{A as adaptAntigravityMcpDefinition,B as antigravityCompatibilityArgs,V as launchAntigravity};
2
2
  //# sourceMappingURL=antigravity.mjs.map
@@ -1,2 +1,2 @@
1
- const e=require(`../../_virtual/_rolldown/runtime.cjs`),t=require(`./process.cjs`),n=require(`./shared.cjs`);let r=require(`node:fs`);r=e.__toESM(r,1);let i=require(`node:path`);i=e.__toESM(i,1);let a=require(`node:child_process`);const o=`codex`,s=`--profile`,c=`--profile-v2`,l=/^[A-Za-z0-9_-]+$/,u=[`tools`,`harness`,`sync-codex-state.cjs`];function d(e){return new Set([s,c,`-c`,n.MCP_CONFIG_OPTION,`--enable`,`--disable`,`--remote`,`--remote-auth-token-env`,`-i`,`--image`,`-m`,`--model`,`--local-provider`,`-s`,`--sandbox`,`-C`,`--cd`,n.ADD_DIRECTORY_OPTION,`-a`,`--ask-for-approval`]).has(e)}function f(e){let t=!1,n=``,r=``;for(let i of e){if(t){t=!1;continue}if(d(i)){t=!0;continue}if(!i.startsWith(`-`)){if(!n){n=i;continue}n===`debug`&&!r&&(r=i);break}}return!n||[`exec`,`e`,`review`,`resume`,`fork`].includes(n)?!0:n===`debug`?r===`prompt-input`:![`login`,`logout`,`mcp`,`plugin`,`mcp-server`,`app-server`,`remote-control`,`app`,`completion`,`update`,`doctor`,`sandbox`,`apply`,`a`,`cloud`,`exec-server`,`features`,`archive`,`delete`,`unarchive`,`help`].includes(n)}function p(e){let t=i.default.join(e.options.repoRoot,n.PLUGINS_DIRECTORY);return e.plugins.map(e=>{let n=i.default.relative(t,e.directory);if(!n||n===`..`||n.startsWith(`..${i.default.sep}`)||n.includes(i.default.sep))throw Error(`Codex compatibility requires a direct repository plugin: ${e.directory}`);return n})}function m(e){return n.mcpProxyArguments(n.MCP_PROXY_PACKAGE,e.proxyConfigPath,!0,!0)}function h(e,t,i){let a=[`--yolo`,`--enable`,`hooks`,...n.additionalDirectoryArgs(e)];if(f(e.options.providerArgs)){if(a.push(i,t),e.personaFile){let t=r.default.readFileSync(e.personaFile,`utf8`);a.push(`-c`,`developer_instructions=${JSON.stringify(t)}`)}e.mcpAllowlist&&a.push(`-c`,`mcp_servers.${n.AGIFLOW_PROXY_SERVER_NAME}.args=${JSON.stringify(m(e))}`)}return[...a,...e.options.providerArgs]}function g(e){let t={...e.environment},n=(0,a.spawnSync)(`git`,[`-C`,e.options.repoRoot,`remote`,`get-url`,`origin`],{encoding:`utf8`,env:t});return t.CODEX_REPO_ORIGIN=n.status===0?n.stdout.trim():``,t.CODEX_PROFILE_NAMES=e.options.domains.join(`,`),t.CODEX_PLUGIN_DIRS=p(e).join(`,`),t.CODEX_ENABLE_XCODE_MCP=(0,a.spawnSync)(`xcrun`,[`mcpbridge`,`--help`],{env:t,stdio:`ignore`}).status===0?`1`:`0`,t}async function _(e){let r=g(e),a=i.default.join(e.options.repoRoot,...u),d=t.runCaptured(process.execPath,[a,`owner-key`],e.options.repoRoot,r),f=r.HOME;r.CODEX_LEGACY_HOME=f?i.default.join(f,`.codex`,`agirepo`):void 0,r.CODEX_HOME=f?i.default.join(f,`.codex`,d):i.default.join(e.options.repoRoot,`.codex-local`,`state`,d),t.runChecked(`npx`,[...n.mcpProxyArguments(n.MCP_PROXY_PACKAGE,e.proxyConfigPath,!0),n.MCP_PRESTART_OPTION],e.options.repoRoot,r);let p=t.runCaptured(process.execPath,[a,`sync`],e.options.repoRoot,r),m=JSON.parse(p);if(typeof m.profileConfigName!=`string`||!l.test(m.profileConfigName))throw Error(`Codex sync returned an invalid profile config name`);let _=t.runCaptured(`codex`,[`--help`],e.options.repoRoot,r).includes(c)?c:s;return t.runInteractive(o,h(e,m.profileConfigName,_),e.options.repoRoot,r)}exports.CODEX_PROVIDER=o,exports.codexCompatibilityArgs=h,exports.codexEnvironment=g,exports.codexPluginDirectories=p,exports.launchCodex=_,exports.supportsCodexManagedProfile=f;
1
+ const e=require(`../../_virtual/_rolldown/runtime.cjs`),t=require(`./process.cjs`),n=require(`./shared.cjs`);let r=require(`node:path`);r=e.__toESM(r,1);let i=require(`node:fs`);i=e.__toESM(i,1);let a=require(`node:child_process`);const o=`codex`,s=`--profile`,c=`--profile-v2`,l=/^[A-Za-z0-9_-]+$/,u=[`tools`,`harness`,`sync-codex-state.cjs`];function d(e){return new Set([s,c,`-c`,n.MCP_CONFIG_OPTION,`--enable`,`--disable`,`--remote`,`--remote-auth-token-env`,`-i`,`--image`,`-m`,`--model`,`--local-provider`,`-s`,`--sandbox`,`-C`,`--cd`,n.ADD_DIRECTORY_OPTION,`-a`,`--ask-for-approval`]).has(e)}function f(e){let t=!1,n=``,r=``;for(let i of e){if(t){t=!1;continue}if(d(i)){t=!0;continue}if(!i.startsWith(`-`)){if(!n){n=i;continue}n===`debug`&&!r&&(r=i);break}}return!n||[`exec`,`e`,`review`,`resume`,`fork`].includes(n)?!0:n===`debug`?r===`prompt-input`:![`login`,`logout`,`mcp`,`plugin`,`mcp-server`,`app-server`,`remote-control`,`app`,`completion`,`update`,`doctor`,`sandbox`,`apply`,`a`,`cloud`,`exec-server`,`features`,`archive`,`delete`,`unarchive`,`help`].includes(n)}function p(e){let t=r.default.join(e.options.repoRoot,n.PLUGINS_DIRECTORY);return e.plugins.map(e=>{let n=r.default.relative(t,e.directory);if(!n||n===`..`||n.startsWith(`..${r.default.sep}`)||n.includes(r.default.sep))throw Error(`Codex compatibility requires a direct repository plugin: ${e.directory}`);return n})}function m(e){return n.mcpProxyArguments(n.MCP_PROXY_PACKAGE,e.proxyConfigPath,!0,!0)}function h(e,t,r){let a=[`--yolo`,`--enable`,`hooks`,...n.additionalDirectoryArgs(e)];if(f(e.options.providerArgs)){if(a.push(r,t),e.personaFile){let t=i.default.readFileSync(e.personaFile,`utf8`);a.push(`-c`,`developer_instructions=${JSON.stringify(t)}`)}e.mcpAllowlist&&a.push(`-c`,`mcp_servers.${n.AGIFLOW_PROXY_SERVER_NAME}.args=${JSON.stringify(m(e))}`)}return[...a,...e.options.providerArgs]}function g(e){let t={...e.environment},n=(0,a.spawnSync)(`git`,[`-C`,e.options.repoRoot,`remote`,`get-url`,`origin`],{encoding:`utf8`,env:t});return t.CODEX_REPO_ORIGIN=n.status===0?n.stdout.trim():``,t.CODEX_PROFILE_NAMES=e.options.domains.join(`,`),t.CODEX_PLUGIN_DIRS=p(e).join(`,`),t.CODEX_ENABLE_XCODE_MCP=(0,a.spawnSync)(`xcrun`,[`mcpbridge`,`--help`],{env:t,stdio:`ignore`}).status===0?`1`:`0`,t}async function _(e){let i=g(e),a=r.default.join(e.options.repoRoot,...u),d=t.runCaptured(process.execPath,[a,`owner-key`],e.options.repoRoot,i),f=i.HOME;i.CODEX_LEGACY_HOME=f?r.default.join(f,`.codex`,`agirepo`):void 0,i.CODEX_HOME=f?r.default.join(f,`.codex`,d):r.default.join(e.options.repoRoot,`.codex-local`,`state`,d),t.runChecked(`npx`,[...n.mcpProxyArguments(n.MCP_PROXY_PACKAGE,e.proxyConfigPath,!0),n.MCP_PRESTART_OPTION],e.options.repoRoot,i);let p=t.runCaptured(process.execPath,[a,`sync`],e.options.repoRoot,i),m=JSON.parse(p);if(typeof m.profileConfigName!=`string`||!l.test(m.profileConfigName))throw Error(`Codex sync returned an invalid profile config name`);let _=t.runCaptured(`codex`,[`--help`],e.options.repoRoot,i).includes(c)?c:s;return t.runInteractive(o,h(e,m.profileConfigName,_),e.options.repoRoot,i)}exports.CODEX_PROVIDER=o,exports.codexCompatibilityArgs=h,exports.codexEnvironment=g,exports.codexPluginDirectories=p,exports.launchCodex=_,exports.supportsCodexManagedProfile=f;
2
2
  //# sourceMappingURL=codex.cjs.map
@@ -1,2 +1,2 @@
1
- import{runCaptured as e,runChecked as t,runInteractive as n}from"./process.mjs";import{ADD_DIRECTORY_OPTION as r,AGIFLOW_PROXY_SERVER_NAME as i,MCP_CONFIG_OPTION as a,MCP_PRESTART_OPTION as o,MCP_PROXY_PACKAGE as s,PLUGINS_DIRECTORY as c,additionalDirectoryArgs as l,mcpProxyArguments as u}from"./shared.mjs";import d from"node:fs";import f from"node:path";import{spawnSync as p}from"node:child_process";const m=`codex`,h=`--profile`,g=`--profile-v2`,_=/^[A-Za-z0-9_-]+$/,v=[`tools`,`harness`,`sync-codex-state.cjs`];function y(e){return new Set([h,g,`-c`,a,`--enable`,`--disable`,`--remote`,`--remote-auth-token-env`,`-i`,`--image`,`-m`,`--model`,`--local-provider`,`-s`,`--sandbox`,`-C`,`--cd`,r,`-a`,`--ask-for-approval`]).has(e)}function b(e){let t=!1,n=``,r=``;for(let i of e){if(t){t=!1;continue}if(y(i)){t=!0;continue}if(!i.startsWith(`-`)){if(!n){n=i;continue}n===`debug`&&!r&&(r=i);break}}return!n||[`exec`,`e`,`review`,`resume`,`fork`].includes(n)?!0:n===`debug`?r===`prompt-input`:![`login`,`logout`,`mcp`,`plugin`,`mcp-server`,`app-server`,`remote-control`,`app`,`completion`,`update`,`doctor`,`sandbox`,`apply`,`a`,`cloud`,`exec-server`,`features`,`archive`,`delete`,`unarchive`,`help`].includes(n)}function x(e){let t=f.join(e.options.repoRoot,c);return e.plugins.map(e=>{let n=f.relative(t,e.directory);if(!n||n===`..`||n.startsWith(`..${f.sep}`)||n.includes(f.sep))throw Error(`Codex compatibility requires a direct repository plugin: ${e.directory}`);return n})}function S(e){return u(s,e.proxyConfigPath,!0,!0)}function C(e,t,n){let r=[`--yolo`,`--enable`,`hooks`,...l(e)];if(b(e.options.providerArgs)){if(r.push(n,t),e.personaFile){let t=d.readFileSync(e.personaFile,`utf8`);r.push(`-c`,`developer_instructions=${JSON.stringify(t)}`)}e.mcpAllowlist&&r.push(`-c`,`mcp_servers.${i}.args=${JSON.stringify(S(e))}`)}return[...r,...e.options.providerArgs]}function w(e){let t={...e.environment},n=p(`git`,[`-C`,e.options.repoRoot,`remote`,`get-url`,`origin`],{encoding:`utf8`,env:t});return t.CODEX_REPO_ORIGIN=n.status===0?n.stdout.trim():``,t.CODEX_PROFILE_NAMES=e.options.domains.join(`,`),t.CODEX_PLUGIN_DIRS=x(e).join(`,`),t.CODEX_ENABLE_XCODE_MCP=p(`xcrun`,[`mcpbridge`,`--help`],{env:t,stdio:`ignore`}).status===0?`1`:`0`,t}async function T(r){let i=w(r),a=f.join(r.options.repoRoot,...v),c=e(process.execPath,[a,`owner-key`],r.options.repoRoot,i),l=i.HOME;i.CODEX_LEGACY_HOME=l?f.join(l,`.codex`,`agirepo`):void 0,i.CODEX_HOME=l?f.join(l,`.codex`,c):f.join(r.options.repoRoot,`.codex-local`,`state`,c),t(`npx`,[...u(s,r.proxyConfigPath,!0),o],r.options.repoRoot,i);let d=e(process.execPath,[a,`sync`],r.options.repoRoot,i),p=JSON.parse(d);if(typeof p.profileConfigName!=`string`||!_.test(p.profileConfigName))throw Error(`Codex sync returned an invalid profile config name`);let y=e(`codex`,[`--help`],r.options.repoRoot,i).includes(g)?g:h;return n(m,C(r,p.profileConfigName,y),r.options.repoRoot,i)}export{m as CODEX_PROVIDER,C as codexCompatibilityArgs,w as codexEnvironment,x as codexPluginDirectories,T as launchCodex,b as supportsCodexManagedProfile};
1
+ import{runCaptured as e,runChecked as t,runInteractive as n}from"./process.mjs";import{ADD_DIRECTORY_OPTION as r,AGIFLOW_PROXY_SERVER_NAME as i,MCP_CONFIG_OPTION as a,MCP_PRESTART_OPTION as o,MCP_PROXY_PACKAGE as s,PLUGINS_DIRECTORY as c,additionalDirectoryArgs as l,mcpProxyArguments as u}from"./shared.mjs";import d from"node:path";import f from"node:fs";import{spawnSync as p}from"node:child_process";const m=`codex`,h=`--profile`,g=`--profile-v2`,_=/^[A-Za-z0-9_-]+$/,v=[`tools`,`harness`,`sync-codex-state.cjs`];function y(e){return new Set([h,g,`-c`,a,`--enable`,`--disable`,`--remote`,`--remote-auth-token-env`,`-i`,`--image`,`-m`,`--model`,`--local-provider`,`-s`,`--sandbox`,`-C`,`--cd`,r,`-a`,`--ask-for-approval`]).has(e)}function b(e){let t=!1,n=``,r=``;for(let i of e){if(t){t=!1;continue}if(y(i)){t=!0;continue}if(!i.startsWith(`-`)){if(!n){n=i;continue}n===`debug`&&!r&&(r=i);break}}return!n||[`exec`,`e`,`review`,`resume`,`fork`].includes(n)?!0:n===`debug`?r===`prompt-input`:![`login`,`logout`,`mcp`,`plugin`,`mcp-server`,`app-server`,`remote-control`,`app`,`completion`,`update`,`doctor`,`sandbox`,`apply`,`a`,`cloud`,`exec-server`,`features`,`archive`,`delete`,`unarchive`,`help`].includes(n)}function x(e){let t=d.join(e.options.repoRoot,c);return e.plugins.map(e=>{let n=d.relative(t,e.directory);if(!n||n===`..`||n.startsWith(`..${d.sep}`)||n.includes(d.sep))throw Error(`Codex compatibility requires a direct repository plugin: ${e.directory}`);return n})}function S(e){return u(s,e.proxyConfigPath,!0,!0)}function C(e,t,n){let r=[`--yolo`,`--enable`,`hooks`,...l(e)];if(b(e.options.providerArgs)){if(r.push(n,t),e.personaFile){let t=f.readFileSync(e.personaFile,`utf8`);r.push(`-c`,`developer_instructions=${JSON.stringify(t)}`)}e.mcpAllowlist&&r.push(`-c`,`mcp_servers.${i}.args=${JSON.stringify(S(e))}`)}return[...r,...e.options.providerArgs]}function w(e){let t={...e.environment},n=p(`git`,[`-C`,e.options.repoRoot,`remote`,`get-url`,`origin`],{encoding:`utf8`,env:t});return t.CODEX_REPO_ORIGIN=n.status===0?n.stdout.trim():``,t.CODEX_PROFILE_NAMES=e.options.domains.join(`,`),t.CODEX_PLUGIN_DIRS=x(e).join(`,`),t.CODEX_ENABLE_XCODE_MCP=p(`xcrun`,[`mcpbridge`,`--help`],{env:t,stdio:`ignore`}).status===0?`1`:`0`,t}async function T(r){let i=w(r),a=d.join(r.options.repoRoot,...v),c=e(process.execPath,[a,`owner-key`],r.options.repoRoot,i),l=i.HOME;i.CODEX_LEGACY_HOME=l?d.join(l,`.codex`,`agirepo`):void 0,i.CODEX_HOME=l?d.join(l,`.codex`,c):d.join(r.options.repoRoot,`.codex-local`,`state`,c),t(`npx`,[...u(s,r.proxyConfigPath,!0),o],r.options.repoRoot,i);let f=e(process.execPath,[a,`sync`],r.options.repoRoot,i),p=JSON.parse(f);if(typeof p.profileConfigName!=`string`||!_.test(p.profileConfigName))throw Error(`Codex sync returned an invalid profile config name`);let y=e(`codex`,[`--help`],r.options.repoRoot,i).includes(g)?g:h;return n(m,C(r,p.profileConfigName,y),r.options.repoRoot,i)}export{m as CODEX_PROVIDER,C as codexCompatibilityArgs,w as codexEnvironment,x as codexPluginDirectories,T as launchCodex,b as supportsCodexManagedProfile};
2
2
  //# sourceMappingURL=codex.mjs.map
@@ -1,2 +1,2 @@
1
- const e=require(`../../_virtual/_rolldown/runtime.cjs`),t=require(`../serialization/json.cjs`);require(`../../utils/index.cjs`);let n=require(`node:fs`);n=e.__toESM(n,1);let r=require(`node:path`);r=e.__toESM(r,1);let i=require(`node:os`),a=require(`node:child_process`),o=require(`node:timers/promises`),s=require(`cross-spawn`);s=e.__toESM(s,1);const c=[`SIGINT`,`SIGTERM`,`SIGHUP`,`SIGQUIT`],l=`owner.json`;function u(e,t,n,r){let i=(0,a.spawnSync)(e,t,{cwd:n,encoding:`utf8`,env:r});if(i.error)throw i.error;if(i.stderr&&process.stderr.write(i.stderr),i.status!==0)throw Error(`${e} exited with status ${i.status??1}`);return i.stdout.trim()}function d(e,t,n,r){let i=(0,a.spawnSync)(e,t,{cwd:n,env:r,stdio:`inherit`});if(i.error)throw i.error;if(i.status!==0)throw Error(`${e} exited with status ${i.status??1}`)}function f(e){if(!e)return 1;let t=i.constants.signals[e];return t?128+t:1}function p(e){let t=t=>{e.exitCode===null&&e.signalCode===null&&e.kill(t)};for(let e of c)process.on(e,t);return()=>{for(let e of c)process.removeListener(e,t)}}function m(e){return new Promise((t,n)=>{e.once(`error`,n),e.once(`exit`,(e,n)=>t(e??f(n)))})}async function h(e,t,n,r){let i=(0,s.default)(e,t,{cwd:n,env:r,stdio:`inherit`}),a=p(i);try{return await m(i)}finally{a()}}function g(e){return e instanceof Error&&typeof e.code==`string`}function _(e){let n=t.readJson(r.default.join(e,l));if(typeof n.pid!=`number`||!Number.isSafeInteger(n.pid)||n.pid<=0)return!1;try{return process.kill(n.pid,0),!0}catch(e){return!g(e)||e.code!==`ESRCH`}}async function v(e){n.default.mkdirSync(r.default.dirname(e),{recursive:!0});let i=Date.now();for(;;)try{await n.default.promises.mkdir(e);try{t.writeJson(r.default.join(e,l),{pid:process.pid})}catch(t){throw await n.default.promises.rm(e,{recursive:!0,force:!0}),t}return()=>n.default.promises.rm(e,{recursive:!0,force:!0})}catch(t){if(!g(t)||t.code!==`EEXIST`)throw t;try{let t=await n.default.promises.stat(e);if(Date.now()-t.mtimeMs>=1e4&&!_(e)){await n.default.promises.rm(e,{recursive:!0,force:!0});continue}}catch(e){if(g(e)&&e.code===`ENOENT`)continue;throw e}if(Date.now()-i>=3e4)throw Error(`Timed out waiting for Antigravity state lock: ${e}`);await(0,o.setTimeout)(25)}}function y(e,t){let n=r.default.relative(e,t);return n===``||!n.startsWith(`..${r.default.sep}`)&&n!==`..`&&!r.default.isAbsolute(n)}exports.acquireDirectoryLock=v,exports.forwardSignals=p,exports.isFileSystemError=g,exports.lockOwnerIsRunning=_,exports.pathInside=y,exports.runCaptured=u,exports.runChecked=d,exports.runInteractive=h,exports.signalExitCode=f,exports.waitForExit=m;
1
+ const e=require(`../../_virtual/_rolldown/runtime.cjs`),t=require(`../serialization/json.cjs`);require(`../../utils/index.cjs`);let n=require(`node:path`);n=e.__toESM(n,1);let r=require(`node:fs`);r=e.__toESM(r,1);let i=require(`node:os`),a=require(`node:child_process`),o=require(`node:timers/promises`),s=require(`cross-spawn`);s=e.__toESM(s,1);const c=[`SIGINT`,`SIGTERM`,`SIGHUP`,`SIGQUIT`],l=`owner.json`;function u(e,t,n,r){let i=(0,a.spawnSync)(e,t,{cwd:n,encoding:`utf8`,env:r});if(i.error)throw i.error;if(i.stderr&&process.stderr.write(i.stderr),i.status!==0)throw Error(`${e} exited with status ${i.status??1}`);return i.stdout.trim()}function d(e,t,n,r){let i=(0,a.spawnSync)(e,t,{cwd:n,env:r,stdio:`inherit`});if(i.error)throw i.error;if(i.status!==0)throw Error(`${e} exited with status ${i.status??1}`)}function f(e){if(!e)return 1;let t=i.constants.signals[e];return t?128+t:1}function p(e){let t=t=>{e.exitCode===null&&e.signalCode===null&&e.kill(t)};for(let e of c)process.on(e,t);return()=>{for(let e of c)process.removeListener(e,t)}}function m(e){return new Promise((t,n)=>{e.once(`error`,n),e.once(`exit`,(e,n)=>t(e??f(n)))})}async function h(e,t,n,r){let i=(0,s.default)(e,t,{cwd:n,env:r,stdio:`inherit`}),a=p(i);try{return await m(i)}finally{a()}}function g(e){return e instanceof Error&&typeof e.code==`string`}function _(e){let r=t.readJson(n.default.join(e,l));if(typeof r.pid!=`number`||!Number.isSafeInteger(r.pid)||r.pid<=0)return!1;try{return process.kill(r.pid,0),!0}catch(e){return!g(e)||e.code!==`ESRCH`}}async function v(e){r.default.mkdirSync(n.default.dirname(e),{recursive:!0});let i=Date.now();for(;;)try{await r.default.promises.mkdir(e);try{t.writeJson(n.default.join(e,l),{pid:process.pid})}catch(t){throw await r.default.promises.rm(e,{recursive:!0,force:!0}),t}return()=>r.default.promises.rm(e,{recursive:!0,force:!0})}catch(t){if(!g(t)||t.code!==`EEXIST`)throw t;try{let t=await r.default.promises.stat(e);if(Date.now()-t.mtimeMs>=1e4&&!_(e)){await r.default.promises.rm(e,{recursive:!0,force:!0});continue}}catch(e){if(g(e)&&e.code===`ENOENT`)continue;throw e}if(Date.now()-i>=3e4)throw Error(`Timed out waiting for Antigravity state lock: ${e}`);await(0,o.setTimeout)(25)}}function y(e,t){let r=n.default.relative(e,t);return r===``||!r.startsWith(`..${n.default.sep}`)&&r!==`..`&&!n.default.isAbsolute(r)}exports.acquireDirectoryLock=v,exports.forwardSignals=p,exports.isFileSystemError=g,exports.lockOwnerIsRunning=_,exports.pathInside=y,exports.runCaptured=u,exports.runChecked=d,exports.runInteractive=h,exports.signalExitCode=f,exports.waitForExit=m;
2
2
  //# sourceMappingURL=process.cjs.map
@@ -1,2 +1,2 @@
1
- import{readJson as e,writeJson as t}from"../serialization/json.mjs";import"../../utils/index.mjs";import n from"node:fs";import r from"node:path";import{constants as i}from"node:os";import{spawnSync as a}from"node:child_process";import{setTimeout as o}from"node:timers/promises";import s from"cross-spawn";const c=[`SIGINT`,`SIGTERM`,`SIGHUP`,`SIGQUIT`],l=`owner.json`;function u(e,t,n,r){let i=a(e,t,{cwd:n,encoding:`utf8`,env:r});if(i.error)throw i.error;if(i.stderr&&process.stderr.write(i.stderr),i.status!==0)throw Error(`${e} exited with status ${i.status??1}`);return i.stdout.trim()}function d(e,t,n,r){let i=a(e,t,{cwd:n,env:r,stdio:`inherit`});if(i.error)throw i.error;if(i.status!==0)throw Error(`${e} exited with status ${i.status??1}`)}function f(e){if(!e)return 1;let t=i.signals[e];return t?128+t:1}function p(e){let t=t=>{e.exitCode===null&&e.signalCode===null&&e.kill(t)};for(let e of c)process.on(e,t);return()=>{for(let e of c)process.removeListener(e,t)}}function m(e){return new Promise((t,n)=>{e.once(`error`,n),e.once(`exit`,(e,n)=>t(e??f(n)))})}async function h(e,t,n,r){let i=s(e,t,{cwd:n,env:r,stdio:`inherit`}),a=p(i);try{return await m(i)}finally{a()}}function g(e){return e instanceof Error&&typeof e.code==`string`}function _(t){let n=e(r.join(t,l));if(typeof n.pid!=`number`||!Number.isSafeInteger(n.pid)||n.pid<=0)return!1;try{return process.kill(n.pid,0),!0}catch(e){return!g(e)||e.code!==`ESRCH`}}async function v(e){n.mkdirSync(r.dirname(e),{recursive:!0});let i=Date.now();for(;;)try{await n.promises.mkdir(e);try{t(r.join(e,l),{pid:process.pid})}catch(t){throw await n.promises.rm(e,{recursive:!0,force:!0}),t}return()=>n.promises.rm(e,{recursive:!0,force:!0})}catch(t){if(!g(t)||t.code!==`EEXIST`)throw t;try{let t=await n.promises.stat(e);if(Date.now()-t.mtimeMs>=1e4&&!_(e)){await n.promises.rm(e,{recursive:!0,force:!0});continue}}catch(e){if(g(e)&&e.code===`ENOENT`)continue;throw e}if(Date.now()-i>=3e4)throw Error(`Timed out waiting for Antigravity state lock: ${e}`);await o(25)}}function y(e,t){let n=r.relative(e,t);return n===``||!n.startsWith(`..${r.sep}`)&&n!==`..`&&!r.isAbsolute(n)}export{v as acquireDirectoryLock,p as forwardSignals,g as isFileSystemError,_ as lockOwnerIsRunning,y as pathInside,u as runCaptured,d as runChecked,h as runInteractive,f as signalExitCode,m as waitForExit};
1
+ import{readJson as e,writeJson as t}from"../serialization/json.mjs";import"../../utils/index.mjs";import n from"node:path";import r from"node:fs";import{constants as i}from"node:os";import{spawnSync as a}from"node:child_process";import{setTimeout as o}from"node:timers/promises";import s from"cross-spawn";const c=[`SIGINT`,`SIGTERM`,`SIGHUP`,`SIGQUIT`],l=`owner.json`;function u(e,t,n,r){let i=a(e,t,{cwd:n,encoding:`utf8`,env:r});if(i.error)throw i.error;if(i.stderr&&process.stderr.write(i.stderr),i.status!==0)throw Error(`${e} exited with status ${i.status??1}`);return i.stdout.trim()}function d(e,t,n,r){let i=a(e,t,{cwd:n,env:r,stdio:`inherit`});if(i.error)throw i.error;if(i.status!==0)throw Error(`${e} exited with status ${i.status??1}`)}function f(e){if(!e)return 1;let t=i.signals[e];return t?128+t:1}function p(e){let t=t=>{e.exitCode===null&&e.signalCode===null&&e.kill(t)};for(let e of c)process.on(e,t);return()=>{for(let e of c)process.removeListener(e,t)}}function m(e){return new Promise((t,n)=>{e.once(`error`,n),e.once(`exit`,(e,n)=>t(e??f(n)))})}async function h(e,t,n,r){let i=s(e,t,{cwd:n,env:r,stdio:`inherit`}),a=p(i);try{return await m(i)}finally{a()}}function g(e){return e instanceof Error&&typeof e.code==`string`}function _(t){let r=e(n.join(t,l));if(typeof r.pid!=`number`||!Number.isSafeInteger(r.pid)||r.pid<=0)return!1;try{return process.kill(r.pid,0),!0}catch(e){return!g(e)||e.code!==`ESRCH`}}async function v(e){r.mkdirSync(n.dirname(e),{recursive:!0});let i=Date.now();for(;;)try{await r.promises.mkdir(e);try{t(n.join(e,l),{pid:process.pid})}catch(t){throw await r.promises.rm(e,{recursive:!0,force:!0}),t}return()=>r.promises.rm(e,{recursive:!0,force:!0})}catch(t){if(!g(t)||t.code!==`EEXIST`)throw t;try{let t=await r.promises.stat(e);if(Date.now()-t.mtimeMs>=1e4&&!_(e)){await r.promises.rm(e,{recursive:!0,force:!0});continue}}catch(e){if(g(e)&&e.code===`ENOENT`)continue;throw e}if(Date.now()-i>=3e4)throw Error(`Timed out waiting for Antigravity state lock: ${e}`);await o(25)}}function y(e,t){let r=n.relative(e,t);return r===``||!r.startsWith(`..${n.sep}`)&&r!==`..`&&!n.isAbsolute(r)}export{v as acquireDirectoryLock,p as forwardSignals,g as isFileSystemError,_ as lockOwnerIsRunning,y as pathInside,u as runCaptured,d as runChecked,h as runInteractive,f as signalExitCode,m as waitForExit};
2
2
  //# sourceMappingURL=process.mjs.map
@@ -1,2 +1,2 @@
1
- const e=require(`../_virtual/_rolldown/runtime.cjs`);require(`../services/config/index.cjs`);const t=require(`./mcpFilter.cjs`),n=require(`./resourceCollector.cjs`);let r=require(`node:fs`);r=e.__toESM(r,1);let i=require(`node:path`);i=e.__toESM(i,1);let a=require(`node:os`);a=e.__toESM(a,1);let o=require(`@agimon-ai/doompi-config/majorModes`),s=require(`@agimon-ai/doompi-config/profiles`),c=require(`@agimon-ai/doompi-config/domains`),l=require(`@agimon-ai/doompi-config/harnessState`);const u=`.mcp.json`;function d(e,t){let n=[i.default.join(e,u)];for(let e of t){if(e.mcp===!1)continue;let t=i.default.join(e.directory,u);r.default.existsSync(t)&&n.push(t)}return n}function f(e,n){let r=(e.mcpServers??{})[t.PROXY_SERVER_NAME],a=Array.isArray(r?.args)?r.args.map(String):[],o=a.indexOf(`--config`),s=o===-1?void 0:a[o+1];return s?i.default.resolve(n,s):i.default.join(n,`mcp-config.yaml`)}async function p(e,a,o,s){let c=await t.applyMcpAllowlist(n.mergeMcpConfigs(d(e,a)),o,e,s),l=i.default.join(s,`mcp.json`);return await r.default.promises.writeFile(l,`${JSON.stringify(c,null,2)}\n`,{mode:384}),{mcpConfigPath:l,proxyConfigPath:f(c,e)}}async function m(e){let n=(0,o.loadMajorModesConfig)(e.repoRoot),u=(0,o.resolveLayers)(n,e.majorMode),d=(0,o.layerHookGroups)(n,u),f=await r.default.promises.mkdtemp(i.default.join(a.default.tmpdir(),`doom-pi-compat-`));await r.default.promises.chmod(f,448);try{let n=e.profile?(0,s.resolveProfile)(e.repoRoot,e.profile):void 0,a=(0,c.resolvePluginEntries)(e.repoRoot,e.domains,[]),o=t.resolveMcpAllowlist(e.repoRoot,e.domains),m=await p(e.repoRoot,a,o,f),h={...process.env};h.NX_DAEMON??=`false`;let g=(0,s.applyProfileEnvironment)(h,n?.env??{}),_=n?.persona?(0,s.buildPersonaPrompt)(n.personaRoot,n.persona):void 0,v;return _&&(v=i.default.join(f,`persona.md`),await r.default.promises.writeFile(v,`${_}\n`,{mode:384})),(0,l.projectHarnessEnvironment)({root:e.repoRoot,majorMode:e.majorMode,temporaryDirectory:f,domains:e.domains,layers:u,profile:n?.name,profileEnvironment:g,hookGroups:d,mcpConfigPath:m.mcpConfigPath,personaFile:v,additionalDirectories:e.additionalDirectories,hooks:!0},h),h.DOOMPI_ADDITIONAL_DIRS=e.additionalDirectories.join(i.default.delimiter),h.CLAUDE_PROJECT_DIR=e.repoRoot,h.CODEX_REPO_ROOT=e.repoRoot,h.AGY_REPO_ROOT=e.repoRoot,h.ORIGINAL_REPO_PATH||=e.repoRoot,{options:e,environment:h,plugins:a,profile:n,personaFile:v,mcpAllowlist:o,mcpConfigPath:m.mcpConfigPath,proxyConfigPath:m.proxyConfigPath,selectedLayers:u,hookGroups:d,sharedSkills:(0,c.resolveSharedSkills)(e.repoRoot,e.domains),cleanup:()=>r.default.promises.rm(f,{recursive:!0,force:!0})}}catch(e){throw await r.default.promises.rm(f,{recursive:!0,force:!0}),e}}exports.buildCompatibilityContext=m;
1
+ const e=require(`../_virtual/_rolldown/runtime.cjs`);require(`../services/config/index.cjs`);const t=require(`./mcpFilter.cjs`),n=require(`./resourceCollector.cjs`);let r=require(`node:path`);r=e.__toESM(r,1);let i=require(`node:fs`);i=e.__toESM(i,1);let a=require(`node:os`);a=e.__toESM(a,1);let o=require(`@agimon-ai/doompi-config/majorModes`),s=require(`@agimon-ai/doompi-config/profiles`),c=require(`@agimon-ai/doompi-config/domains`),l=require(`@agimon-ai/doompi-config/harnessState`);const u=`.mcp.json`;function d(e,t){let n=[r.default.join(e,u)];for(let e of t){if(e.mcp===!1)continue;let t=r.default.join(e.directory,u);i.default.existsSync(t)&&n.push(t)}return n}function f(e,n){let i=(e.mcpServers??{})[t.PROXY_SERVER_NAME],a=Array.isArray(i?.args)?i.args.map(String):[],o=a.indexOf(`--config`),s=o===-1?void 0:a[o+1];return s?r.default.resolve(n,s):r.default.join(n,`mcp-config.yaml`)}async function p(e,a,o,s){let c=await t.applyMcpAllowlist(n.mergeMcpConfigs(d(e,a)),o,e,s),l=r.default.join(s,`mcp.json`);return await i.default.promises.writeFile(l,`${JSON.stringify(c,null,2)}\n`,{mode:384}),{mcpConfigPath:l,proxyConfigPath:f(c,e)}}async function m(e){let n=(0,o.loadMajorModesConfig)(e.repoRoot),u=(0,o.resolveLayers)(n,e.majorMode),d=(0,o.layerHookGroups)(n,u),f=await i.default.promises.mkdtemp(r.default.join(a.default.tmpdir(),`doom-pi-compat-`));await i.default.promises.chmod(f,448);try{let n=e.profile?(0,s.resolveProfile)(e.repoRoot,e.profile):void 0,a=(0,c.resolvePluginEntries)(e.repoRoot,e.domains,[]),o=t.resolveMcpAllowlist(e.repoRoot,e.domains),m=await p(e.repoRoot,a,o,f),h={...process.env};h.NX_DAEMON??=`false`;let g=(0,s.applyProfileEnvironment)(h,n?.env??{}),_=n?.persona?(0,s.buildPersonaPrompt)(n.personaRoot,n.persona):void 0,v;return _&&(v=r.default.join(f,`persona.md`),await i.default.promises.writeFile(v,`${_}\n`,{mode:384})),(0,l.projectHarnessEnvironment)({root:e.repoRoot,majorMode:e.majorMode,temporaryDirectory:f,domains:e.domains,layers:u,profile:n?.name,profileEnvironment:g,hookGroups:d,mcpConfigPath:m.mcpConfigPath,personaFile:v,additionalDirectories:e.additionalDirectories,hooks:!0},h),h.DOOMPI_ADDITIONAL_DIRS=e.additionalDirectories.join(r.default.delimiter),h.CLAUDE_PROJECT_DIR=e.repoRoot,h.CODEX_REPO_ROOT=e.repoRoot,h.AGY_REPO_ROOT=e.repoRoot,h.ORIGINAL_REPO_PATH||=e.repoRoot,{options:e,environment:h,plugins:a,profile:n,personaFile:v,mcpAllowlist:o,mcpConfigPath:m.mcpConfigPath,proxyConfigPath:m.proxyConfigPath,selectedLayers:u,hookGroups:d,sharedSkills:(0,c.resolveSharedSkills)(e.repoRoot,e.domains),cleanup:()=>i.default.promises.rm(f,{recursive:!0,force:!0})}}catch(e){throw await i.default.promises.rm(f,{recursive:!0,force:!0}),e}}exports.buildCompatibilityContext=m;
2
2
  //# sourceMappingURL=compatibilityContext.cjs.map
@@ -1,2 +1,2 @@
1
- import{projectHarnessEnvironment as e}from"./config/harnessState.mjs";import{applyProfileEnvironment as t,buildPersonaPrompt as n,layerHookGroups as r,loadMajorModesConfig as i,resolveLayers as a,resolvePluginEntries as o,resolveProfile as s,resolveSharedSkills as c}from"../services/config/index.mjs";import{PROXY_SERVER_NAME as l,applyMcpAllowlist as u,resolveMcpAllowlist as d}from"./mcpFilter.mjs";import{mergeMcpConfigs as f}from"./resourceCollector.mjs";import p from"node:fs";import m from"node:path";import h from"node:os";const g=`.mcp.json`;function _(e,t){let n=[m.join(e,g)];for(let e of t){if(e.mcp===!1)continue;let t=m.join(e.directory,g);p.existsSync(t)&&n.push(t)}return n}function v(e,t){let n=(e.mcpServers??{})[l],r=Array.isArray(n?.args)?n.args.map(String):[],i=r.indexOf(`--config`),a=i===-1?void 0:r[i+1];return a?m.resolve(t,a):m.join(t,`mcp-config.yaml`)}async function y(e,t,n,r){let i=await u(f(_(e,t)),n,e,r),a=m.join(r,`mcp.json`);return await p.promises.writeFile(a,`${JSON.stringify(i,null,2)}\n`,{mode:384}),{mcpConfigPath:a,proxyConfigPath:v(i,e)}}async function b(l){let u=i(l.repoRoot),f=a(u,l.majorMode),g=r(u,f),_=await p.promises.mkdtemp(m.join(h.tmpdir(),`doom-pi-compat-`));await p.promises.chmod(_,448);try{let r=l.profile?s(l.repoRoot,l.profile):void 0,i=o(l.repoRoot,l.domains,[]),a=d(l.repoRoot,l.domains),u=await y(l.repoRoot,i,a,_),h={...process.env};h.NX_DAEMON??=`false`;let v=t(h,r?.env??{}),b=r?.persona?n(r.personaRoot,r.persona):void 0,x;return b&&(x=m.join(_,`persona.md`),await p.promises.writeFile(x,`${b}\n`,{mode:384})),e({root:l.repoRoot,majorMode:l.majorMode,temporaryDirectory:_,domains:l.domains,layers:f,profile:r?.name,profileEnvironment:v,hookGroups:g,mcpConfigPath:u.mcpConfigPath,personaFile:x,additionalDirectories:l.additionalDirectories,hooks:!0},h),h.DOOMPI_ADDITIONAL_DIRS=l.additionalDirectories.join(m.delimiter),h.CLAUDE_PROJECT_DIR=l.repoRoot,h.CODEX_REPO_ROOT=l.repoRoot,h.AGY_REPO_ROOT=l.repoRoot,h.ORIGINAL_REPO_PATH||=l.repoRoot,{options:l,environment:h,plugins:i,profile:r,personaFile:x,mcpAllowlist:a,mcpConfigPath:u.mcpConfigPath,proxyConfigPath:u.proxyConfigPath,selectedLayers:f,hookGroups:g,sharedSkills:c(l.repoRoot,l.domains),cleanup:()=>p.promises.rm(_,{recursive:!0,force:!0})}}catch(e){throw await p.promises.rm(_,{recursive:!0,force:!0}),e}}export{b as buildCompatibilityContext};
1
+ import{projectHarnessEnvironment as e}from"./config/harnessState.mjs";import{applyProfileEnvironment as t,buildPersonaPrompt as n,layerHookGroups as r,loadMajorModesConfig as i,resolveLayers as a,resolvePluginEntries as o,resolveProfile as s,resolveSharedSkills as c}from"../services/config/index.mjs";import{PROXY_SERVER_NAME as l,applyMcpAllowlist as u,resolveMcpAllowlist as d}from"./mcpFilter.mjs";import{mergeMcpConfigs as f}from"./resourceCollector.mjs";import p from"node:path";import m from"node:fs";import h from"node:os";const g=`.mcp.json`;function _(e,t){let n=[p.join(e,g)];for(let e of t){if(e.mcp===!1)continue;let t=p.join(e.directory,g);m.existsSync(t)&&n.push(t)}return n}function v(e,t){let n=(e.mcpServers??{})[l],r=Array.isArray(n?.args)?n.args.map(String):[],i=r.indexOf(`--config`),a=i===-1?void 0:r[i+1];return a?p.resolve(t,a):p.join(t,`mcp-config.yaml`)}async function y(e,t,n,r){let i=await u(f(_(e,t)),n,e,r),a=p.join(r,`mcp.json`);return await m.promises.writeFile(a,`${JSON.stringify(i,null,2)}\n`,{mode:384}),{mcpConfigPath:a,proxyConfigPath:v(i,e)}}async function b(l){let u=i(l.repoRoot),f=a(u,l.majorMode),g=r(u,f),_=await m.promises.mkdtemp(p.join(h.tmpdir(),`doom-pi-compat-`));await m.promises.chmod(_,448);try{let r=l.profile?s(l.repoRoot,l.profile):void 0,i=o(l.repoRoot,l.domains,[]),a=d(l.repoRoot,l.domains),u=await y(l.repoRoot,i,a,_),h={...process.env};h.NX_DAEMON??=`false`;let v=t(h,r?.env??{}),b=r?.persona?n(r.personaRoot,r.persona):void 0,x;return b&&(x=p.join(_,`persona.md`),await m.promises.writeFile(x,`${b}\n`,{mode:384})),e({root:l.repoRoot,majorMode:l.majorMode,temporaryDirectory:_,domains:l.domains,layers:f,profile:r?.name,profileEnvironment:v,hookGroups:g,mcpConfigPath:u.mcpConfigPath,personaFile:x,additionalDirectories:l.additionalDirectories,hooks:!0},h),h.DOOMPI_ADDITIONAL_DIRS=l.additionalDirectories.join(p.delimiter),h.CLAUDE_PROJECT_DIR=l.repoRoot,h.CODEX_REPO_ROOT=l.repoRoot,h.AGY_REPO_ROOT=l.repoRoot,h.ORIGINAL_REPO_PATH||=l.repoRoot,{options:l,environment:h,plugins:i,profile:r,personaFile:x,mcpAllowlist:a,mcpConfigPath:u.mcpConfigPath,proxyConfigPath:u.proxyConfigPath,selectedLayers:f,hookGroups:g,sharedSkills:c(l.repoRoot,l.domains),cleanup:()=>m.promises.rm(_,{recursive:!0,force:!0})}}catch(e){throw await m.promises.rm(_,{recursive:!0,force:!0}),e}}export{b as buildCompatibilityContext};
2
2
  //# sourceMappingURL=compatibilityContext.mjs.map
@@ -1,2 +1,2 @@
1
- const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`./bootstrapLocator.cjs`),n=require(`./config/harnessState.cjs`),r=require(`../services/extensionAssembler.cjs`),i=require(`./resourceCollector.cjs`),a=require(`./harnessContext.cjs`),o=require(`./extensionCompiler.cjs`),s=require(`./syncState.cjs`),c=require(`./compositionState.cjs`);let l=require(`node:fs`);l=e.__toESM(l,1);let u=require(`node:url`),d=require(`node:path`);d=e.__toESM(d,1);let f=require(`@agimon-ai/doompi-config/majorModes`),p=require(`@agimon-ai/doompi-ui/extensionName`),m=require(`@earendil-works/pi-coding-agent`),h=require(`@agimon-ai/doompi-config/harnessStore`);const g=`doompi is configured for Pi but this repository was never synced. Run doompi sync.`,_=process.env.DOOMPI_TIMING===`1`||process.env.PI_TIMING===`1`,v={majorMode:`major-mode`,domains:`domains`,profile:`profile`,mute:`mute`},y=`layer`;function b(e){return e instanceof Error?e.message:String(e)}function x(e){try{return l.default.realpathSync(e)}catch{return d.default.resolve(e)}}function S(e,t){let{extensions:n}=(0,m.parseArgs)(e);if(!n||n.length===0)return!1;let r=new Set(Object.values(t).map(x));return n.some(e=>r.has(x(e)))}async function C(e,t,r=process.env){let i=await D(t),a={...n.readHarnessState({...e.env,...r}),...e.fileState,temporaryDirectory:i};(0,h.createHarnessSession)(a,{directory:i,environment:r});for(let[e,t]of Object.entries(a.profileEnvironment))r[e]===void 0&&(r[e]=t);return a}function w(e){let{unknownFlags:t}=(0,m.parseArgs)(e),n=e=>{let n=t.get(e);return typeof n==`string`&&n.trim()?n.trim():void 0},r=n(v.domains);return{majorMode:n(v.majorMode),domains:r?.split(`,`).map(e=>e.trim()).filter(Boolean),profile:n(v.profile),mute:t.get(v.mute)!==void 0,removedLayer:t.get(y)!==void 0}}function T(e){e.registerFlag(v.majorMode,{type:`string`,description:`Named major mode from .doom/modes.yaml`}),e.registerFlag(v.domains,{type:`string`,description:`Comma-separated content domains`}),e.registerFlag(v.profile,{type:`string`,description:`Persona and env from .doom/profiles.yaml`}),e.registerFlag(v.mute,{type:`boolean`,description:`Disable the notification extension`})}async function E(e,t,r,i){if(e.removedLayer&&i.push(`--${y} was replaced by --${v.majorMode}`),e.majorMode)try{let{applyMajorMode:r}=await Promise.resolve().then(()=>require(`./matrixSwitcher.cjs`));r(t,e.majorMode,n.getHarnessState())}catch(t){i.push(`--${v.majorMode} ${e.majorMode}: ${b(t)}`)}if(e.domains&&e.domains.length>0)try{let{applyDomains:t}=await Promise.resolve().then(()=>require(`./matrixSwitcher.cjs`));await t(e.domains,n.getHarnessState())}catch(t){i.push(`--domains ${e.domains.join(`,`)}: ${b(t)}`)}if(e.profile)try{let[{applyProfile:t},{resolveProfile:i}]=await Promise.all([Promise.resolve().then(()=>require(`./matrixSwitcher.cjs`)),import(`@agimon-ai/doompi-config/profiles`)]);await t(i(r,e.profile),n.getHarnessState())}catch(t){i.push(`--profile ${e.profile}: ${b(t)}`)}}async function D(e,t=process.env){let r=s.runDirectory(e);return await l.default.promises.mkdir(r,{mode:448,recursive:!0}),n.updateHarnessState({temporaryDirectory:r},t),r}async function O(e){await l.default.promises.rm(s.runDirectory(e),{recursive:!0,force:!0})}async function k(e,t=n.getHarnessState(),a=process.env){let l=t.root??e.root,u=s.createMapResolvers(e.resolved,e.compiled),p=t.mcp?u.optionalPackageEntry(r.CONTEXT_PACKAGES.mcp):void 0,m={agents:t.agents,autoStop:!1,preset:e.selection.preset,mcpEntry:p,personaEntry:u.ownEntry(r.PERSONA_ENTRY),workflowExtension:i.selectWorkflowExtensionForProcess(u.optionalPackageEntry(r.CONTEXT_PACKAGES.workflow),u.optionalPackageEntry(r.CONTEXT_PACKAGES.dispatcherWorkflow),a),layers:[...t.layers],majorModesConfig:(0,f.loadMajorModesConfig)(l),resolvers:u};n.updateHarnessState({childExtensions:r.assembleChildExtensions({...m,agents:!1,mute:!0})},a),t.agents&&(a.PI_SUBAGENT_EXTRA_AGENT_DIRS=t.agentDirectories.join(d.default.delimiter),a.PI_SUBAGENT_EXTRA_SKILL_DIRS=t.skillDirectories.join(d.default.delimiter));let h=[...r.assembleExtensions({...m,mute:a[c.MUTE_ENV]===`1`})].reverse(),g=e.bundles?.[o.extensionSetKey(h)];return g?[g]:h}async function A(e,t,n){let r=[];for(let i of t){let t=performance.now(),a;try{a=await import((0,u.pathToFileURL)(i).href),_&&process.stderr.write(`[doompi:timing] import ${(performance.now()-t).toFixed(1)}ms ${i}\n`)}catch(e){n.push(`${i}: ${b(e)}`);continue}if(typeof a.default!=`function`){n.push(`${i}: does not export an extension factory`);continue}let o=performance.now();try{await a.default((0,p.withExtensionSource)(e,i)),_&&process.stderr.write(`[doompi:timing] factory ${(performance.now()-o).toFixed(1)}ms ${i}\n`),r.push(i)}catch(e){n.push(`${i}: ${b(e)}`)}}return r}async function j(e,n={}){let r=n.environment??process.env,i=[],o=t.findSyncedRoot(n.cwd??process.cwd());if(!o)return{problems:[g],stale:!1,loaded:[]};let l;try{l=s.readSyncState(o)}catch(e){return{problems:[b(e)],stale:!1,loaded:[]}}if(!l)return{problems:[g],stale:!1,loaded:[]};let u=n.argv??process.argv.slice(2);if(r.DOOMPI_EXTENSIONS_PROVIDED===`1`||S(u,{...l.resolved,...l.bundles}))return{problems:[],stale:!1,loaded:[]};if(a.configurePreset({preset:l.selection.preset,piArgs:[]},r),!c.alreadyComposed(r)){r[c.COMPOSED_ENV]=`1`,await C(l,o,r);let e=w(u);e.mute&&(r[c.MUTE_ENV]=`1`),await E(e,(0,f.loadMajorModesConfig)(o),o,i)}let d;try{d=await k(l,(0,h.loadHarnessState)(r).state,r)}catch(e){return{problems:[...i,b(e)],stale:!1,loaded:[]}}let p=await A(e,d,i);return{problems:i,stale:s.computeInputsHash(o,l.selection)!==l.inputsHash,loaded:p}}exports.DOOM_FLAGS=v,exports.REMOVED_LAYER_FLAG=y,exports.applyStartupFlags=E,exports.cleanupRunDirectory=O,exports.composeDoomSession=j,exports.composeLoadOrder=k,exports.extensionsProvidedExternally=S,exports.loadComposedExtensions=A,exports.prepareRunDirectory=D,exports.readStartupFlags=w,exports.registerDoomFlags=T,exports.startSyncedSession=C;
1
+ const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`./bootstrapLocator.cjs`),n=require(`./config/harnessState.cjs`),r=require(`../services/extensionAssembler.cjs`),i=require(`./resourceCollector.cjs`),a=require(`./harnessContext.cjs`),o=require(`./extensionCompiler.cjs`),s=require(`./syncState.cjs`),c=require(`./compositionState.cjs`);let l=require(`node:url`),u=require(`node:path`);u=e.__toESM(u,1);let d=require(`node:fs`);d=e.__toESM(d,1);let f=require(`@agimon-ai/doompi-config/majorModes`),p=require(`@agimon-ai/doompi-ui/extensionName`),m=require(`@earendil-works/pi-coding-agent`),h=require(`@agimon-ai/doompi-config/harnessStore`);const g=`doompi is configured for Pi but this repository was never synced. Run doompi sync.`,_=process.env.DOOMPI_TIMING===`1`||process.env.PI_TIMING===`1`,v={majorMode:`major-mode`,domains:`domains`,profile:`profile`,mute:`mute`},y=`layer`;function b(e){return e instanceof Error?e.message:String(e)}function x(e){try{return d.default.realpathSync(e)}catch{return u.default.resolve(e)}}function S(e,t){let{extensions:n}=(0,m.parseArgs)(e);if(!n||n.length===0)return!1;let r=new Set(Object.values(t).map(x));return n.some(e=>r.has(x(e)))}async function C(e,t,r=process.env){let i=await D(t),a={...n.readHarnessState({...e.env,...r}),...e.fileState,temporaryDirectory:i};(0,h.createHarnessSession)(a,{directory:i,environment:r});for(let[e,t]of Object.entries(a.profileEnvironment))r[e]===void 0&&(r[e]=t);return a}function w(e){let{unknownFlags:t}=(0,m.parseArgs)(e),n=e=>{let n=t.get(e);return typeof n==`string`&&n.trim()?n.trim():void 0},r=n(v.domains);return{majorMode:n(v.majorMode),domains:r?.split(`,`).map(e=>e.trim()).filter(Boolean),profile:n(v.profile),mute:t.get(v.mute)!==void 0,removedLayer:t.get(y)!==void 0}}function T(e){e.registerFlag(v.majorMode,{type:`string`,description:`Named major mode from .doom/modes.yaml`}),e.registerFlag(v.domains,{type:`string`,description:`Comma-separated content domains`}),e.registerFlag(v.profile,{type:`string`,description:`Persona and env from .doom/profiles.yaml`}),e.registerFlag(v.mute,{type:`boolean`,description:`Disable the notification extension`})}async function E(e,t,r,i){if(e.removedLayer&&i.push(`--${y} was replaced by --${v.majorMode}`),e.majorMode)try{let{applyMajorMode:r}=await Promise.resolve().then(()=>require(`./matrixSwitcher.cjs`));r(t,e.majorMode,n.getHarnessState())}catch(t){i.push(`--${v.majorMode} ${e.majorMode}: ${b(t)}`)}if(e.domains&&e.domains.length>0)try{let{applyDomains:t}=await Promise.resolve().then(()=>require(`./matrixSwitcher.cjs`));await t(e.domains,n.getHarnessState())}catch(t){i.push(`--domains ${e.domains.join(`,`)}: ${b(t)}`)}if(e.profile)try{let[{applyProfile:t},{resolveProfile:i}]=await Promise.all([Promise.resolve().then(()=>require(`./matrixSwitcher.cjs`)),import(`@agimon-ai/doompi-config/profiles`)]);await t(i(r,e.profile),n.getHarnessState())}catch(t){i.push(`--profile ${e.profile}: ${b(t)}`)}}async function D(e,t=process.env){let r=s.runDirectory(e);return await d.default.promises.mkdir(r,{mode:448,recursive:!0}),n.updateHarnessState({temporaryDirectory:r},t),r}async function O(e){await d.default.promises.rm(s.runDirectory(e),{recursive:!0,force:!0})}async function k(e,t=n.getHarnessState(),a=process.env){let l=t.root??e.root,d=s.createMapResolvers(e.resolved,e.compiled),p=t.mcp?d.optionalPackageEntry(r.CONTEXT_PACKAGES.mcp):void 0,m={agents:t.agents,autoStop:!1,preset:e.selection.preset,mcpEntry:p,personaEntry:d.ownEntry(r.PERSONA_ENTRY),workflowExtension:i.selectWorkflowExtensionForProcess(d.optionalPackageEntry(r.CONTEXT_PACKAGES.workflow),d.optionalPackageEntry(r.CONTEXT_PACKAGES.dispatcherWorkflow),a),layers:[...t.layers],majorModesConfig:(0,f.loadMajorModesConfig)(l),resolvers:d};n.updateHarnessState({childExtensions:r.assembleChildExtensions({...m,agents:!1,mute:!0})},a),t.agents&&(a.PI_SUBAGENT_EXTRA_AGENT_DIRS=t.agentDirectories.join(u.default.delimiter),a.PI_SUBAGENT_EXTRA_SKILL_DIRS=t.skillDirectories.join(u.default.delimiter));let h=[...r.assembleExtensions({...m,mute:a[c.MUTE_ENV]===`1`})].reverse(),g=e.bundles?.[o.extensionSetKey(h)];return g?[g]:h}async function A(e,t,n){let r=[];for(let i of t){let t=performance.now(),a;try{a=await import((0,l.pathToFileURL)(i).href),_&&process.stderr.write(`[doompi:timing] import ${(performance.now()-t).toFixed(1)}ms ${i}\n`)}catch(e){n.push(`${i}: ${b(e)}`);continue}if(typeof a.default!=`function`){n.push(`${i}: does not export an extension factory`);continue}let o=performance.now();try{await a.default((0,p.withExtensionSource)(e,i)),_&&process.stderr.write(`[doompi:timing] factory ${(performance.now()-o).toFixed(1)}ms ${i}\n`),r.push(i)}catch(e){n.push(`${i}: ${b(e)}`)}}return r}async function j(e,n={}){let r=n.environment??process.env,i=[],o=t.findSyncedRoot(n.cwd??process.cwd());if(!o)return{problems:[g],stale:!1,loaded:[]};let l;try{l=s.readSyncState(o)}catch(e){return{problems:[b(e)],stale:!1,loaded:[]}}if(!l)return{problems:[g],stale:!1,loaded:[]};let u=n.argv??process.argv.slice(2);if(r[c.EXTERNAL_EXTENSIONS_ENV]===`1`||S(u,{...l.resolved,...l.bundles}))return{problems:[],stale:!1,loaded:[]};if(a.configurePreset({preset:l.selection.preset,piArgs:[]},r),!c.alreadyComposed(r)){r[c.COMPOSED_ENV]=`1`,await C(l,o,r);let e=w(u);e.mute&&(r[c.MUTE_ENV]=`1`),await E(e,(0,f.loadMajorModesConfig)(o),o,i)}let d;try{d=await k(l,(0,h.loadHarnessState)(r).state,r)}catch(e){return{problems:[...i,b(e)],stale:!1,loaded:[]}}let p=await A(e,d,i);return{problems:i,stale:s.computeInputsHash(o,l.selection)!==l.inputsHash,loaded:p}}exports.DOOM_FLAGS=v,exports.REMOVED_LAYER_FLAG=y,exports.applyStartupFlags=E,exports.cleanupRunDirectory=O,exports.composeDoomSession=j,exports.composeLoadOrder=k,exports.extensionsProvidedExternally=S,exports.loadComposedExtensions=A,exports.prepareRunDirectory=D,exports.readStartupFlags=w,exports.registerDoomFlags=T,exports.startSyncedSession=C;
2
2
  //# sourceMappingURL=composer.cjs.map