@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,123 @@
1
+ // Logica di invio del prompt con allegati immagine.
2
+ //
3
+ // L'utente compone un messaggio con dei placeholder testuali "img #N" (li
4
+ // inserisce la UI di terminale). Quando il prompt parte,
5
+ // questi placeholder vanno risolti nei path reali dei file immagine catturati,
6
+ // i bytes vanno riletti dal disco e inclusi nel payload inviato al modello come
7
+ // parti immagine (ImagePart, base64 + mime).
8
+ //
9
+ // Questo modulo NON conosce SessionRefManager direttamente: si appoggia a una
10
+ // piccola interfaccia RefResolver (resolvePath/expand) che combacia con l'API
11
+ // pubblica annunciata da session-ref-manager. Cosi' resta disaccoppiato e
12
+ // testabile, e a merge avvenuto il vero SessionRefManager lo soddisfa.
13
+ //
14
+ // Zero dipendenze a runtime: lettura file via fs nativo, base64 via Buffer.
15
+ import { readFile } from "node:fs/promises";
16
+ import { extname } from "node:path";
17
+ const defaultReader = async (path) => readFile(path);
18
+ // Pattern di un placeholder "img #N": "img" + spazi opzionali + "#" + spazi
19
+ // opzionali + numero. Case-insensitive, globale.
20
+ const REF_RE = /img\s*#\s*\d+/gi;
21
+ // Normalizza un'occorrenza grezza ("IMG # 3") nell'etichetta canonica usata
22
+ // dal resolver ("img #3").
23
+ export function normalizeRef(raw) {
24
+ const n = raw.replace(/[^\d]/g, "");
25
+ return `img #${n}`;
26
+ }
27
+ // Estrae, in ordine di apparizione e SENZA duplicati, le etichette canoniche
28
+ // "img #N" presenti nel testo.
29
+ export function extractRefs(text) {
30
+ const out = [];
31
+ const seen = new Set();
32
+ for (const m of text.matchAll(REF_RE)) {
33
+ const label = normalizeRef(m[0]);
34
+ if (!seen.has(label)) {
35
+ seen.add(label);
36
+ out.push(label);
37
+ }
38
+ }
39
+ return out;
40
+ }
41
+ // MIME del media dedotto dall'estensione del file. Copre i formati immagine
42
+ // supportati dai provider (Anthropic: png/jpeg/webp/gif). Default png.
43
+ const MIME_BY_EXT = {
44
+ ".png": "image/png",
45
+ ".jpg": "image/jpeg",
46
+ ".jpeg": "image/jpeg",
47
+ ".webp": "image/webp",
48
+ ".gif": "image/gif",
49
+ };
50
+ export function mimeFromPath(path) {
51
+ return MIME_BY_EXT[extname(path).toLowerCase()] ?? "image/png";
52
+ }
53
+ const DEFAULT_MAX_TOTAL = 16 * 1024 * 1024; // 16 MB
54
+ // Costruisce le parti del prompt a partire dal testo utente: risolve i
55
+ // placeholder "img #N" nei path via il resolver, rilegge i bytes di ciascun
56
+ // file e produce un TextPart (testo originale invariato) + un ImagePart per
57
+ // ogni immagine risolta e leggibile.
58
+ //
59
+ // Il testo NON viene mutato: i placeholder restano leggibili nel testo (sono
60
+ // gia' un riferimento umano), mentre i bytes viaggiano come parti separate. Il
61
+ // modello vede sia il testo con "img #N" sia le immagini corrispondenti.
62
+ export async function buildPrompt(text, refs, opts = {}) {
63
+ const reader = opts.reader ?? defaultReader;
64
+ const maxTotal = opts.maxTotalBytes ?? DEFAULT_MAX_TOTAL;
65
+ const labels = extractRefs(text);
66
+ const attached = [];
67
+ const missing = [];
68
+ const unreadable = [];
69
+ const images = [];
70
+ let used = 0;
71
+ for (const label of labels) {
72
+ const path = refs.resolvePath(label);
73
+ if (!path) {
74
+ missing.push(label);
75
+ continue;
76
+ }
77
+ let bytes;
78
+ try {
79
+ bytes = await reader(path);
80
+ }
81
+ catch {
82
+ unreadable.push(label);
83
+ continue;
84
+ }
85
+ if (!bytes.length || used + bytes.length > maxTotal) {
86
+ unreadable.push(label);
87
+ continue;
88
+ }
89
+ used += bytes.length;
90
+ images.push({
91
+ type: "image",
92
+ data: Buffer.from(bytes).toString("base64"),
93
+ mime: mimeFromPath(path),
94
+ source: path,
95
+ });
96
+ attached.push(label);
97
+ }
98
+ const parts = [];
99
+ // Il testo resta sempre presente (anche vuoto se l'utente ha mandato solo
100
+ // immagini: in tal caso lo omettiamo per non inviare un blocco testo vuoto).
101
+ const trimmed = text.trim();
102
+ if (trimmed.length) {
103
+ const textPart = { type: "text", text };
104
+ parts.push(textPart);
105
+ }
106
+ for (const img of images)
107
+ parts.push(img);
108
+ // Se non c'e' ne' testo ne' immagini, garantisci almeno un blocco testo
109
+ // (vuoto) per non produrre un messaggio senza contenuto.
110
+ if (!parts.length)
111
+ parts.push({ type: "text", text });
112
+ return { parts, attached, missing, unreadable };
113
+ }
114
+ // Comodo per chi vuole solo il path espanso nel testo (diagnostica/log): usa
115
+ // expand() del resolver se disponibile, altrimenti sostituisce via resolvePath.
116
+ export function expandRefsInText(text, refs) {
117
+ if (refs.expand)
118
+ return refs.expand(text);
119
+ return text.replace(REF_RE, (raw) => {
120
+ const label = normalizeRef(raw);
121
+ return refs.resolvePath(label) ?? raw;
122
+ });
123
+ }
@@ -0,0 +1,16 @@
1
+ import { type ContextLedger, type ContextLedgerInput } from "./context-ledger.js";
2
+ import type { CompletionRequest, Usage } from "./types.js";
3
+ export interface RequestPlan {
4
+ readonly request: CompletionRequest;
5
+ readonly ledger: ContextLedger;
6
+ readonly fits: boolean;
7
+ readonly estimatedInputTokens: number;
8
+ readonly calibration: number;
9
+ }
10
+ /** One request object feeds both the provider and its context accounting. */
11
+ export declare class RequestBudget {
12
+ private factor;
13
+ plan(request: CompletionRequest, metadata: ContextLedgerInput): RequestPlan;
14
+ /** Providers normalize inputTokens as uncached input; cached input is separate. */
15
+ observe(usage: Usage | undefined, estimate: number): void;
16
+ }
@@ -0,0 +1,36 @@
1
+ import { buildContextLedger } from "./context-ledger.js";
2
+ import { resolveMaxTokens } from "./model-limits.js";
3
+ /** One request object feeds both the provider and its context accounting. */
4
+ export class RequestBudget {
5
+ factor = 1;
6
+ plan(request, metadata) {
7
+ const requestedOutput = resolveMaxTokens(request.maxTokens, request.model);
8
+ const declared = metadata.turnBlocks ?? [];
9
+ const turnBlocks = declared.map((block) => block.text ?? "").join("\n\n") === (request.turnContext ?? "")
10
+ ? declared : request.turnContext ? [{ key: "turn", label: "Contesto operativo", text: request.turnContext, cacheable: false }] : [];
11
+ const ledger = buildContextLedger({
12
+ ...metadata, model: request.model, system: request.system,
13
+ tools: request.tools, messages: request.messages, turnBlocks,
14
+ reserveTokens: Math.max(metadata.reserveTokens ?? 0, requestedOutput),
15
+ });
16
+ const estimatedInputTokens = Math.ceil(ledger.tokens * this.factor);
17
+ const available = Math.max(0, ledger.window - estimatedInputTokens);
18
+ const maxTokens = Math.min(requestedOutput, available);
19
+ const fits = maxTokens >= Math.min(requestedOutput, 1024);
20
+ return {
21
+ request: { ...request, maxTokens }, ledger: { ...ledger,
22
+ admission: { estimatedInputTokens, calibration: this.factor, outputTokens: maxTokens, fits } }, fits,
23
+ estimatedInputTokens, calibration: this.factor,
24
+ };
25
+ }
26
+ /** Providers normalize inputTokens as uncached input; cached input is separate. */
27
+ observe(usage, estimate) {
28
+ if (!usage || estimate <= 0)
29
+ return;
30
+ const actual = usage.inputTokens + (usage.cacheReadTokens ?? 0) + (usage.cacheWriteTokens ?? 0);
31
+ if (!Number.isFinite(actual) || actual <= 0)
32
+ return;
33
+ // Underestimates matter for admission; a cheap turn must not erase the margin.
34
+ this.factor = Math.max(this.factor, Math.min(3, actual / estimate));
35
+ }
36
+ }
@@ -0,0 +1,17 @@
1
+ import type { AgentEvent, Provider } from "./types.js";
2
+ export declare class RunTiming {
3
+ private fd?;
4
+ private readonly runId;
5
+ private readonly started;
6
+ private boundary;
7
+ private requests;
8
+ private completed;
9
+ private readonly active;
10
+ constructor(sessionDir: string, sessionId: string, env: NodeJS.ProcessEnv);
11
+ private record;
12
+ private close;
13
+ provider(provider: Provider): Provider;
14
+ wait<T>(kind: "permission" | "question", action: () => Promise<T>): Promise<T>;
15
+ event(event: AgentEvent): void;
16
+ finish(aborted: boolean, failed: boolean): void;
17
+ }
@@ -0,0 +1,123 @@
1
+ import { closeSync, existsSync, lstatSync, mkdirSync, openSync, writeSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { randomUUID } from "node:crypto";
4
+ import { validateSessionId } from "./session.js";
5
+ // Local metadata only: no prompts, commands, answers, reasoning or tool output.
6
+ // Spans overlap (nested tools and permissions); durations must not be summed.
7
+ export class RunTiming {
8
+ fd;
9
+ runId = randomUUID();
10
+ started = performance.now();
11
+ boundary = this.started;
12
+ requests = 0;
13
+ completed = false;
14
+ active = new Map();
15
+ constructor(sessionDir, sessionId, env) {
16
+ if (/^(0|off|false)$/i.test(env["TALOS_TIMING"] ?? ""))
17
+ return;
18
+ try {
19
+ const directory = join(sessionDir, "timing");
20
+ mkdirSync(directory, { recursive: true });
21
+ if (lstatSync(directory).isSymbolicLink())
22
+ return;
23
+ const path = join(directory, `${validateSessionId(sessionId)}.jsonl`);
24
+ if (existsSync(path) && lstatSync(path).isSymbolicLink())
25
+ return;
26
+ this.fd = openSync(path, "a", 0o600);
27
+ this.record("run_start", {});
28
+ }
29
+ catch { /* diagnostics must never prevent work */ }
30
+ }
31
+ record(event, fields) {
32
+ if (this.fd === undefined)
33
+ return;
34
+ try {
35
+ writeSync(this.fd, JSON.stringify({ version: 1, runId: this.runId, at: Date.now(), event, ...fields }) + "\n");
36
+ }
37
+ catch {
38
+ this.close();
39
+ }
40
+ }
41
+ close() {
42
+ if (this.fd === undefined)
43
+ return;
44
+ try {
45
+ closeSync(this.fd);
46
+ }
47
+ catch { /* already unavailable */ }
48
+ this.fd = undefined;
49
+ }
50
+ provider(provider) {
51
+ return { ...provider, id: provider.id, models: provider.models, supportsFastMode: provider.supportsFastMode, complete: async (request) => {
52
+ const started = performance.now();
53
+ const index = ++this.requests;
54
+ this.record("prepare_end", { request: index, durationMs: started - this.boundary });
55
+ this.record("provider_start", { request: index, provider: provider.id, model: request.model, effort: request.effort ?? "" });
56
+ let first = false;
57
+ const firstOutput = (kind, nonempty) => {
58
+ if (first || !nonempty)
59
+ return;
60
+ first = true;
61
+ this.record("provider_first_output", { request: index, kind, durationMs: performance.now() - started });
62
+ };
63
+ try {
64
+ const result = await provider.complete({ ...request,
65
+ onDelta: delta => { firstOutput("text", Boolean(delta)); request.onDelta?.(delta); },
66
+ onReasoning: delta => { firstOutput("reasoning", Boolean(delta)); request.onReasoning?.(delta); },
67
+ onToolDelta: event => { firstOutput("tool", Boolean(event.delta)); request.onToolDelta?.(event); },
68
+ });
69
+ this.record("provider_end", { request: index, durationMs: performance.now() - started,
70
+ stopReason: result.stopReason, calls: result.toolCalls.length, usage: result.usage });
71
+ return result;
72
+ }
73
+ catch (error) {
74
+ this.record("provider_end", { request: index, durationMs: performance.now() - started,
75
+ stopReason: request.signal.aborted ? "aborted" : "exception" });
76
+ throw error;
77
+ }
78
+ finally {
79
+ this.boundary = performance.now();
80
+ }
81
+ } };
82
+ }
83
+ async wait(kind, action) {
84
+ const started = performance.now();
85
+ const id = randomUUID();
86
+ this.record("wait_start", { kind, id });
87
+ try {
88
+ const result = await action();
89
+ this.record("wait_end", { kind, id, durationMs: performance.now() - started,
90
+ outcome: result === false || result === null ? "declined_or_unanswered" : "returned" });
91
+ return result;
92
+ }
93
+ catch (error) {
94
+ this.record("wait_end", { kind, id, durationMs: performance.now() - started, outcome: "exception" });
95
+ throw error;
96
+ }
97
+ }
98
+ event(event) {
99
+ if (event.type === "done")
100
+ this.completed = true;
101
+ if (event.type === "tool_call") {
102
+ const key = `${event.parentId ?? ""}:${event.call.id}`;
103
+ this.active.set(key, performance.now());
104
+ this.record("tool_start", { request: this.requests, id: event.call.id, parentId: event.parentId, tool: event.call.name });
105
+ }
106
+ else if (event.type === "tool_result") {
107
+ const key = `${event.parentId ?? ""}:${event.result.callId}`;
108
+ const started = this.active.get(key);
109
+ this.active.delete(key);
110
+ this.record("tool_end", { request: this.requests, id: event.result.callId, parentId: event.parentId,
111
+ ...(started !== undefined ? { durationMs: performance.now() - started } : {}), isError: event.result.isError === true });
112
+ if (!event.parentId)
113
+ this.boundary = performance.now();
114
+ }
115
+ }
116
+ finish(aborted, failed) {
117
+ this.record("run_end", { durationMs: performance.now() - this.started, requests: this.requests,
118
+ outcome: aborted ? "aborted" : failed ? "exception" : this.completed ? "completed" : "incomplete",
119
+ unfinishedTools: this.active.size });
120
+ this.active.clear();
121
+ this.close();
122
+ }
123
+ }
@@ -0,0 +1,17 @@
1
+ import { type TalosUpdate } from "./update-check.js";
2
+ import { type UpdateRunner } from "./update-process.js";
3
+ export declare const TALOS_INSTALL_ROOT: string;
4
+ export type UpdateFailure = "unsupported" | "modified" | "diverged" | "version" | "download" | "build" | "install";
5
+ export type UpdateResult = {
6
+ readonly ok: true;
7
+ } | {
8
+ readonly ok: false;
9
+ readonly reason: UpdateFailure;
10
+ readonly changed: boolean;
11
+ };
12
+ export declare function installTalosUpdate(update: TalosUpdate, options: {
13
+ readonly env: NodeJS.ProcessEnv;
14
+ readonly root?: string;
15
+ readonly run?: UpdateRunner;
16
+ readonly bun?: string;
17
+ }): Promise<UpdateResult>;
@@ -0,0 +1,54 @@
1
+ import { existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { parseUpdateVersion, TALOS_REPOSITORY } from "./update-check.js";
5
+ import { runUpdateCommand } from "./update-process.js";
6
+ import { installPackageUpdate } from "./package-update.js";
7
+ export const TALOS_INSTALL_ROOT = fileURLToPath(new URL("../../", import.meta.url));
8
+ export async function installTalosUpdate(update, options) {
9
+ const root = options.root ?? TALOS_INSTALL_ROOT;
10
+ const run = options.run ?? runUpdateCommand;
11
+ const env = { ...options.env, GIT_TERMINAL_PROMPT: "0" };
12
+ const git = (...args) => run({ command: "git", args, cwd: root, env, timeoutMs: 30_000 });
13
+ const target = parseUpdateVersion(update.tag);
14
+ if (!target || target.prerelease || target.version !== update.version) {
15
+ return { ok: false, reason: "version", changed: false };
16
+ }
17
+ if (!existsSync(join(root, ".git")))
18
+ return installPackageUpdate(update, { root, env: options.env, run });
19
+ let changed = false;
20
+ try {
21
+ const origin = await git("remote", "get-url", "origin");
22
+ const official = new RegExp(`^(?:https://github\\.com/|git@github\\.com:|ssh://git@github\\.com/)${TALOS_REPOSITORY}(?:\\.git)?/?$`, "i");
23
+ if (!official.test(origin))
24
+ return { ok: false, reason: "unsupported", changed: false };
25
+ if (await git("status", "--porcelain", "--untracked-files=normal")) {
26
+ return { ok: false, reason: "modified", changed: false };
27
+ }
28
+ await git("fetch", "--no-tags", "origin", `refs/tags/${update.tag}`);
29
+ const commit = await git("rev-parse", "--verify", "FETCH_HEAD^{commit}");
30
+ if (!/^[a-f0-9]{40,64}$/.test(commit))
31
+ return { ok: false, reason: "version", changed: false };
32
+ const pkg = JSON.parse(await git("show", `${commit}:package.json`));
33
+ if (pkg.name !== "@vascend/talos" || pkg.version !== update.version) {
34
+ return { ok: false, reason: "version", changed: false };
35
+ }
36
+ try {
37
+ await git("merge-base", "--is-ancestor", "HEAD", commit);
38
+ }
39
+ catch {
40
+ return { ok: false, reason: "diverged", changed: false };
41
+ }
42
+ // Refuse dirty/diverged checkouts; never reset, stash or discard local work.
43
+ await git("merge", "--ff-only", commit);
44
+ changed = true;
45
+ const bun = options.bun ?? (process.versions.bun ? process.execPath : process.platform === "win32" ? "bun.exe" : "bun");
46
+ for (const args of [["install", "--frozen-lockfile"], ["run", "install:cli"]]) {
47
+ await run({ command: bun, args, cwd: root, env, inherit: true, timeoutMs: 300_000 });
48
+ }
49
+ return { ok: true };
50
+ }
51
+ catch {
52
+ return { ok: false, reason: changed ? "build" : "download", changed };
53
+ }
54
+ }
@@ -0,0 +1,27 @@
1
+ export interface SessionRef {
2
+ readonly id: string;
3
+ readonly index: number;
4
+ readonly path: string;
5
+ readonly kind: string;
6
+ }
7
+ export declare function refLabel(kind: string, index: number): string;
8
+ export declare function parseRefLabel(label: string): {
9
+ kind: string;
10
+ index: number;
11
+ } | null;
12
+ export declare class SessionRefManager {
13
+ private readonly byPath;
14
+ private readonly byId;
15
+ private readonly counters;
16
+ register(path: string, kind?: string): SessionRef;
17
+ resolve(id: string): SessionRef | undefined;
18
+ resolvePath(id: string): string | undefined;
19
+ lookup(path: string, kind?: string): SessionRef | undefined;
20
+ has(id: string): boolean;
21
+ get size(): number;
22
+ list(): readonly SessionRef[];
23
+ expand(text: string): string;
24
+ reset(): void;
25
+ toJSON(): readonly SessionRef[];
26
+ static fromJSON(refs: readonly SessionRef[]): SessionRefManager;
27
+ }
@@ -0,0 +1,126 @@
1
+ // Gestore di riferimenti per sessione: assegna a ogni allegato un
2
+ // identificatore progressivo leggibile (img #1, img #2, ...) e mantiene una
3
+ // mappa id->path valida per la sessione corrente. Serve a referenziare gli
4
+ // allegati nel testo (es. "vedi img #2") risolvendoli poi al path reale.
5
+ //
6
+ // Zero dipendenze, stato incapsulato. La mappa e' append-only nell'arco di
7
+ // una sessione: gli id non vengono mai riusati finche' non si chiama reset().
8
+ // Prefisso di default per gli allegati immagine.
9
+ const DEFAULT_KIND = "img";
10
+ // Costruisce l'etichetta leggibile a partire da tipo e indice: "img #1".
11
+ export function refLabel(kind, index) {
12
+ return `${kind} #${index}`;
13
+ }
14
+ // Estrae (kind, index) da un'etichetta "img #2", o null se non valida.
15
+ export function parseRefLabel(label) {
16
+ const m = /^(\w[\w-]*)\s*#(\d+)$/.exec(label.trim());
17
+ if (!m)
18
+ return null;
19
+ const index = Number.parseInt(m[2], 10);
20
+ if (!Number.isFinite(index) || index < 1)
21
+ return null;
22
+ return { kind: m[1], index };
23
+ }
24
+ // Gestore della mappa id<->path per una singola sessione. Lo stato e'
25
+ // incapsulato; i metodi mutano lo stato interno ma ritornano sempre nuovi
26
+ // oggetti SessionRef (immutabili) verso l'esterno.
27
+ export class SessionRefManager {
28
+ // path -> ref gia' registrato (dedup: lo stesso path riusa lo stesso id).
29
+ byPath = new Map();
30
+ // id leggibile (es. "img #1") -> ref.
31
+ byId = new Map();
32
+ // Contatore progressivo per tipo: garantisce numerazione indipendente per
33
+ // ogni kind ("img #1", "img #2", "file #1", ...).
34
+ counters = new Map();
35
+ // Registra un allegato e ritorna il suo riferimento. Se il path e' gia'
36
+ // noto (stesso kind), ritorna il riferimento esistente senza crearne uno
37
+ // nuovo (dedup), cosi' lo stesso allegato mantiene un id stabile.
38
+ register(path, kind = DEFAULT_KIND) {
39
+ const key = dedupKey(kind, path);
40
+ const existing = this.byPath.get(key);
41
+ if (existing)
42
+ return existing;
43
+ const index = (this.counters.get(kind) ?? 0) + 1;
44
+ this.counters.set(kind, index);
45
+ const ref = {
46
+ id: refLabel(kind, index),
47
+ index,
48
+ path,
49
+ kind,
50
+ };
51
+ this.byPath.set(key, ref);
52
+ this.byId.set(ref.id, ref);
53
+ return ref;
54
+ }
55
+ // Risolve un'etichetta (es. "img #2") al riferimento, o undefined se ignota.
56
+ resolve(id) {
57
+ return this.byId.get(id.trim());
58
+ }
59
+ // Risolve un'etichetta direttamente al path, o undefined.
60
+ resolvePath(id) {
61
+ return this.byId.get(id.trim())?.path;
62
+ }
63
+ // Ritorna il riferimento gia' associato a un path (stesso kind), o undefined.
64
+ lookup(path, kind = DEFAULT_KIND) {
65
+ return this.byPath.get(dedupKey(kind, path));
66
+ }
67
+ // True se l'etichetta e' un riferimento noto in questa sessione.
68
+ has(id) {
69
+ return this.byId.has(id.trim());
70
+ }
71
+ // Numero di riferimenti registrati.
72
+ get size() {
73
+ return this.byId.size;
74
+ }
75
+ // Tutti i riferimenti nell'ordine di registrazione (per kind, poi indice).
76
+ list() {
77
+ return [...this.byId.values()].sort((a, b) => {
78
+ if (a.kind !== b.kind)
79
+ return a.kind < b.kind ? -1 : 1;
80
+ return a.index - b.index;
81
+ });
82
+ }
83
+ // Sostituisce nel testo ogni etichetta nota con il path risolto. Utile per
84
+ // espandere "vedi img #1" nel path reale prima dell'invio al modello.
85
+ // Le etichette ignote restano invariate.
86
+ expand(text) {
87
+ return text.replace(/(\w[\w-]*)\s*#(\d+)/g, (whole) => {
88
+ const ref = this.byId.get(normalizeLabel(whole));
89
+ return ref ? ref.path : whole;
90
+ });
91
+ }
92
+ // Azzera la mappa: nuova sessione, gli id ripartono da #1.
93
+ reset() {
94
+ this.byPath.clear();
95
+ this.byId.clear();
96
+ this.counters.clear();
97
+ }
98
+ // Serializza lo stato per la persistenza (snapshot della sessione).
99
+ toJSON() {
100
+ return this.list();
101
+ }
102
+ // Ricostruisce un gestore da uno snapshot serializzato, ripristinando i
103
+ // contatori al massimo indice visto per ciascun kind.
104
+ static fromJSON(refs) {
105
+ const mgr = new SessionRefManager();
106
+ for (const ref of refs) {
107
+ const key = dedupKey(ref.kind, ref.path);
108
+ mgr.byPath.set(key, ref);
109
+ mgr.byId.set(ref.id, ref);
110
+ const cur = mgr.counters.get(ref.kind) ?? 0;
111
+ if (ref.index > cur)
112
+ mgr.counters.set(ref.kind, ref.index);
113
+ }
114
+ return mgr;
115
+ }
116
+ }
117
+ // Chiave di dedup: combina kind e path cosi' lo stesso path con kind diversi
118
+ // resta distinto.
119
+ function dedupKey(kind, path) {
120
+ return `${kind}\u0000${path}`;
121
+ }
122
+ // Normalizza un'etichetta grezza ("img #2") nella forma canonica ("img #2").
123
+ function normalizeLabel(raw) {
124
+ const parsed = parseRefLabel(raw);
125
+ return parsed ? refLabel(parsed.kind, parsed.index) : raw.trim();
126
+ }
@@ -0,0 +1,4 @@
1
+ export declare function prepareSessionStorage(config: {
2
+ readonly cwd: string;
3
+ readonly sessionDir: string;
4
+ }, env: NodeJS.ProcessEnv): void;
@@ -0,0 +1,48 @@
1
+ import { cpSync, existsSync, lstatSync, writeFileSync } from "node:fs";
2
+ import { basename, isAbsolute, join, relative, resolve, sep } from "node:path";
3
+ import { defaultSessionDir } from "./env-paths.js";
4
+ import { withLockSync } from "../vascend/file-lock.js";
5
+ // Importa una sola volta lo store storico prima di resume/continue. Gli
6
+ // originali restano disponibili anche per processi avviati con la vecchia
7
+ // versione. Gli override espliciti continuano a usare il proprio store.
8
+ export function prepareSessionStorage(config, env) {
9
+ const destination = defaultSessionDir(config.cwd, env);
10
+ if (resolve(config.sessionDir) !== destination)
11
+ return;
12
+ const legacy = join(config.cwd, ".talos", "sessions");
13
+ const marker = join(destination, ".legacy-import.json");
14
+ if (!existsSync(legacy) || existsSync(marker))
15
+ return;
16
+ // Non importare directory reindirizzate fuori dal progetto.
17
+ if (lstatSync(join(config.cwd, ".talos")).isSymbolicLink()
18
+ || lstatSync(legacy).isSymbolicLink() || !lstatSync(legacy).isDirectory())
19
+ return;
20
+ // Un override TALOS_CONFIG_DIR dentro lo store storico non va ricopiato
21
+ // ricorsivamente su se stesso.
22
+ const destinationRelative = relative(legacy, destination);
23
+ if (!destinationRelative || (destinationRelative !== ".." && !destinationRelative.startsWith(`..${sep}`) && !isAbsolute(destinationRelative))) {
24
+ throw new Error("TALOS_CONFIG_DIR non puo' collocare le sessioni dentro lo store storico");
25
+ }
26
+ withLockSync(marker, () => {
27
+ if (existsSync(marker))
28
+ return;
29
+ cpSync(legacy, destination, {
30
+ recursive: true,
31
+ force: false,
32
+ preserveTimestamps: true,
33
+ filter: (source, target) => {
34
+ const name = basename(source);
35
+ if (name.endsWith(".lock") || name.endsWith(".tmp") || name === ".legacy-import.json")
36
+ return false;
37
+ const stat = lstatSync(source);
38
+ if (stat.isSymbolicLink() || (!stat.isDirectory() && !stat.isFile()))
39
+ return false;
40
+ if (existsSync(target) && lstatSync(target).isSymbolicLink()) {
41
+ throw new Error(`Importazione sessioni: destinazione simbolica non ammessa: ${target}`);
42
+ }
43
+ return true;
44
+ },
45
+ });
46
+ writeFileSync(marker, JSON.stringify({ version: 1, source: legacy, importedAt: Date.now() }), { mode: 0o600 });
47
+ }, { staleMs: 300_000, timeoutMs: 30_000 });
48
+ }
@@ -0,0 +1 @@
1
+ export declare function sessionTitle(source: string): string;
@@ -0,0 +1,21 @@
1
+ import { stripVTControlCharacters } from "node:util";
2
+ // Display-only cleanup for old prompts wrapped in the Danilov notation.
3
+ // Never changes the persisted messages or the context sent to the model.
4
+ export function sessionTitle(source) {
5
+ const lines = stripVTControlCharacters(source).split(/\r?\n/).map(line => line.trim().replace(/^#{1,6}\s+/, ""));
6
+ const goal = /^(?:GOAL|OBIETTIVO(?:_ATTIVITA|_CASTELLO)?)\s*[:=]\s*(.*)$/i;
7
+ const clean = (line) => line.replace(/\s+(?:MODE|CHECKPOINT(?:_PRECEDENTE)?|INDICE|OUTPUT)\s*[:=].*$/i, "").replace(/\s+/g, " ").trim().slice(0, 100);
8
+ for (const line of lines) {
9
+ const match = goal.exec(line);
10
+ if (match?.[1]?.trim())
11
+ return clean(match[1]);
12
+ }
13
+ for (const line of lines) {
14
+ if (!line || /^[\[@<]|^```|^\d+\s*=/.test(line))
15
+ continue;
16
+ if (/^(?:INDICE(?:_MEMORIA)?|INDEX|DEFINIZIONI|DEFINITIONS|RELAZIONI|RELATIONS|OUTPUT|GOAL|OBIETTIVO|MODE|CHECKPOINT(?:_PRECEDENTE)?|ATTIVITA_ARCHIVIATE)(?:\s*[:=\d].*|\s*)$/i.test(line))
17
+ continue;
18
+ return clean(line);
19
+ }
20
+ return "";
21
+ }
@@ -0,0 +1,17 @@
1
+ import type { EventSink, PlanLimits, Provider, Usage } from "./types.js";
2
+ export interface SessionUsageRecord {
3
+ readonly id: string;
4
+ readonly sessionId: string;
5
+ readonly model: string;
6
+ readonly providerId: string;
7
+ readonly at: number;
8
+ readonly usage?: Usage;
9
+ readonly limits?: PlanLimits;
10
+ readonly actor?: string;
11
+ }
12
+ export declare function saveSessionUsage(base: string, sessionId: string, record: SessionUsageRecord): boolean;
13
+ export declare function readSessionUsage(base: string, sessionId: string): {
14
+ records: SessionUsageRecord[];
15
+ incomplete: boolean;
16
+ };
17
+ export declare function trackSessionUsage(provider: Provider, base: string, sessionId: string, sink: EventSink): Provider;