@earendil-works/pi-coding-agent 0.85.0 → 0.86.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (544) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +2 -3
  3. package/dist/bun/cli.d.ts +3 -1
  4. package/dist/bun/cli.d.ts.map +1 -1
  5. package/dist/bun/cli.js +3 -12
  6. package/dist/bun/cli.js.map +1 -1
  7. package/dist/bun/sandbox-env-setup.d.ts +2 -0
  8. package/dist/bun/sandbox-env-setup.d.ts.map +1 -0
  9. package/dist/bun/sandbox-env-setup.js +4 -0
  10. package/dist/bun/sandbox-env-setup.js.map +1 -0
  11. package/dist/bundle/chunks/anthropic-messages-MYU5ZMRF.js +6 -0
  12. package/dist/bundle/chunks/azure-openai-responses-HUSQ3GP2.js +2 -0
  13. package/dist/bundle/chunks/bedrock-converse-stream.js +47 -38
  14. package/dist/bundle/chunks/chunk-7IOYH2SY.js +2 -0
  15. package/dist/bundle/chunks/chunk-7YM6BE7Y.js +1561 -0
  16. package/dist/bundle/chunks/chunk-A3JYRWB6.js +2 -0
  17. package/dist/bundle/chunks/chunk-DTD7JQ7Y.js +42 -0
  18. package/dist/bundle/chunks/chunk-FUXEF6JQ.js +44 -0
  19. package/dist/bundle/chunks/{chunk-IDDQWTHI.js → chunk-RCZIEVGO.js} +10 -1
  20. package/dist/bundle/chunks/chunk-S7SZN6Z3.js +2 -0
  21. package/dist/bundle/chunks/chunk-WIUZI2CJ.js +11 -0
  22. package/dist/bundle/chunks/github-copilot.js +1 -1
  23. package/dist/bundle/chunks/google-generative-ai-IMS5EK2Y.js +2 -0
  24. package/dist/bundle/chunks/google-vertex-O4YJEQUW.js +2 -0
  25. package/dist/bundle/chunks/jiti-loader-C3NU2SDH.js +21 -0
  26. package/dist/bundle/chunks/jiti-static-loader-E6ANQD5T.js +2 -0
  27. package/dist/bundle/chunks/mistral-conversations-NOSQHBEY.js +5 -0
  28. package/dist/bundle/chunks/{node-EM5FIVUN.js → node-O3RIBJRH.js} +1 -1
  29. package/dist/bundle/chunks/openai-codex-responses-QDSOTBBO.js +10 -0
  30. package/dist/bundle/chunks/openai-completions-KQPOPEVM.js +7 -0
  31. package/dist/bundle/chunks/openai-responses-HWEUZ6WZ.js +2 -0
  32. package/dist/bundle/chunks/{pi-messages-EGZIFQGG.js → pi-messages-GFKBWJHZ.js} +1 -1
  33. package/dist/bundle/chunks/virtual-modules-XW5APVUE.js +2 -0
  34. package/dist/bundle/cli.js +1 -1
  35. package/dist/bundle/index.js +1 -1
  36. package/dist/bundle/rpc-entry.js +1 -1
  37. package/dist/cli/args.d.ts.map +1 -1
  38. package/dist/cli/args.js +0 -2
  39. package/dist/cli/args.js.map +1 -1
  40. package/dist/cli/session-picker.d.ts +1 -1
  41. package/dist/cli/session-picker.d.ts.map +1 -1
  42. package/dist/cli/session-picker.js.map +1 -1
  43. package/dist/cli/setup.d.ts +2 -0
  44. package/dist/cli/setup.d.ts.map +1 -0
  45. package/dist/cli/setup.js +12 -0
  46. package/dist/cli/setup.js.map +1 -0
  47. package/dist/cli.d.ts.map +1 -1
  48. package/dist/cli.js +3 -25
  49. package/dist/cli.js.map +1 -1
  50. package/dist/config.d.ts.map +1 -1
  51. package/dist/config.js +1 -1
  52. package/dist/config.js.map +1 -1
  53. package/dist/core/agent-session.d.ts +56 -6
  54. package/dist/core/agent-session.d.ts.map +1 -1
  55. package/dist/core/agent-session.js +293 -155
  56. package/dist/core/agent-session.js.map +1 -1
  57. package/dist/core/bug-report-upload.d.ts +12 -0
  58. package/dist/core/bug-report-upload.d.ts.map +1 -0
  59. package/dist/core/bug-report-upload.js +22 -0
  60. package/dist/core/bug-report-upload.js.map +1 -0
  61. package/dist/core/bug-report.d.ts +176 -0
  62. package/dist/core/bug-report.d.ts.map +1 -0
  63. package/dist/core/bug-report.js +292 -0
  64. package/dist/core/bug-report.js.map +1 -0
  65. package/dist/core/cache-stats.d.ts.map +1 -1
  66. package/dist/core/cache-stats.js +12 -1
  67. package/dist/core/cache-stats.js.map +1 -1
  68. package/dist/core/cache-warmer.d.ts +102 -0
  69. package/dist/core/cache-warmer.d.ts.map +1 -0
  70. package/dist/core/cache-warmer.js +342 -0
  71. package/dist/core/cache-warmer.js.map +1 -0
  72. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  73. package/dist/core/compaction/branch-summarization.js +2 -2
  74. package/dist/core/compaction/branch-summarization.js.map +1 -1
  75. package/dist/core/compaction/compaction.d.ts +2 -2
  76. package/dist/core/compaction/compaction.d.ts.map +1 -1
  77. package/dist/core/compaction/compaction.js +11 -12
  78. package/dist/core/compaction/compaction.js.map +1 -1
  79. package/dist/core/crash-log.d.ts +22 -0
  80. package/dist/core/crash-log.d.ts.map +1 -0
  81. package/dist/core/crash-log.js +71 -0
  82. package/dist/core/crash-log.js.map +1 -0
  83. package/dist/core/experimental.d.ts +0 -4
  84. package/dist/core/experimental.d.ts.map +1 -1
  85. package/dist/core/experimental.js +0 -4
  86. package/dist/core/experimental.js.map +1 -1
  87. package/dist/core/extensions/index.d.ts +1 -1
  88. package/dist/core/extensions/index.d.ts.map +1 -1
  89. package/dist/core/extensions/index.js.map +1 -1
  90. package/dist/core/extensions/jiti-loader.d.ts +2 -0
  91. package/dist/core/extensions/jiti-loader.d.ts.map +1 -0
  92. package/dist/core/extensions/jiti-loader.js +4 -0
  93. package/dist/core/extensions/jiti-loader.js.map +1 -0
  94. package/dist/core/extensions/jiti-static-loader.d.ts +2 -0
  95. package/dist/core/extensions/jiti-static-loader.d.ts.map +1 -0
  96. package/dist/core/extensions/jiti-static-loader.js +4 -0
  97. package/dist/core/extensions/jiti-static-loader.js.map +1 -0
  98. package/dist/core/extensions/loader.d.ts.map +1 -1
  99. package/dist/core/extensions/loader.js +38 -51
  100. package/dist/core/extensions/loader.js.map +1 -1
  101. package/dist/core/extensions/runner.d.ts +10 -7
  102. package/dist/core/extensions/runner.d.ts.map +1 -1
  103. package/dist/core/extensions/runner.js +85 -67
  104. package/dist/core/extensions/runner.js.map +1 -1
  105. package/dist/core/extensions/types.d.ts +60 -50
  106. package/dist/core/extensions/types.d.ts.map +1 -1
  107. package/dist/core/extensions/types.js.map +1 -1
  108. package/dist/core/extensions/virtual-modules.d.ts +3 -0
  109. package/dist/core/extensions/virtual-modules.d.ts.map +1 -0
  110. package/dist/core/extensions/virtual-modules.js +38 -0
  111. package/dist/core/extensions/virtual-modules.js.map +1 -0
  112. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  113. package/dist/core/extensions/wrapper.js +1 -20
  114. package/dist/core/extensions/wrapper.js.map +1 -1
  115. package/dist/core/index.d.ts +2 -1
  116. package/dist/core/index.d.ts.map +1 -1
  117. package/dist/core/index.js.map +1 -1
  118. package/dist/core/keybindings.d.ts +6 -1
  119. package/dist/core/keybindings.d.ts.map +1 -1
  120. package/dist/core/keybindings.js +5 -1
  121. package/dist/core/keybindings.js.map +1 -1
  122. package/dist/core/messages.d.ts.map +1 -1
  123. package/dist/core/messages.js +1 -0
  124. package/dist/core/messages.js.map +1 -1
  125. package/dist/core/model-config.d.ts +101 -20
  126. package/dist/core/model-config.d.ts.map +1 -1
  127. package/dist/core/model-config.js +25 -18
  128. package/dist/core/model-config.js.map +1 -1
  129. package/dist/core/model-registry.d.ts +5 -1
  130. package/dist/core/model-registry.d.ts.map +1 -1
  131. package/dist/core/model-registry.js +8 -0
  132. package/dist/core/model-registry.js.map +1 -1
  133. package/dist/core/model-resolver.d.ts.map +1 -1
  134. package/dist/core/model-resolver.js +1 -1
  135. package/dist/core/model-resolver.js.map +1 -1
  136. package/dist/core/model-runtime.d.ts.map +1 -1
  137. package/dist/core/model-runtime.js +5 -3
  138. package/dist/core/model-runtime.js.map +1 -1
  139. package/dist/core/provider-composer.d.ts +3 -2
  140. package/dist/core/provider-composer.d.ts.map +1 -1
  141. package/dist/core/provider-composer.js +2 -0
  142. package/dist/core/provider-composer.js.map +1 -1
  143. package/dist/core/radius.d.ts +3 -0
  144. package/dist/core/radius.d.ts.map +1 -1
  145. package/dist/core/radius.js +6 -0
  146. package/dist/core/radius.js.map +1 -1
  147. package/dist/core/sdk.d.ts.map +1 -1
  148. package/dist/core/sdk.js +60 -38
  149. package/dist/core/sdk.js.map +1 -1
  150. package/dist/core/session-export.d.ts +6 -2
  151. package/dist/core/session-export.d.ts.map +1 -1
  152. package/dist/core/session-export.js +14 -13
  153. package/dist/core/session-export.js.map +1 -1
  154. package/dist/core/session-manager.d.ts +29 -6
  155. package/dist/core/session-manager.d.ts.map +1 -1
  156. package/dist/core/session-manager.js +159 -96
  157. package/dist/core/session-manager.js.map +1 -1
  158. package/dist/core/settings-manager.d.ts +20 -4
  159. package/dist/core/settings-manager.d.ts.map +1 -1
  160. package/dist/core/settings-manager.js +43 -7
  161. package/dist/core/settings-manager.js.map +1 -1
  162. package/dist/core/slash-commands.d.ts.map +1 -1
  163. package/dist/core/slash-commands.js +1 -0
  164. package/dist/core/slash-commands.js.map +1 -1
  165. package/dist/core/system-prompt.d.ts +49 -6
  166. package/dist/core/system-prompt.d.ts.map +1 -1
  167. package/dist/core/system-prompt.js +121 -92
  168. package/dist/core/system-prompt.js.map +1 -1
  169. package/dist/core/tools/bash.d.ts +2 -1
  170. package/dist/core/tools/bash.d.ts.map +1 -1
  171. package/dist/core/tools/bash.js +10 -4
  172. package/dist/core/tools/bash.js.map +1 -1
  173. package/dist/core/tools/edit.d.ts.map +1 -1
  174. package/dist/core/tools/edit.js +1 -2
  175. package/dist/core/tools/edit.js.map +1 -1
  176. package/dist/core/tools/read.d.ts.map +1 -1
  177. package/dist/core/tools/read.js +1 -2
  178. package/dist/core/tools/read.js.map +1 -1
  179. package/dist/core/tools/renderers/bash.d.ts.map +1 -1
  180. package/dist/core/tools/renderers/bash.js +9 -1
  181. package/dist/core/tools/renderers/bash.js.map +1 -1
  182. package/dist/core/tools/write.d.ts.map +1 -1
  183. package/dist/core/tools/write.js +1 -2
  184. package/dist/core/tools/write.js.map +1 -1
  185. package/dist/core/usage-totals.d.ts +1 -1
  186. package/dist/core/usage-totals.d.ts.map +1 -1
  187. package/dist/core/usage-totals.js +5 -1
  188. package/dist/core/usage-totals.js.map +1 -1
  189. package/dist/extensions/llama/client.d.ts +2 -0
  190. package/dist/extensions/llama/client.d.ts.map +1 -1
  191. package/dist/extensions/llama/client.js +7 -3
  192. package/dist/extensions/llama/client.js.map +1 -1
  193. package/dist/extensions/llama/provider.d.ts.map +1 -1
  194. package/dist/extensions/llama/provider.js +20 -5
  195. package/dist/extensions/llama/provider.js.map +1 -1
  196. package/dist/index.d.ts +3 -2
  197. package/dist/index.d.ts.map +1 -1
  198. package/dist/index.js.map +1 -1
  199. package/dist/main.d.ts.map +1 -1
  200. package/dist/main.js +13 -131
  201. package/dist/main.js.map +1 -1
  202. package/dist/migrations.d.ts.map +1 -1
  203. package/dist/migrations.js +2 -2
  204. package/dist/migrations.js.map +1 -1
  205. package/dist/modes/interactive/bug-report.d.ts +14 -0
  206. package/dist/modes/interactive/bug-report.d.ts.map +1 -0
  207. package/dist/modes/interactive/bug-report.js +209 -0
  208. package/dist/modes/interactive/bug-report.js.map +1 -0
  209. package/dist/modes/interactive/chat-viewport.d.ts.map +1 -1
  210. package/dist/modes/interactive/chat-viewport.js +1 -1
  211. package/dist/modes/interactive/chat-viewport.js.map +1 -1
  212. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  213. package/dist/modes/interactive/components/branch-summary-message.js +12 -5
  214. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  215. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  216. package/dist/modes/interactive/components/compaction-summary-message.js +12 -5
  217. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  218. package/dist/modes/interactive/components/custom-editor.d.ts +3 -3
  219. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  220. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  221. package/dist/modes/interactive/components/extension-input.d.ts +2 -0
  222. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  223. package/dist/modes/interactive/components/extension-input.js +6 -0
  224. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  225. package/dist/modes/interactive/components/extension-selector.d.ts +1 -0
  226. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  227. package/dist/modes/interactive/components/extension-selector.js +4 -0
  228. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  229. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  230. package/dist/modes/interactive/components/footer.js +4 -1
  231. package/dist/modes/interactive/components/footer.js.map +1 -1
  232. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  233. package/dist/modes/interactive/components/model-selector.js +5 -5
  234. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  235. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  236. package/dist/modes/interactive/components/scoped-models-selector.js +8 -8
  237. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  238. package/dist/modes/interactive/components/session-selector.d.ts +5 -5
  239. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  240. package/dist/modes/interactive/components/session-selector.js +74 -48
  241. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  242. package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
  243. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  244. package/dist/modes/interactive/components/settings-selector.js +11 -0
  245. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  246. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  247. package/dist/modes/interactive/components/skill-invocation-message.js +11 -4
  248. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  249. package/dist/modes/interactive/components/status-indicator.d.ts +2 -2
  250. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  251. package/dist/modes/interactive/components/status-indicator.js +7 -7
  252. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  253. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  254. package/dist/modes/interactive/components/thinking-selector.js +4 -4
  255. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  256. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  257. package/dist/modes/interactive/components/tool-execution.js +18 -9
  258. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  259. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  260. package/dist/modes/interactive/components/tree-selector.js +2 -0
  261. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  262. package/dist/modes/interactive/interactive-mode.d.ts +13 -1
  263. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  264. package/dist/modes/interactive/interactive-mode.js +220 -84
  265. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  266. package/dist/modes/interactive/session-share.d.ts +2 -0
  267. package/dist/modes/interactive/session-share.d.ts.map +1 -1
  268. package/dist/modes/interactive/session-share.js +8 -4
  269. package/dist/modes/interactive/session-share.js.map +1 -1
  270. package/dist/modes/interactive/tui-renderer.d.ts.map +1 -1
  271. package/dist/modes/interactive/tui-renderer.js +2 -2
  272. package/dist/modes/interactive/tui-renderer.js.map +1 -1
  273. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  274. package/dist/modes/rpc/rpc-mode.js +2 -2
  275. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  276. package/dist/utils/clipboard-command.d.ts +7 -0
  277. package/dist/utils/clipboard-command.d.ts.map +1 -0
  278. package/dist/utils/clipboard-command.js +45 -0
  279. package/dist/utils/clipboard-command.js.map +1 -0
  280. package/dist/utils/clipboard-image.d.ts.map +1 -1
  281. package/dist/utils/clipboard-image.js +52 -69
  282. package/dist/utils/clipboard-image.js.map +1 -1
  283. package/dist/utils/clipboard.d.ts.map +1 -1
  284. package/dist/utils/clipboard.js +61 -125
  285. package/dist/utils/clipboard.js.map +1 -1
  286. package/dist/utils/zip.d.ts +7 -0
  287. package/dist/utils/zip.d.ts.map +1 -0
  288. package/dist/utils/zip.js +60 -0
  289. package/dist/utils/zip.js.map +1 -0
  290. package/docs/compaction.md +39 -13
  291. package/docs/containerization.md +45 -0
  292. package/docs/custom-provider.md +22 -13
  293. package/docs/development.md +23 -4
  294. package/docs/docs.json +4 -0
  295. package/docs/environment-variables.md +3 -2
  296. package/docs/extensions.md +57 -43
  297. package/docs/json.md +4 -4
  298. package/docs/keybindings.md +2 -1
  299. package/docs/models.md +34 -3
  300. package/docs/providers.md +2 -2
  301. package/docs/sdk.md +4 -2
  302. package/docs/security.md +1 -1
  303. package/docs/session-format.md +82 -40
  304. package/docs/sessions.md +27 -0
  305. package/docs/settings.md +60 -1
  306. package/docs/termux.md +0 -1
  307. package/docs/tui.md +2 -2
  308. package/docs/usage.md +1 -0
  309. package/examples/extensions/README.md +0 -1
  310. package/examples/extensions/custom-provider-anthropic/index.ts +18 -12
  311. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  312. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  313. package/examples/extensions/custom-provider-gitlab-duo/index.ts +2 -2
  314. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  315. package/examples/extensions/gondolin/package-lock.json +2 -2
  316. package/examples/extensions/gondolin/package.json +1 -1
  317. package/examples/extensions/prompt-customizer.ts +19 -67
  318. package/examples/extensions/sandbox/package-lock.json +2 -2
  319. package/examples/extensions/sandbox/package.json +1 -1
  320. package/examples/extensions/with-deps/package-lock.json +2 -2
  321. package/examples/extensions/with-deps/package.json +1 -1
  322. package/npm-shrinkwrap.json +425 -778
  323. package/package.json +22 -27
  324. package/dist/bundle/chunks/anthropic-messages-QAQLEQIY.js +0 -6
  325. package/dist/bundle/chunks/azure-openai-responses-Q7MJBRE6.js +0 -2
  326. package/dist/bundle/chunks/chunk-2KVJKXS2.js +0 -50
  327. package/dist/bundle/chunks/chunk-AXIIZGTV.js +0 -2
  328. package/dist/bundle/chunks/chunk-EQ6DR6XK.js +0 -5
  329. package/dist/bundle/chunks/chunk-GMWCTUPB.js +0 -2
  330. package/dist/bundle/chunks/chunk-LZKJTKCT.js +0 -2
  331. package/dist/bundle/chunks/chunk-OUXLLA64.js +0 -11
  332. package/dist/bundle/chunks/chunk-R7UUJ4C2.js +0 -42
  333. package/dist/bundle/chunks/chunk-UAQELI3K.js +0 -2
  334. package/dist/bundle/chunks/chunk-WBE4J4AU.js +0 -9
  335. package/dist/bundle/chunks/chunk-WZB2R5YO.js +0 -1558
  336. package/dist/bundle/chunks/google-generative-ai-BSMTYDAM.js +0 -2
  337. package/dist/bundle/chunks/google-vertex-5C3HASOJ.js +0 -2
  338. package/dist/bundle/chunks/mistral-conversations-4M6BZBX6.js +0 -5
  339. package/dist/bundle/chunks/openai-codex-responses-YJOO52RW.js +0 -10
  340. package/dist/bundle/chunks/openai-completions-QOT3QX7D.js +0 -7
  341. package/dist/bundle/chunks/openai-responses-U7LNPQN4.js +0 -2
  342. package/dist/bundle/client.js +0 -2
  343. package/dist/bundle/coordinator.js +0 -3
  344. package/dist/cli/experimental/cli.d.ts +0 -10
  345. package/dist/cli/experimental/cli.d.ts.map +0 -1
  346. package/dist/cli/experimental/cli.js +0 -9
  347. package/dist/cli/experimental/cli.js.map +0 -1
  348. package/dist/cli/experimental/command-options.d.ts +0 -28
  349. package/dist/cli/experimental/command-options.d.ts.map +0 -1
  350. package/dist/cli/experimental/command-options.js +0 -84
  351. package/dist/cli/experimental/command-options.js.map +0 -1
  352. package/dist/cli/experimental/command.d.ts +0 -70
  353. package/dist/cli/experimental/command.d.ts.map +0 -1
  354. package/dist/cli/experimental/command.js +0 -144
  355. package/dist/cli/experimental/command.js.map +0 -1
  356. package/dist/cli/experimental/commands/client.d.ts +0 -19
  357. package/dist/cli/experimental/commands/client.d.ts.map +0 -1
  358. package/dist/cli/experimental/commands/client.js +0 -63
  359. package/dist/cli/experimental/commands/client.js.map +0 -1
  360. package/dist/cli/experimental/commands/server.d.ts +0 -17
  361. package/dist/cli/experimental/commands/server.d.ts.map +0 -1
  362. package/dist/cli/experimental/commands/server.js +0 -44
  363. package/dist/cli/experimental/commands/server.js.map +0 -1
  364. package/dist/client/index.d.ts +0 -2
  365. package/dist/client/index.d.ts.map +0 -1
  366. package/dist/client/index.js +0 -2
  367. package/dist/client/index.js.map +0 -1
  368. package/dist/experimental/client-runtime.d.ts +0 -43
  369. package/dist/experimental/client-runtime.d.ts.map +0 -1
  370. package/dist/experimental/client-runtime.js +0 -183
  371. package/dist/experimental/client-runtime.js.map +0 -1
  372. package/dist/experimental/client-tui-chat.d.ts +0 -14
  373. package/dist/experimental/client-tui-chat.d.ts.map +0 -1
  374. package/dist/experimental/client-tui-chat.js +0 -171
  375. package/dist/experimental/client-tui-chat.js.map +0 -1
  376. package/dist/experimental/client-tui.d.ts +0 -37
  377. package/dist/experimental/client-tui.d.ts.map +0 -1
  378. package/dist/experimental/client-tui.js +0 -702
  379. package/dist/experimental/client-tui.js.map +0 -1
  380. package/dist/experimental/client.d.ts +0 -25
  381. package/dist/experimental/client.d.ts.map +0 -1
  382. package/dist/experimental/client.js +0 -99
  383. package/dist/experimental/client.js.map +0 -1
  384. package/dist/experimental/coordinator-entry.d.ts +0 -3
  385. package/dist/experimental/coordinator-entry.d.ts.map +0 -1
  386. package/dist/experimental/coordinator-entry.js +0 -11
  387. package/dist/experimental/coordinator-entry.js.map +0 -1
  388. package/dist/experimental/coordinator.d.ts +0 -38
  389. package/dist/experimental/coordinator.d.ts.map +0 -1
  390. package/dist/experimental/coordinator.js +0 -570
  391. package/dist/experimental/coordinator.js.map +0 -1
  392. package/dist/experimental/mini/main.d.ts +0 -7
  393. package/dist/experimental/mini/main.d.ts.map +0 -1
  394. package/dist/experimental/mini/main.js +0 -21
  395. package/dist/experimental/mini/main.js.map +0 -1
  396. package/dist/experimental/mini/server/entry.d.ts +0 -3
  397. package/dist/experimental/mini/server/entry.d.ts.map +0 -1
  398. package/dist/experimental/mini/server/entry.js +0 -11
  399. package/dist/experimental/mini/server/entry.js.map +0 -1
  400. package/dist/experimental/mini/server/run.d.ts +0 -13
  401. package/dist/experimental/mini/server/run.d.ts.map +0 -1
  402. package/dist/experimental/mini/server/run.js +0 -150
  403. package/dist/experimental/mini/server/run.js.map +0 -1
  404. package/dist/experimental/mini/shared/protocol.d.ts +0 -127
  405. package/dist/experimental/mini/shared/protocol.d.ts.map +0 -1
  406. package/dist/experimental/mini/shared/protocol.js +0 -13
  407. package/dist/experimental/mini/shared/protocol.js.map +0 -1
  408. package/dist/experimental/mini/shared/rpc.d.ts +0 -49
  409. package/dist/experimental/mini/shared/rpc.d.ts.map +0 -1
  410. package/dist/experimental/mini/shared/rpc.js +0 -171
  411. package/dist/experimental/mini/shared/rpc.js.map +0 -1
  412. package/dist/experimental/mini/shared/transport.d.ts +0 -35
  413. package/dist/experimental/mini/shared/transport.d.ts.map +0 -1
  414. package/dist/experimental/mini/shared/transport.js +0 -94
  415. package/dist/experimental/mini/shared/transport.js.map +0 -1
  416. package/dist/experimental/mini/tui/run.d.ts +0 -9
  417. package/dist/experimental/mini/tui/run.d.ts.map +0 -1
  418. package/dist/experimental/mini/tui/run.js +0 -62
  419. package/dist/experimental/mini/tui/run.js.map +0 -1
  420. package/dist/experimental/mini/tui/session.d.ts +0 -26
  421. package/dist/experimental/mini/tui/session.d.ts.map +0 -1
  422. package/dist/experimental/mini/tui/session.js +0 -94
  423. package/dist/experimental/mini/tui/session.js.map +0 -1
  424. package/dist/experimental/mini/tui/view.d.ts +0 -10
  425. package/dist/experimental/mini/tui/view.d.ts.map +0 -1
  426. package/dist/experimental/mini/tui/view.js +0 -459
  427. package/dist/experimental/mini/tui/view.js.map +0 -1
  428. package/dist/experimental/mini/worker/entry.d.ts +0 -3
  429. package/dist/experimental/mini/worker/entry.d.ts.map +0 -1
  430. package/dist/experimental/mini/worker/entry.js +0 -10
  431. package/dist/experimental/mini/worker/entry.js.map +0 -1
  432. package/dist/experimental/mini/worker/lane-service.d.ts +0 -44
  433. package/dist/experimental/mini/worker/lane-service.d.ts.map +0 -1
  434. package/dist/experimental/mini/worker/lane-service.js +0 -97
  435. package/dist/experimental/mini/worker/lane-service.js.map +0 -1
  436. package/dist/experimental/mini/worker/models-service.d.ts +0 -19
  437. package/dist/experimental/mini/worker/models-service.d.ts.map +0 -1
  438. package/dist/experimental/mini/worker/models-service.js +0 -136
  439. package/dist/experimental/mini/worker/models-service.js.map +0 -1
  440. package/dist/experimental/mini/worker/run.d.ts +0 -14
  441. package/dist/experimental/mini/worker/run.d.ts.map +0 -1
  442. package/dist/experimental/mini/worker/run.js +0 -88
  443. package/dist/experimental/mini/worker/run.js.map +0 -1
  444. package/dist/experimental/plugin.d.ts +0 -4
  445. package/dist/experimental/plugin.d.ts.map +0 -1
  446. package/dist/experimental/plugin.js +0 -4
  447. package/dist/experimental/plugin.js.map +0 -1
  448. package/dist/experimental/plugins/bundled.d.ts +0 -7
  449. package/dist/experimental/plugins/bundled.d.ts.map +0 -1
  450. package/dist/experimental/plugins/bundled.js +0 -48
  451. package/dist/experimental/plugins/bundled.js.map +0 -1
  452. package/dist/experimental/plugins/package.d.ts +0 -18
  453. package/dist/experimental/plugins/package.d.ts.map +0 -1
  454. package/dist/experimental/plugins/package.js +0 -113
  455. package/dist/experimental/plugins/package.js.map +0 -1
  456. package/dist/experimental/process.d.ts +0 -20
  457. package/dist/experimental/process.d.ts.map +0 -1
  458. package/dist/experimental/process.js +0 -85
  459. package/dist/experimental/process.js.map +0 -1
  460. package/dist/experimental/radius-auth.d.ts +0 -17
  461. package/dist/experimental/radius-auth.d.ts.map +0 -1
  462. package/dist/experimental/radius-auth.js +0 -52
  463. package/dist/experimental/radius-auth.js.map +0 -1
  464. package/dist/experimental/radius-relay.d.ts +0 -90
  465. package/dist/experimental/radius-relay.d.ts.map +0 -1
  466. package/dist/experimental/radius-relay.js +0 -582
  467. package/dist/experimental/radius-relay.js.map +0 -1
  468. package/dist/experimental/server.d.ts +0 -75
  469. package/dist/experimental/server.d.ts.map +0 -1
  470. package/dist/experimental/server.js +0 -682
  471. package/dist/experimental/server.js.map +0 -1
  472. package/dist/experimental/services/agent-controller-provider.d.ts +0 -4
  473. package/dist/experimental/services/agent-controller-provider.d.ts.map +0 -1
  474. package/dist/experimental/services/agent-controller-provider.js +0 -84
  475. package/dist/experimental/services/agent-controller-provider.js.map +0 -1
  476. package/dist/experimental/services/agent-controller.d.ts +0 -57
  477. package/dist/experimental/services/agent-controller.d.ts.map +0 -1
  478. package/dist/experimental/services/agent-controller.js +0 -3
  479. package/dist/experimental/services/agent-controller.js.map +0 -1
  480. package/dist/experimental/services/connection.d.ts +0 -40
  481. package/dist/experimental/services/connection.d.ts.map +0 -1
  482. package/dist/experimental/services/connection.js +0 -300
  483. package/dist/experimental/services/connection.js.map +0 -1
  484. package/dist/experimental/services/models-provider.d.ts +0 -16
  485. package/dist/experimental/services/models-provider.d.ts.map +0 -1
  486. package/dist/experimental/services/models-provider.js +0 -116
  487. package/dist/experimental/services/models-provider.js.map +0 -1
  488. package/dist/experimental/services/models.d.ts +0 -36
  489. package/dist/experimental/services/models.d.ts.map +0 -1
  490. package/dist/experimental/services/models.js +0 -3
  491. package/dist/experimental/services/models.js.map +0 -1
  492. package/dist/experimental/services/plugins.d.ts +0 -16
  493. package/dist/experimental/services/plugins.d.ts.map +0 -1
  494. package/dist/experimental/services/plugins.js +0 -4
  495. package/dist/experimental/services/plugins.js.map +0 -1
  496. package/dist/experimental/services/presentation-ui.d.ts +0 -13
  497. package/dist/experimental/services/presentation-ui.d.ts.map +0 -1
  498. package/dist/experimental/services/presentation-ui.js +0 -3
  499. package/dist/experimental/services/presentation-ui.js.map +0 -1
  500. package/dist/experimental/services/server.d.ts +0 -19
  501. package/dist/experimental/services/server.d.ts.map +0 -1
  502. package/dist/experimental/services/server.js +0 -104
  503. package/dist/experimental/services/server.js.map +0 -1
  504. package/dist/experimental/services/sessions.d.ts +0 -28
  505. package/dist/experimental/services/sessions.d.ts.map +0 -1
  506. package/dist/experimental/services/sessions.js +0 -4
  507. package/dist/experimental/services/sessions.js.map +0 -1
  508. package/dist/experimental/services/slash-commands-provider.d.ts +0 -14
  509. package/dist/experimental/services/slash-commands-provider.d.ts.map +0 -1
  510. package/dist/experimental/services/slash-commands-provider.js +0 -200
  511. package/dist/experimental/services/slash-commands-provider.js.map +0 -1
  512. package/dist/experimental/services/slash-commands.d.ts +0 -24
  513. package/dist/experimental/services/slash-commands.d.ts.map +0 -1
  514. package/dist/experimental/services/slash-commands.js +0 -3
  515. package/dist/experimental/services/slash-commands.js.map +0 -1
  516. package/dist/experimental/services/transcript-provider.d.ts +0 -12
  517. package/dist/experimental/services/transcript-provider.d.ts.map +0 -1
  518. package/dist/experimental/services/transcript-provider.js +0 -109
  519. package/dist/experimental/services/transcript-provider.js.map +0 -1
  520. package/dist/experimental/services/transcript.d.ts +0 -13
  521. package/dist/experimental/services/transcript.d.ts.map +0 -1
  522. package/dist/experimental/services/transcript.js +0 -3
  523. package/dist/experimental/services/transcript.js.map +0 -1
  524. package/dist/experimental/services/worker.d.ts +0 -28
  525. package/dist/experimental/services/worker.d.ts.map +0 -1
  526. package/dist/experimental/services/worker.js +0 -107
  527. package/dist/experimental/services/worker.js.map +0 -1
  528. package/dist/experimental/session-worker-manager.d.ts +0 -24
  529. package/dist/experimental/session-worker-manager.d.ts.map +0 -1
  530. package/dist/experimental/session-worker-manager.js +0 -691
  531. package/dist/experimental/session-worker-manager.js.map +0 -1
  532. package/dist/experimental/session-worker.d.ts +0 -188
  533. package/dist/experimental/session-worker.d.ts.map +0 -1
  534. package/dist/experimental/session-worker.js +0 -785
  535. package/dist/experimental/session-worker.js.map +0 -1
  536. package/dist/experimental/source-resolver.d.ts +0 -2
  537. package/dist/experimental/source-resolver.d.ts.map +0 -1
  538. package/dist/experimental/source-resolver.js +0 -71
  539. package/dist/experimental/source-resolver.js.map +0 -1
  540. package/dist/utils/clipboard-native.d.ts +0 -11
  541. package/dist/utils/clipboard-native.d.ts.map +0 -1
  542. package/dist/utils/clipboard-native.js +0 -20
  543. package/dist/utils/clipboard-native.js.map +0 -1
  544. package/examples/extensions/kimi-deferred-tools.ts +0 -61
