@agimon-ai/po 0.0.0-alpha.2 → 0.0.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/README.md +7 -4
  2. package/dist/antigravity.mjs +1 -2
  3. package/dist/baseCommand.mjs +1 -2
  4. package/dist/bin/{doomRunner.cjs → poRunner.cjs} +5 -5
  5. package/dist/bin/poRunner.cjs.map +1 -0
  6. package/dist/bin/{doomRunner.d.mts → poRunner.d.mts} +2 -2
  7. package/dist/bin/poRunner.d.mts.map +1 -0
  8. package/dist/bin/{doomRunner.mjs → poRunner.mjs} +5 -5
  9. package/dist/bin/poRunner.mjs.map +1 -0
  10. package/dist/builders/cli/extensionAssembler/index.cjs +3 -1
  11. package/dist/builders/cli/extensionAssembler/index.cjs.map +1 -1
  12. package/dist/builders/cli/extensionAssembler/index.d.mts +1 -0
  13. package/dist/builders/cli/extensionAssembler/index.d.mts.map +1 -1
  14. package/dist/builders/cli/extensionAssembler/index.mjs +3 -1
  15. package/dist/builders/cli/extensionAssembler/index.mjs.map +1 -1
  16. package/dist/catalog/index.json +63 -51
  17. package/dist/cliApp.mjs +1 -2
  18. package/dist/codex.mjs +1 -2
  19. package/dist/compatibilityCommand.mjs +1 -2
  20. package/dist/compatibilityContext.mjs +1 -2
  21. package/dist/compatibilityOptions.mjs +1 -2
  22. package/dist/config.cjs +57 -12
  23. package/dist/config.d.mts +3 -3
  24. package/dist/config.mjs +3 -3
  25. package/dist/doctorCommand.mjs +1 -2
  26. package/dist/emitMcpCommand.mjs +1 -2
  27. package/dist/explainCommand.mjs +1 -2
  28. package/dist/extensions/server.cjs.map +1 -1
  29. package/dist/extensions/server.d.mts +1 -1
  30. package/dist/extensions/server.mjs.map +1 -1
  31. package/dist/harnessContext.mjs +1 -2
  32. package/dist/harnessState.cjs +66 -11
  33. package/dist/harnessState.d.mts +2 -2
  34. package/dist/harnessState.mjs +1 -2
  35. package/dist/index.cjs +60 -15
  36. package/dist/index.d.mts +3 -3
  37. package/dist/index.mjs +3 -3
  38. package/dist/initCommand.mjs +1 -2
  39. package/dist/matrixOptions.mjs +1 -2
  40. package/dist/options.mjs +1 -2
  41. package/dist/process.mjs +1 -2
  42. package/dist/projectTrust.cjs +2 -2
  43. package/dist/projectTrust.d.mts +2 -2
  44. package/dist/projectTrust.mjs +1 -2
  45. package/dist/repository.cjs +1 -1
  46. package/dist/repository.d.mts +2 -2
  47. package/dist/repository.mjs +1 -2
  48. package/dist/router.mjs +1 -2
  49. package/dist/shared.mjs +1 -2
  50. package/dist/src/bin/agentDirectory.cjs +43 -3
  51. package/dist/src/bin/agentDirectory.cjs.map +1 -1
  52. package/dist/src/bin/agentDirectory.mjs +40 -2
  53. package/dist/src/bin/agentDirectory.mjs.map +1 -1
  54. package/dist/src/builders/apiContractExport/index.cjs +2 -2
  55. package/dist/src/builders/apiContractExport/index.cjs.map +1 -1
  56. package/dist/src/builders/apiContractExport/index.mjs +4 -4
  57. package/dist/src/builders/apiContractExport/index.mjs.map +1 -1
  58. package/dist/src/builders/cli/entryResolution.cjs +3 -3
  59. package/dist/src/builders/cli/entryResolution.cjs.map +1 -1
  60. package/dist/src/builders/cli/entryResolution.mjs +3 -3
  61. package/dist/src/builders/cli/entryResolution.mjs.map +1 -1
  62. package/dist/src/builders/cli/harnessContext.cjs +5 -5
  63. package/dist/src/builders/cli/harnessContext.cjs.map +1 -1
  64. package/dist/src/builders/cli/harnessContext.mjs +7 -7
  65. package/dist/src/builders/cli/harnessContext.mjs.map +1 -1
  66. package/dist/src/builders/hooks/index.cjs +1 -1
  67. package/dist/src/builders/hooks/index.cjs.map +1 -1
  68. package/dist/src/builders/hooks/index.mjs +2 -2
  69. package/dist/src/builders/hooks/index.mjs.map +1 -1
  70. package/dist/src/builders/server/computerUseBinding.cjs +1 -1
  71. package/dist/src/builders/server/computerUseBinding.cjs.map +1 -1
  72. package/dist/src/builders/server/computerUseBinding.mjs +2 -2
  73. package/dist/src/builders/server/computerUseBinding.mjs.map +1 -1
  74. package/dist/src/builders/server/defaultWorkspace.cjs +1 -1
  75. package/dist/src/builders/server/defaultWorkspace.cjs.map +1 -1
  76. package/dist/src/builders/server/defaultWorkspace.mjs +2 -2
  77. package/dist/src/builders/server/defaultWorkspace.mjs.map +1 -1
  78. package/dist/src/builders/server/idleRestart.cjs +3 -3
  79. package/dist/src/builders/server/idleRestart.cjs.map +1 -1
  80. package/dist/src/builders/server/idleRestart.mjs +3 -3
  81. package/dist/src/builders/server/idleRestart.mjs.map +1 -1
  82. package/dist/src/builders/server/index.cjs.map +1 -1
  83. package/dist/src/builders/server/index.mjs.map +1 -1
  84. package/dist/src/builders/server/mcpBundle.cjs.map +1 -1
  85. package/dist/src/builders/server/mcpBundle.d.mts +2 -2
  86. package/dist/src/builders/server/mcpBundle.mjs.map +1 -1
  87. package/dist/src/builders/server/packageUrl.cjs +25 -18
  88. package/dist/src/builders/server/packageUrl.cjs.map +1 -1
  89. package/dist/src/builders/server/packageUrl.mjs +25 -18
  90. package/dist/src/builders/server/packageUrl.mjs.map +1 -1
  91. package/dist/src/builders/server/runtime.cjs +47 -20
  92. package/dist/src/builders/server/runtime.cjs.map +1 -1
  93. package/dist/src/builders/server/runtime.mjs +50 -23
  94. package/dist/src/builders/server/runtime.mjs.map +1 -1
  95. package/dist/src/builders/server/selectionStatus.cjs +3 -3
  96. package/dist/src/builders/server/selectionStatus.cjs.map +1 -1
  97. package/dist/src/builders/server/selectionStatus.mjs +3 -3
  98. package/dist/src/builders/server/selectionStatus.mjs.map +1 -1
  99. package/dist/src/builders/server/sessionArguments.cjs.map +1 -1
  100. package/dist/src/builders/server/sessionArguments.mjs.map +1 -1
  101. package/dist/src/builders/server/webTemplateDecision.cjs +1 -1
  102. package/dist/src/builders/server/webTemplateDecision.cjs.map +1 -1
  103. package/dist/src/builders/server/webTemplateDecision.mjs +2 -2
  104. package/dist/src/builders/server/webTemplateDecision.mjs.map +1 -1
  105. package/dist/src/builders/web/bundle.d.mts +1 -0
  106. package/dist/src/builders/web/bundleAssetPolicy.d.mts +1 -0
  107. package/dist/src/builders/web/index.d.mts +1 -0
  108. package/dist/src/builders/web/webPluginVite.d.mts +1 -0
  109. package/dist/src/cli/cliApp.cjs +1 -1
  110. package/dist/src/cli/cliApp.cjs.map +1 -1
  111. package/dist/src/cli/cliApp.mjs +1 -1
  112. package/dist/src/cli/cliApp.mjs.map +1 -1
  113. package/dist/src/cli/commands/compat/index.cjs +1 -1
  114. package/dist/src/cli/commands/compat/index.cjs.map +1 -1
  115. package/dist/src/cli/commands/compat/index.mjs +1 -1
  116. package/dist/src/cli/commands/compat/index.mjs.map +1 -1
  117. package/dist/src/cli/commands/doctor/index.cjs +2 -2
  118. package/dist/src/cli/commands/doctor/index.cjs.map +1 -1
  119. package/dist/src/cli/commands/doctor/index.d.mts +1 -0
  120. package/dist/src/cli/commands/doctor/index.d.mts.map +1 -1
  121. package/dist/src/cli/commands/doctor/index.mjs +4 -4
  122. package/dist/src/cli/commands/doctor/index.mjs.map +1 -1
  123. package/dist/src/cli/commands/explain/index.cjs +1 -1
  124. package/dist/src/cli/commands/explain/index.cjs.map +1 -1
  125. package/dist/src/cli/commands/explain/index.mjs +2 -2
  126. package/dist/src/cli/commands/explain/index.mjs.map +1 -1
  127. package/dist/src/cli/commands/init/index.cjs +2 -2
  128. package/dist/src/cli/commands/init/index.cjs.map +1 -1
  129. package/dist/src/cli/commands/init/index.mjs +3 -3
  130. package/dist/src/cli/commands/init/index.mjs.map +1 -1
  131. package/dist/src/cli/commands/init/presenter.cjs +1 -1
  132. package/dist/src/cli/commands/init/presenter.cjs.map +1 -1
  133. package/dist/src/cli/commands/init/presenter.mjs +2 -2
  134. package/dist/src/cli/commands/init/presenter.mjs.map +1 -1
  135. package/dist/src/cli/commands/sync/index.cjs +4 -4
  136. package/dist/src/cli/commands/sync/index.cjs.map +1 -1
  137. package/dist/src/cli/commands/sync/index.d.mts +1 -0
  138. package/dist/src/cli/commands/sync/index.mjs +7 -7
  139. package/dist/src/cli/commands/sync/index.mjs.map +1 -1
  140. package/dist/src/cli/commands/sync/presenter.cjs +1 -1
  141. package/dist/src/cli/commands/sync/presenter.cjs.map +1 -1
  142. package/dist/src/cli/commands/sync/presenter.d.mts +1 -1
  143. package/dist/src/cli/commands/sync/presenter.mjs +1 -1
  144. package/dist/src/cli/commands/sync/presenter.mjs.map +1 -1
  145. package/dist/src/cli/commands/web/index.cjs +19 -1
  146. package/dist/src/cli/commands/web/index.cjs.map +1 -1
  147. package/dist/src/cli/commands/web/index.mjs +19 -1
  148. package/dist/src/cli/commands/web/index.mjs.map +1 -1
  149. package/dist/src/cli/harnessOptions.cjs +1 -1
  150. package/dist/src/cli/harnessOptions.cjs.map +1 -1
  151. package/dist/src/cli/harnessOptions.mjs +2 -2
  152. package/dist/src/cli/harnessOptions.mjs.map +1 -1
  153. package/dist/src/cli/matrixOptions.cjs +1 -1
  154. package/dist/src/cli/matrixOptions.cjs.map +1 -1
  155. package/dist/src/cli/matrixOptions.d.mts +1 -1
  156. package/dist/src/cli/matrixOptions.mjs +1 -1
  157. package/dist/src/cli/matrixOptions.mjs.map +1 -1
  158. package/dist/src/cli/server/run.cjs +1 -1
  159. package/dist/src/cli/server/run.cjs.map +1 -1
  160. package/dist/src/cli/server/run.mjs +2 -2
  161. package/dist/src/cli/server/run.mjs.map +1 -1
  162. package/dist/src/composition/harnessState/index.cjs +66 -11
  163. package/dist/src/composition/harnessState/index.cjs.map +1 -1
  164. package/dist/src/composition/harnessState/index.d.mts +2 -2
  165. package/dist/src/composition/harnessState/index.mjs.map +1 -1
  166. package/dist/src/composition/poHomeMigration/index.cjs +1 -1
  167. package/dist/src/composition/poHomeMigration/index.cjs.map +1 -1
  168. package/dist/src/composition/poHomeMigration/index.mjs +1 -1
  169. package/dist/src/composition/poHomeMigration/index.mjs.map +1 -1
  170. package/dist/src/composition/projectTrust/index.cjs +6 -6
  171. package/dist/src/composition/projectTrust/index.cjs.map +1 -1
  172. package/dist/src/composition/projectTrust/index.d.mts +7 -7
  173. package/dist/src/composition/projectTrust/index.d.mts.map +1 -1
  174. package/dist/src/composition/projectTrust/index.mjs +6 -6
  175. package/dist/src/composition/projectTrust/index.mjs.map +1 -1
  176. package/dist/src/composition/repository/index.cjs +8 -8
  177. package/dist/src/composition/repository/index.cjs.map +1 -1
  178. package/dist/src/composition/repository/index.d.mts +5 -5
  179. package/dist/src/composition/repository/index.d.mts.map +1 -1
  180. package/dist/src/composition/repository/index.mjs +10 -10
  181. package/dist/src/composition/repository/index.mjs.map +1 -1
  182. package/dist/src/composition/syncService/index.cjs +20 -2
  183. package/dist/src/composition/syncService/index.cjs.map +1 -1
  184. package/dist/src/composition/syncService/index.mjs +22 -4
  185. package/dist/src/composition/syncService/index.mjs.map +1 -1
  186. package/dist/src/extensions/setupDiagnostics.cjs +1 -1
  187. package/dist/src/extensions/setupDiagnostics.cjs.map +1 -1
  188. package/dist/src/extensions/setupDiagnostics.mjs +2 -2
  189. package/dist/src/extensions/setupDiagnostics.mjs.map +1 -1
  190. package/dist/utils.mjs +1 -2
  191. package/docs/server/api-export.md +1 -1
  192. package/docs/server/api.md +12 -12
  193. package/docs/server/getting-started.md +1 -1
  194. package/docs/server/index.md +1 -1
  195. package/docs/server/ipc.md +5 -6
  196. package/package.json +38 -41
  197. package/src/prompts/po-author-extension/SKILL.md +1 -1
  198. package/src/prompts/po-author-extension/references/extension-contract.md +2 -2
  199. package/dist/bin/doomRunner.cjs.map +0 -1
  200. package/dist/bin/doomRunner.d.mts.map +0 -1
  201. package/dist/bin/doomRunner.mjs.map +0 -1
