@vascend/talos 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 (620) hide show
  1. package/README.md +202 -0
  2. package/dist/backend/asset-events.d.ts +31 -0
  3. package/dist/backend/asset-events.js +149 -0
  4. package/dist/backend/assets.d.ts +31 -0
  5. package/dist/backend/assets.js +210 -0
  6. package/dist/backend/auth.d.ts +18 -0
  7. package/dist/backend/auth.js +59 -0
  8. package/dist/backend/config.d.ts +14 -0
  9. package/dist/backend/config.js +41 -0
  10. package/dist/backend/conversations.d.ts +21 -0
  11. package/dist/backend/conversations.js +141 -0
  12. package/dist/backend/crypto.d.ts +9 -0
  13. package/dist/backend/crypto.js +68 -0
  14. package/dist/backend/engine.d.ts +13 -0
  15. package/dist/backend/engine.js +78 -0
  16. package/dist/backend/http.d.ts +25 -0
  17. package/dist/backend/http.js +112 -0
  18. package/dist/backend/index.d.ts +1 -0
  19. package/dist/backend/index.js +24 -0
  20. package/dist/backend/routes.d.ts +14 -0
  21. package/dist/backend/routes.js +169 -0
  22. package/dist/backend/sdk.d.ts +12 -0
  23. package/dist/backend/sdk.js +11 -0
  24. package/dist/backend/server.d.ts +12 -0
  25. package/dist/backend/server.js +91 -0
  26. package/dist/backend/temp-image-store.d.ts +46 -0
  27. package/dist/backend/temp-image-store.js +197 -0
  28. package/dist/backend/types.d.ts +103 -0
  29. package/dist/backend/types.js +29 -0
  30. package/dist/backend/users.d.ts +13 -0
  31. package/dist/backend/users.js +76 -0
  32. package/dist/backend/ws-handler.d.ts +14 -0
  33. package/dist/backend/ws-handler.js +72 -0
  34. package/dist/backend/ws.d.ts +19 -0
  35. package/dist/backend/ws.js +146 -0
  36. package/dist/core/agent.d.ts +56 -0
  37. package/dist/core/agent.js +1783 -0
  38. package/dist/core/background.d.ts +45 -0
  39. package/dist/core/background.js +140 -0
  40. package/dist/core/bootstrap.d.ts +45 -0
  41. package/dist/core/bootstrap.js +294 -0
  42. package/dist/core/cli-args.d.ts +41 -0
  43. package/dist/core/cli-args.js +282 -0
  44. package/dist/core/collapsible-output.d.ts +38 -0
  45. package/dist/core/collapsible-output.js +143 -0
  46. package/dist/core/compaction-checkpoint.d.ts +9 -0
  47. package/dist/core/compaction-checkpoint.js +58 -0
  48. package/dist/core/compaction.d.ts +42 -0
  49. package/dist/core/compaction.js +270 -0
  50. package/dist/core/config.d.ts +49 -0
  51. package/dist/core/config.js +417 -0
  52. package/dist/core/context-ledger.d.ts +99 -0
  53. package/dist/core/context-ledger.js +222 -0
  54. package/dist/core/context-policy.d.ts +17 -0
  55. package/dist/core/context-policy.js +81 -0
  56. package/dist/core/continuation-review.d.ts +23 -0
  57. package/dist/core/continuation-review.js +64 -0
  58. package/dist/core/crash-report.d.ts +3 -0
  59. package/dist/core/crash-report.js +27 -0
  60. package/dist/core/credentials.d.ts +11 -0
  61. package/dist/core/credentials.js +183 -0
  62. package/dist/core/doctor.d.ts +24 -0
  63. package/dist/core/doctor.js +125 -0
  64. package/dist/core/effort.d.ts +5 -0
  65. package/dist/core/effort.js +42 -0
  66. package/dist/core/env-paths.d.ts +3 -0
  67. package/dist/core/env-paths.js +38 -0
  68. package/dist/core/execution-guidance.d.ts +9 -0
  69. package/dist/core/execution-guidance.js +73 -0
  70. package/dist/core/execution-target.d.ts +41 -0
  71. package/dist/core/execution-target.js +69 -0
  72. package/dist/core/file-coordination.d.ts +66 -0
  73. package/dist/core/file-coordination.js +176 -0
  74. package/dist/core/file-lease-store.d.ts +14 -0
  75. package/dist/core/file-lease-store.js +89 -0
  76. package/dist/core/image-limits.d.ts +26 -0
  77. package/dist/core/image-limits.js +205 -0
  78. package/dist/core/interruptible-completion.d.ts +3 -0
  79. package/dist/core/interruptible-completion.js +42 -0
  80. package/dist/core/kingdoms-mode-state.d.ts +24 -0
  81. package/dist/core/kingdoms-mode-state.js +139 -0
  82. package/dist/core/licenza.d.ts +38 -0
  83. package/dist/core/licenza.js +125 -0
  84. package/dist/core/model-limits.d.ts +2 -0
  85. package/dist/core/model-limits.js +36 -0
  86. package/dist/core/output-lifecycle.d.ts +44 -0
  87. package/dist/core/output-lifecycle.js +190 -0
  88. package/dist/core/package-update.d.ts +15 -0
  89. package/dist/core/package-update.js +121 -0
  90. package/dist/core/permission-queue.d.ts +2 -0
  91. package/dist/core/permission-queue.js +20 -0
  92. package/dist/core/prompt-attachment.d.ts +21 -0
  93. package/dist/core/prompt-attachment.js +123 -0
  94. package/dist/core/request-plan.d.ts +16 -0
  95. package/dist/core/request-plan.js +36 -0
  96. package/dist/core/run-timing.d.ts +17 -0
  97. package/dist/core/run-timing.js +123 -0
  98. package/dist/core/self-update.d.ts +17 -0
  99. package/dist/core/self-update.js +54 -0
  100. package/dist/core/session-refs.d.ts +27 -0
  101. package/dist/core/session-refs.js +126 -0
  102. package/dist/core/session-storage.d.ts +4 -0
  103. package/dist/core/session-storage.js +48 -0
  104. package/dist/core/session-title.d.ts +1 -0
  105. package/dist/core/session-title.js +21 -0
  106. package/dist/core/session-usage.d.ts +17 -0
  107. package/dist/core/session-usage.js +74 -0
  108. package/dist/core/session.d.ts +58 -0
  109. package/dist/core/session.js +296 -0
  110. package/dist/core/settings.d.ts +17 -0
  111. package/dist/core/settings.js +107 -0
  112. package/dist/core/storage-retention.d.ts +21 -0
  113. package/dist/core/storage-retention.js +227 -0
  114. package/dist/core/text-sanitize.d.ts +1 -0
  115. package/dist/core/text-sanitize.js +35 -0
  116. package/dist/core/tool-artifacts.d.ts +6 -0
  117. package/dist/core/tool-artifacts.js +51 -0
  118. package/dist/core/tool-compress.d.ts +8 -0
  119. package/dist/core/tool-compress.js +111 -0
  120. package/dist/core/tool-executor.d.ts +16 -0
  121. package/dist/core/tool-executor.js +97 -0
  122. package/dist/core/tool-result-index.d.ts +52 -0
  123. package/dist/core/tool-result-index.js +327 -0
  124. package/dist/core/tool-result-store.d.ts +38 -0
  125. package/dist/core/tool-result-store.js +190 -0
  126. package/dist/core/tool-scheduler.d.ts +16 -0
  127. package/dist/core/tool-scheduler.js +35 -0
  128. package/dist/core/trust.d.ts +21 -0
  129. package/dist/core/trust.js +95 -0
  130. package/dist/core/types.d.ts +402 -0
  131. package/dist/core/types.js +1 -0
  132. package/dist/core/update-check.d.ts +26 -0
  133. package/dist/core/update-check.js +89 -0
  134. package/dist/core/update-process.d.ts +10 -0
  135. package/dist/core/update-process.js +31 -0
  136. package/dist/core/user-inbox.d.ts +23 -0
  137. package/dist/core/user-inbox.js +56 -0
  138. package/dist/core/user-input.d.ts +10 -0
  139. package/dist/core/user-input.js +35 -0
  140. package/dist/core/version.d.ts +1 -0
  141. package/dist/core/version.js +10 -0
  142. package/dist/core/vibe-modes.d.ts +38 -0
  143. package/dist/core/vibe-modes.js +383 -0
  144. package/dist/core/workspace-roots.d.ts +13 -0
  145. package/dist/core/workspace-roots.js +91 -0
  146. package/dist/core/workspace-sessions.d.ts +51 -0
  147. package/dist/core/workspace-sessions.js +243 -0
  148. package/dist/cowork/client.d.ts +29 -0
  149. package/dist/cowork/client.js +49 -0
  150. package/dist/cowork/engine-bridge.d.ts +22 -0
  151. package/dist/cowork/engine-bridge.js +98 -0
  152. package/dist/cowork/index.d.ts +11 -0
  153. package/dist/cowork/index.js +16 -0
  154. package/dist/cowork/ipc.d.ts +97 -0
  155. package/dist/cowork/ipc.js +96 -0
  156. package/dist/cowork/manager.d.ts +66 -0
  157. package/dist/cowork/manager.js +325 -0
  158. package/dist/cowork/store.d.ts +23 -0
  159. package/dist/cowork/store.js +182 -0
  160. package/dist/cowork/sync.d.ts +20 -0
  161. package/dist/cowork/sync.js +164 -0
  162. package/dist/cowork/types.d.ts +78 -0
  163. package/dist/cowork/types.js +21 -0
  164. package/dist/extensions/ext-tools.d.ts +3 -0
  165. package/dist/extensions/ext-tools.js +73 -0
  166. package/dist/extensions/loader.d.ts +91 -0
  167. package/dist/extensions/loader.js +474 -0
  168. package/dist/extensions/settings.d.ts +20 -0
  169. package/dist/extensions/settings.js +86 -0
  170. package/dist/extensions/types.d.ts +219 -0
  171. package/dist/extensions/types.js +1 -0
  172. package/dist/horizon/async-queue.d.ts +9 -0
  173. package/dist/horizon/async-queue.js +46 -0
  174. package/dist/horizon/engine.d.ts +85 -0
  175. package/dist/horizon/engine.js +603 -0
  176. package/dist/horizon/index.d.ts +4 -0
  177. package/dist/horizon/index.js +2 -0
  178. package/dist/horizon/main-team.d.ts +163 -0
  179. package/dist/horizon/main-team.js +774 -0
  180. package/dist/horizon/types.d.ts +233 -0
  181. package/dist/horizon/types.js +1 -0
  182. package/dist/index.d.ts +2 -0
  183. package/dist/index.js +233 -0
  184. package/dist/mcp/protocol.d.ts +81 -0
  185. package/dist/mcp/protocol.js +122 -0
  186. package/dist/package.json +1 -0
  187. package/dist/packages/packages.d.ts +12 -0
  188. package/dist/packages/packages.js +323 -0
  189. package/dist/prompts/templates.d.ts +13 -0
  190. package/dist/prompts/templates.js +139 -0
  191. package/dist/providers/anthropic-oauth.d.ts +13 -0
  192. package/dist/providers/anthropic-oauth.js +124 -0
  193. package/dist/providers/anthropic.d.ts +27 -0
  194. package/dist/providers/anthropic.js +526 -0
  195. package/dist/providers/catalog.d.ts +15 -0
  196. package/dist/providers/catalog.js +166 -0
  197. package/dist/providers/effort.d.ts +12 -0
  198. package/dist/providers/effort.js +102 -0
  199. package/dist/providers/model-catalog.d.ts +43 -0
  200. package/dist/providers/model-catalog.js +70 -0
  201. package/dist/providers/model-effort.d.ts +5 -0
  202. package/dist/providers/model-effort.js +43 -0
  203. package/dist/providers/model-registry.d.ts +39 -0
  204. package/dist/providers/model-registry.js +142 -0
  205. package/dist/providers/models-dev.d.ts +9 -0
  206. package/dist/providers/models-dev.js +97 -0
  207. package/dist/providers/oauth-callback-server.d.ts +28 -0
  208. package/dist/providers/oauth-callback-server.js +184 -0
  209. package/dist/providers/oauth-orchestrator.d.ts +58 -0
  210. package/dist/providers/oauth-orchestrator.js +159 -0
  211. package/dist/providers/oauth-store.d.ts +12 -0
  212. package/dist/providers/oauth-store.js +139 -0
  213. package/dist/providers/open-browser.d.ts +20 -0
  214. package/dist/providers/open-browser.js +92 -0
  215. package/dist/providers/openai-compat.d.ts +14 -0
  216. package/dist/providers/openai-compat.js +523 -0
  217. package/dist/providers/openai-oauth.d.ts +15 -0
  218. package/dist/providers/openai-oauth.js +382 -0
  219. package/dist/providers/openrouter-auth.d.ts +73 -0
  220. package/dist/providers/openrouter-auth.js +321 -0
  221. package/dist/providers/openrouter-manual-fallback.d.ts +25 -0
  222. package/dist/providers/openrouter-manual-fallback.js +161 -0
  223. package/dist/providers/openrouter.d.ts +15 -0
  224. package/dist/providers/openrouter.js +107 -0
  225. package/dist/providers/plan-limits.d.ts +6 -0
  226. package/dist/providers/plan-limits.js +175 -0
  227. package/dist/providers/provider-reset.d.ts +4 -0
  228. package/dist/providers/provider-reset.js +83 -0
  229. package/dist/providers/quota-limits.d.ts +4 -0
  230. package/dist/providers/quota-limits.js +33 -0
  231. package/dist/providers/registry.d.ts +33 -0
  232. package/dist/providers/registry.js +213 -0
  233. package/dist/providers/retry.d.ts +37 -0
  234. package/dist/providers/retry.js +347 -0
  235. package/dist/rpc/server.d.ts +23 -0
  236. package/dist/rpc/server.js +222 -0
  237. package/dist/sdk.d.ts +67 -0
  238. package/dist/sdk.js +64 -0
  239. package/dist/skills/skills.d.ts +17 -0
  240. package/dist/skills/skills.js +155 -0
  241. package/dist/text-sanitize.js +28 -0
  242. package/dist/tools/ask-user.d.ts +2 -0
  243. package/dist/tools/ask-user.js +60 -0
  244. package/dist/tools/builtin.d.ts +48 -0
  245. package/dist/tools/builtin.js +2494 -0
  246. package/dist/tools/capabilities.d.ts +5 -0
  247. package/dist/tools/capabilities.js +55 -0
  248. package/dist/tools/computer-capture.d.ts +2 -0
  249. package/dist/tools/computer-capture.js +91 -0
  250. package/dist/tools/computer-posix.d.ts +5 -0
  251. package/dist/tools/computer-posix.js +136 -0
  252. package/dist/tools/computer-use.d.ts +14 -0
  253. package/dist/tools/computer-use.js +108 -0
  254. package/dist/tools/discovery.d.ts +12 -0
  255. package/dist/tools/discovery.js +205 -0
  256. package/dist/tools/execute.d.ts +2 -0
  257. package/dist/tools/execute.js +73 -0
  258. package/dist/tools/normalize-input.d.ts +17 -0
  259. package/dist/tools/normalize-input.js +174 -0
  260. package/dist/tools/output-artifact.d.ts +3 -0
  261. package/dist/tools/output-artifact.js +80 -0
  262. package/dist/tools/pagination.d.ts +15 -0
  263. package/dist/tools/pagination.js +93 -0
  264. package/dist/tools/plan-status.d.ts +2 -0
  265. package/dist/tools/plan-status.js +109 -0
  266. package/dist/tools/program-input.d.ts +3 -0
  267. package/dist/tools/program-input.js +19 -0
  268. package/dist/tools/program.d.ts +3 -0
  269. package/dist/tools/program.js +567 -0
  270. package/dist/tools/protocol-catalog.d.ts +12 -0
  271. package/dist/tools/protocol-catalog.js +46 -0
  272. package/dist/tools/ramification-tools.d.ts +12 -0
  273. package/dist/tools/ramification-tools.js +528 -0
  274. package/dist/tools/regex-compat.d.ts +9 -0
  275. package/dist/tools/regex-compat.js +96 -0
  276. package/dist/tools/registry.d.ts +51 -0
  277. package/dist/tools/registry.js +185 -0
  278. package/dist/tools/resolve.d.ts +2 -0
  279. package/dist/tools/resolve.js +107 -0
  280. package/dist/tools/shell-env.d.ts +2 -0
  281. package/dist/tools/shell-env.js +7 -0
  282. package/dist/tools/team-input.d.ts +3 -0
  283. package/dist/tools/team-input.js +129 -0
  284. package/dist/tools/team-tools.d.ts +7 -0
  285. package/dist/tools/team-tools.js +348 -0
  286. package/dist/tools/workspace-sessions.d.ts +2 -0
  287. package/dist/tools/workspace-sessions.js +35 -0
  288. package/dist/tui/account-entry.d.ts +1 -0
  289. package/dist/tui/account-entry.js +93 -0
  290. package/dist/tui/attachment-highlight.d.ts +1 -0
  291. package/dist/tui/attachment-highlight.js +24 -0
  292. package/dist/tui/attachment-refs.d.ts +2 -0
  293. package/dist/tui/attachment-refs.js +3 -0
  294. package/dist/tui/bottom-input.d.ts +219 -0
  295. package/dist/tui/bottom-input.js +1958 -0
  296. package/dist/tui/branding.d.ts +107 -0
  297. package/dist/tui/branding.js +750 -0
  298. package/dist/tui/clipboard-image.d.ts +10 -0
  299. package/dist/tui/clipboard-image.js +163 -0
  300. package/dist/tui/clipboard-text.d.ts +9 -0
  301. package/dist/tui/clipboard-text.js +51 -0
  302. package/dist/tui/clipboard-windows.d.ts +8 -0
  303. package/dist/tui/clipboard-windows.js +84 -0
  304. package/dist/tui/collapsible-command.d.ts +15 -0
  305. package/dist/tui/collapsible-command.js +48 -0
  306. package/dist/tui/command-feedback.d.ts +10 -0
  307. package/dist/tui/command-feedback.js +46 -0
  308. package/dist/tui/command-output-registry.d.ts +28 -0
  309. package/dist/tui/command-output-registry.js +103 -0
  310. package/dist/tui/command-transcript.d.ts +12 -0
  311. package/dist/tui/command-transcript.js +90 -0
  312. package/dist/tui/commands.d.ts +20 -0
  313. package/dist/tui/commands.js +131 -0
  314. package/dist/tui/context-bar.d.ts +4 -0
  315. package/dist/tui/context-bar.js +74 -0
  316. package/dist/tui/context-meter.d.ts +25 -0
  317. package/dist/tui/context-meter.js +81 -0
  318. package/dist/tui/cost-binding.d.ts +8 -0
  319. package/dist/tui/cost-binding.js +43 -0
  320. package/dist/tui/cost-tracker.d.ts +49 -0
  321. package/dist/tui/cost-tracker.js +122 -0
  322. package/dist/tui/diff.d.ts +9 -0
  323. package/dist/tui/diff.js +119 -0
  324. package/dist/tui/i18n-catalog.d.ts +5 -0
  325. package/dist/tui/i18n-catalog.js +184 -0
  326. package/dist/tui/i18n.d.ts +6 -0
  327. package/dist/tui/i18n.js +10 -0
  328. package/dist/tui/image-attachments.d.ts +46 -0
  329. package/dist/tui/image-attachments.js +167 -0
  330. package/dist/tui/images.d.ts +12 -0
  331. package/dist/tui/images.js +87 -0
  332. package/dist/tui/intro.d.ts +13 -0
  333. package/dist/tui/intro.js +109 -0
  334. package/dist/tui/language-preference.d.ts +6 -0
  335. package/dist/tui/language-preference.js +24 -0
  336. package/dist/tui/live-output.d.ts +2 -0
  337. package/dist/tui/live-output.js +18 -0
  338. package/dist/tui/locales.d.ts +19 -0
  339. package/dist/tui/locales.js +22 -0
  340. package/dist/tui/login-menu.d.ts +17 -0
  341. package/dist/tui/login-menu.js +58 -0
  342. package/dist/tui/logo.d.ts +8 -0
  343. package/dist/tui/logo.js +305 -0
  344. package/dist/tui/markdown-inline.d.ts +3 -0
  345. package/dist/tui/markdown-inline.js +99 -0
  346. package/dist/tui/markdown-table.d.ts +4 -0
  347. package/dist/tui/markdown-table.js +63 -0
  348. package/dist/tui/markdown.d.ts +11 -0
  349. package/dist/tui/markdown.js +257 -0
  350. package/dist/tui/mcp-transcript.d.ts +7 -0
  351. package/dist/tui/mcp-transcript.js +40 -0
  352. package/dist/tui/model-details.d.ts +2 -0
  353. package/dist/tui/model-details.js +21 -0
  354. package/dist/tui/model-selection.d.ts +7 -0
  355. package/dist/tui/model-selection.js +41 -0
  356. package/dist/tui/native-scrollback.d.ts +27 -0
  357. package/dist/tui/native-scrollback.js +134 -0
  358. package/dist/tui/onboarding.d.ts +72 -0
  359. package/dist/tui/onboarding.js +207 -0
  360. package/dist/tui/paste-collapse.d.ts +39 -0
  361. package/dist/tui/paste-collapse.js +117 -0
  362. package/dist/tui/perm-mode.d.ts +8 -0
  363. package/dist/tui/perm-mode.js +41 -0
  364. package/dist/tui/prompt-queue-store.d.ts +26 -0
  365. package/dist/tui/prompt-queue-store.js +87 -0
  366. package/dist/tui/prompt-queue.d.ts +47 -0
  367. package/dist/tui/prompt-queue.js +187 -0
  368. package/dist/tui/provider-menu.d.ts +33 -0
  369. package/dist/tui/provider-menu.js +175 -0
  370. package/dist/tui/question.d.ts +24 -0
  371. package/dist/tui/question.js +32 -0
  372. package/dist/tui/queue-screen.d.ts +25 -0
  373. package/dist/tui/queue-screen.js +152 -0
  374. package/dist/tui/queue-team.d.ts +3 -0
  375. package/dist/tui/queue-team.js +28 -0
  376. package/dist/tui/queued-questions.d.ts +20 -0
  377. package/dist/tui/queued-questions.js +163 -0
  378. package/dist/tui/quick-help.d.ts +1 -0
  379. package/dist/tui/quick-help.js +53 -0
  380. package/dist/tui/repl.d.ts +78 -0
  381. package/dist/tui/repl.js +4130 -0
  382. package/dist/tui/restore-queued-input.d.ts +3 -0
  383. package/dist/tui/restore-queued-input.js +20 -0
  384. package/dist/tui/review-detail.d.ts +6 -0
  385. package/dist/tui/review-detail.js +56 -0
  386. package/dist/tui/review-files.d.ts +3 -0
  387. package/dist/tui/review-files.js +22 -0
  388. package/dist/tui/review-render.d.ts +22 -0
  389. package/dist/tui/review-render.js +98 -0
  390. package/dist/tui/review-screen.d.ts +38 -0
  391. package/dist/tui/review-screen.js +358 -0
  392. package/dist/tui/review-store.d.ts +60 -0
  393. package/dist/tui/review-store.js +270 -0
  394. package/dist/tui/review-team.d.ts +2 -0
  395. package/dist/tui/review-team.js +27 -0
  396. package/dist/tui/selector-mouse.d.ts +26 -0
  397. package/dist/tui/selector-mouse.js +65 -0
  398. package/dist/tui/selector.d.ts +51 -0
  399. package/dist/tui/selector.js +299 -0
  400. package/dist/tui/session-replay.d.ts +10 -0
  401. package/dist/tui/session-replay.js +78 -0
  402. package/dist/tui/session-usage.d.ts +22 -0
  403. package/dist/tui/session-usage.js +55 -0
  404. package/dist/tui/skill-transcript.d.ts +5 -0
  405. package/dist/tui/skill-transcript.js +31 -0
  406. package/dist/tui/startup.d.ts +5 -0
  407. package/dist/tui/startup.js +61 -0
  408. package/dist/tui/status-line-loader.d.ts +8 -0
  409. package/dist/tui/status-line-loader.js +33 -0
  410. package/dist/tui/status-line.d.ts +38 -0
  411. package/dist/tui/status-line.js +213 -0
  412. package/dist/tui/system-language.d.ts +8 -0
  413. package/dist/tui/system-language.js +41 -0
  414. package/dist/tui/task-labels.d.ts +2 -0
  415. package/dist/tui/task-labels.js +7 -0
  416. package/dist/tui/term-bg.d.ts +4 -0
  417. package/dist/tui/term-bg.js +67 -0
  418. package/dist/tui/terminal-screen.d.ts +12 -0
  419. package/dist/tui/terminal-screen.js +1 -0
  420. package/dist/tui/terminal-text.d.ts +7 -0
  421. package/dist/tui/terminal-text.js +123 -0
  422. package/dist/tui/theme.d.ts +25 -0
  423. package/dist/tui/theme.js +383 -0
  424. package/dist/tui/tool-style.d.ts +7 -0
  425. package/dist/tui/tool-style.js +119 -0
  426. package/dist/tui/update-prompt.d.ts +14 -0
  427. package/dist/tui/update-prompt.js +104 -0
  428. package/dist/tui/usage-footer.d.ts +9 -0
  429. package/dist/tui/usage-footer.js +123 -0
  430. package/dist/tui/vascend-login.d.ts +68 -0
  431. package/dist/tui/vascend-login.js +355 -0
  432. package/dist/tui/web-login.d.ts +28 -0
  433. package/dist/tui/web-login.js +115 -0
  434. package/dist/vascend/activity-status.d.ts +12 -0
  435. package/dist/vascend/activity-status.js +68 -0
  436. package/dist/vascend/architecture-map.d.ts +73 -0
  437. package/dist/vascend/architecture-map.js +424 -0
  438. package/dist/vascend/attention-layout.d.ts +19 -0
  439. package/dist/vascend/attention-layout.js +141 -0
  440. package/dist/vascend/budget-allocator.d.ts +31 -0
  441. package/dist/vascend/budget-allocator.js +79 -0
  442. package/dist/vascend/candidate-collector.d.ts +20 -0
  443. package/dist/vascend/candidate-collector.js +220 -0
  444. package/dist/vascend/code-events.d.ts +24 -0
  445. package/dist/vascend/code-events.js +304 -0
  446. package/dist/vascend/code-graph-memory.d.ts +38 -0
  447. package/dist/vascend/code-graph-memory.js +334 -0
  448. package/dist/vascend/code-graph-runtime.d.ts +19 -0
  449. package/dist/vascend/code-graph-runtime.js +190 -0
  450. package/dist/vascend/code-graph-types.d.ts +58 -0
  451. package/dist/vascend/code-graph-types.js +50 -0
  452. package/dist/vascend/code-parser.d.ts +4 -0
  453. package/dist/vascend/code-parser.js +257 -0
  454. package/dist/vascend/competitor-knowledge.d.ts +53 -0
  455. package/dist/vascend/competitor-knowledge.js +262 -0
  456. package/dist/vascend/completeness.d.ts +16 -0
  457. package/dist/vascend/completeness.js +90 -0
  458. package/dist/vascend/context-autotuner.d.ts +45 -0
  459. package/dist/vascend/context-autotuner.js +231 -0
  460. package/dist/vascend/context-candidate.d.ts +45 -0
  461. package/dist/vascend/context-candidate.js +150 -0
  462. package/dist/vascend/context-capsule.d.ts +51 -0
  463. package/dist/vascend/context-capsule.js +133 -0
  464. package/dist/vascend/context-fabric.d.ts +108 -0
  465. package/dist/vascend/context-fabric.js +480 -0
  466. package/dist/vascend/context-feedback-loop.d.ts +56 -0
  467. package/dist/vascend/context-feedback-loop.js +204 -0
  468. package/dist/vascend/context-learning-identity.d.ts +4 -0
  469. package/dist/vascend/context-learning-identity.js +8 -0
  470. package/dist/vascend/context-links.d.ts +14 -0
  471. package/dist/vascend/context-links.js +83 -0
  472. package/dist/vascend/context-lint.d.ts +22 -0
  473. package/dist/vascend/context-lint.js +91 -0
  474. package/dist/vascend/context-market-selection.d.ts +17 -0
  475. package/dist/vascend/context-market-selection.js +50 -0
  476. package/dist/vascend/context-metrics.d.ts +25 -0
  477. package/dist/vascend/context-metrics.js +57 -0
  478. package/dist/vascend/context-pack-render.d.ts +16 -0
  479. package/dist/vascend/context-pack-render.js +52 -0
  480. package/dist/vascend/context-pareto.d.ts +33 -0
  481. package/dist/vascend/context-pareto.js +165 -0
  482. package/dist/vascend/context-pattern-explorer.d.ts +41 -0
  483. package/dist/vascend/context-pattern-explorer.js +276 -0
  484. package/dist/vascend/context-regret.d.ts +32 -0
  485. package/dist/vascend/context-regret.js +93 -0
  486. package/dist/vascend/context-retriever.d.ts +22 -0
  487. package/dist/vascend/context-retriever.js +243 -0
  488. package/dist/vascend/context-scope-index.d.ts +5 -0
  489. package/dist/vascend/context-scope-index.js +96 -0
  490. package/dist/vascend/context-scorer.d.ts +35 -0
  491. package/dist/vascend/context-scorer.js +162 -0
  492. package/dist/vascend/context-search-index.d.ts +12 -0
  493. package/dist/vascend/context-search-index.js +25 -0
  494. package/dist/vascend/context-snapshot.d.ts +22 -0
  495. package/dist/vascend/context-snapshot.js +135 -0
  496. package/dist/vascend/context-window-compiler.d.ts +42 -0
  497. package/dist/vascend/context-window-compiler.js +237 -0
  498. package/dist/vascend/contract-memory.d.ts +61 -0
  499. package/dist/vascend/contract-memory.js +435 -0
  500. package/dist/vascend/council.d.ts +58 -0
  501. package/dist/vascend/council.js +337 -0
  502. package/dist/vascend/decision-promotion.d.ts +48 -0
  503. package/dist/vascend/decision-promotion.js +410 -0
  504. package/dist/vascend/delta-context.d.ts +12 -0
  505. package/dist/vascend/delta-context.js +36 -0
  506. package/dist/vascend/dev-context-compiler.d.ts +27 -0
  507. package/dist/vascend/dev-context-compiler.js +133 -0
  508. package/dist/vascend/dev-context-layout.d.ts +30 -0
  509. package/dist/vascend/dev-context-layout.js +262 -0
  510. package/dist/vascend/evidence-slots.d.ts +14 -0
  511. package/dist/vascend/evidence-slots.js +55 -0
  512. package/dist/vascend/expansion-levels.d.ts +15 -0
  513. package/dist/vascend/expansion-levels.js +178 -0
  514. package/dist/vascend/file-lock.d.ts +7 -0
  515. package/dist/vascend/file-lock.js +95 -0
  516. package/dist/vascend/granular-kingdom.d.ts +25 -0
  517. package/dist/vascend/granular-kingdom.js +259 -0
  518. package/dist/vascend/granular-launcher.d.ts +48 -0
  519. package/dist/vascend/granular-launcher.js +202 -0
  520. package/dist/vascend/kingdom-bus.d.ts +25 -0
  521. package/dist/vascend/kingdom-bus.js +54 -0
  522. package/dist/vascend/kingdom-channel.d.ts +22 -0
  523. package/dist/vascend/kingdom-channel.js +180 -0
  524. package/dist/vascend/kingdom-kpi.d.ts +48 -0
  525. package/dist/vascend/kingdom-kpi.js +172 -0
  526. package/dist/vascend/kingdom-live.d.ts +28 -0
  527. package/dist/vascend/kingdom-live.js +61 -0
  528. package/dist/vascend/kingdom-run.d.ts +18 -0
  529. package/dist/vascend/kingdom-run.js +506 -0
  530. package/dist/vascend/kingdom-scribe.d.ts +20 -0
  531. package/dist/vascend/kingdom-scribe.js +52 -0
  532. package/dist/vascend/kingdom.d.ts +79 -0
  533. package/dist/vascend/kingdom.js +870 -0
  534. package/dist/vascend/lexical-index.d.ts +10 -0
  535. package/dist/vascend/lexical-index.js +99 -0
  536. package/dist/vascend/lexical-search.d.ts +29 -0
  537. package/dist/vascend/lexical-search.js +262 -0
  538. package/dist/vascend/long-term-context.d.ts +51 -0
  539. package/dist/vascend/long-term-context.js +194 -0
  540. package/dist/vascend/mandate.d.ts +33 -0
  541. package/dist/vascend/mandate.js +107 -0
  542. package/dist/vascend/memory-packet.d.ts +13 -0
  543. package/dist/vascend/memory-packet.js +155 -0
  544. package/dist/vascend/memory-status.d.ts +22 -0
  545. package/dist/vascend/memory-status.js +73 -0
  546. package/dist/vascend/memory-store.d.ts +62 -0
  547. package/dist/vascend/memory-store.js +273 -0
  548. package/dist/vascend/objective-revision.d.ts +69 -0
  549. package/dist/vascend/objective-revision.js +319 -0
  550. package/dist/vascend/patch-plan-store.d.ts +33 -0
  551. package/dist/vascend/patch-plan-store.js +240 -0
  552. package/dist/vascend/patch-plan.d.ts +97 -0
  553. package/dist/vascend/patch-plan.js +345 -0
  554. package/dist/vascend/plan-progress.d.ts +11 -0
  555. package/dist/vascend/plan-progress.js +68 -0
  556. package/dist/vascend/plan-store.d.ts +64 -0
  557. package/dist/vascend/plan-store.js +460 -0
  558. package/dist/vascend/proof-chains.d.ts +19 -0
  559. package/dist/vascend/proof-chains.js +120 -0
  560. package/dist/vascend/ramification-store.d.ts +25 -0
  561. package/dist/vascend/ramification-store.js +94 -0
  562. package/dist/vascend/ramification.d.ts +193 -0
  563. package/dist/vascend/ramification.js +583 -0
  564. package/dist/vascend/recall-planner.d.ts +17 -0
  565. package/dist/vascend/recall-planner.js +109 -0
  566. package/dist/vascend/requirements.d.ts +31 -0
  567. package/dist/vascend/requirements.js +151 -0
  568. package/dist/vascend/reviewer.d.ts +9 -0
  569. package/dist/vascend/reviewer.js +93 -0
  570. package/dist/vascend/room-graph.d.ts +29 -0
  571. package/dist/vascend/room-graph.js +242 -0
  572. package/dist/vascend/room-memory.d.ts +57 -0
  573. package/dist/vascend/room-memory.js +631 -0
  574. package/dist/vascend/runtime.d.ts +84 -0
  575. package/dist/vascend/runtime.js +286 -0
  576. package/dist/vascend/self-improve.d.ts +104 -0
  577. package/dist/vascend/self-improve.js +396 -0
  578. package/dist/vascend/session-search.d.ts +52 -0
  579. package/dist/vascend/session-search.js +349 -0
  580. package/dist/vascend/supersession-graph.d.ts +14 -0
  581. package/dist/vascend/supersession-graph.js +70 -0
  582. package/dist/vascend/team-areas.d.ts +9 -0
  583. package/dist/vascend/team-areas.js +28 -0
  584. package/dist/vascend/team-handoff.d.ts +24 -0
  585. package/dist/vascend/team-handoff.js +37 -0
  586. package/dist/vascend/team-scheduler.d.ts +13 -0
  587. package/dist/vascend/team-scheduler.js +74 -0
  588. package/dist/vascend/team-session.d.ts +42 -0
  589. package/dist/vascend/team-session.js +142 -0
  590. package/dist/vascend/test-failure-memory.d.ts +76 -0
  591. package/dist/vascend/test-failure-memory.js +354 -0
  592. package/dist/vascend/token-market.d.ts +42 -0
  593. package/dist/vascend/token-market.js +144 -0
  594. package/dist/vascend/tuner-baseline-store.d.ts +52 -0
  595. package/dist/vascend/tuner-baseline-store.js +446 -0
  596. package/dist/vascend/user-profile.d.ts +44 -0
  597. package/dist/vascend/user-profile.js +131 -0
  598. package/dist/vascend/vision.d.ts +94 -0
  599. package/dist/vascend/vision.js +375 -0
  600. package/dist/vascend/work-agent.d.ts +12 -0
  601. package/dist/vascend/work-agent.js +83 -0
  602. package/dist/vascend/work-queue.d.ts +62 -0
  603. package/dist/vascend/work-queue.js +255 -0
  604. package/dist/vascend/work-runner.d.ts +64 -0
  605. package/dist/vascend/work-runner.js +137 -0
  606. package/dist/vascend/worktree.d.ts +38 -0
  607. package/dist/vascend/worktree.js +206 -0
  608. package/dist/vendor/computer-use/README.md +7 -0
  609. package/dist/vendor/computer-use/computer-desktop.js +211 -0
  610. package/dist/vendor/computer-use/computer-observe.js +315 -0
  611. package/dist/vendor/computer-use/computer-scripts.js +1230 -0
  612. package/dist/vendor/computer-use/computer-tools.js +2136 -0
  613. package/dist/vendor/computer-use/package.json +1 -0
  614. package/dist/vendor/computer-use/rac/atomic-input.js +91 -0
  615. package/dist/vendor/computer-use/rac/grammatica.js +101 -0
  616. package/dist/vendor/computer-use/rac/parser.js +185 -0
  617. package/dist/vendor/computer-use/rac/protocol.js +136 -0
  618. package/install.ps1 +30 -0
  619. package/install.sh +50 -0
  620. package/package.json +56 -0
