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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/README.md +14 -11
  2. package/dist/antigravity.mjs +1 -2
  3. package/dist/baseCommand.mjs +1 -2
  4. package/dist/bin/cli.cjs +37 -14
  5. package/dist/bin/cli.cjs.map +1 -1
  6. package/dist/bin/cli.mjs +34 -14
  7. package/dist/bin/cli.mjs.map +1 -1
  8. package/dist/bin/{doomRunner.cjs → poRunner.cjs} +5 -5
  9. package/dist/bin/poRunner.cjs.map +1 -0
  10. package/dist/bin/{doomRunner.d.mts → poRunner.d.mts} +2 -2
  11. package/dist/bin/poRunner.d.mts.map +1 -0
  12. package/dist/bin/{doomRunner.mjs → poRunner.mjs} +5 -5
  13. package/dist/bin/poRunner.mjs.map +1 -0
  14. package/dist/builders/cli/extensionAssembler/index.cjs +14 -12
  15. package/dist/builders/cli/extensionAssembler/index.cjs.map +1 -1
  16. package/dist/builders/cli/extensionAssembler/index.d.mts +2 -1
  17. package/dist/builders/cli/extensionAssembler/index.d.mts.map +1 -1
  18. package/dist/builders/cli/extensionAssembler/index.mjs +14 -12
  19. package/dist/builders/cli/extensionAssembler/index.mjs.map +1 -1
  20. package/dist/catalog/index.json +68 -51
  21. package/dist/cliApp.mjs +1 -2
  22. package/dist/codex.mjs +1 -2
  23. package/dist/compatibilityCommand.mjs +1 -2
  24. package/dist/compatibilityContext.mjs +1 -2
  25. package/dist/compatibilityOptions.mjs +1 -2
  26. package/dist/config.cjs +57 -12
  27. package/dist/config.d.mts +3 -3
  28. package/dist/config.mjs +3 -3
  29. package/dist/doctorCommand.mjs +1 -2
  30. package/dist/emitMcpCommand.mjs +1 -2
  31. package/dist/explainCommand.mjs +1 -2
  32. package/dist/extensions/server.cjs +11 -7
  33. package/dist/extensions/server.cjs.map +1 -1
  34. package/dist/extensions/server.d.mts +2 -2
  35. package/dist/extensions/server.d.mts.map +1 -1
  36. package/dist/extensions/server.mjs +12 -8
  37. package/dist/extensions/server.mjs.map +1 -1
  38. package/dist/harnessContext.mjs +1 -2
  39. package/dist/harnessState.cjs +66 -11
  40. package/dist/harnessState.d.mts +2 -2
  41. package/dist/harnessState.mjs +1 -2
  42. package/dist/index.cjs +60 -15
  43. package/dist/index.d.mts +3 -3
  44. package/dist/index.mjs +3 -3
  45. package/dist/initCommand.mjs +1 -2
  46. package/dist/matrixOptions.mjs +1 -2
  47. package/dist/options.mjs +1 -2
  48. package/dist/process.mjs +1 -2
  49. package/dist/projectTrust.cjs +2 -2
  50. package/dist/projectTrust.d.mts +2 -2
  51. package/dist/projectTrust.mjs +1 -2
  52. package/dist/repository.cjs +1 -1
  53. package/dist/repository.d.mts +2 -2
  54. package/dist/repository.mjs +1 -2
  55. package/dist/router.mjs +1 -2
  56. package/dist/shared.mjs +1 -2
  57. package/dist/src/bin/agentDirectory.cjs +18 -12
  58. package/dist/src/bin/agentDirectory.cjs.map +1 -1
  59. package/dist/src/bin/agentDirectory.mjs +15 -12
  60. package/dist/src/bin/agentDirectory.mjs.map +1 -1
  61. package/dist/src/builders/apiContractExport/index.cjs +6 -6
  62. package/dist/src/builders/apiContractExport/index.cjs.map +1 -1
  63. package/dist/src/builders/apiContractExport/index.mjs +9 -9
  64. package/dist/src/builders/apiContractExport/index.mjs.map +1 -1
  65. package/dist/src/builders/cli/entryResolution.cjs +3 -3
  66. package/dist/src/builders/cli/entryResolution.cjs.map +1 -1
  67. package/dist/src/builders/cli/entryResolution.mjs +3 -3
  68. package/dist/src/builders/cli/entryResolution.mjs.map +1 -1
  69. package/dist/src/builders/cli/harnessContext.cjs +5 -5
  70. package/dist/src/builders/cli/harnessContext.cjs.map +1 -1
  71. package/dist/src/builders/cli/harnessContext.mjs +7 -7
  72. package/dist/src/builders/cli/harnessContext.mjs.map +1 -1
  73. package/dist/src/builders/hooks/index.cjs +1 -1
  74. package/dist/src/builders/hooks/index.cjs.map +1 -1
  75. package/dist/src/builders/hooks/index.mjs +2 -2
  76. package/dist/src/builders/hooks/index.mjs.map +1 -1
  77. package/dist/src/builders/server/backgroundSync.cjs +13 -1
  78. package/dist/src/builders/server/backgroundSync.cjs.map +1 -1
  79. package/dist/src/builders/server/backgroundSync.mjs +13 -1
  80. package/dist/src/builders/server/backgroundSync.mjs.map +1 -1
  81. package/dist/src/builders/server/bundlerService.cjs +151 -0
  82. package/dist/src/builders/server/bundlerService.cjs.map +1 -0
  83. package/dist/src/builders/server/bundlerService.mjs +151 -0
  84. package/dist/src/builders/server/bundlerService.mjs.map +1 -0
  85. package/dist/src/builders/server/computerUseBinding.cjs +2 -2
  86. package/dist/src/builders/server/computerUseBinding.cjs.map +1 -1
  87. package/dist/src/builders/server/computerUseBinding.mjs +3 -3
  88. package/dist/src/builders/server/computerUseBinding.mjs.map +1 -1
  89. package/dist/src/builders/server/defaultWorkspace.cjs +1 -1
  90. package/dist/src/builders/server/defaultWorkspace.cjs.map +1 -1
  91. package/dist/src/builders/server/defaultWorkspace.mjs +2 -2
  92. package/dist/src/builders/server/defaultWorkspace.mjs.map +1 -1
  93. package/dist/src/builders/server/idleRestart.cjs +3 -3
  94. package/dist/src/builders/server/idleRestart.cjs.map +1 -1
  95. package/dist/src/builders/server/idleRestart.mjs +3 -3
  96. package/dist/src/builders/server/idleRestart.mjs.map +1 -1
  97. package/dist/src/builders/server/index.cjs +6 -6
  98. package/dist/src/builders/server/index.cjs.map +1 -1
  99. package/dist/src/builders/server/index.mjs +6 -6
  100. package/dist/src/builders/server/index.mjs.map +1 -1
  101. package/dist/src/builders/server/logSink.cjs +3 -3
  102. package/dist/src/builders/server/logSink.cjs.map +1 -1
  103. package/dist/src/builders/server/logSink.mjs +2 -2
  104. package/dist/src/builders/server/logSink.mjs.map +1 -1
  105. package/dist/src/builders/server/mcpBundle.cjs.map +1 -1
  106. package/dist/src/builders/server/mcpBundle.d.mts +2 -2
  107. package/dist/src/builders/server/mcpBundle.mjs.map +1 -1
  108. package/dist/src/builders/server/packageUrl.cjs +25 -18
  109. package/dist/src/builders/server/packageUrl.cjs.map +1 -1
  110. package/dist/src/builders/server/packageUrl.mjs +25 -18
  111. package/dist/src/builders/server/packageUrl.mjs.map +1 -1
  112. package/dist/src/builders/server/runtime.cjs +157 -168
  113. package/dist/src/builders/server/runtime.cjs.map +1 -1
  114. package/dist/src/builders/server/runtime.mjs +161 -171
  115. package/dist/src/builders/server/runtime.mjs.map +1 -1
  116. package/dist/src/builders/server/selectionStatus.cjs +3 -3
  117. package/dist/src/builders/server/selectionStatus.cjs.map +1 -1
  118. package/dist/src/builders/server/selectionStatus.mjs +3 -3
  119. package/dist/src/builders/server/selectionStatus.mjs.map +1 -1
  120. package/dist/src/builders/server/sessionArguments.cjs.map +1 -1
  121. package/dist/src/builders/server/sessionArguments.mjs.map +1 -1
  122. package/dist/src/builders/server/watcherService.cjs +65 -0
  123. package/dist/src/builders/server/watcherService.cjs.map +1 -0
  124. package/dist/src/builders/server/watcherService.mjs +61 -0
  125. package/dist/src/builders/server/watcherService.mjs.map +1 -0
  126. package/dist/src/builders/server/webTemplateDecision.cjs +1 -1
  127. package/dist/src/builders/server/webTemplateDecision.cjs.map +1 -1
  128. package/dist/src/builders/server/webTemplateDecision.mjs +2 -2
  129. package/dist/src/builders/server/webTemplateDecision.mjs.map +1 -1
  130. package/dist/src/builders/web/bundle.cjs.map +1 -1
  131. package/dist/src/builders/web/bundle.d.mts +4 -3
  132. package/dist/src/builders/web/bundle.mjs.map +1 -1
  133. package/dist/src/builders/web/bundleAssetPolicy.d.mts +1 -0
  134. package/dist/src/builders/web/index.cjs +1 -1
  135. package/dist/src/builders/web/index.cjs.map +1 -1
  136. package/dist/src/builders/web/index.d.mts +1 -0
  137. package/dist/src/builders/web/index.mjs +1 -1
  138. package/dist/src/builders/web/index.mjs.map +1 -1
  139. package/dist/src/builders/web/webPluginGenerate.cjs +4 -15
  140. package/dist/src/builders/web/webPluginGenerate.cjs.map +1 -1
  141. package/dist/src/builders/web/webPluginGenerate.d.mts +5 -9
  142. package/dist/src/builders/web/webPluginGenerate.d.mts.map +1 -1
  143. package/dist/src/builders/web/webPluginGenerate.mjs +4 -15
  144. package/dist/src/builders/web/webPluginGenerate.mjs.map +1 -1
  145. package/dist/src/builders/web/webPluginVite.d.mts +1 -0
  146. package/dist/src/cli/cliApp.cjs +1 -1
  147. package/dist/src/cli/cliApp.cjs.map +1 -1
  148. package/dist/src/cli/cliApp.mjs +1 -1
  149. package/dist/src/cli/cliApp.mjs.map +1 -1
  150. package/dist/src/cli/commands/compat/index.cjs +1 -1
  151. package/dist/src/cli/commands/compat/index.cjs.map +1 -1
  152. package/dist/src/cli/commands/compat/index.mjs +1 -1
  153. package/dist/src/cli/commands/compat/index.mjs.map +1 -1
  154. package/dist/src/cli/commands/doctor/index.cjs +2 -2
  155. package/dist/src/cli/commands/doctor/index.cjs.map +1 -1
  156. package/dist/src/cli/commands/doctor/index.d.mts +1 -0
  157. package/dist/src/cli/commands/doctor/index.d.mts.map +1 -1
  158. package/dist/src/cli/commands/doctor/index.mjs +4 -4
  159. package/dist/src/cli/commands/doctor/index.mjs.map +1 -1
  160. package/dist/src/cli/commands/explain/index.cjs +3 -1
  161. package/dist/src/cli/commands/explain/index.cjs.map +1 -1
  162. package/dist/src/cli/commands/explain/index.d.mts.map +1 -1
  163. package/dist/src/cli/commands/explain/index.mjs +4 -2
  164. package/dist/src/cli/commands/explain/index.mjs.map +1 -1
  165. package/dist/src/cli/commands/init/index.cjs +2 -2
  166. package/dist/src/cli/commands/init/index.cjs.map +1 -1
  167. package/dist/src/cli/commands/init/index.mjs +3 -3
  168. package/dist/src/cli/commands/init/index.mjs.map +1 -1
  169. package/dist/src/cli/commands/init/presenter.cjs +1 -1
  170. package/dist/src/cli/commands/init/presenter.cjs.map +1 -1
  171. package/dist/src/cli/commands/init/presenter.mjs +2 -2
  172. package/dist/src/cli/commands/init/presenter.mjs.map +1 -1
  173. package/dist/src/cli/commands/sync/index.cjs +4 -4
  174. package/dist/src/cli/commands/sync/index.cjs.map +1 -1
  175. package/dist/src/cli/commands/sync/index.d.mts +1 -0
  176. package/dist/src/cli/commands/sync/index.mjs +7 -7
  177. package/dist/src/cli/commands/sync/index.mjs.map +1 -1
  178. package/dist/src/cli/commands/sync/presenter.cjs +1 -1
  179. package/dist/src/cli/commands/sync/presenter.cjs.map +1 -1
  180. package/dist/src/cli/commands/sync/presenter.d.mts +1 -1
  181. package/dist/src/cli/commands/sync/presenter.mjs +1 -1
  182. package/dist/src/cli/commands/sync/presenter.mjs.map +1 -1
  183. package/dist/src/cli/commands/web/index.cjs +2 -1
  184. package/dist/src/cli/commands/web/index.cjs.map +1 -1
  185. package/dist/src/cli/commands/web/index.mjs +2 -1
  186. package/dist/src/cli/commands/web/index.mjs.map +1 -1
  187. package/dist/src/cli/harnessOptions.cjs +1 -1
  188. package/dist/src/cli/harnessOptions.cjs.map +1 -1
  189. package/dist/src/cli/harnessOptions.mjs +2 -2
  190. package/dist/src/cli/harnessOptions.mjs.map +1 -1
  191. package/dist/src/cli/help.cjs +2 -0
  192. package/dist/src/cli/help.cjs.map +1 -1
  193. package/dist/src/cli/help.mjs +2 -0
  194. package/dist/src/cli/help.mjs.map +1 -1
  195. package/dist/src/cli/matrixOptions.cjs +1 -1
  196. package/dist/src/cli/matrixOptions.cjs.map +1 -1
  197. package/dist/src/cli/matrixOptions.d.mts +1 -1
  198. package/dist/src/cli/matrixOptions.mjs +1 -1
  199. package/dist/src/cli/matrixOptions.mjs.map +1 -1
  200. package/dist/src/cli/server/run.cjs +1 -1
  201. package/dist/src/cli/server/run.cjs.map +1 -1
  202. package/dist/src/cli/server/run.mjs +2 -2
  203. package/dist/src/cli/server/run.mjs.map +1 -1
  204. package/dist/src/composition/harnessState/index.cjs +66 -11
  205. package/dist/src/composition/harnessState/index.cjs.map +1 -1
  206. package/dist/src/composition/harnessState/index.d.mts +3 -3
  207. package/dist/src/composition/harnessState/index.mjs +2 -2
  208. package/dist/src/composition/harnessState/index.mjs.map +1 -1
  209. package/dist/src/composition/layerPackageInstaller/index.cjs +5 -4
  210. package/dist/src/composition/layerPackageInstaller/index.cjs.map +1 -1
  211. package/dist/src/composition/layerPackageInstaller/index.mjs +6 -5
  212. package/dist/src/composition/layerPackageInstaller/index.mjs.map +1 -1
  213. package/dist/src/composition/poHomeMigration/index.cjs +1 -1
  214. package/dist/src/composition/poHomeMigration/index.cjs.map +1 -1
  215. package/dist/src/composition/poHomeMigration/index.mjs +1 -1
  216. package/dist/src/composition/poHomeMigration/index.mjs.map +1 -1
  217. package/dist/src/composition/projectTrust/index.cjs +6 -6
  218. package/dist/src/composition/projectTrust/index.cjs.map +1 -1
  219. package/dist/src/composition/projectTrust/index.d.mts +7 -7
  220. package/dist/src/composition/projectTrust/index.d.mts.map +1 -1
  221. package/dist/src/composition/projectTrust/index.mjs +6 -6
  222. package/dist/src/composition/projectTrust/index.mjs.map +1 -1
  223. package/dist/src/composition/repository/index.cjs +8 -8
  224. package/dist/src/composition/repository/index.cjs.map +1 -1
  225. package/dist/src/composition/repository/index.d.mts +5 -5
  226. package/dist/src/composition/repository/index.d.mts.map +1 -1
  227. package/dist/src/composition/repository/index.mjs +10 -10
  228. package/dist/src/composition/repository/index.mjs.map +1 -1
  229. package/dist/src/composition/syncService/index.cjs +29 -9
  230. package/dist/src/composition/syncService/index.cjs.map +1 -1
  231. package/dist/src/composition/syncService/index.d.mts.map +1 -1
  232. package/dist/src/composition/syncService/index.mjs +31 -11
  233. package/dist/src/composition/syncService/index.mjs.map +1 -1
  234. package/dist/src/composition/syncService/localBuilds.cjs +7 -2
  235. package/dist/src/composition/syncService/localBuilds.cjs.map +1 -1
  236. package/dist/src/composition/syncService/localBuilds.mjs +7 -2
  237. package/dist/src/composition/syncService/localBuilds.mjs.map +1 -1
  238. package/dist/src/extensions/setupDiagnostics.cjs +3 -3
  239. package/dist/src/extensions/setupDiagnostics.cjs.map +1 -1
  240. package/dist/src/extensions/setupDiagnostics.mjs +3 -3
  241. package/dist/src/extensions/setupDiagnostics.mjs.map +1 -1
  242. package/dist/utils.mjs +1 -2
  243. package/docs/server/api-export.md +3 -3
  244. package/docs/server/api.md +23 -22
  245. package/docs/server/getting-started.md +7 -7
  246. package/docs/server/index.md +4 -4
  247. package/docs/server/ipc.md +7 -11
  248. package/docs/server/lifecycle.md +17 -17
  249. package/docs/server/security.md +8 -8
  250. package/package.json +42 -45
  251. package/src/prompts/po-author-extension/SKILL.md +1 -1
  252. package/src/prompts/po-author-extension/references/extension-contract.md +4 -4
  253. package/dist/bin/doomRunner.cjs.map +0 -1
  254. package/dist/bin/doomRunner.d.mts.map +0 -1
  255. package/dist/bin/doomRunner.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../../../src/cli/commands/web/index.ts"],"sourcesContent":["import { type ChildProcess, spawn } from 'node:child_process';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\n\nconst PO_WEB_PACKAGE = '@agimon-ai/po-web';\nconst PO_WEB_MANIFEST = `${PO_WEB_PACKAGE}/package.json`;\nconst PO_WEB_BIN = 'po-web';\nconst FORWARDED_SIGNALS = ['SIGINT', 'SIGTERM'] as const;\nconst SIGNAL_EXIT_BASE = 128;\nconst SIGNAL_NUMBERS: Record<string, number> = { SIGINT: 2, SIGTERM: 15 };\n\nexport interface PoWebOutput {\n write(chunk: string): void;\n}\n\nexport interface PoWebDependencies {\n /** Resolves a module specifier to an absolute path, throwing when it is not installed. */\n resolve: (specifier: string) => string;\n /** Reads a resolved package manifest. */\n readManifest: (manifestPath: string) => unknown;\n spawn: (command: string, args: string[]) => ChildProcess;\n signals: Pick<NodeJS.Process, 'on' | 'off'>;\n error: PoWebOutput;\n}\n\nfunction defaultDependencies(): PoWebDependencies {\n const require = createRequire(import.meta.url);\n return {\n resolve: (specifier) => require.resolve(specifier),\n readManifest: (manifestPath) => require(manifestPath) as unknown,\n spawn: (command, args) => spawn(command, args, { stdio: 'inherit' }),\n signals: process,\n error: process.stderr,\n };\n}\n\nfunction binEntry(manifest: unknown): string | undefined {\n if (typeof manifest !== 'object' || manifest === null) return undefined;\n const bin = (manifest as { bin?: unknown }).bin;\n if (typeof bin === 'string') return bin;\n if (typeof bin !== 'object' || bin === null) return undefined;\n const entry = (bin as Record<string, unknown>)[PO_WEB_BIN];\n return typeof entry === 'string' ? entry : undefined;\n}\n\n/** Absolute path of the installed po-web bin, or undefined when po-web is not installed. */\nexport function resolvePoWebBin(dependencies: Pick<PoWebDependencies, 'resolve' | 'readManifest'>): string | undefined {\n let manifestPath: string;\n try {\n manifestPath = dependencies.resolve(PO_WEB_MANIFEST);\n } catch {\n return undefined;\n }\n const entry = binEntry(dependencies.readManifest(manifestPath));\n return entry ? path.resolve(path.dirname(manifestPath), entry) : undefined;\n}\n\nfunction installGuidance(): string {\n return `po could not find ${PO_WEB_PACKAGE}, which serves the Po web console.\nInstall it next to po, for example:\n npm install -g ${PO_WEB_PACKAGE}\n`;\n}\n\n/**\n * Bare `po`: runs the po-web console with the caller's arguments.\n *\n * po-web depends on po, so po locates it at runtime instead of declaring it.\n * The child inherits stdio, receives SIGINT and SIGTERM, and its exit code\n * becomes po's.\n */\nexport async function runPoWeb(\n args: string[],\n dependencies: PoWebDependencies = defaultDependencies(),\n): Promise<number> {\n const bin = resolvePoWebBin(dependencies);\n if (!bin) {\n dependencies.error.write(installGuidance());\n return 1;\n }\n const child = dependencies.spawn(process.execPath, [bin, ...args]);\n const forwarders = FORWARDED_SIGNALS.map((signal) => {\n const forward = (): void => {\n child.kill(signal);\n };\n dependencies.signals.on(signal, forward);\n return [signal, forward] as const;\n });\n try {\n return await new Promise<number>((resolve, reject) => {\n child.once('error', reject);\n child.once('exit', (code, signal) => {\n if (code !== null) resolve(code);\n else resolve(SIGNAL_EXIT_BASE + (signal ? (SIGNAL_NUMBERS[signal] ?? 0) : 0));\n });\n });\n } finally {\n for (const [signal, forward] of forwarders) dependencies.signals.off(signal, forward);\n }\n}\n"],"mappings":";;;;AAIA,MAAM,iBAAiB;AACvB,MAAM,kBAAkB,GAAG,eAAe;AAC1C,MAAM,aAAa;AACnB,MAAM,oBAAoB,CAAC,UAAU,SAAS;AAC9C,MAAM,mBAAmB;AACzB,MAAM,iBAAyC;CAAE,QAAQ;CAAG,SAAS;AAAG;AAgBxE,SAAS,sBAAyC;CAChD,MAAM,UAAU,cAAc,YAAY,GAAG;CAC7C,OAAO;EACL,UAAU,cAAc,QAAQ,QAAQ,SAAS;EACjD,eAAe,iBAAiB,QAAQ,YAAY;EACpD,QAAQ,SAAS,SAAS,MAAM,SAAS,MAAM,EAAE,OAAO,UAAU,CAAC;EACnE,SAAS;EACT,OAAO,QAAQ;CACjB;AACF;AAEA,SAAS,SAAS,UAAuC;CACvD,IAAI,OAAO,aAAa,YAAY,aAAa,MAAM,OAAO,KAAA;CAC9D,MAAM,MAAO,SAA+B;CAC5C,IAAI,OAAO,QAAQ,UAAU,OAAO;CACpC,IAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM,OAAO,KAAA;CACpD,MAAM,QAAS,IAAgC;CAC/C,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAA;AAC7C;;AAGA,SAAgB,gBAAgB,cAAuF;CACrH,IAAI;CACJ,IAAI;EACF,eAAe,aAAa,QAAQ,eAAe;CACrD,QAAQ;EACN;CACF;CACA,MAAM,QAAQ,SAAS,aAAa,aAAa,YAAY,CAAC;CAC9D,OAAO,QAAQ,KAAK,QAAQ,KAAK,QAAQ,YAAY,GAAG,KAAK,IAAI,KAAA;AACnE;AAEA,SAAS,kBAA0B;CACjC,OAAO,qBAAqB,eAAe;;mBAE1B,eAAe;;AAElC;;;;;;;;AASA,eAAsB,SACpB,MACA,eAAkC,oBAAoB,GACrC;CACjB,MAAM,MAAM,gBAAgB,YAAY;CACxC,IAAI,CAAC,KAAK;EACR,aAAa,MAAM,MAAM,gBAAgB,CAAC;EAC1C,OAAO;CACT;CACA,MAAM,QAAQ,aAAa,MAAM,QAAQ,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC;CACjE,MAAM,aAAa,kBAAkB,KAAK,WAAW;EACnD,MAAM,gBAAsB;GAC1B,MAAM,KAAK,MAAM;EACnB;EACA,aAAa,QAAQ,GAAG,QAAQ,OAAO;EACvC,OAAO,CAAC,QAAQ,OAAO;CACzB,CAAC;CACD,IAAI;EACF,OAAO,MAAM,IAAI,SAAiB,SAAS,WAAW;GACpD,MAAM,KAAK,SAAS,MAAM;GAC1B,MAAM,KAAK,SAAS,MAAM,WAAW;IACnC,IAAI,SAAS,MAAM,QAAQ,IAAI;SAC1B,QAAQ,oBAAoB,SAAU,eAAe,WAAW,IAAK,EAAE;GAC9E,CAAC;EACH,CAAC;CACH,UAAU;EACR,KAAK,MAAM,CAAC,QAAQ,YAAY,YAAY,aAAa,QAAQ,IAAI,QAAQ,OAAO;CACtF;AACF"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../../src/cli/commands/web/index.ts"],"sourcesContent":["import { type ChildProcess, spawn } from 'node:child_process';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\n\nconst PO_WEB_PACKAGE = '@agimon-ai/po-web';\nconst PO_WEB_MANIFEST = `${PO_WEB_PACKAGE}/package.json`;\nconst PO_WEB_BIN = 'po-web';\nconst FORWARDED_SIGNALS = ['SIGINT', 'SIGTERM'] as const;\nconst SIGNAL_EXIT_BASE = 128;\nconst SIGNAL_NUMBERS: Record<string, number> = { SIGINT: 2, SIGTERM: 15 };\n\nexport interface PoWebOutput {\n write(chunk: string): void;\n}\n\nexport interface PoWebDependencies {\n /** Resolves a module specifier to an absolute path, throwing when it is not installed. */\n resolve: (specifier: string) => string;\n /** Reads a resolved package manifest. */\n readManifest: (manifestPath: string) => unknown;\n spawn: (command: string, args: string[]) => ChildProcess;\n signals: Pick<NodeJS.Process, 'on' | 'off'>;\n error: PoWebOutput;\n}\n\nfunction defaultDependencies(): PoWebDependencies {\n const require = createRequire(import.meta.url);\n return {\n resolve: (specifier) => require.resolve(specifier),\n readManifest: (manifestPath) => require(manifestPath) as unknown,\n spawn: (command, args) => spawn(command, args, { stdio: 'inherit' }),\n signals: process,\n error: process.stderr,\n };\n}\n\nfunction binEntry(manifest: unknown): string | undefined {\n if (typeof manifest !== 'object' || manifest === null) return undefined;\n const bin = (manifest as { bin?: unknown }).bin;\n if (typeof bin === 'string') return bin;\n if (typeof bin !== 'object' || bin === null) return undefined;\n const entry = (bin as Record<string, unknown>)[PO_WEB_BIN];\n return typeof entry === 'string' ? entry : undefined;\n}\n\n/** Absolute path of the installed po-web bin, or undefined when po-web is not installed. */\nexport function resolvePoWebBin(dependencies: Pick<PoWebDependencies, 'resolve' | 'readManifest'>): string | undefined {\n let manifestPath: string;\n try {\n const local = process.env.PO_TEST === '1' ? process.env.PO_WEB_PACKAGE_ROOT : undefined;\n manifestPath = local ? path.join(local, 'package.json') : dependencies.resolve(PO_WEB_MANIFEST);\n } catch {\n return undefined;\n }\n const entry = binEntry(dependencies.readManifest(manifestPath));\n return entry ? path.resolve(path.dirname(manifestPath), entry) : undefined;\n}\n\nfunction installGuidance(): string {\n return `po could not find ${PO_WEB_PACKAGE}, which serves the Po web console.\nInstall it next to po, for example:\n npm install -g ${PO_WEB_PACKAGE}\n`;\n}\n\n/**\n * Bare `po`: runs the po-web console with the caller's arguments.\n *\n * po-web depends on po, so po locates it at runtime instead of declaring it.\n * The child inherits stdio, receives SIGINT and SIGTERM, and its exit code\n * becomes po's.\n */\nexport async function runPoWeb(\n args: string[],\n dependencies: PoWebDependencies = defaultDependencies(),\n): Promise<number> {\n const bin = resolvePoWebBin(dependencies);\n if (!bin) {\n dependencies.error.write(installGuidance());\n return 1;\n }\n const child = dependencies.spawn(process.execPath, [bin, ...args]);\n const forwarders = FORWARDED_SIGNALS.map((signal) => {\n const forward = (): void => {\n child.kill(signal);\n };\n dependencies.signals.on(signal, forward);\n return [signal, forward] as const;\n });\n try {\n return await new Promise<number>((resolve, reject) => {\n child.once('error', reject);\n child.once('exit', (code, signal) => {\n if (code !== null) resolve(code);\n else resolve(SIGNAL_EXIT_BASE + (signal ? (SIGNAL_NUMBERS[signal] ?? 0) : 0));\n });\n });\n } finally {\n for (const [signal, forward] of forwarders) dependencies.signals.off(signal, forward);\n }\n}\n"],"mappings":";;;;AAIA,MAAM,iBAAiB;AACvB,MAAM,kBAAkB,GAAG,eAAe;AAC1C,MAAM,aAAa;AACnB,MAAM,oBAAoB,CAAC,UAAU,SAAS;AAC9C,MAAM,mBAAmB;AACzB,MAAM,iBAAyC;CAAE,QAAQ;CAAG,SAAS;AAAG;AAgBxE,SAAS,sBAAyC;CAChD,MAAM,UAAU,cAAc,YAAY,GAAG;CAC7C,OAAO;EACL,UAAU,cAAc,QAAQ,QAAQ,SAAS;EACjD,eAAe,iBAAiB,QAAQ,YAAY;EACpD,QAAQ,SAAS,SAAS,MAAM,SAAS,MAAM,EAAE,OAAO,UAAU,CAAC;EACnE,SAAS;EACT,OAAO,QAAQ;CACjB;AACF;AAEA,SAAS,SAAS,UAAuC;CACvD,IAAI,OAAO,aAAa,YAAY,aAAa,MAAM,OAAO,KAAA;CAC9D,MAAM,MAAO,SAA+B;CAC5C,IAAI,OAAO,QAAQ,UAAU,OAAO;CACpC,IAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM,OAAO,KAAA;CACpD,MAAM,QAAS,IAAgC;CAC/C,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAA;AAC7C;;AAGA,SAAgB,gBAAgB,cAAuF;CACrH,IAAI;CACJ,IAAI;EACF,MAAM,QAAQ,QAAQ,IAAI,YAAY,MAAM,QAAQ,IAAI,sBAAsB,KAAA;EAC9E,eAAe,QAAQ,KAAK,KAAK,OAAO,cAAc,IAAI,aAAa,QAAQ,eAAe;CAChG,QAAQ;EACN;CACF;CACA,MAAM,QAAQ,SAAS,aAAa,aAAa,YAAY,CAAC;CAC9D,OAAO,QAAQ,KAAK,QAAQ,KAAK,QAAQ,YAAY,GAAG,KAAK,IAAI,KAAA;AACnE;AAEA,SAAS,kBAA0B;CACjC,OAAO,qBAAqB,eAAe;;mBAE1B,eAAe;;AAElC;;;;;;;;AASA,eAAsB,SACpB,MACA,eAAkC,oBAAoB,GACrC;CACjB,MAAM,MAAM,gBAAgB,YAAY;CACxC,IAAI,CAAC,KAAK;EACR,aAAa,MAAM,MAAM,gBAAgB,CAAC;EAC1C,OAAO;CACT;CACA,MAAM,QAAQ,aAAa,MAAM,QAAQ,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC;CACjE,MAAM,aAAa,kBAAkB,KAAK,WAAW;EACnD,MAAM,gBAAsB;GAC1B,MAAM,KAAK,MAAM;EACnB;EACA,aAAa,QAAQ,GAAG,QAAQ,OAAO;EACvC,OAAO,CAAC,QAAQ,OAAO;CACzB,CAAC;CACD,IAAI;EACF,OAAO,MAAM,IAAI,SAAiB,SAAS,WAAW;GACpD,MAAM,KAAK,SAAS,MAAM;GAC1B,MAAM,KAAK,SAAS,MAAM,WAAW;IACnC,IAAI,SAAS,MAAM,QAAQ,IAAI;SAC1B,QAAQ,oBAAoB,SAAU,eAAe,WAAW,IAAK,EAAE;GAC9E,CAAC;EACH,CAAC;CACH,UAAU;EACR,KAAK,MAAM,CAAC,QAAQ,YAAY,YAAY,aAAa,QAAQ,IAAI,QAAQ,OAAO;CACtF;AACF"}
