@jini-ai/agent-runtime 0.1.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 (399) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +43 -0
  3. package/dist/acp-model-probe.d.ts +48 -0
  4. package/dist/acp-model-probe.d.ts.map +1 -0
  5. package/dist/acp-model-probe.js +15 -0
  6. package/dist/acp-model-probe.js.map +1 -0
  7. package/dist/agent-protocol/acp/account-failure.d.ts +54 -0
  8. package/dist/agent-protocol/acp/account-failure.d.ts.map +1 -0
  9. package/dist/agent-protocol/acp/account-failure.js +37 -0
  10. package/dist/agent-protocol/acp/account-failure.js.map +1 -0
  11. package/dist/agent-protocol/acp/constants.d.ts +26 -0
  12. package/dist/agent-protocol/acp/constants.d.ts.map +1 -0
  13. package/dist/agent-protocol/acp/constants.js +39 -0
  14. package/dist/agent-protocol/acp/constants.js.map +1 -0
  15. package/dist/agent-protocol/acp/index.d.ts +14 -0
  16. package/dist/agent-protocol/acp/index.d.ts.map +1 -0
  17. package/dist/agent-protocol/acp/index.js +14 -0
  18. package/dist/agent-protocol/acp/index.js.map +1 -0
  19. package/dist/agent-protocol/acp/json.d.ts +82 -0
  20. package/dist/agent-protocol/acp/json.d.ts.map +1 -0
  21. package/dist/agent-protocol/acp/json.js +144 -0
  22. package/dist/agent-protocol/acp/json.js.map +1 -0
  23. package/dist/agent-protocol/acp/models.d.ts +112 -0
  24. package/dist/agent-protocol/acp/models.d.ts.map +1 -0
  25. package/dist/agent-protocol/acp/models.js +293 -0
  26. package/dist/agent-protocol/acp/models.js.map +1 -0
  27. package/dist/agent-protocol/acp/rpc.d.ts +107 -0
  28. package/dist/agent-protocol/acp/rpc.d.ts.map +1 -0
  29. package/dist/agent-protocol/acp/rpc.js +162 -0
  30. package/dist/agent-protocol/acp/rpc.js.map +1 -0
  31. package/dist/agent-protocol/acp/session-params.d.ts +55 -0
  32. package/dist/agent-protocol/acp/session-params.d.ts.map +1 -0
  33. package/dist/agent-protocol/acp/session-params.js +81 -0
  34. package/dist/agent-protocol/acp/session-params.js.map +1 -0
  35. package/dist/agent-protocol/acp/session.d.ts +101 -0
  36. package/dist/agent-protocol/acp/session.d.ts.map +1 -0
  37. package/dist/agent-protocol/acp/session.js +832 -0
  38. package/dist/agent-protocol/acp/session.js.map +1 -0
  39. package/dist/agent-protocol/acp/text-suppression.d.ts +73 -0
  40. package/dist/agent-protocol/acp/text-suppression.d.ts.map +1 -0
  41. package/dist/agent-protocol/acp/text-suppression.js +229 -0
  42. package/dist/agent-protocol/acp/text-suppression.js.map +1 -0
  43. package/dist/agent-protocol/acp/types.d.ts +27 -0
  44. package/dist/agent-protocol/acp/types.d.ts.map +1 -0
  45. package/dist/agent-protocol/acp/types.js +2 -0
  46. package/dist/agent-protocol/acp/types.js.map +1 -0
  47. package/dist/agent-protocol/acp/updates.d.ts +166 -0
  48. package/dist/agent-protocol/acp/updates.d.ts.map +1 -0
  49. package/dist/agent-protocol/acp/updates.js +268 -0
  50. package/dist/agent-protocol/acp/updates.js.map +1 -0
  51. package/dist/agent-protocol/core/index.d.ts +6 -0
  52. package/dist/agent-protocol/core/index.d.ts.map +1 -0
  53. package/dist/agent-protocol/core/index.js +6 -0
  54. package/dist/agent-protocol/core/index.js.map +1 -0
  55. package/dist/agent-protocol/core/json-line-stream.d.ts +42 -0
  56. package/dist/agent-protocol/core/json-line-stream.d.ts.map +1 -0
  57. package/dist/agent-protocol/core/json-line-stream.js +333 -0
  58. package/dist/agent-protocol/core/json-line-stream.js.map +1 -0
  59. package/dist/agent-protocol/index.d.ts +8 -0
  60. package/dist/agent-protocol/index.d.ts.map +1 -0
  61. package/dist/agent-protocol/index.js +8 -0
  62. package/dist/agent-protocol/index.js.map +1 -0
  63. package/dist/agent-protocol/pi-rpc/events.d.ts +26 -0
  64. package/dist/agent-protocol/pi-rpc/events.d.ts.map +1 -0
  65. package/dist/agent-protocol/pi-rpc/events.js +167 -0
  66. package/dist/agent-protocol/pi-rpc/events.js.map +1 -0
  67. package/dist/agent-protocol/pi-rpc/index.d.ts +11 -0
  68. package/dist/agent-protocol/pi-rpc/index.d.ts.map +1 -0
  69. package/dist/agent-protocol/pi-rpc/index.js +11 -0
  70. package/dist/agent-protocol/pi-rpc/index.js.map +1 -0
  71. package/dist/agent-protocol/pi-rpc/internal.d.ts +45 -0
  72. package/dist/agent-protocol/pi-rpc/internal.d.ts.map +1 -0
  73. package/dist/agent-protocol/pi-rpc/internal.js +41 -0
  74. package/dist/agent-protocol/pi-rpc/internal.js.map +1 -0
  75. package/dist/agent-protocol/pi-rpc/models.d.ts +21 -0
  76. package/dist/agent-protocol/pi-rpc/models.d.ts.map +1 -0
  77. package/dist/agent-protocol/pi-rpc/models.js +48 -0
  78. package/dist/agent-protocol/pi-rpc/models.js.map +1 -0
  79. package/dist/agent-protocol/pi-rpc/session.d.ts +106 -0
  80. package/dist/agent-protocol/pi-rpc/session.d.ts.map +1 -0
  81. package/dist/agent-protocol/pi-rpc/session.js +371 -0
  82. package/dist/agent-protocol/pi-rpc/session.js.map +1 -0
  83. package/dist/amr-model-cache.d.ts +40 -0
  84. package/dist/amr-model-cache.d.ts.map +1 -0
  85. package/dist/amr-model-cache.js +79 -0
  86. package/dist/amr-model-cache.js.map +1 -0
  87. package/dist/amr-profile-resolver.d.ts +21 -0
  88. package/dist/amr-profile-resolver.d.ts.map +1 -0
  89. package/dist/amr-profile-resolver.js +4 -0
  90. package/dist/amr-profile-resolver.js.map +1 -0
  91. package/dist/artifact-taxonomy.d.ts +27 -0
  92. package/dist/artifact-taxonomy.d.ts.map +1 -0
  93. package/dist/artifact-taxonomy.js +5 -0
  94. package/dist/artifact-taxonomy.js.map +1 -0
  95. package/dist/auth.d.ts +25 -0
  96. package/dist/auth.d.ts.map +1 -0
  97. package/dist/auth.js +332 -0
  98. package/dist/auth.js.map +1 -0
  99. package/dist/capabilities.d.ts +9 -0
  100. package/dist/capabilities.d.ts.map +1 -0
  101. package/dist/capabilities.js +2 -0
  102. package/dist/capabilities.js.map +1 -0
  103. package/dist/claude-stream.d.ts +37 -0
  104. package/dist/claude-stream.d.ts.map +1 -0
  105. package/dist/claude-stream.js +660 -0
  106. package/dist/claude-stream.js.map +1 -0
  107. package/dist/copilot-stream.d.ts +37 -0
  108. package/dist/copilot-stream.d.ts.map +1 -0
  109. package/dist/copilot-stream.js +136 -0
  110. package/dist/copilot-stream.js.map +1 -0
  111. package/dist/defs/aider.d.ts +13 -0
  112. package/dist/defs/aider.d.ts.map +1 -0
  113. package/dist/defs/aider.js +63 -0
  114. package/dist/defs/aider.js.map +1 -0
  115. package/dist/defs/amp.d.ts +12 -0
  116. package/dist/defs/amp.d.ts.map +1 -0
  117. package/dist/defs/amp.js +56 -0
  118. package/dist/defs/amp.js.map +1 -0
  119. package/dist/defs/amr.d.ts +37 -0
  120. package/dist/defs/amr.d.ts.map +1 -0
  121. package/dist/defs/amr.js +303 -0
  122. package/dist/defs/amr.js.map +1 -0
  123. package/dist/defs/antigravity.d.ts +25 -0
  124. package/dist/defs/antigravity.d.ts.map +1 -0
  125. package/dist/defs/antigravity.js +213 -0
  126. package/dist/defs/antigravity.js.map +1 -0
  127. package/dist/defs/claude.d.ts +30 -0
  128. package/dist/defs/claude.d.ts.map +1 -0
  129. package/dist/defs/claude.js +130 -0
  130. package/dist/defs/claude.js.map +1 -0
  131. package/dist/defs/codebuddy.d.ts +26 -0
  132. package/dist/defs/codebuddy.d.ts.map +1 -0
  133. package/dist/defs/codebuddy.js +124 -0
  134. package/dist/defs/codebuddy.js.map +1 -0
  135. package/dist/defs/codex.d.ts +30 -0
  136. package/dist/defs/codex.d.ts.map +1 -0
  137. package/dist/defs/codex.js +196 -0
  138. package/dist/defs/codex.js.map +1 -0
  139. package/dist/defs/copilot.d.ts +12 -0
  140. package/dist/defs/copilot.d.ts.map +1 -0
  141. package/dist/defs/copilot.js +88 -0
  142. package/dist/defs/copilot.js.map +1 -0
  143. package/dist/defs/cursor-agent.d.ts +27 -0
  144. package/dist/defs/cursor-agent.d.ts.map +1 -0
  145. package/dist/defs/cursor-agent.js +93 -0
  146. package/dist/defs/cursor-agent.js.map +1 -0
  147. package/dist/defs/deepseek.d.ts +12 -0
  148. package/dist/defs/deepseek.d.ts.map +1 -0
  149. package/dist/defs/deepseek.js +53 -0
  150. package/dist/defs/deepseek.js.map +1 -0
  151. package/dist/defs/devin.d.ts +12 -0
  152. package/dist/defs/devin.d.ts.map +1 -0
  153. package/dist/defs/devin.js +45 -0
  154. package/dist/defs/devin.js.map +1 -0
  155. package/dist/defs/grok-build.d.ts +26 -0
  156. package/dist/defs/grok-build.d.ts.map +1 -0
  157. package/dist/defs/grok-build.js +105 -0
  158. package/dist/defs/grok-build.js.map +1 -0
  159. package/dist/defs/hermes.d.ts +13 -0
  160. package/dist/defs/hermes.d.ts.map +1 -0
  161. package/dist/defs/hermes.js +51 -0
  162. package/dist/defs/hermes.js.map +1 -0
  163. package/dist/defs/index.d.ts +33 -0
  164. package/dist/defs/index.d.ts.map +1 -0
  165. package/dist/defs/index.js +33 -0
  166. package/dist/defs/index.js.map +1 -0
  167. package/dist/defs/kilo.d.ts +12 -0
  168. package/dist/defs/kilo.d.ts.map +1 -0
  169. package/dist/defs/kilo.js +20 -0
  170. package/dist/defs/kilo.js.map +1 -0
  171. package/dist/defs/kimi.d.ts +13 -0
  172. package/dist/defs/kimi.d.ts.map +1 -0
  173. package/dist/defs/kimi.js +26 -0
  174. package/dist/defs/kimi.js.map +1 -0
  175. package/dist/defs/kiro.d.ts +12 -0
  176. package/dist/defs/kiro.d.ts.map +1 -0
  177. package/dist/defs/kiro.js +20 -0
  178. package/dist/defs/kiro.js.map +1 -0
  179. package/dist/defs/mimo.d.ts +13 -0
  180. package/dist/defs/mimo.d.ts.map +1 -0
  181. package/dist/defs/mimo.js +26 -0
  182. package/dist/defs/mimo.js.map +1 -0
  183. package/dist/defs/opencode.d.ts +27 -0
  184. package/dist/defs/opencode.d.ts.map +1 -0
  185. package/dist/defs/opencode.js +89 -0
  186. package/dist/defs/opencode.js.map +1 -0
  187. package/dist/defs/pi.d.ts +18 -0
  188. package/dist/defs/pi.d.ts.map +1 -0
  189. package/dist/defs/pi.js +94 -0
  190. package/dist/defs/pi.js.map +1 -0
  191. package/dist/defs/qoder.d.ts +11 -0
  192. package/dist/defs/qoder.d.ts.map +1 -0
  193. package/dist/defs/qoder.js +50 -0
  194. package/dist/defs/qoder.js.map +1 -0
  195. package/dist/defs/qwen.d.ts +11 -0
  196. package/dist/defs/qwen.d.ts.map +1 -0
  197. package/dist/defs/qwen.js +28 -0
  198. package/dist/defs/qwen.js.map +1 -0
  199. package/dist/defs/reasonix.d.ts +20 -0
  200. package/dist/defs/reasonix.d.ts.map +1 -0
  201. package/dist/defs/reasonix.js +60 -0
  202. package/dist/defs/reasonix.js.map +1 -0
  203. package/dist/defs/shared.d.ts +23 -0
  204. package/dist/defs/shared.d.ts.map +1 -0
  205. package/dist/defs/shared.js +58 -0
  206. package/dist/defs/shared.js.map +1 -0
  207. package/dist/defs/trae-cli.d.ts +14 -0
  208. package/dist/defs/trae-cli.d.ts.map +1 -0
  209. package/dist/defs/trae-cli.js +22 -0
  210. package/dist/defs/trae-cli.js.map +1 -0
  211. package/dist/defs/vibe.d.ts +12 -0
  212. package/dist/defs/vibe.d.ts.map +1 -0
  213. package/dist/defs/vibe.js +20 -0
  214. package/dist/defs/vibe.js.map +1 -0
  215. package/dist/detection.d.ts +14 -0
  216. package/dist/detection.d.ts.map +1 -0
  217. package/dist/detection.js +266 -0
  218. package/dist/detection.js.map +1 -0
  219. package/dist/diagnostics.d.ts +8 -0
  220. package/dist/diagnostics.d.ts.map +1 -0
  221. package/dist/diagnostics.js +95 -0
  222. package/dist/diagnostics.js.map +1 -0
  223. package/dist/env.d.ts +19 -0
  224. package/dist/env.d.ts.map +1 -0
  225. package/dist/env.js +95 -0
  226. package/dist/env.js.map +1 -0
  227. package/dist/executables.d.ts +24 -0
  228. package/dist/executables.d.ts.map +1 -0
  229. package/dist/executables.js +349 -0
  230. package/dist/executables.js.map +1 -0
  231. package/dist/index.d.ts +74 -0
  232. package/dist/index.d.ts.map +1 -0
  233. package/dist/index.js +102 -0
  234. package/dist/index.js.map +1 -0
  235. package/dist/invocation.d.ts +6 -0
  236. package/dist/invocation.d.ts.map +1 -0
  237. package/dist/invocation.js +47 -0
  238. package/dist/invocation.js.map +1 -0
  239. package/dist/json-event-stream.d.ts +9 -0
  240. package/dist/json-event-stream.d.ts.map +1 -0
  241. package/dist/json-event-stream.js +856 -0
  242. package/dist/json-event-stream.js.map +1 -0
  243. package/dist/launch.d.ts +12 -0
  244. package/dist/launch.d.ts.map +1 -0
  245. package/dist/launch.js +221 -0
  246. package/dist/launch.js.map +1 -0
  247. package/dist/mcp.d.ts +44 -0
  248. package/dist/mcp.d.ts.map +1 -0
  249. package/dist/mcp.js +12 -0
  250. package/dist/mcp.js.map +1 -0
  251. package/dist/metadata.d.ts +24 -0
  252. package/dist/metadata.d.ts.map +1 -0
  253. package/dist/metadata.js +100 -0
  254. package/dist/metadata.js.map +1 -0
  255. package/dist/mmd-routes.d.ts +12 -0
  256. package/dist/mmd-routes.d.ts.map +1 -0
  257. package/dist/mmd-routes.js +146 -0
  258. package/dist/mmd-routes.js.map +1 -0
  259. package/dist/model-registry.d.ts +120 -0
  260. package/dist/model-registry.d.ts.map +1 -0
  261. package/dist/model-registry.js +77 -0
  262. package/dist/model-registry.js.map +1 -0
  263. package/dist/models.d.ts +16 -0
  264. package/dist/models.d.ts.map +1 -0
  265. package/dist/models.js +93 -0
  266. package/dist/models.js.map +1 -0
  267. package/dist/opencode-log.d.ts +16 -0
  268. package/dist/opencode-log.d.ts.map +1 -0
  269. package/dist/opencode-log.js +163 -0
  270. package/dist/opencode-log.js.map +1 -0
  271. package/dist/paths.d.ts +3 -0
  272. package/dist/paths.d.ts.map +1 -0
  273. package/dist/paths.js +29 -0
  274. package/dist/paths.js.map +1 -0
  275. package/dist/pi-models.d.ts +13 -0
  276. package/dist/pi-models.d.ts.map +1 -0
  277. package/dist/pi-models.js +36 -0
  278. package/dist/pi-models.js.map +1 -0
  279. package/dist/prompt-augmenter.d.ts +60 -0
  280. package/dist/prompt-augmenter.d.ts.map +1 -0
  281. package/dist/prompt-augmenter.js +26 -0
  282. package/dist/prompt-augmenter.js.map +1 -0
  283. package/dist/prompt-budget.d.ts +20 -0
  284. package/dist/prompt-budget.d.ts.map +1 -0
  285. package/dist/prompt-budget.js +226 -0
  286. package/dist/prompt-budget.js.map +1 -0
  287. package/dist/prompt-file.d.ts +7 -0
  288. package/dist/prompt-file.d.ts.map +1 -0
  289. package/dist/prompt-file.js +27 -0
  290. package/dist/prompt-file.js.map +1 -0
  291. package/dist/providers/aihubmix.d.ts +99 -0
  292. package/dist/providers/aihubmix.d.ts.map +1 -0
  293. package/dist/providers/aihubmix.js +239 -0
  294. package/dist/providers/aihubmix.js.map +1 -0
  295. package/dist/providers/anthropic-messages.d.ts +116 -0
  296. package/dist/providers/anthropic-messages.d.ts.map +1 -0
  297. package/dist/providers/anthropic-messages.js +313 -0
  298. package/dist/providers/anthropic-messages.js.map +1 -0
  299. package/dist/providers/azure-chat.d.ts +99 -0
  300. package/dist/providers/azure-chat.d.ts.map +1 -0
  301. package/dist/providers/azure-chat.js +164 -0
  302. package/dist/providers/azure-chat.js.map +1 -0
  303. package/dist/providers/connection-guard.d.ts +67 -0
  304. package/dist/providers/connection-guard.d.ts.map +1 -0
  305. package/dist/providers/connection-guard.js +211 -0
  306. package/dist/providers/connection-guard.js.map +1 -0
  307. package/dist/providers/elevenlabs.d.ts +28 -0
  308. package/dist/providers/elevenlabs.d.ts.map +1 -0
  309. package/dist/providers/elevenlabs.js +138 -0
  310. package/dist/providers/elevenlabs.js.map +1 -0
  311. package/dist/providers/google-messages.d.ts +108 -0
  312. package/dist/providers/google-messages.d.ts.map +1 -0
  313. package/dist/providers/google-messages.js +284 -0
  314. package/dist/providers/google-messages.js.map +1 -0
  315. package/dist/providers/google.d.ts +20 -0
  316. package/dist/providers/google.d.ts.map +1 -0
  317. package/dist/providers/google.js +42 -0
  318. package/dist/providers/google.js.map +1 -0
  319. package/dist/providers/index.d.ts +39 -0
  320. package/dist/providers/index.d.ts.map +1 -0
  321. package/dist/providers/index.js +39 -0
  322. package/dist/providers/index.js.map +1 -0
  323. package/dist/providers/model-catalog.d.ts +32 -0
  324. package/dist/providers/model-catalog.d.ts.map +1 -0
  325. package/dist/providers/model-catalog.js +394 -0
  326. package/dist/providers/model-catalog.js.map +1 -0
  327. package/dist/providers/oauth-callback-server.d.ts +35 -0
  328. package/dist/providers/oauth-callback-server.d.ts.map +1 -0
  329. package/dist/providers/oauth-callback-server.js +217 -0
  330. package/dist/providers/oauth-callback-server.js.map +1 -0
  331. package/dist/providers/oauth-credentials.d.ts +29 -0
  332. package/dist/providers/oauth-credentials.d.ts.map +1 -0
  333. package/dist/providers/oauth-credentials.js +70 -0
  334. package/dist/providers/oauth-credentials.js.map +1 -0
  335. package/dist/providers/oauth-provider.d.ts +95 -0
  336. package/dist/providers/oauth-provider.d.ts.map +1 -0
  337. package/dist/providers/oauth-provider.js +130 -0
  338. package/dist/providers/oauth-provider.js.map +1 -0
  339. package/dist/providers/oauth-tokens.d.ts +35 -0
  340. package/dist/providers/oauth-tokens.d.ts.map +1 -0
  341. package/dist/providers/oauth-tokens.js +136 -0
  342. package/dist/providers/oauth-tokens.js.map +1 -0
  343. package/dist/providers/ollama-chat.d.ts +106 -0
  344. package/dist/providers/ollama-chat.d.ts.map +1 -0
  345. package/dist/providers/ollama-chat.js +292 -0
  346. package/dist/providers/ollama-chat.js.map +1 -0
  347. package/dist/providers/openai-chat.d.ts +147 -0
  348. package/dist/providers/openai-chat.d.ts.map +1 -0
  349. package/dist/providers/openai-chat.js +302 -0
  350. package/dist/providers/openai-chat.js.map +1 -0
  351. package/dist/providers/pkce.d.ts +81 -0
  352. package/dist/providers/pkce.d.ts.map +1 -0
  353. package/dist/providers/pkce.js +176 -0
  354. package/dist/providers/pkce.js.map +1 -0
  355. package/dist/providers/sse-decode.d.ts +47 -0
  356. package/dist/providers/sse-decode.d.ts.map +1 -0
  357. package/dist/providers/sse-decode.js +109 -0
  358. package/dist/providers/sse-decode.js.map +1 -0
  359. package/dist/providers/token-params.d.ts +29 -0
  360. package/dist/providers/token-params.d.ts.map +1 -0
  361. package/dist/providers/token-params.js +41 -0
  362. package/dist/providers/token-params.js.map +1 -0
  363. package/dist/providers/turn-end-guard.d.ts +37 -0
  364. package/dist/providers/turn-end-guard.d.ts.map +1 -0
  365. package/dist/providers/turn-end-guard.js +42 -0
  366. package/dist/providers/turn-end-guard.js.map +1 -0
  367. package/dist/providers/types.d.ts +36 -0
  368. package/dist/providers/types.d.ts.map +1 -0
  369. package/dist/providers/types.js +13 -0
  370. package/dist/providers/types.js.map +1 -0
  371. package/dist/qoder-stream.d.ts +19 -0
  372. package/dist/qoder-stream.d.ts.map +1 -0
  373. package/dist/qoder-stream.js +167 -0
  374. package/dist/qoder-stream.js.map +1 -0
  375. package/dist/registry.d.ts +5 -0
  376. package/dist/registry.d.ts.map +1 -0
  377. package/dist/registry.js +58 -0
  378. package/dist/registry.js.map +1 -0
  379. package/dist/resolution.d.ts +2 -0
  380. package/dist/resolution.d.ts.map +1 -0
  381. package/dist/resolution.js +19 -0
  382. package/dist/resolution.js.map +1 -0
  383. package/dist/role-marker-guard.d.ts +53 -0
  384. package/dist/role-marker-guard.d.ts.map +1 -0
  385. package/dist/role-marker-guard.js +280 -0
  386. package/dist/role-marker-guard.js.map +1 -0
  387. package/dist/telemetry-sink.d.ts +35 -0
  388. package/dist/telemetry-sink.d.ts.map +1 -0
  389. package/dist/telemetry-sink.js +5 -0
  390. package/dist/telemetry-sink.js.map +1 -0
  391. package/dist/terminal-launch.d.ts +11 -0
  392. package/dist/terminal-launch.d.ts.map +1 -0
  393. package/dist/terminal-launch.js +123 -0
  394. package/dist/terminal-launch.js.map +1 -0
  395. package/dist/types.d.ts +185 -0
  396. package/dist/types.d.ts.map +1 -0
  397. package/dist/types.js +2 -0
  398. package/dist/types.js.map +1 -0
  399. package/package.json +47 -0
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @module providers/connection-guard
3
+ *
4
+ * Minimal, self-contained SSRF-guard + secret-redaction utilities needed by
5
+ * this package's own `model-catalog.ts`. Vendored from the small generic
6
+ * subset of OD's `packages/contracts/src/api/connectionTest.ts` (the
7
+ * `isLoopbackApiHost`/`isBlockedExternalApiHostname`/`validateBaseUrl` triad)
8
+ * and `apps/daemon/src/connectionTest.ts` (`validateBaseUrlResolved`'s
9
+ * DNS-aware follow-up check, `redactSecrets`) — not the surrounding
10
+ * 2,600-line file, which is almost entirely OD's own agent-CLI
11
+ * connection-test orchestration (proxy dispatchers, product-specific
12
+ * executable-fallback copy and env-var names) and out of this task's
13
+ * scope; see `source-map.md` for the exact origin details. These four
14
+ * functions are pure security/text utilities with
15
+ * no product coupling in the origin — reject requests to loopback-disguised
16
+ * or RFC1918/link-local/CGNAT/metadata-service addresses, and strip bearer
17
+ * tokens / API-key headers / `?key=` query values out of free-form text
18
+ * before it is logged or surfaced to a caller.
19
+ */
20
+ export interface BaseUrlValidationResult {
21
+ parsed?: URL;
22
+ error?: string;
23
+ forbidden?: boolean;
24
+ }
25
+ /** True for `localhost`, `::1`, `127.0.0.0/8`, and their IPv4-mapped-IPv6 forms. */
26
+ export declare function isLoopbackApiHost(hostname: string): boolean;
27
+ /** True for RFC1918/link-local/CGNAT/multicast/unspecified/unique-local-IPv6 addresses — private network space a public caller should never be steered into. */
28
+ export declare function isBlockedExternalApiHostname(hostname: string): boolean;
29
+ /** Synchronous base-URL check: scheme allow-list + literal-hostname block-list. Does not resolve DNS — see {@link validateBaseUrlResolved}. */
30
+ export declare function validateBaseUrl(baseUrl: string): BaseUrlValidationResult;
31
+ export type DnsLookupAddress = {
32
+ address: string;
33
+ family: number;
34
+ };
35
+ export type DnsLookupFn = (hostname: string) => Promise<DnsLookupAddress[]>;
36
+ /**
37
+ * DNS-aware companion to {@link validateBaseUrl}. The synchronous check only
38
+ * inspects the literal hostname string, so a public DNS name pointing at
39
+ * internal infrastructure (`internal.example.com -> 10.0.0.5`) slips through
40
+ * and a caller ends up issuing a request to a private address on behalf of
41
+ * whoever supplied the base URL. Resolves the hostname and re-runs the
42
+ * block-list against every address the system would actually connect to.
43
+ *
44
+ * Loopback is intentionally allowed (for local LLM servers like Ollama); any
45
+ * hostname that resolves to a loopback address (including `*.localhost` per
46
+ * RFC 6761 and IPv4-mapped IPv6 loopback) follows the same carve-out.
47
+ *
48
+ * DNS lookup failures are not treated as a security signal — the caller is
49
+ * going to surface a connection error from `fetch` anyway, and turning a
50
+ * transient resolver hiccup into a rejection would just confuse callers. The
51
+ * synchronous hostname check still rejects the obvious literal-IP cases
52
+ * before DNS is ever consulted. `lookup` defaults to `node:dns`'s promise
53
+ * `lookup(hostname, { all: true, family: 0 })`, injectable for tests and for
54
+ * hosts that already own a resolver.
55
+ */
56
+ export declare function validateBaseUrlResolved(baseUrl: string, lookup: DnsLookupFn): Promise<BaseUrlValidationResult>;
57
+ /**
58
+ * Redacts bearer tokens, `x-api-key`/`api-key`/`x-goog-api-key` headers,
59
+ * `?key=` query values, and any exact secret strings supplied via
60
+ * `exactSecrets` out of free-form text — for logging or surfacing an
61
+ * upstream error message to a caller without leaking credentials embedded in
62
+ * it (some providers echo the key back in a 401 body).
63
+ */
64
+ export declare function redactSecrets(text: string, exactSecrets?: ReadonlyArray<string | undefined | null>): string;
65
+ /** Default DNS lookup for {@link validateBaseUrlResolved} — `node:dns/promises`' `lookup(hostname, { all: true, family: 0 })`. */
66
+ export declare function defaultDnsLookup(hostname: string): Promise<DnsLookupAddress[]>;
67
+ //# sourceMappingURL=connection-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-guard.d.ts","sourceRoot":"","sources":["../../src/providers/connection-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAsED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAM3D;AAED,gKAAgK;AAChK,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQtE;AAED,+IAA+I;AAC/I,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB,CAexE;AAED,MAAM,MAAM,gBAAgB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AACnE,MAAM,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;AAU5E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,uBAAuB,CAAC,CAwBlC;AAMD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,YAAY,GAAE,aAAa,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAM,GAC1D,MAAM,CAWR;AAED,kIAAkI;AAClI,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAIpF"}
@@ -0,0 +1,211 @@
1
+ /**
2
+ * @module providers/connection-guard
3
+ *
4
+ * Minimal, self-contained SSRF-guard + secret-redaction utilities needed by
5
+ * this package's own `model-catalog.ts`. Vendored from the small generic
6
+ * subset of OD's `packages/contracts/src/api/connectionTest.ts` (the
7
+ * `isLoopbackApiHost`/`isBlockedExternalApiHostname`/`validateBaseUrl` triad)
8
+ * and `apps/daemon/src/connectionTest.ts` (`validateBaseUrlResolved`'s
9
+ * DNS-aware follow-up check, `redactSecrets`) — not the surrounding
10
+ * 2,600-line file, which is almost entirely OD's own agent-CLI
11
+ * connection-test orchestration (proxy dispatchers, product-specific
12
+ * executable-fallback copy and env-var names) and out of this task's
13
+ * scope; see `source-map.md` for the exact origin details. These four
14
+ * functions are pure security/text utilities with
15
+ * no product coupling in the origin — reject requests to loopback-disguised
16
+ * or RFC1918/link-local/CGNAT/metadata-service addresses, and strip bearer
17
+ * tokens / API-key headers / `?key=` query values out of free-form text
18
+ * before it is logged or surfaced to a caller.
19
+ */
20
+ function normalizeBracketedIpv6(hostname) {
21
+ const stripped = hostname.startsWith('[') && hostname.endsWith(']')
22
+ ? hostname.slice(1, -1)
23
+ : hostname;
24
+ // FQDN trailing-dot form (RFC 1034) resolves identically to the dotless
25
+ // form, so `localhost.` must normalize to `localhost` before the equality
26
+ // check below — and `0.0.0.0.`, `10.0.0.1.`, etc. must normalize before
27
+ // isBlockedIpv4 parses them. Strips one or more trailing dots.
28
+ return stripped.toLowerCase().replace(/\.+$/, '');
29
+ }
30
+ function parseIpv4(hostname) {
31
+ const parts = hostname.split('.');
32
+ if (parts.length !== 4)
33
+ return null;
34
+ const parsed = parts.map((part) => {
35
+ if (!/^\d{1,3}$/.test(part))
36
+ return null;
37
+ const value = Number(part);
38
+ return value >= 0 && value <= 255 ? value : null;
39
+ });
40
+ if (parsed.some((part) => part === null))
41
+ return null;
42
+ return parsed;
43
+ }
44
+ function isLoopbackIpv4(hostname) {
45
+ const parts = parseIpv4(hostname);
46
+ return Boolean(parts && parts[0] === 127);
47
+ }
48
+ function isBlockedIpv4(hostname) {
49
+ const parts = parseIpv4(hostname);
50
+ if (!parts)
51
+ return false;
52
+ const [a, b] = parts;
53
+ return (a === 0 ||
54
+ (a === 100 && b >= 64 && b <= 127) ||
55
+ (a === 169 && b === 254) ||
56
+ a === 10 ||
57
+ (a === 192 && b === 168) ||
58
+ (a === 172 && b >= 16 && b <= 31) ||
59
+ a >= 224);
60
+ }
61
+ function ipv4MappedToDotted(hostname) {
62
+ const host = normalizeBracketedIpv6(hostname);
63
+ const mapped = /^::ffff:(.+)$/i.exec(host)?.[1];
64
+ if (!mapped)
65
+ return null;
66
+ if (parseIpv4(mapped.toLowerCase()))
67
+ return mapped.toLowerCase();
68
+ const hexParts = mapped.split(':');
69
+ if (hexParts.length !== 2 ||
70
+ !hexParts.every((part) => /^[0-9a-f]{1,4}$/i.test(part))) {
71
+ return null;
72
+ }
73
+ // Non-null assertions, not a runtime guard: the length/regex checks above
74
+ // already guarantee exactly two non-empty hex segments here.
75
+ const hi = hexParts[0];
76
+ const lo = hexParts[1];
77
+ const value = (Number.parseInt(hi, 16) << 16) | Number.parseInt(lo, 16);
78
+ return [
79
+ (value >>> 24) & 255,
80
+ (value >>> 16) & 255,
81
+ (value >>> 8) & 255,
82
+ value & 255,
83
+ ].join('.');
84
+ }
85
+ /** True for `localhost`, `::1`, `127.0.0.0/8`, and their IPv4-mapped-IPv6 forms. */
86
+ export function isLoopbackApiHost(hostname) {
87
+ const host = normalizeBracketedIpv6(hostname);
88
+ if (host === 'localhost' || host === '::1')
89
+ return true;
90
+ if (isLoopbackIpv4(host))
91
+ return true;
92
+ const mapped = ipv4MappedToDotted(host);
93
+ return Boolean(mapped && isLoopbackIpv4(mapped));
94
+ }
95
+ /** True for RFC1918/link-local/CGNAT/multicast/unspecified/unique-local-IPv6 addresses — private network space a public caller should never be steered into. */
96
+ export function isBlockedExternalApiHostname(hostname) {
97
+ const host = normalizeBracketedIpv6(hostname);
98
+ if (host === '::')
99
+ return true;
100
+ if (isBlockedIpv4(host))
101
+ return true;
102
+ if (/^f[cd][0-9a-f]{2}:/i.test(host))
103
+ return true;
104
+ if (/^fe[89ab][0-9a-f]:/i.test(host))
105
+ return true;
106
+ const mapped = ipv4MappedToDotted(host);
107
+ return Boolean(mapped && isBlockedIpv4(mapped));
108
+ }
109
+ /** Synchronous base-URL check: scheme allow-list + literal-hostname block-list. Does not resolve DNS — see {@link validateBaseUrlResolved}. */
110
+ export function validateBaseUrl(baseUrl) {
111
+ let parsed;
112
+ try {
113
+ parsed = new URL(String(baseUrl).replace(/\/+$/, ''));
114
+ }
115
+ catch {
116
+ return { error: 'Invalid baseUrl' };
117
+ }
118
+ if (!['http:', 'https:'].includes(parsed.protocol)) {
119
+ return { error: 'Only http/https allowed' };
120
+ }
121
+ const hostname = parsed.hostname.toLowerCase();
122
+ if (!isLoopbackApiHost(hostname) && isBlockedExternalApiHostname(hostname)) {
123
+ return { error: 'Internal IPs blocked', forbidden: true };
124
+ }
125
+ return { parsed };
126
+ }
127
+ function looksLikeIpLiteral(hostname) {
128
+ const host = hostname.startsWith('[') && hostname.endsWith(']')
129
+ ? hostname.slice(1, -1)
130
+ : hostname;
131
+ if (/^\d{1,3}(?:\.\d{1,3}){3}$/.test(host))
132
+ return true;
133
+ return host.includes(':');
134
+ }
135
+ /**
136
+ * DNS-aware companion to {@link validateBaseUrl}. The synchronous check only
137
+ * inspects the literal hostname string, so a public DNS name pointing at
138
+ * internal infrastructure (`internal.example.com -> 10.0.0.5`) slips through
139
+ * and a caller ends up issuing a request to a private address on behalf of
140
+ * whoever supplied the base URL. Resolves the hostname and re-runs the
141
+ * block-list against every address the system would actually connect to.
142
+ *
143
+ * Loopback is intentionally allowed (for local LLM servers like Ollama); any
144
+ * hostname that resolves to a loopback address (including `*.localhost` per
145
+ * RFC 6761 and IPv4-mapped IPv6 loopback) follows the same carve-out.
146
+ *
147
+ * DNS lookup failures are not treated as a security signal — the caller is
148
+ * going to surface a connection error from `fetch` anyway, and turning a
149
+ * transient resolver hiccup into a rejection would just confuse callers. The
150
+ * synchronous hostname check still rejects the obvious literal-IP cases
151
+ * before DNS is ever consulted. `lookup` defaults to `node:dns`'s promise
152
+ * `lookup(hostname, { all: true, family: 0 })`, injectable for tests and for
153
+ * hosts that already own a resolver.
154
+ */
155
+ export async function validateBaseUrlResolved(baseUrl, lookup) {
156
+ const sync = validateBaseUrl(baseUrl);
157
+ if (sync.error || !sync.parsed)
158
+ return sync;
159
+ const hostname = sync.parsed.hostname.toLowerCase();
160
+ if (isLoopbackApiHost(hostname))
161
+ return sync;
162
+ if (looksLikeIpLiteral(hostname))
163
+ return sync;
164
+ let addresses;
165
+ try {
166
+ addresses = await lookup(hostname);
167
+ }
168
+ catch {
169
+ return sync;
170
+ }
171
+ for (const addr of addresses) {
172
+ const ip = String(addr.address).toLowerCase();
173
+ if (isLoopbackApiHost(ip))
174
+ continue;
175
+ if (isBlockedExternalApiHostname(ip)) {
176
+ return { error: 'Internal IPs blocked', forbidden: true };
177
+ }
178
+ }
179
+ return sync;
180
+ }
181
+ function escapeRegExp(value) {
182
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
183
+ }
184
+ /**
185
+ * Redacts bearer tokens, `x-api-key`/`api-key`/`x-goog-api-key` headers,
186
+ * `?key=` query values, and any exact secret strings supplied via
187
+ * `exactSecrets` out of free-form text — for logging or surfacing an
188
+ * upstream error message to a caller without leaking credentials embedded in
189
+ * it (some providers echo the key back in a 401 body).
190
+ */
191
+ export function redactSecrets(text, exactSecrets = []) {
192
+ if (typeof text !== 'string' || text.length === 0)
193
+ return '';
194
+ let redacted = text
195
+ .replace(/Bearer\s+[A-Za-z0-9_\-.+/=]+/gi, 'Bearer [REDACTED]')
196
+ .replace(/(x-api-key|api-key|x-goog-api-key)\s*[:=]\s*[^\s,;"']+/gi, '$1: [REDACTED]')
197
+ .replace(/([?&]key=)[^&\s]+/gi, '$1[REDACTED]');
198
+ for (const secret of exactSecrets) {
199
+ if (typeof secret !== 'string' || secret.length === 0)
200
+ continue;
201
+ redacted = redacted.replace(new RegExp(escapeRegExp(secret), 'g'), '[REDACTED]');
202
+ }
203
+ return redacted;
204
+ }
205
+ /** Default DNS lookup for {@link validateBaseUrlResolved} — `node:dns/promises`' `lookup(hostname, { all: true, family: 0 })`. */
206
+ export async function defaultDnsLookup(hostname) {
207
+ const { promises: dnsPromises } = await import('node:dns');
208
+ const result = await dnsPromises.lookup(hostname, { all: true, family: 0 });
209
+ return result.map(({ address, family }) => ({ address, family }));
210
+ }
211
+ //# sourceMappingURL=connection-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-guard.js","sourceRoot":"","sources":["../../src/providers/connection-guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface ElevenLabsVoiceOption {
2
+ voiceId: string;
3
+ name: string;
4
+ category?: string;
5
+ labels?: Record<string, string>;
6
+ previewUrl?: string;
7
+ }
8
+ export interface ElevenLabsCredentials {
9
+ apiKey: string;
10
+ baseUrl?: string;
11
+ }
12
+ /** Host-supplied credential lookup — replaces OD's product-owned settings-store reader. */
13
+ export type ElevenLabsCredentialResolver = (workspaceKey: string) => Promise<ElevenLabsCredentials>;
14
+ /** Thrown when {@link ElevenLabsCredentialResolver} resolves no API key. */
15
+ export declare class ElevenLabsCredentialMissingError extends Error {
16
+ constructor();
17
+ }
18
+ /**
19
+ * Lists the ElevenLabs voice catalog for a workspace, resolving credentials
20
+ * via the injected {@link ElevenLabsCredentialResolver} and caching the
21
+ * result for {@link ELEVENLABS_VOICE_CACHE_TTL_MS}. Throws
22
+ * {@link ElevenLabsCredentialMissingError} when no API key is configured.
23
+ */
24
+ export declare function listElevenLabsVoiceOptions(workspaceKey: string, resolveCredentials: ElevenLabsCredentialResolver, options?: {
25
+ limit?: number;
26
+ requestInit?: Pick<RequestInit, 'dispatcher'>;
27
+ }): Promise<ElevenLabsVoiceOption[]>;
28
+ //# sourceMappingURL=elevenlabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elevenlabs.d.ts","sourceRoot":"","sources":["../../src/providers/elevenlabs.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,2FAA2F;AAC3F,MAAM,MAAM,4BAA4B,GAAG,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEpG,4EAA4E;AAC5E,qBAAa,gCAAiC,SAAQ,KAAK;;CAK1D;AA+ED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,YAAY,EAAE,MAAM,EACpB,kBAAkB,EAAE,4BAA4B,EAChD,OAAO,GAAE;IACP,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;CAC1C,GACL,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAgDlC"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * @module providers/elevenlabs
3
+ *
4
+ * ElevenLabs voice-catalog listing (`GET /v2/voices`), with a short in-memory
5
+ * TTL cache keyed by workspace + base URL + page size + a credential
6
+ * fingerprint (never the raw key). Ported from OD's
7
+ * `integrations/elevenlabs-voices.ts`.
8
+ *
9
+ * De-branded: the origin resolved the API key/base URL via OD's own
10
+ * `resolveProviderConfig` (`../media/config.js`, a product-owned
11
+ * settings-store reader entirely out of this package's scope) and threw a
12
+ * hardcoded product-prefixed env-var hint (see `source-map.md` for the
13
+ * exact original string). Both are replaced by an
14
+ * injected {@link ElevenLabsCredentialResolver} port — a host supplies its
15
+ * own settings-store/env lookup; this package only knows how to call the
16
+ * ElevenLabs wire API once it has a key.
17
+ */
18
+ import { createHash } from 'node:crypto';
19
+ const ELEVENLABS_DEFAULT_BASE_URL = 'https://api.elevenlabs.io';
20
+ const ELEVENLABS_DEFAULT_VOICE_LIMIT = 100;
21
+ const ELEVENLABS_MAX_VOICE_LIMIT = 100;
22
+ const ELEVENLABS_VOICE_CACHE_TTL_MS = 10 * 60 * 1000;
23
+ /** Thrown when {@link ElevenLabsCredentialResolver} resolves no API key. */
24
+ export class ElevenLabsCredentialMissingError extends Error {
25
+ constructor() {
26
+ super('no ElevenLabs API key configured for this workspace');
27
+ this.name = 'ElevenLabsCredentialMissingError';
28
+ }
29
+ }
30
+ const voiceOptionsCache = new Map();
31
+ function isRecord(value) {
32
+ return value !== null && typeof value === 'object';
33
+ }
34
+ function readString(value) {
35
+ return typeof value === 'string' && value.trim() ? value.trim() : '';
36
+ }
37
+ function readLabels(value) {
38
+ if (!isRecord(value))
39
+ return undefined;
40
+ const labels = {};
41
+ for (const [key, raw] of Object.entries(value)) {
42
+ const normalized = readString(raw);
43
+ if (normalized)
44
+ labels[key] = normalized;
45
+ }
46
+ return Object.keys(labels).length > 0 ? labels : undefined;
47
+ }
48
+ function clampLimit(limit) {
49
+ if (typeof limit !== 'number' || !Number.isFinite(limit)) {
50
+ return ELEVENLABS_DEFAULT_VOICE_LIMIT;
51
+ }
52
+ return Math.min(ELEVENLABS_MAX_VOICE_LIMIT, Math.max(1, Math.floor(limit)));
53
+ }
54
+ function normalizeVoice(value) {
55
+ if (!isRecord(value))
56
+ return null;
57
+ const voiceId = readString(value.voice_id);
58
+ if (!voiceId)
59
+ return null;
60
+ const name = readString(value.name) || voiceId;
61
+ const category = readString(value.category);
62
+ const previewUrl = readString(value.preview_url);
63
+ const labels = readLabels(value.labels);
64
+ return {
65
+ voiceId,
66
+ name,
67
+ ...(category ? { category } : {}),
68
+ ...(labels ? { labels } : {}),
69
+ ...(previewUrl ? { previewUrl } : {}),
70
+ };
71
+ }
72
+ function cacheCredentialFingerprint(apiKey) {
73
+ return createHash('sha256').update(apiKey).digest('hex').slice(0, 16);
74
+ }
75
+ function voiceCacheKey(input) {
76
+ return [
77
+ input.workspaceKey,
78
+ input.baseUrl,
79
+ input.pageSize,
80
+ cacheCredentialFingerprint(input.apiKey),
81
+ ].join('\0');
82
+ }
83
+ function cloneVoiceOptions(voices) {
84
+ return voices.map((voice) => ({
85
+ ...voice,
86
+ ...(voice.labels ? { labels: { ...voice.labels } } : {}),
87
+ }));
88
+ }
89
+ /**
90
+ * Lists the ElevenLabs voice catalog for a workspace, resolving credentials
91
+ * via the injected {@link ElevenLabsCredentialResolver} and caching the
92
+ * result for {@link ELEVENLABS_VOICE_CACHE_TTL_MS}. Throws
93
+ * {@link ElevenLabsCredentialMissingError} when no API key is configured.
94
+ */
95
+ export async function listElevenLabsVoiceOptions(workspaceKey, resolveCredentials, options = {}) {
96
+ const credentials = await resolveCredentials(workspaceKey);
97
+ if (!credentials.apiKey) {
98
+ throw new ElevenLabsCredentialMissingError();
99
+ }
100
+ const baseUrl = (credentials.baseUrl || ELEVENLABS_DEFAULT_BASE_URL).replace(/\/$/, '');
101
+ const pageSize = clampLimit(options.limit);
102
+ const cacheKey = voiceCacheKey({
103
+ workspaceKey,
104
+ baseUrl,
105
+ apiKey: credentials.apiKey,
106
+ pageSize,
107
+ });
108
+ const cached = voiceOptionsCache.get(cacheKey);
109
+ const now = Date.now();
110
+ if (cached && cached.expiresAt > now) {
111
+ return cloneVoiceOptions(cached.voices);
112
+ }
113
+ const resp = await fetch(`${baseUrl}/v2/voices?page_size=${pageSize}`, {
114
+ ...options.requestInit,
115
+ method: 'GET',
116
+ headers: {
117
+ 'xi-api-key': credentials.apiKey,
118
+ accept: 'application/json',
119
+ },
120
+ });
121
+ if (!resp.ok) {
122
+ const errText = await resp.text();
123
+ throw new Error(`elevenlabs voices ${resp.status}: ${errText.slice(0, 240)}`);
124
+ }
125
+ const payload = await resp.json();
126
+ const rawVoices = isRecord(payload) && Array.isArray(payload.voices)
127
+ ? payload.voices
128
+ : [];
129
+ const voices = rawVoices
130
+ .map((voice) => normalizeVoice(voice))
131
+ .filter((voice) => voice !== null);
132
+ voiceOptionsCache.set(cacheKey, {
133
+ expiresAt: now + ELEVENLABS_VOICE_CACHE_TTL_MS,
134
+ voices: cloneVoiceOptions(voices),
135
+ });
136
+ return voices;
137
+ }
138
+ //# sourceMappingURL=elevenlabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elevenlabs.js","sourceRoot":"","sources":["../../src/providers/elevenlabs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ import { type TurnEndReason } from './turn-end-guard.js';
2
+ export interface GoogleTextPart {
3
+ readonly text: string;
4
+ }
5
+ export interface GoogleFunctionCallPart {
6
+ readonly functionCall: {
7
+ readonly name: string;
8
+ readonly args: unknown;
9
+ readonly id?: string;
10
+ };
11
+ }
12
+ export interface GoogleFunctionResponsePart {
13
+ readonly functionResponse: {
14
+ readonly name: string;
15
+ readonly response: unknown;
16
+ readonly id?: string;
17
+ };
18
+ }
19
+ export type GooglePart = GoogleTextPart | GoogleFunctionCallPart | GoogleFunctionResponsePart;
20
+ export interface GoogleContent {
21
+ readonly role: 'user' | 'model';
22
+ readonly parts: readonly GooglePart[];
23
+ }
24
+ export interface GoogleFunctionDeclaration {
25
+ readonly name: string;
26
+ readonly description?: string;
27
+ readonly parameters: Record<string, unknown>;
28
+ }
29
+ export interface GoogleToolDef {
30
+ readonly functionDeclarations: readonly GoogleFunctionDeclaration[];
31
+ }
32
+ export interface GoogleToolCall {
33
+ readonly id: string;
34
+ readonly name: string;
35
+ readonly input: unknown;
36
+ }
37
+ export interface GoogleToolResult {
38
+ readonly content: string;
39
+ readonly isError?: boolean;
40
+ }
41
+ /** Host-owned tool execution — same "the collaborator is always supplied" convention as `anthropic-messages.ts#AnthropicToolExecutor`. */
42
+ export type GoogleToolExecutor = (call: GoogleToolCall) => Promise<GoogleToolResult>;
43
+ /** Why a `runGoogleToolTurn` call ended its event stream. */
44
+ export type GoogleTurnEndReason = TurnEndReason;
45
+ export type GoogleTurnEvent = {
46
+ readonly type: 'status';
47
+ readonly label: string;
48
+ } | {
49
+ readonly type: 'text_delta';
50
+ readonly delta: string;
51
+ } | {
52
+ readonly type: 'tool_use';
53
+ readonly id: string;
54
+ readonly name: string;
55
+ readonly input: unknown;
56
+ } | {
57
+ readonly type: 'tool_result';
58
+ readonly toolUseId: string;
59
+ readonly content: string;
60
+ readonly isError: boolean;
61
+ } | {
62
+ readonly type: 'usage';
63
+ readonly usage: Record<string, unknown> | null;
64
+ } | {
65
+ readonly type: 'fabricated_role_marker';
66
+ readonly marker: string;
67
+ readonly messageId: string;
68
+ } | {
69
+ readonly type: 'error';
70
+ readonly message: string;
71
+ readonly code?: string;
72
+ } | {
73
+ readonly type: 'end';
74
+ readonly reason: GoogleTurnEndReason;
75
+ };
76
+ export interface GoogleTurnOptions {
77
+ readonly apiKey: string;
78
+ /** Defaults to `https://generativelanguage.googleapis.com`. Overridable for BYOK-compatible gateways. */
79
+ readonly baseUrl?: string;
80
+ readonly model: string;
81
+ readonly system?: string;
82
+ readonly contents: readonly GoogleContent[];
83
+ readonly tools?: readonly GoogleToolDef[];
84
+ readonly temperature?: number;
85
+ readonly maxOutputTokens?: number;
86
+ /** Same bound and rationale as `AnthropicTurnOptions.maxToolTurns`. Defaults to 8. */
87
+ readonly maxToolTurns?: number;
88
+ readonly executeTool?: GoogleToolExecutor;
89
+ readonly onEvent: (event: GoogleTurnEvent) => void;
90
+ readonly signal?: AbortSignal;
91
+ /** Caller-supplied extra headers — see `anthropic-messages.ts#AnthropicTurnOptions.extraHeaders`'s doc for why this exists and what it fixes. */
92
+ readonly extraHeaders?: Record<string, string>;
93
+ }
94
+ export interface GoogleTurnResult {
95
+ readonly finishReason: string | null;
96
+ readonly toolTurns: number;
97
+ }
98
+ /**
99
+ * Runs a full Gemini `streamGenerateContent` turn, including the
100
+ * tool-execution loop when `options.executeTool` is supplied and the model
101
+ * requests a function call. See `anthropic-messages.ts#runAnthropicToolTurn`'s
102
+ * doc for the shared event-stream/`ended`-flag contract this mirrors — with
103
+ * one deliberate structural difference: the loop-continuation predicate is
104
+ * `toolCalls.length > 0`, not a `finishReason` comparison (see module doc,
105
+ * point 2, for why Gemini's `finishReason` enum cannot be used here).
106
+ */
107
+ export declare function runGoogleToolTurn(options: GoogleTurnOptions): Promise<GoogleTurnResult>;
108
+ //# sourceMappingURL=google-messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-messages.d.ts","sourceRoot":"","sources":["../../src/providers/google-messages.ts"],"names":[],"mappings":"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"}