@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,14 @@
1
+ import type { FileLease, FilePresence } from "./file-coordination.js";
2
+ import { type ExecutionTarget } from "./execution-target.js";
3
+ export declare function workspaceLeaseDirectory(cwd: string, target?: ExecutionTarget): string;
4
+ /** Short record transactions; the write lease itself lasts until release or owner death. */
5
+ export declare class FileLeaseStore {
6
+ private readonly path;
7
+ constructor(directory: string);
8
+ acquire(lease: FileLease): readonly FilePresence[];
9
+ validate(lease: FileLease): readonly FilePresence[];
10
+ release(lease: FileLease): void;
11
+ list(path?: string): readonly FilePresence[];
12
+ private transaction;
13
+ private read;
14
+ }
@@ -0,0 +1,89 @@
1
+ import { readFileSync, writeFileSync, renameSync, realpathSync } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ import { randomUUID } from "node:crypto";
4
+ import { withLockSync } from "../vascend/file-lock.js";
5
+ import { executionTargetKey, localExecutionTarget } from "./execution-target.js";
6
+ import { createHash } from "node:crypto";
7
+ import { tmpdir } from "node:os";
8
+ export function workspaceLeaseDirectory(cwd, target = localExecutionTarget()) {
9
+ let root = resolve(cwd);
10
+ try {
11
+ root = realpathSync(root);
12
+ }
13
+ catch { /* workspace may be created later */ }
14
+ const workspace = createHash("sha256").update(process.platform === "win32" ? root.toLowerCase() : root).digest("hex");
15
+ return join(tmpdir(), "talos-file-leases", workspace, createHash("sha256").update(executionTargetKey(target)).digest("hex").slice(0, 24));
16
+ }
17
+ /** Short record transactions; the write lease itself lasts until release or owner death. */
18
+ export class FileLeaseStore {
19
+ path;
20
+ constructor(directory) { this.path = join(directory, "leases.json"); }
21
+ acquire(lease) {
22
+ return this.transaction((records) => {
23
+ const current = records[lease.path];
24
+ if (current)
25
+ return [presence(current)];
26
+ records[lease.path] = { ...lease, pid: process.pid, at: Date.now() };
27
+ return [];
28
+ });
29
+ }
30
+ validate(lease) {
31
+ const current = this.read()[lease.path];
32
+ return current?.id === lease.id && current.pid === process.pid ? []
33
+ : current ? [presence(current)] : [{ path: lease.path, mode: "writing", updatedAt: Date.now(),
34
+ actor: { id: "lease-lost", label: "lease di scrittura non piu' valida", kind: "external" } }];
35
+ }
36
+ release(lease) {
37
+ this.transaction((records) => {
38
+ if (records[lease.path]?.id === lease.id)
39
+ delete records[lease.path];
40
+ });
41
+ }
42
+ list(path) {
43
+ return Object.values(this.read()).filter((record) => (!path || record.path === path) && alive(record.pid)).map(presence);
44
+ }
45
+ transaction(fn) {
46
+ return withLockSync(this.path, () => {
47
+ const records = this.read();
48
+ for (const [key, record] of Object.entries(records))
49
+ if (!alive(record.pid))
50
+ delete records[key];
51
+ const value = fn(records);
52
+ const temp = this.path + "." + randomUUID() + ".tmp";
53
+ writeFileSync(temp, JSON.stringify(records), "utf8");
54
+ renameSync(temp, this.path);
55
+ return value;
56
+ });
57
+ }
58
+ read() {
59
+ try {
60
+ const value = JSON.parse(readFileSync(this.path, "utf8"));
61
+ if (!value || typeof value !== "object" || Array.isArray(value))
62
+ throw new Error("registro lease non valido");
63
+ const records = value;
64
+ for (const [key, row] of Object.entries(records)) {
65
+ if (!row || row.path !== key || !row.id || !Number.isInteger(row.pid) || row.pid <= 0 || !row.actor?.id) {
66
+ throw new Error("registro lease non valido");
67
+ }
68
+ }
69
+ return records;
70
+ }
71
+ catch (error) {
72
+ if (error.code === "ENOENT")
73
+ return {};
74
+ throw error;
75
+ }
76
+ }
77
+ }
78
+ function alive(pid) {
79
+ try {
80
+ process.kill(pid, 0);
81
+ return true;
82
+ }
83
+ catch (error) {
84
+ return error.code !== "ESRCH";
85
+ }
86
+ }
87
+ function presence(record) {
88
+ return { path: record.path, actor: record.actor, mode: "writing", updatedAt: record.at };
89
+ }
@@ -0,0 +1,26 @@
1
+ export declare const MAX_LATO_PX = 8000;
2
+ export declare const LATO_CONSIGLIATO_PX = 1568;
3
+ export declare const MAX_BYTES: number;
4
+ export interface Dimensioni {
5
+ readonly larghezza: number;
6
+ readonly altezza: number;
7
+ readonly formato: "png" | "jpeg" | "gif" | "webp";
8
+ }
9
+ export declare function dimensioni(bytes: Uint8Array | null | undefined): Dimensioni | null;
10
+ export declare function dimensioniDaBase64(data: string | null | undefined): Dimensioni | null;
11
+ export declare function fattoreDiRiduzione(d: Dimensioni, latoMax?: number): number;
12
+ export declare function ridimensionaA(d: Dimensioni, latoMax?: number): {
13
+ larghezza: number;
14
+ altezza: number;
15
+ };
16
+ export interface Verdetto {
17
+ readonly ok: boolean;
18
+ readonly spiegazione?: string;
19
+ readonly dimensioni?: Dimensioni;
20
+ }
21
+ export declare function verifica(bytesBase64: string, opts?: {
22
+ readonly nome?: string;
23
+ readonly latoMax?: number;
24
+ }): Verdetto;
25
+ export declare function spiegaErroreImmagine(dettaglio: string): string | null;
26
+ export declare function messaggioErroreTurno(etichettaProvider: string, status: number, dettaglio: string): string;
@@ -0,0 +1,205 @@
1
+ // Quanto e' grande davvero un'immagine, e cosa farne prima di spedirla.
2
+ //
3
+ // PERCHE' ESISTE. Anthropic rifiuta con un 400 le immagini che superano gli
4
+ // 8000 pixel per lato, e il messaggio che torna e' questo:
5
+ //
6
+ // messages.0.content.1.image.source.base64.data: At least one of the image
7
+ // dimensions exceed max allowed size: 8000 pixels
8
+ //
9
+ // L'utente non ha idea di cosa sia `messages.0.content.1`, e soprattutto: il
10
+ // turno INTERO fallisce per un allegato. Non e' un errore da mostrare, e' un
11
+ // errore da non far succedere.
12
+ //
13
+ // Qui si leggono le dimensioni dall'INTESTAZIONE del file, senza decodificare
14
+ // l'immagine: bastano i primi byte, quindi costa niente anche su un file da
15
+ // venti megabyte, e non serve nessuna dipendenza.
16
+ //
17
+ // Il ridimensionamento vero non sta qui: richiede API grafiche che Node non ha.
18
+ // Lo fa chi le possiede (Horizon, tramite Electron nativeImage) prima ancora di
19
+ // allegare. Questo modulo e' la rete di sicurezza per tutto il resto — immagini
20
+ // che arrivano dagli strumenti, da un CLI, da una sessione ripristinata.
21
+ // Il limite duro dell'API: oltre, la richiesta viene rifiutata.
22
+ export const MAX_LATO_PX = 8000;
23
+ // Il lato lungo consigliato. Oltre questa soglia l'immagine viene comunque
24
+ // ridimensionata dal server, quindi i pixel in piu' non aggiungono dettaglio:
25
+ // si pagano soltanto in tempo di caricamento.
26
+ export const LATO_CONSIGLIATO_PX = 1568;
27
+ // Tetto pratico per singola immagine in base64. L'API ne accetta di piu', ma
28
+ // oltre questa soglia il turno diventa lento senza che il modello veda meglio.
29
+ export const MAX_BYTES = 5 * 1024 * 1024;
30
+ function leggiPng(b) {
31
+ // Firma PNG + primo chunk IHDR: larghezza e altezza sono due interi a 32 bit
32
+ // big-endian a offset fisso. Se non c'e' IHDR non e' un PNG valido.
33
+ if (b.length < 24)
34
+ return null;
35
+ const firma = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
36
+ if (!firma.every((v, i) => b[i] === v))
37
+ return null;
38
+ if (String.fromCharCode(b[12], b[13], b[14], b[15]) !== "IHDR")
39
+ return null;
40
+ const leggi32 = (o) => ((b[o] << 24) | (b[o + 1] << 16) | (b[o + 2] << 8) | b[o + 3]) >>> 0;
41
+ return { larghezza: leggi32(16), altezza: leggi32(20), formato: "png" };
42
+ }
43
+ function leggiGif(b) {
44
+ // GIF87a/89a: dimensioni a 16 bit little-endian subito dopo la firma.
45
+ if (b.length < 10)
46
+ return null;
47
+ const testa = String.fromCharCode(...b.slice(0, 6));
48
+ if (testa !== "GIF87a" && testa !== "GIF89a")
49
+ return null;
50
+ return { larghezza: b[6] | (b[7] << 8), altezza: b[8] | (b[9] << 8), formato: "gif" };
51
+ }
52
+ function leggiJpeg(b) {
53
+ // JPEG e' una sequenza di segmenti: si salta di lunghezza in lunghezza fino a
54
+ // un marcatore SOF (Start Of Frame), che porta le dimensioni. Non si puo'
55
+ // leggere a offset fisso perche' prima ci sono EXIF, miniature, commenti.
56
+ if (b.length < 4 || b[0] !== 0xff || b[1] !== 0xd8)
57
+ return null;
58
+ let i = 2;
59
+ while (i + 9 < b.length) {
60
+ if (b[i] !== 0xff) {
61
+ i += 1;
62
+ continue;
63
+ } // riallineamento su padding
64
+ const marcatore = b[i + 1];
65
+ if (marcatore === 0xff) {
66
+ i += 1;
67
+ continue;
68
+ }
69
+ // SOF0..SOF15 tranne DHT (c4), JPG (c8) e DAC (cc), che non sono frame.
70
+ if (marcatore >= 0xc0 && marcatore <= 0xcf && marcatore !== 0xc4 && marcatore !== 0xc8 && marcatore !== 0xcc) {
71
+ return { altezza: (b[i + 5] << 8) | b[i + 6], larghezza: (b[i + 7] << 8) | b[i + 8], formato: "jpeg" };
72
+ }
73
+ const lunghezza = (b[i + 2] << 8) | b[i + 3];
74
+ if (lunghezza < 2)
75
+ return null; // segmento corrotto
76
+ i += 2 + lunghezza;
77
+ }
78
+ return null;
79
+ }
80
+ function leggiWebp(b) {
81
+ // RIFF....WEBP, poi un chunk VP8 (lossy), VP8L (lossless) o VP8X (esteso):
82
+ // tre formati diversi con tre codifiche diverse delle dimensioni.
83
+ if (b.length < 30)
84
+ return null;
85
+ if (String.fromCharCode(...b.slice(0, 4)) !== "RIFF")
86
+ return null;
87
+ if (String.fromCharCode(...b.slice(8, 12)) !== "WEBP")
88
+ return null;
89
+ const chunk = String.fromCharCode(...b.slice(12, 16));
90
+ if (chunk === "VP8 ") {
91
+ // Frame key: 3 byte di tag, poi la firma 9d 01 2a, poi 14 bit per lato.
92
+ if (b[23] !== 0x9d || b[24] !== 0x01 || b[25] !== 0x2a)
93
+ return null;
94
+ return {
95
+ larghezza: ((b[27] << 8) | b[26]) & 0x3fff,
96
+ altezza: ((b[29] << 8) | b[28]) & 0x3fff,
97
+ formato: "webp",
98
+ };
99
+ }
100
+ if (chunk === "VP8L") {
101
+ // 14 bit per lato impacchettati, meno uno.
102
+ const bits = b[21] | (b[22] << 8) | (b[23] << 16) | (b[24] << 24);
103
+ return { larghezza: (bits & 0x3fff) + 1, altezza: ((bits >> 14) & 0x3fff) + 1, formato: "webp" };
104
+ }
105
+ if (chunk === "VP8X") {
106
+ // Canvas esteso: 24 bit per lato, little-endian, meno uno.
107
+ const dim = (o) => (b[o] | (b[o + 1] << 8) | (b[o + 2] << 16)) + 1;
108
+ return { larghezza: dim(24), altezza: dim(27), formato: "webp" };
109
+ }
110
+ return null;
111
+ }
112
+ // Le dimensioni di un'immagine dai suoi primi byte, o null se il formato non e'
113
+ // riconosciuto. Non lancia mai: un'immagine illeggibile non deve rompere un
114
+ // turno, e in dubbio si lascia passare (sara' il server a dire la sua).
115
+ export function dimensioni(bytes) {
116
+ if (!bytes || bytes.length < 10)
117
+ return null;
118
+ try {
119
+ return leggiPng(bytes) ?? leggiJpeg(bytes) ?? leggiGif(bytes) ?? leggiWebp(bytes);
120
+ }
121
+ catch {
122
+ return null;
123
+ }
124
+ }
125
+ export function dimensioniDaBase64(data) {
126
+ const testo = String(data ?? "").replace(/\s+/g, "");
127
+ if (!testo)
128
+ return null;
129
+ try {
130
+ // Bastano i primi byte: si decodifica solo la testa, non tutta l'immagine.
131
+ // 64 KB coprono anche i JPEG con EXIF e miniature prima del frame.
132
+ return dimensioni(Buffer.from(testo.slice(0, 87400), "base64"));
133
+ }
134
+ catch {
135
+ return null;
136
+ }
137
+ }
138
+ // Il fattore per rientrare in un lato massimo, oppure 1 se ci sta gia'.
139
+ export function fattoreDiRiduzione(d, latoMax = LATO_CONSIGLIATO_PX) {
140
+ const lungo = Math.max(d.larghezza, d.altezza);
141
+ if (lungo <= latoMax || lungo <= 0)
142
+ return 1;
143
+ return latoMax / lungo;
144
+ }
145
+ // Le dimensioni dopo la riduzione, mai sotto un pixel.
146
+ export function ridimensionaA(d, latoMax = LATO_CONSIGLIATO_PX) {
147
+ const f = fattoreDiRiduzione(d, latoMax);
148
+ return {
149
+ larghezza: Math.max(1, Math.round(d.larghezza * f)),
150
+ altezza: Math.max(1, Math.round(d.altezza * f)),
151
+ };
152
+ }
153
+ // Si puo' spedire? In caso contrario, la spiegazione dice cosa e' successo e
154
+ // cosa fare — non "content.1.image.source.base64.data".
155
+ export function verifica(bytesBase64, opts = {}) {
156
+ const latoMax = opts.latoMax ?? MAX_LATO_PX;
157
+ const d = dimensioniDaBase64(bytesBase64);
158
+ // Formato non riconosciuto: si lascia passare. Rifiutare cio' che non si sa
159
+ // leggere farebbe piu' danni del 400 che si vuole evitare.
160
+ if (!d)
161
+ return { ok: true };
162
+ const lungo = Math.max(d.larghezza, d.altezza);
163
+ if (lungo > latoMax) {
164
+ const nome = opts.nome ? `"${opts.nome}"` : "L'immagine";
165
+ return {
166
+ ok: false,
167
+ dimensioni: d,
168
+ spiegazione: `${nome} e' ${d.larghezza}×${d.altezza} pixel e non puo' essere letta dal modello: `
169
+ + `il limite e' ${latoMax} pixel per lato. `
170
+ + `Ridimensionala (il lato lungo entro ${LATO_CONSIGLIATO_PX} px va benissimo) e riprova.`,
171
+ };
172
+ }
173
+ return { ok: true, dimensioni: d };
174
+ }
175
+ // Il messaggio da mostrare all'utente quando l'API rifiuta comunque per via di
176
+ // un'immagine. Riconosce la risposta di Anthropic e la traduce; se non e' quel
177
+ // caso ritorna null e chi chiama mostra l'errore originale.
178
+ export function spiegaErroreImmagine(dettaglio) {
179
+ return riconosci(dettaglio);
180
+ }
181
+ // L'errore da mostrare per un turno fallito: se riguarda un'immagine diventa
182
+ // una frase in italiano, altrimenti resta quello del provider con il suo
183
+ // codice. Un `400` grezzo con dentro `messages.0.content.1.image.source` non
184
+ // dice a nessuno cosa fare.
185
+ export function messaggioErroreTurno(etichettaProvider, status, dettaglio) {
186
+ const spiegazione = riconosci(dettaglio);
187
+ if (spiegazione)
188
+ return spiegazione;
189
+ return `Errore ${etichettaProvider} (${status}): ${dettaglio}`;
190
+ }
191
+ function riconosci(dettaglio) {
192
+ const testo = String(dettaglio ?? "");
193
+ if (/image dimensions exceed max allowed size/i.test(testo)) {
194
+ const px = /(\d{3,5})\s*pixels/i.exec(testo)?.[1] ?? String(MAX_LATO_PX);
195
+ return `Un'immagine allegata supera i ${px} pixel per lato, il massimo che il modello accetta. `
196
+ + `Ridimensionala (lato lungo entro ${LATO_CONSIGLIATO_PX} px) e rimandala.`;
197
+ }
198
+ if (/image exceeds \d+\s*MB|image.*too large/i.test(testo)) {
199
+ return "Un'immagine allegata e' troppo pesante per il modello. Riducila di dimensione e rimandala.";
200
+ }
201
+ if (/could not process image|unsupported image|invalid image/i.test(testo)) {
202
+ return "Un'immagine allegata non e' in un formato leggibile dal modello (servono PNG, JPEG, WebP o GIF).";
203
+ }
204
+ return null;
205
+ }
@@ -0,0 +1,3 @@
1
+ import type { CompletionRequest, ModelTurn, Provider } from "./types.js";
2
+ import type { UserInbox } from "./user-inbox.js";
3
+ export declare function completeWithSteering(provider: Provider, request: CompletionRequest, inbox?: UserInbox): Promise<ModelTurn | null>;
@@ -0,0 +1,42 @@
1
+ // Interrompe solo la richiesta al modello. I tool gia' avviati terminano con
2
+ // il proprio risultato prima di consumare l'inbox nel loop dell'agente.
3
+ export async function completeWithSteering(provider, request, inbox) {
4
+ if (!inbox?.onImmediate)
5
+ return provider.complete(request);
6
+ const controller = new AbortController();
7
+ let active = true;
8
+ let interrupt;
9
+ const interrupted = new Promise(resolve => { interrupt = resolve; });
10
+ const stop = () => {
11
+ interrupt({ text: "interrotto", toolCalls: [], stopReason: "error" });
12
+ controller.abort();
13
+ };
14
+ request.signal.addEventListener("abort", stop, { once: true });
15
+ const unsubscribe = inbox.onImmediate(() => {
16
+ interrupt(null);
17
+ controller.abort();
18
+ });
19
+ if (request.signal.aborted)
20
+ stop();
21
+ try {
22
+ if (controller.signal.aborted)
23
+ return await interrupted;
24
+ return await Promise.race([interrupted, provider.complete({
25
+ ...request,
26
+ signal: controller.signal,
27
+ onDelta: delta => { if (active && !controller.signal.aborted)
28
+ request.onDelta?.(delta); },
29
+ onToolDelta: delta => { if (active && !controller.signal.aborted)
30
+ request.onToolDelta?.(delta); },
31
+ onReasoning: delta => { if (active && !controller.signal.aborted)
32
+ request.onReasoning?.(delta); },
33
+ onActivity: label => { if (active && !controller.signal.aborted)
34
+ request.onActivity?.(label); },
35
+ })]);
36
+ }
37
+ finally {
38
+ active = false;
39
+ unsubscribe();
40
+ request.signal.removeEventListener("abort", stop);
41
+ }
42
+ }
@@ -0,0 +1,24 @@
1
+ export declare const KINGDOMS_TRIGGER_KEYWORD = "ultracheck";
2
+ export type KingdomsModeSource = "default" | "keyword" | "manual" | "stored";
3
+ export interface KingdomsModeState {
4
+ readonly enabled: boolean;
5
+ readonly source: KingdomsModeSource;
6
+ readonly updatedAt: string;
7
+ }
8
+ export declare const DEFAULT_KINGDOMS_MODE_STATE: KingdomsModeState;
9
+ export interface KingdomsTriggerOptions {
10
+ readonly detect?: (text: string) => boolean;
11
+ readonly keyword?: string;
12
+ }
13
+ export declare function kingdomsModeFile(env: NodeJS.ProcessEnv): string;
14
+ export declare function readKingdomsModeState(env: NodeJS.ProcessEnv): KingdomsModeState;
15
+ export declare function writeKingdomsModeState(env: NodeJS.ProcessEnv, state: KingdomsModeState): KingdomsModeState;
16
+ export declare function isKingdomsModeEnabled(state: KingdomsModeState): boolean;
17
+ export declare function enableKingdomsMode(state: KingdomsModeState, source?: KingdomsModeSource, now?: () => string): KingdomsModeState;
18
+ export declare function disableKingdomsMode(state: KingdomsModeState, source?: KingdomsModeSource, now?: () => string): KingdomsModeState;
19
+ export declare function toggleKingdomsMode(state: KingdomsModeState, now?: () => string): KingdomsModeState;
20
+ export declare function promptHasTrigger(text: string, opts?: KingdomsTriggerOptions): boolean;
21
+ export declare function applyPromptTrigger(state: KingdomsModeState, prompt: string, opts?: KingdomsTriggerOptions, now?: () => string): KingdomsModeState;
22
+ export declare function setKingdomsModeEnabled(env: NodeJS.ProcessEnv, enabled: boolean, source?: KingdomsModeSource): KingdomsModeState;
23
+ export declare function toggleKingdomsModePersisted(env: NodeJS.ProcessEnv): KingdomsModeState;
24
+ export declare function applyPromptTriggerPersisted(env: NodeJS.ProcessEnv, prompt: string, opts?: KingdomsTriggerOptions): KingdomsModeState;
@@ -0,0 +1,139 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ // Stato applicativo + toggle "Kingdoms Mode".
5
+ //
6
+ // La modalita' Kingdoms si ATTIVA quando il prompt dell'utente contiene la
7
+ // parola chiave 'ultracheck' (vedi applyPromptTrigger). Questo modulo possiede
8
+ // SOLO lo stato e le sue transizioni (abilitazione/disabilitazione/persistenza):
9
+ // la RILEVAZIONE della keyword puo' arrivare da un detector esterno (peer
10
+ // keyword-detector) passato come predicate opzionale; in sua assenza si usa un
11
+ // matcher interno di default.
12
+ //
13
+ // Lo stato e' persistito come JSON in ~/.talos/agent/kingdoms-mode.json (stesso
14
+ // pattern di trust.ts: directory di config overridabile via TALOS_CONFIG_DIR).
15
+ // Tutte le transizioni sono IMMUTABILI: si crea un nuovo stato, non si muta.
16
+ // Parola chiave che, presente nel prompt, attiva la modalita'.
17
+ export const KINGDOMS_TRIGGER_KEYWORD = "ultracheck";
18
+ // Stato iniziale: modalita' spenta.
19
+ export const DEFAULT_KINGDOMS_MODE_STATE = {
20
+ enabled: false,
21
+ source: "default",
22
+ updatedAt: "",
23
+ };
24
+ // Path del file di stato persistito. Override della dir via TALOS_CONFIG_DIR
25
+ // (parita' con trust.ts), altrimenti ~/.talos/agent.
26
+ export function kingdomsModeFile(env) {
27
+ const override = env["TALOS_CONFIG_DIR"];
28
+ const base = override ? override : join(homedir(), ".talos", "agent");
29
+ return join(base, "kingdoms-mode.json");
30
+ }
31
+ function coerceSource(value) {
32
+ return value === "keyword" || value === "manual" || value === "stored" || value === "default"
33
+ ? value
34
+ : "stored";
35
+ }
36
+ // Normalizza un oggetto sconosciuto in uno stato valido (difensivo verso JSON
37
+ // corrotti o di versioni precedenti).
38
+ function coerceState(raw, source) {
39
+ if (typeof raw !== "object" || raw === null)
40
+ return DEFAULT_KINGDOMS_MODE_STATE;
41
+ const obj = raw;
42
+ return {
43
+ enabled: obj["enabled"] === true,
44
+ source: coerceSource(obj["source"]),
45
+ updatedAt: typeof obj["updatedAt"] === "string" ? obj["updatedAt"] : "",
46
+ };
47
+ }
48
+ // Legge lo stato persistito. Ritorna lo stato di default se assente/illeggibile.
49
+ export function readKingdomsModeState(env) {
50
+ const file = kingdomsModeFile(env);
51
+ if (!existsSync(file))
52
+ return DEFAULT_KINGDOMS_MODE_STATE;
53
+ try {
54
+ const raw = JSON.parse(readFileSync(file, "utf8"));
55
+ return coerceState(raw, "stored");
56
+ }
57
+ catch {
58
+ return DEFAULT_KINGDOMS_MODE_STATE;
59
+ }
60
+ }
61
+ // Persiste lo stato su disco (crea la directory se serve). Ritorna lo stato
62
+ // scritto (per concatenare). Operazione idempotente.
63
+ export function writeKingdomsModeState(env, state) {
64
+ const file = kingdomsModeFile(env);
65
+ mkdirSync(dirname(file), { recursive: true });
66
+ writeFileSync(file, JSON.stringify(state, null, 2) + "\n", "utf8");
67
+ return state;
68
+ }
69
+ // --- Query -----------------------------------------------------------------
70
+ export function isKingdomsModeEnabled(state) {
71
+ return state.enabled;
72
+ }
73
+ // --- Transizioni immutabili (puro stato, niente I/O) -----------------------
74
+ function transition(state, enabled, source, now) {
75
+ // Se non cambia nulla, ritorna lo stato invariato (idempotenza, nessun
76
+ // aggiornamento spurio del timestamp).
77
+ if (state.enabled === enabled)
78
+ return state;
79
+ return { enabled, source, updatedAt: now() };
80
+ }
81
+ const isoNow = () => new Date().toISOString();
82
+ // Abilita la modalita'. `source` distingue keyword vs manuale (default manuale).
83
+ export function enableKingdomsMode(state, source = "manual", now = isoNow) {
84
+ return transition(state, true, source, now);
85
+ }
86
+ // Disabilita la modalita'.
87
+ export function disableKingdomsMode(state, source = "manual", now = isoNow) {
88
+ return transition(state, false, source, now);
89
+ }
90
+ // Inverte lo stato corrente (toggle esplicito).
91
+ export function toggleKingdomsMode(state, now = isoNow) {
92
+ return transition(state, !state.enabled, "manual", now);
93
+ }
94
+ // --- Trigger da keyword nel prompt -----------------------------------------
95
+ // True se il testo contiene la keyword di attivazione. Usa il detector esterno
96
+ // se fornito, altrimenti un confronto case-insensitive sulla parola.
97
+ export function promptHasTrigger(text, opts = {}) {
98
+ if (opts.detect)
99
+ return opts.detect(text);
100
+ const keyword = (opts.keyword ?? KINGDOMS_TRIGGER_KEYWORD).toLowerCase();
101
+ if (!keyword)
102
+ return false;
103
+ return text.toLowerCase().includes(keyword);
104
+ }
105
+ // Applica il trigger al prompt: se il prompt contiene la keyword, ATTIVA la
106
+ // modalita' (source="keyword"); altrimenti lascia lo stato invariato. Il
107
+ // trigger non disattiva mai (la presenza/assenza della parola non spegne una
108
+ // modalita' gia' accesa): la disattivazione e' un'azione esplicita.
109
+ export function applyPromptTrigger(state, prompt, opts = {}, now = isoNow) {
110
+ if (!promptHasTrigger(prompt, opts))
111
+ return state;
112
+ return enableKingdomsMode(state, "keyword", now);
113
+ }
114
+ // --- Helper con persistenza (I/O) ------------------------------------------
115
+ // Comodi per i consumer (TUI/agent): leggono, transizionano e ripersistono.
116
+ export function setKingdomsModeEnabled(env, enabled, source = "manual") {
117
+ const current = readKingdomsModeState(env);
118
+ const next = transition(current, enabled, source, isoNow);
119
+ if (next === current)
120
+ return current;
121
+ return writeKingdomsModeState(env, next);
122
+ }
123
+ export function toggleKingdomsModePersisted(env) {
124
+ const current = readKingdomsModeState(env);
125
+ const next = toggleKingdomsMode(current);
126
+ if (next === current)
127
+ return current;
128
+ return writeKingdomsModeState(env, next);
129
+ }
130
+ // Legge lo stato, applica il trigger sul prompt e — se cambia — lo persiste.
131
+ // Ritorna lo stato risultante. Usalo nel flusso del turno per "accendere"
132
+ // Kingdoms Mode appena l'utente scrive 'ultracheck'.
133
+ export function applyPromptTriggerPersisted(env, prompt, opts = {}) {
134
+ const current = readKingdomsModeState(env);
135
+ const next = applyPromptTrigger(current, prompt, opts);
136
+ if (next === current)
137
+ return current;
138
+ return writeKingdomsModeState(env, next);
139
+ }
@@ -0,0 +1,38 @@
1
+ export declare const CHIAVE_PUBBLICA: string;
2
+ export declare const EMITTENTE = "vascend";
3
+ export declare const SCOPO = "offline-entitlement";
4
+ export interface ClaimsProva {
5
+ readonly purpose?: string;
6
+ readonly iss?: string;
7
+ readonly exp?: number;
8
+ readonly nbf?: number;
9
+ readonly email?: string;
10
+ readonly tier?: string;
11
+ }
12
+ export type EsitoProva = {
13
+ readonly ok: true;
14
+ readonly claims: ClaimsProva;
15
+ } | {
16
+ readonly ok: false;
17
+ readonly motivo: string;
18
+ };
19
+ export declare function verificaProva(token: string, chiavePubblicaPem?: string, opts?: {
20
+ adesso?: number;
21
+ emittente?: string;
22
+ }): EsitoProva;
23
+ export declare const TOLLERANZA_INDIETRO_S: number;
24
+ export declare function orologioAttendibile(adesso: number, massimoVisto: number, tolleranza?: number): boolean;
25
+ export declare function nuovoMassimo(adesso: number, massimoVisto: number): number;
26
+ export interface ValutazioneProva {
27
+ readonly ok: boolean;
28
+ readonly motivo?: string;
29
+ readonly claims?: ClaimsProva;
30
+ readonly massimoVisto: number;
31
+ }
32
+ export declare function valuta(p: {
33
+ token: string;
34
+ chiavePubblicaPem?: string;
35
+ adesso?: number;
36
+ massimoVisto?: number;
37
+ emittente?: string;
38
+ }): ValutazioneProva;