package/README.md CHANGED
@@ -19,7 +19,7 @@ denylist are repository-wide. Po draws that loading boundary around the session.
19
19
  mode and some domains; add a profile if you want one. Four YAML files decide what loads;
20
20
  `po --explain` tells you what got in, why, and what it costs before launch.
21
21
 
22
- It borrows its shape from [Doom Emacs Core](https://github.com/doomemacs/core): quick to
22
+ It borrows its shape from [Po Emacs Core](https://github.com/poemacs/core): quick to
23
23
  start, close to Pi, opinionated where defaults help, and easy to pull apart when they do
24
24
  not. Use it as-is, build your own config on top, or raid it for parts.
25
25
 
@@ -304,6 +304,9 @@ produce editable anchors for writable files while preserving native output for n
304
304
  [`@agimon-ai/po-edit`][pkg-po-edit] replaces Pi's search-and-replace `edit` tool with
305
305
  stale-safe ranges anchored to the file content the model read or searched.
306
306
  [`@agimon-ai/po-file-edit`][pkg-po-file-edit] keeps the edit timeline and file snapshots.
307
+ The fixed `@agimon-ai/po-artifact` package gives each session a durable artifact folder,
308
+ names it in the system prompt, and shows recent artifacts in web and native Activity.
309
+ The Artifacts heading opens all files in that session's folder as a grid.
307
310
  [`@agimon-ai/po-log`][pkg-po-log] collects session events, while
308
311
  [`@agimon-ai/po-telemetry`][pkg-po-telemetry] is the library-level telemetry adapter.
309
312
 
@@ -340,7 +343,7 @@ generated mode gets it. Short commands still return inline; commands that pass t
340
343
  threshold of 60 seconds by default move into the background with durable logs. Use
341
344
  `background: true` for an immediate detached run or `interactive: true` when the command needs
342
345
  terminal input. Runner IDs and complete raw logs remain available to the current session through
343
- the `doom-runner` CLI. Runner tries bundled RMUX, then `rmux` on PATH,
346
+ the `po-runner` CLI. Runner tries bundled RMUX, then `rmux` on PATH,
344
347
  then `tmux` on PATH. If no pane backend accepts the run, non-interactive commands use a supervised
345
348
  subprocess; interactive commands require RMUX or tmux. Conservatively recognized single commands
346
349
  use the matching RTK stdin filter after completion. Compound commands, pipelines, incompatible
@@ -660,7 +663,7 @@ its owning package's controls; values supplied by callers are not automatically
660
663
  | `po sync` | Publishes the current repository, or the global composition outside repositories |
661
664
  | `po sync --check` | Exits non-zero when the applicable registered generation is missing or stale |
662
665
  | `po compat <codex\|claude\|antigravity>` | Resolves the selected matrix and launches the compatibility adapter |
663
- | `doom-runner` | Inspects and controls supervised Runner processes and logs |
666
+ | `po-runner` | Inspects and controls supervised Runner processes and logs |
664
667
  | `--explain` | Prints the resolved matrix and estimated prompt cost without launching Pi |
665
668
  | `--emit-mcp <dir>`, `--no-mcp` | Writes the resolved MCP config or disables MCP for one run |
666
669
  | `--` and remaining arguments | Forwards provider or Pi arguments unchanged where the selected command allows it |
@@ -677,7 +680,7 @@ its owning package's controls; values supplied by callers are not automatically
677
680
  - Terminal leader menus, shortcuts, overlays, and widgets are no longer shipped. Native commands,
678
681
  tools, and web panels remain where the owning package provides them. RMUX and RTK artifacts are
679
682
  selected by Runner and should not be installed directly.
680
- - The root `doom-runner` command delegates to Runner from the active repository and asks you to add
683
+ - The root `po-runner` command delegates to Runner from the active repository and asks you to add
681
684
  Runner to `modes.yaml` when it is absent. The distribution remains the supported way to get the
682
685
  coordinated defaults.
683
686
  - The Ollama preset and launcher `--mute` and `--auto-stop` flags are retired. They do not have
@@ -1,2 +1 @@
1
- import { adaptAntigravityMcpDefinition, antigravityCompatibilityArgs, launchAntigravity } from "./src/cli/commands/compat/providers/antigravity.mjs";
2
- export { adaptAntigravityMcpDefinition, antigravityCompatibilityArgs, launchAntigravity };
1
+ export { adaptAntigravityMcpDefinition, antigravityCompatibilityArgs, launchAntigravity } from "./src/cli/commands/compat/providers/antigravity.mjs";
@@ -1,2 +1 @@
1
- import { BaseCommand } from "./src/cli/commands/baseCommand.mjs";
2
- export { BaseCommand };
1
+ export { BaseCommand } from "./src/cli/commands/baseCommand.mjs";
@@ -5,17 +5,17 @@ require("../src/bin/agentDirectory.cjs");
5
5
  let node_fs = require("node:fs");
6
6
  let node_url = require("node:url");
7
7
  let _agimon_ai_po_core_moduleResolution = require("@agimon-ai/po-core/moduleResolution");
8
- //#region src/bin/doomRunner.ts
8
+ //#region src/bin/poRunner.ts
9
9
  const RUNNER_CLI_EXPORT = "@agimon-ai/po-runner/bin/cli";
10
10
  async function main(argv = process.argv.slice(2)) {
11
11
  let repoRoot;
12
12
  try {
13
13
  repoRoot = require_index.findRepositoryRoot(process.cwd());
14
14
  } catch (error) {
15
- throw new Error("doom-runner must be invoked inside a configured repository.", { cause: error });
15
+ throw new Error("po-runner must be invoked inside a configured repository.", { cause: error });
16
16
  }
17
17
  const entry = (0, _agimon_ai_po_core_moduleResolution.consumerPackageEntry)(RUNNER_CLI_EXPORT, repoRoot);
18
- if (!entry) throw new Error("Doom Runner is not installed for this repository. Add @agimon-ai/po-runner to .po/modes.yaml and run po sync.");
18
+ if (!entry) throw new Error("Po Runner is not installed for this repository. Add @agimon-ai/po-runner to .po/modes.yaml and run po sync.");
19
19
  const loaded = await import((0, node_url.pathToFileURL)(entry).href);
20
20
  if (typeof loaded.main !== "function") throw new Error(`${RUNNER_CLI_EXPORT} does not export a callable main function.`);
21
21
  return loaded.main(argv);
@@ -24,10 +24,10 @@ if (process.argv[1] && (0, node_fs.existsSync)(process.argv[1]) && (0, node_fs.r
24
24
  process.exitCode = exitCode;
25
25
  }, (error) => {
26
26
  const message = error instanceof Error ? error.message : String(error);
27
- process.stderr.write(`[doom-runner] ${message}\n`);
27
+ process.stderr.write(`[po-runner] ${message}\n`);
28
28
  process.exitCode = 1;
29
29
  });
30
30
  //#endregion
31
31
  exports.main = main;
32
32
 
33
- //# sourceMappingURL=doomRunner.cjs.map
33
+ //# sourceMappingURL=poRunner.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poRunner.cjs","names":["findRepositoryRoot","consumerPackageEntry","pathToFileURL","existsSync","realpathSync","fileURLToPath"],"sources":["../../src/bin/poRunner.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * CLI Entry Point for po-runner\n *\n * The Runner package is selectable, so this compatibility executable resolves\n * it from the active repository instead of retaining it in Po's dependency\n * closure. The Runner package's own entry only self-invokes when it is argv[1],\n * which it is not once this shim imports it by absolute path.\n */\n\nimport './agentDirectory';\nimport { existsSync, realpathSync } from 'node:fs';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\n\nimport { consumerPackageEntry } from '@agimon-ai/po-core/moduleResolution';\n\nimport { findRepositoryRoot } from '../composition/repository';\n\nconst RUNNER_CLI_EXPORT = '@agimon-ai/po-runner/bin/cli';\n\ninterface RunnerCliModule {\n readonly main?: unknown;\n}\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n let repoRoot: string;\n try {\n repoRoot = findRepositoryRoot(process.cwd());\n } catch (error) {\n throw new Error('po-runner must be invoked inside a configured repository.', { cause: error });\n }\n const entry = consumerPackageEntry(RUNNER_CLI_EXPORT, repoRoot);\n if (!entry) {\n throw new Error(\n 'Po Runner is not installed for this repository. Add @agimon-ai/po-runner to .po/modes.yaml and run po sync.',\n );\n }\n const loaded = (await import(pathToFileURL(entry).href)) as RunnerCliModule;\n if (typeof loaded.main !== 'function') {\n throw new Error(`${RUNNER_CLI_EXPORT} does not export a callable main function.`);\n }\n return (loaded.main as (args: readonly string[]) => Promise<number>)(argv);\n}\n\nif (\n process.argv[1] &&\n existsSync(process.argv[1]) &&\n realpathSync(fileURLToPath(import.meta.url)) === realpathSync(process.argv[1])\n) {\n main().then(\n (exitCode) => {\n process.exitCode = exitCode;\n },\n (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(`[po-runner] ${message}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":";;;;;;;;AAmBA,MAAM,oBAAoB;AAM1B,eAAsB,KAAK,OAA0B,QAAQ,KAAK,MAAM,CAAC,GAAoB;CAC3F,IAAI;CACJ,IAAI;EACF,WAAWA,cAAAA,mBAAmB,QAAQ,IAAI,CAAC;CAC7C,SAAS,OAAO;EACd,MAAM,IAAI,MAAM,6DAA6D,EAAE,OAAO,MAAM,CAAC;CAC/F;CACA,MAAM,SAAA,GAAQC,oCAAAA,qBAAAA,CAAqB,mBAAmB,QAAQ;CAC9D,IAAI,CAAC,OACH,MAAM,IAAI,MACR,6GACF;CAEF,MAAM,SAAU,MAAM,QAAA,GAAOC,SAAAA,cAAAA,CAAc,KAAK,CAAC,CAAC;CAClD,IAAI,OAAO,OAAO,SAAS,YACzB,MAAM,IAAI,MAAM,GAAG,kBAAkB,2CAA2C;CAElF,OAAQ,OAAO,KAAsD,IAAI;AAC3E;AAEA,IACE,QAAQ,KAAK,OAAA,GACbC,QAAAA,WAAAA,CAAW,QAAQ,KAAK,EAAE,MAAA,GAC1BC,QAAAA,aAAAA,EAAAA,GAAaC,SAAAA,cAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,IAA6B,CAAC,OAAA,GAAMD,QAAAA,aAAAA,CAAa,QAAQ,KAAK,EAAE,GAE7E,KAAK,CAAC,CAAC,MACJ,aAAa;CACZ,QAAQ,WAAW;AACrB,IACC,UAAmB;CAClB,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;CACrE,QAAQ,OAAO,MAAM,eAAe,QAAQ,GAAG;CAC/C,QAAQ,WAAW;AACrB,CACF"}
@@ -1,4 +1,4 @@
1
- //#region src/bin/doomRunner.d.ts
1
+ //#region src/bin/poRunner.d.ts
2
2
  export declare function main(argv?: readonly string[]): Promise<number>;
3
3
  //#endregion
4
- //# sourceMappingURL=doomRunner.d.mts.map
4
+ //# sourceMappingURL=poRunner.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poRunner.d.mts","names":[],"sources":["../../src/bin/poRunner.ts"],"mappings":";wBAyBsB,KAAK,2BAAkD"}
@@ -4,17 +4,17 @@ import "../src/bin/agentDirectory.mjs";
4
4
  import { existsSync, realpathSync } from "node:fs";
5
5
  import { fileURLToPath, pathToFileURL } from "node:url";
6
6
  import { consumerPackageEntry } from "@agimon-ai/po-core/moduleResolution";
7
- //#region src/bin/doomRunner.ts
7
+ //#region src/bin/poRunner.ts
8
8
  const RUNNER_CLI_EXPORT = "@agimon-ai/po-runner/bin/cli";
9
9
  async function main(argv = process.argv.slice(2)) {
10
10
  let repoRoot;
11
11
  try {
12
12
  repoRoot = findRepositoryRoot(process.cwd());
13
13
  } catch (error) {
14
- throw new Error("doom-runner must be invoked inside a configured repository.", { cause: error });
14
+ throw new Error("po-runner must be invoked inside a configured repository.", { cause: error });
15
15
  }
16
16
  const entry = consumerPackageEntry(RUNNER_CLI_EXPORT, repoRoot);
17
- if (!entry) throw new Error("Doom Runner is not installed for this repository. Add @agimon-ai/po-runner to .po/modes.yaml and run po sync.");
17
+ if (!entry) throw new Error("Po Runner is not installed for this repository. Add @agimon-ai/po-runner to .po/modes.yaml and run po sync.");
18
18
  const loaded = await import(pathToFileURL(entry).href);
19
19
  if (typeof loaded.main !== "function") throw new Error(`${RUNNER_CLI_EXPORT} does not export a callable main function.`);
20
20
  return loaded.main(argv);
@@ -23,10 +23,10 @@ if (process.argv[1] && existsSync(process.argv[1]) && realpathSync(fileURLToPath
23
23
  process.exitCode = exitCode;
24
24
  }, (error) => {
25
25
  const message = error instanceof Error ? error.message : String(error);
26
- process.stderr.write(`[doom-runner] ${message}\n`);
26
+ process.stderr.write(`[po-runner] ${message}\n`);
27
27
  process.exitCode = 1;
28
28
  });
29
29
  //#endregion
30
30
  export { main };
31
31
 
32
- //# sourceMappingURL=doomRunner.mjs.map
32
+ //# sourceMappingURL=poRunner.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poRunner.mjs","names":[],"sources":["../../src/bin/poRunner.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * CLI Entry Point for po-runner\n *\n * The Runner package is selectable, so this compatibility executable resolves\n * it from the active repository instead of retaining it in Po's dependency\n * closure. The Runner package's own entry only self-invokes when it is argv[1],\n * which it is not once this shim imports it by absolute path.\n */\n\nimport './agentDirectory';\nimport { existsSync, realpathSync } from 'node:fs';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\n\nimport { consumerPackageEntry } from '@agimon-ai/po-core/moduleResolution';\n\nimport { findRepositoryRoot } from '../composition/repository';\n\nconst RUNNER_CLI_EXPORT = '@agimon-ai/po-runner/bin/cli';\n\ninterface RunnerCliModule {\n readonly main?: unknown;\n}\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n let repoRoot: string;\n try {\n repoRoot = findRepositoryRoot(process.cwd());\n } catch (error) {\n throw new Error('po-runner must be invoked inside a configured repository.', { cause: error });\n }\n const entry = consumerPackageEntry(RUNNER_CLI_EXPORT, repoRoot);\n if (!entry) {\n throw new Error(\n 'Po Runner is not installed for this repository. Add @agimon-ai/po-runner to .po/modes.yaml and run po sync.',\n );\n }\n const loaded = (await import(pathToFileURL(entry).href)) as RunnerCliModule;\n if (typeof loaded.main !== 'function') {\n throw new Error(`${RUNNER_CLI_EXPORT} does not export a callable main function.`);\n }\n return (loaded.main as (args: readonly string[]) => Promise<number>)(argv);\n}\n\nif (\n process.argv[1] &&\n existsSync(process.argv[1]) &&\n realpathSync(fileURLToPath(import.meta.url)) === realpathSync(process.argv[1])\n) {\n main().then(\n (exitCode) => {\n process.exitCode = exitCode;\n },\n (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(`[po-runner] ${message}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":";;;;;;;AAmBA,MAAM,oBAAoB;AAM1B,eAAsB,KAAK,OAA0B,QAAQ,KAAK,MAAM,CAAC,GAAoB;CAC3F,IAAI;CACJ,IAAI;EACF,WAAW,mBAAmB,QAAQ,IAAI,CAAC;CAC7C,SAAS,OAAO;EACd,MAAM,IAAI,MAAM,6DAA6D,EAAE,OAAO,MAAM,CAAC;CAC/F;CACA,MAAM,QAAQ,qBAAqB,mBAAmB,QAAQ;CAC9D,IAAI,CAAC,OACH,MAAM,IAAI,MACR,6GACF;CAEF,MAAM,SAAU,MAAM,OAAO,cAAc,KAAK,CAAC,CAAC;CAClD,IAAI,OAAO,OAAO,SAAS,YACzB,MAAM,IAAI,MAAM,GAAG,kBAAkB,2CAA2C;CAElF,OAAQ,OAAO,KAAsD,IAAI;AAC3E;AAEA,IACE,QAAQ,KAAK,MACb,WAAW,QAAQ,KAAK,EAAE,KAC1B,aAAa,cAAc,YAAY,GAAG,CAAC,MAAM,aAAa,QAAQ,KAAK,EAAE,GAE7E,KAAK,CAAC,CAAC,MACJ,aAAa;CACZ,QAAQ,WAAW;AACrB,IACC,UAAmB;CAClB,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;CACrE,QAAQ,OAAO,MAAM,eAAe,QAAQ,GAAG;CAC/C,QAAQ,WAAW;AACrB,CACF"}
@@ -15,6 +15,7 @@ const DEFAULT_SELECTION_LAYER = "default";
15
15
  const DEFAULT_SELECTION_LAYER_INDEX = -1;
16
16
  const FIXED_CORE_PACKAGES = /* @__PURE__ */ new Set([
17
17
  "@agimon-ai/po",
18
+ "@agimon-ai/po-artifact",
18
19
  "@agimon-ai/po-autostop",
19
20
  "@agimon-ai/po-cache",
20
21
  "@agimon-ai/po-config",
@@ -36,7 +37,8 @@ const CORE_PACKAGE_ENTRIES = [
36
37
  "@agimon-ai/po-profile/extensions/server",
37
38
  "@agimon-ai/po-major-mode/extensions/server",
38
39
  "@agimon-ai/po-skill/extensions/server",
39
- "@agimon-ai/po-domain/extensions/server"
40
+ "@agimon-ai/po-domain/extensions/server",
41
+ "@agimon-ai/po-artifact/extensions/server"
40
42
  ];
41
43
  const CACHE_PACKAGE_ENTRY = "@agimon-ai/po-cache/extensions/server";
42
44
  const SESSION_PACKAGE_ENTRY = "@agimon-ai/po-session/extensions/server";
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["fs","path","declaredServerFacetsOf","splitPackageSpecifier","consumerPackageEntry","localPackageExport","localPackageEntries","fileURLToPath","resolvePackageEntry","resolveOptionalPackageEntry","resolveLocalPackageName","canonicalModulePath","isLocalPackageSpecifier","sha256"],"sources":["../../../../src/builders/cli/extensionAssembler/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { isLocalPackageSpecifier, type LayerResolvers, type MajorModesConfig } from '@agimon-ai/po-config/majorModes';\nimport {\n consumerPackageEntry,\n localEntries,\n localEntry,\n localPackageEntries,\n localPackageExport,\n localPackageName as resolveLocalPackageName,\n optionalPackageEntry as resolveOptionalPackageEntry,\n packageEntry as resolvePackageEntry,\n splitPackageSpecifier,\n} from '@agimon-ai/po-core/moduleResolution';\nimport { canonicalModulePath, sha256 } from '@agimon-ai/po-core/runtimeIdentity';\nimport { declaredServerFacetsOf } from '@agimon-ai/po-core/serverFacet';\n\nimport { ownEntry } from '../entryResolution';\n\nexport interface ExtensionLayerResolvers extends LayerResolvers {\n /** Resolves a path authored under packages to its native discovery anchor. */\n localPackageEntries?: (specifier: string, baseDirectory: string) => string[] | undefined;\n /** Canonical manifest name for a path that represents a package directory. */\n localPackageName?: (specifier: string, baseDirectory: string) => string | undefined;\n}\n\nexport interface ExtensionContext {\n /** Named mode whose occurrence is part of composition identity. */\n majorMode?: string;\n /** Ordered layer occurrences selected by the active major mode. */\n layers: string[];\n majorModesConfig: MajorModesConfig;\n /** Resolver override used by synchronized replay. */\n resolvers?: ExtensionLayerResolvers;\n /**\n * Turns a configured package that does not resolve yet (not installed, or a local package\n * not built) into a missing selection with a diagnostic instead of an error, so a host that\n * only reads what sync prepared can still open. A fixed host package selected as a feature\n * still throws: that is a configuration error, not something sync can fix.\n */\n tolerateUnsynced?: boolean;\n}\n\nexport type SelectedEntryKind = 'extension' | 'package';\ntype ExtensionResolutionOutcome = 'resolved' | 'missing-optional';\n\n/**\n * One resolver-derived extension occurrence.\n *\n * This remains private to Po composition. It is not package metadata and\n * deliberately retains authored duplicates even though activation paths are\n * deduplicated later.\n */\ninterface ResolvedExtensionSelection {\n readonly layer: string;\n readonly layerIndex: number;\n readonly entryKind: SelectedEntryKind;\n readonly entryIndex: number;\n readonly manifestIndex: number;\n readonly selector: string;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n readonly optional: boolean;\n readonly outcome: ExtensionResolutionOutcome;\n readonly path?: string;\n readonly canonicalPath?: string;\n readonly diagnostic?: string;\n readonly config?: Record<string, unknown>;\n}\n\nexport interface CompositionLayerOccurrence {\n readonly name: string;\n readonly index: number;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n}\n\n/** Internal normalized composition shared by sync, bundles, and the session server. */\nexport interface ExtensionComposition {\n readonly majorMode?: {\n readonly name: string;\n readonly sourceFile?: string;\n readonly baseDirectory?: string;\n };\n readonly layers: readonly CompositionLayerOccurrence[];\n readonly selections: readonly ResolvedExtensionSelection[];\n /** Entries whose owning packages this composition selects, for native facet discovery. */\n readonly packageEntries: readonly string[];\n /** Stable identity of this composition, published as the session's composition fingerprint. */\n readonly fingerprint: string;\n}\n\nconst DEFAULT_SELECTION_LAYER = 'default';\nconst DEFAULT_SELECTION_LAYER_INDEX = -1;\n\nconst FIXED_CORE_PACKAGES = new Set([\n '@agimon-ai/po',\n '@agimon-ai/po-autostop',\n '@agimon-ai/po-cache',\n '@agimon-ai/po-config',\n '@agimon-ai/po-domain',\n '@agimon-ai/po-major-mode',\n '@agimon-ai/po-minor-mode',\n '@agimon-ai/po-notification',\n '@agimon-ai/po-profile',\n '@agimon-ai/po-session',\n '@agimon-ai/po-skill',\n '@agimon-ai/po-ui',\n]);\n\n/** Native server entries of the fixed host packages every composition selects. */\nconst CORE_PACKAGE_ENTRIES = [\n '@agimon-ai/po-minor-mode/extensions/server',\n '@agimon-ai/po-config/extensions/server',\n '@agimon-ai/po-ui/extensions/server',\n '@agimon-ai/po-notification/extensions/server',\n '@agimon-ai/po-profile/extensions/server',\n '@agimon-ai/po-major-mode/extensions/server',\n '@agimon-ai/po-skill/extensions/server',\n '@agimon-ai/po-domain/extensions/server',\n] as const;\nconst CACHE_PACKAGE_ENTRY = '@agimon-ai/po-cache/extensions/server';\nconst SESSION_PACKAGE_ENTRY = '@agimon-ai/po-session/extensions/server';\n/** Po's own server facet, resolved through the distribution like any own entry. */\nconst PO_SERVER_ENTRY = 'server';\n\n/** Manifest fields through which a selected package contributes to a Po host. */\nconst PO_FACET_FIELDS = ['poServer', 'poWeb', 'poMcp'] as const;\n\n/**\n * Resolves a selected package to its built server facet, or to its manifest as the\n * discovery anchor of a web or MCP only package. A package with no Po facet resolves empty.\n */\nfunction nativePackageEntries(manifestPath: string, resolveExport: () => string | undefined): string[] {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as Record<string, unknown>;\n const root = path.dirname(fs.realpathSync(manifestPath));\n const declaration = declaredServerFacetsOf(root, manifest)[0];\n if (!declaration) {\n return PO_FACET_FIELDS.some((field) => manifest[field] !== undefined) ? [path.join(root, 'package.json')] : [];\n }\n const exported = resolveExport();\n const dist = path.resolve(root, declaration.dist);\n if (!exported || !fs.existsSync(dist) || fs.realpathSync(exported) !== fs.realpathSync(dist)) {\n throw new Error(\n `Native package ${declaration.packageName} must export its built poServer dist as ./extensions/server.`,\n );\n }\n return [fs.realpathSync(dist)];\n}\n\n/** Resolves an installed package selection, or one explicit export subpath, from root. */\nfunction installedPackageEntries(\n specifier: string,\n root: string,\n environment: NodeJS.ProcessEnv = process.env,\n): string[] | undefined {\n if (splitPackageSpecifier(specifier).subpath !== '.') {\n const entry = consumerPackageEntry(specifier, root, environment);\n return entry ? [fs.realpathSync(entry)] : undefined;\n }\n const manifestPath = consumerPackageEntry(`${specifier}/package.json`, root, environment);\n return manifestPath\n ? nativePackageEntries(manifestPath, () =>\n consumerPackageEntry(`${specifier}/extensions/server`, root, environment),\n )\n : undefined;\n}\n\nfunction localSelectedPackageEntries(specifier: string, baseDirectory: string): string[] | undefined {\n const manifest = path.resolve(baseDirectory, specifier, 'package.json');\n return fs.existsSync(manifest)\n ? nativePackageEntries(manifest, () => localPackageExport(specifier, baseDirectory, './extensions/server'))\n : localPackageEntries(specifier, baseDirectory);\n}\n\nconst HOST_DIRECTORY = path.dirname(fileURLToPath(import.meta.url));\n\nexport const LAYER_RESOLVERS: ExtensionLayerResolvers = {\n ownEntry,\n packageEntry: (specifier) => resolvePackageEntry(specifier, import.meta.url),\n optionalPackageEntry: (specifier) => resolveOptionalPackageEntry(specifier, import.meta.url),\n packageEntries: (specifier) => {\n const entries = installedPackageEntries(specifier, HOST_DIRECTORY);\n if (!entries) throw new Error(`Cannot resolve package ${specifier}.`);\n return entries;\n },\n optionalPackageEntries: (specifier) => installedPackageEntries(specifier, HOST_DIRECTORY),\n localEntry,\n localEntries,\n localPackageEntries: localSelectedPackageEntries,\n localPackageName: resolveLocalPackageName,\n};\n\nfunction missingConsumerPackage(name: string, consumerRoot: string): Error {\n return new Error(`Cannot resolve configured package \"${name}\" from ${consumerRoot}.`);\n}\n\n/**\n * Resolves configured packages only from the consumer, while fixed core entries\n * may fall back to the host package's private dependency closure. `environment` names\n * the Po home whose shared runtime answers after the consumer's own tree.\n */\nexport function createLayerResolvers(\n consumerRoot?: string,\n environment: NodeJS.ProcessEnv = process.env,\n): ExtensionLayerResolvers {\n if (!consumerRoot) return LAYER_RESOLVERS;\n // Fixed host packages must match the executable, even when home contains an older installation.\n const fallbackEntry = (name: string): string | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntry(name, import.meta.url) : undefined;\n const requiredEntry = (name: string): string => {\n const entry = fallbackEntry(name) ?? consumerPackageEntry(name, consumerRoot, environment);\n if (!entry) throw missingConsumerPackage(name, consumerRoot);\n return entry;\n };\n const requiredEntries = (name: string): string[] => {\n const entries = installedPackageEntries(name, consumerRoot, environment);\n if (!entries) throw missingConsumerPackage(name, consumerRoot);\n return entries;\n };\n return {\n ownEntry,\n packageEntry: requiredEntry,\n optionalPackageEntry: (name) => fallbackEntry(name) ?? consumerPackageEntry(name, consumerRoot, environment),\n packageEntries: requiredEntries,\n optionalPackageEntries: (name) => installedPackageEntries(name, consumerRoot, environment),\n localEntry,\n localEntries,\n localPackageEntries: localSelectedPackageEntries,\n localPackageName: resolveLocalPackageName,\n };\n}\n\nfunction packageName(specifier: string): string {\n const segments = specifier.split('/');\n return specifier.startsWith('@') ? segments.slice(0, 2).join('/') : (segments[0] ?? specifier);\n}\n\n/** A fixed host package selected as a feature: a configuration error that tolerance never hides. */\nclass FixedPackageSelectionError extends Error {}\n\nfunction assertFeaturePackage(specifier: string, layer: string): void {\n const selectedPackage = packageName(specifier);\n if (FIXED_CORE_PACKAGES.has(selectedPackage)) {\n throw new FixedPackageSelectionError(\n `Layer \"${layer}\" cannot select fixed Po host package \"${selectedPackage}\" as a feature extension.`,\n );\n }\n}\n\nfunction resolveLocalExtensionEntries(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n const single = resolvers.localEntry(specifier, baseDirectory);\n return single ? [single] : undefined;\n}\n\nfunction resolveLocalPackageSelections(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localPackageEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n return resolveLocalExtensionEntries(resolvers, specifier, baseDirectory);\n}\n\ninterface SelectionIdentity {\n layer: string;\n layerIndex: number;\n entryKind: SelectedEntryKind;\n entryIndex: number;\n selector: string;\n sourceFile?: string;\n baseDirectory: string;\n optional: boolean;\n config?: Record<string, unknown>;\n}\n\nfunction resolvedSelection(\n identity: SelectionIdentity,\n manifestIndex: number,\n resolvedPath: string,\n): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex,\n outcome: 'resolved',\n path: resolvedPath,\n canonicalPath: canonicalModulePath(resolvedPath),\n };\n}\n\nfunction missingOptionalSelection(identity: SelectionIdentity, diagnostic: string): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex: 0,\n outcome: 'missing-optional',\n diagnostic,\n };\n}\n\n/**\n * The selectors a tolerant composition left out because they do not resolve yet: the missing\n * selections of entries that are not optional, each once, in composition order.\n */\nexport function unsyncedSelectors(compositions: readonly ExtensionComposition[]): string[] {\n return [\n ...new Set(\n compositions.flatMap((composition) =>\n composition.selections\n .filter((selection) => selection.outcome === 'missing-optional' && !selection.optional)\n .map((selection) => selection.selector),\n ),\n ),\n ];\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction resolveDefinitionSelections(\n definition: MajorModesConfig['layers'][string],\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced = false,\n): ResolvedExtensionSelection[] {\n const resolvedSelections: ResolvedExtensionSelection[] = [];\n const extensionEntries = definition.extensions ?? [];\n for (const [entryIndex, selector] of extensionEntries.entries()) {\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'extension',\n entryIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional: false,\n };\n if (!isLocalPackageSpecifier(selector)) {\n resolvedSelections.push(resolvedSelection(identity, 0, resolvers.ownEntry(selector)));\n continue;\n }\n const resolved = resolveLocalExtensionEntries(resolvers, selector, definition.baseDirectory);\n if (!resolved?.length) {\n throw new Error(\n `Layer \"${layer}\" extension \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at a Pi extension file or directory.',\n );\n }\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n const packageOffset = extensionEntries.length;\n for (const [packageIndex, configured] of (definition.packages ?? []).entries()) {\n const selector = typeof configured === 'string' ? configured : configured.name;\n const optional = typeof configured === 'string' ? false : configured.optional === true;\n const configValue = typeof configured === 'string' ? undefined : configured.config;\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'package',\n entryIndex: packageOffset + packageIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional,\n ...(configValue === undefined ? {} : { config: configValue }),\n };\n\n let resolved: string[] | undefined;\n try {\n if (isLocalPackageSpecifier(selector)) {\n const manifestName = resolvers.localPackageName?.(selector, definition.baseDirectory);\n if (manifestName) assertFeaturePackage(manifestName, layer);\n resolved = resolveLocalPackageSelections(resolvers, selector, definition.baseDirectory);\n } else {\n assertFeaturePackage(selector, layer);\n if (optional) {\n resolved = resolvers.optionalPackageEntries?.(selector);\n if (resolved === undefined && !resolvers.optionalPackageEntries) {\n const single = resolvers.optionalPackageEntry(selector);\n resolved = single ? [single] : undefined;\n }\n } else {\n resolved = resolvers.packageEntries?.(selector) ?? [resolvers.packageEntry(selector)];\n }\n }\n } catch (error) {\n if (optional || (tolerateUnsynced && !(error instanceof FixedPackageSelectionError))) {\n resolvedSelections.push(missingOptionalSelection(identity, errorMessage(error)));\n continue;\n }\n throw error;\n }\n\n if (!resolved?.length && tolerateUnsynced && !optional) {\n resolvedSelections.push(\n missingOptionalSelection(\n identity,\n `Package \"${selector}\" is not synced yet: it resolves to no Po server, web or MCP facet.`,\n ),\n );\n continue;\n }\n if (!resolved?.length) {\n if (optional) {\n resolvedSelections.push(\n missingOptionalSelection(\n identity,\n `Optional package \"${selector}\" is unavailable or declares no Po server, web or MCP facet.`,\n ),\n );\n continue;\n }\n if (isLocalPackageSpecifier(selector)) {\n throw new Error(\n `Layer \"${layer}\" package \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at an extension file, or a package directory whose package.json declares a Po facet.',\n );\n }\n throw new Error(`Layer \"${layer}\" package \"${selector}\" declares no Po server, web or MCP facet.`);\n }\n\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n return resolvedSelections;\n}\n\nfunction resolveLayerSelections(\n config: MajorModesConfig,\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced: boolean,\n): ResolvedExtensionSelection[] {\n const definition = config.layers[layer];\n if (!definition) throw new Error(`Unknown layer: ${layer}`);\n return resolveDefinitionSelections(definition, layer, layerIndex, resolvers, tolerateUnsynced);\n}\n\nfunction resolveDefaultSelections(\n config: MajorModesConfig,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced: boolean,\n): ResolvedExtensionSelection[] {\n if (!config.default) return [];\n return resolveDefinitionSelections(\n config.default,\n DEFAULT_SELECTION_LAYER,\n DEFAULT_SELECTION_LAYER_INDEX,\n resolvers,\n tolerateUnsynced,\n );\n}\n\nfunction resolveSelectedExtensions(context: ExtensionContext): ResolvedExtensionSelection[] {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n return context.layers.flatMap((layer, layerIndex) =>\n resolveLayerSelections(context.majorModesConfig, layer, layerIndex, resolvers, context.tolerateUnsynced === true),\n );\n}\n\nfunction deduplicatePaths(paths: readonly string[]): string[] {\n const seen = new Set<string>();\n const selected: string[] = [];\n for (const entry of paths) {\n const identity = canonicalModulePath(entry);\n if (seen.has(identity)) continue;\n seen.add(identity);\n selected.push(entry);\n }\n return selected;\n}\n\nfunction selectedFeaturePaths(selections: readonly ResolvedExtensionSelection[]): string[] {\n return deduplicatePaths(\n selections.flatMap((entry) => (entry.outcome === 'resolved' && entry.path ? [entry.path] : [])),\n );\n}\n\n/** Package anchors in the order the previous host activated them, so discovery order holds. */\nfunction selectedPackageEntries(\n resolve: ExtensionLayerResolvers,\n distributionPaths: readonly string[],\n featurePaths: readonly string[],\n): string[] {\n return deduplicatePaths([\n resolve.ownEntry(PO_SERVER_ENTRY),\n ...CORE_PACKAGE_ENTRIES.map((entry) => resolve.packageEntry(entry)),\n ...distributionPaths,\n ...featurePaths,\n resolve.packageEntry(CACHE_PACKAGE_ENTRY),\n resolve.packageEntry(SESSION_PACKAGE_ENTRY),\n ]);\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalValue);\n if (value === null || typeof value !== 'object') return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, canonicalValue(entry)]),\n );\n}\n\n/** Resolve one deterministic composition from authored layer occurrences. */\nexport function resolveExtensionComposition(context: ExtensionContext): ExtensionComposition {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n const defaultSelections = resolveDefaultSelections(\n context.majorModesConfig,\n resolvers,\n context.tolerateUnsynced === true,\n );\n const layerSelections = resolveSelectedExtensions(context);\n const selections = [...defaultSelections, ...layerSelections];\n const distributionPaths = selectedFeaturePaths(defaultSelections);\n const featurePaths = selectedFeaturePaths(layerSelections);\n const layers = context.layers.map((name, index): CompositionLayerOccurrence => {\n const definition = context.majorModesConfig.layers[name];\n if (!definition) throw new Error(`Unknown layer: ${name}`);\n return {\n name,\n index,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n };\n });\n const modeSource = context.majorMode ? context.majorModesConfig.majorModeSources?.[context.majorMode] : undefined;\n const composition = {\n ...(context.majorMode\n ? {\n majorMode: {\n name: context.majorMode,\n ...(modeSource?.filePath ? { sourceFile: modeSource.filePath } : {}),\n ...(modeSource?.baseDirectory ? { baseDirectory: modeSource.baseDirectory } : {}),\n },\n }\n : {}),\n layers,\n selections,\n packageEntries: selectedPackageEntries(resolvers, distributionPaths, featurePaths),\n };\n // Keys the prompt-cache namespace, so a different selection never shares cached prefixes.\n return {\n ...composition,\n fingerprint: sha256(\n JSON.stringify(\n canonicalValue({ ...composition, canonicalEntries: composition.packageEntries.map(canonicalModulePath) }),\n ),\n ),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["fs","path","declaredServerFacetsOf","splitPackageSpecifier","consumerPackageEntry","localPackageExport","localPackageEntries","fileURLToPath","resolvePackageEntry","resolveOptionalPackageEntry","resolveLocalPackageName","canonicalModulePath","isLocalPackageSpecifier","sha256"],"sources":["../../../../src/builders/cli/extensionAssembler/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { isLocalPackageSpecifier, type LayerResolvers, type MajorModesConfig } from '@agimon-ai/po-config/majorModes';\nimport {\n consumerPackageEntry,\n localEntries,\n localEntry,\n localPackageEntries,\n localPackageExport,\n localPackageName as resolveLocalPackageName,\n optionalPackageEntry as resolveOptionalPackageEntry,\n packageEntry as resolvePackageEntry,\n splitPackageSpecifier,\n} from '@agimon-ai/po-core/moduleResolution';\nimport { canonicalModulePath, sha256 } from '@agimon-ai/po-core/runtimeIdentity';\nimport { declaredServerFacetsOf } from '@agimon-ai/po-core/serverFacet';\n\nimport { ownEntry } from '../entryResolution';\n\nexport interface ExtensionLayerResolvers extends LayerResolvers {\n /** Resolves a path authored under packages to its native discovery anchor. */\n localPackageEntries?: (specifier: string, baseDirectory: string) => string[] | undefined;\n /** Canonical manifest name for a path that represents a package directory. */\n localPackageName?: (specifier: string, baseDirectory: string) => string | undefined;\n}\n\nexport interface ExtensionContext {\n /** Named mode whose occurrence is part of composition identity. */\n majorMode?: string;\n /** Ordered layer occurrences selected by the active major mode. */\n layers: string[];\n majorModesConfig: MajorModesConfig;\n /** Resolver override used by synchronized replay. */\n resolvers?: ExtensionLayerResolvers;\n /**\n * Turns a configured package that does not resolve yet (not installed, or a local package\n * not built) into a missing selection with a diagnostic instead of an error, so a host that\n * only reads what sync prepared can still open. A fixed host package selected as a feature\n * still throws: that is a configuration error, not something sync can fix.\n */\n tolerateUnsynced?: boolean;\n}\n\nexport type SelectedEntryKind = 'extension' | 'package';\ntype ExtensionResolutionOutcome = 'resolved' | 'missing-optional';\n\n/**\n * One resolver-derived extension occurrence.\n *\n * This remains private to Po composition. It is not package metadata and\n * deliberately retains authored duplicates even though activation paths are\n * deduplicated later.\n */\ninterface ResolvedExtensionSelection {\n readonly layer: string;\n readonly layerIndex: number;\n readonly entryKind: SelectedEntryKind;\n readonly entryIndex: number;\n readonly manifestIndex: number;\n readonly selector: string;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n readonly optional: boolean;\n readonly outcome: ExtensionResolutionOutcome;\n readonly path?: string;\n readonly canonicalPath?: string;\n readonly diagnostic?: string;\n readonly config?: Record<string, unknown>;\n}\n\nexport interface CompositionLayerOccurrence {\n readonly name: string;\n readonly index: number;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n}\n\n/** Internal normalized composition shared by sync, bundles, and the session server. */\nexport interface ExtensionComposition {\n readonly majorMode?: {\n readonly name: string;\n readonly sourceFile?: string;\n readonly baseDirectory?: string;\n };\n readonly layers: readonly CompositionLayerOccurrence[];\n readonly selections: readonly ResolvedExtensionSelection[];\n /** Entries whose owning packages this composition selects, for native facet discovery. */\n readonly packageEntries: readonly string[];\n /** Stable identity of this composition, published as the session's composition fingerprint. */\n readonly fingerprint: string;\n}\n\nconst DEFAULT_SELECTION_LAYER = 'default';\nconst DEFAULT_SELECTION_LAYER_INDEX = -1;\n\nconst FIXED_CORE_PACKAGES = new Set([\n '@agimon-ai/po',\n '@agimon-ai/po-artifact',\n '@agimon-ai/po-autostop',\n '@agimon-ai/po-cache',\n '@agimon-ai/po-config',\n '@agimon-ai/po-domain',\n '@agimon-ai/po-major-mode',\n '@agimon-ai/po-minor-mode',\n '@agimon-ai/po-notification',\n '@agimon-ai/po-profile',\n '@agimon-ai/po-session',\n '@agimon-ai/po-skill',\n '@agimon-ai/po-ui',\n]);\n\n/** Native server entries of the fixed host packages every composition selects. */\nconst CORE_PACKAGE_ENTRIES = [\n '@agimon-ai/po-minor-mode/extensions/server',\n '@agimon-ai/po-config/extensions/server',\n '@agimon-ai/po-ui/extensions/server',\n '@agimon-ai/po-notification/extensions/server',\n '@agimon-ai/po-profile/extensions/server',\n '@agimon-ai/po-major-mode/extensions/server',\n '@agimon-ai/po-skill/extensions/server',\n '@agimon-ai/po-domain/extensions/server',\n '@agimon-ai/po-artifact/extensions/server',\n] as const;\nconst CACHE_PACKAGE_ENTRY = '@agimon-ai/po-cache/extensions/server';\nconst SESSION_PACKAGE_ENTRY = '@agimon-ai/po-session/extensions/server';\n/** Po's own server facet, resolved through the distribution like any own entry. */\nconst PO_SERVER_ENTRY = 'server';\n\n/** Manifest fields through which a selected package contributes to a Po host. */\nconst PO_FACET_FIELDS = ['poServer', 'poWeb', 'poMcp'] as const;\n\n/**\n * Resolves a selected package to its built server facet, or to its manifest as the\n * discovery anchor of a web or MCP only package. A package with no Po facet resolves empty.\n */\nfunction nativePackageEntries(manifestPath: string, resolveExport: () => string | undefined): string[] {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as Record<string, unknown>;\n const root = path.dirname(fs.realpathSync(manifestPath));\n const declaration = declaredServerFacetsOf(root, manifest)[0];\n if (!declaration) {\n return PO_FACET_FIELDS.some((field) => manifest[field] !== undefined) ? [path.join(root, 'package.json')] : [];\n }\n const exported = resolveExport();\n const dist = path.resolve(root, declaration.dist);\n if (!exported || !fs.existsSync(dist) || fs.realpathSync(exported) !== fs.realpathSync(dist)) {\n throw new Error(\n `Native package ${declaration.packageName} must export its built poServer dist as ./extensions/server.`,\n );\n }\n return [fs.realpathSync(dist)];\n}\n\n/** Resolves an installed package selection, or one explicit export subpath, from root. */\nfunction installedPackageEntries(\n specifier: string,\n root: string,\n environment: NodeJS.ProcessEnv = process.env,\n): string[] | undefined {\n if (splitPackageSpecifier(specifier).subpath !== '.') {\n const entry = consumerPackageEntry(specifier, root, environment);\n return entry ? [fs.realpathSync(entry)] : undefined;\n }\n const manifestPath = consumerPackageEntry(`${specifier}/package.json`, root, environment);\n return manifestPath\n ? nativePackageEntries(manifestPath, () =>\n consumerPackageEntry(`${specifier}/extensions/server`, root, environment),\n )\n : undefined;\n}\n\nfunction localSelectedPackageEntries(specifier: string, baseDirectory: string): string[] | undefined {\n const manifest = path.resolve(baseDirectory, specifier, 'package.json');\n return fs.existsSync(manifest)\n ? nativePackageEntries(manifest, () => localPackageExport(specifier, baseDirectory, './extensions/server'))\n : localPackageEntries(specifier, baseDirectory);\n}\n\nconst HOST_DIRECTORY = path.dirname(fileURLToPath(import.meta.url));\n\nexport const LAYER_RESOLVERS: ExtensionLayerResolvers = {\n ownEntry,\n packageEntry: (specifier) => resolvePackageEntry(specifier, import.meta.url),\n optionalPackageEntry: (specifier) => resolveOptionalPackageEntry(specifier, import.meta.url),\n packageEntries: (specifier) => {\n const entries = installedPackageEntries(specifier, HOST_DIRECTORY);\n if (!entries) throw new Error(`Cannot resolve package ${specifier}.`);\n return entries;\n },\n optionalPackageEntries: (specifier) => installedPackageEntries(specifier, HOST_DIRECTORY),\n localEntry,\n localEntries,\n localPackageEntries: localSelectedPackageEntries,\n localPackageName: resolveLocalPackageName,\n};\n\nfunction missingConsumerPackage(name: string, consumerRoot: string): Error {\n return new Error(`Cannot resolve configured package \"${name}\" from ${consumerRoot}.`);\n}\n\n/**\n * Resolves configured packages only from the consumer, while fixed core entries\n * may fall back to the host package's private dependency closure. `environment` names\n * the Po home whose shared runtime answers after the consumer's own tree.\n */\nexport function createLayerResolvers(\n consumerRoot?: string,\n environment: NodeJS.ProcessEnv = process.env,\n): ExtensionLayerResolvers {\n if (!consumerRoot) return LAYER_RESOLVERS;\n // Fixed host packages must match the executable, even when home contains an older installation.\n const fallbackEntry = (name: string): string | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntry(name, import.meta.url) : undefined;\n const requiredEntry = (name: string): string => {\n const entry = fallbackEntry(name) ?? consumerPackageEntry(name, consumerRoot, environment);\n if (!entry) throw missingConsumerPackage(name, consumerRoot);\n return entry;\n };\n const requiredEntries = (name: string): string[] => {\n const entries = installedPackageEntries(name, consumerRoot, environment);\n if (!entries) throw missingConsumerPackage(name, consumerRoot);\n return entries;\n };\n return {\n ownEntry,\n packageEntry: requiredEntry,\n optionalPackageEntry: (name) => fallbackEntry(name) ?? consumerPackageEntry(name, consumerRoot, environment),\n packageEntries: requiredEntries,\n optionalPackageEntries: (name) => installedPackageEntries(name, consumerRoot, environment),\n localEntry,\n localEntries,\n localPackageEntries: localSelectedPackageEntries,\n localPackageName: resolveLocalPackageName,\n };\n}\n\nfunction packageName(specifier: string): string {\n const segments = specifier.split('/');\n return specifier.startsWith('@') ? segments.slice(0, 2).join('/') : (segments[0] ?? specifier);\n}\n\n/** A fixed host package selected as a feature: a configuration error that tolerance never hides. */\nclass FixedPackageSelectionError extends Error {}\n\nfunction assertFeaturePackage(specifier: string, layer: string): void {\n const selectedPackage = packageName(specifier);\n if (FIXED_CORE_PACKAGES.has(selectedPackage)) {\n throw new FixedPackageSelectionError(\n `Layer \"${layer}\" cannot select fixed Po host package \"${selectedPackage}\" as a feature extension.`,\n );\n }\n}\n\nfunction resolveLocalExtensionEntries(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n const single = resolvers.localEntry(specifier, baseDirectory);\n return single ? [single] : undefined;\n}\n\nfunction resolveLocalPackageSelections(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localPackageEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n return resolveLocalExtensionEntries(resolvers, specifier, baseDirectory);\n}\n\ninterface SelectionIdentity {\n layer: string;\n layerIndex: number;\n entryKind: SelectedEntryKind;\n entryIndex: number;\n selector: string;\n sourceFile?: string;\n baseDirectory: string;\n optional: boolean;\n config?: Record<string, unknown>;\n}\n\nfunction resolvedSelection(\n identity: SelectionIdentity,\n manifestIndex: number,\n resolvedPath: string,\n): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex,\n outcome: 'resolved',\n path: resolvedPath,\n canonicalPath: canonicalModulePath(resolvedPath),\n };\n}\n\nfunction missingOptionalSelection(identity: SelectionIdentity, diagnostic: string): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex: 0,\n outcome: 'missing-optional',\n diagnostic,\n };\n}\n\n/**\n * The selectors a tolerant composition left out because they do not resolve yet: the missing\n * selections of entries that are not optional, each once, in composition order.\n */\nexport function unsyncedSelectors(compositions: readonly ExtensionComposition[]): string[] {\n return [\n ...new Set(\n compositions.flatMap((composition) =>\n composition.selections\n .filter((selection) => selection.outcome === 'missing-optional' && !selection.optional)\n .map((selection) => selection.selector),\n ),\n ),\n ];\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction resolveDefinitionSelections(\n definition: MajorModesConfig['layers'][string],\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced = false,\n): ResolvedExtensionSelection[] {\n const resolvedSelections: ResolvedExtensionSelection[] = [];\n const extensionEntries = definition.extensions ?? [];\n for (const [entryIndex, selector] of extensionEntries.entries()) {\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'extension',\n entryIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional: false,\n };\n if (!isLocalPackageSpecifier(selector)) {\n resolvedSelections.push(resolvedSelection(identity, 0, resolvers.ownEntry(selector)));\n continue;\n }\n const resolved = resolveLocalExtensionEntries(resolvers, selector, definition.baseDirectory);\n if (!resolved?.length) {\n throw new Error(\n `Layer \"${layer}\" extension \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at a Pi extension file or directory.',\n );\n }\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n const packageOffset = extensionEntries.length;\n for (const [packageIndex, configured] of (definition.packages ?? []).entries()) {\n const selector = typeof configured === 'string' ? configured : configured.name;\n const optional = typeof configured === 'string' ? false : configured.optional === true;\n const configValue = typeof configured === 'string' ? undefined : configured.config;\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'package',\n entryIndex: packageOffset + packageIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional,\n ...(configValue === undefined ? {} : { config: configValue }),\n };\n\n let resolved: string[] | undefined;\n try {\n if (isLocalPackageSpecifier(selector)) {\n const manifestName = resolvers.localPackageName?.(selector, definition.baseDirectory);\n if (manifestName) assertFeaturePackage(manifestName, layer);\n resolved = resolveLocalPackageSelections(resolvers, selector, definition.baseDirectory);\n } else {\n assertFeaturePackage(selector, layer);\n if (optional) {\n resolved = resolvers.optionalPackageEntries?.(selector);\n if (resolved === undefined && !resolvers.optionalPackageEntries) {\n const single = resolvers.optionalPackageEntry(selector);\n resolved = single ? [single] : undefined;\n }\n } else {\n resolved = resolvers.packageEntries?.(selector) ?? [resolvers.packageEntry(selector)];\n }\n }\n } catch (error) {\n if (optional || (tolerateUnsynced && !(error instanceof FixedPackageSelectionError))) {\n resolvedSelections.push(missingOptionalSelection(identity, errorMessage(error)));\n continue;\n }\n throw error;\n }\n\n if (!resolved?.length && tolerateUnsynced && !optional) {\n resolvedSelections.push(\n missingOptionalSelection(\n identity,\n `Package \"${selector}\" is not synced yet: it resolves to no Po server, web or MCP facet.`,\n ),\n );\n continue;\n }\n if (!resolved?.length) {\n if (optional) {\n resolvedSelections.push(\n missingOptionalSelection(\n identity,\n `Optional package \"${selector}\" is unavailable or declares no Po server, web or MCP facet.`,\n ),\n );\n continue;\n }\n if (isLocalPackageSpecifier(selector)) {\n throw new Error(\n `Layer \"${layer}\" package \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at an extension file, or a package directory whose package.json declares a Po facet.',\n );\n }\n throw new Error(`Layer \"${layer}\" package \"${selector}\" declares no Po server, web or MCP facet.`);\n }\n\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n return resolvedSelections;\n}\n\nfunction resolveLayerSelections(\n config: MajorModesConfig,\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced: boolean,\n): ResolvedExtensionSelection[] {\n const definition = config.layers[layer];\n if (!definition) throw new Error(`Unknown layer: ${layer}`);\n return resolveDefinitionSelections(definition, layer, layerIndex, resolvers, tolerateUnsynced);\n}\n\nfunction resolveDefaultSelections(\n config: MajorModesConfig,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced: boolean,\n): ResolvedExtensionSelection[] {\n if (!config.default) return [];\n return resolveDefinitionSelections(\n config.default,\n DEFAULT_SELECTION_LAYER,\n DEFAULT_SELECTION_LAYER_INDEX,\n resolvers,\n tolerateUnsynced,\n );\n}\n\nfunction resolveSelectedExtensions(context: ExtensionContext): ResolvedExtensionSelection[] {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n return context.layers.flatMap((layer, layerIndex) =>\n resolveLayerSelections(context.majorModesConfig, layer, layerIndex, resolvers, context.tolerateUnsynced === true),\n );\n}\n\nfunction deduplicatePaths(paths: readonly string[]): string[] {\n const seen = new Set<string>();\n const selected: string[] = [];\n for (const entry of paths) {\n const identity = canonicalModulePath(entry);\n if (seen.has(identity)) continue;\n seen.add(identity);\n selected.push(entry);\n }\n return selected;\n}\n\nfunction selectedFeaturePaths(selections: readonly ResolvedExtensionSelection[]): string[] {\n return deduplicatePaths(\n selections.flatMap((entry) => (entry.outcome === 'resolved' && entry.path ? [entry.path] : [])),\n );\n}\n\n/** Package anchors in the order the previous host activated them, so discovery order holds. */\nfunction selectedPackageEntries(\n resolve: ExtensionLayerResolvers,\n distributionPaths: readonly string[],\n featurePaths: readonly string[],\n): string[] {\n return deduplicatePaths([\n resolve.ownEntry(PO_SERVER_ENTRY),\n ...CORE_PACKAGE_ENTRIES.map((entry) => resolve.packageEntry(entry)),\n ...distributionPaths,\n ...featurePaths,\n resolve.packageEntry(CACHE_PACKAGE_ENTRY),\n resolve.packageEntry(SESSION_PACKAGE_ENTRY),\n ]);\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalValue);\n if (value === null || typeof value !== 'object') return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, canonicalValue(entry)]),\n );\n}\n\n/** Resolve one deterministic composition from authored layer occurrences. */\nexport function resolveExtensionComposition(context: ExtensionContext): ExtensionComposition {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n const defaultSelections = resolveDefaultSelections(\n context.majorModesConfig,\n resolvers,\n context.tolerateUnsynced === true,\n );\n const layerSelections = resolveSelectedExtensions(context);\n const selections = [...defaultSelections, ...layerSelections];\n const distributionPaths = selectedFeaturePaths(defaultSelections);\n const featurePaths = selectedFeaturePaths(layerSelections);\n const layers = context.layers.map((name, index): CompositionLayerOccurrence => {\n const definition = context.majorModesConfig.layers[name];\n if (!definition) throw new Error(`Unknown layer: ${name}`);\n return {\n name,\n index,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n };\n });\n const modeSource = context.majorMode ? context.majorModesConfig.majorModeSources?.[context.majorMode] : undefined;\n const composition = {\n ...(context.majorMode\n ? {\n majorMode: {\n name: context.majorMode,\n ...(modeSource?.filePath ? { sourceFile: modeSource.filePath } : {}),\n ...(modeSource?.baseDirectory ? { baseDirectory: modeSource.baseDirectory } : {}),\n },\n }\n : {}),\n layers,\n selections,\n packageEntries: selectedPackageEntries(resolvers, distributionPaths, featurePaths),\n };\n // Keys the prompt-cache namespace, so a different selection never shares cached prefixes.\n return {\n ...composition,\n fingerprint: sha256(\n JSON.stringify(\n canonicalValue({ ...composition, canonicalEntries: composition.packageEntries.map(canonicalModulePath) }),\n ),\n ),\n };\n}\n"],"mappings":"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"}
@@ -82,4 +82,5 @@ export declare function unsyncedSelectors(compositions: readonly ExtensionCompos
82
82
  /** Resolve one deterministic composition from authored layer occurrences. */
83
83
  export declare function resolveExtensionComposition(context: ExtensionContext): ExtensionComposition;
84
84
  //#endregion
85
+ export {};
85
86
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/builders/cli/extensionAssembler/index.ts"],"mappings":";;iBAqBiB,gCAAgC;;EAE/C,uBAAuB,mBAAmB;;EAE1C,oBAAoB,mBAAmB;;iBAGxB;;EAEf;;EAEA;EACA,kBAAkB;;EAElB,YAAY;;;;;;;EAOZ;;YAGU;KACP;;;;;;;;UASK;WACC;WACA;WACA,WAAW;WACX;WACA;WACA;WACA;WACA;WACA;WACA,SAAS;WACT;WACA;WACA;WACA,SAAS;;iBAGH;WACN;WACA;WACA;WACA;;;iBAIM;WACN;aACE;aACA;aACA;;WAEF,iBAAiB;WACjB,qBAAqB;;WAErB;;WAEA;;qBAwFE,iBAAiB;;;;;;wBAyBd,qBACd,uBACA,cAAa,OAAO,aACnB;;;;;wBAyGa,kBAAkB,uBAAuB;;wBAmNzC,4BAA4B,SAAS,mBAAmB"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/builders/cli/extensionAssembler/index.ts"],"mappings":";;iBAqBiB,gCAAgC;;EAE/C,uBAAuB,mBAAmB;;EAE1C,oBAAoB,mBAAmB;;iBAGxB;;EAEf;;EAEA;EACA,kBAAkB;;EAElB,YAAY;;;;;;;EAOZ;;YAGU;KACP;;;;;;;;UASK;WACC;WACA;WACA,WAAW;WACX;WACA;WACA;WACA;WACA;WACA;WACA,SAAS;WACT;WACA;WACA;WACA,SAAS;;iBAGH;WACN;WACA;WACA;WACA;;;iBAIM;WACN;aACE;aACA;aACA;;WAEF,iBAAiB;WACjB,qBAAqB;;WAErB;;WAEA;;qBA0FE,iBAAiB;;;;;;wBAyBd,qBACd,uBACA,cAAa,OAAO,aACnB;;;;;wBAyGa,kBAAkB,uBAAuB;;wBAmNzC,4BAA4B,SAAS,mBAAmB"}
@@ -11,6 +11,7 @@ const DEFAULT_SELECTION_LAYER = "default";
11
11
  const DEFAULT_SELECTION_LAYER_INDEX = -1;
12
12
  const FIXED_CORE_PACKAGES = /* @__PURE__ */ new Set([
13
13
  "@agimon-ai/po",
14
+ "@agimon-ai/po-artifact",
14
15
  "@agimon-ai/po-autostop",
15
16
  "@agimon-ai/po-cache",
16
17
  "@agimon-ai/po-config",
@@ -32,7 +33,8 @@ const CORE_PACKAGE_ENTRIES = [
32
33
  "@agimon-ai/po-profile/extensions/server",
33
34
  "@agimon-ai/po-major-mode/extensions/server",
34
35
  "@agimon-ai/po-skill/extensions/server",
35
- "@agimon-ai/po-domain/extensions/server"
36
+ "@agimon-ai/po-domain/extensions/server",
37
+ "@agimon-ai/po-artifact/extensions/server"
36
38
  ];
37
39
  const CACHE_PACKAGE_ENTRY = "@agimon-ai/po-cache/extensions/server";
38
40
  const SESSION_PACKAGE_ENTRY = "@agimon-ai/po-session/extensions/server";
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["resolvePackageEntry","resolveOptionalPackageEntry","resolveLocalPackageName"],"sources":["../../../../src/builders/cli/extensionAssembler/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { isLocalPackageSpecifier, type LayerResolvers, type MajorModesConfig } from '@agimon-ai/po-config/majorModes';\nimport {\n consumerPackageEntry,\n localEntries,\n localEntry,\n localPackageEntries,\n localPackageExport,\n localPackageName as resolveLocalPackageName,\n optionalPackageEntry as resolveOptionalPackageEntry,\n packageEntry as resolvePackageEntry,\n splitPackageSpecifier,\n} from '@agimon-ai/po-core/moduleResolution';\nimport { canonicalModulePath, sha256 } from '@agimon-ai/po-core/runtimeIdentity';\nimport { declaredServerFacetsOf } from '@agimon-ai/po-core/serverFacet';\n\nimport { ownEntry } from '../entryResolution';\n\nexport interface ExtensionLayerResolvers extends LayerResolvers {\n /** Resolves a path authored under packages to its native discovery anchor. */\n localPackageEntries?: (specifier: string, baseDirectory: string) => string[] | undefined;\n /** Canonical manifest name for a path that represents a package directory. */\n localPackageName?: (specifier: string, baseDirectory: string) => string | undefined;\n}\n\nexport interface ExtensionContext {\n /** Named mode whose occurrence is part of composition identity. */\n majorMode?: string;\n /** Ordered layer occurrences selected by the active major mode. */\n layers: string[];\n majorModesConfig: MajorModesConfig;\n /** Resolver override used by synchronized replay. */\n resolvers?: ExtensionLayerResolvers;\n /**\n * Turns a configured package that does not resolve yet (not installed, or a local package\n * not built) into a missing selection with a diagnostic instead of an error, so a host that\n * only reads what sync prepared can still open. A fixed host package selected as a feature\n * still throws: that is a configuration error, not something sync can fix.\n */\n tolerateUnsynced?: boolean;\n}\n\nexport type SelectedEntryKind = 'extension' | 'package';\ntype ExtensionResolutionOutcome = 'resolved' | 'missing-optional';\n\n/**\n * One resolver-derived extension occurrence.\n *\n * This remains private to Po composition. It is not package metadata and\n * deliberately retains authored duplicates even though activation paths are\n * deduplicated later.\n */\ninterface ResolvedExtensionSelection {\n readonly layer: string;\n readonly layerIndex: number;\n readonly entryKind: SelectedEntryKind;\n readonly entryIndex: number;\n readonly manifestIndex: number;\n readonly selector: string;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n readonly optional: boolean;\n readonly outcome: ExtensionResolutionOutcome;\n readonly path?: string;\n readonly canonicalPath?: string;\n readonly diagnostic?: string;\n readonly config?: Record<string, unknown>;\n}\n\nexport interface CompositionLayerOccurrence {\n readonly name: string;\n readonly index: number;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n}\n\n/** Internal normalized composition shared by sync, bundles, and the session server. */\nexport interface ExtensionComposition {\n readonly majorMode?: {\n readonly name: string;\n readonly sourceFile?: string;\n readonly baseDirectory?: string;\n };\n readonly layers: readonly CompositionLayerOccurrence[];\n readonly selections: readonly ResolvedExtensionSelection[];\n /** Entries whose owning packages this composition selects, for native facet discovery. */\n readonly packageEntries: readonly string[];\n /** Stable identity of this composition, published as the session's composition fingerprint. */\n readonly fingerprint: string;\n}\n\nconst DEFAULT_SELECTION_LAYER = 'default';\nconst DEFAULT_SELECTION_LAYER_INDEX = -1;\n\nconst FIXED_CORE_PACKAGES = new Set([\n '@agimon-ai/po',\n '@agimon-ai/po-autostop',\n '@agimon-ai/po-cache',\n '@agimon-ai/po-config',\n '@agimon-ai/po-domain',\n '@agimon-ai/po-major-mode',\n '@agimon-ai/po-minor-mode',\n '@agimon-ai/po-notification',\n '@agimon-ai/po-profile',\n '@agimon-ai/po-session',\n '@agimon-ai/po-skill',\n '@agimon-ai/po-ui',\n]);\n\n/** Native server entries of the fixed host packages every composition selects. */\nconst CORE_PACKAGE_ENTRIES = [\n '@agimon-ai/po-minor-mode/extensions/server',\n '@agimon-ai/po-config/extensions/server',\n '@agimon-ai/po-ui/extensions/server',\n '@agimon-ai/po-notification/extensions/server',\n '@agimon-ai/po-profile/extensions/server',\n '@agimon-ai/po-major-mode/extensions/server',\n '@agimon-ai/po-skill/extensions/server',\n '@agimon-ai/po-domain/extensions/server',\n] as const;\nconst CACHE_PACKAGE_ENTRY = '@agimon-ai/po-cache/extensions/server';\nconst SESSION_PACKAGE_ENTRY = '@agimon-ai/po-session/extensions/server';\n/** Po's own server facet, resolved through the distribution like any own entry. */\nconst PO_SERVER_ENTRY = 'server';\n\n/** Manifest fields through which a selected package contributes to a Po host. */\nconst PO_FACET_FIELDS = ['poServer', 'poWeb', 'poMcp'] as const;\n\n/**\n * Resolves a selected package to its built server facet, or to its manifest as the\n * discovery anchor of a web or MCP only package. A package with no Po facet resolves empty.\n */\nfunction nativePackageEntries(manifestPath: string, resolveExport: () => string | undefined): string[] {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as Record<string, unknown>;\n const root = path.dirname(fs.realpathSync(manifestPath));\n const declaration = declaredServerFacetsOf(root, manifest)[0];\n if (!declaration) {\n return PO_FACET_FIELDS.some((field) => manifest[field] !== undefined) ? [path.join(root, 'package.json')] : [];\n }\n const exported = resolveExport();\n const dist = path.resolve(root, declaration.dist);\n if (!exported || !fs.existsSync(dist) || fs.realpathSync(exported) !== fs.realpathSync(dist)) {\n throw new Error(\n `Native package ${declaration.packageName} must export its built poServer dist as ./extensions/server.`,\n );\n }\n return [fs.realpathSync(dist)];\n}\n\n/** Resolves an installed package selection, or one explicit export subpath, from root. */\nfunction installedPackageEntries(\n specifier: string,\n root: string,\n environment: NodeJS.ProcessEnv = process.env,\n): string[] | undefined {\n if (splitPackageSpecifier(specifier).subpath !== '.') {\n const entry = consumerPackageEntry(specifier, root, environment);\n return entry ? [fs.realpathSync(entry)] : undefined;\n }\n const manifestPath = consumerPackageEntry(`${specifier}/package.json`, root, environment);\n return manifestPath\n ? nativePackageEntries(manifestPath, () =>\n consumerPackageEntry(`${specifier}/extensions/server`, root, environment),\n )\n : undefined;\n}\n\nfunction localSelectedPackageEntries(specifier: string, baseDirectory: string): string[] | undefined {\n const manifest = path.resolve(baseDirectory, specifier, 'package.json');\n return fs.existsSync(manifest)\n ? nativePackageEntries(manifest, () => localPackageExport(specifier, baseDirectory, './extensions/server'))\n : localPackageEntries(specifier, baseDirectory);\n}\n\nconst HOST_DIRECTORY = path.dirname(fileURLToPath(import.meta.url));\n\nexport const LAYER_RESOLVERS: ExtensionLayerResolvers = {\n ownEntry,\n packageEntry: (specifier) => resolvePackageEntry(specifier, import.meta.url),\n optionalPackageEntry: (specifier) => resolveOptionalPackageEntry(specifier, import.meta.url),\n packageEntries: (specifier) => {\n const entries = installedPackageEntries(specifier, HOST_DIRECTORY);\n if (!entries) throw new Error(`Cannot resolve package ${specifier}.`);\n return entries;\n },\n optionalPackageEntries: (specifier) => installedPackageEntries(specifier, HOST_DIRECTORY),\n localEntry,\n localEntries,\n localPackageEntries: localSelectedPackageEntries,\n localPackageName: resolveLocalPackageName,\n};\n\nfunction missingConsumerPackage(name: string, consumerRoot: string): Error {\n return new Error(`Cannot resolve configured package \"${name}\" from ${consumerRoot}.`);\n}\n\n/**\n * Resolves configured packages only from the consumer, while fixed core entries\n * may fall back to the host package's private dependency closure. `environment` names\n * the Po home whose shared runtime answers after the consumer's own tree.\n */\nexport function createLayerResolvers(\n consumerRoot?: string,\n environment: NodeJS.ProcessEnv = process.env,\n): ExtensionLayerResolvers {\n if (!consumerRoot) return LAYER_RESOLVERS;\n // Fixed host packages must match the executable, even when home contains an older installation.\n const fallbackEntry = (name: string): string | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntry(name, import.meta.url) : undefined;\n const requiredEntry = (name: string): string => {\n const entry = fallbackEntry(name) ?? consumerPackageEntry(name, consumerRoot, environment);\n if (!entry) throw missingConsumerPackage(name, consumerRoot);\n return entry;\n };\n const requiredEntries = (name: string): string[] => {\n const entries = installedPackageEntries(name, consumerRoot, environment);\n if (!entries) throw missingConsumerPackage(name, consumerRoot);\n return entries;\n };\n return {\n ownEntry,\n packageEntry: requiredEntry,\n optionalPackageEntry: (name) => fallbackEntry(name) ?? consumerPackageEntry(name, consumerRoot, environment),\n packageEntries: requiredEntries,\n optionalPackageEntries: (name) => installedPackageEntries(name, consumerRoot, environment),\n localEntry,\n localEntries,\n localPackageEntries: localSelectedPackageEntries,\n localPackageName: resolveLocalPackageName,\n };\n}\n\nfunction packageName(specifier: string): string {\n const segments = specifier.split('/');\n return specifier.startsWith('@') ? segments.slice(0, 2).join('/') : (segments[0] ?? specifier);\n}\n\n/** A fixed host package selected as a feature: a configuration error that tolerance never hides. */\nclass FixedPackageSelectionError extends Error {}\n\nfunction assertFeaturePackage(specifier: string, layer: string): void {\n const selectedPackage = packageName(specifier);\n if (FIXED_CORE_PACKAGES.has(selectedPackage)) {\n throw new FixedPackageSelectionError(\n `Layer \"${layer}\" cannot select fixed Po host package \"${selectedPackage}\" as a feature extension.`,\n );\n }\n}\n\nfunction resolveLocalExtensionEntries(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n const single = resolvers.localEntry(specifier, baseDirectory);\n return single ? [single] : undefined;\n}\n\nfunction resolveLocalPackageSelections(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localPackageEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n return resolveLocalExtensionEntries(resolvers, specifier, baseDirectory);\n}\n\ninterface SelectionIdentity {\n layer: string;\n layerIndex: number;\n entryKind: SelectedEntryKind;\n entryIndex: number;\n selector: string;\n sourceFile?: string;\n baseDirectory: string;\n optional: boolean;\n config?: Record<string, unknown>;\n}\n\nfunction resolvedSelection(\n identity: SelectionIdentity,\n manifestIndex: number,\n resolvedPath: string,\n): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex,\n outcome: 'resolved',\n path: resolvedPath,\n canonicalPath: canonicalModulePath(resolvedPath),\n };\n}\n\nfunction missingOptionalSelection(identity: SelectionIdentity, diagnostic: string): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex: 0,\n outcome: 'missing-optional',\n diagnostic,\n };\n}\n\n/**\n * The selectors a tolerant composition left out because they do not resolve yet: the missing\n * selections of entries that are not optional, each once, in composition order.\n */\nexport function unsyncedSelectors(compositions: readonly ExtensionComposition[]): string[] {\n return [\n ...new Set(\n compositions.flatMap((composition) =>\n composition.selections\n .filter((selection) => selection.outcome === 'missing-optional' && !selection.optional)\n .map((selection) => selection.selector),\n ),\n ),\n ];\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction resolveDefinitionSelections(\n definition: MajorModesConfig['layers'][string],\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced = false,\n): ResolvedExtensionSelection[] {\n const resolvedSelections: ResolvedExtensionSelection[] = [];\n const extensionEntries = definition.extensions ?? [];\n for (const [entryIndex, selector] of extensionEntries.entries()) {\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'extension',\n entryIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional: false,\n };\n if (!isLocalPackageSpecifier(selector)) {\n resolvedSelections.push(resolvedSelection(identity, 0, resolvers.ownEntry(selector)));\n continue;\n }\n const resolved = resolveLocalExtensionEntries(resolvers, selector, definition.baseDirectory);\n if (!resolved?.length) {\n throw new Error(\n `Layer \"${layer}\" extension \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at a Pi extension file or directory.',\n );\n }\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n const packageOffset = extensionEntries.length;\n for (const [packageIndex, configured] of (definition.packages ?? []).entries()) {\n const selector = typeof configured === 'string' ? configured : configured.name;\n const optional = typeof configured === 'string' ? false : configured.optional === true;\n const configValue = typeof configured === 'string' ? undefined : configured.config;\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'package',\n entryIndex: packageOffset + packageIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional,\n ...(configValue === undefined ? {} : { config: configValue }),\n };\n\n let resolved: string[] | undefined;\n try {\n if (isLocalPackageSpecifier(selector)) {\n const manifestName = resolvers.localPackageName?.(selector, definition.baseDirectory);\n if (manifestName) assertFeaturePackage(manifestName, layer);\n resolved = resolveLocalPackageSelections(resolvers, selector, definition.baseDirectory);\n } else {\n assertFeaturePackage(selector, layer);\n if (optional) {\n resolved = resolvers.optionalPackageEntries?.(selector);\n if (resolved === undefined && !resolvers.optionalPackageEntries) {\n const single = resolvers.optionalPackageEntry(selector);\n resolved = single ? [single] : undefined;\n }\n } else {\n resolved = resolvers.packageEntries?.(selector) ?? [resolvers.packageEntry(selector)];\n }\n }\n } catch (error) {\n if (optional || (tolerateUnsynced && !(error instanceof FixedPackageSelectionError))) {\n resolvedSelections.push(missingOptionalSelection(identity, errorMessage(error)));\n continue;\n }\n throw error;\n }\n\n if (!resolved?.length && tolerateUnsynced && !optional) {\n resolvedSelections.push(\n missingOptionalSelection(\n identity,\n `Package \"${selector}\" is not synced yet: it resolves to no Po server, web or MCP facet.`,\n ),\n );\n continue;\n }\n if (!resolved?.length) {\n if (optional) {\n resolvedSelections.push(\n missingOptionalSelection(\n identity,\n `Optional package \"${selector}\" is unavailable or declares no Po server, web or MCP facet.`,\n ),\n );\n continue;\n }\n if (isLocalPackageSpecifier(selector)) {\n throw new Error(\n `Layer \"${layer}\" package \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at an extension file, or a package directory whose package.json declares a Po facet.',\n );\n }\n throw new Error(`Layer \"${layer}\" package \"${selector}\" declares no Po server, web or MCP facet.`);\n }\n\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n return resolvedSelections;\n}\n\nfunction resolveLayerSelections(\n config: MajorModesConfig,\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced: boolean,\n): ResolvedExtensionSelection[] {\n const definition = config.layers[layer];\n if (!definition) throw new Error(`Unknown layer: ${layer}`);\n return resolveDefinitionSelections(definition, layer, layerIndex, resolvers, tolerateUnsynced);\n}\n\nfunction resolveDefaultSelections(\n config: MajorModesConfig,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced: boolean,\n): ResolvedExtensionSelection[] {\n if (!config.default) return [];\n return resolveDefinitionSelections(\n config.default,\n DEFAULT_SELECTION_LAYER,\n DEFAULT_SELECTION_LAYER_INDEX,\n resolvers,\n tolerateUnsynced,\n );\n}\n\nfunction resolveSelectedExtensions(context: ExtensionContext): ResolvedExtensionSelection[] {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n return context.layers.flatMap((layer, layerIndex) =>\n resolveLayerSelections(context.majorModesConfig, layer, layerIndex, resolvers, context.tolerateUnsynced === true),\n );\n}\n\nfunction deduplicatePaths(paths: readonly string[]): string[] {\n const seen = new Set<string>();\n const selected: string[] = [];\n for (const entry of paths) {\n const identity = canonicalModulePath(entry);\n if (seen.has(identity)) continue;\n seen.add(identity);\n selected.push(entry);\n }\n return selected;\n}\n\nfunction selectedFeaturePaths(selections: readonly ResolvedExtensionSelection[]): string[] {\n return deduplicatePaths(\n selections.flatMap((entry) => (entry.outcome === 'resolved' && entry.path ? [entry.path] : [])),\n );\n}\n\n/** Package anchors in the order the previous host activated them, so discovery order holds. */\nfunction selectedPackageEntries(\n resolve: ExtensionLayerResolvers,\n distributionPaths: readonly string[],\n featurePaths: readonly string[],\n): string[] {\n return deduplicatePaths([\n resolve.ownEntry(PO_SERVER_ENTRY),\n ...CORE_PACKAGE_ENTRIES.map((entry) => resolve.packageEntry(entry)),\n ...distributionPaths,\n ...featurePaths,\n resolve.packageEntry(CACHE_PACKAGE_ENTRY),\n resolve.packageEntry(SESSION_PACKAGE_ENTRY),\n ]);\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalValue);\n if (value === null || typeof value !== 'object') return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, canonicalValue(entry)]),\n );\n}\n\n/** Resolve one deterministic composition from authored layer occurrences. */\nexport function resolveExtensionComposition(context: ExtensionContext): ExtensionComposition {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n const defaultSelections = resolveDefaultSelections(\n context.majorModesConfig,\n resolvers,\n context.tolerateUnsynced === true,\n );\n const layerSelections = resolveSelectedExtensions(context);\n const selections = [...defaultSelections, ...layerSelections];\n const distributionPaths = selectedFeaturePaths(defaultSelections);\n const featurePaths = selectedFeaturePaths(layerSelections);\n const layers = context.layers.map((name, index): CompositionLayerOccurrence => {\n const definition = context.majorModesConfig.layers[name];\n if (!definition) throw new Error(`Unknown layer: ${name}`);\n return {\n name,\n index,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n };\n });\n const modeSource = context.majorMode ? context.majorModesConfig.majorModeSources?.[context.majorMode] : undefined;\n const composition = {\n ...(context.majorMode\n ? {\n majorMode: {\n name: context.majorMode,\n ...(modeSource?.filePath ? { sourceFile: modeSource.filePath } : {}),\n ...(modeSource?.baseDirectory ? { baseDirectory: modeSource.baseDirectory } : {}),\n },\n }\n : {}),\n layers,\n selections,\n packageEntries: selectedPackageEntries(resolvers, distributionPaths, featurePaths),\n };\n // Keys the prompt-cache namespace, so a different selection never shares cached prefixes.\n return {\n ...composition,\n fingerprint: sha256(\n JSON.stringify(\n canonicalValue({ ...composition, canonicalEntries: composition.packageEntries.map(canonicalModulePath) }),\n ),\n ),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["resolvePackageEntry","resolveOptionalPackageEntry","resolveLocalPackageName"],"sources":["../../../../src/builders/cli/extensionAssembler/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { isLocalPackageSpecifier, type LayerResolvers, type MajorModesConfig } from '@agimon-ai/po-config/majorModes';\nimport {\n consumerPackageEntry,\n localEntries,\n localEntry,\n localPackageEntries,\n localPackageExport,\n localPackageName as resolveLocalPackageName,\n optionalPackageEntry as resolveOptionalPackageEntry,\n packageEntry as resolvePackageEntry,\n splitPackageSpecifier,\n} from '@agimon-ai/po-core/moduleResolution';\nimport { canonicalModulePath, sha256 } from '@agimon-ai/po-core/runtimeIdentity';\nimport { declaredServerFacetsOf } from '@agimon-ai/po-core/serverFacet';\n\nimport { ownEntry } from '../entryResolution';\n\nexport interface ExtensionLayerResolvers extends LayerResolvers {\n /** Resolves a path authored under packages to its native discovery anchor. */\n localPackageEntries?: (specifier: string, baseDirectory: string) => string[] | undefined;\n /** Canonical manifest name for a path that represents a package directory. */\n localPackageName?: (specifier: string, baseDirectory: string) => string | undefined;\n}\n\nexport interface ExtensionContext {\n /** Named mode whose occurrence is part of composition identity. */\n majorMode?: string;\n /** Ordered layer occurrences selected by the active major mode. */\n layers: string[];\n majorModesConfig: MajorModesConfig;\n /** Resolver override used by synchronized replay. */\n resolvers?: ExtensionLayerResolvers;\n /**\n * Turns a configured package that does not resolve yet (not installed, or a local package\n * not built) into a missing selection with a diagnostic instead of an error, so a host that\n * only reads what sync prepared can still open. A fixed host package selected as a feature\n * still throws: that is a configuration error, not something sync can fix.\n */\n tolerateUnsynced?: boolean;\n}\n\nexport type SelectedEntryKind = 'extension' | 'package';\ntype ExtensionResolutionOutcome = 'resolved' | 'missing-optional';\n\n/**\n * One resolver-derived extension occurrence.\n *\n * This remains private to Po composition. It is not package metadata and\n * deliberately retains authored duplicates even though activation paths are\n * deduplicated later.\n */\ninterface ResolvedExtensionSelection {\n readonly layer: string;\n readonly layerIndex: number;\n readonly entryKind: SelectedEntryKind;\n readonly entryIndex: number;\n readonly manifestIndex: number;\n readonly selector: string;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n readonly optional: boolean;\n readonly outcome: ExtensionResolutionOutcome;\n readonly path?: string;\n readonly canonicalPath?: string;\n readonly diagnostic?: string;\n readonly config?: Record<string, unknown>;\n}\n\nexport interface CompositionLayerOccurrence {\n readonly name: string;\n readonly index: number;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n}\n\n/** Internal normalized composition shared by sync, bundles, and the session server. */\nexport interface ExtensionComposition {\n readonly majorMode?: {\n readonly name: string;\n readonly sourceFile?: string;\n readonly baseDirectory?: string;\n };\n readonly layers: readonly CompositionLayerOccurrence[];\n readonly selections: readonly ResolvedExtensionSelection[];\n /** Entries whose owning packages this composition selects, for native facet discovery. */\n readonly packageEntries: readonly string[];\n /** Stable identity of this composition, published as the session's composition fingerprint. */\n readonly fingerprint: string;\n}\n\nconst DEFAULT_SELECTION_LAYER = 'default';\nconst DEFAULT_SELECTION_LAYER_INDEX = -1;\n\nconst FIXED_CORE_PACKAGES = new Set([\n '@agimon-ai/po',\n '@agimon-ai/po-artifact',\n '@agimon-ai/po-autostop',\n '@agimon-ai/po-cache',\n '@agimon-ai/po-config',\n '@agimon-ai/po-domain',\n '@agimon-ai/po-major-mode',\n '@agimon-ai/po-minor-mode',\n '@agimon-ai/po-notification',\n '@agimon-ai/po-profile',\n '@agimon-ai/po-session',\n '@agimon-ai/po-skill',\n '@agimon-ai/po-ui',\n]);\n\n/** Native server entries of the fixed host packages every composition selects. */\nconst CORE_PACKAGE_ENTRIES = [\n '@agimon-ai/po-minor-mode/extensions/server',\n '@agimon-ai/po-config/extensions/server',\n '@agimon-ai/po-ui/extensions/server',\n '@agimon-ai/po-notification/extensions/server',\n '@agimon-ai/po-profile/extensions/server',\n '@agimon-ai/po-major-mode/extensions/server',\n '@agimon-ai/po-skill/extensions/server',\n '@agimon-ai/po-domain/extensions/server',\n '@agimon-ai/po-artifact/extensions/server',\n] as const;\nconst CACHE_PACKAGE_ENTRY = '@agimon-ai/po-cache/extensions/server';\nconst SESSION_PACKAGE_ENTRY = '@agimon-ai/po-session/extensions/server';\n/** Po's own server facet, resolved through the distribution like any own entry. */\nconst PO_SERVER_ENTRY = 'server';\n\n/** Manifest fields through which a selected package contributes to a Po host. */\nconst PO_FACET_FIELDS = ['poServer', 'poWeb', 'poMcp'] as const;\n\n/**\n * Resolves a selected package to its built server facet, or to its manifest as the\n * discovery anchor of a web or MCP only package. A package with no Po facet resolves empty.\n */\nfunction nativePackageEntries(manifestPath: string, resolveExport: () => string | undefined): string[] {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as Record<string, unknown>;\n const root = path.dirname(fs.realpathSync(manifestPath));\n const declaration = declaredServerFacetsOf(root, manifest)[0];\n if (!declaration) {\n return PO_FACET_FIELDS.some((field) => manifest[field] !== undefined) ? [path.join(root, 'package.json')] : [];\n }\n const exported = resolveExport();\n const dist = path.resolve(root, declaration.dist);\n if (!exported || !fs.existsSync(dist) || fs.realpathSync(exported) !== fs.realpathSync(dist)) {\n throw new Error(\n `Native package ${declaration.packageName} must export its built poServer dist as ./extensions/server.`,\n );\n }\n return [fs.realpathSync(dist)];\n}\n\n/** Resolves an installed package selection, or one explicit export subpath, from root. */\nfunction installedPackageEntries(\n specifier: string,\n root: string,\n environment: NodeJS.ProcessEnv = process.env,\n): string[] | undefined {\n if (splitPackageSpecifier(specifier).subpath !== '.') {\n const entry = consumerPackageEntry(specifier, root, environment);\n return entry ? [fs.realpathSync(entry)] : undefined;\n }\n const manifestPath = consumerPackageEntry(`${specifier}/package.json`, root, environment);\n return manifestPath\n ? nativePackageEntries(manifestPath, () =>\n consumerPackageEntry(`${specifier}/extensions/server`, root, environment),\n )\n : undefined;\n}\n\nfunction localSelectedPackageEntries(specifier: string, baseDirectory: string): string[] | undefined {\n const manifest = path.resolve(baseDirectory, specifier, 'package.json');\n return fs.existsSync(manifest)\n ? nativePackageEntries(manifest, () => localPackageExport(specifier, baseDirectory, './extensions/server'))\n : localPackageEntries(specifier, baseDirectory);\n}\n\nconst HOST_DIRECTORY = path.dirname(fileURLToPath(import.meta.url));\n\nexport const LAYER_RESOLVERS: ExtensionLayerResolvers = {\n ownEntry,\n packageEntry: (specifier) => resolvePackageEntry(specifier, import.meta.url),\n optionalPackageEntry: (specifier) => resolveOptionalPackageEntry(specifier, import.meta.url),\n packageEntries: (specifier) => {\n const entries = installedPackageEntries(specifier, HOST_DIRECTORY);\n if (!entries) throw new Error(`Cannot resolve package ${specifier}.`);\n return entries;\n },\n optionalPackageEntries: (specifier) => installedPackageEntries(specifier, HOST_DIRECTORY),\n localEntry,\n localEntries,\n localPackageEntries: localSelectedPackageEntries,\n localPackageName: resolveLocalPackageName,\n};\n\nfunction missingConsumerPackage(name: string, consumerRoot: string): Error {\n return new Error(`Cannot resolve configured package \"${name}\" from ${consumerRoot}.`);\n}\n\n/**\n * Resolves configured packages only from the consumer, while fixed core entries\n * may fall back to the host package's private dependency closure. `environment` names\n * the Po home whose shared runtime answers after the consumer's own tree.\n */\nexport function createLayerResolvers(\n consumerRoot?: string,\n environment: NodeJS.ProcessEnv = process.env,\n): ExtensionLayerResolvers {\n if (!consumerRoot) return LAYER_RESOLVERS;\n // Fixed host packages must match the executable, even when home contains an older installation.\n const fallbackEntry = (name: string): string | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntry(name, import.meta.url) : undefined;\n const requiredEntry = (name: string): string => {\n const entry = fallbackEntry(name) ?? consumerPackageEntry(name, consumerRoot, environment);\n if (!entry) throw missingConsumerPackage(name, consumerRoot);\n return entry;\n };\n const requiredEntries = (name: string): string[] => {\n const entries = installedPackageEntries(name, consumerRoot, environment);\n if (!entries) throw missingConsumerPackage(name, consumerRoot);\n return entries;\n };\n return {\n ownEntry,\n packageEntry: requiredEntry,\n optionalPackageEntry: (name) => fallbackEntry(name) ?? consumerPackageEntry(name, consumerRoot, environment),\n packageEntries: requiredEntries,\n optionalPackageEntries: (name) => installedPackageEntries(name, consumerRoot, environment),\n localEntry,\n localEntries,\n localPackageEntries: localSelectedPackageEntries,\n localPackageName: resolveLocalPackageName,\n };\n}\n\nfunction packageName(specifier: string): string {\n const segments = specifier.split('/');\n return specifier.startsWith('@') ? segments.slice(0, 2).join('/') : (segments[0] ?? specifier);\n}\n\n/** A fixed host package selected as a feature: a configuration error that tolerance never hides. */\nclass FixedPackageSelectionError extends Error {}\n\nfunction assertFeaturePackage(specifier: string, layer: string): void {\n const selectedPackage = packageName(specifier);\n if (FIXED_CORE_PACKAGES.has(selectedPackage)) {\n throw new FixedPackageSelectionError(\n `Layer \"${layer}\" cannot select fixed Po host package \"${selectedPackage}\" as a feature extension.`,\n );\n }\n}\n\nfunction resolveLocalExtensionEntries(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n const single = resolvers.localEntry(specifier, baseDirectory);\n return single ? [single] : undefined;\n}\n\nfunction resolveLocalPackageSelections(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localPackageEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n return resolveLocalExtensionEntries(resolvers, specifier, baseDirectory);\n}\n\ninterface SelectionIdentity {\n layer: string;\n layerIndex: number;\n entryKind: SelectedEntryKind;\n entryIndex: number;\n selector: string;\n sourceFile?: string;\n baseDirectory: string;\n optional: boolean;\n config?: Record<string, unknown>;\n}\n\nfunction resolvedSelection(\n identity: SelectionIdentity,\n manifestIndex: number,\n resolvedPath: string,\n): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex,\n outcome: 'resolved',\n path: resolvedPath,\n canonicalPath: canonicalModulePath(resolvedPath),\n };\n}\n\nfunction missingOptionalSelection(identity: SelectionIdentity, diagnostic: string): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex: 0,\n outcome: 'missing-optional',\n diagnostic,\n };\n}\n\n/**\n * The selectors a tolerant composition left out because they do not resolve yet: the missing\n * selections of entries that are not optional, each once, in composition order.\n */\nexport function unsyncedSelectors(compositions: readonly ExtensionComposition[]): string[] {\n return [\n ...new Set(\n compositions.flatMap((composition) =>\n composition.selections\n .filter((selection) => selection.outcome === 'missing-optional' && !selection.optional)\n .map((selection) => selection.selector),\n ),\n ),\n ];\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction resolveDefinitionSelections(\n definition: MajorModesConfig['layers'][string],\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced = false,\n): ResolvedExtensionSelection[] {\n const resolvedSelections: ResolvedExtensionSelection[] = [];\n const extensionEntries = definition.extensions ?? [];\n for (const [entryIndex, selector] of extensionEntries.entries()) {\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'extension',\n entryIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional: false,\n };\n if (!isLocalPackageSpecifier(selector)) {\n resolvedSelections.push(resolvedSelection(identity, 0, resolvers.ownEntry(selector)));\n continue;\n }\n const resolved = resolveLocalExtensionEntries(resolvers, selector, definition.baseDirectory);\n if (!resolved?.length) {\n throw new Error(\n `Layer \"${layer}\" extension \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at a Pi extension file or directory.',\n );\n }\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n const packageOffset = extensionEntries.length;\n for (const [packageIndex, configured] of (definition.packages ?? []).entries()) {\n const selector = typeof configured === 'string' ? configured : configured.name;\n const optional = typeof configured === 'string' ? false : configured.optional === true;\n const configValue = typeof configured === 'string' ? undefined : configured.config;\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'package',\n entryIndex: packageOffset + packageIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional,\n ...(configValue === undefined ? {} : { config: configValue }),\n };\n\n let resolved: string[] | undefined;\n try {\n if (isLocalPackageSpecifier(selector)) {\n const manifestName = resolvers.localPackageName?.(selector, definition.baseDirectory);\n if (manifestName) assertFeaturePackage(manifestName, layer);\n resolved = resolveLocalPackageSelections(resolvers, selector, definition.baseDirectory);\n } else {\n assertFeaturePackage(selector, layer);\n if (optional) {\n resolved = resolvers.optionalPackageEntries?.(selector);\n if (resolved === undefined && !resolvers.optionalPackageEntries) {\n const single = resolvers.optionalPackageEntry(selector);\n resolved = single ? [single] : undefined;\n }\n } else {\n resolved = resolvers.packageEntries?.(selector) ?? [resolvers.packageEntry(selector)];\n }\n }\n } catch (error) {\n if (optional || (tolerateUnsynced && !(error instanceof FixedPackageSelectionError))) {\n resolvedSelections.push(missingOptionalSelection(identity, errorMessage(error)));\n continue;\n }\n throw error;\n }\n\n if (!resolved?.length && tolerateUnsynced && !optional) {\n resolvedSelections.push(\n missingOptionalSelection(\n identity,\n `Package \"${selector}\" is not synced yet: it resolves to no Po server, web or MCP facet.`,\n ),\n );\n continue;\n }\n if (!resolved?.length) {\n if (optional) {\n resolvedSelections.push(\n missingOptionalSelection(\n identity,\n `Optional package \"${selector}\" is unavailable or declares no Po server, web or MCP facet.`,\n ),\n );\n continue;\n }\n if (isLocalPackageSpecifier(selector)) {\n throw new Error(\n `Layer \"${layer}\" package \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at an extension file, or a package directory whose package.json declares a Po facet.',\n );\n }\n throw new Error(`Layer \"${layer}\" package \"${selector}\" declares no Po server, web or MCP facet.`);\n }\n\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n return resolvedSelections;\n}\n\nfunction resolveLayerSelections(\n config: MajorModesConfig,\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced: boolean,\n): ResolvedExtensionSelection[] {\n const definition = config.layers[layer];\n if (!definition) throw new Error(`Unknown layer: ${layer}`);\n return resolveDefinitionSelections(definition, layer, layerIndex, resolvers, tolerateUnsynced);\n}\n\nfunction resolveDefaultSelections(\n config: MajorModesConfig,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced: boolean,\n): ResolvedExtensionSelection[] {\n if (!config.default) return [];\n return resolveDefinitionSelections(\n config.default,\n DEFAULT_SELECTION_LAYER,\n DEFAULT_SELECTION_LAYER_INDEX,\n resolvers,\n tolerateUnsynced,\n );\n}\n\nfunction resolveSelectedExtensions(context: ExtensionContext): ResolvedExtensionSelection[] {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n return context.layers.flatMap((layer, layerIndex) =>\n resolveLayerSelections(context.majorModesConfig, layer, layerIndex, resolvers, context.tolerateUnsynced === true),\n );\n}\n\nfunction deduplicatePaths(paths: readonly string[]): string[] {\n const seen = new Set<string>();\n const selected: string[] = [];\n for (const entry of paths) {\n const identity = canonicalModulePath(entry);\n if (seen.has(identity)) continue;\n seen.add(identity);\n selected.push(entry);\n }\n return selected;\n}\n\nfunction selectedFeaturePaths(selections: readonly ResolvedExtensionSelection[]): string[] {\n return deduplicatePaths(\n selections.flatMap((entry) => (entry.outcome === 'resolved' && entry.path ? [entry.path] : [])),\n );\n}\n\n/** Package anchors in the order the previous host activated them, so discovery order holds. */\nfunction selectedPackageEntries(\n resolve: ExtensionLayerResolvers,\n distributionPaths: readonly string[],\n featurePaths: readonly string[],\n): string[] {\n return deduplicatePaths([\n resolve.ownEntry(PO_SERVER_ENTRY),\n ...CORE_PACKAGE_ENTRIES.map((entry) => resolve.packageEntry(entry)),\n ...distributionPaths,\n ...featurePaths,\n resolve.packageEntry(CACHE_PACKAGE_ENTRY),\n resolve.packageEntry(SESSION_PACKAGE_ENTRY),\n ]);\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalValue);\n if (value === null || typeof value !== 'object') return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, canonicalValue(entry)]),\n );\n}\n\n/** Resolve one deterministic composition from authored layer occurrences. */\nexport function resolveExtensionComposition(context: ExtensionContext): ExtensionComposition {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n const defaultSelections = resolveDefaultSelections(\n context.majorModesConfig,\n resolvers,\n context.tolerateUnsynced === true,\n );\n const layerSelections = resolveSelectedExtensions(context);\n const selections = [...defaultSelections, ...layerSelections];\n const distributionPaths = selectedFeaturePaths(defaultSelections);\n const featurePaths = selectedFeaturePaths(layerSelections);\n const layers = context.layers.map((name, index): CompositionLayerOccurrence => {\n const definition = context.majorModesConfig.layers[name];\n if (!definition) throw new Error(`Unknown layer: ${name}`);\n return {\n name,\n index,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n };\n });\n const modeSource = context.majorMode ? context.majorModesConfig.majorModeSources?.[context.majorMode] : undefined;\n const composition = {\n ...(context.majorMode\n ? {\n majorMode: {\n name: context.majorMode,\n ...(modeSource?.filePath ? { sourceFile: modeSource.filePath } : {}),\n ...(modeSource?.baseDirectory ? { baseDirectory: modeSource.baseDirectory } : {}),\n },\n }\n : {}),\n layers,\n selections,\n packageEntries: selectedPackageEntries(resolvers, distributionPaths, featurePaths),\n };\n // Keys the prompt-cache namespace, so a different selection never shares cached prefixes.\n return {\n ...composition,\n fingerprint: sha256(\n JSON.stringify(\n canonicalValue({ ...composition, canonicalEntries: composition.packageEntries.map(canonicalModulePath) }),\n ),\n ),\n };\n}\n"],"mappings":"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"}