@@ -1,300 +0,0 @@
1
- import { createRemoteServiceBinding, replicatedState, } from "@earendil-works/chord";
2
- import { BACKGROUND_CONTEXT } from "@earendil-works/chord/context";
3
- import { createClientServiceTransport } from "@earendil-works/pi-client";
4
- class RoutedServiceBinding {
5
- #services;
6
- #getBound;
7
- #onActivate;
8
- #remove;
9
- #activated = false;
10
- #activationComplete = false;
11
- constructor(options) {
12
- this.#services = createRemoteServiceBinding({
13
- services: options.services,
14
- transport: options.transport,
15
- bound: false,
16
- assertAccess: options.assertAccess,
17
- onError: options.onError,
18
- });
19
- this.#getBound = options.getBound;
20
- this.#onActivate = options.onActivate ?? (() => Promise.resolve());
21
- this.#remove = options.remove;
22
- }
23
- use(service) {
24
- return this.#services.use(service);
25
- }
26
- observe(service, handler) {
27
- return this.#services.observe(service, handler);
28
- }
29
- async ready(context) {
30
- if (!this.#activated) {
31
- this.#activated = true;
32
- await this.#services.rebind(this.#getBound(), context);
33
- }
34
- await this.serviceReady(context);
35
- if (!this.#activationComplete) {
36
- await this.#onActivate(context);
37
- this.#activationComplete = true;
38
- }
39
- }
40
- serviceReady(context) {
41
- return this.#services.ready(context);
42
- }
43
- updateBound(bound, context) {
44
- return this.#activated ? this.#services.rebind(bound, context) : Promise.resolve();
45
- }
46
- async dispose(context) {
47
- this.#remove();
48
- await this.#services.dispose(context);
49
- }
50
- }
51
- class ServerServiceSourceImpl {
52
- acceptsUnavailableServices = false;
53
- connection;
54
- #client;
55
- #transport;
56
- #bindings = new Set();
57
- #removeConnectionListener;
58
- #onError;
59
- #transition = Promise.resolve();
60
- #connectionAttempt;
61
- #disposed = false;
62
- constructor(client, options) {
63
- this.#client = client;
64
- this.#transport = createClientServiceTransport(client, () => ({ serverId: client.serverId }));
65
- this.#onError = options.onError ?? (() => { });
66
- this.#connectionAttempt = client.connectionState === "connecting" ? 1 : 0;
67
- const connectionState = replicatedState(toServerConnectionState(client, this.#connectionAttempt));
68
- this.connection = connectionState;
69
- this.#removeConnectionListener = client.onConnectionStateChange(({ state, error }) => {
70
- if (state === "connecting")
71
- this.#connectionAttempt += 1;
72
- publishReplacement(connectionState, toServerConnectionState(client, this.#connectionAttempt, error), BACKGROUND_CONTEXT);
73
- this.#transition = this.#transition
74
- .then(async () => {
75
- const results = await Promise.allSettled([...this.#bindings].map((binding) => binding.updateBound(state === "connected", BACKGROUND_CONTEXT)));
76
- const failures = results.filter((result) => result.status === "rejected");
77
- if (failures.length > 0)
78
- throw new AggregateError(failures.map(({ reason }) => reason));
79
- })
80
- .catch((transitionError) => this.#onError(toError(transitionError)));
81
- });
82
- }
83
- catalogue(context) {
84
- return this.#client.serviceCatalogue({ serverId: this.#client.serverId }, context.abortSignal);
85
- }
86
- open(options) {
87
- if (this.#disposed)
88
- throw new Error("Server service source is disposed");
89
- let binding;
90
- binding = new RoutedServiceBinding({
91
- services: options.services,
92
- transport: this.#transport,
93
- getBound: () => this.#client.connected,
94
- assertAccess: options.assertAccess,
95
- onError: options.onError,
96
- remove: () => this.#bindings.delete(binding),
97
- });
98
- this.#bindings.add(binding);
99
- return binding;
100
- }
101
- async dispose(context) {
102
- if (this.#disposed)
103
- return;
104
- this.#disposed = true;
105
- this.#removeConnectionListener();
106
- await this.#transition;
107
- const bindings = [...this.#bindings];
108
- this.#bindings.clear();
109
- const results = await Promise.allSettled(bindings.map((binding) => binding.dispose(context)));
110
- throwFailures(results, "Failed to dispose server service source");
111
- }
112
- }
113
- class SessionServiceSourceImpl {
114
- attachment;
115
- #client;
116
- #transport;
117
- #attachmentState;
118
- #bindings = new Set();
119
- #removeAttachmentListener;
120
- #onError;
121
- #transitions = new Set();
122
- #catalogue;
123
- #attachmentRevision = 0;
124
- #disposed = false;
125
- get acceptsUnavailableServices() {
126
- return this.#client.attachment === undefined && this.#catalogue === undefined;
127
- }
128
- constructor(client, options) {
129
- this.#client = client;
130
- this.#transport = createClientServiceTransport(client, () => client.attachment);
131
- this.#onError = options.onError ?? (() => { });
132
- this.#attachmentState = replicatedState(client.attachment === undefined
133
- ? { status: "detached" }
134
- : { status: "attaching", sessionId: client.attachment.sessionId });
135
- this.attachment = this.#attachmentState;
136
- this.#removeAttachmentListener = client.onAttachmentChange((attachment) => {
137
- const revision = ++this.#attachmentRevision;
138
- if (attachment !== undefined) {
139
- publishReplacement(this.#attachmentState, { status: "attaching", sessionId: attachment.sessionId }, BACKGROUND_CONTEXT);
140
- void this.#client.serviceCatalogue(attachment).then((catalogue) => {
141
- if (this.#attachmentRevision === revision && sameAttachment(this.#client.attachment, attachment)) {
142
- this.#catalogue = catalogue;
143
- }
144
- }, (error) => this.#onError(toError(error)));
145
- }
146
- const transition = this.#rebind(attachment !== undefined, BACKGROUND_CONTEXT);
147
- this.#transitions.add(transition);
148
- void transition.then(() => {
149
- this.#transitions.delete(transition);
150
- if (this.#attachmentRevision !== revision || !sameAttachment(this.#client.attachment, attachment))
151
- return;
152
- publishReplacement(this.#attachmentState, attachment === undefined
153
- ? { status: "detached" }
154
- : { status: "attached", sessionId: attachment.sessionId }, BACKGROUND_CONTEXT);
155
- }, (error) => {
156
- this.#transitions.delete(transition);
157
- if (this.#attachmentRevision !== revision || !sameAttachment(this.#client.attachment, attachment))
158
- return;
159
- publishReplacement(this.#attachmentState, attachment === undefined
160
- ? { status: "detached" }
161
- : { status: "degraded", sessionId: attachment.sessionId }, BACKGROUND_CONTEXT);
162
- this.#onError(toError(error));
163
- });
164
- });
165
- }
166
- async catalogue(context) {
167
- const target = this.#client.attachment;
168
- if (target === undefined)
169
- return this.#catalogue ?? [];
170
- const catalogue = await this.#client.serviceCatalogue(target, context.abortSignal);
171
- this.#catalogue = catalogue;
172
- return catalogue;
173
- }
174
- open(options) {
175
- if (this.#disposed)
176
- throw new Error("Session service source is disposed");
177
- let binding;
178
- binding = new RoutedServiceBinding({
179
- services: options.services,
180
- transport: this.#transport,
181
- getBound: () => this.#client.attachment !== undefined,
182
- onActivate: async (context) => {
183
- const attachment = this.#client.attachment;
184
- if (attachment === undefined)
185
- await this.#whenDetached(this.#attachmentRevision, context);
186
- else
187
- await this.#whenAttached(attachment, this.#attachmentRevision, context);
188
- },
189
- assertAccess: options.assertAccess,
190
- onError: options.onError,
191
- remove: () => this.#bindings.delete(binding),
192
- });
193
- this.#bindings.add(binding);
194
- return binding;
195
- }
196
- async whenAttached(sessionId, context) {
197
- const attachment = this.#client.attachment;
198
- if (attachment === undefined || attachment.sessionId !== sessionId) {
199
- throw new Error(`Session ${sessionId} is not the current attachment`);
200
- }
201
- await this.#whenAttached(attachment, this.#attachmentRevision, context);
202
- }
203
- async whenDetached(context) {
204
- if (this.#client.attachment !== undefined)
205
- throw new Error("A Session is still attached");
206
- await this.#whenDetached(this.#attachmentRevision, context);
207
- }
208
- async dispose(context) {
209
- if (this.#disposed)
210
- return;
211
- this.#disposed = true;
212
- this.#removeAttachmentListener();
213
- await Promise.allSettled(this.#transitions);
214
- const bindings = [...this.#bindings];
215
- this.#bindings.clear();
216
- const results = await Promise.allSettled(bindings.map((binding) => binding.dispose(context)));
217
- throwFailures(results, "Failed to dispose Session service source");
218
- }
219
- async #rebind(bound, context) {
220
- const results = await Promise.allSettled([...this.#bindings].map((binding) => binding.updateBound(bound, context)));
221
- throwFailures(results, "Failed to rebind Session services");
222
- }
223
- async #whenAttached(attachment, revision, context) {
224
- try {
225
- await Promise.all([...this.#bindings].map((binding) => binding.serviceReady(context)));
226
- }
227
- catch (error) {
228
- if (this.#attachmentRevision === revision && sameAttachment(this.#client.attachment, attachment)) {
229
- publishReplacement(this.#attachmentState, { status: "degraded", sessionId: attachment.sessionId }, context);
230
- }
231
- throw error;
232
- }
233
- if (this.#attachmentRevision !== revision || !sameAttachment(this.#client.attachment, attachment)) {
234
- throw new Error(`Session ${attachment.sessionId} was replaced while attaching`);
235
- }
236
- const state = this.#attachmentState.value;
237
- if (state.status !== "attached" || state.sessionId !== attachment.sessionId) {
238
- publishReplacement(this.#attachmentState, { status: "attached", sessionId: attachment.sessionId }, context);
239
- }
240
- }
241
- async #whenDetached(revision, context) {
242
- await Promise.all([...this.#bindings].map((binding) => binding.serviceReady(context)));
243
- if (this.#attachmentRevision !== revision || this.#client.attachment !== undefined) {
244
- throw new Error("The Session attachment changed while detaching");
245
- }
246
- if (this.#attachmentState.value.status !== "detached") {
247
- publishReplacement(this.#attachmentState, { status: "detached" }, context);
248
- }
249
- }
250
- }
251
- /** Create the server-scoped remote service source for one presentation client. */
252
- export function createServerServiceSource(client, options = {}) {
253
- return new ServerServiceSourceImpl(client, options);
254
- }
255
- /** Create the selected-Session remote service source for one presentation client. */
256
- export function createSessionServiceSource(client, options = {}) {
257
- return new SessionServiceSourceImpl(client, options);
258
- }
259
- function publishReplacement(state, value, context) {
260
- const target = state.state;
261
- const replacement = value;
262
- for (const key of Object.keys(target)) {
263
- if (!Object.hasOwn(replacement, key))
264
- delete target[key];
265
- }
266
- Object.assign(target, replacement);
267
- state.publish(context);
268
- }
269
- function toServerConnectionState(client, attempt, error) {
270
- const since = new Date().toISOString();
271
- switch (client.connectionState) {
272
- case "connecting":
273
- return { status: "connecting", attempt };
274
- case "connected":
275
- return { status: "connected", since };
276
- case "disconnected":
277
- return {
278
- status: "disconnected",
279
- since,
280
- reason: error?.message ?? "Client is disconnected",
281
- retryAt: null,
282
- };
283
- }
284
- }
285
- function sameAttachment(left, right) {
286
- if (left === undefined || right === undefined)
287
- return left === right;
288
- return (left.serverId === right.serverId && left.sessionId === right.sessionId && left.attachmentId === right.attachmentId);
289
- }
290
- function throwFailures(results, message) {
291
- const errors = results.flatMap((result) => (result.status === "rejected" ? [result.reason] : []));
292
- if (errors.length === 1)
293
- throw errors[0];
294
- if (errors.length > 1)
295
- throw new AggregateError(errors, message);
296
- }
297
- function toError(error) {
298
- return error instanceof Error ? error : new Error(String(error));
299
- }
300
- //# sourceMappingURL=connection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/experimental/services/connection.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Context,\n\tcreateRemoteServiceBinding,\n\ttype MutableReplicatedState,\n\ttype RemoteServiceBinding,\n\ttype RemoteServiceSource,\n\ttype RemoteServices,\n\ttype RemoteServiceTransport,\n\ttype ReplicatedState,\n\treplicatedState,\n\ttype Service,\n\ttype ServiceCatalogueEntry,\n} from \"@earendil-works/chord\";\nimport { BACKGROUND_CONTEXT } from \"@earendil-works/chord/context\";\nimport { type Client, createClientServiceTransport } from \"@earendil-works/pi-client\";\nimport type { SessionTarget } from \"@earendil-works/pi-protocol\";\n\nexport type ServerConnectionState =\n\t| { status: \"connecting\"; attempt: number }\n\t| { status: \"connected\"; since: string }\n\t| { status: \"disconnected\"; since: string; reason: string; retryAt: string | null };\n\nexport type SessionAttachmentState =\n\t| { status: \"detached\" }\n\t| { status: \"attaching\" | \"attached\" | \"degraded\"; sessionId: string };\n\nexport interface ServerServiceSource extends RemoteServiceSource {\n\treadonly connection: ReplicatedState<ServerConnectionState>;\n\tdispose(context: Context): Promise<void>;\n}\n\nexport interface SessionServiceSource extends RemoteServiceSource {\n\treadonly attachment: ReplicatedState<SessionAttachmentState>;\n\t/** Wait for the exact current attachment generation to finish hydrating. */\n\twhenAttached(sessionId: string, context: Context): Promise<void>;\n\t/** Wait for every binding to finish releasing the previous attachment. */\n\twhenDetached(context: Context): Promise<void>;\n\tdispose(context: Context): Promise<void>;\n}\n\nexport interface ServiceSourceOptions {\n\treadonly onError?: (error: Error) => void;\n}\n\nclass RoutedServiceBinding implements RemoteServices {\n\treadonly #services: RemoteServiceBinding;\n\treadonly #getBound: () => boolean;\n\treadonly #onActivate: (context: Context) => Promise<void>;\n\treadonly #remove: () => void;\n\t#activated = false;\n\t#activationComplete = false;\n\n\tconstructor(options: {\n\t\treadonly services: readonly { readonly id: string }[];\n\t\treadonly transport: RemoteServiceTransport;\n\t\treadonly getBound: () => boolean;\n\t\treadonly assertAccess: () => void;\n\t\treadonly onError: (error: Error) => void;\n\t\treadonly onActivate?: (context: Context) => Promise<void>;\n\t\treadonly remove: () => void;\n\t}) {\n\t\tthis.#services = createRemoteServiceBinding({\n\t\t\tservices: options.services,\n\t\t\ttransport: options.transport,\n\t\t\tbound: false,\n\t\t\tassertAccess: options.assertAccess,\n\t\t\tonError: options.onError,\n\t\t});\n\t\tthis.#getBound = options.getBound;\n\t\tthis.#onActivate = options.onActivate ?? (() => Promise.resolve());\n\t\tthis.#remove = options.remove;\n\t}\n\n\tuse<T>(service: Service<T>): T {\n\t\treturn this.#services.use(service);\n\t}\n\n\tobserve<T>(service: Service<T>, handler: (service: T, context: Context) => void | Promise<void>): () => void {\n\t\treturn this.#services.observe(service, handler);\n\t}\n\n\tasync ready(context: Context): Promise<void> {\n\t\tif (!this.#activated) {\n\t\t\tthis.#activated = true;\n\t\t\tawait this.#services.rebind(this.#getBound(), context);\n\t\t}\n\t\tawait this.serviceReady(context);\n\t\tif (!this.#activationComplete) {\n\t\t\tawait this.#onActivate(context);\n\t\t\tthis.#activationComplete = true;\n\t\t}\n\t}\n\n\tserviceReady(context: Context): Promise<void> {\n\t\treturn this.#services.ready(context);\n\t}\n\n\tupdateBound(bound: boolean, context: Context): Promise<void> {\n\t\treturn this.#activated ? this.#services.rebind(bound, context) : Promise.resolve();\n\t}\n\n\tasync dispose(context: Context): Promise<void> {\n\t\tthis.#remove();\n\t\tawait this.#services.dispose(context);\n\t}\n}\n\nclass ServerServiceSourceImpl implements ServerServiceSource {\n\treadonly acceptsUnavailableServices = false;\n\treadonly connection: ReplicatedState<ServerConnectionState>;\n\treadonly #client: Client;\n\treadonly #transport: RemoteServiceTransport;\n\treadonly #bindings = new Set<RoutedServiceBinding>();\n\treadonly #removeConnectionListener: () => void;\n\treadonly #onError: (error: Error) => void;\n\t#transition = Promise.resolve();\n\t#connectionAttempt: number;\n\t#disposed = false;\n\n\tconstructor(client: Client, options: ServiceSourceOptions) {\n\t\tthis.#client = client;\n\t\tthis.#transport = createClientServiceTransport(client, () => ({ serverId: client.serverId }));\n\t\tthis.#onError = options.onError ?? (() => {});\n\t\tthis.#connectionAttempt = client.connectionState === \"connecting\" ? 1 : 0;\n\t\tconst connectionState = replicatedState<ServerConnectionState>(\n\t\t\ttoServerConnectionState(client, this.#connectionAttempt),\n\t\t);\n\t\tthis.connection = connectionState;\n\t\tthis.#removeConnectionListener = client.onConnectionStateChange(({ state, error }) => {\n\t\t\tif (state === \"connecting\") this.#connectionAttempt += 1;\n\t\t\tpublishReplacement(\n\t\t\t\tconnectionState,\n\t\t\t\ttoServerConnectionState(client, this.#connectionAttempt, error),\n\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t);\n\t\t\tthis.#transition = this.#transition\n\t\t\t\t.then(async () => {\n\t\t\t\t\tconst results = await Promise.allSettled(\n\t\t\t\t\t\t[...this.#bindings].map((binding) => binding.updateBound(state === \"connected\", BACKGROUND_CONTEXT)),\n\t\t\t\t\t);\n\t\t\t\t\tconst failures = results.filter(\n\t\t\t\t\t\t(result): result is PromiseRejectedResult => result.status === \"rejected\",\n\t\t\t\t\t);\n\t\t\t\t\tif (failures.length > 0) throw new AggregateError(failures.map(({ reason }) => reason));\n\t\t\t\t})\n\t\t\t\t.catch((transitionError: unknown) => this.#onError(toError(transitionError)));\n\t\t});\n\t}\n\n\tcatalogue(context: Context) {\n\t\treturn this.#client.serviceCatalogue({ serverId: this.#client.serverId }, context.abortSignal);\n\t}\n\n\topen(options: {\n\t\treadonly services: readonly { readonly id: string }[];\n\t\tassertAccess(): void;\n\t\tonError(error: Error): void;\n\t}): RemoteServices {\n\t\tif (this.#disposed) throw new Error(\"Server service source is disposed\");\n\t\tlet binding!: RoutedServiceBinding;\n\t\tbinding = new RoutedServiceBinding({\n\t\t\tservices: options.services,\n\t\t\ttransport: this.#transport,\n\t\t\tgetBound: () => this.#client.connected,\n\t\t\tassertAccess: options.assertAccess,\n\t\t\tonError: options.onError,\n\t\t\tremove: () => this.#bindings.delete(binding),\n\t\t});\n\t\tthis.#bindings.add(binding);\n\t\treturn binding;\n\t}\n\n\tasync dispose(context: Context): Promise<void> {\n\t\tif (this.#disposed) return;\n\t\tthis.#disposed = true;\n\t\tthis.#removeConnectionListener();\n\t\tawait this.#transition;\n\t\tconst bindings = [...this.#bindings];\n\t\tthis.#bindings.clear();\n\t\tconst results = await Promise.allSettled(bindings.map((binding) => binding.dispose(context)));\n\t\tthrowFailures(results, \"Failed to dispose server service source\");\n\t}\n}\n\nclass SessionServiceSourceImpl implements SessionServiceSource {\n\treadonly attachment: ReplicatedState<SessionAttachmentState>;\n\treadonly #client: Client;\n\treadonly #transport: RemoteServiceTransport;\n\treadonly #attachmentState: MutableReplicatedState<SessionAttachmentState>;\n\treadonly #bindings = new Set<RoutedServiceBinding>();\n\treadonly #removeAttachmentListener: () => void;\n\treadonly #onError: (error: Error) => void;\n\treadonly #transitions = new Set<Promise<void>>();\n\t#catalogue: readonly ServiceCatalogueEntry[] | undefined;\n\t#attachmentRevision = 0;\n\t#disposed = false;\n\n\tget acceptsUnavailableServices(): boolean {\n\t\treturn this.#client.attachment === undefined && this.#catalogue === undefined;\n\t}\n\n\tconstructor(client: Client, options: ServiceSourceOptions) {\n\t\tthis.#client = client;\n\t\tthis.#transport = createClientServiceTransport(client, () => client.attachment);\n\t\tthis.#onError = options.onError ?? (() => {});\n\t\tthis.#attachmentState = replicatedState<SessionAttachmentState>(\n\t\t\tclient.attachment === undefined\n\t\t\t\t? { status: \"detached\" }\n\t\t\t\t: { status: \"attaching\", sessionId: client.attachment.sessionId },\n\t\t);\n\t\tthis.attachment = this.#attachmentState;\n\t\tthis.#removeAttachmentListener = client.onAttachmentChange((attachment) => {\n\t\t\tconst revision = ++this.#attachmentRevision;\n\t\t\tif (attachment !== undefined) {\n\t\t\t\tpublishReplacement(\n\t\t\t\t\tthis.#attachmentState,\n\t\t\t\t\t{ status: \"attaching\", sessionId: attachment.sessionId },\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\t\t\t\tvoid this.#client.serviceCatalogue(attachment).then(\n\t\t\t\t\t(catalogue) => {\n\t\t\t\t\t\tif (this.#attachmentRevision === revision && sameAttachment(this.#client.attachment, attachment)) {\n\t\t\t\t\t\t\tthis.#catalogue = catalogue;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t(error: unknown) => this.#onError(toError(error)),\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst transition = this.#rebind(attachment !== undefined, BACKGROUND_CONTEXT);\n\t\t\tthis.#transitions.add(transition);\n\t\t\tvoid transition.then(\n\t\t\t\t() => {\n\t\t\t\t\tthis.#transitions.delete(transition);\n\t\t\t\t\tif (this.#attachmentRevision !== revision || !sameAttachment(this.#client.attachment, attachment))\n\t\t\t\t\t\treturn;\n\t\t\t\t\tpublishReplacement(\n\t\t\t\t\t\tthis.#attachmentState,\n\t\t\t\t\t\tattachment === undefined\n\t\t\t\t\t\t\t? { status: \"detached\" }\n\t\t\t\t\t\t\t: { status: \"attached\", sessionId: attachment.sessionId },\n\t\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\t(error: unknown) => {\n\t\t\t\t\tthis.#transitions.delete(transition);\n\t\t\t\t\tif (this.#attachmentRevision !== revision || !sameAttachment(this.#client.attachment, attachment))\n\t\t\t\t\t\treturn;\n\t\t\t\t\tpublishReplacement(\n\t\t\t\t\t\tthis.#attachmentState,\n\t\t\t\t\t\tattachment === undefined\n\t\t\t\t\t\t\t? { status: \"detached\" }\n\t\t\t\t\t\t\t: { status: \"degraded\", sessionId: attachment.sessionId },\n\t\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t\t);\n\t\t\t\t\tthis.#onError(toError(error));\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t}\n\n\tasync catalogue(context: Context): Promise<readonly ServiceCatalogueEntry[]> {\n\t\tconst target = this.#client.attachment;\n\t\tif (target === undefined) return this.#catalogue ?? [];\n\t\tconst catalogue = await this.#client.serviceCatalogue(target, context.abortSignal);\n\t\tthis.#catalogue = catalogue;\n\t\treturn catalogue;\n\t}\n\n\topen(options: {\n\t\treadonly services: readonly { readonly id: string }[];\n\t\tassertAccess(): void;\n\t\tonError(error: Error): void;\n\t}): RemoteServices {\n\t\tif (this.#disposed) throw new Error(\"Session service source is disposed\");\n\t\tlet binding!: RoutedServiceBinding;\n\t\tbinding = new RoutedServiceBinding({\n\t\t\tservices: options.services,\n\t\t\ttransport: this.#transport,\n\t\t\tgetBound: () => this.#client.attachment !== undefined,\n\t\t\tonActivate: async (context) => {\n\t\t\t\tconst attachment = this.#client.attachment;\n\t\t\t\tif (attachment === undefined) await this.#whenDetached(this.#attachmentRevision, context);\n\t\t\t\telse await this.#whenAttached(attachment, this.#attachmentRevision, context);\n\t\t\t},\n\t\t\tassertAccess: options.assertAccess,\n\t\t\tonError: options.onError,\n\t\t\tremove: () => this.#bindings.delete(binding),\n\t\t});\n\t\tthis.#bindings.add(binding);\n\t\treturn binding;\n\t}\n\n\tasync whenAttached(sessionId: string, context: Context): Promise<void> {\n\t\tconst attachment = this.#client.attachment;\n\t\tif (attachment === undefined || attachment.sessionId !== sessionId) {\n\t\t\tthrow new Error(`Session ${sessionId} is not the current attachment`);\n\t\t}\n\t\tawait this.#whenAttached(attachment, this.#attachmentRevision, context);\n\t}\n\n\tasync whenDetached(context: Context): Promise<void> {\n\t\tif (this.#client.attachment !== undefined) throw new Error(\"A Session is still attached\");\n\t\tawait this.#whenDetached(this.#attachmentRevision, context);\n\t}\n\n\tasync dispose(context: Context): Promise<void> {\n\t\tif (this.#disposed) return;\n\t\tthis.#disposed = true;\n\t\tthis.#removeAttachmentListener();\n\t\tawait Promise.allSettled(this.#transitions);\n\t\tconst bindings = [...this.#bindings];\n\t\tthis.#bindings.clear();\n\t\tconst results = await Promise.allSettled(bindings.map((binding) => binding.dispose(context)));\n\t\tthrowFailures(results, \"Failed to dispose Session service source\");\n\t}\n\n\tasync #rebind(bound: boolean, context: Context): Promise<void> {\n\t\tconst results = await Promise.allSettled(\n\t\t\t[...this.#bindings].map((binding) => binding.updateBound(bound, context)),\n\t\t);\n\t\tthrowFailures(results, \"Failed to rebind Session services\");\n\t}\n\n\tasync #whenAttached(attachment: SessionTarget, revision: number, context: Context): Promise<void> {\n\t\ttry {\n\t\t\tawait Promise.all([...this.#bindings].map((binding) => binding.serviceReady(context)));\n\t\t} catch (error) {\n\t\t\tif (this.#attachmentRevision === revision && sameAttachment(this.#client.attachment, attachment)) {\n\t\t\t\tpublishReplacement(this.#attachmentState, { status: \"degraded\", sessionId: attachment.sessionId }, context);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t\tif (this.#attachmentRevision !== revision || !sameAttachment(this.#client.attachment, attachment)) {\n\t\t\tthrow new Error(`Session ${attachment.sessionId} was replaced while attaching`);\n\t\t}\n\t\tconst state = this.#attachmentState.value;\n\t\tif (state.status !== \"attached\" || state.sessionId !== attachment.sessionId) {\n\t\t\tpublishReplacement(this.#attachmentState, { status: \"attached\", sessionId: attachment.sessionId }, context);\n\t\t}\n\t}\n\n\tasync #whenDetached(revision: number, context: Context): Promise<void> {\n\t\tawait Promise.all([...this.#bindings].map((binding) => binding.serviceReady(context)));\n\t\tif (this.#attachmentRevision !== revision || this.#client.attachment !== undefined) {\n\t\t\tthrow new Error(\"The Session attachment changed while detaching\");\n\t\t}\n\t\tif (this.#attachmentState.value.status !== \"detached\") {\n\t\t\tpublishReplacement(this.#attachmentState, { status: \"detached\" }, context);\n\t\t}\n\t}\n}\n\n/** Create the server-scoped remote service source for one presentation client. */\nexport function createServerServiceSource(client: Client, options: ServiceSourceOptions = {}): ServerServiceSource {\n\treturn new ServerServiceSourceImpl(client, options);\n}\n\n/** Create the selected-Session remote service source for one presentation client. */\nexport function createSessionServiceSource(client: Client, options: ServiceSourceOptions = {}): SessionServiceSource {\n\treturn new SessionServiceSourceImpl(client, options);\n}\n\nfunction publishReplacement<T extends object>(state: MutableReplicatedState<T>, value: T, context: Context): void {\n\tconst target = state.state as Record<string, unknown>;\n\tconst replacement = value as Record<string, unknown>;\n\tfor (const key of Object.keys(target)) {\n\t\tif (!Object.hasOwn(replacement, key)) delete target[key];\n\t}\n\tObject.assign(target, replacement);\n\tstate.publish(context);\n}\n\nfunction toServerConnectionState(client: Client, attempt: number, error?: Error): ServerConnectionState {\n\tconst since = new Date().toISOString();\n\tswitch (client.connectionState) {\n\t\tcase \"connecting\":\n\t\t\treturn { status: \"connecting\", attempt };\n\t\tcase \"connected\":\n\t\t\treturn { status: \"connected\", since };\n\t\tcase \"disconnected\":\n\t\t\treturn {\n\t\t\t\tstatus: \"disconnected\",\n\t\t\t\tsince,\n\t\t\t\treason: error?.message ?? \"Client is disconnected\",\n\t\t\t\tretryAt: null,\n\t\t\t};\n\t}\n}\n\nfunction sameAttachment(left: SessionTarget | undefined, right: SessionTarget | undefined): boolean {\n\tif (left === undefined || right === undefined) return left === right;\n\treturn (\n\t\tleft.serverId === right.serverId && left.sessionId === right.sessionId && left.attachmentId === right.attachmentId\n\t);\n}\n\nfunction throwFailures(results: readonly PromiseSettledResult<unknown>[], message: string): void {\n\tconst errors = results.flatMap((result) => (result.status === \"rejected\" ? [result.reason] : []));\n\tif (errors.length === 1) throw errors[0];\n\tif (errors.length > 1) throw new AggregateError(errors, message);\n}\n\nfunction toError(error: unknown): Error {\n\treturn error instanceof Error ? error : new Error(String(error));\n}\n"]}
@@ -1,16 +0,0 @@
1
- import { type Context, type Facet, type MutableReplicatedState } from "@earendil-works/chord";
2
- import type { AgentLane } from "@earendil-works/pi-agent-core";
3
- import type { ModelRuntime } from "../../core/model-runtime.ts";
4
- import type { SettingsManager } from "../../core/settings-manager.ts";
5
- import { type Models as ModelsService, type ModelsState } from "./models.ts";
6
- export interface ModelsServiceRuntime {
7
- readonly service: ModelsService;
8
- activate(context: Context): Promise<void>;
9
- }
10
- export declare function createModelsService(lane: AgentLane, modelRuntime: ModelRuntime | undefined, settingsManager: SettingsManager | undefined, createState: (initial: ModelsState) => MutableReplicatedState<ModelsState>): ModelsServiceRuntime;
11
- export declare function createModelsServiceFacet(options: {
12
- readonly lane: AgentLane;
13
- readonly modelRuntime: ModelRuntime | undefined;
14
- readonly settingsManager?: SettingsManager;
15
- }): Facet;
16
- //# sourceMappingURL=models-provider.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"models-provider.d.ts","sourceRoot":"","sources":["../../../src/experimental/services/models-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAe,KAAK,KAAK,EAAE,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE3G,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,+BAA+B,CAAC;AAE9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAU,KAAK,MAAM,IAAI,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAErF,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAED,wBAAgB,mBAAmB,CAClC,IAAI,EAAE,SAAS,EACf,YAAY,EAAE,YAAY,GAAG,SAAS,EACtC,eAAe,EAAE,eAAe,GAAG,SAAS,EAC5C,WAAW,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,sBAAsB,CAAC,WAAW,CAAC,GACxE,oBAAoB,CAiGtB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IACjD,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,YAAY,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;CAC3C,GAAG,KAAK,CAcR","sourcesContent":["import { type Context, defineFacet, type Facet, type MutableReplicatedState } from \"@earendil-works/chord\";\nimport { BACKGROUND_CONTEXT } from \"@earendil-works/chord/context\";\nimport type { AgentLane, ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { getSupportedThinkingLevels } from \"@earendil-works/pi-ai\";\nimport type { ModelRuntime } from \"../../core/model-runtime.ts\";\nimport type { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { Models, type Models as ModelsService, type ModelsState } from \"./models.ts\";\n\nexport interface ModelsServiceRuntime {\n\treadonly service: ModelsService;\n\tactivate(context: Context): Promise<void>;\n}\n\nexport function createModelsService(\n\tlane: AgentLane,\n\tmodelRuntime: ModelRuntime | undefined,\n\tsettingsManager: SettingsManager | undefined,\n\tcreateState: (initial: ModelsState) => MutableReplicatedState<ModelsState>,\n): ModelsServiceRuntime {\n\tlet catalogRevision = 0;\n\tconst state = createState({\n\t\tcatalog: { revision: 0, availableModels: [] },\n\t\tconfiguration: { model: null, thinkingLevel: \"off\" },\n\t\trefresh: { status: \"idle\" },\n\t});\n\tconst readConfiguration = async (context: Context): Promise<ModelsState[\"configuration\"]> => {\n\t\tconst [selected, thinkingLevel] = await Promise.all([lane.getModel(context), lane.getThinkingLevel(context)]);\n\t\treturn {\n\t\t\tmodel: selected === undefined ? null : { provider: selected.provider, modelId: selected.id },\n\t\t\tthinkingLevel,\n\t\t};\n\t};\n\tconst readThinkingLevels = async (context: Context): Promise<ThinkingLevel[]> => {\n\t\tconst selected = await lane.getModel(context);\n\t\treturn selected === undefined ? [\"off\"] : getSupportedThinkingLevels(selected);\n\t};\n\tconst readCatalog = async (context: Context): Promise<ModelsState[\"catalog\"]> => {\n\t\tconst selected = await lane.getModel(context);\n\t\tconst available = modelRuntime?.getAvailableSnapshot() ?? [];\n\t\tconst catalog =\n\t\t\tselected === undefined || includesModel(available, selected) ? available : [...available, selected];\n\t\tcatalogRevision += 1;\n\t\treturn {\n\t\t\trevision: catalogRevision,\n\t\t\tavailableModels: catalog.map((model) => ({\n\t\t\t\tprovider: model.provider,\n\t\t\t\tmodelId: model.id,\n\t\t\t\tname: model.name,\n\t\t\t\treasoning: model.reasoning,\n\t\t\t})),\n\t\t};\n\t};\n\tconst service: ModelsService = {\n\t\tstate,\n\t\tasync cycleThinking(context) {\n\t\t\tconst levels = await readThinkingLevels(context);\n\t\t\tconst current = await lane.getThinkingLevel(context);\n\t\t\tconst index = levels.indexOf(current);\n\t\t\tconst next = levels[(index + 1) % levels.length] ?? \"off\";\n\t\t\tawait lane.setThinkingLevel(next, context);\n\t\t\tstate.state.configuration = await readConfiguration(context);\n\t\t\tstate.publish(context);\n\t\t},\n\t\tasync getThinkingLevels(context) {\n\t\t\treturn [...(await readThinkingLevels(context))];\n\t\t},\n\t\tasync refresh(context) {\n\t\t\tstate.state.refresh = { status: \"refreshing\" };\n\t\t\tstate.publish(context);\n\t\t\tconst refresh = modelRuntime?.refresh({ signal: context.abortSignal });\n\t\t\tif (refresh === undefined) {\n\t\t\t\tconst [catalog, configuration] = await Promise.all([readCatalog(context), readConfiguration(context)]);\n\t\t\t\tstate.state.catalog = catalog;\n\t\t\t\tstate.state.configuration = configuration;\n\t\t\t\tstate.state.refresh = { status: \"done\" };\n\t\t\t\tstate.publish(context);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst result = await refresh;\n\t\t\tconst errors = Object.fromEntries([...result.errors].map(([id, error]) => [id, error.message]));\n\t\t\tconst [catalog, configuration] = await Promise.all([readCatalog(context), readConfiguration(context)]);\n\t\t\tstate.state.catalog = catalog;\n\t\t\tstate.state.configuration = configuration;\n\t\t\tstate.state.refresh = Object.keys(errors).length === 0 ? { status: \"done\" } : { status: \"warning\", errors };\n\t\t\tstate.publish(context);\n\t\t},\n\t\tasync select(model, context) {\n\t\t\tconst selected = modelRuntime?.getModel(model.provider, model.modelId);\n\t\t\tif (selected === undefined) throw new Error(`Unknown model: ${model.provider}/${model.modelId}`);\n\t\t\tawait lane.setModel({ provider: selected.provider, modelId: selected.id }, context);\n\t\t\tsettingsManager?.setDefaultModelAndProvider(selected.provider, selected.id);\n\t\t\tawait settingsManager?.flush();\n\t\t\tstate.state.configuration = await readConfiguration(context);\n\t\t\tstate.publish(context);\n\t\t},\n\t\tasync selectThinking(level, context) {\n\t\t\tconst levels = await readThinkingLevels(context);\n\t\t\tif (!levels.includes(level)) {\n\t\t\t\tthrow new Error(`Thinking level ${level} is unavailable; choose one of: ${levels.join(\", \")}`);\n\t\t\t}\n\t\t\tawait lane.setThinkingLevel(level, context);\n\t\t\tstate.state.configuration = await readConfiguration(context);\n\t\t\tstate.publish(context);\n\t\t},\n\t};\n\treturn {\n\t\tservice,\n\t\tasync activate(context) {\n\t\t\tconst [catalog, configuration] = await Promise.all([readCatalog(context), readConfiguration(context)]);\n\t\t\tstate.state.catalog = catalog;\n\t\t\tstate.state.configuration = configuration;\n\t\t\tstate.state.refresh = { status: \"idle\" };\n\t\t\tstate.publish(context);\n\t\t},\n\t};\n}\n\nexport function createModelsServiceFacet(options: {\n\treadonly lane: AgentLane;\n\treadonly modelRuntime: ModelRuntime | undefined;\n\treadonly settingsManager?: SettingsManager;\n}): Facet {\n\treturn defineFacet({\n\t\tid: \"@pi/models\",\n\t\tsetup(env) {\n\t\t\tconst runtime = createModelsService(\n\t\t\t\toptions.lane,\n\t\t\t\toptions.modelRuntime,\n\t\t\t\toptions.settingsManager,\n\t\t\t\tenv.replicatedState,\n\t\t\t);\n\t\t\tenv.provide(Models, runtime.service);\n\t\t\tenv.onActivate(() => runtime.activate(BACKGROUND_CONTEXT));\n\t\t},\n\t});\n}\n\nfunction includesModel(\n\tmodels: readonly { readonly provider: string; readonly id: string }[],\n\tselected: { readonly provider: string; readonly id: string },\n): boolean {\n\treturn models.some((model) => model.provider === selected.provider && model.id === selected.id);\n}\n"]}
@@ -1,116 +0,0 @@
1
- import { defineFacet } from "@earendil-works/chord";
2
- import { BACKGROUND_CONTEXT } from "@earendil-works/chord/context";
3
- import { getSupportedThinkingLevels } from "@earendil-works/pi-ai";
4
- import { Models } from "./models.js";
5
- export function createModelsService(lane, modelRuntime, settingsManager, createState) {
6
- let catalogRevision = 0;
7
- const state = createState({
8
- catalog: { revision: 0, availableModels: [] },
9
- configuration: { model: null, thinkingLevel: "off" },
10
- refresh: { status: "idle" },
11
- });
12
- const readConfiguration = async (context) => {
13
- const [selected, thinkingLevel] = await Promise.all([lane.getModel(context), lane.getThinkingLevel(context)]);
14
- return {
15
- model: selected === undefined ? null : { provider: selected.provider, modelId: selected.id },
16
- thinkingLevel,
17
- };
18
- };
19
- const readThinkingLevels = async (context) => {
20
- const selected = await lane.getModel(context);
21
- return selected === undefined ? ["off"] : getSupportedThinkingLevels(selected);
22
- };
23
- const readCatalog = async (context) => {
24
- const selected = await lane.getModel(context);
25
- const available = modelRuntime?.getAvailableSnapshot() ?? [];
26
- const catalog = selected === undefined || includesModel(available, selected) ? available : [...available, selected];
27
- catalogRevision += 1;
28
- return {
29
- revision: catalogRevision,
30
- availableModels: catalog.map((model) => ({
31
- provider: model.provider,
32
- modelId: model.id,
33
- name: model.name,
34
- reasoning: model.reasoning,
35
- })),
36
- };
37
- };
38
- const service = {
39
- state,
40
- async cycleThinking(context) {
41
- const levels = await readThinkingLevels(context);
42
- const current = await lane.getThinkingLevel(context);
43
- const index = levels.indexOf(current);
44
- const next = levels[(index + 1) % levels.length] ?? "off";
45
- await lane.setThinkingLevel(next, context);
46
- state.state.configuration = await readConfiguration(context);
47
- state.publish(context);
48
- },
49
- async getThinkingLevels(context) {
50
- return [...(await readThinkingLevels(context))];
51
- },
52
- async refresh(context) {
53
- state.state.refresh = { status: "refreshing" };
54
- state.publish(context);
55
- const refresh = modelRuntime?.refresh({ signal: context.abortSignal });
56
- if (refresh === undefined) {
57
- const [catalog, configuration] = await Promise.all([readCatalog(context), readConfiguration(context)]);
58
- state.state.catalog = catalog;
59
- state.state.configuration = configuration;
60
- state.state.refresh = { status: "done" };
61
- state.publish(context);
62
- return;
63
- }
64
- const result = await refresh;
65
- const errors = Object.fromEntries([...result.errors].map(([id, error]) => [id, error.message]));
66
- const [catalog, configuration] = await Promise.all([readCatalog(context), readConfiguration(context)]);
67
- state.state.catalog = catalog;
68
- state.state.configuration = configuration;
69
- state.state.refresh = Object.keys(errors).length === 0 ? { status: "done" } : { status: "warning", errors };
70
- state.publish(context);
71
- },
72
- async select(model, context) {
73
- const selected = modelRuntime?.getModel(model.provider, model.modelId);
74
- if (selected === undefined)
75
- throw new Error(`Unknown model: ${model.provider}/${model.modelId}`);
76
- await lane.setModel({ provider: selected.provider, modelId: selected.id }, context);
77
- settingsManager?.setDefaultModelAndProvider(selected.provider, selected.id);
78
- await settingsManager?.flush();
79
- state.state.configuration = await readConfiguration(context);
80
- state.publish(context);
81
- },
82
- async selectThinking(level, context) {
83
- const levels = await readThinkingLevels(context);
84
- if (!levels.includes(level)) {
85
- throw new Error(`Thinking level ${level} is unavailable; choose one of: ${levels.join(", ")}`);
86
- }
87
- await lane.setThinkingLevel(level, context);
88
- state.state.configuration = await readConfiguration(context);
89
- state.publish(context);
90
- },
91
- };
92
- return {
93
- service,
94
- async activate(context) {
95
- const [catalog, configuration] = await Promise.all([readCatalog(context), readConfiguration(context)]);
96
- state.state.catalog = catalog;
97
- state.state.configuration = configuration;
98
- state.state.refresh = { status: "idle" };
99
- state.publish(context);
100
- },
101
- };
102
- }
103
- export function createModelsServiceFacet(options) {
104
- return defineFacet({
105
- id: "@pi/models",
106
- setup(env) {
107
- const runtime = createModelsService(options.lane, options.modelRuntime, options.settingsManager, env.replicatedState);
108
- env.provide(Models, runtime.service);
109
- env.onActivate(() => runtime.activate(BACKGROUND_CONTEXT));
110
- },
111
- });
112
- }
113
- function includesModel(models, selected) {
114
- return models.some((model) => model.provider === selected.provider && model.id === selected.id);
115
- }
116
- //# sourceMappingURL=models-provider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"models-provider.js","sourceRoot":"","sources":["../../../src/experimental/services/models-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Context, defineFacet, type Facet, type MutableReplicatedState } from \"@earendil-works/chord\";\nimport { BACKGROUND_CONTEXT } from \"@earendil-works/chord/context\";\nimport type { AgentLane, ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { getSupportedThinkingLevels } from \"@earendil-works/pi-ai\";\nimport type { ModelRuntime } from \"../../core/model-runtime.ts\";\nimport type { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { Models, type Models as ModelsService, type ModelsState } from \"./models.ts\";\n\nexport interface ModelsServiceRuntime {\n\treadonly service: ModelsService;\n\tactivate(context: Context): Promise<void>;\n}\n\nexport function createModelsService(\n\tlane: AgentLane,\n\tmodelRuntime: ModelRuntime | undefined,\n\tsettingsManager: SettingsManager | undefined,\n\tcreateState: (initial: ModelsState) => MutableReplicatedState<ModelsState>,\n): ModelsServiceRuntime {\n\tlet catalogRevision = 0;\n\tconst state = createState({\n\t\tcatalog: { revision: 0, availableModels: [] },\n\t\tconfiguration: { model: null, thinkingLevel: \"off\" },\n\t\trefresh: { status: \"idle\" },\n\t});\n\tconst readConfiguration = async (context: Context): Promise<ModelsState[\"configuration\"]> => {\n\t\tconst [selected, thinkingLevel] = await Promise.all([lane.getModel(context), lane.getThinkingLevel(context)]);\n\t\treturn {\n\t\t\tmodel: selected === undefined ? null : { provider: selected.provider, modelId: selected.id },\n\t\t\tthinkingLevel,\n\t\t};\n\t};\n\tconst readThinkingLevels = async (context: Context): Promise<ThinkingLevel[]> => {\n\t\tconst selected = await lane.getModel(context);\n\t\treturn selected === undefined ? [\"off\"] : getSupportedThinkingLevels(selected);\n\t};\n\tconst readCatalog = async (context: Context): Promise<ModelsState[\"catalog\"]> => {\n\t\tconst selected = await lane.getModel(context);\n\t\tconst available = modelRuntime?.getAvailableSnapshot() ?? [];\n\t\tconst catalog =\n\t\t\tselected === undefined || includesModel(available, selected) ? available : [...available, selected];\n\t\tcatalogRevision += 1;\n\t\treturn {\n\t\t\trevision: catalogRevision,\n\t\t\tavailableModels: catalog.map((model) => ({\n\t\t\t\tprovider: model.provider,\n\t\t\t\tmodelId: model.id,\n\t\t\t\tname: model.name,\n\t\t\t\treasoning: model.reasoning,\n\t\t\t})),\n\t\t};\n\t};\n\tconst service: ModelsService = {\n\t\tstate,\n\t\tasync cycleThinking(context) {\n\t\t\tconst levels = await readThinkingLevels(context);\n\t\t\tconst current = await lane.getThinkingLevel(context);\n\t\t\tconst index = levels.indexOf(current);\n\t\t\tconst next = levels[(index + 1) % levels.length] ?? \"off\";\n\t\t\tawait lane.setThinkingLevel(next, context);\n\t\t\tstate.state.configuration = await readConfiguration(context);\n\t\t\tstate.publish(context);\n\t\t},\n\t\tasync getThinkingLevels(context) {\n\t\t\treturn [...(await readThinkingLevels(context))];\n\t\t},\n\t\tasync refresh(context) {\n\t\t\tstate.state.refresh = { status: \"refreshing\" };\n\t\t\tstate.publish(context);\n\t\t\tconst refresh = modelRuntime?.refresh({ signal: context.abortSignal });\n\t\t\tif (refresh === undefined) {\n\t\t\t\tconst [catalog, configuration] = await Promise.all([readCatalog(context), readConfiguration(context)]);\n\t\t\t\tstate.state.catalog = catalog;\n\t\t\t\tstate.state.configuration = configuration;\n\t\t\t\tstate.state.refresh = { status: \"done\" };\n\t\t\t\tstate.publish(context);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst result = await refresh;\n\t\t\tconst errors = Object.fromEntries([...result.errors].map(([id, error]) => [id, error.message]));\n\t\t\tconst [catalog, configuration] = await Promise.all([readCatalog(context), readConfiguration(context)]);\n\t\t\tstate.state.catalog = catalog;\n\t\t\tstate.state.configuration = configuration;\n\t\t\tstate.state.refresh = Object.keys(errors).length === 0 ? { status: \"done\" } : { status: \"warning\", errors };\n\t\t\tstate.publish(context);\n\t\t},\n\t\tasync select(model, context) {\n\t\t\tconst selected = modelRuntime?.getModel(model.provider, model.modelId);\n\t\t\tif (selected === undefined) throw new Error(`Unknown model: ${model.provider}/${model.modelId}`);\n\t\t\tawait lane.setModel({ provider: selected.provider, modelId: selected.id }, context);\n\t\t\tsettingsManager?.setDefaultModelAndProvider(selected.provider, selected.id);\n\t\t\tawait settingsManager?.flush();\n\t\t\tstate.state.configuration = await readConfiguration(context);\n\t\t\tstate.publish(context);\n\t\t},\n\t\tasync selectThinking(level, context) {\n\t\t\tconst levels = await readThinkingLevels(context);\n\t\t\tif (!levels.includes(level)) {\n\t\t\t\tthrow new Error(`Thinking level ${level} is unavailable; choose one of: ${levels.join(\", \")}`);\n\t\t\t}\n\t\t\tawait lane.setThinkingLevel(level, context);\n\t\t\tstate.state.configuration = await readConfiguration(context);\n\t\t\tstate.publish(context);\n\t\t},\n\t};\n\treturn {\n\t\tservice,\n\t\tasync activate(context) {\n\t\t\tconst [catalog, configuration] = await Promise.all([readCatalog(context), readConfiguration(context)]);\n\t\t\tstate.state.catalog = catalog;\n\t\t\tstate.state.configuration = configuration;\n\t\t\tstate.state.refresh = { status: \"idle\" };\n\t\t\tstate.publish(context);\n\t\t},\n\t};\n}\n\nexport function createModelsServiceFacet(options: {\n\treadonly lane: AgentLane;\n\treadonly modelRuntime: ModelRuntime | undefined;\n\treadonly settingsManager?: SettingsManager;\n}): Facet {\n\treturn defineFacet({\n\t\tid: \"@pi/models\",\n\t\tsetup(env) {\n\t\t\tconst runtime = createModelsService(\n\t\t\t\toptions.lane,\n\t\t\t\toptions.modelRuntime,\n\t\t\t\toptions.settingsManager,\n\t\t\t\tenv.replicatedState,\n\t\t\t);\n\t\t\tenv.provide(Models, runtime.service);\n\t\t\tenv.onActivate(() => runtime.activate(BACKGROUND_CONTEXT));\n\t\t},\n\t});\n}\n\nfunction includesModel(\n\tmodels: readonly { readonly provider: string; readonly id: string }[],\n\tselected: { readonly provider: string; readonly id: string },\n): boolean {\n\treturn models.some((model) => model.provider === selected.provider && model.id === selected.id);\n}\n"]}
@@ -1,36 +0,0 @@
1
- import { type Context, type ReplicatedState } from "@earendil-works/chord";
2
- import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
3
- export interface ModelRef {
4
- provider: string;
5
- modelId: string;
6
- }
7
- export interface ModelSummary extends ModelRef {
8
- name: string;
9
- reasoning: boolean;
10
- }
11
- export interface ModelsState {
12
- catalog: {
13
- revision: number;
14
- availableModels: ModelSummary[];
15
- };
16
- configuration: {
17
- model: ModelRef | null;
18
- thinkingLevel: ThinkingLevel;
19
- };
20
- refresh: {
21
- status: "idle" | "refreshing" | "done";
22
- } | {
23
- status: "warning";
24
- errors: Record<string, string>;
25
- };
26
- }
27
- export interface Models {
28
- readonly state: ReplicatedState<ModelsState>;
29
- cycleThinking(context: Context): Promise<void>;
30
- getThinkingLevels(context: Context): Promise<ThinkingLevel[]>;
31
- refresh(context: Context): Promise<void>;
32
- select(model: ModelRef, context: Context): Promise<void>;
33
- selectThinking(level: ThinkingLevel, context: Context): Promise<void>;
34
- }
35
- export declare const Models: import("@earendil-works/chord").Service<Models>;
36
- //# sourceMappingURL=models.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../src/experimental/services/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,MAAM,WAAW,QAAQ;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,YAAY,EAAE,CAAC;KAChC,CAAC;IACF,aAAa,EAAE;QACd,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;QACvB,aAAa,EAAE,aAAa,CAAC;KAC7B,CAAC;IACF,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,MAAM,CAAA;KAAE,GAAG;QAAE,MAAM,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;CAC5G;AAED,MAAM,WAAW,MAAM;IACtB,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;IAC7C,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAC9D,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtE;AAED,eAAO,MAAM,MAAM,iDAAqC,CAAC","sourcesContent":["import { type Context, defineService, type ReplicatedState } from \"@earendil-works/chord\";\nimport type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\n\nexport interface ModelRef {\n\tprovider: string;\n\tmodelId: string;\n}\n\nexport interface ModelSummary extends ModelRef {\n\tname: string;\n\treasoning: boolean;\n}\n\nexport interface ModelsState {\n\tcatalog: {\n\t\trevision: number;\n\t\tavailableModels: ModelSummary[];\n\t};\n\tconfiguration: {\n\t\tmodel: ModelRef | null;\n\t\tthinkingLevel: ThinkingLevel;\n\t};\n\trefresh: { status: \"idle\" | \"refreshing\" | \"done\" } | { status: \"warning\"; errors: Record<string, string> };\n}\n\nexport interface Models {\n\treadonly state: ReplicatedState<ModelsState>;\n\tcycleThinking(context: Context): Promise<void>;\n\tgetThinkingLevels(context: Context): Promise<ThinkingLevel[]>;\n\trefresh(context: Context): Promise<void>;\n\tselect(model: ModelRef, context: Context): Promise<void>;\n\tselectThinking(level: ThinkingLevel, context: Context): Promise<void>;\n}\n\nexport const Models = defineService<Models>(\"pi.models\");\n"]}
@@ -1,3 +0,0 @@
1
- import { defineService } from "@earendil-works/chord";
2
- export const Models = defineService("pi.models");
3
- //# sourceMappingURL=models.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/experimental/services/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,aAAa,EAAwB,MAAM,uBAAuB,CAAC;AAkC1F,MAAM,CAAC,MAAM,MAAM,GAAG,aAAa,CAAS,WAAW,CAAC,CAAC","sourcesContent":["import { type Context, defineService, type ReplicatedState } from \"@earendil-works/chord\";\nimport type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\n\nexport interface ModelRef {\n\tprovider: string;\n\tmodelId: string;\n}\n\nexport interface ModelSummary extends ModelRef {\n\tname: string;\n\treasoning: boolean;\n}\n\nexport interface ModelsState {\n\tcatalog: {\n\t\trevision: number;\n\t\tavailableModels: ModelSummary[];\n\t};\n\tconfiguration: {\n\t\tmodel: ModelRef | null;\n\t\tthinkingLevel: ThinkingLevel;\n\t};\n\trefresh: { status: \"idle\" | \"refreshing\" | \"done\" } | { status: \"warning\"; errors: Record<string, string> };\n}\n\nexport interface Models {\n\treadonly state: ReplicatedState<ModelsState>;\n\tcycleThinking(context: Context): Promise<void>;\n\tgetThinkingLevels(context: Context): Promise<ThinkingLevel[]>;\n\trefresh(context: Context): Promise<void>;\n\tselect(model: ModelRef, context: Context): Promise<void>;\n\tselectThinking(level: ThinkingLevel, context: Context): Promise<void>;\n}\n\nexport const Models = defineService<Models>(\"pi.models\");\n"]}
@@ -1,16 +0,0 @@
1
- import { type Context, type JsonValue } from "@earendil-works/chord";
2
- /** Server-built plugin generations available to presentations. */
3
- export interface PresentationPlugins {
4
- prepareSession(request: {
5
- readonly sessionId: string;
6
- readonly packagePaths: readonly string[] | null;
7
- }, context: Context): Promise<JsonValue>;
8
- reload(context: Context): Promise<JsonValue>;
9
- }
10
- export declare const PresentationPlugins: import("@earendil-works/chord").Service<PresentationPlugins>;
11
- /** Plugin facets hosted in the currently attached Session worker. */
12
- export interface SessionPlugins {
13
- reload(context: Context): Promise<void>;
14
- }
15
- export declare const SessionPlugins: import("@earendil-works/chord").Service<SessionPlugins>;
16
- //# sourceMappingURL=plugins.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../../src/experimental/services/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEpF,kEAAkE;AAClE,MAAM,WAAW,mBAAmB;IACnC,cAAc,CACb,OAAO,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;KAAE,EACxF,OAAO,EAAE,OAAO,GACd,OAAO,CAAC,SAAS,CAAC,CAAC;IACtB,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;CAC7C;AAED,eAAO,MAAM,mBAAmB,8DAAgE,CAAC;AAEjG,qEAAqE;AACrE,MAAM,WAAW,cAAc;IAC9B,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC;AAED,eAAO,MAAM,cAAc,yDAAsD,CAAC","sourcesContent":["import { type Context, defineService, type JsonValue } from \"@earendil-works/chord\";\n\n/** Server-built plugin generations available to presentations. */\nexport interface PresentationPlugins {\n\tprepareSession(\n\t\trequest: { readonly sessionId: string; readonly packagePaths: readonly string[] | null },\n\t\tcontext: Context,\n\t): Promise<JsonValue>;\n\treload(context: Context): Promise<JsonValue>;\n}\n\nexport const PresentationPlugins = defineService<PresentationPlugins>(\"pi.presentation-plugins\");\n\n/** Plugin facets hosted in the currently attached Session worker. */\nexport interface SessionPlugins {\n\treload(context: Context): Promise<void>;\n}\n\nexport const SessionPlugins = defineService<SessionPlugins>(\"pi.session-plugins\");\n"]}
@@ -1,4 +0,0 @@
1
- import { defineService } from "@earendil-works/chord";
2
- export const PresentationPlugins = defineService("pi.presentation-plugins");
3
- export const SessionPlugins = defineService("pi.session-plugins");
4
- //# sourceMappingURL=plugins.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../../src/experimental/services/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,aAAa,EAAkB,MAAM,uBAAuB,CAAC;AAWpF,MAAM,CAAC,MAAM,mBAAmB,GAAG,aAAa,CAAsB,yBAAyB,CAAC,CAAC;AAOjG,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAiB,oBAAoB,CAAC,CAAC","sourcesContent":["import { type Context, defineService, type JsonValue } from \"@earendil-works/chord\";\n\n/** Server-built plugin generations available to presentations. */\nexport interface PresentationPlugins {\n\tprepareSession(\n\t\trequest: { readonly sessionId: string; readonly packagePaths: readonly string[] | null },\n\t\tcontext: Context,\n\t): Promise<JsonValue>;\n\treload(context: Context): Promise<JsonValue>;\n}\n\nexport const PresentationPlugins = defineService<PresentationPlugins>(\"pi.presentation-plugins\");\n\n/** Plugin facets hosted in the currently attached Session worker. */\nexport interface SessionPlugins {\n\treload(context: Context): Promise<void>;\n}\n\nexport const SessionPlugins = defineService<SessionPlugins>(\"pi.session-plugins\");\n"]}