@@ -45,7 +45,7 @@ function resolveHarnessOptions(input) {
45
45
  const repoRoot = inheritedRoot ? node_path.default.resolve(inheritedRoot) : resolveConfigurationRoot(initial.options.cwd);
46
46
  const homeDirectory = initial.options.homeDirectory ?? environment.HOME ?? node_os.default.homedir();
47
47
  const configRoot = input.configRoot ?? repoRoot;
48
- const defaults = (0, _agimon_ai_po_config_config.loadDoomConfig)(configRoot, homeDirectory, environment).selection;
48
+ const defaults = (0, _agimon_ai_po_config_config.loadPoConfig)(configRoot, homeDirectory, environment).selection;
49
49
  const selectedEnvironment = { ...environment };
50
50
  for (const axis of [
51
51
  "majorMode",
@@ -1 +1 @@
1
- {"version":3,"file":"harnessOptions.cjs","names":["fs","findRepositoryRoot","path","parseHarnessArgs","readHarnessState","os","loadDoomConfig","HARNESS_STATE_KEYS","loadMajorModesConfig","loadDomains","loadProfileCatalog"],"sources":["../../../src/cli/harnessOptions.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { loadDoomConfig } from '@agimon-ai/po-config/config';\nimport { loadDomains } from '@agimon-ai/po-config/domains';\nimport { HARNESS_STATE_KEYS } from '@agimon-ai/po-config/harnessState';\nimport { loadMajorModesConfig } from '@agimon-ai/po-config/majorModes';\nimport { loadProfileCatalog } from '@agimon-ai/po-config/profiles';\nimport type { HarnessFailureReporter } from '@agimon-ai/po-core/runtimeLogSinkTelemetry';\n\nimport { readHarnessState } from '../composition/harnessState';\nimport { findRepositoryRoot } from '../composition/repository';\nimport type { HarnessOptions } from '../composition/types/harness';\nimport { parseHarnessArgs } from './options';\n\nexport interface ResolveHarnessOptionsInput {\n /** Raw launcher arguments, as the binary received them. */\n args: readonly string[];\n environment?: NodeJS.ProcessEnv;\n cwd?: string;\n /** Reads configuration from this root instead of the checkout's own. */\n configRoot?: string;\n /** Reports a malformed inherited harness state without failing the run. */\n report?: HarnessFailureReporter;\n}\n\n/**\n * Uses the nearest configured repository, or the selected directory for an unconfigured workspace.\n * The repository root is canonical (symlinks resolved), the form the server compares\n * workspace roots and saved session checkouts in.\n */\nfunction resolveConfigurationRoot(cwd: string): string {\n try {\n return fs.realpathSync(findRepositoryRoot(cwd));\n } catch {\n return path.resolve(cwd);\n }\n}\n\n/**\n * Settles the configuration root and the full option matrix for one run.\n *\n * Two passes are required: the first reads --cwd without touching repository\n * configuration, which keeps a run resolvable even when modes.yaml is\n * malformed, and the second applies the defaults that root supplies. An\n * inherited root wins, which is how a nested run stays pinned to the outer\n * repository rather than re-deriving one from its own cwd. When no configured\n * repository exists, the selected working directory is the configuration root.\n */\nexport function resolveHarnessOptions(input: ResolveHarnessOptionsInput): HarnessOptions {\n const environment = input.environment ?? process.env;\n const cwd = input.cwd ?? process.cwd();\n const args = [...input.args];\n\n const initial = parseHarnessArgs(args, environment, cwd);\n const inheritedRoot = readHarnessState(environment, input.report).root;\n const repoRoot = inheritedRoot ? path.resolve(inheritedRoot) : resolveConfigurationRoot(initial.options.cwd);\n const homeDirectory = initial.options.homeDirectory ?? environment.HOME ?? os.homedir();\n const configRoot = input.configRoot ?? repoRoot;\n const defaults = loadDoomConfig(configRoot, homeDirectory, environment).selection;\n const selectedEnvironment = { ...environment };\n for (const axis of ['majorMode', 'domains', 'profile'] as const) {\n const value = defaults?.[axis];\n if (value !== undefined && selectedEnvironment[HARNESS_STATE_KEYS[axis]] === undefined)\n selectedEnvironment[HARNESS_STATE_KEYS[axis]] = Array.isArray(value) ? value.join(',') : value;\n }\n const parsed = parseHarnessArgs(\n args,\n selectedEnvironment,\n cwd,\n loadMajorModesConfig(configRoot, homeDirectory, environment).defaultMajorMode,\n loadDomains(configRoot, homeDirectory).defaultDomains,\n loadProfileCatalog(configRoot, homeDirectory).defaultProfile,\n );\n return {\n repoRoot,\n ...(input.configRoot === undefined ? {} : { configRoot }),\n ...parsed.options,\n homeDirectory,\n ...(input.environment === undefined ? {} : { environment: input.environment }),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAgCA,SAAS,yBAAyB,KAAqB;CACrD,IAAI;EACF,OAAOA,QAAAA,QAAG,aAAaC,gBAAAA,mBAAmB,GAAG,CAAC;CAChD,QAAQ;EACN,OAAOC,UAAAA,QAAK,QAAQ,GAAG;CACzB;AACF;;;;;;;;;;;AAYA,SAAgB,sBAAsB,OAAmD;CACvF,MAAM,cAAc,MAAM,eAAe,QAAQ;CACjD,MAAM,MAAM,MAAM,OAAO,QAAQ,IAAI;CACrC,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI;CAE3B,MAAM,UAAUC,gBAAAA,iBAAiB,MAAM,aAAa,GAAG;CACvD,MAAM,gBAAgBC,cAAAA,iBAAiB,aAAa,MAAM,MAAM,CAAC,CAAC;CAClE,MAAM,WAAW,gBAAgBF,UAAAA,QAAK,QAAQ,aAAa,IAAI,yBAAyB,QAAQ,QAAQ,GAAG;CAC3G,MAAM,gBAAgB,QAAQ,QAAQ,iBAAiB,YAAY,QAAQG,QAAAA,QAAG,QAAQ;CACtF,MAAM,aAAa,MAAM,cAAc;CACvC,MAAM,YAAA,GAAWC,4BAAAA,eAAAA,CAAe,YAAY,eAAe,WAAW,CAAC,CAAC;CACxE,MAAM,sBAAsB,EAAE,GAAG,YAAY;CAC7C,KAAK,MAAM,QAAQ;EAAC;EAAa;EAAW;CAAS,GAAY;EAC/D,MAAM,QAAQ,WAAW;EACzB,IAAI,UAAU,KAAA,KAAa,oBAAoBC,kCAAAA,mBAAmB,WAAW,KAAA,GAC3E,oBAAoBA,kCAAAA,mBAAmB,SAAS,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,GAAG,IAAI;CAC7F;CACA,MAAM,SAASJ,gBAAAA,iBACb,MACA,qBACA,MAAA,GACAK,gCAAAA,qBAAAA,CAAqB,YAAY,eAAe,WAAW,CAAC,CAAC,mBAAA,GAC7DC,6BAAAA,YAAAA,CAAY,YAAY,aAAa,CAAC,CAAC,iBAAA,GACvCC,8BAAAA,mBAAAA,CAAmB,YAAY,aAAa,CAAC,CAAC,cAChD;CACA,OAAO;EACL;EACA,GAAI,MAAM,eAAe,KAAA,IAAY,CAAC,IAAI,EAAE,WAAW;EACvD,GAAG,OAAO;EACV;EACA,GAAI,MAAM,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,MAAM,YAAY;CAC9E;AACF"}
1
+ {"version":3,"file":"harnessOptions.cjs","names":["fs","findRepositoryRoot","path","parseHarnessArgs","readHarnessState","os","loadPoConfig","HARNESS_STATE_KEYS","loadMajorModesConfig","loadDomains","loadProfileCatalog"],"sources":["../../../src/cli/harnessOptions.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { loadPoConfig } from '@agimon-ai/po-config/config';\nimport { loadDomains } from '@agimon-ai/po-config/domains';\nimport { HARNESS_STATE_KEYS } from '@agimon-ai/po-config/harnessState';\nimport { loadMajorModesConfig } from '@agimon-ai/po-config/majorModes';\nimport { loadProfileCatalog } from '@agimon-ai/po-config/profiles';\nimport type { HarnessFailureReporter } from '@agimon-ai/po-core/runtimeLogSinkTelemetry';\n\nimport { readHarnessState } from '../composition/harnessState';\nimport { findRepositoryRoot } from '../composition/repository';\nimport type { HarnessOptions } from '../composition/types/harness';\nimport { parseHarnessArgs } from './options';\n\nexport interface ResolveHarnessOptionsInput {\n /** Raw launcher arguments, as the binary received them. */\n args: readonly string[];\n environment?: NodeJS.ProcessEnv;\n cwd?: string;\n /** Reads configuration from this root instead of the checkout's own. */\n configRoot?: string;\n /** Reports a malformed inherited harness state without failing the run. */\n report?: HarnessFailureReporter;\n}\n\n/**\n * Uses the nearest configured repository, or the selected directory for an unconfigured workspace.\n * The repository root is canonical (symlinks resolved), the form the server compares\n * workspace roots and saved session checkouts in.\n */\nfunction resolveConfigurationRoot(cwd: string): string {\n try {\n return fs.realpathSync(findRepositoryRoot(cwd));\n } catch {\n return path.resolve(cwd);\n }\n}\n\n/**\n * Settles the configuration root and the full option matrix for one run.\n *\n * Two passes are required: the first reads --cwd without touching repository\n * configuration, which keeps a run resolvable even when modes.yaml is\n * malformed, and the second applies the defaults that root supplies. An\n * inherited root wins, which is how a nested run stays pinned to the outer\n * repository rather than re-deriving one from its own cwd. When no configured\n * repository exists, the selected working directory is the configuration root.\n */\nexport function resolveHarnessOptions(input: ResolveHarnessOptionsInput): HarnessOptions {\n const environment = input.environment ?? process.env;\n const cwd = input.cwd ?? process.cwd();\n const args = [...input.args];\n\n const initial = parseHarnessArgs(args, environment, cwd);\n const inheritedRoot = readHarnessState(environment, input.report).root;\n const repoRoot = inheritedRoot ? path.resolve(inheritedRoot) : resolveConfigurationRoot(initial.options.cwd);\n const homeDirectory = initial.options.homeDirectory ?? environment.HOME ?? os.homedir();\n const configRoot = input.configRoot ?? repoRoot;\n const defaults = loadPoConfig(configRoot, homeDirectory, environment).selection;\n const selectedEnvironment = { ...environment };\n for (const axis of ['majorMode', 'domains', 'profile'] as const) {\n const value = defaults?.[axis];\n if (value !== undefined && selectedEnvironment[HARNESS_STATE_KEYS[axis]] === undefined)\n selectedEnvironment[HARNESS_STATE_KEYS[axis]] = Array.isArray(value) ? value.join(',') : value;\n }\n const parsed = parseHarnessArgs(\n args,\n selectedEnvironment,\n cwd,\n loadMajorModesConfig(configRoot, homeDirectory, environment).defaultMajorMode,\n loadDomains(configRoot, homeDirectory).defaultDomains,\n loadProfileCatalog(configRoot, homeDirectory).defaultProfile,\n );\n return {\n repoRoot,\n ...(input.configRoot === undefined ? {} : { configRoot }),\n ...parsed.options,\n homeDirectory,\n ...(input.environment === undefined ? {} : { environment: input.environment }),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAgCA,SAAS,yBAAyB,KAAqB;CACrD,IAAI;EACF,OAAOA,QAAAA,QAAG,aAAaC,gBAAAA,mBAAmB,GAAG,CAAC;CAChD,QAAQ;EACN,OAAOC,UAAAA,QAAK,QAAQ,GAAG;CACzB;AACF;;;;;;;;;;;AAYA,SAAgB,sBAAsB,OAAmD;CACvF,MAAM,cAAc,MAAM,eAAe,QAAQ;CACjD,MAAM,MAAM,MAAM,OAAO,QAAQ,IAAI;CACrC,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI;CAE3B,MAAM,UAAUC,gBAAAA,iBAAiB,MAAM,aAAa,GAAG;CACvD,MAAM,gBAAgBC,cAAAA,iBAAiB,aAAa,MAAM,MAAM,CAAC,CAAC;CAClE,MAAM,WAAW,gBAAgBF,UAAAA,QAAK,QAAQ,aAAa,IAAI,yBAAyB,QAAQ,QAAQ,GAAG;CAC3G,MAAM,gBAAgB,QAAQ,QAAQ,iBAAiB,YAAY,QAAQG,QAAAA,QAAG,QAAQ;CACtF,MAAM,aAAa,MAAM,cAAc;CACvC,MAAM,YAAA,GAAWC,4BAAAA,aAAAA,CAAa,YAAY,eAAe,WAAW,CAAC,CAAC;CACtE,MAAM,sBAAsB,EAAE,GAAG,YAAY;CAC7C,KAAK,MAAM,QAAQ;EAAC;EAAa;EAAW;CAAS,GAAY;EAC/D,MAAM,QAAQ,WAAW;EACzB,IAAI,UAAU,KAAA,KAAa,oBAAoBC,kCAAAA,mBAAmB,WAAW,KAAA,GAC3E,oBAAoBA,kCAAAA,mBAAmB,SAAS,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,GAAG,IAAI;CAC7F;CACA,MAAM,SAASJ,gBAAAA,iBACb,MACA,qBACA,MAAA,GACAK,gCAAAA,qBAAAA,CAAqB,YAAY,eAAe,WAAW,CAAC,CAAC,mBAAA,GAC7DC,6BAAAA,YAAAA,CAAY,YAAY,aAAa,CAAC,CAAC,iBAAA,GACvCC,8BAAAA,mBAAAA,CAAmB,YAAY,aAAa,CAAC,CAAC,cAChD;CACA,OAAO;EACL;EACA,GAAI,MAAM,eAAe,KAAA,IAAY,CAAC,IAAI,EAAE,WAAW;EACvD,GAAG,OAAO;EACV;EACA,GAAI,MAAM,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,MAAM,YAAY;CAC9E;AACF"}
@@ -5,7 +5,7 @@ import fs from "node:fs";
5
5
  import path from "node:path";
6
6
  import os from "node:os";
7
7
  import { loadDomains } from "@agimon-ai/po-config/domains";
8
- import { loadDoomConfig } from "@agimon-ai/po-config/config";
8
+ import { loadPoConfig } from "@agimon-ai/po-config/config";
9
9
  import { HARNESS_STATE_KEYS } from "@agimon-ai/po-config/harnessState";
10
10
  import { loadMajorModesConfig } from "@agimon-ai/po-config/majorModes";
11
11
  import { loadProfileCatalog } from "@agimon-ai/po-config/profiles";
@@ -41,7 +41,7 @@ function resolveHarnessOptions(input) {
41
41
  const repoRoot = inheritedRoot ? path.resolve(inheritedRoot) : resolveConfigurationRoot(initial.options.cwd);
42
42
  const homeDirectory = initial.options.homeDirectory ?? environment.HOME ?? os.homedir();
43
43
  const configRoot = input.configRoot ?? repoRoot;
44
- const defaults = loadDoomConfig(configRoot, homeDirectory, environment).selection;
44
+ const defaults = loadPoConfig(configRoot, homeDirectory, environment).selection;
45
45
  const selectedEnvironment = { ...environment };
46
46
  for (const axis of [
47
47
  "majorMode",
@@ -1 +1 @@
1
- {"version":3,"file":"harnessOptions.mjs","names":["readHarnessState"],"sources":["../../../src/cli/harnessOptions.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { loadDoomConfig } from '@agimon-ai/po-config/config';\nimport { loadDomains } from '@agimon-ai/po-config/domains';\nimport { HARNESS_STATE_KEYS } from '@agimon-ai/po-config/harnessState';\nimport { loadMajorModesConfig } from '@agimon-ai/po-config/majorModes';\nimport { loadProfileCatalog } from '@agimon-ai/po-config/profiles';\nimport type { HarnessFailureReporter } from '@agimon-ai/po-core/runtimeLogSinkTelemetry';\n\nimport { readHarnessState } from '../composition/harnessState';\nimport { findRepositoryRoot } from '../composition/repository';\nimport type { HarnessOptions } from '../composition/types/harness';\nimport { parseHarnessArgs } from './options';\n\nexport interface ResolveHarnessOptionsInput {\n /** Raw launcher arguments, as the binary received them. */\n args: readonly string[];\n environment?: NodeJS.ProcessEnv;\n cwd?: string;\n /** Reads configuration from this root instead of the checkout's own. */\n configRoot?: string;\n /** Reports a malformed inherited harness state without failing the run. */\n report?: HarnessFailureReporter;\n}\n\n/**\n * Uses the nearest configured repository, or the selected directory for an unconfigured workspace.\n * The repository root is canonical (symlinks resolved), the form the server compares\n * workspace roots and saved session checkouts in.\n */\nfunction resolveConfigurationRoot(cwd: string): string {\n try {\n return fs.realpathSync(findRepositoryRoot(cwd));\n } catch {\n return path.resolve(cwd);\n }\n}\n\n/**\n * Settles the configuration root and the full option matrix for one run.\n *\n * Two passes are required: the first reads --cwd without touching repository\n * configuration, which keeps a run resolvable even when modes.yaml is\n * malformed, and the second applies the defaults that root supplies. An\n * inherited root wins, which is how a nested run stays pinned to the outer\n * repository rather than re-deriving one from its own cwd. When no configured\n * repository exists, the selected working directory is the configuration root.\n */\nexport function resolveHarnessOptions(input: ResolveHarnessOptionsInput): HarnessOptions {\n const environment = input.environment ?? process.env;\n const cwd = input.cwd ?? process.cwd();\n const args = [...input.args];\n\n const initial = parseHarnessArgs(args, environment, cwd);\n const inheritedRoot = readHarnessState(environment, input.report).root;\n const repoRoot = inheritedRoot ? path.resolve(inheritedRoot) : resolveConfigurationRoot(initial.options.cwd);\n const homeDirectory = initial.options.homeDirectory ?? environment.HOME ?? os.homedir();\n const configRoot = input.configRoot ?? repoRoot;\n const defaults = loadDoomConfig(configRoot, homeDirectory, environment).selection;\n const selectedEnvironment = { ...environment };\n for (const axis of ['majorMode', 'domains', 'profile'] as const) {\n const value = defaults?.[axis];\n if (value !== undefined && selectedEnvironment[HARNESS_STATE_KEYS[axis]] === undefined)\n selectedEnvironment[HARNESS_STATE_KEYS[axis]] = Array.isArray(value) ? value.join(',') : value;\n }\n const parsed = parseHarnessArgs(\n args,\n selectedEnvironment,\n cwd,\n loadMajorModesConfig(configRoot, homeDirectory, environment).defaultMajorMode,\n loadDomains(configRoot, homeDirectory).defaultDomains,\n loadProfileCatalog(configRoot, homeDirectory).defaultProfile,\n );\n return {\n repoRoot,\n ...(input.configRoot === undefined ? {} : { configRoot }),\n ...parsed.options,\n homeDirectory,\n ...(input.environment === undefined ? {} : { environment: input.environment }),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAgCA,SAAS,yBAAyB,KAAqB;CACrD,IAAI;EACF,OAAO,GAAG,aAAa,mBAAmB,GAAG,CAAC;CAChD,QAAQ;EACN,OAAO,KAAK,QAAQ,GAAG;CACzB;AACF;;;;;;;;;;;AAYA,SAAgB,sBAAsB,OAAmD;CACvF,MAAM,cAAc,MAAM,eAAe,QAAQ;CACjD,MAAM,MAAM,MAAM,OAAO,QAAQ,IAAI;CACrC,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI;CAE3B,MAAM,UAAU,iBAAiB,MAAM,aAAa,GAAG;CACvD,MAAM,gBAAgBA,mBAAiB,aAAa,MAAM,MAAM,CAAC,CAAC;CAClE,MAAM,WAAW,gBAAgB,KAAK,QAAQ,aAAa,IAAI,yBAAyB,QAAQ,QAAQ,GAAG;CAC3G,MAAM,gBAAgB,QAAQ,QAAQ,iBAAiB,YAAY,QAAQ,GAAG,QAAQ;CACtF,MAAM,aAAa,MAAM,cAAc;CACvC,MAAM,WAAW,eAAe,YAAY,eAAe,WAAW,CAAC,CAAC;CACxE,MAAM,sBAAsB,EAAE,GAAG,YAAY;CAC7C,KAAK,MAAM,QAAQ;EAAC;EAAa;EAAW;CAAS,GAAY;EAC/D,MAAM,QAAQ,WAAW;EACzB,IAAI,UAAU,KAAA,KAAa,oBAAoB,mBAAmB,WAAW,KAAA,GAC3E,oBAAoB,mBAAmB,SAAS,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,GAAG,IAAI;CAC7F;CACA,MAAM,SAAS,iBACb,MACA,qBACA,KACA,qBAAqB,YAAY,eAAe,WAAW,CAAC,CAAC,kBAC7D,YAAY,YAAY,aAAa,CAAC,CAAC,gBACvC,mBAAmB,YAAY,aAAa,CAAC,CAAC,cAChD;CACA,OAAO;EACL;EACA,GAAI,MAAM,eAAe,KAAA,IAAY,CAAC,IAAI,EAAE,WAAW;EACvD,GAAG,OAAO;EACV;EACA,GAAI,MAAM,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,MAAM,YAAY;CAC9E;AACF"}
1
+ {"version":3,"file":"harnessOptions.mjs","names":["readHarnessState"],"sources":["../../../src/cli/harnessOptions.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { loadPoConfig } from '@agimon-ai/po-config/config';\nimport { loadDomains } from '@agimon-ai/po-config/domains';\nimport { HARNESS_STATE_KEYS } from '@agimon-ai/po-config/harnessState';\nimport { loadMajorModesConfig } from '@agimon-ai/po-config/majorModes';\nimport { loadProfileCatalog } from '@agimon-ai/po-config/profiles';\nimport type { HarnessFailureReporter } from '@agimon-ai/po-core/runtimeLogSinkTelemetry';\n\nimport { readHarnessState } from '../composition/harnessState';\nimport { findRepositoryRoot } from '../composition/repository';\nimport type { HarnessOptions } from '../composition/types/harness';\nimport { parseHarnessArgs } from './options';\n\nexport interface ResolveHarnessOptionsInput {\n /** Raw launcher arguments, as the binary received them. */\n args: readonly string[];\n environment?: NodeJS.ProcessEnv;\n cwd?: string;\n /** Reads configuration from this root instead of the checkout's own. */\n configRoot?: string;\n /** Reports a malformed inherited harness state without failing the run. */\n report?: HarnessFailureReporter;\n}\n\n/**\n * Uses the nearest configured repository, or the selected directory for an unconfigured workspace.\n * The repository root is canonical (symlinks resolved), the form the server compares\n * workspace roots and saved session checkouts in.\n */\nfunction resolveConfigurationRoot(cwd: string): string {\n try {\n return fs.realpathSync(findRepositoryRoot(cwd));\n } catch {\n return path.resolve(cwd);\n }\n}\n\n/**\n * Settles the configuration root and the full option matrix for one run.\n *\n * Two passes are required: the first reads --cwd without touching repository\n * configuration, which keeps a run resolvable even when modes.yaml is\n * malformed, and the second applies the defaults that root supplies. An\n * inherited root wins, which is how a nested run stays pinned to the outer\n * repository rather than re-deriving one from its own cwd. When no configured\n * repository exists, the selected working directory is the configuration root.\n */\nexport function resolveHarnessOptions(input: ResolveHarnessOptionsInput): HarnessOptions {\n const environment = input.environment ?? process.env;\n const cwd = input.cwd ?? process.cwd();\n const args = [...input.args];\n\n const initial = parseHarnessArgs(args, environment, cwd);\n const inheritedRoot = readHarnessState(environment, input.report).root;\n const repoRoot = inheritedRoot ? path.resolve(inheritedRoot) : resolveConfigurationRoot(initial.options.cwd);\n const homeDirectory = initial.options.homeDirectory ?? environment.HOME ?? os.homedir();\n const configRoot = input.configRoot ?? repoRoot;\n const defaults = loadPoConfig(configRoot, homeDirectory, environment).selection;\n const selectedEnvironment = { ...environment };\n for (const axis of ['majorMode', 'domains', 'profile'] as const) {\n const value = defaults?.[axis];\n if (value !== undefined && selectedEnvironment[HARNESS_STATE_KEYS[axis]] === undefined)\n selectedEnvironment[HARNESS_STATE_KEYS[axis]] = Array.isArray(value) ? value.join(',') : value;\n }\n const parsed = parseHarnessArgs(\n args,\n selectedEnvironment,\n cwd,\n loadMajorModesConfig(configRoot, homeDirectory, environment).defaultMajorMode,\n loadDomains(configRoot, homeDirectory).defaultDomains,\n loadProfileCatalog(configRoot, homeDirectory).defaultProfile,\n );\n return {\n repoRoot,\n ...(input.configRoot === undefined ? {} : { configRoot }),\n ...parsed.options,\n homeDirectory,\n ...(input.environment === undefined ? {} : { environment: input.environment }),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAgCA,SAAS,yBAAyB,KAAqB;CACrD,IAAI;EACF,OAAO,GAAG,aAAa,mBAAmB,GAAG,CAAC;CAChD,QAAQ;EACN,OAAO,KAAK,QAAQ,GAAG;CACzB;AACF;;;;;;;;;;;AAYA,SAAgB,sBAAsB,OAAmD;CACvF,MAAM,cAAc,MAAM,eAAe,QAAQ;CACjD,MAAM,MAAM,MAAM,OAAO,QAAQ,IAAI;CACrC,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI;CAE3B,MAAM,UAAU,iBAAiB,MAAM,aAAa,GAAG;CACvD,MAAM,gBAAgBA,mBAAiB,aAAa,MAAM,MAAM,CAAC,CAAC;CAClE,MAAM,WAAW,gBAAgB,KAAK,QAAQ,aAAa,IAAI,yBAAyB,QAAQ,QAAQ,GAAG;CAC3G,MAAM,gBAAgB,QAAQ,QAAQ,iBAAiB,YAAY,QAAQ,GAAG,QAAQ;CACtF,MAAM,aAAa,MAAM,cAAc;CACvC,MAAM,WAAW,aAAa,YAAY,eAAe,WAAW,CAAC,CAAC;CACtE,MAAM,sBAAsB,EAAE,GAAG,YAAY;CAC7C,KAAK,MAAM,QAAQ;EAAC;EAAa;EAAW;CAAS,GAAY;EAC/D,MAAM,QAAQ,WAAW;EACzB,IAAI,UAAU,KAAA,KAAa,oBAAoB,mBAAmB,WAAW,KAAA,GAC3E,oBAAoB,mBAAmB,SAAS,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,GAAG,IAAI;CAC7F;CACA,MAAM,SAAS,iBACb,MACA,qBACA,KACA,qBAAqB,YAAY,eAAe,WAAW,CAAC,CAAC,kBAC7D,YAAY,YAAY,aAAa,CAAC,CAAC,gBACvC,mBAAmB,YAAY,aAAa,CAAC,CAAC,cAChD;CACA,OAAO;EACL;EACA,GAAI,MAAM,eAAe,KAAA,IAAY,CAAC,IAAI,EAAE,WAAW;EACvD,GAAG,OAAO;EACV;EACA,GAAI,MAAM,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,MAAM,YAAY;CAC9E;AACF"}
@@ -36,6 +36,8 @@ ${require_help.COMPATIBILITY_MATRIX_OPTIONS}
36
36
  All other compatibility arguments pass to the provider unchanged.
37
37
 
38
38
  Harness options:
39
+ --test Use the local checkout build and <checkout>/.po/test
40
+ (web ports: 7633/7634, also po-web --test or web-test)
39
41
  --major-mode <name> Named major mode from .po/modes.yaml
40
42
  (default: copilot). Not --mode: Pi owns that one.
41
43
  --profile <name> Persona and env from .po/profiles.yaml
@@ -1 +1 @@
1
- {"version":3,"file":"help.cjs","names":["require","createRequire","COMPATIBILITY_MATRIX_OPTIONS"],"sources":["../../../src/cli/help.ts"],"sourcesContent":["import { COMPATIBILITY_MATRIX_OPTIONS } from './commands/compat/help';\nexport { initHelp } from './commands/init/help';\nexport { syncHelp } from './commands/sync/help';\nexport { compatHelp } from './commands/compat/help';\nexport { doctorHelp } from './commands/doctor/help';\nimport { createRequire } from 'node:module';\n\n// createRequire rather than a JSON import: this file runs both from src under\n// Node's strip-only TypeScript mode (how pi.sh starts it) and from dist. The\n// package self-reference resolves the same published manifest from either tree.\nconst require = createRequire(import.meta.url);\nconst PACKAGE_MANIFEST = '@agimon-ai/po/package.json';\n\nexport const HARNESS_VERSION = (require(PACKAGE_MANIFEST) as { version: string }).version;\n\nexport function printHelp(): void {\n process.stdout.write(`po\n\nUsage: po [po-web options]\n po --explain | --emit-mcp <dir> [harness options]\n po init\n po sync [matrix options] [--check]\n po api-export --out <directory> [--major-mode <name>] [--strict]\n po compat <codex|claude|antigravity> [matrix options] [provider arguments]\n\nRunning po with no subcommand starts the po-web console (install\n@agimon-ai/po-web next to po) and passes every argument to it.\n\nInitialization:\n po init Fill missing files in ~/.po\n po sync Update packages, build, resolve, and register Po\n in Pi user settings\n po sync --check Exit non-zero when the synced config is out of date\n or report legacy repository-local state to migrate\n\nPo keeps its configuration, builds, and Pi agent directory under ~/.po\n(PO_HOME moves it). Po never removes old or orphaned generated directories\nautomatically.\n\nAfter a sync, run pi directly. The synced session accepts --major-mode,\n--domains, and --profile, and /mode, /domains, and /profile switch\nwithout a restart. Selection defaults come from the selection block in\n.po/config.yaml.\n\n${COMPATIBILITY_MATRIX_OPTIONS}\nAll other compatibility arguments pass to the provider unchanged.\n\nHarness options:\n --major-mode <name> Named major mode from .po/modes.yaml\n (default: copilot). Not --mode: Pi owns that one.\n --profile <name> Persona and env from .po/profiles.yaml\n --domains <names> Comma-separated domains (content: plugins, skills)\n --no-domains Load no content domains\n --explain Print the resolved matrix and exit\n --emit-mcp <dir> Write the resolved MCP config to a directory and exit\n --plugin-dir <path> Load an explicit plugin directory, repeatable\n --add-dir <path> Add an accessible directory, repeatable\n --preset <name> default or kimi\n --cwd <path> Run Pi in this directory\n --automation Use print mode, JSON output, and project approval\n --output-format vibe-lint Read a vibe-lint request from stdin and emit one JSON response\n --allow-protected-writes Allow writes to protected repository paths\n --hooks, --no-hooks Enable or disable repository and plugin hooks\n --mcp, --no-mcp Enable or disable MCP configuration\n --agents, --no-agents Enable or disable spawnable agents\n -h, --help Show harness help\n -v, --version Show harness version\n\nInteractive commands:\n /loop Open the loop launcher picker\n /loops List active loops and stop future scheduling\n /effort <level> Set and persist the thinking effort\n /mode Pick a named major mode\n /domains [names] Show the selected domains or pick a different set\n /profile List or switch persona and environment profiles\n\nMinor modes are toggled from the Leader menu, not by a slash command:\n SPC p e Plan mode (repository read-only)\n SPC w e Workflow tools for the agent\n\nAll remaining options are passed to Pi.\n`);\n}\n"],"mappings":";;;;AAaA,MAAa,mBAHPA,wBAAUC,CAAAA,CAAAA,cAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,IAGgBD,CAAAA,CAAQ,4BAAgB,CAAC,CAAyB;AAElF,SAAgB,YAAkB;CAChC,QAAQ,OAAO,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BrBE,aAAAA,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqC9B;AACD"}
1
+ {"version":3,"file":"help.cjs","names":["require","createRequire","COMPATIBILITY_MATRIX_OPTIONS"],"sources":["../../../src/cli/help.ts"],"sourcesContent":["import { COMPATIBILITY_MATRIX_OPTIONS } from './commands/compat/help';\nexport { initHelp } from './commands/init/help';\nexport { syncHelp } from './commands/sync/help';\nexport { compatHelp } from './commands/compat/help';\nexport { doctorHelp } from './commands/doctor/help';\nimport { createRequire } from 'node:module';\n\n// createRequire rather than a JSON import: this file runs both from src under\n// Node's strip-only TypeScript mode (how pi.sh starts it) and from dist. The\n// package self-reference resolves the same published manifest from either tree.\nconst require = createRequire(import.meta.url);\nconst PACKAGE_MANIFEST = '@agimon-ai/po/package.json';\n\nexport const HARNESS_VERSION = (require(PACKAGE_MANIFEST) as { version: string }).version;\n\nexport function printHelp(): void {\n process.stdout.write(`po\n\nUsage: po [po-web options]\n po --explain | --emit-mcp <dir> [harness options]\n po init\n po sync [matrix options] [--check]\n po api-export --out <directory> [--major-mode <name>] [--strict]\n po compat <codex|claude|antigravity> [matrix options] [provider arguments]\n\nRunning po with no subcommand starts the po-web console (install\n@agimon-ai/po-web next to po) and passes every argument to it.\n\nInitialization:\n po init Fill missing files in ~/.po\n po sync Update packages, build, resolve, and register Po\n in Pi user settings\n po sync --check Exit non-zero when the synced config is out of date\n or report legacy repository-local state to migrate\n\nPo keeps its configuration, builds, and Pi agent directory under ~/.po\n(PO_HOME moves it). Po never removes old or orphaned generated directories\nautomatically.\n\nAfter a sync, run pi directly. The synced session accepts --major-mode,\n--domains, and --profile, and /mode, /domains, and /profile switch\nwithout a restart. Selection defaults come from the selection block in\n.po/config.yaml.\n\n${COMPATIBILITY_MATRIX_OPTIONS}\nAll other compatibility arguments pass to the provider unchanged.\n\nHarness options:\n --test Use the local checkout build and <checkout>/.po/test\n (web ports: 7633/7634, also po-web --test or web-test)\n --major-mode <name> Named major mode from .po/modes.yaml\n (default: copilot). Not --mode: Pi owns that one.\n --profile <name> Persona and env from .po/profiles.yaml\n --domains <names> Comma-separated domains (content: plugins, skills)\n --no-domains Load no content domains\n --explain Print the resolved matrix and exit\n --emit-mcp <dir> Write the resolved MCP config to a directory and exit\n --plugin-dir <path> Load an explicit plugin directory, repeatable\n --add-dir <path> Add an accessible directory, repeatable\n --preset <name> default or kimi\n --cwd <path> Run Pi in this directory\n --automation Use print mode, JSON output, and project approval\n --output-format vibe-lint Read a vibe-lint request from stdin and emit one JSON response\n --allow-protected-writes Allow writes to protected repository paths\n --hooks, --no-hooks Enable or disable repository and plugin hooks\n --mcp, --no-mcp Enable or disable MCP configuration\n --agents, --no-agents Enable or disable spawnable agents\n -h, --help Show harness help\n -v, --version Show harness version\n\nInteractive commands:\n /loop Open the loop launcher picker\n /loops List active loops and stop future scheduling\n /effort <level> Set and persist the thinking effort\n /mode Pick a named major mode\n /domains [names] Show the selected domains or pick a different set\n /profile List or switch persona and environment profiles\n\nMinor modes are toggled from the Leader menu, not by a slash command:\n SPC p e Plan mode (repository read-only)\n SPC w e Workflow tools for the agent\n\nAll remaining options are passed to Pi.\n`);\n}\n"],"mappings":";;;;AAaA,MAAa,mBAHPA,wBAAUC,CAAAA,CAAAA,cAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,IAGgBD,CAAAA,CAAQ,4BAAgB,CAAC,CAAyB;AAElF,SAAgB,YAAkB;CAChC,QAAQ,OAAO,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BrBE,aAAAA,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuC9B;AACD"}
@@ -37,6 +37,8 @@ ${COMPATIBILITY_MATRIX_OPTIONS}
37
37
  All other compatibility arguments pass to the provider unchanged.
38
38
 
39
39
  Harness options:
40
+ --test Use the local checkout build and <checkout>/.po/test
41
+ (web ports: 7633/7634, also po-web --test or web-test)
40
42
  --major-mode <name> Named major mode from .po/modes.yaml
41
43
  (default: copilot). Not --mode: Pi owns that one.
42
44
  --profile <name> Persona and env from .po/profiles.yaml
@@ -1 +1 @@
1
- {"version":3,"file":"help.mjs","names":[],"sources":["../../../src/cli/help.ts"],"sourcesContent":["import { COMPATIBILITY_MATRIX_OPTIONS } from './commands/compat/help';\nexport { initHelp } from './commands/init/help';\nexport { syncHelp } from './commands/sync/help';\nexport { compatHelp } from './commands/compat/help';\nexport { doctorHelp } from './commands/doctor/help';\nimport { createRequire } from 'node:module';\n\n// createRequire rather than a JSON import: this file runs both from src under\n// Node's strip-only TypeScript mode (how pi.sh starts it) and from dist. The\n// package self-reference resolves the same published manifest from either tree.\nconst require = createRequire(import.meta.url);\nconst PACKAGE_MANIFEST = '@agimon-ai/po/package.json';\n\nexport const HARNESS_VERSION = (require(PACKAGE_MANIFEST) as { version: string }).version;\n\nexport function printHelp(): void {\n process.stdout.write(`po\n\nUsage: po [po-web options]\n po --explain | --emit-mcp <dir> [harness options]\n po init\n po sync [matrix options] [--check]\n po api-export --out <directory> [--major-mode <name>] [--strict]\n po compat <codex|claude|antigravity> [matrix options] [provider arguments]\n\nRunning po with no subcommand starts the po-web console (install\n@agimon-ai/po-web next to po) and passes every argument to it.\n\nInitialization:\n po init Fill missing files in ~/.po\n po sync Update packages, build, resolve, and register Po\n in Pi user settings\n po sync --check Exit non-zero when the synced config is out of date\n or report legacy repository-local state to migrate\n\nPo keeps its configuration, builds, and Pi agent directory under ~/.po\n(PO_HOME moves it). Po never removes old or orphaned generated directories\nautomatically.\n\nAfter a sync, run pi directly. The synced session accepts --major-mode,\n--domains, and --profile, and /mode, /domains, and /profile switch\nwithout a restart. Selection defaults come from the selection block in\n.po/config.yaml.\n\n${COMPATIBILITY_MATRIX_OPTIONS}\nAll other compatibility arguments pass to the provider unchanged.\n\nHarness options:\n --major-mode <name> Named major mode from .po/modes.yaml\n (default: copilot). Not --mode: Pi owns that one.\n --profile <name> Persona and env from .po/profiles.yaml\n --domains <names> Comma-separated domains (content: plugins, skills)\n --no-domains Load no content domains\n --explain Print the resolved matrix and exit\n --emit-mcp <dir> Write the resolved MCP config to a directory and exit\n --plugin-dir <path> Load an explicit plugin directory, repeatable\n --add-dir <path> Add an accessible directory, repeatable\n --preset <name> default or kimi\n --cwd <path> Run Pi in this directory\n --automation Use print mode, JSON output, and project approval\n --output-format vibe-lint Read a vibe-lint request from stdin and emit one JSON response\n --allow-protected-writes Allow writes to protected repository paths\n --hooks, --no-hooks Enable or disable repository and plugin hooks\n --mcp, --no-mcp Enable or disable MCP configuration\n --agents, --no-agents Enable or disable spawnable agents\n -h, --help Show harness help\n -v, --version Show harness version\n\nInteractive commands:\n /loop Open the loop launcher picker\n /loops List active loops and stop future scheduling\n /effort <level> Set and persist the thinking effort\n /mode Pick a named major mode\n /domains [names] Show the selected domains or pick a different set\n /profile List or switch persona and environment profiles\n\nMinor modes are toggled from the Leader menu, not by a slash command:\n SPC p e Plan mode (repository read-only)\n SPC w e Workflow tools for the agent\n\nAll remaining options are passed to Pi.\n`);\n}\n"],"mappings":";;;;;AAaA,MAAa,kBAHG,cAAc,YAAY,GAGV,CAAA,CAAQ,4BAAgB,CAAC,CAAyB;AAElF,SAAgB,YAAkB;CAChC,QAAQ,OAAO,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BrB,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqC9B;AACD"}
1
+ {"version":3,"file":"help.mjs","names":[],"sources":["../../../src/cli/help.ts"],"sourcesContent":["import { COMPATIBILITY_MATRIX_OPTIONS } from './commands/compat/help';\nexport { initHelp } from './commands/init/help';\nexport { syncHelp } from './commands/sync/help';\nexport { compatHelp } from './commands/compat/help';\nexport { doctorHelp } from './commands/doctor/help';\nimport { createRequire } from 'node:module';\n\n// createRequire rather than a JSON import: this file runs both from src under\n// Node's strip-only TypeScript mode (how pi.sh starts it) and from dist. The\n// package self-reference resolves the same published manifest from either tree.\nconst require = createRequire(import.meta.url);\nconst PACKAGE_MANIFEST = '@agimon-ai/po/package.json';\n\nexport const HARNESS_VERSION = (require(PACKAGE_MANIFEST) as { version: string }).version;\n\nexport function printHelp(): void {\n process.stdout.write(`po\n\nUsage: po [po-web options]\n po --explain | --emit-mcp <dir> [harness options]\n po init\n po sync [matrix options] [--check]\n po api-export --out <directory> [--major-mode <name>] [--strict]\n po compat <codex|claude|antigravity> [matrix options] [provider arguments]\n\nRunning po with no subcommand starts the po-web console (install\n@agimon-ai/po-web next to po) and passes every argument to it.\n\nInitialization:\n po init Fill missing files in ~/.po\n po sync Update packages, build, resolve, and register Po\n in Pi user settings\n po sync --check Exit non-zero when the synced config is out of date\n or report legacy repository-local state to migrate\n\nPo keeps its configuration, builds, and Pi agent directory under ~/.po\n(PO_HOME moves it). Po never removes old or orphaned generated directories\nautomatically.\n\nAfter a sync, run pi directly. The synced session accepts --major-mode,\n--domains, and --profile, and /mode, /domains, and /profile switch\nwithout a restart. Selection defaults come from the selection block in\n.po/config.yaml.\n\n${COMPATIBILITY_MATRIX_OPTIONS}\nAll other compatibility arguments pass to the provider unchanged.\n\nHarness options:\n --test Use the local checkout build and <checkout>/.po/test\n (web ports: 7633/7634, also po-web --test or web-test)\n --major-mode <name> Named major mode from .po/modes.yaml\n (default: copilot). Not --mode: Pi owns that one.\n --profile <name> Persona and env from .po/profiles.yaml\n --domains <names> Comma-separated domains (content: plugins, skills)\n --no-domains Load no content domains\n --explain Print the resolved matrix and exit\n --emit-mcp <dir> Write the resolved MCP config to a directory and exit\n --plugin-dir <path> Load an explicit plugin directory, repeatable\n --add-dir <path> Add an accessible directory, repeatable\n --preset <name> default or kimi\n --cwd <path> Run Pi in this directory\n --automation Use print mode, JSON output, and project approval\n --output-format vibe-lint Read a vibe-lint request from stdin and emit one JSON response\n --allow-protected-writes Allow writes to protected repository paths\n --hooks, --no-hooks Enable or disable repository and plugin hooks\n --mcp, --no-mcp Enable or disable MCP configuration\n --agents, --no-agents Enable or disable spawnable agents\n -h, --help Show harness help\n -v, --version Show harness version\n\nInteractive commands:\n /loop Open the loop launcher picker\n /loops List active loops and stop future scheduling\n /effort <level> Set and persist the thinking effort\n /mode Pick a named major mode\n /domains [names] Show the selected domains or pick a different set\n /profile List or switch persona and environment profiles\n\nMinor modes are toggled from the Leader menu, not by a slash command:\n SPC p e Plan mode (repository read-only)\n SPC w e Workflow tools for the agent\n\nAll remaining options are passed to Pi.\n`);\n}\n"],"mappings":";;;;;AAaA,MAAa,kBAHG,cAAc,YAAY,GAGV,CAAA,CAAQ,4BAAgB,CAAC,CAAyB;AAElF,SAAgB,YAAkB;CAChC,QAAQ,OAAO,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BrB,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuC9B;AACD"}
@@ -15,7 +15,7 @@ node_path = require_runtime.__toESM(node_path, 1);
15
15
  /**
16
16
  * One variable per axis.
17
17
  *
18
- * These used to come in pairs, `DOOM_PI_*` for what the caller selected and
18
+ * These used to come in pairs, `PO_PI_*` for what the caller selected and
19
19
  * `PO_*` for what the harness resolved and published, with the second
20
20
  * outranking the first. A nested run still inherits its launcher's choice under
21
21
  * one name, because the launcher projects into the child environment and
@@ -1 +1 @@
1
- {"version":3,"file":"matrixOptions.cjs","names":["path"],"sources":["../../../src/cli/matrixOptions.ts"],"sourcesContent":["import path from 'node:path';\n\n/**\n * Matrix selection shared by the Pi and compatibility parsers.\n *\n * Both frontends pick the same three axes (profile, domains, major mode) out of\n * the same environment variables with the same defaults. They used to hold two\n * copies of that logic, and the copies drifted: the inline `--name=value` forms\n * and the strict value reader existed in the compatibility parser only, so\n * `./pi.sh --profile=x` silently forwarded an unknown flag to Pi. One copy here\n * is what keeps them honest.\n */\n\n/**\n * One variable per axis.\n *\n * These used to come in pairs, `DOOM_PI_*` for what the caller selected and\n * `PO_*` for what the harness resolved and published, with the second\n * outranking the first. A nested run still inherits its launcher's choice under\n * one name, because the launcher projects into the child environment and\n * overwrites the same key. Two names for one value only ever meant two ways to\n * disagree.\n */\nexport const PO_PROFILE_ENV = 'PO_PROFILE';\nexport const PO_DOMAINS_ENV = 'PO_DOMAINS';\nexport const PO_MAJOR_MODE_ENV = 'PO_MAJOR_MODE';\nexport const PO_ADDITIONAL_DIRECTORIES_ENV = 'PO_ADDITIONAL_DIRS';\nexport const PO_PRESET_ENV = 'PO_PRESET';\n\n/** Removed spelling of the major mode axis, reported rather than honored. */\nexport const REMOVED_PO_LAYER_ENV = 'PO_LAYER';\n\n/**\n * The whole retired namespace, reported rather than ignored.\n *\n * A prefix scan rather than a constant per variable: there were 28 of them, and\n * a list maintained by hand is a list that misses one. A stale\n * `export AGENT_HARNESS_MAJOR_MODE=dev` in a shell profile would otherwise\n * silently start the session on `copilot`.\n */\nconst RETIRED_ENV_PREFIX = 'AGENT_HARNESS_';\nconst CURRENT_ENV_PREFIX = 'PO_';\n\nexport const PROFILE_OPTION = '--profile';\nexport const DOMAIN_OPTION = '--domain';\nexport const DOMAINS_OPTION = '--domains';\n/**\n * The major mode flag.\n *\n * Not `--mode`: Pi owns that one for its output mode, and for a value outside\n * `text|json|rpc` it consumes both tokens and ignores them without a\n * diagnostic. A synced `pi --mode dev` would have failed silently.\n */\nexport const MAJOR_MODE_OPTION = '--major-mode';\nexport const ADD_DIRECTORY_OPTION = '--add-dir';\nexport const REMOVED_LAYER_OPTION = '--layer';\nexport const REMOVED_LAYERS_OPTION = '--layers';\nexport const REMOVED_TARGET_OPTION = '--target';\n\nexport const DEFAULT_MAJOR_MODE = 'copilot';\nexport const DEFAULT_DOMAIN = 'default';\n\nconst CSV_DELIMITER = ',';\nconst OPTION_PREFIX = '--';\n\nexport interface OptionMatch {\n value: string;\n /** Index of the last argument consumed, for the caller's loop cursor. */\n nextIndex: number;\n /** True for `--name=value`. Callers that re-emit an option preserve the form. */\n inline: boolean;\n}\n\n/**\n * Reads `--name value` or `--name=value`, returning undefined for anything else.\n *\n * A value starting with `--` is rejected rather than consumed, so\n * `--profile --explain` reports a missing value instead of swallowing the next\n * flag. In compatibility mode this is also what stops the `--` provider\n * delimiter being taken as a matrix value.\n */\nexport function readOption(args: string[], index: number, name: string): OptionMatch | undefined {\n // Callers walk `args` by index, so this is always in range.\n const arg = args[index]!;\n if (arg === name) {\n const value = args[index + 1];\n if (!value || value.startsWith(OPTION_PREFIX)) throw new Error(`${name} requires a value`);\n return { value, nextIndex: index + 1, inline: false };\n }\n const inlinePrefix = `${name}=`;\n if (!arg.startsWith(inlinePrefix)) return undefined;\n const value = arg.slice(inlinePrefix.length);\n if (!value) throw new Error(`${name} requires a value`);\n return { value, nextIndex: index, inline: true };\n}\n\n/** Matches `--name` or `--name=value`, for reporting options that were removed. */\nexport function matchesOption(arg: string, name: string): boolean {\n return arg === name || arg.startsWith(`${name}=`);\n}\n\nexport function parseCsv(value: string): string[] {\n return value\n .split(CSV_DELIMITER)\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nexport function parseRequiredCsv(value: string, option: string): string[] {\n const values = parseCsv(value);\n if (values.length === 0) throw new Error(`${option} requires a value`);\n return values;\n}\n\nexport function parseMajorMode(value: string, source: string): string {\n const majorMode = value.trim();\n if (!majorMode) throw new Error(`${source} requires a value`);\n if (majorMode.includes(CSV_DELIMITER)) throw new Error(`${source} accepts one major mode name`);\n return majorMode;\n}\n\nexport function parseProfileValue(value: string, source: string): string {\n if (value.includes(CSV_DELIMITER)) throw new Error(`${source} accepts one profile name`);\n if (!value.trim()) throw new Error(`${source} requires a value`);\n return value;\n}\n\n/**\n * Reports any variable left over from the retired `AGENT_HARNESS_*` namespace.\n *\n * Called before anything reads the environment, so a stale export fails the\n * session instead of being quietly outvoted by a default. Both prefixes are\n * built from the constants above rather than written inline, because a\n * search-and-replace over this repository is exactly what retired the old one.\n */\nexport function assertNoRetiredEnvironment(environment: NodeJS.ProcessEnv): void {\n const stale = Object.keys(environment)\n .filter((key) => key.startsWith(RETIRED_ENV_PREFIX))\n .sort();\n if (stale.length === 0) return;\n const replacements = stale.map((key) => `${key} -> ${CURRENT_ENV_PREFIX}${key.slice(RETIRED_ENV_PREFIX.length)}`);\n throw new Error(\n `The ${RETIRED_ENV_PREFIX}* environment was replaced by ${CURRENT_ENV_PREFIX}*. Unset or rename: ${replacements.join(', ')}`,\n );\n}\n\n/**\n * The major mode a nested run inherits from its launcher, or the default.\n *\n * The removed spelling throws rather than being ignored. A stale\n * `export PO_LAYER=dev` left in a shell profile would otherwise silently\n * select `copilot`, which is the exact confusion the rename removed.\n */\nexport function resolveInheritedMajorMode(\n environment: NodeJS.ProcessEnv,\n defaultMajorMode: string = DEFAULT_MAJOR_MODE,\n): string {\n assertNoRetiredEnvironment(environment);\n if (environment[REMOVED_PO_LAYER_ENV]) {\n throw new Error(`${REMOVED_PO_LAYER_ENV} was replaced by ${PO_MAJOR_MODE_ENV}`);\n }\n const inherited = environment[PO_MAJOR_MODE_ENV];\n return parseMajorMode(inherited || defaultMajorMode, inherited ? PO_MAJOR_MODE_ENV : 'defaultMajorMode');\n}\n\n/** The profile a run inherits from its environment, validated once up front. */\nexport function resolveInheritedProfile(environment: NodeJS.ProcessEnv): string | undefined {\n const inherited = environment[PO_PROFILE_ENV] || undefined;\n if (inherited?.includes(CSV_DELIMITER)) throw new Error(`${PO_PROFILE_ENV} accepts one profile name`);\n return inherited;\n}\n\n/** Directories inherited from the launcher environment. */\nexport function resolveAdditionalDirectories(environment: NodeJS.ProcessEnv, baseDirectory: string): string[] {\n return (environment[PO_ADDITIONAL_DIRECTORIES_ENV] ?? '')\n .split(path.delimiter)\n .filter(Boolean)\n .map((directory) => path.resolve(baseDirectory, directory));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"matrixOptions.cjs","names":["path"],"sources":["../../../src/cli/matrixOptions.ts"],"sourcesContent":["import path from 'node:path';\n\n/**\n * Matrix selection shared by the Pi and compatibility parsers.\n *\n * Both frontends pick the same three axes (profile, domains, major mode) out of\n * the same environment variables with the same defaults. They used to hold two\n * copies of that logic, and the copies drifted: the inline `--name=value` forms\n * and the strict value reader existed in the compatibility parser only, so\n * `./pi.sh --profile=x` silently forwarded an unknown flag to Pi. One copy here\n * is what keeps them honest.\n */\n\n/**\n * One variable per axis.\n *\n * These used to come in pairs, `PO_PI_*` for what the caller selected and\n * `PO_*` for what the harness resolved and published, with the second\n * outranking the first. A nested run still inherits its launcher's choice under\n * one name, because the launcher projects into the child environment and\n * overwrites the same key. Two names for one value only ever meant two ways to\n * disagree.\n */\nexport const PO_PROFILE_ENV = 'PO_PROFILE';\nexport const PO_DOMAINS_ENV = 'PO_DOMAINS';\nexport const PO_MAJOR_MODE_ENV = 'PO_MAJOR_MODE';\nexport const PO_ADDITIONAL_DIRECTORIES_ENV = 'PO_ADDITIONAL_DIRS';\nexport const PO_PRESET_ENV = 'PO_PRESET';\n\n/** Removed spelling of the major mode axis, reported rather than honored. */\nexport const REMOVED_PO_LAYER_ENV = 'PO_LAYER';\n\n/**\n * The whole retired namespace, reported rather than ignored.\n *\n * A prefix scan rather than a constant per variable: there were 28 of them, and\n * a list maintained by hand is a list that misses one. A stale\n * `export AGENT_HARNESS_MAJOR_MODE=dev` in a shell profile would otherwise\n * silently start the session on `copilot`.\n */\nconst RETIRED_ENV_PREFIX = 'AGENT_HARNESS_';\nconst CURRENT_ENV_PREFIX = 'PO_';\n\nexport const PROFILE_OPTION = '--profile';\nexport const DOMAIN_OPTION = '--domain';\nexport const DOMAINS_OPTION = '--domains';\n/**\n * The major mode flag.\n *\n * Not `--mode`: Pi owns that one for its output mode, and for a value outside\n * `text|json|rpc` it consumes both tokens and ignores them without a\n * diagnostic. A synced `pi --mode dev` would have failed silently.\n */\nexport const MAJOR_MODE_OPTION = '--major-mode';\nexport const ADD_DIRECTORY_OPTION = '--add-dir';\nexport const REMOVED_LAYER_OPTION = '--layer';\nexport const REMOVED_LAYERS_OPTION = '--layers';\nexport const REMOVED_TARGET_OPTION = '--target';\n\nexport const DEFAULT_MAJOR_MODE = 'copilot';\nexport const DEFAULT_DOMAIN = 'default';\n\nconst CSV_DELIMITER = ',';\nconst OPTION_PREFIX = '--';\n\nexport interface OptionMatch {\n value: string;\n /** Index of the last argument consumed, for the caller's loop cursor. */\n nextIndex: number;\n /** True for `--name=value`. Callers that re-emit an option preserve the form. */\n inline: boolean;\n}\n\n/**\n * Reads `--name value` or `--name=value`, returning undefined for anything else.\n *\n * A value starting with `--` is rejected rather than consumed, so\n * `--profile --explain` reports a missing value instead of swallowing the next\n * flag. In compatibility mode this is also what stops the `--` provider\n * delimiter being taken as a matrix value.\n */\nexport function readOption(args: string[], index: number, name: string): OptionMatch | undefined {\n // Callers walk `args` by index, so this is always in range.\n const arg = args[index]!;\n if (arg === name) {\n const value = args[index + 1];\n if (!value || value.startsWith(OPTION_PREFIX)) throw new Error(`${name} requires a value`);\n return { value, nextIndex: index + 1, inline: false };\n }\n const inlinePrefix = `${name}=`;\n if (!arg.startsWith(inlinePrefix)) return undefined;\n const value = arg.slice(inlinePrefix.length);\n if (!value) throw new Error(`${name} requires a value`);\n return { value, nextIndex: index, inline: true };\n}\n\n/** Matches `--name` or `--name=value`, for reporting options that were removed. */\nexport function matchesOption(arg: string, name: string): boolean {\n return arg === name || arg.startsWith(`${name}=`);\n}\n\nexport function parseCsv(value: string): string[] {\n return value\n .split(CSV_DELIMITER)\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nexport function parseRequiredCsv(value: string, option: string): string[] {\n const values = parseCsv(value);\n if (values.length === 0) throw new Error(`${option} requires a value`);\n return values;\n}\n\nexport function parseMajorMode(value: string, source: string): string {\n const majorMode = value.trim();\n if (!majorMode) throw new Error(`${source} requires a value`);\n if (majorMode.includes(CSV_DELIMITER)) throw new Error(`${source} accepts one major mode name`);\n return majorMode;\n}\n\nexport function parseProfileValue(value: string, source: string): string {\n if (value.includes(CSV_DELIMITER)) throw new Error(`${source} accepts one profile name`);\n if (!value.trim()) throw new Error(`${source} requires a value`);\n return value;\n}\n\n/**\n * Reports any variable left over from the retired `AGENT_HARNESS_*` namespace.\n *\n * Called before anything reads the environment, so a stale export fails the\n * session instead of being quietly outvoted by a default. Both prefixes are\n * built from the constants above rather than written inline, because a\n * search-and-replace over this repository is exactly what retired the old one.\n */\nexport function assertNoRetiredEnvironment(environment: NodeJS.ProcessEnv): void {\n const stale = Object.keys(environment)\n .filter((key) => key.startsWith(RETIRED_ENV_PREFIX))\n .sort();\n if (stale.length === 0) return;\n const replacements = stale.map((key) => `${key} -> ${CURRENT_ENV_PREFIX}${key.slice(RETIRED_ENV_PREFIX.length)}`);\n throw new Error(\n `The ${RETIRED_ENV_PREFIX}* environment was replaced by ${CURRENT_ENV_PREFIX}*. Unset or rename: ${replacements.join(', ')}`,\n );\n}\n\n/**\n * The major mode a nested run inherits from its launcher, or the default.\n *\n * The removed spelling throws rather than being ignored. A stale\n * `export PO_LAYER=dev` left in a shell profile would otherwise silently\n * select `copilot`, which is the exact confusion the rename removed.\n */\nexport function resolveInheritedMajorMode(\n environment: NodeJS.ProcessEnv,\n defaultMajorMode: string = DEFAULT_MAJOR_MODE,\n): string {\n assertNoRetiredEnvironment(environment);\n if (environment[REMOVED_PO_LAYER_ENV]) {\n throw new Error(`${REMOVED_PO_LAYER_ENV} was replaced by ${PO_MAJOR_MODE_ENV}`);\n }\n const inherited = environment[PO_MAJOR_MODE_ENV];\n return parseMajorMode(inherited || defaultMajorMode, inherited ? PO_MAJOR_MODE_ENV : 'defaultMajorMode');\n}\n\n/** The profile a run inherits from its environment, validated once up front. */\nexport function resolveInheritedProfile(environment: NodeJS.ProcessEnv): string | undefined {\n const inherited = environment[PO_PROFILE_ENV] || undefined;\n if (inherited?.includes(CSV_DELIMITER)) throw new Error(`${PO_PROFILE_ENV} accepts one profile name`);\n return inherited;\n}\n\n/** Directories inherited from the launcher environment. */\nexport function resolveAdditionalDirectories(environment: NodeJS.ProcessEnv, baseDirectory: string): string[] {\n return (environment[PO_ADDITIONAL_DIRECTORIES_ENV] ?? '')\n .split(path.delimiter)\n .filter(Boolean)\n .map((directory) => path.resolve(baseDirectory, directory));\n}\n"],"mappings":"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"}
@@ -12,7 +12,7 @@
12
12
  /**
13
13
  * One variable per axis.
14
14
  *
15
- * These used to come in pairs, `DOOM_PI_*` for what the caller selected and
15
+ * These used to come in pairs, `PO_PI_*` for what the caller selected and
16
16
  * `PO_*` for what the harness resolved and published, with the second
17
17
  * outranking the first. A nested run still inherits its launcher's choice under
18
18
  * one name, because the launcher projects into the child environment and
@@ -13,7 +13,7 @@ import path from "node:path";
13
13
  /**
14
14
  * One variable per axis.
15
15
  *
16
- * These used to come in pairs, `DOOM_PI_*` for what the caller selected and
16
+ * These used to come in pairs, `PO_PI_*` for what the caller selected and
17
17
  * `PO_*` for what the harness resolved and published, with the second
18
18
  * outranking the first. A nested run still inherits its launcher's choice under
19
19
  * one name, because the launcher projects into the child environment and
@@ -1 +1 @@
1
- {"version":3,"file":"matrixOptions.mjs","names":[],"sources":["../../../src/cli/matrixOptions.ts"],"sourcesContent":["import path from 'node:path';\n\n/**\n * Matrix selection shared by the Pi and compatibility parsers.\n *\n * Both frontends pick the same three axes (profile, domains, major mode) out of\n * the same environment variables with the same defaults. They used to hold two\n * copies of that logic, and the copies drifted: the inline `--name=value` forms\n * and the strict value reader existed in the compatibility parser only, so\n * `./pi.sh --profile=x` silently forwarded an unknown flag to Pi. One copy here\n * is what keeps them honest.\n */\n\n/**\n * One variable per axis.\n *\n * These used to come in pairs, `DOOM_PI_*` for what the caller selected and\n * `PO_*` for what the harness resolved and published, with the second\n * outranking the first. A nested run still inherits its launcher's choice under\n * one name, because the launcher projects into the child environment and\n * overwrites the same key. Two names for one value only ever meant two ways to\n * disagree.\n */\nexport const PO_PROFILE_ENV = 'PO_PROFILE';\nexport const PO_DOMAINS_ENV = 'PO_DOMAINS';\nexport const PO_MAJOR_MODE_ENV = 'PO_MAJOR_MODE';\nexport const PO_ADDITIONAL_DIRECTORIES_ENV = 'PO_ADDITIONAL_DIRS';\nexport const PO_PRESET_ENV = 'PO_PRESET';\n\n/** Removed spelling of the major mode axis, reported rather than honored. */\nexport const REMOVED_PO_LAYER_ENV = 'PO_LAYER';\n\n/**\n * The whole retired namespace, reported rather than ignored.\n *\n * A prefix scan rather than a constant per variable: there were 28 of them, and\n * a list maintained by hand is a list that misses one. A stale\n * `export AGENT_HARNESS_MAJOR_MODE=dev` in a shell profile would otherwise\n * silently start the session on `copilot`.\n */\nconst RETIRED_ENV_PREFIX = 'AGENT_HARNESS_';\nconst CURRENT_ENV_PREFIX = 'PO_';\n\nexport const PROFILE_OPTION = '--profile';\nexport const DOMAIN_OPTION = '--domain';\nexport const DOMAINS_OPTION = '--domains';\n/**\n * The major mode flag.\n *\n * Not `--mode`: Pi owns that one for its output mode, and for a value outside\n * `text|json|rpc` it consumes both tokens and ignores them without a\n * diagnostic. A synced `pi --mode dev` would have failed silently.\n */\nexport const MAJOR_MODE_OPTION = '--major-mode';\nexport const ADD_DIRECTORY_OPTION = '--add-dir';\nexport const REMOVED_LAYER_OPTION = '--layer';\nexport const REMOVED_LAYERS_OPTION = '--layers';\nexport const REMOVED_TARGET_OPTION = '--target';\n\nexport const DEFAULT_MAJOR_MODE = 'copilot';\nexport const DEFAULT_DOMAIN = 'default';\n\nconst CSV_DELIMITER = ',';\nconst OPTION_PREFIX = '--';\n\nexport interface OptionMatch {\n value: string;\n /** Index of the last argument consumed, for the caller's loop cursor. */\n nextIndex: number;\n /** True for `--name=value`. Callers that re-emit an option preserve the form. */\n inline: boolean;\n}\n\n/**\n * Reads `--name value` or `--name=value`, returning undefined for anything else.\n *\n * A value starting with `--` is rejected rather than consumed, so\n * `--profile --explain` reports a missing value instead of swallowing the next\n * flag. In compatibility mode this is also what stops the `--` provider\n * delimiter being taken as a matrix value.\n */\nexport function readOption(args: string[], index: number, name: string): OptionMatch | undefined {\n // Callers walk `args` by index, so this is always in range.\n const arg = args[index]!;\n if (arg === name) {\n const value = args[index + 1];\n if (!value || value.startsWith(OPTION_PREFIX)) throw new Error(`${name} requires a value`);\n return { value, nextIndex: index + 1, inline: false };\n }\n const inlinePrefix = `${name}=`;\n if (!arg.startsWith(inlinePrefix)) return undefined;\n const value = arg.slice(inlinePrefix.length);\n if (!value) throw new Error(`${name} requires a value`);\n return { value, nextIndex: index, inline: true };\n}\n\n/** Matches `--name` or `--name=value`, for reporting options that were removed. */\nexport function matchesOption(arg: string, name: string): boolean {\n return arg === name || arg.startsWith(`${name}=`);\n}\n\nexport function parseCsv(value: string): string[] {\n return value\n .split(CSV_DELIMITER)\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nexport function parseRequiredCsv(value: string, option: string): string[] {\n const values = parseCsv(value);\n if (values.length === 0) throw new Error(`${option} requires a value`);\n return values;\n}\n\nexport function parseMajorMode(value: string, source: string): string {\n const majorMode = value.trim();\n if (!majorMode) throw new Error(`${source} requires a value`);\n if (majorMode.includes(CSV_DELIMITER)) throw new Error(`${source} accepts one major mode name`);\n return majorMode;\n}\n\nexport function parseProfileValue(value: string, source: string): string {\n if (value.includes(CSV_DELIMITER)) throw new Error(`${source} accepts one profile name`);\n if (!value.trim()) throw new Error(`${source} requires a value`);\n return value;\n}\n\n/**\n * Reports any variable left over from the retired `AGENT_HARNESS_*` namespace.\n *\n * Called before anything reads the environment, so a stale export fails the\n * session instead of being quietly outvoted by a default. Both prefixes are\n * built from the constants above rather than written inline, because a\n * search-and-replace over this repository is exactly what retired the old one.\n */\nexport function assertNoRetiredEnvironment(environment: NodeJS.ProcessEnv): void {\n const stale = Object.keys(environment)\n .filter((key) => key.startsWith(RETIRED_ENV_PREFIX))\n .sort();\n if (stale.length === 0) return;\n const replacements = stale.map((key) => `${key} -> ${CURRENT_ENV_PREFIX}${key.slice(RETIRED_ENV_PREFIX.length)}`);\n throw new Error(\n `The ${RETIRED_ENV_PREFIX}* environment was replaced by ${CURRENT_ENV_PREFIX}*. Unset or rename: ${replacements.join(', ')}`,\n );\n}\n\n/**\n * The major mode a nested run inherits from its launcher, or the default.\n *\n * The removed spelling throws rather than being ignored. A stale\n * `export PO_LAYER=dev` left in a shell profile would otherwise silently\n * select `copilot`, which is the exact confusion the rename removed.\n */\nexport function resolveInheritedMajorMode(\n environment: NodeJS.ProcessEnv,\n defaultMajorMode: string = DEFAULT_MAJOR_MODE,\n): string {\n assertNoRetiredEnvironment(environment);\n if (environment[REMOVED_PO_LAYER_ENV]) {\n throw new Error(`${REMOVED_PO_LAYER_ENV} was replaced by ${PO_MAJOR_MODE_ENV}`);\n }\n const inherited = environment[PO_MAJOR_MODE_ENV];\n return parseMajorMode(inherited || defaultMajorMode, inherited ? PO_MAJOR_MODE_ENV : 'defaultMajorMode');\n}\n\n/** The profile a run inherits from its environment, validated once up front. */\nexport function resolveInheritedProfile(environment: NodeJS.ProcessEnv): string | undefined {\n const inherited = environment[PO_PROFILE_ENV] || undefined;\n if (inherited?.includes(CSV_DELIMITER)) throw new Error(`${PO_PROFILE_ENV} accepts one profile name`);\n return inherited;\n}\n\n/** Directories inherited from the launcher environment. */\nexport function resolveAdditionalDirectories(environment: NodeJS.ProcessEnv, baseDirectory: string): string[] {\n return (environment[PO_ADDITIONAL_DIRECTORIES_ENV] ?? '')\n .split(path.delimiter)\n .filter(Boolean)\n .map((directory) => path.resolve(baseDirectory, directory));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAuBA,MAAa,iBAAiB;AAC9B,MAAa,iBAAiB;AAC9B,MAAa,oBAAoB;AACjC,MAAa,gCAAgC;AAC7C,MAAa,gBAAgB;;AAG7B,MAAa,uBAAuB;;;;;;;;;AAUpC,MAAM,qBAAqB;AAC3B,MAAM,qBAAqB;AAE3B,MAAa,iBAAiB;AAC9B,MAAa,gBAAgB;AAC7B,MAAa,iBAAiB;;;;;;;;AAQ9B,MAAa,oBAAoB;AACjC,MAAa,uBAAuB;AACpC,MAAa,uBAAuB;AACpC,MAAa,wBAAwB;AACrC,MAAa,wBAAwB;AAErC,MAAa,qBAAqB;AAClC,MAAa,iBAAiB;AAE9B,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;;;;;;;;;AAkBtB,SAAgB,WAAW,MAAgB,OAAe,MAAuC;CAE/F,MAAM,MAAM,KAAK;CACjB,IAAI,QAAQ,MAAM;EAChB,MAAM,QAAQ,KAAK,QAAQ;EAC3B,IAAI,CAAC,SAAS,MAAM,WAAW,aAAa,GAAG,MAAM,IAAI,MAAM,GAAG,KAAK,kBAAkB;EACzF,OAAO;GAAE;GAAO,WAAW,QAAQ;GAAG,QAAQ;EAAM;CACtD;CACA,MAAM,eAAe,GAAG,KAAK;CAC7B,IAAI,CAAC,IAAI,WAAW,YAAY,GAAG,OAAO,KAAA;CAC1C,MAAM,QAAQ,IAAI,MAAM,aAAa,MAAM;CAC3C,IAAI,CAAC,OAAO,MAAM,IAAI,MAAM,GAAG,KAAK,kBAAkB;CACtD,OAAO;EAAE;EAAO,WAAW;EAAO,QAAQ;CAAK;AACjD;;AAGA,SAAgB,cAAc,KAAa,MAAuB;CAChE,OAAO,QAAQ,QAAQ,IAAI,WAAW,GAAG,KAAK,EAAE;AAClD;AAEA,SAAgB,SAAS,OAAyB;CAChD,OAAO,MACJ,MAAM,aAAa,CAAC,CACpB,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAC1B,OAAO,OAAO;AACnB;AAEA,SAAgB,iBAAiB,OAAe,QAA0B;CACxE,MAAM,SAAS,SAAS,KAAK;CAC7B,IAAI,OAAO,WAAW,GAAG,MAAM,IAAI,MAAM,GAAG,OAAO,kBAAkB;CACrE,OAAO;AACT;AAEA,SAAgB,eAAe,OAAe,QAAwB;CACpE,MAAM,YAAY,MAAM,KAAK;CAC7B,IAAI,CAAC,WAAW,MAAM,IAAI,MAAM,GAAG,OAAO,kBAAkB;CAC5D,IAAI,UAAU,SAAS,aAAa,GAAG,MAAM,IAAI,MAAM,GAAG,OAAO,6BAA6B;CAC9F,OAAO;AACT;AAEA,SAAgB,kBAAkB,OAAe,QAAwB;CACvE,IAAI,MAAM,SAAS,aAAa,GAAG,MAAM,IAAI,MAAM,GAAG,OAAO,0BAA0B;CACvF,IAAI,CAAC,MAAM,KAAK,GAAG,MAAM,IAAI,MAAM,GAAG,OAAO,kBAAkB;CAC/D,OAAO;AACT;;;;;;;;;AAUA,SAAgB,2BAA2B,aAAsC;CAC/E,MAAM,QAAQ,OAAO,KAAK,WAAW,CAAC,CACnC,QAAQ,QAAQ,IAAI,WAAW,kBAAkB,CAAC,CAAC,CACnD,KAAK;CACR,IAAI,MAAM,WAAW,GAAG;CACxB,MAAM,eAAe,MAAM,KAAK,QAAQ,GAAG,IAAI,MAAM,qBAAqB,IAAI,MAAM,EAAyB,GAAG;CAChH,MAAM,IAAI,MACR,OAAO,mBAAmB,gCAAgC,mBAAmB,sBAAsB,aAAa,KAAK,IAAI,GAC3H;AACF;;;;;;;;AASA,SAAgB,0BACd,aACA,mBAA2B,oBACnB;CACR,2BAA2B,WAAW;CACtC,IAAI,YAAA,aACF,MAAM,IAAI,MAAM,GAAG,qBAAqB,mBAAmB,mBAAmB;CAEhF,MAAM,YAAY,YAAY;CAC9B,OAAO,eAAe,aAAa,kBAAkB,YAAY,oBAAoB,kBAAkB;AACzG;;AAGA,SAAgB,wBAAwB,aAAoD;CAC1F,MAAM,YAAY,YAAA,iBAA+B,KAAA;CACjD,IAAI,WAAW,SAAS,aAAa,GAAG,MAAM,IAAI,MAAM,GAAG,eAAe,0BAA0B;CACpG,OAAO;AACT;;AAGA,SAAgB,6BAA6B,aAAgC,eAAiC;CAC5G,QAAQ,YAAA,yBAA8C,GAAA,CACnD,MAAM,KAAK,SAAS,CAAC,CACrB,OAAO,OAAO,CAAC,CACf,KAAK,cAAc,KAAK,QAAQ,eAAe,SAAS,CAAC;AAC9D"}
1
+ {"version":3,"file":"matrixOptions.mjs","names":[],"sources":["../../../src/cli/matrixOptions.ts"],"sourcesContent":["import path from 'node:path';\n\n/**\n * Matrix selection shared by the Pi and compatibility parsers.\n *\n * Both frontends pick the same three axes (profile, domains, major mode) out of\n * the same environment variables with the same defaults. They used to hold two\n * copies of that logic, and the copies drifted: the inline `--name=value` forms\n * and the strict value reader existed in the compatibility parser only, so\n * `./pi.sh --profile=x` silently forwarded an unknown flag to Pi. One copy here\n * is what keeps them honest.\n */\n\n/**\n * One variable per axis.\n *\n * These used to come in pairs, `PO_PI_*` for what the caller selected and\n * `PO_*` for what the harness resolved and published, with the second\n * outranking the first. A nested run still inherits its launcher's choice under\n * one name, because the launcher projects into the child environment and\n * overwrites the same key. Two names for one value only ever meant two ways to\n * disagree.\n */\nexport const PO_PROFILE_ENV = 'PO_PROFILE';\nexport const PO_DOMAINS_ENV = 'PO_DOMAINS';\nexport const PO_MAJOR_MODE_ENV = 'PO_MAJOR_MODE';\nexport const PO_ADDITIONAL_DIRECTORIES_ENV = 'PO_ADDITIONAL_DIRS';\nexport const PO_PRESET_ENV = 'PO_PRESET';\n\n/** Removed spelling of the major mode axis, reported rather than honored. */\nexport const REMOVED_PO_LAYER_ENV = 'PO_LAYER';\n\n/**\n * The whole retired namespace, reported rather than ignored.\n *\n * A prefix scan rather than a constant per variable: there were 28 of them, and\n * a list maintained by hand is a list that misses one. A stale\n * `export AGENT_HARNESS_MAJOR_MODE=dev` in a shell profile would otherwise\n * silently start the session on `copilot`.\n */\nconst RETIRED_ENV_PREFIX = 'AGENT_HARNESS_';\nconst CURRENT_ENV_PREFIX = 'PO_';\n\nexport const PROFILE_OPTION = '--profile';\nexport const DOMAIN_OPTION = '--domain';\nexport const DOMAINS_OPTION = '--domains';\n/**\n * The major mode flag.\n *\n * Not `--mode`: Pi owns that one for its output mode, and for a value outside\n * `text|json|rpc` it consumes both tokens and ignores them without a\n * diagnostic. A synced `pi --mode dev` would have failed silently.\n */\nexport const MAJOR_MODE_OPTION = '--major-mode';\nexport const ADD_DIRECTORY_OPTION = '--add-dir';\nexport const REMOVED_LAYER_OPTION = '--layer';\nexport const REMOVED_LAYERS_OPTION = '--layers';\nexport const REMOVED_TARGET_OPTION = '--target';\n\nexport const DEFAULT_MAJOR_MODE = 'copilot';\nexport const DEFAULT_DOMAIN = 'default';\n\nconst CSV_DELIMITER = ',';\nconst OPTION_PREFIX = '--';\n\nexport interface OptionMatch {\n value: string;\n /** Index of the last argument consumed, for the caller's loop cursor. */\n nextIndex: number;\n /** True for `--name=value`. Callers that re-emit an option preserve the form. */\n inline: boolean;\n}\n\n/**\n * Reads `--name value` or `--name=value`, returning undefined for anything else.\n *\n * A value starting with `--` is rejected rather than consumed, so\n * `--profile --explain` reports a missing value instead of swallowing the next\n * flag. In compatibility mode this is also what stops the `--` provider\n * delimiter being taken as a matrix value.\n */\nexport function readOption(args: string[], index: number, name: string): OptionMatch | undefined {\n // Callers walk `args` by index, so this is always in range.\n const arg = args[index]!;\n if (arg === name) {\n const value = args[index + 1];\n if (!value || value.startsWith(OPTION_PREFIX)) throw new Error(`${name} requires a value`);\n return { value, nextIndex: index + 1, inline: false };\n }\n const inlinePrefix = `${name}=`;\n if (!arg.startsWith(inlinePrefix)) return undefined;\n const value = arg.slice(inlinePrefix.length);\n if (!value) throw new Error(`${name} requires a value`);\n return { value, nextIndex: index, inline: true };\n}\n\n/** Matches `--name` or `--name=value`, for reporting options that were removed. */\nexport function matchesOption(arg: string, name: string): boolean {\n return arg === name || arg.startsWith(`${name}=`);\n}\n\nexport function parseCsv(value: string): string[] {\n return value\n .split(CSV_DELIMITER)\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nexport function parseRequiredCsv(value: string, option: string): string[] {\n const values = parseCsv(value);\n if (values.length === 0) throw new Error(`${option} requires a value`);\n return values;\n}\n\nexport function parseMajorMode(value: string, source: string): string {\n const majorMode = value.trim();\n if (!majorMode) throw new Error(`${source} requires a value`);\n if (majorMode.includes(CSV_DELIMITER)) throw new Error(`${source} accepts one major mode name`);\n return majorMode;\n}\n\nexport function parseProfileValue(value: string, source: string): string {\n if (value.includes(CSV_DELIMITER)) throw new Error(`${source} accepts one profile name`);\n if (!value.trim()) throw new Error(`${source} requires a value`);\n return value;\n}\n\n/**\n * Reports any variable left over from the retired `AGENT_HARNESS_*` namespace.\n *\n * Called before anything reads the environment, so a stale export fails the\n * session instead of being quietly outvoted by a default. Both prefixes are\n * built from the constants above rather than written inline, because a\n * search-and-replace over this repository is exactly what retired the old one.\n */\nexport function assertNoRetiredEnvironment(environment: NodeJS.ProcessEnv): void {\n const stale = Object.keys(environment)\n .filter((key) => key.startsWith(RETIRED_ENV_PREFIX))\n .sort();\n if (stale.length === 0) return;\n const replacements = stale.map((key) => `${key} -> ${CURRENT_ENV_PREFIX}${key.slice(RETIRED_ENV_PREFIX.length)}`);\n throw new Error(\n `The ${RETIRED_ENV_PREFIX}* environment was replaced by ${CURRENT_ENV_PREFIX}*. Unset or rename: ${replacements.join(', ')}`,\n );\n}\n\n/**\n * The major mode a nested run inherits from its launcher, or the default.\n *\n * The removed spelling throws rather than being ignored. A stale\n * `export PO_LAYER=dev` left in a shell profile would otherwise silently\n * select `copilot`, which is the exact confusion the rename removed.\n */\nexport function resolveInheritedMajorMode(\n environment: NodeJS.ProcessEnv,\n defaultMajorMode: string = DEFAULT_MAJOR_MODE,\n): string {\n assertNoRetiredEnvironment(environment);\n if (environment[REMOVED_PO_LAYER_ENV]) {\n throw new Error(`${REMOVED_PO_LAYER_ENV} was replaced by ${PO_MAJOR_MODE_ENV}`);\n }\n const inherited = environment[PO_MAJOR_MODE_ENV];\n return parseMajorMode(inherited || defaultMajorMode, inherited ? PO_MAJOR_MODE_ENV : 'defaultMajorMode');\n}\n\n/** The profile a run inherits from its environment, validated once up front. */\nexport function resolveInheritedProfile(environment: NodeJS.ProcessEnv): string | undefined {\n const inherited = environment[PO_PROFILE_ENV] || undefined;\n if (inherited?.includes(CSV_DELIMITER)) throw new Error(`${PO_PROFILE_ENV} accepts one profile name`);\n return inherited;\n}\n\n/** Directories inherited from the launcher environment. */\nexport function resolveAdditionalDirectories(environment: NodeJS.ProcessEnv, baseDirectory: string): string[] {\n return (environment[PO_ADDITIONAL_DIRECTORIES_ENV] ?? '')\n .split(path.delimiter)\n .filter(Boolean)\n .map((directory) => path.resolve(baseDirectory, directory));\n}\n"],"mappings":"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"}
@@ -39,7 +39,7 @@ async function runServer(args, stopSignal) {
39
39
  const options = require_options.parseServeOptions(args);
40
40
  const environment = Object.freeze({ ...process.env });
41
41
  const homeDirectory = environment.HOME ?? node_os.default.homedir();
42
- (0, _agimon_ai_po_config.initializeGlobalDoomConfig)(homeDirectory);
42
+ (0, _agimon_ai_po_config.initializeGlobalPoConfig)(homeDirectory);
43
43
  removeLegacyPiIntegration(homeDirectory);
44
44
  const releaseHost = registerAndRetireLegacyHome(homeDirectory, environment);
45
45
  const controller = new AbortController();
@@ -1 +1 @@
1
- {"version":3,"file":"run.cjs","names":["removePoPiSettings","path","poHomeDirectory","registerPoHost","retireLegacyPoHome","parseServeOptions","os","runServerRuntime"],"sources":["../../../../src/cli/server/run.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\n\nimport { initializeGlobalDoomConfig } from '@agimon-ai/po-config';\nimport { poHomeDirectory, removePoPiSettings } from '@agimon-ai/po-core/piSettings';\n\nimport { runServerRuntime } from '../../builders/server/runtime';\nimport { registerPoHost, retireLegacyPoHome } from '../../composition/poHomeMigration';\nimport { resolveHarnessOptions } from '../harnessOptions';\nimport { parseServeOptions } from './options';\n\n/** Removes Po's leftover entries from Pi's default user agent directory, once per server start. */\nfunction removeLegacyPiIntegration(homeDirectory: string): void {\n try {\n for (const removed of removePoPiSettings(path.join(homeDirectory, '.pi', 'agent'))) {\n process.stderr.write(`[po-server] Removed Po's Pi entry: ${removed}\\n`);\n }\n } catch (error) {\n process.stderr.write(\n `[po-server] Could not remove Po's Pi entries: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n }\n}\n\n/**\n * Registers this host, then deletes `~/.pi/.po` once no older host can be using it.\n * Never fatal: a failure here leaves the old directory for the next start.\n */\nfunction registerAndRetireLegacyHome(homeDirectory: string, environment: NodeJS.ProcessEnv): () => void {\n const poHome = poHomeDirectory(homeDirectory, environment);\n let release = (): void => undefined;\n try {\n release = registerPoHost(poHome);\n const retired = retireLegacyPoHome(homeDirectory, poHome);\n if (retired.status === 'removed') process.stderr.write('[po-server] Removed the old ~/.pi/.po directory.\\n');\n if (retired.status === 'deferred') process.stderr.write(`[po-server] Kept ~/.pi/.po for now: ${retired.reason}\\n`);\n } catch (error) {\n process.stderr.write(\n `[po-server] Could not retire ~/.pi/.po: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n }\n return release;\n}\n\nexport async function runServer(\n args: readonly string[],\n /** Aborting stops the server gracefully, as a termination signal does. */\n stopSignal?: AbortSignal,\n): Promise<number> {\n const options = parseServeOptions(args);\n const environment = Object.freeze({ ...process.env });\n const homeDirectory = environment.HOME ?? os.homedir();\n initializeGlobalDoomConfig(homeDirectory);\n removeLegacyPiIntegration(homeDirectory);\n const releaseHost = registerAndRetireLegacyHome(homeDirectory, environment);\n const controller = new AbortController();\n const stop = () => controller.abort();\n process.on('SIGINT', stop);\n process.on('SIGTERM', stop);\n // An IPC parent owns this server's lifetime. Its channel closes even when the\n // parent is killed before it can forward a termination signal.\n process.on('disconnect', stop);\n stopSignal?.addEventListener('abort', stop, { once: true });\n if (stopSignal?.aborted) stop();\n try {\n return await runServerRuntime(options, {\n cwd: process.cwd(),\n environment,\n signal: controller.signal,\n resolveHarnessOptions,\n notice: (message) => void process.stderr.write(`[po-server] ${message}\\n`),\n });\n } finally {\n process.off('SIGINT', stop);\n process.off('SIGTERM', stop);\n process.off('disconnect', stop);\n stopSignal?.removeEventListener('abort', stop);\n releaseHost();\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAYA,SAAS,0BAA0B,eAA6B;CAC9D,IAAI;EACF,KAAK,MAAM,YAAA,GAAWA,8BAAAA,mBAAAA,CAAmBC,UAAAA,QAAK,KAAK,eAAe,OAAO,OAAO,CAAC,GAC/E,QAAQ,OAAO,MAAM,sCAAsC,QAAQ,GAAG;CAE1E,SAAS,OAAO;EACd,QAAQ,OAAO,MACb,iDAAiD,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAC1G;CACF;AACF;;;;;AAMA,SAAS,4BAA4B,eAAuB,aAA4C;CACtG,MAAM,UAAA,GAASC,8BAAAA,gBAAAA,CAAgB,eAAe,WAAW;CACzD,IAAI,gBAAsB,KAAA;CAC1B,IAAI;EACF,UAAUC,cAAAA,eAAe,MAAM;EAC/B,MAAM,UAAUC,cAAAA,mBAAmB,eAAe,MAAM;EACxD,IAAI,QAAQ,WAAW,WAAW,QAAQ,OAAO,MAAM,oDAAoD;EAC3G,IAAI,QAAQ,WAAW,YAAY,QAAQ,OAAO,MAAM,uCAAuC,QAAQ,OAAO,GAAG;CACnH,SAAS,OAAO;EACd,QAAQ,OAAO,MACb,2CAA2C,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GACpG;CACF;CACA,OAAO;AACT;AAEA,eAAsB,UACpB,MAEA,YACiB;CACjB,MAAM,UAAUC,gBAAAA,kBAAkB,IAAI;CACtC,MAAM,cAAc,OAAO,OAAO,EAAE,GAAG,QAAQ,IAAI,CAAC;CACpD,MAAM,gBAAgB,YAAY,QAAQC,QAAAA,QAAG,QAAQ;CACrD,CAAA,GAAA,qBAAA,2BAAA,CAA2B,aAAa;CACxC,0BAA0B,aAAa;CACvC,MAAM,cAAc,4BAA4B,eAAe,WAAW;CAC1E,MAAM,aAAa,IAAI,gBAAgB;CACvC,MAAM,aAAa,WAAW,MAAM;CACpC,QAAQ,GAAG,UAAU,IAAI;CACzB,QAAQ,GAAG,WAAW,IAAI;CAG1B,QAAQ,GAAG,cAAc,IAAI;CAC7B,YAAY,iBAAiB,SAAS,MAAM,EAAE,MAAM,KAAK,CAAC;CAC1D,IAAI,YAAY,SAAS,KAAK;CAC9B,IAAI;EACF,OAAO,MAAMC,kBAAAA,iBAAiB,SAAS;GACrC,KAAK,QAAQ,IAAI;GACjB;GACA,QAAQ,WAAW;GACnB,uBAAA,uBAAA;GACA,SAAS,YAAY,KAAK,QAAQ,OAAO,MAAM,eAAe,QAAQ,GAAG;EAC3E,CAAC;CACH,UAAU;EACR,QAAQ,IAAI,UAAU,IAAI;EAC1B,QAAQ,IAAI,WAAW,IAAI;EAC3B,QAAQ,IAAI,cAAc,IAAI;EAC9B,YAAY,oBAAoB,SAAS,IAAI;EAC7C,YAAY;CACd;AACF"}
1
+ {"version":3,"file":"run.cjs","names":["removePoPiSettings","path","poHomeDirectory","registerPoHost","retireLegacyPoHome","parseServeOptions","os","runServerRuntime"],"sources":["../../../../src/cli/server/run.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\n\nimport { initializeGlobalPoConfig } from '@agimon-ai/po-config';\nimport { poHomeDirectory, removePoPiSettings } from '@agimon-ai/po-core/piSettings';\n\nimport { runServerRuntime } from '../../builders/server/runtime';\nimport { registerPoHost, retireLegacyPoHome } from '../../composition/poHomeMigration';\nimport { resolveHarnessOptions } from '../harnessOptions';\nimport { parseServeOptions } from './options';\n\n/** Removes Po's leftover entries from Pi's default user agent directory, once per server start. */\nfunction removeLegacyPiIntegration(homeDirectory: string): void {\n try {\n for (const removed of removePoPiSettings(path.join(homeDirectory, '.pi', 'agent'))) {\n process.stderr.write(`[po-server] Removed Po's Pi entry: ${removed}\\n`);\n }\n } catch (error) {\n process.stderr.write(\n `[po-server] Could not remove Po's Pi entries: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n }\n}\n\n/**\n * Registers this host, then deletes `~/.pi/.po` once no older host can be using it.\n * Never fatal: a failure here leaves the old directory for the next start.\n */\nfunction registerAndRetireLegacyHome(homeDirectory: string, environment: NodeJS.ProcessEnv): () => void {\n const poHome = poHomeDirectory(homeDirectory, environment);\n let release = (): void => undefined;\n try {\n release = registerPoHost(poHome);\n const retired = retireLegacyPoHome(homeDirectory, poHome);\n if (retired.status === 'removed') process.stderr.write('[po-server] Removed the old ~/.pi/.po directory.\\n');\n if (retired.status === 'deferred') process.stderr.write(`[po-server] Kept ~/.pi/.po for now: ${retired.reason}\\n`);\n } catch (error) {\n process.stderr.write(\n `[po-server] Could not retire ~/.pi/.po: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n }\n return release;\n}\n\nexport async function runServer(\n args: readonly string[],\n /** Aborting stops the server gracefully, as a termination signal does. */\n stopSignal?: AbortSignal,\n): Promise<number> {\n const options = parseServeOptions(args);\n const environment = Object.freeze({ ...process.env });\n const homeDirectory = environment.HOME ?? os.homedir();\n initializeGlobalPoConfig(homeDirectory);\n removeLegacyPiIntegration(homeDirectory);\n const releaseHost = registerAndRetireLegacyHome(homeDirectory, environment);\n const controller = new AbortController();\n const stop = () => controller.abort();\n process.on('SIGINT', stop);\n process.on('SIGTERM', stop);\n // An IPC parent owns this server's lifetime. Its channel closes even when the\n // parent is killed before it can forward a termination signal.\n process.on('disconnect', stop);\n stopSignal?.addEventListener('abort', stop, { once: true });\n if (stopSignal?.aborted) stop();\n try {\n return await runServerRuntime(options, {\n cwd: process.cwd(),\n environment,\n signal: controller.signal,\n resolveHarnessOptions,\n notice: (message) => void process.stderr.write(`[po-server] ${message}\\n`),\n });\n } finally {\n process.off('SIGINT', stop);\n process.off('SIGTERM', stop);\n process.off('disconnect', stop);\n stopSignal?.removeEventListener('abort', stop);\n releaseHost();\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAYA,SAAS,0BAA0B,eAA6B;CAC9D,IAAI;EACF,KAAK,MAAM,YAAA,GAAWA,8BAAAA,mBAAAA,CAAmBC,UAAAA,QAAK,KAAK,eAAe,OAAO,OAAO,CAAC,GAC/E,QAAQ,OAAO,MAAM,sCAAsC,QAAQ,GAAG;CAE1E,SAAS,OAAO;EACd,QAAQ,OAAO,MACb,iDAAiD,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAC1G;CACF;AACF;;;;;AAMA,SAAS,4BAA4B,eAAuB,aAA4C;CACtG,MAAM,UAAA,GAASC,8BAAAA,gBAAAA,CAAgB,eAAe,WAAW;CACzD,IAAI,gBAAsB,KAAA;CAC1B,IAAI;EACF,UAAUC,cAAAA,eAAe,MAAM;EAC/B,MAAM,UAAUC,cAAAA,mBAAmB,eAAe,MAAM;EACxD,IAAI,QAAQ,WAAW,WAAW,QAAQ,OAAO,MAAM,oDAAoD;EAC3G,IAAI,QAAQ,WAAW,YAAY,QAAQ,OAAO,MAAM,uCAAuC,QAAQ,OAAO,GAAG;CACnH,SAAS,OAAO;EACd,QAAQ,OAAO,MACb,2CAA2C,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GACpG;CACF;CACA,OAAO;AACT;AAEA,eAAsB,UACpB,MAEA,YACiB;CACjB,MAAM,UAAUC,gBAAAA,kBAAkB,IAAI;CACtC,MAAM,cAAc,OAAO,OAAO,EAAE,GAAG,QAAQ,IAAI,CAAC;CACpD,MAAM,gBAAgB,YAAY,QAAQC,QAAAA,QAAG,QAAQ;CACrD,CAAA,GAAA,qBAAA,yBAAA,CAAyB,aAAa;CACtC,0BAA0B,aAAa;CACvC,MAAM,cAAc,4BAA4B,eAAe,WAAW;CAC1E,MAAM,aAAa,IAAI,gBAAgB;CACvC,MAAM,aAAa,WAAW,MAAM;CACpC,QAAQ,GAAG,UAAU,IAAI;CACzB,QAAQ,GAAG,WAAW,IAAI;CAG1B,QAAQ,GAAG,cAAc,IAAI;CAC7B,YAAY,iBAAiB,SAAS,MAAM,EAAE,MAAM,KAAK,CAAC;CAC1D,IAAI,YAAY,SAAS,KAAK;CAC9B,IAAI;EACF,OAAO,MAAMC,kBAAAA,iBAAiB,SAAS;GACrC,KAAK,QAAQ,IAAI;GACjB;GACA,QAAQ,WAAW;GACnB,uBAAA,uBAAA;GACA,SAAS,YAAY,KAAK,QAAQ,OAAO,MAAM,eAAe,QAAQ,GAAG;EAC3E,CAAC;CACH,UAAU;EACR,QAAQ,IAAI,UAAU,IAAI;EAC1B,QAAQ,IAAI,WAAW,IAAI;EAC3B,QAAQ,IAAI,cAAc,IAAI;EAC9B,YAAY,oBAAoB,SAAS,IAAI;EAC7C,YAAY;CACd;AACF"}
@@ -5,7 +5,7 @@ import { parseServeOptions } from "./options.mjs";
5
5
  import path from "node:path";
6
6
  import os from "node:os";
7
7
  import { poHomeDirectory, removePoPiSettings } from "@agimon-ai/po-core/piSettings";
8
- import { initializeGlobalDoomConfig } from "@agimon-ai/po-config";
8
+ import { initializeGlobalPoConfig } from "@agimon-ai/po-config";
9
9
  //#region src/cli/server/run.ts
10
10
  /** Removes Po's leftover entries from Pi's default user agent directory, once per server start. */
11
11
  function removeLegacyPiIntegration(homeDirectory) {
@@ -36,7 +36,7 @@ async function runServer(args, stopSignal) {
36
36
  const options = parseServeOptions(args);
37
37
  const environment = Object.freeze({ ...process.env });
38
38
  const homeDirectory = environment.HOME ?? os.homedir();
39
- initializeGlobalDoomConfig(homeDirectory);
39
+ initializeGlobalPoConfig(homeDirectory);
40
40
  removeLegacyPiIntegration(homeDirectory);
41
41
  const releaseHost = registerAndRetireLegacyHome(homeDirectory, environment);
42
42
  const controller = new AbortController();
@@ -1 +1 @@
1
- {"version":3,"file":"run.mjs","names":[],"sources":["../../../../src/cli/server/run.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\n\nimport { initializeGlobalDoomConfig } from '@agimon-ai/po-config';\nimport { poHomeDirectory, removePoPiSettings } from '@agimon-ai/po-core/piSettings';\n\nimport { runServerRuntime } from '../../builders/server/runtime';\nimport { registerPoHost, retireLegacyPoHome } from '../../composition/poHomeMigration';\nimport { resolveHarnessOptions } from '../harnessOptions';\nimport { parseServeOptions } from './options';\n\n/** Removes Po's leftover entries from Pi's default user agent directory, once per server start. */\nfunction removeLegacyPiIntegration(homeDirectory: string): void {\n try {\n for (const removed of removePoPiSettings(path.join(homeDirectory, '.pi', 'agent'))) {\n process.stderr.write(`[po-server] Removed Po's Pi entry: ${removed}\\n`);\n }\n } catch (error) {\n process.stderr.write(\n `[po-server] Could not remove Po's Pi entries: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n }\n}\n\n/**\n * Registers this host, then deletes `~/.pi/.po` once no older host can be using it.\n * Never fatal: a failure here leaves the old directory for the next start.\n */\nfunction registerAndRetireLegacyHome(homeDirectory: string, environment: NodeJS.ProcessEnv): () => void {\n const poHome = poHomeDirectory(homeDirectory, environment);\n let release = (): void => undefined;\n try {\n release = registerPoHost(poHome);\n const retired = retireLegacyPoHome(homeDirectory, poHome);\n if (retired.status === 'removed') process.stderr.write('[po-server] Removed the old ~/.pi/.po directory.\\n');\n if (retired.status === 'deferred') process.stderr.write(`[po-server] Kept ~/.pi/.po for now: ${retired.reason}\\n`);\n } catch (error) {\n process.stderr.write(\n `[po-server] Could not retire ~/.pi/.po: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n }\n return release;\n}\n\nexport async function runServer(\n args: readonly string[],\n /** Aborting stops the server gracefully, as a termination signal does. */\n stopSignal?: AbortSignal,\n): Promise<number> {\n const options = parseServeOptions(args);\n const environment = Object.freeze({ ...process.env });\n const homeDirectory = environment.HOME ?? os.homedir();\n initializeGlobalDoomConfig(homeDirectory);\n removeLegacyPiIntegration(homeDirectory);\n const releaseHost = registerAndRetireLegacyHome(homeDirectory, environment);\n const controller = new AbortController();\n const stop = () => controller.abort();\n process.on('SIGINT', stop);\n process.on('SIGTERM', stop);\n // An IPC parent owns this server's lifetime. Its channel closes even when the\n // parent is killed before it can forward a termination signal.\n process.on('disconnect', stop);\n stopSignal?.addEventListener('abort', stop, { once: true });\n if (stopSignal?.aborted) stop();\n try {\n return await runServerRuntime(options, {\n cwd: process.cwd(),\n environment,\n signal: controller.signal,\n resolveHarnessOptions,\n notice: (message) => void process.stderr.write(`[po-server] ${message}\\n`),\n });\n } finally {\n process.off('SIGINT', stop);\n process.off('SIGTERM', stop);\n process.off('disconnect', stop);\n stopSignal?.removeEventListener('abort', stop);\n releaseHost();\n }\n}\n"],"mappings":";;;;;;;;;;AAYA,SAAS,0BAA0B,eAA6B;CAC9D,IAAI;EACF,KAAK,MAAM,WAAW,mBAAmB,KAAK,KAAK,eAAe,OAAO,OAAO,CAAC,GAC/E,QAAQ,OAAO,MAAM,sCAAsC,QAAQ,GAAG;CAE1E,SAAS,OAAO;EACd,QAAQ,OAAO,MACb,iDAAiD,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAC1G;CACF;AACF;;;;;AAMA,SAAS,4BAA4B,eAAuB,aAA4C;CACtG,MAAM,SAAS,gBAAgB,eAAe,WAAW;CACzD,IAAI,gBAAsB,KAAA;CAC1B,IAAI;EACF,UAAU,eAAe,MAAM;EAC/B,MAAM,UAAU,mBAAmB,eAAe,MAAM;EACxD,IAAI,QAAQ,WAAW,WAAW,QAAQ,OAAO,MAAM,oDAAoD;EAC3G,IAAI,QAAQ,WAAW,YAAY,QAAQ,OAAO,MAAM,uCAAuC,QAAQ,OAAO,GAAG;CACnH,SAAS,OAAO;EACd,QAAQ,OAAO,MACb,2CAA2C,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GACpG;CACF;CACA,OAAO;AACT;AAEA,eAAsB,UACpB,MAEA,YACiB;CACjB,MAAM,UAAU,kBAAkB,IAAI;CACtC,MAAM,cAAc,OAAO,OAAO,EAAE,GAAG,QAAQ,IAAI,CAAC;CACpD,MAAM,gBAAgB,YAAY,QAAQ,GAAG,QAAQ;CACrD,2BAA2B,aAAa;CACxC,0BAA0B,aAAa;CACvC,MAAM,cAAc,4BAA4B,eAAe,WAAW;CAC1E,MAAM,aAAa,IAAI,gBAAgB;CACvC,MAAM,aAAa,WAAW,MAAM;CACpC,QAAQ,GAAG,UAAU,IAAI;CACzB,QAAQ,GAAG,WAAW,IAAI;CAG1B,QAAQ,GAAG,cAAc,IAAI;CAC7B,YAAY,iBAAiB,SAAS,MAAM,EAAE,MAAM,KAAK,CAAC;CAC1D,IAAI,YAAY,SAAS,KAAK;CAC9B,IAAI;EACF,OAAO,MAAM,iBAAiB,SAAS;GACrC,KAAK,QAAQ,IAAI;GACjB;GACA,QAAQ,WAAW;GACnB;GACA,SAAS,YAAY,KAAK,QAAQ,OAAO,MAAM,eAAe,QAAQ,GAAG;EAC3E,CAAC;CACH,UAAU;EACR,QAAQ,IAAI,UAAU,IAAI;EAC1B,QAAQ,IAAI,WAAW,IAAI;EAC3B,QAAQ,IAAI,cAAc,IAAI;EAC9B,YAAY,oBAAoB,SAAS,IAAI;EAC7C,YAAY;CACd;AACF"}
1
+ {"version":3,"file":"run.mjs","names":[],"sources":["../../../../src/cli/server/run.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\n\nimport { initializeGlobalPoConfig } from '@agimon-ai/po-config';\nimport { poHomeDirectory, removePoPiSettings } from '@agimon-ai/po-core/piSettings';\n\nimport { runServerRuntime } from '../../builders/server/runtime';\nimport { registerPoHost, retireLegacyPoHome } from '../../composition/poHomeMigration';\nimport { resolveHarnessOptions } from '../harnessOptions';\nimport { parseServeOptions } from './options';\n\n/** Removes Po's leftover entries from Pi's default user agent directory, once per server start. */\nfunction removeLegacyPiIntegration(homeDirectory: string): void {\n try {\n for (const removed of removePoPiSettings(path.join(homeDirectory, '.pi', 'agent'))) {\n process.stderr.write(`[po-server] Removed Po's Pi entry: ${removed}\\n`);\n }\n } catch (error) {\n process.stderr.write(\n `[po-server] Could not remove Po's Pi entries: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n }\n}\n\n/**\n * Registers this host, then deletes `~/.pi/.po` once no older host can be using it.\n * Never fatal: a failure here leaves the old directory for the next start.\n */\nfunction registerAndRetireLegacyHome(homeDirectory: string, environment: NodeJS.ProcessEnv): () => void {\n const poHome = poHomeDirectory(homeDirectory, environment);\n let release = (): void => undefined;\n try {\n release = registerPoHost(poHome);\n const retired = retireLegacyPoHome(homeDirectory, poHome);\n if (retired.status === 'removed') process.stderr.write('[po-server] Removed the old ~/.pi/.po directory.\\n');\n if (retired.status === 'deferred') process.stderr.write(`[po-server] Kept ~/.pi/.po for now: ${retired.reason}\\n`);\n } catch (error) {\n process.stderr.write(\n `[po-server] Could not retire ~/.pi/.po: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n }\n return release;\n}\n\nexport async function runServer(\n args: readonly string[],\n /** Aborting stops the server gracefully, as a termination signal does. */\n stopSignal?: AbortSignal,\n): Promise<number> {\n const options = parseServeOptions(args);\n const environment = Object.freeze({ ...process.env });\n const homeDirectory = environment.HOME ?? os.homedir();\n initializeGlobalPoConfig(homeDirectory);\n removeLegacyPiIntegration(homeDirectory);\n const releaseHost = registerAndRetireLegacyHome(homeDirectory, environment);\n const controller = new AbortController();\n const stop = () => controller.abort();\n process.on('SIGINT', stop);\n process.on('SIGTERM', stop);\n // An IPC parent owns this server's lifetime. Its channel closes even when the\n // parent is killed before it can forward a termination signal.\n process.on('disconnect', stop);\n stopSignal?.addEventListener('abort', stop, { once: true });\n if (stopSignal?.aborted) stop();\n try {\n return await runServerRuntime(options, {\n cwd: process.cwd(),\n environment,\n signal: controller.signal,\n resolveHarnessOptions,\n notice: (message) => void process.stderr.write(`[po-server] ${message}\\n`),\n });\n } finally {\n process.off('SIGINT', stop);\n process.off('SIGTERM', stop);\n process.off('disconnect', stop);\n stopSignal?.removeEventListener('abort', stop);\n releaseHost();\n }\n}\n"],"mappings":";;;;;;;;;;AAYA,SAAS,0BAA0B,eAA6B;CAC9D,IAAI;EACF,KAAK,MAAM,WAAW,mBAAmB,KAAK,KAAK,eAAe,OAAO,OAAO,CAAC,GAC/E,QAAQ,OAAO,MAAM,sCAAsC,QAAQ,GAAG;CAE1E,SAAS,OAAO;EACd,QAAQ,OAAO,MACb,iDAAiD,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAC1G;CACF;AACF;;;;;AAMA,SAAS,4BAA4B,eAAuB,aAA4C;CACtG,MAAM,SAAS,gBAAgB,eAAe,WAAW;CACzD,IAAI,gBAAsB,KAAA;CAC1B,IAAI;EACF,UAAU,eAAe,MAAM;EAC/B,MAAM,UAAU,mBAAmB,eAAe,MAAM;EACxD,IAAI,QAAQ,WAAW,WAAW,QAAQ,OAAO,MAAM,oDAAoD;EAC3G,IAAI,QAAQ,WAAW,YAAY,QAAQ,OAAO,MAAM,uCAAuC,QAAQ,OAAO,GAAG;CACnH,SAAS,OAAO;EACd,QAAQ,OAAO,MACb,2CAA2C,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GACpG;CACF;CACA,OAAO;AACT;AAEA,eAAsB,UACpB,MAEA,YACiB;CACjB,MAAM,UAAU,kBAAkB,IAAI;CACtC,MAAM,cAAc,OAAO,OAAO,EAAE,GAAG,QAAQ,IAAI,CAAC;CACpD,MAAM,gBAAgB,YAAY,QAAQ,GAAG,QAAQ;CACrD,yBAAyB,aAAa;CACtC,0BAA0B,aAAa;CACvC,MAAM,cAAc,4BAA4B,eAAe,WAAW;CAC1E,MAAM,aAAa,IAAI,gBAAgB;CACvC,MAAM,aAAa,WAAW,MAAM;CACpC,QAAQ,GAAG,UAAU,IAAI;CACzB,QAAQ,GAAG,WAAW,IAAI;CAG1B,QAAQ,GAAG,cAAc,IAAI;CAC7B,YAAY,iBAAiB,SAAS,MAAM,EAAE,MAAM,KAAK,CAAC;CAC1D,IAAI,YAAY,SAAS,KAAK;CAC9B,IAAI;EACF,OAAO,MAAM,iBAAiB,SAAS;GACrC,KAAK,QAAQ,IAAI;GACjB;GACA,QAAQ,WAAW;GACnB;GACA,SAAS,YAAY,KAAK,QAAQ,OAAO,MAAM,eAAe,QAAQ,GAAG;EAC3E,CAAC;CACH,UAAU;EACR,QAAQ,IAAI,UAAU,IAAI;EAC1B,QAAQ,IAAI,WAAW,IAAI;EAC3B,QAAQ,IAAI,cAAc,IAAI;EAC9B,YAAY,oBAAoB,SAAS,IAAI;EAC7C,YAAY;CACd;AACF"}
@@ -29,20 +29,75 @@ function updateHarnessState(patch, environment = process.env) {
29
29
  return (0, _agimon_ai_po_config_harnessStore.updateHarnessState)(patch, environment);
30
30
  }
31
31
  //#endregion
32
- exports.HARNESS_STATE_KEYS = _agimon_ai_po_config_harnessState.HARNESS_STATE_KEYS;
33
- exports.HARNESS_STATE_POINTER = _agimon_ai_po_config_harnessStore.HARNESS_STATE_POINTER;
34
- exports.createHarnessSession = _agimon_ai_po_config_harnessStore.createHarnessSession;
32
+ Object.defineProperty(exports, "HARNESS_STATE_KEYS", {
33
+ enumerable: true,
34
+ get: function() {
35
+ return _agimon_ai_po_config_harnessState.HARNESS_STATE_KEYS;
36
+ }
37
+ });
38
+ Object.defineProperty(exports, "HARNESS_STATE_POINTER", {
39
+ enumerable: true,
40
+ get: function() {
41
+ return _agimon_ai_po_config_harnessStore.HARNESS_STATE_POINTER;
42
+ }
43
+ });
44
+ Object.defineProperty(exports, "createHarnessSession", {
45
+ enumerable: true,
46
+ get: function() {
47
+ return _agimon_ai_po_config_harnessStore.createHarnessSession;
48
+ }
49
+ });
35
50
  exports.getHarnessState = getHarnessState;
36
- exports.harnessRoot = _agimon_ai_po_config_harnessStore.harnessRoot;
37
- exports.loadHarnessState = _agimon_ai_po_config_harnessStore.loadHarnessState;
38
- exports.projectHarnessEnvironment = _agimon_ai_po_config_harnessState.projectHarnessEnvironment;
51
+ Object.defineProperty(exports, "harnessRoot", {
52
+ enumerable: true,
53
+ get: function() {
54
+ return _agimon_ai_po_config_harnessStore.harnessRoot;
55
+ }
56
+ });
57
+ Object.defineProperty(exports, "loadHarnessState", {
58
+ enumerable: true,
59
+ get: function() {
60
+ return _agimon_ai_po_config_harnessStore.loadHarnessState;
61
+ }
62
+ });
63
+ Object.defineProperty(exports, "projectHarnessEnvironment", {
64
+ enumerable: true,
65
+ get: function() {
66
+ return _agimon_ai_po_config_harnessState.projectHarnessEnvironment;
67
+ }
68
+ });
39
69
  exports.readHarnessState = readHarnessState;
40
70
  exports.refreshHarnessState = refreshHarnessState;
41
- exports.requireHarnessPaths = _agimon_ai_po_config_harnessStore.requireHarnessPaths;
42
- exports.requireHarnessRoot = _agimon_ai_po_config_harnessStore.requireHarnessRoot;
43
- exports.resetHarnessStore = _agimon_ai_po_config_harnessStore.resetHarnessStore;
44
- exports.restoreHarnessStateSnapshot = _agimon_ai_po_config_harnessStore.restoreHarnessStateSnapshot;
45
- exports.snapshotHarnessState = _agimon_ai_po_config_harnessStore.snapshotHarnessState;
71
+ Object.defineProperty(exports, "requireHarnessPaths", {
72
+ enumerable: true,
73
+ get: function() {
74
+ return _agimon_ai_po_config_harnessStore.requireHarnessPaths;
75
+ }
76
+ });
77
+ Object.defineProperty(exports, "requireHarnessRoot", {
78
+ enumerable: true,
79
+ get: function() {
80
+ return _agimon_ai_po_config_harnessStore.requireHarnessRoot;
81
+ }
82
+ });
83
+ Object.defineProperty(exports, "resetHarnessStore", {
84
+ enumerable: true,
85
+ get: function() {
86
+ return _agimon_ai_po_config_harnessStore.resetHarnessStore;
87
+ }
88
+ });
89
+ Object.defineProperty(exports, "restoreHarnessStateSnapshot", {
90
+ enumerable: true,
91
+ get: function() {
92
+ return _agimon_ai_po_config_harnessStore.restoreHarnessStateSnapshot;
93
+ }
94
+ });
95
+ Object.defineProperty(exports, "snapshotHarnessState", {
96
+ enumerable: true,
97
+ get: function() {
98
+ return _agimon_ai_po_config_harnessStore.snapshotHarnessState;
99
+ }
100
+ });
46
101
  exports.updateHarnessState = updateHarnessState;
47
102
 
48
103
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["HARNESS_EVENT","readSharedHarnessState","getSharedHarnessState","updateSharedHarnessState"],"sources":["../../../../src/composition/harnessState/index.ts"],"sourcesContent":["import {\n HARNESS_STATE_KEYS,\n projectHarnessEnvironment,\n readHarnessState as readSharedHarnessState,\n} from '@agimon-ai/po-config/harnessState';\nimport {\n createHarnessSession,\n getHarnessState as getSharedHarnessState,\n HARNESS_STATE_POINTER,\n harnessRoot,\n loadHarnessState,\n requireHarnessPaths,\n requireHarnessRoot,\n resetHarnessStore,\n restoreHarnessStateSnapshot,\n snapshotHarnessState,\n updateHarnessState as updateSharedHarnessState,\n} from '@agimon-ai/po-config/harnessStore';\nimport type { HarnessState } from '@agimon-ai/po-config/types';\nimport { HARNESS_EVENT, type HarnessFailureReporter } from '@agimon-ai/po-core/runtimeLogSinkTelemetry';\n\nexport type { HarnessStateTransactionSnapshot } from '@agimon-ai/po-config/harnessStore';\nexport type { DoomHarnessContext, HarnessState } from '@agimon-ai/po-config/types';\nexport {\n createHarnessSession,\n HARNESS_STATE_KEYS,\n HARNESS_STATE_POINTER,\n harnessRoot,\n loadHarnessState,\n projectHarnessEnvironment,\n requireHarnessPaths,\n requireHarnessRoot,\n resetHarnessStore,\n restoreHarnessStateSnapshot,\n snapshotHarnessState,\n};\n\nfunction telemetryReporter(report?: HarnessFailureReporter): ((key: string, error: unknown) => void) | undefined {\n if (!report) return undefined;\n return (key, error) => {\n report.warn(HARNESS_EVENT.harnessStateParseFailed, error, { 'harness.state.key': key });\n };\n}\n\nexport function readHarnessState(\n environment: NodeJS.ProcessEnv = process.env,\n report?: HarnessFailureReporter,\n): HarnessState {\n return readSharedHarnessState(environment, telemetryReporter(report));\n}\n\nexport function getHarnessState(report?: HarnessFailureReporter): HarnessState {\n return getSharedHarnessState(telemetryReporter(report));\n}\n\n/**\n * Re-reads the state, dropping what this process had cached.\n *\n * The store caches for the life of a process because nothing else writes the\n * file it owns. A test suite and a Pi reload are the two places that outlive\n * that assumption, so both come through here.\n */\nexport function refreshHarnessState(report?: HarnessFailureReporter): HarnessState {\n resetHarnessStore();\n return getHarnessState(report);\n}\n\nexport function updateHarnessState(\n patch: Partial<HarnessState>,\n environment: NodeJS.ProcessEnv = process.env,\n): HarnessState {\n return updateSharedHarnessState(patch, environment);\n}\n"],"mappings":";;;;AAqCA,SAAS,kBAAkB,QAAsF;CAC/G,IAAI,CAAC,QAAQ,OAAO,KAAA;CACpB,QAAQ,KAAK,UAAU;EACrB,OAAO,KAAKA,2CAAAA,cAAc,yBAAyB,OAAO,EAAE,qBAAqB,IAAI,CAAC;CACxF;AACF;AAEA,SAAgB,iBACd,cAAiC,QAAQ,KACzC,QACc;CACd,QAAA,GAAOC,kCAAAA,iBAAAA,CAAuB,aAAa,kBAAkB,MAAM,CAAC;AACtE;AAEA,SAAgB,gBAAgB,QAA+C;CAC7E,QAAA,GAAOC,kCAAAA,gBAAAA,CAAsB,kBAAkB,MAAM,CAAC;AACxD;;;;;;;;AASA,SAAgB,oBAAoB,QAA+C;CACjF,CAAA,GAAA,kCAAA,kBAAA,CAAkB;CAClB,OAAO,gBAAgB,MAAM;AAC/B;AAEA,SAAgB,mBACd,OACA,cAAiC,QAAQ,KAC3B;CACd,QAAA,GAAOC,kCAAAA,mBAAAA,CAAyB,OAAO,WAAW;AACpD"}
1
+ {"version":3,"file":"index.cjs","names":["HARNESS_EVENT","readSharedHarnessState","getSharedHarnessState","updateSharedHarnessState"],"sources":["../../../../src/composition/harnessState/index.ts"],"sourcesContent":["import {\n HARNESS_STATE_KEYS,\n projectHarnessEnvironment,\n readHarnessState as readSharedHarnessState,\n} from '@agimon-ai/po-config/harnessState';\nimport {\n createHarnessSession,\n getHarnessState as getSharedHarnessState,\n HARNESS_STATE_POINTER,\n harnessRoot,\n loadHarnessState,\n requireHarnessPaths,\n requireHarnessRoot,\n resetHarnessStore,\n restoreHarnessStateSnapshot,\n snapshotHarnessState,\n updateHarnessState as updateSharedHarnessState,\n} from '@agimon-ai/po-config/harnessStore';\nimport type { HarnessState } from '@agimon-ai/po-config/types';\nimport { HARNESS_EVENT, type HarnessFailureReporter } from '@agimon-ai/po-core/runtimeLogSinkTelemetry';\n\nexport type { HarnessStateTransactionSnapshot } from '@agimon-ai/po-config/harnessStore';\nexport type { PoHarnessContext, HarnessState } from '@agimon-ai/po-config/types';\nexport {\n createHarnessSession,\n HARNESS_STATE_KEYS,\n HARNESS_STATE_POINTER,\n harnessRoot,\n loadHarnessState,\n projectHarnessEnvironment,\n requireHarnessPaths,\n requireHarnessRoot,\n resetHarnessStore,\n restoreHarnessStateSnapshot,\n snapshotHarnessState,\n};\n\nfunction telemetryReporter(report?: HarnessFailureReporter): ((key: string, error: unknown) => void) | undefined {\n if (!report) return undefined;\n return (key, error) => {\n report.warn(HARNESS_EVENT.harnessStateParseFailed, error, { 'harness.state.key': key });\n };\n}\n\nexport function readHarnessState(\n environment: NodeJS.ProcessEnv = process.env,\n report?: HarnessFailureReporter,\n): HarnessState {\n return readSharedHarnessState(environment, telemetryReporter(report));\n}\n\nexport function getHarnessState(report?: HarnessFailureReporter): HarnessState {\n return getSharedHarnessState(telemetryReporter(report));\n}\n\n/**\n * Re-reads the state, dropping what this process had cached.\n *\n * The store caches for the life of a process because nothing else writes the\n * file it owns. A test suite and a Pi reload are the two places that outlive\n * that assumption, so both come through here.\n */\nexport function refreshHarnessState(report?: HarnessFailureReporter): HarnessState {\n resetHarnessStore();\n return getHarnessState(report);\n}\n\nexport function updateHarnessState(\n patch: Partial<HarnessState>,\n environment: NodeJS.ProcessEnv = process.env,\n): HarnessState {\n return updateSharedHarnessState(patch, environment);\n}\n"],"mappings":";;;;AAqCA,SAAS,kBAAkB,QAAsF;CAC/G,IAAI,CAAC,QAAQ,OAAO,KAAA;CACpB,QAAQ,KAAK,UAAU;EACrB,OAAO,KAAKA,2CAAAA,cAAc,yBAAyB,OAAO,EAAE,qBAAqB,IAAI,CAAC;CACxF;AACF;AAEA,SAAgB,iBACd,cAAiC,QAAQ,KACzC,QACc;CACd,QAAA,GAAOC,kCAAAA,iBAAAA,CAAuB,aAAa,kBAAkB,MAAM,CAAC;AACtE;AAEA,SAAgB,gBAAgB,QAA+C;CAC7E,QAAA,GAAOC,kCAAAA,gBAAAA,CAAsB,kBAAkB,MAAM,CAAC;AACxD;;;;;;;;AASA,SAAgB,oBAAoB,QAA+C;CACjF,CAAA,GAAA,kCAAA,kBAAA,CAAkB;CAClB,OAAO,gBAAgB,MAAM;AAC/B;AAEA,SAAgB,mBACd,OACA,cAAiC,QAAQ,KAC3B;CACd,QAAA,GAAOC,kCAAAA,mBAAAA,CAAyB,OAAO,WAAW;AACpD"}
@@ -1,7 +1,7 @@
1
1
  import { HARNESS_STATE_KEYS as HARNESS_STATE_KEYS$1, projectHarnessEnvironment as projectHarnessEnvironment$1 } from "@agimon-ai/po-config/harnessState";
2
- import { HARNESS_STATE_POINTER, HarnessStateTransactionSnapshot, createHarnessSession, harnessRoot, loadHarnessState, requireHarnessPaths, requireHarnessRoot, resetHarnessStore, restoreHarnessStateSnapshot, snapshotHarnessState } from "@agimon-ai/po-config/harnessStore";
2
+ import { HARNESS_STATE_POINTER as HARNESS_STATE_POINTER$1, HarnessStateTransactionSnapshot, createHarnessSession, harnessRoot, loadHarnessState, requireHarnessPaths, requireHarnessRoot, resetHarnessStore, restoreHarnessStateSnapshot, snapshotHarnessState } from "@agimon-ai/po-config/harnessStore";
3
3
  import { HarnessFailureReporter } from "@agimon-ai/po-core/runtimeLogSinkTelemetry";
4
- import { DoomHarnessContext, HarnessState, HarnessState as HarnessState$1 } from "@agimon-ai/po-config/types";
4
+ import { HarnessState, HarnessState as HarnessState$1, PoHarnessContext } from "@agimon-ai/po-config/types";
5
5
  //#region src/composition/harnessState/index.d.ts
6
6
  declare function readHarnessState$1(environment?: NodeJS.ProcessEnv, report?: HarnessFailureReporter): HarnessState;
7
7
  declare function getHarnessState$1(report?: HarnessFailureReporter): HarnessState;
@@ -15,5 +15,5 @@ declare function getHarnessState$1(report?: HarnessFailureReporter): HarnessStat
15
15
  export declare function refreshHarnessState(report?: HarnessFailureReporter): HarnessState;
16
16
  declare function updateHarnessState$1(patch: Partial<HarnessState>, environment?: NodeJS.ProcessEnv): HarnessState;
17
17
  //#endregion
18
- export { type DoomHarnessContext, HARNESS_STATE_KEYS$1 as HARNESS_STATE_KEYS, HARNESS_STATE_POINTER, type HarnessState$1 as HarnessState, type HarnessStateTransactionSnapshot, createHarnessSession, getHarnessState$1 as getHarnessState, harnessRoot, loadHarnessState, projectHarnessEnvironment$1 as projectHarnessEnvironment, readHarnessState$1 as readHarnessState, requireHarnessPaths, requireHarnessRoot, resetHarnessStore, restoreHarnessStateSnapshot, snapshotHarnessState, updateHarnessState$1 as updateHarnessState };
18
+ export { HARNESS_STATE_KEYS$1 as HARNESS_STATE_KEYS, HARNESS_STATE_POINTER$1 as HARNESS_STATE_POINTER, type HarnessState$1 as HarnessState, type HarnessStateTransactionSnapshot, type PoHarnessContext, createHarnessSession, getHarnessState$1 as getHarnessState, harnessRoot, loadHarnessState, projectHarnessEnvironment$1 as projectHarnessEnvironment, readHarnessState$1 as readHarnessState, requireHarnessPaths, requireHarnessRoot, resetHarnessStore, restoreHarnessStateSnapshot, snapshotHarnessState, updateHarnessState$1 as updateHarnessState };
19
19
  //# sourceMappingURL=index.d.mts.map
@@ -1,5 +1,5 @@
1
1
  import { HARNESS_STATE_KEYS as HARNESS_STATE_KEYS$1, projectHarnessEnvironment as projectHarnessEnvironment$1, readHarnessState } from "@agimon-ai/po-config/harnessState";
2
- import { HARNESS_STATE_POINTER, createHarnessSession, getHarnessState, harnessRoot, loadHarnessState, requireHarnessPaths, requireHarnessRoot, resetHarnessStore, restoreHarnessStateSnapshot, snapshotHarnessState, updateHarnessState } from "@agimon-ai/po-config/harnessStore";
2
+ import { HARNESS_STATE_POINTER as HARNESS_STATE_POINTER$1, createHarnessSession, getHarnessState, harnessRoot, loadHarnessState, requireHarnessPaths, requireHarnessRoot, resetHarnessStore, restoreHarnessStateSnapshot, snapshotHarnessState, updateHarnessState } from "@agimon-ai/po-config/harnessStore";
3
3
  import { HARNESS_EVENT } from "@agimon-ai/po-core/runtimeLogSinkTelemetry";
4
4
  //#region src/composition/harnessState/index.ts
5
5
  function telemetryReporter(report) {
@@ -29,6 +29,6 @@ function updateHarnessState$1(patch, environment = process.env) {
29
29
  return updateHarnessState(patch, environment);
30
30
  }
31
31
  //#endregion
32
- export { HARNESS_STATE_KEYS$1 as HARNESS_STATE_KEYS, HARNESS_STATE_POINTER, createHarnessSession, getHarnessState$1 as getHarnessState, harnessRoot, loadHarnessState, projectHarnessEnvironment$1 as projectHarnessEnvironment, readHarnessState$1 as readHarnessState, refreshHarnessState, requireHarnessPaths, requireHarnessRoot, resetHarnessStore, restoreHarnessStateSnapshot, snapshotHarnessState, updateHarnessState$1 as updateHarnessState };
32
+ export { HARNESS_STATE_KEYS$1 as HARNESS_STATE_KEYS, HARNESS_STATE_POINTER$1 as HARNESS_STATE_POINTER, createHarnessSession, getHarnessState$1 as getHarnessState, harnessRoot, loadHarnessState, projectHarnessEnvironment$1 as projectHarnessEnvironment, readHarnessState$1 as readHarnessState, refreshHarnessState, requireHarnessPaths, requireHarnessRoot, resetHarnessStore, restoreHarnessStateSnapshot, snapshotHarnessState, updateHarnessState$1 as updateHarnessState };
33
33
 
34
34
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["readHarnessState","readSharedHarnessState","getHarnessState","getSharedHarnessState","updateHarnessState","updateSharedHarnessState"],"sources":["../../../../src/composition/harnessState/index.ts"],"sourcesContent":["import {\n HARNESS_STATE_KEYS,\n projectHarnessEnvironment,\n readHarnessState as readSharedHarnessState,\n} from '@agimon-ai/po-config/harnessState';\nimport {\n createHarnessSession,\n getHarnessState as getSharedHarnessState,\n HARNESS_STATE_POINTER,\n harnessRoot,\n loadHarnessState,\n requireHarnessPaths,\n requireHarnessRoot,\n resetHarnessStore,\n restoreHarnessStateSnapshot,\n snapshotHarnessState,\n updateHarnessState as updateSharedHarnessState,\n} from '@agimon-ai/po-config/harnessStore';\nimport type { HarnessState } from '@agimon-ai/po-config/types';\nimport { HARNESS_EVENT, type HarnessFailureReporter } from '@agimon-ai/po-core/runtimeLogSinkTelemetry';\n\nexport type { HarnessStateTransactionSnapshot } from '@agimon-ai/po-config/harnessStore';\nexport type { DoomHarnessContext, HarnessState } from '@agimon-ai/po-config/types';\nexport {\n createHarnessSession,\n HARNESS_STATE_KEYS,\n HARNESS_STATE_POINTER,\n harnessRoot,\n loadHarnessState,\n projectHarnessEnvironment,\n requireHarnessPaths,\n requireHarnessRoot,\n resetHarnessStore,\n restoreHarnessStateSnapshot,\n snapshotHarnessState,\n};\n\nfunction telemetryReporter(report?: HarnessFailureReporter): ((key: string, error: unknown) => void) | undefined {\n if (!report) return undefined;\n return (key, error) => {\n report.warn(HARNESS_EVENT.harnessStateParseFailed, error, { 'harness.state.key': key });\n };\n}\n\nexport function readHarnessState(\n environment: NodeJS.ProcessEnv = process.env,\n report?: HarnessFailureReporter,\n): HarnessState {\n return readSharedHarnessState(environment, telemetryReporter(report));\n}\n\nexport function getHarnessState(report?: HarnessFailureReporter): HarnessState {\n return getSharedHarnessState(telemetryReporter(report));\n}\n\n/**\n * Re-reads the state, dropping what this process had cached.\n *\n * The store caches for the life of a process because nothing else writes the\n * file it owns. A test suite and a Pi reload are the two places that outlive\n * that assumption, so both come through here.\n */\nexport function refreshHarnessState(report?: HarnessFailureReporter): HarnessState {\n resetHarnessStore();\n return getHarnessState(report);\n}\n\nexport function updateHarnessState(\n patch: Partial<HarnessState>,\n environment: NodeJS.ProcessEnv = process.env,\n): HarnessState {\n return updateSharedHarnessState(patch, environment);\n}\n"],"mappings":";;;;AAqCA,SAAS,kBAAkB,QAAsF;CAC/G,IAAI,CAAC,QAAQ,OAAO,KAAA;CACpB,QAAQ,KAAK,UAAU;EACrB,OAAO,KAAK,cAAc,yBAAyB,OAAO,EAAE,qBAAqB,IAAI,CAAC;CACxF;AACF;AAEA,SAAgBA,mBACd,cAAiC,QAAQ,KACzC,QACc;CACd,OAAOC,iBAAuB,aAAa,kBAAkB,MAAM,CAAC;AACtE;AAEA,SAAgBC,kBAAgB,QAA+C;CAC7E,OAAOC,gBAAsB,kBAAkB,MAAM,CAAC;AACxD;;;;;;;;AASA,SAAgB,oBAAoB,QAA+C;CACjF,kBAAkB;CAClB,OAAOD,kBAAgB,MAAM;AAC/B;AAEA,SAAgBE,qBACd,OACA,cAAiC,QAAQ,KAC3B;CACd,OAAOC,mBAAyB,OAAO,WAAW;AACpD"}
1
+ {"version":3,"file":"index.mjs","names":["readHarnessState","readSharedHarnessState","getHarnessState","getSharedHarnessState","updateHarnessState","updateSharedHarnessState"],"sources":["../../../../src/composition/harnessState/index.ts"],"sourcesContent":["import {\n HARNESS_STATE_KEYS,\n projectHarnessEnvironment,\n readHarnessState as readSharedHarnessState,\n} from '@agimon-ai/po-config/harnessState';\nimport {\n createHarnessSession,\n getHarnessState as getSharedHarnessState,\n HARNESS_STATE_POINTER,\n harnessRoot,\n loadHarnessState,\n requireHarnessPaths,\n requireHarnessRoot,\n resetHarnessStore,\n restoreHarnessStateSnapshot,\n snapshotHarnessState,\n updateHarnessState as updateSharedHarnessState,\n} from '@agimon-ai/po-config/harnessStore';\nimport type { HarnessState } from '@agimon-ai/po-config/types';\nimport { HARNESS_EVENT, type HarnessFailureReporter } from '@agimon-ai/po-core/runtimeLogSinkTelemetry';\n\nexport type { HarnessStateTransactionSnapshot } from '@agimon-ai/po-config/harnessStore';\nexport type { PoHarnessContext, HarnessState } from '@agimon-ai/po-config/types';\nexport {\n createHarnessSession,\n HARNESS_STATE_KEYS,\n HARNESS_STATE_POINTER,\n harnessRoot,\n loadHarnessState,\n projectHarnessEnvironment,\n requireHarnessPaths,\n requireHarnessRoot,\n resetHarnessStore,\n restoreHarnessStateSnapshot,\n snapshotHarnessState,\n};\n\nfunction telemetryReporter(report?: HarnessFailureReporter): ((key: string, error: unknown) => void) | undefined {\n if (!report) return undefined;\n return (key, error) => {\n report.warn(HARNESS_EVENT.harnessStateParseFailed, error, { 'harness.state.key': key });\n };\n}\n\nexport function readHarnessState(\n environment: NodeJS.ProcessEnv = process.env,\n report?: HarnessFailureReporter,\n): HarnessState {\n return readSharedHarnessState(environment, telemetryReporter(report));\n}\n\nexport function getHarnessState(report?: HarnessFailureReporter): HarnessState {\n return getSharedHarnessState(telemetryReporter(report));\n}\n\n/**\n * Re-reads the state, dropping what this process had cached.\n *\n * The store caches for the life of a process because nothing else writes the\n * file it owns. A test suite and a Pi reload are the two places that outlive\n * that assumption, so both come through here.\n */\nexport function refreshHarnessState(report?: HarnessFailureReporter): HarnessState {\n resetHarnessStore();\n return getHarnessState(report);\n}\n\nexport function updateHarnessState(\n patch: Partial<HarnessState>,\n environment: NodeJS.ProcessEnv = process.env,\n): HarnessState {\n return updateSharedHarnessState(patch, environment);\n}\n"],"mappings":";;;;AAqCA,SAAS,kBAAkB,QAAsF;CAC/G,IAAI,CAAC,QAAQ,OAAO,KAAA;CACpB,QAAQ,KAAK,UAAU;EACrB,OAAO,KAAK,cAAc,yBAAyB,OAAO,EAAE,qBAAqB,IAAI,CAAC;CACxF;AACF;AAEA,SAAgBA,mBACd,cAAiC,QAAQ,KACzC,QACc;CACd,OAAOC,iBAAuB,aAAa,kBAAkB,MAAM,CAAC;AACtE;AAEA,SAAgBC,kBAAgB,QAA+C;CAC7E,OAAOC,gBAAsB,kBAAkB,MAAM,CAAC;AACxD;;;;;;;;AASA,SAAgB,oBAAoB,QAA+C;CACjF,kBAAkB;CAClB,OAAOD,kBAAgB,MAAM;AAC/B;AAEA,SAAgBE,qBACd,OACA,cAAiC,QAAQ,KAC3B;CACd,OAAOC,mBAAyB,OAAO,WAAW;AACpD"}