@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,127 +1,63 @@
1
- import { readSqliteTranscript } from "../services/sqliteTranscriptReader/index.mjs";
2
- import { nativeChildRuntime } from "../systems/child/adapters/nativeChildRuntimes.mjs";
3
- import fs from "node:fs";
4
- import path from "node:path";
5
1
  //#region src/server/threadJournals.ts
6
2
  const POLL_MS = 250;
7
- const MAX_INITIAL_BYTES = 8388608;
8
- const NEWLINE = 10;
9
3
  function keyOf(sessionId, threadId) {
10
4
  return `${sessionId}\n${threadId}`;
11
5
  }
12
- function journalFrames(text) {
13
- const frames = [];
14
- for (const line of text.split("\n")) {
15
- let parsed;
16
- try {
17
- parsed = JSON.parse(line);
18
- } catch {
19
- continue;
20
- }
21
- const rows = Array.isArray(parsed) ? parsed : [parsed];
22
- for (const row of rows) {
23
- if (typeof row !== "object" || row === null || Array.isArray(row)) continue;
24
- const entry = row;
25
- const isLegacyMessage = entry.type === "message";
26
- const isCurrentMessage = entry.kind === "entry" && entry.type === "message";
27
- if (!isLegacyMessage && !isCurrentMessage || typeof entry.id !== "string" || typeof entry.message !== "object") continue;
28
- frames.push({
29
- type: "entry_appended",
30
- entry
31
- });
32
- }
33
- }
34
- return frames;
35
- }
36
- function readRange(file, start, end) {
37
- const buffer = Buffer.alloc(end - start);
38
- let descriptor;
39
- try {
40
- descriptor = fs.openSync(file, "r");
41
- return buffer.subarray(0, fs.readSync(descriptor, buffer, 0, buffer.length, start));
42
- } catch {
43
- return;
44
- } finally {
45
- if (descriptor !== void 0) fs.closeSync(descriptor);
46
- }
47
- }
48
- /** 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. */
49
7
  function createThreadJournals(options) {
50
8
  const tails = /* @__PURE__ */ new Map();
51
9
  const listeners = /* @__PURE__ */ new Set();
52
10
  let timer;
53
11
  const advance = (tail) => {
54
- const candidate = tail.file ?? options.resolve(tail.sessionId, tail.threadId);
55
- if (candidate && path.isAbsolute(candidate) && path.extname(candidate) === ".sqlite") {
56
- tail.file = candidate;
57
- if (tail.stop) return [];
58
- const runtime = nativeChildRuntime(candidate);
59
- if (runtime) {
60
- tail.stop = runtime.state.subscribe((state) => {
61
- const frame = {
62
- type: "transcript_state",
63
- state
64
- };
65
- tail.retained = [frame];
66
- for (const listener of listeners) listener({
67
- sessionId: tail.sessionId,
68
- threadId: tail.threadId,
69
- frame
70
- });
71
- });
72
- 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 = {
73
19
  type: "transcript_state",
74
- state: runtime.state.value
75
- }];
76
- } else tail.retained = [{ type: "transcript_ready" }];
77
- return tail.retained;
78
- }
79
- if (candidate === void 0 || !path.isAbsolute(candidate) || path.extname(candidate) !== ".jsonl") return [];
80
- tail.file = candidate;
81
- let size;
82
- try {
83
- size = fs.statSync(candidate).size;
84
- } catch {
85
- 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" }];
86
36
  }
87
- if (size < tail.offset) {
88
- tail.offset = 0;
89
- 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;
90
45
  }
91
- const cut = tail.offset === 0 && size > MAX_INITIAL_BYTES;
92
- const start = cut ? size - MAX_INITIAL_BYTES : tail.offset;
93
- if (size <= start) return [];
94
- const chunk = readRange(candidate, start, size);
95
- if (chunk === void 0) return [];
96
- const lastNewline = chunk.lastIndexOf(NEWLINE);
97
- if (lastNewline < 0) return [];
98
- const first = cut ? chunk.indexOf(NEWLINE) + 1 : 0;
99
- const frames = first > lastNewline ? [] : journalFrames(chunk.toString("utf8", first, lastNewline + 1));
100
- tail.offset = start + lastNewline + 1;
101
- if (frames.length > 0) tail.retained = [...tail.retained, ...frames].slice(-300);
102
- return frames;
103
46
  };
