@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,410 @@
1
+ import { appendFileSync, existsSync, mkdirSync, readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { sanitizeText } from "../core/text-sanitize.js";
4
+ import { withLockSync } from "./file-lock.js";
5
+ const DECISION_PATTERNS = [
6
+ // IT: "abbiamo deciso di ...", "ho deciso di ...", "si e' deciso di ..."
7
+ { re: /\b(?:abbiamo|ho|si\s*(?:e'|è)|si\s+e)\s+decis[oi]\s+(?:di\s+|che\s+)?(.+)/i, kind: "decided" },
8
+ // IT: "decidiamo di ...", "decido di ..."
9
+ { re: /\bdecid(?:iamo|o|e)\s+(?:di\s+|che\s+)?(.+)/i, kind: "decided" },
10
+ // IT: "da ora (in poi) usiamo ...", "d'ora in poi ...", "d'ora in avanti ..."
11
+ { re: /\b(?:da\s+ora(?:\s+in\s+poi)?|d['’]?\s*ora\s+in\s+(?:poi|avanti))[,:]?\s+(.+)/i, kind: "fromNow" },
12
+ // IT: "useremo ...", "adotteremo ...", "passiamo a ..."
13
+ { re: /\b(?:useremo|adotteremo|adottiamo|passiamo\s+a|optiamo\s+per)\s+(.+)/i, kind: "willUse" },
14
+ // IT: "la scelta e' ...", "scegliamo ...", "abbiamo scelto ..."
15
+ { re: /\b(?:scegliamo|abbiamo\s+scelto|la\s+scelta\s+(?:e'|è)|opt(?:iamo|o))\s+(?:di\s+|per\s+)?(.+)/i, kind: "chosen" },
16
+ // EN: "we decided to ...", "i decided to ...", "it was decided to ..."
17
+ { re: /\b(?:we|i|it\s+was)\s+decided\s+(?:to\s+|that\s+)?(.+)/i, kind: "decided" },
18
+ // EN: "from now on (we use) ...", "going forward ..."
19
+ { re: /\b(?:from\s+now\s+on|going\s+forward|henceforth)[,:]?\s+(.+)/i, kind: "fromNow" },
20
+ // EN: "we'll use ...", "we will use ...", "we are going to use ..."
21
+ { re: /\b(?:we['’]?ll|we\s+will|we['’]?re\s+going\s+to|let['’]?s)\s+(?:use|adopt|go\s+with)\s+(.+)/i, kind: "willUse" },
22
+ // EN: "we chose ...", "the choice is ...", "we'll go with ..."
23
+ { re: /\b(?:we\s+chose|the\s+choice\s+is|we['’]?ll\s+go\s+with|we\s+go\s+with)\s+(.+)/i, kind: "chosen" },
24
+ ];
25
+ // Pattern CAUSALE: "la causa era X quindi/percio' Y" -> decisione=Y, reason=X.
26
+ // Catturiamo causa (g1) ed effetto/azione (g2).
27
+ const CAUSAL_PATTERNS = [
28
+ /\b(?:la\s+causa\s+(?:era|e'|è)|il\s+problema\s+(?:era|e'|è)|il\s+motivo\s+(?:era|e'|è))\s+(.+?)\s+(?:quindi|perci(?:o'|ò)|dunque|allora|cos(?:i'|ì))\s+(.+)/i,
29
+ /\b(?:the\s+(?:cause|issue|problem|reason)\s+was)\s+(.+?)\s+(?:so|therefore|thus|hence)\s+(.+)/i,
30
+ ];
31
+ // Estrae la MOTIVAZIONE da una frase decisionale: clausola dopo
32
+ // "perche'/poiche'/dato che/since/because", oppure "cosi'/per/to ...".
33
+ const REASON_PATTERNS = [
34
+ /\b(?:perch(?:e'|é)|poich(?:e'|é)|dato\s+che|visto\s+che|siccome|in\s+quanto)\s+(.+)/i,
35
+ /\b(?:because|since|as|given\s+that)\s+(.+)/i,
36
+ ];
37
+ // --- detection (puro) ------------------------------------------------------
38
+ // Riconosce le frasi decisionali in un testo (di un singolo messaggio) e ne
39
+ // estrae decision/reason/context. Niente side-effect. Ritorna 0+ match in
40
+ // ordine di apparizione, deduplicati per decisione.
41
+ export function detectDecisions(text, source) {
42
+ const out = [];
43
+ const seen = new Set();
44
+ for (const sentence of splitSentences(text)) {
45
+ const match = matchSentence(sentence, source);
46
+ if (!match)
47
+ continue;
48
+ const key = normalizeKey(match.decision);
49
+ if (!key || seen.has(key))
50
+ continue;
51
+ seen.add(key);
52
+ out.push(match);
53
+ }
54
+ return out;
55
+ }
56
+ // Prova i pattern su UNA frase. Prima il causale (cattura anche la reason),
57
+ // poi i pattern decisionali generici.
58
+ function matchSentence(sentence, source) {
59
+ const s = sentence.trim();
60
+ if (!s || s.length < 6)
61
+ return null;
62
+ for (const re of CAUSAL_PATTERNS) {
63
+ const m = re.exec(s);
64
+ if (m && m[2]) {
65
+ return {
66
+ decision: cleanClause(m[2]),
67
+ reason: cleanClause(m[1] ?? ""),
68
+ context: oneLine(s).slice(0, 280),
69
+ source,
70
+ };
71
+ }
72
+ }
73
+ for (const { re } of DECISION_PATTERNS) {
74
+ const m = re.exec(s);
75
+ if (m && m[1]) {
76
+ const rest = m[1];
77
+ const { decision, reason } = splitReason(rest);
78
+ const d = cleanClause(decision);
79
+ if (!d || d.length < 2)
80
+ continue;
81
+ return { decision: d, reason: cleanClause(reason), context: oneLine(s).slice(0, 280), source };
82
+ }
83
+ }
84
+ return null;
85
+ }
86
+ // Separa la decisione dalla motivazione quando la frase contiene "perche'/...".
87
+ function splitReason(clause) {
88
+ for (const re of REASON_PATTERNS) {
89
+ const m = re.exec(clause);
90
+ if (m && m.index >= 0 && m[1]) {
91
+ return { decision: clause.slice(0, m.index), reason: m[1] };
92
+ }
93
+ }
94
+ return { decision: clause, reason: "" };
95
+ }
96
+ // --- promozione: match -> evento ------------------------------------------
97
+ // Trasforma i match rilevati nei messaggi di un turno in eventi decision.made,
98
+ // assegnando id progressivi, link al task e timestamp. `nextNum` da' il primo
99
+ // numero libero (es. dal DecisionStore). Funzione pura.
100
+ export function promoteDecisions(messages, opts) {
101
+ const events = [];
102
+ let num = opts.startNum ?? 1;
103
+ const ns = opts.ns ? `${opts.ns}-` : "";
104
+ const seen = new Set();
105
+ for (const m of messages) {
106
+ if (m.role !== "user" && m.role !== "assistant")
107
+ continue;
108
+ const source = m.role === "user" ? "user" : "assistant";
109
+ const text = plainText(m);
110
+ if (!text.trim())
111
+ continue;
112
+ for (const match of detectDecisions(text, source)) {
113
+ const key = normalizeKey(match.decision);
114
+ if (seen.has(key))
115
+ continue;
116
+ seen.add(key);
117
+ events.push(toEvent(match, `${ns}D${num}`, opts.task ?? null, opts.now));
118
+ num += 1;
119
+ }
120
+ }
121
+ return events;
122
+ }
123
+ function toEvent(match, id, task, now) {
124
+ const decision = oneLine(match.decision).slice(0, 240);
125
+ const reason = oneLine(match.reason).slice(0, 240);
126
+ const summary = reason ? `${decision} (perche': ${reason})` : decision;
127
+ return {
128
+ type: "decision.made",
129
+ domain: "decisions",
130
+ id,
131
+ decision,
132
+ reason,
133
+ context: oneLine(match.context).slice(0, 280),
134
+ task,
135
+ subject: decision,
136
+ summary: oneLine(summary).slice(0, 280),
137
+ source: match.source,
138
+ createdAt: now,
139
+ };
140
+ }
141
+ // --- formato RoomRecord (richiamabile via recall) --------------------------
142
+ // Rende un DecisionEvent come RoomRecord Danilov, cosi' che il tool recall lo
143
+ // trovi insieme alle stanze. level=0 (foglia), parent=null (resta in frontiera
144
+ // finche' non viene compattato come le stanze). I termini includono "decision"
145
+ // e "decisione" per renderlo facile da cercare.
146
+ export function decisionToRoomRecord(ev) {
147
+ const terms = decisionTerms(ev);
148
+ const body = `INDICE
149
+ 1 = decisione
150
+ 2 = motivazione
151
+ 3 = contesto
152
+ 4 = task
153
+
154
+ DEFINIZIONI
155
+ @decision.made[${ev.id}]: domain=decisions
156
+ @decision[${ev.id}]: "${esc(ev.decision)}"
157
+ @reason[${ev.id}]: "${esc(ev.reason) || "(non espressa)"}"
158
+ @context[${ev.id}]: "${esc(ev.context)}"
159
+ @task[${ev.id}]: ${ev.task ? esc(ev.task) : "(nessuno)"}
160
+ @source[${ev.id}]: ${ev.source}
161
+
162
+ RELAZIONI
163
+ @R: ${ev.id} -> decision.made [ dominio decisions${ev.task ? `, task ${esc(ev.task)}` : ""} ]
164
+
165
+ OUTPUT: ${esc(ev.summary)}`;
166
+ return {
167
+ room: ev.id,
168
+ level: 0,
169
+ title: ev.summary,
170
+ terms,
171
+ body,
172
+ children: [],
173
+ parent: null,
174
+ createdAt: ev.createdAt,
175
+ };
176
+ }
177
+ function decisionTerms(ev) {
178
+ const base = ["decision", "decisione", "decision.made", "decisions"];
179
+ const fromText = tokenize(`${ev.decision} ${ev.reason}`).slice(0, 10);
180
+ return [...new Set([...base, ...fromText])].slice(0, 16);
181
+ }
182
+ // Store append-only degli eventi decision.made su file jsonl dedicato
183
+ // (`<store>.decisions.jsonl`), separato dalle stanze ma nella stessa
184
+ // sessionDir. Espone count/all/nextNum + query/search per il dominio decisions.
185
+ export class DecisionStore {
186
+ file;
187
+ events = [];
188
+ constructor(file) {
189
+ this.file = file;
190
+ }
191
+ static open(sessionDir, storeId) {
192
+ const file = join(sessionDir, `${storeId}.decisions.jsonl`);
193
+ const store = new DecisionStore(file);
194
+ store.reloadFromDisk();
195
+ return store;
196
+ }
197
+ count() {
198
+ return this.events.length;
199
+ }
200
+ all() {
201
+ return this.events;
202
+ }
203
+ // Primo numero libero per gli id D<n> di un namespace (vassallo/castello).
204
+ nextNum(ns) {
205
+ return withLockSync(this.file, () => {
206
+ this.reloadFromDisk();
207
+ const prefix = `${ns ? `${ns}-` : ""}D`;
208
+ let max = 0;
209
+ for (const event of this.events) {
210
+ if (!event.id.startsWith(prefix))
211
+ continue;
212
+ const suffix = event.id.slice(prefix.length);
213
+ if (!/^\d+$/.test(suffix))
214
+ continue;
215
+ const value = Number(suffix);
216
+ if (Number.isSafeInteger(value) && value > max)
217
+ max = value;
218
+ }
219
+ return max + 1;
220
+ });
221
+ }
222
+ // Aggiunge un evento. Il reload sotto lock rende l'idempotenza valida anche
223
+ // quando questa istanza e' stata aperta prima di un writer concorrente.
224
+ append(event) {
225
+ return this.appendAll([event]).length === 1;
226
+ }
227
+ // Aggiunge piu' eventi in una singola transazione append-only e ritorna
228
+ // quelli effettivamente scritti. Duplicati gia' su disco o nello stesso
229
+ // batch vengono ignorati in modo idempotente. Se due writer hanno allocato
230
+ // lo stesso D<n> prima dell'append, il secondo evento (se diverso) viene
231
+ // rinumerato sotto lo stesso lock: nextNum()+append non perde decisioni.
232
+ appendAll(events) {
233
+ if (!events.length)
234
+ return [];
235
+ return withLockSync(this.file, () => {
236
+ this.reloadFromDisk();
237
+ const byId = new Map(this.events.map((event) => [event.id, event]));
238
+ const maxByPrefix = new Map();
239
+ for (const event of this.events)
240
+ updateDecisionMax(maxByPrefix, event.id);
241
+ const written = [];
242
+ for (const incoming of events) {
243
+ // Replay esatto: puo' avere gia' ricevuto un id rinumerato da un altro
244
+ // writer. Il payload (timestamp incluso) ne conserva l'idempotenza.
245
+ if ([...byId.values()].some((event) => sameDecisionPayload(event, incoming)))
246
+ continue;
247
+ let event = incoming;
248
+ if (byId.has(event.id)) {
249
+ const parts = decisionIdParts(event.id);
250
+ const prefix = parts?.prefix ?? "";
251
+ let next = (maxByPrefix.get(prefix) ?? 0) + 1;
252
+ while (byId.has(`${prefix}D${next}`))
253
+ next += 1;
254
+ event = { ...event, id: `${prefix}D${next}` };
255
+ }
256
+ byId.set(event.id, event);
257
+ updateDecisionMax(maxByPrefix, event.id);
258
+ written.push(event);
259
+ }
260
+ if (!written.length)
261
+ return written;
262
+ mkdirSync(dirname(this.file), { recursive: true });
263
+ appendFileSync(this.file, written.map((event) => JSON.stringify(event)).join("\n") + "\n", "utf8");
264
+ this.events.push(...written);
265
+ return written;
266
+ });
267
+ }
268
+ reloadFromDisk() {
269
+ this.events = [];
270
+ if (!existsSync(this.file))
271
+ return;
272
+ const raw = readFileSync(this.file, "utf8");
273
+ for (const line of raw.split("\n")) {
274
+ if (!line.trim())
275
+ continue;
276
+ try {
277
+ this.events.push(normalizeEvent(JSON.parse(line)));
278
+ }
279
+ catch {
280
+ // riga corrotta: ignorata
281
+ }
282
+ }
283
+ }
284
+ byTask(task) {
285
+ return this.events.filter((e) => e.task === task);
286
+ }
287
+ // Ricerca BM25-lite (offline) sugli eventi decisionali.
288
+ search(query, limit = 5) {
289
+ const qTokens = unique(tokenize(query));
290
+ if (!qTokens.length) {
291
+ return this.events.slice(-limit).reverse().map((event) => ({ event, score: 0 }));
292
+ }
293
+ const n = this.events.length || 1;
294
+ const df = new Map();
295
+ const docTokens = this.events.map((e) => {
296
+ const toks = tokenize(`${e.decision} ${e.reason} ${e.context}`);
297
+ for (const t of new Set(toks))
298
+ df.set(t, (df.get(t) ?? 0) + 1);
299
+ return toks;
300
+ });
301
+ const hits = this.events.map((event, i) => {
302
+ const toks = docTokens[i] ?? [];
303
+ const tf = new Map();
304
+ for (const t of toks)
305
+ tf.set(t, (tf.get(t) ?? 0) + 1);
306
+ let score = 0;
307
+ for (const q of qTokens) {
308
+ const f = tf.get(q) ?? 0;
309
+ if (!f)
310
+ continue;
311
+ score += (f / (f + 1.2)) * Math.log(1 + n / (df.get(q) ?? 1));
312
+ }
313
+ return { event, score };
314
+ });
315
+ return hits.filter((h) => h.score > 0).sort((a, b) => b.score - a.score).slice(0, limit);
316
+ }
317
+ // INDICE compatto delle decisioni (per /regno o iniezione contestuale).
318
+ indexBlock() {
319
+ if (!this.events.length)
320
+ return "";
321
+ const rows = this.events
322
+ .map((e) => `@decision[${e.id}]: "${esc(e.summary)}"${e.task ? ` · task=${esc(e.task)}` : ""}`)
323
+ .join("\n");
324
+ return `INDICE_DECISIONI (dominio decisions, piano di lavoro)
325
+ Decisioni promosse automaticamente dalle conversazioni. Richiamabili col tool
326
+ "recall" (per query o per id D<n>).
327
+
328
+ ${rows}
329
+
330
+ OUTPUT: indice decisioni; dettaglio via recall.`;
331
+ }
332
+ }
333
+ function decisionIdParts(id) {
334
+ const match = /^(.*?)(?:D)(\d+)$/.exec(id);
335
+ if (!match)
336
+ return null;
337
+ const value = Number(match[2]);
338
+ return Number.isSafeInteger(value) ? { prefix: match[1] ?? "", value } : null;
339
+ }
340
+ function updateDecisionMax(maxByPrefix, id) {
341
+ const parts = decisionIdParts(id);
342
+ if (!parts)
343
+ return;
344
+ maxByPrefix.set(parts.prefix, Math.max(maxByPrefix.get(parts.prefix) ?? 0, parts.value));
345
+ }
346
+ function sameDecisionPayload(a, b) {
347
+ return a.type === b.type && a.domain === b.domain && a.decision === b.decision &&
348
+ a.reason === b.reason && a.context === b.context && a.task === b.task &&
349
+ a.subject === b.subject && a.summary === b.summary && a.source === b.source &&
350
+ a.createdAt === b.createdAt;
351
+ }
352
+ function normalizeEvent(raw) {
353
+ return {
354
+ type: "decision.made",
355
+ domain: "decisions",
356
+ id: raw.id ?? "D?",
357
+ decision: raw.decision ?? "",
358
+ reason: raw.reason ?? "",
359
+ context: raw.context ?? "",
360
+ task: raw.task ?? null,
361
+ subject: raw.subject ?? raw.decision ?? "",
362
+ summary: raw.summary ?? raw.decision ?? "",
363
+ source: raw.source === "assistant" ? "assistant" : "user",
364
+ createdAt: typeof raw.createdAt === "number" ? raw.createdAt : 0,
365
+ };
366
+ }
367
+ // --- util ------------------------------------------------------------------
368
+ function plainText(message) {
369
+ return message.content
370
+ .filter((p) => p.type === "text")
371
+ .map((p) => p.text)
372
+ .join("\n");
373
+ }
374
+ // Divide il testo in frasi su terminatori e a-capo, mantenendo clausole utili.
375
+ function splitSentences(text) {
376
+ return text
377
+ .split(/(?<=[.!?\n])\s+|\n+/)
378
+ .map((s) => s.trim())
379
+ .filter(Boolean);
380
+ }
381
+ // Pulisce una clausola: toglie punteggiatura di bordo, "che/di" iniziali residui
382
+ // e spazi multipli. Conserva il contenuto sostanziale.
383
+ function cleanClause(s) {
384
+ return oneLine(s)
385
+ .replace(/^[\s,;:]+/, "")
386
+ .replace(/[\s.,;:]+$/, "")
387
+ .replace(/^(?:di|che|to|that)\s+/i, "")
388
+ .trim();
389
+ }
390
+ function normalizeKey(s) {
391
+ return oneLine(s).toLowerCase().replace(/[^a-z0-9 ]/g, "").trim();
392
+ }
393
+ function tokenize(s) {
394
+ return (s.toLowerCase().match(/[a-z0-9_./-]{2,}/g) ?? []).filter((t) => !STOP.has(t));
395
+ }
396
+ const STOP = new Set([
397
+ "the", "and", "for", "this", "that", "with", "from", "into", "you", "are", "use",
398
+ "il", "lo", "la", "le", "gli", "un", "uno", "una", "di", "da", "in", "su",
399
+ "che", "con", "per", "non", "ed", "tra", "fra", "come", "piu", "quindi",
400
+ "abbiamo", "deciso", "decidiamo", "ora", "poi", "usiamo", "useremo",
401
+ ]);
402
+ function unique(values) {
403
+ return [...new Set(values.filter(Boolean))];
404
+ }
405
+ function oneLine(value) {
406
+ return sanitizeText(value).replace(/\s+/g, " ").trim();
407
+ }
408
+ function esc(value) {
409
+ return oneLine(value).replace(/"/g, "'");
410
+ }
@@ -0,0 +1,12 @@
1
+ export interface DeltaInput {
2
+ readonly stable: string;
3
+ readonly previousStableHash?: string | null;
4
+ readonly delta: string;
5
+ }
6
+ export interface DeltaResult {
7
+ readonly stableHash: string;
8
+ readonly stableChanged: boolean;
9
+ readonly emit: string;
10
+ }
11
+ export declare function hashText(text: string): string;
12
+ export declare function computeDelta(input: DeltaInput): DeltaResult;
@@ -0,0 +1,36 @@
1
+ // Delta Context (metodo Danilov, Memory OS).
2
+ //
3
+ // Non reinviare tutto a ogni turno. Si separa il CONTESTO STABILE (system,
4
+ // Vision, policy, piano attivo) dal DELTA del turno (nuovi eventi/evidenze).
5
+ // Tramite un hash del blocco stabile si capisce se e' cambiato: se no, il pack
6
+ // puo' riferirlo come gia' noto invece di ripeterlo per intero.
7
+ //
8
+ // Cosa e' stabile? Cosa e' cambiato? Cosa serve ora? Cosa lascio come handle?
9
+ //
10
+ // Modulo PURO e deterministico: hash FNV-1a (no crypto, no deps), nessun I/O.
11
+ // FNV-1a 32-bit in hex: hash deterministico e veloce, senza dipendenze.
12
+ export function hashText(text) {
13
+ let h = 0x811c9dc5;
14
+ for (let i = 0; i < text.length; i += 1) {
15
+ h ^= text.charCodeAt(i);
16
+ h = Math.imul(h, 0x01000193);
17
+ }
18
+ // >>> 0 per interpretarlo come unsigned.
19
+ return (h >>> 0).toString(16).padStart(8, "0");
20
+ }
21
+ // Calcola il delta: se lo stabile e' invariato, non lo reinvia per intero ma lo
22
+ // referenzia per hash. Deterministico.
23
+ export function computeDelta(input) {
24
+ const stableHash = hashText(input.stable);
25
+ const stableChanged = !input.previousStableHash || input.previousStableHash !== stableHash;
26
+ const delta = input.delta.trim();
27
+ if (stableChanged) {
28
+ // Stabile cambiato (o primo turno): emetti tutto.
29
+ const emit = [input.stable.trim(), delta].filter(Boolean).join("\n\n");
30
+ return { stableHash, stableChanged: true, emit };
31
+ }
32
+ // Stabile invariato: riferiscilo per hash, emetti solo il delta.
33
+ const ref = `[CTX:STABLE_REF]\n@stabile[invariato]: hash=${stableHash} [ contesto stabile gia' noto dal turno precedente ]`;
34
+ const emit = [ref, delta].filter(Boolean).join("\n\n");
35
+ return { stableHash, stableChanged: false, emit };
36
+ }
@@ -0,0 +1,27 @@
1
+ import { type ScoreWeights, type TierThresholds } from "./context-scorer.js";
2
+ import { type ContextScore } from "./context-candidate.js";
3
+ export interface DevCompileInput {
4
+ readonly sessionDir: string;
5
+ readonly scopeId: string;
6
+ readonly userText: string;
7
+ readonly totalTokens?: number;
8
+ readonly now?: number;
9
+ readonly goal?: string;
10
+ readonly stack?: readonly string[];
11
+ readonly scope?: readonly string[];
12
+ readonly done?: string;
13
+ readonly constraints?: readonly string[];
14
+ readonly nextAction?: string;
15
+ readonly requiredTests?: readonly string[];
16
+ readonly recallBlock?: string;
17
+ readonly toolBlock?: string;
18
+ readonly systemBlock?: string;
19
+ readonly weights?: ScoreWeights;
20
+ readonly thresholds?: TierThresholds;
21
+ }
22
+ export interface DevCompiledContext {
23
+ readonly pack: string;
24
+ readonly selected: readonly ContextScore[];
25
+ readonly tokensUsed: number;
26
+ }
27
+ export declare function compileDevContext(input: DevCompileInput): DevCompiledContext;
@@ -0,0 +1,133 @@
1
+ // Dev Context Compiler (metodo Danilov, Memory OS).
2
+ //
3
+ // Variante del Context Window Compiler orientata allo SVILUPPO: usa il Dev
4
+ // Context Layout (dev-context-layout) invece del layout generico. Stessa
5
+ // pipeline deterministica del compiler canonico:
6
+ //
7
+ // collect -> candidati dagli store (candidate-collector)
8
+ // retrieve -> ranking ibrido, drop superseded (context-retriever)
9
+ // score -> scoring multi-fattore + tier (context-scorer)
10
+ // categorize -> smista i candidati nelle zone dev (decisioni, code graph,
11
+ // errori/test, patch plan, evidence)
12
+ // budget -> alloca token per zona dev, packing greedy (budget-allocator)
13
+ // layout -> assembla il Dev Prompt Pack con anchor tecnici
14
+ //
15
+ // Modulo di SOLA LETTURA verso gli store (via collector). Nessuna scrittura.
16
+ import { collectCandidates } from "./candidate-collector.js";
17
+ import { retrieve } from "./context-retriever.js";
18
+ import { scoreCandidate, } from "./context-scorer.js";
19
+ import { estimateCandidateTokens, } from "./context-candidate.js";
20
+ import { estimateTokens, packToBudget } from "./budget-allocator.js";
21
+ import { assembleDevLayout, buildDevMissionAnchor, buildDevTailAnchor, categorizeCandidates, renderCodeGraph, renderDecisions, renderEvidence, renderFailures, renderHandles, renderPatchPlan, } from "./dev-context-layout.js";
22
+ const DEV_DEFAULT_TOTAL = 3_000;
23
+ // Quote di budget per zona dev (sommano a ~1, escluso user). Le zone dev
24
+ // danno piu' peso a code graph, errori/test e patch plan rispetto al layout
25
+ // generico: e' la roba che serve a chi tocca codice.
26
+ const DEV_SHARES = {
27
+ mission: 0.06,
28
+ constraints: 0.06,
29
+ decisions: 0.1,
30
+ codegraph: 0.22,
31
+ failures: 0.18,
32
+ evidence: 0.16,
33
+ patchplan: 0.1,
34
+ recall: 0.06,
35
+ tail: 0.06,
36
+ };
37
+ // Compila la dev context window del turno. Deterministico a parita' di store+now.
38
+ export function compileDevContext(input) {
39
+ const now = input.now ?? Date.now();
40
+ const total = input.totalTokens && input.totalTokens > 0 ? input.totalTokens : DEV_DEFAULT_TOTAL;
41
+ const userTokens = estimateTokens(input.userText);
42
+ const budget = Math.max(0, total - userTokens);
43
+ const share = (pct) => Math.floor(budget * pct);
44
+ // 1) collect + 2) retrieve.
45
+ const pool = collectCandidates({ sessionDir: input.sessionDir, scopeId: input.scopeId });
46
+ const retrieved = retrieve(pool, { query: input.userText, limit: 40 }).map((r) => r.candidate);
47
+ // 3) score (novelty incrementale).
48
+ const ctx = {
49
+ query: input.userText,
50
+ now,
51
+ tokenBudget: budget,
52
+ ...(input.weights ? { weights: input.weights } : {}),
53
+ ...(input.thresholds ? { thresholds: input.thresholds } : {}),
54
+ };
55
+ const scored = scoreWithNovelty(retrieved, ctx);
56
+ // Solo i candidati che meritano spazio (tier high/mid). I "low" restano fuori.
57
+ const kept = scored.filter((s) => s.tier !== "low");
58
+ const cands = kept.map((s) => s.candidate);
59
+ const scoreOf = new Map(kept.map((s) => [s.candidate.id, s.score]));
60
+ // 4) categorize: smista i candidati nelle zone dev.
61
+ const buckets = categorizeCandidates(cands);
62
+ // 5) budget per zona: packing greedy per categoria.
63
+ const pack = (list, maxTokens, form) => packToBudget(list.map((c) => ({ ref: c, tokens: estimateCandidateTokens(c, form), priority: scoreOf.get(c.id) ?? 0 })), maxTokens).included;
64
+ const decisionsSel = pack(buckets.decisions, share(DEV_SHARES.decisions), "handle");
65
+ const codegraphSel = pack(buckets.codegraph, share(DEV_SHARES.codegraph), "handle");
66
+ const failuresSel = pack(buckets.failures, share(DEV_SHARES.failures), "body");
67
+ const evidenceSel = pack(buckets.evidence, share(DEV_SHARES.evidence), "body");
68
+ const patchplanSel = pack(buckets.patchplan, share(DEV_SHARES.patchplan), "handle");
69
+ // Gli scartati dalle zone "body" scendono a recall handles (richiamabili).
70
+ const usedIds = new Set([...decisionsSel, ...codegraphSel, ...failuresSel, ...evidenceSel, ...patchplanSel].map((c) => c.id));
71
+ const leftovers = cands.filter((c) => !usedIds.has(c.id));
72
+ const recallSel = pack(leftovers, share(DEV_SHARES.recall), "handle");
73
+ // Decisioni attive (per il tail anchor).
74
+ const activeDecisions = decisionsSel.map((c) => c.summary || c.subject).slice(0, 4);
75
+ const goal = input.goal ?? input.userText;
76
+ // 6) layout: assembla le zone dev.
77
+ const content = {
78
+ ...(input.systemBlock ? { system: input.systemBlock } : {}),
79
+ mission: buildDevMissionAnchor({
80
+ goal,
81
+ ...(input.stack ? { stack: input.stack } : {}),
82
+ ...(input.scope ? { scope: input.scope } : {}),
83
+ ...(input.done ? { done: input.done } : {}),
84
+ }),
85
+ ...(input.constraints?.length
86
+ ? { constraints: renderConstraints(input.constraints) }
87
+ : {}),
88
+ decisions: renderDecisions(decisionsSel),
89
+ codegraph: renderCodeGraph(codegraphSel),
90
+ failures: renderFailures(failuresSel),
91
+ evidence: renderEvidence(evidenceSel),
92
+ patchplan: renderPatchPlan(patchplanSel),
93
+ recall: input.recallBlock ?? renderHandles(recallSel),
94
+ ...(input.toolBlock ? { tool: input.toolBlock } : {}),
95
+ tail: buildDevTailAnchor({
96
+ goal,
97
+ ...(input.constraints ? { constraints: input.constraints } : {}),
98
+ ...(activeDecisions.length ? { activeDecisions } : {}),
99
+ ...(input.nextAction ? { nextAction: input.nextAction } : {}),
100
+ ...(input.requiredTests ? { requiredTests: input.requiredTests } : {}),
101
+ recallPolicy: true,
102
+ }),
103
+ };
104
+ const out = assembleDevLayout(content);
105
+ return { pack: out, selected: scored, tokensUsed: estimateTokens(out) };
106
+ }
107
+ // --- helper -----------------------------------------------------------------
108
+ // Vincoli non negoziabili: blocco in testa che il modello non deve violare.
109
+ function renderConstraints(constraints) {
110
+ const lines = ["INDICE", "1 = vincoli_duri", "", "DEFINIZIONI"];
111
+ let i = 1;
112
+ for (const c of constraints) {
113
+ lines.push(`@vincolo[${i}]: "${c.replace(/\s+/g, " ").trim().replace(/"/g, "'")}"`);
114
+ i += 1;
115
+ }
116
+ lines.push("", "OUTPUT: questi vincoli sono NON negoziabili; una violazione invalida il lavoro.");
117
+ return lines.join("\n");
118
+ }
119
+ // Scoring con novelty incrementale (penalizza i simili ai gia' accettati).
120
+ function scoreWithNovelty(candidates, ctx) {
121
+ const base = candidates
122
+ .map((c) => scoreCandidate(c, ctx))
123
+ .sort((a, b) => b.score - a.score || a.candidate.id.localeCompare(b.candidate.id));
124
+ const seen = [];
125
+ const out = [];
126
+ for (const s of base) {
127
+ const rescored = scoreCandidate(s.candidate, ctx, { seenTermSets: seen });
128
+ out.push(rescored);
129
+ if (rescored.tier !== "low")
130
+ seen.push(new Set(s.candidate.terms));
131
+ }
132
+ return out.sort((a, b) => b.score - a.score || a.candidate.id.localeCompare(b.candidate.id));
133
+ }
@@ -0,0 +1,30 @@
1
+ import type { ContextCandidate } from "./context-candidate.js";
2
+ export type DevZone = "system" | "mission" | "constraints" | "decisions" | "codegraph" | "failures" | "evidence" | "patchplan" | "recall" | "tool" | "user" | "tail";
3
+ export declare const DEV_ZONE_ORDER: readonly DevZone[];
4
+ export type DevZoneContent = Partial<Record<DevZone, string>>;
5
+ export interface DevMissionAnchorInput {
6
+ readonly goal: string;
7
+ readonly stack?: readonly string[];
8
+ readonly done?: string;
9
+ readonly scope?: readonly string[];
10
+ }
11
+ export declare function buildDevMissionAnchor(input: DevMissionAnchorInput): string;
12
+ export interface DevTailAnchorInput {
13
+ readonly goal: string;
14
+ readonly constraints?: readonly string[];
15
+ readonly activeDecisions?: readonly string[];
16
+ readonly nextAction?: string;
17
+ readonly requiredTests?: readonly string[];
18
+ readonly recallPolicy?: boolean;
19
+ }
20
+ export declare function buildDevTailAnchor(input: DevTailAnchorInput): string;
21
+ export type DevCategory = "decisions" | "codegraph" | "failures" | "patchplan" | "evidence";
22
+ export declare function categorizeCandidate(c: ContextCandidate): DevCategory;
23
+ export declare function categorizeCandidates(cands: readonly ContextCandidate[]): Readonly<Record<DevCategory, readonly ContextCandidate[]>>;
24
+ export declare function renderDecisions(cands: readonly ContextCandidate[]): string;
25
+ export declare function renderCodeGraph(cands: readonly ContextCandidate[]): string;
26
+ export declare function renderFailures(cands: readonly ContextCandidate[]): string;
27
+ export declare function renderPatchPlan(cands: readonly ContextCandidate[]): string;
28
+ export declare function renderEvidence(cands: readonly ContextCandidate[]): string;
29
+ export declare function renderHandles(cands: readonly ContextCandidate[]): string;
30
+ export declare function assembleDevLayout(content: DevZoneContent): string;