@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,273 @@
1
+ import { appendFileSync, closeSync, existsSync, openSync, readFileSync, readSync, readdirSync, statSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { withLockSync } from "./file-lock.js";
4
+ export function listMemoryScopes(sessionDir, opts = {}) {
5
+ if (!existsSync(sessionDir))
6
+ return [];
7
+ const suffixes = [".memory.events.jsonl", ".rooms.jsonl", ".decisions.jsonl", ".castle.json", ".vision.json"];
8
+ const scopes = new Map();
9
+ let files = [];
10
+ try {
11
+ files = readdirSync(sessionDir);
12
+ }
13
+ catch {
14
+ return [];
15
+ }
16
+ for (const file of files) {
17
+ const suffix = suffixes.find((s) => file.endsWith(s));
18
+ if (!suffix)
19
+ continue;
20
+ const scopeId = file.slice(0, -suffix.length);
21
+ if (!scopeId || scopeId === opts.excludeScope)
22
+ continue;
23
+ let mtime = 0;
24
+ try {
25
+ mtime = statSync(join(sessionDir, file)).mtimeMs;
26
+ }
27
+ catch {
28
+ // best effort
29
+ }
30
+ scopes.set(scopeId, Math.max(scopes.get(scopeId) ?? 0, mtime));
31
+ }
32
+ const limit = opts.limit && opts.limit > 0 ? opts.limit : 12;
33
+ return [...scopes.entries()]
34
+ .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
35
+ .slice(0, limit)
36
+ .map(([scopeId]) => scopeId);
37
+ }
38
+ export class MemoryStore {
39
+ file;
40
+ events = [];
41
+ ids = new Set();
42
+ maxNumericId = 0;
43
+ loadedBytes = 0;
44
+ partialLine = "";
45
+ docTokens = [];
46
+ globalDf = new Map();
47
+ constructor(file) {
48
+ this.file = file;
49
+ }
50
+ static open(sessionDir, scopeId) {
51
+ const store = new MemoryStore(join(sessionDir, `${scopeId}.memory.events.jsonl`));
52
+ store.reloadFromDisk();
53
+ return store;
54
+ }
55
+ count() {
56
+ return this.events.length;
57
+ }
58
+ all() {
59
+ return this.events;
60
+ }
61
+ append(input) {
62
+ // L'istanza puo' essere stale: in Kingdoms Mode piu' processi aprono lo
63
+ // stesso store e scrivono in parallelo. Il lock copre l'intera transazione
64
+ // reload -> assegna id -> append, cosi' due writer non possono scegliere lo
65
+ // stesso E<n> ne' interlacciare le righe JSONL.
66
+ return withLockSync(this.file, () => {
67
+ this.reloadTailFromDisk();
68
+ const id = input.id ?? this.nextId();
69
+ if (this.ids.has(id.toUpperCase())) {
70
+ throw new Error(`memory-store: id duplicato ${id}`);
71
+ }
72
+ const event = normalizeEvent({
73
+ ...input,
74
+ id,
75
+ createdAt: input.createdAt ?? Date.now(),
76
+ });
77
+ const line = JSON.stringify(event) + "\n";
78
+ appendFileSync(this.file, line, "utf8");
79
+ this.loadedBytes += Buffer.byteLength(line, "utf8");
80
+ this.addEvent(event);
81
+ return event;
82
+ });
83
+ }
84
+ query(q = {}) {
85
+ const out = this.events.filter((e) => {
86
+ if (q.domain && e.domain !== q.domain)
87
+ return false;
88
+ if (q.type && e.type !== q.type)
89
+ return false;
90
+ if (q.subject && e.subject.toLowerCase() !== q.subject.toLowerCase())
91
+ return false;
92
+ return true;
93
+ });
94
+ return typeof q.limit === "number" && q.limit > 0 ? out.slice(0, q.limit) : out;
95
+ }
96
+ byIds(ids) {
97
+ const want = new Set(ids.map((id) => id.toUpperCase()));
98
+ return this.events.filter((e) => want.has(e.id.toUpperCase()));
99
+ }
100
+ search(query, opts = {}) {
101
+ const limit = opts.limit && opts.limit > 0 ? opts.limit : 5;
102
+ const pool = this.query({ domain: opts.domain, type: opts.type });
103
+ const qTokens = unique(tokenize(query));
104
+ if (!qTokens.length) {
105
+ return pool.slice(-limit).reverse().map((event) => ({ event, score: 0 }));
106
+ }
107
+ const n = pool.length || 1;
108
+ const unfiltered = !opts.domain && !opts.type && pool.length === this.events.length;
109
+ const df = unfiltered ? this.globalDf : new Map();
110
+ const docTokens = unfiltered ? this.docTokens : pool.map((e) => {
111
+ const toks = tokensForEvent(e);
112
+ for (const t of new Set(toks))
113
+ df.set(t, (df.get(t) ?? 0) + 1);
114
+ return toks;
115
+ });
116
+ const hits = pool.map((event, i) => {
117
+ const toks = docTokens[i] ?? [];
118
+ const tf = new Map();
119
+ for (const t of toks)
120
+ tf.set(t, (tf.get(t) ?? 0) + 1);
121
+ let score = 0;
122
+ for (const q of qTokens) {
123
+ const f = tf.get(q) ?? 0;
124
+ if (!f)
125
+ continue;
126
+ score += (f / (f + 1.2)) * Math.log(1 + n / (df.get(q) ?? 1));
127
+ }
128
+ return { event, score };
129
+ });
130
+ return hits.filter((h) => h.score > 0).sort((a, b) => b.score - a.score).slice(0, limit);
131
+ }
132
+ nextId() {
133
+ return `E${this.maxNumericId + 1}`;
134
+ }
135
+ // Ricarica la vista autoritativa. Chiamata sia all'apertura sia, sotto lock,
136
+ // prima di ogni append per includere le righe scritte dagli altri processi.
137
+ reloadFromDisk() {
138
+ this.resetIndexes();
139
+ if (!existsSync(this.file)) {
140
+ return;
141
+ }
142
+ const raw = readFileSync(this.file, "utf8");
143
+ const lines = raw.split("\n");
144
+ this.partialLine = raw.endsWith("\n") ? "" : (lines.pop() ?? "");
145
+ for (const line of lines) {
146
+ if (!line.trim())
147
+ continue;
148
+ try {
149
+ this.addEvent(normalizeEvent(JSON.parse(line)));
150
+ }
151
+ catch {
152
+ // riga corrotta: ignorata, il log resta recuperabile.
153
+ }
154
+ }
155
+ this.loadedBytes = Buffer.byteLength(raw, "utf8");
156
+ }
157
+ // Sotto lock legge soltanto i byte aggiunti da writer concorrenti. Il costo
158
+ // di append passa da O(N) per evento a O(delta), mantenendo ID univoci.
159
+ reloadTailFromDisk() {
160
+ if (!existsSync(this.file)) {
161
+ if (this.loadedBytes || this.events.length)
162
+ this.resetIndexes();
163
+ return;
164
+ }
165
+ const size = statSync(this.file).size;
166
+ if (size < this.loadedBytes) {
167
+ this.reloadFromDisk();
168
+ return;
169
+ }
170
+ if (size === this.loadedBytes)
171
+ return;
172
+ const length = size - this.loadedBytes;
173
+ const buffer = Buffer.allocUnsafe(length);
174
+ const fd = openSync(this.file, "r");
175
+ let read = 0;
176
+ try {
177
+ while (read < length) {
178
+ const n = readSync(fd, buffer, read, length - read, this.loadedBytes + read);
179
+ if (n <= 0)
180
+ break;
181
+ read += n;
182
+ }
183
+ }
184
+ finally {
185
+ closeSync(fd);
186
+ }
187
+ this.loadedBytes += read;
188
+ const combined = this.partialLine + buffer.subarray(0, read).toString("utf8");
189
+ const lines = combined.split("\n");
190
+ this.partialLine = lines.pop() ?? "";
191
+ for (const line of lines) {
192
+ if (!line.trim())
193
+ continue;
194
+ try {
195
+ const event = normalizeEvent(JSON.parse(line));
196
+ if (!this.ids.has(event.id.toUpperCase()))
197
+ this.addEvent(event);
198
+ }
199
+ catch {
200
+ // Una riga corrotta non impedisce di acquisire quelle successive.
201
+ }
202
+ }
203
+ }
204
+ resetIndexes() {
205
+ this.events = [];
206
+ this.ids.clear();
207
+ this.maxNumericId = 0;
208
+ this.loadedBytes = 0;
209
+ this.partialLine = "";
210
+ this.docTokens = [];
211
+ this.globalDf.clear();
212
+ }
213
+ addEvent(event) {
214
+ const key = event.id.toUpperCase();
215
+ if (this.ids.has(key))
216
+ return;
217
+ this.ids.add(key);
218
+ const numeric = /^E(\d+)$/i.exec(event.id)?.[1];
219
+ if (numeric)
220
+ this.maxNumericId = Math.max(this.maxNumericId, Number(numeric));
221
+ const tokens = tokensForEvent(event);
222
+ this.events.push(event);
223
+ this.docTokens.push(tokens);
224
+ for (const token of new Set(tokens))
225
+ this.globalDf.set(token, (this.globalDf.get(token) ?? 0) + 1);
226
+ }
227
+ }
228
+ function tokensForEvent(event) {
229
+ return tokenize(`${event.terms.join(" ")} ${event.subject} ${event.summary} ${event.body}`);
230
+ }
231
+ function normalizeEvent(raw) {
232
+ return {
233
+ id: stringValue(raw.id, "E?"),
234
+ type: stringValue(raw.type, "memory.unknown"),
235
+ domain: stringValue(raw.domain, "system"),
236
+ subject: stringValue(raw.subject, ""),
237
+ summary: stringValue(raw.summary, ""),
238
+ body: stringValue(raw.body, ""),
239
+ terms: Array.isArray(raw.terms) ? cleanTerms(raw.terms.map(String)) : [],
240
+ links: Array.isArray(raw.links) ? raw.links.map(normalizeLink).filter((l) => l.target) : [],
241
+ payload: isRecord(raw.payload) ? raw.payload : {},
242
+ createdAt: typeof raw.createdAt === "number" ? raw.createdAt : 0,
243
+ };
244
+ }
245
+ function normalizeLink(raw) {
246
+ const r = isRecord(raw) ? raw : {};
247
+ const domain = stringValue(r["domain"], "");
248
+ return {
249
+ rel: stringValue(r["rel"], "related"),
250
+ target: stringValue(r["target"], ""),
251
+ ...(domain ? { domain } : {}),
252
+ };
253
+ }
254
+ function stringValue(value, fallback) {
255
+ return typeof value === "string" ? value : value == null ? fallback : String(value);
256
+ }
257
+ function isRecord(value) {
258
+ return typeof value === "object" && value !== null && !Array.isArray(value);
259
+ }
260
+ function tokenize(s) {
261
+ return (s.toLowerCase().match(/[a-z0-9_./-]{2,}/g) ?? []).filter((t) => !STOP.has(t));
262
+ }
263
+ function unique(values) {
264
+ return [...new Set(values.filter(Boolean))];
265
+ }
266
+ function cleanTerms(values) {
267
+ return unique(values.map((t) => t.trim().toLowerCase()).filter((t) => t.length >= 2 && !STOP.has(t)));
268
+ }
269
+ const STOP = new Set([
270
+ "the", "and", "for", "this", "that", "with", "from", "into", "you", "are",
271
+ "il", "lo", "la", "le", "gli", "un", "uno", "una", "di", "da", "in", "su",
272
+ "al", "alla", "del", "della", "dei", "degli", "delle", "che", "con", "per",
273
+ ]);
@@ -0,0 +1,69 @@
1
+ import type { Harness } from "../core/bootstrap.js";
2
+ export interface CouncilVerdictLike {
3
+ readonly complete?: boolean;
4
+ readonly score?: number;
5
+ readonly unmetRequirements?: readonly string[];
6
+ readonly concerns?: readonly string[];
7
+ readonly summary?: string;
8
+ }
9
+ export interface RequirementCriterionLike {
10
+ readonly id?: string;
11
+ readonly text: string;
12
+ }
13
+ export interface RequirementItemLike {
14
+ readonly id?: string;
15
+ readonly text: string;
16
+ readonly priority?: "must" | "should" | "could" | string;
17
+ readonly criteria?: readonly RequirementCriterionLike[];
18
+ }
19
+ export interface RequirementChecklistLike {
20
+ readonly goal?: string;
21
+ readonly requirements?: readonly RequirementItemLike[];
22
+ }
23
+ export interface ResidualSubgoal {
24
+ readonly text: string;
25
+ readonly requirementId?: string;
26
+ readonly priority: "must" | "should" | "could";
27
+ }
28
+ export interface ObjectiveDecision {
29
+ readonly complete: boolean;
30
+ readonly reopen: boolean;
31
+ readonly residuals: readonly ResidualSubgoal[];
32
+ readonly reason: string;
33
+ readonly uncertain?: boolean;
34
+ }
35
+ export declare function objectiveRevisionEnabled(env: NodeJS.ProcessEnv): boolean;
36
+ export declare function objectiveRevisionRounds(env: NodeJS.ProcessEnv): number;
37
+ export declare function objectiveRevisionThreshold(env: NodeJS.ProcessEnv): number;
38
+ export declare function residualsFromRequirements(unmet: readonly string[], checklist?: RequirementChecklistLike): ResidualSubgoal[];
39
+ export declare function decideObjective(opts: {
40
+ readonly verdict?: CouncilVerdictLike;
41
+ readonly checklist?: RequirementChecklistLike;
42
+ readonly threshold?: number;
43
+ }): ObjectiveDecision;
44
+ interface RealCouncilVerdict {
45
+ readonly completion?: number;
46
+ readonly approved?: boolean;
47
+ readonly gaps?: readonly string[];
48
+ readonly dissent?: readonly string[];
49
+ readonly summary?: string;
50
+ }
51
+ export declare function fromCouncilVerdict(v: RealCouncilVerdict | CouncilVerdictLike): CouncilVerdictLike;
52
+ export declare function decideFromCouncil(opts: {
53
+ readonly verdict: RealCouncilVerdict | CouncilVerdictLike;
54
+ readonly checklist?: RequirementChecklistLike;
55
+ readonly threshold?: number;
56
+ }): ObjectiveDecision;
57
+ export declare function buildReopenSteer(goal: string, decision: ObjectiveDecision): string;
58
+ export declare function objectiveDecisionSummary(d: ObjectiveDecision): string;
59
+ export declare function judgeObjectiveRevision(opts: {
60
+ readonly harness: Harness;
61
+ readonly goal: string;
62
+ readonly verdict?: CouncilVerdictLike | RealCouncilVerdict;
63
+ readonly checklist?: RequirementChecklistLike;
64
+ readonly evidence?: string;
65
+ readonly threshold?: number;
66
+ readonly signal: AbortSignal;
67
+ }): Promise<ObjectiveDecision>;
68
+ export declare function parseDecision(text: string, fallbackReason?: string): ObjectiveDecision;
69
+ export {};
@@ -0,0 +1,319 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Flag d'ambiente (parita' con completeness.ts).
3
+ // ---------------------------------------------------------------------------
4
+ export function objectiveRevisionEnabled(env) {
5
+ const v = (env["TALOS_OBJECTIVE_REVISION"] ?? "").trim().toLowerCase();
6
+ return !(v === "0" || v === "off" || v === "false" || v === "no");
7
+ }
8
+ // Quante riaperture al massimo (anti-loop): dopo N giri ci si ferma comunque.
9
+ export function objectiveRevisionRounds(env) {
10
+ const n = Number(env["TALOS_OBJECTIVE_REVISION_ROUNDS"]);
11
+ return Number.isInteger(n) && n >= 0 ? n : 2;
12
+ }
13
+ // Se il concilio porta uno score, soglia minima per considerare "completo"
14
+ // anche quando complete non e' esplicitamente true. Default 0.8 (su scala 0..1).
15
+ export function objectiveRevisionThreshold(env) {
16
+ const n = Number(env["TALOS_OBJECTIVE_REVISION_THRESHOLD"]);
17
+ return Number.isFinite(n) && n > 0 && n <= 1 ? n : 0.8;
18
+ }
19
+ // ---------------------------------------------------------------------------
20
+ // Normalizzazioni difensive.
21
+ // ---------------------------------------------------------------------------
22
+ function normPriority(p) {
23
+ const v = (p ?? "").trim().toLowerCase();
24
+ if (v === "must" || v === "should" || v === "could")
25
+ return v;
26
+ return "must"; // in dubbio trattalo come essenziale
27
+ }
28
+ // Score normalizzato su 0..1: accetta sia 0..1 sia 0..100.
29
+ function normScore(score) {
30
+ if (typeof score !== "number" || !Number.isFinite(score))
31
+ return undefined;
32
+ if (score < 0)
33
+ return 0;
34
+ if (score <= 1)
35
+ return score;
36
+ if (score <= 100)
37
+ return score / 100;
38
+ return 1;
39
+ }
40
+ function dedupe(items) {
41
+ const seen = new Set();
42
+ const out = [];
43
+ for (const raw of items) {
44
+ const s = raw.replace(/\s+/g, " ").trim();
45
+ if (!s)
46
+ continue;
47
+ const key = s.toLowerCase();
48
+ if (seen.has(key))
49
+ continue;
50
+ seen.add(key);
51
+ out.push(s);
52
+ }
53
+ return out;
54
+ }
55
+ // Indicizza la checklist per id e per testo, cosi' un requisito "unmet" indicato
56
+ // dal concilio (per id o per testo) ritrova priorita' e descrizione completa.
57
+ function indexRequirements(checklist) {
58
+ const map = new Map();
59
+ for (const r of checklist?.requirements ?? []) {
60
+ if (r.id)
61
+ map.set(r.id.trim().toLowerCase(), r);
62
+ if (r.text)
63
+ map.set(r.text.replace(/\s+/g, " ").trim().toLowerCase(), r);
64
+ }
65
+ return map;
66
+ }
67
+ // ---------------------------------------------------------------------------
68
+ // Generazione dei sotto-obiettivi residui dai requisiti non soddisfatti.
69
+ // ---------------------------------------------------------------------------
70
+ // Dato l'elenco "unmet" dal concilio (id o testo) e la checklist dei requisiti,
71
+ // costruisce i sotto-obiettivi residui, recuperando priorita' e criteri quando
72
+ // il requisito e' noto. Se un "unmet" non matcha nessun requisito noto, lo usa
73
+ // come testo grezzo (priorita' must, prudente).
74
+ export function residualsFromRequirements(unmet, checklist) {
75
+ const index = indexRequirements(checklist);
76
+ const out = [];
77
+ const seen = new Set();
78
+ for (const raw of dedupe(unmet)) {
79
+ const key = raw.toLowerCase();
80
+ const req = index.get(key);
81
+ const text = req?.text ?? raw;
82
+ const dedupeKey = (req?.id ?? text).toLowerCase();
83
+ if (seen.has(dedupeKey))
84
+ continue;
85
+ seen.add(dedupeKey);
86
+ const criteria = (req?.criteria ?? []).map((c) => c.text).filter(Boolean);
87
+ const detail = criteria.length ? `${text} (criteri: ${criteria.join("; ")})` : text;
88
+ out.push({
89
+ text: detail,
90
+ ...(req?.id ? { requirementId: req.id } : {}),
91
+ priority: normPriority(req?.priority),
92
+ });
93
+ }
94
+ return out;
95
+ }
96
+ // ---------------------------------------------------------------------------
97
+ // Decisione deterministica.
98
+ // ---------------------------------------------------------------------------
99
+ // Combina il verdetto del concilio con i requisiti per decidere se chiudere o
100
+ // riaprire. Regole (fail-safe ma NON fail-open cieco):
101
+ // 1. residui = unmet del concilio mappati sui requisiti.
102
+ // 2. se ci sono residui MUST -> riapri (a prescindere dal flag complete).
103
+ // 3. se complete=true e nessun residuo must -> chiudi.
104
+ // 4. se score sopra soglia e nessun residuo must -> chiudi.
105
+ // 5. altrimenti, se restano residui (should/could) -> riapri con quelli.
106
+ // 6. nessun segnale negativo -> chiudi (completo).
107
+ export function decideObjective(opts) {
108
+ const { verdict, checklist } = opts;
109
+ const threshold = opts.threshold ?? 0.8;
110
+ const unmet = verdict?.unmetRequirements ?? [];
111
+ const residuals = residualsFromRequirements(unmet, checklist);
112
+ const mustResiduals = residuals.filter((r) => r.priority === "must");
113
+ const score = normScore(verdict?.score);
114
+ const explicitComplete = verdict?.complete === true;
115
+ // (2) Requisiti essenziali non soddisfatti: riapri sempre.
116
+ if (mustResiduals.length) {
117
+ return {
118
+ complete: false,
119
+ reopen: true,
120
+ residuals,
121
+ reason: `concilio: ${mustResiduals.length} requisito/i essenziale/i non soddisfatto/i`,
122
+ };
123
+ }
124
+ // (3) Concilio dichiara completo e nessun must residuo.
125
+ if (explicitComplete) {
126
+ return { complete: true, reopen: false, residuals: [], reason: "concilio: task completo" };
127
+ }
128
+ // (4) Score sopra soglia e nessun must residuo.
129
+ if (score !== undefined && score >= threshold) {
130
+ return {
131
+ complete: true,
132
+ reopen: false,
133
+ residuals: [],
134
+ reason: `concilio: score ${(score * 100).toFixed(0)}% >= soglia ${(threshold * 100).toFixed(0)}%`,
135
+ };
136
+ }
137
+ // (5) Restano residui non essenziali: riapri con quelli.
138
+ if (residuals.length) {
139
+ return {
140
+ complete: false,
141
+ reopen: true,
142
+ residuals,
143
+ reason: `concilio: ${residuals.length} requisito/i residuo/i da soddisfare`,
144
+ };
145
+ }
146
+ // (6) Assenza di segnali non e' una prova di completamento.
147
+ const reason = verdict?.concerns?.length
148
+ ? "concilio: rilievi presenti ma nessun verdetto verificabile"
149
+ : "concilio: completamento non verificato";
150
+ return { complete: false, reopen: false, residuals: [], reason, uncertain: true };
151
+ }
152
+ export function fromCouncilVerdict(v) {
153
+ const real = v;
154
+ // Se gia' nella forma generica (ha unmetRequirements o complete), passala.
155
+ const hasGeneric = real.unmetRequirements !== undefined || real.complete !== undefined;
156
+ if (hasGeneric && real.gaps === undefined && real.approved === undefined) {
157
+ return real;
158
+ }
159
+ const gaps = Array.isArray(real.gaps) ? real.gaps.map(String) : [];
160
+ const dissent = Array.isArray(real.dissent) ? real.dissent.map(String) : [];
161
+ return {
162
+ ...(typeof real.approved === "boolean" ? { complete: real.approved } : {}),
163
+ ...(typeof real.completion === "number" ? { score: real.completion } : {}),
164
+ unmetRequirements: dedupe([...gaps, ...dissent]),
165
+ ...(dissent.length ? { concerns: dissent } : {}),
166
+ ...(real.summary ? { summary: real.summary } : {}),
167
+ };
168
+ }
169
+ // Comodita': decide direttamente dal verdetto reale del concilio.
170
+ export function decideFromCouncil(opts) {
171
+ return decideObjective({
172
+ verdict: fromCouncilVerdict(opts.verdict),
173
+ checklist: opts.checklist,
174
+ threshold: opts.threshold,
175
+ });
176
+ }
177
+ // ---------------------------------------------------------------------------
178
+ // Steer in notazione Danilov: RIAPRE il goal coi sotto-obiettivi residui.
179
+ // Parita' con buildCompletenessSteer/buildValidationSteer.
180
+ // ---------------------------------------------------------------------------
181
+ export function buildReopenSteer(goal, decision) {
182
+ const g = goal.replace(/"/g, "'").slice(0, 200);
183
+ const residui = decision.residuals
184
+ .map((r, i) => `(${i + 1}) [${r.priority}] ${r.text}${r.requirementId ? ` <${r.requirementId}>` : ""}`)
185
+ .join(" ; ");
186
+ return `[VASCEND_REVISIONE_OBIETTIVO]
187
+ INDICE
188
+ 1 = goal
189
+ 2 = verdetto
190
+ 3 = residuo
191
+ 4 = azione
192
+
193
+ DEFINIZIONI
194
+ @goal[reale]: "${g}"
195
+ @verdetto[concilio]: ${decision.reason.replace(/"/g, "'")}
196
+ @residuo[sotto_obiettivi]: ${residui || "nessuno"}
197
+ @azione[riapri]: il task NON e' completo; svolgi i sotto-obiettivi residui, NON ti fermi al verdetto precedente
198
+
199
+ RELAZIONI
200
+ @R1: @verdetto[concilio] -> @residuo[sotto_obiettivi] [ i requisiti non soddisfatti diventano sotto-obiettivi ]
201
+ @R2: @residuo[sotto_obiettivi] -> @azione[riapri] [ pianifica e completa i residui ]
202
+ @R3: @azione[riapri] -> @goal[reale] [ finche' i requisiti essenziali non sono soddisfatti ]
203
+
204
+ OUTPUT: riapri l'obiettivo: crea/aggiorna attivita per i sotto-obiettivi residui (priorita' must prima), realizzali col lavoro reale e illuminali con vascend_mark. Concludi solo quando i residui essenziali sono soddisfatti.`;
205
+ }
206
+ // Sintesi compatta della decisione (per log/TUI), in una riga.
207
+ export function objectiveDecisionSummary(d) {
208
+ if (d.complete)
209
+ return `obiettivo completo (${d.reason})`;
210
+ if (d.uncertain)
211
+ return `obiettivo non verificato (${d.reason})`;
212
+ const must = d.residuals.filter((r) => r.priority === "must").length;
213
+ return `riapri: ${d.residuals.length} residuo/i (${must} must) · ${d.reason}`;
214
+ }
215
+ // ---------------------------------------------------------------------------
216
+ // Passaggio LLM OPZIONALE: quando il concilio non porta unmet espliciti ma non
217
+ // dichiara nemmeno il completamento (zona grigia), un revisore raffina i
218
+ // sotto-obiettivi residui leggendo goal + verdetto + requisiti. Gemello a valle
219
+ // di judgeCompleteness. In dubbio conserva uno stato unknown, non chiude.
220
+ // ---------------------------------------------------------------------------
221
+ const REVISER_SYSTEM = `# Revisore dell'obiettivo
222
+ INDICE
223
+ 1 = goal
224
+ 2 = verdetto
225
+ 3 = residuo
226
+
227
+ DEFINIZIONI
228
+ @goal[reale]: l'obiettivo VERO dell'utente
229
+ @verdetto[concilio]: giudizio del concilio (completamento, lacune, dissensi)
230
+ @residuo[regola]: elenca SOLO sotto-obiettivi ESSENZIALI ancora aperti; niente perfezionismo
231
+ @bilancia[chiudi]: se il goal e' soddisfatto nella sostanza, complete=true e residuals=[]
232
+
233
+ RELAZIONI
234
+ @R1: @verdetto[concilio] -> @residuo[regola] [ trasforma le lacune in sotto-obiettivi ]
235
+ @R2: @residuo[regola] -> @goal[reale] [ solo cio' che serve a soddisfare il goal ]
236
+
237
+ OUTPUT: SOLO JSON {"complete": bool, "residuals": [{"text": str, "priority": "must|should|could"}]}. Niente prosa, niente markdown.`;
238
+ export async function judgeObjectiveRevision(opts) {
239
+ const { harness, goal, checklist, evidence, signal } = opts;
240
+ const verdict = opts.verdict ? fromCouncilVerdict(opts.verdict) : undefined;
241
+ // 1) Prima la decisione DETERMINISTICA dal verdetto + requisiti.
242
+ const det = decideObjective({ verdict, checklist, threshold: opts.threshold });
243
+ // Se il deterministico ha gia' deciso di riaprire (residui dai requisiti) o di
244
+ // chiudere con segnale esplicito, fidati: niente chiamata LLM superflua.
245
+ if (det.reopen)
246
+ return det;
247
+ const explicit = verdict?.complete === true || (normScore(verdict?.score) ?? 0) >= (opts.threshold ?? 0.8);
248
+ if (explicit)
249
+ return det;
250
+ // 2) Zona grigia: nessun unmet esplicito ma nemmeno completamento certo.
251
+ // Chiedi al modello di raffinare i residui. Fail-open: errore => chiudi.
252
+ const resolved = harness.providers.resolve(harness.config.model);
253
+ if (!resolved)
254
+ return det;
255
+ const reqBlock = (checklist?.requirements ?? [])
256
+ .map((r) => `- [${normPriority(r.priority)}] ${r.text}`)
257
+ .join("\n");
258
+ const user = `GOAL dell'utente:\n${goal}\n\n` +
259
+ (verdict?.summary ? `VERDETTO concilio:\n${verdict.summary}\n\n` : "") +
260
+ (verdict?.concerns?.length ? `RILIEVI:\n${verdict.concerns.join("\n")}\n\n` : "") +
261
+ (reqBlock ? `REQUISITI:\n${reqBlock}\n\n` : "") +
262
+ (evidence ? `LAVORO SVOLTO:\n${evidence.slice(0, 3000)}\n\n` : "") +
263
+ `Restano sotto-obiettivi ESSENZIALI da svolgere per soddisfare il goal? ` +
264
+ `Rispondi SOLO JSON {"complete": bool, "residuals": [{"text","priority"}]}.`;
265
+ try {
266
+ const res = await resolved.provider.complete({
267
+ system: REVISER_SYSTEM,
268
+ messages: [{ role: "user", content: [{ type: "text", text: user }] }],
269
+ tools: [],
270
+ model: resolved.modelId,
271
+ maxTokens: harness.config.maxTokens,
272
+ signal,
273
+ sessionId: `objrev-${harness.session.id}`,
274
+ });
275
+ return parseDecision(res.text, det.reason);
276
+ }
277
+ catch {
278
+ return det; // fail-open: in dubbio non bloccare
279
+ }
280
+ }
281
+ // Parser difensivo del JSON del revisore.
282
+ export function parseDecision(text, fallbackReason = "") {
283
+ const m = /\{[\s\S]*\}/.exec(text);
284
+ if (!m)
285
+ return unknownObjective(fallbackReason || "risposta del revisore non strutturata");
286
+ try {
287
+ const raw = JSON.parse(m[0]);
288
+ const list = Array.isArray(raw.residuals) ? raw.residuals : [];
289
+ const residuals = list
290
+ .map((r) => {
291
+ const o = (r ?? {});
292
+ const t = String(o.text ?? "").replace(/\s+/g, " ").trim();
293
+ if (!t)
294
+ return null;
295
+ return {
296
+ text: t,
297
+ priority: normPriority(typeof o.priority === "string" ? o.priority : undefined),
298
+ ...(o.requirementId ? { requirementId: String(o.requirementId) } : {}),
299
+ };
300
+ })
301
+ .filter((x) => x !== null)
302
+ .slice(0, 12);
303
+ if (raw.complete !== true && raw.complete !== false)
304
+ return unknownObjective(fallbackReason || "verdetto booleano assente");
305
+ const complete = raw.complete === true && residuals.length === 0;
306
+ return {
307
+ complete,
308
+ reopen: !complete,
309
+ residuals: complete ? [] : residuals,
310
+ reason: complete ? (fallbackReason || "revisore: obiettivo completo") : `revisore: ${residuals.length} residuo/i`,
311
+ };
312
+ }
313
+ catch {
314
+ return unknownObjective(fallbackReason || "JSON del revisore non valido");
315
+ }
316
+ }
317
+ function unknownObjective(reason) {
318
+ return { complete: false, reopen: false, residuals: [], reason, uncertain: true };
319
+ }