@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,243 @@
1
+ import { ContextSearchIndex } from "./context-search-index.js";
2
+ import { activeCandidates } from "./supersession-graph.js";
3
+ import { buildSynonyms, expandQuery, bm25Score, tokenize, } from "./lexical-search.js";
4
+ const MAX_GRAPH_HOPS = 2;
5
+ const MAX_GRAPH_SEEDS = 8;
6
+ const MAX_GRAPH_NEIGHBORS = 12;
7
+ const MAX_GRAPH_VISITS = 96;
8
+ const SECOND_HOP_DECAY = 0.72;
9
+ const MIN_TRANSITIVE_WEIGHT = 0.5;
10
+ const RRF_K = 60;
11
+ const DEFAULT_SYNONYM_INDEX = buildSynonyms();
12
+ const GRAPH_RRF_WEIGHT = 1.15;
13
+ // Esegue il retrieval ibrido. Deterministico.
14
+ export function retrieve(pool, opts) {
15
+ const limit = opts.limit && opts.limit > 0 ? opts.limit : 24;
16
+ const minScore = typeof opts.minScore === "number" ? opts.minScore : 0;
17
+ const expandLinks = opts.expandLinks ?? true;
18
+ const synonyms = opts.synonyms ?? DEFAULT_SYNONYM_INDEX;
19
+ const index = opts.legacy ? undefined : opts.index ?? new ContextSearchIndex(pool, undefined, opts.dropSuperseded ?? true);
20
+ const candidates = index?.candidates ?? ((opts.dropSuperseded ?? true) ? activeCandidates(pool) : pool);
21
+ if (!candidates.length)
22
+ return [];
23
+ // --- 1) ranking lessicale BM25 ---
24
+ const docs = index?.docs ?? candidates.map((c) => ({
25
+ ref: c,
26
+ tokens: tokenize(`${c.terms.join(" ")} ${c.subject} ${c.summary} ${c.body}`),
27
+ }));
28
+ const queryTokens = tokenize(opts.query);
29
+ const queryTerms = expandQuery(queryTokens, synonyms);
30
+ const scored = index?.lexical.score(queryTerms) ?? bm25Score(docs, queryTerms);
31
+ const scoreById = new Map();
32
+ for (const s of scored)
33
+ scoreById.set(s.ref.id, s.score);
34
+ // Match diretti sopra soglia, ordinati per score. Non tronchiamo ancora al
35
+ // limite: i vicini strutturali devono poter competere con i match lessicali
36
+ // deboli anche quando questi ultimi saturano il pool.
37
+ const direct = scored
38
+ .filter((s) => s.score > minScore)
39
+ .sort((a, b) => b.score - a.score || a.ref.id.localeCompare(b.ref.id));
40
+ if (!direct.length)
41
+ return [];
42
+ // Fallback lessicale puro: preserva score e ordinamento BM25 quando il
43
+ // chiamante disattiva il grafo o la traversata non scopre alcun vicino.
44
+ if (!expandLinks)
45
+ return lexicalFallback(direct, limit);
46
+ // --- 2) link graph bounded: massimo due hop dai top match ---
47
+ const graph = expandGraph(candidates, direct, scoreById, limit, index?.links);
48
+ if (!graph.length)
49
+ return lexicalFallback(direct, limit);
50
+ // --- 3) Reciprocal Rank Fusion ---
51
+ // BM25, propagazione e numero di archi hanno scale differenti. Fondiamo i
52
+ // RANK, modulando soltanto il canale grafo per la forza relativa del path.
53
+ // I match che contengono tutti i token originali della query restano sempre
54
+ // davanti ai candidati graph-only; tra loro mantengono l'ordine BM25.
55
+ const lexicalRanks = rankMap(direct.map((item) => item.ref.id));
56
+ const graphRanks = rankMap(graph.map((item) => item.candidate.id));
57
+ const graphById = new Map(graph.map((item) => [item.candidate.id, item]));
58
+ const maxGraph = graph[0]?.score ?? 1;
59
+ const exactIds = new Set(docs
60
+ .filter((doc) => isExactMatch(queryTokens, doc.tokens) && lexicalRanks.has(doc.ref.id))
61
+ .map((doc) => doc.ref.id));
62
+ const byId = new Map(candidates.map((candidate) => [candidate.id, candidate]));
63
+ const union = new Set([...lexicalRanks.keys(), ...graphRanks.keys()]);
64
+ const fused = [];
65
+ for (const id of union) {
66
+ const candidate = byId.get(id);
67
+ if (!candidate)
68
+ continue;
69
+ const lexRank = lexicalRanks.get(id);
70
+ const graphRank = graphRanks.get(id);
71
+ const graphHit = graphById.get(id);
72
+ const lexScore = scoreById.get(id) ?? 0;
73
+ const graphScore = graphHit?.score ?? 0;
74
+ const lexContribution = lexRank === undefined ? 0 : 1 / (RRF_K + lexRank);
75
+ const graphStrength = maxGraph > 0 ? graphScore / maxGraph : 0;
76
+ const graphContribution = graphRank === undefined
77
+ ? 0
78
+ : (GRAPH_RRF_WEIGHT * graphStrength) / (RRF_K + graphRank);
79
+ fused.push({
80
+ candidate,
81
+ lexScore,
82
+ graphScore,
83
+ retrievalScore: lexContribution + graphContribution,
84
+ viaLink: lexRank === undefined,
85
+ });
86
+ }
87
+ return [...protectExactScores(fused, exactIds, lexicalRanks)]
88
+ .sort((a, b) => compareFused(a, b, exactIds, lexicalRanks))
89
+ .slice(0, limit);
90
+ }
91
+ function lexicalFallback(direct, limit) {
92
+ return direct.slice(0, limit).map((item) => ({
93
+ candidate: item.ref,
94
+ lexScore: item.score,
95
+ graphScore: 0,
96
+ retrievalScore: item.score,
97
+ viaLink: false,
98
+ }));
99
+ }
100
+ function expandGraph(candidates, direct, scoreById, limit, links) {
101
+ const seedLimit = Math.min(direct.length, MAX_GRAPH_SEEDS, Math.max(2, Math.ceil(limit / 2)));
102
+ const neighborLimit = Math.min(MAX_GRAPH_NEIGHBORS, Math.max(4, limit));
103
+ const visitLimit = Math.min(MAX_GRAPH_VISITS, Math.max(16, limit * 4));
104
+ const neighborsCache = new Map();
105
+ const hits = new Map();
106
+ let visits = 0;
107
+ const neighborsOf = (source) => {
108
+ const cached = neighborsCache.get(source.id);
109
+ if (cached)
110
+ return cached;
111
+ const neighbors = (links ? [...links.neighbors(source.id)] : candidates
112
+ .filter((candidate) => candidate.id !== source.id)
113
+ .map((candidate) => ({ candidate, weight: relationWeight(source, candidate) }))
114
+ .filter((edge) => edge.weight > 0))
115
+ .sort((a, b) => b.weight - a.weight ||
116
+ (scoreById.get(b.candidate.id) ?? 0) - (scoreById.get(a.candidate.id) ?? 0) ||
117
+ a.candidate.id.localeCompare(b.candidate.id));
118
+ neighborsCache.set(source.id, neighbors);
119
+ return neighbors;
120
+ };
121
+ for (const seed of direct.slice(0, seedLimit)) {
122
+ const seen = new Map([[seed.ref.id, seed.score]]);
123
+ const queue = [
124
+ { candidate: seed.ref, score: seed.score, hop: 0 },
125
+ ];
126
+ while (queue.length && visits < visitLimit) {
127
+ const current = queue.shift();
128
+ if (!current)
129
+ break;
130
+ const allNeighbors = neighborsOf(current.candidate);
131
+ const degreePenalty = allNeighbors.length > neighborLimit
132
+ ? Math.sqrt(neighborLimit / allNeighbors.length)
133
+ : 1;
134
+ for (const edge of allNeighbors.slice(0, neighborLimit)) {
135
+ const nextHop = current.hop + 1;
136
+ if (nextHop > MAX_GRAPH_HOPS)
137
+ continue;
138
+ // La parentela di namespace e altri archi deboli sono utili come
139
+ // tie-break a un hop, ma non possono diventare ponti transitivi.
140
+ if (nextHop === 2 && edge.weight < MIN_TRANSITIVE_WEIGHT)
141
+ continue;
142
+ const decay = nextHop === 2 ? SECOND_HOP_DECAY : 1;
143
+ const propagated = current.score * edge.weight * degreePenalty * decay;
144
+ if (propagated <= 0 || propagated <= (seen.get(edge.candidate.id) ?? 0))
145
+ continue;
146
+ seen.set(edge.candidate.id, propagated);
147
+ if (edge.candidate.id === seed.ref.id)
148
+ continue;
149
+ const previous = hits.get(edge.candidate.id);
150
+ if (!previous || propagated > previous.score) {
151
+ hits.set(edge.candidate.id, { candidate: edge.candidate, score: propagated, hop: nextHop });
152
+ }
153
+ visits += 1;
154
+ if (visits >= visitLimit)
155
+ break;
156
+ if (nextHop < MAX_GRAPH_HOPS && edge.weight >= MIN_TRANSITIVE_WEIGHT) {
157
+ queue.push({ candidate: edge.candidate, score: propagated, hop: 1 });
158
+ }
159
+ }
160
+ }
161
+ }
162
+ return [...hits.values()].sort((a, b) => b.score - a.score || a.hop - b.hop || a.candidate.id.localeCompare(b.candidate.id));
163
+ }
164
+ function rankMap(ids) {
165
+ return new Map(ids.map((id, index) => [id, index + 1]));
166
+ }
167
+ function isExactMatch(queryTokens, documentTokens) {
168
+ const query = [...new Set(queryTokens)];
169
+ if (!query.length)
170
+ return false;
171
+ const document = new Set(documentTokens);
172
+ return query.every((token) => document.has(token));
173
+ }
174
+ // La sola precedenza nel sort non basta: il Context Window Compiler normalizza
175
+ // retrievalScore e riesegue uno scoring multi-fattore. Gli exact occupano
176
+ // quindi una fascia numerica sopra ogni altro candidato, ordinata secondo BM25.
177
+ function protectExactScores(items, exactIds, lexicalRanks) {
178
+ const exact = items
179
+ .filter((item) => exactIds.has(item.candidate.id))
180
+ .sort((a, b) => (lexicalRanks.get(a.candidate.id) ?? Infinity) - (lexicalRanks.get(b.candidate.id) ?? Infinity)
181
+ || a.candidate.id.localeCompare(b.candidate.id));
182
+ if (!exact.length)
183
+ return items;
184
+ const ceiling = items.reduce((max, item) => Math.max(max, item.retrievalScore), 0);
185
+ const step = Math.max(1e-9, ceiling * 0.01);
186
+ const protectedScore = new Map(exact.map((item, index) => [item.candidate.id, ceiling + step * (exact.length - index)]));
187
+ return items.map((item) => {
188
+ const retrievalScore = protectedScore.get(item.candidate.id);
189
+ return retrievalScore === undefined ? item : { ...item, retrievalScore };
190
+ });
191
+ }
192
+ function compareFused(a, b, exactIds, lexicalRanks) {
193
+ const aExact = exactIds.has(a.candidate.id);
194
+ const bExact = exactIds.has(b.candidate.id);
195
+ if (aExact !== bExact)
196
+ return aExact ? -1 : 1;
197
+ if (aExact && bExact) {
198
+ return (lexicalRanks.get(a.candidate.id) ?? Infinity) - (lexicalRanks.get(b.candidate.id) ?? Infinity)
199
+ || a.candidate.id.localeCompare(b.candidate.id);
200
+ }
201
+ return b.retrievalScore - a.retrievalScore
202
+ || Number(a.viaLink) - Number(b.viaLink)
203
+ || b.lexScore - a.lexScore
204
+ || a.candidate.id.localeCompare(b.candidate.id);
205
+ }
206
+ // Peso della relazione strutturale. I link tipizzati sono il segnale piu'
207
+ // forte; una citazione testuale dell'id e' meno affidabile; la semplice
208
+ // appartenenza allo stesso castello serve solo come tie-break contestuale.
209
+ function relationWeight(seed, candidate) {
210
+ if (seed.links.includes(candidate.id) || candidate.links.includes(seed.id))
211
+ return 0.68;
212
+ if (mentions(seed, candidate.id) || mentions(candidate, seed.id))
213
+ return 0.52;
214
+ if (sameCastle(seed.id, candidate.id))
215
+ return 0.18;
216
+ return 0;
217
+ }
218
+ // Vero se il testo del candidato cita l'id target (riferimento esplicito).
219
+ function mentions(c, targetId) {
220
+ if (!targetId)
221
+ return false;
222
+ const hay = `${c.summary} ${c.body} ${c.terms.join(" ")}`.toLowerCase();
223
+ const needle = targetId.toLowerCase();
224
+ let from = 0;
225
+ while (from < hay.length) {
226
+ const index = hay.indexOf(needle, from);
227
+ if (index < 0)
228
+ return false;
229
+ const before = index > 0 ? hay[index - 1] ?? "" : "";
230
+ const afterIndex = index + needle.length;
231
+ const after = afterIndex < hay.length ? hay[afterIndex] ?? "" : "";
232
+ if (!/[a-z0-9_]/i.test(before) && !/[a-z0-9_]/i.test(after))
233
+ return true;
234
+ from = index + needle.length;
235
+ }
236
+ return false;
237
+ }
238
+ // Vero se due id appartengono allo stesso castello (prefisso prima di "/").
239
+ function sameCastle(a, b) {
240
+ const pa = a.includes("/") ? a.slice(0, a.indexOf("/")) : "";
241
+ const pb = b.includes("/") ? b.slice(0, b.indexOf("/")) : "";
242
+ return Boolean(pa) && pa === pb;
243
+ }
@@ -0,0 +1,5 @@
1
+ /** Frame content affects retrieval only through project membership, not diagnostics. */
2
+ export declare function projectMemoryScopes(sessionDir: string, projectKey: string): readonly string[];
3
+ /** Synchronous notification closes the gap before filesystem watcher delivery. */
4
+ export declare function contextFrameWritten(sessionDir: string, path: string): void;
5
+ export declare function clearContextScopeIndexes(): void;
@@ -0,0 +1,96 @@
1
+ import { readdirSync, readFileSync, statSync, watch } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ const catalogs = new Map();
4
+ const RECONCILE_MS = 30_000;
5
+ function stamp(path) {
6
+ try {
7
+ const stat = statSync(path);
8
+ return stat.size + ":" + stat.mtimeMs + ":" + stat.ctimeMs;
9
+ }
10
+ catch {
11
+ return "";
12
+ }
13
+ }
14
+ /** Frame content affects retrieval only through project membership, not diagnostics. */
15
+ export function projectMemoryScopes(sessionDir, projectKey) {
16
+ const dir = resolve(sessionDir, "context-fabric");
17
+ let catalog = catalogs.get(dir);
18
+ if (!catalog) {
19
+ catalog = { frames: new Map(), dirty: new Set(), directoryStamp: "", reconciledAt: 0 };
20
+ catalogs.set(dir, catalog);
21
+ if (catalogs.size > 32) {
22
+ const oldest = catalogs.keys().next().value;
23
+ catalogs.get(oldest)?.watcher?.close();
24
+ catalogs.delete(oldest);
25
+ }
26
+ }
27
+ const directoryStamp = stamp(dir);
28
+ const reconcile = Date.now() - catalog.reconciledAt >= RECONCILE_MS;
29
+ if (reconcile || directoryStamp !== catalog.directoryStamp) {
30
+ let files = [];
31
+ try {
32
+ files = readdirSync(dir).filter((name) => name.endsWith(".json"));
33
+ }
34
+ catch { /* no catalog yet */ }
35
+ const names = new Set(files);
36
+ for (const name of catalog.frames.keys())
37
+ if (!names.has(name))
38
+ catalog.frames.delete(name);
39
+ for (const name of files) {
40
+ if (!catalog.frames.has(name) || reconcile && catalog.frames.get(name).stamp !== stamp(join(dir, name)))
41
+ catalog.dirty.add(name);
42
+ }
43
+ catalog.directoryStamp = directoryStamp;
44
+ catalog.reconciledAt = Date.now();
45
+ if (!catalog.watcher && directoryStamp) {
46
+ try {
47
+ const target = catalog;
48
+ catalog.watcher = watch(dir, { persistent: false }, (_event, name) => {
49
+ if (name?.toString().endsWith(".json"))
50
+ target.dirty.add(name.toString());
51
+ });
52
+ catalog.watcher.on("error", () => { target.watcher?.close(); target.watcher = undefined; target.reconciledAt = 0; });
53
+ }
54
+ catch { /* periodic reconciliation remains authoritative */ }
55
+ }
56
+ }
57
+ for (const name of catalog.dirty)
58
+ readFrame(catalog, dir, name);
59
+ catalog.dirty.clear();
60
+ const scopes = new Map();
61
+ for (const frame of catalog.frames.values())
62
+ if (frame.projectKey === projectKey) {
63
+ scopes.set(frame.scope, Math.max(scopes.get(frame.scope) ?? 0, frame.updatedAt));
64
+ }
65
+ return [...scopes].sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0])).map(([scope]) => scope);
66
+ }
67
+ /** Synchronous notification closes the gap before filesystem watcher delivery. */
68
+ export function contextFrameWritten(sessionDir, path) {
69
+ const dir = resolve(sessionDir, "context-fabric");
70
+ const catalog = catalogs.get(dir);
71
+ if (!catalog)
72
+ return;
73
+ const name = path.replaceAll("\\", "/").split("/").pop();
74
+ readFrame(catalog, dir, name);
75
+ catalog.dirty.delete(name);
76
+ }
77
+ function readFrame(catalog, dir, name) {
78
+ try {
79
+ const path = join(dir, name);
80
+ const frame = JSON.parse(readFileSync(path, "utf8"));
81
+ const scope = frame.receipt?.memoryScopeId;
82
+ if (typeof frame.projectKey !== "string" || typeof scope !== "string" || !scope) {
83
+ catalog.frames.delete(name);
84
+ return;
85
+ }
86
+ catalog.frames.set(name, { projectKey: frame.projectKey, scope, updatedAt: Number(frame.updatedAt) || 0, stamp: stamp(path) });
87
+ }
88
+ catch {
89
+ catalog.frames.delete(name);
90
+ }
91
+ }
92
+ export function clearContextScopeIndexes() {
93
+ for (const catalog of catalogs.values())
94
+ catalog.watcher?.close();
95
+ catalogs.clear();
96
+ }
@@ -0,0 +1,35 @@
1
+ import { type ContextCandidate, type ContextScore, type ContextScoreFactors, type ContextTier } from "./context-candidate.js";
2
+ export interface ScoreWeights {
3
+ readonly relevance: number;
4
+ readonly dependency: number;
5
+ readonly trust: number;
6
+ readonly freshness: number;
7
+ readonly novelty: number;
8
+ readonly conflictRisk: number;
9
+ readonly tokenCost: number;
10
+ }
11
+ export declare const DEFAULT_WEIGHTS: ScoreWeights;
12
+ export interface TierThresholds {
13
+ readonly high: number;
14
+ readonly mid: number;
15
+ }
16
+ export declare const DEFAULT_THRESHOLDS: TierThresholds;
17
+ export interface ScoreContext {
18
+ readonly query: string;
19
+ readonly now: number;
20
+ readonly freshnessHalfLifeMs?: number;
21
+ readonly tokenBudget?: number;
22
+ readonly weights?: ScoreWeights;
23
+ readonly thresholds?: TierThresholds;
24
+ readonly activeDecisionIds?: readonly string[];
25
+ readonly lexScores?: ReadonlyMap<string, number>;
26
+ readonly retrievalScores?: ReadonlyMap<string, number>;
27
+ }
28
+ export interface ScoreCandidateOptions {
29
+ readonly seenTermSets?: readonly ReadonlySet<string>[];
30
+ }
31
+ export declare function scoreFactors(candidate: ContextCandidate, ctx: ScoreContext, opts?: ScoreCandidateOptions): ContextScoreFactors;
32
+ export declare function combineScore(factors: ContextScoreFactors, weights?: ScoreWeights): number;
33
+ export declare function tierFor(score: number, thresholds?: TierThresholds): ContextTier;
34
+ export declare function scoreCandidate(candidate: ContextCandidate, ctx: ScoreContext, opts?: ScoreCandidateOptions): ContextScore;
35
+ export declare function scoreCandidates(candidates: readonly ContextCandidate[], ctx: ScoreContext): readonly ContextScore[];
@@ -0,0 +1,162 @@
1
+ // Context Scorer (metodo Danilov, Memory OS).
2
+ //
3
+ // Assegna a ogni ContextCandidate un punteggio multi-fattore PRIMA di inserirlo
4
+ // nel prompt, cosi' che il Context Window Compiler decida cosa entra come corpo
5
+ // (HIGH), cosa come solo handle (MID) e cosa viene escluso (LOW).
6
+ //
7
+ // Formula mentale del documento talos-context:
8
+ // context_value =
9
+ // relevance + dependency + trust + freshness + novelty
10
+ // - conflict_risk - token_cost
11
+ //
12
+ // Modulo PURO e DETERMINISTICO: stessi input -> stesso output, nessun
13
+ // side-effect, nessuna rete, nessun orologio interno (il "now" e' un parametro).
14
+ import { confidenceWeight, estimateCandidateTokens, } from "./context-candidate.js";
15
+ import { tokenize } from "./lexical-search.js";
16
+ export const DEFAULT_WEIGHTS = {
17
+ relevance: 1.0,
18
+ dependency: 0.8,
19
+ trust: 0.6,
20
+ freshness: 0.5,
21
+ novelty: 0.4,
22
+ conflictRisk: 1.0,
23
+ tokenCost: 0.3,
24
+ };
25
+ export const DEFAULT_THRESHOLDS = { high: 1.2, mid: 0.5 };
26
+ const HOUR_MS = 60 * 60 * 1000;
27
+ const DEFAULT_HALF_LIFE = 72 * HOUR_MS; // 3 giorni
28
+ const DEFAULT_BUDGET = 4_000;
29
+ // --- fattori ----------------------------------------------------------------
30
+ // Rilevanza: usa il punteggio lessicale BM25 (IDF-aware) gia' calcolato dal
31
+ // retriever quando disponibile (segnale piu' forte: i termini rari pesano di
32
+ // piu' di quelli comuni). In assenza, fallback all'overlap binario tra query e
33
+ // (terms+subject+summary) normalizzato sul numero di token di query. In
34
+ // entrambi i casi deterministico.
35
+ function relevanceFactor(candidate, queryTokens, lexScore) {
36
+ if (typeof lexScore === "number")
37
+ return clamp01(lexScore);
38
+ if (!queryTokens.length)
39
+ return 0;
40
+ const docTokens = new Set(tokenize(`${candidate.terms.join(" ")} ${candidate.subject} ${candidate.summary}`));
41
+ if (!docTokens.size)
42
+ return 0;
43
+ let hits = 0;
44
+ for (const q of queryTokens)
45
+ if (docTokens.has(q))
46
+ hits += 1;
47
+ return clamp01(hits / queryTokens.length);
48
+ }
49
+ // Freshness: decadimento esponenziale con half-life. createdAt==0 (sconosciuto)
50
+ // vale neutro 0.5 per non penalizzare candidati senza timestamp.
51
+ function freshnessFactor(candidate, now, halfLife) {
52
+ if (!candidate.createdAt)
53
+ return 0.5;
54
+ const age = Math.max(0, now - candidate.createdAt);
55
+ return clamp01(Math.pow(0.5, age / halfLife));
56
+ }
57
+ // Novelty: penalizza i candidati molto simili a quelli gia' selezionati
58
+ // (passati in `seenTermSets`). Senza precedenti, novelty piena.
59
+ function noveltyFactor(candidate, seenTermSets) {
60
+ if (!seenTermSets.length)
61
+ return 1;
62
+ const terms = new Set(candidate.terms);
63
+ if (!terms.size)
64
+ return 1;
65
+ let maxOverlap = 0;
66
+ for (const seen of seenTermSets) {
67
+ let inter = 0;
68
+ for (const t of terms)
69
+ if (seen.has(t))
70
+ inter += 1;
71
+ const overlap = inter / terms.size;
72
+ if (overlap > maxOverlap)
73
+ maxOverlap = overlap;
74
+ }
75
+ return clamp01(1 - maxOverlap);
76
+ }
77
+ // Conflict risk: alto se il candidato e' superseded/archived; medio se
78
+ // contraddice (per status) una decisione attiva piu' recente.
79
+ function conflictFactor(candidate) {
80
+ if (candidate.status === "superseded")
81
+ return 1;
82
+ if (candidate.status === "archived")
83
+ return 0.7;
84
+ if (candidate.supersededBy)
85
+ return 0.8;
86
+ return 0;
87
+ }
88
+ // Token cost normalizzato sul budget: piu' un candidato e' grosso, piu' costa.
89
+ function tokenCostFactor(candidate, budget) {
90
+ const tokens = estimateCandidateTokens(candidate, "body");
91
+ return clamp01(tokens / Math.max(1, budget));
92
+ }
93
+ // Calcola i fattori grezzi di un candidato. Esposto per debug/metriche.
94
+ export function scoreFactors(candidate, ctx, opts = {}) {
95
+ const queryTokens = tokenize(ctx.query);
96
+ const halfLife = ctx.freshnessHalfLifeMs && ctx.freshnessHalfLifeMs > 0 ? ctx.freshnessHalfLifeMs : DEFAULT_HALF_LIFE;
97
+ const budget = ctx.tokenBudget && ctx.tokenBudget > 0 ? ctx.tokenBudget : DEFAULT_BUDGET;
98
+ const lexScore = ctx.retrievalScores?.get(candidate.id) ?? ctx.lexScores?.get(candidate.id);
99
+ return {
100
+ relevance: relevanceFactor(candidate, queryTokens, lexScore),
101
+ dependency: candidate.dependency ? 1 : 0,
102
+ trust: confidenceWeight(candidate.trust),
103
+ freshness: freshnessFactor(candidate, ctx.now, halfLife),
104
+ novelty: noveltyFactor(candidate, opts.seenTermSets ?? []),
105
+ conflictRisk: conflictFactor(candidate),
106
+ tokenCost: tokenCostFactor(candidate, budget),
107
+ };
108
+ }
109
+ // Combina i fattori con i pesi nello score finale (puo' essere negativo).
110
+ export function combineScore(factors, weights = DEFAULT_WEIGHTS) {
111
+ return (weights.relevance * factors.relevance +
112
+ weights.dependency * factors.dependency +
113
+ weights.trust * factors.trust +
114
+ weights.freshness * factors.freshness +
115
+ weights.novelty * factors.novelty -
116
+ weights.conflictRisk * factors.conflictRisk -
117
+ weights.tokenCost * factors.tokenCost);
118
+ }
119
+ // Assegna il tier in base allo score e alle soglie.
120
+ export function tierFor(score, thresholds = DEFAULT_THRESHOLDS) {
121
+ if (score >= thresholds.high)
122
+ return "high";
123
+ if (score >= thresholds.mid)
124
+ return "mid";
125
+ return "low";
126
+ }
127
+ // Scoring completo di un singolo candidato.
128
+ export function scoreCandidate(candidate, ctx, opts = {}) {
129
+ const weights = ctx.weights ?? DEFAULT_WEIGHTS;
130
+ const thresholds = ctx.thresholds ?? DEFAULT_THRESHOLDS;
131
+ const factors = scoreFactors(candidate, ctx, opts);
132
+ const score = combineScore(factors, weights);
133
+ return { candidate, score, factors, tier: tierFor(score, thresholds) };
134
+ }
135
+ // Scoring di un insieme di candidati con NOVELTY incrementale: ordina per
136
+ // score discendente e penalizza i successivi simili ai gia' scelti. Questo da'
137
+ // un ranking deterministico che evita duplicati senza un passo di dedup a parte.
138
+ export function scoreCandidates(candidates, ctx) {
139
+ // Primo passo: score base (novelty piena) per ottenere un ordine stabile.
140
+ const base = candidates.map((c) => ({ c, s: scoreCandidate(c, ctx) }));
141
+ base.sort((a, b) => b.s.score - a.s.score || a.c.id.localeCompare(b.c.id));
142
+ // Secondo passo: ricalcola con novelty rispetto ai gia' accettati (in ordine).
143
+ const seen = [];
144
+ const out = [];
145
+ for (const { c } of base) {
146
+ const scored = scoreCandidate(c, ctx, { seenTermSets: seen });
147
+ out.push(scored);
148
+ if (scored.tier !== "low")
149
+ seen.push(new Set(c.terms));
150
+ }
151
+ out.sort((a, b) => b.score - a.score || a.candidate.id.localeCompare(b.candidate.id));
152
+ return out;
153
+ }
154
+ function clamp01(v) {
155
+ if (Number.isNaN(v))
156
+ return 0;
157
+ if (v < 0)
158
+ return 0;
159
+ if (v > 1)
160
+ return 1;
161
+ return v;
162
+ }
@@ -0,0 +1,12 @@
1
+ import type { ContextCandidate } from "./context-candidate.js";
2
+ import { CandidateLinks } from "./context-links.js";
3
+ import { LexicalIndex } from "./lexical-index.js";
4
+ import { type IndexedDoc } from "./lexical-search.js";
5
+ export declare class ContextSearchIndex {
6
+ readonly candidates: readonly ContextCandidate[];
7
+ readonly docs: readonly IndexedDoc<ContextCandidate>[];
8
+ readonly lexical: LexicalIndex<ContextCandidate>;
9
+ readonly links: CandidateLinks;
10
+ private readonly texts;
11
+ constructor(pool: readonly ContextCandidate[], previous?: ContextSearchIndex, dropSuperseded?: boolean);
12
+ }
@@ -0,0 +1,25 @@
1
+ import { CandidateLinks } from "./context-links.js";
2
+ import { LexicalIndex } from "./lexical-index.js";
3
+ import { tokenize } from "./lexical-search.js";
4
+ import { activeCandidates } from "./supersession-graph.js";
5
+ export class ContextSearchIndex {
6
+ candidates;
7
+ docs;
8
+ lexical;
9
+ links;
10
+ texts;
11
+ constructor(pool, previous, dropSuperseded = true) {
12
+ this.candidates = dropSuperseded ? activeCandidates(pool) : pool;
13
+ const texts = new Map();
14
+ this.docs = this.candidates.map((candidate) => {
15
+ const text = candidate.terms.join(" ") + " " + candidate.subject + " " + candidate.summary + " " + candidate.body;
16
+ const old = previous?.texts.get(candidate.id);
17
+ const tokens = old?.text === text ? old.tokens : tokenize(text);
18
+ texts.set(candidate.id, { text, tokens });
19
+ return { ref: candidate, tokens };
20
+ });
21
+ this.texts = texts;
22
+ this.lexical = new LexicalIndex(this.docs, (candidate) => candidate.id, previous?.lexical);
23
+ this.links = new CandidateLinks(this.candidates);
24
+ }
25
+ }
@@ -0,0 +1,22 @@
1
+ import { type RetrievedCandidate } from "./context-retriever.js";
2
+ import { ContextSearchIndex } from "./context-search-index.js";
3
+ import type { ContextCandidate } from "./context-candidate.js";
4
+ export interface ContextSnapshotInput {
5
+ readonly sessionDir: string;
6
+ readonly scopeId: string;
7
+ readonly projectKey?: string;
8
+ readonly indexed?: boolean;
9
+ readonly planScopeId?: string;
10
+ }
11
+ export interface ContextStoreSnapshot {
12
+ readonly key: string;
13
+ readonly signature: string;
14
+ readonly pool: readonly ContextCandidate[];
15
+ readonly index?: ContextSearchIndex;
16
+ packet(maxChars: number): string;
17
+ retrieve(query: string, limit: number): readonly RetrievedCandidate[];
18
+ }
19
+ /** Legacy callers can inspect the entire directory; runtime signatures use exact dependencies. */
20
+ export declare function storeSignature(sessionDir: string, scopes?: readonly string[]): string;
21
+ export declare function loadContextStoreSnapshot(input: ContextSnapshotInput): ContextStoreSnapshot;
22
+ export declare function invalidateContextSnapshots(): void;