@earendil-works/pi-coding-agent 0.84.4 → 0.85.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 (486) hide show
  1. package/CHANGELOG.md +57 -5
  2. package/README.md +3 -1
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js +10 -7
  5. package/dist/bun/cli.js.map +1 -1
  6. package/dist/bun/runtime-setup.d.ts +2 -0
  7. package/dist/bun/runtime-setup.d.ts.map +1 -0
  8. package/dist/bun/runtime-setup.js +9 -0
  9. package/dist/bun/runtime-setup.js.map +1 -0
  10. package/dist/bundle/chunks/anthropic-messages-QAQLEQIY.js +6 -0
  11. package/dist/bundle/chunks/{azure-openai-responses-5ENVCQ7U.js → azure-openai-responses-Q7MJBRE6.js} +1 -1
  12. package/dist/bundle/chunks/bedrock-converse-stream.js +1 -1
  13. package/dist/bundle/chunks/chunk-7ZC4UXSL.js +2 -0
  14. package/dist/bundle/chunks/chunk-EQ6DR6XK.js +5 -0
  15. package/dist/bundle/chunks/{chunk-MNAIPA3J.js → chunk-IDDQWTHI.js} +1 -1
  16. package/dist/bundle/chunks/chunk-LZKJTKCT.js +2 -0
  17. package/dist/bundle/chunks/{chunk-NBBFIJUL.js → chunk-OUXLLA64.js} +2 -2
  18. package/dist/bundle/chunks/chunk-R7UUJ4C2.js +42 -0
  19. package/dist/bundle/chunks/chunk-USJZMAIR.js +2 -0
  20. package/dist/bundle/chunks/chunk-WBE4J4AU.js +9 -0
  21. package/dist/bundle/chunks/chunk-WZB2R5YO.js +1558 -0
  22. package/dist/bundle/chunks/github-copilot.js +1 -1
  23. package/dist/bundle/chunks/{google-generative-ai-YMUPJBKR.js → google-generative-ai-BSMTYDAM.js} +1 -1
  24. package/dist/bundle/chunks/{google-vertex-MPWMV4OF.js → google-vertex-5C3HASOJ.js} +1 -1
  25. package/dist/bundle/chunks/image-resize-worker.js +1 -1
  26. package/dist/bundle/chunks/{mistral-conversations-Q3AWZJAZ.js → mistral-conversations-4M6BZBX6.js} +1 -1
  27. package/dist/bundle/chunks/node-EM5FIVUN.js +16 -0
  28. package/dist/bundle/chunks/node-TWVVAGPO.js +2 -0
  29. package/dist/bundle/chunks/openai-codex-responses-YJOO52RW.js +10 -0
  30. package/dist/bundle/chunks/{openai-completions-ERMU2SS7.js → openai-completions-QOT3QX7D.js} +3 -3
  31. package/dist/bundle/chunks/openai-responses-U7LNPQN4.js +2 -0
  32. package/dist/bundle/chunks/{pi-messages-TPFH44NP.js → pi-messages-EGZIFQGG.js} +1 -1
  33. package/dist/bundle/cli.js +1 -1
  34. package/dist/bundle/client.js +1 -1
  35. package/dist/bundle/coordinator.js +3 -0
  36. package/dist/bundle/index.js +1 -1
  37. package/dist/bundle/rpc-entry.js +1 -1
  38. package/dist/cli/args.d.ts.map +1 -1
  39. package/dist/cli/args.js +2 -0
  40. package/dist/cli/args.js.map +1 -1
  41. package/dist/cli/config-selector.d.ts.map +1 -1
  42. package/dist/cli/config-selector.js +2 -1
  43. package/dist/cli/config-selector.js.map +1 -1
  44. package/dist/cli/experimental/cli.d.ts +7 -3
  45. package/dist/cli/experimental/cli.d.ts.map +1 -1
  46. package/dist/cli/experimental/cli.js +6 -2
  47. package/dist/cli/experimental/cli.js.map +1 -1
  48. package/dist/cli/experimental/command-options.d.ts +23 -12
  49. package/dist/cli/experimental/command-options.d.ts.map +1 -1
  50. package/dist/cli/experimental/command-options.js +69 -20
  51. package/dist/cli/experimental/command-options.js.map +1 -1
  52. package/dist/cli/experimental/command.d.ts +10 -3
  53. package/dist/cli/experimental/command.d.ts.map +1 -1
  54. package/dist/cli/experimental/command.js +28 -14
  55. package/dist/cli/experimental/command.js.map +1 -1
  56. package/dist/cli/experimental/commands/client.d.ts +8 -2
  57. package/dist/cli/experimental/commands/client.d.ts.map +1 -1
  58. package/dist/cli/experimental/commands/client.js +43 -5
  59. package/dist/cli/experimental/commands/client.js.map +1 -1
  60. package/dist/cli/experimental/commands/server.d.ts +7 -3
  61. package/dist/cli/experimental/commands/server.d.ts.map +1 -1
  62. package/dist/cli/experimental/commands/server.js +27 -8
  63. package/dist/cli/experimental/commands/server.js.map +1 -1
  64. package/dist/cli.d.ts.map +1 -1
  65. package/dist/cli.js +23 -14
  66. package/dist/cli.js.map +1 -1
  67. package/dist/client/index.d.ts +1 -2
  68. package/dist/client/index.d.ts.map +1 -1
  69. package/dist/client/index.js +1 -2
  70. package/dist/client/index.js.map +1 -1
  71. package/dist/config.d.ts +1 -0
  72. package/dist/config.d.ts.map +1 -1
  73. package/dist/config.js +1 -0
  74. package/dist/config.js.map +1 -1
  75. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  76. package/dist/core/agent-session-runtime.js +15 -7
  77. package/dist/core/agent-session-runtime.js.map +1 -1
  78. package/dist/core/agent-session.d.ts +2 -6
  79. package/dist/core/agent-session.d.ts.map +1 -1
  80. package/dist/core/agent-session.js +14 -6
  81. package/dist/core/agent-session.js.map +1 -1
  82. package/dist/core/compaction/branch-summarization.d.ts +1 -1
  83. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  84. package/dist/core/compaction/branch-summarization.js +2 -1
  85. package/dist/core/compaction/branch-summarization.js.map +1 -1
  86. package/dist/core/extensions/loader.d.ts.map +1 -1
  87. package/dist/core/extensions/loader.js +1 -2
  88. package/dist/core/extensions/loader.js.map +1 -1
  89. package/dist/core/extensions/types.d.ts +8 -2
  90. package/dist/core/extensions/types.d.ts.map +1 -1
  91. package/dist/core/extensions/types.js.map +1 -1
  92. package/dist/core/http-dispatcher.d.ts.map +1 -1
  93. package/dist/core/http-dispatcher.js +2 -0
  94. package/dist/core/http-dispatcher.js.map +1 -1
  95. package/dist/core/messages.d.ts +1 -1
  96. package/dist/core/messages.d.ts.map +1 -1
  97. package/dist/core/messages.js.map +1 -1
  98. package/dist/core/model-config.d.ts +15 -0
  99. package/dist/core/model-config.d.ts.map +1 -1
  100. package/dist/core/model-config.js +3 -0
  101. package/dist/core/model-config.js.map +1 -1
  102. package/dist/core/model-runtime.d.ts +1 -0
  103. package/dist/core/model-runtime.d.ts.map +1 -1
  104. package/dist/core/model-runtime.js +5 -2
  105. package/dist/core/model-runtime.js.map +1 -1
  106. package/dist/core/provider-composer.d.ts.map +1 -1
  107. package/dist/core/provider-composer.js +8 -2
  108. package/dist/core/provider-composer.js.map +1 -1
  109. package/dist/core/session-manager.d.ts +3 -2
  110. package/dist/core/session-manager.d.ts.map +1 -1
  111. package/dist/core/session-manager.js +40 -13
  112. package/dist/core/session-manager.js.map +1 -1
  113. package/dist/core/settings-manager.d.ts.map +1 -1
  114. package/dist/core/settings-manager.js.map +1 -1
  115. package/dist/core/skills.d.ts +1 -1
  116. package/dist/core/skills.d.ts.map +1 -1
  117. package/dist/core/skills.js +4 -2
  118. package/dist/core/skills.js.map +1 -1
  119. package/dist/core/system-prompt.d.ts.map +1 -1
  120. package/dist/core/system-prompt.js +8 -9
  121. package/dist/core/system-prompt.js.map +1 -1
  122. package/dist/core/tools/bash.d.ts.map +1 -1
  123. package/dist/core/tools/bash.js +3 -117
  124. package/dist/core/tools/bash.js.map +1 -1
  125. package/dist/core/tools/edit.d.ts +1 -12
  126. package/dist/core/tools/edit.d.ts.map +1 -1
  127. package/dist/core/tools/edit.js +5 -163
  128. package/dist/core/tools/edit.js.map +1 -1
  129. package/dist/core/tools/find.d.ts.map +1 -1
  130. package/dist/core/tools/find.js +4 -55
  131. package/dist/core/tools/find.js.map +1 -1
  132. package/dist/core/tools/grep.d.ts.map +1 -1
  133. package/dist/core/tools/grep.js +4 -60
  134. package/dist/core/tools/grep.js.map +1 -1
  135. package/dist/core/tools/ls.d.ts.map +1 -1
  136. package/dist/core/tools/ls.js +4 -49
  137. package/dist/core/tools/ls.js.map +1 -1
  138. package/dist/core/tools/read.d.ts.map +1 -1
  139. package/dist/core/tools/read.js +4 -120
  140. package/dist/core/tools/read.js.map +1 -1
  141. package/dist/core/tools/renderers/bash.d.ts +12 -0
  142. package/dist/core/tools/renderers/bash.d.ts.map +1 -0
  143. package/dist/core/tools/renderers/bash.js +130 -0
  144. package/dist/core/tools/renderers/bash.js.map +1 -0
  145. package/dist/core/tools/renderers/edit.d.ts +23 -0
  146. package/dist/core/tools/renderers/edit.d.ts.map +1 -0
  147. package/dist/core/tools/renderers/edit.js +167 -0
  148. package/dist/core/tools/renderers/edit.js.map +1 -0
  149. package/dist/core/tools/renderers/find.d.ts +10 -0
  150. package/dist/core/tools/renderers/find.d.ts.map +1 -0
  151. package/dist/core/tools/renderers/find.js +64 -0
  152. package/dist/core/tools/renderers/find.js.map +1 -0
  153. package/dist/core/tools/renderers/grep.d.ts +10 -0
  154. package/dist/core/tools/renderers/grep.d.ts.map +1 -0
  155. package/dist/core/tools/renderers/grep.js +69 -0
  156. package/dist/core/tools/renderers/grep.js.map +1 -0
  157. package/dist/core/tools/renderers/index.d.ts +28 -0
  158. package/dist/core/tools/renderers/index.d.ts.map +1 -0
  159. package/dist/core/tools/renderers/index.js +47 -0
  160. package/dist/core/tools/renderers/index.js.map +1 -0
  161. package/dist/core/tools/renderers/ls.d.ts +10 -0
  162. package/dist/core/tools/renderers/ls.d.ts.map +1 -0
  163. package/dist/core/tools/renderers/ls.js +58 -0
  164. package/dist/core/tools/renderers/ls.js.map +1 -0
  165. package/dist/core/tools/renderers/read.d.ts +11 -0
  166. package/dist/core/tools/renderers/read.d.ts.map +1 -0
  167. package/dist/core/tools/renderers/read.js +129 -0
  168. package/dist/core/tools/renderers/read.js.map +1 -0
  169. package/dist/core/tools/renderers/write.d.ts +10 -0
  170. package/dist/core/tools/renderers/write.d.ts.map +1 -0
  171. package/dist/core/tools/renderers/write.js +153 -0
  172. package/dist/core/tools/renderers/write.js.map +1 -0
  173. package/dist/core/tools/write.d.ts.map +1 -1
  174. package/dist/core/tools/write.js +5 -146
  175. package/dist/core/tools/write.js.map +1 -1
  176. package/dist/experimental/client-runtime.d.ts +43 -0
  177. package/dist/experimental/client-runtime.d.ts.map +1 -0
  178. package/dist/experimental/client-runtime.js +183 -0
  179. package/dist/experimental/client-runtime.js.map +1 -0
  180. package/dist/experimental/client-tui-chat.d.ts +14 -0
  181. package/dist/experimental/client-tui-chat.d.ts.map +1 -0
  182. package/dist/experimental/client-tui-chat.js +171 -0
  183. package/dist/experimental/client-tui-chat.js.map +1 -0
  184. package/dist/experimental/client-tui.d.ts +37 -0
  185. package/dist/experimental/client-tui.d.ts.map +1 -0
  186. package/dist/experimental/client-tui.js +702 -0
  187. package/dist/experimental/client-tui.js.map +1 -0
  188. package/dist/experimental/client.d.ts +25 -0
  189. package/dist/experimental/client.d.ts.map +1 -0
  190. package/dist/experimental/client.js +99 -0
  191. package/dist/experimental/client.js.map +1 -0
  192. package/dist/experimental/coordinator-entry.d.ts +3 -0
  193. package/dist/experimental/coordinator-entry.d.ts.map +1 -0
  194. package/dist/experimental/coordinator-entry.js +11 -0
  195. package/dist/experimental/coordinator-entry.js.map +1 -0
  196. package/dist/experimental/coordinator.d.ts +38 -0
  197. package/dist/experimental/coordinator.d.ts.map +1 -0
  198. package/dist/experimental/coordinator.js +570 -0
  199. package/dist/experimental/coordinator.js.map +1 -0
  200. package/dist/experimental/mini/main.d.ts +7 -0
  201. package/dist/experimental/mini/main.d.ts.map +1 -0
  202. package/dist/experimental/mini/main.js +21 -0
  203. package/dist/experimental/mini/main.js.map +1 -0
  204. package/dist/experimental/mini/server/entry.d.ts +3 -0
  205. package/dist/experimental/mini/server/entry.d.ts.map +1 -0
  206. package/dist/experimental/mini/server/entry.js +11 -0
  207. package/dist/experimental/mini/server/entry.js.map +1 -0
  208. package/dist/experimental/mini/server/run.d.ts +13 -0
  209. package/dist/experimental/mini/server/run.d.ts.map +1 -0
  210. package/dist/experimental/mini/server/run.js +150 -0
  211. package/dist/experimental/mini/server/run.js.map +1 -0
  212. package/dist/experimental/mini/shared/protocol.d.ts +127 -0
  213. package/dist/experimental/mini/shared/protocol.d.ts.map +1 -0
  214. package/dist/experimental/mini/shared/protocol.js +13 -0
  215. package/dist/experimental/mini/shared/protocol.js.map +1 -0
  216. package/dist/experimental/mini/shared/rpc.d.ts +49 -0
  217. package/dist/experimental/mini/shared/rpc.d.ts.map +1 -0
  218. package/dist/experimental/mini/shared/rpc.js +171 -0
  219. package/dist/experimental/mini/shared/rpc.js.map +1 -0
  220. package/dist/experimental/mini/shared/transport.d.ts +35 -0
  221. package/dist/experimental/mini/shared/transport.d.ts.map +1 -0
  222. package/dist/experimental/mini/shared/transport.js +94 -0
  223. package/dist/experimental/mini/shared/transport.js.map +1 -0
  224. package/dist/experimental/mini/tui/run.d.ts +9 -0
  225. package/dist/experimental/mini/tui/run.d.ts.map +1 -0
  226. package/dist/experimental/mini/tui/run.js +62 -0
  227. package/dist/experimental/mini/tui/run.js.map +1 -0
  228. package/dist/experimental/mini/tui/session.d.ts +26 -0
  229. package/dist/experimental/mini/tui/session.d.ts.map +1 -0
  230. package/dist/experimental/mini/tui/session.js +94 -0
  231. package/dist/experimental/mini/tui/session.js.map +1 -0
  232. package/dist/experimental/mini/tui/view.d.ts +10 -0
  233. package/dist/experimental/mini/tui/view.d.ts.map +1 -0
  234. package/dist/experimental/mini/tui/view.js +459 -0
  235. package/dist/experimental/mini/tui/view.js.map +1 -0
  236. package/dist/experimental/mini/worker/entry.d.ts +3 -0
  237. package/dist/experimental/mini/worker/entry.d.ts.map +1 -0
  238. package/dist/experimental/mini/worker/entry.js +10 -0
  239. package/dist/experimental/mini/worker/entry.js.map +1 -0
  240. package/dist/experimental/mini/worker/lane-service.d.ts +44 -0
  241. package/dist/experimental/mini/worker/lane-service.d.ts.map +1 -0
  242. package/dist/experimental/mini/worker/lane-service.js +97 -0
  243. package/dist/experimental/mini/worker/lane-service.js.map +1 -0
  244. package/dist/experimental/mini/worker/models-service.d.ts +19 -0
  245. package/dist/experimental/mini/worker/models-service.d.ts.map +1 -0
  246. package/dist/experimental/mini/worker/models-service.js +136 -0
  247. package/dist/experimental/mini/worker/models-service.js.map +1 -0
  248. package/dist/experimental/mini/worker/run.d.ts +14 -0
  249. package/dist/experimental/mini/worker/run.d.ts.map +1 -0
  250. package/dist/experimental/mini/worker/run.js +88 -0
  251. package/dist/experimental/mini/worker/run.js.map +1 -0
  252. package/dist/experimental/plugin.d.ts +4 -0
  253. package/dist/experimental/plugin.d.ts.map +1 -0
  254. package/dist/experimental/plugin.js +4 -0
  255. package/dist/experimental/plugin.js.map +1 -0
  256. package/dist/experimental/plugins/bundled.d.ts +7 -0
  257. package/dist/experimental/plugins/bundled.d.ts.map +1 -0
  258. package/dist/experimental/plugins/bundled.js +48 -0
  259. package/dist/experimental/plugins/bundled.js.map +1 -0
  260. package/dist/experimental/plugins/package.d.ts +18 -0
  261. package/dist/experimental/plugins/package.d.ts.map +1 -0
  262. package/dist/experimental/plugins/package.js +113 -0
  263. package/dist/experimental/plugins/package.js.map +1 -0
  264. package/dist/experimental/process.d.ts +20 -0
  265. package/dist/experimental/process.d.ts.map +1 -0
  266. package/dist/experimental/process.js +85 -0
  267. package/dist/experimental/process.js.map +1 -0
  268. package/dist/experimental/radius-auth.d.ts +17 -0
  269. package/dist/experimental/radius-auth.d.ts.map +1 -0
  270. package/dist/experimental/radius-auth.js +52 -0
  271. package/dist/experimental/radius-auth.js.map +1 -0
  272. package/dist/experimental/radius-relay.d.ts +90 -0
  273. package/dist/experimental/radius-relay.d.ts.map +1 -0
  274. package/dist/experimental/radius-relay.js +582 -0
  275. package/dist/experimental/radius-relay.js.map +1 -0
  276. package/dist/experimental/server.d.ts +75 -0
  277. package/dist/experimental/server.d.ts.map +1 -0
  278. package/dist/experimental/server.js +682 -0
  279. package/dist/experimental/server.js.map +1 -0
  280. package/dist/experimental/services/agent-controller-provider.d.ts +4 -0
  281. package/dist/experimental/services/agent-controller-provider.d.ts.map +1 -0
  282. package/dist/experimental/services/agent-controller-provider.js +84 -0
  283. package/dist/experimental/services/agent-controller-provider.js.map +1 -0
  284. package/dist/experimental/services/agent-controller.d.ts +57 -0
  285. package/dist/experimental/services/agent-controller.d.ts.map +1 -0
  286. package/dist/experimental/services/agent-controller.js +3 -0
  287. package/dist/experimental/services/agent-controller.js.map +1 -0
  288. package/dist/experimental/services/connection.d.ts +40 -0
  289. package/dist/experimental/services/connection.d.ts.map +1 -0
  290. package/dist/experimental/services/connection.js +300 -0
  291. package/dist/experimental/services/connection.js.map +1 -0
  292. package/dist/experimental/services/models-provider.d.ts +16 -0
  293. package/dist/experimental/services/models-provider.d.ts.map +1 -0
  294. package/dist/experimental/services/models-provider.js +116 -0
  295. package/dist/experimental/services/models-provider.js.map +1 -0
  296. package/dist/experimental/services/models.d.ts +36 -0
  297. package/dist/experimental/services/models.d.ts.map +1 -0
  298. package/dist/experimental/services/models.js +3 -0
  299. package/dist/experimental/services/models.js.map +1 -0
  300. package/dist/experimental/services/plugins.d.ts +16 -0
  301. package/dist/experimental/services/plugins.d.ts.map +1 -0
  302. package/dist/experimental/services/plugins.js +4 -0
  303. package/dist/experimental/services/plugins.js.map +1 -0
  304. package/dist/experimental/services/presentation-ui.d.ts +13 -0
  305. package/dist/experimental/services/presentation-ui.d.ts.map +1 -0
  306. package/dist/experimental/services/presentation-ui.js +3 -0
  307. package/dist/experimental/services/presentation-ui.js.map +1 -0
  308. package/dist/experimental/services/server.d.ts +19 -0
  309. package/dist/experimental/services/server.d.ts.map +1 -0
  310. package/dist/experimental/services/server.js +104 -0
  311. package/dist/experimental/services/server.js.map +1 -0
  312. package/dist/experimental/services/sessions.d.ts +28 -0
  313. package/dist/experimental/services/sessions.d.ts.map +1 -0
  314. package/dist/experimental/services/sessions.js +4 -0
  315. package/dist/experimental/services/sessions.js.map +1 -0
  316. package/dist/experimental/services/slash-commands-provider.d.ts +14 -0
  317. package/dist/experimental/services/slash-commands-provider.d.ts.map +1 -0
  318. package/dist/experimental/services/slash-commands-provider.js +200 -0
  319. package/dist/experimental/services/slash-commands-provider.js.map +1 -0
  320. package/dist/experimental/services/slash-commands.d.ts +24 -0
  321. package/dist/experimental/services/slash-commands.d.ts.map +1 -0
  322. package/dist/experimental/services/slash-commands.js +3 -0
  323. package/dist/experimental/services/slash-commands.js.map +1 -0
  324. package/dist/experimental/services/transcript-provider.d.ts +12 -0
  325. package/dist/experimental/services/transcript-provider.d.ts.map +1 -0
  326. package/dist/experimental/services/transcript-provider.js +109 -0
  327. package/dist/experimental/services/transcript-provider.js.map +1 -0
  328. package/dist/experimental/services/transcript.d.ts +13 -0
  329. package/dist/experimental/services/transcript.d.ts.map +1 -0
  330. package/dist/experimental/services/transcript.js +3 -0
  331. package/dist/experimental/services/transcript.js.map +1 -0
  332. package/dist/experimental/services/worker.d.ts +28 -0
  333. package/dist/experimental/services/worker.d.ts.map +1 -0
  334. package/dist/experimental/services/worker.js +107 -0
  335. package/dist/experimental/services/worker.js.map +1 -0
  336. package/dist/experimental/session-worker-manager.d.ts +24 -0
  337. package/dist/experimental/session-worker-manager.d.ts.map +1 -0
  338. package/dist/experimental/session-worker-manager.js +691 -0
  339. package/dist/experimental/session-worker-manager.js.map +1 -0
  340. package/dist/experimental/session-worker.d.ts +188 -0
  341. package/dist/experimental/session-worker.d.ts.map +1 -0
  342. package/dist/experimental/session-worker.js +785 -0
  343. package/dist/experimental/session-worker.js.map +1 -0
  344. package/dist/experimental/source-resolver.d.ts +2 -0
  345. package/dist/experimental/source-resolver.d.ts.map +1 -0
  346. package/dist/experimental/source-resolver.js +71 -0
  347. package/dist/experimental/source-resolver.js.map +1 -0
  348. package/dist/index.d.ts +1 -1
  349. package/dist/index.d.ts.map +1 -1
  350. package/dist/index.js.map +1 -1
  351. package/dist/main.d.ts.map +1 -1
  352. package/dist/main.js +126 -1
  353. package/dist/main.js.map +1 -1
  354. package/dist/modes/interactive/chat-viewport.d.ts +20 -0
  355. package/dist/modes/interactive/chat-viewport.d.ts.map +1 -0
  356. package/dist/modes/interactive/chat-viewport.js +28 -0
  357. package/dist/modes/interactive/chat-viewport.js.map +1 -0
  358. package/dist/modes/interactive/components/assistant-message.d.ts +1 -0
  359. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  360. package/dist/modes/interactive/components/assistant-message.js +18 -10
  361. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  362. package/dist/modes/interactive/components/custom-editor.d.ts +10 -1
  363. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  364. package/dist/modes/interactive/components/custom-editor.js +39 -1
  365. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  366. package/dist/modes/interactive/components/index.d.ts +1 -1
  367. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  368. package/dist/modes/interactive/components/index.js.map +1 -1
  369. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  370. package/dist/modes/interactive/components/model-selector.js +5 -14
  371. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  372. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  373. package/dist/modes/interactive/components/scoped-models-selector.js +13 -15
  374. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  375. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  376. package/dist/modes/interactive/components/settings-selector.js +14 -10
  377. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  378. package/dist/modes/interactive/components/status-indicator.d.ts +3 -1
  379. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  380. package/dist/modes/interactive/components/status-indicator.js +10 -3
  381. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  382. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  383. package/dist/modes/interactive/components/thinking-selector.js +2 -2
  384. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  385. package/dist/modes/interactive/components/tool-execution.d.ts +21 -4
  386. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  387. package/dist/modes/interactive/components/tool-execution.js +35 -33
  388. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  389. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
  390. package/dist/modes/interactive/components/trust-selector.js +2 -2
  391. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  392. package/dist/modes/interactive/interactive-mode.d.ts +8 -15
  393. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  394. package/dist/modes/interactive/interactive-mode.js +95 -80
  395. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  396. package/dist/modes/interactive/session-share.d.ts.map +1 -1
  397. package/dist/modes/interactive/session-share.js +8 -12
  398. package/dist/modes/interactive/session-share.js.map +1 -1
  399. package/dist/modes/interactive/theme/dark.json +2 -1
  400. package/dist/modes/interactive/theme/light.json +2 -1
  401. package/dist/modes/interactive/theme/theme-controller.d.ts +1 -0
  402. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  403. package/dist/modes/interactive/theme/theme-controller.js +5 -0
  404. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  405. package/dist/modes/interactive/theme/theme-json.d.ts +84 -0
  406. package/dist/modes/interactive/theme/theme-json.d.ts.map +1 -0
  407. package/dist/modes/interactive/theme/theme-json.js +130 -0
  408. package/dist/modes/interactive/theme/theme-json.js.map +1 -0
  409. package/dist/modes/interactive/theme/theme-schema.json +6 -2
  410. package/dist/modes/interactive/theme/theme.d.ts +14 -5
  411. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  412. package/dist/modes/interactive/theme/theme.js +18 -119
  413. package/dist/modes/interactive/theme/theme.js.map +1 -1
  414. package/dist/modes/interactive/tui-renderer.d.ts +21 -0
  415. package/dist/modes/interactive/tui-renderer.d.ts.map +1 -0
  416. package/dist/modes/interactive/tui-renderer.js +66 -0
  417. package/dist/modes/interactive/tui-renderer.js.map +1 -0
  418. package/dist/utils/exif-orientation.d.ts.map +1 -1
  419. package/dist/utils/exif-orientation.js +2 -3
  420. package/dist/utils/exif-orientation.js.map +1 -1
  421. package/dist/utils/tools-manager.d.ts +1 -0
  422. package/dist/utils/tools-manager.d.ts.map +1 -1
  423. package/dist/utils/tools-manager.js +41 -19
  424. package/dist/utils/tools-manager.js.map +1 -1
  425. package/docs/environment-variables.md +2 -0
  426. package/docs/extensions.md +5 -2
  427. package/docs/keybindings.md +3 -1
  428. package/docs/models.md +3 -0
  429. package/docs/rpc.md +1 -1
  430. package/docs/sdk.md +5 -0
  431. package/docs/settings.md +5 -5
  432. package/docs/skills.md +1 -1
  433. package/docs/terminal-setup.md +15 -0
  434. package/docs/themes.md +8 -6
  435. package/docs/tui.md +20 -1
  436. package/examples/README.md +3 -0
  437. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  438. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  439. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  440. package/examples/extensions/dynamic-resources/dynamic.json +2 -0
  441. package/examples/extensions/gondolin/package-lock.json +2 -2
  442. package/examples/extensions/gondolin/package.json +1 -1
  443. package/examples/extensions/sandbox/package-lock.json +2 -2
  444. package/examples/extensions/sandbox/package.json +1 -1
  445. package/examples/extensions/with-deps/package-lock.json +2 -2
  446. package/examples/extensions/with-deps/package.json +1 -1
  447. package/examples/plugins/pi-example-plugin/README.md +38 -0
  448. package/examples/plugins/pi-example-plugin/package.json +10 -0
  449. package/examples/plugins/pi-example-plugin/src/contract.ts +13 -0
  450. package/examples/plugins/pi-example-plugin/src/session.ts +23 -0
  451. package/examples/plugins/pi-example-plugin/src/tui.ts +31 -0
  452. package/npm-shrinkwrap.json +523 -28
  453. package/package.json +12 -6
  454. package/dist/bun/register-bedrock.d.ts +0 -2
  455. package/dist/bun/register-bedrock.d.ts.map +0 -1
  456. package/dist/bun/register-bedrock.js +0 -4
  457. package/dist/bun/register-bedrock.js.map +0 -1
  458. package/dist/bundle/chunks/anthropic-messages-JWX2WP65.js +0 -45
  459. package/dist/bundle/chunks/chunk-JUUC5AZY.js +0 -2
  460. package/dist/bundle/chunks/chunk-OMWWHBTG.js +0 -1548
  461. package/dist/bundle/chunks/openai-codex-responses-GJVBJXLB.js +0 -8
  462. package/dist/bundle/chunks/openai-responses-BSOJMSEV.js +0 -2
  463. package/dist/cli/experimental/auth.d.ts +0 -16
  464. package/dist/cli/experimental/auth.d.ts.map +0 -1
  465. package/dist/cli/experimental/auth.js +0 -13
  466. package/dist/cli/experimental/auth.js.map +0 -1
  467. package/dist/cli/experimental/commands/pi.d.ts +0 -15
  468. package/dist/cli/experimental/commands/pi.d.ts.map +0 -1
  469. package/dist/cli/experimental/commands/pi.js +0 -28
  470. package/dist/cli/experimental/commands/pi.js.map +0 -1
  471. package/dist/cli/experimental/transport-address.d.ts +0 -10
  472. package/dist/cli/experimental/transport-address.d.ts.map +0 -1
  473. package/dist/cli/experimental/transport-address.js +0 -38
  474. package/dist/cli/experimental/transport-address.js.map +0 -1
  475. package/dist/client/remote-session.d.ts +0 -53
  476. package/dist/client/remote-session.d.ts.map +0 -1
  477. package/dist/client/remote-session.js +0 -340
  478. package/dist/client/remote-session.js.map +0 -1
  479. package/dist/client/transcript.d.ts +0 -12
  480. package/dist/client/transcript.d.ts.map +0 -1
  481. package/dist/client/transcript.js +0 -98
  482. package/dist/client/transcript.js.map +0 -1
  483. package/dist/server/create-harness.d.ts +0 -26
  484. package/dist/server/create-harness.d.ts.map +0 -1
  485. package/dist/server/create-harness.js +0 -106
  486. package/dist/server/create-harness.js.map +0 -1