@@ -0,0 +1,526 @@
1
+ import { appendFileSync } from "node:fs";
2
+ import { messaggioErroreTurno, verifica as verificaImmagine } from "../core/image-limits.js";
3
+ import { planLimitsFromHeaders } from "./plan-limits.js";
4
+ import { errorTimingDetail } from "./provider-reset.js";
5
+ // Dump diagnostico (gated da TALOS_DEBUG_STREAM=<file>): scrive la STRUTTURA di
6
+ // ogni evento SSE (tipi, indici, lunghezze) senza il contenuto, per capire come
7
+ // l'endpoint consegna l'input dei tool. Best effort, non interrompe lo stream.
8
+ function debugStreamEvent(evt) {
9
+ const file = process.env["TALOS_DEBUG_STREAM"];
10
+ if (!file)
11
+ return;
12
+ try {
13
+ const type = String(evt["type"] ?? "");
14
+ let extra = "";
15
+ if (type === "content_block_start") {
16
+ const b = evt["content_block"];
17
+ const inputKeys = b?.["input"] && typeof b["input"] === "object" ? Object.keys(b["input"]) : [];
18
+ extra = `idx=${evt["index"]} block=${b?.["type"]} inputKeys=[${inputKeys.join(",")}]`;
19
+ }
20
+ else if (type === "content_block_delta") {
21
+ const d = evt["delta"];
22
+ const pj = d?.["partial_json"];
23
+ extra = `idx=${evt["index"]} delta=${d?.["type"]} pjLen=${typeof pj === "string" ? pj.length : "-"}`;
24
+ }
25
+ else if (type === "message_delta") {
26
+ const d = evt["delta"];
27
+ extra = `stop=${d?.["stop_reason"]}`;
28
+ }
29
+ appendFileSync(file, `${type} ${extra}\n`, "utf8");
30
+ }
31
+ catch {
32
+ // best effort
33
+ }
34
+ }
35
+ const API_URL = "https://api.anthropic.com/v1/messages";
36
+ const VERSION = "2023-06-01";
37
+ const ANTHROPIC_RASTER_MIME = /^image\/(?:png|jpeg|webp|gif)$/i;
38
+ function looksLikeSvgBase64(data) {
39
+ try {
40
+ const head = Buffer.from(data.replace(/\s+/g, "").slice(0, 16384), "base64")
41
+ .toString("utf8").replace(/^\uFEFF/u, "").trimStart();
42
+ return /^(?:<\?xml\b[^>]*>\s*)?(?:<!--[^]*?-->\s*)?<svg\b/is.test(head);
43
+ }
44
+ catch {
45
+ return false;
46
+ }
47
+ }
48
+ // Il nome del file, non il percorso intero: in un messaggio d'errore
49
+ // "C:\Users\...\AppData\Local\Temp\shot-8891.png" e' rumore, "shot-8891.png" no.
50
+ function nomeLeggibile(source) {
51
+ const s = String(source ?? "").trim();
52
+ if (!s)
53
+ return undefined;
54
+ return s.split(/[\\/]/).pop() || undefined;
55
+ }
56
+ function anthropicImageBlock(image) {
57
+ if (!ANTHROPIC_RASTER_MIME.test(image.mime) || looksLikeSvgBase64(image.data)) {
58
+ return { type: "text", text: "[Allegato SVG/vettoriale disponibile come file; payload immagine non reinviato.]" };
59
+ }
60
+ // Un'immagine oltre gli 8000 px per lato fa fallire l'INTERO turno con un 400.
61
+ // Un allegato troppo grande non deve poter buttare giu' la conversazione:
62
+ // diventa una riga di testo che dice cosa e' successo, il resto del messaggio
63
+ // parte comunque, e il modello puo' rispondere a quello.
64
+ const verdetto = verificaImmagine(image.data, { nome: nomeLeggibile(image.source) });
65
+ if (!verdetto.ok)
66
+ return { type: "text", text: `[${verdetto.spiegazione}]` };
67
+ return {
68
+ type: "image",
69
+ source: { type: "base64", media_type: image.mime, data: image.data },
70
+ };
71
+ }
72
+ // Mappa i nostri messaggi nel formato dell'API Anthropic, poi NORMALIZZA
73
+ // l'accoppiamento tool_use/tool_result (vedi normalizeToolPairing).
74
+ export function toApiMessages(req) {
75
+ const mapped = req.messages
76
+ .filter((m) => m.role !== "system")
77
+ .map((m) => {
78
+ const content = m.content.map((part) => {
79
+ switch (part.type) {
80
+ case "text":
81
+ return { type: "text", text: part.text };
82
+ case "tool_call":
83
+ return { type: "tool_use", id: part.id, name: part.name, input: part.input };
84
+ case "tool_result":
85
+ return {
86
+ type: "tool_result",
87
+ tool_use_id: part.callId,
88
+ content: part.media?.length
89
+ ? [
90
+ { type: "text", text: part.output || "Risultato visivo del tool." },
91
+ ...part.media.map((image) => anthropicImageBlock(image)),
92
+ ]
93
+ : part.output,
94
+ is_error: part.isError,
95
+ };
96
+ case "image":
97
+ // Immagine allegata al prompt: blocco `image` con source base64
98
+ // inline (i bytes sono gia' stati riletti e codificati a monte,
99
+ // vedi src/core/prompt-attachment.ts).
100
+ return anthropicImageBlock(part);
101
+ }
102
+ });
103
+ // I tool_result devono viaggiare in un turno con ruolo "user".
104
+ const role = m.role === "tool" ? "user" : m.role;
105
+ return { role, content };
106
+ });
107
+ return normalizeToolPairing(mapped);
108
+ }
109
+ // L'API Anthropic richiede che ogni assistant `tool_use` sia seguito SUBITO da
110
+ // un messaggio user con un `tool_result` per ciascun id, e che non esistano
111
+ // `tool_result` orfani. Una sessione puo' violarlo se un turno e' interrotto
112
+ // (Ctrl+C durante un tool, comando lento, crash). Qui sintetizziamo i
113
+ // tool_result mancanti e scartiamo quelli orfani, evitando il 400.
114
+ export function normalizeToolPairing(messages) {
115
+ const out = [];
116
+ for (let i = 0; i < messages.length; i += 1) {
117
+ const m = messages[i];
118
+ if (!m)
119
+ continue;
120
+ if (m.role === "assistant") {
121
+ const toolUseIds = m.content.filter((c) => c.type === "tool_use").map((c) => String(c.id));
122
+ out.push(m);
123
+ if (toolUseIds.length) {
124
+ const next = messages[i + 1];
125
+ const provided = new Set();
126
+ if (next && next.role === "user") {
127
+ for (const c of next.content) {
128
+ if (c.type === "tool_result")
129
+ provided.add(String(c.tool_use_id));
130
+ }
131
+ }
132
+ const missing = toolUseIds.filter((id) => !provided.has(id));
133
+ if (missing.length) {
134
+ const synth = missing.map((id) => ({
135
+ type: "tool_result",
136
+ tool_use_id: id,
137
+ content: "(nessun risultato: esecuzione interrotta)",
138
+ is_error: true,
139
+ }));
140
+ if (next && next.role === "user" && next.content.some((c) => c.type === "tool_result")) {
141
+ next.content = [...synth, ...next.content];
142
+ }
143
+ else {
144
+ out.push({ role: "user", content: synth });
145
+ }
146
+ }
147
+ }
148
+ continue;
149
+ }
150
+ // Messaggio user: scarta i tool_result orfani (id non aperto dall'assistant
151
+ // immediatamente precedente).
152
+ if (m.role === "user" && m.content.some((c) => c.type === "tool_result")) {
153
+ const prev = out[out.length - 1];
154
+ const openIds = new Set(prev && prev.role === "assistant"
155
+ ? prev.content.filter((c) => c.type === "tool_use").map((c) => String(c.id))
156
+ : []);
157
+ const filtered = m.content.filter((c) => c.type !== "tool_result" || openIds.has(String(c.tool_use_id)));
158
+ if (filtered.length)
159
+ out.push({ role: "user", content: filtered });
160
+ continue;
161
+ }
162
+ out.push(m);
163
+ }
164
+ return out;
165
+ }
166
+ // Applica i breakpoint di cache (prompt caching Anthropic): marca l'ultimo
167
+ // blocco di system e l'ultimo blocco dell'ultimo messaggio con cache_control
168
+ // ephemeral. Riduce i token fatturati sui turni successivi.
169
+ export function withSystemCache(system, turnContext = "") {
170
+ return [
171
+ { type: "text", text: system, cache_control: { type: "ephemeral" } },
172
+ ...(turnContext ? [{
173
+ type: "text",
174
+ text: `[HORIZON_TURN_CONTEXT]\n${turnContext}\n[/HORIZON_TURN_CONTEXT]`,
175
+ }] : []),
176
+ ];
177
+ }
178
+ // DUE breakpoint sui messaggi, non uno. L'ultimo messaggio porta il contesto
179
+ // del turno e cambia sempre: da solo cacherebbe un prefisso che al messaggio
180
+ // successivo non esiste piu'. Marcando anche il PENULTIMO, il prefisso che
181
+ // finisce col turno precedente resta cacheato e viene riconosciuto al turno
182
+ // dopo. Insieme al breakpoint su system restano 3 marcatori, sotto il tetto di
183
+ // 4 dell'API.
184
+ export function applyMessageCache(messages) {
185
+ markCacheBreakpoint(messages[messages.length - 1]);
186
+ if (messages.length > 1)
187
+ markCacheBreakpoint(messages[messages.length - 2]);
188
+ return messages;
189
+ }
190
+ function markCacheBreakpoint(message) {
191
+ const target = message;
192
+ if (!target || !Array.isArray(target.content) || !target.content.length)
193
+ return;
194
+ const blocks = target.content;
195
+ const lastBlock = blocks[blocks.length - 1];
196
+ if (lastBlock)
197
+ lastBlock["cache_control"] = { type: "ephemeral" };
198
+ }
199
+ import { anthropicEffort } from "./effort.js";
200
+ import { resolveMaxTokens } from "../core/model-limits.js";
201
+ import { ANTHROPIC_MODELS } from "./catalog.js";
202
+ // Beta della finestra di contesto 1M (Opus/Sonnet 4.x). Va inviata come header
203
+ // per attivare davvero il milione di token, altrimenti l'API resta a 200k.
204
+ export const CONTEXT_1M_BETA = "context-1m-2025-08-07";
205
+ // 1M attivo se: il modello lo dichiara nell'id ("1m"), o TALOS_CONTEXT_1M e'
206
+ // truthy, o TALOS_CONTEXT_WINDOW >= 1_000_000.
207
+ export function wants1m(model, env) {
208
+ const flag = (env["TALOS_CONTEXT_1M"] ?? "").trim().toLowerCase();
209
+ // Escape hatch: TALOS_CONTEXT_1M=off|0|false disattiva la beta 1M (se
210
+ // l'endpoint non la accetta).
211
+ if (flag === "0" || flag === "false" || flag === "off" || flag === "no")
212
+ return false;
213
+ const m = model.toLowerCase();
214
+ if (m.includes("1m"))
215
+ return true;
216
+ if (/^(1|true|yes|on)$/.test(flag))
217
+ return true;
218
+ const w = Number(env["TALOS_CONTEXT_WINDOW"]);
219
+ if (Number.isFinite(w) && w >= 1_000_000)
220
+ return true;
221
+ // Opus 4.x / Sonnet 4.x: 1M attivo di default (come Claude Code).
222
+ return /opus-4|sonnet-4/.test(m);
223
+ }
224
+ export class AnthropicProvider {
225
+ apiKey;
226
+ id = "anthropic";
227
+ label = "Anthropic";
228
+ models = ANTHROPIC_MODELS;
229
+ constructor(apiKey) {
230
+ this.apiKey = apiKey;
231
+ }
232
+ async complete(req) {
233
+ const body = {
234
+ model: req.model,
235
+ max_tokens: resolveMaxTokens(req.maxTokens, `anthropic/${req.model}`),
236
+ system: withSystemCache(req.system, req.turnContext),
237
+ messages: applyMessageCache(toApiMessages(req)),
238
+ stream: true,
239
+ tools: req.tools.map((t) => ({
240
+ name: t.name,
241
+ description: t.description,
242
+ input_schema: t.inputSchema,
243
+ })),
244
+ };
245
+ const effort = anthropicEffort(req.effort, req.model);
246
+ if (effort)
247
+ Object.assign(body, effort);
248
+ const headers = {
249
+ "content-type": "application/json",
250
+ "x-api-key": this.apiKey,
251
+ "anthropic-version": VERSION,
252
+ };
253
+ if (wants1m(req.model, process.env))
254
+ headers["anthropic-beta"] = CONTEXT_1M_BETA;
255
+ const res = await fetch(API_URL, {
256
+ method: "POST",
257
+ signal: req.signal,
258
+ headers,
259
+ body: JSON.stringify(body),
260
+ });
261
+ const limits = planLimitsFromHeaders(this.id, res.headers);
262
+ if (!res.ok || !res.body) {
263
+ const detail = await res.text().catch(() => res.statusText);
264
+ return {
265
+ text: messaggioErroreTurno("provider Anthropic", res.status, detail),
266
+ toolCalls: [],
267
+ stopReason: "error",
268
+ ...(limits ? { limits } : {}),
269
+ };
270
+ }
271
+ const turn = await parseStream(res.body, req.onDelta, req.onActivity, req.onReasoning, req.onToolDelta);
272
+ return limits ? { ...turn, limits } : turn;
273
+ }
274
+ }
275
+ // Parsing dello stream SSE. Accumula testo e tool_use a blocchi.
276
+ export async function parseStream(body, onDelta, onActivity, onReasoning, onToolDelta) {
277
+ const reader = body.getReader();
278
+ const decoder = new TextDecoder();
279
+ let buffer = "";
280
+ let text = "";
281
+ let stopReason;
282
+ let sawTerminal = false;
283
+ let streamError;
284
+ let readError;
285
+ let usage;
286
+ // Blocchi tool_use in costruzione, indicizzati per content-block index.
287
+ const partial = new Map();
288
+ const toolCalls = [];
289
+ // Soglia di byte gia' segnalata per ogni tool, per non spammare onActivity.
290
+ const announced = new Map();
291
+ const processLine = (line) => {
292
+ if (streamError || !line.startsWith("data:"))
293
+ return;
294
+ const data = line.slice(5).trim();
295
+ if (!data || data === "[DONE]")
296
+ return;
297
+ let evt;
298
+ try {
299
+ evt = JSON.parse(data);
300
+ }
301
+ catch {
302
+ streamError = "Risposta Anthropic non valida: evento SSE JSON illeggibile.";
303
+ return;
304
+ }
305
+ debugStreamEvent(evt);
306
+ const providerError = readProviderError(evt);
307
+ if (providerError) {
308
+ streamError = providerError;
309
+ stopReason = "error";
310
+ sawTerminal = true;
311
+ return;
312
+ }
313
+ handleEvent(evt, partial, toolCalls, (t) => {
314
+ text += t;
315
+ onDelta?.(t);
316
+ }, onActivity, announced, onReasoning, onToolDelta);
317
+ const sr = readStopReason(evt);
318
+ if (sr) {
319
+ stopReason = sr;
320
+ sawTerminal = true;
321
+ }
322
+ else if (hasUnknownStopReason(evt)) {
323
+ const delta = evt["delta"];
324
+ streamError = `Risposta Anthropic terminata con stop_reason non supportato: ${String(delta["stop_reason"])}.`;
325
+ stopReason = "error";
326
+ sawTerminal = true;
327
+ }
328
+ else if (evt["type"] === "message_stop") {
329
+ // `message_stop` e' il terminale semantico dello stream Anthropic. In
330
+ // assenza del precedente message_delta, il solo esito sicuro e' end.
331
+ stopReason ??= "end";
332
+ sawTerminal = true;
333
+ }
334
+ const u = readUsage(evt);
335
+ if (u)
336
+ usage = u;
337
+ };
338
+ try {
339
+ for (;;) {
340
+ const { done, value } = await reader.read();
341
+ if (done)
342
+ break;
343
+ buffer += decoder.decode(value, { stream: true });
344
+ const lines = buffer.split("\n");
345
+ buffer = lines.pop() ?? "";
346
+ for (const line of lines)
347
+ processLine(line);
348
+ }
349
+ }
350
+ catch (err) {
351
+ readError = err;
352
+ }
353
+ // TextDecoder puo' trattenere byte multibyte e l'ultimo evento SSE puo'
354
+ // arrivare senza newline: entrambi vanno processati prima di valutare l'EOF.
355
+ buffer += decoder.decode();
356
+ if (buffer)
357
+ for (const line of buffer.split("\n"))
358
+ processLine(line);
359
+ if (streamError) {
360
+ return { text: streamError, toolCalls: [], stopReason: "error", usage };
361
+ }
362
+ if (!sawTerminal) {
363
+ return prematureStreamTurn("Anthropic", text, readError, usage);
364
+ }
365
+ for (const p of partial.values()) {
366
+ // Preferisci il JSON streammato; se manca o e' troncato, ripiega sul seed
367
+ // (input inline ricevuto in content_block_start).
368
+ let input = {};
369
+ const tryParse = (raw) => {
370
+ if (!raw)
371
+ return null;
372
+ try {
373
+ return JSON.parse(raw);
374
+ }
375
+ catch {
376
+ return null;
377
+ }
378
+ };
379
+ const parsed = tryParse(p.json) ?? tryParse(p.seedJson ?? "");
380
+ input = parsed ?? {};
381
+ // JSON arrivato ma illeggibile = troncato a meta'. Un tool call senza
382
+ // argomenti (`{}` legittimo) non ha JSON da parsare, quindi i due casi
383
+ // restano distinti.
384
+ const rawChars = (p.json || p.seedJson || "").length;
385
+ toolCalls.push({
386
+ type: "tool_call",
387
+ id: p.id,
388
+ name: p.name,
389
+ input,
390
+ ...(parsed === null && rawChars > 0 ? { inputTruncatedChars: rawChars } : {}),
391
+ });
392
+ }
393
+ // Non mascherare il troncamento: se l'output e' stato tagliato (max_tokens),
394
+ // mantienilo (un tool input grande puo' arrivare spezzato). Altrimenti, con
395
+ // tool presenti, lo stato e' tool_use.
396
+ if (toolCalls.length > 0 && stopReason !== "max_tokens")
397
+ stopReason = "tool_use";
398
+ return { text, toolCalls, stopReason: stopReason ?? "end", usage };
399
+ }
400
+ function prematureStreamTurn(provider, streamedText, readError, usage) {
401
+ if (!streamedText) {
402
+ const detail = readError instanceof Error && readError.message ? ` (${readError.message})` : "";
403
+ return {
404
+ text: `Errore di rete: connection closed prima che ${provider} completasse la risposta${detail}.`,
405
+ toolCalls: [],
406
+ stopReason: "error",
407
+ usage,
408
+ };
409
+ }
410
+ return {
411
+ text: `Risposta ${provider} incompleta: EOF prematuro dopo ${streamedText.length} caratteri; nessuna tool call e' stata eseguita.`,
412
+ toolCalls: [],
413
+ stopReason: "error",
414
+ usage,
415
+ };
416
+ }
417
+ function handleEvent(evt, partial, _toolCalls, pushText, onActivity, announced, onReasoning, onToolDelta) {
418
+ const type = evt["type"];
419
+ if (type === "content_block_start") {
420
+ const block = evt["content_block"];
421
+ const index = evt["index"];
422
+ if (block?.["type"] === "tool_use") {
423
+ // Alcuni endpoint (incluso l'OAuth dell'abbonamento) consegnano l'input
424
+ // del tool GIA' COMPLETO qui in content_block.input, senza poi inviare
425
+ // input_json_delta. Lo usiamo come seed: se poi arrivano delta, vengono
426
+ // accodati (e se il seed era completo, i delta sostituiscono via parse).
427
+ const seed = block["input"];
428
+ const seedJson = seed && typeof seed === "object" && Object.keys(seed).length
429
+ ? JSON.stringify(seed)
430
+ : "";
431
+ partial.set(index, {
432
+ id: String(block["id"]),
433
+ name: String(block["name"]),
434
+ json: "",
435
+ seedJson,
436
+ });
437
+ onToolDelta?.({ id: String(block["id"]), name: String(block["name"]), index, delta: "" });
438
+ onActivity?.(`preparo ${String(block["name"])}`);
439
+ }
440
+ else if (block?.["type"] === "thinking") {
441
+ // Pensiero esteso: non e' testo, ma il run e' vivo. Segnalalo.
442
+ onActivity?.("ragiono…");
443
+ // Alcuni endpoint consegnano il pensiero gia' completo qui invece che a
444
+ // delta: senza questo, quel ragionamento non lo vedrebbe nessuno.
445
+ const seme = block["thinking"];
446
+ if (typeof seme === "string" && seme)
447
+ onReasoning?.(seme);
448
+ }
449
+ }
450
+ else if (type === "content_block_delta") {
451
+ const delta = evt["delta"];
452
+ const index = evt["index"];
453
+ if (delta?.["type"] === "text_delta") {
454
+ pushText(String(delta["text"]));
455
+ }
456
+ else if (delta?.["type"] === "thinking_delta") {
457
+ onActivity?.("ragiono…");
458
+ // Il contenuto del pensiero, non solo il fatto che stia pensando: prima
459
+ // arrivava fin qui e veniva buttato via.
460
+ const pezzo = delta["thinking"];
461
+ if (typeof pezzo === "string" && pezzo)
462
+ onReasoning?.(pezzo);
463
+ }
464
+ else if (delta?.["type"] === "input_json_delta") {
465
+ const cur = partial.get(index);
466
+ if (cur) {
467
+ const piece = String(delta["partial_json"]);
468
+ cur.json += piece;
469
+ onToolDelta?.({ id: cur.id, name: cur.name, index, delta: piece });
470
+ // Segnala il progresso ogni ~2 KB: input grandi (es. write_file di un
471
+ // file lungo) non sembrano piu' "bloccati".
472
+ if (onActivity && announced) {
473
+ const kb = Math.floor(cur.json.length / 2048);
474
+ if (kb > (announced.get(index) ?? 0)) {
475
+ announced.set(index, kb);
476
+ onActivity(`scrivo ${cur.name} · ${Math.round(cur.json.length / 1024)} KB`);
477
+ }
478
+ }
479
+ }
480
+ }
481
+ }
482
+ }
483
+ function readStopReason(evt) {
484
+ if (evt["type"] !== "message_delta")
485
+ return null;
486
+ const delta = evt["delta"];
487
+ const reason = delta?.["stop_reason"];
488
+ if (reason === "tool_use")
489
+ return "tool_use";
490
+ if (reason === "max_tokens")
491
+ return "max_tokens";
492
+ if (reason === "end_turn" || reason === "stop_sequence")
493
+ return "end";
494
+ return null;
495
+ }
496
+ function hasUnknownStopReason(evt) {
497
+ if (evt["type"] !== "message_delta")
498
+ return false;
499
+ const delta = evt["delta"];
500
+ return delta?.["stop_reason"] !== undefined
501
+ && delta["stop_reason"] !== null
502
+ && readStopReason(evt) === null;
503
+ }
504
+ function readProviderError(evt) {
505
+ const raw = evt["error"];
506
+ if (evt["type"] !== "error" && raw === undefined)
507
+ return null;
508
+ if (typeof raw === "string")
509
+ return `Errore provider Anthropic: ${raw}`;
510
+ const kind = String(raw?.["type"] ?? raw?.["code"] ?? "stream_error");
511
+ const message = String(raw?.["message"] ?? evt["message"] ?? "errore streaming senza dettagli");
512
+ return `Errore provider Anthropic (${kind}): ${message}${errorTimingDetail(raw)}${errorTimingDetail(evt)}`;
513
+ }
514
+ function readUsage(evt) {
515
+ const usage = evt["usage"];
516
+ if (!usage)
517
+ return undefined;
518
+ const cacheRead = usage["cache_read_input_tokens"];
519
+ const cacheWrite = usage["cache_creation_input_tokens"];
520
+ return {
521
+ inputTokens: Number(usage["input_tokens"] ?? 0),
522
+ outputTokens: Number(usage["output_tokens"] ?? 0),
523
+ ...(cacheRead !== undefined ? { cacheReadTokens: Number(cacheRead) } : {}),
524
+ ...(cacheWrite !== undefined ? { cacheWriteTokens: Number(cacheWrite) } : {}),
525
+ };
526
+ }
@@ -0,0 +1,15 @@
1
+ export interface ProviderSpec {
2
+ readonly id: string;
3
+ readonly label: string;
4
+ readonly kind: "anthropic" | "openai";
5
+ readonly envKey: string;
6
+ readonly baseUrl?: string;
7
+ readonly baseUrlEnv?: string;
8
+ readonly defaultBaseUrl?: string;
9
+ readonly optionalEndpoint?: boolean;
10
+ readonly models: readonly string[];
11
+ }
12
+ export declare const ANTHROPIC_MODELS: readonly ["claude-fable-5-1", "claude-fable-5", "claude-opus-5", "claude-sonnet-5", "claude-haiku-4-5-20251001", "claude-opus-4-8", "claude-sonnet-4-6"];
13
+ export declare const OPENAI_MODELS: readonly ["gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "gpt-4o", "gpt-4o-mini", "o3", "o4-mini"];
14
+ export declare const CHATGPT_MODELS: readonly ["gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "gpt-6-astra", "gpt-5-codex", "gpt-5", "gpt-5-mini", "o4-mini"];
15
+ export declare const PROVIDER_CATALOG: readonly ProviderSpec[];