@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.
- package/README.md +46 -19
- package/dist/adapters/bootstrapClaim.cjs +2 -0
- package/dist/adapters/bootstrapClaim.cjs.map +1 -0
- package/dist/adapters/bootstrapClaim.mjs +2 -0
- package/dist/adapters/bootstrapClaim.mjs.map +1 -0
- package/dist/adapters/bootstrapLocator.cjs +1 -1
- package/dist/adapters/bootstrapLocator.cjs.map +1 -1
- package/dist/adapters/bootstrapLocator.d.cts.map +1 -1
- package/dist/adapters/bootstrapLocator.d.mts.map +1 -1
- package/dist/adapters/bootstrapLocator.mjs +1 -1
- package/dist/adapters/bootstrapLocator.mjs.map +1 -1
- package/dist/adapters/compatibility/antigravity.cjs +1 -1
- package/dist/adapters/compatibility/antigravity.mjs +1 -1
- package/dist/adapters/compatibility/codex.cjs +1 -1
- package/dist/adapters/compatibility/codex.mjs +1 -1
- package/dist/adapters/compatibility/process.cjs +1 -1
- package/dist/adapters/compatibility/process.mjs +1 -1
- package/dist/adapters/compatibilityContext.cjs +1 -1
- package/dist/adapters/compatibilityContext.mjs +1 -1
- package/dist/adapters/composer.cjs +1 -1
- package/dist/adapters/composer.cjs.map +1 -1
- package/dist/adapters/composer.mjs +1 -1
- package/dist/adapters/composer.mjs.map +1 -1
- package/dist/adapters/compositionState.cjs +1 -1
- package/dist/adapters/compositionState.cjs.map +1 -1
- package/dist/adapters/compositionState.d.cts.map +1 -1
- package/dist/adapters/compositionState.d.mts.map +1 -1
- package/dist/adapters/compositionState.mjs +1 -1
- package/dist/adapters/compositionState.mjs.map +1 -1
- package/dist/adapters/deferredSkills.cjs +4 -4
- package/dist/adapters/deferredSkills.cjs.map +1 -1
- package/dist/adapters/deferredSkills.mjs +4 -4
- package/dist/adapters/deferredSkills.mjs.map +1 -1
- package/dist/adapters/doomPackage.cjs +2 -0
- package/dist/adapters/doomPackage.cjs.map +1 -0
- package/dist/adapters/doomPackage.mjs +2 -0
- package/dist/adapters/doomPackage.mjs.map +1 -0
- package/dist/adapters/extensionCompiler.cjs +2 -2
- package/dist/adapters/extensionCompiler.cjs.map +1 -1
- package/dist/adapters/extensionCompiler.mjs +2 -2
- package/dist/adapters/extensionCompiler.mjs.map +1 -1
- package/dist/adapters/harnessContext.cjs +1 -1
- package/dist/adapters/harnessContext.cjs.map +1 -1
- package/dist/adapters/harnessContext.mjs +1 -1
- package/dist/adapters/matrixSwitcher.cjs +1 -1
- package/dist/adapters/matrixSwitcher.mjs +1 -1
- package/dist/adapters/mcpFilter.cjs +2 -2
- package/dist/adapters/mcpFilter.mjs +2 -2
- package/dist/adapters/modules/moduleResolution.cjs +1 -1
- package/dist/adapters/modules/moduleResolution.cjs.map +1 -1
- package/dist/adapters/modules/moduleResolution.d.cts +10 -1
- package/dist/adapters/modules/moduleResolution.d.cts.map +1 -1
- package/dist/adapters/modules/moduleResolution.d.mts +10 -1
- package/dist/adapters/modules/moduleResolution.d.mts.map +1 -1
- package/dist/adapters/modules/moduleResolution.mjs +1 -1
- package/dist/adapters/modules/moduleResolution.mjs.map +1 -1
- package/dist/adapters/packageBootstrap.cjs +1 -1
- package/dist/adapters/packageBootstrap.cjs.map +1 -1
- package/dist/adapters/packageBootstrap.d.cts +1 -1
- package/dist/adapters/packageBootstrap.d.cts.map +1 -1
- package/dist/adapters/packageBootstrap.d.mts +1 -1
- package/dist/adapters/packageBootstrap.d.mts.map +1 -1
- package/dist/adapters/packageBootstrap.mjs +1 -1
- package/dist/adapters/packageBootstrap.mjs.map +1 -1
- package/dist/adapters/piExtensionAlias.cjs +1 -1
- package/dist/adapters/piExtensionAlias.cjs.map +1 -1
- package/dist/adapters/piExtensionAlias.mjs +1 -1
- package/dist/adapters/piExtensionAlias.mjs.map +1 -1
- package/dist/adapters/piSettings.cjs +1 -1
- package/dist/adapters/piSettings.cjs.map +1 -1
- package/dist/adapters/piSettings.d.cts +11 -12
- package/dist/adapters/piSettings.d.cts.map +1 -1
- package/dist/adapters/piSettings.d.mts +11 -12
- package/dist/adapters/piSettings.d.mts.map +1 -1
- package/dist/adapters/piSettings.mjs +1 -1
- package/dist/adapters/piSettings.mjs.map +1 -1
- package/dist/adapters/projectPiSettings.cjs +2 -0
- package/dist/adapters/projectPiSettings.cjs.map +1 -0
- package/dist/adapters/projectPiSettings.d.cts +29 -0
- package/dist/adapters/projectPiSettings.d.cts.map +1 -0
- package/dist/adapters/projectPiSettings.d.mts +29 -0
- package/dist/adapters/projectPiSettings.d.mts.map +1 -0
- package/dist/adapters/projectPiSettings.mjs +2 -0
- package/dist/adapters/projectPiSettings.mjs.map +1 -0
- package/dist/adapters/repository/repository.cjs +1 -1
- package/dist/adapters/repository/repository.mjs +1 -1
- package/dist/adapters/resourceCollector.cjs +2 -2
- package/dist/adapters/resourceCollector.mjs +2 -2
- package/dist/adapters/serialization/json.cjs +1 -1
- package/dist/adapters/serialization/json.mjs +1 -1
- package/dist/adapters/skillCatalog.cjs +1 -1
- package/dist/adapters/skillCatalog.mjs +1 -1
- package/dist/adapters/skillSources.cjs +1 -1
- package/dist/adapters/skillSources.mjs +1 -1
- package/dist/adapters/startupPrecompiler.cjs +2 -0
- package/dist/adapters/startupPrecompiler.cjs.map +1 -0
- package/dist/adapters/startupPrecompiler.d.cts +13 -0
- package/dist/adapters/startupPrecompiler.d.cts.map +1 -0
- package/dist/adapters/startupPrecompiler.d.mts +13 -0
- package/dist/adapters/startupPrecompiler.d.mts.map +1 -0
- package/dist/adapters/startupPrecompiler.mjs +2 -0
- package/dist/adapters/startupPrecompiler.mjs.map +1 -0
- package/dist/adapters/syncState.cjs +1 -1
- package/dist/adapters/syncState.cjs.map +1 -1
- package/dist/adapters/syncState.d.cts +18 -3
- package/dist/adapters/syncState.d.cts.map +1 -1
- package/dist/adapters/syncState.d.mts +18 -3
- package/dist/adapters/syncState.d.mts.map +1 -1
- package/dist/adapters/syncState.mjs +1 -1
- package/dist/adapters/syncState.mjs.map +1 -1
- package/dist/adapters/syncStateContract.cjs +1 -1
- package/dist/adapters/syncStateContract.cjs.map +1 -1
- package/dist/adapters/syncStateContract.d.cts +5 -4
- package/dist/adapters/syncStateContract.d.cts.map +1 -1
- package/dist/adapters/syncStateContract.d.mts +5 -4
- package/dist/adapters/syncStateContract.d.mts.map +1 -1
- package/dist/adapters/syncStateContract.mjs +1 -1
- package/dist/adapters/syncStateContract.mjs.map +1 -1
- package/dist/adapters/syncedRuntimeBuilder.cjs +2 -0
- package/dist/adapters/syncedRuntimeBuilder.cjs.map +1 -0
- package/dist/adapters/syncedRuntimeBuilder.d.cts +11 -0
- package/dist/adapters/syncedRuntimeBuilder.d.cts.map +1 -0
- package/dist/adapters/syncedRuntimeBuilder.d.mts +11 -0
- package/dist/adapters/syncedRuntimeBuilder.d.mts.map +1 -0
- package/dist/adapters/syncedRuntimeBuilder.mjs +2 -0
- package/dist/adapters/syncedRuntimeBuilder.mjs.map +1 -0
- package/dist/commands/buildCommand.cjs +2 -2
- package/dist/commands/buildCommand.cjs.map +1 -1
- package/dist/commands/buildCommand.d.cts +4 -0
- package/dist/commands/buildCommand.d.cts.map +1 -1
- package/dist/commands/buildCommand.d.mts +4 -0
- package/dist/commands/buildCommand.d.mts.map +1 -1
- package/dist/commands/buildCommand.mjs +2 -2
- package/dist/commands/buildCommand.mjs.map +1 -1
- package/dist/commands/cli/help.cjs +2 -2
- package/dist/commands/cli/help.cjs.map +1 -1
- package/dist/commands/cli/help.mjs +2 -2
- package/dist/commands/cli/help.mjs.map +1 -1
- package/dist/commands/compatibilityCommand.cjs +1 -1
- package/dist/commands/compatibilityCommand.mjs +1 -1
- package/dist/commands/explainCommand.cjs +3 -3
- package/dist/commands/explainCommand.mjs +3 -3
- package/dist/commands/launchCommand.cjs +1 -1
- package/dist/commands/launchCommand.cjs.map +1 -1
- package/dist/commands/launchCommand.mjs +1 -1
- package/dist/commands/launchCommand.mjs.map +1 -1
- package/dist/commands/syncCommand.cjs +5 -5
- package/dist/commands/syncCommand.cjs.map +1 -1
- package/dist/commands/syncCommand.d.cts +4 -2
- package/dist/commands/syncCommand.d.cts.map +1 -1
- package/dist/commands/syncCommand.d.mts +4 -2
- package/dist/commands/syncCommand.d.mts.map +1 -1
- package/dist/commands/syncCommand.mjs +4 -4
- package/dist/commands/syncCommand.mjs.map +1 -1
- package/dist/entries/doom.cjs +1 -1
- package/dist/entries/doom.d.cts +1 -1
- package/dist/entries/doom.d.mts +1 -1
- package/dist/entries/doom.mjs +1 -1
- package/dist/entries/modeCatalog.cjs +1 -0
- package/dist/entries/modeCatalog.d.cts +2 -0
- package/dist/entries/modeCatalog.d.mts +2 -0
- package/dist/entries/modeCatalog.mjs +1 -0
- package/dist/extensions/entries/cacheOptimizer.mjs +2 -0
- package/dist/extensions/entries/cacheOptimizer.mjs.map +1 -0
- package/dist/extensions/entries/components/skillsOverlay.cjs +2 -2
- package/dist/extensions/entries/components/skillsOverlay.mjs +2 -2
- package/dist/extensions/entries/doom.cjs +1 -1
- package/dist/extensions/entries/doom.cjs.map +1 -1
- package/dist/extensions/entries/doom.d.cts.map +1 -1
- package/dist/extensions/entries/doom.d.mts.map +1 -1
- package/dist/extensions/entries/doom.mjs +1 -1
- package/dist/extensions/entries/doom.mjs.map +1 -1
- package/dist/extensions/entries/modeCatalog.cjs +2 -0
- package/dist/extensions/entries/modeCatalog.cjs.map +1 -0
- package/dist/extensions/entries/modeCatalog.d.cts +7 -0
- package/dist/extensions/entries/modeCatalog.d.cts.map +1 -0
- package/dist/extensions/entries/modeCatalog.d.mts +7 -0
- package/dist/extensions/entries/modeCatalog.d.mts.map +1 -0
- package/dist/extensions/entries/modeCatalog.mjs +2 -0
- package/dist/extensions/entries/modeCatalog.mjs.map +1 -0
- package/dist/extensions/entries/styleSystem.cjs +2 -2
- package/dist/extensions/entries/styleSystem.mjs +2 -2
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +5 -3
- package/dist/index.d.mts +5 -3
- package/dist/index.mjs +1 -1
- package/dist/pi-cache-optimizer-D9beVnnH.mjs +50 -0
- package/dist/pi-cache-optimizer-D9beVnnH.mjs.map +1 -0
- package/dist/schemas/modeCatalog.cjs +2 -0
- package/dist/schemas/modeCatalog.cjs.map +1 -0
- package/dist/schemas/modeCatalog.mjs +2 -0
- package/dist/schemas/modeCatalog.mjs.map +1 -0
- package/dist/services/config/index.d.mts +2 -2
- package/dist/services/extensionAssembler.cjs +1 -1
- package/dist/services/extensionAssembler.cjs.map +1 -1
- package/dist/services/extensionAssembler.d.cts +8 -4
- package/dist/services/extensionAssembler.d.cts.map +1 -1
- package/dist/services/extensionAssembler.d.mts +8 -4
- package/dist/services/extensionAssembler.d.mts.map +1 -1
- package/dist/services/extensionAssembler.mjs +1 -1
- package/dist/services/extensionAssembler.mjs.map +1 -1
- package/dist/services/index.cjs +1 -1
- package/dist/services/index.d.cts +4 -2
- package/dist/services/index.d.mts +4 -2
- package/dist/services/index.mjs +1 -1
- package/dist/services/modeCatalog.cjs +2 -0
- package/dist/services/modeCatalog.cjs.map +1 -0
- package/dist/services/modeCatalog.d.cts +18 -0
- package/dist/services/modeCatalog.d.cts.map +1 -0
- package/dist/services/modeCatalog.d.mts +18 -0
- package/dist/services/modeCatalog.d.mts.map +1 -0
- package/dist/services/modeCatalog.mjs +2 -0
- package/dist/services/modeCatalog.mjs.map +1 -0
- package/dist/services/piSettings.cjs +1 -1
- package/dist/services/piSettings.d.cts +2 -2
- package/dist/services/piSettings.d.mts +2 -2
- package/dist/services/piSettings.mjs +1 -1
- package/dist/services/syncState.cjs +1 -1
- package/dist/services/syncState.d.cts +2 -2
- package/dist/services/syncState.d.mts +2 -2
- package/dist/services/syncState.mjs +1 -1
- package/dist/utils/index.cjs +1 -1
- package/dist/utils/index.d.cts +2 -2
- package/dist/utils/index.d.mts +2 -2
- package/dist/utils/index.mjs +1 -1
- package/dist/utils/moduleResolution.cjs +1 -1
- package/dist/utils/moduleResolution.d.cts +2 -2
- package/dist/utils/moduleResolution.d.mts +2 -2
- package/dist/utils/moduleResolution.mjs +1 -1
- 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
|
|
106
|
-
doompi
|
|
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
|
|
122
|
-
selected matrix, compiles its exact extension graph
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
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
|
|
524
|
-
|
|
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:
|
|
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":"
|
|
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":"
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|