@agimon-ai/po 0.0.0-alpha.0

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 (560) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +755 -0
  3. package/assets/banner.png +0 -0
  4. package/assets/banner.svg +25 -0
  5. package/assets/favicon.svg +15 -0
  6. package/assets/logo-light.png +0 -0
  7. package/assets/logo-light.svg +25 -0
  8. package/assets/logo.png +0 -0
  9. package/assets/logo.svg +25 -0
  10. package/assets/mascot.png +0 -0
  11. package/assets/mascot.svg +25 -0
  12. package/dist/_virtual/_rolldown/runtime.cjs +23 -0
  13. package/dist/antigravity.cjs +5 -0
  14. package/dist/antigravity.d.mts +2 -0
  15. package/dist/antigravity.mjs +2 -0
  16. package/dist/apiContracts.cjs +11 -0
  17. package/dist/apiContracts.cjs.map +1 -0
  18. package/dist/apiContracts.d.mts +52 -0
  19. package/dist/apiContracts.d.mts.map +1 -0
  20. package/dist/apiContracts.mjs +7 -0
  21. package/dist/apiContracts.mjs.map +1 -0
  22. package/dist/baseCommand.cjs +3 -0
  23. package/dist/baseCommand.d.mts +2 -0
  24. package/dist/baseCommand.mjs +2 -0
  25. package/dist/bin/cli.cjs +24 -0
  26. package/dist/bin/cli.cjs.map +1 -0
  27. package/dist/bin/cli.d.mts +1 -0
  28. package/dist/bin/cli.mjs +25 -0
  29. package/dist/bin/cli.mjs.map +1 -0
  30. package/dist/bin/doomRunner.cjs +33 -0
  31. package/dist/bin/doomRunner.cjs.map +1 -0
  32. package/dist/bin/doomRunner.d.mts +4 -0
  33. package/dist/bin/doomRunner.d.mts.map +1 -0
  34. package/dist/bin/doomRunner.mjs +32 -0
  35. package/dist/bin/doomRunner.mjs.map +1 -0
  36. package/dist/bin/serve.cjs +30 -0
  37. package/dist/bin/serve.cjs.map +1 -0
  38. package/dist/bin/serve.d.mts +1 -0
  39. package/dist/bin/serve.mjs +31 -0
  40. package/dist/bin/serve.mjs.map +1 -0
  41. package/dist/builders/cli/extensionAssembler/index.cjs +342 -0
  42. package/dist/builders/cli/extensionAssembler/index.cjs.map +1 -0
  43. package/dist/builders/cli/extensionAssembler/index.d.mts +85 -0
  44. package/dist/builders/cli/extensionAssembler/index.d.mts.map +1 -0
  45. package/dist/builders/cli/extensionAssembler/index.mjs +335 -0
  46. package/dist/builders/cli/extensionAssembler/index.mjs.map +1 -0
  47. package/dist/catalog/index.json +430 -0
  48. package/dist/cli.cjs +28 -0
  49. package/dist/cli.d.mts +11 -0
  50. package/dist/cli.mjs +11 -0
  51. package/dist/cliApp.cjs +6 -0
  52. package/dist/cliApp.d.mts +2 -0
  53. package/dist/cliApp.mjs +2 -0
  54. package/dist/codex.cjs +8 -0
  55. package/dist/codex.d.mts +2 -0
  56. package/dist/codex.mjs +2 -0
  57. package/dist/commands.cjs +18 -0
  58. package/dist/commands.d.mts +9 -0
  59. package/dist/commands.mjs +9 -0
  60. package/dist/compatibility.cjs +27 -0
  61. package/dist/compatibility.d.mts +6 -0
  62. package/dist/compatibility.mjs +6 -0
  63. package/dist/compatibilityCommand.cjs +4 -0
  64. package/dist/compatibilityCommand.d.mts +2 -0
  65. package/dist/compatibilityCommand.mjs +2 -0
  66. package/dist/compatibilityContext.cjs +3 -0
  67. package/dist/compatibilityContext.d.mts +2 -0
  68. package/dist/compatibilityContext.mjs +2 -0
  69. package/dist/compatibilityOptions.cjs +5 -0
  70. package/dist/compatibilityOptions.d.mts +2 -0
  71. package/dist/compatibilityOptions.mjs +2 -0
  72. package/dist/config.cjs +163 -0
  73. package/dist/config.d.mts +7 -0
  74. package/dist/config.mjs +7 -0
  75. package/dist/doctorCommand.cjs +5 -0
  76. package/dist/doctorCommand.d.mts +2 -0
  77. package/dist/doctorCommand.mjs +2 -0
  78. package/dist/emitMcpCommand.cjs +4 -0
  79. package/dist/emitMcpCommand.d.mts +2 -0
  80. package/dist/emitMcpCommand.mjs +2 -0
  81. package/dist/explainCommand.cjs +5 -0
  82. package/dist/explainCommand.d.mts +2 -0
  83. package/dist/explainCommand.mjs +2 -0
  84. package/dist/extensions/server.cjs +39 -0
  85. package/dist/extensions/server.cjs.map +1 -0
  86. package/dist/extensions/server.d.mts +5 -0
  87. package/dist/extensions/server.d.mts.map +1 -0
  88. package/dist/extensions/server.mjs +34 -0
  89. package/dist/extensions/server.mjs.map +1 -0
  90. package/dist/harnessContext.cjs +5 -0
  91. package/dist/harnessContext.d.mts +2 -0
  92. package/dist/harnessContext.mjs +2 -0
  93. package/dist/harnessState.cjs +19 -0
  94. package/dist/harnessState.d.mts +2 -0
  95. package/dist/harnessState.mjs +2 -0
  96. package/dist/help.cjs +12 -0
  97. package/dist/help.d.mts +6 -0
  98. package/dist/help.mjs +6 -0
  99. package/dist/index.cjs +306 -0
  100. package/dist/index.d.mts +40 -0
  101. package/dist/index.mjs +37 -0
  102. package/dist/initCommand.cjs +4 -0
  103. package/dist/initCommand.d.mts +2 -0
  104. package/dist/initCommand.mjs +2 -0
  105. package/dist/matrixOptions.cjs +28 -0
  106. package/dist/matrixOptions.d.mts +2 -0
  107. package/dist/matrixOptions.mjs +2 -0
  108. package/dist/matrixSwitcher.cjs +11 -0
  109. package/dist/matrixSwitcher.d.mts +3 -0
  110. package/dist/matrixSwitcher.mjs +3 -0
  111. package/dist/mcpFilter.cjs +9 -0
  112. package/dist/mcpFilter.d.mts +1 -0
  113. package/dist/mcpFilter.mjs +2 -0
  114. package/dist/options.cjs +3 -0
  115. package/dist/options.d.mts +2 -0
  116. package/dist/options.mjs +2 -0
  117. package/dist/process.cjs +12 -0
  118. package/dist/process.d.mts +2 -0
  119. package/dist/process.mjs +2 -0
  120. package/dist/projectTrust.cjs +6 -0
  121. package/dist/projectTrust.d.mts +2 -0
  122. package/dist/projectTrust.mjs +2 -0
  123. package/dist/repository.cjs +5 -0
  124. package/dist/repository.d.mts +2 -0
  125. package/dist/repository.mjs +2 -0
  126. package/dist/resourceCollector.cjs +9 -0
  127. package/dist/resourceCollector.d.mts +1 -0
  128. package/dist/resourceCollector.mjs +2 -0
  129. package/dist/router.cjs +6 -0
  130. package/dist/router.d.mts +2 -0
  131. package/dist/router.mjs +2 -0
  132. package/dist/services.cjs +97 -0
  133. package/dist/services.d.mts +12 -0
  134. package/dist/services.mjs +12 -0
  135. package/dist/shared.cjs +18 -0
  136. package/dist/shared.d.mts +2 -0
  137. package/dist/shared.mjs +2 -0
  138. package/dist/src/bin/agentDirectory.cjs +27 -0
  139. package/dist/src/bin/agentDirectory.cjs.map +1 -0
  140. package/dist/src/bin/agentDirectory.mjs +26 -0
  141. package/dist/src/bin/agentDirectory.mjs.map +1 -0
  142. package/dist/src/builders/apiContractExport/index.cjs +126 -0
  143. package/dist/src/builders/apiContractExport/index.cjs.map +1 -0
  144. package/dist/src/builders/apiContractExport/index.mjs +123 -0
  145. package/dist/src/builders/apiContractExport/index.mjs.map +1 -0
  146. package/dist/src/builders/cli/entryResolution.cjs +39 -0
  147. package/dist/src/builders/cli/entryResolution.cjs.map +1 -0
  148. package/dist/src/builders/cli/entryResolution.mjs +35 -0
  149. package/dist/src/builders/cli/entryResolution.mjs.map +1 -0
  150. package/dist/src/builders/cli/harnessContext.cjs +175 -0
  151. package/dist/src/builders/cli/harnessContext.cjs.map +1 -0
  152. package/dist/src/builders/cli/harnessContext.d.mts +48 -0
  153. package/dist/src/builders/cli/harnessContext.d.mts.map +1 -0
  154. package/dist/src/builders/cli/harnessContext.mjs +167 -0
  155. package/dist/src/builders/cli/harnessContext.mjs.map +1 -0
  156. package/dist/src/builders/cli/sessionComposition.cjs +27 -0
  157. package/dist/src/builders/cli/sessionComposition.cjs.map +1 -0
  158. package/dist/src/builders/cli/sessionComposition.mjs +26 -0
  159. package/dist/src/builders/cli/sessionComposition.mjs.map +1 -0
  160. package/dist/src/builders/hooks/index.cjs +238 -0
  161. package/dist/src/builders/hooks/index.cjs.map +1 -0
  162. package/dist/src/builders/hooks/index.mjs +231 -0
  163. package/dist/src/builders/hooks/index.mjs.map +1 -0
  164. package/dist/src/builders/native/index.cjs +176 -0
  165. package/dist/src/builders/native/index.cjs.map +1 -0
  166. package/dist/src/builders/native/index.d.mts +36 -0
  167. package/dist/src/builders/native/index.d.mts.map +1 -0
  168. package/dist/src/builders/native/index.mjs +170 -0
  169. package/dist/src/builders/native/index.mjs.map +1 -0
  170. package/dist/src/builders/server/backgroundSync.cjs +333 -0
  171. package/dist/src/builders/server/backgroundSync.cjs.map +1 -0
  172. package/dist/src/builders/server/backgroundSync.mjs +320 -0
  173. package/dist/src/builders/server/backgroundSync.mjs.map +1 -0
  174. package/dist/src/builders/server/computerUseBinding.cjs +273 -0
  175. package/dist/src/builders/server/computerUseBinding.cjs.map +1 -0
  176. package/dist/src/builders/server/computerUseBinding.mjs +269 -0
  177. package/dist/src/builders/server/computerUseBinding.mjs.map +1 -0
  178. package/dist/src/builders/server/computerUseRecordings.cjs +188 -0
  179. package/dist/src/builders/server/computerUseRecordings.cjs.map +1 -0
  180. package/dist/src/builders/server/computerUseRecordings.mjs +184 -0
  181. package/dist/src/builders/server/computerUseRecordings.mjs.map +1 -0
  182. package/dist/src/builders/server/defaultWorkspace.cjs +38 -0
  183. package/dist/src/builders/server/defaultWorkspace.cjs.map +1 -0
  184. package/dist/src/builders/server/defaultWorkspace.mjs +35 -0
  185. package/dist/src/builders/server/defaultWorkspace.mjs.map +1 -0
  186. package/dist/src/builders/server/idleRestart.cjs +149 -0
  187. package/dist/src/builders/server/idleRestart.cjs.map +1 -0
  188. package/dist/src/builders/server/idleRestart.mjs +136 -0
  189. package/dist/src/builders/server/idleRestart.mjs.map +1 -0
  190. package/dist/src/builders/server/index.cjs +63 -0
  191. package/dist/src/builders/server/index.cjs.map +1 -0
  192. package/dist/src/builders/server/index.mjs +60 -0
  193. package/dist/src/builders/server/index.mjs.map +1 -0
  194. package/dist/src/builders/server/logSink.cjs +57 -0
  195. package/dist/src/builders/server/logSink.cjs.map +1 -0
  196. package/dist/src/builders/server/logSink.mjs +57 -0
  197. package/dist/src/builders/server/logSink.mjs.map +1 -0
  198. package/dist/src/builders/server/mcpApp.cjs +152 -0
  199. package/dist/src/builders/server/mcpApp.cjs.map +1 -0
  200. package/dist/src/builders/server/mcpApp.d.mts +18 -0
  201. package/dist/src/builders/server/mcpApp.d.mts.map +1 -0
  202. package/dist/src/builders/server/mcpApp.mjs +147 -0
  203. package/dist/src/builders/server/mcpApp.mjs.map +1 -0
  204. package/dist/src/builders/server/mcpAppBuild.cjs +111 -0
  205. package/dist/src/builders/server/mcpAppBuild.cjs.map +1 -0
  206. package/dist/src/builders/server/mcpAppBuild.d.mts +24 -0
  207. package/dist/src/builders/server/mcpAppBuild.d.mts.map +1 -0
  208. package/dist/src/builders/server/mcpAppBuild.mjs +105 -0
  209. package/dist/src/builders/server/mcpAppBuild.mjs.map +1 -0
  210. package/dist/src/builders/server/mcpBundle.cjs +87 -0
  211. package/dist/src/builders/server/mcpBundle.cjs.map +1 -0
  212. package/dist/src/builders/server/mcpBundle.d.mts +23 -0
  213. package/dist/src/builders/server/mcpBundle.d.mts.map +1 -0
  214. package/dist/src/builders/server/mcpBundle.mjs +84 -0
  215. package/dist/src/builders/server/mcpBundle.mjs.map +1 -0
  216. package/dist/src/builders/server/packageReloadCheck.cjs +62 -0
  217. package/dist/src/builders/server/packageReloadCheck.cjs.map +1 -0
  218. package/dist/src/builders/server/packageReloadCheck.mjs +61 -0
  219. package/dist/src/builders/server/packageReloadCheck.mjs.map +1 -0
  220. package/dist/src/builders/server/packageUrl.cjs +210 -0
  221. package/dist/src/builders/server/packageUrl.cjs.map +1 -0
  222. package/dist/src/builders/server/packageUrl.mjs +203 -0
  223. package/dist/src/builders/server/packageUrl.mjs.map +1 -0
  224. package/dist/src/builders/server/runtime.cjs +1428 -0
  225. package/dist/src/builders/server/runtime.cjs.map +1 -0
  226. package/dist/src/builders/server/runtime.mjs +1420 -0
  227. package/dist/src/builders/server/runtime.mjs.map +1 -0
  228. package/dist/src/builders/server/runtimeResources.cjs +72 -0
  229. package/dist/src/builders/server/runtimeResources.cjs.map +1 -0
  230. package/dist/src/builders/server/runtimeResources.mjs +71 -0
  231. package/dist/src/builders/server/runtimeResources.mjs.map +1 -0
  232. package/dist/src/builders/server/selectionStatus.cjs +12 -0
  233. package/dist/src/builders/server/selectionStatus.cjs.map +1 -0
  234. package/dist/src/builders/server/selectionStatus.mjs +12 -0
  235. package/dist/src/builders/server/selectionStatus.mjs.map +1 -0
  236. package/dist/src/builders/server/sessionArguments.cjs +63 -0
  237. package/dist/src/builders/server/sessionArguments.cjs.map +1 -0
  238. package/dist/src/builders/server/sessionArguments.mjs +62 -0
  239. package/dist/src/builders/server/sessionArguments.mjs.map +1 -0
  240. package/dist/src/builders/server/shutdown.cjs +16 -0
  241. package/dist/src/builders/server/shutdown.cjs.map +1 -0
  242. package/dist/src/builders/server/shutdown.mjs +16 -0
  243. package/dist/src/builders/server/shutdown.mjs.map +1 -0
  244. package/dist/src/builders/server/webTemplateDecision.cjs +34 -0
  245. package/dist/src/builders/server/webTemplateDecision.cjs.map +1 -0
  246. package/dist/src/builders/server/webTemplateDecision.mjs +32 -0
  247. package/dist/src/builders/server/webTemplateDecision.mjs.map +1 -0
  248. package/dist/src/builders/server/workspaceCheckout.cjs +31 -0
  249. package/dist/src/builders/server/workspaceCheckout.cjs.map +1 -0
  250. package/dist/src/builders/server/workspaceCheckout.mjs +29 -0
  251. package/dist/src/builders/server/workspaceCheckout.mjs.map +1 -0
  252. package/dist/src/builders/web/bundle.cjs +225 -0
  253. package/dist/src/builders/web/bundle.cjs.map +1 -0
  254. package/dist/src/builders/web/bundle.d.mts +65 -0
  255. package/dist/src/builders/web/bundle.d.mts.map +1 -0
  256. package/dist/src/builders/web/bundle.mjs +221 -0
  257. package/dist/src/builders/web/bundle.mjs.map +1 -0
  258. package/dist/src/builders/web/bundleAssetPolicy.cjs +96 -0
  259. package/dist/src/builders/web/bundleAssetPolicy.cjs.map +1 -0
  260. package/dist/src/builders/web/bundleAssetPolicy.d.mts +22 -0
  261. package/dist/src/builders/web/bundleAssetPolicy.d.mts.map +1 -0
  262. package/dist/src/builders/web/bundleAssetPolicy.mjs +95 -0
  263. package/dist/src/builders/web/bundleAssetPolicy.mjs.map +1 -0
  264. package/dist/src/builders/web/index.cjs +361 -0
  265. package/dist/src/builders/web/index.cjs.map +1 -0
  266. package/dist/src/builders/web/index.d.mts +109 -0
  267. package/dist/src/builders/web/index.d.mts.map +1 -0
  268. package/dist/src/builders/web/index.mjs +342 -0
  269. package/dist/src/builders/web/index.mjs.map +1 -0
  270. package/dist/src/builders/web/webDevRoots.cjs +27 -0
  271. package/dist/src/builders/web/webDevRoots.cjs.map +1 -0
  272. package/dist/src/builders/web/webDevRoots.d.mts +22 -0
  273. package/dist/src/builders/web/webDevRoots.d.mts.map +1 -0
  274. package/dist/src/builders/web/webDevRoots.mjs +25 -0
  275. package/dist/src/builders/web/webDevRoots.mjs.map +1 -0
  276. package/dist/src/builders/web/webPluginGenerate.cjs +188 -0
  277. package/dist/src/builders/web/webPluginGenerate.cjs.map +1 -0
  278. package/dist/src/builders/web/webPluginGenerate.d.mts +56 -0
  279. package/dist/src/builders/web/webPluginGenerate.d.mts.map +1 -0
  280. package/dist/src/builders/web/webPluginGenerate.mjs +178 -0
  281. package/dist/src/builders/web/webPluginGenerate.mjs.map +1 -0
  282. package/dist/src/builders/web/webPluginManifest.cjs +128 -0
  283. package/dist/src/builders/web/webPluginManifest.cjs.map +1 -0
  284. package/dist/src/builders/web/webPluginManifest.d.mts +64 -0
  285. package/dist/src/builders/web/webPluginManifest.d.mts.map +1 -0
  286. package/dist/src/builders/web/webPluginManifest.mjs +118 -0
  287. package/dist/src/builders/web/webPluginManifest.mjs.map +1 -0
  288. package/dist/src/builders/web/webPluginScan.cjs +57 -0
  289. package/dist/src/builders/web/webPluginScan.cjs.map +1 -0
  290. package/dist/src/builders/web/webPluginScan.d.mts +19 -0
  291. package/dist/src/builders/web/webPluginScan.d.mts.map +1 -0
  292. package/dist/src/builders/web/webPluginScan.mjs +54 -0
  293. package/dist/src/builders/web/webPluginScan.mjs.map +1 -0
  294. package/dist/src/builders/web/webPluginVite.cjs +255 -0
  295. package/dist/src/builders/web/webPluginVite.cjs.map +1 -0
  296. package/dist/src/builders/web/webPluginVite.d.mts +64 -0
  297. package/dist/src/builders/web/webPluginVite.d.mts.map +1 -0
  298. package/dist/src/builders/web/webPluginVite.mjs +242 -0
  299. package/dist/src/builders/web/webPluginVite.mjs.map +1 -0
  300. package/dist/src/cli/cliApp.cjs +187 -0
  301. package/dist/src/cli/cliApp.cjs.map +1 -0
  302. package/dist/src/cli/cliApp.d.mts +32 -0
  303. package/dist/src/cli/cliApp.d.mts.map +1 -0
  304. package/dist/src/cli/cliApp.mjs +184 -0
  305. package/dist/src/cli/cliApp.mjs.map +1 -0
  306. package/dist/src/cli/commands/api-export/index.cjs +66 -0
  307. package/dist/src/cli/commands/api-export/index.cjs.map +1 -0
  308. package/dist/src/cli/commands/api-export/index.mjs +62 -0
  309. package/dist/src/cli/commands/api-export/index.mjs.map +1 -0
  310. package/dist/src/cli/commands/baseCommand.cjs +16 -0
  311. package/dist/src/cli/commands/baseCommand.cjs.map +1 -0
  312. package/dist/src/cli/commands/baseCommand.d.mts +24 -0
  313. package/dist/src/cli/commands/baseCommand.d.mts.map +1 -0
  314. package/dist/src/cli/commands/baseCommand.mjs +16 -0
  315. package/dist/src/cli/commands/baseCommand.mjs.map +1 -0
  316. package/dist/src/cli/commands/compat/context.cjs +115 -0
  317. package/dist/src/cli/commands/compat/context.cjs.map +1 -0
  318. package/dist/src/cli/commands/compat/context.d.mts +22 -0
  319. package/dist/src/cli/commands/compat/context.d.mts.map +1 -0
  320. package/dist/src/cli/commands/compat/context.mjs +110 -0
  321. package/dist/src/cli/commands/compat/context.mjs.map +1 -0
  322. package/dist/src/cli/commands/compat/help.cjs +26 -0
  323. package/dist/src/cli/commands/compat/help.cjs.map +1 -0
  324. package/dist/src/cli/commands/compat/help.d.mts +4 -0
  325. package/dist/src/cli/commands/compat/help.d.mts.map +1 -0
  326. package/dist/src/cli/commands/compat/help.mjs +25 -0
  327. package/dist/src/cli/commands/compat/help.mjs.map +1 -0
  328. package/dist/src/cli/commands/compat/index.cjs +73 -0
  329. package/dist/src/cli/commands/compat/index.cjs.map +1 -0
  330. package/dist/src/cli/commands/compat/index.d.mts +14 -0
  331. package/dist/src/cli/commands/compat/index.d.mts.map +1 -0
  332. package/dist/src/cli/commands/compat/index.mjs +70 -0
  333. package/dist/src/cli/commands/compat/index.mjs.map +1 -0
  334. package/dist/src/cli/commands/compat/options.cjs +88 -0
  335. package/dist/src/cli/commands/compat/options.cjs.map +1 -0
  336. package/dist/src/cli/commands/compat/options.d.mts +15 -0
  337. package/dist/src/cli/commands/compat/options.d.mts.map +1 -0
  338. package/dist/src/cli/commands/compat/options.mjs +86 -0
  339. package/dist/src/cli/commands/compat/options.mjs.map +1 -0
  340. package/dist/src/cli/commands/compat/providers/antigravity.cjs +294 -0
  341. package/dist/src/cli/commands/compat/providers/antigravity.cjs.map +1 -0
  342. package/dist/src/cli/commands/compat/providers/antigravity.d.mts +9 -0
  343. package/dist/src/cli/commands/compat/providers/antigravity.d.mts.map +1 -0
  344. package/dist/src/cli/commands/compat/providers/antigravity.mjs +289 -0
  345. package/dist/src/cli/commands/compat/providers/antigravity.mjs.map +1 -0
  346. package/dist/src/cli/commands/compat/providers/codex.cjs +178 -0
  347. package/dist/src/cli/commands/compat/providers/codex.cjs.map +1 -0
  348. package/dist/src/cli/commands/compat/providers/codex.d.mts +17 -0
  349. package/dist/src/cli/commands/compat/providers/codex.d.mts.map +1 -0
  350. package/dist/src/cli/commands/compat/providers/codex.mjs +170 -0
  351. package/dist/src/cli/commands/compat/providers/codex.mjs.map +1 -0
  352. package/dist/src/cli/commands/compat/providers/index.cjs +65 -0
  353. package/dist/src/cli/commands/compat/providers/index.cjs.map +1 -0
  354. package/dist/src/cli/commands/compat/providers/index.d.mts +15 -0
  355. package/dist/src/cli/commands/compat/providers/index.d.mts.map +1 -0
  356. package/dist/src/cli/commands/compat/providers/index.mjs +45 -0
  357. package/dist/src/cli/commands/compat/providers/index.mjs.map +1 -0
  358. package/dist/src/cli/commands/compat/providers/process.cjs +172 -0
  359. package/dist/src/cli/commands/compat/providers/process.cjs.map +1 -0
  360. package/dist/src/cli/commands/compat/providers/process.d.mts +33 -0
  361. package/dist/src/cli/commands/compat/providers/process.d.mts.map +1 -0
  362. package/dist/src/cli/commands/compat/providers/process.mjs +159 -0
  363. package/dist/src/cli/commands/compat/providers/process.mjs.map +1 -0
  364. package/dist/src/cli/commands/compat/providers/shared.cjs +76 -0
  365. package/dist/src/cli/commands/compat/providers/shared.cjs.map +1 -0
  366. package/dist/src/cli/commands/compat/providers/shared.d.mts +40 -0
  367. package/dist/src/cli/commands/compat/providers/shared.d.mts.map +1 -0
  368. package/dist/src/cli/commands/compat/providers/shared.mjs +61 -0
  369. package/dist/src/cli/commands/compat/providers/shared.mjs.map +1 -0
  370. package/dist/src/cli/commands/compat/types.d.mts +31 -0
  371. package/dist/src/cli/commands/compat/types.d.mts.map +1 -0
  372. package/dist/src/cli/commands/doctor/help.cjs +19 -0
  373. package/dist/src/cli/commands/doctor/help.cjs.map +1 -0
  374. package/dist/src/cli/commands/doctor/help.d.mts +4 -0
  375. package/dist/src/cli/commands/doctor/help.d.mts.map +1 -0
  376. package/dist/src/cli/commands/doctor/help.mjs +19 -0
  377. package/dist/src/cli/commands/doctor/help.mjs.map +1 -0
  378. package/dist/src/cli/commands/doctor/index.cjs +118 -0
  379. package/dist/src/cli/commands/doctor/index.cjs.map +1 -0
  380. package/dist/src/cli/commands/doctor/index.d.mts +33 -0
  381. package/dist/src/cli/commands/doctor/index.d.mts.map +1 -0
  382. package/dist/src/cli/commands/doctor/index.mjs +113 -0
  383. package/dist/src/cli/commands/doctor/index.mjs.map +1 -0
  384. package/dist/src/cli/commands/emit-mcp/index.cjs +32 -0
  385. package/dist/src/cli/commands/emit-mcp/index.cjs.map +1 -0
  386. package/dist/src/cli/commands/emit-mcp/index.d.mts +19 -0
  387. package/dist/src/cli/commands/emit-mcp/index.d.mts.map +1 -0
  388. package/dist/src/cli/commands/emit-mcp/index.mjs +31 -0
  389. package/dist/src/cli/commands/emit-mcp/index.mjs.map +1 -0
  390. package/dist/src/cli/commands/explain/index.cjs +155 -0
  391. package/dist/src/cli/commands/explain/index.cjs.map +1 -0
  392. package/dist/src/cli/commands/explain/index.d.mts +57 -0
  393. package/dist/src/cli/commands/explain/index.d.mts.map +1 -0
  394. package/dist/src/cli/commands/explain/index.mjs +150 -0
  395. package/dist/src/cli/commands/explain/index.mjs.map +1 -0
  396. package/dist/src/cli/commands/init/constants.cjs +11 -0
  397. package/dist/src/cli/commands/init/constants.cjs.map +1 -0
  398. package/dist/src/cli/commands/init/constants.mjs +11 -0
  399. package/dist/src/cli/commands/init/constants.mjs.map +1 -0
  400. package/dist/src/cli/commands/init/help.cjs +17 -0
  401. package/dist/src/cli/commands/init/help.cjs.map +1 -0
  402. package/dist/src/cli/commands/init/help.d.mts +4 -0
  403. package/dist/src/cli/commands/init/help.d.mts.map +1 -0
  404. package/dist/src/cli/commands/init/help.mjs +17 -0
  405. package/dist/src/cli/commands/init/help.mjs.map +1 -0
  406. package/dist/src/cli/commands/init/index.cjs +67 -0
  407. package/dist/src/cli/commands/init/index.cjs.map +1 -0
  408. package/dist/src/cli/commands/init/index.d.mts +12 -0
  409. package/dist/src/cli/commands/init/index.d.mts.map +1 -0
  410. package/dist/src/cli/commands/init/index.mjs +63 -0
  411. package/dist/src/cli/commands/init/index.mjs.map +1 -0
  412. package/dist/src/cli/commands/init/presenter.cjs +140 -0
  413. package/dist/src/cli/commands/init/presenter.cjs.map +1 -0
  414. package/dist/src/cli/commands/init/presenter.d.mts +8 -0
  415. package/dist/src/cli/commands/init/presenter.d.mts.map +1 -0
  416. package/dist/src/cli/commands/init/presenter.mjs +140 -0
  417. package/dist/src/cli/commands/init/presenter.mjs.map +1 -0
  418. package/dist/src/cli/commands/sync/help.cjs +34 -0
  419. package/dist/src/cli/commands/sync/help.cjs.map +1 -0
  420. package/dist/src/cli/commands/sync/help.d.mts +4 -0
  421. package/dist/src/cli/commands/sync/help.d.mts.map +1 -0
  422. package/dist/src/cli/commands/sync/help.mjs +34 -0
  423. package/dist/src/cli/commands/sync/help.mjs.map +1 -0
  424. package/dist/src/cli/commands/sync/index.cjs +215 -0
  425. package/dist/src/cli/commands/sync/index.cjs.map +1 -0
  426. package/dist/src/cli/commands/sync/index.d.mts +20 -0
  427. package/dist/src/cli/commands/sync/index.d.mts.map +1 -0
  428. package/dist/src/cli/commands/sync/index.mjs +206 -0
  429. package/dist/src/cli/commands/sync/index.mjs.map +1 -0
  430. package/dist/src/cli/commands/sync/presenter.cjs +58 -0
  431. package/dist/src/cli/commands/sync/presenter.cjs.map +1 -0
  432. package/dist/src/cli/commands/sync/presenter.d.mts +16 -0
  433. package/dist/src/cli/commands/sync/presenter.d.mts.map +1 -0
  434. package/dist/src/cli/commands/sync/presenter.mjs +57 -0
  435. package/dist/src/cli/commands/sync/presenter.mjs.map +1 -0
  436. package/dist/src/cli/commands/sync/workflow.cjs +16 -0
  437. package/dist/src/cli/commands/sync/workflow.cjs.map +1 -0
  438. package/dist/src/cli/commands/sync/workflow.mjs +16 -0
  439. package/dist/src/cli/commands/sync/workflow.mjs.map +1 -0
  440. package/dist/src/cli/commands/web/index.cjs +88 -0
  441. package/dist/src/cli/commands/web/index.cjs.map +1 -0
  442. package/dist/src/cli/commands/web/index.mjs +85 -0
  443. package/dist/src/cli/commands/web/index.mjs.map +1 -0
  444. package/dist/src/cli/harnessOptions.cjs +70 -0
  445. package/dist/src/cli/harnessOptions.cjs.map +1 -0
  446. package/dist/src/cli/harnessOptions.d.mts +26 -0
  447. package/dist/src/cli/harnessOptions.d.mts.map +1 -0
  448. package/dist/src/cli/harnessOptions.mjs +66 -0
  449. package/dist/src/cli/harnessOptions.mjs.map +1 -0
  450. package/dist/src/cli/help.cjs +82 -0
  451. package/dist/src/cli/help.cjs.map +1 -0
  452. package/dist/src/cli/help.d.mts +10 -0
  453. package/dist/src/cli/help.d.mts.map +1 -0
  454. package/dist/src/cli/help.mjs +78 -0
  455. package/dist/src/cli/help.mjs.map +1 -0
  456. package/dist/src/cli/matrixOptions.cjs +178 -0
  457. package/dist/src/cli/matrixOptions.cjs.map +1 -0
  458. package/dist/src/cli/matrixOptions.d.mts +90 -0
  459. package/dist/src/cli/matrixOptions.d.mts.map +1 -0
  460. package/dist/src/cli/matrixOptions.mjs +151 -0
  461. package/dist/src/cli/matrixOptions.mjs.map +1 -0
  462. package/dist/src/cli/options.cjs +281 -0
  463. package/dist/src/cli/options.cjs.map +1 -0
  464. package/dist/src/cli/options.d.mts +5 -0
  465. package/dist/src/cli/options.d.mts.map +1 -0
  466. package/dist/src/cli/options.mjs +279 -0
  467. package/dist/src/cli/options.mjs.map +1 -0
  468. package/dist/src/cli/router.cjs +57 -0
  469. package/dist/src/cli/router.cjs.map +1 -0
  470. package/dist/src/cli/router.d.mts +32 -0
  471. package/dist/src/cli/router.d.mts.map +1 -0
  472. package/dist/src/cli/router.mjs +54 -0
  473. package/dist/src/cli/router.mjs.map +1 -0
  474. package/dist/src/cli/server/options.cjs +71 -0
  475. package/dist/src/cli/server/options.cjs.map +1 -0
  476. package/dist/src/cli/server/options.mjs +70 -0
  477. package/dist/src/cli/server/options.mjs.map +1 -0
  478. package/dist/src/cli/server/processGuards.cjs +83 -0
  479. package/dist/src/cli/server/processGuards.cjs.map +1 -0
  480. package/dist/src/cli/server/processGuards.mjs +79 -0
  481. package/dist/src/cli/server/processGuards.mjs.map +1 -0
  482. package/dist/src/cli/server/run.cjs +69 -0
  483. package/dist/src/cli/server/run.cjs.map +1 -0
  484. package/dist/src/cli/server/run.mjs +66 -0
  485. package/dist/src/cli/server/run.mjs.map +1 -0
  486. package/dist/src/composition/harnessState/index.cjs +48 -0
  487. package/dist/src/composition/harnessState/index.cjs.map +1 -0
  488. package/dist/src/composition/harnessState/index.d.mts +19 -0
  489. package/dist/src/composition/harnessState/index.d.mts.map +1 -0
  490. package/dist/src/composition/harnessState/index.mjs +34 -0
  491. package/dist/src/composition/harnessState/index.mjs.map +1 -0
  492. package/dist/src/composition/layerPackageInstaller/index.cjs +651 -0
  493. package/dist/src/composition/layerPackageInstaller/index.cjs.map +1 -0
  494. package/dist/src/composition/layerPackageInstaller/index.d.mts +74 -0
  495. package/dist/src/composition/layerPackageInstaller/index.d.mts.map +1 -0
  496. package/dist/src/composition/layerPackageInstaller/index.mjs +637 -0
  497. package/dist/src/composition/layerPackageInstaller/index.mjs.map +1 -0
  498. package/dist/src/composition/poHomeMigration/index.cjs +234 -0
  499. package/dist/src/composition/poHomeMigration/index.cjs.map +1 -0
  500. package/dist/src/composition/poHomeMigration/index.d.mts +12 -0
  501. package/dist/src/composition/poHomeMigration/index.d.mts.map +1 -0
  502. package/dist/src/composition/poHomeMigration/index.mjs +226 -0
  503. package/dist/src/composition/poHomeMigration/index.mjs.map +1 -0
  504. package/dist/src/composition/projectTrust/index.cjs +51 -0
  505. package/dist/src/composition/projectTrust/index.cjs.map +1 -0
  506. package/dist/src/composition/projectTrust/index.d.mts +22 -0
  507. package/dist/src/composition/projectTrust/index.d.mts.map +1 -0
  508. package/dist/src/composition/projectTrust/index.mjs +48 -0
  509. package/dist/src/composition/projectTrust/index.mjs.map +1 -0
  510. package/dist/src/composition/repository/index.cjs +68 -0
  511. package/dist/src/composition/repository/index.cjs.map +1 -0
  512. package/dist/src/composition/repository/index.d.mts +22 -0
  513. package/dist/src/composition/repository/index.d.mts.map +1 -0
  514. package/dist/src/composition/repository/index.mjs +63 -0
  515. package/dist/src/composition/repository/index.mjs.map +1 -0
  516. package/dist/src/composition/syncPrune/index.cjs +85 -0
  517. package/dist/src/composition/syncPrune/index.cjs.map +1 -0
  518. package/dist/src/composition/syncPrune/index.d.mts +33 -0
  519. package/dist/src/composition/syncPrune/index.d.mts.map +1 -0
  520. package/dist/src/composition/syncPrune/index.mjs +82 -0
  521. package/dist/src/composition/syncPrune/index.mjs.map +1 -0
  522. package/dist/src/composition/syncService/index.cjs +808 -0
  523. package/dist/src/composition/syncService/index.cjs.map +1 -0
  524. package/dist/src/composition/syncService/index.d.mts +65 -0
  525. package/dist/src/composition/syncService/index.d.mts.map +1 -0
  526. package/dist/src/composition/syncService/index.mjs +792 -0
  527. package/dist/src/composition/syncService/index.mjs.map +1 -0
  528. package/dist/src/composition/syncService/localBuilds.cjs +367 -0
  529. package/dist/src/composition/syncService/localBuilds.cjs.map +1 -0
  530. package/dist/src/composition/syncService/localBuilds.mjs +358 -0
  531. package/dist/src/composition/syncService/localBuilds.mjs.map +1 -0
  532. package/dist/src/composition/transitionLayers.cjs +17 -0
  533. package/dist/src/composition/transitionLayers.cjs.map +1 -0
  534. package/dist/src/composition/transitionLayers.d.mts +6 -0
  535. package/dist/src/composition/transitionLayers.d.mts.map +1 -0
  536. package/dist/src/composition/transitionLayers.mjs +16 -0
  537. package/dist/src/composition/transitionLayers.mjs.map +1 -0
  538. package/dist/src/composition/types/harness.d.mts +52 -0
  539. package/dist/src/composition/types/harness.d.mts.map +1 -0
  540. package/dist/src/extensions/setupDiagnostics.cjs +65 -0
  541. package/dist/src/extensions/setupDiagnostics.cjs.map +1 -0
  542. package/dist/src/extensions/setupDiagnostics.mjs +64 -0
  543. package/dist/src/extensions/setupDiagnostics.mjs.map +1 -0
  544. package/dist/utils.cjs +4 -0
  545. package/dist/utils.d.mts +2 -0
  546. package/dist/utils.mjs +2 -0
  547. package/dist/webBuilder.cjs +59 -0
  548. package/dist/webBuilder.d.mts +9 -0
  549. package/dist/webBuilder.mjs +9 -0
  550. package/docs/server/api-export.md +86 -0
  551. package/docs/server/api.md +144 -0
  552. package/docs/server/getting-started.md +114 -0
  553. package/docs/server/index.md +67 -0
  554. package/docs/server/ipc.md +97 -0
  555. package/docs/server/lifecycle.md +108 -0
  556. package/docs/server/security.md +101 -0
  557. package/llms.txt +12 -0
  558. package/package.json +295 -0
  559. package/src/prompts/po-author-extension/SKILL.md +35 -0
  560. package/src/prompts/po-author-extension/references/extension-contract.md +134 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.mjs","names":[],"sources":["../../../../src/builders/server/runtime.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { globalDoomConfigDirectory } from '@agimon-ai/po-config/config';\nimport { filterHookDisabledLayers, loadMajorModesConfig, resolveLayers } from '@agimon-ai/po-config/majorModes';\nimport { resolveProfile } from '@agimon-ai/po-config/profiles';\nimport { readDoomBackgroundWorkService } from '@agimon-ai/po-core/backgroundWork';\nimport { createHeadlessHub, type HeadlessHub } from '@agimon-ai/po-core/headlessHub';\nimport { serveHeadlessServer } from '@agimon-ai/po-core/headlessServer';\nimport type { HeadlessSessionHost, HeadlessSessionHostOptions } from '@agimon-ai/po-core/headlessSessionHost';\nimport { createHeadlessSessionManager } from '@agimon-ai/po-core/headlessSessionManager';\nimport {\n createOpenSessionRegistry,\n createRequestReceipts,\n createWorkspaceRegistry,\n identifyWorkspace,\n listSavedSessionRecords,\n listSavedSessions,\n readSqliteTranscript,\n readWorkspaceMarker,\n writeWorkspaceMarker,\n} from '@agimon-ai/po-core/history';\nimport type { OpenSessionRecord, SavedSessionExecution } from '@agimon-ai/po-core/history';\nimport type {\n DoomHubSessionApiRequest,\n DoomHubSessionCreateRequest,\n DoomHubSessionScope,\n} from '@agimon-ai/po-core/hubChannel';\nimport { loadMcpPlugins, mcpUiResource, type LoadedMcpPlugins } from '@agimon-ai/po-core/mcpFacet';\nimport { createServerExecutionBudget, DOOM_SHARE_FILE_REMOTE_OFF_MESSAGE } from '@agimon-ai/po-core/packageApi';\nimport type { DoomHostMediaArbitration, DoomPeerAgentRegistry } from '@agimon-ai/po-core/packageApi';\nimport { serveSessionApis, type PackageApiServer } from '@agimon-ai/po-core/packageApiServer';\nimport { piAgentDirectory } from '@agimon-ai/po-core/piSettings';\nimport { createRemoteRuntime, type RemoteRuntime } from '@agimon-ai/po-core/remoteRuntime';\nimport type {\n HeadlessSessionCloseOptions,\n HeadlessSessionManager,\n} from '@agimon-ai/po-core/runtimeHeadlessSessionManager';\nimport { createHarnessTelemetry } from '@agimon-ai/po-core/runtimeLogSinkTelemetry';\nimport {\n loadServerFacets,\n selectedServerProviderOverrides,\n type LoadedServerFacets,\n} from '@agimon-ai/po-core/serverFacet';\nimport { createServerTelemetry } from '@agimon-ai/po-core/serverTelemetry';\nimport { createWebCompositions } from '@agimon-ai/po-core/webCompositions';\nimport { readMinorModeCatalog } from '@agimon-ai/po-minor-mode';\nimport WebSocket from 'ws';\n\nimport {\n HARNESS_STATE_KEYS,\n HARNESS_STATE_POINTER,\n loadHarnessState,\n updateHarnessState,\n} from '../../composition/harnessState';\nimport { missingLayerPackageSpecifiers } from '../../composition/layerPackageInstaller';\nimport { findRepositoryRoot } from '../../composition/repository';\nimport { globalWebPluginRoots, readSyncPointer } from '../../composition/syncService';\nimport { createLayerResolvers, resolveExtensionComposition, unsyncedSelectors } from '../cli/extensionAssembler';\nimport { buildHarnessContext } from '../cli/harnessContext';\nimport { rootCompositions } from '../cli/sessionComposition';\nimport { checkoutHookDescriptor, validateHookModules, writeLiveHookModules } from '../hooks';\nimport {\n type GlobalNativeBuildRecord,\n mountNativePluginIds,\n readGlobalNativeBuildRecord,\n readGlobalNativeBuildStatus,\n} from '../native';\nimport {\n compositionPackageRoots,\n type GlobalWebBuildRecord,\n mountWebPluginSlots,\n newestGlobalWebBuildKey,\n readGlobalWebBuildRecord,\n readGlobalWebBuildStatus,\n unslottedWebPackages,\n} from '../web';\nimport { createBackgroundSync, createKeyedPickup, createSyncCheckpoints, syncedBuildKeys } from './backgroundSync';\nimport { createComputerUseBinding } from './computerUseBinding';\nimport { createDefaultWorkspaceFolder } from './defaultWorkspace';\nimport {\n createIdleRestart,\n holdsRestart,\n reopenRecycledSessions,\n RESTART_EXIT_CODE,\n testIdleRestartOverrides,\n writeRecycleFile,\n} from './idleRestart';\nimport { serverFacetCandidates } from './index';\nimport { ensureGlobalLogSink } from './logSink';\nimport { readMcpAppBuild } from './mcpAppBuild';\nimport { mcpPluginCandidates } from './mcpBundle';\nimport { createLiveModuleCache, createPackageReloadCheck, type ScopePackageIdentity } from './packageReloadCheck';\nimport { createPackageUrls } from './packageUrl';\nimport { monitorRuntimeResources } from './runtimeResources';\nimport { publishHeadlessSelectionStatus } from './selectionStatus';\nimport { type PinnedSelectionAxis, resolveSessionIdentity, sessionSelectionArgs } from './sessionArguments';\nimport { withShutdownDeadline } from './shutdown';\nimport type { ServeOptions, ServerRuntimeEnvironment } from './types';\nimport { resolveWebTemplateDecision } from './webTemplateDecision';\nimport { checkoutWorkspaceId } from './workspaceCheckout';\n\nasync function bounded(operation: Promise<unknown>, label: string, notice: (message: string) => void): Promise<void> {\n try {\n await withShutdownDeadline(() => operation, label);\n } catch (error) {\n notice(`${label} failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\nexport async function runServerRuntime(options: ServeOptions, runtime: ServerRuntimeEnvironment): Promise<number> {\n const {\n cwd: baseCwd,\n environment: incomingEnvironment,\n notice,\n resolveHarnessOptions,\n signal,\n onExtensionCheck,\n } = runtime;\n // Keep this selection local to this server and its admitted sessions. The\n // process environment may also serve unrelated hosts and must not be changed.\n const baseEnvironment: NodeJS.ProcessEnv = { ...incomingEnvironment, LOG_SINK_INSTANCE: 'global' };\n const executionBudget = createServerExecutionBudget(baseEnvironment);\n await ensureGlobalLogSink({ cwd: baseCwd, env: baseEnvironment, notice }).catch((error: unknown) =>\n notice(`Global log sink unavailable: ${error instanceof Error ? error.message : String(error)}`),\n );\n const telemetry = createServerTelemetry({ cwd: baseCwd, env: baseEnvironment, warn: notice });\n const homeDirectory = baseEnvironment.HOME ?? os.homedir();\n /** Content-addressed import URLs for every Po package entry this server loads. */\n const packageUrls = createPackageUrls();\n /** URLs whose live import timed out or threw; skipped by every loader until the content changes. */\n const poisonedUrls = new Set<string>();\n /** Imports each content-addressed URL once, so a reload imports only what changed. */\n const importLive = createLiveModuleCache();\n /** The package identities each mounted global and workspace scope last loaded. */\n const reloadCheck = createPackageReloadCheck();\n /** The hook module descriptor from the root's live registry; sources load in place or from snapshots. */\n const liveHookModules = (repoRoot: string) =>\n writeLiveHookModules({\n repoRoot,\n homeDirectory,\n directory: path.join(globalDoomConfigDirectory(homeDirectory), 'server', 'hook-modules'),\n artifactFor: (source) => packageUrls.pathFor(source),\n onNotice: notice,\n });\n const serverDirectory = path.join(piAgentDirectory(baseEnvironment), 'server');\n // This native history has no agent lane and is deliberately outside the session-history catalog.\n const requestReceipts = createRequestReceipts({ directory: path.join(serverDirectory, 'request-receipts-v1') });\n const activeMedia = new Set<() => boolean>();\n const mediaArbitration: DoomHostMediaArbitration = {\n register(busy) {\n activeMedia.add(busy);\n return () => {\n activeMedia.delete(busy);\n };\n },\n available(busy) {\n return activeMedia.has(busy) && [...activeMedia].every((other) => other === busy || !other());\n },\n };\n const activePeerAgents = new Map<string, { fetch(request: Request): Promise<Response>; hubToken: string }>();\n const peerAgents: DoomPeerAgentRegistry = {\n register(sessionId, agent, hubToken) {\n if (activePeerAgents.has(sessionId)) throw new Error(`Voice peer agent '${sessionId}' is already registered.`);\n const entry = { fetch: (request: Request) => agent.fetch(request), hubToken };\n activePeerAgents.set(sessionId, entry);\n return () => {\n if (activePeerAgents.get(sessionId) === entry) activePeerAgents.delete(sessionId);\n };\n },\n get: (sessionId) => activePeerAgents.get(sessionId),\n };\n const workspaces = createWorkspaceRegistry({ directory: serverDirectory, onNotice: notice });\n // Beside the journals it names, because a record pointing at a sessions\n // directory it is not stored next to is a record that can outlive its target.\n const openSessions = createOpenSessionRegistry({\n directory: serverDirectory,\n onNotice: notice,\n });\n let lastBudgetSnapshot = '';\n let nextEventLoopTick = performance.now() + 1_000;\n const eventLoopMonitor = setInterval(() => {\n const now = performance.now();\n const budget = executionBudget.getSnapshot();\n const snapshot = JSON.stringify(budget);\n if (snapshot !== lastBudgetSnapshot) {\n lastBudgetSnapshot = snapshot;\n void telemetry\n .recordEvent('po_server.execution_budget', {\n host_pid: process.pid,\n running_jobs: budget.running,\n queued_jobs: budget.queued,\n limit: budget.limit,\n })\n .catch((error: unknown) => notice(`execution budget telemetry failed: ${String(error)}`));\n }\n const delay = Math.max(0, now - nextEventLoopTick);\n nextEventLoopTick = now + 1_000;\n if (delay >= 100)\n void telemetry\n .recordEvent('po_server.event_loop_delay', { duration_ms: Math.round(delay) })\n .catch((error: unknown) => notice(`event loop telemetry failed: ${String(error)}`));\n }, 1_000);\n eventLoopMonitor.unref();\n const harnessTelemetry = createHarnessTelemetry({\n cwd: baseCwd,\n env: baseEnvironment,\n warn: notice,\n deferSpans: true,\n });\n const baseSessionManager = createHeadlessSessionManager({\n publishSelectionStatus: publishHeadlessSelectionStatus,\n contextGroups: (context) =>\n (readMinorModeCatalog(context)?.list() ?? [])\n .filter(({ state }) => state.activation === 'active')\n .map(({ descriptor }) => ({ id: descriptor.id, label: descriptor.label, kind: 'minor' })),\n });\n type SessionSetup = {\n cleanup: () => Promise<void>;\n bundle: LoadedServerFacets;\n mcpBundle: LoadedMcpPlugins;\n };\n type SessionArtifacts = SessionSetup & { apis: PackageApiServer };\n /** The server's environment rooted at one configuration root, with no harness state of its own. */\n const rootEnvironment = (root: string): NodeJS.ProcessEnv => {\n const environment: NodeJS.ProcessEnv = { ...baseEnvironment, PO_ROOT: root };\n for (const key of [HARNESS_STATE_POINTER, ...Object.values(HARNESS_STATE_KEYS)]) delete environment[key];\n return environment;\n };\n const pendingSessions = new Map<string, SessionSetup>();\n /** The last harness context built to report each repository's MCP projection, kept while it is current. */\n const repositoryContexts = new Map<string, { cleanup(): Promise<void> }>();\n const sessionArtifacts = new Map<string, SessionArtifacts>();\n /** Each host's facet root, where its session services (background work included) live. */\n const sessionServiceRoots = new WeakMap<HeadlessSessionHost, Parameters<HeadlessSessionHost['prepareFacets']>[0]>();\n let mountSessionApis:\n | ((options: HeadlessSessionHostOptions, host: HeadlessSessionHost) => Promise<PackageApiServer>)\n | undefined;\n /**\n * Shutdown runs every session through the same close path a user-initiated\n * close uses, so without this the registry would be emptied by the very event\n * it exists to survive.\n */\n let shuttingDown = false;\n\n const closeManagedSession = async (sessionId: string, options?: HeadlessSessionCloseOptions): Promise<void> => {\n // A released session keeps its record, which is what lists it as dormant.\n if (!shuttingDown && options?.keepDormant !== true) openSessions.remove(sessionId);\n const artifacts = sessionArtifacts.get(sessionId);\n sessionArtifacts.delete(sessionId);\n webCompositions?.remove({ scope: 'session', sessionId });\n webCompositions?.removeNative({ scope: 'session', sessionId });\n const failures: unknown[] = [];\n // The host goes first, as on the create-failure path: it stops the running turn and\n // dispatches session_shutdown while the facets that own those hooks are still installed.\n try {\n await withShutdownDeadline(\n () => baseSessionManager.closeSession(sessionId),\n `Session '${sessionId}' runtime shutdown`,\n );\n } catch (error) {\n failures.push(error);\n }\n try {\n await withShutdownDeadline(() => artifacts?.apis.close(), `Session '${sessionId}' API shutdown`);\n } catch (error) {\n failures.push(error);\n }\n try {\n await withShutdownDeadline(() => artifacts?.cleanup(), `Session '${sessionId}' artifact cleanup`);\n } catch (error) {\n failures.push(error);\n }\n if (failures.length > 0) throw new AggregateError(failures, `Session '${sessionId}' shutdown failed`);\n };\n\n const sessionManager: HeadlessSessionManager = {\n async create(sessionOptions) {\n const setup = pendingSessions.get(sessionOptions.sessionId);\n let host: HeadlessSessionHost;\n try {\n host = await baseSessionManager.create(sessionOptions);\n } catch (error) {\n if (setup !== undefined && pendingSessions.delete(sessionOptions.sessionId))\n await setup.cleanup().catch((cleanupError: unknown) => notice(String(cleanupError)));\n throw error;\n }\n if (setup === undefined || mountSessionApis === undefined) return host;\n try {\n const apis = await mountSessionApis(sessionOptions, host);\n pendingSessions.delete(sessionOptions.sessionId);\n sessionArtifacts.set(sessionOptions.sessionId, { ...setup, apis });\n return host;\n } catch (error) {\n pendingSessions.delete(sessionOptions.sessionId);\n await baseSessionManager\n .closeSession(sessionOptions.sessionId)\n .catch((closeError: unknown) => notice(String(closeError)));\n await setup.cleanup().catch((cleanupError: unknown) => notice(String(cleanupError)));\n throw error;\n }\n },\n get: (sessionId) => baseSessionManager.get(sessionId),\n sessions: () => baseSessionManager.sessions(),\n closeSession: closeManagedSession,\n async close() {\n const ids = baseSessionManager.sessions().map((session) => session.runtime.sessionId);\n const outcomes = await Promise.allSettled(ids.map((id) => closeManagedSession(id)));\n const failures = outcomes\n .filter((outcome): outcome is PromiseRejectedResult => outcome.status === 'rejected')\n .map((outcome) => outcome.reason);\n if (failures.length > 0) throw new AggregateError(failures, 'Headless session shutdown failed');\n },\n };\n\n let requestSessionApi: (\n scope: DoomHubSessionScope,\n request: DoomHubSessionApiRequest,\n ) => Promise<Response> = async () => Response.json({ error: 'Session API unavailable.' }, { status: 404 });\n let openSession: (\n request: DoomHubSessionCreateRequest,\n sessionId?: string,\n groupingWorkspaceId?: string,\n ) => Promise<DoomHubSessionScope> = async () => {\n throw new Error('The cockpit session service is not ready.');\n };\n let admitWorkspace: (\n root: string,\n name?: string,\n ) => Promise<{ id: string; root: string; name?: string; available: boolean }> = async () => {\n throw new Error('Workspace admission is not ready.');\n };\n let remoteRuntime: RemoteRuntime | undefined;\n const computerUse = await createComputerUseBinding(process, {\n isDeviceAuthorized: (id) => remoteRuntime?.remote.isDeviceAuthorized(id) === true,\n stepUpRequired: () => remoteRuntime?.remote.stepUpRequired('computer-use.activate') === true,\n });\n let hub!: HeadlessHub;\n hub = createHeadlessHub({\n manager: sessionManager,\n // Throws for an unknown profile; the hub reports that and shows the session without an avatar.\n resolveProfileIdentity: (root, profile) => {\n const identity = resolveProfile(root, profile, homeDirectory).identity;\n return identity === undefined ? undefined : { displayName: identity.name, icon: identity.icon };\n },\n admitWorkspace: async ({ root, name }) =>\n admitWorkspace(\n root === undefined || root.trim() === '' ? await createDefaultWorkspaceFolder(name ?? '', homeDirectory) : root,\n name,\n ),\n onWorkspaceRemoved: (workspaceId) => {\n workspaces.remove(workspaceId);\n reloadCheck.forget(`workspace:${workspaceId}`);\n webCompositions?.remove({ scope: 'workspace', workspaceId });\n webCompositions?.removeNative({ scope: 'workspace', workspaceId });\n },\n createSession: async (request, placement) => {\n if (placement === undefined) return openSession(request);\n // A workspace package's top-level session must run in a checkout of that same workspace.\n if (checkoutWorkspaceId(workspaces.list(), request.cwd) !== placement.workspaceId)\n throw new Error('The session directory is outside this workspace.');\n return openSession(request, undefined, placement.workspaceId);\n },\n sessionReservations: {\n read(id, parentSessionId) {\n if (!cockpit) throw new Error('Session setup is not ready.');\n return cockpit.sessionReservations.read(id, parentSessionId);\n },\n async prepare(id, parentSessionId, cwd) {\n if (!cockpit) throw new Error('Session setup is not ready.');\n return cockpit.sessionReservations.prepare(id, parentSessionId, cwd);\n },\n async complete(id, parentSessionId) {\n if (!cockpit) throw new Error('Session setup is not ready.');\n return cockpit.sessionReservations.complete(id, parentSessionId);\n },\n },\n onNotice: notice,\n hubToken: () => attachToken,\n requestSessionApi: (scope, request) => requestSessionApi(scope, request),\n ...(computerUse === undefined ? {} : { computerUse }),\n });\n /** Started by the idle restart once the server is serving; until then a restart waits. */\n let requestRestart: (() => void) | undefined;\n const idleRestart = createIdleRestart({\n ...testIdleRestartOverrides(baseEnvironment),\n busy: async () => {\n const hosts = sessionManager.sessions();\n // Running runners (open terminals) and subagents block like a turn: a restart kills them.\n const working = hosts.some((host) => {\n const root = sessionServiceRoots.get(host);\n const service = root === undefined ? undefined : readDoomBackgroundWorkService(root);\n return service !== undefined && holdsRestart(service.snapshot());\n });\n if (working) return true;\n const states = await Promise.all(hosts.map((host) => host.runtime.readState()));\n return states.some((state) => state.isStreaming || state.isCompacting);\n },\n restart: () => requestRestart?.(),\n onError: (error) => notice(`Idle restart check failed: ${error instanceof Error ? error.message : String(error)}`),\n });\n // Any hub event may be the end of a turn, so it re-arms a pending restart's debounce.\n const stopIdleRestartPoke = hub.onEvent(() => idleRestart.poke());\n const stopPersistSessionNames = hub.onEvent((event) => {\n if (event.kind !== 'upsert') return;\n const record = openSessions.list().find((entry) => entry.sessionId === event.session.id);\n if (record === undefined || record.name === event.session.name) return;\n openSessions.add({ ...record, name: event.session.name });\n });\n let harnessContext: Awaited<ReturnType<typeof buildHarnessContext>> | undefined;\n let launchWorkspaceId: string | undefined;\n let cockpit: Awaited<ReturnType<typeof serveHeadlessServer>> | undefined;\n let attachToken: string | undefined;\n let webCompositions: ReturnType<typeof createWebCompositions> | undefined;\n const stopResourceMonitor = monitorRuntimeResources({\n record: (attributes) => telemetry.recordEvent('po_server.resources', attributes),\n counts: () => {\n const budget = executionBudget.getSnapshot();\n return {\n sessions: sessionManager.sessions().length,\n running_jobs: budget.running,\n queued_jobs: budget.queued,\n job_limit: budget.limit,\n };\n },\n warn: notice,\n });\n\n try {\n await telemetry.runInSpan('po_server.startup', {}, async () => {\n const token = fs.readFileSync(options.tokenFile, 'utf8').trim();\n if (!token) throw new Error('The attach token file is empty.');\n attachToken = token;\n\n const resolved = resolveSessionIdentity(options.agentArgs, {\n sessionId: options.sessionId ?? crypto.randomUUID(),\n sessionName: options.sessionName,\n });\n\n const globalRoot = globalDoomConfigDirectory(homeDirectory);\n webCompositions = createWebCompositions(path.join(globalRoot, 'server'), notice);\n /** Assigned once every scope can be checked; a sync that exits sooner is picked up then. */\n let pickUpSync: () => Promise<void> = async () => undefined;\n // Sync is the only producer of artifacts; this server starts it in the background and\n // reads what it prepared. PO_AUTO_SYNC=0 turns that off.\n const backgroundSync = createBackgroundSync({\n environment: baseEnvironment,\n onNotice: notice,\n onExit: () => pickUpSync(),\n });\n const syncCheckpoints = createSyncCheckpoints({\n globalRoot,\n homeDirectory,\n environment: baseEnvironment,\n background: backgroundSync,\n onNotice: notice,\n });\n /**\n * Every composition the root's config can select, one per major mode, resolved live\n * from the root. A package sync has not prepared yet is left out with a diagnostic, so\n * the root opens without it; the server never installs or builds.\n */\n const liveCompositions = (root: string) =>\n rootCompositions({ root, homeDirectory, environment: baseEnvironment, tolerateUnsynced: true });\n /** The root's server facet entries, each with the URL its current package content imports from. */\n const facetEntries = async (root: string) => {\n const entries = [];\n for (const { declaration, module, owners } of serverFacetCandidates(liveCompositions(root)))\n entries.push({\n packageName: declaration.packageName,\n entry: declaration.entry,\n module,\n url: await packageUrls.urlFor(module),\n scopes: declaration.scopes,\n owners,\n required: declaration.required === true,\n });\n return entries;\n };\n /** Every package root the root's config can select, over all its major modes. */\n const scopePackageRoots = (root: string): string[] => compositionPackageRoots(liveCompositions(root));\n /** What the root opened without: packages that do not resolve yet and web plugins with no slot. */\n const unsyncedOf = (root: string): string[] => {\n try {\n const compositions = liveCompositions(root);\n const unslotted =\n webBuild === undefined ? [] : unslottedWebPackages(webBuild, compositionPackageRoots(compositions));\n return [...new Set([...unsyncedSelectors(compositions), ...unslotted])];\n } catch (error) {\n notice(`'${root}' sync state could not be read: ${error instanceof Error ? error.message : String(error)}`);\n return [];\n }\n };\n const workspaceLabel = (root: string, name?: string) => `Workspace '${name ?? path.basename(root)}'`;\n /** A checkpoint: request a background sync when the root changed since the last one, and warn. */\n const syncCheckpoint = (root: string, label: string, request = true) =>\n syncCheckpoints.check({ root, label, unsynced: unsyncedOf(root) }, request);\n let webBuild: GlobalWebBuildRecord | undefined;\n /** Publishes one mount out of the current global build, naming only the plugin slots its root resolves. */\n const publishWebMount = (mount: ScopeMount | { scope: 'session'; sessionId: string }, root: string) =>\n webBuild === undefined\n ? undefined\n : webCompositions?.publish(\n mount,\n webBuild,\n hub.channelTypes(),\n mountWebPluginSlots(webBuild, scopePackageRoots(root)),\n );\n let nativeBuild: GlobalNativeBuildRecord | undefined;\n /** Publishes one mount's native composition out of the current global native build. */\n const publishNativeMount = (mount: ScopeMount | { scope: 'session'; sessionId: string }, root: string) =>\n nativeBuild === undefined\n ? undefined\n : webCompositions?.publishNative(\n mount,\n nativeBuild,\n hub.channelTypes(),\n mountNativePluginIds(nativeBuild, scopePackageRoots(root)),\n );\n const pickUpWebBuild = createKeyedPickup(\n (key) => readGlobalWebBuildRecord(globalRoot, key),\n (build, key) => {\n notice(`Publishing global web build ${key}.`);\n webBuild = build;\n webCompositions?.publishShell(build);\n },\n );\n const pickUpNativeBuild = createKeyedPickup(\n (key) => readGlobalNativeBuildRecord(globalRoot, key),\n (build, key) => {\n notice(`Publishing global native build ${key}.`);\n nativeBuild = build;\n },\n );\n /** The keys these roots derive the way sync does, each only when its build exists. */\n const ownBuildKeys = (): { webKey?: string; nativeKey?: string } => {\n const pluginRoots = globalWebPluginRoots(globalRoot, homeDirectory, baseEnvironment, notice);\n const web = readGlobalWebBuildStatus({ poHome: globalRoot, pluginRoots, environment: baseEnvironment });\n const native = readGlobalNativeBuildStatus({ poHome: globalRoot, pluginRoots });\n return {\n ...(web.status === 'current' ? { webKey: web.key } : {}),\n ...(native.status === 'current' ? { nativeKey: native.key } : {}),\n };\n };\n const currentBuildKeys = () => {\n const pointer = readSyncPointer(globalRoot);\n return syncedBuildKeys({\n pointer,\n ownsPointer: syncCheckpoints.ownsPointer(pointer),\n published: { web: webBuild !== undefined, native: nativeBuild !== undefined },\n ownKeys: ownBuildKeys,\n newestWebKey: () => newestGlobalWebBuildKey(globalRoot),\n });\n };\n /**\n * Read-only: picks up the global web and native builds sync's pointer names, publishing\n * the shell only when a key changed, then republishes every shared mount. Never builds;\n * a missing build leaves the previous one serving. Clients pick a new composition up at\n * their next refreshWebPluginCompositions.\n */\n const refreshWebBuild = (): void => {\n const keys = currentBuildKeys();\n if (pickUpNativeBuild(keys.nativeKey) === 'missing')\n notice(`The global native build ${String(keys.nativeKey)} is missing; run po sync.`);\n if (pickUpWebBuild(keys.webKey) === 'missing')\n notice(`The global web build ${String(keys.webKey)} is missing; run po sync.`);\n const mounts = hub\n .workspaces()\n .filter((workspace) => workspace.available !== false)\n .map((workspace) => ({\n root: workspace.root,\n mount: { scope: 'workspace', workspaceId: workspace.id } as const,\n }));\n for (const publish of [publishNativeMount, publishWebMount]) {\n publish({ scope: 'global' }, globalRoot);\n for (const { root, mount } of mounts) publish(mount, root);\n }\n };\n const defaultSelection = (root: string) => {\n const config = loadMajorModesConfig(root, homeDirectory, baseEnvironment);\n const majorMode = config.defaultMajorMode;\n return { root, majorMode, activeLayers: resolveLayers(config, majorMode) };\n };\n const loadComposition = async (\n root: string,\n scope: 'global' | 'workspace' | 'session',\n selection?: { root: string; majorMode: string; activeLayers: string[] },\n ) => {\n const selected = selection ?? defaultSelection(root);\n return telemetry.runInSpan('po_server.composition_load', { scope }, async () =>\n loadServerFacets(scope, {\n entries: await facetEntries(root),\n majorMode: selected.majorMode,\n activeLayers: selected.activeLayers,\n retainCandidates: scope === 'session',\n onNotice: notice,\n poisoned: poisonedUrls,\n importer: importLive,\n }),\n );\n };\n type ScopeMount = { scope: 'global' } | { scope: 'workspace'; workspaceId: string };\n const scopeKey = (mount: ScopeMount) => (mount.scope === 'global' ? 'global' : `workspace:${mount.workspaceId}`);\n /**\n * What a global or workspace scope loads: one identity per facet entry in that scope.\n * The URL changes with package content; `selection` carries ownership and the root's\n * default mode, so a modes.yaml change that moves a facet in or out remounts too.\n */\n const scopeIdentities = (\n root: string,\n scope: ScopeMount['scope'],\n entries: readonly {\n module: string;\n url: string;\n scopes: readonly string[];\n owners: unknown;\n required?: boolean;\n }[],\n ): ScopePackageIdentity[] => {\n const { majorMode, activeLayers } = defaultSelection(root);\n return entries\n .filter((entry) => entry.scopes.includes(scope))\n .map((entry) => ({\n module: entry.module,\n url: entry.url,\n selection: JSON.stringify([entry.owners, entry.required === true, majorMode, activeLayers]),\n }));\n };\n const scopeChecks = new Map<string, Promise<void>>();\n /**\n * The reload check for one mounted global or workspace scope: recompute its package\n * URLs and, only when they changed, load the new set and swap it in with\n * `replaceFacets`. Unchanged URLs come from the module cache, so only changed packages\n * import. A scope this server has not mounted yet is left to its admission. Checks of\n * one scope run one at a time; a failure restores the previous facets (the hub reports a\n * failed restore) and retries next time.\n *\n * ponytail: no fs.watch. A rebuilt local package takes effect at the next session or\n * admission. Watch the declared entries (see packageUrl's declaredTargets) and call this\n * when workspace routes must update without opening a session.\n */\n const checkScope = (root: string, mount: ScopeMount): Promise<void> => {\n const key = scopeKey(mount);\n const run = (scopeChecks.get(key) ?? Promise.resolve()).then(async () => {\n // A sync that finished since the last check may name new builds without touching facets.\n try {\n refreshWebBuild();\n } catch (error) {\n notice(`Web build check failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n const change = reloadCheck.diff(key, scopeIdentities(root, mount.scope, await facetEntries(root)));\n if (\n change.first ||\n (change.changed.length === 0 && change.reselected.length === 0 && change.removed.length === 0)\n )\n return;\n const bundle = await loadComposition(root, mount.scope);\n await hub.replaceFacets(mount, bundle.facets);\n reloadCheck.commit(key, scopeIdentities(root, mount.scope, bundle.entries));\n idleRestart.supersede(change.superseded);\n publishWebMount(mount, root);\n publishNativeMount(mount, root);\n notice(\n `Reloaded ${mount.scope === 'global' ? 'global' : `workspace '${mount.workspaceId}'`} facets (${String(change.changed.length)} changed, ${String(change.removed.length)} removed).`,\n );\n });\n const settled = run.catch((error: unknown) =>\n notice(\n `Extension check of ${key} failed and retries at the next check: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n scopeChecks.set(key, settled);\n void settled.then(() => {\n if (scopeChecks.get(key) === settled) scopeChecks.delete(key);\n });\n return settled;\n };\n const loadSessionMcp = async (\n root: string,\n selection: { majorMode: string; activeLayers: readonly string[] },\n ): Promise<LoadedMcpPlugins> => {\n return telemetry.runInSpan('po_server.mcp_bundle_load', {}, async () => {\n const entries = [];\n const candidates = mcpPluginCandidates(liveCompositions(root));\n for (const { declaration, module, owners } of candidates)\n entries.push({\n packageName: declaration.packageName,\n ...(declaration.ui === undefined ? {} : { widgets: declaration.ui.widgets }),\n entry: declaration.entry,\n module,\n url: await packageUrls.urlFor(module),\n owners,\n });\n let app: ReturnType<typeof readMcpAppBuild>;\n try {\n app = readMcpAppBuild({ poHome: globalRoot, candidates });\n } catch (error) {\n notice(`The MCP app build could not be read: ${error instanceof Error ? error.message : String(error)}`);\n }\n if (app !== undefined && app.build === undefined) {\n notice(`MCP app build ${app.key} is not synced yet; this session runs without MCP widgets.`);\n syncCheckpoints.requestMissing(`mcp-app:${app.key}`, 'the MCP app build is missing');\n }\n const built = app?.build;\n return loadMcpPlugins({\n entries,\n ...(built === undefined ? {} : { uiResource: mcpUiResource(built.html, built.sha256) }),\n majorMode: selection.majorMode,\n activeLayers: selection.activeLayers,\n retainCandidates: true,\n onNotice: notice,\n poisoned: poisonedUrls,\n importer: importLive,\n });\n });\n };\n const sharedApiContext = {\n homeDirectory,\n environment: baseEnvironment,\n hubToken: token,\n sessionService: hub.sessionService,\n mediaArbitration,\n executionBudget,\n peerAgents,\n directEvents: hub.directEvents,\n requestApi: (mount: Parameters<HeadlessHub['requestApi']>[0], basePath: string, request: Request) =>\n hub.requestApi(mount, basePath, request),\n repositories: () =>\n hub.workspaces().map((workspace) => ({\n id: workspace.id,\n path: workspace.root,\n name: workspace.root.split('/').at(-1) ?? workspace.id,\n active: hub.snapshot().some((session) => session.workspaceId === workspace.id),\n })),\n resolveRepository: (id: string) => hub.workspaces().find((workspace) => workspace.id === id)?.root,\n /**\n * Package readiness and the MCP projection, resolved live from the repository. The\n * context stays until the next read replaces it: the projection names its staged files.\n */\n readRepositorySync: async (id: string) => {\n const root = hub.workspaces().find((workspace) => workspace.id === id)?.root;\n if (!root) return undefined;\n const environment = rootEnvironment(root);\n const config = loadMajorModesConfig(root, homeDirectory, environment);\n const missing = missingLayerPackageSpecifiers(\n config,\n Object.keys(config.layers),\n createLayerResolvers(root, environment),\n );\n const context = await buildHarnessContext(\n resolveHarnessOptions({ args: ['--cwd', root], cwd: root, environment }),\n );\n const previous = repositoryContexts.get(root);\n repositoryContexts.set(root, context);\n await previous?.cleanup().catch((error: unknown) => notice(String(error)));\n const status = syncCheckpoint(\n root,\n workspaceLabel(root, hub.workspaces().find((workspace) => workspace.id === id)?.name),\n false,\n );\n return {\n fresh: missing.length === 0 && status.reasons.length === 0,\n reasons: [\n ...missing.map((specifier) => `configured package is not installed: ${specifier}`),\n ...status.reasons,\n ],\n syncing: status.syncing,\n mcpProjection: context.resources.mcpProjection,\n };\n },\n onNotice: notice,\n };\n fs.mkdirSync(globalRoot, { recursive: true, mode: 0o700 });\n const globalBundle = await loadComposition(globalRoot, 'global');\n remoteRuntime = createRemoteRuntime({\n homeDirectory,\n registrationToken: token,\n onDeviceDropped: (id) => computerUse?.revokeDevice?.(id),\n reservedPorts: () => [options.webPort],\n bundleTrust: () => webCompositions?.shellTrust(),\n attestHost: (fields) => webCompositions?.attestHost(fields),\n onNotice: notice,\n forward: async (request) => {\n if (!cockpit || !attachToken)\n return Response.json({ error: 'The headless server is not ready.' }, { status: 503 });\n const from = new URL(request.url);\n const headers = new Headers(request.headers);\n headers.set('x-po-token', attachToken);\n return fetch(\n new URL(`${from.pathname}${from.search}`, cockpit.url),\n new Request(request, { headers, redirect: 'manual' }),\n );\n },\n connectProtocol: (pathname, deviceId) => {\n if (!cockpit || !attachToken) throw new Error('The headless protocol listener is not ready.');\n const url = new URL(pathname, cockpit.url);\n url.protocol = 'ws:';\n return new WebSocket(url, {\n headers: {\n 'x-po-token': attachToken,\n ...(deviceId === undefined\n ? {}\n : {\n 'x-po-api-caller-locality': 'remote',\n 'x-po-api-caller-device-id': deviceId,\n 'x-po-api-caller-step-up': 'not-required',\n }),\n },\n });\n },\n });\n await hub.mountFacets(globalBundle.facets, {\n ...sharedApiContext,\n scope: 'global',\n requestReceipts: requestReceipts.receipts,\n remoteControl: { fetch: (request: Request) => remoteRuntime!.fetchLocal(request) },\n });\n reloadCheck.commit('global', scopeIdentities(globalRoot, 'global', globalBundle.entries));\n refreshWebBuild();\n syncCheckpoint(globalRoot, 'The global scope');\n // Server start covers app launch and Po updates: sync exits at once when nothing changed.\n if (!backgroundSync.syncing) backgroundSync.request('server start');\n const admissions = new Map<string, Promise<{ id: string; root: string; name?: string; available: boolean }>>();\n // A member checkout is any checkout other than its workspace root, such as a worktree.\n const isMemberCheckout = (from: string, workspace: { root: string }): boolean =>\n fs.realpathSync(findRepositoryRoot(from)) !== workspace.root;\n admitWorkspace = async (from, requestedName) => {\n const checkoutRoot = fs.realpathSync(findRepositoryRoot(from));\n // Ids are persisted, never re-derived from the path: a checkout of an admitted repository\n // joins its workspace, and a repository that moved keeps its id and sessions.\n const { id, root, moved } = identifyWorkspace({\n records: workspaces.list(),\n checkoutRoot,\n marker: readWorkspaceMarker(checkoutRoot),\n });\n const record = workspaces.list().find((workspace) => workspace.id === id);\n // A name given now replaces the stored one; readmitting without a name keeps it.\n const name = requestedName?.trim() || record?.name;\n const named = name === undefined ? {} : { name };\n const renamed = record !== undefined && name !== record.name;\n const existing = hub.workspaces().find((workspace) => workspace.id === id);\n if (existing !== undefined && existing.available !== false && existing.root === root) {\n // Readmission is a reload checkpoint: a rebuilt or added package mounts now.\n await checkScope(root, { scope: 'workspace', workspaceId: id });\n syncCheckpoint(root, workspaceLabel(root, name));\n if (renamed) {\n workspaces.add({ id, root, ...named });\n hub.registerWorkspace({ ...existing, ...named, available: true });\n }\n return { ...existing, ...named, available: true };\n }\n const pending = admissions.get(id);\n if (pending) return pending;\n const wasRemembered = record !== undefined;\n if (!wasRemembered || moved || renamed) workspaces.add({ id, root, ...named });\n if (moved) notice(`Workspace '${id}' moved to '${root}'.`);\n hub.registerWorkspace({ id, root, ...named, available: false });\n const admission = (async () => {\n // Admission only reads what sync prepared; a package it has not prepared yet is left\n // out with a warning and a background sync, and mounts when that sync finishes.\n const bundle = await loadComposition(root, 'workspace');\n await hub.mountFacets(bundle.facets, {\n ...sharedApiContext,\n scope: 'workspace',\n workspaceId: id,\n workspaceRoot: root,\n cwd: root,\n resolveRepository: (requestedId) => (requestedId === id ? root : undefined),\n });\n reloadCheck.commit(`workspace:${id}`, scopeIdentities(root, 'workspace', bundle.entries));\n // A missing web build leaves the workspace usable; the next checkpoint picks one up.\n try {\n refreshWebBuild();\n publishWebMount({ scope: 'workspace', workspaceId: id }, root);\n publishNativeMount({ scope: 'workspace', workspaceId: id }, root);\n } catch (error) {\n notice(\n `Workspace '${id}' web build check failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n syncCheckpoint(root, workspaceLabel(root, name));\n try {\n if (readWorkspaceMarker(root) === undefined) writeWorkspaceMarker(root, id);\n } catch (error) {\n notice(\n `Workspace '${root}' id could not be recorded in its git data: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n return { id, root, ...named, available: true };\n })();\n admissions.set(id, admission);\n try {\n return await admission;\n } catch (error) {\n if (!wasRemembered) {\n await hub.removeWorkspace(id);\n workspaces.remove(id);\n }\n throw error;\n } finally {\n admissions.delete(id);\n }\n };\n for (const record of openSessions.list()) {\n if (workspaces.list().some((workspace) => workspace.id === record.workspaceId)) continue;\n try {\n const candidate = record.groupingRoot ?? record.cwd;\n const root = fs.realpathSync(findRepositoryRoot(candidate));\n // The recorded id is kept as is. It may be a legacy path hash, and journals, open-session\n // records and MCP audiences all refer to it.\n if (\n (record.groupingRoot === undefined || root === candidate) &&\n !workspaces.list().some((workspace) => workspace.root === root)\n )\n workspaces.add({ id: record.workspaceId, root });\n else\n notice(\n `Session '${record.sessionId}' no longer resolves to its recorded workspace; skipping registration.`,\n );\n } catch (error) {\n notice(\n `Session '${record.sessionId}' workspace could not be registered: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n for (const workspace of workspaces.list()) {\n hub.registerWorkspace({ ...workspace, available: false });\n try {\n const root = fs.realpathSync(findRepositoryRoot(workspace.root));\n if (root !== workspace.root) {\n notice(\n `Workspace '${workspace.root}' no longer resolves to its recorded identity; leaving it unavailable.`,\n );\n continue;\n }\n await admitWorkspace(workspace.root);\n } catch (error) {\n notice(\n `Workspace '${workspace.root}' could not be restored: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n const sessionDescriptors = new WeakMap<\n Awaited<ReturnType<typeof buildHarnessContext>>,\n Promise<{ file: string } | undefined>\n >();\n const sessionHookModules = (\n context: Awaited<ReturnType<typeof buildHarnessContext>>,\n sourceRoot: string,\n ): Promise<{ file: string } | undefined> => {\n let descriptor = sessionDescriptors.get(context);\n if (descriptor === undefined) {\n descriptor = context.options.hooks\n ? liveHookModules(sourceRoot).then((admitted) =>\n checkoutHookDescriptor(\n admitted,\n sourceRoot,\n context.options.repoRoot,\n context.resources.temporaryDirectory,\n ),\n )\n : Promise.resolve(undefined);\n sessionDescriptors.set(context, descriptor);\n }\n return descriptor;\n };\n\n const sessionHostOptions = (\n context: Awaited<ReturnType<typeof buildHarnessContext>>,\n bundle: LoadedServerFacets,\n mcpBundle: LoadedMcpPlugins,\n identity: {\n sessionId: string;\n sessionName: string;\n parentSessionId?: string;\n sessionProvenance?: string;\n },\n workspace: { id: string; root: string },\n explicit: {\n pinned: readonly PinnedSelectionAxis[];\n minorModes?: readonly string[];\n allowedTools?: readonly string[];\n initialFastMode?: boolean;\n initialAgentLocked?: boolean;\n } = { pinned: [] },\n ): HeadlessSessionHostOptions => {\n const policyOptions = context.options;\n const sessionSelection = {\n root: policyOptions.repoRoot,\n majorMode: policyOptions.majorMode,\n activeLayers: context.selectedLayers,\n domains: policyOptions.domains,\n profile: context.profile,\n state: { 'minor-mode': [...(explicit.minorModes ?? [])] },\n };\n // Composed from this session's own root, environment and selection, never from the\n // process, and without the bootstrap: no PO_COMPOSED, no composition claim.\n const sessionEnvironment = context.environment;\n // The prompt-cache namespace keys on this, so publish it before the host reads the state.\n updateHarnessState(\n {\n compositionFingerprint: resolveExtensionComposition({\n majorMode: policyOptions.majorMode,\n layers: [...context.selectedLayers],\n majorModesConfig: loadMajorModesConfig(policyOptions.repoRoot, homeDirectory, sessionEnvironment),\n resolvers: createLayerResolvers(policyOptions.repoRoot, sessionEnvironment),\n tolerateUnsynced: true,\n }).fingerprint,\n },\n sessionEnvironment,\n );\n return {\n cwd: policyOptions.cwd,\n repoRoot: policyOptions.repoRoot,\n sessionId: identity.sessionId,\n workspaceId: workspace.id,\n groupingRoot: workspace.root,\n sessionName: identity.sessionName,\n ...(explicit.initialFastMode === undefined ? {} : { initialFastMode: explicit.initialFastMode }),\n ...(explicit.initialAgentLocked === undefined ? {} : { initialAgentLocked: explicit.initialAgentLocked }),\n webComposition: publishWebMount({ scope: 'session', sessionId: identity.sessionId }, workspace.root),\n nativeComposition: publishNativeMount({ scope: 'session', sessionId: identity.sessionId }, workspace.root),\n ...(identity.parentSessionId === undefined ? {} : { parentSessionId: identity.parentSessionId }),\n ...(identity.sessionProvenance === undefined ? {} : { sessionProvenance: identity.sessionProvenance }),\n agentArgs: policyOptions.piArgs,\n environment: Object.freeze({ ...context.environment }),\n selection: sessionSelection,\n ...(explicit.allowedTools === undefined ? {} : { allowedTools: explicit.allowedTools }),\n selectionOverrides: (['majorMode', 'domains', 'profile'] as const).filter((axis) => {\n if (explicit.pinned.includes(axis)) return true;\n const flag = axis === 'majorMode' ? '--major-mode' : `--${axis}`;\n return (\n identity.sessionId === resolved.identity.sessionId &&\n resolved.agentArgs.some((arg) => arg === flag || arg.startsWith(`${flag}=`))\n );\n }),\n inheritedSelection: () => {\n const environment = { ...baseEnvironment };\n for (const key of [HARNESS_STATE_POINTER, ...Object.values(HARNESS_STATE_KEYS)]) delete environment[key];\n const defaults = resolveHarnessOptions({\n args: ['--cwd', policyOptions.cwd],\n cwd: policyOptions.cwd,\n environment,\n ...(policyOptions.configRoot === undefined ? {} : { configRoot: policyOptions.configRoot }),\n });\n return { majorMode: defaults.majorMode, domains: defaults.domains, profile: defaults.profile };\n },\n candidates: bundle.entries,\n providerOverrides: () => selectedServerProviderOverrides(bundle.facets, sessionEnvironment),\n requiredServerPackages: async () => {\n const harness = loadHarnessState(sessionEnvironment).state;\n if (!harness.hooks) return [];\n const required = await validateHookModules({\n repoRoot: policyOptions.repoRoot,\n configRoot: policyOptions.configRoot,\n homeDirectory,\n hookGroups: harness.hookGroups,\n descriptor: harness.hookModules,\n isSubagent: Boolean(sessionEnvironment.PI_SUBAGENT_CHILD),\n });\n return required ? ['@agimon-ai/po-hook'] : [];\n },\n mcpPlugins: mcpBundle.plugins,\n resolveSelection: (requested) => {\n const config = loadMajorModesConfig(\n policyOptions.configRoot ?? policyOptions.repoRoot,\n policyOptions.homeDirectory,\n policyOptions.environment ?? baseEnvironment,\n );\n return {\n ...requested,\n activeLayers: filterHookDisabledLayers(\n config,\n resolveLayers(config, requested.majorMode),\n policyOptions.hooks,\n ),\n };\n },\n telemetry,\n onNotice: notice,\n };\n };\n\n mountSessionApis = (sessionOptions, host) =>\n serveSessionApis({\n sessionId: sessionOptions.sessionId,\n cwd: sessionOptions.cwd,\n environment: sessionOptions.environment,\n directEvents: hub.directEvents,\n requestApi: (mount, basePath, request) => hub.requestApi(mount, basePath, request),\n publishActivity: (activity) => hub.setSessionActivity?.(sessionOptions.sessionId, activity),\n // Read per call: shares follow the remote runtime's current tunnel.\n shareFile: (filePath, label) =>\n remoteRuntime === undefined\n ? Promise.reject(new Error(DOOM_SHARE_FILE_REMOTE_OFF_MESSAGE))\n : remoteRuntime.fileShares.mint({\n sessionId: sessionOptions.sessionId,\n cwd: sessionOptions.cwd,\n path: filePath,\n label,\n }),\n ...(computerUse === undefined\n ? {}\n : {\n computerUse: {\n get available() {\n return computerUse.available;\n },\n get enabled() {\n return computerUse.enabled === true;\n },\n authorize: (headers: Headers) =>\n computerUse.authorizeSession?.(sessionOptions.sessionId, headers) === true ||\n computerUse.authorize?.(headers) === true,\n authorizeRecording: (headers: Headers) =>\n computerUse.authorizeRecording?.(sessionOptions.sessionId, headers) === true,\n authorizeActivation: (headers: Headers) => computerUse.authorizeActivation?.(headers) === true,\n claim: (headers?: Headers) => computerUse.claimSession?.(sessionOptions.sessionId, headers),\n fetchRecording: (artifactId: string, range: string) =>\n computerUse.readRecording?.(\n { sessionId: sessionOptions.sessionId, cwd: sessionOptions.cwd },\n artifactId,\n range,\n ) ?? Promise.resolve(Response.json({ error: 'Not found.' }, { status: 404 })),\n subscribe: (listener: () => void) =>\n computerUse.subscribe?.(listener, sessionOptions.sessionId) ?? (() => undefined),\n },\n }),\n hubToken: token,\n sessionService: hub.sessionService,\n mediaArbitration,\n executionBudget,\n peerAgents,\n pluginRegistry: hub.pluginRegistry,\n apis: [],\n facets: pendingSessions.get(sessionOptions.sessionId)?.bundle.facets ?? [],\n workspaceId: sessionOptions.workspaceId,\n // The checkout, which MCP authorizes against; sessionContext carries both roots.\n workspaceRoot: sessionOptions.repoRoot,\n ...(host.sessionContext === undefined ? {} : { sessionContext: host.sessionContext }),\n homeDirectory,\n mountChannel: (channel) => {\n const dispose = hub.registerChannel(channel, { scope: 'session', sessionId: sessionOptions.sessionId });\n return { mounted: true, dispose };\n },\n prepareFacets: (root) => {\n sessionServiceRoots.set(host, root);\n host.prepareFacets(root);\n },\n activateFacets: host.activateFacets,\n canDispatch: host.canDispatch,\n telemetry,\n onNotice: notice,\n });\n\n requestSessionApi = async (scope, request) => {\n const session = hub.session(scope.sessionId);\n const artifacts = sessionArtifacts.get(scope.sessionId);\n if (session === undefined || session.cwd !== scope.cwd || artifacts === undefined)\n return Response.json({ error: 'Session not found.' }, { status: 404 });\n if (!/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/u.test(request.basePath))\n return Response.json({ error: 'Invalid session API base path.' }, { status: 400 });\n if (!request.path.startsWith('/') || request.path.startsWith('//') || request.path.includes('#'))\n return Response.json({ error: 'Invalid session API path.' }, { status: 400 });\n const body = request.body === null || request.body === undefined ? undefined : request.body;\n return artifacts.apis.request(\n new Request(`http://po.local/api/plugins/${request.basePath}${request.path}`, {\n method: request.method,\n headers: request.headers,\n ...(body === undefined ? {} : { body }),\n ...(request.signal === undefined ? {} : { signal: request.signal }),\n }),\n );\n };\n\n if (!options.noSession) {\n const initialOptions = resolveHarnessOptions({\n args: resolved.agentArgs,\n cwd: baseCwd,\n environment: baseEnvironment,\n });\n const initialWorkspace = await admitWorkspace(initialOptions.repoRoot);\n launchWorkspaceId = initialWorkspace.id;\n harnessContext = await buildHarnessContext(\n resolveHarnessOptions({ args: resolved.agentArgs, cwd: baseCwd, environment: baseEnvironment }),\n harnessTelemetry,\n );\n const activeHarnessContext = harnessContext;\n try {\n const hookModules = await sessionHookModules(harnessContext, initialWorkspace.root);\n updateHarnessState({ hookModules }, harnessContext.environment);\n if (harnessContext.options.hooks)\n await validateHookModules({\n repoRoot: harnessContext.options.repoRoot,\n configRoot: initialWorkspace.root,\n homeDirectory,\n hookGroups: harnessContext.hookGroups,\n descriptor: hookModules,\n isSubagent: Boolean(baseEnvironment.PI_SUBAGENT_CHILD),\n });\n const initialBundle = await loadComposition(harnessContext.options.repoRoot, 'session', {\n root: harnessContext.options.repoRoot,\n majorMode: harnessContext.options.majorMode,\n activeLayers: harnessContext.selectedLayers,\n });\n const initialMcpBundle = await loadSessionMcp(harnessContext.options.repoRoot, {\n majorMode: harnessContext.options.majorMode,\n activeLayers: harnessContext.selectedLayers,\n });\n pendingSessions.set(resolved.identity.sessionId, {\n cleanup: () => activeHarnessContext.cleanup(),\n bundle: initialBundle,\n mcpBundle: initialMcpBundle,\n });\n await hub.create(\n sessionHostOptions(harnessContext, initialBundle, initialMcpBundle, resolved.identity, initialWorkspace),\n );\n } catch (error) {\n pendingSessions.delete(resolved.identity.sessionId);\n await activeHarnessContext.cleanup().catch((cleanupError: unknown) => notice(String(cleanupError)));\n throw error;\n }\n await bounded(harnessTelemetry.flush(), 'initial composition telemetry flush', notice);\n }\n\n const reservedOpens = new Map<string, Promise<DoomHubSessionScope>>();\n openSession = async (request, sessionId, groupingWorkspaceId) => {\n request.signal?.throwIfAborted();\n if (request.reservationId !== undefined) {\n if (!request.parentSessionId || !cockpit) throw new Error('A reserved session requires its owning parent.');\n const prepared = await cockpit.sessionReservations.prepare(\n request.reservationId,\n request.parentSessionId,\n request.cwd,\n );\n if (sessionId !== undefined && sessionId !== prepared.sessionId)\n throw new Error('Reserved session identity cannot change.');\n sessionId = prepared.sessionId;\n const existing = hub.session(sessionId);\n if (existing) {\n if (existing.cwd !== prepared.cwd || existing.parentSessionId !== request.parentSessionId)\n throw new Error('Reserved session target does not match.');\n return { sessionId, cwd: existing.cwd, workspaceId: existing.workspaceId };\n }\n if (openSessions.list().some((record) => record.sessionId === sessionId))\n throw new Error('Resume the recorded session instead of recreating it.');\n const pending = reservedOpens.get(sessionId);\n if (pending) return pending;\n request = { ...request, cwd: prepared.cwd };\n }\n const identity = {\n sessionId: sessionId ?? crypto.randomUUID(),\n sessionName: request.name,\n parentSessionId: request.parentSessionId,\n sessionProvenance: request.sessionProvenance,\n };\n // Membership follows the parent link, whatever the session is called or wherever its\n // checkout lives. Without a known parent, the checkout's own identity decides.\n const inheritedWorkspaceId =\n groupingWorkspaceId ??\n (request.parentSessionId\n ? (hub.session(request.parentSessionId)?.workspaceId ??\n openSessions.list().find((record) => record.sessionId === request.parentSessionId)?.workspaceId)\n : undefined);\n const explicit = sessionSelectionArgs(request);\n const start = (async (): Promise<DoomHubSessionScope> => {\n // Snapshot only for creation. Explicit-ID resumes retain their own durable Fast state.\n const parent =\n request.parentSessionId !== undefined && (sessionId === undefined || request.reservationId !== undefined)\n ? sessionManager.get(request.parentSessionId)\n : undefined;\n let initialFastMode: boolean | undefined;\n if (parent !== undefined) {\n const state = await parent.runtime.readState();\n if (typeof state.fastMode !== 'boolean') throw new Error('Parent Fast mode must be a boolean.');\n initialFastMode = state.fastMode;\n }\n const childIdentity = resolveSessionIdentity([], identity);\n if (sessionId !== undefined && request.reservationId === undefined)\n childIdentity.agentArgs.push(\n '--session',\n path.join(serverDirectory, 'sessions', 'durable-v1', `${childIdentity.identity.sessionId}.sqlite`),\n );\n const childEnvironment = { ...baseEnvironment, ...request.environment };\n for (const key of [HARNESS_STATE_POINTER, ...Object.values(HARNESS_STATE_KEYS)]) delete childEnvironment[key];\n // The workspace is settled first: a member checkout reads its workspace's configuration.\n const workspace =\n inheritedWorkspaceId === undefined\n ? await admitWorkspace(request.cwd)\n : hub\n .workspaces()\n .find((candidate) => candidate.id === inheritedWorkspaceId && candidate.available !== false);\n if (workspace === undefined) throw new Error('The session workspace is unavailable.');\n // Session creation is a reload checkpoint for the shared scopes. The session's own\n // facets, MCP plugins and Pi factories load below from current URLs; running\n // sessions keep the set they were created with until restarted.\n await checkScope(globalRoot, { scope: 'global' });\n syncCheckpoint(globalRoot, 'The global scope');\n if (inheritedWorkspaceId !== undefined) {\n // Without an inherited workspace, admitWorkspace above already ran this checkpoint.\n await checkScope(workspace.root, { scope: 'workspace', workspaceId: workspace.id });\n syncCheckpoint(workspace.root, workspaceLabel(workspace.root, workspace.name));\n }\n // A member checkout composes from its workspace's configuration.\n const member = isMemberCheckout(request.cwd, workspace);\n const childContext = await buildHarnessContext(\n resolveHarnessOptions({\n args: ['--cwd', request.cwd, ...childIdentity.agentArgs, ...explicit.args],\n cwd: request.cwd,\n environment: childEnvironment,\n ...(member ? { configRoot: workspace.root } : {}),\n }),\n harnessTelemetry,\n );\n try {\n const hookModules = await sessionHookModules(childContext, workspace.root);\n updateHarnessState({ hookModules }, childContext.environment);\n if (childContext.options.hooks)\n await validateHookModules({\n repoRoot: childContext.options.repoRoot,\n configRoot: workspace.root,\n homeDirectory,\n hookGroups: childContext.hookGroups,\n descriptor: hookModules,\n isSubagent: Boolean(childEnvironment.PI_SUBAGENT_CHILD),\n });\n const bundle = await loadComposition(childContext.options.repoRoot, 'session', {\n root: childContext.options.repoRoot,\n majorMode: childContext.options.majorMode,\n activeLayers: childContext.selectedLayers,\n });\n const mcpBundle = await loadSessionMcp(childContext.options.repoRoot, {\n majorMode: childContext.options.majorMode,\n activeLayers: childContext.selectedLayers,\n });\n request.signal?.throwIfAborted();\n pendingSessions.set(identity.sessionId, {\n cleanup: () => childContext.cleanup(),\n bundle,\n mcpBundle,\n });\n const created = await hub.create(\n sessionHostOptions(childContext, bundle, mcpBundle, identity, workspace, {\n pinned: explicit.pinned,\n ...(initialFastMode === undefined ? {} : { initialFastMode }),\n ...(request.reservationId === undefined ? {} : { initialAgentLocked: true }),\n ...(request.selection?.minorModes === undefined ? {} : { minorModes: request.selection.minorModes }),\n ...(request.tools === undefined ? {} : { allowedTools: request.tools }),\n }),\n );\n request.signal?.throwIfAborted();\n if (created.workspaceId !== undefined) {\n const saved = openSessions.add({\n sessionId: created.id,\n workspaceId: created.workspaceId,\n cwd: created.cwd,\n repoRoot: childContext.options.repoRoot,\n groupingRoot: workspace.root,\n name: created.name,\n createdAt: created.createdAt,\n ...(created.parentSessionId === undefined ? {} : { parentSessionId: created.parentSessionId }),\n ...(created.sessionProvenance === undefined ? {} : { sessionProvenance: created.sessionProvenance }),\n });\n if (saved === false) throw new Error('The new session could not be durably recorded.');\n }\n return { sessionId: identity.sessionId, cwd: childContext.options.cwd, workspaceId: created.workspaceId };\n } catch (error) {\n if (hub.session(identity.sessionId)) await hub.closeSession(identity.sessionId);\n else {\n pendingSessions.delete(identity.sessionId);\n await childContext.cleanup().catch((cleanupError: unknown) => notice(String(cleanupError)));\n }\n throw error;\n }\n })();\n if (request.reservationId !== undefined) reservedOpens.set(identity.sessionId, start);\n try {\n return await start;\n } finally {\n if (reservedOpens.get(identity.sessionId) === start) reservedOpens.delete(identity.sessionId);\n }\n };\n // The checkpoint for package installs and removals (upm add/remove), which change\n // URLs outside any session or admission.\n const checkAllScopes = async (): Promise<void> => {\n await checkScope(globalRoot, { scope: 'global' });\n for (const workspace of hub.workspaces())\n if (workspace.available !== false)\n await checkScope(workspace.root, { scope: 'workspace', workspaceId: workspace.id });\n };\n onExtensionCheck?.(checkAllScopes);\n /**\n * A finished background sync goes through the same live reload: the read-only refresh\n * republishes a changed build, and each scope re-imports only packages whose URLs moved.\n * Session facets and the MCP app switch at the next session. The warnings are re-read\n * without requesting another sync, so a sync that could not fix a root never loops.\n */\n pickUpSync = async () => {\n await checkAllScopes();\n syncCheckpoint(globalRoot, 'The global scope', false);\n for (const workspace of hub.workspaces())\n if (workspace.available !== false)\n syncCheckpoint(workspace.root, workspaceLabel(workspace.root, workspace.name), false);\n };\n });\n\n const workspaceResumes = new Map<string, Promise<string>>();\n const savedHistory = async (workspaceId: string) => {\n const root = hub\n .workspaces()\n .find((workspace) => workspace.id === workspaceId && workspace.available !== false)?.root;\n if (!root) throw new Error('Workspace not found.');\n return listSavedSessionRecords(\n path.join(serverDirectory, 'sessions'),\n root,\n new Set(hub.snapshot().map((active) => active.id)),\n workspaceId,\n );\n };\n const validateExecution = (target: SavedSessionExecution, workspaceId: string): void => {\n const root = hub\n .workspaces()\n .find((workspace) => workspace.id === workspaceId && workspace.available !== false)?.root;\n if (!root || target.groupingRoot !== root || (target.workspaceId && target.workspaceId !== workspaceId))\n throw new Error('Saved session does not belong to this workspace.');\n if (fs.realpathSync(findRepositoryRoot(target.cwd)) !== target.repoRoot)\n throw new Error('Saved session checkout is unavailable.');\n };\n const reviveRecord = async (record: OpenSessionRecord): Promise<void> => {\n // A failed wake may be transient, for example while another server still\n // owns the journal. Keep the record so the user can retry after resolving\n // the conflict instead of losing the session from the cockpit.\n const groupingRoot = hub\n .workspaces()\n .find((workspace) => workspace.id === record.workspaceId && workspace.available !== false)?.root;\n if (!groupingRoot || (record.groupingRoot !== undefined && groupingRoot !== record.groupingRoot))\n throw new Error('The session workspace is unavailable.');\n if (record.repoRoot !== undefined && fs.realpathSync(findRepositoryRoot(record.cwd)) !== record.repoRoot)\n throw new Error('The session checkout has changed.');\n await openSession(\n {\n cwd: record.cwd,\n name: record.name,\n ...(record.parentSessionId === undefined ? {} : { parentSessionId: record.parentSessionId }),\n ...(record.sessionProvenance === undefined ? {} : { sessionProvenance: record.sessionProvenance }),\n },\n record.sessionId,\n record.workspaceId,\n );\n };\n cockpit = await serveHeadlessServer({\n port: options.webPort,\n headlessHub: hub,\n token: attachToken,\n sessionMcpPublicOrigin: () => remoteRuntime?.remote.publicOrigin(),\n sessionMcpStateDir: serverDirectory,\n sessionMcpPublicOriginRevision: () => remoteRuntime?.remote.publicOriginRevision() ?? 0,\n isSessionPersisted: (sessionId, cwd) =>\n openSessions.list().some((record) => record.sessionId === sessionId && record.cwd === cwd),\n workspaceHistory: async (workspaceId) => (await savedHistory(workspaceId)).map((record) => record.summary),\n resumeWorkspaceSession: async (workspaceId, targetSessionId) => {\n const key = `${workspaceId}\\0${targetSessionId}`;\n const pending = workspaceResumes.get(key);\n if (pending) return pending;\n const resume = (async () => {\n const target = (await savedHistory(workspaceId)).find((item) => item.summary.id === targetSessionId);\n if (!target)\n throw new Error('Saved Pi 1.0 session not found in this workspace. Earlier sessions cannot be resumed.');\n validateExecution(target.execution, workspaceId);\n await openSession(\n {\n cwd: target.execution.cwd,\n name: target.summary.name ?? 'untitled',\n ...(target.execution.parentSessionId ? { parentSessionId: target.execution.parentSessionId } : {}),\n ...(target.execution.sessionProvenance ? { sessionProvenance: target.execution.sessionProvenance } : {}),\n },\n target.summary.id,\n workspaceId,\n );\n return target.summary.id;\n })();\n workspaceResumes.set(key, resume);\n try {\n return await resume;\n } finally {\n workspaceResumes.delete(key);\n }\n },\n sessionHistory: (session) => {\n const workspaceRoot = hub.workspaces().find((workspace) => workspace.id === session.workspaceId)?.root;\n if (!workspaceRoot) throw new Error('Session workspace not found.');\n return listSavedSessions(\n path.join(piAgentDirectory(baseEnvironment), 'server', 'sessions'),\n workspaceRoot,\n new Set(hub.snapshot().map((active) => active.id)),\n session.workspaceId,\n );\n },\n readDormantTranscript: (record, request, context) => {\n const workspaceRoot = hub.workspaces().find((workspace) => workspace.id === record.workspaceId)?.root;\n if (!workspaceRoot || (record.groupingRoot !== undefined && record.groupingRoot !== workspaceRoot))\n throw new Error('Saved transcript unavailable.');\n const owner = fs.realpathSync(findRepositoryRoot(record.cwd));\n if (record.repoRoot !== undefined && record.repoRoot !== owner)\n throw new Error('Saved transcript checkout has changed.');\n return readSqliteTranscript(\n path.join(\n piAgentDirectory(baseEnvironment),\n 'server',\n 'sessions',\n 'durable-v1',\n `${record.sessionId}.sqlite`,\n ),\n request,\n context,\n {\n sessionId: record.sessionId,\n workspaceRoot: owner,\n workspaceId: record.workspaceId,\n groupingRoot: workspaceRoot,\n },\n );\n },\n restartSession: async (session) => {\n const record = openSessions.list().find((entry) => entry.sessionId === session.id);\n const workspaceRoot = hub\n .workspaces()\n .find((workspace) => workspace.id === session.workspaceId && workspace.available !== false)?.root;\n if (!workspaceRoot) throw new Error('Session workspace not found.');\n await hub.closeSession(session.id);\n try {\n await openSession(\n {\n cwd: session.cwd,\n name: session.name,\n ...(session.parentSessionId === undefined ? {} : { parentSessionId: session.parentSessionId }),\n ...(session.sessionProvenance === undefined ? {} : { sessionProvenance: session.sessionProvenance }),\n },\n session.id,\n session.workspaceId,\n );\n } catch (error) {\n // The journal lease allows one writer, so the new host cannot open before the old\n // one closes. Keep the closed session as dormant so it can be revived after a fix.\n if (record !== undefined) openSessions.add(record);\n throw error;\n }\n },\n resumeSession: async (session, targetSessionId) => {\n const workspaceId = session.workspaceId;\n if (!workspaceId || !hub.workspaces().some((workspace) => workspace.id === workspaceId))\n throw new Error('Session workspace not found.');\n const target = (await savedHistory(workspaceId)).find((item) => item.summary.id === targetSessionId);\n if (!target)\n throw new Error('Saved Pi 1.0 session not found in this workspace. Earlier sessions cannot be resumed.');\n validateExecution(target.execution, workspaceId);\n const closedRecord = openSessions.list().find((entry) => entry.sessionId === session.id);\n await hub.closeSession(session.id);\n try {\n await openSession(\n {\n cwd: target.execution.cwd,\n name: target.summary.name ?? 'untitled',\n ...(target.execution.parentSessionId ? { parentSessionId: target.execution.parentSessionId } : {}),\n ...(target.execution.sessionProvenance ? { sessionProvenance: target.execution.sessionProvenance } : {}),\n },\n target.summary.id,\n workspaceId,\n );\n } catch (error) {\n // Same as restart: the session given up for the resume stays revivable.\n if (closedRecord !== undefined) openSessions.add(closedRecord);\n throw error;\n }\n return target.summary.id;\n },\n dormantSessions: () => openSessions.list(),\n removeDormantSession: (record: OpenSessionRecord) => openSessions.remove(record.sessionId),\n reviveSession: reviveRecord,\n requestAsset: (request) => webCompositions?.request(request) ?? Promise.resolve(undefined),\n compositions: () => {\n const workspaces = hub.workspaces();\n const decision = {\n cwd: baseCwd,\n launchWorkspaceId,\n workspaces,\n homeDirectory,\n environment: baseEnvironment,\n notice,\n };\n return {\n global: webCompositions?.get({ scope: 'global' }),\n nativeGlobal: webCompositions?.getNative({ scope: 'global' }),\n publicKey: webCompositions?.publicKey(),\n shell: webCompositions?.shellTrust(),\n template: resolveWebTemplateDecision(decision),\n nativeTemplate: resolveWebTemplateDecision({ ...decision, host: 'native' }),\n workspaces: workspaces.map((workspace) => ({\n ...workspace,\n webComposition: webCompositions?.get({ scope: 'workspace', workspaceId: workspace.id }),\n nativeComposition: webCompositions?.getNative({ scope: 'workspace', workspaceId: workspace.id }),\n })),\n };\n },\n telemetry,\n onNotice: notice,\n });\n notice(`protocol on ${cockpit.url}/api/ws`);\n let resolveShutdown!: (exitCode: number) => void;\n const shutdown = new Promise<number>((resolve) => {\n resolveShutdown = resolve;\n });\n requestRestart = () => {\n // Only sessions live right now reopen; dormant ones stay dormant.\n const ids = openSessions\n .list()\n .map((record) => record.sessionId)\n .filter((id) => sessionManager.get(id) !== undefined);\n try {\n writeRecycleFile(serverDirectory, ids);\n } catch (error) {\n notice(`Could not write the recycle file: ${error instanceof Error ? error.message : String(error)}`);\n }\n notice(`Restarting at idle to release superseded extension versions (${String(ids.length)} sessions reopen).`);\n resolveShutdown(RESTART_EXIT_CODE);\n };\n await reopenRecycledSessions(\n serverDirectory,\n async (sessionId) => {\n const record = openSessions.list().find((entry) => entry.sessionId === sessionId);\n if (record === undefined) throw new Error('its record is gone.');\n await reviveRecord(record);\n },\n (sessionId, error) =>\n notice(\n `Session '${sessionId}' did not reopen after the restart: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n idleRestart.poke();\n const stop = (): void => resolveShutdown(0);\n signal.addEventListener('abort', stop, { once: true });\n if (signal.aborted) stop();\n try {\n return await shutdown;\n } finally {\n signal.removeEventListener('abort', stop);\n }\n } finally {\n shuttingDown = true;\n idleRestart.dispose();\n stopIdleRestartPoke();\n stopResourceMonitor();\n executionBudget.close();\n stopPersistSessionNames();\n clearInterval(eventLoopMonitor);\n await bounded(telemetry.recordEvent('po_server.shutdown'), 'shutdown telemetry', notice);\n await bounded(\n withShutdownDeadline(() => cockpit?.close(), 'listener shutdown'),\n 'listener shutdown',\n notice,\n );\n await bounded(remoteRuntime?.close() ?? Promise.resolve(), 'remote control shutdown', notice);\n // Session hooks and MCP owners must unwind before their shared hub services.\n // Each session phase has its own deadline, so one stalled session cannot block the rest.\n try {\n await sessionManager.close();\n } catch (error) {\n notice(error instanceof Error ? error.message : String(error));\n }\n await bounded(\n withShutdownDeadline(() => hub.close(), 'hub shutdown'),\n 'hub shutdown',\n notice,\n );\n await bounded(\n withShutdownDeadline(() => requestReceipts.close(), 'receipt shutdown'),\n 'receipt shutdown',\n notice,\n );\n await bounded(\n withShutdownDeadline(() => computerUse?.close?.(), 'computer use shutdown'),\n 'computer use shutdown',\n notice,\n );\n await bounded(\n withShutdownDeadline(() => webCompositions?.close(), 'web composition shutdown'),\n 'web composition shutdown',\n notice,\n );\n const pendingCleanups = [...pendingSessions.values()].map((setup) =>\n bounded(\n withShutdownDeadline(() => setup.cleanup(), 'pending session cleanup'),\n 'pending session cleanup',\n notice,\n ),\n );\n pendingSessions.clear();\n await Promise.allSettled(pendingCleanups);\n await Promise.allSettled(\n [...repositoryContexts.values()].map((context) =>\n bounded(context.cleanup(), 'repository context cleanup', notice),\n ),\n );\n repositoryContexts.clear();\n await bounded(harnessTelemetry.flush(), 'harness telemetry flush', notice);\n await bounded(harnessTelemetry.shutdown(), 'harness telemetry shutdown', notice);\n await bounded(telemetry.flush(), 'server telemetry flush', notice);\n await bounded(telemetry.shutdown(), 'server telemetry shutdown', notice);\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ let node_perf_hooks = require("node:perf_hooks");
2
+ //#region src/builders/server/runtimeResources.ts
3
+ /** Process CPU percent uses one logical core as 100%, not the whole host. */
4
+ function resourceAttributes(previous, current) {
5
+ const elapsed = Math.max(1, current.monotonicMs - previous.monotonicMs);
6
+ const user = Math.max(0, current.cpu.user - previous.cpu.user);
7
+ const system = Math.max(0, current.cpu.system - previous.cpu.system);
8
+ return {
9
+ host_pid: process.pid,
10
+ interval_ms: elapsed,
11
+ cpu_percent: (user + system) / (elapsed * 1e3) * 100,
12
+ cpu_user_ms: user / 1e3,
13
+ cpu_system_ms: system / 1e3,
14
+ rss_bytes: current.memory.rss,
15
+ heap_used_bytes: current.memory.heapUsed,
16
+ heap_total_bytes: current.memory.heapTotal,
17
+ external_bytes: current.memory.external,
18
+ array_buffers_bytes: current.memory.arrayBuffers
19
+ };
20
+ }
21
+ /** One bounded exporter per server, never one stream or unbounded queue per session. */
22
+ function monitorRuntimeResources(options) {
23
+ const interval = options.intervalMs ?? 1e4;
24
+ if (!Number.isFinite(interval) || interval < 1) throw new RangeError("Resource interval must be positive");
25
+ const snapshot = () => ({
26
+ monotonicMs: node_perf_hooks.performance.now(),
27
+ cpu: process.cpuUsage(),
28
+ memory: process.memoryUsage()
29
+ });
30
+ let previous = snapshot();
31
+ let utilization = node_perf_hooks.performance.eventLoopUtilization();
32
+ let pending = false;
33
+ const histogram = (0, node_perf_hooks.monitorEventLoopDelay)({ resolution: 20 });
34
+ histogram.enable();
35
+ const timer = setInterval(() => {
36
+ if (pending) return;
37
+ pending = true;
38
+ try {
39
+ const current = snapshot();
40
+ const currentUtilization = node_perf_hooks.performance.eventLoopUtilization();
41
+ const deltaUtilization = node_perf_hooks.performance.eventLoopUtilization(currentUtilization, utilization);
42
+ const attributes = {
43
+ ...resourceAttributes(previous, current),
44
+ ...options.counts(),
45
+ event_loop_utilization: deltaUtilization.utilization,
46
+ event_loop_p99_ms: histogram.count ? histogram.percentile(99) / 1e6 : 0,
47
+ event_loop_max_ms: histogram.count ? histogram.max / 1e6 : 0
48
+ };
49
+ previous = current;
50
+ utilization = currentUtilization;
51
+ histogram.reset();
52
+ Promise.resolve(options.record(attributes)).catch((error) => {
53
+ options.warn(`Resource telemetry failed: ${String(error)}`);
54
+ }).finally(() => {
55
+ pending = false;
56
+ });
57
+ } catch (error) {
58
+ pending = false;
59
+ options.warn(`Resource sampling failed: ${String(error)}`);
60
+ }
61
+ }, interval);
62
+ timer.unref();
63
+ return () => {
64
+ clearInterval(timer);
65
+ histogram.disable();
66
+ };
67
+ }
68
+ //#endregion
69
+ exports.monitorRuntimeResources = monitorRuntimeResources;
70
+ exports.resourceAttributes = resourceAttributes;
71
+
72
+ //# sourceMappingURL=runtimeResources.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeResources.cjs","names":["performance","monitorEventLoopDelay"],"sources":["../../../../src/builders/server/runtimeResources.ts"],"sourcesContent":["import { monitorEventLoopDelay, performance } from 'node:perf_hooks';\n\nexport interface RuntimeResourceSample {\n monotonicMs: number;\n cpu: NodeJS.CpuUsage;\n memory: NodeJS.MemoryUsage;\n}\n\n/** Process CPU percent uses one logical core as 100%, not the whole host. */\nexport function resourceAttributes(\n previous: RuntimeResourceSample,\n current: RuntimeResourceSample,\n): Record<string, number> {\n const elapsed = Math.max(1, current.monotonicMs - previous.monotonicMs);\n const user = Math.max(0, current.cpu.user - previous.cpu.user);\n const system = Math.max(0, current.cpu.system - previous.cpu.system);\n return {\n host_pid: process.pid,\n interval_ms: elapsed,\n cpu_percent: ((user + system) / (elapsed * 1_000)) * 100,\n cpu_user_ms: user / 1_000,\n cpu_system_ms: system / 1_000,\n rss_bytes: current.memory.rss,\n heap_used_bytes: current.memory.heapUsed,\n heap_total_bytes: current.memory.heapTotal,\n external_bytes: current.memory.external,\n array_buffers_bytes: current.memory.arrayBuffers,\n };\n}\n\n/** One bounded exporter per server, never one stream or unbounded queue per session. */\nexport function monitorRuntimeResources(options: {\n record(attributes: Record<string, number>): Promise<unknown>;\n counts(): Record<string, number>;\n warn(message: string): void;\n intervalMs?: number;\n}): () => void {\n const interval = options.intervalMs ?? 10_000;\n if (!Number.isFinite(interval) || interval < 1) throw new RangeError('Resource interval must be positive');\n const snapshot = (): RuntimeResourceSample => ({\n monotonicMs: performance.now(),\n cpu: process.cpuUsage(),\n memory: process.memoryUsage(),\n });\n let previous = snapshot();\n let utilization = performance.eventLoopUtilization();\n let pending = false;\n const histogram = monitorEventLoopDelay({ resolution: 20 });\n histogram.enable();\n const timer = setInterval(() => {\n if (pending) return;\n pending = true;\n try {\n const current = snapshot();\n const currentUtilization = performance.eventLoopUtilization();\n const deltaUtilization = performance.eventLoopUtilization(currentUtilization, utilization);\n const attributes = {\n ...resourceAttributes(previous, current),\n ...options.counts(),\n event_loop_utilization: deltaUtilization.utilization,\n event_loop_p99_ms: histogram.count ? histogram.percentile(99) / 1e6 : 0,\n event_loop_max_ms: histogram.count ? histogram.max / 1e6 : 0,\n };\n previous = current;\n utilization = currentUtilization;\n histogram.reset();\n void Promise.resolve(options.record(attributes))\n .catch((error: unknown) => {\n options.warn(`Resource telemetry failed: ${String(error)}`);\n })\n .finally(() => {\n pending = false;\n });\n } catch (error) {\n pending = false;\n options.warn(`Resource sampling failed: ${String(error)}`);\n }\n }, interval);\n timer.unref();\n return () => {\n clearInterval(timer);\n histogram.disable();\n };\n}\n"],"mappings":";;;AASA,SAAgB,mBACd,UACA,SACwB;CACxB,MAAM,UAAU,KAAK,IAAI,GAAG,QAAQ,cAAc,SAAS,WAAW;CACtE,MAAM,OAAO,KAAK,IAAI,GAAG,QAAQ,IAAI,OAAO,SAAS,IAAI,IAAI;CAC7D,MAAM,SAAS,KAAK,IAAI,GAAG,QAAQ,IAAI,SAAS,SAAS,IAAI,MAAM;CACnE,OAAO;EACL,UAAU,QAAQ;EAClB,aAAa;EACb,cAAe,OAAO,WAAW,UAAU,OAAU;EACrD,aAAa,OAAO;EACpB,eAAe,SAAS;EACxB,WAAW,QAAQ,OAAO;EAC1B,iBAAiB,QAAQ,OAAO;EAChC,kBAAkB,QAAQ,OAAO;EACjC,gBAAgB,QAAQ,OAAO;EAC/B,qBAAqB,QAAQ,OAAO;CACtC;AACF;;AAGA,SAAgB,wBAAwB,SAKzB;CACb,MAAM,WAAW,QAAQ,cAAc;CACvC,IAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,WAAW,GAAG,MAAM,IAAI,WAAW,oCAAoC;CACzG,MAAM,kBAAyC;EAC7C,aAAaA,gBAAAA,YAAY,IAAI;EAC7B,KAAK,QAAQ,SAAS;EACtB,QAAQ,QAAQ,YAAY;CAC9B;CACA,IAAI,WAAW,SAAS;CACxB,IAAI,cAAcA,gBAAAA,YAAY,qBAAqB;CACnD,IAAI,UAAU;CACd,MAAM,aAAA,GAAYC,gBAAAA,sBAAAA,CAAsB,EAAE,YAAY,GAAG,CAAC;CAC1D,UAAU,OAAO;CACjB,MAAM,QAAQ,kBAAkB;EAC9B,IAAI,SAAS;EACb,UAAU;EACV,IAAI;GACF,MAAM,UAAU,SAAS;GACzB,MAAM,qBAAqBD,gBAAAA,YAAY,qBAAqB;GAC5D,MAAM,mBAAmBA,gBAAAA,YAAY,qBAAqB,oBAAoB,WAAW;GACzF,MAAM,aAAa;IACjB,GAAG,mBAAmB,UAAU,OAAO;IACvC,GAAG,QAAQ,OAAO;IAClB,wBAAwB,iBAAiB;IACzC,mBAAmB,UAAU,QAAQ,UAAU,WAAW,EAAE,IAAI,MAAM;IACtE,mBAAmB,UAAU,QAAQ,UAAU,MAAM,MAAM;GAC7D;GACA,WAAW;GACX,cAAc;GACd,UAAU,MAAM;GAChB,QAAa,QAAQ,QAAQ,OAAO,UAAU,CAAC,CAAC,CAC7C,OAAO,UAAmB;IACzB,QAAQ,KAAK,8BAA8B,OAAO,KAAK,GAAG;GAC5D,CAAC,CAAC,CACD,cAAc;IACb,UAAU;GACZ,CAAC;EACL,SAAS,OAAO;GACd,UAAU;GACV,QAAQ,KAAK,6BAA6B,OAAO,KAAK,GAAG;EAC3D;CACF,GAAG,QAAQ;CACX,MAAM,MAAM;CACZ,aAAa;EACX,cAAc,KAAK;EACnB,UAAU,QAAQ;CACpB;AACF"}
@@ -0,0 +1,71 @@
1
+ import { monitorEventLoopDelay, performance } from "node:perf_hooks";
2
+ //#region src/builders/server/runtimeResources.ts
3
+ /** Process CPU percent uses one logical core as 100%, not the whole host. */
4
+ function resourceAttributes(previous, current) {
5
+ const elapsed = Math.max(1, current.monotonicMs - previous.monotonicMs);
6
+ const user = Math.max(0, current.cpu.user - previous.cpu.user);
7
+ const system = Math.max(0, current.cpu.system - previous.cpu.system);
8
+ return {
9
+ host_pid: process.pid,
10
+ interval_ms: elapsed,
11
+ cpu_percent: (user + system) / (elapsed * 1e3) * 100,
12
+ cpu_user_ms: user / 1e3,
13
+ cpu_system_ms: system / 1e3,
14
+ rss_bytes: current.memory.rss,
15
+ heap_used_bytes: current.memory.heapUsed,
16
+ heap_total_bytes: current.memory.heapTotal,
17
+ external_bytes: current.memory.external,
18
+ array_buffers_bytes: current.memory.arrayBuffers
19
+ };
20
+ }
21
+ /** One bounded exporter per server, never one stream or unbounded queue per session. */
22
+ function monitorRuntimeResources(options) {
23
+ const interval = options.intervalMs ?? 1e4;
24
+ if (!Number.isFinite(interval) || interval < 1) throw new RangeError("Resource interval must be positive");
25
+ const snapshot = () => ({
26
+ monotonicMs: performance.now(),
27
+ cpu: process.cpuUsage(),
28
+ memory: process.memoryUsage()
29
+ });
30
+ let previous = snapshot();
31
+ let utilization = performance.eventLoopUtilization();
32
+ let pending = false;
33
+ const histogram = monitorEventLoopDelay({ resolution: 20 });
34
+ histogram.enable();
35
+ const timer = setInterval(() => {
36
+ if (pending) return;
37
+ pending = true;
38
+ try {
39
+ const current = snapshot();
40
+ const currentUtilization = performance.eventLoopUtilization();
41
+ const deltaUtilization = performance.eventLoopUtilization(currentUtilization, utilization);
42
+ const attributes = {
43
+ ...resourceAttributes(previous, current),
44
+ ...options.counts(),
45
+ event_loop_utilization: deltaUtilization.utilization,
46
+ event_loop_p99_ms: histogram.count ? histogram.percentile(99) / 1e6 : 0,
47
+ event_loop_max_ms: histogram.count ? histogram.max / 1e6 : 0
48
+ };
49
+ previous = current;
50
+ utilization = currentUtilization;
51
+ histogram.reset();
52
+ Promise.resolve(options.record(attributes)).catch((error) => {
53
+ options.warn(`Resource telemetry failed: ${String(error)}`);
54
+ }).finally(() => {
55
+ pending = false;
56
+ });
57
+ } catch (error) {
58
+ pending = false;
59
+ options.warn(`Resource sampling failed: ${String(error)}`);
60
+ }
61
+ }, interval);
62
+ timer.unref();
63
+ return () => {
64
+ clearInterval(timer);
65
+ histogram.disable();
66
+ };
67
+ }
68
+ //#endregion
69
+ export { monitorRuntimeResources, resourceAttributes };
70
+
71
+ //# sourceMappingURL=runtimeResources.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeResources.mjs","names":[],"sources":["../../../../src/builders/server/runtimeResources.ts"],"sourcesContent":["import { monitorEventLoopDelay, performance } from 'node:perf_hooks';\n\nexport interface RuntimeResourceSample {\n monotonicMs: number;\n cpu: NodeJS.CpuUsage;\n memory: NodeJS.MemoryUsage;\n}\n\n/** Process CPU percent uses one logical core as 100%, not the whole host. */\nexport function resourceAttributes(\n previous: RuntimeResourceSample,\n current: RuntimeResourceSample,\n): Record<string, number> {\n const elapsed = Math.max(1, current.monotonicMs - previous.monotonicMs);\n const user = Math.max(0, current.cpu.user - previous.cpu.user);\n const system = Math.max(0, current.cpu.system - previous.cpu.system);\n return {\n host_pid: process.pid,\n interval_ms: elapsed,\n cpu_percent: ((user + system) / (elapsed * 1_000)) * 100,\n cpu_user_ms: user / 1_000,\n cpu_system_ms: system / 1_000,\n rss_bytes: current.memory.rss,\n heap_used_bytes: current.memory.heapUsed,\n heap_total_bytes: current.memory.heapTotal,\n external_bytes: current.memory.external,\n array_buffers_bytes: current.memory.arrayBuffers,\n };\n}\n\n/** One bounded exporter per server, never one stream or unbounded queue per session. */\nexport function monitorRuntimeResources(options: {\n record(attributes: Record<string, number>): Promise<unknown>;\n counts(): Record<string, number>;\n warn(message: string): void;\n intervalMs?: number;\n}): () => void {\n const interval = options.intervalMs ?? 10_000;\n if (!Number.isFinite(interval) || interval < 1) throw new RangeError('Resource interval must be positive');\n const snapshot = (): RuntimeResourceSample => ({\n monotonicMs: performance.now(),\n cpu: process.cpuUsage(),\n memory: process.memoryUsage(),\n });\n let previous = snapshot();\n let utilization = performance.eventLoopUtilization();\n let pending = false;\n const histogram = monitorEventLoopDelay({ resolution: 20 });\n histogram.enable();\n const timer = setInterval(() => {\n if (pending) return;\n pending = true;\n try {\n const current = snapshot();\n const currentUtilization = performance.eventLoopUtilization();\n const deltaUtilization = performance.eventLoopUtilization(currentUtilization, utilization);\n const attributes = {\n ...resourceAttributes(previous, current),\n ...options.counts(),\n event_loop_utilization: deltaUtilization.utilization,\n event_loop_p99_ms: histogram.count ? histogram.percentile(99) / 1e6 : 0,\n event_loop_max_ms: histogram.count ? histogram.max / 1e6 : 0,\n };\n previous = current;\n utilization = currentUtilization;\n histogram.reset();\n void Promise.resolve(options.record(attributes))\n .catch((error: unknown) => {\n options.warn(`Resource telemetry failed: ${String(error)}`);\n })\n .finally(() => {\n pending = false;\n });\n } catch (error) {\n pending = false;\n options.warn(`Resource sampling failed: ${String(error)}`);\n }\n }, interval);\n timer.unref();\n return () => {\n clearInterval(timer);\n histogram.disable();\n };\n}\n"],"mappings":";;;AASA,SAAgB,mBACd,UACA,SACwB;CACxB,MAAM,UAAU,KAAK,IAAI,GAAG,QAAQ,cAAc,SAAS,WAAW;CACtE,MAAM,OAAO,KAAK,IAAI,GAAG,QAAQ,IAAI,OAAO,SAAS,IAAI,IAAI;CAC7D,MAAM,SAAS,KAAK,IAAI,GAAG,QAAQ,IAAI,SAAS,SAAS,IAAI,MAAM;CACnE,OAAO;EACL,UAAU,QAAQ;EAClB,aAAa;EACb,cAAe,OAAO,WAAW,UAAU,OAAU;EACrD,aAAa,OAAO;EACpB,eAAe,SAAS;EACxB,WAAW,QAAQ,OAAO;EAC1B,iBAAiB,QAAQ,OAAO;EAChC,kBAAkB,QAAQ,OAAO;EACjC,gBAAgB,QAAQ,OAAO;EAC/B,qBAAqB,QAAQ,OAAO;CACtC;AACF;;AAGA,SAAgB,wBAAwB,SAKzB;CACb,MAAM,WAAW,QAAQ,cAAc;CACvC,IAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,WAAW,GAAG,MAAM,IAAI,WAAW,oCAAoC;CACzG,MAAM,kBAAyC;EAC7C,aAAa,YAAY,IAAI;EAC7B,KAAK,QAAQ,SAAS;EACtB,QAAQ,QAAQ,YAAY;CAC9B;CACA,IAAI,WAAW,SAAS;CACxB,IAAI,cAAc,YAAY,qBAAqB;CACnD,IAAI,UAAU;CACd,MAAM,YAAY,sBAAsB,EAAE,YAAY,GAAG,CAAC;CAC1D,UAAU,OAAO;CACjB,MAAM,QAAQ,kBAAkB;EAC9B,IAAI,SAAS;EACb,UAAU;EACV,IAAI;GACF,MAAM,UAAU,SAAS;GACzB,MAAM,qBAAqB,YAAY,qBAAqB;GAC5D,MAAM,mBAAmB,YAAY,qBAAqB,oBAAoB,WAAW;GACzF,MAAM,aAAa;IACjB,GAAG,mBAAmB,UAAU,OAAO;IACvC,GAAG,QAAQ,OAAO;IAClB,wBAAwB,iBAAiB;IACzC,mBAAmB,UAAU,QAAQ,UAAU,WAAW,EAAE,IAAI,MAAM;IACtE,mBAAmB,UAAU,QAAQ,UAAU,MAAM,MAAM;GAC7D;GACA,WAAW;GACX,cAAc;GACd,UAAU,MAAM;GAChB,QAAa,QAAQ,QAAQ,OAAO,UAAU,CAAC,CAAC,CAC7C,OAAO,UAAmB;IACzB,QAAQ,KAAK,8BAA8B,OAAO,KAAK,GAAG;GAC5D,CAAC,CAAC,CACD,cAAc;IACb,UAAU;GACZ,CAAC;EACL,SAAS,OAAO;GACd,UAAU;GACV,QAAQ,KAAK,6BAA6B,OAAO,KAAK,GAAG;EAC3D;CACF,GAAG,QAAQ;CACX,MAAM,MAAM;CACZ,aAAa;EACX,cAAc,KAAK;EACnB,UAAU,QAAQ;CACpB;AACF"}
@@ -0,0 +1,12 @@
1
+ let _agimon_ai_po_domain = require("@agimon-ai/po-domain");
2
+ let _agimon_ai_po_major_mode = require("@agimon-ai/po-major-mode");
3
+ //#region src/builders/server/selectionStatus.ts
4
+ function publishHeadlessSelectionStatus(setStatus, selection) {
5
+ setStatus("doom-major-mode", (0, _agimon_ai_po_major_mode.statusText)(selection.majorMode, selection.domains, selection.profile));
6
+ setStatus("doom-domain", (0, _agimon_ai_po_domain.domainStatus)(selection.domains));
7
+ setStatus("doom-profile", selection.profile);
8
+ }
9
+ //#endregion
10
+ exports.publishHeadlessSelectionStatus = publishHeadlessSelectionStatus;
11
+
12
+ //# sourceMappingURL=selectionStatus.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectionStatus.cjs","names":["statusText","domainStatus"],"sources":["../../../../src/builders/server/selectionStatus.ts"],"sourcesContent":["import type { DoomHeadlessSelection } from '@agimon-ai/po-core/headless';\nimport { domainStatus } from '@agimon-ai/po-domain';\nimport { statusText } from '@agimon-ai/po-major-mode';\nexport function publishHeadlessSelectionStatus(\n setStatus: (source: string, text: string | undefined) => void,\n selection: DoomHeadlessSelection,\n): void {\n setStatus('doom-major-mode', statusText(selection.majorMode, selection.domains, selection.profile));\n setStatus('doom-domain', domainStatus(selection.domains));\n setStatus('doom-profile', selection.profile);\n}\n"],"mappings":";;;AAGA,SAAgB,+BACd,WACA,WACM;CACN,UAAU,oBAAA,GAAmBA,yBAAAA,WAAAA,CAAW,UAAU,WAAW,UAAU,SAAS,UAAU,OAAO,CAAC;CAClG,UAAU,gBAAA,GAAeC,qBAAAA,aAAAA,CAAa,UAAU,OAAO,CAAC;CACxD,UAAU,gBAAgB,UAAU,OAAO;AAC7C"}
@@ -0,0 +1,12 @@
1
+ import { domainStatus } from "@agimon-ai/po-domain";
2
+ import { statusText } from "@agimon-ai/po-major-mode";
3
+ //#region src/builders/server/selectionStatus.ts
4
+ function publishHeadlessSelectionStatus(setStatus, selection) {
5
+ setStatus("doom-major-mode", statusText(selection.majorMode, selection.domains, selection.profile));
6
+ setStatus("doom-domain", domainStatus(selection.domains));
7
+ setStatus("doom-profile", selection.profile);
8
+ }
9
+ //#endregion
10
+ export { publishHeadlessSelectionStatus };
11
+
12
+ //# sourceMappingURL=selectionStatus.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectionStatus.mjs","names":[],"sources":["../../../../src/builders/server/selectionStatus.ts"],"sourcesContent":["import type { DoomHeadlessSelection } from '@agimon-ai/po-core/headless';\nimport { domainStatus } from '@agimon-ai/po-domain';\nimport { statusText } from '@agimon-ai/po-major-mode';\nexport function publishHeadlessSelectionStatus(\n setStatus: (source: string, text: string | undefined) => void,\n selection: DoomHeadlessSelection,\n): void {\n setStatus('doom-major-mode', statusText(selection.majorMode, selection.domains, selection.profile));\n setStatus('doom-domain', domainStatus(selection.domains));\n setStatus('doom-profile', selection.profile);\n}\n"],"mappings":";;;AAGA,SAAgB,+BACd,WACA,WACM;CACN,UAAU,mBAAmB,WAAW,UAAU,WAAW,UAAU,SAAS,UAAU,OAAO,CAAC;CAClG,UAAU,eAAe,aAAa,UAAU,OAAO,CAAC;CACxD,UAAU,gBAAgB,UAAU,OAAO;AAC7C"}
@@ -0,0 +1,63 @@
1
+ //#region src/builders/server/sessionArguments.ts
2
+ const SESSION_ID_OPTION = "--session-id";
3
+ const NAME_OPTION = "--name";
4
+ const PROFILE_OPTION = "--profile";
5
+ const DOMAINS_OPTION = "--domains";
6
+ const NO_DOMAINS_OPTION = "--no-domains";
7
+ const MODEL_OPTION = "--model";
8
+ const THINKING_OPTION = "--thinking";
9
+ const APPEND_SYSTEM_PROMPT_OPTION = "--append-system-prompt";
10
+ /** Settles the direct session identity from explicit arguments or caller defaults. */
11
+ function resolveSessionIdentity(agentArgs, fallback) {
12
+ const args = [...agentArgs];
13
+ const identity = { ...fallback };
14
+ for (const [option, key] of [[SESSION_ID_OPTION, "sessionId"], [NAME_OPTION, "sessionName"]]) {
15
+ const index = args.indexOf(option);
16
+ const value = index === -1 ? void 0 : args[index + 1];
17
+ if (value !== void 0 && !value.startsWith("-")) identity[key] = value;
18
+ else args.push(option, identity[key]);
19
+ }
20
+ if (!/^[a-zA-Z0-9_-]+$/u.test(identity.sessionId)) throw new Error("Invalid session id.");
21
+ return {
22
+ agentArgs: args,
23
+ identity
24
+ };
25
+ }
26
+ const MAJOR_MODE_OPTION = "--major-mode";
27
+ /**
28
+ * The harness arguments for a session a package created with explicit settings.
29
+ *
30
+ * Translating to flags keeps one validation path: the same parser that checks
31
+ * a `po --major-mode ... --model ...` launch checks these. Minor modes have
32
+ * no flag; the caller seeds them into the selection state directly.
33
+ */
34
+ function sessionSelectionArgs(request) {
35
+ const { selection, model, thinking, appendSystemPrompt } = request;
36
+ const args = [];
37
+ const pinned = [];
38
+ if (selection?.majorMode !== void 0) {
39
+ args.push(MAJOR_MODE_OPTION, selection.majorMode);
40
+ pinned.push("majorMode");
41
+ }
42
+ if (selection?.profile !== void 0) {
43
+ args.push(PROFILE_OPTION, selection.profile);
44
+ pinned.push("profile");
45
+ }
46
+ if (selection?.domains !== void 0) {
47
+ if (selection.domains.length === 0) args.push(NO_DOMAINS_OPTION);
48
+ else args.push(DOMAINS_OPTION, selection.domains.join(","));
49
+ pinned.push("domains");
50
+ }
51
+ if (model !== void 0) args.push(MODEL_OPTION, model);
52
+ if (thinking !== void 0) args.push(THINKING_OPTION, thinking);
53
+ if (appendSystemPrompt !== void 0) args.push(APPEND_SYSTEM_PROMPT_OPTION, appendSystemPrompt);
54
+ return {
55
+ args,
56
+ pinned
57
+ };
58
+ }
59
+ //#endregion
60
+ exports.resolveSessionIdentity = resolveSessionIdentity;
61
+ exports.sessionSelectionArgs = sessionSelectionArgs;
62
+
63
+ //# sourceMappingURL=sessionArguments.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionArguments.cjs","names":[],"sources":["../../../../src/builders/server/sessionArguments.ts"],"sourcesContent":["import type { DoomHubSessionCreateRequest } from '@agimon-ai/po-core/hubChannel';\n\nconst SESSION_ID_OPTION = '--session-id';\nconst NAME_OPTION = '--name';\nconst PROFILE_OPTION = '--profile';\nconst DOMAINS_OPTION = '--domains';\nconst NO_DOMAINS_OPTION = '--no-domains';\nconst MODEL_OPTION = '--model';\nconst THINKING_OPTION = '--thinking';\nconst APPEND_SYSTEM_PROMPT_OPTION = '--append-system-prompt';\nexport interface SessionIdentity {\n sessionId: string;\n sessionName: string;\n}\n\n/** Settles the direct session identity from explicit arguments or caller defaults. */\nexport function resolveSessionIdentity(\n agentArgs: readonly string[],\n fallback: SessionIdentity,\n): { agentArgs: string[]; identity: SessionIdentity } {\n const args = [...agentArgs];\n const identity = { ...fallback };\n for (const [option, key] of [\n [SESSION_ID_OPTION, 'sessionId'],\n [NAME_OPTION, 'sessionName'],\n ] as const) {\n const index = args.indexOf(option);\n const value = index === -1 ? undefined : args[index + 1];\n if (value !== undefined && !value.startsWith('-')) identity[key] = value;\n else args.push(option, identity[key]);\n }\n if (!/^[a-zA-Z0-9_-]+$/u.test(identity.sessionId)) throw new Error('Invalid session id.');\n return { agentArgs: args, identity };\n}\n\nconst MAJOR_MODE_OPTION = '--major-mode';\n\n/** Selection axes a request pins, which later inherited defaults must not replace. */\nexport type PinnedSelectionAxis = 'majorMode' | 'domains' | 'profile';\n\n/**\n * The harness arguments for a session a package created with explicit settings.\n *\n * Translating to flags keeps one validation path: the same parser that checks\n * a `po --major-mode ... --model ...` launch checks these. Minor modes have\n * no flag; the caller seeds them into the selection state directly.\n */\nexport function sessionSelectionArgs(\n request: Pick<DoomHubSessionCreateRequest, 'selection' | 'model' | 'thinking' | 'appendSystemPrompt'>,\n): {\n args: string[];\n pinned: PinnedSelectionAxis[];\n} {\n const { selection, model, thinking, appendSystemPrompt } = request;\n const args: string[] = [];\n const pinned: PinnedSelectionAxis[] = [];\n if (selection?.majorMode !== undefined) {\n args.push(MAJOR_MODE_OPTION, selection.majorMode);\n pinned.push('majorMode');\n }\n if (selection?.profile !== undefined) {\n args.push(PROFILE_OPTION, selection.profile);\n pinned.push('profile');\n }\n if (selection?.domains !== undefined) {\n if (selection.domains.length === 0) args.push(NO_DOMAINS_OPTION);\n else args.push(DOMAINS_OPTION, selection.domains.join(','));\n pinned.push('domains');\n }\n if (model !== undefined) args.push(MODEL_OPTION, model);\n if (thinking !== undefined) args.push(THINKING_OPTION, thinking);\n // Unknown to the harness parser, so it reaches Pi, which appends it to the system prompt.\n if (appendSystemPrompt !== undefined) args.push(APPEND_SYSTEM_PROMPT_OPTION, appendSystemPrompt);\n return { args, pinned };\n}\n\n/**\n * The agent arguments with the major mode pinned to a relaunch target.\n *\n * Any prior selection is dropped so repeated switches never accumulate flags.\n * The new pair goes last, the position launcher scripts already use, which\n * also keeps a leading script path intact when the agent runs via node.\n */\nexport function relaunchAgentArgs(args: readonly string[], majorMode: string): string[] {\n const kept: string[] = [];\n let skipValue = false;\n for (const argument of args) {\n if (skipValue) {\n skipValue = false;\n continue;\n }\n if (argument === MAJOR_MODE_OPTION) {\n skipValue = true;\n continue;\n }\n kept.push(argument);\n }\n return [...kept, MAJOR_MODE_OPTION, majorMode];\n}\n"],"mappings":";AAEA,MAAM,oBAAoB;AAC1B,MAAM,cAAc;AACpB,MAAM,iBAAiB;AACvB,MAAM,iBAAiB;AACvB,MAAM,oBAAoB;AAC1B,MAAM,eAAe;AACrB,MAAM,kBAAkB;AACxB,MAAM,8BAA8B;;AAOpC,SAAgB,uBACd,WACA,UACoD;CACpD,MAAM,OAAO,CAAC,GAAG,SAAS;CAC1B,MAAM,WAAW,EAAE,GAAG,SAAS;CAC/B,KAAK,MAAM,CAAC,QAAQ,QAAQ,CAC1B,CAAC,mBAAmB,WAAW,GAC/B,CAAC,aAAa,aAAa,CAC7B,GAAY;EACV,MAAM,QAAQ,KAAK,QAAQ,MAAM;EACjC,MAAM,QAAQ,UAAU,KAAK,KAAA,IAAY,KAAK,QAAQ;EACtD,IAAI,UAAU,KAAA,KAAa,CAAC,MAAM,WAAW,GAAG,GAAG,SAAS,OAAO;OAC9D,KAAK,KAAK,QAAQ,SAAS,IAAI;CACtC;CACA,IAAI,CAAC,oBAAoB,KAAK,SAAS,SAAS,GAAG,MAAM,IAAI,MAAM,qBAAqB;CACxF,OAAO;EAAE,WAAW;EAAM;CAAS;AACrC;AAEA,MAAM,oBAAoB;;;;;;;;AAY1B,SAAgB,qBACd,SAIA;CACA,MAAM,EAAE,WAAW,OAAO,UAAU,uBAAuB;CAC3D,MAAM,OAAiB,CAAC;CACxB,MAAM,SAAgC,CAAC;CACvC,IAAI,WAAW,cAAc,KAAA,GAAW;EACtC,KAAK,KAAK,mBAAmB,UAAU,SAAS;EAChD,OAAO,KAAK,WAAW;CACzB;CACA,IAAI,WAAW,YAAY,KAAA,GAAW;EACpC,KAAK,KAAK,gBAAgB,UAAU,OAAO;EAC3C,OAAO,KAAK,SAAS;CACvB;CACA,IAAI,WAAW,YAAY,KAAA,GAAW;EACpC,IAAI,UAAU,QAAQ,WAAW,GAAG,KAAK,KAAK,iBAAiB;OAC1D,KAAK,KAAK,gBAAgB,UAAU,QAAQ,KAAK,GAAG,CAAC;EAC1D,OAAO,KAAK,SAAS;CACvB;CACA,IAAI,UAAU,KAAA,GAAW,KAAK,KAAK,cAAc,KAAK;CACtD,IAAI,aAAa,KAAA,GAAW,KAAK,KAAK,iBAAiB,QAAQ;CAE/D,IAAI,uBAAuB,KAAA,GAAW,KAAK,KAAK,6BAA6B,kBAAkB;CAC/F,OAAO;EAAE;EAAM;CAAO;AACxB"}