@@ -0,0 +1,5 @@
1
+ import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
2
+ import{Check,build_default}from"./chunk-WBE4J4AU.js";import{__commonJS,__require,__toESM}from"./chunk-4L3WN2XY.js";var require_windows=__commonJS({"node_modules/isexe/windows.js"(exports,module){module.exports=isexe;isexe.sync=sync;var fs=__require("fs");function checkPathExt(path,options){var pathext=options.pathExt!==void 0?options.pathExt:process.env.PATHEXT;if(!pathext||(pathext=pathext.split(";"),pathext.indexOf("")!==-1))return!0;for(var i=0;i<pathext.length;i++){var p=pathext[i].toLowerCase();if(p&&path.substr(-p.length).toLowerCase()===p)return!0}return!1}function checkStat(stat,path,options){return!stat.isSymbolicLink()&&!stat.isFile()?!1:checkPathExt(path,options)}function isexe(path,options,cb){fs.stat(path,function(er,stat){cb(er,er?!1:checkStat(stat,path,options))})}function sync(path,options){return checkStat(fs.statSync(path),path,options)}}});var require_mode=__commonJS({"node_modules/isexe/mode.js"(exports,module){module.exports=isexe;isexe.sync=sync;var fs=__require("fs");function isexe(path,options,cb){fs.stat(path,function(er,stat){cb(er,er?!1:checkStat(stat,options))})}function sync(path,options){return checkStat(fs.statSync(path),options)}function checkStat(stat,options){return stat.isFile()&&checkMode(stat,options)}function checkMode(stat,options){var mod=stat.mode,uid=stat.uid,gid=stat.gid,myUid=options.uid!==void 0?options.uid:process.getuid&&process.getuid(),myGid=options.gid!==void 0?options.gid:process.getgid&&process.getgid(),u=parseInt("100",8),g=parseInt("010",8),o=parseInt("001",8),ug=u|g,ret=mod&o||mod&g&&gid===myGid||mod&u&&uid===myUid||mod&ug&&myUid===0;return ret}}});var require_isexe=__commonJS({"node_modules/isexe/index.js"(exports,module){var fs=__require("fs"),core;process.platform==="win32"||global.TESTING_WINDOWS?core=require_windows():core=require_mode();module.exports=isexe;isexe.sync=sync;function isexe(path,options,cb){if(typeof options=="function"&&(cb=options,options={}),!cb){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(resolve3,reject){isexe(path,options||{},function(er,is){er?reject(er):resolve3(is)})})}core(path,options||{},function(er,is){er&&(er.code==="EACCES"||options&&options.ignoreErrors)&&(er=null,is=!1),cb(er,is)})}function sync(path,options){try{return core.sync(path,options||{})}catch(er){if(options&&options.ignoreErrors||er.code==="EACCES")return!1;throw er}}}});var require_which=__commonJS({"node_modules/which/which.js"(exports,module){var isWindows=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",path=__require("path"),COLON=isWindows?";":":",isexe=require_isexe(),getNotFoundError=cmd=>Object.assign(new Error(`not found: ${cmd}`),{code:"ENOENT"}),getPathInfo=(cmd,opt)=>{let colon=opt.colon||COLON,pathEnv=cmd.match(/\//)||isWindows&&cmd.match(/\\/)?[""]:[...isWindows?[process.cwd()]:[],...(opt.path||process.env.PATH||"").split(colon)],pathExtExe=isWindows?opt.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",pathExt=isWindows?pathExtExe.split(colon):[""];return isWindows&&cmd.indexOf(".")!==-1&&pathExt[0]!==""&&pathExt.unshift(""),{pathEnv,pathExt,pathExtExe}},which=(cmd,opt,cb)=>{typeof opt=="function"&&(cb=opt,opt={}),opt||(opt={});let{pathEnv,pathExt,pathExtExe}=getPathInfo(cmd,opt),found=[],step=i=>new Promise((resolve3,reject)=>{if(i===pathEnv.length)return opt.all&&found.length?resolve3(found):reject(getNotFoundError(cmd));let ppRaw=pathEnv[i],pathPart=/^".*"$/.test(ppRaw)?ppRaw.slice(1,-1):ppRaw,pCmd=path.join(pathPart,cmd),p=!pathPart&&/^\.[\\\/]/.test(cmd)?cmd.slice(0,2)+pCmd:pCmd;resolve3(subStep(p,i,0))}),subStep=(p,i,ii)=>new Promise((resolve3,reject)=>{if(ii===pathExt.length)return resolve3(step(i+1));let ext=pathExt[ii];isexe(p+ext,{pathExt:pathExtExe},(er,is)=>{if(!er&&is)if(opt.all)found.push(p+ext);else return resolve3(p+ext);return resolve3(subStep(p,i,ii+1))})});return cb?step(0).then(res=>cb(null,res),cb):step(0)},whichSync=(cmd,opt)=>{opt=opt||{};let{pathEnv,pathExt,pathExtExe}=getPathInfo(cmd,opt),found=[];for(let i=0;i<pathEnv.length;i++){let ppRaw=pathEnv[i],pathPart=/^".*"$/.test(ppRaw)?ppRaw.slice(1,-1):ppRaw,pCmd=path.join(pathPart,cmd),p=!pathPart&&/^\.[\\\/]/.test(cmd)?cmd.slice(0,2)+pCmd:pCmd;for(let j=0;j<pathExt.length;j++){let cur=p+pathExt[j];try{if(isexe.sync(cur,{pathExt:pathExtExe}))if(opt.all)found.push(cur);else return cur}catch{}}}if(opt.all&&found.length)return found;if(opt.nothrow)return null;throw getNotFoundError(cmd)};module.exports=which;which.sync=whichSync}});var require_path_key=__commonJS({"node_modules/path-key/index.js"(exports,module){"use strict";var pathKey=(options={})=>{let environment=options.env||process.env;return(options.platform||process.platform)!=="win32"?"PATH":Object.keys(environment).reverse().find(key=>key.toUpperCase()==="PATH")||"Path"};module.exports=pathKey;module.exports.default=pathKey}});var require_resolveCommand=__commonJS({"node_modules/cross-spawn/lib/util/resolveCommand.js"(exports,module){"use strict";var path=__require("path"),which=require_which(),getPathKey=require_path_key();function resolveCommandAttempt(parsed,withoutPathExt){let env=parsed.options.env||process.env,cwd=process.cwd(),hasCustomCwd=parsed.options.cwd!=null,shouldSwitchCwd=hasCustomCwd&&process.chdir!==void 0&&!process.chdir.disabled;if(shouldSwitchCwd)try{process.chdir(parsed.options.cwd)}catch{}let resolved;try{resolved=which.sync(parsed.command,{path:env[getPathKey({env})],pathExt:withoutPathExt?path.delimiter:void 0})}catch{}finally{shouldSwitchCwd&&process.chdir(cwd)}return resolved&&(resolved=path.resolve(hasCustomCwd?parsed.options.cwd:"",resolved)),resolved}function resolveCommand(parsed){return resolveCommandAttempt(parsed)||resolveCommandAttempt(parsed,!0)}module.exports=resolveCommand}});var require_escape=__commonJS({"node_modules/cross-spawn/lib/util/escape.js"(exports,module){"use strict";var metaCharsRegExp=/([()\][%!^"`<>&|;, *?])/g;function escapeCommand(arg){return arg=arg.replace(metaCharsRegExp,"^$1"),arg}function escapeArgument(arg,doubleEscapeMetaChars){return arg=`${arg}`,arg=arg.replace(/(?=(\\+?)?)\1"/g,'$1$1\\"'),arg=arg.replace(/(?=(\\+?)?)\1$/,"$1$1"),arg=`"${arg}"`,arg=arg.replace(metaCharsRegExp,"^$1"),doubleEscapeMetaChars&&(arg=arg.replace(metaCharsRegExp,"^$1")),arg}module.exports.command=escapeCommand;module.exports.argument=escapeArgument}});var require_shebang_regex=__commonJS({"node_modules/shebang-regex/index.js"(exports,module){"use strict";module.exports=/^#!(.*)/}});var require_shebang_command=__commonJS({"node_modules/shebang-command/index.js"(exports,module){"use strict";var shebangRegex=require_shebang_regex();module.exports=(string="")=>{let match=string.match(shebangRegex);if(!match)return null;let[path,argument]=match[0].replace(/#! ?/,"").split(" "),binary=path.split("/").pop();return binary==="env"?argument:argument?`${binary} ${argument}`:binary}}});var require_readShebang=__commonJS({"node_modules/cross-spawn/lib/util/readShebang.js"(exports,module){"use strict";var fs=__require("fs"),shebangCommand=require_shebang_command();function readShebang(command){let buffer=Buffer.alloc(150),fd;try{fd=fs.openSync(command,"r"),fs.readSync(fd,buffer,0,150,0),fs.closeSync(fd)}catch{}return shebangCommand(buffer.toString())}module.exports=readShebang}});var require_parse=__commonJS({"node_modules/cross-spawn/lib/parse.js"(exports,module){"use strict";var path=__require("path"),resolveCommand=require_resolveCommand(),escape=require_escape(),readShebang=require_readShebang(),isWin=process.platform==="win32",isExecutableRegExp=/\.(?:com|exe)$/i,isCmdShimRegExp=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function detectShebang(parsed){parsed.file=resolveCommand(parsed);let shebang=parsed.file&&readShebang(parsed.file);return shebang?(parsed.args.unshift(parsed.file),parsed.command=shebang,resolveCommand(parsed)):parsed.file}function parseNonShell(parsed){if(!isWin)return parsed;let commandFile=detectShebang(parsed),needsShell=!isExecutableRegExp.test(commandFile);if(parsed.options.forceShell||needsShell){let needsDoubleEscapeMetaChars=isCmdShimRegExp.test(commandFile);parsed.command=path.normalize(parsed.command),parsed.command=escape.command(parsed.command),parsed.args=parsed.args.map(arg=>escape.argument(arg,needsDoubleEscapeMetaChars));let shellCommand=[parsed.command].concat(parsed.args).join(" ");parsed.args=["/d","/s","/c",`"${shellCommand}"`],parsed.command=process.env.comspec||"cmd.exe",parsed.options.windowsVerbatimArguments=!0}return parsed}function parse(command,args,options){args&&!Array.isArray(args)&&(options=args,args=null),args=args?args.slice(0):[],options=Object.assign({},options);let parsed={command,args,options,file:void 0,original:{command,args}};return options.shell?parsed:parseNonShell(parsed)}module.exports=parse}});var require_enoent=__commonJS({"node_modules/cross-spawn/lib/enoent.js"(exports,module){"use strict";var isWin=process.platform==="win32";function notFoundError(original,syscall){return Object.assign(new Error(`${syscall} ${original.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${syscall} ${original.command}`,path:original.command,spawnargs:original.args})}function hookChildProcess(cp,parsed){if(!isWin)return;let originalEmit=cp.emit;cp.emit=function(name,arg1){if(name==="exit"){let err=verifyENOENT(arg1,parsed);if(err)return originalEmit.call(cp,"error",err)}return originalEmit.apply(cp,arguments)}}function verifyENOENT(status,parsed){return isWin&&status===1&&!parsed.file?notFoundError(parsed.original,"spawn"):null}function verifyENOENTSync(status,parsed){return isWin&&status===1&&!parsed.file?notFoundError(parsed.original,"spawnSync"):null}module.exports={hookChildProcess,verifyENOENT,verifyENOENTSync,notFoundError}}});var require_cross_spawn=__commonJS({"node_modules/cross-spawn/index.js"(exports,module){"use strict";var cp=__require("child_process"),parse=require_parse(),enoent=require_enoent();function spawn2(command,args,options){let parsed=parse(command,args,options),spawned=cp.spawn(parsed.command,parsed.args,parsed.options);return enoent.hookChildProcess(spawned,parsed),spawned}function spawnSync(command,args,options){let parsed=parse(command,args,options),result=cp.spawnSync(parsed.command,parsed.args,parsed.options);return result.error=result.error||enoent.verifyENOENTSync(result.status,parsed),result}module.exports=spawn2;module.exports.spawn=spawn2;module.exports.sync=spawnSync;module.exports._parse=parse;module.exports._enoent=enoent}});import{accessSync,constants,existsSync,readFileSync,realpathSync as realpathSync2}from"fs";import{homedir as homedir2}from"os";import{basename,dirname,join as join2,resolve,sep as sep2,win32}from"path";import{fileURLToPath as fileURLToPath2}from"url";var import_cross_spawn=__toESM(require_cross_spawn(),1);import{spawn as nodeSpawn,spawnSync as nodeSpawnSync}from"node:child_process";var EXIT_STDIO_GRACE_MS=100;function spawnProcess(command,args,options){return process.platform==="win32"?(0,import_cross_spawn.default)(command,args,options):nodeSpawn(command,args,options)}function spawnProcessSync(command,args,options){return process.platform==="win32"?import_cross_spawn.default.sync(command,args,options):nodeSpawnSync(command,args,options)}function waitForChildProcess(child){return new Promise((resolve3,reject)=>{let settled=!1,exited=!1,exitCode=null,postExitTimer,stdoutEnded=child.stdout===null,stderrEnded=child.stderr===null,cleanup=()=>{postExitTimer&&(clearTimeout(postExitTimer),postExitTimer=void 0),child.removeListener("error",onError),child.removeListener("exit",onExit),child.removeListener("close",onClose),child.stdout?.removeListener("end",onStdoutEnd),child.stderr?.removeListener("end",onStderrEnd),child.stdout?.removeListener("data",onData),child.stderr?.removeListener("data",onData)},finalize=code=>{settled||(settled=!0,cleanup(),child.stdout?.destroy(),child.stderr?.destroy(),resolve3(code))},maybeFinalizeAfterExit=()=>{!exited||settled||stdoutEnded&&stderrEnded&&finalize(exitCode)},armIdleTimer=()=>{postExitTimer&&clearTimeout(postExitTimer),postExitTimer=setTimeout(()=>finalize(exitCode),EXIT_STDIO_GRACE_MS)},onData=()=>{exited&&!settled&&armIdleTimer()},onStdoutEnd=()=>{stdoutEnded=!0,maybeFinalizeAfterExit()},onStderrEnd=()=>{stderrEnded=!0,maybeFinalizeAfterExit()},onError=err=>{settled||(settled=!0,cleanup(),reject(err))},onExit=code=>{exited=!0,exitCode=code,maybeFinalizeAfterExit(),settled||armIdleTimer()},onClose=code=>{finalize(code)};child.stdout?.once("end",onStdoutEnd),child.stderr?.once("end",onStderrEnd),child.stdout?.on("data",onData),child.stderr?.on("data",onData),child.once("error",onError),child.once("exit",onExit),child.once("close",onClose)})}import{realpathSync,statSync}from"node:fs";import{homedir}from"node:os";import{isAbsolute,join,resolve as nodeResolvePath,relative,sep}from"node:path";import{fileURLToPath}from"node:url";var UNICODE_SPACES=/[\u00A0\u2000-\u200A\u202F\u205F\u3000]/g;function canonicalizePath(path){try{return realpathSync(path)}catch{return path}}function getFileRevision(path){try{let stats=statSync(path,{bigint:!0});return`${stats.dev}:${stats.ino}:${stats.size}:${stats.mtimeNs}:${stats.ctimeNs}`}catch{return}}function isLocalPath(value){let trimmed=value.trim();return!(trimmed.startsWith("npm:")||trimmed.startsWith("git:")||trimmed.startsWith("github:")||trimmed.startsWith("http:")||trimmed.startsWith("https:")||trimmed.startsWith("ssh:"))}function normalizeWindowsShellPath(filePath){if(!filePath.startsWith("/")||filePath.startsWith("//")||filePath.includes("\\"))return filePath;let match=filePath.match(/^\/(?:mnt\/|cygdrive\/)?([a-z])(?:\/(.*))?$/i);if(!match)return filePath;let suffix=match[2]?.replaceAll("/","\\");return`${match[1].toUpperCase()}:\\${suffix??""}`}function normalizePath(input,options={}){let normalized=options.trim?input.trim():input;if(options.normalizeUnicodeSpaces&&(normalized=normalized.replace(UNICODE_SPACES," ")),options.stripAtPrefix&&normalized.startsWith("@")&&(normalized=normalized.slice(1)),process.platform==="win32"&&(normalized=normalizeWindowsShellPath(normalized)),options.expandTilde??!0){let home=options.homeDir??homedir();if(normalized==="~")return home;if(normalized.startsWith("~/")||process.platform==="win32"&&normalized.startsWith("~\\"))return join(home,normalized.slice(2))}return/^file:\/\//.test(normalized)?fileURLToPath(normalized):normalized}function resolvePath(input,baseDir=process.cwd(),options={}){let normalized=normalizePath(input,options),normalizedBaseDir=normalizePath(baseDir);return isAbsolute(normalized)?nodeResolvePath(normalized):nodeResolvePath(normalizedBaseDir,normalized)}function getCwdRelativePath(filePath,cwd){let resolvedCwd=resolvePath(cwd),resolvedPath=resolvePath(filePath,resolvedCwd),relativePath=relative(resolvedCwd,resolvedPath);return relativePath===""||relativePath!==".."&&!relativePath.startsWith(`..${sep}`)&&!isAbsolute(relativePath)?relativePath||".":void 0}function formatPathRelativeToCwdOrAbsolute(filePath,cwd){let absolutePath=resolvePath(filePath,cwd);return(getCwdRelativePath(absolutePath,cwd)??absolutePath).split(sep).join("/")}function markPathIgnoredByCloudSync(path){let attrs=process.platform==="darwin"?["com.dropbox.ignored","com.apple.fileprovider.ignore#P"]:process.platform==="linux"?["user.com.dropbox.ignored"]:[];for(let attr of attrs)process.platform==="darwin"?spawnProcessSync("xattr",["-w",attr,"1",path],{encoding:"utf-8",stdio:"ignore"}):spawnProcessSync("setfattr",["-n",attr,"-v","1",path],{encoding:"utf-8",stdio:"ignore"})}function splitBom(content){return content.startsWith("\uFEFF")?{bom:"\uFEFF",text:content.slice(1)}:{bom:"",text:content}}function stripBom(content){return splitBom(content).text}var __filename=fileURLToPath2(import.meta.url),__dirname=dirname(__filename),isBunBinary=import.meta.url.includes("$bunfs")||import.meta.url.includes("~BUN")||import.meta.url.includes("%7EBUN"),isBunRuntime=!!process.versions.bun,isBundledNode=!0;function normalizeSelfUpdatePackageTarget(target){return typeof target=="string"?{packageName:target,installSpec:target}:{packageName:target.packageName,installSpec:target.installSpec??target.packageName}}function makeSelfUpdateCommand(installStep,uninstallStep){return uninstallStep?{...installStep,display:`${uninstallStep.display} && ${installStep.display}`,steps:[uninstallStep,installStep]}:installStep}function makeSelfUpdateCommandStep(command,args){return{command,args,display:[command,...args].map(arg=>/\s/.test(arg)?`"${arg}"`:arg).join(" ")}}function detectInstallMethod(){if(isBunBinary)return"bun-binary";let resolvedPath=`${__dirname}\0${process.execPath||""}`.toLowerCase().replace(/\\/g,"/");return resolvedPath.includes("/pnpm/")||resolvedPath.includes("/.pnpm/")?"pnpm":resolvedPath.includes("/yarn/")||resolvedPath.includes("/.yarn/")?"yarn":isBunRuntime||resolvedPath.includes("/install/global/node_modules/")?"bun":resolvedPath.includes("/npm/")||resolvedPath.includes("/node_modules/")?"npm":"unknown"}function getInferredNpmInstall(){let packageDir=getPackageDir(),path=process.platform==="win32"||packageDir.includes("\\")?win32:{basename,dirname},parent=path.dirname(packageDir),root;if(path.basename(parent).startsWith("@")&&path.basename(path.dirname(parent))==="node_modules"?root=path.dirname(parent):path.basename(parent)==="node_modules"&&(root=parent),!root)return;let rootParent=path.dirname(root);if(path.basename(rootParent)==="lib")return{root,prefix:path.dirname(rootParent)}}function getSelfUpdateCommandForMethod(method,installedPackageName,updatePackageTarget=installedPackageName,npmCommand){let target=normalizeSelfUpdatePackageTarget(updatePackageTarget);switch(method){case"bun-binary":return;case"pnpm":{let match=readCommandOutput("pnpm",["root","-g"])?void 0:/^(.*[\\/]global[\\/][^\\/]+)[\\/]\.pnpm[\\/]/.exec(getPackageDir()),binDirArgs=match?[`--config.global-bin-dir=${process.env.PNPM_HOME||dirname(dirname(match[1]))}`]:[];return makeSelfUpdateCommand(makeSelfUpdateCommandStep("pnpm",["install","-g","--ignore-scripts","--config.minimumReleaseAge=0",...binDirArgs,target.installSpec]),target.packageName===installedPackageName?void 0:makeSelfUpdateCommandStep("pnpm",["remove","-g",...binDirArgs,installedPackageName]))}case"yarn":return makeSelfUpdateCommand(makeSelfUpdateCommandStep("yarn",["global","add","--ignore-scripts",target.installSpec]),target.packageName===installedPackageName?void 0:makeSelfUpdateCommandStep("yarn",["global","remove",installedPackageName]));case"bun":return makeSelfUpdateCommand(makeSelfUpdateCommandStep("bun",["install","-g","--ignore-scripts","--minimum-release-age=0",target.installSpec]),target.packageName===installedPackageName?void 0:makeSelfUpdateCommandStep("bun",["uninstall","-g",installedPackageName]));case"npm":{let[command="npm",...npmArgs]=npmCommand??[],inferred=npmCommand?.length?void 0:getInferredNpmInstall(),prefixArgs=[...npmArgs,...inferred?["--prefix",inferred.prefix]:[]],installStep=makeSelfUpdateCommandStep(command,[...prefixArgs,"install","-g","--ignore-scripts","--min-release-age=0",target.installSpec]),uninstallStep=target.packageName===installedPackageName?void 0:makeSelfUpdateCommandStep(command,[...prefixArgs,"uninstall","-g",installedPackageName]);return makeSelfUpdateCommand(installStep,uninstallStep)}case"unknown":return}}function readCommandOutput(command,args,options={}){let result=spawnProcessSync(command,args,{encoding:"utf-8",stdio:["ignore","pipe","pipe"]});if(result.status===0)return result.stdout.trim()||void 0;if(options.requireSuccess){let reason=result.error?.message||result.stderr.trim()||`exit code ${result.status??"unknown"}`;throw new Error(`Failed to run ${[command,...args].join(" ")}: ${reason}`)}}function getGlobalPackageRoots(method,_packageName,npmCommand){switch(method){case"npm":{let configured=!!npmCommand?.length,[command="npm",...npmArgs]=npmCommand??[];if(configured&&command==="bun"){let bunBin=readCommandOutput(command,[...npmArgs,"pm","bin","-g"],{requireSuccess:!0}),roots=[join2(homedir2(),".bun","install","global","node_modules")];return bunBin&&roots.push(join2(dirname(bunBin),"install","global","node_modules")),roots}let root=readCommandOutput(command,[...npmArgs,"root","-g"],{requireSuccess:configured}),inferred=configured?void 0:getInferredNpmInstall();return[root,inferred?.root].filter(x=>!!x)}case"pnpm":{let root=readCommandOutput("pnpm",["root","-g"]);if(root)return[root,dirname(root)];let match=/^(.*[\\/]global[\\/][^\\/]+)[\\/]\.pnpm[\\/]/.exec(getPackageDir());return match?[match[1]]:[]}case"yarn":{let dir=readCommandOutput("yarn",["global","dir"]);return dir?[dir,join2(dir,"node_modules")]:[]}case"bun":{let bunBin=readCommandOutput("bun",["pm","bin","-g"]),roots=[join2(homedir2(),".bun","install","global","node_modules")];return bunBin&&roots.push(join2(dirname(bunBin),"install","global","node_modules")),roots}case"bun-binary":case"unknown":return[]}}function normalizeExistingPathForComparison(path,resolveSymlinks){let resolvedPath=resolve(path);if(!existsSync(resolvedPath))return;let normalizedPath=resolvedPath;if(resolveSymlinks)try{normalizedPath=realpathSync2(resolvedPath)}catch{return}return process.platform==="win32"&&(normalizedPath=normalizedPath.toLowerCase()),normalizedPath}function getPathComparisonCandidates(path){return Array.from(new Set([normalizeExistingPathForComparison(path,!1),normalizeExistingPathForComparison(path,!0)].filter(candidate=>!!candidate)))}function getEntrypointPackageDir(){let entrypoint=process.argv[1];if(!entrypoint)return;let dir=dirname(entrypoint);for(;dir!==dirname(dir);){if(existsSync(join2(dir,"package.json")))return dir;dir=dirname(dir)}}function isSelfUpdatePathWritable(){let packageDir=getPackageDir();try{return accessSync(packageDir,constants.W_OK),accessSync(dirname(packageDir),constants.W_OK),!0}catch{return!1}}function isManagedByGlobalPackageManager(method,packageName,npmCommand){let packageDirCandidates=[getPackageDir(),getEntrypointPackageDir()].filter(dir=>!!dir).flatMap(dir=>getPathComparisonCandidates(dir));return getGlobalPackageRoots(method,packageName,npmCommand).some(root=>getPathComparisonCandidates(root).some(normalizedRoot=>{let rootPrefix=normalizedRoot.endsWith(sep2)?normalizedRoot:`${normalizedRoot}${sep2}`;return packageDirCandidates.some(packageDir=>packageDir.startsWith(rootPrefix))}))}function getSelfUpdateCommand(packageName,npmCommand,updatePackageTarget=packageName){let method=detectInstallMethod(),command=getSelfUpdateCommandForMethod(method,packageName,updatePackageTarget,npmCommand);if(!(!command||!isManagedByGlobalPackageManager(method,packageName,npmCommand)||!isSelfUpdatePathWritable()))return command}function getSelfUpdateUnavailableInstruction(packageName,npmCommand,updatePackageTarget=packageName){let method=detectInstallMethod(),target=normalizeSelfUpdatePackageTarget(updatePackageTarget);if(method==="bun-binary")return"Download from: https://github.com/earendil-works/pi-mono/releases/latest";let command=getSelfUpdateCommandForMethod(method,packageName,target,npmCommand);return command?isManagedByGlobalPackageManager(method,packageName,npmCommand)&&!isSelfUpdatePathWritable()?`This installation is managed by a global ${method} install, but the install path is not writable. Update it yourself with: ${command.display}`:`This installation is not managed by a global ${method} install. Update it with the package manager, wrapper, or source checkout that provides it.`:`Update ${target.installSpec} using the package manager, wrapper, or source checkout that provides this installation.`}function findNodePackageDir(startDir){let dir=startDir;for(;dir!==dirname(dir);){if(existsSync(join2(dir,"package.json"))){let parent=dirname(dir);return basename(dir)==="dist"&&existsSync(join2(parent,"package.json"))?parent:dir}dir=dirname(dir)}return startDir}function getPackageDir(){let envDir=process.env.PI_PACKAGE_DIR;return envDir?normalizePath(envDir):isBunBinary?dirname(process.execPath):findNodePackageDir(__dirname)}function getThemesDir(){if(isBunBinary)return join2(getPackageDir(),"theme");let packageDir=getPackageDir(),srcOrDist=existsSync(join2(packageDir,"src"))?"src":"dist";return join2(packageDir,srcOrDist,"modes","interactive","theme")}function getExportTemplateDir(){if(isBunBinary)return join2(getPackageDir(),"export-html");let packageDir=getPackageDir(),srcOrDist=existsSync(join2(packageDir,"src"))?"src":"dist";return join2(packageDir,srcOrDist,"core","export-html")}function getPackageJsonPath(){return join2(getPackageDir(),"package.json")}function getReadmePath(){return resolve(join2(getPackageDir(),"README.md"))}function getDocsPath(){return resolve(join2(getPackageDir(),"docs"))}function getExamplesPath(){return resolve(join2(getPackageDir(),"examples"))}function getChangelogPath(){return resolve(join2(getPackageDir(),"CHANGELOG.md"))}function getInteractiveAssetsDir(){if(isBunBinary)return join2(getPackageDir(),"assets");let packageDir=getPackageDir(),srcOrDist=existsSync(join2(packageDir,"src"))?"src":"dist";return join2(packageDir,srcOrDist,"modes","interactive","assets")}function getBundledInteractiveAssetPath(name){return join2(getInteractiveAssetsDir(),name)}var pkg={};try{pkg=JSON.parse(stripBom(readFileSync(getPackageJsonPath(),"utf-8")))}catch(e){if(e.code!=="ENOENT")throw e}var piConfigName=pkg.piConfig?.name,PACKAGE_NAME=pkg.name||"@earendil-works/pi-coding-agent",APP_NAME=piConfigName||"pi",APP_TITLE=piConfigName?APP_NAME:"\u03C0",CONFIG_DIR_NAME=pkg.piConfig?.configDir||".pi",VERSION=pkg.version||"0.0.0",ENV_AGENT_DIR=`${APP_NAME.toUpperCase()}_CODING_AGENT_DIR`,ENV_SESSION_DIR=`${APP_NAME.toUpperCase()}_CODING_AGENT_SESSION_DIR`;function expandTildePath(path){return normalizePath(path)}var DEFAULT_SHARE_VIEWER_URL="https://pi.dev/session/";function getShareViewerUrl(gistId){return`${process.env.PI_SHARE_VIEWER_URL||DEFAULT_SHARE_VIEWER_URL}#${gistId}`}function getAgentDir(){let envDir=process.env[ENV_AGENT_DIR];return envDir?expandTildePath(envDir):join2(homedir2(),CONFIG_DIR_NAME,"agent")}function getCustomThemesDir(){return join2(getAgentDir(),"themes")}function getAuthPath(){return join2(getAgentDir(),"auth.json")}function getSettingsPath(){return join2(getAgentDir(),"settings.json")}function getBinDir(){return join2(getAgentDir(),"bin")}function getSessionsDir(){return join2(getAgentDir(),"sessions")}function getDebugLogPath(){return join2(getAgentDir(),`${APP_NAME}-debug.log`)}import{spawn}from"node:child_process";import{join as join3,resolve as resolve2}from"node:path";import{fileURLToPath as fileURLToPath3,pathToFileURL}from"node:url";var INTERNAL_PROCESS_ENV="__PI_INTERNAL_SPAWN";function isDirectInternalProcessEntry(moduleUrl){return!isBunBinary&&!isBundledNode&&process.argv[1]!==void 0&&resolve2(process.argv[1])===fileURLToPath3(moduleUrl)}function getInternalProcessRole(){let role=process.env[INTERNAL_PROCESS_ENV];if(role!==void 0){if(role==="coordinator"||role==="server"||role==="session-worker")return role;throw new Error(`Unsupported internal process role: ${role}`)}}function consumeInternalProcessRole(){let role=getInternalProcessRole();return delete process.env[INTERNAL_PROCESS_ENV],role}function spawnInternalProcess(role,args,options={}){if(isBunBinary&&options.entryUrl)throw new Error("A compiled Bun executable cannot launch an external internal-process entrypoint");let entryUrl=defaultEntryUrl(role,options.entryUrl),sourceRuntimeArgs=import.meta.url.endsWith(".ts")?["--import",fileURLToPath3(new URL("source-resolver.ts",import.meta.url))]:[],child=spawn(process.execPath,isBunBinary?[...args]:[...sourceRuntimeArgs,fileURLToPath3(entryUrl),...args],{cwd:process.cwd(),detached:!0,env:{...process.env,...options.env,[INTERNAL_PROCESS_ENV]:role},stdio:"ignore",windowsHide:!0});return child.unref(),child}async function terminateInternalProcess(child){if(child.pid===void 0||child.exitCode!==null||child.signalCode!==null)return;let terminated=new Promise(resolve3=>{child.once("exit",()=>resolve3()),child.once("error",()=>resolve3())});child.kill("SIGKILL"),await terminated}function defaultEntryUrl(role,override){if(override)return override;if(isBundledNode){let entry=role==="coordinator"?"coordinator.js":"cli.js";return pathToFileURL(join3(getPackageDir(),"dist","bundle",entry))}let javaScript=import.meta.url.endsWith(".js");return role==="coordinator"?new URL(javaScript?"coordinator.js":"coordinator.ts",import.meta.url):role==="server"?new URL(javaScript?"server.js":"server.ts",import.meta.url):new URL(javaScript?"session-worker.js":"session-worker.ts",import.meta.url)}var MAX_CONTROL_LINE_BYTES=128*1024*1024;function encodeControlLine(message){let line=`${JSON.stringify(message)}
3
+ `;if(Buffer.byteLength(line)>MAX_CONTROL_LINE_BYTES)throw new Error("Internal control message is too large");return line}import{randomUUID}from"node:crypto";import{chmod,lstat,unlink}from"node:fs/promises";import{createConnection,createServer}from"node:net";var COORDINATOR_PROTOCOL_VERSION=3,COORDINATOR_START_TIMEOUT_MS=1e4,COORDINATOR_RETRY_MS=10,CoordinatorMessageSchema=build_default.Union([build_default.Object({type:build_default.Literal("server_registered"),serverConnectionId:build_default.String(),peers:build_default.Array(build_default.String())}),build_default.Object({type:build_default.Literal("server_replaced")}),build_default.Object({type:build_default.Literal("peer_connected"),peerId:build_default.String()}),build_default.Object({type:build_default.Literal("peer_disconnected"),peerId:build_default.String()}),build_default.Object({type:build_default.Literal("message"),from:build_default.String(),payload:build_default.Unknown()})]),CoordinatorConnection=class{serverConnectionId;replaced;peerIds=new Set;#controlPath;#endpoint;#listeners=new Set;#socket;#registered=!1;#closed=!1;#replacedValue=!1;#resolveRegistered;#rejectRegistered;#resolveReplaced;constructor(options){this.serverConnectionId=options.serverConnectionId??randomUUID(),this.#controlPath=options.controlPath,this.#endpoint=options.endpoint,this.replaced=new Promise(resolve3=>{this.#resolveReplaced=resolve3})}get controlPath(){return this.#controlPath}get wasReplaced(){return this.#replacedValue}onEvent(listener){return this.#listeners.add(listener),()=>this.#listeners.delete(listener)}async connect(){if(this.#socket)throw new Error("Coordinator server is already connected");let socket=await connectSocket(this.#controlPath);this.#socket=socket,attachJsonLineReader(socket,message=>this.#handleMessage(message));let registered=new Promise((resolve3,reject)=>{this.#resolveRegistered=resolve3,this.#rejectRegistered=reject});socket.once("close",()=>this.#disconnected(new Error("Coordinator connection closed"))),socket.once("error",error=>this.#disconnected(error)),await writeJsonLine(socket,{type:"register_server",protocol:COORDINATOR_PROTOCOL_VERSION,serverConnectionId:this.serverConnectionId,endpoint:this.#endpoint}),await registered}send(peerId,payload){return this.#write({type:"send",to:peerId,payload})}broadcast(payload){return this.#write({type:"broadcast",payload})}close(){this.#closed||(this.#closed=!0,this.#socket?.destroy(),this.#socket=void 0,this.peerIds.clear(),this.#rejectRegistered?.(new Error("Coordinator server closed")),this.#resolveRegistered=void 0,this.#rejectRegistered=void 0)}async#write(message){if(!this.#registered||!this.#socket||this.#closed)throw new Error("Coordinator server is not connected");await writeJsonLine(this.#socket,message)}#handleMessage(value){if(!Check(CoordinatorMessageSchema,value)){this.#socket?.destroy(new Error("Coordinator sent an invalid message"));return}let message=value;if(message.type==="server_registered"){if(message.serverConnectionId!==this.serverConnectionId){this.#socket?.destroy(new Error("Coordinator returned an invalid server registration"));return}for(let peerId of message.peers)this.peerIds.add(peerId);this.#registered=!0,this.#resolveRegistered?.(),this.#resolveRegistered=void 0,this.#rejectRegistered=void 0;return}if(message.type==="server_replaced"){this.#markReplaced();return}if(message.type==="peer_connected"){this.peerIds.add(message.peerId),this.#emit({type:"peer_connected",peerId:message.peerId});return}if(message.type==="peer_disconnected"){this.peerIds.delete(message.peerId),this.#emit({type:"peer_disconnected",peerId:message.peerId});return}if(message.type==="message"){this.#emit({type:"message",from:message.from,payload:message.payload});return}this.#socket?.destroy(new Error("Coordinator sent an unsupported message"))}#emit(event){for(let listener of this.#listeners)listener(event)}#disconnected(error){this.#socket=void 0,!this.#closed&&(this.#rejectRegistered?.(error),this.#resolveRegistered=void 0,this.#rejectRegistered=void 0,this.#markReplaced())}#markReplaced(){this.#replacedValue||(this.#replacedValue=!0,this.#resolveReplaced())}};async function ensureCoordinator(publicPath2,controlPath2){let existing=await tryConnect(controlPath2);if(existing)return{close:()=>existing.destroy()};let child=spawnInternalProcess("coordinator",[publicPath2,controlPath2]),deadline=Date.now()+COORDINATOR_START_TIMEOUT_MS;for(;;){let socket=await tryConnect(controlPath2);if(socket)return{close:()=>socket.destroy()};if(child.exitCode!==null||child.signalCode!==null)throw new Error("Coordinator exited during startup");if(Date.now()>=deadline)throw new Error("Timed out waiting for coordinator startup");await new Promise(resolve3=>setTimeout(resolve3,COORDINATOR_RETRY_MS))}}function connectSocket(path){return new Promise((resolve3,reject)=>{let socket=createConnection(path),onConnect=()=>{socket.off("error",onError),resolve3(socket)},onError=error=>{socket.off("connect",onConnect),reject(error)};socket.once("connect",onConnect),socket.once("error",onError)})}async function tryConnect(path){try{return await connectSocket(path)}catch(error){let code=error instanceof Error&&"code"in error?error.code:void 0;if(code==="ENOENT"||code==="ECONNREFUSED")return;throw error}}function attachJsonLineReader(socket,onMessage){let buffered="";socket.setEncoding("utf8"),socket.on("data",chunk=>{if(buffered+=chunk,Buffer.byteLength(buffered)>MAX_CONTROL_LINE_BYTES){socket.destroy(new Error("Coordinator message is too large"));return}for(;;){let newline=buffered.indexOf(`
4
+ `);if(newline===-1)return;let line=buffered.slice(0,newline);buffered=buffered.slice(newline+1);try{onMessage(JSON.parse(line))}catch{socket.destroy(new Error("Coordinator sent invalid JSON"));return}}})}function writeJsonLine(socket,message){return new Promise((resolve3,reject)=>{socket.write(encodeControlLine(message),error=>{error?reject(error):resolve3()})})}var EMPTY_STARTUP_GRACE_MS=3e4,EMPTY_SHUTDOWN_GRACE_MS=250,publicPath,controlPath,running=!1,peers=new Map,controlConnections=new Set,publicConnections=new Map,currentServer,shuttingDown=!1,emptyTimer,publicServer=createServer(socket=>acceptPublicConnection(socket)),controlServer=createServer(socket=>acceptControlConnection(socket));async function runCoordinatorProcess(args){if(running)throw new Error("Coordinator process is already running");let[requestedPublicPath,requestedControlPath]=args;if(!requestedPublicPath||!requestedControlPath)throw new Error("Coordinator requires public and control socket paths");publicPath=requestedPublicPath,controlPath=requestedControlPath,running=!0,process.once("SIGINT",()=>{shutdownCoordinator()}),process.once("SIGTERM",()=>{shutdownCoordinator()}),await main()}async function main(){await removeStaleSocket(controlPath),await removeStaleSocket(publicPath);try{await listen(controlServer,controlPath),await restrictSocket(controlPath),await listen(publicServer,publicPath),await restrictSocket(publicPath)}catch(error){throw await Promise.all([cleanupSocket(controlPath),cleanupSocket(publicPath)]),error}scheduleEmptyShutdown(EMPTY_STARTUP_GRACE_MS)}function acceptControlConnection(socket){if(shuttingDown){socket.destroy();return}controlConnections.add(socket);let server,peer;attachRoutedLineReader(socket,message=>{if(!server&&!peer){if(message.type==="register_server"){server=registerServer(socket,message);return}if(message.type==="register_peer"){peer=registerPeer(socket,message);return}throw new Error("Coordinator connection did not register a role")}if(server){server===currentServer&&handleRoutedMessage("server",message);return}handleRoutedMessage(peer.peerId,message)});let disconnect=()=>{controlConnections.delete(socket),server&&currentServer===server&&(currentServer=void 0,notifyPeers({type:"server_disconnected",serverConnectionId:server.serverConnectionId})),peer&&peers.get(peer.peerId)===peer&&(peers.delete(peer.peerId),currentServer&&writeRoutedLine(currentServer.socket,{type:"peer_disconnected",peerId:peer.peerId})),checkEmpty()};socket.once("close",disconnect),socket.once("error",()=>socket.destroy())}function registerServer(socket,message){if(message.protocol!==COORDINATOR_PROTOCOL_VERSION)throw new Error("Unsupported coordinator protocol");if(typeof message.serverConnectionId!="string"||message.serverConnectionId.length===0)throw new Error("Coordinator serverConnectionId must be a string");if(typeof message.endpoint!="string"||message.endpoint.length===0)throw new Error("Coordinator endpoint must be a string");let{serverConnectionId,endpoint}=message,server={serverConnectionId,endpoint,socket},previous=currentServer;return currentServer=server,cancelEmptyShutdown(),writeRoutedLine(socket,{type:"server_registered",serverConnectionId,peers:[...peers.keys()]}),previous&&previous!==server&&(closePublicConnections(),notifyPeers({type:"server_disconnected",serverConnectionId:previous.serverConnectionId}),writeRoutedLine(previous.socket,{type:"server_replaced"})),notifyPeers({type:"server_connected",serverConnectionId}),server}function registerPeer(socket,message){if(message.protocol!==COORDINATOR_PROTOCOL_VERSION)throw new Error("Unsupported coordinator protocol");if(typeof message.peerId!="string"||message.peerId.length===0)throw new Error("Coordinator peerId must be a string");let{peerId}=message;if(peerId==="server"||peers.has(peerId))throw new Error(`Coordinator peer is already connected: ${peerId}`);let peer={peerId,socket};return peers.set(peerId,peer),cancelEmptyShutdown(),writeRoutedLine(socket,{type:"peer_registered",peerId,...currentServer===void 0?{}:{serverConnectionId:currentServer.serverConnectionId}}),currentServer&&writeRoutedLine(currentServer.socket,{type:"peer_connected",peerId}),peer}function notifyPeers(message){for(let peer of peers.values())writeRoutedLine(peer.socket,message)}function handleRoutedMessage(from,message){if(message.type==="send"){if(typeof message.to!="string"||message.to.length===0)throw new Error("Coordinator message target must be a string");let{to}=message,target=to==="server"?currentServer?.socket:peers.get(to)?.socket;target&&writeRoutedLine(target,{type:"message",from,payload:message.payload});return}if(message.type==="broadcast"){if(from!=="server")throw new Error("Only the current server may broadcast");for(let peer of peers.values())writeRoutedLine(peer.socket,{type:"message",from,payload:message.payload});return}throw new Error(`Unknown coordinator routing message: ${message.type}`)}function acceptPublicConnection(client){if(shuttingDown||!currentServer){client.destroy();return}cancelEmptyShutdown();let upstream=createConnection(currentServer.endpoint);publicConnections.set(client,upstream);let finalized=!1,finalize=()=>{finalized||(finalized=!0,publicConnections.delete(client),checkEmpty())};upstream.once("connect",()=>{client.pipe(upstream),upstream.pipe(client)}),upstream.once("error",()=>client.destroy()),upstream.once("close",()=>{client.destroy(),finalize()}),client.once("error",()=>upstream.destroy()),client.once("close",()=>{upstream.destroy(),finalize()})}function closePublicConnections(){for(let[client,upstream]of publicConnections)client.destroy(),upstream.destroy();publicConnections.clear()}function checkEmpty(){if(shuttingDown||currentServer||peers.size>0||publicConnections.size>0||controlConnections.size>0){cancelEmptyShutdown();return}scheduleEmptyShutdown(EMPTY_SHUTDOWN_GRACE_MS)}function scheduleEmptyShutdown(delayMs){emptyTimer||shuttingDown||(emptyTimer=setTimeout(()=>{emptyTimer=void 0,!currentServer&&peers.size===0&&publicConnections.size===0&&controlConnections.size===0&&shutdownCoordinator()},delayMs),emptyTimer.unref())}function cancelEmptyShutdown(){emptyTimer&&(clearTimeout(emptyTimer),emptyTimer=void 0)}async function shutdownCoordinator(){if(!shuttingDown){shuttingDown=!0,cancelEmptyShutdown(),closePublicConnections();for(let connection of controlConnections)connection.destroy();await Promise.all([closeServer(publicServer),closeServer(controlServer)]),await Promise.all([cleanupSocket(publicPath),cleanupSocket(controlPath)]),process.exit(0)}}function writeRoutedLine(socket,message){socket.destroyed||socket.write(encodeControlLine(message))}function attachRoutedLineReader(socket,onMessage){let buffered="";socket.setEncoding("utf8"),socket.on("data",chunk=>{if(buffered+=chunk,Buffer.byteLength(buffered)>MAX_CONTROL_LINE_BYTES){socket.destroy(new Error("Coordinator message is too large"));return}for(;;){let newline=buffered.indexOf(`
5
+ `);if(newline===-1)return;let line=buffered.slice(0,newline);buffered=buffered.slice(newline+1);try{let message=JSON.parse(line);if(typeof message?.type!="string")throw new Error("Coordinator message must have a type");onMessage(message)}catch(error){socket.destroy(error instanceof Error?error:new Error(String(error)));return}}})}function listen(server,path){return new Promise((resolve3,reject)=>{let onError=error=>{server.off("listening",onListening),reject(error)},onListening=()=>{server.off("error",onError),resolve3()};server.once("error",onError),server.once("listening",onListening),server.listen(path)})}function closeServer(server){return server.listening?new Promise(resolve3=>server.close(()=>resolve3())):Promise.resolve()}async function restrictSocket(path){process.platform!=="win32"&&await chmod(path,384)}async function removeStaleSocket(path){try{if(!(await lstat(path)).isSocket())throw new Error(`Coordinator path is not a socket: ${path}`)}catch(error){if(error instanceof Error&&"code"in error&&error.code==="ENOENT")return;throw error}if(await new Promise((resolve3,reject)=>{let socket=createConnection(path);socket.once("connect",()=>{socket.destroy(),resolve3(!0)}),socket.once("error",error=>{socket.destroy(),error.code==="ECONNREFUSED"||error.code==="ENOENT"?resolve3(!1):reject(error)})}))throw new Error(`Coordinator socket is already active: ${path}`);await cleanupSocket(path)}async function cleanupSocket(path){process.platform!=="win32"&&await unlink(path).catch(error=>{if(!(error instanceof Error&&"code"in error&&error.code==="ENOENT"))throw error})}if(isDirectInternalProcessEntry(import.meta.url)){if(consumeInternalProcessRole()!=="coordinator")throw new Error("Coordinator entrypoint requires an internal coordinator invocation");runCoordinatorProcess(process.argv.slice(2)).catch(error=>{console.error(error),process.exit(1)})}export{spawnProcess,spawnProcessSync,waitForChildProcess,canonicalizePath,getFileRevision,isLocalPath,normalizePath,resolvePath,getCwdRelativePath,formatPathRelativeToCwdOrAbsolute,markPathIgnoredByCloudSync,splitBom,stripBom,isBunBinary,isBundledNode,detectInstallMethod,getSelfUpdateCommand,getSelfUpdateUnavailableInstruction,getPackageDir,getThemesDir,getExportTemplateDir,getReadmePath,getDocsPath,getExamplesPath,getChangelogPath,getBundledInteractiveAssetPath,PACKAGE_NAME,APP_NAME,APP_TITLE,CONFIG_DIR_NAME,VERSION,ENV_AGENT_DIR,ENV_SESSION_DIR,expandTildePath,getShareViewerUrl,getAgentDir,getCustomThemesDir,getAuthPath,getSettingsPath,getBinDir,getSessionsDir,getDebugLogPath,isDirectInternalProcessEntry,consumeInternalProcessRole,spawnInternalProcess,terminateInternalProcess,MAX_CONTROL_LINE_BYTES,encodeControlLine,COORDINATOR_PROTOCOL_VERSION,CoordinatorConnection,ensureCoordinator,runCoordinatorProcess};
@@ -1,2 +1,2 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
2
- import{AssistantMessageEventStream,formatThrownValue}from"./chunk-UAQELI3K.js";function createSetupErrorMessage(model,error){return{role:"assistant",content:[],api:model.api,provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"error",errorMessage:error instanceof Error?error.message:String(error),timestamp:Date.now()}}function hasResult(source){return typeof source.result=="function"}async function forwardStream(target,source){for await(let event of source)target.push(event);target.end(hasResult(source)?await source.result():void 0)}function lazyStream(model,setup){let outer=new AssistantMessageEventStream;return setup().then(inner=>forwardStream(outer,inner)).catch(error=>{let message=createSetupErrorMessage(model,error);outer.push({type:"error",reason:"error",error:message}),outer.end(message)}),outer}function lazyApi(load,capabilities){let api={stream:(model,context,options)=>lazyStream(model,async()=>(await load()).stream(model,context,options)),streamSimple:(model,context,options)=>lazyStream(model,async()=>(await load()).streamSimple(model,context,options))};return capabilities?.fetchDeferred&&(api.fetchDeferred=(model,handle,options)=>lazyStream(model,async()=>{let implementation=await load();if(!implementation.fetchDeferred)throw new Error("API does not support deferred responses");return implementation.fetchDeferred(model,handle,options)})),capabilities?.cancelDeferred&&(api.cancelDeferred=async(model,handle,options)=>{let implementation=await load();if(!implementation.cancelDeferred)throw new Error("API cannot cancel deferred responses");await implementation.cancelDeferred(model,handle,options)}),api}var __rewriteRelativeImportExtension=function(path,preserveJsx){return typeof path=="string"&&/^\.\.?\//.test(path)?path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(m,tsx,d,ext,cm){return tsx?preserveJsx?".jsx":".js":d&&(!ext||!cm)?m:d+ext+"."+cm.toLowerCase()+"js"}):path},importNodeModule=specifier=>import(__rewriteRelativeImportExtension(specifier));function getProcessEnv(){return globalThis.process?.env}function defaultProviderAuthContext(){return{async env(name){let value=getProcessEnv()?.[name];return typeof value=="string"&&value.trim().length>0?value:void 0},async fileExists(path){try{let fs=await importNodeModule("node:fs/promises"),resolved=path;return resolved.startsWith("~")&&(resolved=(await importNodeModule("node:os")).homedir()+resolved.slice(1)),await fs.access(resolved),!0}catch{return!1}}}}function abortReason(signal){if(signal.reason!==void 0)return signal.reason;let error=new Error("The operation was aborted");return error.name="AbortError",error}function operationSignal(signal){return signal??new AbortController().signal}function raceWithAbortSignal(operation,signal){return signal.aborted?(operation.catch(()=>{}),Promise.reject(abortReason(signal))):new Promise((resolve,reject)=>{let settled=!1,cleanup=()=>signal.removeEventListener("abort",onAbort),onAbort=()=>{settled||(settled=!0,cleanup(),reject(abortReason(signal)))};signal.addEventListener("abort",onAbort,{once:!0}),operation.then(value=>{settled||(settled=!0,cleanup(),resolve(value))},error=>{settled||(settled=!0,cleanup(),reject(error))}),signal.aborted&&onAbort()})}var InMemoryCredentialStore=class{credentials=new Map;chains=new Map;enqueue(providerId,task,options){let signal=operationSignal(options?.signal),previous=this.chains.get(providerId)??Promise.resolve(),queued=(async()=>(await previous.catch(()=>{}),signal.throwIfAborted(),task()))(),tail=queued.catch(()=>{});return this.chains.set(providerId,tail),tail.then(()=>{this.chains.get(providerId)===tail&&this.chains.delete(providerId)}),raceWithAbortSignal(queued,signal)}async read(providerId,options){return options?.signal?.throwIfAborted(),this.credentials.get(providerId)}async list(options){return options?.signal?.throwIfAborted(),[...this.credentials].map(([providerId,credential])=>({providerId,type:credential.type}))}modify(providerId,fn,options){return this.enqueue(providerId,async()=>{let current=this.credentials.get(providerId),next=await fn(current);return options?.signal?.throwIfAborted(),next!==void 0&&this.credentials.set(providerId,next),next??current},options)}delete(providerId,options){return this.enqueue(providerId,async()=>{this.credentials.delete(providerId)},options)}};var ModelsError=class extends Error{code;constructor(code,message,options){super(withCauseDetail(message,options?.cause),options),this.name="ModelsError",this.code=code}};function withCauseDetail(message,cause){if(cause==null)return message;let detail=formatThrownValue(cause).trim();return!detail||message.includes(detail)?message:`${message}: ${detail}`}function resolveProviderAuth(provider,credentials,authContext,overrides){let signal=operationSignal(overrides?.signal);return raceWithAbortSignal(resolveProviderAuthWithSignal(provider,credentials,authContext,overrides,signal),signal)}async function resolveProviderAuthWithSignal(provider,credentials,authContext,overrides,signal){signal.throwIfAborted();let requestAuthContext=overrides?.env?overlayEnvAuthContext(authContext,overrides.env):authContext;if(overrides?.apiKey!==void 0&&provider.auth.apiKey)return resolveApiKey(requestAuthContext,provider.auth.apiKey,provider.id,{type:"api_key",key:overrides.apiKey,env:overrides.env},signal);let stored=await readCredential(credentials,provider.id,signal);if(stored){if(stored.type==="oauth"&&provider.auth.oauth)return resolveStoredOAuth(credentials,provider.id,provider.auth.oauth,stored,signal,overrides?.minOAuthValidityMs);if(stored.type==="api_key"&&provider.auth.apiKey){let credential=overrides?.env?{...stored,env:{...stored.env,...overrides.env}}:stored;return resolveApiKey(requestAuthContext,provider.auth.apiKey,provider.id,credential,signal)}return}return provider.auth.apiKey?resolveApiKey(requestAuthContext,provider.auth.apiKey,provider.id,void 0,signal):void 0}function overlayEnvAuthContext(base,env){return{env:async name=>env[name]||await base.env(name),fileExists:path=>base.fileExists(path)}}var DEFAULT_OAUTH_MINIMUM_VALIDITY_MS=300*1e3,DEFAULT_OAUTH_REFRESH_TIMEOUT_MS=15e3;async function resolveStoredOAuth(credentials,providerId,oauth,stored,signal,minOAuthValidityMs){let minimumValidityMs=Math.max(DEFAULT_OAUTH_MINIMUM_VALIDITY_MS,minOAuthValidityMs??0),expiresSoon=credential2=>Date.now()+minimumValidityMs>=credential2.expires,credential=stored;if(expiresSoon(credential)){let post;try{post=await credentials.modify(providerId,async current=>{if(current?.type==="oauth"&&expiresSoon(current))try{let refreshSignal=AbortSignal.any([signal,AbortSignal.timeout(DEFAULT_OAUTH_REFRESH_TIMEOUT_MS)]);return await oauth.refresh(current,refreshSignal)}catch(error){throw new ModelsError("oauth",`OAuth refresh failed for ${providerId}`,{cause:error})}},{signal})}catch(error){throw error instanceof ModelsError?error:new ModelsError("auth",`Credential store modify failed for ${providerId}`,{cause:error})}if(post?.type!=="oauth")return;if(credential=post,minOAuthValidityMs!==void 0&&expiresSoon(credential))throw new ModelsError("oauth",`OAuth refresh returned a token that expires too soon for ${providerId}`)}try{return{auth:await oauth.toAuth(credential),source:"OAuth"}}catch(error){throw new ModelsError("oauth",`OAuth auth derivation failed for ${providerId}`,{cause:error})}}async function resolveApiKey(authContext,apiKey,providerId,credential,signal){try{return await apiKey.resolve({ctx:authContext,credential,signal})}catch(error){throw new ModelsError("auth",`API key auth failed for provider ${providerId}`,{cause:error})}}async function readCredential(credentials,providerId,signal){try{return await credentials.read(providerId,{signal})}catch(error){throw new ModelsError("auth",`Credential store read failed for ${providerId}`,{cause:error})}}var InMemoryModelsStore=class{entries=new Map;async read(providerId,options){options?.signal?.throwIfAborted();let entry=this.entries.get(providerId);return entry?structuredClone(entry):void 0}async write(providerId,entry,options){options?.signal?.throwIfAborted(),this.entries.set(providerId,structuredClone(entry))}async delete(providerId,options){options?.signal?.throwIfAborted(),this.entries.delete(providerId)}};function mergeHeaders(base,override){if(!base&&!override)return;let merged={...base};for(let[name,value]of Object.entries(override??{})){let lowerName=name.toLowerCase();for(let existingName of Object.keys(merged))existingName.toLowerCase()===lowerName&&delete merged[existingName];merged[name]=value}return merged}var ModelsImpl=class{providers=new Map;credentials;modelsStore;authContext;refreshGenerations=new Map;refreshControllers=new Map;publicationChains=new Map;constructor(options){this.credentials=options?.credentials??new InMemoryCredentialStore,this.modelsStore=options?.modelsStore??new InMemoryModelsStore,this.authContext=options?.authContext??defaultProviderAuthContext()}setProvider(provider){this.supersedeProviderRefresh(provider.id),this.providers.set(provider.id,provider)}deleteProvider(id){this.supersedeProviderRefresh(id),this.providers.delete(id)}clearProviders(){for(let id of new Set([...this.providers.keys(),...this.refreshControllers.keys()]))this.supersedeProviderRefresh(id);this.providers.clear()}getProviders(){return Array.from(this.providers.values())}getProvider(id){return this.providers.get(id)}getModels(provider){if(provider!==void 0){let entry=this.providers.get(provider);if(!entry)return[];try{return entry.getModels()}catch{return[]}}let models=[];for(let entry of this.providers.values())try{models.push(...entry.getModels())}catch{}return models}getModel(provider,id){return this.getModels(provider).find(model=>model.id===id)}supersedeProviderRefresh(providerId){let generation=(this.refreshGenerations.get(providerId)??0)+1;this.refreshGenerations.set(providerId,generation);let previous=this.refreshControllers.get(providerId);return previous&&(this.refreshControllers.delete(providerId),previous.abort()),generation}beginProviderRefresh(providerId){let generation=this.supersedeProviderRefresh(providerId),controller=new AbortController;return this.refreshControllers.set(providerId,controller),{generation,controller}}publishProviderModels(providerId,generation,signal,publication){let previous=this.publicationChains.get(providerId)??Promise.resolve(),queued=(async()=>(await previous.catch(()=>{}),signal.aborted||this.refreshGenerations.get(providerId)!==generation||(publication.persist===null?await this.modelsStore.delete(providerId,{signal}):publication.persist!==void 0&&await this.modelsStore.write(providerId,structuredClone(publication.persist),{signal}),signal.aborted||this.refreshGenerations.get(providerId)!==generation)?!1:(publication.update?.(),!0)))(),tail=queued.catch(()=>{});return this.publicationChains.set(providerId,tail),tail.then(()=>{this.publicationChains.get(providerId)===tail&&this.publicationChains.delete(providerId)}),raceWithAbortSignal(queued,signal)}async runProviderRefreshPhase(provider,credential,allowNetwork,force,generation,signal){let stored=await this.modelsStore.read(provider.id,{signal});await provider.refreshModels({credential,stored:stored?structuredClone(stored):void 0,publish:publication=>this.publishProviderModels(provider.id,generation,signal,publication),allowNetwork,force:allowNetwork?force:void 0,signal})}async refresh(options={}){let allowNetwork=options.allowNetwork??!0,callerSignal=operationSignal(options.signal),errors=new Map;if(callerSignal.aborted)return{aborted:!0,errors};let selected=options.providers?new Set(options.providers):void 0,refreshable=Array.from(this.providers.values()).filter(provider=>provider.refreshModels!==void 0&&(!selected||selected.has(provider.id))),refresh=Promise.all(refreshable.map(async provider=>{let{generation,controller}=this.beginProviderRefresh(provider.id),signal=AbortSignal.any([callerSignal,controller.signal]),operation=(async()=>{let storedCredential,credentialError;try{storedCredential=await this.readCredential(provider.id,signal)}catch(error){credentialError=error}if(await this.runProviderRefreshPhase(provider,storedCredential,!1,void 0,generation,signal),credentialError!==void 0)throw credentialError;if(!allowNetwork||signal.aborted)return;let credential=await this.resolveRefreshCredential(provider,storedCredential,signal);credential&&await this.runProviderRefreshPhase(provider,credential,!0,options.force,generation,signal)})();try{await raceWithAbortSignal(operation,signal)}catch(error){signal.aborted||errors.set(provider.id,error instanceof Error?error:new ModelsError("model_source",`Model refresh failed for ${provider.id}`,{cause:error}))}finally{this.refreshControllers.get(provider.id)===controller&&this.refreshControllers.delete(provider.id)}}));try{await raceWithAbortSignal(refresh,callerSignal)}catch(error){if(!callerSignal.aborted)throw error}return{aborted:callerSignal.aborted,errors:new Map(errors)}}async resolveRefreshCredential(provider,stored,signal){if(stored?.type==="oauth"){let oauth=provider.auth.oauth;if(!oauth)return;if(Date.now()<stored.expires)return stored;if(signal.aborted)return;let post=await this.credentials.modify(provider.id,async current=>{if(!(current?.type!=="oauth"||Date.now()<current.expires))return oauth.refresh(current,signal)},{signal});return post?.type==="oauth"?post:void 0}let apiKey=provider.auth.apiKey;if(!apiKey)return;let credential=stored?.type==="api_key"?stored:void 0,result=await apiKey.resolve({ctx:this.authContext,credential,signal});if(result)return{type:"api_key",key:result.auth.apiKey,env:result.env}}async readCredential(providerId,signal){try{return await this.credentials.read(providerId,{signal})}catch(error){throw new ModelsError("auth",`Credential store read failed for ${providerId}`,{cause:error})}}async checkProviderAuth(provider,credential,signal){if(credential?.type==="oauth")return provider.auth.oauth?{source:"OAuth",type:"oauth"}:void 0;let apiKey=provider.auth.apiKey;if(!apiKey)return;if(apiKey.check)try{return await apiKey.check({ctx:this.authContext,credential:credential?.type==="api_key"?credential:void 0,signal})}catch(error){throw new ModelsError("auth",`API key auth check failed for provider ${provider.id}`,{cause:error})}let resolution=await resolveProviderAuth(provider,this.credentials,this.authContext,{signal});return resolution?{source:resolution.source,type:"api_key"}:void 0}checkAuth(providerId,options){let signal=operationSignal(options?.signal),check=(async()=>{signal.throwIfAborted();let provider=this.providers.get(providerId);if(provider)return this.checkProviderAuth(provider,await this.readCredential(providerId,signal),signal)})();return raceWithAbortSignal(check,signal)}getAvailable(providerId,options){let signal=operationSignal(options?.signal),available=(async()=>{signal.throwIfAborted();let providers=providerId?[this.providers.get(providerId)].filter(entry=>entry!==void 0):this.getProviders();return(await Promise.all(providers.map(async provider=>{let credential=await this.readCredential(provider.id,signal);return{provider,credential,auth:await this.checkProviderAuth(provider,credential,signal)}}))).flatMap(({provider,credential,auth})=>{if(!auth)return[];let models=provider.getModels();return provider.filterModels?.(models,credential)??models})})();return raceWithAbortSignal(available,signal)}async getAuth(providerOrModel,overrides){let signal=operationSignal(overrides?.signal),providerId=typeof providerOrModel=="string"?providerOrModel:providerOrModel.provider,provider=this.providers.get(providerId);if(!provider)return;let result=await resolveProviderAuth(provider,this.credentials,this.authContext,{...overrides,signal});return!result||typeof providerOrModel=="string"||!providerOrModel.headers?result:{...result,auth:{...result.auth,headers:mergeHeaders(result.auth.headers,providerOrModel.headers)}}}async login(providerId,type,interaction){let signal=operationSignal(interaction.signal);signal.throwIfAborted();let provider=this.providers.get(providerId);if(!provider)throw new ModelsError("provider",`Unknown provider: ${providerId}`);let method=type==="oauth"?provider.auth.oauth:provider.auth.apiKey;if(!method?.login)throw new ModelsError("auth",`${provider.name} does not support ${type} login`);let loginOperation=method.login({...interaction,signal}),credential=await raceWithAbortSignal(loginOperation,signal),mutationStarted=!1,markMutationStarted,started=new Promise(resolve=>{markMutationStarted=resolve}),mutation=this.credentials.modify(providerId,async()=>(mutationStarted=!0,markMutationStarted?.(),credential),{signal});mutation.catch(()=>{});try{await new Promise((resolve,reject)=>{let onAbort=()=>{mutationStarted||reject(signal.reason)};signal.addEventListener("abort",onAbort,{once:!0}),Promise.race([started,mutation]).then(()=>{signal.removeEventListener("abort",onAbort),resolve()},error=>{signal.removeEventListener("abort",onAbort),reject(error)}),signal.aborted&&onAbort()}),await mutation}catch(error){throw signal.throwIfAborted(),new ModelsError("auth",`Credential store modify failed for ${providerId}`,{cause:error})}return credential}async logout(providerId,options){let signal=operationSignal(options?.signal);signal.throwIfAborted();try{await this.credentials.delete(providerId,{signal})}catch(error){throw signal.throwIfAborted(),new ModelsError("auth",`Credential store delete failed for ${providerId}`,{cause:error})}}requireProvider(model){let provider=this.providers.get(model.provider);if(!provider)throw new ModelsError("provider",`Unknown provider: ${model.provider}`);return provider}async applyAuth(model,options){this.requireProvider(model);let resolution=await this.getAuth(model,{apiKey:options?.apiKey,env:options?.env,signal:options?.signal});if(!resolution)throw new ModelsError("auth",`Provider is not configured: ${model.provider}`);let auth=resolution.auth,apiKey=options?.apiKey??auth.apiKey,headers=mergeHeaders(auth.headers,options?.headers);options?.transformHeaders&&(headers=await options.transformHeaders(headers??{}));let env=resolution.env||options?.env?{...resolution.env??{},...options?.env??{}}:void 0,requestModel=auth.baseUrl?{...model,baseUrl:auth.baseUrl}:model,{transformHeaders:_transformHeaders,...providerOptions}=options??{},requestOptions={...providerOptions,apiKey,headers,env};return{requestModel,requestOptions}}stream(model,context,options){return lazyStream(model,async()=>{let provider=this.requireProvider(model),{requestModel,requestOptions}=await this.applyAuth(model,options);return provider.stream(requestModel,context,requestOptions)})}async complete(model,context,options){return this.stream(model,context,options).result()}streamSimple(model,context,options){return lazyStream(model,async()=>{let provider=this.requireProvider(model),{requestModel,requestOptions}=await this.applyAuth(model,options);return provider.streamSimple(requestModel,context,requestOptions)})}async completeSimple(model,context,options){return this.streamSimple(model,context,options).result()}async fetchDeferred(model,handle,options){return lazyStream(model,async()=>{let provider=this.requireProvider(model);if(!provider.fetchDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);let{requestModel,requestOptions}=await this.applyAuth(model,options);return provider.fetchDeferred(requestModel,handle,requestOptions)}).result()}async cancelDeferred(model,handle,options){let provider=this.requireProvider(model);if(!provider.cancelDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);let{requestModel,requestOptions}=await this.applyAuth(model,options);await provider.cancelDeferred(requestModel,handle,requestOptions)}};function createModels(options){return new ModelsImpl(options)}function createProvider(input){let baselineModels=input.models,dynamicModels=[],fetchModels=input.fetchModels,currentModels=()=>{let merged=[...baselineModels];for(let model of dynamicModels){let index=merged.findIndex(entry=>entry.id===model.id);index>=0?merged[index]=model:merged.push(model)}return merged},single=typeof input.api.stream=="function"?input.api:void 0,byApi=single?void 0:input.api,apiFor=model=>single??byApi?.[model.api],dispatch=(model,run)=>{let streams2=apiFor(model);return streams2?run(streams2):lazyStream(model,async()=>{throw new ModelsError("stream",`Provider ${input.id} has no API implementation for "${model.api}"`)})},provider={id:input.id,name:input.name??input.id,baseUrl:input.baseUrl,headers:input.headers,auth:input.auth,getModels:currentModels,refreshModels:fetchModels?async context=>{if(context.stored){let restored=context.stored.models.filter(model=>model.provider===input.id).map(model=>model);if(!await context.publish({update:()=>{dynamicModels=restored}}))return}if(!context.allowNetwork||context.signal.aborted)return;let refreshed=await fetchModels(context);context.signal.aborted||await context.publish({persist:{models:refreshed,checkedAt:Date.now()},update:()=>{dynamicModels=refreshed}})}:void 0,filterModels:input.filterModels,stream:(model,context,options)=>dispatch(model,streams2=>streams2.stream(model,context,options)),streamSimple:(model,context,options)=>dispatch(model,streams2=>streams2.streamSimple(model,context,options))},streams=single?[single]:Object.values(byApi??{}).filter(entry=>entry!==void 0);return streams.some(entry=>entry.fetchDeferred!==void 0)&&(provider.fetchDeferred=(model,handle,options)=>lazyStream(model,async()=>{let implementation=apiFor(model);if(!implementation?.fetchDeferred)throw new ModelsError("provider",`Provider ${input.id} does not support deferred responses for "${model.api}"`);return implementation.fetchDeferred(model,handle,options)})),streams.some(entry=>entry.cancelDeferred!==void 0)&&(provider.cancelDeferred=async(model,handle,options)=>{let implementation=apiFor(model);if(!implementation?.cancelDeferred)throw new ModelsError("provider",`Provider ${input.id} cannot cancel deferred responses for "${model.api}"`);await implementation.cancelDeferred(model,handle,options)}),provider}function hasApi(model,api){return model.api===api}function calculateCost(model,usage){let inputTokens=usage.input+usage.cacheRead+usage.cacheWrite,rates=model.cost,matchedThreshold=-1;for(let tier of model.cost.tiers??[])inputTokens>tier.inputTokensAbove&&tier.inputTokensAbove>matchedThreshold&&(rates=tier,matchedThreshold=tier.inputTokensAbove);let longWrite=usage.cacheWrite1h??0,shortWrite=usage.cacheWrite-longWrite;return usage.cost.input=rates.input/1e6*usage.input,usage.cost.output=rates.output/1e6*usage.output,usage.cost.cacheRead=rates.cacheRead/1e6*usage.cacheRead,usage.cost.cacheWrite=(rates.cacheWrite*shortWrite+rates.input*2*longWrite)/1e6,usage.cost.total=usage.cost.input+usage.cost.output+usage.cost.cacheRead+usage.cost.cacheWrite,usage.cost}var EXTENDED_THINKING_LEVELS=["off","minimal","low","medium","high","xhigh","max"];function getSupportedThinkingLevels(model){return model.reasoning?EXTENDED_THINKING_LEVELS.filter(level=>{let mapped=model.thinkingLevelMap?.[level];return mapped===null?!1:level==="xhigh"||level==="max"?mapped!==void 0:!0}):["off"]}function clampThinkingLevel(model,level){let availableLevels=getSupportedThinkingLevels(model);if(availableLevels.includes(level))return level;let requestedIndex=EXTENDED_THINKING_LEVELS.indexOf(level);if(requestedIndex===-1)return availableLevels[0]??"off";for(let i=requestedIndex;i<EXTENDED_THINKING_LEVELS.length;i++){let candidate=EXTENDED_THINKING_LEVELS[i];if(availableLevels.includes(candidate))return candidate}for(let i=requestedIndex-1;i>=0;i--){let candidate=EXTENDED_THINKING_LEVELS[i];if(availableLevels.includes(candidate))return candidate}return availableLevels[0]??"off"}function modelsAreEqual(a,b){return!a||!b?!1:a.id===b.id&&a.provider===b.provider}export{lazyStream,lazyApi,defaultProviderAuthContext,InMemoryCredentialStore,ModelsError,resolveProviderAuth,InMemoryModelsStore,createModels,createProvider,hasApi,calculateCost,getSupportedThinkingLevels,clampThinkingLevel,modelsAreEqual};
2
+ import{AssistantMessageEventStream,formatThrownValue}from"./chunk-UAQELI3K.js";function createSetupErrorMessage(model,error){return{role:"assistant",content:[],api:model.api,provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"error",errorMessage:error instanceof Error?error.message:String(error),timestamp:Date.now()}}function hasResult(source){return typeof source.result=="function"}async function forwardStream(target,source){for await(let event of source)target.push(event);target.end(hasResult(source)?await source.result():void 0)}function lazyStream(model,setup){let outer=new AssistantMessageEventStream;return setup().then(inner=>forwardStream(outer,inner)).catch(error=>{let message=createSetupErrorMessage(model,error);outer.push({type:"error",reason:"error",error:message}),outer.end(message)}),outer}function lazyApi(load,capabilities){let api={stream:(model,context,options)=>lazyStream(model,async()=>(await load()).stream(model,context,options)),streamSimple:(model,context,options)=>lazyStream(model,async()=>(await load()).streamSimple(model,context,options))};return capabilities?.fetchDeferred&&(api.fetchDeferred=(model,handle,options)=>lazyStream(model,async()=>{let implementation=await load();if(!implementation.fetchDeferred)throw new Error("API does not support deferred responses");return implementation.fetchDeferred(model,handle,options)})),capabilities?.cancelDeferred&&(api.cancelDeferred=async(model,handle,options)=>{let implementation=await load();if(!implementation.cancelDeferred)throw new Error("API cannot cancel deferred responses");await implementation.cancelDeferred(model,handle,options)}),api}var __rewriteRelativeImportExtension=function(path,preserveJsx){return typeof path=="string"&&/^\.\.?\//.test(path)?path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(m,tsx,d,ext,cm){return tsx?preserveJsx?".jsx":".js":d&&(!ext||!cm)?m:d+ext+"."+cm.toLowerCase()+"js"}):path},importNodeModule=specifier=>import(__rewriteRelativeImportExtension(specifier));function getProcessEnv(){return globalThis.process?.env}function defaultProviderAuthContext(){return{async env(name){let value=getProcessEnv()?.[name];return typeof value=="string"&&value.trim().length>0?value:void 0},async fileExists(path){try{let fs=await importNodeModule("node:fs/promises"),resolved=path;return resolved.startsWith("~")&&(resolved=(await importNodeModule("node:os")).homedir()+resolved.slice(1)),await fs.access(resolved),!0}catch{return!1}}}}function abortReason(signal){if(signal.reason!==void 0)return signal.reason;let error=new Error("The operation was aborted");return error.name="AbortError",error}function operationSignal(signal){return signal??new AbortController().signal}function raceWithAbortSignal(operation,signal){return signal.aborted?(operation.catch(()=>{}),Promise.reject(abortReason(signal))):new Promise((resolve,reject)=>{let settled=!1,cleanup=()=>signal.removeEventListener("abort",onAbort),onAbort=()=>{settled||(settled=!0,cleanup(),reject(abortReason(signal)))};signal.addEventListener("abort",onAbort,{once:!0}),operation.then(value=>{settled||(settled=!0,cleanup(),resolve(value))},error=>{settled||(settled=!0,cleanup(),reject(error))}),signal.aborted&&onAbort()})}var InMemoryCredentialStore=class{credentials=new Map;chains=new Map;enqueue(providerId,task,options){let signal=operationSignal(options?.signal),previous=this.chains.get(providerId)??Promise.resolve(),queued=(async()=>(await previous.catch(()=>{}),signal.throwIfAborted(),task()))(),tail=queued.catch(()=>{});return this.chains.set(providerId,tail),tail.then(()=>{this.chains.get(providerId)===tail&&this.chains.delete(providerId)}),raceWithAbortSignal(queued,signal)}async read(providerId,options){return options?.signal?.throwIfAborted(),this.credentials.get(providerId)}async list(options){return options?.signal?.throwIfAborted(),[...this.credentials].map(([providerId,credential])=>({providerId,type:credential.type}))}modify(providerId,fn,options){return this.enqueue(providerId,async()=>{let current=this.credentials.get(providerId),next=await fn(current);return options?.signal?.throwIfAborted(),next!==void 0&&this.credentials.set(providerId,next),next??current},options)}delete(providerId,options){return this.enqueue(providerId,async()=>{this.credentials.delete(providerId)},options)}};var ModelsError=class extends Error{code;constructor(code,message,options){super(withCauseDetail(message,options?.cause),options),this.name="ModelsError",this.code=code}};function withCauseDetail(message,cause){if(cause==null)return message;let detail=formatThrownValue(cause).trim();return!detail||message.includes(detail)?message:`${message}: ${detail}`}function resolveProviderAuth(provider,credentials,authContext,overrides){let signal=operationSignal(overrides?.signal);return raceWithAbortSignal(resolveProviderAuthWithSignal(provider,credentials,authContext,overrides,signal),signal)}async function resolveProviderAuthWithSignal(provider,credentials,authContext,overrides,signal){signal.throwIfAborted();let requestAuthContext=overrides?.env?overlayEnvAuthContext(authContext,overrides.env):authContext;if(overrides?.apiKey!==void 0&&provider.auth.apiKey)return resolveApiKey(requestAuthContext,provider.auth.apiKey,provider.id,{type:"api_key",key:overrides.apiKey,env:overrides.env},signal);let stored=await readCredential(credentials,provider.id,signal);if(stored){if(stored.type==="oauth"&&provider.auth.oauth)return resolveStoredOAuth(credentials,provider.id,provider.auth.oauth,stored,signal,overrides?.minOAuthValidityMs);if(stored.type==="api_key"&&provider.auth.apiKey){let credential=overrides?.env?{...stored,env:{...stored.env,...overrides.env}}:stored;return resolveApiKey(requestAuthContext,provider.auth.apiKey,provider.id,credential,signal)}return}return provider.auth.apiKey?resolveApiKey(requestAuthContext,provider.auth.apiKey,provider.id,void 0,signal):void 0}function overlayEnvAuthContext(base,env){return{env:async name=>env[name]||await base.env(name),fileExists:path=>base.fileExists(path)}}var DEFAULT_OAUTH_MINIMUM_VALIDITY_MS=300*1e3,DEFAULT_OAUTH_REFRESH_TIMEOUT_MS=15e3;async function resolveStoredOAuth(credentials,providerId,oauth,stored,signal,minOAuthValidityMs){let minimumValidityMs=Math.max(DEFAULT_OAUTH_MINIMUM_VALIDITY_MS,minOAuthValidityMs??0),expiresSoon=credential2=>Date.now()+minimumValidityMs>=credential2.expires,credential=stored;if(expiresSoon(credential)){let post;try{post=await credentials.modify(providerId,async current=>{if(current?.type==="oauth"&&expiresSoon(current))try{let refreshSignal=AbortSignal.any([signal,AbortSignal.timeout(DEFAULT_OAUTH_REFRESH_TIMEOUT_MS)]);return await oauth.refresh(current,refreshSignal)}catch(error){throw new ModelsError("oauth",`OAuth refresh failed for ${providerId}`,{cause:error})}},{signal})}catch(error){throw error instanceof ModelsError?error:new ModelsError("auth",`Credential store modify failed for ${providerId}`,{cause:error})}if(post?.type!=="oauth")return;if(credential=post,minOAuthValidityMs!==void 0&&expiresSoon(credential))throw new ModelsError("oauth",`OAuth refresh returned a token that expires too soon for ${providerId}`)}try{return{auth:await oauth.toAuth(credential),source:"OAuth"}}catch(error){throw new ModelsError("oauth",`OAuth auth derivation failed for ${providerId}`,{cause:error})}}async function resolveApiKey(authContext,apiKey,providerId,credential,signal){try{return await apiKey.resolve({ctx:authContext,credential,signal})}catch(error){throw new ModelsError("auth",`API key auth failed for provider ${providerId}`,{cause:error})}}async function readCredential(credentials,providerId,signal){try{return await credentials.read(providerId,{signal})}catch(error){throw new ModelsError("auth",`Credential store read failed for ${providerId}`,{cause:error})}}var InMemoryModelsStore=class{entries=new Map;async read(providerId,options){options?.signal?.throwIfAborted();let entry=this.entries.get(providerId);return entry?structuredClone(entry):void 0}async write(providerId,entry,options){options?.signal?.throwIfAborted(),this.entries.set(providerId,structuredClone(entry))}async delete(providerId,options){options?.signal?.throwIfAborted(),this.entries.delete(providerId)}};function mergeHeaders(base,override){if(!base&&!override)return;let merged={...base};for(let[name,value]of Object.entries(override??{})){let lowerName=name.toLowerCase();for(let existingName of Object.keys(merged))existingName.toLowerCase()===lowerName&&delete merged[existingName];merged[name]=value}return merged}var ModelsImpl=class{providers=new Map;credentials;modelsStore;authContext;refreshGenerations=new Map;refreshControllers=new Map;publicationChains=new Map;constructor(options){this.credentials=options?.credentials??new InMemoryCredentialStore,this.modelsStore=options?.modelsStore??new InMemoryModelsStore,this.authContext=options?.authContext??defaultProviderAuthContext()}setProvider(provider){this.supersedeProviderRefresh(provider.id),this.providers.set(provider.id,provider)}deleteProvider(id){this.supersedeProviderRefresh(id),this.providers.delete(id)}clearProviders(){for(let id of new Set([...this.providers.keys(),...this.refreshControllers.keys()]))this.supersedeProviderRefresh(id);this.providers.clear()}getProviders(){return Array.from(this.providers.values())}getProvider(id){return this.providers.get(id)}getModels(provider){if(provider!==void 0){let entry=this.providers.get(provider);if(!entry)return[];try{return entry.getModels()}catch{return[]}}let models=[];for(let entry of this.providers.values())try{models.push(...entry.getModels())}catch{}return models}getModel(provider,id){return this.getModels(provider).find(model=>model.id===id)}supersedeProviderRefresh(providerId){let generation=(this.refreshGenerations.get(providerId)??0)+1;this.refreshGenerations.set(providerId,generation);let previous=this.refreshControllers.get(providerId);return previous&&(this.refreshControllers.delete(providerId),previous.abort()),generation}beginProviderRefresh(providerId){let generation=this.supersedeProviderRefresh(providerId),controller=new AbortController;return this.refreshControllers.set(providerId,controller),{generation,controller}}publishProviderModels(providerId,generation,signal,publication){let previous=this.publicationChains.get(providerId)??Promise.resolve(),queued=(async()=>(await previous.catch(()=>{}),signal.aborted||this.refreshGenerations.get(providerId)!==generation||(publication.persist===null?await this.modelsStore.delete(providerId,{signal}):publication.persist!==void 0&&await this.modelsStore.write(providerId,structuredClone(publication.persist),{signal}),signal.aborted||this.refreshGenerations.get(providerId)!==generation)?!1:(publication.update?.(),!0)))(),tail=queued.catch(()=>{});return this.publicationChains.set(providerId,tail),tail.then(()=>{this.publicationChains.get(providerId)===tail&&this.publicationChains.delete(providerId)}),raceWithAbortSignal(queued,signal)}async runProviderRefreshPhase(provider,credential,allowNetwork,force,generation,signal){let stored=await this.modelsStore.read(provider.id,{signal});await provider.refreshModels({credential,stored:stored?structuredClone(stored):void 0,publish:publication=>this.publishProviderModels(provider.id,generation,signal,publication),allowNetwork,force:allowNetwork?force:void 0,signal})}async refresh(options={}){let allowNetwork=options.allowNetwork??!0,callerSignal=operationSignal(options.signal),errors=new Map;if(callerSignal.aborted)return{aborted:!0,errors};let selected=options.providers?new Set(options.providers):void 0,refreshable=Array.from(this.providers.values()).filter(provider=>provider.refreshModels!==void 0&&(!selected||selected.has(provider.id))),refresh=Promise.all(refreshable.map(async provider=>{let{generation,controller}=this.beginProviderRefresh(provider.id),signal=AbortSignal.any([callerSignal,controller.signal]),operation=(async()=>{let storedCredential,credentialError;try{storedCredential=await this.readCredential(provider.id,signal)}catch(error){credentialError=error}if(await this.runProviderRefreshPhase(provider,storedCredential,!1,void 0,generation,signal),credentialError!==void 0)throw credentialError;if(!allowNetwork||signal.aborted)return;let credential=await this.resolveRefreshCredential(provider,storedCredential,signal);credential&&await this.runProviderRefreshPhase(provider,credential,!0,options.force,generation,signal)})();try{await raceWithAbortSignal(operation,signal)}catch(error){signal.aborted||errors.set(provider.id,error instanceof Error?error:new ModelsError("model_source",`Model refresh failed for ${provider.id}`,{cause:error}))}finally{this.refreshControllers.get(provider.id)===controller&&this.refreshControllers.delete(provider.id)}}));try{await raceWithAbortSignal(refresh,callerSignal)}catch(error){if(!callerSignal.aborted)throw error}return{aborted:callerSignal.aborted,errors:new Map(errors)}}async resolveRefreshCredential(provider,stored,signal){if(stored?.type==="oauth"){let oauth=provider.auth.oauth;if(!oauth)return;if(Date.now()<stored.expires)return stored;if(signal.aborted)return;let post=await this.credentials.modify(provider.id,async current=>{if(!(current?.type!=="oauth"||Date.now()<current.expires))return oauth.refresh(current,signal)},{signal});return post?.type==="oauth"?post:void 0}let apiKey=provider.auth.apiKey;if(!apiKey)return;let credential=stored?.type==="api_key"?stored:void 0,result=await apiKey.resolve({ctx:this.authContext,credential,signal});if(result)return{type:"api_key",key:result.auth.apiKey,env:result.env}}async readCredential(providerId,signal){try{return await this.credentials.read(providerId,{signal})}catch(error){throw new ModelsError("auth",`Credential store read failed for ${providerId}`,{cause:error})}}async checkProviderAuth(provider,credential,signal){if(credential?.type==="oauth")return provider.auth.oauth?{source:"OAuth",type:"oauth"}:void 0;let apiKey=provider.auth.apiKey;if(!apiKey)return;if(apiKey.check)try{return await apiKey.check({ctx:this.authContext,credential:credential?.type==="api_key"?credential:void 0,signal})}catch(error){throw new ModelsError("auth",`API key auth check failed for provider ${provider.id}`,{cause:error})}let resolution=await resolveProviderAuth(provider,this.credentials,this.authContext,{signal});return resolution?{source:resolution.source,type:"api_key"}:void 0}checkAuth(providerId,options){let signal=operationSignal(options?.signal),check=(async()=>{signal.throwIfAborted();let provider=this.providers.get(providerId);if(provider)return this.checkProviderAuth(provider,await this.readCredential(providerId,signal),signal)})();return raceWithAbortSignal(check,signal)}getAvailable(providerId,options){let signal=operationSignal(options?.signal),available=(async()=>{signal.throwIfAborted();let providers=providerId?[this.providers.get(providerId)].filter(entry=>entry!==void 0):this.getProviders();return(await Promise.all(providers.map(async provider=>{let credential=await this.readCredential(provider.id,signal);return{provider,credential,auth:await this.checkProviderAuth(provider,credential,signal)}}))).flatMap(({provider,credential,auth})=>{if(!auth)return[];let models=provider.getModels();return provider.filterModels?.(models,credential)??models})})();return raceWithAbortSignal(available,signal)}async getAuth(providerOrModel,overrides){let signal=operationSignal(overrides?.signal),providerId=typeof providerOrModel=="string"?providerOrModel:providerOrModel.provider,provider=this.providers.get(providerId);if(!provider)return;let result=await resolveProviderAuth(provider,this.credentials,this.authContext,{...overrides,signal});return!result||typeof providerOrModel=="string"||!providerOrModel.headers?result:{...result,auth:{...result.auth,headers:mergeHeaders(result.auth.headers,providerOrModel.headers)}}}async login(providerId,type,interaction){let signal=operationSignal(interaction.signal);signal.throwIfAborted();let provider=this.providers.get(providerId);if(!provider)throw new ModelsError("provider",`Unknown provider: ${providerId}`);let method=type==="oauth"?provider.auth.oauth:provider.auth.apiKey;if(!method?.login)throw new ModelsError("auth",`${provider.name} does not support ${type} login`);let loginOperation=method.login({...interaction,signal}),credential=await raceWithAbortSignal(loginOperation,signal),mutationStarted=!1,markMutationStarted,started=new Promise(resolve=>{markMutationStarted=resolve}),mutation=this.credentials.modify(providerId,async()=>(mutationStarted=!0,markMutationStarted?.(),credential),{signal});mutation.catch(()=>{});try{await new Promise((resolve,reject)=>{let onAbort=()=>{mutationStarted||reject(signal.reason)};signal.addEventListener("abort",onAbort,{once:!0}),Promise.race([started,mutation]).then(()=>{signal.removeEventListener("abort",onAbort),resolve()},error=>{signal.removeEventListener("abort",onAbort),reject(error)}),signal.aborted&&onAbort()}),await mutation}catch(error){throw signal.throwIfAborted(),new ModelsError("auth",`Credential store modify failed for ${providerId}`,{cause:error})}return credential}async logout(providerId,options){let signal=operationSignal(options?.signal);signal.throwIfAborted();try{await this.credentials.delete(providerId,{signal})}catch(error){throw signal.throwIfAborted(),new ModelsError("auth",`Credential store delete failed for ${providerId}`,{cause:error})}}requireProvider(model){let provider=this.providers.get(model.provider);if(!provider)throw new ModelsError("provider",`Unknown provider: ${model.provider}`);return provider}async applyAuth(model,options){this.requireProvider(model);let resolution=await this.getAuth(model,{apiKey:options?.apiKey,env:options?.env,signal:options?.signal});if(!resolution)throw new ModelsError("auth",`Provider is not configured: ${model.provider}`);let auth=resolution.auth,apiKey=options?.apiKey??auth.apiKey,headers=mergeHeaders(auth.headers,options?.headers);options?.transformHeaders&&(headers=await options.transformHeaders(headers??{}));let env=resolution.env||options?.env?{...resolution.env??{},...options?.env??{}}:void 0,requestModel=auth.baseUrl?{...model,baseUrl:auth.baseUrl}:model,{transformHeaders:_transformHeaders,...providerOptions}=options??{},requestOptions={...providerOptions,apiKey,headers,env};return{requestModel,requestOptions}}stream(model,context,options){return lazyStream(model,async()=>{let provider=this.requireProvider(model),{requestModel,requestOptions}=await this.applyAuth(model,options);return provider.stream(requestModel,context,requestOptions)})}async complete(model,context,options){return this.stream(model,context,options).result()}streamSimple(model,context,options){return lazyStream(model,async()=>{let provider=this.requireProvider(model),{requestModel,requestOptions}=await this.applyAuth(model,options);return provider.streamSimple(requestModel,context,requestOptions)})}async completeSimple(model,context,options){return this.streamSimple(model,context,options).result()}streamDeferred(model,handle,options){return lazyStream(model,async()=>{let provider=this.requireProvider(model);if(!provider.fetchDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);let{requestModel,requestOptions}=await this.applyAuth(model,options);return provider.fetchDeferred(requestModel,handle,requestOptions)})}async fetchDeferred(model,handle,options){return this.streamDeferred(model,handle,options).result()}async cancelDeferred(model,handle,options){let provider=this.requireProvider(model);if(!provider.cancelDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);let{requestModel,requestOptions}=await this.applyAuth(model,options);await provider.cancelDeferred(requestModel,handle,requestOptions)}};function createModels(options){return new ModelsImpl(options)}function createProvider(input){let baselineModels=input.models,dynamicModels=[],fetchModels=input.fetchModels,currentModels=()=>{let merged=[...baselineModels];for(let model of dynamicModels){let index=merged.findIndex(entry=>entry.id===model.id);index>=0?merged[index]=model:merged.push(model)}return merged},single=typeof input.api.stream=="function"?input.api:void 0,byApi=single?void 0:input.api,apiFor=model=>single??byApi?.[model.api],dispatch=(model,run)=>{let streams2=apiFor(model);return streams2?run(streams2):lazyStream(model,async()=>{throw new ModelsError("stream",`Provider ${input.id} has no API implementation for "${model.api}"`)})},provider={id:input.id,name:input.name??input.id,baseUrl:input.baseUrl,headers:input.headers,auth:input.auth,getModels:currentModels,refreshModels:fetchModels?async context=>{if(context.stored){let restored=context.stored.models.filter(model=>model.provider===input.id).map(model=>model);if(!await context.publish({update:()=>{dynamicModels=restored}}))return}if(!context.allowNetwork||context.signal.aborted)return;let refreshed=await fetchModels(context);context.signal.aborted||await context.publish({persist:{models:refreshed,checkedAt:Date.now()},update:()=>{dynamicModels=refreshed}})}:void 0,filterModels:input.filterModels,stream:(model,context,options)=>dispatch(model,streams2=>streams2.stream(model,context,options)),streamSimple:(model,context,options)=>dispatch(model,streams2=>streams2.streamSimple(model,context,options))},streams=single?[single]:Object.values(byApi??{}).filter(entry=>entry!==void 0);return streams.some(entry=>entry.fetchDeferred!==void 0)&&(provider.fetchDeferred=(model,handle,options)=>lazyStream(model,async()=>{let implementation=apiFor(model);if(!implementation?.fetchDeferred)throw new ModelsError("provider",`Provider ${input.id} does not support deferred responses for "${model.api}"`);return implementation.fetchDeferred(model,handle,options)})),streams.some(entry=>entry.cancelDeferred!==void 0)&&(provider.cancelDeferred=async(model,handle,options)=>{let implementation=apiFor(model);if(!implementation?.cancelDeferred)throw new ModelsError("provider",`Provider ${input.id} cannot cancel deferred responses for "${model.api}"`);await implementation.cancelDeferred(model,handle,options)}),provider}function hasApi(model,api){return model.api===api}function calculateCost(model,usage){let inputTokens=usage.input+usage.cacheRead+usage.cacheWrite,rates=model.cost,matchedThreshold=-1;for(let tier of model.cost.tiers??[])inputTokens>tier.inputTokensAbove&&tier.inputTokensAbove>matchedThreshold&&(rates=tier,matchedThreshold=tier.inputTokensAbove);let longWrite=usage.cacheWrite1h??0,shortWrite=usage.cacheWrite-longWrite;return usage.cost.input=rates.input/1e6*usage.input,usage.cost.output=rates.output/1e6*usage.output,usage.cost.cacheRead=rates.cacheRead/1e6*usage.cacheRead,usage.cost.cacheWrite=(rates.cacheWrite*shortWrite+rates.input*2*longWrite)/1e6,usage.cost.total=usage.cost.input+usage.cost.output+usage.cost.cacheRead+usage.cost.cacheWrite,usage.cost}var EXTENDED_THINKING_LEVELS=["off","minimal","low","medium","high","xhigh","max"];function getSupportedThinkingLevels(model){return model.reasoning?EXTENDED_THINKING_LEVELS.filter(level=>{let mapped=model.thinkingLevelMap?.[level];return mapped===null?!1:level==="xhigh"||level==="max"?mapped!==void 0:!0}):["off"]}function clampThinkingLevel(model,level){let availableLevels=getSupportedThinkingLevels(model);if(availableLevels.includes(level))return level;let requestedIndex=EXTENDED_THINKING_LEVELS.indexOf(level);if(requestedIndex===-1)return availableLevels[0]??"off";for(let i=requestedIndex;i<EXTENDED_THINKING_LEVELS.length;i++){let candidate=EXTENDED_THINKING_LEVELS[i];if(availableLevels.includes(candidate))return candidate}for(let i=requestedIndex-1;i>=0;i--){let candidate=EXTENDED_THINKING_LEVELS[i];if(availableLevels.includes(candidate))return candidate}return availableLevels[0]??"off"}function modelsAreEqual(a,b){return!a||!b?!1:a.id===b.id&&a.provider===b.provider}export{lazyStream,lazyApi,defaultProviderAuthContext,InMemoryCredentialStore,ModelsError,resolveProviderAuth,InMemoryModelsStore,createModels,createProvider,hasApi,calculateCost,getSupportedThinkingLevels,clampThinkingLevel,modelsAreEqual};
@@ -0,0 +1,2 @@
1
+ import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
2
+ import{Check,build_default}from"./chunk-WBE4J4AU.js";var ServerError=class extends Error{code;constructor(error){super(error.message),this.name="ServerError",this.code=error.code}},DisconnectedError=class extends Error{constructor(message="Client is disconnected",cause){super(message,cause===void 0?void 0:{cause}),this.name="DisconnectedError"}},ClientDisposedError=class extends Error{constructor(){super("Client is disposed"),this.name="ClientDisposedError"}};function toError(error){return error instanceof Error?error:new Error(String(error))}function toDisconnectedError(error){let cause=toError(error);return cause instanceof DisconnectedError?cause:new DisconnectedError(cause.message,cause)}import{createServiceCatalogueCall,createServiceStateDecoder,createServiceSubscribeCall,createServiceUnsubscribeCall,parseServiceCall,parseServiceCatalogue,parseWireServiceProviderUpdate,parseWireServiceSubscriptionSnapshot}from"@earendil-works/chord";import{BACKGROUND_CONTEXT}from"@earendil-works/chord/context";var CborError=class extends Error{constructor(message){super(message),this.name="CborError"}},textEncoder=new TextEncoder,textDecoder=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0});function resolveLimit(name,value,maximum){if(!Number.isSafeInteger(value)||value<0||value>maximum)throw new RangeError(`${name} must be an integer between 0 and ${maximum}`);return value}function resolveOptions(options){return{maxByteLength:resolveLimit("maxByteLength",options?.maxByteLength??16777216,4294967295),maxContainerLength:resolveLimit("maxContainerLength",options?.maxContainerLength??1e6,4294967295),maxDepth:resolveLimit("maxDepth",options?.maxDepth??64,512)}}var CborReader=class{bytes;offset=0;options;constructor(bytes,options){this.bytes=bytes,this.options=options}decode(){let value=this.readItem(0);if(this.offset!==this.bytes.byteLength)throw new CborError("CBOR payload contains trailing data");return value}readItem(depth){if(depth>this.options.maxDepth)throw new CborError(`CBOR nesting depth exceeds configured limit of ${this.options.maxDepth}`);let initial=this.readByte(),majorType=initial>>>5,additionalInformation=initial&31;switch(majorType){case 0:return this.readArgument(additionalInformation);case 1:{let value=-1-this.readArgument(additionalInformation);if(!Number.isSafeInteger(value))throw new CborError("Decoded CBOR integer is outside the safe range");return value}case 2:{let length=this.readLength(additionalInformation,"byte string",this.options.maxByteLength);return new Uint8Array(this.readBytes(length))}case 3:{let length=this.readLength(additionalInformation,"text string",this.options.maxByteLength),bytes=this.readBytes(length);try{return textDecoder.decode(bytes)}catch{throw new CborError("CBOR text string contains invalid UTF-8")}}case 4:{let length=this.readLength(additionalInformation,"array",this.options.maxContainerLength),result=[];for(let index=0;index<length;index++)result.push(this.readItem(depth+1));return result}case 5:{let length=this.readLength(additionalInformation,"map",this.options.maxContainerLength),result={},keys=new Set;for(let index=0;index<length;index++){let key=this.readItem(depth+1);if(typeof key!="string")throw new CborError("CBOR map keys must be strings");if(keys.has(key))throw new CborError("CBOR map contains a duplicate key");keys.add(key),Object.defineProperty(result,key,{configurable:!0,enumerable:!0,value:this.readItem(depth+1),writable:!0})}return result}case 6:throw new CborError("CBOR tags are not supported");case 7:return this.readSimple(additionalInformation);default:throw new CborError("Malformed CBOR major type")}}readSimple(additionalInformation){switch(additionalInformation){case 20:return!1;case 21:return!0;case 22:return null;case 27:{let bytes=this.readBytes(8),value=new DataView(bytes.buffer,bytes.byteOffset,bytes.byteLength).getFloat64(0,!1);if(!Number.isFinite(value))throw new CborError("Decoded CBOR number must be finite");if(Number.isInteger(value)&&!Number.isSafeInteger(value))throw new CborError("Decoded CBOR integer is outside the safe range");return value}case 31:throw new CborError("CBOR break marker is not supported");default:throw new CborError("Unsupported CBOR simple value or floating-point width")}}readLength(additionalInformation,kind,limit){if(additionalInformation===31)throw new CborError(`Indefinite-length CBOR ${kind}s are not supported`);let length=this.readArgument(additionalInformation);if(length>limit)throw new CborError(`CBOR ${kind} length exceeds configured limit of ${limit}`);return length}readArgument(additionalInformation){if(additionalInformation<24)return additionalInformation;switch(additionalInformation){case 24:return this.readByte();case 25:{let bytes=this.readBytes(2);return bytes[0]*256+bytes[1]}case 26:{let bytes=this.readBytes(4);return bytes[0]*16777216+bytes[1]*65536+bytes[2]*256+bytes[3]}case 27:{let high=this.readArgument(26),low=this.readArgument(26);if(high>2097151)throw new CborError("Decoded CBOR integer or length is outside the safe range");return high*4294967296+low}case 31:throw new CborError("Indefinite-length CBOR items are not supported");default:throw new CborError("Malformed CBOR additional information")}}readByte(){if(this.offset>=this.bytes.byteLength)throw new CborError("Truncated CBOR payload");let value=this.bytes[this.offset];return this.offset++,value}readBytes(length){if(length>this.bytes.byteLength-this.offset)throw new CborError("Truncated CBOR payload");let value=this.bytes.subarray(this.offset,this.offset+length);return this.offset+=length,value}};function decodeCbor(bytes,options){if(!(bytes instanceof Uint8Array))throw new TypeError("CBOR input must be a Uint8Array");let resolved=resolveOptions(options);if(bytes.byteLength>resolved.maxByteLength)throw new CborError(`CBOR byte length exceeds configured limit of ${resolved.maxByteLength}`);return new CborReader(bytes,resolved).decode()}var CborWriter=class{buffer;offset=0;maxByteLength;constructor(maxByteLength){this.maxByteLength=maxByteLength,this.buffer=new Uint8Array(Math.min(256,maxByteLength))}writeByte(value){this.ensureCapacity(1),this.buffer[this.offset]=value,this.offset++}writeBytes(bytes){this.ensureCapacity(bytes.byteLength),this.buffer.set(bytes,this.offset),this.offset+=bytes.byteLength}writeUint16(value){this.ensureCapacity(2),this.buffer[this.offset]=value>>>8,this.buffer[this.offset+1]=value,this.offset+=2}writeUint32(value){this.ensureCapacity(4),this.buffer[this.offset]=value>>>24,this.buffer[this.offset+1]=value>>>16,this.buffer[this.offset+2]=value>>>8,this.buffer[this.offset+3]=value,this.offset+=4}writeUint64(value){let high=Math.floor(value/4294967296),low=value-high*4294967296;this.writeUint32(high),this.writeUint32(low)}writeFloat64(value){this.ensureCapacity(9),this.buffer[this.offset]=251,new DataView(this.buffer.buffer).setFloat64(this.offset+1,value,!1),this.offset+=9}finish(){return this.buffer.slice(0,this.offset)}ensureCapacity(additionalBytes){let required=this.offset+additionalBytes;if(required>this.maxByteLength)throw new CborError(`CBOR byte length exceeds configured limit of ${this.maxByteLength}`);if(required<=this.buffer.byteLength)return;let capacity=Math.max(1,this.buffer.byteLength);for(;capacity<required;)capacity=Math.min(this.maxByteLength,Math.max(required,capacity*2));let expanded=new Uint8Array(capacity);expanded.set(this.buffer),this.buffer=expanded}};function writeArgument(writer,majorType,value){let prefix=majorType<<5;value<24?writer.writeByte(prefix|value):value<=255?(writer.writeByte(prefix|24),writer.writeByte(value)):value<=65535?(writer.writeByte(prefix|25),writer.writeUint16(value)):value<=4294967295?(writer.writeByte(prefix|26),writer.writeUint32(value)):(writer.writeByte(prefix|27),writer.writeUint64(value))}function isPlainObject(value){if(typeof value!="object"||value===null)return!1;let prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===null}function encodeText(writer,value,options){let bytes=textEncoder.encode(value);if(bytes.byteLength>options.maxByteLength)throw new CborError(`CBOR text string length exceeds configured limit of ${options.maxByteLength}`);if(textDecoder.decode(bytes)!==value)throw new CborError("CBOR text strings must contain valid Unicode scalar values");writeArgument(writer,3,bytes.byteLength),writer.writeBytes(bytes)}function encodeValue(writer,value,options,depth,ancestors){if(depth>options.maxDepth)throw new CborError(`CBOR nesting depth exceeds configured limit of ${options.maxDepth}`);if(value===null){writer.writeByte(246);return}if(typeof value=="boolean"){writer.writeByte(value?245:244);return}if(typeof value=="number"){if(!Number.isFinite(value))throw new CborError("CBOR numbers must be finite");if(Number.isInteger(value)&&!Object.is(value,-0)){if(!Number.isSafeInteger(value))throw new CborError("CBOR integers must be safe JavaScript integers");value>=0?writeArgument(writer,0,value):writeArgument(writer,1,-1-value)}else writer.writeFloat64(value);return}if(typeof value=="string"){encodeText(writer,value,options);return}if(value instanceof Uint8Array){if(value.byteLength>options.maxByteLength)throw new CborError(`CBOR byte string length exceeds configured limit of ${options.maxByteLength}`);writeArgument(writer,2,value.byteLength),writer.writeBytes(value);return}if(Array.isArray(value)){if(ancestors.has(value))throw new CborError("CBOR values must not contain cycles");if(value.length>options.maxContainerLength)throw new CborError(`CBOR array length exceeds configured limit of ${options.maxContainerLength}`);ancestors.add(value);try{writeArgument(writer,4,value.length);for(let index=0;index<value.length;index++){if(!Object.hasOwn(value,index)||value[index]===void 0)throw new CborError("CBOR arrays must not contain holes or undefined values");encodeValue(writer,value[index],options,depth+1,ancestors)}}finally{ancestors.delete(value)}return}if(isPlainObject(value)){if(ancestors.has(value))throw new CborError("CBOR values must not contain cycles");for(let symbol of Object.getOwnPropertySymbols(value))if(Object.prototype.propertyIsEnumerable.call(value,symbol))throw new CborError("CBOR map keys must be strings");let entries=[];for(let key of Object.keys(value)){let entryValue=value[key];entryValue!==void 0&&entries.push([key,entryValue])}if(entries.length>options.maxContainerLength)throw new CborError(`CBOR map length exceeds configured limit of ${options.maxContainerLength}`);ancestors.add(value);try{writeArgument(writer,5,entries.length);for(let[key,entryValue]of entries)encodeText(writer,key,options),encodeValue(writer,entryValue,options,depth+1,ancestors)}finally{ancestors.delete(value)}return}throw new CborError(`Unsupported CBOR value type: ${typeof value}`)}function encodeCbor(value,options){let resolved=resolveOptions(options),writer=new CborWriter(resolved.maxByteLength);return encodeValue(writer,value,resolved,0,new Set),writer.finish()}import{isJsonValue}from"@earendil-works/chord";var FrameError=class extends Error{constructor(message){super(message),this.name="FrameError"}};function resolveMaxFrameLength(options){let value=options?.maxFrameLength??16777216;if(!Number.isSafeInteger(value)||value<0||value>4294967295)throw new RangeError(`maxFrameLength must be an integer between 0 and ${4294967295}`);return value}function encodeFrame(payload){if(!(payload instanceof Uint8Array))throw new TypeError("Frame payload must be a Uint8Array");if(payload.byteLength>4294967295)throw new RangeError("Frame payload exceeds the unsigned 32-bit length limit");let frame=new Uint8Array(4+payload.byteLength),length=payload.byteLength;return frame[0]=length>>>24,frame[1]=length>>>16,frame[2]=length>>>8,frame[3]=length,frame.set(payload,4),frame}var FrameDecoder=class{header=new Uint8Array(4);headerLength=0;maxFrameLength;payloadBlocks=[];currentPayloadBlock;currentPayloadBlockLength=0;expectedPayloadLength;payloadLength=0;state="open";constructor(options){this.maxFrameLength=resolveMaxFrameLength(options)}push(chunk){if(this.state==="ended")throw new FrameError("Frame decoder has ended");if(this.state==="failed")throw new FrameError("Frame decoder has failed");if(!(chunk instanceof Uint8Array))throw new TypeError("Frame chunk must be a Uint8Array");let frames=[],chunkOffset=0;for(;chunkOffset<chunk.byteLength;){if(this.expectedPayloadLength===void 0){let headerBytes=Math.min(4-this.headerLength,chunk.byteLength-chunkOffset);if(this.header.set(chunk.subarray(chunkOffset,chunkOffset+headerBytes),this.headerLength),this.headerLength+=headerBytes,chunkOffset+=headerBytes,this.headerLength<4)continue;let frameLength=this.header[0]*16777216+this.header[1]*65536+this.header[2]*256+this.header[3];if(this.headerLength=0,frameLength>this.maxFrameLength&&this.fail(`Frame length ${frameLength} exceeds configured limit of ${this.maxFrameLength}`),frameLength===0){frames.push(new Uint8Array);continue}this.expectedPayloadLength=frameLength,this.payloadBlocks=[],this.currentPayloadBlock=void 0,this.currentPayloadBlockLength=0,this.payloadLength=0}let expectedPayloadLength=this.expectedPayloadLength;if(expectedPayloadLength!==void 0){for(;chunkOffset<chunk.byteLength&&this.payloadLength<expectedPayloadLength;){let block=this.currentPayloadBlock;(!block||this.currentPayloadBlockLength===block.byteLength)&&(block=new Uint8Array(Math.min(65536,expectedPayloadLength-this.payloadLength)),this.payloadBlocks.push(block),this.currentPayloadBlock=block,this.currentPayloadBlockLength=0);let payloadBytes=Math.min(block.byteLength-this.currentPayloadBlockLength,chunk.byteLength-chunkOffset);block.set(chunk.subarray(chunkOffset,chunkOffset+payloadBytes),this.currentPayloadBlockLength),this.currentPayloadBlockLength+=payloadBytes,this.payloadLength+=payloadBytes,chunkOffset+=payloadBytes}if(this.payloadLength===expectedPayloadLength){if(this.payloadBlocks.length===1)frames.push(this.payloadBlocks[0]);else{let payload=new Uint8Array(expectedPayloadLength),offset=0;for(let payloadBlock of this.payloadBlocks)payload.set(payloadBlock,offset),offset+=payloadBlock.byteLength;frames.push(payload)}this.payloadBlocks=[],this.currentPayloadBlock=void 0,this.currentPayloadBlockLength=0,this.expectedPayloadLength=void 0,this.payloadLength=0}}}return frames}end(){if(this.state==="ended")throw new FrameError("Frame decoder has ended");if(this.state==="failed")throw new FrameError("Frame decoder has failed");(this.headerLength!==0||this.expectedPayloadLength!==void 0)&&this.fail("Truncated frame at end of stream"),this.state="ended"}fail(message){throw this.state="failed",this.headerLength=0,this.payloadBlocks=[],this.currentPayloadBlock=void 0,this.currentPayloadBlockLength=0,this.expectedPayloadLength=void 0,this.payloadLength=0,new FrameError(message)}};var PROTOCOL_VERSION=8,IdSchema=build_default.String({minLength:1}),OpaqueJsonValueSchema=build_default.Unsafe(build_default.Unknown()),StrictObject=properties=>build_default.Object(properties,{additionalProperties:!1}),ServerIdSchema=build_default.String({pattern:"^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"});function isServerId(value){return Check(ServerIdSchema,value)}var ProtocolErrorSchema=StrictObject({code:IdSchema,message:build_default.String()}),ClientHelloSchema=StrictObject({type:build_default.Literal("hello"),version:build_default.Integer({minimum:0})}),ServerTargetSchema=StrictObject({serverId:ServerIdSchema}),SessionTargetSchema=StrictObject({serverId:ServerIdSchema,sessionId:IdSchema,attachmentId:IdSchema}),RpcTargetSchema=build_default.Union([ServerTargetSchema,SessionTargetSchema]),RequestEnvelopeSchema=StrictObject({type:build_default.Literal("request"),id:IdSchema,target:RpcTargetSchema,call:OpaqueJsonValueSchema}),CancelEnvelopeSchema=StrictObject({type:build_default.Literal("cancel"),id:IdSchema,target:RpcTargetSchema}),ClientMessageSchema=build_default.Union([ClientHelloSchema,RequestEnvelopeSchema,CancelEnvelopeSchema]),ServerHelloSchema=StrictObject({type:build_default.Literal("hello"),version:build_default.Literal(PROTOCOL_VERSION),serverId:ServerIdSchema}),ServerHelloErrorSchema=StrictObject({type:build_default.Literal("hello_error"),error:ProtocolErrorSchema}),ResponseEnvelopeSchema=build_default.Union([StrictObject({type:build_default.Literal("response"),id:IdSchema,ok:build_default.Literal(!0),result:build_default.Optional(OpaqueJsonValueSchema)}),StrictObject({type:build_default.Literal("response"),id:IdSchema,ok:build_default.Literal(!1),error:ProtocolErrorSchema})]),ServiceEventEnvelopeSchema=StrictObject({type:build_default.Literal("service_update"),subscriptionId:IdSchema,update:OpaqueJsonValueSchema}),AttachmentEnvelopeSchema=StrictObject({type:build_default.Literal("attachment"),attachment:build_default.Union([SessionTargetSchema,build_default.Null()])}),ServerMessageSchema=build_default.Union([ServerHelloSchema,ServerHelloErrorSchema,ResponseEnvelopeSchema,ServiceEventEnvelopeSchema,AttachmentEnvelopeSchema]);var ProtocolValidationError=class extends Error{constructor(message){super(message),this.name="ProtocolValidationError"}};function parseClientMessage(value){if(!Check(ClientMessageSchema,value)||!isJsonValue(value))throw new ProtocolValidationError("Invalid client protocol message");return value}function parseServerMessage(value){if(!Check(ServerMessageSchema,value)||!isJsonValue(value))throw new ProtocolValidationError("Invalid server protocol message");return value}function boundedErrorMessage(error){return error instanceof Error?error.message.length<=500?error.message:`${error.message.slice(0,497)}...`:"Unknown codec error"}function encodeProtocolMessage(value,parse,kind,options){let validated=parse(value);try{let maxFrameLength=options?.maxFrameLength??16777216;return encodeFrame(encodeCbor(validated,{maxByteLength:maxFrameLength}))}catch(error){throw error instanceof ProtocolValidationError?error:new ProtocolValidationError(`Unable to encode ${kind} protocol message: ${boundedErrorMessage(error)}`)}}function encodeClientMessage(message,options){return encodeProtocolMessage(message,parseClientMessage,"client",options)}function encodeServerMessage(message,options){return encodeProtocolMessage(message,parseServerMessage,"server",options)}var ValidatedMessageDecoder=class{failed=!1;frames;kind;maxFrameLength;parse;constructor(kind,parse,options){this.frames=new FrameDecoder(options),this.kind=kind,this.maxFrameLength=options?.maxFrameLength??16777216,this.parse=parse}push(chunk){if(this.failed)throw new ProtocolValidationError(`${this.kind} message decoder has failed`);try{let messages=[];for(let frame of this.frames.push(chunk))messages.push(this.parse(decodeCbor(frame,{maxByteLength:this.maxFrameLength})));return messages}catch(error){throw this.failed=!0,error instanceof ProtocolValidationError?error:new ProtocolValidationError(`Invalid ${this.kind} protocol frame: ${boundedErrorMessage(error)}`)}}end(){if(this.failed)throw new ProtocolValidationError(`${this.kind} message decoder has failed`);try{this.frames.end()}catch(error){throw this.failed=!0,new ProtocolValidationError(`Invalid ${this.kind} protocol framing: ${boundedErrorMessage(error)}`)}}},ClientMessageDecoder=class{decoder;constructor(options){this.decoder=new ValidatedMessageDecoder("client",parseClientMessage,options)}push(chunk){return this.decoder.push(chunk)}end(){this.decoder.end()}},ServerMessageDecoder=class{decoder;constructor(options){this.decoder=new ValidatedMessageDecoder("server",parseServerMessage,options)}push(chunk){return this.decoder.push(chunk)}end(){this.decoder.end()}};function isSupportedProtocolVersion(version){return Number.isInteger(version)&&version===PROTOCOL_VERSION}function createPromiseResolvers(){let resolve,reject;return{promise:new Promise((resolvePromise,rejectPromise)=>{resolve=resolvePromise,reject=rejectPromise}),resolve,reject}}var MAX_UINT322=4294967295,Connection=class{#options;#maxFrameLength;#lifecycle={state:"disconnected"};#sequence=0;constructor(options){if(this.#options=options,this.#maxFrameLength=options.maxFrameLength??16777216,!Number.isSafeInteger(this.#maxFrameLength)||this.#maxFrameLength<=0||this.#maxFrameLength>MAX_UINT322)throw new TypeError(`Client maxFrameLength must be an integer between 1 and ${MAX_UINT322}`)}get state(){return this.#lifecycle.state}get maxFrameLength(){return this.#maxFrameLength}connect(){if(this.#lifecycle.state!=="disconnected")return Promise.reject(new DisconnectedError(`Client is already ${this.#lifecycle.state}`));let id=++this.#sequence,handshake=createPromiseResolvers();this.#lifecycle={state:"connecting",id,decoder:new ServerMessageDecoder({maxFrameLength:this.#maxFrameLength}),handshake},this.#options.onStateChange({state:"connecting"});let handlers={onData:chunk=>this.#handleData(id,chunk),onClose:()=>{this.#isCurrent(id)&&this.#handleClose()},onError:error=>{this.#isCurrent(id)&&this.#failAndClose(toDisconnectedError(error))}};return this.#openTransport(id,handlers),handshake.promise}disconnect(reason="Client disconnected"){this.#lifecycle.state!=="disconnected"&&this.#failAndClose(typeof reason=="string"?new DisconnectedError(reason):reason)}fail(error){this.#failAndClose(error)}send(frame){let lifecycle=this.#lifecycle;if(lifecycle.state!=="connected")throw new DisconnectedError;let sending;try{sending=lifecycle.transport.send(frame)}catch(error){this.#failAndClose(toDisconnectedError(error));return}sending.catch(error=>{let current=this.#lifecycle;current.state!=="disconnected"&&current.transport===lifecycle.transport&&this.#failAndClose(toDisconnectedError(error))})}async#openTransport(id,handlers){let transport;try{transport=await this.#options.transportFactory(handlers)}catch(error){this.#isCurrent(id)&&this.#fail(toDisconnectedError(error));return}let lifecycle=this.#lifecycle;if(lifecycle.state!=="connecting"||lifecycle.id!==id){transport.close();return}this.#lifecycle={...lifecycle,transport};try{await transport.send(encodeClientMessage({type:"hello",version:PROTOCOL_VERSION},{maxFrameLength:this.#maxFrameLength}))}catch(error){this.#isCurrent(id)&&this.#failAndClose(toDisconnectedError(error))}}#handleData(id,chunk){let lifecycle=this.#lifecycle;if(lifecycle.state==="disconnected"||lifecycle.id!==id)return;if(lifecycle.state==="connecting"&&!lifecycle.transport){this.#failAndClose(new ProtocolValidationError("Received server data before the client hello was sent"));return}let messages;try{messages=lifecycle.decoder.push(chunk)}catch(error){this.#failAndClose(toError(error));return}for(let message of messages){if(this.#lifecycle.state==="disconnected")return;this.#handleMessage(message)}}#handleMessage(message){let lifecycle=this.#lifecycle;if(lifecycle.state==="connecting"){if(message.type==="hello_error"){this.#failAndClose(new ServerError(message.error));return}if(message.type!=="hello"){this.#failAndClose(new ProtocolValidationError("Expected server hello as first message"));return}if(message.serverId!==this.#options.serverId){this.#failAndClose(new ProtocolValidationError(`Connected server ${JSON.stringify(message.serverId)} does not match ${JSON.stringify(this.#options.serverId)}`));return}if(!lifecycle.transport){this.#failAndClose(new ProtocolValidationError("Received server hello before the client hello was sent"));return}let connected={state:"connected",id:lifecycle.id,decoder:lifecycle.decoder,transport:lifecycle.transport,handshake:lifecycle.handshake};this.#lifecycle=connected;try{this.#options.onHandshake(message)}catch(error){this.#lifecycle===connected&&this.#failAndClose(toError(error));return}if(this.#lifecycle!==connected||(this.#options.onStateChange({state:"connected"}),this.#lifecycle!==connected))return;this.#lifecycle={...connected,handshake:void 0},lifecycle.handshake.resolve(message);return}if(lifecycle.state==="connected"){if(message.type==="hello"||message.type==="hello_error"){this.#failAndClose(new ProtocolValidationError("Unexpected handshake message"));return}this.#options.onMessage(message)}}#handleClose(){let lifecycle=this.#lifecycle;if(lifecycle.state==="disconnected")return;let error=new DisconnectedError("Byte transport closed");try{lifecycle.decoder.end()}catch(decoderError){error=toError(decoderError)}this.#fail(error)}#failAndClose(error){let lifecycle=this.#lifecycle,transport=lifecycle.state==="disconnected"?void 0:lifecycle.transport;this.#fail(error),transport?.close()}#fail(error){let lifecycle=this.#lifecycle;lifecycle.state!=="disconnected"&&(this.#lifecycle={state:"disconnected"},lifecycle.handshake?.reject(error),this.#options.onStateChange({state:"disconnected",error}))}#isCurrent(id){return this.#lifecycle.state!=="disconnected"&&this.#lifecycle.id===id}};var Client=class _Client{#options;#connection;#pendingRequests=new Map;#connectionStateListeners=new Set;#attachmentListeners=new Set;#serviceListeners=new Map;#requestSequence=0;#serviceSubscriptionSequence=0;#hello;#attachment;#disposed=!1;#disposePromise;constructor(options){if(!isServerId(options.serverId))throw new TypeError("serverId must be a canonical lowercase UUIDv4");this.#options=options,this.#connection=new Connection({transportFactory:options.transportFactory,serverId:options.serverId,maxFrameLength:options.maxFrameLength,onHandshake:hello=>{this.#hello=hello},onMessage:message=>this.#handleMessage(message),onStateChange:change=>this.#handleConnectionStateChange(change)})}get disposed(){return this.#disposed}get connectionState(){return this.#connection.state}get connected(){return this.#connection.state==="connected"}get serverId(){return this.#options.serverId}get hello(){return this.#hello}get attachment(){return this.#attachment}static async connect(options){let client=new _Client(options);try{return await client.connect(),client}catch(error){throw await client.dispose(),error}}connect(){return this.#disposed?Promise.reject(new ClientDisposedError):(this.#hello=void 0,this.#connection.connect())}reconnect(){return this.connect()}disconnect(reason="Client disconnected"){this.#connection.disconnect(reason)}onConnectionStateChange(listener){return this.#assertNotDisposed(),this.#connectionStateListeners.add(listener),()=>this.#connectionStateListeners.delete(listener)}onAttachmentChange(listener){return this.#assertNotDisposed(),this.#attachmentListeners.add(listener),()=>this.#attachmentListeners.delete(listener)}request(target,call,signal){return this.#request(target,call,signal)}async serviceCatalogue(target,signal){let result=await this.#request(target,createServiceCatalogueCall(),signal);try{return parseServiceCatalogue(result)}catch(error){let validationError=new ProtocolValidationError(error instanceof Error?error.message:"Invalid service catalogue");throw this.#connection.fail(validationError),validationError}}async subscribeService(target,serviceId,mode,listener,signal){let subscriptionId=`service-${++this.#serviceSubscriptionSequence}`,active={target,listener,decoder:createServiceStateDecoder(),queuedWireUpdates:[],queued:[],deliveryTail:Promise.resolve(),hydrated:!1,ready:!1};this.#serviceListeners.set(subscriptionId,active);let snapshot;try{snapshot=await this.#request(target,createServiceSubscribeCall(subscriptionId,serviceId,mode),signal,result=>{let decoded=active.decoder.decodeSnapshot(parseWireServiceSubscriptionSnapshot(result));active.hydrated=!0;for(let update of active.queuedWireUpdates.splice(0))active.queued.push(active.decoder.decodeUpdate(parseWireServiceProviderUpdate(update)));return decoded})}catch(error){throw this.#serviceListeners.get(subscriptionId)===active&&this.#serviceListeners.delete(subscriptionId),error}if(this.#serviceListeners.get(subscriptionId)!==active)throw new DisconnectedError;let disposed=!1;return{id:subscriptionId,target,snapshot,start:()=>{if(!(disposed||active.ready)){active.ready=!0;for(let update of active.queued.splice(0))this.#deliverServiceUpdate(active,update)}},dispose:async()=>{if(!disposed){disposed=!0,this.#serviceListeners.get(subscriptionId)===active&&this.#serviceListeners.delete(subscriptionId);try{this.connected&&this.#targetIsCurrent(target)&&await this.#request(target,createServiceUnsubscribeCall(subscriptionId)),await active.deliveryTail}finally{active.queuedWireUpdates.length=0,active.queued.length=0}}}}}#request(target,call,signal,transform){if(this.#disposed)return Promise.reject(new ClientDisposedError);if(!this.connected)return Promise.reject(new DisconnectedError);if(signal?.aborted)return Promise.reject(abortError(signal));let id=`request-${++this.#requestSequence}`,{promise,resolve,reject}=createPromiseResolvers(),sent=!1,aborted=!1,onAbort,sendCancel=()=>{if(!(!sent||!this.connected))try{this.#connection.send(encodeClientMessage({type:"cancel",id,target},{maxFrameLength:this.#connection.maxFrameLength}))}catch(error){this.#connection.fail(toError(error))}};signal!==void 0&&(onAbort=()=>{aborted||(aborted=!0,reject(abortError(signal)),sendCancel())},signal.addEventListener("abort",onAbort,{once:!0})),this.#pendingRequests.set(id,{resolve:result=>{try{resolve(transform===void 0?result:transform(result))}catch(error){let validationError=new ProtocolValidationError(error instanceof Error?error.message:"Invalid service operation stream");this.#connection.fail(validationError),reject(validationError)}},reject,cleanup:()=>{signal!==void 0&&onAbort!==void 0&&signal.removeEventListener("abort",onAbort)}});let frame;try{frame=encodeClientMessage({type:"request",id,target,call:parseServiceCall(call)},{maxFrameLength:this.#connection.maxFrameLength})}catch(error){return this.#takePendingRequest(id)?.reject(toError(error)),promise}return this.#connection.send(frame),sent=!0,aborted&&sendCancel(),promise}#handleMessage(message){if(message.type==="attachment"){if(message.attachment!==null&&message.attachment.serverId!==this.#options.serverId){this.#connection.fail(new ProtocolValidationError("Attachment update belongs to another server"));return}this.#setAttachment(message.attachment??void 0);return}if(message.type==="service_update"){let active=this.#serviceListeners.get(message.subscriptionId);if(active===void 0)return;if(!active.hydrated){active.queuedWireUpdates.push(message.update);return}let update;try{update=active.decoder.decodeUpdate(parseWireServiceProviderUpdate(message.update))}catch(error){this.#connection.fail(new ProtocolValidationError(error instanceof Error?error.message:"Invalid service operation stream"));return}active.ready?this.#deliverServiceUpdate(active,update):active.queued.push(update);return}let pending=this.#takePendingRequest(message.id);if(!pending){this.#connection.fail(new ProtocolValidationError("Response has no matching request"));return}if(!message.ok){pending.reject(new ServerError(message.error));return}pending.resolve(message.result)}#handleConnectionStateChange(change){change.state==="disconnected"&&(this.#hello=void 0,this.#setAttachment(void 0),this.#rejectPendingRequests(change.error??new DisconnectedError),this.#serviceListeners.clear());for(let listener of this.#connectionStateListeners)try{listener(change)}catch(error){this.#reportListenerError(error)}}#takePendingRequest(id){let request=this.#pendingRequests.get(id);return request&&(this.#pendingRequests.delete(id),request.cleanup()),request}#rejectPendingRequests(error){let requests=[...this.#pendingRequests.values()];this.#pendingRequests.clear();for(let request of requests)request.cleanup(),request.reject(error)}dispose(){if(this.#disposePromise)return this.#disposePromise;this.#disposed=!0,this.#disposePromise=Promise.resolve();let error=new ClientDisposedError;return this.#rejectPendingRequests(error),this.#connection.disconnect(error),this.#hello=void 0,this.#setAttachment(void 0),this.#connectionStateListeners.clear(),this.#attachmentListeners.clear(),this.#serviceListeners.clear(),this.#disposePromise}[Symbol.asyncDispose](){return this.dispose()}#setAttachment(attachment){let previous=this.#attachment;if(!(previous?.serverId===attachment?.serverId&&previous?.sessionId===attachment?.sessionId&&previous?.attachmentId===attachment?.attachmentId)){this.#attachment=attachment;for(let listener of this.#attachmentListeners)try{listener(attachment)}catch(error){this.#reportListenerError(error)}}}#deliverServiceUpdate(active,update){active.deliveryTail=active.deliveryTail.then(()=>active.listener(update)).catch(error=>this.#reportListenerError(error))}#targetIsCurrent(target){if(!("sessionId"in target))return this.#hello?.serverId===target.serverId;let attachment=this.#attachment;return attachment?.serverId===target.serverId&&attachment.sessionId===target.sessionId&&attachment.attachmentId===target.attachmentId}#assertNotDisposed(){if(this.#disposed)throw new ClientDisposedError}#reportListenerError(error){if(this.#options.onListenerError)try{this.#options.onListenerError(toError(error))}catch{}}};function createClientServiceTransport(client,getTarget){let target=()=>{let resolved=getTarget();if(resolved===void 0)throw new Error("Remote service target is unavailable");return resolved};return{invoke:async(call,context)=>client.request(target(),call,context.abortSignal),async subscribe(serviceId,mode,listener,context){let subscription=await client.subscribeService(target(),serviceId,mode,update=>listener(update,BACKGROUND_CONTEXT),context.abortSignal);return{snapshot:subscription.snapshot,activate:()=>subscription.start(),close:()=>subscription.dispose()}}}}function abortError(signal){let reason=signal.reason;return reason instanceof Error?reason:new DOMException("The operation was aborted","AbortError")}export{PROTOCOL_VERSION,isServerId,ProtocolValidationError,encodeServerMessage,ClientMessageDecoder,isSupportedProtocolVersion,ServerError,DisconnectedError,ClientDisposedError,Client,createClientServiceTransport};
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
2
- import{shortHash}from"./chunk-PJACZCIR.js";import{appendGrammarToolInputJsonDelta,getGrammarToolInput,getJsonSchemaToolParameters,resolveGrammarConstrainedSampling,resolveJsonSchemaStrictSampling,transformMessages}from"./chunk-AXIIZGTV.js";import{sanitizeSurrogates}from"./chunk-L2ZPNLYD.js";import{parseStreamingJson}from"./chunk-TRDNDS6A.js";import{calculateCost}from"./chunk-MNAIPA3J.js";function encodeTextSignatureV1(id,phase){let payload={v:1,id};return phase&&(payload.phase=phase),JSON.stringify(payload)}function parseTextSignature(signature){if(signature){if(signature.startsWith("{"))try{let parsed=JSON.parse(signature);if(parsed.v===1&&typeof parsed.id=="string")return parsed.phase==="commentary"||parsed.phase==="final_answer"?{id:parsed.id,phase:parsed.phase}:{id:parsed.id}}catch{}return{id:signature}}}function convertToolResultOutput(model,content){let textResult=content.filter(c=>c.type==="text").map(c=>c.text).join(`
3
- `),images=content.filter(c=>c.type==="image"),hasText=textResult.length>0;if(images.length===0||!model.input.includes("image"))return sanitizeSurrogates(hasText?textResult:images.length>0?"(see attached image)":"(no tool output)");let output=[];hasText&&output.push({type:"input_text",text:sanitizeSurrogates(textResult)});for(let image of images)output.push({type:"input_image",detail:"auto",image_url:`data:${image.mimeType};base64,${image.data}`});return output}function convertResponsesMessages(model,context,allowedToolCallProviders,options){let messages=[],loadedToolNames=new Set,normalizeIdPart=part=>{let sanitized=part.replace(/[^a-zA-Z0-9_-]/g,"_");return(sanitized.length>64?sanitized.slice(0,64):sanitized).replace(/_+$/,"")},buildForeignResponsesItemId=itemId=>{let normalized=`fc_${shortHash(itemId)}`;return normalized.length>64?normalized.slice(0,64):normalized},normalizeToolCallId=(id,_targetModel,source)=>{if(!allowedToolCallProviders.has(model.provider)||!id.includes("|"))return normalizeIdPart(id);let[callId,itemId]=id.split("|"),normalizedCallId=normalizeIdPart(callId),normalizedItemId=source.provider!==model.provider||source.api!==model.api?buildForeignResponsesItemId(itemId):normalizeIdPart(itemId);return normalizedItemId.startsWith("fc_")||(normalizedItemId=normalizeIdPart(`fc_${normalizedItemId}`)),`${normalizedCallId}|${normalizedItemId}`},transformedMessages=transformMessages(context.messages,model,normalizeToolCallId);if((options?.includeSystemPrompt??!0)&&context.systemPrompt){let compat=model.compat,role=model.reasoning&&compat?.supportsDeveloperRole!==!1?"developer":"system";messages.push({role,content:sanitizeSurrogates(context.systemPrompt)})}let msgIndex=0;for(let msg of transformedMessages){if(msg.role==="user")if(typeof msg.content=="string")messages.push({role:"user",content:[{type:"input_text",text:sanitizeSurrogates(msg.content)}]});else{let content=msg.content.map(item=>item.type==="text"?{type:"input_text",text:sanitizeSurrogates(item.text)}:{type:"input_image",detail:"auto",image_url:`data:${item.mimeType};base64,${item.data}`});if(content.length===0)continue;messages.push({role:"user",content})}else if(msg.role==="assistant"){let output=[],assistantMsg=msg,isSameProviderAndApi=assistantMsg.provider===model.provider&&assistantMsg.api===model.api,isSameModel=isSameProviderAndApi&&assistantMsg.model===model.id,isDifferentModel=isSameProviderAndApi&&assistantMsg.model!==model.id,textBlockIndex=0;for(let block of msg.content)if(block.type==="thinking"){if(block.thinkingSignature){let reasoningItem=JSON.parse(block.thinkingSignature);output.push(reasoningItem)}}else if(block.type==="text"){let textBlock=block,parsedSignature=parseTextSignature(textBlock.textSignature),fallbackMessageId=textBlockIndex===0?`msg_pi_${msgIndex}`:`msg_pi_${msgIndex}_${textBlockIndex}`;textBlockIndex++;let msgId=parsedSignature?.id;msgId?msgId.length>64&&(msgId=`msg_${shortHash(msgId)}`):msgId=fallbackMessageId,output.push({type:"message",role:"assistant",content:[{type:"output_text",text:sanitizeSurrogates(textBlock.text),annotations:[]}],status:"completed",id:msgId,phase:parsedSignature?.phase})}else if(block.type==="toolCall"){let toolCall=block,[callId,itemIdRaw]=toolCall.id.split("|"),customInputProperty=options?.grammarToolInputProperties?.get(toolCall.name),itemId=itemIdRaw;(isDifferentModel&&itemId?.startsWith("fc_")||customInputProperty===void 0&&!itemId?.startsWith("fc_"))&&(itemId=void 0);let canReplayNamespace=isSameModel||options?.deferredTools?.has(toolCall.name)===!0;customInputProperty!==void 0?output.push({type:"custom_tool_call",id:itemId,call_id:callId,name:toolCall.name,input:sanitizeSurrogates(getGrammarToolInput(toolCall.name,toolCall.arguments,customInputProperty)),...canReplayNamespace&&toolCall.namespace!==void 0?{namespace:toolCall.namespace}:{}}):output.push({type:"function_call",id:itemId,call_id:callId,name:toolCall.name,arguments:JSON.stringify(toolCall.arguments),...canReplayNamespace&&toolCall.namespace!==void 0?{namespace:toolCall.namespace}:{}})}if(output.length===0)continue;messages.push(...output)}else if(msg.role==="toolResult"){let[callId]=msg.toolCallId.split("|"),output=convertToolResultOutput(model,msg.content);options?.grammarToolInputProperties?.has(msg.toolName)?messages.push({type:"custom_tool_call_output",call_id:callId,output}):messages.push({type:"function_call_output",call_id:callId,output});let deferredTools=[];for(let name of msg.addedToolNames??[]){let tool=options?.deferredTools?.get(name);!tool||loadedToolNames.has(name)||(loadedToolNames.add(name),deferredTools.push(tool))}if(deferredTools.length>0&&options?.deferredToolsMode==="additional-tools")messages.push({type:"additional_tools",role:"developer",tools:convertResponsesTools(deferredTools,options.toolOptions)});else if(deferredTools.length>0&&options?.deferredToolsMode==="tool-search"){let names=deferredTools.map(tool=>tool.name),searchCallId=`pi_tool_load_${shortHash(`${msg.toolCallId}:${names.join(",")}`)}`;messages.push({type:"tool_search_call",call_id:searchCallId,execution:"client",status:"completed",arguments:{query:names.join(" "),limit:names.length}}),messages.push({type:"tool_search_output",call_id:searchCallId,execution:"client",status:"completed",tools:convertResponsesTools(deferredTools,{...options.toolOptions,deferLoading:!0})})}}msgIndex++}return messages}function convertResponsesTools(tools,options){let defaultStrict=options?.strict===void 0?!1:options.strict,supportsStrictMode=options?.supportsStrictMode??!0,supportsOpenAIGrammarTools=options?.supportsOpenAIGrammarTools??!1;return tools.map(tool=>{let grammar=resolveGrammarConstrainedSampling(tool,supportsOpenAIGrammarTools);if(grammar)return{type:"custom",name:tool.name,description:tool.description,format:{type:"grammar",syntax:grammar.format,definition:grammar.definition},...options?.deferLoading?{defer_loading:!0}:{}};let strict=resolveJsonSchemaStrictSampling(tool,supportsStrictMode)??defaultStrict,functionTool={type:"function",name:tool.name,description:tool.description,parameters:getJsonSchemaToolParameters(tool,strict===!0),...options?.deferLoading?{defer_loading:!0}:{}};return supportsStrictMode&&(functionTool.strict=strict),functionTool})}function getCustomToolCallInput(block){let property=block.customInput?.property;if(property===void 0)return"";let value=block.arguments[property];return typeof value=="string"?value:""}function appendCustomToolCallInput(block,nextInput,close){let customInput=block.customInput;if(!customInput)return;let delta=appendGrammarToolInputJsonDelta(customInput.jsonBuffer,customInput.property,nextInput,close);return block.arguments={[customInput.property]:nextInput},delta}async function processResponsesStream(openaiStream,output,stream,model,options){let sawTerminalResponseEvent=!1,outputSlots=new Map,reasoningBlocksById=new Map,applyMessagePhaseStopReason=item=>{item.type==="message"&&item.phase==="final_answer"&&(output.stopReason="stop")},getSlot=(outputIndex,type)=>{let slot=outputSlots.get(outputIndex);return slot?.type===type?slot:void 0},pushToolCallDelta=(slot,delta)=>{delta!==void 0&&stream.push({type:"toolcall_delta",contentIndex:slot.contentIndex,delta,partial:output})},createSlot=(outputIndex,item)=>{if(item.type==="reasoning"){let block={type:"thinking",thinking:""};output.content.push(block);let slot={type:"thinking",block,contentIndex:output.content.length-1};return outputSlots.set(outputIndex,slot),stream.push({type:"thinking_start",contentIndex:slot.contentIndex,partial:output}),slot}if(item.type==="message"){applyMessagePhaseStopReason(item);let block={type:"text",text:""};output.content.push(block);let slot={type:"text",block,contentIndex:output.content.length-1};return outputSlots.set(outputIndex,slot),stream.push({type:"text_start",contentIndex:slot.contentIndex,partial:output}),slot}if(item.type==="function_call"){let block={type:"toolCall",id:`${item.call_id}|${item.id}`,name:item.name,arguments:{},...item.namespace!==void 0?{namespace:item.namespace}:{},partialJson:item.arguments||""};output.content.push(block);let slot={type:"toolCall",block,contentIndex:output.content.length-1};return outputSlots.set(outputIndex,slot),stream.push({type:"toolcall_start",contentIndex:slot.contentIndex,partial:output}),slot}if(item.type==="custom_tool_call"){let inputProperty=options?.grammarToolInputProperties?.get(item.name)??"input",input=item.input||"",block={type:"toolCall",id:`${item.call_id}|${item.id}`,name:item.name,arguments:{[inputProperty]:input},...item.namespace!==void 0?{namespace:item.namespace}:{},customInput:{property:inputProperty,jsonBuffer:{input:"",started:!1,closed:!1}}};output.content.push(block);let slot={type:"toolCall",block,contentIndex:output.content.length-1};return outputSlots.set(outputIndex,slot),stream.push({type:"toolcall_start",contentIndex:slot.contentIndex,partial:output}),slot}},getOrCreateSlot=(outputIndex,item)=>outputSlots.get(outputIndex)??createSlot(outputIndex,item),backfillReasoningSignatures=responseOutput=>{for(let item of responseOutput){if(item.type!=="reasoning"||!item.encrypted_content)continue;let block=reasoningBlocksById.get(item.id);if(!block?.thinkingSignature)continue;let storedItem=JSON.parse(block.thinkingSignature);storedItem.encrypted_content||(block.thinkingSignature=JSON.stringify({...storedItem,encrypted_content:item.encrypted_content}))}},finalizeResponse=response=>{if(sawTerminalResponseEvent=!0,backfillReasoningSignatures(response.output??[]),response?.id&&(output.responseId=response.id),response?.usage){let inputDetails=response.usage.input_tokens_details,cachedTokens=inputDetails?.cached_tokens||0,cacheWriteTokens=inputDetails?.cache_write_tokens||0;output.usage={input:Math.max(0,(response.usage.input_tokens||0)-cachedTokens-cacheWriteTokens),output:response.usage.output_tokens||0,cacheRead:cachedTokens,cacheWrite:cacheWriteTokens,reasoning:response.usage.output_tokens_details?.reasoning_tokens||0,totalTokens:response.usage.total_tokens||0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}}}if(calculateCost(model,output.usage),options?.applyServiceTierPricing){let serviceTier=options.resolveServiceTier?options.resolveServiceTier(response?.service_tier,options.serviceTier):response?.service_tier??options.serviceTier;options.applyServiceTierPricing(output.usage,serviceTier)}let status=response?.status,incompleteDetails=response?.incomplete_details,incompleteReason=typeof incompleteDetails?.reason=="string"?incompleteDetails.reason:void 0;output.rawStopReason=incompleteReason?`${status}.${incompleteReason}`:status;let mappedStop=mapStopReason(status,incompleteReason);output.stopReason=mappedStop.stopReason,output.errorMessage=mappedStop.errorMessage,output.content.some(b=>b.type==="toolCall")&&output.stopReason==="stop"&&(output.stopReason="toolUse")};for await(let event of openaiStream)if(event.type==="response.created")output.responseId=event.response.id;else if(event.type==="response.output_item.added")createSlot(event.output_index,event.item);else if(event.type==="response.reasoning_summary_text.delta"){let slot=getSlot(event.output_index,"thinking");if(!slot)continue;slot.block.thinking+=event.delta,stream.push({type:"thinking_delta",contentIndex:slot.contentIndex,delta:event.delta,partial:output})}else if(event.type==="response.reasoning_summary_part.done"){let slot=getSlot(event.output_index,"thinking");if(!slot)continue;slot.block.thinking+=`
2
+ import{shortHash}from"./chunk-PJACZCIR.js";import{appendGrammarToolInputJsonDelta,getGrammarToolInput,getJsonSchemaToolParameters,resolveGrammarConstrainedSampling,resolveJsonSchemaStrictSampling,transformMessages}from"./chunk-AXIIZGTV.js";import{sanitizeSurrogates}from"./chunk-L2ZPNLYD.js";import{parseStreamingJson}from"./chunk-TRDNDS6A.js";import{calculateCost}from"./chunk-IDDQWTHI.js";function encodeTextSignatureV1(id,phase){let payload={v:1,id};return phase&&(payload.phase=phase),JSON.stringify(payload)}function parseTextSignature(signature){if(signature){if(signature.startsWith("{"))try{let parsed=JSON.parse(signature);if(parsed.v===1&&typeof parsed.id=="string")return parsed.phase==="commentary"||parsed.phase==="final_answer"?{id:parsed.id,phase:parsed.phase}:{id:parsed.id}}catch{}return{id:signature}}}function convertToolResultOutput(model,content){let textResult=content.filter(c=>c.type==="text").map(c=>c.text).join(`
3
+ `),images=content.filter(c=>c.type==="image"),hasText=textResult.length>0;if(images.length===0||!model.input.includes("image"))return sanitizeSurrogates(hasText?textResult:images.length>0?"(see attached image)":"(no tool output)");let output=[];hasText&&output.push({type:"input_text",text:sanitizeSurrogates(textResult)});for(let image of images)output.push({type:"input_image",detail:"auto",image_url:`data:${image.mimeType};base64,${image.data}`});return output}function convertResponsesMessages(model,context,allowedToolCallProviders,options){let messages=[],loadedToolNames=new Set,normalizeIdPart=part=>{let sanitized=part.replace(/[^a-zA-Z0-9_-]/g,"_");return(sanitized.length>64?sanitized.slice(0,64):sanitized).replace(/_+$/,"")},buildForeignResponsesItemId=itemId=>{let normalized=`fc_${shortHash(itemId)}`;return normalized.length>64?normalized.slice(0,64):normalized},normalizeToolCallId=(id,_targetModel,source)=>{if(!allowedToolCallProviders.has(model.provider)||!id.includes("|"))return normalizeIdPart(id);let[callId,itemId]=id.split("|"),normalizedCallId=normalizeIdPart(callId),normalizedItemId=source.provider!==model.provider||source.api!==model.api?buildForeignResponsesItemId(itemId):normalizeIdPart(itemId);return normalizedItemId.startsWith("fc_")||(normalizedItemId=normalizeIdPart(`fc_${normalizedItemId}`)),`${normalizedCallId}|${normalizedItemId}`},transformedMessages=transformMessages(context.messages,model,normalizeToolCallId);if((options?.includeSystemPrompt??!0)&&context.systemPrompt){let compat=model.compat,role=model.reasoning&&compat?.supportsDeveloperRole!==!1?"developer":"system";messages.push({role,content:sanitizeSurrogates(context.systemPrompt)})}let msgIndex=0;for(let msg of transformedMessages){if(msg.role==="user")if(typeof msg.content=="string")messages.push({role:"user",content:[{type:"input_text",text:sanitizeSurrogates(msg.content)}]});else{let content=msg.content.map(item=>item.type==="text"?{type:"input_text",text:sanitizeSurrogates(item.text)}:{type:"input_image",detail:"auto",image_url:`data:${item.mimeType};base64,${item.data}`});if(content.length===0)continue;messages.push({role:"user",content})}else if(msg.role==="assistant"){let output=[],assistantMsg=msg,isSameProviderAndApi=assistantMsg.provider===model.provider&&assistantMsg.api===model.api,isSameModel=isSameProviderAndApi&&assistantMsg.model===model.id,isDifferentModel=isSameProviderAndApi&&assistantMsg.model!==model.id,textBlockIndex=0;for(let block of msg.content)if(block.type==="thinking"){if(block.thinkingSignature){let reasoningItem=JSON.parse(block.thinkingSignature);output.push(reasoningItem)}}else if(block.type==="text"){let textBlock=block,parsedSignature=parseTextSignature(textBlock.textSignature),fallbackMessageId=textBlockIndex===0?`msg_pi_${msgIndex}`:`msg_pi_${msgIndex}_${textBlockIndex}`;textBlockIndex++;let msgId=parsedSignature?.id;msgId?msgId.length>64&&(msgId=`msg_${shortHash(msgId)}`):msgId=fallbackMessageId,output.push({type:"message",role:"assistant",content:[{type:"output_text",text:sanitizeSurrogates(textBlock.text),annotations:[]}],status:"completed",id:msgId,phase:parsedSignature?.phase})}else if(block.type==="toolCall"){let toolCall=block,[callId,itemIdRaw]=toolCall.id.split("|"),customInputProperty=options?.grammarToolInputProperties?.get(toolCall.name),itemId=itemIdRaw;(isDifferentModel&&itemId?.startsWith("fc_")||customInputProperty===void 0&&!itemId?.startsWith("fc_"))&&(itemId=void 0);let canReplayNamespace=isSameModel||options?.deferredTools?.has(toolCall.name)===!0;customInputProperty!==void 0?output.push({type:"custom_tool_call",id:itemId,call_id:callId,name:toolCall.name,input:sanitizeSurrogates(getGrammarToolInput(toolCall.name,toolCall.arguments,customInputProperty)),...canReplayNamespace&&toolCall.namespace!==void 0?{namespace:toolCall.namespace}:{}}):output.push({type:"function_call",id:itemId,call_id:callId,name:toolCall.name,arguments:JSON.stringify(toolCall.arguments),...canReplayNamespace&&toolCall.namespace!==void 0?{namespace:toolCall.namespace}:{}})}if(output.length===0)continue;messages.push(...output)}else if(msg.role==="toolResult"){let[callId]=msg.toolCallId.split("|"),output=convertToolResultOutput(model,msg.content);options?.grammarToolInputProperties?.has(msg.toolName)?messages.push({type:"custom_tool_call_output",call_id:callId,output}):messages.push({type:"function_call_output",call_id:callId,output});let deferredTools=[];for(let name of msg.addedToolNames??[]){let tool=options?.deferredTools?.get(name);!tool||loadedToolNames.has(name)||(loadedToolNames.add(name),deferredTools.push(tool))}if(deferredTools.length>0&&options?.deferredToolsMode==="additional-tools")messages.push({type:"additional_tools",role:"developer",tools:convertResponsesTools(deferredTools,options.toolOptions)});else if(deferredTools.length>0&&options?.deferredToolsMode==="tool-search"){let names=deferredTools.map(tool=>tool.name),searchCallId=`pi_tool_load_${shortHash(`${msg.toolCallId}:${names.join(",")}`)}`;messages.push({type:"tool_search_call",call_id:searchCallId,execution:"client",status:"completed",arguments:{query:names.join(" "),limit:names.length}}),messages.push({type:"tool_search_output",call_id:searchCallId,execution:"client",status:"completed",tools:convertResponsesTools(deferredTools,{...options.toolOptions,deferLoading:!0})})}}msgIndex++}return messages}function convertResponsesTools(tools,options){let defaultStrict=options?.strict===void 0?!1:options.strict,supportsStrictMode=options?.supportsStrictMode??!0,supportsOpenAIGrammarTools=options?.supportsOpenAIGrammarTools??!1;return tools.map(tool=>{let grammar=resolveGrammarConstrainedSampling(tool,supportsOpenAIGrammarTools);if(grammar)return{type:"custom",name:tool.name,description:tool.description,format:{type:"grammar",syntax:grammar.format,definition:grammar.definition},...options?.deferLoading?{defer_loading:!0}:{}};let strict=resolveJsonSchemaStrictSampling(tool,supportsStrictMode)??defaultStrict,functionTool={type:"function",name:tool.name,description:tool.description,parameters:getJsonSchemaToolParameters(tool,strict===!0),...options?.deferLoading?{defer_loading:!0}:{}};return supportsStrictMode&&(functionTool.strict=strict),functionTool})}function getCustomToolCallInput(block){let property=block.customInput?.property;if(property===void 0)return"";let value=block.arguments[property];return typeof value=="string"?value:""}function appendCustomToolCallInput(block,nextInput,close){let customInput=block.customInput;if(!customInput)return;let delta=appendGrammarToolInputJsonDelta(customInput.jsonBuffer,customInput.property,nextInput,close);return block.arguments={[customInput.property]:nextInput},delta}async function processResponsesStream(openaiStream,output,stream,model,options){let sawTerminalResponseEvent=!1,outputSlots=new Map,reasoningBlocksById=new Map,applyMessagePhaseStopReason=item=>{item.type==="message"&&item.phase==="final_answer"&&(output.stopReason="stop")},getSlot=(outputIndex,type)=>{let slot=outputSlots.get(outputIndex);return slot?.type===type?slot:void 0},pushToolCallDelta=(slot,delta)=>{delta!==void 0&&stream.push({type:"toolcall_delta",contentIndex:slot.contentIndex,delta,partial:output})},createSlot=(outputIndex,item)=>{if(item.type==="reasoning"){let block={type:"thinking",thinking:""};output.content.push(block);let slot={type:"thinking",block,contentIndex:output.content.length-1};return outputSlots.set(outputIndex,slot),stream.push({type:"thinking_start",contentIndex:slot.contentIndex,partial:output}),slot}if(item.type==="message"){applyMessagePhaseStopReason(item);let block={type:"text",text:""};output.content.push(block);let slot={type:"text",block,contentIndex:output.content.length-1};return outputSlots.set(outputIndex,slot),stream.push({type:"text_start",contentIndex:slot.contentIndex,partial:output}),slot}if(item.type==="function_call"){let block={type:"toolCall",id:`${item.call_id}|${item.id}`,name:item.name,arguments:{},...item.namespace!==void 0?{namespace:item.namespace}:{},partialJson:item.arguments||""};output.content.push(block);let slot={type:"toolCall",block,contentIndex:output.content.length-1};return outputSlots.set(outputIndex,slot),stream.push({type:"toolcall_start",contentIndex:slot.contentIndex,partial:output}),slot}if(item.type==="custom_tool_call"){let inputProperty=options?.grammarToolInputProperties?.get(item.name)??"input",input=item.input||"",block={type:"toolCall",id:`${item.call_id}|${item.id}`,name:item.name,arguments:{[inputProperty]:input},...item.namespace!==void 0?{namespace:item.namespace}:{},customInput:{property:inputProperty,jsonBuffer:{input:"",started:!1,closed:!1}}};output.content.push(block);let slot={type:"toolCall",block,contentIndex:output.content.length-1};return outputSlots.set(outputIndex,slot),stream.push({type:"toolcall_start",contentIndex:slot.contentIndex,partial:output}),slot}},getOrCreateSlot=(outputIndex,item)=>outputSlots.get(outputIndex)??createSlot(outputIndex,item),backfillReasoningSignatures=responseOutput=>{for(let item of responseOutput){if(item.type!=="reasoning"||!item.encrypted_content)continue;let block=reasoningBlocksById.get(item.id);if(!block?.thinkingSignature)continue;let storedItem=JSON.parse(block.thinkingSignature);storedItem.encrypted_content||(block.thinkingSignature=JSON.stringify({...storedItem,encrypted_content:item.encrypted_content}))}},finalizeResponse=response=>{if(sawTerminalResponseEvent=!0,backfillReasoningSignatures(response.output??[]),response?.id&&(output.responseId=response.id),response?.usage){let inputDetails=response.usage.input_tokens_details,cachedTokens=inputDetails?.cached_tokens||0,cacheWriteTokens=inputDetails?.cache_write_tokens||0;output.usage={input:Math.max(0,(response.usage.input_tokens||0)-cachedTokens-cacheWriteTokens),output:response.usage.output_tokens||0,cacheRead:cachedTokens,cacheWrite:cacheWriteTokens,reasoning:response.usage.output_tokens_details?.reasoning_tokens||0,totalTokens:response.usage.total_tokens||0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}}}if(calculateCost(model,output.usage),options?.applyServiceTierPricing){let serviceTier=options.resolveServiceTier?options.resolveServiceTier(response?.service_tier,options.serviceTier):response?.service_tier??options.serviceTier;options.applyServiceTierPricing(output.usage,serviceTier)}let status=response?.status,incompleteDetails=response?.incomplete_details,incompleteReason=typeof incompleteDetails?.reason=="string"?incompleteDetails.reason:void 0;output.rawStopReason=incompleteReason?`${status}.${incompleteReason}`:status;let mappedStop=mapStopReason(status,incompleteReason);output.stopReason=mappedStop.stopReason,mappedStop.errorMessage===void 0?delete output.errorMessage:output.errorMessage=mappedStop.errorMessage,output.content.some(b=>b.type==="toolCall")&&output.stopReason==="stop"&&(output.stopReason="toolUse")};for await(let event of openaiStream)if(event.type==="response.created")output.responseId=event.response.id;else if(event.type==="response.output_item.added")createSlot(event.output_index,event.item);else if(event.type==="response.reasoning_summary_text.delta"){let slot=getSlot(event.output_index,"thinking");if(!slot)continue;slot.block.thinking+=event.delta,stream.push({type:"thinking_delta",contentIndex:slot.contentIndex,delta:event.delta,partial:output})}else if(event.type==="response.reasoning_summary_part.done"){let slot=getSlot(event.output_index,"thinking");if(!slot)continue;slot.block.thinking+=`
4
4
 
5
5
  `,stream.push({type:"thinking_delta",contentIndex:slot.contentIndex,delta:`
6
6