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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1149) hide show
  1. package/LICENSE +149 -21
  2. package/NOTICE +41 -0
  3. package/dist/agentModel.cjs +1 -1
  4. package/dist/agentModel.d.mts +2 -2
  5. package/dist/agentModel.mjs +1 -2
  6. package/dist/apiContracts.cjs +623 -802
  7. package/dist/apiContracts.cjs.map +1 -1
  8. package/dist/apiContracts.d.mts +277 -615
  9. package/dist/apiContracts.d.mts.map +1 -1
  10. package/dist/apiContracts.mjs +617 -794
  11. package/dist/apiContracts.mjs.map +1 -1
  12. package/dist/askUser.cjs +2 -2
  13. package/dist/askUser.d.mts +2 -2
  14. package/dist/askUser.mjs +1 -2
  15. package/dist/authorTools.mjs +1 -2
  16. package/dist/backgroundWork.cjs +3 -3
  17. package/dist/backgroundWork.d.mts +2 -2
  18. package/dist/backgroundWork.mjs +1 -2
  19. package/dist/bundleAssetPolicy.mjs +1 -2
  20. package/dist/chatgptAuth.cjs +3 -2
  21. package/dist/chatgptAuth.d.mts +3 -2
  22. package/dist/chatgptAuth.mjs +2 -1
  23. package/dist/childProcess.cjs +1 -1
  24. package/dist/childProcess.d.mts +2 -2
  25. package/dist/childProcess.mjs +1 -2
  26. package/dist/childSession.cjs +11 -6
  27. package/dist/childSession.d.mts +3 -3
  28. package/dist/childSession.mjs +3 -3
  29. package/dist/cockpitContainer.mjs +1 -2
  30. package/dist/config.cjs +1 -1
  31. package/dist/config.d.mts +3 -3
  32. package/dist/config.mjs +1 -2
  33. package/dist/contextApi.cjs +1 -0
  34. package/dist/contextApi.d.mts +2 -2
  35. package/dist/contextApi.mjs +2 -2
  36. package/dist/contextContributions.cjs +4 -4
  37. package/dist/contextContributions.d.mts +3 -3
  38. package/dist/contextContributions.mjs +3 -3
  39. package/dist/contextDetailStore.cjs +7 -5
  40. package/dist/contextDetailStore.cjs.map +1 -1
  41. package/dist/contextDetailStore.d.mts +2 -1
  42. package/dist/contextDetailStore.d.mts.map +1 -1
  43. package/dist/contextDetailStore.mjs +6 -4
  44. package/dist/contextDetailStore.mjs.map +1 -1
  45. package/dist/contextProjection.cjs +7 -2
  46. package/dist/contextProjection.cjs.map +1 -1
  47. package/dist/contextProjection.d.mts +4 -1
  48. package/dist/contextProjection.d.mts.map +1 -1
  49. package/dist/contextProjection.mjs +5 -2
  50. package/dist/contextProjection.mjs.map +1 -1
  51. package/dist/cordisHost.cjs +11 -11
  52. package/dist/cordisHost.d.mts +2 -2
  53. package/dist/cordisHost.mjs +1 -2
  54. package/dist/delegation.cjs +8 -8
  55. package/dist/delegation.d.mts +2 -2
  56. package/dist/delegation.mjs +1 -2
  57. package/dist/executionBudget.cjs +4 -3
  58. package/dist/executionBudget.cjs.map +1 -1
  59. package/dist/executionBudget.d.mts +2 -2
  60. package/dist/executionBudget.d.mts.map +1 -1
  61. package/dist/executionBudget.mjs +4 -3
  62. package/dist/executionBudget.mjs.map +1 -1
  63. package/dist/extensionFile.cjs +5 -0
  64. package/dist/extensionFile.d.mts +4 -2
  65. package/dist/extensionFile.mjs +4 -2
  66. package/dist/footer.d.mts +2 -2
  67. package/dist/footer.mjs +1 -2
  68. package/dist/headless.cjs +14 -14
  69. package/dist/headless.d.mts +2 -2
  70. package/dist/headless.mjs +1 -2
  71. package/dist/headlessHub.cjs +308 -109
  72. package/dist/headlessHub.cjs.map +1 -1
  73. package/dist/headlessHub.d.mts +71 -36
  74. package/dist/headlessHub.d.mts.map +1 -1
  75. package/dist/headlessHub.mjs +309 -110
  76. package/dist/headlessHub.mjs.map +1 -1
  77. package/dist/headlessProtocol.cjs +327 -0
  78. package/dist/headlessProtocol.cjs.map +1 -0
  79. package/dist/headlessProtocol.d.mts +30 -0
  80. package/dist/headlessProtocol.d.mts.map +1 -0
  81. package/dist/headlessProtocol.mjs +326 -0
  82. package/dist/headlessProtocol.mjs.map +1 -0
  83. package/dist/headlessServer.cjs +166 -151
  84. package/dist/headlessServer.cjs.map +1 -1
  85. package/dist/headlessServer.d.mts +13 -5
  86. package/dist/headlessServer.d.mts.map +1 -1
  87. package/dist/headlessServer.mjs +166 -151
  88. package/dist/headlessServer.mjs.map +1 -1
  89. package/dist/headlessSessionHost.d.mts +58 -21
  90. package/dist/headlessSessionHost.d.mts.map +1 -1
  91. package/dist/help.cjs +20 -20
  92. package/dist/help.d.mts +2 -2
  93. package/dist/help.mjs +2 -2
  94. package/dist/history.cjs +16 -20
  95. package/dist/history.d.mts +9 -7
  96. package/dist/history.mjs +6 -7
  97. package/dist/historyOwnership.cjs.map +1 -1
  98. package/dist/historyOwnership.d.mts +1 -1
  99. package/dist/historyOwnership.mjs.map +1 -1
  100. package/dist/hubChannel.cjs +9 -0
  101. package/dist/hubChannel.d.mts +3 -2
  102. package/dist/hubChannel.mjs +3 -2
  103. package/dist/index.cjs +26 -28
  104. package/dist/index.d.mts +6 -6
  105. package/dist/index.mjs +6 -6
  106. package/dist/interop/chord.mjs +1 -0
  107. package/dist/interop/chordContext.mjs +1 -0
  108. package/dist/json.cjs +11 -5
  109. package/dist/json.d.mts +4 -2
  110. package/dist/json.mjs +4 -2
  111. package/dist/kernel.cjs +1 -1
  112. package/dist/kernel.d.mts +3 -3
  113. package/dist/kernel.mjs +1 -2
  114. package/dist/leader.d.mts +2 -2
  115. package/dist/leader.mjs +1 -2
  116. package/dist/logSinkTelemetry.mjs +1 -2
  117. package/dist/machineApi.cjs +80 -74
  118. package/dist/machineApi.cjs.map +1 -1
  119. package/dist/machineApi.d.mts +5 -2
  120. package/dist/machineApi.d.mts.map +1 -1
  121. package/dist/machineApi.mjs +78 -71
  122. package/dist/machineApi.mjs.map +1 -1
  123. package/dist/main.cjs +2 -1
  124. package/dist/main.d.mts +2 -1
  125. package/dist/main.mjs +2 -1
  126. package/dist/mcpFacet.d.mts +3 -3
  127. package/dist/mcpProjection.cjs +13 -13
  128. package/dist/mcpProjection.d.mts +2 -2
  129. package/dist/mcpProjection.mjs +1 -2
  130. package/dist/mcpSchemaCost.cjs +4 -4
  131. package/dist/mcpSchemaCost.cjs.map +1 -1
  132. package/dist/mcpSchemaCost.d.mts +2 -2
  133. package/dist/mcpSchemaCost.mjs +4 -4
  134. package/dist/mcpSchemaCost.mjs.map +1 -1
  135. package/dist/mcpSession.cjs +7 -7
  136. package/dist/mcpSession.d.mts +2 -2
  137. package/dist/mcpSession.mjs +1 -2
  138. package/dist/mcpStatus.cjs +2 -2
  139. package/dist/mcpStatus.d.mts +2 -2
  140. package/dist/mcpStatus.mjs +1 -2
  141. package/dist/mcpToolResolver.cjs +3 -3
  142. package/dist/mcpToolResolver.d.mts +2 -2
  143. package/dist/mcpToolResolver.mjs +1 -2
  144. package/dist/mcpWidget.d.mts +2 -2
  145. package/dist/moduleResolution.cjs +43 -8
  146. package/dist/moduleResolution.cjs.map +1 -1
  147. package/dist/moduleResolution.d.mts +10 -1
  148. package/dist/moduleResolution.d.mts.map +1 -1
  149. package/dist/moduleResolution.mjs +40 -7
  150. package/dist/moduleResolution.mjs.map +1 -1
  151. package/dist/narration.cjs +3 -3
  152. package/dist/narration.d.mts +2 -2
  153. package/dist/narration.mjs +1 -2
  154. package/dist/native.cjs +9 -0
  155. package/dist/native.d.mts +4 -3
  156. package/dist/native.mjs +3 -2
  157. package/dist/nodePlatform.cjs +77 -0
  158. package/dist/nodePlatform.cjs.map +1 -0
  159. package/dist/nodePlatform.d.mts +17 -0
  160. package/dist/nodePlatform.d.mts.map +1 -0
  161. package/dist/nodePlatform.mjs +72 -0
  162. package/dist/nodePlatform.mjs.map +1 -0
  163. package/dist/notification.cjs +15 -15
  164. package/dist/notification.d.mts +2 -2
  165. package/dist/notification.mjs +1 -2
  166. package/dist/packageApi.cjs +11 -11
  167. package/dist/packageApi.d.mts +2 -2
  168. package/dist/packageApi.mjs +2 -2
  169. package/dist/packageApiServer.cjs +45 -27
  170. package/dist/packageApiServer.cjs.map +1 -1
  171. package/dist/packageApiServer.d.mts +36 -26
  172. package/dist/packageApiServer.d.mts.map +1 -1
  173. package/dist/packageApiServer.mjs +44 -26
  174. package/dist/packageApiServer.mjs.map +1 -1
  175. package/dist/piSettings.cjs +41 -20
  176. package/dist/piSettings.d.mts +4 -2
  177. package/dist/piSettings.mjs +4 -2
  178. package/dist/platform.cjs +62 -0
  179. package/dist/platform.d.mts +10 -0
  180. package/dist/platform.mjs +10 -0
  181. package/dist/pluginProtocol.cjs +7 -8
  182. package/dist/pluginProtocol.d.mts +2 -2
  183. package/dist/pluginProtocol.mjs +1 -2
  184. package/dist/poPackage.cjs +12 -0
  185. package/dist/poPackage.d.mts +3 -0
  186. package/dist/poPackage.mjs +3 -0
  187. package/dist/profileIdentity.cjs +1 -1
  188. package/dist/profileIdentity.d.mts +2 -2
  189. package/dist/profileIdentity.mjs +1 -2
  190. package/dist/protocol.cjs +3 -3
  191. package/dist/protocol.d.mts +2 -2
  192. package/dist/protocol.mjs +1 -2
  193. package/dist/readiness.cjs +6 -6
  194. package/dist/readiness.d.mts +2 -2
  195. package/dist/readiness.mjs +1 -2
  196. package/dist/remoteApi.cjs.map +1 -1
  197. package/dist/remoteApi.d.mts +2 -2
  198. package/dist/remoteApi.mjs.map +1 -1
  199. package/dist/remoteRuntime.cjs +42 -65
  200. package/dist/remoteRuntime.cjs.map +1 -1
  201. package/dist/remoteRuntime.d.mts +3 -2
  202. package/dist/remoteRuntime.d.mts.map +1 -1
  203. package/dist/remoteRuntime.mjs +41 -62
  204. package/dist/remoteRuntime.mjs.map +1 -1
  205. package/dist/runtimeConfig.cjs +4 -4
  206. package/dist/runtimeConfig.cjs.map +1 -1
  207. package/dist/runtimeConfig.d.mts +10 -9
  208. package/dist/runtimeConfig.d.mts.map +1 -1
  209. package/dist/runtimeConfig.mjs +4 -4
  210. package/dist/runtimeConfig.mjs.map +1 -1
  211. package/dist/runtimeContextApi.cjs +10 -3
  212. package/dist/runtimeContextApi.cjs.map +1 -1
  213. package/dist/runtimeContextApi.d.mts +3 -3
  214. package/dist/runtimeContextApi.d.mts.map +1 -1
  215. package/dist/runtimeContextApi.mjs +10 -3
  216. package/dist/runtimeContextApi.mjs.map +1 -1
  217. package/dist/runtimeCordisHost.cjs +46 -46
  218. package/dist/runtimeCordisHost.cjs.map +1 -1
  219. package/dist/runtimeCordisHost.d.mts +29 -28
  220. package/dist/runtimeCordisHost.d.mts.map +1 -1
  221. package/dist/runtimeCordisHost.mjs +42 -42
  222. package/dist/runtimeCordisHost.mjs.map +1 -1
  223. package/dist/runtimeIdentity.cjs +6 -9
  224. package/dist/runtimeIdentity.cjs.map +1 -1
  225. package/dist/runtimeIdentity.d.mts +5 -1
  226. package/dist/runtimeIdentity.d.mts.map +1 -1
  227. package/dist/runtimeIdentity.mjs +5 -8
  228. package/dist/runtimeIdentity.mjs.map +1 -1
  229. package/dist/runtimeJson.cjs +10 -45
  230. package/dist/runtimeJson.d.mts +3 -22
  231. package/dist/runtimeJson.mjs +3 -39
  232. package/dist/runtimeLogSinkTelemetry.cjs +19 -19
  233. package/dist/runtimeLogSinkTelemetry.cjs.map +1 -1
  234. package/dist/runtimeLogSinkTelemetry.d.mts +19 -19
  235. package/dist/runtimeLogSinkTelemetry.mjs +19 -19
  236. package/dist/runtimeLogSinkTelemetry.mjs.map +1 -1
  237. package/dist/runtimePackages.cjs +7 -2
  238. package/dist/runtimePackages.cjs.map +1 -1
  239. package/dist/runtimePackages.d.mts +4 -1
  240. package/dist/runtimePackages.d.mts.map +1 -1
  241. package/dist/runtimePackages.mjs +7 -2
  242. package/dist/runtimePackages.mjs.map +1 -1
  243. package/dist/runtimePiSettings.cjs +40 -263
  244. package/dist/runtimePiSettings.d.mts +3 -72
  245. package/dist/runtimePiSettings.mjs +3 -241
  246. package/dist/runtimeProtocol.cjs +19 -19
  247. package/dist/runtimeProtocol.cjs.map +1 -1
  248. package/dist/runtimeProtocol.d.mts +7 -7
  249. package/dist/runtimeProtocol.d.mts.map +1 -1
  250. package/dist/runtimeProtocol.mjs +17 -17
  251. package/dist/runtimeProtocol.mjs.map +1 -1
  252. package/dist/runtimeTransition.cjs +9 -9
  253. package/dist/runtimeTransition.cjs.map +1 -1
  254. package/dist/runtimeTransition.d.mts +10 -10
  255. package/dist/runtimeTransition.d.mts.map +1 -1
  256. package/dist/runtimeTransition.mjs +7 -7
  257. package/dist/runtimeTransition.mjs.map +1 -1
  258. package/dist/sandboxHarness.mjs +1 -2
  259. package/dist/server.cjs +3 -7
  260. package/dist/server.d.mts +6 -6
  261. package/dist/server.mjs +3 -4
  262. package/dist/serverPlugin.cjs +39 -0
  263. package/dist/serverPlugin.d.mts +12 -0
  264. package/dist/serverPlugin.mjs +11 -0
  265. package/dist/serverTelemetry.cjs +1 -1
  266. package/dist/serverTelemetry.cjs.map +1 -1
  267. package/dist/serverTelemetry.d.mts +2 -2
  268. package/dist/serverTelemetry.mjs +2 -2
  269. package/dist/serverTelemetry.mjs.map +1 -1
  270. package/dist/sessionFilesApi.cjs +41 -37
  271. package/dist/sessionFilesApi.cjs.map +1 -1
  272. package/dist/sessionFilesApi.d.mts +6 -3
  273. package/dist/sessionFilesApi.d.mts.map +1 -1
  274. package/dist/sessionFilesApi.mjs +41 -36
  275. package/dist/sessionFilesApi.mjs.map +1 -1
  276. package/dist/sessionProtocol.cjs +31 -6
  277. package/dist/sessionProtocol.d.mts +8 -3
  278. package/dist/sessionProtocol.mjs +8 -2
  279. package/dist/skills.cjs +5 -5
  280. package/dist/skills.d.mts +2 -2
  281. package/dist/skills.mjs +1 -2
  282. package/dist/sqliteSessionStorage.cjs +28 -50
  283. package/dist/sqliteSessionStorage.cjs.map +1 -1
  284. package/dist/sqliteSessionStorage.d.mts +13 -20
  285. package/dist/sqliteSessionStorage.d.mts.map +1 -1
  286. package/dist/sqliteSessionStorage.mjs +25 -48
  287. package/dist/sqliteSessionStorage.mjs.map +1 -1
  288. package/dist/src/constants/agentSettled.cjs +7 -0
  289. package/dist/src/constants/agentSettled.cjs.map +1 -0
  290. package/dist/src/constants/agentSettled.mjs +7 -0
  291. package/dist/src/constants/agentSettled.mjs.map +1 -0
  292. package/dist/src/constants/contextApi.cjs +3 -1
  293. package/dist/src/constants/contextApi.cjs.map +1 -1
  294. package/dist/src/constants/contextApi.d.mts +2 -1
  295. package/dist/src/constants/contextApi.d.mts.map +1 -1
  296. package/dist/src/constants/contextApi.mjs +3 -2
  297. package/dist/src/constants/contextApi.mjs.map +1 -1
  298. package/dist/src/constants/voiceTools.cjs +6 -6
  299. package/dist/src/constants/voiceTools.cjs.map +1 -1
  300. package/dist/src/constants/voiceTools.d.mts +3 -3
  301. package/dist/src/constants/voiceTools.mjs +4 -4
  302. package/dist/src/constants/voiceTools.mjs.map +1 -1
  303. package/dist/src/extensions/extensionFile.cjs +22 -5
  304. package/dist/src/extensions/extensionFile.cjs.map +1 -1
  305. package/dist/src/extensions/extensionFile.d.mts +17 -4
  306. package/dist/src/extensions/extensionFile.d.mts.map +1 -1
  307. package/dist/src/extensions/extensionFile.mjs +22 -6
  308. package/dist/src/extensions/extensionFile.mjs.map +1 -1
  309. package/dist/src/extensions/serverPlugin.cjs +231 -92
  310. package/dist/src/extensions/serverPlugin.cjs.map +1 -1
  311. package/dist/src/extensions/serverPlugin.d.mts +2 -2
  312. package/dist/src/extensions/serverPlugin.d.mts.map +1 -1
  313. package/dist/src/extensions/serverPlugin.mjs +232 -93
  314. package/dist/src/extensions/serverPlugin.mjs.map +1 -1
  315. package/dist/src/pi/piSessionRuntime.cjs +349 -142
  316. package/dist/src/pi/piSessionRuntime.cjs.map +1 -1
  317. package/dist/src/pi/piSessionRuntime.d.mts +18 -17
  318. package/dist/src/pi/piSessionRuntime.d.mts.map +1 -1
  319. package/dist/src/pi/piSessionRuntime.mjs +342 -135
  320. package/dist/src/pi/piSessionRuntime.mjs.map +1 -1
  321. package/dist/src/schemas/agentModel.cjs +2 -2
  322. package/dist/src/schemas/agentModel.cjs.map +1 -1
  323. package/dist/src/schemas/agentModel.d.mts +1 -1
  324. package/dist/src/schemas/agentModel.mjs +2 -2
  325. package/dist/src/schemas/agentModel.mjs.map +1 -1
  326. package/dist/src/schemas/apiContracts.d.mts +2 -2
  327. package/dist/src/schemas/apiContracts.d.mts.map +1 -1
  328. package/dist/src/schemas/askUser.cjs +4 -4
  329. package/dist/src/schemas/askUser.cjs.map +1 -1
  330. package/dist/src/schemas/askUser.d.mts +4 -4
  331. package/dist/src/schemas/askUser.d.mts.map +1 -1
  332. package/dist/src/schemas/askUser.mjs +3 -3
  333. package/dist/src/schemas/askUser.mjs.map +1 -1
  334. package/dist/src/schemas/backgroundWork.cjs +10 -10
  335. package/dist/src/schemas/backgroundWork.cjs.map +1 -1
  336. package/dist/src/schemas/backgroundWork.d.mts +9 -9
  337. package/dist/src/schemas/backgroundWork.d.mts.map +1 -1
  338. package/dist/src/schemas/backgroundWork.mjs +8 -8
  339. package/dist/src/schemas/backgroundWork.mjs.map +1 -1
  340. package/dist/src/schemas/childProcess.cjs +5 -5
  341. package/dist/src/schemas/childProcess.cjs.map +1 -1
  342. package/dist/src/schemas/childProcess.d.mts +2 -2
  343. package/dist/src/schemas/childProcess.mjs +5 -5
  344. package/dist/src/schemas/childProcess.mjs.map +1 -1
  345. package/dist/src/schemas/contextContributions.cjs +10 -10
  346. package/dist/src/schemas/contextContributions.cjs.map +1 -1
  347. package/dist/src/schemas/contextContributions.d.mts +16 -16
  348. package/dist/src/schemas/contextContributions.d.mts.map +1 -1
  349. package/dist/src/schemas/contextContributions.mjs +8 -8
  350. package/dist/src/schemas/contextContributions.mjs.map +1 -1
  351. package/dist/src/schemas/delegation.cjs +17 -17
  352. package/dist/src/schemas/delegation.cjs.map +1 -1
  353. package/dist/src/schemas/delegation.d.mts +16 -16
  354. package/dist/src/schemas/delegation.d.mts.map +1 -1
  355. package/dist/src/schemas/delegation.mjs +10 -10
  356. package/dist/src/schemas/delegation.mjs.map +1 -1
  357. package/dist/src/schemas/extensionFile.d.mts +23 -19
  358. package/dist/src/schemas/extensionFile.d.mts.map +1 -1
  359. package/dist/src/schemas/footer.cjs.map +1 -1
  360. package/dist/src/schemas/footer.d.mts +5 -5
  361. package/dist/src/schemas/footer.d.mts.map +1 -1
  362. package/dist/src/schemas/footer.mjs.map +1 -1
  363. package/dist/src/schemas/headless.cjs +37 -37
  364. package/dist/src/schemas/headless.cjs.map +1 -1
  365. package/dist/src/schemas/headless.d.mts +100 -101
  366. package/dist/src/schemas/headless.d.mts.map +1 -1
  367. package/dist/src/schemas/headless.mjs +24 -24
  368. package/dist/src/schemas/headless.mjs.map +1 -1
  369. package/dist/src/schemas/help.cjs +60 -60
  370. package/dist/src/schemas/help.cjs.map +1 -1
  371. package/dist/src/schemas/help.d.mts +43 -43
  372. package/dist/src/schemas/help.d.mts.map +1 -1
  373. package/dist/src/schemas/help.mjs +41 -41
  374. package/dist/src/schemas/help.mjs.map +1 -1
  375. package/dist/src/schemas/home.cjs +127 -0
  376. package/dist/src/schemas/home.cjs.map +1 -0
  377. package/dist/src/schemas/home.d.mts +63 -0
  378. package/dist/src/schemas/home.d.mts.map +1 -0
  379. package/dist/src/schemas/home.mjs +121 -0
  380. package/dist/src/schemas/home.mjs.map +1 -0
  381. package/dist/src/schemas/httpApiContracts.cjs +441 -0
  382. package/dist/src/schemas/httpApiContracts.cjs.map +1 -0
  383. package/dist/src/schemas/httpApiContracts.d.mts +78 -0
  384. package/dist/src/schemas/httpApiContracts.d.mts.map +1 -0
  385. package/dist/src/schemas/httpApiContracts.mjs +434 -0
  386. package/dist/src/schemas/httpApiContracts.mjs.map +1 -0
  387. package/dist/src/schemas/hubChannel.cjs +3 -0
  388. package/dist/src/schemas/hubChannel.cjs.map +1 -1
  389. package/dist/src/schemas/hubChannel.d.mts +84 -60
  390. package/dist/src/schemas/hubChannel.d.mts.map +1 -1
  391. package/dist/src/schemas/hubChannel.mjs +3 -1
  392. package/dist/src/schemas/hubChannel.mjs.map +1 -1
  393. package/dist/src/schemas/leader.cjs.map +1 -1
  394. package/dist/src/schemas/leader.d.mts +3 -3
  395. package/dist/src/schemas/leader.d.mts.map +1 -1
  396. package/dist/src/schemas/leader.mjs.map +1 -1
  397. package/dist/src/schemas/mcpBundle.d.mts +3 -3
  398. package/dist/src/schemas/mcpFacet.cjs.map +1 -1
  399. package/dist/src/schemas/mcpFacet.d.mts +22 -22
  400. package/dist/src/schemas/mcpFacet.d.mts.map +1 -1
  401. package/dist/src/schemas/mcpFacet.mjs.map +1 -1
  402. package/dist/src/schemas/mcpProjection.cjs +41 -41
  403. package/dist/src/schemas/mcpProjection.cjs.map +1 -1
  404. package/dist/src/schemas/mcpProjection.d.mts +31 -30
  405. package/dist/src/schemas/mcpProjection.d.mts.map +1 -1
  406. package/dist/src/schemas/mcpProjection.mjs +29 -29
  407. package/dist/src/schemas/mcpProjection.mjs.map +1 -1
  408. package/dist/src/schemas/mcpSession.cjs +23 -23
  409. package/dist/src/schemas/mcpSession.cjs.map +1 -1
  410. package/dist/src/schemas/mcpSession.d.mts +12 -12
  411. package/dist/src/schemas/mcpSession.d.mts.map +1 -1
  412. package/dist/src/schemas/mcpSession.mjs +18 -18
  413. package/dist/src/schemas/mcpSession.mjs.map +1 -1
  414. package/dist/src/schemas/mcpStatus.cjs +5 -5
  415. package/dist/src/schemas/mcpStatus.cjs.map +1 -1
  416. package/dist/src/schemas/mcpStatus.d.mts +4 -4
  417. package/dist/src/schemas/mcpStatus.d.mts.map +1 -1
  418. package/dist/src/schemas/mcpStatus.mjs +4 -4
  419. package/dist/src/schemas/mcpStatus.mjs.map +1 -1
  420. package/dist/src/schemas/mcpToolResolver.cjs +9 -9
  421. package/dist/src/schemas/mcpToolResolver.cjs.map +1 -1
  422. package/dist/src/schemas/mcpToolResolver.d.mts +7 -7
  423. package/dist/src/schemas/mcpToolResolver.d.mts.map +1 -1
  424. package/dist/src/schemas/mcpToolResolver.mjs +7 -7
  425. package/dist/src/schemas/mcpToolResolver.mjs.map +1 -1
  426. package/dist/src/schemas/narration.cjs +9 -9
  427. package/dist/src/schemas/narration.cjs.map +1 -1
  428. package/dist/src/schemas/narration.d.mts +5 -5
  429. package/dist/src/schemas/narration.d.mts.map +1 -1
  430. package/dist/src/schemas/narration.mjs +7 -7
  431. package/dist/src/schemas/narration.mjs.map +1 -1
  432. package/dist/src/schemas/notification.cjs +45 -45
  433. package/dist/src/schemas/notification.cjs.map +1 -1
  434. package/dist/src/schemas/notification.d.mts +22 -22
  435. package/dist/src/schemas/notification.d.mts.map +1 -1
  436. package/dist/src/schemas/notification.mjs +31 -31
  437. package/dist/src/schemas/notification.mjs.map +1 -1
  438. package/dist/src/schemas/packageApi.cjs +28 -28
  439. package/dist/src/schemas/packageApi.cjs.map +1 -1
  440. package/dist/src/schemas/packageApi.d.mts +91 -65
  441. package/dist/src/schemas/packageApi.d.mts.map +1 -1
  442. package/dist/src/schemas/packageApi.mjs +18 -18
  443. package/dist/src/schemas/packageApi.mjs.map +1 -1
  444. package/dist/src/schemas/platform.cjs +34 -0
  445. package/dist/src/schemas/platform.cjs.map +1 -0
  446. package/dist/src/schemas/platform.d.mts +75 -0
  447. package/dist/src/schemas/platform.d.mts.map +1 -0
  448. package/dist/src/schemas/platform.mjs +27 -0
  449. package/dist/src/schemas/platform.mjs.map +1 -0
  450. package/dist/src/schemas/pluginContributions.cjs.map +1 -1
  451. package/dist/src/schemas/pluginContributions.d.mts +12 -12
  452. package/dist/src/schemas/pluginContributions.d.mts.map +1 -1
  453. package/dist/src/schemas/pluginContributions.mjs.map +1 -1
  454. package/dist/src/schemas/pluginProtocol.cjs +24 -27
  455. package/dist/src/schemas/pluginProtocol.cjs.map +1 -1
  456. package/dist/src/schemas/pluginProtocol.d.mts +21 -21
  457. package/dist/src/schemas/pluginProtocol.d.mts.map +1 -1
  458. package/dist/src/schemas/pluginProtocol.mjs +18 -20
  459. package/dist/src/schemas/pluginProtocol.mjs.map +1 -1
  460. package/dist/src/schemas/profileIdentity.cjs +2 -2
  461. package/dist/src/schemas/profileIdentity.cjs.map +1 -1
  462. package/dist/src/schemas/profileIdentity.d.mts +1 -1
  463. package/dist/src/schemas/profileIdentity.mjs +2 -2
  464. package/dist/src/schemas/profileIdentity.mjs.map +1 -1
  465. package/dist/src/schemas/protocolChannelsContract.cjs +27 -0
  466. package/dist/src/schemas/protocolChannelsContract.cjs.map +1 -0
  467. package/dist/src/schemas/protocolChannelsContract.d.mts +37 -0
  468. package/dist/src/schemas/protocolChannelsContract.d.mts.map +1 -0
  469. package/dist/src/schemas/protocolChannelsContract.mjs +25 -0
  470. package/dist/src/schemas/protocolChannelsContract.mjs.map +1 -0
  471. package/dist/src/schemas/protocolContracts.cjs +168 -0
  472. package/dist/src/schemas/protocolContracts.cjs.map +1 -0
  473. package/dist/src/schemas/protocolContracts.d.mts +69 -0
  474. package/dist/src/schemas/protocolContracts.d.mts.map +1 -0
  475. package/dist/src/schemas/protocolContracts.mjs +164 -0
  476. package/dist/src/schemas/protocolContracts.mjs.map +1 -0
  477. package/dist/src/schemas/protocolHubContract.cjs +51 -0
  478. package/dist/src/schemas/protocolHubContract.cjs.map +1 -0
  479. package/dist/src/schemas/protocolHubContract.d.mts +218 -0
  480. package/dist/src/schemas/protocolHubContract.d.mts.map +1 -0
  481. package/dist/src/schemas/protocolHubContract.mjs +49 -0
  482. package/dist/src/schemas/protocolHubContract.mjs.map +1 -0
  483. package/dist/src/schemas/protocolSessionContract.cjs +22 -0
  484. package/dist/src/schemas/protocolSessionContract.cjs.map +1 -0
  485. package/dist/src/schemas/protocolSessionContract.d.mts +324 -0
  486. package/dist/src/schemas/protocolSessionContract.d.mts.map +1 -0
  487. package/dist/src/schemas/protocolSessionContract.mjs +22 -0
  488. package/dist/src/schemas/protocolSessionContract.mjs.map +1 -0
  489. package/dist/src/schemas/protocolThreadContract.cjs +21 -0
  490. package/dist/src/schemas/protocolThreadContract.cjs.map +1 -0
  491. package/dist/src/schemas/protocolThreadContract.d.mts +29 -0
  492. package/dist/src/schemas/protocolThreadContract.d.mts.map +1 -0
  493. package/dist/src/schemas/protocolThreadContract.mjs +20 -0
  494. package/dist/src/schemas/protocolThreadContract.mjs.map +1 -0
  495. package/dist/src/schemas/readiness.cjs +36 -36
  496. package/dist/src/schemas/readiness.cjs.map +1 -1
  497. package/dist/src/schemas/readiness.d.mts +37 -37
  498. package/dist/src/schemas/readiness.d.mts.map +1 -1
  499. package/dist/src/schemas/readiness.mjs +31 -31
  500. package/dist/src/schemas/readiness.mjs.map +1 -1
  501. package/dist/src/schemas/serverBundle.d.mts +5 -5
  502. package/dist/src/schemas/serverPlugin.cjs +103 -0
  503. package/dist/src/schemas/serverPlugin.cjs.map +1 -0
  504. package/dist/src/schemas/serverPlugin.d.mts +176 -0
  505. package/dist/src/schemas/serverPlugin.d.mts.map +1 -0
  506. package/dist/src/schemas/serverPlugin.mjs +95 -0
  507. package/dist/src/schemas/serverPlugin.mjs.map +1 -0
  508. package/dist/src/schemas/serverScope.cjs +37 -0
  509. package/dist/src/schemas/serverScope.cjs.map +1 -0
  510. package/dist/src/schemas/serverScope.d.mts +77 -0
  511. package/dist/src/schemas/serverScope.d.mts.map +1 -0
  512. package/dist/src/schemas/serverScope.mjs +33 -0
  513. package/dist/src/schemas/serverScope.mjs.map +1 -0
  514. package/dist/src/schemas/sessionApiContracts.cjs +320 -0
  515. package/dist/src/schemas/sessionApiContracts.cjs.map +1 -0
  516. package/dist/src/schemas/sessionApiContracts.mjs +318 -0
  517. package/dist/src/schemas/sessionApiContracts.mjs.map +1 -0
  518. package/dist/src/schemas/sessionProtocol.cjs +20 -13
  519. package/dist/src/schemas/sessionProtocol.cjs.map +1 -1
  520. package/dist/src/schemas/sessionProtocol.d.mts +37 -54
  521. package/dist/src/schemas/sessionProtocol.d.mts.map +1 -1
  522. package/dist/src/schemas/sessionProtocol.mjs +17 -8
  523. package/dist/src/schemas/sessionProtocol.mjs.map +1 -1
  524. package/dist/src/schemas/skills.cjs +16 -16
  525. package/dist/src/schemas/skills.cjs.map +1 -1
  526. package/dist/src/schemas/skills.d.mts +7 -7
  527. package/dist/src/schemas/skills.d.mts.map +1 -1
  528. package/dist/src/schemas/skills.mjs +12 -12
  529. package/dist/src/schemas/skills.mjs.map +1 -1
  530. package/dist/src/schemas/toolOverrides.cjs +9 -9
  531. package/dist/src/schemas/toolOverrides.cjs.map +1 -1
  532. package/dist/src/schemas/toolOverrides.d.mts +8 -8
  533. package/dist/src/schemas/toolOverrides.d.mts.map +1 -1
  534. package/dist/src/schemas/toolOverrides.mjs +7 -7
  535. package/dist/src/schemas/toolOverrides.mjs.map +1 -1
  536. package/dist/src/schemas/toolSurface.cjs +9 -9
  537. package/dist/src/schemas/toolSurface.cjs.map +1 -1
  538. package/dist/src/schemas/toolSurface.d.mts +13 -13
  539. package/dist/src/schemas/toolSurface.d.mts.map +1 -1
  540. package/dist/src/schemas/toolSurface.mjs +7 -7
  541. package/dist/src/schemas/toolSurface.mjs.map +1 -1
  542. package/dist/src/schemas/uiHub.cjs +9 -9
  543. package/dist/src/schemas/uiHub.cjs.map +1 -1
  544. package/dist/src/schemas/uiHub.d.mts +12 -12
  545. package/dist/src/schemas/uiHub.d.mts.map +1 -1
  546. package/dist/src/schemas/uiHub.mjs +7 -7
  547. package/dist/src/schemas/uiHub.mjs.map +1 -1
  548. package/dist/src/server/directHarnessRuntime.cjs +691 -775
  549. package/dist/src/server/directHarnessRuntime.cjs.map +1 -1
  550. package/dist/src/server/directHarnessRuntime.d.mts +5 -1
  551. package/dist/src/server/directHarnessRuntime.d.mts.map +1 -0
  552. package/dist/src/server/directHarnessRuntime.mjs +671 -754
  553. package/dist/src/server/directHarnessRuntime.mjs.map +1 -1
  554. package/dist/src/server/largeFrameLink.cjs +47 -0
  555. package/dist/src/server/largeFrameLink.cjs.map +1 -0
  556. package/dist/src/server/largeFrameLink.mjs +47 -0
  557. package/dist/src/server/largeFrameLink.mjs.map +1 -0
  558. package/dist/src/server/liveImport.cjs +1 -1
  559. package/dist/src/server/liveImport.cjs.map +1 -1
  560. package/dist/src/server/liveImport.d.mts +1 -1
  561. package/dist/src/server/liveImport.mjs +1 -1
  562. package/dist/src/server/liveImport.mjs.map +1 -1
  563. package/dist/src/server/mcpBundleLoader.cjs.map +1 -1
  564. package/dist/src/server/mcpBundleLoader.d.mts +6 -6
  565. package/dist/src/server/mcpBundleLoader.d.mts.map +1 -1
  566. package/dist/src/server/mcpBundleLoader.mjs.map +1 -1
  567. package/dist/src/server/serverPackages.cjs +60 -0
  568. package/dist/src/server/serverPackages.cjs.map +1 -0
  569. package/dist/src/server/serverPackages.d.mts +44 -0
  570. package/dist/src/server/serverPackages.d.mts.map +1 -0
  571. package/dist/src/server/serverPackages.mjs +59 -0
  572. package/dist/src/server/serverPackages.mjs.map +1 -0
  573. package/dist/src/server/serverScope.cjs +510 -0
  574. package/dist/src/server/serverScope.cjs.map +1 -0
  575. package/dist/src/server/serverScope.d.mts +123 -0
  576. package/dist/src/server/serverScope.d.mts.map +1 -0
  577. package/dist/src/server/serverScope.mjs +510 -0
  578. package/dist/src/server/serverScope.mjs.map +1 -0
  579. package/dist/src/server/sessionMcpHandler.cjs +3 -3
  580. package/dist/src/server/sessionMcpHandler.cjs.map +1 -1
  581. package/dist/src/server/sessionMcpHandler.mjs +4 -4
  582. package/dist/src/server/sessionMcpHandler.mjs.map +1 -1
  583. package/dist/src/server/sessionMcpRoutes.cjs +2 -1
  584. package/dist/src/server/sessionMcpRoutes.cjs.map +1 -1
  585. package/dist/src/server/sessionMcpRoutes.mjs +2 -1
  586. package/dist/src/server/sessionMcpRoutes.mjs.map +1 -1
  587. package/dist/src/server/threadJournals.cjs +38 -107
  588. package/dist/src/server/threadJournals.cjs.map +1 -1
  589. package/dist/src/server/threadJournals.mjs +38 -104
  590. package/dist/src/server/threadJournals.mjs.map +1 -1
  591. package/dist/src/services/apiSurfaceAssert/index.cjs +1 -1
  592. package/dist/src/services/apiSurfaceAssert/index.cjs.map +1 -1
  593. package/dist/src/services/apiSurfaceAssert/index.d.mts +6 -6
  594. package/dist/src/services/apiSurfaceAssert/index.mjs +1 -1
  595. package/dist/src/services/apiSurfaceAssert/index.mjs.map +1 -1
  596. package/dist/src/services/chatgptAuth/index.cjs +1 -220
  597. package/dist/src/services/chatgptAuth/index.cjs.map +1 -1
  598. package/dist/src/services/chatgptAuth/index.d.mts +0 -18
  599. package/dist/src/services/chatgptAuth/index.d.mts.map +1 -1
  600. package/dist/src/services/chatgptAuth/index.mjs +1 -217
  601. package/dist/src/services/chatgptAuth/index.mjs.map +1 -1
  602. package/dist/src/services/chatgptImages/index.cjs +1 -1
  603. package/dist/src/services/chatgptImages/index.cjs.map +1 -1
  604. package/dist/src/services/chatgptImages/index.mjs +1 -1
  605. package/dist/src/services/chatgptImages/index.mjs.map +1 -1
  606. package/dist/src/services/chatgptLogin/index.cjs +230 -0
  607. package/dist/src/services/chatgptLogin/index.cjs.map +1 -0
  608. package/dist/src/services/chatgptLogin/index.d.mts +21 -0
  609. package/dist/src/services/chatgptLogin/index.d.mts.map +1 -0
  610. package/dist/src/services/chatgptLogin/index.mjs +227 -0
  611. package/dist/src/services/chatgptLogin/index.mjs.map +1 -0
  612. package/dist/src/services/chatgptWebSearch/index.cjs +1 -1
  613. package/dist/src/services/chatgptWebSearch/index.cjs.map +1 -1
  614. package/dist/src/services/chatgptWebSearch/index.mjs +1 -1
  615. package/dist/src/services/chatgptWebSearch/index.mjs.map +1 -1
  616. package/dist/src/services/contextContributions/index.cjs +8 -8
  617. package/dist/src/services/contextContributions/index.cjs.map +1 -1
  618. package/dist/src/services/contextContributions/index.d.mts +3 -3
  619. package/dist/src/services/contextContributions/index.d.mts.map +1 -1
  620. package/dist/src/services/contextContributions/index.mjs +8 -8
  621. package/dist/src/services/contextContributions/index.mjs.map +1 -1
  622. package/dist/src/services/devProxyStore/devProxyRecords.cjs +59 -0
  623. package/dist/src/services/devProxyStore/devProxyRecords.cjs.map +1 -0
  624. package/dist/src/services/devProxyStore/devProxyRecords.mjs +56 -0
  625. package/dist/src/services/devProxyStore/devProxyRecords.mjs.map +1 -0
  626. package/dist/src/services/devProxyStore/index.cjs +7 -101
  627. package/dist/src/services/devProxyStore/index.cjs.map +1 -1
  628. package/dist/src/services/devProxyStore/index.mjs +7 -101
  629. package/dist/src/services/devProxyStore/index.mjs.map +1 -1
  630. package/dist/src/services/devProxyStore/sync.cjs +66 -0
  631. package/dist/src/services/devProxyStore/sync.cjs.map +1 -0
  632. package/dist/src/services/devProxyStore/sync.mjs +63 -0
  633. package/dist/src/services/devProxyStore/sync.mjs.map +1 -0
  634. package/dist/src/services/durableNavigation/docs.cjs +15 -0
  635. package/dist/src/services/durableNavigation/docs.cjs.map +1 -0
  636. package/dist/src/services/durableNavigation/docs.mjs +16 -0
  637. package/dist/src/services/durableNavigation/docs.mjs.map +1 -0
  638. package/dist/src/services/durableNavigation/index.cjs +3 -18
  639. package/dist/src/services/durableNavigation/index.cjs.map +1 -1
  640. package/dist/src/services/durableNavigation/index.mjs +2 -17
  641. package/dist/src/services/durableNavigation/index.mjs.map +1 -1
  642. package/dist/src/services/durableQueue/docs.cjs +12 -0
  643. package/dist/src/services/durableQueue/docs.cjs.map +1 -0
  644. package/dist/src/services/durableQueue/docs.mjs +13 -0
  645. package/dist/src/services/durableQueue/docs.mjs.map +1 -0
  646. package/dist/src/services/durableQueue/index.cjs +151 -0
  647. package/dist/src/services/durableQueue/index.cjs.map +1 -0
  648. package/dist/src/services/durableQueue/index.mjs +149 -0
  649. package/dist/src/services/durableQueue/index.mjs.map +1 -0
  650. package/dist/src/services/durableRequestReceipts/docs.cjs +11 -0
  651. package/dist/src/services/durableRequestReceipts/docs.cjs.map +1 -0
  652. package/dist/src/services/durableRequestReceipts/docs.mjs +12 -0
  653. package/dist/src/services/durableRequestReceipts/docs.mjs.map +1 -0
  654. package/dist/src/services/{requestReceipts → durableRequestReceipts}/index.cjs +10 -16
  655. package/dist/src/services/durableRequestReceipts/index.cjs.map +1 -0
  656. package/dist/src/services/durableRequestReceipts/index.d.mts +12 -0
  657. package/dist/src/services/durableRequestReceipts/index.d.mts.map +1 -0
  658. package/dist/src/services/{requestReceipts → durableRequestReceipts}/index.mjs +7 -13
  659. package/dist/src/services/durableRequestReceipts/index.mjs.map +1 -0
  660. package/dist/src/services/durableSession/docs.cjs +65 -0
  661. package/dist/src/services/durableSession/docs.cjs.map +1 -0
  662. package/dist/src/services/durableSession/docs.d.mts +17 -0
  663. package/dist/src/services/durableSession/docs.d.mts.map +1 -0
  664. package/dist/src/services/durableSession/docs.mjs +60 -0
  665. package/dist/src/services/durableSession/docs.mjs.map +1 -0
  666. package/dist/src/services/durableSession/index.cjs +21 -0
  667. package/dist/src/services/durableSession/index.cjs.map +1 -0
  668. package/dist/src/services/durableSession/index.d.mts +13 -0
  669. package/dist/src/services/durableSession/index.d.mts.map +1 -0
  670. package/dist/src/services/durableSession/index.mjs +20 -0
  671. package/dist/src/services/durableSession/index.mjs.map +1 -0
  672. package/dist/src/services/durableSubagents/docs.cjs +15 -0
  673. package/dist/src/services/durableSubagents/docs.cjs.map +1 -0
  674. package/dist/src/services/durableSubagents/docs.mjs +16 -0
  675. package/dist/src/services/durableSubagents/docs.mjs.map +1 -0
  676. package/dist/src/services/durableSubagents/extension.cjs +11 -0
  677. package/dist/src/services/durableSubagents/extension.cjs.map +1 -0
  678. package/dist/src/services/durableSubagents/extension.mjs +12 -0
  679. package/dist/src/services/durableSubagents/extension.mjs.map +1 -0
  680. package/dist/src/services/durableSubagents/index.cjs +95 -0
  681. package/dist/src/services/durableSubagents/index.cjs.map +1 -0
  682. package/dist/src/services/durableSubagents/index.mjs +90 -0
  683. package/dist/src/services/durableSubagents/index.mjs.map +1 -0
  684. package/dist/src/services/durableSubagents/tasks.cjs +25 -0
  685. package/dist/src/services/durableSubagents/tasks.cjs.map +1 -0
  686. package/dist/src/services/durableSubagents/tasks.mjs +26 -0
  687. package/dist/src/services/durableSubagents/tasks.mjs.map +1 -0
  688. package/dist/src/services/headlessClient/index.cjs +20 -13
  689. package/dist/src/services/headlessClient/index.cjs.map +1 -1
  690. package/dist/src/services/headlessClient/index.mjs +21 -14
  691. package/dist/src/services/headlessClient/index.mjs.map +1 -1
  692. package/dist/src/services/historyOwnership/type.d.mts +15 -0
  693. package/dist/src/services/historyOwnership/type.d.mts.map +1 -0
  694. package/dist/src/services/hubChannelHarness/index.cjs +2 -2
  695. package/dist/src/services/hubChannelHarness/index.cjs.map +1 -1
  696. package/dist/src/services/hubChannelHarness/index.d.mts +8 -8
  697. package/dist/src/services/hubChannelHarness/index.d.mts.map +1 -1
  698. package/dist/src/services/hubChannelHarness/index.mjs +2 -2
  699. package/dist/src/services/hubChannelHarness/index.mjs.map +1 -1
  700. package/dist/src/services/json/core.cjs +30 -0
  701. package/dist/src/services/json/core.cjs.map +1 -0
  702. package/dist/src/services/json/core.d.mts +21 -0
  703. package/dist/src/services/json/core.d.mts.map +1 -0
  704. package/dist/src/services/json/core.mjs +26 -0
  705. package/dist/src/services/json/core.mjs.map +1 -0
  706. package/dist/src/services/json/sync.cjs +48 -0
  707. package/dist/src/services/json/sync.cjs.map +1 -0
  708. package/dist/src/services/json/sync.d.mts +22 -0
  709. package/dist/src/services/json/sync.d.mts.map +1 -0
  710. package/dist/src/services/json/sync.mjs +43 -0
  711. package/dist/src/services/json/sync.mjs.map +1 -0
  712. package/dist/src/services/kernel/index.cjs +2 -2
  713. package/dist/src/services/kernel/index.cjs.map +1 -1
  714. package/dist/src/services/kernel/index.d.mts +3 -3
  715. package/dist/src/services/kernel/index.d.mts.map +1 -1
  716. package/dist/src/services/kernel/index.mjs +2 -2
  717. package/dist/src/services/kernel/index.mjs.map +1 -1
  718. package/dist/src/services/nativeChildTools/index.cjs +16 -0
  719. package/dist/src/services/nativeChildTools/index.cjs.map +1 -0
  720. package/dist/src/services/nativeChildTools/index.mjs +16 -0
  721. package/dist/src/services/nativeChildTools/index.mjs.map +1 -0
  722. package/dist/src/services/nodeHost/index.cjs +30 -0
  723. package/dist/src/services/nodeHost/index.cjs.map +1 -0
  724. package/dist/src/services/nodeHost/index.d.mts +16 -0
  725. package/dist/src/services/nodeHost/index.d.mts.map +1 -0
  726. package/dist/src/services/nodeHost/index.mjs +27 -0
  727. package/dist/src/services/nodeHost/index.mjs.map +1 -0
  728. package/dist/src/services/nodeModelDependencies/index.cjs +89 -0
  729. package/dist/src/services/nodeModelDependencies/index.cjs.map +1 -0
  730. package/dist/src/services/nodeModelDependencies/index.mjs +86 -0
  731. package/dist/src/services/nodeModelDependencies/index.mjs.map +1 -0
  732. package/dist/src/services/openSessionRegistry/index.cjs +6 -128
  733. package/dist/src/services/openSessionRegistry/index.cjs.map +1 -1
  734. package/dist/src/services/openSessionRegistry/index.d.mts +5 -36
  735. package/dist/src/services/openSessionRegistry/index.mjs +6 -128
  736. package/dist/src/services/openSessionRegistry/index.mjs.map +1 -1
  737. package/dist/src/services/openSessionRegistry/openSessionRecords.cjs +87 -0
  738. package/dist/src/services/openSessionRegistry/openSessionRecords.cjs.map +1 -0
  739. package/dist/src/services/openSessionRegistry/openSessionRecords.d.mts +30 -0
  740. package/dist/src/services/openSessionRegistry/openSessionRecords.d.mts.map +1 -0
  741. package/dist/src/services/openSessionRegistry/openSessionRecords.mjs +81 -0
  742. package/dist/src/services/openSessionRegistry/openSessionRecords.mjs.map +1 -0
  743. package/dist/src/services/openSessionRegistry/sync.cjs +71 -0
  744. package/dist/src/services/openSessionRegistry/sync.cjs.map +1 -0
  745. package/dist/src/services/openSessionRegistry/sync.d.mts +14 -0
  746. package/dist/src/services/openSessionRegistry/sync.d.mts.map +1 -0
  747. package/dist/src/services/openSessionRegistry/sync.mjs +68 -0
  748. package/dist/src/services/openSessionRegistry/sync.mjs.map +1 -0
  749. package/dist/src/services/packageApiHarness/index.cjs +1 -1
  750. package/dist/src/services/packageApiHarness/index.cjs.map +1 -1
  751. package/dist/src/services/packageApiHarness/index.d.mts +6 -6
  752. package/dist/src/services/packageApiHarness/index.d.mts.map +1 -1
  753. package/dist/src/services/packageApiHarness/index.mjs +2 -2
  754. package/dist/src/services/packageApiHarness/index.mjs.map +1 -1
  755. package/dist/src/services/piArgs/index.cjs +53 -0
  756. package/dist/src/services/piArgs/index.cjs.map +1 -0
  757. package/dist/src/services/piArgs/index.d.mts +6 -0
  758. package/dist/src/services/piArgs/index.d.mts.map +1 -0
  759. package/dist/src/services/piArgs/index.mjs +53 -0
  760. package/dist/src/services/piArgs/index.mjs.map +1 -0
  761. package/dist/src/services/piExtensionHost/index.cjs +47 -39
  762. package/dist/src/services/piExtensionHost/index.cjs.map +1 -1
  763. package/dist/src/services/piExtensionHost/index.d.mts +83 -0
  764. package/dist/src/services/piExtensionHost/index.d.mts.map +1 -0
  765. package/dist/src/services/piExtensionHost/index.mjs +47 -38
  766. package/dist/src/services/piExtensionHost/index.mjs.map +1 -1
  767. package/dist/src/services/piHelpTools/index.cjs +5 -5
  768. package/dist/src/services/piHelpTools/index.cjs.map +1 -1
  769. package/dist/src/services/piHelpTools/index.d.mts.map +1 -1
  770. package/dist/src/services/piHelpTools/index.mjs +7 -7
  771. package/dist/src/services/piHelpTools/index.mjs.map +1 -1
  772. package/dist/src/services/piMessages/index.cjs +106 -0
  773. package/dist/src/services/piMessages/index.cjs.map +1 -0
  774. package/dist/src/services/piMessages/index.mjs +105 -0
  775. package/dist/src/services/piMessages/index.mjs.map +1 -0
  776. package/dist/src/services/piSessionEntries/index.cjs +4 -4
  777. package/dist/src/services/piSessionEntries/index.cjs.map +1 -1
  778. package/dist/src/services/piSessionEntries/index.mjs +3 -3
  779. package/dist/src/services/piSessionEntries/index.mjs.map +1 -1
  780. package/dist/src/services/piSettings/core.cjs +308 -0
  781. package/dist/src/services/piSettings/core.cjs.map +1 -0
  782. package/dist/src/services/piSettings/core.d.mts +102 -0
  783. package/dist/src/services/piSettings/core.d.mts.map +1 -0
  784. package/dist/src/services/piSettings/core.mjs +276 -0
  785. package/dist/src/services/piSettings/core.mjs.map +1 -0
  786. package/dist/src/services/piSettings/sync.cjs +119 -0
  787. package/dist/src/services/piSettings/sync.cjs.map +1 -0
  788. package/dist/src/services/piSettings/sync.d.mts +44 -0
  789. package/dist/src/services/piSettings/sync.d.mts.map +1 -0
  790. package/dist/src/services/piSettings/sync.mjs +110 -0
  791. package/dist/src/services/piSettings/sync.mjs.map +1 -0
  792. package/dist/src/services/piSummary/index.cjs +7 -0
  793. package/dist/src/services/piSummary/index.cjs.map +1 -0
  794. package/dist/src/services/piSummary/index.mjs +7 -0
  795. package/dist/src/services/piSummary/index.mjs.map +1 -0
  796. package/dist/src/services/platformFiles/index.cjs +44 -0
  797. package/dist/src/services/platformFiles/index.cjs.map +1 -0
  798. package/dist/src/services/platformFiles/index.d.mts +16 -0
  799. package/dist/src/services/platformFiles/index.d.mts.map +1 -0
  800. package/dist/src/services/platformFiles/index.mjs +39 -0
  801. package/dist/src/services/platformFiles/index.mjs.map +1 -0
  802. package/dist/src/services/pluginLifecycle/index.cjs +19 -13
  803. package/dist/src/services/pluginLifecycle/index.cjs.map +1 -1
  804. package/dist/src/services/pluginLifecycle/index.d.mts +2 -0
  805. package/dist/src/services/pluginLifecycle/index.d.mts.map +1 -1
  806. package/dist/src/services/pluginLifecycle/index.mjs +19 -14
  807. package/dist/src/services/pluginLifecycle/index.mjs.map +1 -1
  808. package/dist/src/services/poPackage/core.cjs +73 -0
  809. package/dist/src/services/poPackage/core.cjs.map +1 -0
  810. package/dist/src/services/poPackage/core.d.mts +32 -0
  811. package/dist/src/services/poPackage/core.d.mts.map +1 -0
  812. package/dist/src/services/poPackage/core.mjs +66 -0
  813. package/dist/src/services/poPackage/core.mjs.map +1 -0
  814. package/dist/src/services/poPackage/sync.cjs +55 -0
  815. package/dist/src/services/poPackage/sync.cjs.map +1 -0
  816. package/dist/src/services/poPackage/sync.d.mts +21 -0
  817. package/dist/src/services/poPackage/sync.d.mts.map +1 -0
  818. package/dist/src/services/poPackage/sync.mjs +50 -0
  819. package/dist/src/services/poPackage/sync.mjs.map +1 -0
  820. package/dist/src/services/providerAuth/index.cjs +11 -7
  821. package/dist/src/services/providerAuth/index.cjs.map +1 -1
  822. package/dist/src/services/providerAuth/index.mjs +11 -7
  823. package/dist/src/services/providerAuth/index.mjs.map +1 -1
  824. package/dist/src/services/publicFileShares/index.cjs +1 -1
  825. package/dist/src/services/publicFileShares/index.cjs.map +1 -1
  826. package/dist/src/services/publicFileShares/index.d.mts +2 -2
  827. package/dist/src/services/publicFileShares/index.mjs +2 -2
  828. package/dist/src/services/publicFileShares/index.mjs.map +1 -1
  829. package/dist/src/services/remoteAccess/index.d.mts +1 -0
  830. package/dist/src/services/remoteAccess/index.d.mts.map +1 -1
  831. package/dist/src/services/remoteAccessStore/index.cjs +8 -190
  832. package/dist/src/services/remoteAccessStore/index.cjs.map +1 -1
  833. package/dist/src/services/remoteAccessStore/index.d.mts +2 -0
  834. package/dist/src/services/remoteAccessStore/index.mjs +7 -187
  835. package/dist/src/services/remoteAccessStore/index.mjs.map +1 -1
  836. package/dist/src/services/remoteAccessStore/remoteAccessRecords.cjs +98 -0
  837. package/dist/src/services/remoteAccessStore/remoteAccessRecords.cjs.map +1 -0
  838. package/dist/src/services/remoteAccessStore/remoteAccessRecords.mjs +88 -0
  839. package/dist/src/services/remoteAccessStore/remoteAccessRecords.mjs.map +1 -0
  840. package/dist/src/services/remoteAccessStore/sync.cjs +111 -0
  841. package/dist/src/services/remoteAccessStore/sync.cjs.map +1 -0
  842. package/dist/src/services/remoteAccessStore/sync.mjs +108 -0
  843. package/dist/src/services/remoteAccessStore/sync.mjs.map +1 -0
  844. package/dist/src/services/runtimeIdentity/sync.cjs +23 -0
  845. package/dist/src/services/runtimeIdentity/sync.cjs.map +1 -0
  846. package/dist/src/services/runtimeIdentity/sync.d.mts +9 -0
  847. package/dist/src/services/runtimeIdentity/sync.d.mts.map +1 -0
  848. package/dist/src/services/runtimeIdentity/sync.mjs +20 -0
  849. package/dist/src/services/runtimeIdentity/sync.mjs.map +1 -0
  850. package/dist/src/services/serialRunner/index.cjs +25 -0
  851. package/dist/src/services/serialRunner/index.cjs.map +1 -0
  852. package/dist/src/services/serialRunner/index.d.mts +10 -0
  853. package/dist/src/services/serialRunner/index.d.mts.map +1 -0
  854. package/dist/src/services/serialRunner/index.mjs +25 -0
  855. package/dist/src/services/serialRunner/index.mjs.map +1 -0
  856. package/dist/src/services/{serverFacet → serverHost}/index.cjs +5 -5
  857. package/dist/src/services/serverHost/index.cjs.map +1 -0
  858. package/dist/src/services/serverHost/index.d.mts +31 -0
  859. package/dist/src/services/serverHost/index.d.mts.map +1 -0
  860. package/dist/src/services/{serverFacet → serverHost}/index.mjs +5 -5
  861. package/dist/src/services/serverHost/index.mjs.map +1 -0
  862. package/dist/src/services/sessionAttachments/index.cjs +4 -3
  863. package/dist/src/services/sessionAttachments/index.cjs.map +1 -1
  864. package/dist/src/services/sessionAttachments/index.d.mts +1 -6
  865. package/dist/src/services/sessionAttachments/index.d.mts.map +1 -1
  866. package/dist/src/services/sessionAttachments/index.mjs +3 -2
  867. package/dist/src/services/sessionAttachments/index.mjs.map +1 -1
  868. package/dist/src/services/sessionAttachments/type.d.mts +9 -0
  869. package/dist/src/services/sessionAttachments/type.d.mts.map +1 -0
  870. package/dist/src/services/sessionFiles/index.cjs +96 -0
  871. package/dist/src/services/sessionFiles/index.cjs.map +1 -0
  872. package/dist/src/services/sessionFiles/index.d.mts +33 -0
  873. package/dist/src/services/sessionFiles/index.d.mts.map +1 -0
  874. package/dist/src/services/sessionFiles/index.mjs +89 -0
  875. package/dist/src/services/sessionFiles/index.mjs.map +1 -0
  876. package/dist/src/services/sessionFiles/sessionDirectory.cjs +66 -0
  877. package/dist/src/services/sessionFiles/sessionDirectory.cjs.map +1 -0
  878. package/dist/src/services/sessionFiles/sessionDirectory.mjs +62 -0
  879. package/dist/src/services/sessionFiles/sessionDirectory.mjs.map +1 -0
  880. package/dist/src/services/sessionGitStatus/index.cjs +31 -33
  881. package/dist/src/services/sessionGitStatus/index.cjs.map +1 -1
  882. package/dist/src/services/sessionGitStatus/index.mjs +31 -33
  883. package/dist/src/services/sessionGitStatus/index.mjs.map +1 -1
  884. package/dist/src/services/sessionPresentation/index.cjs +3 -27
  885. package/dist/src/services/sessionPresentation/index.cjs.map +1 -1
  886. package/dist/src/services/sessionPresentation/index.mjs +3 -27
  887. package/dist/src/services/sessionPresentation/index.mjs.map +1 -1
  888. package/dist/src/services/skillPrompt/index.cjs +11 -0
  889. package/dist/src/services/skillPrompt/index.cjs.map +1 -0
  890. package/dist/src/services/skillPrompt/index.mjs +11 -0
  891. package/dist/src/services/skillPrompt/index.mjs.map +1 -0
  892. package/dist/src/services/sqliteSessionHistory/index.cjs +44 -30
  893. package/dist/src/services/sqliteSessionHistory/index.cjs.map +1 -1
  894. package/dist/src/services/sqliteSessionHistory/index.d.mts +7 -4
  895. package/dist/src/services/sqliteSessionHistory/index.d.mts.map +1 -1
  896. package/dist/src/services/sqliteSessionHistory/index.mjs +43 -28
  897. package/dist/src/services/sqliteSessionHistory/index.mjs.map +1 -1
  898. package/dist/src/services/sqliteTranscriptReader/index.cjs +21 -45
  899. package/dist/src/services/sqliteTranscriptReader/index.cjs.map +1 -1
  900. package/dist/src/services/sqliteTranscriptReader/index.d.mts +3 -2
  901. package/dist/src/services/sqliteTranscriptReader/index.d.mts.map +1 -1
  902. package/dist/src/services/sqliteTranscriptReader/index.mjs +16 -38
  903. package/dist/src/services/sqliteTranscriptReader/index.mjs.map +1 -1
  904. package/dist/src/services/testMode/index.cjs +162 -0
  905. package/dist/src/services/testMode/index.cjs.map +1 -0
  906. package/dist/src/services/testMode/index.d.mts +17 -0
  907. package/dist/src/services/testMode/index.d.mts.map +1 -0
  908. package/dist/src/services/testMode/index.mjs +155 -0
  909. package/dist/src/services/testMode/index.mjs.map +1 -0
  910. package/dist/src/services/toolOverrides/index.cjs +6 -6
  911. package/dist/src/services/toolOverrides/index.cjs.map +1 -1
  912. package/dist/src/services/toolOverrides/index.d.mts +3 -3
  913. package/dist/src/services/toolOverrides/index.d.mts.map +1 -1
  914. package/dist/src/services/toolOverrides/index.mjs +6 -6
  915. package/dist/src/services/toolOverrides/index.mjs.map +1 -1
  916. package/dist/src/services/toolPrompt/index.d.mts +17 -0
  917. package/dist/src/services/toolPrompt/index.d.mts.map +1 -0
  918. package/dist/src/services/toolSurface/index.cjs +3 -3
  919. package/dist/src/services/toolSurface/index.cjs.map +1 -1
  920. package/dist/src/services/toolSurface/index.d.mts +3 -3
  921. package/dist/src/services/toolSurface/index.d.mts.map +1 -1
  922. package/dist/src/services/toolSurface/index.mjs +4 -4
  923. package/dist/src/services/toolSurface/index.mjs.map +1 -1
  924. package/dist/src/services/traceContext/index.cjs.map +1 -1
  925. package/dist/src/services/traceContext/index.mjs.map +1 -1
  926. package/dist/src/services/transcriptPages/index.cjs +159 -33
  927. package/dist/src/services/transcriptPages/index.cjs.map +1 -1
  928. package/dist/src/services/transcriptPages/index.mjs +158 -34
  929. package/dist/src/services/transcriptPages/index.mjs.map +1 -1
  930. package/dist/src/services/voiceToolsContract/index.cjs +7 -7
  931. package/dist/src/services/voiceToolsContract/index.cjs.map +1 -1
  932. package/dist/src/services/voiceToolsContract/index.d.mts +4 -4
  933. package/dist/src/services/voiceToolsContract/index.d.mts.map +1 -1
  934. package/dist/src/services/voiceToolsContract/index.mjs +7 -7
  935. package/dist/src/services/voiceToolsContract/index.mjs.map +1 -1
  936. package/dist/src/services/workspaceRegistry/index.cjs +9 -179
  937. package/dist/src/services/workspaceRegistry/index.cjs.map +1 -1
  938. package/dist/src/services/workspaceRegistry/index.d.mts +5 -47
  939. package/dist/src/services/workspaceRegistry/index.mjs +7 -176
  940. package/dist/src/services/workspaceRegistry/index.mjs.map +1 -1
  941. package/dist/src/services/workspaceRegistry/sync.cjs +148 -0
  942. package/dist/src/services/workspaceRegistry/sync.cjs.map +1 -0
  943. package/dist/src/services/workspaceRegistry/sync.d.mts +34 -0
  944. package/dist/src/services/workspaceRegistry/sync.d.mts.map +1 -0
  945. package/dist/src/services/workspaceRegistry/sync.mjs +140 -0
  946. package/dist/src/services/workspaceRegistry/sync.mjs.map +1 -0
  947. package/dist/src/services/workspaceRegistry/workspaceRecords.cjs +114 -0
  948. package/dist/src/services/workspaceRegistry/workspaceRecords.cjs.map +1 -0
  949. package/dist/src/services/workspaceRegistry/workspaceRecords.d.mts +31 -0
  950. package/dist/src/services/workspaceRegistry/workspaceRecords.d.mts.map +1 -0
  951. package/dist/src/services/workspaceRegistry/workspaceRecords.mjs +101 -0
  952. package/dist/src/services/workspaceRegistry/workspaceRecords.mjs.map +1 -0
  953. package/dist/src/systems/child/adapters/headlessChildSessionService.cjs +339 -202
  954. package/dist/src/systems/child/adapters/headlessChildSessionService.cjs.map +1 -1
  955. package/dist/src/systems/child/adapters/headlessChildSessionService.d.mts +16 -21
  956. package/dist/src/systems/child/adapters/headlessChildSessionService.d.mts.map +1 -1
  957. package/dist/src/systems/child/adapters/headlessChildSessionService.mjs +329 -191
  958. package/dist/src/systems/child/adapters/headlessChildSessionService.mjs.map +1 -1
  959. package/dist/src/systems/child/services/childSession/index.cjs +94 -20
  960. package/dist/src/systems/child/services/childSession/index.cjs.map +1 -1
  961. package/dist/src/systems/child/services/childSession/index.d.mts +12 -3
  962. package/dist/src/systems/child/services/childSession/index.d.mts.map +1 -1
  963. package/dist/src/systems/child/services/childSession/index.mjs +94 -20
  964. package/dist/src/systems/child/services/childSession/index.mjs.map +1 -1
  965. package/dist/src/systems/child/types/childSession.cjs +33 -13
  966. package/dist/src/systems/child/types/childSession.cjs.map +1 -1
  967. package/dist/src/systems/child/types/childSession.d.mts +143 -80
  968. package/dist/src/systems/child/types/childSession.d.mts.map +1 -1
  969. package/dist/src/systems/child/types/childSession.mjs +24 -9
  970. package/dist/src/systems/child/types/childSession.mjs.map +1 -1
  971. package/dist/src/systems/main/adapters/headlessHost.cjs +30 -27
  972. package/dist/src/systems/main/adapters/headlessHost.cjs.map +1 -1
  973. package/dist/src/systems/main/adapters/headlessHost.d.mts +22 -22
  974. package/dist/src/systems/main/adapters/headlessHost.d.mts.map +1 -1
  975. package/dist/src/systems/main/adapters/headlessHost.mjs +33 -30
  976. package/dist/src/systems/main/adapters/headlessHost.mjs.map +1 -1
  977. package/dist/src/systems/main/adapters/headlessSessionHost.cjs +248 -229
  978. package/dist/src/systems/main/adapters/headlessSessionHost.cjs.map +1 -1
  979. package/dist/src/systems/main/adapters/headlessSessionHost.d.mts +4 -5
  980. package/dist/src/systems/main/adapters/headlessSessionHost.d.mts.map +1 -1
  981. package/dist/src/systems/main/adapters/headlessSessionHost.mjs +239 -219
  982. package/dist/src/systems/main/adapters/headlessSessionHost.mjs.map +1 -1
  983. package/dist/src/systems/main/types/headlessHost.d.mts +16 -14
  984. package/dist/src/systems/main/types/headlessHost.d.mts.map +1 -1
  985. package/dist/src/testing/pi/testHost.cjs +2 -2
  986. package/dist/src/testing/pi/testHost.cjs.map +1 -1
  987. package/dist/src/testing/pi/testHost.d.mts +3 -2
  988. package/dist/src/testing/pi/testHost.mjs +3 -3
  989. package/dist/src/testing/pi/testHost.mjs.map +1 -1
  990. package/dist/src/types/config.d.mts +1 -1
  991. package/dist/src/types/config.d.mts.map +1 -1
  992. package/dist/src/types/kernel.d.mts +3 -3
  993. package/dist/src/types/server/directHarnessRuntime.d.mts +54 -25
  994. package/dist/src/types/server/directHarnessRuntime.d.mts.map +1 -1
  995. package/dist/src/types/server/sessionToolSurface.d.mts +9 -9
  996. package/dist/src/web/services/apiClient/index.d.mts +1 -0
  997. package/dist/src/web/services/apiPaths/index.cjs.map +1 -1
  998. package/dist/src/web/services/apiPaths/index.d.mts +1 -1
  999. package/dist/src/web/services/apiPaths/index.mjs.map +1 -1
  1000. package/dist/src/web/services/mcpWidget.cjs.map +1 -1
  1001. package/dist/src/web/services/mcpWidget.d.mts +2 -2
  1002. package/dist/src/web/services/mcpWidget.d.mts.map +1 -1
  1003. package/dist/src/web/services/mcpWidget.mjs.map +1 -1
  1004. package/dist/src/web/services/testing/templateRail.cjs +3 -0
  1005. package/dist/src/web/services/testing/templateRail.cjs.map +1 -1
  1006. package/dist/src/web/services/testing/templateRail.mjs +3 -0
  1007. package/dist/src/web/services/testing/templateRail.mjs.map +1 -1
  1008. package/dist/src/web/types/mcpWidget.d.mts +1 -1
  1009. package/dist/src/web/types/nativeTemplate.d.mts +1 -1
  1010. package/dist/src/web/types/nativeTemplate.d.mts.map +1 -1
  1011. package/dist/src/web/types/template.d.mts +8 -0
  1012. package/dist/src/web/types/template.d.mts.map +1 -1
  1013. package/dist/src/web/types/webPlugin.d.mts +17 -5
  1014. package/dist/src/web/types/webPlugin.d.mts.map +1 -1
  1015. package/dist/testMode.cjs +4 -0
  1016. package/dist/testMode.d.mts +2 -0
  1017. package/dist/testMode.mjs +1 -0
  1018. package/dist/testing.cjs +1 -1
  1019. package/dist/testing.d.mts +2 -2
  1020. package/dist/testing.mjs +2 -2
  1021. package/dist/toolInventory.cjs.map +1 -1
  1022. package/dist/toolInventory.mjs.map +1 -1
  1023. package/dist/toolNames.mjs +1 -2
  1024. package/dist/toolOverrides.cjs +4 -4
  1025. package/dist/toolOverrides.d.mts +3 -3
  1026. package/dist/toolOverrides.mjs +3 -3
  1027. package/dist/toolSurface.cjs +4 -4
  1028. package/dist/toolSurface.d.mts +3 -3
  1029. package/dist/toolSurface.mjs +3 -3
  1030. package/dist/transition.cjs +3 -3
  1031. package/dist/transition.d.cjs +3 -3
  1032. package/dist/transition.d.mts +2 -2
  1033. package/dist/transition.mjs +1 -2
  1034. package/dist/transitionClassifier.cjs.map +1 -1
  1035. package/dist/transitionClassifier.d.mts +2 -2
  1036. package/dist/transitionClassifier.d.mts.map +1 -1
  1037. package/dist/transitionClassifier.mjs.map +1 -1
  1038. package/dist/transitionCoordinator.cjs +3 -3
  1039. package/dist/transitionCoordinator.cjs.map +1 -1
  1040. package/dist/transitionCoordinator.d.mts +4 -4
  1041. package/dist/transitionCoordinator.d.mts.map +1 -1
  1042. package/dist/transitionCoordinator.mjs +3 -3
  1043. package/dist/transitionCoordinator.mjs.map +1 -1
  1044. package/dist/typesContextApi.d.mts +2 -1
  1045. package/dist/typesContextApi.d.mts.map +1 -1
  1046. package/dist/uiHub.cjs +3 -3
  1047. package/dist/uiHub.d.mts +2 -2
  1048. package/dist/uiHub.mjs +1 -2
  1049. package/dist/voiceTools.cjs +5 -5
  1050. package/dist/voiceTools.d.mts +3 -3
  1051. package/dist/voiceTools.mjs +3 -3
  1052. package/dist/web.cjs +8 -0
  1053. package/dist/web.d.mts +3 -2
  1054. package/dist/web.mjs +2 -1
  1055. package/dist/webCompositions.cjs.map +1 -1
  1056. package/dist/webCompositions.d.mts +7 -7
  1057. package/dist/webCompositions.d.mts.map +1 -1
  1058. package/dist/webCompositions.mjs.map +1 -1
  1059. package/licenses/Codex-Apache-2.0.txt +201 -0
  1060. package/package.json +58 -53
  1061. package/dist/doomPackage.cjs +0 -61
  1062. package/dist/doomPackage.cjs.map +0 -1
  1063. package/dist/doomPackage.d.mts +0 -17
  1064. package/dist/doomPackage.d.mts.map +0 -1
  1065. package/dist/doomPackage.mjs +0 -54
  1066. package/dist/doomPackage.mjs.map +0 -1
  1067. package/dist/jsonlSessionRepo.cjs +0 -44
  1068. package/dist/jsonlSessionRepo.cjs.map +0 -1
  1069. package/dist/jsonlSessionRepo.d.mts +0 -7
  1070. package/dist/jsonlSessionRepo.d.mts.map +0 -1
  1071. package/dist/jsonlSessionRepo.mjs +0 -42
  1072. package/dist/jsonlSessionRepo.mjs.map +0 -1
  1073. package/dist/runtimeJson.cjs.map +0 -1
  1074. package/dist/runtimeJson.d.mts.map +0 -1
  1075. package/dist/runtimeJson.mjs.map +0 -1
  1076. package/dist/runtimePiSettings.cjs.map +0 -1
  1077. package/dist/runtimePiSettings.d.mts.map +0 -1
  1078. package/dist/runtimePiSettings.mjs.map +0 -1
  1079. package/dist/serverFacet.cjs +0 -34
  1080. package/dist/serverFacet.d.mts +0 -10
  1081. package/dist/serverFacet.mjs +0 -9
  1082. package/dist/src/pi/piWebSocketListener.cjs +0 -115
  1083. package/dist/src/pi/piWebSocketListener.cjs.map +0 -1
  1084. package/dist/src/pi/piWebSocketListener.mjs +0 -115
  1085. package/dist/src/pi/piWebSocketListener.mjs.map +0 -1
  1086. package/dist/src/schemas/serverFacet.cjs +0 -111
  1087. package/dist/src/schemas/serverFacet.cjs.map +0 -1
  1088. package/dist/src/schemas/serverFacet.d.mts +0 -152
  1089. package/dist/src/schemas/serverFacet.d.mts.map +0 -1
  1090. package/dist/src/schemas/serverFacet.mjs +0 -101
  1091. package/dist/src/schemas/serverFacet.mjs.map +0 -1
  1092. package/dist/src/schemas/sessionUpdates.d.mts +0 -34
  1093. package/dist/src/schemas/sessionUpdates.d.mts.map +0 -1
  1094. package/dist/src/server/headlessProtocol.cjs +0 -382
  1095. package/dist/src/server/headlessProtocol.cjs.map +0 -1
  1096. package/dist/src/server/headlessProtocol.mjs +0 -382
  1097. package/dist/src/server/headlessProtocol.mjs.map +0 -1
  1098. package/dist/src/server/nativeChildTranscriptReader.cjs +0 -20
  1099. package/dist/src/server/nativeChildTranscriptReader.cjs.map +0 -1
  1100. package/dist/src/server/nativeChildTranscriptReader.mjs +0 -18
  1101. package/dist/src/server/nativeChildTranscriptReader.mjs.map +0 -1
  1102. package/dist/src/server/serverFacetLoader.cjs +0 -214
  1103. package/dist/src/server/serverFacetLoader.cjs.map +0 -1
  1104. package/dist/src/server/serverFacetLoader.d.mts +0 -72
  1105. package/dist/src/server/serverFacetLoader.d.mts.map +0 -1
  1106. package/dist/src/server/serverFacetLoader.mjs +0 -212
  1107. package/dist/src/server/serverFacetLoader.mjs.map +0 -1
  1108. package/dist/src/services/acpSessionUpdates/index.cjs +0 -129
  1109. package/dist/src/services/acpSessionUpdates/index.cjs.map +0 -1
  1110. package/dist/src/services/acpSessionUpdates/index.mjs +0 -129
  1111. package/dist/src/services/acpSessionUpdates/index.mjs.map +0 -1
  1112. package/dist/src/services/historyImport/index.cjs +0 -8
  1113. package/dist/src/services/historyImport/index.cjs.map +0 -1
  1114. package/dist/src/services/historyImport/index.d.mts +0 -68
  1115. package/dist/src/services/historyImport/index.d.mts.map +0 -1
  1116. package/dist/src/services/historyImport/index.mjs +0 -8
  1117. package/dist/src/services/historyImport/index.mjs.map +0 -1
  1118. package/dist/src/services/openSessionRegistry/index.d.mts.map +0 -1
  1119. package/dist/src/services/requestReceipts/index.cjs.map +0 -1
  1120. package/dist/src/services/requestReceipts/index.d.mts +0 -11
  1121. package/dist/src/services/requestReceipts/index.d.mts.map +0 -1
  1122. package/dist/src/services/requestReceipts/index.mjs.map +0 -1
  1123. package/dist/src/services/rpcTranscript/index.cjs +0 -633
  1124. package/dist/src/services/rpcTranscript/index.cjs.map +0 -1
  1125. package/dist/src/services/rpcTranscript/index.d.mts +0 -50
  1126. package/dist/src/services/rpcTranscript/index.d.mts.map +0 -1
  1127. package/dist/src/services/rpcTranscript/index.mjs +0 -632
  1128. package/dist/src/services/rpcTranscript/index.mjs.map +0 -1
  1129. package/dist/src/services/serverFacet/index.cjs.map +0 -1
  1130. package/dist/src/services/serverFacet/index.d.mts +0 -31
  1131. package/dist/src/services/serverFacet/index.d.mts.map +0 -1
  1132. package/dist/src/services/serverFacet/index.mjs.map +0 -1
  1133. package/dist/src/services/workspaceRegistry/index.d.mts.map +0 -1
  1134. package/dist/src/systems/child/adapters/nativeChildRuntimes.cjs +0 -28
  1135. package/dist/src/systems/child/adapters/nativeChildRuntimes.cjs.map +0 -1
  1136. package/dist/src/systems/child/adapters/nativeChildRuntimes.mjs +0 -25
  1137. package/dist/src/systems/child/adapters/nativeChildRuntimes.mjs.map +0 -1
  1138. package/dist/terminalPiChildSessionService.cjs +0 -324
  1139. package/dist/terminalPiChildSessionService.cjs.map +0 -1
  1140. package/dist/terminalPiChildSessionService.d.mts +0 -46
  1141. package/dist/terminalPiChildSessionService.d.mts.map +0 -1
  1142. package/dist/terminalPiChildSessionService.mjs +0 -318
  1143. package/dist/terminalPiChildSessionService.mjs.map +0 -1
  1144. package/dist/v3Export.cjs +0 -10
  1145. package/dist/v3Export.cjs.map +0 -1
  1146. package/dist/v3Export.d.mts +0 -35
  1147. package/dist/v3Export.d.mts.map +0 -1
  1148. package/dist/v3Export.mjs +0 -9
  1149. package/dist/v3Export.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"sessionMcpRoutes.mjs","names":[],"sources":["../../../src/server/sessionMcpRoutes.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport type { DoomHubSessionReservations, DoomHubSessionScope } from '../schemas/hubChannel';\nimport type { SessionMcpActivitySnapshot, SessionMcpAvailableTool } from '../schemas/sessionMcpActivity';\nimport type { SessionMcpActivityStore } from '../services/sessionMcpActivity';\nimport {\n createSessionMcpAuthorizationService,\n defaultSessionMcpToolPrefix,\n SessionMcpOAuthError,\n sessionMcpRouting,\n sessionMcpToolPrefix,\n type SessionMcpAuthorizationBinding,\n type SessionMcpAuthorizationService,\n type SessionMcpClient,\n} from '../services/sessionMcpAuthorization';\nimport { SessionMcpConversationError, type SessionMcpConversationStore } from '../services/sessionMcpConversations';\nimport type { SessionMcpRegistrationStore } from '../services/sessionMcpRegistrationStore';\nimport type { HeadlessHub, HeadlessHubSession } from './headlessHub';\nimport {\n createSessionMcpHttpHandler,\n SESSION_MCP_EXTRA_TOOLS,\n type SessionMcpBaseline,\n type SessionMcpHttpHandler,\n type SessionMcpOperationRegistry,\n} from './sessionMcpHandler';\n\nconst AUTHORIZATION_SERVER_DISCOVERY = '/.well-known/oauth-authorization-server';\nconst AUTHORIZE_ROUTE = '/oauth/authorize';\nconst TOKEN_ROUTE = '/oauth/token';\nconst SESSION_MCP_PATTERN = /^\\/api\\/workspaces\\/([^/]+)\\/sessions\\/([^/]+)\\/mcp(?:-app)?$/u;\nconst SESSION_MCP_URL_TOKEN_PATTERN =\n /^\\/api\\/workspaces\\/([^/]+)\\/sessions\\/([^/]+)\\/mcp(?:-app)?\\/([A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+)$/u;\nconst SESSION_MCP_ACTIVITY_PATTERN = /^\\/api\\/workspaces\\/([^/]+)\\/sessions\\/([^/]+)\\/mcp\\/activity$/u;\nconst SESSION_MCP_CONFIG_PATTERN = /^\\/api\\/workspaces\\/([^/]+)\\/sessions\\/([^/]+)\\/mcp\\/config$/u;\nconst SESSION_MCP_CLIENTS_PATTERN = /^\\/api\\/workspaces\\/([^/]+)\\/sessions\\/([^/]+)\\/mcp\\/clients(?:\\/([^/]+))?$/u;\nconst SESSION_MCP_CONVERSATIONS_PATTERN =\n /^\\/api\\/workspaces\\/([^/]+)\\/sessions\\/([^/]+)\\/mcp\\/conversations(?:\\/([^/]+))?$/u;\n\n/**\n * An OAuth resource as it can be logged: the URL with any URL-token segment and every query value\n * redacted, so a mismatch in origin, path, trailing slash or query is visible without a secret.\n */\nfunction describeResource(resource: string): string {\n let parsed: URL;\n try {\n parsed = new URL(resource);\n } catch {\n return 'a resource that is not a URL';\n }\n const token = SESSION_MCP_URL_TOKEN_PATTERN.exec(parsed.pathname);\n const pathname = token === null ? parsed.pathname : parsed.pathname.slice(0, -token[3]!.length) + '<token>';\n const query = [...parsed.searchParams.keys()].map((key) => `${key}=<redacted>`).join('&');\n return `${parsed.origin}${pathname}${query === '' ? '' : `?${query}`}${parsed.hash === '' ? '' : '#<redacted>'}`;\n}\nfunction redactUrlCredentials(text: string): string {\n return text.replace(/([a-z][a-z0-9+.-]*:\\/\\/)[^\\s/?#]*@/giu, '$1***@');\n}\n\nconst PROTECTED_RESOURCE_PATTERN =\n /^\\/\\.well-known\\/oauth-protected-resource(\\/api\\/workspaces\\/[^/]+\\/sessions\\/[^/]+\\/mcp(?:-app)?)$/u;\n\nexport interface SessionMcpRoutesOptions {\n readonly headlessHub: HeadlessHub;\n readonly publicOrigin: () => string | undefined;\n readonly publicOriginRevision?: () => number;\n readonly authorization?: SessionMcpAuthorizationService;\n readonly registrationStore?: SessionMcpRegistrationStore;\n readonly conversationStore?: SessionMcpConversationStore;\n readonly activityStore?: SessionMcpActivityStore;\n readonly isSessionPersisted?: (sessionId: string, cwd: string) => boolean;\n readonly onNotice?: (message: string) => void;\n}\n\nexport interface SessionMcpRoutes {\n handlePublic(request: Request): Promise<Response | undefined>;\n handleHost(request: Request): Promise<Response | undefined>;\n readonly reservations: DoomHubSessionReservations;\n closeSessionBinding(sessionId: string): void;\n close(): void;\n}\n\nfunction json(status: number, value: unknown): Response {\n return Response.json(value, { status, headers: { 'cache-control': 'no-store' } });\n}\n\nfunction oauthError(error: unknown): Response {\n if (error instanceof SessionMcpOAuthError)\n return json(error.code === 'invalid_client' ? 401 : 400, {\n error: error.code,\n error_description: error.message,\n });\n return json(400, { error: 'invalid_request', error_description: 'The OAuth request was invalid.' });\n}\n\nfunction trustedOrigin(value: string | undefined): string | undefined {\n if (value === undefined) return undefined;\n try {\n const url = new URL(value);\n return url.protocol === 'https:' && url.pathname === '/' && url.search === '' && url.hash === ''\n ? url.origin\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction sessionPath(workspaceId: string, sessionId: string): string {\n return `/api/workspaces/${encodeURIComponent(workspaceId)}/sessions/${encodeURIComponent(sessionId)}/mcp`;\n}\n\nfunction parseStringArray(value: unknown): readonly string[] | undefined {\n return Array.isArray(value) && value.every((entry) => typeof entry === 'string') ? value : undefined;\n}\n\nfunction defaultClientName(origin: string): string {\n return `ChatGPT · ${new URL(origin).hostname}`;\n}\n\nfunction formString(form: FormData, name: string): string {\n const value = form.get(name);\n return typeof value === 'string' ? value : '';\n}\n\nfunction publicClient(client: SessionMcpClient, binding: SessionMcpAuthorizationBinding): Record<string, unknown> {\n return {\n clientId: client.clientId,\n name: client.name,\n redirectUri: client.redirectUri,\n tokenEndpointAuthMethod: client.tokenEndpointAuthMethod,\n createdAt: client.createdAt,\n scope: binding.scope,\n routing: sessionMcpRouting(binding.routing),\n tools: binding.tools,\n skills: binding.skills,\n audience: binding.audience,\n ...(binding.toolPrefix === undefined ? {} : { toolPrefix: binding.toolPrefix }),\n };\n}\n\n/** Canonicalizes an intended directory without creating it or accepting symlink aliases. */\nfunction executionDirectory(value: string): string {\n if (!path.isAbsolute(value) || value.includes('\\0') || value.length > 4096)\n throw new SessionMcpConversationError('INVALID_EXECUTION_DIRECTORY', 'Choose an absolute execution directory.');\n let ancestor = path.resolve(value);\n const suffix: string[] = [];\n for (;;) {\n try {\n return path.join(fs.realpathSync(ancestor), ...suffix);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT' || path.dirname(ancestor) === ancestor)\n throw new SessionMcpConversationError(\n 'INVALID_EXECUTION_DIRECTORY',\n 'The execution directory cannot be resolved.',\n );\n suffix.unshift(path.basename(ancestor));\n ancestor = path.dirname(ancestor);\n }\n }\n}\n\nfunction overlappingDirectories(left: string, right: string): boolean {\n const contained = (root: string, target: string): boolean => {\n const relative = path.relative(root, target);\n return (\n relative === '' || (!path.isAbsolute(relative) && relative !== '..' && !relative.startsWith(`..${path.sep}`))\n );\n };\n return contained(left, right) || contained(right, left);\n}\n\n/** Routes the process-local session MCP authority and revokes every grant with its live incarnation. */\nexport function createSessionMcpRoutes(options: SessionMcpRoutesOptions): SessionMcpRoutes {\n const authorization = options.authorization ?? createSessionMcpAuthorizationService();\n // ponytail: Catalog baselines last one parent incarnation; persist snapshots only if clients must avoid a refresh after restart.\n const incarnations = new Map<\n string,\n {\n host: HeadlessHubSession['host'];\n generation: number;\n handlers: Map<string, SessionMcpHttpHandler>;\n operations: SessionMcpOperationRegistry;\n baselines: Map<string, SessionMcpBaseline>;\n }\n >();\n let nextGeneration = 1;\n let publishPending = (): void => {};\n\n const revokeIncarnation = (sessionId: string, generation: number): void => {\n authorization.revokeSessionGeneration(sessionId, generation);\n };\n const abortOperations = (operations: SessionMcpOperationRegistry): void => {\n for (const operation of operations.values()) operation.controller.abort();\n operations.clear();\n };\n const register = (session: HeadlessHubSession): boolean => {\n const current = incarnations.get(session.id);\n if (current?.host === session.host) return false;\n if (current !== undefined) {\n revokeIncarnation(session.id, current.generation);\n abortOperations(current.operations);\n }\n incarnations.set(session.id, {\n host: session.host,\n generation: nextGeneration++,\n handlers: new Map(),\n baselines: new Map(),\n operations: new Map(),\n });\n return true;\n };\n for (const session of options.headlessHub.snapshot()) register(session);\n const unsubscribe = options.headlessHub.onEvent((event) => {\n if (event.kind === 'upsert' && register(event.session)) publishPending();\n if (event.kind === 'removed') {\n const current = incarnations.get(event.sessionId);\n if (current !== undefined) {\n revokeIncarnation(event.sessionId, current.generation);\n abortOperations(current.operations);\n }\n incarnations.delete(event.sessionId);\n }\n });\n\n let observedOrigin: string | undefined;\n let observedOriginRevision: number | undefined;\n let originObserved = false;\n const origin = (): string | undefined => {\n const current = trustedOrigin(options.publicOrigin());\n const revision = options.publicOriginRevision?.();\n if (\n (originObserved && current !== observedOrigin) ||\n (revision !== undefined && observedOriginRevision !== undefined && revision !== observedOriginRevision)\n ) {\n for (const client of authorization.listClients()) {\n authorization.revokeClient(client.clientId);\n options.registrationStore?.remove(client.clientId);\n }\n for (const incarnation of incarnations.values()) {\n incarnation.handlers.clear();\n incarnation.baselines.clear();\n abortOperations(incarnation.operations);\n }\n }\n observedOrigin = current;\n observedOriginRevision = revision;\n originObserved = true;\n restorePersistedRegistrations(current);\n return current;\n };\n const target = (workspaceId: string, sessionId: string) => {\n // Remote MCP clients cannot inherit a grant, including through conversation child routing.\n if (options.headlessHub.computerUse?.ownsSession?.(sessionId)) return undefined;\n const session = options.headlessHub.session(sessionId);\n const incarnation = incarnations.get(sessionId);\n return session !== undefined && session.workspaceId === workspaceId && incarnation?.host === session.host\n ? { session, generation: incarnation.generation }\n : undefined;\n };\n const restorePersistedRegistrations = (configuredOrigin: string | undefined): void => {\n if (configuredOrigin === undefined) return;\n for (const registration of options.registrationStore?.registrations() ?? []) {\n const audience = `${configuredOrigin}${sessionPath(registration.workspaceId, registration.binding.sessionId)}`;\n if (registration.binding.audience !== audience) {\n options.registrationStore?.remove(registration.client.clientId);\n continue;\n }\n const resolved = target(registration.workspaceId, registration.binding.sessionId);\n if (resolved !== undefined) authorization.restorePersistentRegistration(registration, resolved.generation);\n }\n };\n\n const requireStore = (): SessionMcpConversationStore => {\n if (!options.conversationStore)\n throw new SessionMcpConversationError(\n 'CONVERSATION_ROUTING_UNAVAILABLE',\n 'Persistent conversation routing is unavailable.',\n );\n return options.conversationStore;\n };\n publishPending = () => {\n if (!options.conversationStore) return;\n try {\n const records = options.conversationStore.list();\n for (const parent of options.headlessHub.snapshot())\n options.headlessHub.setPendingSessionSetups?.(\n parent.id,\n records\n .filter((record) => record.parentSessionId === parent.id && record.state === 'pending')\n .map((record) => ({\n id: record.id,\n name: `conversation ${record.id.slice(0, 8)}`,\n createdAt: record.createdAt,\n status:\n provision.has(record.id) || recoveries.has(record.id)\n ? ('provisioning' as const)\n : record.failureCode === undefined\n ? ('interrupted' as const)\n : ('failed' as const),\n ...(record.setupKind === undefined ? {} : { setupKind: record.setupKind }),\n ...(record.failureCode === undefined ? {} : { errorCode: record.failureCode }),\n ...(record.cwd === undefined ? {} : { cwd: record.cwd }),\n })),\n );\n } catch (error) {\n options.onNotice?.(error instanceof Error ? error.message : 'Conversation bindings are unavailable.');\n }\n };\n const readReservation = (id: string, parentSessionId: string) => {\n origin();\n const record = requireStore().get(id, parentSessionId);\n const binding = authorization.readAuthorizationBinding(record.clientId);\n const parent = target(record.parentWorkspaceId, parentSessionId);\n if (\n !parent ||\n binding?.routing !== 'conversation' ||\n binding.sessionId !== parentSessionId ||\n binding.sessionGeneration !== parent.generation\n )\n throw new SessionMcpConversationError(\n 'SESSION_UNAVAILABLE',\n 'The connection that owns this setup is no longer active.',\n id,\n );\n return { record, parent };\n };\n const reservations: DoomHubSessionReservations = {\n read(id, parentSessionId) {\n const { record } = readReservation(id, parentSessionId);\n return { sessionId: record.id, ...(record.cwd === undefined ? {} : { cwd: record.cwd }) };\n },\n async prepare(id, parentSessionId, suppliedDirectory) {\n const { record, parent } = readReservation(id, parentSessionId);\n const cwd = executionDirectory(suppliedDirectory);\n const parentRoot =\n options.headlessHub.workspaces().find((workspace) => workspace.id === parent.session.workspaceId)?.root ??\n parent.session.cwd;\n const occupied = [\n parentRoot,\n ...options.headlessHub\n .snapshot()\n .filter((session) => session.id !== id)\n .map((session) => session.cwd),\n ...requireStore()\n .list()\n .filter((entry) => entry.id !== id && entry.state !== 'closed' && entry.cwd !== undefined)\n .map((entry) => entry.cwd!),\n ];\n if (occupied.some((directory) => overlappingDirectories(cwd, executionDirectory(directory))))\n throw new SessionMcpConversationError(\n 'EXECUTION_DIRECTORY_SHARED',\n 'Choose a separate checkout, not a directory shared with another session.',\n id,\n );\n if (record.state === 'bound' && record.cwd !== cwd)\n throw new SessionMcpConversationError(\n 'SESSION_TARGET_FIXED',\n 'An initialized session cannot change its directory.',\n id,\n );\n requireStore().prepare(id, parentSessionId, cwd);\n publishPending();\n return { sessionId: id, cwd };\n },\n async complete(id, parentSessionId): Promise<DoomHubSessionScope> {\n const { record } = readReservation(id, parentSessionId);\n const child = options.headlessHub.session(id);\n if (\n !record.cwd ||\n !child?.workspaceId ||\n child.parentSessionId !== parentSessionId ||\n (record.setupKind === 'managed-worktree' && child.workspaceId !== record.parentWorkspaceId) ||\n executionDirectory(child.cwd) !== record.cwd ||\n options.isSessionPersisted?.(id, child.cwd) === false\n )\n throw new SessionMcpConversationError(\n 'SESSION_SETUP_INCOMPLETE',\n 'The reserved session is not durably ready. Recover the existing setup instead of creating another checkout.',\n id,\n );\n requireStore().bind(id, parentSessionId, child.workspaceId);\n publishPending();\n return { sessionId: id, workspaceId: child.workspaceId, cwd: child.cwd };\n },\n };\n const provision = new Map<string, Promise<DoomHubSessionScope>>();\n const recoveries = new Map<string, Promise<DoomHubSessionScope>>();\n const setupDirectory = async (\n id: string,\n parentSessionId: string,\n directory: string,\n ): Promise<DoomHubSessionScope> => {\n // A mistyped existing-directory choice must not permanently reserve a nonexistent path.\n const canonical = executionDirectory(directory);\n if (!fs.statSync(canonical).isDirectory()) throw new Error('The execution directory is not a directory.');\n const { record: current } = readReservation(id, parentSessionId);\n if (provision.has(id) && current.setupKind === 'managed-worktree')\n throw new SessionMcpConversationError('SESSION_TARGET_FIXED', 'This setup belongs to a managed worktree.', id);\n const selected = requireStore().selectSetup(id, parentSessionId, 'existing-directory');\n if (selected.setupKind !== 'existing-directory')\n throw new SessionMcpConversationError('SESSION_TARGET_FIXED', 'This setup belongs to a managed worktree.', id);\n const prepared = await reservations.prepare(id, parentSessionId, canonical);\n const pending = provision.get(id);\n if (pending) return pending;\n const setup = (async () => {\n if (!options.headlessHub.session(id)) {\n const record = requireStore().get(id, parentSessionId);\n if (record.state === 'bound' || options.isSessionPersisted?.(id, prepared.cwd))\n throw new SessionMcpConversationError(\n 'SESSION_UNAVAILABLE',\n 'Resume the existing session in Po. It will not be recreated automatically.',\n id,\n );\n if (!fs.statSync(prepared.cwd).isDirectory()) throw new Error('The execution directory is not a directory.');\n await options.headlessHub.sessionService.create({\n cwd: prepared.cwd,\n name: `conversation ${id.slice(0, 8)}`,\n parentSessionId,\n sessionProvenance: 'remote-conversation',\n reservationId: id,\n });\n }\n return reservations.complete(id, parentSessionId);\n })();\n provision.set(id, setup);\n publishPending();\n try {\n return await setup;\n } catch (error) {\n requireStore().fail(id, parentSessionId, 'SESSION_UNAVAILABLE');\n throw error;\n } finally {\n if (provision.get(id) === setup) provision.delete(id);\n publishPending();\n }\n };\n const provisionConversationWorktree = async (\n record: ReturnType<SessionMcpConversationStore['reserve']>,\n signal?: AbortSignal,\n ): Promise<DoomHubSessionScope> => {\n const pending = provision.get(record.id);\n if (pending) return pending;\n readReservation(record.id, record.parentSessionId);\n requireStore().selectSetup(record.id, record.parentSessionId, 'managed-worktree');\n const setup = (async () => {\n try {\n const child = await options.headlessHub.sessionService.provisionReservedWorktree?.({\n reservationId: record.id,\n parentSessionId: record.parentSessionId,\n signal,\n });\n if (child === undefined || child.sessionId !== record.id)\n throw new Error('Automatic worktree provisioning did not create the reserved session.');\n return child;\n } catch (error) {\n if (error instanceof SessionMcpConversationError) throw error;\n options.onNotice?.(\n `session MCP worktree provisioning failed for reservation ${record.id}: ${error instanceof Error ? redactUrlCredentials(error.message) : 'Automatic worktree provisioning failed.'}`,\n );\n throw new SessionMcpConversationError(\n 'SESSION_WORKTREE_PROVISION_FAILED',\n 'An automatic worktree could not be created for this conversation. Resolve the host Git setup, then retry.',\n record.id,\n );\n }\n })();\n provision.set(record.id, setup);\n publishPending();\n try {\n return await setup;\n } catch (error) {\n requireStore().fail(record.id, record.parentSessionId, 'SESSION_WORKTREE_PROVISION_FAILED');\n throw error;\n } finally {\n if (provision.get(record.id) === setup) provision.delete(record.id);\n publishPending();\n }\n };\n const publicRoutes = async (request: Request): Promise<Response | undefined> => {\n const url = new URL(request.url);\n const configuredOrigin = origin();\n const signedMcpMatch = SESSION_MCP_URL_TOKEN_PATTERN.exec(url.pathname);\n const mcpMatch = SESSION_MCP_PATTERN.exec(url.pathname) ?? signedMcpMatch;\n if (mcpMatch !== null) {\n if (configuredOrigin === undefined) return json(503, { error: 'Session MCP public origin is unavailable.' });\n const workspaceId = decodeURIComponent(mcpMatch[1]);\n const sessionId = decodeURIComponent(mcpMatch[2]);\n const pathToken = signedMcpMatch?.[3];\n const canonicalPath = sessionPath(workspaceId, sessionId);\n const presentation = url.pathname.startsWith(`${canonicalPath}-app`) ? 'app' : 'pure';\n const basePath = presentation === 'app' ? `${canonicalPath}-app` : canonicalPath;\n const exactPath = pathToken === undefined ? basePath : `${basePath}/${pathToken}`;\n if (url.pathname !== exactPath || url.search !== '') return json(404, { error: 'Not found.' });\n const audience = `${configuredOrigin}${canonicalPath}`;\n const resource = `${configuredOrigin}${exactPath}`;\n const incarnation = target(workspaceId, sessionId) === undefined ? undefined : incarnations.get(sessionId);\n const handlers = incarnation?.handlers;\n const cachedHandler = pathToken === undefined ? handlers?.get(resource) : undefined;\n const handler =\n cachedHandler ??\n createSessionMcpHttpHandler({\n audience,\n presentation,\n baselines: incarnation?.baselines ?? new Map(),\n authorization,\n onNotice: options.onNotice,\n onInvocation: (invocation) => {\n if (invocation.sessionId === undefined || invocation.conversationDigest === undefined) return;\n const conversation = options.conversationStore?.find(\n invocation.clientId,\n invocation.parentSessionId,\n invocation.conversationDigest,\n );\n if (\n conversation?.state !== 'bound' ||\n conversation.id !== invocation.sessionId ||\n conversation.workspaceId === undefined\n )\n return;\n options.activityStore?.record(\n conversation.workspaceId,\n conversation.id,\n authorization.readClient(invocation.clientId)?.name ?? 'remote agent',\n invocation,\n );\n },\n ...(pathToken === undefined ? {} : { pathToken, operations: incarnation?.operations }),\n resolveConversation: async (grant, digest, reserve, signal) => {\n const store = requireStore();\n let record = reserve\n ? store.reserve(grant.clientId, sessionId, workspaceId, digest)\n : store.find(grant.clientId, sessionId, digest);\n if (!record)\n throw new SessionMcpConversationError(\n 'SESSION_UNAVAILABLE',\n 'This conversation binding is unavailable. It will not be recreated automatically.',\n );\n const restoring = recoveries.get(record.id);\n if (restoring) await restoring;\n else {\n const existing = record.workspaceId === undefined ? undefined : target(record.workspaceId, record.id);\n if (record.state === 'closed' || (record.state === 'bound' && !existing)) {\n if (\n options.headlessHub.session(record.id) ||\n !record.cwd ||\n options.isSessionPersisted?.(record.id, record.cwd) !== false\n )\n throw new SessionMcpConversationError(\n 'SESSION_UNAVAILABLE',\n 'The bound session is unavailable. Resume it in Po; no other session will be used.',\n record.id,\n );\n if (record.setupKind === undefined && record.cwd !== undefined)\n throw new SessionMcpConversationError(\n 'SESSION_TARGET_FIXED',\n 'This existing setup has no verified provider. Recover it without changing its ownership.',\n record.id,\n );\n record = store.recover(record.id, sessionId);\n const recovery =\n record.setupKind === 'existing-directory' && record.cwd\n ? setupDirectory(record.id, sessionId, record.cwd)\n : provisionConversationWorktree(record, signal);\n recoveries.set(record.id, recovery);\n publishPending();\n try {\n await recovery;\n } finally {\n if (recoveries.get(record.id) === recovery) recoveries.delete(record.id);\n publishPending();\n }\n }\n }\n record = store.find(grant.clientId, sessionId, digest)!;\n if (record.state === 'pending') {\n publishPending();\n if (record.workspaceId !== undefined && options.isSessionPersisted?.(record.id, record.cwd!) !== false)\n throw new SessionMcpConversationError(\n 'SESSION_UNAVAILABLE',\n 'The bound session is unavailable. Resume it in Po; no other session will be used.',\n record.id,\n );\n const pending = provision.get(record.id);\n if (pending) await pending;\n else if (record.setupKind === 'existing-directory' && record.cwd)\n await setupDirectory(record.id, sessionId, record.cwd);\n else await provisionConversationWorktree(record, signal);\n record = store.find(grant.clientId, sessionId, digest);\n if (!record || record.state !== 'bound')\n throw new SessionMcpConversationError(\n 'SESSION_WORKTREE_PROVISION_FAILED',\n 'The automatic worktree setup did not complete. Retry after resolving the host Git setup.',\n );\n }\n const child = record.workspaceId === undefined ? undefined : target(record.workspaceId, record.id);\n if (\n !child ||\n child.session.parentSessionId !== sessionId ||\n executionDirectory(child.session.cwd) !== record.cwd ||\n !fs.existsSync(child.session.cwd)\n )\n throw new SessionMcpConversationError(\n 'SESSION_UNAVAILABLE',\n 'The bound session is unavailable. Resume it in Po; no other session will be used.',\n record.id,\n );\n return {\n sessionId: record.id,\n generation: child.generation,\n toolSurface: child.session.host.mcpSurface,\n agentLocked: () => child.session.host.runtime.agentLocked(),\n };\n },\n onVerified: (grant) => {\n if (options.registrationStore === undefined) return;\n const active = target(workspaceId, sessionId);\n if (active === undefined || grant.sessionGeneration !== active.generation || grant.clientId === '') {\n throw new Error('The session grant is no longer active.');\n }\n if (authorization.readClient(grant.clientId)?.tokenEndpointAuthMethod !== 'client_secret_post') return;\n const registration = authorization.persistentRegistration(grant.clientId, workspaceId, Date.now());\n if (registration === undefined || !options.registrationStore.save(registration)) {\n throw new Error('The verified Session MCP client could not be saved.');\n }\n },\n ...(pathToken === undefined\n ? { resourceMetadataUrl: `${configuredOrigin}/.well-known/oauth-protected-resource${basePath}` }\n : {}),\n resolveSession: (grantedSessionId) => {\n if (grantedSessionId !== sessionId) return undefined;\n const resolved = target(workspaceId, sessionId);\n return resolved === undefined\n ? undefined\n : {\n sessionId,\n generation: resolved.generation,\n toolSurface: resolved.session.host.mcpSurface,\n agentLocked: () => resolved.session.host.runtime.agentLocked(),\n };\n },\n });\n if (pathToken === undefined) handlers?.set(resource, handler);\n return handler(new Request(resource, request));\n }\n\n const protectedMatch = PROTECTED_RESOURCE_PATTERN.exec(url.pathname);\n if (protectedMatch !== null && request.method === 'GET') {\n if (configuredOrigin === undefined) return json(503, { error: 'Session MCP public origin is unavailable.' });\n return json(200, {\n resource: `${configuredOrigin}${protectedMatch[1]}`,\n authorization_servers: [configuredOrigin],\n bearer_methods_supported: ['header'],\n });\n }\n if (url.pathname === AUTHORIZATION_SERVER_DISCOVERY && request.method === 'GET') {\n if (configuredOrigin === undefined) return json(503, { error: 'Session MCP public origin is unavailable.' });\n return json(200, {\n issuer: configuredOrigin,\n authorization_endpoint: `${configuredOrigin}${AUTHORIZE_ROUTE}`,\n token_endpoint: `${configuredOrigin}${TOKEN_ROUTE}`,\n response_types_supported: ['code'],\n grant_types_supported: ['authorization_code', 'refresh_token'],\n code_challenge_methods_supported: ['S256'],\n token_endpoint_auth_methods_supported: ['client_secret_post'],\n });\n }\n if (url.pathname === AUTHORIZE_ROUTE && request.method === 'GET') {\n if (configuredOrigin === undefined) return json(503, { error: 'Session MCP public origin is unavailable.' });\n const clientId = url.searchParams.get('client_id') ?? '';\n const client = authorization.readClient(clientId);\n const binding = authorization.readAuthorizationBinding(clientId);\n const redirectUri = url.searchParams.get('redirect_uri') ?? '';\n if (\n client === undefined ||\n client.tokenEndpointAuthMethod !== 'client_secret_post' ||\n binding === undefined ||\n redirectUri !== client.redirectUri\n ) {\n return oauthError(new SessionMcpOAuthError('invalid_client', 'Unknown client or callback.'));\n }\n const callback = new URL(client.redirectUri);\n const state = url.searchParams.get('state');\n try {\n const boundSession = options.headlessHub.session(binding.sessionId);\n const boundIncarnation = incarnations.get(binding.sessionId);\n const expectedAudience =\n boundSession?.workspaceId === undefined\n ? undefined\n : `${configuredOrigin}${sessionPath(boundSession.workspaceId, binding.sessionId)}`;\n if (\n expectedAudience === undefined ||\n binding.audience !== expectedAudience ||\n boundIncarnation?.host !== boundSession?.host ||\n binding.sessionGeneration !== boundIncarnation?.generation\n ) {\n authorization.revokeClient(clientId);\n throw new SessionMcpOAuthError('invalid_grant', 'The preauthorized session is no longer active.');\n }\n if (url.searchParams.get('response_type') !== 'code')\n throw new SessionMcpOAuthError('invalid_request', 'Only the code response type is supported.');\n const resource = url.searchParams.get('resource');\n if (\n url.searchParams.getAll('resource').length > 1 ||\n (resource !== null && resource !== binding.audience && resource !== `${binding.audience}-app`)\n ) {\n // The requested URL can carry a URL token, which is redacted.\n options.onNotice?.(\n `session MCP authorize refused: client ${clientId} is bound to session ${binding.sessionId}, expecting ${binding.audience} but the connector asked for ${describeResource(resource ?? '')}`,\n );\n throw new SessionMcpOAuthError(\n 'invalid_request',\n \"The requested resource is not preauthorized. The connector's MCP URL must be the session URL this client was created for.\",\n );\n }\n const code = authorization.issueAuthorizationCode({\n clientId,\n redirectUri,\n codeChallenge: url.searchParams.get('code_challenge') ?? '',\n codeChallengeMethod: url.searchParams.get('code_challenge_method') as 'S256',\n });\n callback.searchParams.set('code', code.code);\n } catch (error) {\n callback.searchParams.set('error', error instanceof SessionMcpOAuthError ? error.code : 'invalid_request');\n callback.searchParams.set(\n 'error_description',\n error instanceof Error ? error.message : 'The OAuth request was invalid.',\n );\n }\n if (state !== null) callback.searchParams.set('state', state);\n return new Response(null, { status: 302, headers: { location: callback.href, 'cache-control': 'no-store' } });\n }\n if (url.pathname === TOKEN_ROUTE && request.method === 'POST') {\n try {\n const form = await request.formData();\n const grantType = formString(form, 'grant_type');\n const clientId = formString(form, 'client_id');\n const clientSecret = formString(form, 'client_secret');\n const resource = form.get('resource');\n const binding = authorization.readAuthorizationBinding(clientId);\n if (\n form.getAll('resource').length > 1 ||\n (resource !== null &&\n (typeof resource !== 'string' ||\n (resource !== binding?.audience && resource !== `${binding?.audience}-app`)))\n )\n throw new SessionMcpOAuthError('invalid_request', 'The requested resource is not preauthorized.');\n const result =\n grantType === 'authorization_code'\n ? authorization.exchangeToken({\n grantType,\n clientId,\n clientSecret,\n code: formString(form, 'code'),\n redirectUri: formString(form, 'redirect_uri'),\n codeVerifier: formString(form, 'code_verifier'),\n })\n : grantType === 'refresh_token'\n ? authorization.exchangeToken({\n grantType,\n clientId,\n clientSecret,\n refreshToken: formString(form, 'refresh_token'),\n })\n : (() => {\n throw new SessionMcpOAuthError('unsupported_grant_type', 'The grant type is not supported.');\n })();\n return json(200, {\n access_token: result.accessToken,\n refresh_token: result.refreshToken,\n token_type: result.tokenType,\n expires_in: result.expiresIn,\n });\n } catch (error) {\n return oauthError(error);\n }\n }\n return undefined;\n };\n\n publishPending();\n return {\n reservations,\n closeSessionBinding(sessionId) {\n options.conversationStore?.closeSession(sessionId);\n publishPending();\n },\n handlePublic: publicRoutes,\n async handleHost(request) {\n const url = new URL(request.url);\n origin();\n const configMatch = SESSION_MCP_CONFIG_PATTERN.exec(url.pathname);\n const match = SESSION_MCP_CLIENTS_PATTERN.exec(url.pathname);\n const conversationMatch = SESSION_MCP_CONVERSATIONS_PATTERN.exec(url.pathname);\n const activityMatch = SESSION_MCP_ACTIVITY_PATTERN.exec(url.pathname);\n if (configMatch === null && match === null && conversationMatch === null && activityMatch === null)\n return undefined;\n const routeMatch = configMatch ?? match ?? conversationMatch ?? activityMatch!;\n const workspaceId = decodeURIComponent(routeMatch[1]);\n const sessionId = decodeURIComponent(routeMatch[2]);\n const clientId = match?.[3] === undefined ? undefined : decodeURIComponent(match[3]);\n const resolved = target(workspaceId, sessionId);\n if (activityMatch !== null) {\n if (request.method !== 'GET') return json(405, { error: 'Method not allowed.' });\n const beforeText = url.searchParams.get('before');\n const before = beforeText === null ? undefined : Number(beforeText);\n if (\n [...url.searchParams.keys()].some((key) => key !== 'before') ||\n (before !== undefined && (!Number.isSafeInteger(before) || before <= 0))\n )\n return json(400, { error: 'Invalid history cursor.' });\n if (options.headlessHub.computerUse?.ownsSession?.(sessionId))\n return json(404, { error: 'Session not found.' });\n if (!options.activityStore) return json(503, { error: 'MCP call history is unavailable in this host.' });\n try {\n const conversation = options.conversationStore\n ?.list()\n .find((entry) => entry.id === sessionId && entry.state === 'bound' && entry.workspaceId === workspaceId);\n if (conversation === undefined)\n return json(200, {\n enabled: false,\n available: false,\n tools: [],\n calls: [],\n total: 0,\n } satisfies SessionMcpActivitySnapshot);\n const history = options.activityStore.read(workspaceId, sessionId, before);\n const parent = target(conversation.parentWorkspaceId, conversation.parentSessionId);\n const bindings = authorization.listClients().flatMap((client) => {\n const binding = authorization.readAuthorizationBinding(client.clientId);\n return binding !== undefined &&\n client.clientId === conversation.clientId &&\n binding.sessionId === conversation.parentSessionId &&\n binding.sessionGeneration === parent?.generation\n ? [{ client, binding }]\n : [];\n });\n let available = false;\n let tools: SessionMcpAvailableTool[] = [];\n if (resolved !== undefined && bindings.length > 0) {\n try {\n const surface = resolved.session.host.mcpSurface.readSurface();\n const candidates = [\n ...surface.tools.map((tool) => ({\n name: tool.name,\n label: tool.label,\n description: tool.description,\n inputSchema: tool.parameters,\n })),\n ...SESSION_MCP_EXTRA_TOOLS.map((tool) => ({\n name: tool.name,\n label: tool.title ?? tool.name,\n description: tool.description ?? '',\n inputSchema: tool.inputSchema,\n })),\n ];\n tools = candidates.flatMap((tool) => {\n const connections = bindings\n .filter(({ binding }) => binding.scope === 'session' || binding.tools.includes(tool.name))\n .map(({ client }) => client.name);\n return connections.length === 0 ? [] : [{ ...tool, connections }];\n });\n available = true;\n } catch {\n // Keep durable history visible while the child session's live capability surface is rebuilding.\n available = false;\n }\n }\n const toolPrefix = bindings[0]?.binding.toolPrefix;\n const snapshot: SessionMcpActivitySnapshot = {\n ...history,\n enabled: true,\n available,\n tools,\n ...(toolPrefix === undefined ? {} : { toolPrefix }),\n };\n return json(200, snapshot);\n } catch {\n return json(503, { error: 'MCP call history could not be read. Check the host storage.' });\n }\n }\n if (resolved === undefined) return json(404, { error: 'Session not found.' });\n if (conversationMatch !== null) {\n const id = conversationMatch[3] === undefined ? undefined : decodeURIComponent(conversationMatch[3]);\n try {\n if (request.method === 'GET' && id === undefined)\n return json(200, {\n conversations: requireStore()\n .list()\n .filter((record) => record.parentSessionId === sessionId && record.state !== 'closed')\n .map(({ conversationDigest: _digest, clientId: _clientId, ...record }) => record),\n });\n if (id !== undefined && request.method === 'DELETE') {\n const record = requireStore().get(id, sessionId);\n if (record.state !== 'pending' || options.headlessHub.session(id))\n return json(409, { error: 'Remove the existing session instead.' });\n requireStore().closeSession(id);\n publishPending();\n return json(200, { ok: true });\n }\n if (id !== undefined && request.method === 'POST') {\n const body: unknown = await request.json();\n if (typeof body !== 'object' || body === null || !('cwd' in body) || typeof body.cwd !== 'string')\n return json(400, { error: 'An execution directory is required.' });\n return json(200, { session: await setupDirectory(id, sessionId, body.cwd) });\n }\n return json(405, { error: 'Method not allowed.' });\n } catch (error) {\n return json(409, {\n error:\n error instanceof SessionMcpConversationError\n ? error.message\n : 'Session setup failed. Recover the existing setup before retrying.',\n ...(error instanceof SessionMcpConversationError ? { code: error.code } : {}),\n });\n }\n }\n if (configMatch !== null) {\n if (request.method !== 'GET') return json(405, { error: 'Method not allowed.' });\n const configuredOrigin = origin();\n if (configuredOrigin === undefined) return json(503, { error: 'Session MCP public origin is unavailable.' });\n let surface;\n try {\n surface = resolved.session.host.mcpSurface.readSurface();\n } catch {\n return json(409, { error: 'The session capability surface is not ready.' });\n }\n if (surface.tools.some((tool) => SESSION_MCP_EXTRA_TOOLS.some((wrapper) => wrapper.name === tool.name)))\n return json(409, { error: 'The session capability surface contains a reserved remote tool name.' });\n return json(200, {\n audience: `${configuredOrigin}${sessionPath(workspaceId, sessionId)}`,\n mcpUrl: `${configuredOrigin}${sessionPath(workspaceId, sessionId)}`,\n mcpAppUrl: `${configuredOrigin}${sessionPath(workspaceId, sessionId)}-app`,\n authorizationEndpoint: `${configuredOrigin}${AUTHORIZE_ROUTE}`,\n tokenEndpoint: `${configuredOrigin}${TOKEN_ROUTE}`,\n tools: [\n ...surface.tools.map(({ name, label, description }) => ({ name, label, description })),\n ...SESSION_MCP_EXTRA_TOOLS.map(({ name, title, description }) => ({\n name,\n label: title ?? name,\n description,\n })),\n ],\n skills: surface.skills,\n });\n }\n if (clientId === undefined && request.method === 'GET') {\n return json(200, {\n clients: authorization.listClients().flatMap((client) => {\n const binding = authorization.readAuthorizationBinding(client.clientId);\n return binding?.sessionId === sessionId ? [publicClient(client, binding)] : [];\n }),\n });\n }\n if (clientId === undefined && request.method === 'POST') {\n const configuredOrigin = origin();\n if (configuredOrigin === undefined) return json(503, { error: 'Session MCP public origin is unavailable.' });\n let body: unknown;\n try {\n body = await request.json();\n } catch {\n return json(400, { error: 'Invalid client request.' });\n }\n if (typeof body !== 'object' || body === null) return json(400, { error: 'Invalid client request.' });\n const input = body as Record<string, unknown>;\n if (!options.conversationStore || !options.registrationStore)\n return json(503, { error: 'Mandatory conversation routing requires persistent host state.' });\n if (input.routing !== undefined && input.routing !== 'session' && input.routing !== 'conversation')\n return json(400, { error: 'Session MCP routing is not supported.' });\n const routing = sessionMcpRouting(input.routing);\n if (input.toolPrefix !== undefined && typeof input.toolPrefix !== 'string')\n return json(400, { error: 'Tool prefix must be a string.' });\n // Fixed at creation: session names can be renamed or empty later.\n const toolPrefix = input.toolPrefix?.trim() || defaultSessionMcpToolPrefix(resolved.session.name);\n try {\n sessionMcpToolPrefix(toolPrefix);\n } catch (error) {\n return json(400, { error: (error as Error).message });\n }\n const requestedScope = input.scope;\n if (requestedScope !== undefined && requestedScope !== 'session' && requestedScope !== 'restricted') {\n return json(400, { error: 'Authorization scope is not supported.' });\n }\n const scope = requestedScope === 'session' ? 'session' : 'restricted';\n const hasTools = Object.hasOwn(input, 'tools');\n const hasSkills = Object.hasOwn(input, 'skills');\n const tools = parseStringArray(input.tools);\n const skills = parseStringArray(input.skills);\n const authMethod = input.authMethod;\n const apiKey = authMethod === 'api_key';\n const urlToken = authMethod === 'url_token';\n const nonOAuthCredential = apiKey || urlToken;\n if (authMethod !== undefined && authMethod !== 'oauth' && !nonOAuthCredential)\n return json(400, { error: 'Authentication method is not supported.' });\n if (nonOAuthCredential && (scope !== 'session' || Object.hasOwn(input, 'redirectUri')))\n return json(400, { error: 'Signed URLs and API keys require session scope and no redirectUri.' });\n if (!nonOAuthCredential && typeof input.redirectUri !== 'string')\n return json(400, { error: 'A redirectUri is required.' });\n if (scope === 'session' && (hasTools || hasSkills)) {\n return json(400, { error: 'Session scope cannot include capability grants.' });\n }\n if (scope === 'restricted' && (typeof input.name !== 'string' || !tools || !skills)) {\n return json(400, { error: 'Restricted scope requires a name, tools, and skills.' });\n }\n if (scope === 'restricted') {\n let surface;\n try {\n surface = resolved.session.host.mcpSurface.readSurface();\n } catch {\n return json(409, { error: 'The session capability surface is not ready.' });\n }\n if (surface.tools.some((tool) => SESSION_MCP_EXTRA_TOOLS.some((wrapper) => wrapper.name === tool.name)))\n return json(409, { error: 'The session capability surface contains a reserved remote tool name.' });\n const activeTools = new Set([\n ...surface.tools.map((tool) => tool.name),\n ...SESSION_MCP_EXTRA_TOOLS.map((tool) => tool.name),\n ]);\n const activeSkills = new Set(surface.skills.map((skill) => skill.name));\n if (tools!.some((name) => !activeTools.has(name)) || skills!.some((name) => !activeSkills.has(name)))\n return json(400, { error: 'Every requested grant must be active in the session.' });\n }\n try {\n const client = authorization.createClient(\n urlToken\n ? { name: defaultClientName(configuredOrigin), authMethod: 'url_token' }\n : apiKey\n ? { name: typeof input.name === 'string' ? input.name : 'API key', authMethod: 'api_key' }\n : {\n name: scope === 'session' ? defaultClientName(configuredOrigin) : (input.name as string),\n redirectUri: input.redirectUri as string,\n },\n );\n const audience = `${configuredOrigin}${sessionPath(workspaceId, sessionId)}`;\n try {\n const binding =\n scope === 'session'\n ? authorization.createAuthorizationBinding({\n clientId: client.clientId,\n sessionId,\n sessionGeneration: resolved.generation,\n audience,\n scope: 'session',\n routing,\n toolPrefix,\n })\n : authorization.createAuthorizationBinding({\n clientId: client.clientId,\n sessionId,\n sessionGeneration: resolved.generation,\n audience,\n scope: 'restricted',\n routing,\n toolPrefix,\n tools: [...new Set(tools!)],\n skills: [...new Set(skills!)],\n });\n const connectionUrl = urlToken ? `${audience}/${authorization.issueUrlToken(client.clientId)}` : undefined;\n if (nonOAuthCredential) {\n const registration = authorization.persistentRegistration(client.clientId, workspaceId, Date.now());\n if (registration === undefined || !options.registrationStore.save(registration)) {\n authorization.revokeClient(client.clientId);\n return json(500, { error: 'Session MCP credential could not be saved.' });\n }\n }\n return json(201, {\n client: {\n ...publicClient(client, binding),\n ...(connectionUrl === undefined\n ? { clientSecret: client.clientSecret }\n : { connectionUrl, mcpAppConnectionUrl: `${audience}-app${connectionUrl.slice(audience.length)}` }),\n },\n });\n } catch (error) {\n authorization.revokeClient(client.clientId);\n throw error;\n }\n } catch (error) {\n return oauthError(error);\n }\n }\n if (clientId !== undefined && request.method === 'DELETE') {\n const binding = authorization.readAuthorizationBinding(clientId);\n if (binding?.sessionId !== sessionId) return json(404, { error: 'Client not found.' });\n if (options.registrationStore !== undefined && !options.registrationStore.remove(clientId)) {\n return json(500, { error: 'Client revocation could not be saved.' });\n }\n authorization.revokeClient(clientId);\n for (const presentation of ['pure', 'app'])\n incarnations.get(sessionId)?.baselines.delete(JSON.stringify([presentation, clientId]));\n options.conversationStore?.closeClient(clientId);\n publishPending();\n return json(200, { ok: true });\n }\n return json(405, { error: 'Method not allowed.' });\n },\n close() {\n unsubscribe();\n for (const [sessionId, incarnation] of incarnations) {\n revokeIncarnation(sessionId, incarnation.generation);\n abortOperations(incarnation.operations);\n }\n incarnations.clear();\n options.activityStore?.close();\n },\n };\n}\n\nexport function isPublicSessionMcpRoute(method: string, pathname: string): boolean {\n return (\n SESSION_MCP_PATTERN.test(pathname) ||\n SESSION_MCP_URL_TOKEN_PATTERN.test(pathname) ||\n (method === 'GET' && PROTECTED_RESOURCE_PATTERN.test(pathname)) ||\n (method === 'GET' && (pathname === AUTHORIZATION_SERVER_DISCOVERY || pathname === AUTHORIZE_ROUTE)) ||\n (method === 'POST' && pathname === TOKEN_ROUTE)\n );\n}\n\nexport function isSessionMcpHostRoute(pathname: string): boolean {\n return (\n SESSION_MCP_ACTIVITY_PATTERN.test(pathname) ||\n SESSION_MCP_CONFIG_PATTERN.test(pathname) ||\n SESSION_MCP_CLIENTS_PATTERN.test(pathname) ||\n SESSION_MCP_CONVERSATIONS_PATTERN.test(pathname)\n );\n}\n\n/**\n * The Session MCP management a sealed remote device may reach, which is what Settings uses:\n * the config, listing and creating a session's clients, and revoking one. Creating and\n * revoking are step-up gated. Activity and conversations stay on the host.\n */\nexport function isSessionMcpPhoneRoute(method: string, pathname: string): boolean {\n if (method === 'GET' && SESSION_MCP_CONFIG_PATTERN.test(pathname)) return true;\n const clients = SESSION_MCP_CLIENTS_PATTERN.exec(pathname);\n if (clients === null) return false;\n return clients[3] === undefined ? method === 'GET' || method === 'POST' : method === 'DELETE';\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sessionMcpRoutes.mjs","names":[],"sources":["../../../src/server/sessionMcpRoutes.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport {\n REMOTE_CONVERSATION_SESSION_PROVENANCE,\n type PoHubSessionReservations,\n type PoHubSessionScope,\n} from '../schemas/hubChannel';\nimport type { SessionMcpActivitySnapshot, SessionMcpAvailableTool } from '../schemas/sessionMcpActivity';\nimport type { SessionMcpActivityStore } from '../services/sessionMcpActivity';\nimport {\n createSessionMcpAuthorizationService,\n defaultSessionMcpToolPrefix,\n SessionMcpOAuthError,\n sessionMcpRouting,\n sessionMcpToolPrefix,\n type SessionMcpAuthorizationBinding,\n type SessionMcpAuthorizationService,\n type SessionMcpClient,\n} from '../services/sessionMcpAuthorization';\nimport { SessionMcpConversationError, type SessionMcpConversationStore } from '../services/sessionMcpConversations';\nimport type { SessionMcpRegistrationStore } from '../services/sessionMcpRegistrationStore';\nimport type { HeadlessHub, HeadlessHubSession } from './headlessHub';\nimport {\n createSessionMcpHttpHandler,\n SESSION_MCP_EXTRA_TOOLS,\n type SessionMcpBaseline,\n type SessionMcpHttpHandler,\n type SessionMcpOperationRegistry,\n} from './sessionMcpHandler';\n\nconst AUTHORIZATION_SERVER_DISCOVERY = '/.well-known/oauth-authorization-server';\nconst AUTHORIZE_ROUTE = '/oauth/authorize';\nconst TOKEN_ROUTE = '/oauth/token';\nconst SESSION_MCP_PATTERN = /^\\/api\\/workspaces\\/([^/]+)\\/sessions\\/([^/]+)\\/mcp(?:-app)?$/u;\nconst SESSION_MCP_URL_TOKEN_PATTERN =\n /^\\/api\\/workspaces\\/([^/]+)\\/sessions\\/([^/]+)\\/mcp(?:-app)?\\/([A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+)$/u;\nconst SESSION_MCP_ACTIVITY_PATTERN = /^\\/api\\/workspaces\\/([^/]+)\\/sessions\\/([^/]+)\\/mcp\\/activity$/u;\nconst SESSION_MCP_CONFIG_PATTERN = /^\\/api\\/workspaces\\/([^/]+)\\/sessions\\/([^/]+)\\/mcp\\/config$/u;\nconst SESSION_MCP_CLIENTS_PATTERN = /^\\/api\\/workspaces\\/([^/]+)\\/sessions\\/([^/]+)\\/mcp\\/clients(?:\\/([^/]+))?$/u;\nconst SESSION_MCP_CONVERSATIONS_PATTERN =\n /^\\/api\\/workspaces\\/([^/]+)\\/sessions\\/([^/]+)\\/mcp\\/conversations(?:\\/([^/]+))?$/u;\n\n/**\n * An OAuth resource as it can be logged: the URL with any URL-token segment and every query value\n * redacted, so a mismatch in origin, path, trailing slash or query is visible without a secret.\n */\nfunction describeResource(resource: string): string {\n let parsed: URL;\n try {\n parsed = new URL(resource);\n } catch {\n return 'a resource that is not a URL';\n }\n const token = SESSION_MCP_URL_TOKEN_PATTERN.exec(parsed.pathname);\n const pathname = token === null ? parsed.pathname : parsed.pathname.slice(0, -token[3]!.length) + '<token>';\n const query = [...parsed.searchParams.keys()].map((key) => `${key}=<redacted>`).join('&');\n return `${parsed.origin}${pathname}${query === '' ? '' : `?${query}`}${parsed.hash === '' ? '' : '#<redacted>'}`;\n}\nfunction redactUrlCredentials(text: string): string {\n return text.replace(/([a-z][a-z0-9+.-]*:\\/\\/)[^\\s/?#]*@/giu, '$1***@');\n}\n\nconst PROTECTED_RESOURCE_PATTERN =\n /^\\/\\.well-known\\/oauth-protected-resource(\\/api\\/workspaces\\/[^/]+\\/sessions\\/[^/]+\\/mcp(?:-app)?)$/u;\n\nexport interface SessionMcpRoutesOptions {\n readonly headlessHub: HeadlessHub;\n readonly publicOrigin: () => string | undefined;\n readonly publicOriginRevision?: () => number;\n readonly authorization?: SessionMcpAuthorizationService;\n readonly registrationStore?: SessionMcpRegistrationStore;\n readonly conversationStore?: SessionMcpConversationStore;\n readonly activityStore?: SessionMcpActivityStore;\n readonly isSessionPersisted?: (sessionId: string, cwd: string) => boolean;\n readonly onNotice?: (message: string) => void;\n}\n\nexport interface SessionMcpRoutes {\n handlePublic(request: Request): Promise<Response | undefined>;\n handleHost(request: Request): Promise<Response | undefined>;\n readonly reservations: PoHubSessionReservations;\n closeSessionBinding(sessionId: string): void;\n close(): void;\n}\n\nfunction json(status: number, value: unknown): Response {\n return Response.json(value, { status, headers: { 'cache-control': 'no-store' } });\n}\n\nfunction oauthError(error: unknown): Response {\n if (error instanceof SessionMcpOAuthError)\n return json(error.code === 'invalid_client' ? 401 : 400, {\n error: error.code,\n error_description: error.message,\n });\n return json(400, { error: 'invalid_request', error_description: 'The OAuth request was invalid.' });\n}\n\nfunction trustedOrigin(value: string | undefined): string | undefined {\n if (value === undefined) return undefined;\n try {\n const url = new URL(value);\n return url.protocol === 'https:' && url.pathname === '/' && url.search === '' && url.hash === ''\n ? url.origin\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction sessionPath(workspaceId: string, sessionId: string): string {\n return `/api/workspaces/${encodeURIComponent(workspaceId)}/sessions/${encodeURIComponent(sessionId)}/mcp`;\n}\n\nfunction parseStringArray(value: unknown): readonly string[] | undefined {\n return Array.isArray(value) && value.every((entry) => typeof entry === 'string') ? value : undefined;\n}\n\nfunction defaultClientName(origin: string): string {\n return `ChatGPT · ${new URL(origin).hostname}`;\n}\n\nfunction formString(form: FormData, name: string): string {\n const value = form.get(name);\n return typeof value === 'string' ? value : '';\n}\n\nfunction publicClient(client: SessionMcpClient, binding: SessionMcpAuthorizationBinding): Record<string, unknown> {\n return {\n clientId: client.clientId,\n name: client.name,\n redirectUri: client.redirectUri,\n tokenEndpointAuthMethod: client.tokenEndpointAuthMethod,\n createdAt: client.createdAt,\n scope: binding.scope,\n routing: sessionMcpRouting(binding.routing),\n tools: binding.tools,\n skills: binding.skills,\n audience: binding.audience,\n ...(binding.toolPrefix === undefined ? {} : { toolPrefix: binding.toolPrefix }),\n };\n}\n\n/** Canonicalizes an intended directory without creating it or accepting symlink aliases. */\nfunction executionDirectory(value: string): string {\n if (!path.isAbsolute(value) || value.includes('\\0') || value.length > 4096)\n throw new SessionMcpConversationError('INVALID_EXECUTION_DIRECTORY', 'Choose an absolute execution directory.');\n let ancestor = path.resolve(value);\n const suffix: string[] = [];\n for (;;) {\n try {\n return path.join(fs.realpathSync(ancestor), ...suffix);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT' || path.dirname(ancestor) === ancestor)\n throw new SessionMcpConversationError(\n 'INVALID_EXECUTION_DIRECTORY',\n 'The execution directory cannot be resolved.',\n );\n suffix.unshift(path.basename(ancestor));\n ancestor = path.dirname(ancestor);\n }\n }\n}\n\nfunction overlappingDirectories(left: string, right: string): boolean {\n const contained = (root: string, target: string): boolean => {\n const relative = path.relative(root, target);\n return (\n relative === '' || (!path.isAbsolute(relative) && relative !== '..' && !relative.startsWith(`..${path.sep}`))\n );\n };\n return contained(left, right) || contained(right, left);\n}\n\n/** Routes the process-local session MCP authority and revokes every grant with its live incarnation. */\nexport function createSessionMcpRoutes(options: SessionMcpRoutesOptions): SessionMcpRoutes {\n const authorization = options.authorization ?? createSessionMcpAuthorizationService();\n // ponytail: Catalog baselines last one parent incarnation; persist snapshots only if clients must avoid a refresh after restart.\n const incarnations = new Map<\n string,\n {\n host: HeadlessHubSession['host'];\n generation: number;\n handlers: Map<string, SessionMcpHttpHandler>;\n operations: SessionMcpOperationRegistry;\n baselines: Map<string, SessionMcpBaseline>;\n }\n >();\n let nextGeneration = 1;\n let publishPending = (): void => {};\n\n const revokeIncarnation = (sessionId: string, generation: number): void => {\n authorization.revokeSessionGeneration(sessionId, generation);\n };\n const abortOperations = (operations: SessionMcpOperationRegistry): void => {\n for (const operation of operations.values()) operation.controller.abort();\n operations.clear();\n };\n const register = (session: HeadlessHubSession): boolean => {\n const current = incarnations.get(session.id);\n if (current?.host === session.host) return false;\n if (current !== undefined) {\n revokeIncarnation(session.id, current.generation);\n abortOperations(current.operations);\n }\n incarnations.set(session.id, {\n host: session.host,\n generation: nextGeneration++,\n handlers: new Map(),\n baselines: new Map(),\n operations: new Map(),\n });\n return true;\n };\n for (const session of options.headlessHub.snapshot()) register(session);\n const unsubscribe = options.headlessHub.onEvent((event) => {\n if (event.kind === 'upsert' && register(event.session)) publishPending();\n if (event.kind === 'removed') {\n const current = incarnations.get(event.sessionId);\n if (current !== undefined) {\n revokeIncarnation(event.sessionId, current.generation);\n abortOperations(current.operations);\n }\n incarnations.delete(event.sessionId);\n }\n });\n\n let observedOrigin: string | undefined;\n let observedOriginRevision: number | undefined;\n let originObserved = false;\n const origin = (): string | undefined => {\n const current = trustedOrigin(options.publicOrigin());\n const revision = options.publicOriginRevision?.();\n if (\n (originObserved && current !== observedOrigin) ||\n (revision !== undefined && observedOriginRevision !== undefined && revision !== observedOriginRevision)\n ) {\n for (const client of authorization.listClients()) {\n authorization.revokeClient(client.clientId);\n options.registrationStore?.remove(client.clientId);\n }\n for (const incarnation of incarnations.values()) {\n incarnation.handlers.clear();\n incarnation.baselines.clear();\n abortOperations(incarnation.operations);\n }\n }\n observedOrigin = current;\n observedOriginRevision = revision;\n originObserved = true;\n restorePersistedRegistrations(current);\n return current;\n };\n const target = (workspaceId: string, sessionId: string) => {\n // Remote MCP clients cannot inherit a grant, including through conversation child routing.\n if (options.headlessHub.computerUse?.ownsSession?.(sessionId)) return undefined;\n const session = options.headlessHub.session(sessionId);\n const incarnation = incarnations.get(sessionId);\n return session !== undefined && session.workspaceId === workspaceId && incarnation?.host === session.host\n ? { session, generation: incarnation.generation }\n : undefined;\n };\n const restorePersistedRegistrations = (configuredOrigin: string | undefined): void => {\n if (configuredOrigin === undefined) return;\n for (const registration of options.registrationStore?.registrations() ?? []) {\n const audience = `${configuredOrigin}${sessionPath(registration.workspaceId, registration.binding.sessionId)}`;\n if (registration.binding.audience !== audience) {\n options.registrationStore?.remove(registration.client.clientId);\n continue;\n }\n const resolved = target(registration.workspaceId, registration.binding.sessionId);\n if (resolved !== undefined) authorization.restorePersistentRegistration(registration, resolved.generation);\n }\n };\n\n const requireStore = (): SessionMcpConversationStore => {\n if (!options.conversationStore)\n throw new SessionMcpConversationError(\n 'CONVERSATION_ROUTING_UNAVAILABLE',\n 'Persistent conversation routing is unavailable.',\n );\n return options.conversationStore;\n };\n publishPending = () => {\n if (!options.conversationStore) return;\n try {\n const records = options.conversationStore.list();\n for (const parent of options.headlessHub.snapshot())\n options.headlessHub.setPendingSessionSetups?.(\n parent.id,\n records\n .filter((record) => record.parentSessionId === parent.id && record.state === 'pending')\n .map((record) => ({\n id: record.id,\n name: `conversation ${record.id.slice(0, 8)}`,\n createdAt: record.createdAt,\n status:\n provision.has(record.id) || recoveries.has(record.id)\n ? ('provisioning' as const)\n : record.failureCode === undefined\n ? ('interrupted' as const)\n : ('failed' as const),\n ...(record.setupKind === undefined ? {} : { setupKind: record.setupKind }),\n ...(record.failureCode === undefined ? {} : { errorCode: record.failureCode }),\n ...(record.cwd === undefined ? {} : { cwd: record.cwd }),\n })),\n );\n } catch (error) {\n options.onNotice?.(error instanceof Error ? error.message : 'Conversation bindings are unavailable.');\n }\n };\n const readReservation = (id: string, parentSessionId: string) => {\n origin();\n const record = requireStore().get(id, parentSessionId);\n const binding = authorization.readAuthorizationBinding(record.clientId);\n const parent = target(record.parentWorkspaceId, parentSessionId);\n if (\n !parent ||\n binding?.routing !== 'conversation' ||\n binding.sessionId !== parentSessionId ||\n binding.sessionGeneration !== parent.generation\n )\n throw new SessionMcpConversationError(\n 'SESSION_UNAVAILABLE',\n 'The connection that owns this setup is no longer active.',\n id,\n );\n return { record, parent };\n };\n const reservations: PoHubSessionReservations = {\n read(id, parentSessionId) {\n const { record } = readReservation(id, parentSessionId);\n return { sessionId: record.id, ...(record.cwd === undefined ? {} : { cwd: record.cwd }) };\n },\n async prepare(id, parentSessionId, suppliedDirectory) {\n const { record, parent } = readReservation(id, parentSessionId);\n const cwd = executionDirectory(suppliedDirectory);\n const parentRoot =\n options.headlessHub.workspaces().find((workspace) => workspace.id === parent.session.workspaceId)?.root ??\n parent.session.cwd;\n const occupied = [\n parentRoot,\n ...options.headlessHub\n .snapshot()\n .filter((session) => session.id !== id)\n .map((session) => session.cwd),\n ...requireStore()\n .list()\n .filter((entry) => entry.id !== id && entry.state !== 'closed' && entry.cwd !== undefined)\n .map((entry) => entry.cwd!),\n ];\n if (occupied.some((directory) => overlappingDirectories(cwd, executionDirectory(directory))))\n throw new SessionMcpConversationError(\n 'EXECUTION_DIRECTORY_SHARED',\n 'Choose a separate checkout, not a directory shared with another session.',\n id,\n );\n if (record.state === 'bound' && record.cwd !== cwd)\n throw new SessionMcpConversationError(\n 'SESSION_TARGET_FIXED',\n 'An initialized session cannot change its directory.',\n id,\n );\n requireStore().prepare(id, parentSessionId, cwd);\n publishPending();\n return { sessionId: id, cwd };\n },\n async complete(id, parentSessionId): Promise<PoHubSessionScope> {\n const { record } = readReservation(id, parentSessionId);\n const child = options.headlessHub.session(id);\n if (\n !record.cwd ||\n !child?.workspaceId ||\n child.parentSessionId !== parentSessionId ||\n (record.setupKind === 'managed-worktree' && child.workspaceId !== record.parentWorkspaceId) ||\n executionDirectory(child.cwd) !== record.cwd ||\n options.isSessionPersisted?.(id, child.cwd) === false\n )\n throw new SessionMcpConversationError(\n 'SESSION_SETUP_INCOMPLETE',\n 'The reserved session is not durably ready. Recover the existing setup instead of creating another checkout.',\n id,\n );\n requireStore().bind(id, parentSessionId, child.workspaceId);\n publishPending();\n return { sessionId: id, workspaceId: child.workspaceId, cwd: child.cwd };\n },\n };\n const provision = new Map<string, Promise<PoHubSessionScope>>();\n const recoveries = new Map<string, Promise<PoHubSessionScope>>();\n const setupDirectory = async (id: string, parentSessionId: string, directory: string): Promise<PoHubSessionScope> => {\n // A mistyped existing-directory choice must not permanently reserve a nonexistent path.\n const canonical = executionDirectory(directory);\n if (!fs.statSync(canonical).isDirectory()) throw new Error('The execution directory is not a directory.');\n const { record: current } = readReservation(id, parentSessionId);\n if (provision.has(id) && current.setupKind === 'managed-worktree')\n throw new SessionMcpConversationError('SESSION_TARGET_FIXED', 'This setup belongs to a managed worktree.', id);\n const selected = requireStore().selectSetup(id, parentSessionId, 'existing-directory');\n if (selected.setupKind !== 'existing-directory')\n throw new SessionMcpConversationError('SESSION_TARGET_FIXED', 'This setup belongs to a managed worktree.', id);\n const prepared = await reservations.prepare(id, parentSessionId, canonical);\n const pending = provision.get(id);\n if (pending) return pending;\n const setup = (async () => {\n if (!options.headlessHub.session(id)) {\n const record = requireStore().get(id, parentSessionId);\n if (record.state === 'bound' || options.isSessionPersisted?.(id, prepared.cwd))\n throw new SessionMcpConversationError(\n 'SESSION_UNAVAILABLE',\n 'Resume the existing session in Po. It will not be recreated automatically.',\n id,\n );\n if (!fs.statSync(prepared.cwd).isDirectory()) throw new Error('The execution directory is not a directory.');\n await options.headlessHub.sessionService.create({\n cwd: prepared.cwd,\n name: `conversation ${id.slice(0, 8)}`,\n parentSessionId,\n sessionProvenance: REMOTE_CONVERSATION_SESSION_PROVENANCE,\n reservationId: id,\n });\n }\n return reservations.complete(id, parentSessionId);\n })();\n provision.set(id, setup);\n publishPending();\n try {\n return await setup;\n } catch (error) {\n requireStore().fail(id, parentSessionId, 'SESSION_UNAVAILABLE');\n throw error;\n } finally {\n if (provision.get(id) === setup) provision.delete(id);\n publishPending();\n }\n };\n const provisionConversationWorktree = async (\n record: ReturnType<SessionMcpConversationStore['reserve']>,\n signal?: AbortSignal,\n ): Promise<PoHubSessionScope> => {\n const pending = provision.get(record.id);\n if (pending) return pending;\n readReservation(record.id, record.parentSessionId);\n requireStore().selectSetup(record.id, record.parentSessionId, 'managed-worktree');\n const setup = (async () => {\n try {\n const child = await options.headlessHub.sessionService.provisionReservedWorktree?.({\n reservationId: record.id,\n parentSessionId: record.parentSessionId,\n signal,\n });\n if (child === undefined || child.sessionId !== record.id)\n throw new Error('Automatic worktree provisioning did not create the reserved session.');\n return child;\n } catch (error) {\n if (error instanceof SessionMcpConversationError) throw error;\n options.onNotice?.(\n `session MCP worktree provisioning failed for reservation ${record.id}: ${error instanceof Error ? redactUrlCredentials(error.message) : 'Automatic worktree provisioning failed.'}`,\n );\n throw new SessionMcpConversationError(\n 'SESSION_WORKTREE_PROVISION_FAILED',\n 'An automatic worktree could not be created for this conversation. Resolve the host Git setup, then retry.',\n record.id,\n );\n }\n })();\n provision.set(record.id, setup);\n publishPending();\n try {\n return await setup;\n } catch (error) {\n requireStore().fail(record.id, record.parentSessionId, 'SESSION_WORKTREE_PROVISION_FAILED');\n throw error;\n } finally {\n if (provision.get(record.id) === setup) provision.delete(record.id);\n publishPending();\n }\n };\n const publicRoutes = async (request: Request): Promise<Response | undefined> => {\n const url = new URL(request.url);\n const configuredOrigin = origin();\n const signedMcpMatch = SESSION_MCP_URL_TOKEN_PATTERN.exec(url.pathname);\n const mcpMatch = SESSION_MCP_PATTERN.exec(url.pathname) ?? signedMcpMatch;\n if (mcpMatch !== null) {\n if (configuredOrigin === undefined) return json(503, { error: 'Session MCP public origin is unavailable.' });\n const workspaceId = decodeURIComponent(mcpMatch[1]);\n const sessionId = decodeURIComponent(mcpMatch[2]);\n const pathToken = signedMcpMatch?.[3];\n const canonicalPath = sessionPath(workspaceId, sessionId);\n const presentation = url.pathname.startsWith(`${canonicalPath}-app`) ? 'app' : 'pure';\n const basePath = presentation === 'app' ? `${canonicalPath}-app` : canonicalPath;\n const exactPath = pathToken === undefined ? basePath : `${basePath}/${pathToken}`;\n if (url.pathname !== exactPath || url.search !== '') return json(404, { error: 'Not found.' });\n const audience = `${configuredOrigin}${canonicalPath}`;\n const resource = `${configuredOrigin}${exactPath}`;\n const incarnation = target(workspaceId, sessionId) === undefined ? undefined : incarnations.get(sessionId);\n const handlers = incarnation?.handlers;\n const cachedHandler = pathToken === undefined ? handlers?.get(resource) : undefined;\n const handler =\n cachedHandler ??\n createSessionMcpHttpHandler({\n audience,\n presentation,\n baselines: incarnation?.baselines ?? new Map(),\n authorization,\n onNotice: options.onNotice,\n onInvocation: (invocation) => {\n if (invocation.sessionId === undefined || invocation.conversationDigest === undefined) return;\n const conversation = options.conversationStore?.find(\n invocation.clientId,\n invocation.parentSessionId,\n invocation.conversationDigest,\n );\n if (\n conversation?.state !== 'bound' ||\n conversation.id !== invocation.sessionId ||\n conversation.workspaceId === undefined\n )\n return;\n options.activityStore?.record(\n conversation.workspaceId,\n conversation.id,\n authorization.readClient(invocation.clientId)?.name ?? 'remote agent',\n invocation,\n );\n },\n ...(pathToken === undefined ? {} : { pathToken, operations: incarnation?.operations }),\n resolveConversation: async (grant, digest, reserve, signal) => {\n const store = requireStore();\n let record = reserve\n ? store.reserve(grant.clientId, sessionId, workspaceId, digest)\n : store.find(grant.clientId, sessionId, digest);\n if (!record)\n throw new SessionMcpConversationError(\n 'SESSION_UNAVAILABLE',\n 'This conversation binding is unavailable. It will not be recreated automatically.',\n );\n const restoring = recoveries.get(record.id);\n if (restoring) await restoring;\n else {\n const existing = record.workspaceId === undefined ? undefined : target(record.workspaceId, record.id);\n if (record.state === 'closed' || (record.state === 'bound' && !existing)) {\n if (\n options.headlessHub.session(record.id) ||\n !record.cwd ||\n options.isSessionPersisted?.(record.id, record.cwd) !== false\n )\n throw new SessionMcpConversationError(\n 'SESSION_UNAVAILABLE',\n 'The bound session is unavailable. Resume it in Po; no other session will be used.',\n record.id,\n );\n if (record.setupKind === undefined && record.cwd !== undefined)\n throw new SessionMcpConversationError(\n 'SESSION_TARGET_FIXED',\n 'This existing setup has no verified provider. Recover it without changing its ownership.',\n record.id,\n );\n record = store.recover(record.id, sessionId);\n const recovery =\n record.setupKind === 'existing-directory' && record.cwd\n ? setupDirectory(record.id, sessionId, record.cwd)\n : provisionConversationWorktree(record, signal);\n recoveries.set(record.id, recovery);\n publishPending();\n try {\n await recovery;\n } finally {\n if (recoveries.get(record.id) === recovery) recoveries.delete(record.id);\n publishPending();\n }\n }\n }\n record = store.find(grant.clientId, sessionId, digest)!;\n if (record.state === 'pending') {\n publishPending();\n if (record.workspaceId !== undefined && options.isSessionPersisted?.(record.id, record.cwd!) !== false)\n throw new SessionMcpConversationError(\n 'SESSION_UNAVAILABLE',\n 'The bound session is unavailable. Resume it in Po; no other session will be used.',\n record.id,\n );\n const pending = provision.get(record.id);\n if (pending) await pending;\n else if (record.setupKind === 'existing-directory' && record.cwd)\n await setupDirectory(record.id, sessionId, record.cwd);\n else await provisionConversationWorktree(record, signal);\n record = store.find(grant.clientId, sessionId, digest);\n if (!record || record.state !== 'bound')\n throw new SessionMcpConversationError(\n 'SESSION_WORKTREE_PROVISION_FAILED',\n 'The automatic worktree setup did not complete. Retry after resolving the host Git setup.',\n );\n }\n const child = record.workspaceId === undefined ? undefined : target(record.workspaceId, record.id);\n if (\n !child ||\n child.session.parentSessionId !== sessionId ||\n executionDirectory(child.session.cwd) !== record.cwd ||\n !fs.existsSync(child.session.cwd)\n )\n throw new SessionMcpConversationError(\n 'SESSION_UNAVAILABLE',\n 'The bound session is unavailable. Resume it in Po; no other session will be used.',\n record.id,\n );\n return {\n sessionId: record.id,\n generation: child.generation,\n toolSurface: child.session.host.mcpSurface,\n agentLocked: () => child.session.host.runtime.agentLocked(),\n };\n },\n onVerified: (grant) => {\n if (options.registrationStore === undefined) return;\n const active = target(workspaceId, sessionId);\n if (active === undefined || grant.sessionGeneration !== active.generation || grant.clientId === '') {\n throw new Error('The session grant is no longer active.');\n }\n if (authorization.readClient(grant.clientId)?.tokenEndpointAuthMethod !== 'client_secret_post') return;\n const registration = authorization.persistentRegistration(grant.clientId, workspaceId, Date.now());\n if (registration === undefined || !options.registrationStore.save(registration)) {\n throw new Error('The verified Session MCP client could not be saved.');\n }\n },\n ...(pathToken === undefined\n ? { resourceMetadataUrl: `${configuredOrigin}/.well-known/oauth-protected-resource${basePath}` }\n : {}),\n resolveSession: (grantedSessionId) => {\n if (grantedSessionId !== sessionId) return undefined;\n const resolved = target(workspaceId, sessionId);\n return resolved === undefined\n ? undefined\n : {\n sessionId,\n generation: resolved.generation,\n toolSurface: resolved.session.host.mcpSurface,\n agentLocked: () => resolved.session.host.runtime.agentLocked(),\n };\n },\n });\n if (pathToken === undefined) handlers?.set(resource, handler);\n return handler(new Request(resource, request));\n }\n\n const protectedMatch = PROTECTED_RESOURCE_PATTERN.exec(url.pathname);\n if (protectedMatch !== null && request.method === 'GET') {\n if (configuredOrigin === undefined) return json(503, { error: 'Session MCP public origin is unavailable.' });\n return json(200, {\n resource: `${configuredOrigin}${protectedMatch[1]}`,\n authorization_servers: [configuredOrigin],\n bearer_methods_supported: ['header'],\n });\n }\n if (url.pathname === AUTHORIZATION_SERVER_DISCOVERY && request.method === 'GET') {\n if (configuredOrigin === undefined) return json(503, { error: 'Session MCP public origin is unavailable.' });\n return json(200, {\n issuer: configuredOrigin,\n authorization_endpoint: `${configuredOrigin}${AUTHORIZE_ROUTE}`,\n token_endpoint: `${configuredOrigin}${TOKEN_ROUTE}`,\n response_types_supported: ['code'],\n grant_types_supported: ['authorization_code', 'refresh_token'],\n code_challenge_methods_supported: ['S256'],\n token_endpoint_auth_methods_supported: ['client_secret_post'],\n });\n }\n if (url.pathname === AUTHORIZE_ROUTE && request.method === 'GET') {\n if (configuredOrigin === undefined) return json(503, { error: 'Session MCP public origin is unavailable.' });\n const clientId = url.searchParams.get('client_id') ?? '';\n const client = authorization.readClient(clientId);\n const binding = authorization.readAuthorizationBinding(clientId);\n const redirectUri = url.searchParams.get('redirect_uri') ?? '';\n if (\n client === undefined ||\n client.tokenEndpointAuthMethod !== 'client_secret_post' ||\n binding === undefined ||\n redirectUri !== client.redirectUri\n ) {\n return oauthError(new SessionMcpOAuthError('invalid_client', 'Unknown client or callback.'));\n }\n const callback = new URL(client.redirectUri);\n const state = url.searchParams.get('state');\n try {\n const boundSession = options.headlessHub.session(binding.sessionId);\n const boundIncarnation = incarnations.get(binding.sessionId);\n const expectedAudience =\n boundSession?.workspaceId === undefined\n ? undefined\n : `${configuredOrigin}${sessionPath(boundSession.workspaceId, binding.sessionId)}`;\n if (\n expectedAudience === undefined ||\n binding.audience !== expectedAudience ||\n boundIncarnation?.host !== boundSession?.host ||\n binding.sessionGeneration !== boundIncarnation?.generation\n ) {\n authorization.revokeClient(clientId);\n throw new SessionMcpOAuthError('invalid_grant', 'The preauthorized session is no longer active.');\n }\n if (url.searchParams.get('response_type') !== 'code')\n throw new SessionMcpOAuthError('invalid_request', 'Only the code response type is supported.');\n const resource = url.searchParams.get('resource');\n if (\n url.searchParams.getAll('resource').length > 1 ||\n (resource !== null && resource !== binding.audience && resource !== `${binding.audience}-app`)\n ) {\n // The requested URL can carry a URL token, which is redacted.\n options.onNotice?.(\n `session MCP authorize refused: client ${clientId} is bound to session ${binding.sessionId}, expecting ${binding.audience} but the connector asked for ${describeResource(resource ?? '')}`,\n );\n throw new SessionMcpOAuthError(\n 'invalid_request',\n \"The requested resource is not preauthorized. The connector's MCP URL must be the session URL this client was created for.\",\n );\n }\n const code = authorization.issueAuthorizationCode({\n clientId,\n redirectUri,\n codeChallenge: url.searchParams.get('code_challenge') ?? '',\n codeChallengeMethod: url.searchParams.get('code_challenge_method') as 'S256',\n });\n callback.searchParams.set('code', code.code);\n } catch (error) {\n callback.searchParams.set('error', error instanceof SessionMcpOAuthError ? error.code : 'invalid_request');\n callback.searchParams.set(\n 'error_description',\n error instanceof Error ? error.message : 'The OAuth request was invalid.',\n );\n }\n if (state !== null) callback.searchParams.set('state', state);\n return new Response(null, { status: 302, headers: { location: callback.href, 'cache-control': 'no-store' } });\n }\n if (url.pathname === TOKEN_ROUTE && request.method === 'POST') {\n try {\n const form = await request.formData();\n const grantType = formString(form, 'grant_type');\n const clientId = formString(form, 'client_id');\n const clientSecret = formString(form, 'client_secret');\n const resource = form.get('resource');\n const binding = authorization.readAuthorizationBinding(clientId);\n if (\n form.getAll('resource').length > 1 ||\n (resource !== null &&\n (typeof resource !== 'string' ||\n (resource !== binding?.audience && resource !== `${binding?.audience}-app`)))\n )\n throw new SessionMcpOAuthError('invalid_request', 'The requested resource is not preauthorized.');\n const result =\n grantType === 'authorization_code'\n ? authorization.exchangeToken({\n grantType,\n clientId,\n clientSecret,\n code: formString(form, 'code'),\n redirectUri: formString(form, 'redirect_uri'),\n codeVerifier: formString(form, 'code_verifier'),\n })\n : grantType === 'refresh_token'\n ? authorization.exchangeToken({\n grantType,\n clientId,\n clientSecret,\n refreshToken: formString(form, 'refresh_token'),\n })\n : (() => {\n throw new SessionMcpOAuthError('unsupported_grant_type', 'The grant type is not supported.');\n })();\n return json(200, {\n access_token: result.accessToken,\n refresh_token: result.refreshToken,\n token_type: result.tokenType,\n expires_in: result.expiresIn,\n });\n } catch (error) {\n return oauthError(error);\n }\n }\n return undefined;\n };\n\n publishPending();\n return {\n reservations,\n closeSessionBinding(sessionId) {\n options.conversationStore?.closeSession(sessionId);\n publishPending();\n },\n handlePublic: publicRoutes,\n async handleHost(request) {\n const url = new URL(request.url);\n origin();\n const configMatch = SESSION_MCP_CONFIG_PATTERN.exec(url.pathname);\n const match = SESSION_MCP_CLIENTS_PATTERN.exec(url.pathname);\n const conversationMatch = SESSION_MCP_CONVERSATIONS_PATTERN.exec(url.pathname);\n const activityMatch = SESSION_MCP_ACTIVITY_PATTERN.exec(url.pathname);\n if (configMatch === null && match === null && conversationMatch === null && activityMatch === null)\n return undefined;\n const routeMatch = configMatch ?? match ?? conversationMatch ?? activityMatch!;\n const workspaceId = decodeURIComponent(routeMatch[1]);\n const sessionId = decodeURIComponent(routeMatch[2]);\n const clientId = match?.[3] === undefined ? undefined : decodeURIComponent(match[3]);\n const resolved = target(workspaceId, sessionId);\n if (activityMatch !== null) {\n if (request.method !== 'GET') return json(405, { error: 'Method not allowed.' });\n const beforeText = url.searchParams.get('before');\n const before = beforeText === null ? undefined : Number(beforeText);\n if (\n [...url.searchParams.keys()].some((key) => key !== 'before') ||\n (before !== undefined && (!Number.isSafeInteger(before) || before <= 0))\n )\n return json(400, { error: 'Invalid history cursor.' });\n if (options.headlessHub.computerUse?.ownsSession?.(sessionId))\n return json(404, { error: 'Session not found.' });\n if (!options.activityStore) return json(503, { error: 'MCP call history is unavailable in this host.' });\n try {\n const conversation = options.conversationStore\n ?.list()\n .find((entry) => entry.id === sessionId && entry.state === 'bound' && entry.workspaceId === workspaceId);\n if (conversation === undefined)\n return json(200, {\n enabled: false,\n available: false,\n tools: [],\n calls: [],\n total: 0,\n } satisfies SessionMcpActivitySnapshot);\n const history = options.activityStore.read(workspaceId, sessionId, before);\n const parent = target(conversation.parentWorkspaceId, conversation.parentSessionId);\n const bindings = authorization.listClients().flatMap((client) => {\n const binding = authorization.readAuthorizationBinding(client.clientId);\n return binding !== undefined &&\n client.clientId === conversation.clientId &&\n binding.sessionId === conversation.parentSessionId &&\n binding.sessionGeneration === parent?.generation\n ? [{ client, binding }]\n : [];\n });\n let available = false;\n let tools: SessionMcpAvailableTool[] = [];\n if (resolved !== undefined && bindings.length > 0) {\n try {\n const surface = resolved.session.host.mcpSurface.readSurface();\n const candidates = [\n ...surface.tools.map((tool) => ({\n name: tool.name,\n label: tool.label,\n description: tool.description,\n inputSchema: tool.parameters,\n })),\n ...SESSION_MCP_EXTRA_TOOLS.map((tool) => ({\n name: tool.name,\n label: tool.title ?? tool.name,\n description: tool.description ?? '',\n inputSchema: tool.inputSchema,\n })),\n ];\n tools = candidates.flatMap((tool) => {\n const connections = bindings\n .filter(({ binding }) => binding.scope === 'session' || binding.tools.includes(tool.name))\n .map(({ client }) => client.name);\n return connections.length === 0 ? [] : [{ ...tool, connections }];\n });\n available = true;\n } catch {\n // Keep durable history visible while the child session's live capability surface is rebuilding.\n available = false;\n }\n }\n const toolPrefix = bindings[0]?.binding.toolPrefix;\n const snapshot: SessionMcpActivitySnapshot = {\n ...history,\n enabled: true,\n available,\n tools,\n ...(toolPrefix === undefined ? {} : { toolPrefix }),\n };\n return json(200, snapshot);\n } catch {\n return json(503, { error: 'MCP call history could not be read. Check the host storage.' });\n }\n }\n if (resolved === undefined) return json(404, { error: 'Session not found.' });\n if (conversationMatch !== null) {\n const id = conversationMatch[3] === undefined ? undefined : decodeURIComponent(conversationMatch[3]);\n try {\n if (request.method === 'GET' && id === undefined)\n return json(200, {\n conversations: requireStore()\n .list()\n .filter((record) => record.parentSessionId === sessionId && record.state !== 'closed')\n .map(({ conversationDigest: _digest, clientId: _clientId, ...record }) => record),\n });\n if (id !== undefined && request.method === 'DELETE') {\n const record = requireStore().get(id, sessionId);\n if (record.state !== 'pending' || options.headlessHub.session(id))\n return json(409, { error: 'Remove the existing session instead.' });\n requireStore().closeSession(id);\n publishPending();\n return json(200, { ok: true });\n }\n if (id !== undefined && request.method === 'POST') {\n const body: unknown = await request.json();\n if (typeof body !== 'object' || body === null || !('cwd' in body) || typeof body.cwd !== 'string')\n return json(400, { error: 'An execution directory is required.' });\n return json(200, { session: await setupDirectory(id, sessionId, body.cwd) });\n }\n return json(405, { error: 'Method not allowed.' });\n } catch (error) {\n return json(409, {\n error:\n error instanceof SessionMcpConversationError\n ? error.message\n : 'Session setup failed. Recover the existing setup before retrying.',\n ...(error instanceof SessionMcpConversationError ? { code: error.code } : {}),\n });\n }\n }\n if (configMatch !== null) {\n if (request.method !== 'GET') return json(405, { error: 'Method not allowed.' });\n const configuredOrigin = origin();\n if (configuredOrigin === undefined) return json(503, { error: 'Session MCP public origin is unavailable.' });\n let surface;\n try {\n surface = resolved.session.host.mcpSurface.readSurface();\n } catch {\n return json(409, { error: 'The session capability surface is not ready.' });\n }\n if (surface.tools.some((tool) => SESSION_MCP_EXTRA_TOOLS.some((wrapper) => wrapper.name === tool.name)))\n return json(409, { error: 'The session capability surface contains a reserved remote tool name.' });\n return json(200, {\n audience: `${configuredOrigin}${sessionPath(workspaceId, sessionId)}`,\n mcpUrl: `${configuredOrigin}${sessionPath(workspaceId, sessionId)}`,\n mcpAppUrl: `${configuredOrigin}${sessionPath(workspaceId, sessionId)}-app`,\n authorizationEndpoint: `${configuredOrigin}${AUTHORIZE_ROUTE}`,\n tokenEndpoint: `${configuredOrigin}${TOKEN_ROUTE}`,\n tools: [\n ...surface.tools.map(({ name, label, description }) => ({ name, label, description })),\n ...SESSION_MCP_EXTRA_TOOLS.map(({ name, title, description }) => ({\n name,\n label: title ?? name,\n description,\n })),\n ],\n skills: surface.skills,\n });\n }\n if (clientId === undefined && request.method === 'GET') {\n return json(200, {\n clients: authorization.listClients().flatMap((client) => {\n const binding = authorization.readAuthorizationBinding(client.clientId);\n return binding?.sessionId === sessionId ? [publicClient(client, binding)] : [];\n }),\n });\n }\n if (clientId === undefined && request.method === 'POST') {\n const configuredOrigin = origin();\n if (configuredOrigin === undefined) return json(503, { error: 'Session MCP public origin is unavailable.' });\n let body: unknown;\n try {\n body = await request.json();\n } catch {\n return json(400, { error: 'Invalid client request.' });\n }\n if (typeof body !== 'object' || body === null) return json(400, { error: 'Invalid client request.' });\n const input = body as Record<string, unknown>;\n if (!options.conversationStore || !options.registrationStore)\n return json(503, { error: 'Mandatory conversation routing requires persistent host state.' });\n if (input.routing !== undefined && input.routing !== 'session' && input.routing !== 'conversation')\n return json(400, { error: 'Session MCP routing is not supported.' });\n const routing = sessionMcpRouting(input.routing);\n if (input.toolPrefix !== undefined && typeof input.toolPrefix !== 'string')\n return json(400, { error: 'Tool prefix must be a string.' });\n // Fixed at creation: session names can be renamed or empty later.\n const toolPrefix = input.toolPrefix?.trim() || defaultSessionMcpToolPrefix(resolved.session.name);\n try {\n sessionMcpToolPrefix(toolPrefix);\n } catch (error) {\n return json(400, { error: (error as Error).message });\n }\n const requestedScope = input.scope;\n if (requestedScope !== undefined && requestedScope !== 'session' && requestedScope !== 'restricted') {\n return json(400, { error: 'Authorization scope is not supported.' });\n }\n const scope = requestedScope === 'session' ? 'session' : 'restricted';\n const hasTools = Object.hasOwn(input, 'tools');\n const hasSkills = Object.hasOwn(input, 'skills');\n const tools = parseStringArray(input.tools);\n const skills = parseStringArray(input.skills);\n const authMethod = input.authMethod;\n const apiKey = authMethod === 'api_key';\n const urlToken = authMethod === 'url_token';\n const nonOAuthCredential = apiKey || urlToken;\n if (authMethod !== undefined && authMethod !== 'oauth' && !nonOAuthCredential)\n return json(400, { error: 'Authentication method is not supported.' });\n if (nonOAuthCredential && (scope !== 'session' || Object.hasOwn(input, 'redirectUri')))\n return json(400, { error: 'Signed URLs and API keys require session scope and no redirectUri.' });\n if (!nonOAuthCredential && typeof input.redirectUri !== 'string')\n return json(400, { error: 'A redirectUri is required.' });\n if (scope === 'session' && (hasTools || hasSkills)) {\n return json(400, { error: 'Session scope cannot include capability grants.' });\n }\n if (scope === 'restricted' && (typeof input.name !== 'string' || !tools || !skills)) {\n return json(400, { error: 'Restricted scope requires a name, tools, and skills.' });\n }\n if (scope === 'restricted') {\n let surface;\n try {\n surface = resolved.session.host.mcpSurface.readSurface();\n } catch {\n return json(409, { error: 'The session capability surface is not ready.' });\n }\n if (surface.tools.some((tool) => SESSION_MCP_EXTRA_TOOLS.some((wrapper) => wrapper.name === tool.name)))\n return json(409, { error: 'The session capability surface contains a reserved remote tool name.' });\n const activeTools = new Set([\n ...surface.tools.map((tool) => tool.name),\n ...SESSION_MCP_EXTRA_TOOLS.map((tool) => tool.name),\n ]);\n const activeSkills = new Set(surface.skills.map((skill) => skill.name));\n if (tools!.some((name) => !activeTools.has(name)) || skills!.some((name) => !activeSkills.has(name)))\n return json(400, { error: 'Every requested grant must be active in the session.' });\n }\n try {\n const client = authorization.createClient(\n urlToken\n ? { name: defaultClientName(configuredOrigin), authMethod: 'url_token' }\n : apiKey\n ? { name: typeof input.name === 'string' ? input.name : 'API key', authMethod: 'api_key' }\n : {\n name: scope === 'session' ? defaultClientName(configuredOrigin) : (input.name as string),\n redirectUri: input.redirectUri as string,\n },\n );\n const audience = `${configuredOrigin}${sessionPath(workspaceId, sessionId)}`;\n try {\n const binding =\n scope === 'session'\n ? authorization.createAuthorizationBinding({\n clientId: client.clientId,\n sessionId,\n sessionGeneration: resolved.generation,\n audience,\n scope: 'session',\n routing,\n toolPrefix,\n })\n : authorization.createAuthorizationBinding({\n clientId: client.clientId,\n sessionId,\n sessionGeneration: resolved.generation,\n audience,\n scope: 'restricted',\n routing,\n toolPrefix,\n tools: [...new Set(tools!)],\n skills: [...new Set(skills!)],\n });\n const connectionUrl = urlToken ? `${audience}/${authorization.issueUrlToken(client.clientId)}` : undefined;\n if (nonOAuthCredential) {\n const registration = authorization.persistentRegistration(client.clientId, workspaceId, Date.now());\n if (registration === undefined || !options.registrationStore.save(registration)) {\n authorization.revokeClient(client.clientId);\n return json(500, { error: 'Session MCP credential could not be saved.' });\n }\n }\n return json(201, {\n client: {\n ...publicClient(client, binding),\n ...(connectionUrl === undefined\n ? { clientSecret: client.clientSecret }\n : { connectionUrl, mcpAppConnectionUrl: `${audience}-app${connectionUrl.slice(audience.length)}` }),\n },\n });\n } catch (error) {\n authorization.revokeClient(client.clientId);\n throw error;\n }\n } catch (error) {\n return oauthError(error);\n }\n }\n if (clientId !== undefined && request.method === 'DELETE') {\n const binding = authorization.readAuthorizationBinding(clientId);\n if (binding?.sessionId !== sessionId) return json(404, { error: 'Client not found.' });\n if (options.registrationStore !== undefined && !options.registrationStore.remove(clientId)) {\n return json(500, { error: 'Client revocation could not be saved.' });\n }\n authorization.revokeClient(clientId);\n for (const presentation of ['pure', 'app'])\n incarnations.get(sessionId)?.baselines.delete(JSON.stringify([presentation, clientId]));\n options.conversationStore?.closeClient(clientId);\n publishPending();\n return json(200, { ok: true });\n }\n return json(405, { error: 'Method not allowed.' });\n },\n close() {\n unsubscribe();\n for (const [sessionId, incarnation] of incarnations) {\n revokeIncarnation(sessionId, incarnation.generation);\n abortOperations(incarnation.operations);\n }\n incarnations.clear();\n options.activityStore?.close();\n },\n };\n}\n\nexport function isPublicSessionMcpRoute(method: string, pathname: string): boolean {\n return (\n SESSION_MCP_PATTERN.test(pathname) ||\n SESSION_MCP_URL_TOKEN_PATTERN.test(pathname) ||\n (method === 'GET' && PROTECTED_RESOURCE_PATTERN.test(pathname)) ||\n (method === 'GET' && (pathname === AUTHORIZATION_SERVER_DISCOVERY || pathname === AUTHORIZE_ROUTE)) ||\n (method === 'POST' && pathname === TOKEN_ROUTE)\n );\n}\n\nexport function isSessionMcpHostRoute(pathname: string): boolean {\n return (\n SESSION_MCP_ACTIVITY_PATTERN.test(pathname) ||\n SESSION_MCP_CONFIG_PATTERN.test(pathname) ||\n SESSION_MCP_CLIENTS_PATTERN.test(pathname) ||\n SESSION_MCP_CONVERSATIONS_PATTERN.test(pathname)\n );\n}\n\n/**\n * The Session MCP management a sealed remote device may reach, which is what Settings uses:\n * the config, listing and creating a session's clients, and revoking one. Creating and\n * revoking are step-up gated. Activity and conversations stay on the host.\n */\nexport function isSessionMcpPhoneRoute(method: string, pathname: string): boolean {\n if (method === 'GET' && SESSION_MCP_CONFIG_PATTERN.test(pathname)) return true;\n const clients = SESSION_MCP_CLIENTS_PATTERN.exec(pathname);\n if (clients === null) return false;\n return clients[3] === undefined ? method === 'GET' || method === 'POST' : method === 'DELETE';\n}\n"],"mappings":"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"}
