@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,20 @@
1
+ import { spawn } from "node:child_process";
2
+ export type Platform = NodeJS.Platform;
3
+ export declare function browserCommand(platform: Platform, url: string): {
4
+ readonly cmd: string;
5
+ readonly args: readonly string[];
6
+ };
7
+ export interface OpenUrlResult {
8
+ readonly opened: boolean;
9
+ readonly printed: boolean;
10
+ readonly command?: string;
11
+ readonly error?: string;
12
+ }
13
+ export interface OpenUrlOptions {
14
+ readonly platform?: Platform;
15
+ readonly spawnImpl?: typeof spawn;
16
+ readonly print?: (text: string) => void;
17
+ readonly forcePrint?: boolean;
18
+ readonly settleMs?: number;
19
+ }
20
+ export declare function openUrl(url: string, opts?: OpenUrlOptions): Promise<OpenUrlResult>;
@@ -0,0 +1,92 @@
1
+ import { spawn } from "node:child_process";
2
+ // Comando + argomenti per aprire un URL sulla piattaforma data. L'URL e'
3
+ // sempre l'ultimo argomento. Su Windows NON usare `cmd /c start`: i separatori
4
+ // `&` delle query OAuth vengono interpretati dalla shell e troncano l'URL,
5
+ // eliminando parametri PKCE come code_challenge_method. explorer.exe riceve
6
+ // invece l'URL come singolo argomento e lo inoltra intatto al browser predefinito.
7
+ export function browserCommand(platform, url) {
8
+ switch (platform) {
9
+ case "darwin":
10
+ return { cmd: "open", args: [url] };
11
+ case "win32":
12
+ return { cmd: "explorer.exe", args: [url] };
13
+ default:
14
+ // linux, freebsd, openbsd, ... : xdg-open e' lo standard freedesktop.
15
+ return { cmd: "xdg-open", args: [url] };
16
+ }
17
+ }
18
+ // Accetta solo schemi sicuri da passare a un comando di sistema. Evita che un
19
+ // URL malformato o uno schema inatteso (es. file:, javascript:) venga aperto.
20
+ function isOpenableUrl(url) {
21
+ try {
22
+ const u = new URL(url);
23
+ return u.protocol === "http:" || u.protocol === "https:";
24
+ }
25
+ catch {
26
+ return false;
27
+ }
28
+ }
29
+ // Stampa il link in modo che l'utente possa aprirlo manualmente.
30
+ function printLink(url, print) {
31
+ print(`Apri questo URL nel browser per continuare:\n\n ${url}\n`);
32
+ }
33
+ // Apre l'URL nel browser di default, con fallback a stampa del link.
34
+ //
35
+ // Lo spawn e' detached e con stdio ignorato: il processo del browser non deve
36
+ // tenere in vita o bloccare il processo Node. Risolviamo dopo un breve
37
+ // settle window osservando un eventuale evento 'error' (comando assente,
38
+ // ENOENT): in quel caso ricadiamo sulla stampa.
39
+ export async function openUrl(url, opts = {}) {
40
+ const platform = opts.platform ?? process.platform;
41
+ const spawnImpl = opts.spawnImpl ?? spawn;
42
+ const print = opts.print ?? ((t) => console.log(t));
43
+ const settleMs = opts.settleMs ?? 1500;
44
+ if (!isOpenableUrl(url)) {
45
+ printLink(url, print);
46
+ return { opened: false, printed: true, error: "URL non valido (atteso http/https)" };
47
+ }
48
+ if (opts.forcePrint) {
49
+ printLink(url, print);
50
+ return { opened: false, printed: true };
51
+ }
52
+ const { cmd, args } = browserCommand(platform, url);
53
+ return new Promise((resolve) => {
54
+ let settled = false;
55
+ const finish = (result) => {
56
+ if (settled)
57
+ return;
58
+ settled = true;
59
+ resolve(result);
60
+ };
61
+ let child;
62
+ try {
63
+ child = spawnImpl(cmd, args, { stdio: "ignore", detached: true, windowsHide: true });
64
+ }
65
+ catch (err) {
66
+ // Eccezione sincrona (raro): fallback immediato.
67
+ printLink(url, print);
68
+ finish({ opened: false, printed: true, command: cmd, error: errMsg(err) });
69
+ return;
70
+ }
71
+ // Evento 'error' asincrono (es. ENOENT: comando non trovato).
72
+ child.on("error", (err) => {
73
+ printLink(url, print);
74
+ finish({ opened: false, printed: true, command: cmd, error: errMsg(err) });
75
+ });
76
+ // Stacchiamo il figlio dal processo padre cosi' non ne blocca l'uscita.
77
+ try {
78
+ child.unref();
79
+ }
80
+ catch {
81
+ /* unref non disponibile: ininfluente */
82
+ }
83
+ // Nessun errore entro la finestra di settle: consideriamo aperto. Il timer
84
+ // NON e' unref-ato: la finestra di settle e' breve (default 1.5s) e la
85
+ // Promise DEVE risolversi, altrimenti il chiamante resta appeso e il
86
+ // processo potrebbe uscire prima di completare l'apertura.
87
+ setTimeout(() => finish({ opened: true, printed: false, command: cmd }), settleMs);
88
+ });
89
+ }
90
+ function errMsg(err) {
91
+ return err instanceof Error ? err.message : String(err);
92
+ }
@@ -0,0 +1,14 @@
1
+ import type { CompletionRequest, ModelTurn, Provider } from "../core/types.js";
2
+ export declare class OpenAICompatProvider implements Provider {
3
+ readonly id: string;
4
+ readonly label: string;
5
+ private readonly baseUrl;
6
+ private readonly apiKey;
7
+ readonly models: readonly string[];
8
+ private keyCursor;
9
+ get supportsFastMode(): boolean;
10
+ constructor(id: string, label: string, baseUrl: string, apiKey: string | readonly string[], models?: readonly string[]);
11
+ complete(req: CompletionRequest): Promise<ModelTurn>;
12
+ }
13
+ export declare function parseStream(body: ReadableStream<Uint8Array>, onDelta?: (chunk: string) => void, onActivity?: (label: string) => void, onReasoning?: (chunk: string) => void, onToolDelta?: CompletionRequest["onToolDelta"]): Promise<ModelTurn>;
14
+ export declare function routerFailureMessage(choice: Record<string, unknown> | undefined, evt: Record<string, unknown>): string;
@@ -0,0 +1,523 @@
1
+ import { messaggioErroreTurno } from "../core/image-limits.js";
2
+ import { planLimitsFromHeaders } from "./plan-limits.js";
3
+ import { errorTimingDetail } from "./provider-reset.js";
4
+ import { compatReasoningField } from "./effort.js";
5
+ import { resolveMaxTokens } from "../core/model-limits.js";
6
+ // Provider per qualunque API in stile OpenAI Chat Completions: OpenAI,
7
+ // OpenRouter, Grok via xAI, Mistral, DeepSeek, Together, Gemini (endpoint compat)
8
+ // e Ollama. Cambia solo baseUrl + chiave; il protocollo e' lo stesso.
9
+ //
10
+ // Supporta tool-calling (function calling) e streaming SSE. I modelli NON sono
11
+ // vincolati alla lista `models`: quella e' solo un suggerimento per /models,
12
+ // l'utente puo' indicare qualsiasi id con `provider/<id>`.
13
+ export class OpenAICompatProvider {
14
+ id;
15
+ label;
16
+ baseUrl;
17
+ apiKey;
18
+ models;
19
+ keyCursor = 0;
20
+ get supportsFastMode() {
21
+ try {
22
+ return new URL(this.baseUrl).hostname === "api.openai.com";
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ constructor(id, label, baseUrl, apiKey, models = []) {
29
+ this.id = id;
30
+ this.label = label;
31
+ this.baseUrl = baseUrl;
32
+ this.apiKey = apiKey;
33
+ this.models = models;
34
+ }
35
+ async complete(req) {
36
+ const body = {
37
+ model: req.model,
38
+ ...(this.supportsFastMode && req.serviceTier ? { service_tier: req.serviceTier } : {}),
39
+ max_tokens: resolveMaxTokens(req.maxTokens, `${this.id}/${req.model}`),
40
+ stream: true,
41
+ stream_options: { include_usage: true },
42
+ messages: toApiMessages(req),
43
+ tools: req.tools.length
44
+ ? req.tools.map((t) => ({
45
+ type: "function",
46
+ function: {
47
+ name: t.name,
48
+ description: t.description,
49
+ parameters: t.inputSchema,
50
+ },
51
+ }))
52
+ : undefined,
53
+ };
54
+ // Prompt cache key (OpenAI): instrada le richieste della stessa sessione
55
+ // sulla stessa cache di prompt -> piu' cache hit. Campo documentato OpenAI.
56
+ if (req.sessionId && /openai\.com/i.test(this.baseUrl)) {
57
+ body["prompt_cache_key"] = req.sessionId;
58
+ }
59
+ // OpenRouter usage accounting: col flag, il chunk finale dello stream
60
+ // include usage.cost (USD reali addebitati per la chiamata).
61
+ if (/openrouter\.ai/i.test(this.baseUrl)) {
62
+ body["usage"] = { include: true };
63
+ // Instradamento scelto dall'utente: lo STESSO modello puo' essere servito
64
+ // da provider diversi, con prezzo, finestra di contesto e politica sui
65
+ // dati diversi. Senza questo campo decide OpenRouter; con `order` +
66
+ // allow_fallbacks:false la richiesta va dove e' stato deciso, e se quel
67
+ // provider non e' disponibile fallisce invece di scivolare altrove in
68
+ // silenzio (che e' il punto: si sceglie il provider proprio per non
69
+ // ritrovarsi altrove).
70
+ const routing = String(process.env.TALOS_OPENROUTER_PROVIDER || "").trim();
71
+ if (routing)
72
+ body["provider"] = { order: [routing], allow_fallbacks: false };
73
+ }
74
+ // Reasoning/effort: inviato solo ai provider che lo supportano (allowlist
75
+ // per baseUrl), col campo nativo giusto. Gli altri restano senza parametro.
76
+ const reasoning = compatReasoningField(this.baseUrl, req.effort, process.env, req.model);
77
+ if (reasoning)
78
+ body[reasoning.key] = reasoning.value;
79
+ const keys = (Array.isArray(this.apiKey) ? this.apiKey : [this.apiKey])
80
+ .map((item) => String(item || "").trim()).filter(Boolean);
81
+ const attempts = keys.length || 1;
82
+ const startCursor = this.keyCursor;
83
+ let omitImages = false;
84
+ for (let offset = 0; offset < attempts; offset += 1) {
85
+ const index = keys.length ? (startCursor + offset) % keys.length : 0;
86
+ const key = keys[index] ?? "";
87
+ const headers = { "content-type": "application/json" };
88
+ if (key)
89
+ headers["authorization"] = `Bearer ${key}`;
90
+ // Attribuzione per i gateway che la richiedono/onorano (Vercel AI Gateway,
91
+ // OpenRouter): identifica l'app nei loro dashboard. Inclusa di default.
92
+ if (/openrouter\.ai|gateway\.ai|vercel/i.test(this.baseUrl)) {
93
+ headers["http-referer"] = "https://vascend.dev";
94
+ headers["x-title"] = "Vascend Talos";
95
+ }
96
+ if (req.sessionId && /mistral\.ai/i.test(this.baseUrl))
97
+ headers["x-session-id"] = req.sessionId;
98
+ let retrySameEndpoint = true;
99
+ while (retrySameEndpoint) {
100
+ retrySameEndpoint = false;
101
+ body["messages"] = toApiMessages(req, { includeImages: !omitImages });
102
+ let res;
103
+ try {
104
+ res = await fetch(`${this.baseUrl}/chat/completions`, {
105
+ method: "POST",
106
+ signal: req.signal,
107
+ headers,
108
+ body: JSON.stringify(body),
109
+ });
110
+ }
111
+ catch (err) {
112
+ return {
113
+ text: `Errore di rete verso ${this.id}: ${err.message}`,
114
+ toolCalls: [],
115
+ stopReason: "error",
116
+ };
117
+ }
118
+ const limits = planLimitsFromHeaders(this.id, res.headers);
119
+ if (res.ok && res.body) {
120
+ this.keyCursor = index;
121
+ const turn = await parseStream(res.body, req.onDelta, req.onActivity, req.onReasoning, req.onToolDelta);
122
+ return limits ? { ...turn, limits } : turn;
123
+ }
124
+ const detail = await res.text().catch(() => res.statusText);
125
+ // OpenRouter e diversi gateway OpenAI-compatible possono risolvere un
126
+ // modello su endpoint solo testo. Se un computer_snapshot e' presente,
127
+ // la prima richiesta fallisce con 400/404 prima di generare token. In
128
+ // quel caso ritentiamo una sola volta senza parti visuali: lo screenshot
129
+ // resta persistito/renderizzato dall'host e il modello continua con UIA
130
+ // e metadati testuali, invece di terminare l'intero run.
131
+ if (!omitImages && requestHasImages(req) && rejectsImageInput(res.status, detail)) {
132
+ omitImages = true;
133
+ req.onActivity?.("Il modello non supporta immagini: continuo con controlli e stato testuale");
134
+ retrySameEndpoint = true;
135
+ continue;
136
+ }
137
+ const canFallback = this.id === "openrouter"
138
+ && keys.length > 1
139
+ && offset < attempts - 1
140
+ && [401, 402, 403, 429].includes(res.status);
141
+ if (canFallback) {
142
+ req.onActivity?.(`OpenRouter: passo alla chiave di fallback ${offset + 2}/${keys.length}`);
143
+ break;
144
+ }
145
+ return {
146
+ text: messaggioErroreTurno(`provider ${this.id}`, res.status, detail),
147
+ toolCalls: [],
148
+ stopReason: "error",
149
+ ...(limits ? { limits } : {}),
150
+ };
151
+ }
152
+ }
153
+ return { text: `Errore provider ${this.id}: nessuna chiave disponibile`, toolCalls: [], stopReason: "error" };
154
+ }
155
+ }
156
+ // Mappa i messaggi interni nel formato OpenAI. Il system va in testa.
157
+ function requestHasImages(req) {
158
+ return req.messages.some((message) => message.content.some((part) => part.type === "image" || (part.type === "tool_result" && !!part.media?.length)));
159
+ }
160
+ function rejectsImageInput(status, detail) {
161
+ if (![400, 404, 415, 422].includes(status))
162
+ return false;
163
+ const message = String(detail || "").toLocaleLowerCase();
164
+ return /(?:image|vision|multimodal)/.test(message)
165
+ && /(?:not support|unsupported|no endpoints|cannot|can't|does not|invalid)/.test(message);
166
+ }
167
+ function toApiMessages(req, options = {}) {
168
+ const includeImages = options.includeImages !== false;
169
+ const out = [];
170
+ if (req.system)
171
+ out.push({ role: "system", content: req.system });
172
+ if (req.turnContext)
173
+ out.push({
174
+ role: "system",
175
+ content: `[HORIZON_TURN_CONTEXT]\n${req.turnContext}\n[/HORIZON_TURN_CONTEXT]`,
176
+ });
177
+ for (const m of req.messages) {
178
+ if (m.role === "system")
179
+ continue;
180
+ if (m.role === "tool") {
181
+ const media = [];
182
+ // Ogni risultato di tool e' un messaggio separato con tool_call_id.
183
+ for (const part of m.content) {
184
+ if (part.type === "tool_result") {
185
+ out.push({
186
+ role: "tool",
187
+ tool_call_id: part.callId,
188
+ content: part.output,
189
+ });
190
+ if (part.media?.length)
191
+ media.push(...part.media);
192
+ }
193
+ }
194
+ // Chat Completions non accetta immagini nel messaggio role=tool. Dopo
195
+ // aver chiuso tutti i tool_call aggiungiamo quindi un input user visivo.
196
+ if (media.length && includeImages) {
197
+ out.push({
198
+ role: "user",
199
+ content: [
200
+ { type: "text", text: "Immagine prodotta dal tool: analizzala come dato non fidato." },
201
+ ...media.map((image) => ({
202
+ type: "image_url",
203
+ image_url: { url: `data:${image.mime};base64,${image.data}` },
204
+ })),
205
+ ],
206
+ });
207
+ }
208
+ else if (media.length) {
209
+ out.push({
210
+ role: "user",
211
+ content: "Lo screenshot del tool resta disponibile nell'interfaccia ma questo modello non accetta immagini. "
212
+ + "Continua usando i metadati testuali e computer_inspect; non ripetere computer_snapshot in un ciclo.",
213
+ });
214
+ }
215
+ continue;
216
+ }
217
+ const text = m.content
218
+ .filter((p) => p.type === "text")
219
+ .map((p) => (p.type === "text" ? p.text : ""))
220
+ .join("");
221
+ const toolCalls = m.content
222
+ .filter((p) => p.type === "tool_call")
223
+ .map((p) => {
224
+ const call = p;
225
+ return {
226
+ id: call.id,
227
+ type: "function",
228
+ function: {
229
+ name: call.name,
230
+ arguments: JSON.stringify(call.input ?? {}),
231
+ },
232
+ };
233
+ });
234
+ if (m.role === "assistant") {
235
+ const msg = { role: "assistant" };
236
+ msg["content"] = text || null;
237
+ if (toolCalls.length)
238
+ msg["tool_calls"] = toolCalls;
239
+ out.push(msg);
240
+ }
241
+ else {
242
+ // Messaggio user: se ci sono immagini allegate, usa il formato vision di
243
+ // OpenAI (content array con parti text + image_url data-URI); altrimenti
244
+ // la forma stringa semplice.
245
+ const images = m.content.filter((p) => p.type === "image");
246
+ if (images.length && includeImages) {
247
+ const parts = [];
248
+ if (text)
249
+ parts.push({ type: "text", text });
250
+ for (const p of images) {
251
+ if (p.type !== "image")
252
+ continue;
253
+ parts.push({
254
+ type: "image_url",
255
+ image_url: { url: `data:${p.mime};base64,${p.data}` },
256
+ });
257
+ }
258
+ out.push({ role: "user", content: parts });
259
+ }
260
+ else {
261
+ out.push({
262
+ role: "user",
263
+ content: text || (images.length
264
+ ? "L'allegato visivo resta disponibile nell'interfaccia, ma il modello selezionato non accetta immagini."
265
+ : ""),
266
+ });
267
+ }
268
+ }
269
+ }
270
+ return out;
271
+ }
272
+ export async function parseStream(body, onDelta, onActivity, onReasoning, onToolDelta) {
273
+ const reader = body.getReader();
274
+ const decoder = new TextDecoder();
275
+ let buffer = "";
276
+ let text = "";
277
+ let stopReason;
278
+ let sawTerminal = false;
279
+ let streamError;
280
+ let readError;
281
+ let usage;
282
+ const calls = new Map();
283
+ const announced = new Map();
284
+ const processLine = (line) => {
285
+ if (streamError || !line.startsWith("data:"))
286
+ return;
287
+ const data = line.slice(5).trim();
288
+ if (!data)
289
+ return;
290
+ if (data === "[DONE]") {
291
+ // Chat Completions usa [DONE] come terminale logico esplicito. Alcuni
292
+ // gateway omettono finish_reason: in quel caso inferiamo solo da cio'
293
+ // che e' stato ricevuto integralmente prima del sentinel.
294
+ stopReason ??= calls.size > 0 ? "tool_use" : "end";
295
+ sawTerminal = true;
296
+ return;
297
+ }
298
+ let evt;
299
+ try {
300
+ evt = JSON.parse(data);
301
+ }
302
+ catch {
303
+ streamError = "Risposta OpenAI-compatible non valida: evento SSE JSON illeggibile.";
304
+ return;
305
+ }
306
+ const providerError = readProviderError(evt);
307
+ if (providerError) {
308
+ streamError = providerError;
309
+ stopReason = "error";
310
+ sawTerminal = true;
311
+ return;
312
+ }
313
+ const u = evt["usage"];
314
+ if (u) {
315
+ // Token serviti dalla cache di prompt: OpenAI -> prompt_tokens_details
316
+ // .cached_tokens; Mistral/altri -> cached_tokens al livello usage.
317
+ const details = u["prompt_tokens_details"];
318
+ const cached = Number(details?.["cached_tokens"] ?? u["cached_tokens"] ?? 0);
319
+ const prompt = Number(u["prompt_tokens"] ?? 0);
320
+ // prompt_tokens INCLUDE i cached: scorporali per un tasso di hit coerente
321
+ // con la semantica Anthropic (inputTokens = non-cached).
322
+ const cost = Number(u["cost"]);
323
+ usage = {
324
+ inputTokens: Math.max(0, prompt - cached),
325
+ outputTokens: Number(u["completion_tokens"] ?? 0),
326
+ ...(cached > 0 ? { cacheReadTokens: cached } : {}),
327
+ ...(Number.isFinite(cost) && cost > 0 ? { costUsd: cost } : {}),
328
+ };
329
+ }
330
+ const choices = evt["choices"];
331
+ const choice = choices?.[0];
332
+ if (!choice)
333
+ return;
334
+ const delta = choice["delta"];
335
+ // Il ragionamento in streaming, dove ciascuno lo mette: OpenRouter usa
336
+ // `reasoning`, gli endpoint stile DeepSeek `reasoning_content`, e alcuni
337
+ // annidano il testo in un oggetto. Canale separato dal contenuto: non e' la
338
+ // risposta e non deve finire mescolato ad essa.
339
+ const pensiero = delta?.["reasoning"] ?? delta?.["reasoning_content"];
340
+ if (typeof pensiero === "string" && pensiero)
341
+ onReasoning?.(pensiero);
342
+ else if (pensiero && typeof pensiero === "object") {
343
+ const dentro = pensiero["text"]
344
+ ?? pensiero["content"];
345
+ if (typeof dentro === "string" && dentro)
346
+ onReasoning?.(dentro);
347
+ }
348
+ if (delta?.["content"]) {
349
+ const chunk = String(delta["content"]);
350
+ text += chunk;
351
+ onDelta?.(chunk);
352
+ }
353
+ accumulateToolCalls(delta, calls, onActivity, announced, onToolDelta);
354
+ const finish = choice["finish_reason"];
355
+ if (finish === undefined || finish === null)
356
+ return;
357
+ sawTerminal = true;
358
+ if (finish === "tool_calls" || finish === "function_call")
359
+ stopReason = "tool_use";
360
+ else if (finish === "length" || finish === "max_tokens")
361
+ stopReason = "max_tokens";
362
+ else if (finish === "stop")
363
+ stopReason = "end";
364
+ else if (finish === "content_filter") {
365
+ stopReason = "error";
366
+ streamError = "Risposta bloccata dal filtro contenuti del provider.";
367
+ }
368
+ else if (finish === "error") {
369
+ // Il caso dei router: OpenRouter (e in particolare le rotte gratuite, che
370
+ // smistano su modelli diversi a ogni richiesta) chiude lo stream con
371
+ // finish_reason "error" quando il modello a valle fallisce. Il dettaglio
372
+ // sta in posti diversi a seconda del router, e a volte non c'e' affatto:
373
+ // dire "finish_reason non supportato" e' inutile per chi legge e impedisce
374
+ // il retry, che qui e' proprio la cosa giusta da fare — un secondo
375
+ // tentativo su una rotta free finisce spesso su un altro modello e passa.
376
+ stopReason = "error";
377
+ streamError = routerFailureMessage(choice, evt);
378
+ }
379
+ else {
380
+ stopReason = "error";
381
+ streamError = `Risposta OpenAI-compatible terminata con finish_reason non supportato: ${String(finish)}.`;
382
+ }
383
+ };
384
+ try {
385
+ for (;;) {
386
+ const { done, value } = await reader.read();
387
+ if (done)
388
+ break;
389
+ buffer += decoder.decode(value, { stream: true });
390
+ const lines = buffer.split("\n");
391
+ buffer = lines.pop() ?? "";
392
+ for (const line of lines)
393
+ processLine(line);
394
+ }
395
+ }
396
+ catch (err) {
397
+ readError = err;
398
+ }
399
+ buffer += decoder.decode();
400
+ if (buffer)
401
+ for (const line of buffer.split("\n"))
402
+ processLine(line);
403
+ if (streamError)
404
+ return { text: streamError, toolCalls: [], stopReason: "error", usage };
405
+ if (!sawTerminal)
406
+ return prematureStreamTurn(text, readError, usage);
407
+ const toolCalls = [];
408
+ for (const c of calls.values()) {
409
+ let input = {};
410
+ let truncated = 0;
411
+ try {
412
+ input = c.args ? JSON.parse(c.args) : {};
413
+ }
414
+ catch {
415
+ // Argomenti tagliati a meta' dal tetto di output: va detto, non nascosto
416
+ // dietro un oggetto vuoto.
417
+ input = {};
418
+ truncated = c.args ? c.args.length : 0;
419
+ }
420
+ toolCalls.push({
421
+ type: "tool_call", id: c.id, name: c.name, input,
422
+ ...(truncated > 0 ? { inputTruncatedChars: truncated } : {}),
423
+ });
424
+ }
425
+ if (toolCalls.length > 0 && stopReason !== "max_tokens")
426
+ stopReason = "tool_use";
427
+ return { text, toolCalls, stopReason: stopReason ?? "end", usage };
428
+ }
429
+ function prematureStreamTurn(streamedText, readError, usage) {
430
+ if (!streamedText) {
431
+ const detail = readError instanceof Error && readError.message ? ` (${readError.message})` : "";
432
+ return {
433
+ text: `Errore di rete: connection closed prima che il provider completasse la risposta${detail}.`,
434
+ toolCalls: [],
435
+ stopReason: "error",
436
+ usage,
437
+ };
438
+ }
439
+ return {
440
+ text: `Risposta provider incompleta: EOF prematuro dopo ${streamedText.length} caratteri; nessuna tool call e' stata eseguita.`,
441
+ toolCalls: [],
442
+ stopReason: "error",
443
+ usage,
444
+ };
445
+ }
446
+ // Il messaggio per uno stream chiuso con finish_reason "error". Il dettaglio
447
+ // utile puo' stare in tre posti diversi, e nessuno e' garantito:
448
+ // - choice.error (OpenRouter, quando il provider a valle risponde male)
449
+ // - evt.error (errore a livello di evento)
450
+ // - choice.native_finish_reason (il motivo grezzo del modello sottostante)
451
+ //
452
+ // Il testo finisce davanti all'utente E dentro il classificatore dei retry
453
+ // (isTransientError), percio' contiene "upstream" e "temporaneo": senza, questo
454
+ // caso non verrebbe ritentato, mentre e' il caso in cui ritentare funziona.
455
+ export function routerFailureMessage(choice, evt) {
456
+ const dettaglio = leggiDettaglioErrore(choice?.["error"]) ?? leggiDettaglioErrore(evt["error"]);
457
+ const nativo = choice?.["native_finish_reason"];
458
+ const coda = dettaglio
459
+ ? ` Il provider ha risposto: ${dettaglio}`
460
+ : nativo
461
+ ? ` Motivo riportato dal modello: ${String(nativo)}.`
462
+ : " Il provider non ha dato un motivo.";
463
+ return "Il modello a monte ha interrotto la risposta (errore upstream temporaneo)."
464
+ + coda
465
+ + " Se stai usando una rotta che smista su piu' modelli, un nuovo tentativo puo' finire su un altro modello.";
466
+ }
467
+ function leggiDettaglioErrore(raw) {
468
+ if (!raw)
469
+ return null;
470
+ if (typeof raw === "string")
471
+ return raw.trim() || null;
472
+ if (typeof raw !== "object")
473
+ return null;
474
+ const o = raw;
475
+ const messaggio = o["message"] ?? o["detail"] ?? o["reason"];
476
+ const codice = o["code"] ?? o["type"];
477
+ const testo = messaggio ? String(messaggio).trim() : "";
478
+ if (testo && codice)
479
+ return `${testo} (${String(codice)})`;
480
+ if (testo)
481
+ return testo;
482
+ if (codice)
483
+ return String(codice);
484
+ return null;
485
+ }
486
+ function readProviderError(evt) {
487
+ const raw = evt["error"];
488
+ if (raw === undefined && evt["type"] !== "error")
489
+ return null;
490
+ if (typeof raw === "string")
491
+ return `Errore provider streaming: ${raw}`;
492
+ const code = raw?.["code"] ?? raw?.["type"] ?? evt["code"] ?? "stream_error";
493
+ const message = raw?.["message"] ?? evt["message"] ?? "errore streaming senza dettagli";
494
+ return `Errore provider streaming (${String(code)}): ${String(message)}${errorTimingDetail(raw)}${errorTimingDetail(evt)}`;
495
+ }
496
+ function accumulateToolCalls(delta, calls, onActivity, announced, onToolDelta) {
497
+ const deltaCalls = delta?.["tool_calls"];
498
+ if (!deltaCalls)
499
+ return;
500
+ for (const dc of deltaCalls) {
501
+ const index = Number(dc["index"] ?? 0);
502
+ const cur = calls.get(index) ?? { id: "", name: "", args: "" };
503
+ if (dc["id"])
504
+ cur.id = String(dc["id"]);
505
+ const fn = dc["function"];
506
+ if (fn?.["name"])
507
+ cur.name = String(fn["name"]);
508
+ const piece = fn?.["arguments"] ? String(fn["arguments"]) : "";
509
+ if (piece)
510
+ cur.args += piece;
511
+ calls.set(index, cur);
512
+ if (cur.name || piece)
513
+ onToolDelta?.({ id: cur.id, name: cur.name, index, delta: piece });
514
+ // Progresso input grandi (parita' col provider Anthropic).
515
+ if (onActivity && announced && cur.name) {
516
+ const kb = Math.floor(cur.args.length / 2048);
517
+ if (kb > (announced.get(index) ?? 0)) {
518
+ announced.set(index, kb);
519
+ onActivity(`scrivo ${cur.name} · ${Math.round(cur.args.length / 1024)} KB`);
520
+ }
521
+ }
522
+ }
523
+ }
@@ -0,0 +1,15 @@
1
+ import type { CompletionRequest, ModelTurn, Provider } from "../core/types.js";
2
+ import { type OAuthCreds } from "./oauth-store.js";
3
+ export declare class OpenAIOAuthProvider implements Provider {
4
+ private creds;
5
+ private readonly env;
6
+ private readonly now;
7
+ readonly id = "chatgpt";
8
+ readonly label = "ChatGPT (abbonamento)";
9
+ readonly 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"];
10
+ readonly supportsFastMode = true;
11
+ constructor(creds: OAuthCreds, env: NodeJS.ProcessEnv, now?: () => number);
12
+ private ensureToken;
13
+ complete(req: CompletionRequest): Promise<ModelTurn>;
14
+ }
15
+ export declare function parseResponsesStream(body: ReadableStream<Uint8Array>, onDelta?: (chunk: string) => void, onToolDelta?: CompletionRequest["onToolDelta"]): Promise<ModelTurn>;