@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,10 +1,10 @@
1
1
  import { ContextSkillInventory, ContextToolSource, PackageAttribution } from "../../../../contextProjection.mjs";
2
- import { DoomServerBundleEntry } from "../../../schemas/serverBundle.mjs";
3
- import { DoomHeadlessExecutionContext, DoomHeadlessHostService, DoomHeadlessResource, DoomHeadlessSelection, DoomHeadlessTool } from "../../../schemas/headless.mjs";
2
+ import { PoServerBundleEntry } from "../../../schemas/serverBundle.mjs";
3
+ import { PoHeadlessExecutionContext, PoHeadlessHostService, PoHeadlessResource, PoHeadlessSelection, PoHeadlessSelectionChange, PoHeadlessTool } from "../../../schemas/headless.mjs";
4
4
  import "../../../../headless.mjs";
5
- import "../../../../serverFacet.mjs";
5
+ import "../../../../serverPlugin.mjs";
6
6
  //#region src/systems/main/types/headlessHost.d.ts
7
- export type ResolvedHeadlessResource = Pick<DoomHeadlessResource, 'name' | 'kind' | 'description' | 'path'> & {
7
+ export type ResolvedHeadlessResource = Pick<PoHeadlessResource, 'name' | 'kind' | 'description' | 'path'> & {
8
8
  source: string;
9
9
  text: string;
10
10
  };
@@ -14,18 +14,20 @@ export interface HeadlessContextInventory {
14
14
  readonly attribution: Readonly<Record<string, PackageAttribution>>;
15
15
  }
16
16
  export interface HeadlessHostOptions {
17
- candidates: readonly DoomServerBundleEntry[];
18
- selection: DoomHeadlessSelection;
17
+ candidates: readonly PoServerBundleEntry[];
18
+ selection: PoHeadlessSelection;
19
19
  selectionOverrides?: readonly ('majorMode' | 'domains' | 'profile')[];
20
- context(selection: DoomHeadlessSelection): DoomHeadlessExecutionContext;
21
- toolSurface?(): DoomHeadlessHostService['toolSurface'];
22
- applyTools(tools: readonly DoomHeadlessTool[]): void | Promise<void>;
20
+ context(selection: PoHeadlessSelection): PoHeadlessExecutionContext;
21
+ /** Defer operator selection writes without making the currently applied host unready. */
22
+ scheduleSelection?(change: PoHeadlessSelectionChange, apply: (change: PoHeadlessSelectionChange) => Promise<void>): Promise<void>;
23
+ toolSurface?(): PoHeadlessHostService['toolSurface'];
24
+ applyTools(tools: readonly PoHeadlessTool[]): void | Promise<void>;
23
25
  applyResources(resources: readonly ResolvedHeadlessResource[]): void | Promise<void>;
24
- resolveSelection?(selection: DoomHeadlessSelection): DoomHeadlessSelection | Promise<DoomHeadlessSelection>;
25
- validateSelection?(selection: DoomHeadlessSelection): void | Promise<void>;
26
- allowedTools?(selection: DoomHeadlessSelection): readonly string[] | undefined;
27
- onApplied?(selection: DoomHeadlessSelection, revision: number): void | Promise<void>;
28
- onError?(error: unknown): void;
26
+ resolveSelection?(selection: PoHeadlessSelection): PoHeadlessSelection | Promise<PoHeadlessSelection>;
27
+ validateSelection?(selection: PoHeadlessSelection): void | Promise<void>;
28
+ allowedTools?(selection: PoHeadlessSelection): readonly string[] | undefined;
29
+ onApplied?(selection: PoHeadlessSelection, revision: number): void | Promise<void>;
30
+ onError?(error: unknown, source?: 'activity' | 'apply' | 'hook' | 'resource'): void;
29
31
  }
30
32
  export interface HeadlessSelectionStatus {
31
33
  requestedRevision: number;
@@ -1 +1 @@
1
- {"version":3,"file":"headlessHost.d.mts","names":[],"sources":["../../../../../src/systems/main/types/headlessHost.ts"],"mappings":";;;;;;YAWY,2BAA2B,KAAK;EAC1C;EACA;;iBAGe;WACN,kBAAkB;WAClB,iBAAiB;WACjB,aAAa,SAAS,eAAe;;iBAG/B;EACf,qBAAqB;EACrB,WAAW;EACX;EACA,QAAQ,WAAW,wBAAwB;EAC3C,gBAAgB;EAChB,WAAW,gBAAgB,4BAA4B;EACvD,eAAe,oBAAoB,oCAAoC;EACvE,kBAAkB,WAAW,wBAAwB,wBAAwB,QAAQ;EACrF,mBAAmB,WAAW,+BAA+B;EAC7D,cAAc,WAAW;EACzB,WAAW,WAAW,uBAAuB,0BAA0B;EACvE,SAAS;;iBAGM;EACf;EACA;EACA;EACA"}
1
+ {"version":3,"file":"headlessHost.d.mts","names":[],"sources":["../../../../../src/systems/main/types/headlessHost.ts"],"mappings":";;;;;;YAYY,2BAA2B,KAAK;EAC1C;EACA;;iBAGe;WACN,kBAAkB;WAClB,iBAAiB;WACjB,aAAa,SAAS,eAAe;;iBAG/B;EACf,qBAAqB;EACrB,WAAW;EACX;EACA,QAAQ,WAAW,sBAAsB;;EAEzC,mBACE,QAAQ,2BACR,QAAQ,QAAQ,8BAA8B,gBAC7C;EACH,gBAAgB;EAChB,WAAW,gBAAgB,0BAA0B;EACrD,eAAe,oBAAoB,oCAAoC;EACvE,kBAAkB,WAAW,sBAAsB,sBAAsB,QAAQ;EACjF,mBAAmB,WAAW,6BAA6B;EAC3D,cAAc,WAAW;EACzB,WAAW,WAAW,qBAAqB,0BAA0B;EACrE,SAAS,gBAAgB;;iBAGV;EACf;EACA;EACA;EACA"}
@@ -374,12 +374,12 @@ function createPiTestHost(options = {}) {
374
374
  },
375
375
  async cordis(source = DEFAULT_CORDIS_SOURCE) {
376
376
  if (cordisConnection === void 0) {
377
- const controller = await require_runtimeCordisHost.installDoomCordisHost(pi, {
377
+ const controller = await require_runtimeCordisHost.installPoCordisHost(pi, {
378
378
  mode: "standalone",
379
379
  source: `${source}:standalone-host`
380
380
  });
381
381
  try {
382
- cordisConnection = await require_runtimeCordisHost.connectDoomCordisHost(pi, source);
382
+ cordisConnection = await require_runtimeCordisHost.connectPoCordisHost(pi, source);
383
383
  } catch (error) {
384
384
  await controller.shutdown();
385
385
  throw error;
@@ -1 +1 @@
1
- {"version":3,"file":"testHost.cjs","names":["installDoomCordisHost","connectDoomCordisHost"],"sources":["../../../../src/testing/pi/testHost.ts"],"sourcesContent":["import type {\n ExtensionAPI,\n ExtensionContext,\n ExtensionToolContext,\n ToolDefinition,\n ToolInfo,\n} from '@earendil-works/pi-coding-agent';\nimport type { TSchema } from 'typebox';\n\nimport { connectDoomCordisHost, installDoomCordisHost, type DoomCordisHostConnection } from '../../pi/cordisHost';\n\n/**\n * A Pi host a test drives, in place of the one Pi builds at runtime.\n *\n * Every extension package needs one, and before this each wrote its own as an\n * `as unknown as ExtensionAPI` cast over the four or five members that package\n * happened to call. A cast type-checks whatever Pi's interface becomes, so the\n * casts all kept passing while diverging from each other and from Pi.\n *\n * `pi` here is a plain `ExtensionAPI`, assigned without a cast. When a Pi\n * upgrade adds or reshapes a member, this file stops compiling, which is the\n * whole point: one place to notice, instead of ninety places that never do.\n *\n * `ExtensionContext` cannot be held to the same standard and is built with one\n * cast, named at the site. Three of its members are unsatisfiable by an object\n * literal: `modelRegistry` is a class with a private field, so it is nominally\n * typed; `ui.theme` is typed from a module Pi does not export; and `model` is\n * a populated provider record no test asserts on. The context is otherwise\n * built member by member, and the surface extensions actually program against,\n * `ExtensionAPI`, carries no cast at all.\n */\n\n/**\n * Every handler Pi's 34 `on` overloads accept, stored as one.\n *\n * `never` in the parameter positions is what makes all 34 assignable: a handler\n * is only accepted where the stored type asks for less than the handler does.\n * The consequence is that a stored handler cannot be called without widening it\n * back, which `invokable` does once, below. No single type both accepts every\n * overload and is callable with an arbitrary payload.\n */\ntype LifecycleHandler = (event: never, context: never) => unknown;\n/** One stored handler, widened at the single point that calls it. */\ntype InvokableHandler = (event: unknown, context: unknown) => unknown;\n\nfunction invokable(handler: LifecycleHandler): InvokableHandler {\n return handler as InvokableHandler;\n}\n\n/** Types Pi declares but does not re-export from its package root. */\ntype SessionManagerView = ExtensionContext['sessionManager'];\ntype RunMode = ExtensionContext['mode'];\ntype ShortcutId = Parameters<ExtensionAPI['registerShortcut']>[0];\ntype ShortcutOptions = Parameters<ExtensionAPI['registerShortcut']>[1];\ntype CommandOptions = Parameters<ExtensionAPI['registerCommand']>[1];\ntype FlagOptions = Parameters<ExtensionAPI['registerFlag']>[1];\ntype CustomMessagePayload = Parameters<ExtensionAPI['sendMessage']>[0];\ntype SendMessageOptions = Parameters<ExtensionAPI['sendMessage']>[1];\ntype UserMessageContent = Parameters<ExtensionAPI['sendUserMessage']>[0];\ntype SendUserMessageOptions = Parameters<ExtensionAPI['sendUserMessage']>[1];\ntype RegisteredTool = Parameters<ExtensionAPI['registerTool']>[0];\ntype ToolUpdateCallback = Parameters<RegisteredTool['execute']>[3];\ntype ExecutionResult = Awaited<ReturnType<ExtensionAPI['exec']>>;\ntype ExecutionOptions = Parameters<ExtensionAPI['exec']>[2];\ntype ThinkingLevelValue = ReturnType<ExtensionAPI['getThinkingLevel']>;\ntype WidgetContent = Parameters<ExtensionContext['ui']['setWidget']>[1];\n\n/** Inventory entry for a host-owned tool this harness cannot execute. */\nfunction builtinToolInfo(name: string): ToolInfo {\n return {\n name,\n description: `Built-in ${name}`,\n parameters: { type: 'object', properties: {}, additionalProperties: false },\n sourceInfo: { type: 'builtin' },\n } as unknown as ToolInfo;\n}\n\n/** Inventory view of a tool an extension registered with this host. */\nfunction registeredToolInfo(tool: RegisteredTool): ToolInfo {\n return {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n promptGuidelines: (tool as { promptGuidelines?: unknown }).promptGuidelines,\n sourceInfo: { type: 'extension' },\n } as unknown as ToolInfo;\n}\n\nexport interface RecordedCommand {\n name: string;\n options: CommandOptions;\n}\nexport interface RecordedShortcut {\n shortcut: ShortcutId;\n options: ShortcutOptions;\n}\nexport interface RecordedRenderer {\n customType: string;\n renderer: unknown;\n}\n/** A `registerProvider` call in either of its two shapes. */\nexport interface RecordedProvider {\n /** Present for the `(name, config)` overload. */\n name?: string;\n value: unknown;\n}\nexport interface RecordedMessage {\n message: CustomMessagePayload;\n options: SendMessageOptions;\n}\nexport interface RecordedUserMessage {\n content: UserMessageContent;\n options: SendUserMessageOptions;\n}\nexport interface RecordedEntry {\n customType: string;\n data: unknown;\n}\nexport interface RecordedExec {\n command: string;\n args: string[];\n options: ExecutionOptions;\n}\nexport interface RecordedNotification {\n sessionId: string;\n message: string;\n level: 'info' | 'warning' | 'error' | undefined;\n}\nexport interface RecordedWidget {\n sessionId: string;\n key: string;\n content: WidgetContent;\n}\nexport interface RecordedStatus {\n sessionId: string;\n key: string;\n text: string | undefined;\n}\n\n/**\n * What the extension's dialogs answer.\n *\n * Every default is the dismissal, because that is the answer a headless host\n * gives and the one an extension is most likely to mishandle.\n */\nexport interface PiTestDialogAnswers {\n select(title: string, options: string[]): string | undefined;\n confirm(title: string, message: string): boolean;\n input(title: string, placeholder: string | undefined): string | undefined;\n editor(title: string, prefill: string | undefined): string | undefined;\n}\n\nexport interface PiTestContextOptions {\n sessionId?: string;\n cwd?: string;\n hasUI?: boolean;\n mode?: RunMode;\n isIdle?: boolean;\n isProjectTrusted?: boolean;\n signal?: AbortSignal;\n answers?: Partial<PiTestDialogAnswers>;\n systemPrompt?: string;\n}\n\nexport interface PiTestHostOptions extends PiTestContextOptions {\n /** Answers `pi.exec`; the default reports a command that ran and printed nothing. */\n exec?: (command: string, args: string[]) => ExecutionResult | Promise<ExecutionResult>;\n /**\n * Tool names Pi would already own before any extension loads.\n *\n * They join the inventory and start active, which is how the tool surface\n * arbiter learns that a name like `read` exists without a definition for it.\n */\n builtinTools?: readonly string[];\n}\n\nexport interface PiTestHost {\n /** The host an extension factory receives. */\n readonly pi: ExtensionAPI;\n readonly tools: readonly RegisteredTool[];\n readonly commands: readonly RecordedCommand[];\n readonly shortcuts: readonly RecordedShortcut[];\n readonly flags: ReadonlyMap<string, FlagOptions>;\n readonly messageRenderers: readonly RecordedRenderer[];\n readonly entryRenderers: readonly RecordedRenderer[];\n readonly markdownTransformers: readonly unknown[];\n readonly providers: readonly RecordedProvider[];\n readonly unregisteredProviders: readonly string[];\n readonly messages: readonly RecordedMessage[];\n readonly userMessages: readonly RecordedUserMessage[];\n readonly entries: readonly RecordedEntry[];\n readonly execs: readonly RecordedExec[];\n readonly notifications: readonly RecordedNotification[];\n readonly statuses: readonly RecordedStatus[];\n readonly widgets: readonly RecordedWidget[];\n /** Tool names Pi would offer the model right now. */\n activeTools(): readonly string[];\n tool(name: string): RegisteredTool | undefined;\n command(name: string): RecordedCommand | undefined;\n /** Lifecycle handlers registered for one event, in registration order. */\n handlers(event: string): readonly InvokableHandler[];\n /** A context for this host; each call builds a fresh one, as Pi does per event. */\n context(options?: PiTestContextOptions): ExtensionToolContext;\n /**\n * Runs every handler for one lifecycle event and returns what they answered.\n *\n * Sequential and awaited, matching Pi, so a test can observe one handler's\n * effect on the next.\n */\n emit(event: string, payload?: unknown, context?: ExtensionContext): Promise<unknown[]>;\n /** Calls a registered tool the way Pi's runner does. */\n callTool(\n name: string,\n params?: unknown,\n options?: {\n toolCallId?: string;\n signal?: AbortSignal;\n onUpdate?: ToolUpdateCallback;\n context?: ExtensionToolContext;\n },\n ): Promise<unknown>;\n /** Runs a registered slash command the way Pi's palette does. */\n runCommand(name: string, args?: string, context?: ExtensionContext): Promise<void>;\n /** The real Cordis host on this runner, installed on first use and disposed by `dispose`. */\n cordis(source?: string): Promise<DoomCordisHostConnection>;\n dispose(): Promise<void>;\n}\n\nconst DEFAULT_CWD = '/repo';\nconst DEFAULT_SESSION_ID = 'test-session';\nconst DEFAULT_MODE: RunMode = 'tui';\nconst DEFAULT_SYSTEM_PROMPT = '';\nconst DEFAULT_CORDIS_SOURCE = 'pi-test-host';\nconst DEFAULT_EXEC: ExecutionResult = { code: 0, killed: false, stdout: '', stderr: '' };\n\nconst DISMISSED: PiTestDialogAnswers = {\n select: () => undefined,\n confirm: () => false,\n input: () => undefined,\n editor: () => undefined,\n};\n\n/**\n * A Pi host and the records of what an extension did to it.\n *\n * Nothing here is a spy from a test framework: the records are plain arrays, so\n * the harness works under any runner and adds no dependency to a package that\n * every extension already installs.\n */\nexport function createPiTestHost(options: PiTestHostOptions = {}): PiTestHost {\n const builtinTools: readonly string[] = options.builtinTools ?? [];\n const tools: RegisteredTool[] = [];\n const commands: RecordedCommand[] = [];\n const shortcuts: RecordedShortcut[] = [];\n const flags = new Map<string, FlagOptions>();\n const messageRenderers: RecordedRenderer[] = [];\n const entryRenderers: RecordedRenderer[] = [];\n const markdownTransformers: unknown[] = [];\n const providers: RecordedProvider[] = [];\n const unregisteredProviders: string[] = [];\n const messages: RecordedMessage[] = [];\n const userMessages: RecordedUserMessage[] = [];\n const entries: RecordedEntry[] = [];\n const execs: RecordedExec[] = [];\n const notifications: RecordedNotification[] = [];\n const statuses: RecordedStatus[] = [];\n const widgets: RecordedWidget[] = [];\n\n const lifecycle = new Map<string, LifecycleHandler[]>();\n const channels = new Map<string, Set<(data: unknown) => void>>();\n let activeToolNames: string[] = [...builtinTools];\n let sessionName: string | undefined;\n let thinkingLevel: ThinkingLevelValue = 'off';\n let cordisConnection: DoomCordisHostConnection | undefined;\n\n const runExec = options.exec ?? ((): ExecutionResult => DEFAULT_EXEC);\n\n const pi: ExtensionAPI = {\n on(event: string, handler: LifecycleHandler): () => void {\n const registered = lifecycle.get(event) ?? [];\n registered.push(handler);\n lifecycle.set(event, registered);\n return () => {\n const index = registered.indexOf(handler);\n if (index === -1) return;\n registered.splice(index, 1);\n if (registered.length === 0) lifecycle.delete(event);\n };\n },\n // Generic exactly as Pi declares it. Storage erases the schema generics; the\n // signature is the half that has to keep matching.\n registerTool<TParams extends TSchema = TSchema, TDetails = unknown, TState = unknown>(\n tool: ToolDefinition<TParams, TDetails, TState>,\n ): void {\n tools.push(tool as unknown as RegisteredTool);\n if (!activeToolNames.includes(tool.name)) activeToolNames.push(tool.name);\n },\n registerToolRenderer(): void {},\n registerCommand(name: string, commandOptions: CommandOptions): void {\n commands.push({ name, options: commandOptions });\n },\n registerShortcut(shortcut: ShortcutId, shortcutOptions: ShortcutOptions): void {\n shortcuts.push({ shortcut, options: shortcutOptions });\n },\n registerFlag(name: string, flagOptions: FlagOptions): void {\n flags.set(name, flagOptions);\n },\n getFlag(name: string): boolean | string | undefined {\n return flags.get(name)?.default;\n },\n registerMessageRenderer(customType: string, renderer: unknown): void {\n messageRenderers.push({ customType, renderer });\n },\n registerMarkdownTransformer(transformer: unknown): void {\n markdownTransformers.push(transformer);\n },\n registerEntryRenderer(customType: string, renderer: unknown): void {\n entryRenderers.push({ customType, renderer });\n },\n sendMessage(message: CustomMessagePayload, sendOptions?: SendMessageOptions): void {\n messages.push({ message, options: sendOptions });\n },\n sendUserMessage(content: UserMessageContent, sendOptions?: SendUserMessageOptions): void {\n userMessages.push({ content, options: sendOptions });\n },\n appendEntry(customType: string, data?: unknown): void {\n entries.push({ customType, data });\n },\n setSessionName(name: string): void {\n sessionName = name;\n },\n getSessionName(): string | undefined {\n return sessionName;\n },\n setLabel(): void {\n // Labels are session bookmarks; no Po extension reads them back.\n },\n async exec(command: string, args: string[], execOptions?: ExecutionOptions): Promise<ExecutionResult> {\n execs.push({ command, args, options: execOptions });\n return runExec(command, args);\n },\n getActiveTools(): string[] {\n return [...activeToolNames];\n },\n getAllTools(): ToolInfo[] {\n // Pi's inventory folds in built-in and MCP tools, which this host models\n // as names only: a test asserts on the surface, never on their behaviour.\n return [...builtinTools.map(builtinToolInfo), ...tools.map(registeredToolInfo)];\n },\n setActiveTools(toolNames: string[]): void {\n activeToolNames = [...toolNames];\n },\n getSettings() {\n return {};\n },\n // No Po extension registers MCP servers or virtual models through Pi yet.\n registerMcpServer(): void {},\n unregisterMcpServer(): void {},\n getMcpServers() {\n return [];\n },\n registerVirtualModel(): void {},\n unregisterVirtualModel(): void {},\n getCommands(): never[] {\n return [];\n },\n async setModel(): Promise<boolean> {\n // No API key is configured, which is the answer Pi gives for the same reason.\n return false;\n },\n getThinkingLevel(): ThinkingLevelValue {\n return thinkingLevel;\n },\n setThinkingLevel(level: ThinkingLevelValue): void {\n thinkingLevel = level;\n },\n registerProvider(providerOrName: unknown, config?: unknown): void {\n providers.push(\n typeof providerOrName === 'string' ? { name: providerOrName, value: config } : { value: providerOrName },\n );\n },\n unregisterProvider(name: string): void {\n unregisteredProviders.push(name);\n },\n events: {\n emit(channel: string, data: unknown): void {\n // A snapshot: a listener that unsubscribes on delivery would otherwise\n // reshape the set this loop is walking.\n const delivered = [...(channels.get(channel) ?? [])];\n for (const listener of delivered) listener(data);\n },\n on(channel: string, listener: (data: unknown) => void): () => void {\n const listeners = channels.get(channel) ?? new Set<(data: unknown) => void>();\n listeners.add(listener);\n channels.set(channel, listeners);\n return () => listeners.delete(listener);\n },\n },\n };\n\n function buildContext(contextOptions: PiTestContextOptions = {}): ExtensionToolContext {\n const sessionId = contextOptions.sessionId ?? options.sessionId ?? DEFAULT_SESSION_ID;\n const cwd = contextOptions.cwd ?? options.cwd ?? DEFAULT_CWD;\n const answers = { ...DISMISSED, ...options.answers, ...contextOptions.answers };\n const sessionManager = {\n getCwd: () => cwd,\n getSessionId: () => sessionId,\n getSessionName: () => sessionName,\n getSessionDir: () => cwd,\n getSessionFile: () => `${cwd}/${sessionId}.jsonl`,\n getLeafId: () => undefined,\n getLeafEntry: () => undefined,\n getEntry: () => undefined,\n getLabel: () => undefined,\n getBranch: () => [],\n buildContextEntries: () => [],\n getHeader: () => undefined,\n getEntries: () => [],\n getTree: () => [],\n };\n const ui = {\n select: async (title: string, selectOptions: string[]) => answers.select(title, selectOptions),\n confirm: async (title: string, message: string) => answers.confirm(title, message),\n input: async (title: string, placeholder?: string) => answers.input(title, placeholder),\n editor: async (title: string, prefill?: string) => answers.editor(title, prefill),\n notify: (message: string, level?: 'info' | 'warning' | 'error') => {\n notifications.push({ sessionId, message, level });\n },\n onTerminalInput: () => () => undefined,\n setStatus: (key: string, text: string | undefined) => {\n statuses.push({ sessionId, key, text });\n },\n setWorkingMessage: () => undefined,\n setWorkingVisible: () => undefined,\n setWorkingIndicator: () => undefined,\n setHiddenThinkingLabel: () => undefined,\n setWidget: (key: string, content: WidgetContent) => {\n widgets.push({ sessionId, key, content });\n },\n setFooter: () => undefined,\n setHeader: () => undefined,\n setTitle: () => undefined,\n // A custom component needs a real TUI to resolve, so it never does. An\n // extension awaiting one must stay responsive, which is what this proves.\n custom: () => new Promise<never>(() => undefined),\n pasteToEditor: () => undefined,\n setEditorText: () => undefined,\n getEditorText: () => '',\n addAutocompleteProvider: () => undefined,\n setEditorComponent: () => undefined,\n getEditorComponent: () => undefined,\n theme: undefined,\n getAllThemes: () => [],\n getTheme: () => undefined,\n setTheme: () => ({ success: false, error: 'This host renders nothing.' }),\n getToolsExpanded: () => false,\n setToolsExpanded: () => undefined,\n };\n const context = {\n ui,\n mode: contextOptions.mode ?? options.mode ?? DEFAULT_MODE,\n hasUI: contextOptions.hasUI ?? options.hasUI ?? true,\n cwd,\n sessionManager: sessionManager as unknown as SessionManagerView,\n modelRegistry: undefined,\n model: undefined,\n scopedModels: [],\n isIdle: () => contextOptions.isIdle ?? options.isIdle ?? true,\n isProjectTrusted: () => contextOptions.isProjectTrusted ?? options.isProjectTrusted ?? true,\n signal: contextOptions.signal ?? options.signal,\n abort: () => undefined,\n hasPendingMessages: () => false,\n shutdown: () => undefined,\n getContextUsage: () => undefined,\n compact: () => undefined,\n getSystemPrompt: () => contextOptions.systemPrompt ?? options.systemPrompt ?? DEFAULT_SYSTEM_PROMPT,\n // Command handlers receive the wider context, and an extension that only\n // reads it should not have to be handed a second fixture to be exercised.\n getSystemPromptOptions: () => ({}),\n waitForIdle: async () => undefined,\n newSession: async () => ({ cancelled: true }),\n fork: async () => ({ cancelled: true }),\n navigateTree: async () => ({ cancelled: true }),\n switchSession: async () => ({ cancelled: true }),\n reload: async () => undefined,\n // Tool execute() receives the tool context. Nested calls answer as Pi does when unbound.\n tools: [],\n executeTool: async (name: string) => ({\n toolCall: { type: 'toolCall', id: 'nested/0', name, arguments: {} },\n result: {\n content: [{ type: 'text', text: 'Nested tool calls are not available in this context' }],\n details: {},\n },\n isError: true,\n }),\n };\n // The one cast. `modelRegistry` is a class with a private field and so is\n // nominally typed, `ui.theme` is typed from a module Pi does not export,\n // and `model` is a populated provider record. No object literal can satisfy\n // those three, and no Po extension reads them.\n return context as unknown as ExtensionToolContext;\n }\n\n return {\n pi,\n tools,\n commands,\n shortcuts,\n flags,\n messageRenderers,\n entryRenderers,\n markdownTransformers,\n providers,\n unregisteredProviders,\n messages,\n userMessages,\n entries,\n execs,\n notifications,\n statuses,\n widgets,\n activeTools: () => [...activeToolNames],\n tool: (name) => tools.findLast((candidate) => candidate.name === name),\n command: (name) => commands.find((candidate) => candidate.name === name),\n handlers: (event) => (lifecycle.get(event) ?? []).map(invokable),\n context: buildContext,\n async emit(event, payload, context) {\n const eventContext = context ?? buildContext();\n const answered: unknown[] = [];\n // A snapshot, because a handler may register another for the same event\n // and Pi does not deliver this emission to it.\n const delivered = [...(lifecycle.get(event) ?? [])];\n for (const handler of delivered) {\n answered.push(await invokable(handler)({ type: event, ...(payload as object) }, eventContext));\n }\n if (event === 'session_shutdown') cordisConnection = undefined;\n return answered;\n },\n async callTool(name, params = {}, callOptions = {}) {\n const tool = tools.findLast((candidate) => candidate.name === name);\n if (!tool) throw new Error(`No tool named '${name}' is registered on this host.`);\n return tool.execute(\n callOptions.toolCallId ?? `call-${String(tools.indexOf(tool))}`,\n params,\n callOptions.signal,\n callOptions.onUpdate,\n callOptions.context ?? buildContext(),\n );\n },\n async runCommand(name, args = '', context) {\n const command = commands.find((candidate) => candidate.name === name);\n if (!command) throw new Error(`No command named '${name}' is registered on this host.`);\n await command.options.handler(args, (context ?? buildContext()) as never);\n },\n async cordis(source = DEFAULT_CORDIS_SOURCE) {\n if (cordisConnection === undefined) {\n const controller = await installDoomCordisHost(pi, {\n mode: 'standalone',\n source: `${source}:standalone-host`,\n });\n try {\n cordisConnection = await connectDoomCordisHost(pi, source);\n } catch (error) {\n await controller.shutdown();\n throw error;\n }\n }\n return cordisConnection;\n },\n async dispose() {\n await cordisConnection?.dispose();\n cordisConnection = undefined;\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"testHost.cjs","names":["installPoCordisHost","connectPoCordisHost"],"sources":["../../../../src/testing/pi/testHost.ts"],"sourcesContent":["import type {\n ExtensionAPI,\n ExtensionContext,\n ExtensionToolContext,\n ToolDefinition,\n ToolInfo,\n} from '@earendil-works/pi-coding-agent';\nimport type { TSchema } from 'typebox';\n\nimport { connectPoCordisHost, installPoCordisHost, type PoCordisHostConnection } from '../../pi/cordisHost';\n\n/**\n * A Pi host a test drives, in place of the one Pi builds at runtime.\n *\n * Every extension package needs one, and before this each wrote its own as an\n * `as unknown as ExtensionAPI` cast over the four or five members that package\n * happened to call. A cast type-checks whatever Pi's interface becomes, so the\n * casts all kept passing while diverging from each other and from Pi.\n *\n * `pi` here is a plain `ExtensionAPI`, assigned without a cast. When a Pi\n * upgrade adds or reshapes a member, this file stops compiling, which is the\n * whole point: one place to notice, instead of ninety places that never do.\n *\n * `ExtensionContext` cannot be held to the same standard and is built with one\n * cast, named at the site. Three of its members are unsatisfiable by an object\n * literal: `modelRegistry` is a class with a private field, so it is nominally\n * typed; `ui.theme` is typed from a module Pi does not export; and `model` is\n * a populated provider record no test asserts on. The context is otherwise\n * built member by member, and the surface extensions actually program against,\n * `ExtensionAPI`, carries no cast at all.\n */\n\n/**\n * Every handler Pi's 34 `on` overloads accept, stored as one.\n *\n * `never` in the parameter positions is what makes all 34 assignable: a handler\n * is only accepted where the stored type asks for less than the handler does.\n * The consequence is that a stored handler cannot be called without widening it\n * back, which `invokable` does once, below. No single type both accepts every\n * overload and is callable with an arbitrary payload.\n */\ntype LifecycleHandler = (event: never, context: never) => unknown;\n/** One stored handler, widened at the single point that calls it. */\ntype InvokableHandler = (event: unknown, context: unknown) => unknown;\n\nfunction invokable(handler: LifecycleHandler): InvokableHandler {\n return handler as InvokableHandler;\n}\n\n/** Types Pi declares but does not re-export from its package root. */\ntype SessionManagerView = ExtensionContext['sessionManager'];\ntype RunMode = ExtensionContext['mode'];\ntype ShortcutId = Parameters<ExtensionAPI['registerShortcut']>[0];\ntype ShortcutOptions = Parameters<ExtensionAPI['registerShortcut']>[1];\ntype CommandOptions = Parameters<ExtensionAPI['registerCommand']>[1];\ntype FlagOptions = Parameters<ExtensionAPI['registerFlag']>[1];\ntype CustomMessagePayload = Parameters<ExtensionAPI['sendMessage']>[0];\ntype SendMessageOptions = Parameters<ExtensionAPI['sendMessage']>[1];\ntype UserMessageContent = Parameters<ExtensionAPI['sendUserMessage']>[0];\ntype SendUserMessageOptions = Parameters<ExtensionAPI['sendUserMessage']>[1];\ntype RegisteredTool = Parameters<ExtensionAPI['registerTool']>[0];\ntype ToolUpdateCallback = Parameters<RegisteredTool['execute']>[3];\ntype ExecutionResult = Awaited<ReturnType<ExtensionAPI['exec']>>;\ntype ExecutionOptions = Parameters<ExtensionAPI['exec']>[2];\ntype ThinkingLevelValue = ReturnType<ExtensionAPI['getThinkingLevel']>;\ntype WidgetContent = Parameters<ExtensionContext['ui']['setWidget']>[1];\n\n/** Inventory entry for a host-owned tool this harness cannot execute. */\nfunction builtinToolInfo(name: string): ToolInfo {\n return {\n name,\n description: `Built-in ${name}`,\n parameters: { type: 'object', properties: {}, additionalProperties: false },\n sourceInfo: { type: 'builtin' },\n } as unknown as ToolInfo;\n}\n\n/** Inventory view of a tool an extension registered with this host. */\nfunction registeredToolInfo(tool: RegisteredTool): ToolInfo {\n return {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n promptGuidelines: (tool as { promptGuidelines?: unknown }).promptGuidelines,\n sourceInfo: { type: 'extension' },\n } as unknown as ToolInfo;\n}\n\nexport interface RecordedCommand {\n name: string;\n options: CommandOptions;\n}\nexport interface RecordedShortcut {\n shortcut: ShortcutId;\n options: ShortcutOptions;\n}\nexport interface RecordedRenderer {\n customType: string;\n renderer: unknown;\n}\n/** A `registerProvider` call in either of its two shapes. */\nexport interface RecordedProvider {\n /** Present for the `(name, config)` overload. */\n name?: string;\n value: unknown;\n}\nexport interface RecordedMessage {\n message: CustomMessagePayload;\n options: SendMessageOptions;\n}\nexport interface RecordedUserMessage {\n content: UserMessageContent;\n options: SendUserMessageOptions;\n}\nexport interface RecordedEntry {\n customType: string;\n data: unknown;\n}\nexport interface RecordedExec {\n command: string;\n args: string[];\n options: ExecutionOptions;\n}\nexport interface RecordedNotification {\n sessionId: string;\n message: string;\n level: 'info' | 'warning' | 'error' | undefined;\n}\nexport interface RecordedWidget {\n sessionId: string;\n key: string;\n content: WidgetContent;\n}\nexport interface RecordedStatus {\n sessionId: string;\n key: string;\n text: string | undefined;\n}\n\n/**\n * What the extension's dialogs answer.\n *\n * Every default is the dismissal, because that is the answer a headless host\n * gives and the one an extension is most likely to mishandle.\n */\nexport interface PiTestDialogAnswers {\n select(title: string, options: string[]): string | undefined;\n confirm(title: string, message: string): boolean;\n input(title: string, placeholder: string | undefined): string | undefined;\n editor(title: string, prefill: string | undefined): string | undefined;\n}\n\nexport interface PiTestContextOptions {\n sessionId?: string;\n cwd?: string;\n hasUI?: boolean;\n mode?: RunMode;\n isIdle?: boolean;\n isProjectTrusted?: boolean;\n signal?: AbortSignal;\n answers?: Partial<PiTestDialogAnswers>;\n systemPrompt?: string;\n}\n\nexport interface PiTestHostOptions extends PiTestContextOptions {\n /** Answers `pi.exec`; the default reports a command that ran and printed nothing. */\n exec?: (command: string, args: string[]) => ExecutionResult | Promise<ExecutionResult>;\n /**\n * Tool names Pi would already own before any extension loads.\n *\n * They join the inventory and start active, which is how the tool surface\n * arbiter learns that a name like `read` exists without a definition for it.\n */\n builtinTools?: readonly string[];\n}\n\nexport interface PiTestHost {\n /** The host an extension factory receives. */\n readonly pi: ExtensionAPI;\n readonly tools: readonly RegisteredTool[];\n readonly commands: readonly RecordedCommand[];\n readonly shortcuts: readonly RecordedShortcut[];\n readonly flags: ReadonlyMap<string, FlagOptions>;\n readonly messageRenderers: readonly RecordedRenderer[];\n readonly entryRenderers: readonly RecordedRenderer[];\n readonly markdownTransformers: readonly unknown[];\n readonly providers: readonly RecordedProvider[];\n readonly unregisteredProviders: readonly string[];\n readonly messages: readonly RecordedMessage[];\n readonly userMessages: readonly RecordedUserMessage[];\n readonly entries: readonly RecordedEntry[];\n readonly execs: readonly RecordedExec[];\n readonly notifications: readonly RecordedNotification[];\n readonly statuses: readonly RecordedStatus[];\n readonly widgets: readonly RecordedWidget[];\n /** Tool names Pi would offer the model right now. */\n activeTools(): readonly string[];\n tool(name: string): RegisteredTool | undefined;\n command(name: string): RecordedCommand | undefined;\n /** Lifecycle handlers registered for one event, in registration order. */\n handlers(event: string): readonly InvokableHandler[];\n /** A context for this host; each call builds a fresh one, as Pi does per event. */\n context(options?: PiTestContextOptions): ExtensionToolContext;\n /**\n * Runs every handler for one lifecycle event and returns what they answered.\n *\n * Sequential and awaited, matching Pi, so a test can observe one handler's\n * effect on the next.\n */\n emit(event: string, payload?: unknown, context?: ExtensionContext): Promise<unknown[]>;\n /** Calls a registered tool the way Pi's runner does. */\n callTool(\n name: string,\n params?: unknown,\n options?: {\n toolCallId?: string;\n signal?: AbortSignal;\n onUpdate?: ToolUpdateCallback;\n context?: ExtensionToolContext;\n },\n ): Promise<unknown>;\n /** Runs a registered slash command the way Pi's palette does. */\n runCommand(name: string, args?: string, context?: ExtensionContext): Promise<void>;\n /** The real Cordis host on this runner, installed on first use and disposed by `dispose`. */\n cordis(source?: string): Promise<PoCordisHostConnection>;\n dispose(): Promise<void>;\n}\n\nconst DEFAULT_CWD = '/repo';\nconst DEFAULT_SESSION_ID = 'test-session';\nconst DEFAULT_MODE: RunMode = 'tui';\nconst DEFAULT_SYSTEM_PROMPT = '';\nconst DEFAULT_CORDIS_SOURCE = 'pi-test-host';\nconst DEFAULT_EXEC: ExecutionResult = { code: 0, killed: false, stdout: '', stderr: '' };\n\nconst DISMISSED: PiTestDialogAnswers = {\n select: () => undefined,\n confirm: () => false,\n input: () => undefined,\n editor: () => undefined,\n};\n\n/**\n * A Pi host and the records of what an extension did to it.\n *\n * Nothing here is a spy from a test framework: the records are plain arrays, so\n * the harness works under any runner and adds no dependency to a package that\n * every extension already installs.\n */\nexport function createPiTestHost(options: PiTestHostOptions = {}): PiTestHost {\n const builtinTools: readonly string[] = options.builtinTools ?? [];\n const tools: RegisteredTool[] = [];\n const commands: RecordedCommand[] = [];\n const shortcuts: RecordedShortcut[] = [];\n const flags = new Map<string, FlagOptions>();\n const messageRenderers: RecordedRenderer[] = [];\n const entryRenderers: RecordedRenderer[] = [];\n const markdownTransformers: unknown[] = [];\n const providers: RecordedProvider[] = [];\n const unregisteredProviders: string[] = [];\n const messages: RecordedMessage[] = [];\n const userMessages: RecordedUserMessage[] = [];\n const entries: RecordedEntry[] = [];\n const execs: RecordedExec[] = [];\n const notifications: RecordedNotification[] = [];\n const statuses: RecordedStatus[] = [];\n const widgets: RecordedWidget[] = [];\n\n const lifecycle = new Map<string, LifecycleHandler[]>();\n const channels = new Map<string, Set<(data: unknown) => void>>();\n let activeToolNames: string[] = [...builtinTools];\n let sessionName: string | undefined;\n let thinkingLevel: ThinkingLevelValue = 'off';\n let cordisConnection: PoCordisHostConnection | undefined;\n\n const runExec = options.exec ?? ((): ExecutionResult => DEFAULT_EXEC);\n\n const pi: ExtensionAPI = {\n on(event: string, handler: LifecycleHandler): () => void {\n const registered = lifecycle.get(event) ?? [];\n registered.push(handler);\n lifecycle.set(event, registered);\n return () => {\n const index = registered.indexOf(handler);\n if (index === -1) return;\n registered.splice(index, 1);\n if (registered.length === 0) lifecycle.delete(event);\n };\n },\n // Generic exactly as Pi declares it. Storage erases the schema generics; the\n // signature is the half that has to keep matching.\n registerTool<TParams extends TSchema = TSchema, TDetails = unknown, TState = unknown>(\n tool: ToolDefinition<TParams, TDetails, TState>,\n ): void {\n tools.push(tool as unknown as RegisteredTool);\n if (!activeToolNames.includes(tool.name)) activeToolNames.push(tool.name);\n },\n registerToolRenderer(): void {},\n registerCommand(name: string, commandOptions: CommandOptions): void {\n commands.push({ name, options: commandOptions });\n },\n registerShortcut(shortcut: ShortcutId, shortcutOptions: ShortcutOptions): void {\n shortcuts.push({ shortcut, options: shortcutOptions });\n },\n registerFlag(name: string, flagOptions: FlagOptions): void {\n flags.set(name, flagOptions);\n },\n getFlag(name: string): boolean | string | undefined {\n return flags.get(name)?.default;\n },\n registerMessageRenderer(customType: string, renderer: unknown): void {\n messageRenderers.push({ customType, renderer });\n },\n registerMarkdownTransformer(transformer: unknown): void {\n markdownTransformers.push(transformer);\n },\n registerEntryRenderer(customType: string, renderer: unknown): void {\n entryRenderers.push({ customType, renderer });\n },\n sendMessage(message: CustomMessagePayload, sendOptions?: SendMessageOptions): void {\n messages.push({ message, options: sendOptions });\n },\n sendUserMessage(content: UserMessageContent, sendOptions?: SendUserMessageOptions): void {\n userMessages.push({ content, options: sendOptions });\n },\n appendEntry(customType: string, data?: unknown): void {\n entries.push({ customType, data });\n },\n setSessionName(name: string): void {\n sessionName = name;\n },\n getSessionName(): string | undefined {\n return sessionName;\n },\n setLabel(): void {\n // Labels are session bookmarks; no Po extension reads them back.\n },\n async exec(command: string, args: string[], execOptions?: ExecutionOptions): Promise<ExecutionResult> {\n execs.push({ command, args, options: execOptions });\n return runExec(command, args);\n },\n getActiveTools(): string[] {\n return [...activeToolNames];\n },\n getAllTools(): ToolInfo[] {\n // Pi's inventory folds in built-in and MCP tools, which this host models\n // as names only: a test asserts on the surface, never on their behaviour.\n return [...builtinTools.map(builtinToolInfo), ...tools.map(registeredToolInfo)];\n },\n setActiveTools(toolNames: string[]): void {\n activeToolNames = [...toolNames];\n },\n getSettings() {\n return {};\n },\n // No Po extension registers MCP servers or virtual models through Pi yet.\n registerMcpServer(): void {},\n unregisterMcpServer(): void {},\n getMcpServers() {\n return [];\n },\n registerVirtualModel(): void {},\n unregisterVirtualModel(): void {},\n getCommands(): never[] {\n return [];\n },\n async setModel(): Promise<boolean> {\n // No API key is configured, which is the answer Pi gives for the same reason.\n return false;\n },\n getThinkingLevel(): ThinkingLevelValue {\n return thinkingLevel;\n },\n setThinkingLevel(level: ThinkingLevelValue): void {\n thinkingLevel = level;\n },\n registerProvider(providerOrName: unknown, config?: unknown): void {\n providers.push(\n typeof providerOrName === 'string' ? { name: providerOrName, value: config } : { value: providerOrName },\n );\n },\n unregisterProvider(name: string): void {\n unregisteredProviders.push(name);\n },\n events: {\n emit(channel: string, data: unknown): void {\n // A snapshot: a listener that unsubscribes on delivery would otherwise\n // reshape the set this loop is walking.\n const delivered = [...(channels.get(channel) ?? [])];\n for (const listener of delivered) listener(data);\n },\n on(channel: string, listener: (data: unknown) => void): () => void {\n const listeners = channels.get(channel) ?? new Set<(data: unknown) => void>();\n listeners.add(listener);\n channels.set(channel, listeners);\n return () => listeners.delete(listener);\n },\n },\n };\n\n function buildContext(contextOptions: PiTestContextOptions = {}): ExtensionToolContext {\n const sessionId = contextOptions.sessionId ?? options.sessionId ?? DEFAULT_SESSION_ID;\n const cwd = contextOptions.cwd ?? options.cwd ?? DEFAULT_CWD;\n const answers = { ...DISMISSED, ...options.answers, ...contextOptions.answers };\n const sessionManager = {\n getCwd: () => cwd,\n getSessionId: () => sessionId,\n getSessionName: () => sessionName,\n getSessionDir: () => cwd,\n getSessionFile: () => `${cwd}/${sessionId}.jsonl`,\n getLeafId: () => undefined,\n getLeafEntry: () => undefined,\n getEntry: () => undefined,\n getLabel: () => undefined,\n getBranch: () => [],\n buildContextEntries: () => [],\n getHeader: () => undefined,\n getEntries: () => [],\n getTree: () => [],\n };\n const ui = {\n select: async (title: string, selectOptions: string[]) => answers.select(title, selectOptions),\n confirm: async (title: string, message: string) => answers.confirm(title, message),\n input: async (title: string, placeholder?: string) => answers.input(title, placeholder),\n editor: async (title: string, prefill?: string) => answers.editor(title, prefill),\n notify: (message: string, level?: 'info' | 'warning' | 'error') => {\n notifications.push({ sessionId, message, level });\n },\n onTerminalInput: () => () => undefined,\n setStatus: (key: string, text: string | undefined) => {\n statuses.push({ sessionId, key, text });\n },\n setWorkingMessage: () => undefined,\n setWorkingVisible: () => undefined,\n setWorkingIndicator: () => undefined,\n setHiddenThinkingLabel: () => undefined,\n setWidget: (key: string, content: WidgetContent) => {\n widgets.push({ sessionId, key, content });\n },\n setFooter: () => undefined,\n setHeader: () => undefined,\n setTitle: () => undefined,\n // A custom component needs a real TUI to resolve, so it never does. An\n // extension awaiting one must stay responsive, which is what this proves.\n custom: () => new Promise<never>(() => undefined),\n pasteToEditor: () => undefined,\n setEditorText: () => undefined,\n getEditorText: () => '',\n addAutocompleteProvider: () => undefined,\n setEditorComponent: () => undefined,\n getEditorComponent: () => undefined,\n theme: undefined,\n getAllThemes: () => [],\n getTheme: () => undefined,\n setTheme: () => ({ success: false, error: 'This host renders nothing.' }),\n getToolsExpanded: () => false,\n setToolsExpanded: () => undefined,\n };\n const context = {\n ui,\n mode: contextOptions.mode ?? options.mode ?? DEFAULT_MODE,\n hasUI: contextOptions.hasUI ?? options.hasUI ?? true,\n cwd,\n sessionManager: sessionManager as unknown as SessionManagerView,\n modelRegistry: undefined,\n model: undefined,\n scopedModels: [],\n isIdle: () => contextOptions.isIdle ?? options.isIdle ?? true,\n isProjectTrusted: () => contextOptions.isProjectTrusted ?? options.isProjectTrusted ?? true,\n signal: contextOptions.signal ?? options.signal,\n abort: () => undefined,\n hasPendingMessages: () => false,\n shutdown: () => undefined,\n getContextUsage: () => undefined,\n compact: () => undefined,\n getSystemPrompt: () => contextOptions.systemPrompt ?? options.systemPrompt ?? DEFAULT_SYSTEM_PROMPT,\n // Command handlers receive the wider context, and an extension that only\n // reads it should not have to be handed a second fixture to be exercised.\n getSystemPromptOptions: () => ({}),\n waitForIdle: async () => undefined,\n newSession: async () => ({ cancelled: true }),\n fork: async () => ({ cancelled: true }),\n navigateTree: async () => ({ cancelled: true }),\n switchSession: async () => ({ cancelled: true }),\n reload: async () => undefined,\n // Tool execute() receives the tool context. Nested calls answer as Pi does when unbound.\n tools: [],\n executeTool: async (name: string) => ({\n toolCall: { type: 'toolCall', id: 'nested/0', name, arguments: {} },\n result: {\n content: [{ type: 'text', text: 'Nested tool calls are not available in this context' }],\n details: {},\n },\n isError: true,\n }),\n };\n // The one cast. `modelRegistry` is a class with a private field and so is\n // nominally typed, `ui.theme` is typed from a module Pi does not export,\n // and `model` is a populated provider record. No object literal can satisfy\n // those three, and no Po extension reads them.\n return context as unknown as ExtensionToolContext;\n }\n\n return {\n pi,\n tools,\n commands,\n shortcuts,\n flags,\n messageRenderers,\n entryRenderers,\n markdownTransformers,\n providers,\n unregisteredProviders,\n messages,\n userMessages,\n entries,\n execs,\n notifications,\n statuses,\n widgets,\n activeTools: () => [...activeToolNames],\n tool: (name) => tools.findLast((candidate) => candidate.name === name),\n command: (name) => commands.find((candidate) => candidate.name === name),\n handlers: (event) => (lifecycle.get(event) ?? []).map(invokable),\n context: buildContext,\n async emit(event, payload, context) {\n const eventContext = context ?? buildContext();\n const answered: unknown[] = [];\n // A snapshot, because a handler may register another for the same event\n // and Pi does not deliver this emission to it.\n const delivered = [...(lifecycle.get(event) ?? [])];\n for (const handler of delivered) {\n answered.push(await invokable(handler)({ type: event, ...(payload as object) }, eventContext));\n }\n if (event === 'session_shutdown') cordisConnection = undefined;\n return answered;\n },\n async callTool(name, params = {}, callOptions = {}) {\n const tool = tools.findLast((candidate) => candidate.name === name);\n if (!tool) throw new Error(`No tool named '${name}' is registered on this host.`);\n return tool.execute(\n callOptions.toolCallId ?? `call-${String(tools.indexOf(tool))}`,\n params,\n callOptions.signal,\n callOptions.onUpdate,\n callOptions.context ?? buildContext(),\n );\n },\n async runCommand(name, args = '', context) {\n const command = commands.find((candidate) => candidate.name === name);\n if (!command) throw new Error(`No command named '${name}' is registered on this host.`);\n await command.options.handler(args, (context ?? buildContext()) as never);\n },\n async cordis(source = DEFAULT_CORDIS_SOURCE) {\n if (cordisConnection === undefined) {\n const controller = await installPoCordisHost(pi, {\n mode: 'standalone',\n source: `${source}:standalone-host`,\n });\n try {\n cordisConnection = await connectPoCordisHost(pi, source);\n } catch (error) {\n await controller.shutdown();\n throw error;\n }\n }\n return cordisConnection;\n },\n async dispose() {\n await cordisConnection?.dispose();\n cordisConnection = undefined;\n },\n };\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { DoomCordisHostConnection } from "../../../runtimeCordisHost.mjs";
1
+ import { PoCordisHostConnection } from "../../../runtimeCordisHost.mjs";
2
2
  import { ExtensionAPI, ExtensionContext, ExtensionToolContext } from "@earendil-works/pi-coding-agent";
3
3
  //#region src/testing/pi/testHost.d.ts
4
4
  /** One stored handler, widened at the single point that calls it. */
@@ -145,7 +145,7 @@ export interface PiTestHost {
145
145
  /** Runs a registered slash command the way Pi's palette does. */
146
146
  runCommand(name: string, args?: string, context?: ExtensionContext): Promise<void>;
147
147
  /** The real Cordis host on this runner, installed on first use and disposed by `dispose`. */
148
- cordis(source?: string): Promise<DoomCordisHostConnection>;
148
+ cordis(source?: string): Promise<PoCordisHostConnection>;
149
149
  dispose(): Promise<void>;
150
150
  }
151
151
  /**
@@ -157,4 +157,5 @@ export interface PiTestHost {
157
157
  */
158
158
  export declare function createPiTestHost(options?: PiTestHostOptions): PiTestHost;
159
159
  //#endregion
160
+ export {};
160
161
  //# sourceMappingURL=testHost.d.mts.map
@@ -1,4 +1,4 @@
1
- import { connectDoomCordisHost, installDoomCordisHost } from "../../../runtimeCordisHost.mjs";
1
+ import { connectPoCordisHost, installPoCordisHost } from "../../../runtimeCordisHost.mjs";
2
2
  //#region src/testing/pi/testHost.ts
3
3
  function invokable(handler) {
4
4
  return handler;
@@ -374,12 +374,12 @@ function createPiTestHost(options = {}) {
374
374
  },
375
375
  async cordis(source = DEFAULT_CORDIS_SOURCE) {
376
376
  if (cordisConnection === void 0) {
377
- const controller = await installDoomCordisHost(pi, {
377
+ const controller = await installPoCordisHost(pi, {
378
378
  mode: "standalone",
379
379
  source: `${source}:standalone-host`
380
380
  });
381
381
  try {
382
- cordisConnection = await connectDoomCordisHost(pi, source);
382
+ cordisConnection = await connectPoCordisHost(pi, source);
383
383
  } catch (error) {
384
384
  await controller.shutdown();
385
385
  throw error;
@@ -1 +1 @@
1
- {"version":3,"file":"testHost.mjs","names":[],"sources":["../../../../src/testing/pi/testHost.ts"],"sourcesContent":["import type {\n ExtensionAPI,\n ExtensionContext,\n ExtensionToolContext,\n ToolDefinition,\n ToolInfo,\n} from '@earendil-works/pi-coding-agent';\nimport type { TSchema } from 'typebox';\n\nimport { connectDoomCordisHost, installDoomCordisHost, type DoomCordisHostConnection } from '../../pi/cordisHost';\n\n/**\n * A Pi host a test drives, in place of the one Pi builds at runtime.\n *\n * Every extension package needs one, and before this each wrote its own as an\n * `as unknown as ExtensionAPI` cast over the four or five members that package\n * happened to call. A cast type-checks whatever Pi's interface becomes, so the\n * casts all kept passing while diverging from each other and from Pi.\n *\n * `pi` here is a plain `ExtensionAPI`, assigned without a cast. When a Pi\n * upgrade adds or reshapes a member, this file stops compiling, which is the\n * whole point: one place to notice, instead of ninety places that never do.\n *\n * `ExtensionContext` cannot be held to the same standard and is built with one\n * cast, named at the site. Three of its members are unsatisfiable by an object\n * literal: `modelRegistry` is a class with a private field, so it is nominally\n * typed; `ui.theme` is typed from a module Pi does not export; and `model` is\n * a populated provider record no test asserts on. The context is otherwise\n * built member by member, and the surface extensions actually program against,\n * `ExtensionAPI`, carries no cast at all.\n */\n\n/**\n * Every handler Pi's 34 `on` overloads accept, stored as one.\n *\n * `never` in the parameter positions is what makes all 34 assignable: a handler\n * is only accepted where the stored type asks for less than the handler does.\n * The consequence is that a stored handler cannot be called without widening it\n * back, which `invokable` does once, below. No single type both accepts every\n * overload and is callable with an arbitrary payload.\n */\ntype LifecycleHandler = (event: never, context: never) => unknown;\n/** One stored handler, widened at the single point that calls it. */\ntype InvokableHandler = (event: unknown, context: unknown) => unknown;\n\nfunction invokable(handler: LifecycleHandler): InvokableHandler {\n return handler as InvokableHandler;\n}\n\n/** Types Pi declares but does not re-export from its package root. */\ntype SessionManagerView = ExtensionContext['sessionManager'];\ntype RunMode = ExtensionContext['mode'];\ntype ShortcutId = Parameters<ExtensionAPI['registerShortcut']>[0];\ntype ShortcutOptions = Parameters<ExtensionAPI['registerShortcut']>[1];\ntype CommandOptions = Parameters<ExtensionAPI['registerCommand']>[1];\ntype FlagOptions = Parameters<ExtensionAPI['registerFlag']>[1];\ntype CustomMessagePayload = Parameters<ExtensionAPI['sendMessage']>[0];\ntype SendMessageOptions = Parameters<ExtensionAPI['sendMessage']>[1];\ntype UserMessageContent = Parameters<ExtensionAPI['sendUserMessage']>[0];\ntype SendUserMessageOptions = Parameters<ExtensionAPI['sendUserMessage']>[1];\ntype RegisteredTool = Parameters<ExtensionAPI['registerTool']>[0];\ntype ToolUpdateCallback = Parameters<RegisteredTool['execute']>[3];\ntype ExecutionResult = Awaited<ReturnType<ExtensionAPI['exec']>>;\ntype ExecutionOptions = Parameters<ExtensionAPI['exec']>[2];\ntype ThinkingLevelValue = ReturnType<ExtensionAPI['getThinkingLevel']>;\ntype WidgetContent = Parameters<ExtensionContext['ui']['setWidget']>[1];\n\n/** Inventory entry for a host-owned tool this harness cannot execute. */\nfunction builtinToolInfo(name: string): ToolInfo {\n return {\n name,\n description: `Built-in ${name}`,\n parameters: { type: 'object', properties: {}, additionalProperties: false },\n sourceInfo: { type: 'builtin' },\n } as unknown as ToolInfo;\n}\n\n/** Inventory view of a tool an extension registered with this host. */\nfunction registeredToolInfo(tool: RegisteredTool): ToolInfo {\n return {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n promptGuidelines: (tool as { promptGuidelines?: unknown }).promptGuidelines,\n sourceInfo: { type: 'extension' },\n } as unknown as ToolInfo;\n}\n\nexport interface RecordedCommand {\n name: string;\n options: CommandOptions;\n}\nexport interface RecordedShortcut {\n shortcut: ShortcutId;\n options: ShortcutOptions;\n}\nexport interface RecordedRenderer {\n customType: string;\n renderer: unknown;\n}\n/** A `registerProvider` call in either of its two shapes. */\nexport interface RecordedProvider {\n /** Present for the `(name, config)` overload. */\n name?: string;\n value: unknown;\n}\nexport interface RecordedMessage {\n message: CustomMessagePayload;\n options: SendMessageOptions;\n}\nexport interface RecordedUserMessage {\n content: UserMessageContent;\n options: SendUserMessageOptions;\n}\nexport interface RecordedEntry {\n customType: string;\n data: unknown;\n}\nexport interface RecordedExec {\n command: string;\n args: string[];\n options: ExecutionOptions;\n}\nexport interface RecordedNotification {\n sessionId: string;\n message: string;\n level: 'info' | 'warning' | 'error' | undefined;\n}\nexport interface RecordedWidget {\n sessionId: string;\n key: string;\n content: WidgetContent;\n}\nexport interface RecordedStatus {\n sessionId: string;\n key: string;\n text: string | undefined;\n}\n\n/**\n * What the extension's dialogs answer.\n *\n * Every default is the dismissal, because that is the answer a headless host\n * gives and the one an extension is most likely to mishandle.\n */\nexport interface PiTestDialogAnswers {\n select(title: string, options: string[]): string | undefined;\n confirm(title: string, message: string): boolean;\n input(title: string, placeholder: string | undefined): string | undefined;\n editor(title: string, prefill: string | undefined): string | undefined;\n}\n\nexport interface PiTestContextOptions {\n sessionId?: string;\n cwd?: string;\n hasUI?: boolean;\n mode?: RunMode;\n isIdle?: boolean;\n isProjectTrusted?: boolean;\n signal?: AbortSignal;\n answers?: Partial<PiTestDialogAnswers>;\n systemPrompt?: string;\n}\n\nexport interface PiTestHostOptions extends PiTestContextOptions {\n /** Answers `pi.exec`; the default reports a command that ran and printed nothing. */\n exec?: (command: string, args: string[]) => ExecutionResult | Promise<ExecutionResult>;\n /**\n * Tool names Pi would already own before any extension loads.\n *\n * They join the inventory and start active, which is how the tool surface\n * arbiter learns that a name like `read` exists without a definition for it.\n */\n builtinTools?: readonly string[];\n}\n\nexport interface PiTestHost {\n /** The host an extension factory receives. */\n readonly pi: ExtensionAPI;\n readonly tools: readonly RegisteredTool[];\n readonly commands: readonly RecordedCommand[];\n readonly shortcuts: readonly RecordedShortcut[];\n readonly flags: ReadonlyMap<string, FlagOptions>;\n readonly messageRenderers: readonly RecordedRenderer[];\n readonly entryRenderers: readonly RecordedRenderer[];\n readonly markdownTransformers: readonly unknown[];\n readonly providers: readonly RecordedProvider[];\n readonly unregisteredProviders: readonly string[];\n readonly messages: readonly RecordedMessage[];\n readonly userMessages: readonly RecordedUserMessage[];\n readonly entries: readonly RecordedEntry[];\n readonly execs: readonly RecordedExec[];\n readonly notifications: readonly RecordedNotification[];\n readonly statuses: readonly RecordedStatus[];\n readonly widgets: readonly RecordedWidget[];\n /** Tool names Pi would offer the model right now. */\n activeTools(): readonly string[];\n tool(name: string): RegisteredTool | undefined;\n command(name: string): RecordedCommand | undefined;\n /** Lifecycle handlers registered for one event, in registration order. */\n handlers(event: string): readonly InvokableHandler[];\n /** A context for this host; each call builds a fresh one, as Pi does per event. */\n context(options?: PiTestContextOptions): ExtensionToolContext;\n /**\n * Runs every handler for one lifecycle event and returns what they answered.\n *\n * Sequential and awaited, matching Pi, so a test can observe one handler's\n * effect on the next.\n */\n emit(event: string, payload?: unknown, context?: ExtensionContext): Promise<unknown[]>;\n /** Calls a registered tool the way Pi's runner does. */\n callTool(\n name: string,\n params?: unknown,\n options?: {\n toolCallId?: string;\n signal?: AbortSignal;\n onUpdate?: ToolUpdateCallback;\n context?: ExtensionToolContext;\n },\n ): Promise<unknown>;\n /** Runs a registered slash command the way Pi's palette does. */\n runCommand(name: string, args?: string, context?: ExtensionContext): Promise<void>;\n /** The real Cordis host on this runner, installed on first use and disposed by `dispose`. */\n cordis(source?: string): Promise<DoomCordisHostConnection>;\n dispose(): Promise<void>;\n}\n\nconst DEFAULT_CWD = '/repo';\nconst DEFAULT_SESSION_ID = 'test-session';\nconst DEFAULT_MODE: RunMode = 'tui';\nconst DEFAULT_SYSTEM_PROMPT = '';\nconst DEFAULT_CORDIS_SOURCE = 'pi-test-host';\nconst DEFAULT_EXEC: ExecutionResult = { code: 0, killed: false, stdout: '', stderr: '' };\n\nconst DISMISSED: PiTestDialogAnswers = {\n select: () => undefined,\n confirm: () => false,\n input: () => undefined,\n editor: () => undefined,\n};\n\n/**\n * A Pi host and the records of what an extension did to it.\n *\n * Nothing here is a spy from a test framework: the records are plain arrays, so\n * the harness works under any runner and adds no dependency to a package that\n * every extension already installs.\n */\nexport function createPiTestHost(options: PiTestHostOptions = {}): PiTestHost {\n const builtinTools: readonly string[] = options.builtinTools ?? [];\n const tools: RegisteredTool[] = [];\n const commands: RecordedCommand[] = [];\n const shortcuts: RecordedShortcut[] = [];\n const flags = new Map<string, FlagOptions>();\n const messageRenderers: RecordedRenderer[] = [];\n const entryRenderers: RecordedRenderer[] = [];\n const markdownTransformers: unknown[] = [];\n const providers: RecordedProvider[] = [];\n const unregisteredProviders: string[] = [];\n const messages: RecordedMessage[] = [];\n const userMessages: RecordedUserMessage[] = [];\n const entries: RecordedEntry[] = [];\n const execs: RecordedExec[] = [];\n const notifications: RecordedNotification[] = [];\n const statuses: RecordedStatus[] = [];\n const widgets: RecordedWidget[] = [];\n\n const lifecycle = new Map<string, LifecycleHandler[]>();\n const channels = new Map<string, Set<(data: unknown) => void>>();\n let activeToolNames: string[] = [...builtinTools];\n let sessionName: string | undefined;\n let thinkingLevel: ThinkingLevelValue = 'off';\n let cordisConnection: DoomCordisHostConnection | undefined;\n\n const runExec = options.exec ?? ((): ExecutionResult => DEFAULT_EXEC);\n\n const pi: ExtensionAPI = {\n on(event: string, handler: LifecycleHandler): () => void {\n const registered = lifecycle.get(event) ?? [];\n registered.push(handler);\n lifecycle.set(event, registered);\n return () => {\n const index = registered.indexOf(handler);\n if (index === -1) return;\n registered.splice(index, 1);\n if (registered.length === 0) lifecycle.delete(event);\n };\n },\n // Generic exactly as Pi declares it. Storage erases the schema generics; the\n // signature is the half that has to keep matching.\n registerTool<TParams extends TSchema = TSchema, TDetails = unknown, TState = unknown>(\n tool: ToolDefinition<TParams, TDetails, TState>,\n ): void {\n tools.push(tool as unknown as RegisteredTool);\n if (!activeToolNames.includes(tool.name)) activeToolNames.push(tool.name);\n },\n registerToolRenderer(): void {},\n registerCommand(name: string, commandOptions: CommandOptions): void {\n commands.push({ name, options: commandOptions });\n },\n registerShortcut(shortcut: ShortcutId, shortcutOptions: ShortcutOptions): void {\n shortcuts.push({ shortcut, options: shortcutOptions });\n },\n registerFlag(name: string, flagOptions: FlagOptions): void {\n flags.set(name, flagOptions);\n },\n getFlag(name: string): boolean | string | undefined {\n return flags.get(name)?.default;\n },\n registerMessageRenderer(customType: string, renderer: unknown): void {\n messageRenderers.push({ customType, renderer });\n },\n registerMarkdownTransformer(transformer: unknown): void {\n markdownTransformers.push(transformer);\n },\n registerEntryRenderer(customType: string, renderer: unknown): void {\n entryRenderers.push({ customType, renderer });\n },\n sendMessage(message: CustomMessagePayload, sendOptions?: SendMessageOptions): void {\n messages.push({ message, options: sendOptions });\n },\n sendUserMessage(content: UserMessageContent, sendOptions?: SendUserMessageOptions): void {\n userMessages.push({ content, options: sendOptions });\n },\n appendEntry(customType: string, data?: unknown): void {\n entries.push({ customType, data });\n },\n setSessionName(name: string): void {\n sessionName = name;\n },\n getSessionName(): string | undefined {\n return sessionName;\n },\n setLabel(): void {\n // Labels are session bookmarks; no Po extension reads them back.\n },\n async exec(command: string, args: string[], execOptions?: ExecutionOptions): Promise<ExecutionResult> {\n execs.push({ command, args, options: execOptions });\n return runExec(command, args);\n },\n getActiveTools(): string[] {\n return [...activeToolNames];\n },\n getAllTools(): ToolInfo[] {\n // Pi's inventory folds in built-in and MCP tools, which this host models\n // as names only: a test asserts on the surface, never on their behaviour.\n return [...builtinTools.map(builtinToolInfo), ...tools.map(registeredToolInfo)];\n },\n setActiveTools(toolNames: string[]): void {\n activeToolNames = [...toolNames];\n },\n getSettings() {\n return {};\n },\n // No Po extension registers MCP servers or virtual models through Pi yet.\n registerMcpServer(): void {},\n unregisterMcpServer(): void {},\n getMcpServers() {\n return [];\n },\n registerVirtualModel(): void {},\n unregisterVirtualModel(): void {},\n getCommands(): never[] {\n return [];\n },\n async setModel(): Promise<boolean> {\n // No API key is configured, which is the answer Pi gives for the same reason.\n return false;\n },\n getThinkingLevel(): ThinkingLevelValue {\n return thinkingLevel;\n },\n setThinkingLevel(level: ThinkingLevelValue): void {\n thinkingLevel = level;\n },\n registerProvider(providerOrName: unknown, config?: unknown): void {\n providers.push(\n typeof providerOrName === 'string' ? { name: providerOrName, value: config } : { value: providerOrName },\n );\n },\n unregisterProvider(name: string): void {\n unregisteredProviders.push(name);\n },\n events: {\n emit(channel: string, data: unknown): void {\n // A snapshot: a listener that unsubscribes on delivery would otherwise\n // reshape the set this loop is walking.\n const delivered = [...(channels.get(channel) ?? [])];\n for (const listener of delivered) listener(data);\n },\n on(channel: string, listener: (data: unknown) => void): () => void {\n const listeners = channels.get(channel) ?? new Set<(data: unknown) => void>();\n listeners.add(listener);\n channels.set(channel, listeners);\n return () => listeners.delete(listener);\n },\n },\n };\n\n function buildContext(contextOptions: PiTestContextOptions = {}): ExtensionToolContext {\n const sessionId = contextOptions.sessionId ?? options.sessionId ?? DEFAULT_SESSION_ID;\n const cwd = contextOptions.cwd ?? options.cwd ?? DEFAULT_CWD;\n const answers = { ...DISMISSED, ...options.answers, ...contextOptions.answers };\n const sessionManager = {\n getCwd: () => cwd,\n getSessionId: () => sessionId,\n getSessionName: () => sessionName,\n getSessionDir: () => cwd,\n getSessionFile: () => `${cwd}/${sessionId}.jsonl`,\n getLeafId: () => undefined,\n getLeafEntry: () => undefined,\n getEntry: () => undefined,\n getLabel: () => undefined,\n getBranch: () => [],\n buildContextEntries: () => [],\n getHeader: () => undefined,\n getEntries: () => [],\n getTree: () => [],\n };\n const ui = {\n select: async (title: string, selectOptions: string[]) => answers.select(title, selectOptions),\n confirm: async (title: string, message: string) => answers.confirm(title, message),\n input: async (title: string, placeholder?: string) => answers.input(title, placeholder),\n editor: async (title: string, prefill?: string) => answers.editor(title, prefill),\n notify: (message: string, level?: 'info' | 'warning' | 'error') => {\n notifications.push({ sessionId, message, level });\n },\n onTerminalInput: () => () => undefined,\n setStatus: (key: string, text: string | undefined) => {\n statuses.push({ sessionId, key, text });\n },\n setWorkingMessage: () => undefined,\n setWorkingVisible: () => undefined,\n setWorkingIndicator: () => undefined,\n setHiddenThinkingLabel: () => undefined,\n setWidget: (key: string, content: WidgetContent) => {\n widgets.push({ sessionId, key, content });\n },\n setFooter: () => undefined,\n setHeader: () => undefined,\n setTitle: () => undefined,\n // A custom component needs a real TUI to resolve, so it never does. An\n // extension awaiting one must stay responsive, which is what this proves.\n custom: () => new Promise<never>(() => undefined),\n pasteToEditor: () => undefined,\n setEditorText: () => undefined,\n getEditorText: () => '',\n addAutocompleteProvider: () => undefined,\n setEditorComponent: () => undefined,\n getEditorComponent: () => undefined,\n theme: undefined,\n getAllThemes: () => [],\n getTheme: () => undefined,\n setTheme: () => ({ success: false, error: 'This host renders nothing.' }),\n getToolsExpanded: () => false,\n setToolsExpanded: () => undefined,\n };\n const context = {\n ui,\n mode: contextOptions.mode ?? options.mode ?? DEFAULT_MODE,\n hasUI: contextOptions.hasUI ?? options.hasUI ?? true,\n cwd,\n sessionManager: sessionManager as unknown as SessionManagerView,\n modelRegistry: undefined,\n model: undefined,\n scopedModels: [],\n isIdle: () => contextOptions.isIdle ?? options.isIdle ?? true,\n isProjectTrusted: () => contextOptions.isProjectTrusted ?? options.isProjectTrusted ?? true,\n signal: contextOptions.signal ?? options.signal,\n abort: () => undefined,\n hasPendingMessages: () => false,\n shutdown: () => undefined,\n getContextUsage: () => undefined,\n compact: () => undefined,\n getSystemPrompt: () => contextOptions.systemPrompt ?? options.systemPrompt ?? DEFAULT_SYSTEM_PROMPT,\n // Command handlers receive the wider context, and an extension that only\n // reads it should not have to be handed a second fixture to be exercised.\n getSystemPromptOptions: () => ({}),\n waitForIdle: async () => undefined,\n newSession: async () => ({ cancelled: true }),\n fork: async () => ({ cancelled: true }),\n navigateTree: async () => ({ cancelled: true }),\n switchSession: async () => ({ cancelled: true }),\n reload: async () => undefined,\n // Tool execute() receives the tool context. Nested calls answer as Pi does when unbound.\n tools: [],\n executeTool: async (name: string) => ({\n toolCall: { type: 'toolCall', id: 'nested/0', name, arguments: {} },\n result: {\n content: [{ type: 'text', text: 'Nested tool calls are not available in this context' }],\n details: {},\n },\n isError: true,\n }),\n };\n // The one cast. `modelRegistry` is a class with a private field and so is\n // nominally typed, `ui.theme` is typed from a module Pi does not export,\n // and `model` is a populated provider record. No object literal can satisfy\n // those three, and no Po extension reads them.\n return context as unknown as ExtensionToolContext;\n }\n\n return {\n pi,\n tools,\n commands,\n shortcuts,\n flags,\n messageRenderers,\n entryRenderers,\n markdownTransformers,\n providers,\n unregisteredProviders,\n messages,\n userMessages,\n entries,\n execs,\n notifications,\n statuses,\n widgets,\n activeTools: () => [...activeToolNames],\n tool: (name) => tools.findLast((candidate) => candidate.name === name),\n command: (name) => commands.find((candidate) => candidate.name === name),\n handlers: (event) => (lifecycle.get(event) ?? []).map(invokable),\n context: buildContext,\n async emit(event, payload, context) {\n const eventContext = context ?? buildContext();\n const answered: unknown[] = [];\n // A snapshot, because a handler may register another for the same event\n // and Pi does not deliver this emission to it.\n const delivered = [...(lifecycle.get(event) ?? [])];\n for (const handler of delivered) {\n answered.push(await invokable(handler)({ type: event, ...(payload as object) }, eventContext));\n }\n if (event === 'session_shutdown') cordisConnection = undefined;\n return answered;\n },\n async callTool(name, params = {}, callOptions = {}) {\n const tool = tools.findLast((candidate) => candidate.name === name);\n if (!tool) throw new Error(`No tool named '${name}' is registered on this host.`);\n return tool.execute(\n callOptions.toolCallId ?? `call-${String(tools.indexOf(tool))}`,\n params,\n callOptions.signal,\n callOptions.onUpdate,\n callOptions.context ?? buildContext(),\n );\n },\n async runCommand(name, args = '', context) {\n const command = commands.find((candidate) => candidate.name === name);\n if (!command) throw new Error(`No command named '${name}' is registered on this host.`);\n await command.options.handler(args, (context ?? buildContext()) as never);\n },\n async cordis(source = DEFAULT_CORDIS_SOURCE) {\n if (cordisConnection === undefined) {\n const controller = await installDoomCordisHost(pi, {\n mode: 'standalone',\n source: `${source}:standalone-host`,\n });\n try {\n cordisConnection = await connectDoomCordisHost(pi, source);\n } catch (error) {\n await controller.shutdown();\n throw error;\n }\n }\n return cordisConnection;\n },\n async dispose() {\n await cordisConnection?.dispose();\n cordisConnection = undefined;\n },\n };\n}\n"],"mappings":";;AA6CA,SAAS,UAAU,SAA6C;CAC9D,OAAO;AACT;;AAqBA,SAAS,gBAAgB,MAAwB;CAC/C,OAAO;EACL;EACA,aAAa,YAAY;EACzB,YAAY;GAAE,MAAM;GAAU,YAAY,CAAC;GAAG,sBAAsB;EAAM;EAC1E,YAAY,EAAE,MAAM,UAAU;CAChC;AACF;;AAGA,SAAS,mBAAmB,MAAgC;CAC1D,OAAO;EACL,MAAM,KAAK;EACX,aAAa,KAAK;EAClB,YAAY,KAAK;EACjB,kBAAmB,KAAwC;EAC3D,YAAY,EAAE,MAAM,YAAY;CAClC;AACF;AA8IA,MAAM,cAAc;AACpB,MAAM,qBAAqB;AAC3B,MAAM,eAAwB;AAC9B,MAAM,wBAAwB;AAC9B,MAAM,wBAAwB;AAC9B,MAAM,eAAgC;CAAE,MAAM;CAAG,QAAQ;CAAO,QAAQ;CAAI,QAAQ;AAAG;AAEvF,MAAM,YAAiC;CACrC,cAAc,KAAA;CACd,eAAe;CACf,aAAa,KAAA;CACb,cAAc,KAAA;AAChB;;;;;;;;AASA,SAAgB,iBAAiB,UAA6B,CAAC,GAAe;CAC5E,MAAM,eAAkC,QAAQ,gBAAgB,CAAC;CACjE,MAAM,QAA0B,CAAC;CACjC,MAAM,WAA8B,CAAC;CACrC,MAAM,YAAgC,CAAC;CACvC,MAAM,wBAAQ,IAAI,IAAyB;CAC3C,MAAM,mBAAuC,CAAC;CAC9C,MAAM,iBAAqC,CAAC;CAC5C,MAAM,uBAAkC,CAAC;CACzC,MAAM,YAAgC,CAAC;CACvC,MAAM,wBAAkC,CAAC;CACzC,MAAM,WAA8B,CAAC;CACrC,MAAM,eAAsC,CAAC;CAC7C,MAAM,UAA2B,CAAC;CAClC,MAAM,QAAwB,CAAC;CAC/B,MAAM,gBAAwC,CAAC;CAC/C,MAAM,WAA6B,CAAC;CACpC,MAAM,UAA4B,CAAC;CAEnC,MAAM,4BAAY,IAAI,IAAgC;CACtD,MAAM,2BAAW,IAAI,IAA0C;CAC/D,IAAI,kBAA4B,CAAC,GAAG,YAAY;CAChD,IAAI;CACJ,IAAI,gBAAoC;CACxC,IAAI;CAEJ,MAAM,UAAU,QAAQ,eAAgC;CAExD,MAAM,KAAmB;EACvB,GAAG,OAAe,SAAuC;GACvD,MAAM,aAAa,UAAU,IAAI,KAAK,KAAK,CAAC;GAC5C,WAAW,KAAK,OAAO;GACvB,UAAU,IAAI,OAAO,UAAU;GAC/B,aAAa;IACX,MAAM,QAAQ,WAAW,QAAQ,OAAO;IACxC,IAAI,UAAU,IAAI;IAClB,WAAW,OAAO,OAAO,CAAC;IAC1B,IAAI,WAAW,WAAW,GAAG,UAAU,OAAO,KAAK;GACrD;EACF;EAGA,aACE,MACM;GACN,MAAM,KAAK,IAAiC;GAC5C,IAAI,CAAC,gBAAgB,SAAS,KAAK,IAAI,GAAG,gBAAgB,KAAK,KAAK,IAAI;EAC1E;EACA,uBAA6B,CAAC;EAC9B,gBAAgB,MAAc,gBAAsC;GAClE,SAAS,KAAK;IAAE;IAAM,SAAS;GAAe,CAAC;EACjD;EACA,iBAAiB,UAAsB,iBAAwC;GAC7E,UAAU,KAAK;IAAE;IAAU,SAAS;GAAgB,CAAC;EACvD;EACA,aAAa,MAAc,aAAgC;GACzD,MAAM,IAAI,MAAM,WAAW;EAC7B;EACA,QAAQ,MAA4C;GAClD,OAAO,MAAM,IAAI,IAAI,CAAC,EAAE;EAC1B;EACA,wBAAwB,YAAoB,UAAyB;GACnE,iBAAiB,KAAK;IAAE;IAAY;GAAS,CAAC;EAChD;EACA,4BAA4B,aAA4B;GACtD,qBAAqB,KAAK,WAAW;EACvC;EACA,sBAAsB,YAAoB,UAAyB;GACjE,eAAe,KAAK;IAAE;IAAY;GAAS,CAAC;EAC9C;EACA,YAAY,SAA+B,aAAwC;GACjF,SAAS,KAAK;IAAE;IAAS,SAAS;GAAY,CAAC;EACjD;EACA,gBAAgB,SAA6B,aAA4C;GACvF,aAAa,KAAK;IAAE;IAAS,SAAS;GAAY,CAAC;EACrD;EACA,YAAY,YAAoB,MAAsB;GACpD,QAAQ,KAAK;IAAE;IAAY;GAAK,CAAC;EACnC;EACA,eAAe,MAAoB;GACjC,cAAc;EAChB;EACA,iBAAqC;GACnC,OAAO;EACT;EACA,WAAiB,CAEjB;EACA,MAAM,KAAK,SAAiB,MAAgB,aAA0D;GACpG,MAAM,KAAK;IAAE;IAAS;IAAM,SAAS;GAAY,CAAC;GAClD,OAAO,QAAQ,SAAS,IAAI;EAC9B;EACA,iBAA2B;GACzB,OAAO,CAAC,GAAG,eAAe;EAC5B;EACA,cAA0B;GAGxB,OAAO,CAAC,GAAG,aAAa,IAAI,eAAe,GAAG,GAAG,MAAM,IAAI,kBAAkB,CAAC;EAChF;EACA,eAAe,WAA2B;GACxC,kBAAkB,CAAC,GAAG,SAAS;EACjC;EACA,cAAc;GACZ,OAAO,CAAC;EACV;EAEA,oBAA0B,CAAC;EAC3B,sBAA4B,CAAC;EAC7B,gBAAgB;GACd,OAAO,CAAC;EACV;EACA,uBAA6B,CAAC;EAC9B,yBAA+B,CAAC;EAChC,cAAuB;GACrB,OAAO,CAAC;EACV;EACA,MAAM,WAA6B;GAEjC,OAAO;EACT;EACA,mBAAuC;GACrC,OAAO;EACT;EACA,iBAAiB,OAAiC;GAChD,gBAAgB;EAClB;EACA,iBAAiB,gBAAyB,QAAwB;GAChE,UAAU,KACR,OAAO,mBAAmB,WAAW;IAAE,MAAM;IAAgB,OAAO;GAAO,IAAI,EAAE,OAAO,eAAe,CACzG;EACF;EACA,mBAAmB,MAAoB;GACrC,sBAAsB,KAAK,IAAI;EACjC;EACA,QAAQ;GACN,KAAK,SAAiB,MAAqB;IAGzC,MAAM,YAAY,CAAC,GAAI,SAAS,IAAI,OAAO,KAAK,CAAC,CAAE;IACnD,KAAK,MAAM,YAAY,WAAW,SAAS,IAAI;GACjD;GACA,GAAG,SAAiB,UAA+C;IACjE,MAAM,YAAY,SAAS,IAAI,OAAO,qBAAK,IAAI,IAA6B;IAC5E,UAAU,IAAI,QAAQ;IACtB,SAAS,IAAI,SAAS,SAAS;IAC/B,aAAa,UAAU,OAAO,QAAQ;GACxC;EACF;CACF;CAEA,SAAS,aAAa,iBAAuC,CAAC,GAAyB;EACrF,MAAM,YAAY,eAAe,aAAa,QAAQ,aAAa;EACnE,MAAM,MAAM,eAAe,OAAO,QAAQ,OAAO;EACjD,MAAM,UAAU;GAAE,GAAG;GAAW,GAAG,QAAQ;GAAS,GAAG,eAAe;EAAQ;EAiG9E,OAAO;GAzCL,IAAA;IAtCA,QAAQ,OAAO,OAAe,kBAA4B,QAAQ,OAAO,OAAO,aAAa;IAC7F,SAAS,OAAO,OAAe,YAAoB,QAAQ,QAAQ,OAAO,OAAO;IACjF,OAAO,OAAO,OAAe,gBAAyB,QAAQ,MAAM,OAAO,WAAW;IACtF,QAAQ,OAAO,OAAe,YAAqB,QAAQ,OAAO,OAAO,OAAO;IAChF,SAAS,SAAiB,UAAyC;KACjE,cAAc,KAAK;MAAE;MAAW;MAAS;KAAM,CAAC;IAClD;IACA,6BAA6B,KAAA;IAC7B,YAAY,KAAa,SAA6B;KACpD,SAAS,KAAK;MAAE;MAAW;MAAK;KAAK,CAAC;IACxC;IACA,yBAAyB,KAAA;IACzB,yBAAyB,KAAA;IACzB,2BAA2B,KAAA;IAC3B,8BAA8B,KAAA;IAC9B,YAAY,KAAa,YAA2B;KAClD,QAAQ,KAAK;MAAE;MAAW;MAAK;KAAQ,CAAC;IAC1C;IACA,iBAAiB,KAAA;IACjB,iBAAiB,KAAA;IACjB,gBAAgB,KAAA;IAGhB,cAAc,IAAI,cAAqB,KAAA,CAAS;IAChD,qBAAqB,KAAA;IACrB,qBAAqB,KAAA;IACrB,qBAAqB;IACrB,+BAA+B,KAAA;IAC/B,0BAA0B,KAAA;IAC1B,0BAA0B,KAAA;IAC1B,OAAO,KAAA;IACP,oBAAoB,CAAC;IACrB,gBAAgB,KAAA;IAChB,iBAAiB;KAAE,SAAS;KAAO,OAAO;IAA6B;IACvE,wBAAwB;IACxB,wBAAwB,KAAA;GAGvB;GACD,MAAM,eAAe,QAAQ,QAAQ,QAAQ;GAC7C,OAAO,eAAe,SAAS,QAAQ,SAAS;GAChD;GACA,gBAAgB;IA1DhB,cAAc;IACd,oBAAoB;IACpB,sBAAsB;IACtB,qBAAqB;IACrB,sBAAsB,GAAG,IAAI,GAAG,UAAU;IAC1C,iBAAiB,KAAA;IACjB,oBAAoB,KAAA;IACpB,gBAAgB,KAAA;IAChB,gBAAgB,KAAA;IAChB,iBAAiB,CAAC;IAClB,2BAA2B,CAAC;IAC5B,iBAAiB,KAAA;IACjB,kBAAkB,CAAC;IACnB,eAAe,CAAC;GA6Ca;GAC7B,eAAe,KAAA;GACf,OAAO,KAAA;GACP,cAAc,CAAC;GACf,cAAc,eAAe,UAAU,QAAQ,UAAU;GACzD,wBAAwB,eAAe,oBAAoB,QAAQ,oBAAoB;GACvF,QAAQ,eAAe,UAAU,QAAQ;GACzC,aAAa,KAAA;GACb,0BAA0B;GAC1B,gBAAgB,KAAA;GAChB,uBAAuB,KAAA;GACvB,eAAe,KAAA;GACf,uBAAuB,eAAe,gBAAgB,QAAQ,gBAAgB;GAG9E,+BAA+B,CAAC;GAChC,aAAa,YAAY,KAAA;GACzB,YAAY,aAAa,EAAE,WAAW,KAAK;GAC3C,MAAM,aAAa,EAAE,WAAW,KAAK;GACrC,cAAc,aAAa,EAAE,WAAW,KAAK;GAC7C,eAAe,aAAa,EAAE,WAAW,KAAK;GAC9C,QAAQ,YAAY,KAAA;GAEpB,OAAO,CAAC;GACR,aAAa,OAAO,UAAkB;IACpC,UAAU;KAAE,MAAM;KAAY,IAAI;KAAY;KAAM,WAAW,CAAC;IAAE;IAClE,QAAQ;KACN,SAAS,CAAC;MAAE,MAAM;MAAQ,MAAM;KAAsD,CAAC;KACvF,SAAS,CAAC;IACZ;IACA,SAAS;GACX;EAMW;CACf;CAEA,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,mBAAmB,CAAC,GAAG,eAAe;EACtC,OAAO,SAAS,MAAM,UAAU,cAAc,UAAU,SAAS,IAAI;EACrE,UAAU,SAAS,SAAS,MAAM,cAAc,UAAU,SAAS,IAAI;EACvE,WAAW,WAAW,UAAU,IAAI,KAAK,KAAK,CAAC,EAAA,CAAG,IAAI,SAAS;EAC/D,SAAS;EACT,MAAM,KAAK,OAAO,SAAS,SAAS;GAClC,MAAM,eAAe,WAAW,aAAa;GAC7C,MAAM,WAAsB,CAAC;GAG7B,MAAM,YAAY,CAAC,GAAI,UAAU,IAAI,KAAK,KAAK,CAAC,CAAE;GAClD,KAAK,MAAM,WAAW,WACpB,SAAS,KAAK,MAAM,UAAU,OAAO,CAAC,CAAC;IAAE,MAAM;IAAO,GAAI;GAAmB,GAAG,YAAY,CAAC;GAE/F,IAAI,UAAU,oBAAoB,mBAAmB,KAAA;GACrD,OAAO;EACT;EACA,MAAM,SAAS,MAAM,SAAS,CAAC,GAAG,cAAc,CAAC,GAAG;GAClD,MAAM,OAAO,MAAM,UAAU,cAAc,UAAU,SAAS,IAAI;GAClE,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,kBAAkB,KAAK,8BAA8B;GAChF,OAAO,KAAK,QACV,YAAY,cAAc,QAAQ,OAAO,MAAM,QAAQ,IAAI,CAAC,KAC5D,QACA,YAAY,QACZ,YAAY,UACZ,YAAY,WAAW,aAAa,CACtC;EACF;EACA,MAAM,WAAW,MAAM,OAAO,IAAI,SAAS;GACzC,MAAM,UAAU,SAAS,MAAM,cAAc,UAAU,SAAS,IAAI;GACpE,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,qBAAqB,KAAK,8BAA8B;GACtF,MAAM,QAAQ,QAAQ,QAAQ,MAAO,WAAW,aAAa,CAAW;EAC1E;EACA,MAAM,OAAO,SAAS,uBAAuB;GAC3C,IAAI,qBAAqB,KAAA,GAAW;IAClC,MAAM,aAAa,MAAM,sBAAsB,IAAI;KACjD,MAAM;KACN,QAAQ,GAAG,OAAO;IACpB,CAAC;IACD,IAAI;KACF,mBAAmB,MAAM,sBAAsB,IAAI,MAAM;IAC3D,SAAS,OAAO;KACd,MAAM,WAAW,SAAS;KAC1B,MAAM;IACR;GACF;GACA,OAAO;EACT;EACA,MAAM,UAAU;GACd,MAAM,kBAAkB,QAAQ;GAChC,mBAAmB,KAAA;EACrB;CACF;AACF"}
1
+ {"version":3,"file":"testHost.mjs","names":[],"sources":["../../../../src/testing/pi/testHost.ts"],"sourcesContent":["import type {\n ExtensionAPI,\n ExtensionContext,\n ExtensionToolContext,\n ToolDefinition,\n ToolInfo,\n} from '@earendil-works/pi-coding-agent';\nimport type { TSchema } from 'typebox';\n\nimport { connectPoCordisHost, installPoCordisHost, type PoCordisHostConnection } from '../../pi/cordisHost';\n\n/**\n * A Pi host a test drives, in place of the one Pi builds at runtime.\n *\n * Every extension package needs one, and before this each wrote its own as an\n * `as unknown as ExtensionAPI` cast over the four or five members that package\n * happened to call. A cast type-checks whatever Pi's interface becomes, so the\n * casts all kept passing while diverging from each other and from Pi.\n *\n * `pi` here is a plain `ExtensionAPI`, assigned without a cast. When a Pi\n * upgrade adds or reshapes a member, this file stops compiling, which is the\n * whole point: one place to notice, instead of ninety places that never do.\n *\n * `ExtensionContext` cannot be held to the same standard and is built with one\n * cast, named at the site. Three of its members are unsatisfiable by an object\n * literal: `modelRegistry` is a class with a private field, so it is nominally\n * typed; `ui.theme` is typed from a module Pi does not export; and `model` is\n * a populated provider record no test asserts on. The context is otherwise\n * built member by member, and the surface extensions actually program against,\n * `ExtensionAPI`, carries no cast at all.\n */\n\n/**\n * Every handler Pi's 34 `on` overloads accept, stored as one.\n *\n * `never` in the parameter positions is what makes all 34 assignable: a handler\n * is only accepted where the stored type asks for less than the handler does.\n * The consequence is that a stored handler cannot be called without widening it\n * back, which `invokable` does once, below. No single type both accepts every\n * overload and is callable with an arbitrary payload.\n */\ntype LifecycleHandler = (event: never, context: never) => unknown;\n/** One stored handler, widened at the single point that calls it. */\ntype InvokableHandler = (event: unknown, context: unknown) => unknown;\n\nfunction invokable(handler: LifecycleHandler): InvokableHandler {\n return handler as InvokableHandler;\n}\n\n/** Types Pi declares but does not re-export from its package root. */\ntype SessionManagerView = ExtensionContext['sessionManager'];\ntype RunMode = ExtensionContext['mode'];\ntype ShortcutId = Parameters<ExtensionAPI['registerShortcut']>[0];\ntype ShortcutOptions = Parameters<ExtensionAPI['registerShortcut']>[1];\ntype CommandOptions = Parameters<ExtensionAPI['registerCommand']>[1];\ntype FlagOptions = Parameters<ExtensionAPI['registerFlag']>[1];\ntype CustomMessagePayload = Parameters<ExtensionAPI['sendMessage']>[0];\ntype SendMessageOptions = Parameters<ExtensionAPI['sendMessage']>[1];\ntype UserMessageContent = Parameters<ExtensionAPI['sendUserMessage']>[0];\ntype SendUserMessageOptions = Parameters<ExtensionAPI['sendUserMessage']>[1];\ntype RegisteredTool = Parameters<ExtensionAPI['registerTool']>[0];\ntype ToolUpdateCallback = Parameters<RegisteredTool['execute']>[3];\ntype ExecutionResult = Awaited<ReturnType<ExtensionAPI['exec']>>;\ntype ExecutionOptions = Parameters<ExtensionAPI['exec']>[2];\ntype ThinkingLevelValue = ReturnType<ExtensionAPI['getThinkingLevel']>;\ntype WidgetContent = Parameters<ExtensionContext['ui']['setWidget']>[1];\n\n/** Inventory entry for a host-owned tool this harness cannot execute. */\nfunction builtinToolInfo(name: string): ToolInfo {\n return {\n name,\n description: `Built-in ${name}`,\n parameters: { type: 'object', properties: {}, additionalProperties: false },\n sourceInfo: { type: 'builtin' },\n } as unknown as ToolInfo;\n}\n\n/** Inventory view of a tool an extension registered with this host. */\nfunction registeredToolInfo(tool: RegisteredTool): ToolInfo {\n return {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n promptGuidelines: (tool as { promptGuidelines?: unknown }).promptGuidelines,\n sourceInfo: { type: 'extension' },\n } as unknown as ToolInfo;\n}\n\nexport interface RecordedCommand {\n name: string;\n options: CommandOptions;\n}\nexport interface RecordedShortcut {\n shortcut: ShortcutId;\n options: ShortcutOptions;\n}\nexport interface RecordedRenderer {\n customType: string;\n renderer: unknown;\n}\n/** A `registerProvider` call in either of its two shapes. */\nexport interface RecordedProvider {\n /** Present for the `(name, config)` overload. */\n name?: string;\n value: unknown;\n}\nexport interface RecordedMessage {\n message: CustomMessagePayload;\n options: SendMessageOptions;\n}\nexport interface RecordedUserMessage {\n content: UserMessageContent;\n options: SendUserMessageOptions;\n}\nexport interface RecordedEntry {\n customType: string;\n data: unknown;\n}\nexport interface RecordedExec {\n command: string;\n args: string[];\n options: ExecutionOptions;\n}\nexport interface RecordedNotification {\n sessionId: string;\n message: string;\n level: 'info' | 'warning' | 'error' | undefined;\n}\nexport interface RecordedWidget {\n sessionId: string;\n key: string;\n content: WidgetContent;\n}\nexport interface RecordedStatus {\n sessionId: string;\n key: string;\n text: string | undefined;\n}\n\n/**\n * What the extension's dialogs answer.\n *\n * Every default is the dismissal, because that is the answer a headless host\n * gives and the one an extension is most likely to mishandle.\n */\nexport interface PiTestDialogAnswers {\n select(title: string, options: string[]): string | undefined;\n confirm(title: string, message: string): boolean;\n input(title: string, placeholder: string | undefined): string | undefined;\n editor(title: string, prefill: string | undefined): string | undefined;\n}\n\nexport interface PiTestContextOptions {\n sessionId?: string;\n cwd?: string;\n hasUI?: boolean;\n mode?: RunMode;\n isIdle?: boolean;\n isProjectTrusted?: boolean;\n signal?: AbortSignal;\n answers?: Partial<PiTestDialogAnswers>;\n systemPrompt?: string;\n}\n\nexport interface PiTestHostOptions extends PiTestContextOptions {\n /** Answers `pi.exec`; the default reports a command that ran and printed nothing. */\n exec?: (command: string, args: string[]) => ExecutionResult | Promise<ExecutionResult>;\n /**\n * Tool names Pi would already own before any extension loads.\n *\n * They join the inventory and start active, which is how the tool surface\n * arbiter learns that a name like `read` exists without a definition for it.\n */\n builtinTools?: readonly string[];\n}\n\nexport interface PiTestHost {\n /** The host an extension factory receives. */\n readonly pi: ExtensionAPI;\n readonly tools: readonly RegisteredTool[];\n readonly commands: readonly RecordedCommand[];\n readonly shortcuts: readonly RecordedShortcut[];\n readonly flags: ReadonlyMap<string, FlagOptions>;\n readonly messageRenderers: readonly RecordedRenderer[];\n readonly entryRenderers: readonly RecordedRenderer[];\n readonly markdownTransformers: readonly unknown[];\n readonly providers: readonly RecordedProvider[];\n readonly unregisteredProviders: readonly string[];\n readonly messages: readonly RecordedMessage[];\n readonly userMessages: readonly RecordedUserMessage[];\n readonly entries: readonly RecordedEntry[];\n readonly execs: readonly RecordedExec[];\n readonly notifications: readonly RecordedNotification[];\n readonly statuses: readonly RecordedStatus[];\n readonly widgets: readonly RecordedWidget[];\n /** Tool names Pi would offer the model right now. */\n activeTools(): readonly string[];\n tool(name: string): RegisteredTool | undefined;\n command(name: string): RecordedCommand | undefined;\n /** Lifecycle handlers registered for one event, in registration order. */\n handlers(event: string): readonly InvokableHandler[];\n /** A context for this host; each call builds a fresh one, as Pi does per event. */\n context(options?: PiTestContextOptions): ExtensionToolContext;\n /**\n * Runs every handler for one lifecycle event and returns what they answered.\n *\n * Sequential and awaited, matching Pi, so a test can observe one handler's\n * effect on the next.\n */\n emit(event: string, payload?: unknown, context?: ExtensionContext): Promise<unknown[]>;\n /** Calls a registered tool the way Pi's runner does. */\n callTool(\n name: string,\n params?: unknown,\n options?: {\n toolCallId?: string;\n signal?: AbortSignal;\n onUpdate?: ToolUpdateCallback;\n context?: ExtensionToolContext;\n },\n ): Promise<unknown>;\n /** Runs a registered slash command the way Pi's palette does. */\n runCommand(name: string, args?: string, context?: ExtensionContext): Promise<void>;\n /** The real Cordis host on this runner, installed on first use and disposed by `dispose`. */\n cordis(source?: string): Promise<PoCordisHostConnection>;\n dispose(): Promise<void>;\n}\n\nconst DEFAULT_CWD = '/repo';\nconst DEFAULT_SESSION_ID = 'test-session';\nconst DEFAULT_MODE: RunMode = 'tui';\nconst DEFAULT_SYSTEM_PROMPT = '';\nconst DEFAULT_CORDIS_SOURCE = 'pi-test-host';\nconst DEFAULT_EXEC: ExecutionResult = { code: 0, killed: false, stdout: '', stderr: '' };\n\nconst DISMISSED: PiTestDialogAnswers = {\n select: () => undefined,\n confirm: () => false,\n input: () => undefined,\n editor: () => undefined,\n};\n\n/**\n * A Pi host and the records of what an extension did to it.\n *\n * Nothing here is a spy from a test framework: the records are plain arrays, so\n * the harness works under any runner and adds no dependency to a package that\n * every extension already installs.\n */\nexport function createPiTestHost(options: PiTestHostOptions = {}): PiTestHost {\n const builtinTools: readonly string[] = options.builtinTools ?? [];\n const tools: RegisteredTool[] = [];\n const commands: RecordedCommand[] = [];\n const shortcuts: RecordedShortcut[] = [];\n const flags = new Map<string, FlagOptions>();\n const messageRenderers: RecordedRenderer[] = [];\n const entryRenderers: RecordedRenderer[] = [];\n const markdownTransformers: unknown[] = [];\n const providers: RecordedProvider[] = [];\n const unregisteredProviders: string[] = [];\n const messages: RecordedMessage[] = [];\n const userMessages: RecordedUserMessage[] = [];\n const entries: RecordedEntry[] = [];\n const execs: RecordedExec[] = [];\n const notifications: RecordedNotification[] = [];\n const statuses: RecordedStatus[] = [];\n const widgets: RecordedWidget[] = [];\n\n const lifecycle = new Map<string, LifecycleHandler[]>();\n const channels = new Map<string, Set<(data: unknown) => void>>();\n let activeToolNames: string[] = [...builtinTools];\n let sessionName: string | undefined;\n let thinkingLevel: ThinkingLevelValue = 'off';\n let cordisConnection: PoCordisHostConnection | undefined;\n\n const runExec = options.exec ?? ((): ExecutionResult => DEFAULT_EXEC);\n\n const pi: ExtensionAPI = {\n on(event: string, handler: LifecycleHandler): () => void {\n const registered = lifecycle.get(event) ?? [];\n registered.push(handler);\n lifecycle.set(event, registered);\n return () => {\n const index = registered.indexOf(handler);\n if (index === -1) return;\n registered.splice(index, 1);\n if (registered.length === 0) lifecycle.delete(event);\n };\n },\n // Generic exactly as Pi declares it. Storage erases the schema generics; the\n // signature is the half that has to keep matching.\n registerTool<TParams extends TSchema = TSchema, TDetails = unknown, TState = unknown>(\n tool: ToolDefinition<TParams, TDetails, TState>,\n ): void {\n tools.push(tool as unknown as RegisteredTool);\n if (!activeToolNames.includes(tool.name)) activeToolNames.push(tool.name);\n },\n registerToolRenderer(): void {},\n registerCommand(name: string, commandOptions: CommandOptions): void {\n commands.push({ name, options: commandOptions });\n },\n registerShortcut(shortcut: ShortcutId, shortcutOptions: ShortcutOptions): void {\n shortcuts.push({ shortcut, options: shortcutOptions });\n },\n registerFlag(name: string, flagOptions: FlagOptions): void {\n flags.set(name, flagOptions);\n },\n getFlag(name: string): boolean | string | undefined {\n return flags.get(name)?.default;\n },\n registerMessageRenderer(customType: string, renderer: unknown): void {\n messageRenderers.push({ customType, renderer });\n },\n registerMarkdownTransformer(transformer: unknown): void {\n markdownTransformers.push(transformer);\n },\n registerEntryRenderer(customType: string, renderer: unknown): void {\n entryRenderers.push({ customType, renderer });\n },\n sendMessage(message: CustomMessagePayload, sendOptions?: SendMessageOptions): void {\n messages.push({ message, options: sendOptions });\n },\n sendUserMessage(content: UserMessageContent, sendOptions?: SendUserMessageOptions): void {\n userMessages.push({ content, options: sendOptions });\n },\n appendEntry(customType: string, data?: unknown): void {\n entries.push({ customType, data });\n },\n setSessionName(name: string): void {\n sessionName = name;\n },\n getSessionName(): string | undefined {\n return sessionName;\n },\n setLabel(): void {\n // Labels are session bookmarks; no Po extension reads them back.\n },\n async exec(command: string, args: string[], execOptions?: ExecutionOptions): Promise<ExecutionResult> {\n execs.push({ command, args, options: execOptions });\n return runExec(command, args);\n },\n getActiveTools(): string[] {\n return [...activeToolNames];\n },\n getAllTools(): ToolInfo[] {\n // Pi's inventory folds in built-in and MCP tools, which this host models\n // as names only: a test asserts on the surface, never on their behaviour.\n return [...builtinTools.map(builtinToolInfo), ...tools.map(registeredToolInfo)];\n },\n setActiveTools(toolNames: string[]): void {\n activeToolNames = [...toolNames];\n },\n getSettings() {\n return {};\n },\n // No Po extension registers MCP servers or virtual models through Pi yet.\n registerMcpServer(): void {},\n unregisterMcpServer(): void {},\n getMcpServers() {\n return [];\n },\n registerVirtualModel(): void {},\n unregisterVirtualModel(): void {},\n getCommands(): never[] {\n return [];\n },\n async setModel(): Promise<boolean> {\n // No API key is configured, which is the answer Pi gives for the same reason.\n return false;\n },\n getThinkingLevel(): ThinkingLevelValue {\n return thinkingLevel;\n },\n setThinkingLevel(level: ThinkingLevelValue): void {\n thinkingLevel = level;\n },\n registerProvider(providerOrName: unknown, config?: unknown): void {\n providers.push(\n typeof providerOrName === 'string' ? { name: providerOrName, value: config } : { value: providerOrName },\n );\n },\n unregisterProvider(name: string): void {\n unregisteredProviders.push(name);\n },\n events: {\n emit(channel: string, data: unknown): void {\n // A snapshot: a listener that unsubscribes on delivery would otherwise\n // reshape the set this loop is walking.\n const delivered = [...(channels.get(channel) ?? [])];\n for (const listener of delivered) listener(data);\n },\n on(channel: string, listener: (data: unknown) => void): () => void {\n const listeners = channels.get(channel) ?? new Set<(data: unknown) => void>();\n listeners.add(listener);\n channels.set(channel, listeners);\n return () => listeners.delete(listener);\n },\n },\n };\n\n function buildContext(contextOptions: PiTestContextOptions = {}): ExtensionToolContext {\n const sessionId = contextOptions.sessionId ?? options.sessionId ?? DEFAULT_SESSION_ID;\n const cwd = contextOptions.cwd ?? options.cwd ?? DEFAULT_CWD;\n const answers = { ...DISMISSED, ...options.answers, ...contextOptions.answers };\n const sessionManager = {\n getCwd: () => cwd,\n getSessionId: () => sessionId,\n getSessionName: () => sessionName,\n getSessionDir: () => cwd,\n getSessionFile: () => `${cwd}/${sessionId}.jsonl`,\n getLeafId: () => undefined,\n getLeafEntry: () => undefined,\n getEntry: () => undefined,\n getLabel: () => undefined,\n getBranch: () => [],\n buildContextEntries: () => [],\n getHeader: () => undefined,\n getEntries: () => [],\n getTree: () => [],\n };\n const ui = {\n select: async (title: string, selectOptions: string[]) => answers.select(title, selectOptions),\n confirm: async (title: string, message: string) => answers.confirm(title, message),\n input: async (title: string, placeholder?: string) => answers.input(title, placeholder),\n editor: async (title: string, prefill?: string) => answers.editor(title, prefill),\n notify: (message: string, level?: 'info' | 'warning' | 'error') => {\n notifications.push({ sessionId, message, level });\n },\n onTerminalInput: () => () => undefined,\n setStatus: (key: string, text: string | undefined) => {\n statuses.push({ sessionId, key, text });\n },\n setWorkingMessage: () => undefined,\n setWorkingVisible: () => undefined,\n setWorkingIndicator: () => undefined,\n setHiddenThinkingLabel: () => undefined,\n setWidget: (key: string, content: WidgetContent) => {\n widgets.push({ sessionId, key, content });\n },\n setFooter: () => undefined,\n setHeader: () => undefined,\n setTitle: () => undefined,\n // A custom component needs a real TUI to resolve, so it never does. An\n // extension awaiting one must stay responsive, which is what this proves.\n custom: () => new Promise<never>(() => undefined),\n pasteToEditor: () => undefined,\n setEditorText: () => undefined,\n getEditorText: () => '',\n addAutocompleteProvider: () => undefined,\n setEditorComponent: () => undefined,\n getEditorComponent: () => undefined,\n theme: undefined,\n getAllThemes: () => [],\n getTheme: () => undefined,\n setTheme: () => ({ success: false, error: 'This host renders nothing.' }),\n getToolsExpanded: () => false,\n setToolsExpanded: () => undefined,\n };\n const context = {\n ui,\n mode: contextOptions.mode ?? options.mode ?? DEFAULT_MODE,\n hasUI: contextOptions.hasUI ?? options.hasUI ?? true,\n cwd,\n sessionManager: sessionManager as unknown as SessionManagerView,\n modelRegistry: undefined,\n model: undefined,\n scopedModels: [],\n isIdle: () => contextOptions.isIdle ?? options.isIdle ?? true,\n isProjectTrusted: () => contextOptions.isProjectTrusted ?? options.isProjectTrusted ?? true,\n signal: contextOptions.signal ?? options.signal,\n abort: () => undefined,\n hasPendingMessages: () => false,\n shutdown: () => undefined,\n getContextUsage: () => undefined,\n compact: () => undefined,\n getSystemPrompt: () => contextOptions.systemPrompt ?? options.systemPrompt ?? DEFAULT_SYSTEM_PROMPT,\n // Command handlers receive the wider context, and an extension that only\n // reads it should not have to be handed a second fixture to be exercised.\n getSystemPromptOptions: () => ({}),\n waitForIdle: async () => undefined,\n newSession: async () => ({ cancelled: true }),\n fork: async () => ({ cancelled: true }),\n navigateTree: async () => ({ cancelled: true }),\n switchSession: async () => ({ cancelled: true }),\n reload: async () => undefined,\n // Tool execute() receives the tool context. Nested calls answer as Pi does when unbound.\n tools: [],\n executeTool: async (name: string) => ({\n toolCall: { type: 'toolCall', id: 'nested/0', name, arguments: {} },\n result: {\n content: [{ type: 'text', text: 'Nested tool calls are not available in this context' }],\n details: {},\n },\n isError: true,\n }),\n };\n // The one cast. `modelRegistry` is a class with a private field and so is\n // nominally typed, `ui.theme` is typed from a module Pi does not export,\n // and `model` is a populated provider record. No object literal can satisfy\n // those three, and no Po extension reads them.\n return context as unknown as ExtensionToolContext;\n }\n\n return {\n pi,\n tools,\n commands,\n shortcuts,\n flags,\n messageRenderers,\n entryRenderers,\n markdownTransformers,\n providers,\n unregisteredProviders,\n messages,\n userMessages,\n entries,\n execs,\n notifications,\n statuses,\n widgets,\n activeTools: () => [...activeToolNames],\n tool: (name) => tools.findLast((candidate) => candidate.name === name),\n command: (name) => commands.find((candidate) => candidate.name === name),\n handlers: (event) => (lifecycle.get(event) ?? []).map(invokable),\n context: buildContext,\n async emit(event, payload, context) {\n const eventContext = context ?? buildContext();\n const answered: unknown[] = [];\n // A snapshot, because a handler may register another for the same event\n // and Pi does not deliver this emission to it.\n const delivered = [...(lifecycle.get(event) ?? [])];\n for (const handler of delivered) {\n answered.push(await invokable(handler)({ type: event, ...(payload as object) }, eventContext));\n }\n if (event === 'session_shutdown') cordisConnection = undefined;\n return answered;\n },\n async callTool(name, params = {}, callOptions = {}) {\n const tool = tools.findLast((candidate) => candidate.name === name);\n if (!tool) throw new Error(`No tool named '${name}' is registered on this host.`);\n return tool.execute(\n callOptions.toolCallId ?? `call-${String(tools.indexOf(tool))}`,\n params,\n callOptions.signal,\n callOptions.onUpdate,\n callOptions.context ?? buildContext(),\n );\n },\n async runCommand(name, args = '', context) {\n const command = commands.find((candidate) => candidate.name === name);\n if (!command) throw new Error(`No command named '${name}' is registered on this host.`);\n await command.options.handler(args, (context ?? buildContext()) as never);\n },\n async cordis(source = DEFAULT_CORDIS_SOURCE) {\n if (cordisConnection === undefined) {\n const controller = await installPoCordisHost(pi, {\n mode: 'standalone',\n source: `${source}:standalone-host`,\n });\n try {\n cordisConnection = await connectPoCordisHost(pi, source);\n } catch (error) {\n await controller.shutdown();\n throw error;\n }\n }\n return cordisConnection;\n },\n async dispose() {\n await cordisConnection?.dispose();\n cordisConnection = undefined;\n },\n };\n}\n"],"mappings":"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"}
@@ -6,7 +6,7 @@
6
6
  * this contract generic lets independently bundled consumers share the Cordis
7
7
  * service definition without making the contracts package depend on config.
8
8
  */
9
- export interface IDoomConfigService<TSnapshot = unknown, TFileConfig = unknown> {
9
+ export interface IPoConfigService<TSnapshot = unknown, TFileConfig = unknown> {
10
10
  /** Identifies the currently published session service for stale-work fencing. */
11
11
  readonly generation: string;
12
12
  /** Returns the immutable snapshot currently visible to consumers. */
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.mts","names":[],"sources":["../../../src/types/config.ts"],"mappings":";;;;;;;;iBAOiB,mBAAmB,qBAAqB;;WAE9C;;EAET,eAAe;;EAEf,gBAAgB,UAAU,YAAY;;EAEtC,KAAK,kBAAkB,yBAAyB"}
1
+ {"version":3,"file":"config.d.mts","names":[],"sources":["../../../src/types/config.ts"],"mappings":";;;;;;;;iBAOiB,iBAAiB,qBAAqB;;WAE5C;;EAET,eAAe;;EAEf,gBAAgB,UAAU,YAAY;;EAEtC,KAAK,kBAAkB,yBAAyB"}
@@ -13,8 +13,8 @@
13
13
  * effect without tearing the process down.
14
14
  *
15
15
  * AVOID:
16
- * - Host types in this file. The kernel is host-neutral so the Pi facet and
17
- * the headless server facet can share one registry.
16
+ * - Host types in this file. The kernel is host-neutral so the Pi extension host and
17
+ * the headless server host can share one registry.
18
18
  * - Mutating a contribution after registration. Re-register instead, so the
19
19
  * recomputed union stays a pure function of the registered set.
20
20
  */
@@ -40,7 +40,7 @@ export interface KernelSlotHandle<TValue> extends KernelRegistration {
40
40
  /** Registers a contribution against this slot without naming it again. */
41
41
  contribute(entry: KernelContribution<TValue>): KernelRegistration;
42
42
  }
43
- export interface DoomKernel {
43
+ export interface PoKernel {
44
44
  /** Layers currently selected by the active major mode. */
45
45
  readonly activeLayers: readonly string[];
46
46
  /** Slot names defined so far, in definition order. */