104
- const tick = () => {
47
+ function tick() {
105
48
  for (const tail of tails.values()) for (const frame of advance(tail)) for (const listener of listeners) listener({
106
49
  sessionId: tail.sessionId,
107
50
  threadId: tail.threadId,
108
51
  frame
109
52
  });
110
- };
111
- const syncTimer = () => {
112
- if (tails.size > 0 && timer === void 0) timer = setInterval(tick, POLL_MS);
113
- if (tails.size === 0 && timer !== void 0) {
114
- clearInterval(timer);
115
- timer = void 0;
116
- }
117
- };
53
+ syncTimer();
54
+ }
118
55
  return {
119
56
  async readPage(sessionId, threadId, request, context) {
120
- const file = options.resolve(sessionId, threadId);
121
- if (!file || !path.isAbsolute(file) || path.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");
122
59
  const { threadId: _threadId, ...query } = request;
123
- const runtime = nativeChildRuntime(file);
124
- return runtime ? runtime.readTranscriptPage(query, context) : readSqliteTranscript(file, query, context);
60
+ return thread.readTranscriptPage(query, context.abortSignal);
125
61
  },
126
62
  subscribe(sessionId, threadId) {
127
63
  const key = keyOf(sessionId, threadId);
@@ -129,8 +65,6 @@ function createThreadJournals(options) {
129
65
  sessionId,
130
66
  threadId,
131
67
  refs: 0,
132
- file: void 0,
133
- offset: 0,
134
68
  retained: []
135
69
  };
136
70
  if (!tails.has(key)) tails.set(key, tail);
@@ -1 +1 @@
1
- {"version":3,"file":"threadJournals.mjs","names":[],"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.mjs","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"}
@@ -4,7 +4,7 @@ function sorted(values) {
4
4
  return [...new Set(values)].sort();
5
5
  }
6
6
  /** A path under the same mount that no contract declares, used to calibrate. */
7
- const CONTROL_PATH = "/__doom_surface_control__";
7
+ const CONTROL_PATH = "/__po_surface_control__";
8
8
  /**
9
9
  * Whether a response is the framework's own miss rather than a handler's answer.
10
10
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["mountPackageApi"],"sources":["../../../../src/services/apiSurfaceAssert/index.ts"],"sourcesContent":["/**\n * Checks that what a package declares is what it actually serves.\n *\n * Nothing else in the toolchain does. `parseApiContract` checks a contract's\n * shape, its id uniqueness and that it is JSON, and stops there; no step\n * compares it to a mounted route or to a registration. That gap is not\n * theoretical. One package shipped a valid four-route contract, a well-tested\n * Hono app and a full unit suite for an API that was never mounted at all, and\n * the only test touching the mount asserted the emptiness rather than noticing\n * it.\n *\n * Two questions, both about liveness rather than semantics: are the base paths\n * this scope registers the same set it declares, and does every declared route\n * reach a handler. A route answering 500 passes; a route answering 404 or 405\n * does not exist.\n */\n\nimport type { DoomApiContract } from '../../schemas/apiContracts';\nimport type { DoomApi, DoomApiScope } from '../../schemas/packageApi';\nimport { mountPackageApi, type MountPackageApiOptions } from '../packageApiHarness';\n\nexport interface ApiSurfaceOptions {\n readonly contract: DoomApiContract;\n /** The scope being checked; only its declarations and registrations are compared. */\n readonly scope: DoomApiScope;\n /** What the generated facet registered at this scope, in registration order. */\n readonly apis: readonly DoomApi[];\n /** Passed through to the harness, so a session API gets its id and working directory. */\n readonly mount?: Omit<MountPackageApiOptions, 'scope'>;\n /**\n * Extra request detail for a route a bare request cannot reach, keyed by\n * contract id, most often a path parameter to substitute.\n */\n readonly probe?: Readonly<Record<string, RequestInit & { readonly path?: string }>>;\n}\n\nfunction sorted(values: Iterable<string>): string[] {\n return [...new Set(values)].sort();\n}\n\n/** A path under the same mount that no contract declares, used to calibrate. */\nconst CONTROL_PATH = '/__doom_surface_control__';\n\n/**\n * Whether a response is the framework's own miss rather than a handler's answer.\n *\n * Status alone cannot tell them apart: a route that refuses an unknown record\n * answers 404 legitimately, and reading that as \"not mounted\" would fail every\n * honest API. So the same request is sent to a path nothing declares, and the\n * two are compared. A declared route answering exactly what an undeclared one\n * answers is not being served.\n *\n * A catch-all route would match the control too and read as unrouted. No\n * package has one; if one appears it should probe an explicit path instead.\n */\nasync function isUnrouted(\n mounted: { readonly mountPath: string; fetch(path: string, init?: RequestInit): Promise<Response> },\n response: Response,\n init: RequestInit,\n): Promise<boolean> {\n if (response.status !== 404 && response.status !== 405) return false;\n const control = await mounted.fetch(`${mounted.mountPath}${CONTROL_PATH}`, init);\n if (control.status !== response.status) return false;\n return (await control.text()) === (await response.text());\n}\n\n/** Throws with the disagreement spelled out, or returns having found none. */\nexport async function assertContractSurface(options: ApiSurfaceOptions): Promise<void> {\n const routes = options.contract.http.filter((route) => route.scope === options.scope && route.basePath !== undefined);\n const declared = sorted(routes.map((route) => route.basePath as string));\n const registered = sorted(options.apis.map((api) => api.basePath));\n\n const missing = declared.filter((basePath) => !registered.includes(basePath));\n if (missing.length > 0) {\n throw new Error(\n `The contract declares ${missing.join(', ')} at ${options.scope} scope, but nothing is mounted there. ` +\n `Mounted: ${registered.join(', ') || '(nothing)'}.`,\n );\n }\n const undeclared = registered.filter((basePath) => !declared.includes(basePath));\n if (undeclared.length > 0) {\n throw new Error(\n `${undeclared.join(', ')} is mounted at ${options.scope} scope but the contract never declares it there.`,\n );\n }\n\n for (const api of options.apis) {\n const mounted = mountPackageApi(api, { ...options.mount, scope: options.scope });\n try {\n for (const route of routes.filter((entry) => entry.basePath === api.basePath)) {\n const probe = options.probe?.[route.id];\n const path = probe?.path ?? route.path;\n const init = { method: route.method, ...probe };\n const response = await mounted.fetch(`${mounted.mountPath}${path === '/' ? '' : path}`, init);\n if (!(await isUnrouted(mounted, response, init))) continue;\n throw new Error(\n `${route.method} ${mounted.mountPath}${path} is declared as '${route.id}' but answered ` +\n `${response.status} exactly as an unrouted path does, so no handler serves it.`,\n );\n }\n } finally {\n mounted.close();\n }\n }\n}\n"],"mappings":";;AAoCA,SAAS,OAAO,QAAoC;CAClD,OAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK;AACnC;;AAGA,MAAM,eAAe;;;;;;;;;;;;;AAcrB,eAAe,WACb,SACA,UACA,MACkB;CAClB,IAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK,OAAO;CAC/D,MAAM,UAAU,MAAM,QAAQ,MAAM,GAAG,QAAQ,YAAY,gBAAgB,IAAI;CAC/E,IAAI,QAAQ,WAAW,SAAS,QAAQ,OAAO;CAC/C,OAAQ,MAAM,QAAQ,KAAK,MAAQ,MAAM,SAAS,KAAK;AACzD;;AAGA,eAAsB,sBAAsB,SAA2C;CACrF,MAAM,SAAS,QAAQ,SAAS,KAAK,QAAQ,UAAU,MAAM,UAAU,QAAQ,SAAS,MAAM,aAAa,KAAA,CAAS;CACpH,MAAM,WAAW,OAAO,OAAO,KAAK,UAAU,MAAM,QAAkB,CAAC;CACvE,MAAM,aAAa,OAAO,QAAQ,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC;CAEjE,MAAM,UAAU,SAAS,QAAQ,aAAa,CAAC,WAAW,SAAS,QAAQ,CAAC;CAC5E,IAAI,QAAQ,SAAS,GACnB,MAAM,IAAI,MACR,yBAAyB,QAAQ,KAAK,IAAI,EAAE,MAAM,QAAQ,MAAM,iDAClD,WAAW,KAAK,IAAI,KAAK,YAAY,EACrD;CAEF,MAAM,aAAa,WAAW,QAAQ,aAAa,CAAC,SAAS,SAAS,QAAQ,CAAC;CAC/E,IAAI,WAAW,SAAS,GACtB,MAAM,IAAI,MACR,GAAG,WAAW,KAAK,IAAI,EAAE,iBAAiB,QAAQ,MAAM,iDAC1D;CAGF,KAAK,MAAM,OAAO,QAAQ,MAAM;EAC9B,MAAM,UAAUA,cAAAA,gBAAgB,KAAK;GAAE,GAAG,QAAQ;GAAO,OAAO,QAAQ;EAAM,CAAC;EAC/E,IAAI;GACF,KAAK,MAAM,SAAS,OAAO,QAAQ,UAAU,MAAM,aAAa,IAAI,QAAQ,GAAG;IAC7E,MAAM,QAAQ,QAAQ,QAAQ,MAAM;IACpC,MAAM,OAAO,OAAO,QAAQ,MAAM;IAClC,MAAM,OAAO;KAAE,QAAQ,MAAM;KAAQ,GAAG;IAAM;IAC9C,MAAM,WAAW,MAAM,QAAQ,MAAM,GAAG,QAAQ,YAAY,SAAS,MAAM,KAAK,QAAQ,IAAI;IAC5F,IAAI,CAAE,MAAM,WAAW,SAAS,UAAU,IAAI,GAAI;IAClD,MAAM,IAAI,MACR,GAAG,MAAM,OAAO,GAAG,QAAQ,YAAY,KAAK,mBAAmB,MAAM,GAAG,iBACnE,SAAS,OAAO,4DACvB;GACF;EACF,UAAU;GACR,QAAQ,MAAM;EAChB;CACF;AACF"}
1
+ {"version":3,"file":"index.cjs","names":["mountPackageApi"],"sources":["../../../../src/services/apiSurfaceAssert/index.ts"],"sourcesContent":["/**\n * Checks that what a package declares is what it actually serves.\n *\n * Nothing else in the toolchain does. `parseApiContract` checks a contract's\n * shape, its id uniqueness and that it is JSON, and stops there; no step\n * compares it to a mounted route or to a registration. That gap is not\n * theoretical. One package shipped a valid four-route contract, a well-tested\n * Hono app and a full unit suite for an API that was never mounted at all, and\n * the only test touching the mount asserted the emptiness rather than noticing\n * it.\n *\n * Two questions, both about liveness rather than semantics: are the base paths\n * this scope registers the same set it declares, and does every declared route\n * reach a handler. A route answering 500 passes; a route answering 404 or 405\n * does not exist.\n */\n\nimport type { PoApiContract } from '../../schemas/apiContracts';\nimport type { PoApi, PoApiScope } from '../../schemas/packageApi';\nimport { mountPackageApi, type MountPackageApiOptions } from '../packageApiHarness';\n\nexport interface ApiSurfaceOptions {\n readonly contract: PoApiContract;\n /** The scope being checked; only its declarations and registrations are compared. */\n readonly scope: PoApiScope;\n /** What the generated server plugin registered at this scope, in registration order. */\n readonly apis: readonly PoApi[];\n /** Passed through to the harness, so a session API gets its id and working directory. */\n readonly mount?: Omit<MountPackageApiOptions, 'scope'>;\n /**\n * Extra request detail for a route a bare request cannot reach, keyed by\n * contract id, most often a path parameter to substitute.\n */\n readonly probe?: Readonly<Record<string, RequestInit & { readonly path?: string }>>;\n}\n\nfunction sorted(values: Iterable<string>): string[] {\n return [...new Set(values)].sort();\n}\n\n/** A path under the same mount that no contract declares, used to calibrate. */\nconst CONTROL_PATH = '/__po_surface_control__';\n\n/**\n * Whether a response is the framework's own miss rather than a handler's answer.\n *\n * Status alone cannot tell them apart: a route that refuses an unknown record\n * answers 404 legitimately, and reading that as \"not mounted\" would fail every\n * honest API. So the same request is sent to a path nothing declares, and the\n * two are compared. A declared route answering exactly what an undeclared one\n * answers is not being served.\n *\n * A catch-all route would match the control too and read as unrouted. No\n * package has one; if one appears it should probe an explicit path instead.\n */\nasync function isUnrouted(\n mounted: { readonly mountPath: string; fetch(path: string, init?: RequestInit): Promise<Response> },\n response: Response,\n init: RequestInit,\n): Promise<boolean> {\n if (response.status !== 404 && response.status !== 405) return false;\n const control = await mounted.fetch(`${mounted.mountPath}${CONTROL_PATH}`, init);\n if (control.status !== response.status) return false;\n return (await control.text()) === (await response.text());\n}\n\n/** Throws with the disagreement spelled out, or returns having found none. */\nexport async function assertContractSurface(options: ApiSurfaceOptions): Promise<void> {\n const routes = options.contract.http.filter((route) => route.scope === options.scope && route.basePath !== undefined);\n const declared = sorted(routes.map((route) => route.basePath as string));\n const registered = sorted(options.apis.map((api) => api.basePath));\n\n const missing = declared.filter((basePath) => !registered.includes(basePath));\n if (missing.length > 0) {\n throw new Error(\n `The contract declares ${missing.join(', ')} at ${options.scope} scope, but nothing is mounted there. ` +\n `Mounted: ${registered.join(', ') || '(nothing)'}.`,\n );\n }\n const undeclared = registered.filter((basePath) => !declared.includes(basePath));\n if (undeclared.length > 0) {\n throw new Error(\n `${undeclared.join(', ')} is mounted at ${options.scope} scope but the contract never declares it there.`,\n );\n }\n\n for (const api of options.apis) {\n const mounted = mountPackageApi(api, { ...options.mount, scope: options.scope });\n try {\n for (const route of routes.filter((entry) => entry.basePath === api.basePath)) {\n const probe = options.probe?.[route.id];\n const path = probe?.path ?? route.path;\n const init = { method: route.method, ...probe };\n const response = await mounted.fetch(`${mounted.mountPath}${path === '/' ? '' : path}`, init);\n if (!(await isUnrouted(mounted, response, init))) continue;\n throw new Error(\n `${route.method} ${mounted.mountPath}${path} is declared as '${route.id}' but answered ` +\n `${response.status} exactly as an unrouted path does, so no handler serves it.`,\n );\n }\n } finally {\n mounted.close();\n }\n }\n}\n"],"mappings":";;AAoCA,SAAS,OAAO,QAAoC;CAClD,OAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK;AACnC;;AAGA,MAAM,eAAe;;;;;;;;;;;;;AAcrB,eAAe,WACb,SACA,UACA,MACkB;CAClB,IAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK,OAAO;CAC/D,MAAM,UAAU,MAAM,QAAQ,MAAM,GAAG,QAAQ,YAAY,gBAAgB,IAAI;CAC/E,IAAI,QAAQ,WAAW,SAAS,QAAQ,OAAO;CAC/C,OAAQ,MAAM,QAAQ,KAAK,MAAQ,MAAM,SAAS,KAAK;AACzD;;AAGA,eAAsB,sBAAsB,SAA2C;CACrF,MAAM,SAAS,QAAQ,SAAS,KAAK,QAAQ,UAAU,MAAM,UAAU,QAAQ,SAAS,MAAM,aAAa,KAAA,CAAS;CACpH,MAAM,WAAW,OAAO,OAAO,KAAK,UAAU,MAAM,QAAkB,CAAC;CACvE,MAAM,aAAa,OAAO,QAAQ,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC;CAEjE,MAAM,UAAU,SAAS,QAAQ,aAAa,CAAC,WAAW,SAAS,QAAQ,CAAC;CAC5E,IAAI,QAAQ,SAAS,GACnB,MAAM,IAAI,MACR,yBAAyB,QAAQ,KAAK,IAAI,EAAE,MAAM,QAAQ,MAAM,iDAClD,WAAW,KAAK,IAAI,KAAK,YAAY,EACrD;CAEF,MAAM,aAAa,WAAW,QAAQ,aAAa,CAAC,SAAS,SAAS,QAAQ,CAAC;CAC/E,IAAI,WAAW,SAAS,GACtB,MAAM,IAAI,MACR,GAAG,WAAW,KAAK,IAAI,EAAE,iBAAiB,QAAQ,MAAM,iDAC1D;CAGF,KAAK,MAAM,OAAO,QAAQ,MAAM;EAC9B,MAAM,UAAUA,cAAAA,gBAAgB,KAAK;GAAE,GAAG,QAAQ;GAAO,OAAO,QAAQ;EAAM,CAAC;EAC/E,IAAI;GACF,KAAK,MAAM,SAAS,OAAO,QAAQ,UAAU,MAAM,aAAa,IAAI,QAAQ,GAAG;IAC7E,MAAM,QAAQ,QAAQ,QAAQ,MAAM;IACpC,MAAM,OAAO,OAAO,QAAQ,MAAM;IAClC,MAAM,OAAO;KAAE,QAAQ,MAAM;KAAQ,GAAG;IAAM;IAC9C,MAAM,WAAW,MAAM,QAAQ,MAAM,GAAG,QAAQ,YAAY,SAAS,MAAM,KAAK,QAAQ,IAAI;IAC5F,IAAI,CAAE,MAAM,WAAW,SAAS,UAAU,IAAI,GAAI;IAClD,MAAM,IAAI,MACR,GAAG,MAAM,OAAO,GAAG,QAAQ,YAAY,KAAK,mBAAmB,MAAM,GAAG,iBACnE,SAAS,OAAO,4DACvB;GACF;EACF,UAAU;GACR,QAAQ,MAAM;EAChB;CACF;AACF"}
@@ -1,13 +1,13 @@
1
- import { DoomApi, DoomApiScope } from "../../schemas/packageApi.mjs";
2
- import { DoomApiContract } from "../../schemas/apiContracts.mjs";
1
+ import { PoApi, PoApiScope } from "../../schemas/packageApi.mjs";
2
+ import { PoApiContract } from "../../schemas/apiContracts.mjs";
3
3
  import { MountPackageApiOptions } from "../packageApiHarness/index.mjs";
4
4
  //#region src/services/apiSurfaceAssert/index.d.ts
5
5
  export interface ApiSurfaceOptions {
6
- readonly contract: DoomApiContract;
6
+ readonly contract: PoApiContract;
7
7
  /** The scope being checked; only its declarations and registrations are compared. */
8
- readonly scope: DoomApiScope;
9
- /** What the generated facet registered at this scope, in registration order. */
10
- readonly apis: readonly DoomApi[];
8
+ readonly scope: PoApiScope;
9
+ /** What the generated server plugin registered at this scope, in registration order. */
10
+ readonly apis: readonly PoApi[];
11
11
  /** Passed through to the harness, so a session API gets its id and working directory. */
12
12
  readonly mount?: Omit<MountPackageApiOptions, 'scope'>;
13
13
  /**
@@ -4,7 +4,7 @@ function sorted(values) {
4
4
  return [...new Set(values)].sort();
5
5
  }
6
6
  /** A path under the same mount that no contract declares, used to calibrate. */
7
- const CONTROL_PATH = "/__doom_surface_control__";
7
+ const CONTROL_PATH = "/__po_surface_control__";
8
8
  /**
9
9
  * Whether a response is the framework's own miss rather than a handler's answer.
10
10
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/apiSurfaceAssert/index.ts"],"sourcesContent":["/**\n * Checks that what a package declares is what it actually serves.\n *\n * Nothing else in the toolchain does. `parseApiContract` checks a contract's\n * shape, its id uniqueness and that it is JSON, and stops there; no step\n * compares it to a mounted route or to a registration. That gap is not\n * theoretical. One package shipped a valid four-route contract, a well-tested\n * Hono app and a full unit suite for an API that was never mounted at all, and\n * the only test touching the mount asserted the emptiness rather than noticing\n * it.\n *\n * Two questions, both about liveness rather than semantics: are the base paths\n * this scope registers the same set it declares, and does every declared route\n * reach a handler. A route answering 500 passes; a route answering 404 or 405\n * does not exist.\n */\n\nimport type { DoomApiContract } from '../../schemas/apiContracts';\nimport type { DoomApi, DoomApiScope } from '../../schemas/packageApi';\nimport { mountPackageApi, type MountPackageApiOptions } from '../packageApiHarness';\n\nexport interface ApiSurfaceOptions {\n readonly contract: DoomApiContract;\n /** The scope being checked; only its declarations and registrations are compared. */\n readonly scope: DoomApiScope;\n /** What the generated facet registered at this scope, in registration order. */\n readonly apis: readonly DoomApi[];\n /** Passed through to the harness, so a session API gets its id and working directory. */\n readonly mount?: Omit<MountPackageApiOptions, 'scope'>;\n /**\n * Extra request detail for a route a bare request cannot reach, keyed by\n * contract id, most often a path parameter to substitute.\n */\n readonly probe?: Readonly<Record<string, RequestInit & { readonly path?: string }>>;\n}\n\nfunction sorted(values: Iterable<string>): string[] {\n return [...new Set(values)].sort();\n}\n\n/** A path under the same mount that no contract declares, used to calibrate. */\nconst CONTROL_PATH = '/__doom_surface_control__';\n\n/**\n * Whether a response is the framework's own miss rather than a handler's answer.\n *\n * Status alone cannot tell them apart: a route that refuses an unknown record\n * answers 404 legitimately, and reading that as \"not mounted\" would fail every\n * honest API. So the same request is sent to a path nothing declares, and the\n * two are compared. A declared route answering exactly what an undeclared one\n * answers is not being served.\n *\n * A catch-all route would match the control too and read as unrouted. No\n * package has one; if one appears it should probe an explicit path instead.\n */\nasync function isUnrouted(\n mounted: { readonly mountPath: string; fetch(path: string, init?: RequestInit): Promise<Response> },\n response: Response,\n init: RequestInit,\n): Promise<boolean> {\n if (response.status !== 404 && response.status !== 405) return false;\n const control = await mounted.fetch(`${mounted.mountPath}${CONTROL_PATH}`, init);\n if (control.status !== response.status) return false;\n return (await control.text()) === (await response.text());\n}\n\n/** Throws with the disagreement spelled out, or returns having found none. */\nexport async function assertContractSurface(options: ApiSurfaceOptions): Promise<void> {\n const routes = options.contract.http.filter((route) => route.scope === options.scope && route.basePath !== undefined);\n const declared = sorted(routes.map((route) => route.basePath as string));\n const registered = sorted(options.apis.map((api) => api.basePath));\n\n const missing = declared.filter((basePath) => !registered.includes(basePath));\n if (missing.length > 0) {\n throw new Error(\n `The contract declares ${missing.join(', ')} at ${options.scope} scope, but nothing is mounted there. ` +\n `Mounted: ${registered.join(', ') || '(nothing)'}.`,\n );\n }\n const undeclared = registered.filter((basePath) => !declared.includes(basePath));\n if (undeclared.length > 0) {\n throw new Error(\n `${undeclared.join(', ')} is mounted at ${options.scope} scope but the contract never declares it there.`,\n );\n }\n\n for (const api of options.apis) {\n const mounted = mountPackageApi(api, { ...options.mount, scope: options.scope });\n try {\n for (const route of routes.filter((entry) => entry.basePath === api.basePath)) {\n const probe = options.probe?.[route.id];\n const path = probe?.path ?? route.path;\n const init = { method: route.method, ...probe };\n const response = await mounted.fetch(`${mounted.mountPath}${path === '/' ? '' : path}`, init);\n if (!(await isUnrouted(mounted, response, init))) continue;\n throw new Error(\n `${route.method} ${mounted.mountPath}${path} is declared as '${route.id}' but answered ` +\n `${response.status} exactly as an unrouted path does, so no handler serves it.`,\n );\n }\n } finally {\n mounted.close();\n }\n }\n}\n"],"mappings":";;AAoCA,SAAS,OAAO,QAAoC;CAClD,OAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK;AACnC;;AAGA,MAAM,eAAe;;;;;;;;;;;;;AAcrB,eAAe,WACb,SACA,UACA,MACkB;CAClB,IAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK,OAAO;CAC/D,MAAM,UAAU,MAAM,QAAQ,MAAM,GAAG,QAAQ,YAAY,gBAAgB,IAAI;CAC/E,IAAI,QAAQ,WAAW,SAAS,QAAQ,OAAO;CAC/C,OAAQ,MAAM,QAAQ,KAAK,MAAQ,MAAM,SAAS,KAAK;AACzD;;AAGA,eAAsB,sBAAsB,SAA2C;CACrF,MAAM,SAAS,QAAQ,SAAS,KAAK,QAAQ,UAAU,MAAM,UAAU,QAAQ,SAAS,MAAM,aAAa,KAAA,CAAS;CACpH,MAAM,WAAW,OAAO,OAAO,KAAK,UAAU,MAAM,QAAkB,CAAC;CACvE,MAAM,aAAa,OAAO,QAAQ,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC;CAEjE,MAAM,UAAU,SAAS,QAAQ,aAAa,CAAC,WAAW,SAAS,QAAQ,CAAC;CAC5E,IAAI,QAAQ,SAAS,GACnB,MAAM,IAAI,MACR,yBAAyB,QAAQ,KAAK,IAAI,EAAE,MAAM,QAAQ,MAAM,iDAClD,WAAW,KAAK,IAAI,KAAK,YAAY,EACrD;CAEF,MAAM,aAAa,WAAW,QAAQ,aAAa,CAAC,SAAS,SAAS,QAAQ,CAAC;CAC/E,IAAI,WAAW,SAAS,GACtB,MAAM,IAAI,MACR,GAAG,WAAW,KAAK,IAAI,EAAE,iBAAiB,QAAQ,MAAM,iDAC1D;CAGF,KAAK,MAAM,OAAO,QAAQ,MAAM;EAC9B,MAAM,UAAU,gBAAgB,KAAK;GAAE,GAAG,QAAQ;GAAO,OAAO,QAAQ;EAAM,CAAC;EAC/E,IAAI;GACF,KAAK,MAAM,SAAS,OAAO,QAAQ,UAAU,MAAM,aAAa,IAAI,QAAQ,GAAG;IAC7E,MAAM,QAAQ,QAAQ,QAAQ,MAAM;IACpC,MAAM,OAAO,OAAO,QAAQ,MAAM;IAClC,MAAM,OAAO;KAAE,QAAQ,MAAM;KAAQ,GAAG;IAAM;IAC9C,MAAM,WAAW,MAAM,QAAQ,MAAM,GAAG,QAAQ,YAAY,SAAS,MAAM,KAAK,QAAQ,IAAI;IAC5F,IAAI,CAAE,MAAM,WAAW,SAAS,UAAU,IAAI,GAAI;IAClD,MAAM,IAAI,MACR,GAAG,MAAM,OAAO,GAAG,QAAQ,YAAY,KAAK,mBAAmB,MAAM,GAAG,iBACnE,SAAS,OAAO,4DACvB;GACF;EACF,UAAU;GACR,QAAQ,MAAM;EAChB;CACF;AACF"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/apiSurfaceAssert/index.ts"],"sourcesContent":["/**\n * Checks that what a package declares is what it actually serves.\n *\n * Nothing else in the toolchain does. `parseApiContract` checks a contract's\n * shape, its id uniqueness and that it is JSON, and stops there; no step\n * compares it to a mounted route or to a registration. That gap is not\n * theoretical. One package shipped a valid four-route contract, a well-tested\n * Hono app and a full unit suite for an API that was never mounted at all, and\n * the only test touching the mount asserted the emptiness rather than noticing\n * it.\n *\n * Two questions, both about liveness rather than semantics: are the base paths\n * this scope registers the same set it declares, and does every declared route\n * reach a handler. A route answering 500 passes; a route answering 404 or 405\n * does not exist.\n */\n\nimport type { PoApiContract } from '../../schemas/apiContracts';\nimport type { PoApi, PoApiScope } from '../../schemas/packageApi';\nimport { mountPackageApi, type MountPackageApiOptions } from '../packageApiHarness';\n\nexport interface ApiSurfaceOptions {\n readonly contract: PoApiContract;\n /** The scope being checked; only its declarations and registrations are compared. */\n readonly scope: PoApiScope;\n /** What the generated server plugin registered at this scope, in registration order. */\n readonly apis: readonly PoApi[];\n /** Passed through to the harness, so a session API gets its id and working directory. */\n readonly mount?: Omit<MountPackageApiOptions, 'scope'>;\n /**\n * Extra request detail for a route a bare request cannot reach, keyed by\n * contract id, most often a path parameter to substitute.\n */\n readonly probe?: Readonly<Record<string, RequestInit & { readonly path?: string }>>;\n}\n\nfunction sorted(values: Iterable<string>): string[] {\n return [...new Set(values)].sort();\n}\n\n/** A path under the same mount that no contract declares, used to calibrate. */\nconst CONTROL_PATH = '/__po_surface_control__';\n\n/**\n * Whether a response is the framework's own miss rather than a handler's answer.\n *\n * Status alone cannot tell them apart: a route that refuses an unknown record\n * answers 404 legitimately, and reading that as \"not mounted\" would fail every\n * honest API. So the same request is sent to a path nothing declares, and the\n * two are compared. A declared route answering exactly what an undeclared one\n * answers is not being served.\n *\n * A catch-all route would match the control too and read as unrouted. No\n * package has one; if one appears it should probe an explicit path instead.\n */\nasync function isUnrouted(\n mounted: { readonly mountPath: string; fetch(path: string, init?: RequestInit): Promise<Response> },\n response: Response,\n init: RequestInit,\n): Promise<boolean> {\n if (response.status !== 404 && response.status !== 405) return false;\n const control = await mounted.fetch(`${mounted.mountPath}${CONTROL_PATH}`, init);\n if (control.status !== response.status) return false;\n return (await control.text()) === (await response.text());\n}\n\n/** Throws with the disagreement spelled out, or returns having found none. */\nexport async function assertContractSurface(options: ApiSurfaceOptions): Promise<void> {\n const routes = options.contract.http.filter((route) => route.scope === options.scope && route.basePath !== undefined);\n const declared = sorted(routes.map((route) => route.basePath as string));\n const registered = sorted(options.apis.map((api) => api.basePath));\n\n const missing = declared.filter((basePath) => !registered.includes(basePath));\n if (missing.length > 0) {\n throw new Error(\n `The contract declares ${missing.join(', ')} at ${options.scope} scope, but nothing is mounted there. ` +\n `Mounted: ${registered.join(', ') || '(nothing)'}.`,\n );\n }\n const undeclared = registered.filter((basePath) => !declared.includes(basePath));\n if (undeclared.length > 0) {\n throw new Error(\n `${undeclared.join(', ')} is mounted at ${options.scope} scope but the contract never declares it there.`,\n );\n }\n\n for (const api of options.apis) {\n const mounted = mountPackageApi(api, { ...options.mount, scope: options.scope });\n try {\n for (const route of routes.filter((entry) => entry.basePath === api.basePath)) {\n const probe = options.probe?.[route.id];\n const path = probe?.path ?? route.path;\n const init = { method: route.method, ...probe };\n const response = await mounted.fetch(`${mounted.mountPath}${path === '/' ? '' : path}`, init);\n if (!(await isUnrouted(mounted, response, init))) continue;\n throw new Error(\n `${route.method} ${mounted.mountPath}${path} is declared as '${route.id}' but answered ` +\n `${response.status} exactly as an unrouted path does, so no handler serves it.`,\n );\n }\n } finally {\n mounted.close();\n }\n }\n}\n"],"mappings":";;AAoCA,SAAS,OAAO,QAAoC;CAClD,OAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK;AACnC;;AAGA,MAAM,eAAe;;;;;;;;;;;;;AAcrB,eAAe,WACb,SACA,UACA,MACkB;CAClB,IAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK,OAAO;CAC/D,MAAM,UAAU,MAAM,QAAQ,MAAM,GAAG,QAAQ,YAAY,gBAAgB,IAAI;CAC/E,IAAI,QAAQ,WAAW,SAAS,QAAQ,OAAO;CAC/C,OAAQ,MAAM,QAAQ,KAAK,MAAQ,MAAM,SAAS,KAAK;AACzD;;AAGA,eAAsB,sBAAsB,SAA2C;CACrF,MAAM,SAAS,QAAQ,SAAS,KAAK,QAAQ,UAAU,MAAM,UAAU,QAAQ,SAAS,MAAM,aAAa,KAAA,CAAS;CACpH,MAAM,WAAW,OAAO,OAAO,KAAK,UAAU,MAAM,QAAkB,CAAC;CACvE,MAAM,aAAa,OAAO,QAAQ,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC;CAEjE,MAAM,UAAU,SAAS,QAAQ,aAAa,CAAC,WAAW,SAAS,QAAQ,CAAC;CAC5E,IAAI,QAAQ,SAAS,GACnB,MAAM,IAAI,MACR,yBAAyB,QAAQ,KAAK,IAAI,EAAE,MAAM,QAAQ,MAAM,iDAClD,WAAW,KAAK,IAAI,KAAK,YAAY,EACrD;CAEF,MAAM,aAAa,WAAW,QAAQ,aAAa,CAAC,SAAS,SAAS,QAAQ,CAAC;CAC/E,IAAI,WAAW,SAAS,GACtB,MAAM,IAAI,MACR,GAAG,WAAW,KAAK,IAAI,EAAE,iBAAiB,QAAQ,MAAM,iDAC1D;CAGF,KAAK,MAAM,OAAO,QAAQ,MAAM;EAC9B,MAAM,UAAU,gBAAgB,KAAK;GAAE,GAAG,QAAQ;GAAO,OAAO,QAAQ;EAAM,CAAC;EAC/E,IAAI;GACF,KAAK,MAAM,SAAS,OAAO,QAAQ,UAAU,MAAM,aAAa,IAAI,QAAQ,GAAG;IAC7E,MAAM,QAAQ,QAAQ,QAAQ,MAAM;IACpC,MAAM,OAAO,OAAO,QAAQ,MAAM;IAClC,MAAM,OAAO;KAAE,QAAQ,MAAM;KAAQ,GAAG;IAAM;IAC9C,MAAM,WAAW,MAAM,QAAQ,MAAM,GAAG,QAAQ,YAAY,SAAS,MAAM,KAAK,QAAQ,IAAI;IAC5F,IAAI,CAAE,MAAM,WAAW,SAAS,UAAU,IAAI,GAAI;IAClD,MAAM,IAAI,MACR,GAAG,MAAM,OAAO,GAAG,QAAQ,YAAY,KAAK,mBAAmB,MAAM,GAAG,iBACnE,SAAS,OAAO,4DACvB;GACF;EACF,UAAU;GACR,QAAQ,MAAM;EAChB;CACF;AACF"}
@@ -1,27 +1,8 @@
1
- const require_runtime = require("../../../_virtual/_rolldown/runtime.cjs");
2
- const require_runtimePiSettings = require("../../../runtimePiSettings.cjs");
3
- let node_crypto = require("node:crypto");
4
- let node_path = require("node:path");
5
- node_path = require_runtime.__toESM(node_path, 1);
6
- let node_http = require("node:http");
7
- let _earendil_works_pi_coding_agent = require("@earendil-works/pi-coding-agent");
8
1
  //#region src/services/chatgptAuth/index.ts
9
2
  /** The one ChatGPT sign-in every Po feature shares; separate from Pi's `openai-codex` model login. */
10
3
  const CHATGPT_AUTH_PROVIDER_ID = "po-chatgpt";
11
4
  const CHATGPT_AUTH_PROVIDER_NAME = "ChatGPT for Po features";
12
5
  const CHATGPT_SIGN_IN_HINT = `Sign in to ${CHATGPT_AUTH_PROVIDER_NAME} under Settings > Providers, or with /login.`;
13
- const CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
14
- const AUTH_ORIGIN = "https://auth.openai.com";
15
- const TOKEN_URL = `${AUTH_ORIGIN}/oauth/token`;
16
- /** Realtime voice needs the connector scopes that Pi's own ChatGPT login does not request. */
17
- const SCOPE = "openid profile email offline_access api.connectors.read api.connectors.invoke";
18
- const CALLBACK_HOST = "127.0.0.1";
19
- const CALLBACK_PORT = 1455;
20
- const CALLBACK_PATH = "/auth/callback";
21
- /** The redirect registered for this OAuth client; the browser reaches the listener through localhost. */
22
- const REDIRECT_URI = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`;
23
- const MAX_TOKEN_RESPONSE_BYTES = 1048576;
24
- const TOKEN_TIMEOUT_MS = 3e4;
25
6
  function record(value) {
26
7
  return typeof value === "object" && value !== null && !Array.isArray(value);
27
8
  }
@@ -76,212 +57,12 @@ async function chatgptCredentials(source, loginMessage, signal) {
76
57
  accountId
77
58
  };
78
59
  }
79
- async function requestTokens(body, previousRefresh, signal) {
80
- const bounded = AbortSignal.any([AbortSignal.timeout(TOKEN_TIMEOUT_MS), ...signal ? [signal] : []]);
81
- const response = await fetch(TOKEN_URL, {
82
- method: "POST",
83
- headers: { "content-type": "application/x-www-form-urlencoded" },
84
- body,
85
- redirect: "error",
86
- signal: bounded
87
- });
88
- if (!response.ok) {
89
- await response.body?.cancel().catch(() => void 0);
90
- throw new Error(`ChatGPT sign-in was rejected (HTTP ${response.status}). Sign in again.`);
91
- }
92
- const json = await readBoundedJson(response, MAX_TOKEN_RESPONSE_BYTES, bounded);
93
- const access = record(json) ? json.access_token : void 0;
94
- const refresh = record(json) ? json.refresh_token ?? previousRefresh : void 0;
95
- const expiresIn = record(json) ? json.expires_in : void 0;
96
- if (typeof access !== "string" || typeof refresh !== "string" || typeof expiresIn !== "number" || expiresIn <= 0) throw new Error("ChatGPT sign-in returned an invalid token response.");
97
- const accountId = accountIdOf(access);
98
- if (!accountId) throw new Error("ChatGPT sign-in did not include a ChatGPT account.");
99
- return {
100
- access,
101
- refresh,
102
- expires: Date.now() + expiresIn * 1e3,
103
- accountId
104
- };
105
- }
106
- function sameState(supplied, expected) {
107
- const left = Buffer.from(supplied ?? "");
108
- const right = Buffer.from(expected);
109
- return left.length === right.length && (0, node_crypto.timingSafeEqual)(left, right);
110
- }
111
- /** The authorization code from a redirect URL; pasted input must carry the expected state. */
112
- function codeFromRedirect(url, state) {
113
- for (const name of [
114
- "state",
115
- "code",
116
- "error"
117
- ]) if (url.searchParams.getAll(name).length > 1) throw new Error("The sign-in address is invalid.");
118
- if (!sameState(url.searchParams.get("state"), state)) throw new Error("The sign-in address does not match this attempt.");
119
- if (url.searchParams.get("error")) throw new Error("ChatGPT sign-in was declined.");
120
- const code = url.searchParams.get("code");
121
- if (!code || code.trim() !== code) throw new Error("The sign-in address has no authorization code.");
122
- return code;
123
- }
124
- /** Listens for the browser redirect on the registered loopback port; rejects when the port is taken. */
125
- async function listenForCode(state, signal) {
126
- const server = (0, node_http.createServer)();
127
- let resolveCode;
128
- let rejectCode;
129
- const code = new Promise((resolve, reject) => {
130
- resolveCode = resolve;
131
- rejectCode = reject;
132
- });
133
- code.catch(() => void 0);
134
- server.on("request", (request, response) => {
135
- const reply = (status, text) => {
136
- response.writeHead(status, {
137
- "content-type": "text/plain; charset=utf-8",
138
- "cache-control": "no-store"
139
- });
140
- response.end(text);
141
- };
142
- const url = new URL(request.url ?? "/", REDIRECT_URI);
143
- if (request.method !== "GET" || url.pathname !== CALLBACK_PATH) return reply(404, "Not found.");
144
- try {
145
- resolveCode(codeFromRedirect(url, state));
146
- reply(200, "Signed in. You can close this page.");
147
- } catch (error) {
148
- if (sameState(url.searchParams.get("state"), state)) rejectCode(error);
149
- reply(400, "Sign-in could not be completed.");
150
- }
151
- });
152
- await new Promise((resolve, reject) => {
153
- server.once("error", reject);
154
- server.listen({
155
- host: CALLBACK_HOST,
156
- port: CALLBACK_PORT,
157
- exclusive: true
158
- }, () => {
159
- server.off("error", reject);
160
- resolve();
161
- });
162
- });
163
- const close = () => {
164
- server.close();
165
- server.closeAllConnections();
166
- };
167
- signal?.addEventListener("abort", close, { once: true });
168
- return {
169
- code,
170
- close
171
- };
172
- }
173
- async function login(callbacks) {
174
- const { signal } = callbacks;
175
- const verifier = (0, node_crypto.randomBytes)(64).toString("base64url");
176
- const state = (0, node_crypto.randomBytes)(32).toString("base64url");
177
- const authorize = new URL(`${AUTH_ORIGIN}/oauth/authorize`);
178
- authorize.search = new URLSearchParams({
179
- response_type: "code",
180
- client_id: CLIENT_ID,
181
- redirect_uri: REDIRECT_URI,
182
- scope: SCOPE,
183
- code_challenge: (0, node_crypto.createHash)("sha256").update(verifier).digest("base64url"),
184
- code_challenge_method: "S256",
185
- id_token_add_organizations: "true",
186
- state
187
- }).toString();
188
- const callback = await listenForCode(state, signal).catch(() => void 0);
189
- try {
190
- callbacks.onAuth({
191
- url: authorize.toString(),
192
- instructions: "Sign in in your browser. If it does not return here, paste the address it lands on."
193
- });
194
- const pasted = (callbacks.onManualCodeInput?.() ?? callbacks.onPrompt({
195
- message: "Paste the address your browser lands on",
196
- placeholder: REDIRECT_URI
197
- })).then((input) => {
198
- if (!URL.canParse(input.trim())) throw new Error("Paste the full address from your browser.");
199
- return codeFromRedirect(new URL(input.trim()), state);
200
- });
201
- const code = await (callback ? Promise.race([callback.code, pasted]) : pasted);
202
- signal?.throwIfAborted();
203
- return await requestTokens(new URLSearchParams({
204
- grant_type: "authorization_code",
205
- client_id: CLIENT_ID,
206
- code,
207
- code_verifier: verifier,
208
- redirect_uri: REDIRECT_URI
209
- }), void 0, signal);
210
- } finally {
211
- callback?.close();
212
- }
213
- }
214
- const chatgptAuthProvider = {
215
- name: CHATGPT_AUTH_PROVIDER_NAME,
216
- oauth: {
217
- name: CHATGPT_AUTH_PROVIDER_NAME,
218
- isSubscription: true,
219
- login,
220
- refreshToken: (credentials, signal) => requestTokens(new URLSearchParams({
221
- grant_type: "refresh_token",
222
- client_id: CLIENT_ID,
223
- refresh_token: credentials.refresh
224
- }), credentials.refresh, signal),
225
- getApiKey: (credentials) => credentials.access
226
- }
227
- };
228
- /** Adds the shared sign-in to a Pi model runtime: its Providers row, /login entry, refresh and storage. */
229
- function registerChatgptAuthProvider(runtime) {
230
- runtime.registerProvider(CHATGPT_AUTH_PROVIDER_ID, chatgptAuthProvider);
231
- }
232
- /**
233
- * Reads the shared sign-in outside a session (Voice runs at the hub). It opens the same auth.json
234
- * a session uses; Pi's file lock keeps refreshes from different runtimes from racing.
235
- */
236
- function createChatgptAuthReader(options) {
237
- let loading;
238
- const runtime = () => {
239
- loading ??= (async () => {
240
- const agentDirectory = require_runtimePiSettings.piAgentDirectory(options.environment, options.homeDirectory);
241
- const directory = require_runtimePiSettings.modelConfigDirectory(agentDirectory, options.homeDirectory);
242
- const created = await _earendil_works_pi_coding_agent.ModelRuntime.create({
243
- authPath: node_path.default.join(directory, "auth.json"),
244
- modelsPath: node_path.default.join(directory, "models.json"),
245
- refreshOnCreate: false
246
- });
247
- registerChatgptAuthProvider(created);
248
- return created;
249
- })().catch((error) => {
250
- loading = void 0;
251
- throw error;
252
- });
253
- return loading;
254
- };
255
- const fresh = async (signal) => {
256
- const current = await runtime();
257
- await current.refresh({
258
- allowNetwork: false,
259
- providers: [CHATGPT_AUTH_PROVIDER_ID],
260
- ...signal ? { signal } : {}
261
- });
262
- return current;
263
- };
264
- return {
265
- /** Whether the shared sign-in exists on disk. No network call; the same check `credentials` runs first. */
266
- async signedIn(signal) {
267
- return (await fresh(signal)).isUsingSubscription(CHATGPT_AUTH_PROVIDER_ID);
268
- },
269
- async credentials(loginMessage, signal) {
270
- const current = await fresh(signal);
271
- return chatgptCredentials({
272
- available: () => current.isUsingSubscription(CHATGPT_AUTH_PROVIDER_ID),
273
- getAuth: (authSignal) => current.getAuth(CHATGPT_AUTH_PROVIDER_ID, authSignal ? { signal: authSignal } : {})
274
- }, loginMessage, signal);
275
- }
276
- };
277
- }
278
60
  //#endregion
279
61
  exports.CHATGPT_AUTH_PROVIDER_ID = CHATGPT_AUTH_PROVIDER_ID;
280
62
  exports.CHATGPT_AUTH_PROVIDER_NAME = CHATGPT_AUTH_PROVIDER_NAME;
281
63
  exports.CHATGPT_SIGN_IN_HINT = CHATGPT_SIGN_IN_HINT;
64
+ exports.accountIdOf = accountIdOf;
282
65
  exports.chatgptCredentials = chatgptCredentials;
283
- exports.createChatgptAuthReader = createChatgptAuthReader;
284
66
  exports.readBoundedJson = readBoundedJson;
285
- exports.registerChatgptAuthProvider = registerChatgptAuthProvider;
286
67
 
287
68
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["timingSafeEqual","createServer","randomBytes","createHash","piAgentDirectory","modelConfigDirectory","ModelRuntime","path"],"sources":["../../../../src/services/chatgptAuth/index.ts"],"sourcesContent":["/*\n * Portions of this file are adapted from OpenAI Codex at commit 5ecb3afd1b, by way of po-voice.\n * Copyright OpenAI. Licensed under the Apache License, Version 2.0.\n */\n\nimport { createHash, randomBytes, timingSafeEqual } from 'node:crypto';\nimport { createServer } from 'node:http';\nimport path from 'node:path';\n\nimport { ModelRuntime, type ProviderConfig } from '@earendil-works/pi-coding-agent';\n\nimport { modelConfigDirectory, piAgentDirectory } from '../piSettings';\n\n/** The one ChatGPT sign-in every Po feature shares; separate from Pi's `openai-codex` model login. */\nexport const CHATGPT_AUTH_PROVIDER_ID = 'po-chatgpt';\nexport const CHATGPT_AUTH_PROVIDER_NAME = 'ChatGPT for Po features';\nexport const CHATGPT_SIGN_IN_HINT = `Sign in to ${CHATGPT_AUTH_PROVIDER_NAME} under Settings > Providers, or with /login.`;\n\nconst CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';\nconst AUTH_ORIGIN = 'https://auth.openai.com';\nconst TOKEN_URL = `${AUTH_ORIGIN}/oauth/token`;\n/** Realtime voice needs the connector scopes that Pi's own ChatGPT login does not request. */\nconst SCOPE = 'openid profile email offline_access api.connectors.read api.connectors.invoke';\nconst CALLBACK_HOST = '127.0.0.1';\nconst CALLBACK_PORT = 1455;\nconst CALLBACK_PATH = '/auth/callback';\n/** The redirect registered for this OAuth client; the browser reaches the listener through localhost. */\nconst REDIRECT_URI = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`;\nconst MAX_TOKEN_RESPONSE_BYTES = 1024 * 1024;\nconst TOKEN_TIMEOUT_MS = 30_000;\n\ntype ChatgptOAuth = NonNullable<ProviderConfig['oauth']>;\ntype LoginCallbacks = Parameters<ChatgptOAuth['login']>[0];\ntype OAuthCredentials = Awaited<ReturnType<ChatgptOAuth['login']>>;\n\n/** Where a feature reads the shared sign-in: a session's or the hub's Pi model runtime. */\nexport interface ChatgptAuthSource {\n available(): boolean;\n getAuth(signal?: AbortSignal): Promise<{ auth: { apiKey?: string } } | undefined>;\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Reads a JSON body without buffering more than `limit` bytes. Errors are generic; callers map them. */\nexport async function readBoundedJson(response: Response, limit: number, signal?: AbortSignal): Promise<unknown> {\n if (!response.body) throw new Error('Response has no body.');\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let length = 0;\n try {\n while (true) {\n signal?.throwIfAborted();\n const { value, done } = await reader.read();\n if (done) break;\n length += value.length;\n if (length > limit) throw new Error('Response body is too large.');\n chunks.push(value);\n }\n signal?.throwIfAborted();\n return JSON.parse(Buffer.concat(chunks).toString('utf8')) as unknown;\n } finally {\n await reader.cancel().catch(() => undefined); // Response cleanup never replaces the operation error.\n reader.releaseLock();\n }\n}\n\n/** The ChatGPT account claim of an access token, or undefined when it is missing or malformed. */\nfunction accountIdOf(token: string): string | undefined {\n try {\n const payload: unknown = JSON.parse(Buffer.from(token.split('.')[1] ?? '', 'base64url').toString('utf8'));\n const auth = record(payload) ? payload['https://api.openai.com/auth'] : undefined;\n const id = record(auth) ? auth.chatgpt_account_id : undefined;\n return typeof id === 'string' && /^[A-Za-z0-9_-]{1,256}$/.test(id) ? id : undefined;\n } catch {\n return undefined; // Documented fallback: a malformed token has no account, which callers treat as signed out.\n }\n}\n\n/** Resolves the subscription token and account claim; every failure becomes `loginMessage` unless aborted. */\nexport async function chatgptCredentials(\n source: ChatgptAuthSource,\n loginMessage: string,\n signal?: AbortSignal,\n): Promise<{ token: string; accountId: string }> {\n if (!source.available()) throw new Error(loginMessage);\n let token: string | undefined;\n try {\n token = (await source.getAuth(signal))?.auth.apiKey;\n } catch {\n signal?.throwIfAborted();\n throw new Error(loginMessage);\n }\n signal?.throwIfAborted();\n const accountId = token ? accountIdOf(token) : undefined;\n if (!token || !accountId) throw new Error(loginMessage);\n return { token, accountId };\n}\n\nasync function requestTokens(\n body: URLSearchParams,\n previousRefresh: string | undefined,\n signal: AbortSignal | undefined,\n): Promise<OAuthCredentials> {\n const bounded = AbortSignal.any([AbortSignal.timeout(TOKEN_TIMEOUT_MS), ...(signal ? [signal] : [])]);\n const response = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/x-www-form-urlencoded' },\n body,\n redirect: 'error',\n signal: bounded,\n });\n if (!response.ok) {\n await response.body?.cancel().catch(() => undefined); // The body may echo tokens; it is never read.\n throw new Error(`ChatGPT sign-in was rejected (HTTP ${response.status}). Sign in again.`);\n }\n const json = await readBoundedJson(response, MAX_TOKEN_RESPONSE_BYTES, bounded);\n const access = record(json) ? json.access_token : undefined;\n const refresh = record(json) ? (json.refresh_token ?? previousRefresh) : undefined;\n const expiresIn = record(json) ? json.expires_in : undefined;\n if (typeof access !== 'string' || typeof refresh !== 'string' || typeof expiresIn !== 'number' || expiresIn <= 0)\n throw new Error('ChatGPT sign-in returned an invalid token response.');\n const accountId = accountIdOf(access);\n if (!accountId) throw new Error('ChatGPT sign-in did not include a ChatGPT account.');\n return { access, refresh, expires: Date.now() + expiresIn * 1000, accountId };\n}\n\nfunction sameState(supplied: string | null, expected: string): boolean {\n const left = Buffer.from(supplied ?? '');\n const right = Buffer.from(expected);\n return left.length === right.length && timingSafeEqual(left, right);\n}\n\n/** The authorization code from a redirect URL; pasted input must carry the expected state. */\nfunction codeFromRedirect(url: URL, state: string): string {\n for (const name of ['state', 'code', 'error'])\n if (url.searchParams.getAll(name).length > 1) throw new Error('The sign-in address is invalid.');\n if (!sameState(url.searchParams.get('state'), state))\n throw new Error('The sign-in address does not match this attempt.');\n if (url.searchParams.get('error')) throw new Error('ChatGPT sign-in was declined.');\n const code = url.searchParams.get('code');\n if (!code || code.trim() !== code) throw new Error('The sign-in address has no authorization code.');\n return code;\n}\n\n/** Listens for the browser redirect on the registered loopback port; rejects when the port is taken. */\nasync function listenForCode(state: string, signal: AbortSignal | undefined) {\n const server = createServer();\n let resolveCode!: (code: string) => void;\n let rejectCode!: (error: Error) => void;\n const code = new Promise<string>((resolve, reject) => {\n resolveCode = resolve;\n rejectCode = reject;\n });\n code.catch(() => undefined); // Observed by the caller's race; never an unhandled rejection.\n server.on('request', (request, response) => {\n const reply = (status: number, text: string): void => {\n response.writeHead(status, { 'content-type': 'text/plain; charset=utf-8', 'cache-control': 'no-store' });\n response.end(text);\n };\n const url = new URL(request.url ?? '/', REDIRECT_URI);\n if (request.method !== 'GET' || url.pathname !== CALLBACK_PATH) return reply(404, 'Not found.');\n try {\n resolveCode(codeFromRedirect(url, state));\n reply(200, 'Signed in. You can close this page.');\n } catch (error) {\n // A stray or forged request must not end the attempt; only a matching declined redirect does.\n if (sameState(url.searchParams.get('state'), state)) rejectCode(error as Error);\n reply(400, 'Sign-in could not be completed.');\n }\n });\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen({ host: CALLBACK_HOST, port: CALLBACK_PORT, exclusive: true }, () => {\n server.off('error', reject);\n resolve();\n });\n });\n const close = (): void => {\n server.close();\n server.closeAllConnections();\n };\n signal?.addEventListener('abort', close, { once: true });\n return { code, close };\n}\n\nasync function login(callbacks: LoginCallbacks): Promise<OAuthCredentials> {\n const { signal } = callbacks;\n const verifier = randomBytes(64).toString('base64url');\n const state = randomBytes(32).toString('base64url');\n const authorize = new URL(`${AUTH_ORIGIN}/oauth/authorize`);\n authorize.search = new URLSearchParams({\n response_type: 'code',\n client_id: CLIENT_ID,\n redirect_uri: REDIRECT_URI,\n scope: SCOPE,\n code_challenge: createHash('sha256').update(verifier).digest('base64url'),\n code_challenge_method: 'S256',\n id_token_add_organizations: 'true',\n state,\n }).toString();\n // Port 1455 is shared with Codex and Pi's own ChatGPT login; when it is taken, the pasted address still works.\n const callback = await listenForCode(state, signal).catch(() => undefined);\n try {\n callbacks.onAuth({\n url: authorize.toString(),\n instructions: 'Sign in in your browser. If it does not return here, paste the address it lands on.',\n });\n const pasted = (\n callbacks.onManualCodeInput?.() ??\n callbacks.onPrompt({ message: 'Paste the address your browser lands on', placeholder: REDIRECT_URI })\n ).then((input) => {\n if (!URL.canParse(input.trim())) throw new Error('Paste the full address from your browser.');\n return codeFromRedirect(new URL(input.trim()), state);\n });\n const code = await (callback ? Promise.race([callback.code, pasted]) : pasted);\n signal?.throwIfAborted();\n return await requestTokens(\n new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: CLIENT_ID,\n code,\n code_verifier: verifier,\n redirect_uri: REDIRECT_URI,\n }),\n undefined,\n signal,\n );\n } finally {\n callback?.close();\n }\n}\n\nconst chatgptAuthProvider: ProviderConfig = {\n name: CHATGPT_AUTH_PROVIDER_NAME,\n oauth: {\n name: CHATGPT_AUTH_PROVIDER_NAME,\n isSubscription: true,\n login,\n refreshToken: (credentials, signal) =>\n requestTokens(\n new URLSearchParams({ grant_type: 'refresh_token', client_id: CLIENT_ID, refresh_token: credentials.refresh }),\n credentials.refresh,\n signal,\n ),\n getApiKey: (credentials) => credentials.access,\n },\n};\n\n/** Adds the shared sign-in to a Pi model runtime: its Providers row, /login entry, refresh and storage. */\nexport function registerChatgptAuthProvider(runtime: Pick<ModelRuntime, 'registerProvider'>): void {\n runtime.registerProvider(CHATGPT_AUTH_PROVIDER_ID, chatgptAuthProvider);\n}\n\n/**\n * Reads the shared sign-in outside a session (Voice runs at the hub). It opens the same auth.json\n * a session uses; Pi's file lock keeps refreshes from different runtimes from racing.\n */\nexport function createChatgptAuthReader(options: {\n environment?: Readonly<Record<string, string | undefined>>;\n homeDirectory?: string;\n}) {\n let loading: Promise<ModelRuntime> | undefined;\n const runtime = (): Promise<ModelRuntime> => {\n loading ??= (async () => {\n const agentDirectory = piAgentDirectory(options.environment, options.homeDirectory);\n const directory = modelConfigDirectory(agentDirectory, options.homeDirectory);\n const created = await ModelRuntime.create({\n authPath: path.join(directory, 'auth.json'),\n modelsPath: path.join(directory, 'models.json'),\n refreshOnCreate: false,\n });\n registerChatgptAuthProvider(created);\n return created;\n })().catch((error: unknown) => {\n loading = undefined; // A failed open is retried on the next use rather than pinned.\n throw error;\n });\n return loading;\n };\n // Sign-in happens in another runtime (the Providers page or a session), so re-read the file first.\n const fresh = async (signal?: AbortSignal): Promise<ModelRuntime> => {\n const current = await runtime();\n await current.refresh({\n allowNetwork: false,\n providers: [CHATGPT_AUTH_PROVIDER_ID],\n ...(signal ? { signal } : {}),\n });\n return current;\n };\n return {\n /** Whether the shared sign-in exists on disk. No network call; the same check `credentials` runs first. */\n async signedIn(signal?: AbortSignal): Promise<boolean> {\n return (await fresh(signal)).isUsingSubscription(CHATGPT_AUTH_PROVIDER_ID);\n },\n async credentials(loginMessage: string, signal?: AbortSignal): Promise<{ token: string; accountId: string }> {\n const current = await fresh(signal);\n return chatgptCredentials(\n {\n available: () => current.isUsingSubscription(CHATGPT_AUTH_PROVIDER_ID),\n getAuth: (authSignal) => current.getAuth(CHATGPT_AUTH_PROVIDER_ID, authSignal ? { signal: authSignal } : {}),\n },\n loginMessage,\n signal,\n );\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/services/chatgptAuth/index.ts"],"sourcesContent":["/*\n * Portions of this file are adapted from OpenAI Codex at commit 5ecb3afd1b, by way of po-voice.\n * Copyright OpenAI. Licensed under the Apache License, Version 2.0.\n */\n\n/** The one ChatGPT sign-in every Po feature shares; separate from Pi's `openai-codex` model login. */\nexport const CHATGPT_AUTH_PROVIDER_ID = 'po-chatgpt';\nexport const CHATGPT_AUTH_PROVIDER_NAME = 'ChatGPT for Po features';\nexport const CHATGPT_SIGN_IN_HINT = `Sign in to ${CHATGPT_AUTH_PROVIDER_NAME} under Settings > Providers, or with /login.`;\n\n/** Where a feature reads the shared sign-in: a session's or the hub's Pi model runtime. */\nexport interface ChatgptAuthSource {\n available(): boolean;\n getAuth(signal?: AbortSignal): Promise<{ auth: { apiKey?: string } } | undefined>;\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Reads a JSON body without buffering more than `limit` bytes. Errors are generic; callers map them. */\nexport async function readBoundedJson(response: Response, limit: number, signal?: AbortSignal): Promise<unknown> {\n if (!response.body) throw new Error('Response has no body.');\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let length = 0;\n try {\n while (true) {\n signal?.throwIfAborted();\n const { value, done } = await reader.read();\n if (done) break;\n length += value.length;\n if (length > limit) throw new Error('Response body is too large.');\n chunks.push(value);\n }\n signal?.throwIfAborted();\n return JSON.parse(Buffer.concat(chunks).toString('utf8')) as unknown;\n } finally {\n await reader.cancel().catch(() => undefined); // Response cleanup never replaces the operation error.\n reader.releaseLock();\n }\n}\n\n/** The ChatGPT account claim of an access token, or undefined when it is missing or malformed. */\nexport function accountIdOf(token: string): string | undefined {\n try {\n const payload: unknown = JSON.parse(Buffer.from(token.split('.')[1] ?? '', 'base64url').toString('utf8'));\n const auth = record(payload) ? payload['https://api.openai.com/auth'] : undefined;\n const id = record(auth) ? auth.chatgpt_account_id : undefined;\n return typeof id === 'string' && /^[A-Za-z0-9_-]{1,256}$/.test(id) ? id : undefined;\n } catch {\n return undefined; // Documented fallback: a malformed token has no account, which callers treat as signed out.\n }\n}\n\n/** Resolves the subscription token and account claim; every failure becomes `loginMessage` unless aborted. */\nexport async function chatgptCredentials(\n source: ChatgptAuthSource,\n loginMessage: string,\n signal?: AbortSignal,\n): Promise<{ token: string; accountId: string }> {\n if (!source.available()) throw new Error(loginMessage);\n let token: string | undefined;\n try {\n token = (await source.getAuth(signal))?.auth.apiKey;\n } catch {\n signal?.throwIfAborted();\n throw new Error(loginMessage);\n }\n signal?.throwIfAborted();\n const accountId = token ? accountIdOf(token) : undefined;\n if (!token || !accountId) throw new Error(loginMessage);\n return { token, accountId };\n}\n"],"mappings":";;AAMA,MAAa,2BAA2B;AACxC,MAAa,6BAA6B;AAC1C,MAAa,uBAAuB,cAAc,2BAA2B;AAQ7E,SAAS,OAAO,OAAkD;CAChE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;AAGA,eAAsB,gBAAgB,UAAoB,OAAe,QAAwC;CAC/G,IAAI,CAAC,SAAS,MAAM,MAAM,IAAI,MAAM,uBAAuB;CAC3D,MAAM,SAAS,SAAS,KAAK,UAAU;CACvC,MAAM,SAAuB,CAAC;CAC9B,IAAI,SAAS;CACb,IAAI;EACF,OAAO,MAAM;GACX,QAAQ,eAAe;GACvB,MAAM,EAAE,OAAO,SAAS,MAAM,OAAO,KAAK;GAC1C,IAAI,MAAM;GACV,UAAU,MAAM;GAChB,IAAI,SAAS,OAAO,MAAM,IAAI,MAAM,6BAA6B;GACjE,OAAO,KAAK,KAAK;EACnB;EACA,QAAQ,eAAe;EACvB,OAAO,KAAK,MAAM,OAAO,OAAO,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC;CAC1D,UAAU;EACR,MAAM,OAAO,OAAO,CAAC,CAAC,YAAY,KAAA,CAAS;EAC3C,OAAO,YAAY;CACrB;AACF;;AAGA,SAAgB,YAAY,OAAmC;CAC7D,IAAI;EACF,MAAM,UAAmB,KAAK,MAAM,OAAO,KAAK,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC;EACxG,MAAM,OAAO,OAAO,OAAO,IAAI,QAAQ,iCAAiC,KAAA;EACxE,MAAM,KAAK,OAAO,IAAI,IAAI,KAAK,qBAAqB,KAAA;EACpD,OAAO,OAAO,OAAO,YAAY,yBAAyB,KAAK,EAAE,IAAI,KAAK,KAAA;CAC5E,QAAQ;EACN;CACF;AACF;;AAGA,eAAsB,mBACpB,QACA,cACA,QAC+C;CAC/C,IAAI,CAAC,OAAO,UAAU,GAAG,MAAM,IAAI,MAAM,YAAY;CACrD,IAAI;CACJ,IAAI;EACF,SAAS,MAAM,OAAO,QAAQ,MAAM,EAAA,EAAI,KAAK;CAC/C,QAAQ;EACN,QAAQ,eAAe;EACvB,MAAM,IAAI,MAAM,YAAY;CAC9B;CACA,QAAQ,eAAe;CACvB,MAAM,YAAY,QAAQ,YAAY,KAAK,IAAI,KAAA;CAC/C,IAAI,CAAC,SAAS,CAAC,WAAW,MAAM,IAAI,MAAM,YAAY;CACtD,OAAO;EAAE;EAAO;CAAU;AAC5B"}