@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,109 @@
1
+ // Recall Planner (metodo Danilov, Memory OS).
2
+ //
3
+ // Prima di rispondere, se la richiesta dipende dal PASSATO, Talos costruisce un
4
+ // piccolo piano di recupero: quali domini interrogare, con quale query, con
5
+ // quale budget e soglia. Questo riduce drasticamente l'allucinazione sul
6
+ // passato ("continua da dove eravamo rimasti" non deve mandare solo il working
7
+ // set: deve recuperare decisioni, task aperti, asset, vincoli).
8
+ //
9
+ // Modulo PURO e deterministico: analizza il testo utente (niente LLM, niente
10
+ // rete) e produce un RecallPlan. La materializzazione (chiamata recall) e' del
11
+ // chiamante.
12
+ import { tokenize } from "./lexical-search.js";
13
+ // Marcatori IT/EN che segnalano dipendenza dal passato/continuita'.
14
+ const PAST_MARKERS = [
15
+ /\bcontinu[ai]\b/i,
16
+ /\bripren[dt]/i,
17
+ /\bdove\s+eravamo\b/i,
18
+ /\bcom['e]?\s+rimast/i,
19
+ /\bstato\s+(?:attuale|corrente|precedente)\b/i,
20
+ /\bla\s+volta\s+(?:scorsa|precedente)\b/i,
21
+ /\bgia['\s]/i,
22
+ /\bprecedent/i,
23
+ /\bavevamo\b/i,
24
+ /\bricord/i,
25
+ /\bdecis(?:o|ione|i)\b/i,
26
+ /\bwhere\s+we\s+left\b/i,
27
+ /\bprevious(?:ly)?\b/i,
28
+ /\blast\s+time\b/i,
29
+ /\bremember\b/i,
30
+ /\bresume\b/i,
31
+ /\bso\s+far\b/i,
32
+ ];
33
+ // Parole che orientano verso domini specifici.
34
+ const DOMAIN_HINTS = [
35
+ { re: /\bdecis|decid|scelt|choice|decision/i, domain: "decisions" },
36
+ { re: /\bnota|note|appunt|dossier/i, domain: "notes" },
37
+ { re: /\basset|file|immagin|screenshot|image|document/i, domain: "assets" },
38
+ { re: /\btask|stanz|castell|piano|plan|room|step/i, domain: "plan" },
39
+ { re: /\bvassall|kingdom|regno|team/i, domain: "kingdom" },
40
+ { re: /\bstanz|frontier|room|memoria|recall/i, domain: "rooms" },
41
+ ];
42
+ const DEFAULT_DOMAINS = ["plan", "decisions", "notes", "rooms", "assets"];
43
+ // Costruisce il piano di recupero. Deterministico.
44
+ export function planRecall(input) {
45
+ const text = input.userText ?? "";
46
+ const budget = input.recallBudget && input.recallBudget > 0 ? input.recallBudget : 800;
47
+ const dependsOnPast = input.forceRecall === true || PAST_MARKERS.some((re) => re.test(text));
48
+ if (!dependsOnPast) {
49
+ return {
50
+ needed: false,
51
+ domains: [],
52
+ query: "",
53
+ budgetTokens: 0,
54
+ minScore: 0,
55
+ reason: "richiesta autoconclusiva: nessun riferimento al passato",
56
+ };
57
+ }
58
+ // Domini: quelli suggeriti dai marcatori, con fallback al set di default.
59
+ const hinted = DOMAIN_HINTS.filter((h) => h.re.test(text)).map((h) => h.domain);
60
+ const domains = hinted.length ? unique([...hinted, "decisions"]) : DEFAULT_DOMAINS;
61
+ // Query: termini chiave del testo (rimosse le stop-word) + niente marcatori.
62
+ const queryTokens = tokenize(text).slice(0, 12);
63
+ const query = queryTokens.length ? queryTokens.join(" ") : text.trim().slice(0, 120);
64
+ return {
65
+ needed: true,
66
+ domains,
67
+ query,
68
+ budgetTokens: budget,
69
+ minScore: 0.01,
70
+ reason: "la richiesta dipende dal passato: recupero mirato prima di rispondere",
71
+ };
72
+ }
73
+ // Formatta il piano come blocco Danilov per la zona "recall" del pack.
74
+ export function formatRecallPlan(plan) {
75
+ if (!plan.needed)
76
+ return "";
77
+ return [
78
+ "INDICE",
79
+ "1 = recall_plan",
80
+ "",
81
+ "DEFINIZIONI",
82
+ `@recall[domini]: ${plan.domains.join(", ")}`,
83
+ `@recall[query]: "${plan.query}"`,
84
+ `@recall[budget]: ${plan.budgetTokens} token`,
85
+ `@recall[soglia]: ${plan.minScore}`,
86
+ `@recall[motivo]: "${plan.reason}"`,
87
+ "",
88
+ "OUTPUT: esegui recall sui domini indicati con questa query PRIMA di rispondere; non ricostruire a memoria.",
89
+ ].join("\n");
90
+ }
91
+ function unique(values) {
92
+ return [...new Set(values)];
93
+ }
94
+ // Policy operativa "recall prima di indovinare": blocco testuale da includere
95
+ // nel pack (zona recall/tail). Trasforma la memoria lunga in memoria
96
+ // AFFIDABILE: il modello deve recuperare invece di ricostruire a memoria.
97
+ export const RECALL_FIRST_POLICY = [
98
+ "INDICE",
99
+ "1 = policy_recall",
100
+ "",
101
+ "DEFINIZIONI",
102
+ "@policy[recall_prima]: se la risposta dipende da fatti passati NON presenti negli Evidence Slots, non ricostruire a memoria",
103
+ "@policy[azione]: usa recall <id|query> oppure dichiara esplicitamente che serve recupero",
104
+ "",
105
+ "RELAZIONI",
106
+ "@R: @policy[recall_prima] -> risposta_grounded [ prove prima di affermazioni ]",
107
+ "",
108
+ "OUTPUT: niente allucinazioni sul passato; recall o dichiarazione di memoria insufficiente.",
109
+ ].join("\n");
@@ -0,0 +1,31 @@
1
+ import type { Harness } from "../core/bootstrap.js";
2
+ export type RequirementPriority = "must" | "should" | "could";
3
+ export interface AcceptanceCriterion {
4
+ readonly id: string;
5
+ readonly text: string;
6
+ }
7
+ export interface Requirement {
8
+ readonly id: string;
9
+ readonly text: string;
10
+ readonly priority: RequirementPriority;
11
+ readonly criteria: readonly AcceptanceCriterion[];
12
+ }
13
+ export interface RequirementChecklist {
14
+ readonly goal: string;
15
+ readonly requirements: readonly Requirement[];
16
+ }
17
+ export declare function requirementsEnabled(env: NodeJS.ProcessEnv): boolean;
18
+ export declare function requirementsMax(env: NodeJS.ProcessEnv): number;
19
+ export declare function judgeRequirements(opts: {
20
+ readonly harness: Harness;
21
+ readonly goal: string;
22
+ readonly signal: AbortSignal;
23
+ readonly env?: NodeJS.ProcessEnv;
24
+ }): Promise<RequirementChecklist>;
25
+ export declare function parseChecklist(goal: string, text: string, max?: number): RequirementChecklist;
26
+ export declare function buildRequirementsBlock(checklist: RequirementChecklist): string;
27
+ export declare function requirementsSummary(checklist: RequirementChecklist): {
28
+ readonly total: number;
29
+ readonly must: number;
30
+ readonly criteria: number;
31
+ };
@@ -0,0 +1,151 @@
1
+ // Estrazione abilitata di default; off via env (parita' con completeness).
2
+ export function requirementsEnabled(env) {
3
+ const v = (env["TALOS_REQUIREMENTS"] ?? "").trim().toLowerCase();
4
+ return !(v === "0" || v === "off" || v === "false" || v === "no");
5
+ }
6
+ // Tetto al numero di requisiti estratti (anti-esplosione). Default 12.
7
+ export function requirementsMax(env) {
8
+ const n = Number(env["TALOS_REQUIREMENTS_MAX"]);
9
+ return Number.isInteger(n) && n >= 1 ? n : 12;
10
+ }
11
+ const EXTRACTOR_SYSTEM = `# Estrattore di requisiti
12
+ INDICE
13
+ 1 = obiettivo
14
+ 2 = requisito
15
+ 3 = criterio
16
+
17
+ DEFINIZIONI
18
+ @obiettivo[fonte]: la richiesta dell'utente, da scomporre senza inventare
19
+ @requisito[misurabile]: cosa va consegnato, in forma OSSERVABILE e verificabile; priorita' must/should/could
20
+ @criterio[accettazione]: condizione BINARIA (vera/falsa) che prova il requisito soddisfatto; concreta, non vaga
21
+ @rigore[essenziale]: SOLO requisiti realmente impliciti/espliciti nel goal; niente nice-to-have, niente perfezionismo
22
+
23
+ RELAZIONI
24
+ @R1: @obiettivo[fonte] -> @requisito[misurabile] [ scomponi il goal in requisiti misurabili ]
25
+ @R2: @requisito[misurabile] -> @criterio[accettazione] [ ogni requisito ha 1+ criteri verificabili ]
26
+
27
+ OUTPUT: SOLO JSON {"requirements": [{"id": "R1", "text": "...", "priority": "must|should|could", "criteria": [{"id": "R1.1", "text": "..."}]}]}. Niente prosa, niente markdown.`;
28
+ // Estrae la checklist dall'obiettivo via LLM. Se non c'e' provider o l'estrazione
29
+ // fallisce, ritorna una checklist vuota (non bloccante).
30
+ export async function judgeRequirements(opts) {
31
+ const { harness, goal, signal } = opts;
32
+ const resolved = harness.providers.resolve(harness.config.model);
33
+ if (!resolved)
34
+ return { goal, requirements: [] };
35
+ const max = requirementsMax(opts.env ?? process.env);
36
+ const user = `OBIETTIVO dell'utente:\n${goal}\n\n` +
37
+ `Estrai una checklist di al massimo ${max} requisiti MISURABILI, ognuno con i suoi ` +
38
+ `criteri di accettazione verificabili. Rispondi SOLO JSON ` +
39
+ `{"requirements": [{"id","text","priority","criteria":[{"id","text"}]}]}.`;
40
+ try {
41
+ const res = await resolved.provider.complete({
42
+ system: EXTRACTOR_SYSTEM,
43
+ messages: [{ role: "user", content: [{ type: "text", text: user }] }],
44
+ tools: [],
45
+ model: resolved.modelId,
46
+ maxTokens: harness.config.maxTokens,
47
+ signal,
48
+ sessionId: `requirements-${harness.session.id}`,
49
+ });
50
+ return parseChecklist(goal, res.text, max);
51
+ }
52
+ catch {
53
+ return { goal, requirements: [] }; // in dubbio non bloccare
54
+ }
55
+ }
56
+ const PRIORITIES = new Set(["must", "should", "could"]);
57
+ function normalizePriority(v) {
58
+ const s = String(v ?? "").trim().toLowerCase();
59
+ return PRIORITIES.has(s) ? s : "must";
60
+ }
61
+ function normalizeCriteria(raw, reqId) {
62
+ if (!Array.isArray(raw))
63
+ return [];
64
+ const out = [];
65
+ for (const c of raw) {
66
+ const text = String(c?.text ?? (typeof c === "string" ? c : "")).trim();
67
+ if (!text)
68
+ continue;
69
+ const rawId = String(c?.id ?? "").trim();
70
+ const id = rawId || `${reqId}.${out.length + 1}`;
71
+ out.push({ id, text });
72
+ if (out.length >= 12)
73
+ break;
74
+ }
75
+ return out;
76
+ }
77
+ // Parsing robusto: estrae il primo blocco JSON, normalizza id/priority/criteri,
78
+ // scarta i requisiti senza testo, applica il tetto `max`.
79
+ export function parseChecklist(goal, text, max = 12) {
80
+ const m = /\{[\s\S]*\}/.exec(text);
81
+ if (!m)
82
+ return { goal, requirements: [] };
83
+ try {
84
+ const root = JSON.parse(m[0]);
85
+ const list = Array.isArray(root.requirements) ? root.requirements : [];
86
+ const requirements = [];
87
+ for (const r of list) {
88
+ const obj = r;
89
+ const text = String(obj?.text ?? "").trim();
90
+ if (!text)
91
+ continue;
92
+ const id = String(obj?.id ?? "").trim() || `R${requirements.length + 1}`;
93
+ requirements.push({
94
+ id,
95
+ text,
96
+ priority: normalizePriority(obj?.priority),
97
+ criteria: normalizeCriteria(obj?.criteria, id),
98
+ });
99
+ if (requirements.length >= max)
100
+ break;
101
+ }
102
+ return { goal, requirements };
103
+ }
104
+ catch {
105
+ return { goal, requirements: [] };
106
+ }
107
+ }
108
+ const PRIORITY_TAG = {
109
+ must: "MUST",
110
+ should: "SHOULD",
111
+ could: "COULD",
112
+ };
113
+ // Formatta la checklist in notazione Danilov: utile come blocco di contesto
114
+ // (steer) iniettato all'agente o come `evidence` per il critico di completezza.
115
+ export function buildRequirementsBlock(checklist) {
116
+ const { goal, requirements } = checklist;
117
+ if (requirements.length === 0)
118
+ return "";
119
+ const defs = [];
120
+ const rels = [];
121
+ for (const r of requirements) {
122
+ const crit = r.criteria.map((c) => `${c.id}: ${c.text}`).join(" ; ");
123
+ defs.push(`@${r.id}[${PRIORITY_TAG[r.priority]}]: ${r.text}${crit ? ` -> [ ${crit} ]` : ""}`);
124
+ rels.push(`@R-${r.id}: @${r.id} -> consegna [ soddisfatto sse tutti i criteri ${r.id}.* sono veri ]`);
125
+ }
126
+ return `[VASCEND_REQUISITI]
127
+ INDICE
128
+ 1 = goal
129
+ 2 = requisiti
130
+ 3 = criteri
131
+
132
+ DEFINIZIONI
133
+ @goal[reale]: "${goal.replace(/"/g, "'").slice(0, 200)}"
134
+ ${defs.join("\n")}
135
+
136
+ RELAZIONI
137
+ ${rels.join("\n")}
138
+
139
+ OUTPUT: usa questa checklist come riferimento OGGETTIVO; il goal e' completo sse ogni requisito MUST ha tutti i criteri di accettazione verificati.`;
140
+ }
141
+ // Conteggi sintetici, comodi per status/log.
142
+ export function requirementsSummary(checklist) {
143
+ let must = 0;
144
+ let criteria = 0;
145
+ for (const r of checklist.requirements) {
146
+ if (r.priority === "must")
147
+ must += 1;
148
+ criteria += r.criteria.length;
149
+ }
150
+ return { total: checklist.requirements.length, must, criteria };
151
+ }
@@ -0,0 +1,9 @@
1
+ import type { VascendState } from "./runtime.js";
2
+ export interface ReviewOptions {
3
+ readonly enabled: boolean;
4
+ readonly minRooms: number;
5
+ }
6
+ export declare function reviewOptions(env: NodeJS.ProcessEnv): ReviewOptions;
7
+ export declare function shouldReview(state: VascendState, minRooms: number): boolean;
8
+ export declare function buildRoomMetricsDigest(state: VascendState): string;
9
+ export declare function buildReviewerPrompt(digest: string): string;
@@ -0,0 +1,93 @@
1
+ export function reviewOptions(env) {
2
+ const flag = (env["TALOS_REVIEWER"] ?? "").trim().toLowerCase();
3
+ const enabled = !(flag === "0" || flag === "off" || flag === "false" || flag === "no");
4
+ const n = Number(env["TALOS_REVIEWER_MIN_ROOMS"]);
5
+ const minRooms = Number.isFinite(n) && n >= 2 ? n : 5;
6
+ return { enabled, minRooms };
7
+ }
8
+ function done(c) { return c.tasks.filter((t) => t.status === "completed"); }
9
+ function open(c) { return c.tasks.filter((t) => t.status === "pending" || t.status === "running"); }
10
+ // Vale la pena revisionare? Regno complesso (>= minRooms stanze), con almeno una
11
+ // stanza fatta E almeno una ancora da fare (cosi' la revisione puo' incidere).
12
+ export function shouldReview(state, minRooms) {
13
+ const rooms = state.kingdom.castles.flatMap((c) => c.tasks);
14
+ if (rooms.length < minRooms)
15
+ return false;
16
+ const anyDone = rooms.some((t) => t.status === "completed");
17
+ const anyOpen = rooms.some((t) => t.status === "pending" || t.status === "running");
18
+ return anyDone && anyOpen;
19
+ }
20
+ function fmtMs(ms) {
21
+ if (ms === undefined)
22
+ return "?";
23
+ return ms < 1000 ? `${ms}ms` : `${Math.round(ms / 1000)}s`;
24
+ }
25
+ function fmtTok(n) {
26
+ if (n === undefined)
27
+ return "?";
28
+ if (n >= 1000) {
29
+ const v = n / 1000;
30
+ return `${v >= 10 ? Math.round(v) : v.toFixed(1)}k`;
31
+ }
32
+ return `${n}`;
33
+ }
34
+ // Digest strutturato delle metriche per il revisore.
35
+ export function buildRoomMetricsDigest(state) {
36
+ const lines = [];
37
+ for (const c of state.kingdom.castles) {
38
+ const d = done(c);
39
+ const o = open(c);
40
+ lines.push(`@gruppo[${c.slug}]: titolo="${c.title}", fatte=${d.length}/${c.tasks.length}${c.after ? `, dopo=${c.after}` : ""}`);
41
+ if (c.notes?.length)
42
+ lines.push(` note_gruppo: ${c.notes.join(" | ")}`);
43
+ for (const t of d) {
44
+ const note = t.notes?.length ? ` · note: ${t.notes.join(" | ")}` : "";
45
+ const sk = t.skills?.length ? ` · skill: ${t.skills.join(",")}` : "";
46
+ lines.push(` fatta ${t.id} "${t.title}" · ↓${fmtTok(t.tokens)} · ${fmtMs(t.ms)}${sk}${note}`);
47
+ }
48
+ for (const t of o) {
49
+ const sk = t.skills?.length ? ` · skill: ${t.skills.join(",")}` : "";
50
+ const w = t.weight ? ` · peso ${t.weight}` : "";
51
+ lines.push(` da_fare ${t.id} "${t.title}"${w}${sk}`);
52
+ }
53
+ // Sintesi metriche del castello.
54
+ const withTok = d.filter((t) => t.tokens !== undefined);
55
+ if (withTok.length) {
56
+ const tot = withTok.reduce((s, t) => s + (t.tokens ?? 0), 0);
57
+ const avg = Math.round(tot / withTok.length);
58
+ const top = withTok.reduce((m, t) => ((t.tokens ?? 0) > (m.tokens ?? 0) ? t : m), withTok[0]);
59
+ lines.push(` metriche: totale ↓${fmtTok(tot)}, media ↓${fmtTok(avg)}/attivita, piu' costosa ${top.id} (↓${fmtTok(top.tokens)})`);
60
+ }
61
+ }
62
+ return lines.join("\n");
63
+ }
64
+ // Prompt del revisore: analizza le metriche e migliora SOLO le stanze rimaste.
65
+ export function buildReviewerPrompt(digest) {
66
+ return `[VASCEND_REVISIONE]
67
+ Sei il REVISORE del team (piano di lavoro). NON rifai il lavoro gia' fatto: analizzi
68
+ le attivita completate (token e durata) e le note, e migliori SOLO le attivita rimaste.
69
+
70
+ INDICE
71
+ 1 = metriche
72
+ 2 = analisi
73
+ 3 = azione
74
+
75
+ DEFINIZIONI
76
+ @metriche[piano]: digest sotto (attivita fatte con token/durata + attivita da fare)
77
+ @analisi[obiettivo]: trova attivita costose/lente, lavoro ridondante, passi mancanti
78
+ @azione[consentite]: vascend_addtasks (aggiungi attivita rimaste), vascend_note (annota analisi/ordine consigliato sulle attivita o sul gruppo), vascend_skill (abbina skill utili in anticipo). Per il dettaglio di una attivita fatta usa recall.
79
+
80
+ RELAZIONI
81
+ @R1: @metriche[piano] -> @analisi[obiettivo] [ leggi prima di agire ]
82
+ @R2: @analisi[obiettivo] -> @azione[consentite] [ agisci solo sulle attivita da fare ]
83
+
84
+ REGOLE
85
+ - NON marcare attivita (niente vascend_mark) e NON eseguire il lavoro: solo revisione e riorganizzazione.
86
+ - Sii conciso: poche azioni mirate. Se il piano e' gia' ottimale, dillo in una riga e fermati.
87
+ - Usa le note per indicare l'ORDINE ottimale delle attivita rimaste (non puoi riordinare i bit).
88
+
89
+ METRICHE
90
+ ${digest}
91
+
92
+ OUTPUT: una breve sintesi in notazione + le azioni (addrooms/note/skill) applicate alle sole attivita rimaste.`;
93
+ }
@@ -0,0 +1,29 @@
1
+ import type { RoomRecord } from "./room-memory.js";
2
+ export type RoomEdgeRel = "tocca" | "usa";
3
+ export type RoomEdgeKind = "file" | "tool";
4
+ export interface RoomEdge {
5
+ readonly rel: RoomEdgeRel;
6
+ readonly kind: RoomEdgeKind;
7
+ readonly target: string;
8
+ }
9
+ export declare function roomEdges(files: readonly string[], tools: readonly string[]): readonly RoomEdge[];
10
+ export declare function edgesOf(record: RoomRecord): readonly RoomEdge[];
11
+ export declare function filesOf(record: RoomRecord): readonly string[];
12
+ export interface RoomNeighbor {
13
+ readonly room: string;
14
+ readonly shared: number;
15
+ readonly via: readonly string[];
16
+ }
17
+ export declare class RoomGraph {
18
+ private readonly byTarget;
19
+ private readonly byRoom;
20
+ private constructor();
21
+ static build(records: readonly RoomRecord[]): RoomGraph;
22
+ targets(room: string): readonly string[];
23
+ roomsTouching(target: string): readonly string[];
24
+ neighbors(room: string, limit?: number): readonly RoomNeighbor[];
25
+ }
26
+ export declare function affinity(a: RoomRecord, b: RoomRecord): number;
27
+ export declare function clusterByAffinity(nodes: readonly RoomRecord[], size: number): readonly (readonly RoomRecord[])[];
28
+ export declare function clusterLabel(group: readonly RoomRecord[]): string;
29
+ export declare function topTerms(group: readonly RoomRecord[], limit: number): readonly string[];
@@ -0,0 +1,242 @@
1
+ // Grafo della memoria delle stanze (metodo Danilov, Memory OS).
2
+ //
3
+ // La gerarchia stanza -> castello -> regno risponde a "dove sta questo nel
4
+ // tempo". Non risponde a "cosa c'entra con cosa": l'unica relazione persistita
5
+ // era `contains`, quindi due stanze che lavorano sullo STESSO file restavano
6
+ // estranee, raggiungibili solo per coincidenza lessicale.
7
+ //
8
+ // Questo modulo aggiunge il secondo asse: gli ARCHI TIPIZZATI.
9
+ //
10
+ // stanza --tocca--> file (dai path dei tool call)
11
+ // stanza --usa-----> tool (dai nomi dei tool)
12
+ // stanza --vicina--> stanza (derivata: 2 hop attraverso un file comune)
13
+ //
14
+ // Serve a due cose, entrambe misurabili:
15
+ // 1) recall che TRAVERSA (chi altro ha toccato questo file?) invece di
16
+ // sperare che le parole coincidano;
17
+ // 2) rollup per AFFINITA' invece che per ordine di arrivo, cosi' un castello
18
+ // e' un'unita' di senso e non una fetta di tempo.
19
+ //
20
+ // Modulo PURO: nessun I/O, nessuna dipendenza a runtime, deterministico.
21
+ import { STOP } from "./lexical-search.js";
22
+ // Quanti archi al massimo per stanza e per tipo: un turno che tocca 200 file
23
+ // non deve gonfiare il record ne' dominare il grafo.
24
+ const MAX_EDGES_PER_KIND = 12;
25
+ export function roomEdges(files, tools) {
26
+ const seen = new Set();
27
+ const out = [];
28
+ for (const file of files.slice(0, MAX_EDGES_PER_KIND)) {
29
+ const target = normalizeTarget(file);
30
+ if (!target || seen.has(`f:${target}`))
31
+ continue;
32
+ seen.add(`f:${target}`);
33
+ out.push({ rel: "tocca", kind: "file", target });
34
+ }
35
+ for (const tool of tools.slice(0, MAX_EDGES_PER_KIND)) {
36
+ const target = tool.trim();
37
+ if (!target || seen.has(`t:${target}`))
38
+ continue;
39
+ seen.add(`t:${target}`);
40
+ out.push({ rel: "usa", kind: "tool", target });
41
+ }
42
+ return out;
43
+ }
44
+ // Archi di un record. Gli store scritti PRIMA di questa versione non hanno il
45
+ // campo `edges`: li si ricava dal corpo Danilov, cosi' anche le sessioni
46
+ // storiche entrano nel grafo senza migrazione.
47
+ export function edgesOf(record) {
48
+ if (record.edges && record.edges.length)
49
+ return record.edges;
50
+ const files = [];
51
+ for (const m of record.body.matchAll(/@file\[[^\]]*\]:\s*(.+)/g)) {
52
+ const value = (m[1] ?? "").trim();
53
+ if (value)
54
+ files.push(value);
55
+ }
56
+ const tools = [];
57
+ for (const m of record.body.matchAll(/@tool\[[^\]]*\]:\s*([a-zA-Z0-9_.-]+)\(/g)) {
58
+ const value = (m[1] ?? "").trim();
59
+ if (value)
60
+ tools.push(value);
61
+ }
62
+ return roomEdges(files, tools);
63
+ }
64
+ export function filesOf(record) {
65
+ return edgesOf(record).filter((e) => e.kind === "file").map((e) => e.target);
66
+ }
67
+ // Indice del grafo: file -> stanze che lo toccano, e vicinato a 2 hop.
68
+ export class RoomGraph {
69
+ byTarget = new Map();
70
+ byRoom = new Map();
71
+ constructor(records) {
72
+ for (const record of records) {
73
+ if (record.level !== 0)
74
+ continue; // il grafo vive sulle stanze, non sugli indici
75
+ const targets = filesOf(record);
76
+ if (!targets.length)
77
+ continue;
78
+ this.byRoom.set(record.room, targets);
79
+ for (const target of targets) {
80
+ const list = this.byTarget.get(target);
81
+ if (list)
82
+ list.push(record.room);
83
+ else
84
+ this.byTarget.set(target, [record.room]);
85
+ }
86
+ }
87
+ }
88
+ static build(records) {
89
+ return new RoomGraph(records);
90
+ }
91
+ targets(room) {
92
+ return this.byRoom.get(room) ?? [];
93
+ }
94
+ roomsTouching(target) {
95
+ return this.byTarget.get(normalizeTarget(target)) ?? [];
96
+ }
97
+ // Vicinato a 2 hop: stanza -> file -> altre stanze. Ordinato per numero di
98
+ // target condivisi (poi per id, per determinismo).
99
+ neighbors(room, limit = 8) {
100
+ const targets = this.byRoom.get(room);
101
+ if (!targets?.length)
102
+ return [];
103
+ const hits = new Map();
104
+ for (const target of targets) {
105
+ for (const other of this.byTarget.get(target) ?? []) {
106
+ if (other === room)
107
+ continue;
108
+ const via = hits.get(other);
109
+ if (via)
110
+ via.push(target);
111
+ else
112
+ hits.set(other, [target]);
113
+ }
114
+ }
115
+ return [...hits.entries()]
116
+ .map(([id, via]) => ({ room: id, shared: via.length, via: [...via] }))
117
+ .sort((a, b) => b.shared - a.shared || a.room.localeCompare(b.room))
118
+ .slice(0, limit);
119
+ }
120
+ }
121
+ // --- affinita' e clustering --------------------------------------------------
122
+ // Affinita' fra due nodi: meta' dai termini indicizzati, meta' dai file
123
+ // toccati. In [0,1], simmetrica, deterministica.
124
+ export function affinity(a, b) {
125
+ return 0.5 * jaccard(a.terms, b.terms) + 0.5 * jaccard(filesOf(a), filesOf(b));
126
+ }
127
+ // Raggruppa i nodi in gruppi di ESATTAMENTE `size` per affinita'. Il gruppo
128
+ // parte dal nodo con la massa di affinita' piu' alta (il centro del grappolo
129
+ // piu' denso) e attira i piu' simili; i nodi che avanzano restano fuori.
130
+ // Mantenere la dimensione fissa preserva la garanzia della gerarchia: il
131
+ // contesto vivo resta limitato a ~fanout*livelli voci.
132
+ export function clusterByAffinity(nodes, size) {
133
+ if (size < 2 || nodes.length < size)
134
+ return [];
135
+ const pool = [...nodes];
136
+ const groups = [];
137
+ while (pool.length >= size) {
138
+ // Ancoraggio: il nodo PIU' VECCHIO ancora libero. Provata anche la
139
+ // partenza dal grappolo piu' denso: e' peggiore (purezza 0.70 contro 0.90
140
+ // sul bench rollup-quality), perche' svuota il centro e lascia una coda di
141
+ // avanzi scorrelati. Partire dal piu' vecchio drena l'archivio in ordine e
142
+ // sfrutta il fatto che il lavoro e' gia' raggruppato nel tempo.
143
+ const anchor = pool[0];
144
+ // Crescita per CENTROIDE: a ogni passo entra il nodo piu' affine al gruppo
145
+ // gia' formato, non al solo ancoraggio. Un gruppo a stella intorno a una
146
+ // sola stanza raccoglie i suoi vicini anche quando sono scorrelati fra
147
+ // loro; crescendo sul centroide il grappolo resta coeso.
148
+ const chosen = [anchor];
149
+ const rest = pool.filter((n) => n.room !== anchor.room);
150
+ while (chosen.length < size && rest.length) {
151
+ let best = 0;
152
+ let bestScore = -1;
153
+ rest.forEach((candidate, i) => {
154
+ const score = chosen.reduce((acc, member) => acc + affinity(member, candidate), 0) / chosen.length;
155
+ const incumbent = rest[best];
156
+ if (score > bestScore ||
157
+ (score === bestScore &&
158
+ (candidate.createdAt < incumbent.createdAt ||
159
+ (candidate.createdAt === incumbent.createdAt && candidate.room.localeCompare(incumbent.room) < 0)))) {
160
+ best = i;
161
+ bestScore = score;
162
+ }
163
+ });
164
+ chosen.push(rest.splice(best, 1)[0]);
165
+ }
166
+ const group = chosen.slice().sort((a, b) => a.createdAt - b.createdAt || a.room.localeCompare(b.room));
167
+ groups.push(group);
168
+ const taken = new Set(group.map((g) => g.room));
169
+ for (let i = pool.length - 1; i >= 0; i -= 1) {
170
+ if (taken.has(pool[i].room))
171
+ pool.splice(i, 1);
172
+ }
173
+ }
174
+ return groups;
175
+ }
176
+ // Etichetta ONESTA di un gruppo: l'area comune dei file piu' i termini
177
+ // ricorrenti. Sostituisce "titolo del primo figlio + ... +7", che annunciava
178
+ // un castello col nome di un ottavo del suo contenuto.
179
+ export function clusterLabel(group) {
180
+ const area = commonArea(group.flatMap((r) => filesOf(r)));
181
+ const terms = topTerms(group, 4);
182
+ const head = area ? `${area}` : terms.slice(0, 2).join(", ");
183
+ const tail = terms.length ? terms.join(", ") : group[0]?.title ?? "";
184
+ if (head && tail && head !== tail)
185
+ return `${head}: ${tail}`;
186
+ return head || tail || "gruppo";
187
+ }
188
+ // Termini piu' frequenti nel gruppo (esclusi quelli presenti una volta sola
189
+ // quando il gruppo e' ampio): descrivono il gruppo, non un suo membro.
190
+ export function topTerms(group, limit) {
191
+ const counts = new Map();
192
+ for (const record of group) {
193
+ for (const term of new Set(record.terms)) {
194
+ if (STOP.has(term))
195
+ continue;
196
+ counts.set(term, (counts.get(term) ?? 0) + 1);
197
+ }
198
+ }
199
+ const min = group.length >= 4 ? 2 : 1;
200
+ return [...counts.entries()]
201
+ .filter(([, n]) => n >= min)
202
+ .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
203
+ .slice(0, limit)
204
+ .map(([term]) => term);
205
+ }
206
+ // Prefisso di cartella condiviso dalla maggioranza dei file (almeno meta').
207
+ function commonArea(files) {
208
+ if (!files.length)
209
+ return "";
210
+ const counts = new Map();
211
+ for (const file of files) {
212
+ const parts = normalizeTarget(file).split("/");
213
+ parts.pop();
214
+ for (let i = 1; i <= parts.length; i += 1) {
215
+ const prefix = parts.slice(0, i).join("/");
216
+ if (prefix)
217
+ counts.set(prefix, (counts.get(prefix) ?? 0) + 1);
218
+ }
219
+ }
220
+ const half = files.length / 2;
221
+ const best = [...counts.entries()]
222
+ .filter(([, n]) => n >= half)
223
+ .sort((a, b) => b[0].length - a[0].length || b[1] - a[1] || a[0].localeCompare(b[0]))[0];
224
+ return best?.[0] ?? "";
225
+ }
226
+ function jaccard(a, b) {
227
+ if (!a.length && !b.length)
228
+ return 0;
229
+ const sa = new Set(a);
230
+ const sb = new Set(b);
231
+ let inter = 0;
232
+ for (const value of sa)
233
+ if (sb.has(value))
234
+ inter += 1;
235
+ const union = new Set([...sa, ...sb]).size;
236
+ return union ? inter / union : 0;
237
+ }
238
+ // Path normalizzato: separatori POSIX, niente "./" iniziale. Due stanze che
239
+ // hanno scritto "src\\a.ts" e "src/a.ts" devono finire sullo stesso nodo file.
240
+ function normalizeTarget(value) {
241
+ return value.trim().replace(/\\/g, "/").replace(/^\.\//, "");
242
+ }