@@ -1,130 +1,63 @@
1
- const require_runtime = require("../../_virtual/_rolldown/runtime.cjs");
2
- const require_index = require("../services/sqliteTranscriptReader/index.cjs");
3
- const require_nativeChildRuntimes = require("../systems/child/adapters/nativeChildRuntimes.cjs");
4
- let node_fs = require("node:fs");
5
- node_fs = require_runtime.__toESM(node_fs, 1);
6
- let node_path = require("node:path");
7
- node_path = require_runtime.__toESM(node_path, 1);
8
1
  //#region src/server/threadJournals.ts
9
2
  const POLL_MS = 250;
10
- const MAX_INITIAL_BYTES = 8388608;
11
- const NEWLINE = 10;
12
3
  function keyOf(sessionId, threadId) {
13
4
  return `${sessionId}\n${threadId}`;
14
5
  }
15
- function journalFrames(text) {
16
- const frames = [];
17
- for (const line of text.split("\n")) {
18
- let parsed;
19
- try {
20
- parsed = JSON.parse(line);
21
- } catch {
22
- continue;
23
- }
24
- const rows = Array.isArray(parsed) ? parsed : [parsed];
25
- for (const row of rows) {
26
- if (typeof row !== "object" || row === null || Array.isArray(row)) continue;
27
- const entry = row;
28
- const isLegacyMessage = entry.type === "message";
29
- const isCurrentMessage = entry.kind === "entry" && entry.type === "message";
30
- if (!isLegacyMessage && !isCurrentMessage || typeof entry.id !== "string" || typeof entry.message !== "object") continue;
31
- frames.push({
32
- type: "entry_appended",
33
- entry
34
- });
35
- }
36
- }
37
- return frames;
38
- }
39
- function readRange(file, start, end) {
40
- const buffer = Buffer.alloc(end - start);
41
- let descriptor;
42
- try {
43
- descriptor = node_fs.default.openSync(file, "r");
44
- return buffer.subarray(0, node_fs.default.readSync(descriptor, buffer, 0, buffer.length, start));
45
- } catch {
46
- return;
47
- } finally {
48
- if (descriptor !== void 0) node_fs.default.closeSync(descriptor);
49
- }
50
- }
51
- /** Tails child journals only while at least one browser thread is subscribed. */
6
+ /** Follows child transcripts only while at least one browser thread is subscribed. */
52
7
  function createThreadJournals(options) {
53
8
  const tails = /* @__PURE__ */ new Map();
54
9
  const listeners = /* @__PURE__ */ new Set();
55
10
  let timer;
56
11
  const advance = (tail) => {
57
- const candidate = tail.file ?? options.resolve(tail.sessionId, tail.threadId);
58
- if (candidate && node_path.default.isAbsolute(candidate) && node_path.default.extname(candidate) === ".sqlite") {
59
- tail.file = candidate;
60
- if (tail.stop) return [];
61
- const runtime = require_nativeChildRuntimes.nativeChildRuntime(candidate);
62
- if (runtime) {
63
- tail.stop = runtime.state.subscribe((state) => {
64
- const frame = {
65
- type: "transcript_state",
66
- state
67
- };
68
- tail.retained = [frame];
69
- for (const listener of listeners) listener({
70
- sessionId: tail.sessionId,
71
- threadId: tail.threadId,
72
- frame
73
- });
74
- });
75
- tail.retained = [{
12
+ if (tail.stop) return [];
13
+ const thread = options.resolve(tail.sessionId, tail.threadId);
14
+ if (!thread) return [];
15
+ const state = thread.state;
16
+ if (state) {
17
+ tail.stop = state.subscribe((value) => {
18
+ const frame = {
76
19
  type: "transcript_state",
77
- state: runtime.state.value
78
- }];
79
- } else tail.retained = [{ type: "transcript_ready" }];
80
- return tail.retained;
81
- }
82
- if (candidate === void 0 || !node_path.default.isAbsolute(candidate) || node_path.default.extname(candidate) !== ".jsonl") return [];
83
- tail.file = candidate;
84
- let size;
85
- try {
86
- size = node_fs.default.statSync(candidate).size;
87
- } catch {
88
- return [];
20
+ state: value
21
+ };
22
+ tail.retained = [frame];
23
+ for (const listener of listeners) listener({
24
+ sessionId: tail.sessionId,
25
+ threadId: tail.threadId,
26
+ frame
27
+ });
28
+ });
29
+ tail.retained = [{
30
+ type: "transcript_state",
31
+ state: state.value
32
+ }];
33
+ } else {
34
+ tail.stop = () => void 0;
35
+ tail.retained = [{ type: "transcript_ready" }];
89
36
  }
90
- if (size < tail.offset) {
91
- tail.offset = 0;
92
- tail.retained = [];
37
+ return tail.retained;
38
+ };
39
+ const syncTimer = () => {
40
+ const waiting = [...tails.values()].some((tail) => !tail.stop);
41
+ if (waiting && timer === void 0) timer = setInterval(tick, POLL_MS);
42
+ if (!waiting && timer !== void 0) {
43
+ clearInterval(timer);
44
+ timer = void 0;
93
45
  }
94
- const cut = tail.offset === 0 && size > MAX_INITIAL_BYTES;
95
- const start = cut ? size - MAX_INITIAL_BYTES : tail.offset;
96
- if (size <= start) return [];
97
- const chunk = readRange(candidate, start, size);
98
- if (chunk === void 0) return [];
99
- const lastNewline = chunk.lastIndexOf(NEWLINE);
100
- if (lastNewline < 0) return [];
101
- const first = cut ? chunk.indexOf(NEWLINE) + 1 : 0;
102
- const frames = first > lastNewline ? [] : journalFrames(chunk.toString("utf8", first, lastNewline + 1));
103
- tail.offset = start + lastNewline + 1;
104
- if (frames.length > 0) tail.retained = [...tail.retained, ...frames].slice(-300);
105
- return frames;
106
46
  };
107
- const tick = () => {
47
+ function tick() {
108
48
  for (const tail of tails.values()) for (const frame of advance(tail)) for (const listener of listeners) listener({
109
49
  sessionId: tail.sessionId,
110
50
  threadId: tail.threadId,
111
51
  frame
112
52
  });
113
- };
114
- const syncTimer = () => {
115
- if (tails.size > 0 && timer === void 0) timer = setInterval(tick, POLL_MS);
116
- if (tails.size === 0 && timer !== void 0) {
117
- clearInterval(timer);
118
- timer = void 0;
119
- }
120
- };
53
+ syncTimer();
54
+ }
121
55
  return {
122
56
  async readPage(sessionId, threadId, request, context) {
123
- const file = options.resolve(sessionId, threadId);
124
- if (!file || !node_path.default.isAbsolute(file) || node_path.default.extname(file) !== ".sqlite") throw new Error("Child SQLite transcript not found");
57
+ const thread = options.resolve(sessionId, threadId);
58
+ if (!thread) throw new Error("Child transcript not found");
125
59
  const { threadId: _threadId, ...query } = request;
126
- const runtime = require_nativeChildRuntimes.nativeChildRuntime(file);
127
- return runtime ? runtime.readTranscriptPage(query, context) : require_index.readSqliteTranscript(file, query, context);
60
+ return thread.readTranscriptPage(query, context.abortSignal);
128
61
  },
129
62
  subscribe(sessionId, threadId) {
130
63
  const key = keyOf(sessionId, threadId);
@@ -132,8 +65,6 @@ function createThreadJournals(options) {
132
65
  sessionId,
133
66
  threadId,
134
67
  refs: 0,
135
- file: void 0,
136
- offset: 0,
137
68
  retained: []
138
69
  };
139
70
  if (!tails.has(key)) tails.set(key, tail);
@@ -1 +1 @@
1
- {"version":3,"file":"threadJournals.cjs","names":["fs","path","nativeChildRuntime","readSqliteTranscript"],"sources":["../../../src/server/threadJournals.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport type { Context } from '@earendil-works/chord';\n\nimport type { TranscriptPage, TranscriptPageRequest } from '../exports/sessionProtocol';\nimport { readSqliteTranscript } from '../services/sqliteTranscriptReader';\nimport { nativeChildRuntime } from '../systems/child/adapters/nativeChildRuntimes';\n\nconst POLL_MS = 250;\nconst RETAIN_LIMIT = 300;\nconst MAX_INITIAL_BYTES = 8 * 1024 * 1024;\nconst NEWLINE = 0x0a;\n\ntype Frame = Record<string, unknown>;\n\ninterface Tail {\n readonly sessionId: string;\n readonly threadId: string;\n refs: number;\n file: string | undefined;\n offset: number;\n retained: Frame[];\n stop?: () => void;\n}\n\nexport interface ThreadJournals {\n readPage(\n sessionId: string,\n threadId: string,\n request: TranscriptPageRequest,\n context: Context,\n ): Promise<TranscriptPage>;\n subscribe(sessionId: string, threadId: string): Frame[];\n unsubscribe(sessionId: string, threadId: string): void;\n onFrame(listener: (event: { sessionId: string; threadId: string; frame: Frame }) => void): () => void;\n close(): void;\n}\n\nfunction keyOf(sessionId: string, threadId: string): string {\n return `${sessionId}\\n${threadId}`;\n}\n\nfunction journalFrames(text: string): Frame[] {\n const frames: Frame[] = [];\n for (const line of text.split('\\n')) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line) as unknown;\n } catch {\n continue;\n }\n const rows = Array.isArray(parsed) ? parsed : [parsed];\n for (const row of rows) {\n if (typeof row !== 'object' || row === null || Array.isArray(row)) continue;\n const entry = row as Record<string, unknown>;\n const isLegacyMessage = entry.type === 'message';\n const isCurrentMessage = entry.kind === 'entry' && entry.type === 'message';\n if (\n (!isLegacyMessage && !isCurrentMessage) ||\n typeof entry.id !== 'string' ||\n typeof entry.message !== 'object'\n ) {\n continue;\n }\n frames.push({ type: 'entry_appended', entry });\n }\n }\n return frames;\n}\n\nfunction readRange(file: string, start: number, end: number): Buffer | undefined {\n const buffer = Buffer.alloc(end - start);\n let descriptor: number | undefined;\n try {\n descriptor = fs.openSync(file, 'r');\n return buffer.subarray(0, fs.readSync(descriptor, buffer, 0, buffer.length, start));\n } catch {\n return undefined;\n } finally {\n if (descriptor !== undefined) fs.closeSync(descriptor);\n }\n}\n\n/** Tails child journals only while at least one browser thread is subscribed. */\nexport function createThreadJournals(options: {\n resolve(sessionId: string, threadId: string): string | undefined;\n}): ThreadJournals {\n const tails = new Map<string, Tail>();\n const listeners = new Set<(event: { sessionId: string; threadId: string; frame: Frame }) => void>();\n let timer: NodeJS.Timeout | undefined;\n\n const advance = (tail: Tail): Frame[] => {\n const candidate = tail.file ?? options.resolve(tail.sessionId, tail.threadId);\n if (candidate && path.isAbsolute(candidate) && path.extname(candidate) === '.sqlite') {\n tail.file = candidate;\n if (tail.stop) return [];\n const runtime = nativeChildRuntime(candidate);\n if (runtime) {\n tail.stop = runtime.state.subscribe((state) => {\n const frame = { type: 'transcript_state', state };\n tail.retained = [frame];\n for (const listener of listeners) listener({ sessionId: tail.sessionId, threadId: tail.threadId, frame });\n });\n tail.retained = [{ type: 'transcript_state', state: runtime.state.value }];\n } else tail.retained = [{ type: 'transcript_ready' }];\n return tail.retained;\n }\n if (candidate === undefined || !path.isAbsolute(candidate) || path.extname(candidate) !== '.jsonl') return [];\n tail.file = candidate;\n let size: number;\n try {\n size = fs.statSync(candidate).size;\n } catch {\n return [];\n }\n if (size < tail.offset) {\n tail.offset = 0;\n tail.retained = [];\n }\n const cut = tail.offset === 0 && size > MAX_INITIAL_BYTES;\n const start = cut ? size - MAX_INITIAL_BYTES : tail.offset;\n if (size <= start) return [];\n const chunk = readRange(candidate, start, size);\n if (chunk === undefined) return [];\n const lastNewline = chunk.lastIndexOf(NEWLINE);\n if (lastNewline < 0) return [];\n const first = cut ? chunk.indexOf(NEWLINE) + 1 : 0;\n const frames = first > lastNewline ? [] : journalFrames(chunk.toString('utf8', first, lastNewline + 1));\n tail.offset = start + lastNewline + 1;\n if (frames.length > 0) tail.retained = [...tail.retained, ...frames].slice(-RETAIN_LIMIT);\n return frames;\n };\n const tick = (): void => {\n for (const tail of tails.values()) {\n for (const frame of advance(tail)) {\n for (const listener of listeners) listener({ sessionId: tail.sessionId, threadId: tail.threadId, frame });\n }\n }\n };\n const syncTimer = (): void => {\n if (tails.size > 0 && timer === undefined) timer = setInterval(tick, POLL_MS);\n if (tails.size === 0 && timer !== undefined) {\n clearInterval(timer);\n timer = undefined;\n }\n };\n\n return {\n async readPage(sessionId, threadId, request, context) {\n const file = options.resolve(sessionId, threadId);\n if (!file || !path.isAbsolute(file) || path.extname(file) !== '.sqlite')\n throw new Error('Child SQLite transcript not found');\n const { threadId: _threadId, ...query } = request;\n const runtime = nativeChildRuntime(file);\n return runtime ? runtime.readTranscriptPage(query, context) : readSqliteTranscript(file, query, context);\n },\n subscribe(sessionId, threadId) {\n const key = keyOf(sessionId, threadId);\n const tail = tails.get(key) ?? {\n sessionId,\n threadId,\n refs: 0,\n file: undefined,\n offset: 0,\n retained: [],\n };\n if (!tails.has(key)) tails.set(key, tail);\n tail.refs += 1;\n advance(tail);\n syncTimer();\n return [...tail.retained];\n },\n unsubscribe(sessionId, threadId) {\n const key = keyOf(sessionId, threadId);\n const tail = tails.get(key);\n if (tail === undefined) return;\n tail.refs -= 1;\n if (tail.refs <= 0) {\n tail.stop?.();\n tails.delete(key);\n }\n syncTimer();\n },\n onFrame(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n close() {\n if (timer !== undefined) clearInterval(timer);\n timer = undefined;\n for (const tail of tails.values()) tail.stop?.();\n tails.clear();\n listeners.clear();\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"threadJournals.cjs","names":[],"sources":["../../../src/server/threadJournals.ts"],"sourcesContent":["import type { Context } from '@earendil-works/chord';\n\nimport type { PoChildThread } from '../exports/childSession';\nimport type { TranscriptPage, TranscriptPageRequest } from '../exports/sessionProtocol';\n\nconst POLL_MS = 250;\n\ntype Frame = Record<string, unknown>;\n\ninterface Tail {\n readonly sessionId: string;\n readonly threadId: string;\n refs: number;\n retained: Frame[];\n stop?: () => void;\n}\n\nexport interface ThreadJournals {\n readPage(\n sessionId: string,\n threadId: string,\n request: TranscriptPageRequest,\n context: Context,\n ): Promise<TranscriptPage>;\n subscribe(sessionId: string, threadId: string): Frame[];\n unsubscribe(sessionId: string, threadId: string): void;\n onFrame(listener: (event: { sessionId: string; threadId: string; frame: Frame }) => void): () => void;\n close(): void;\n}\n\nfunction keyOf(sessionId: string, threadId: string): string {\n return `${sessionId}\\n${threadId}`;\n}\n\n/** Follows child transcripts only while at least one browser thread is subscribed. */\nexport function createThreadJournals(options: {\n resolve(sessionId: string, threadId: string): PoChildThread | undefined;\n}): ThreadJournals {\n const tails = new Map<string, Tail>();\n const listeners = new Set<(event: { sessionId: string; threadId: string; frame: Frame }) => void>();\n let timer: NodeJS.Timeout | undefined;\n\n // A thread is looked up until its run appears; then it follows the run's live state, or reads as finished.\n const advance = (tail: Tail): Frame[] => {\n if (tail.stop) return [];\n const thread = options.resolve(tail.sessionId, tail.threadId);\n if (!thread) return [];\n const state = thread.state;\n if (state) {\n tail.stop = state.subscribe((value) => {\n const frame = { type: 'transcript_state', state: value };\n tail.retained = [frame];\n for (const listener of listeners) listener({ sessionId: tail.sessionId, threadId: tail.threadId, frame });\n });\n tail.retained = [{ type: 'transcript_state', state: state.value }];\n } else {\n tail.stop = () => undefined;\n tail.retained = [{ type: 'transcript_ready' }];\n }\n return tail.retained;\n };\n const syncTimer = (): void => {\n const waiting = [...tails.values()].some((tail) => !tail.stop);\n if (waiting && timer === undefined) timer = setInterval(tick, POLL_MS);\n if (!waiting && timer !== undefined) {\n clearInterval(timer);\n timer = undefined;\n }\n };\n function tick(): void {\n for (const tail of tails.values()) {\n for (const frame of advance(tail)) {\n for (const listener of listeners) listener({ sessionId: tail.sessionId, threadId: tail.threadId, frame });\n }\n }\n syncTimer();\n }\n\n return {\n async readPage(sessionId, threadId, request, context) {\n const thread = options.resolve(sessionId, threadId);\n if (!thread) throw new Error('Child transcript not found');\n const { threadId: _threadId, ...query } = request;\n return thread.readTranscriptPage(query, context.abortSignal);\n },\n subscribe(sessionId, threadId) {\n const key = keyOf(sessionId, threadId);\n const tail = tails.get(key) ?? { sessionId, threadId, refs: 0, retained: [] };\n if (!tails.has(key)) tails.set(key, tail);\n tail.refs += 1;\n advance(tail);\n syncTimer();\n return [...tail.retained];\n },\n unsubscribe(sessionId, threadId) {\n const key = keyOf(sessionId, threadId);\n const tail = tails.get(key);\n if (tail === undefined) return;\n tail.refs -= 1;\n if (tail.refs <= 0) {\n tail.stop?.();\n tails.delete(key);\n }\n syncTimer();\n },\n onFrame(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n close() {\n if (timer !== undefined) clearInterval(timer);\n timer = undefined;\n for (const tail of tails.values()) tail.stop?.();\n tails.clear();\n listeners.clear();\n },\n };\n}\n"],"mappings":";AAKA,MAAM,UAAU;AAyBhB,SAAS,MAAM,WAAmB,UAA0B;CAC1D,OAAO,GAAG,UAAU,IAAI;AAC1B;;AAGA,SAAgB,qBAAqB,SAElB;CACjB,MAAM,wBAAQ,IAAI,IAAkB;CACpC,MAAM,4BAAY,IAAI,IAA4E;CAClG,IAAI;CAGJ,MAAM,WAAW,SAAwB;EACvC,IAAI,KAAK,MAAM,OAAO,CAAC;EACvB,MAAM,SAAS,QAAQ,QAAQ,KAAK,WAAW,KAAK,QAAQ;EAC5D,IAAI,CAAC,QAAQ,OAAO,CAAC;EACrB,MAAM,QAAQ,OAAO;EACrB,IAAI,OAAO;GACT,KAAK,OAAO,MAAM,WAAW,UAAU;IACrC,MAAM,QAAQ;KAAE,MAAM;KAAoB,OAAO;IAAM;IACvD,KAAK,WAAW,CAAC,KAAK;IACtB,KAAK,MAAM,YAAY,WAAW,SAAS;KAAE,WAAW,KAAK;KAAW,UAAU,KAAK;KAAU;IAAM,CAAC;GAC1G,CAAC;GACD,KAAK,WAAW,CAAC;IAAE,MAAM;IAAoB,OAAO,MAAM;GAAM,CAAC;EACnE,OAAO;GACL,KAAK,aAAa,KAAA;GAClB,KAAK,WAAW,CAAC,EAAE,MAAM,mBAAmB,CAAC;EAC/C;EACA,OAAO,KAAK;CACd;CACA,MAAM,kBAAwB;EAC5B,MAAM,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,KAAK,IAAI;EAC7D,IAAI,WAAW,UAAU,KAAA,GAAW,QAAQ,YAAY,MAAM,OAAO;EACrE,IAAI,CAAC,WAAW,UAAU,KAAA,GAAW;GACnC,cAAc,KAAK;GACnB,QAAQ,KAAA;EACV;CACF;CACA,SAAS,OAAa;EACpB,KAAK,MAAM,QAAQ,MAAM,OAAO,GAC9B,KAAK,MAAM,SAAS,QAAQ,IAAI,GAC9B,KAAK,MAAM,YAAY,WAAW,SAAS;GAAE,WAAW,KAAK;GAAW,UAAU,KAAK;GAAU;EAAM,CAAC;EAG5G,UAAU;CACZ;CAEA,OAAO;EACL,MAAM,SAAS,WAAW,UAAU,SAAS,SAAS;GACpD,MAAM,SAAS,QAAQ,QAAQ,WAAW,QAAQ;GAClD,IAAI,CAAC,QAAQ,MAAM,IAAI,MAAM,4BAA4B;GACzD,MAAM,EAAE,UAAU,WAAW,GAAG,UAAU;GAC1C,OAAO,OAAO,mBAAmB,OAAO,QAAQ,WAAW;EAC7D;EACA,UAAU,WAAW,UAAU;GAC7B,MAAM,MAAM,MAAM,WAAW,QAAQ;GACrC,MAAM,OAAO,MAAM,IAAI,GAAG,KAAK;IAAE;IAAW;IAAU,MAAM;IAAG,UAAU,CAAC;GAAE;GAC5E,IAAI,CAAC,MAAM,IAAI,GAAG,GAAG,MAAM,IAAI,KAAK,IAAI;GACxC,KAAK,QAAQ;GACb,QAAQ,IAAI;GACZ,UAAU;GACV,OAAO,CAAC,GAAG,KAAK,QAAQ;EAC1B;EACA,YAAY,WAAW,UAAU;GAC/B,MAAM,MAAM,MAAM,WAAW,QAAQ;GACrC,MAAM,OAAO,MAAM,IAAI,GAAG;GAC1B,IAAI,SAAS,KAAA,GAAW;GACxB,KAAK,QAAQ;GACb,IAAI,KAAK,QAAQ,GAAG;IAClB,KAAK,OAAO;IACZ,MAAM,OAAO,GAAG;GAClB;GACA,UAAU;EACZ;EACA,QAAQ,UAAU;GAChB,UAAU,IAAI,QAAQ;GACtB,aAAa,UAAU,OAAO,QAAQ;EACxC;EACA,QAAQ;GACN,IAAI,UAAU,KAAA,GAAW,cAAc,KAAK;GAC5C,QAAQ,KAAA;GACR,KAAK,MAAM,QAAQ,MAAM,OAAO,GAAG,KAAK,OAAO;GAC/C,MAAM,MAAM;GACZ,UAAU,MAAM;EAClB;CACF;AACF"}