synabun 1.3.0 → 2.0.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 (1163) hide show
  1. package/CHANGELOG.md +205 -662
  2. package/LICENSE-COMMERCIAL.md +33 -0
  3. package/NOTICE +17 -0
  4. package/README.md +175 -853
  5. package/THIRD-PARTY-LICENSES.md +136 -0
  6. package/benchmarks/browser-live-results.json +79 -0
  7. package/benchmarks/browser-v2-results.json +258 -0
  8. package/benchmarks/fixtures/browser/README.md +57 -0
  9. package/benchmarks/fixtures/browser/page-state.json +132 -0
  10. package/benchmarks/fixtures/browser/social.json +92 -0
  11. package/benchmarks/fixtures/browser/target.json +319 -0
  12. package/benchmarks/fixtures/desktop/README.md +58 -0
  13. package/benchmarks/fixtures/desktop/abstention.json +59 -0
  14. package/benchmarks/fixtures/desktop/adversarial.json +22 -0
  15. package/benchmarks/fixtures/desktop/forbidden.json +93 -0
  16. package/benchmarks/fixtures/desktop/generate.mjs +1023 -0
  17. package/benchmarks/fixtures/desktop/target.json +136 -0
  18. package/bin/synabun.js +30 -0
  19. package/docs/whatsapp.md +325 -0
  20. package/hooks/claude-code/post-plan.mjs +613 -391
  21. package/hooks/claude-code/post-remember.mjs +246 -122
  22. package/hooks/claude-code/pre-compact.mjs +171 -110
  23. package/hooks/claude-code/pre-task.mjs +133 -0
  24. package/hooks/claude-code/pre-websearch.mjs +15 -4
  25. package/hooks/claude-code/prompt-origin.mjs +94 -0
  26. package/hooks/claude-code/prompt-submit.mjs +1244 -861
  27. package/hooks/claude-code/session-start.mjs +114 -156
  28. package/hooks/claude-code/shared.mjs +1228 -368
  29. package/hooks/claude-code/state.mjs +167 -0
  30. package/hooks/claude-code/stop.mjs +515 -140
  31. package/hooks/claude-code/subagent-start.mjs +154 -0
  32. package/hooks/claude-code/subagent-stop.mjs +102 -0
  33. package/hooks/claude-code/task-gate.mjs +150 -0
  34. package/launcher.mjs +40 -0
  35. package/lib/claude-hooks.js +137 -0
  36. package/lib/claude-usage-audit.js +141 -0
  37. package/lib/client-config-repair.js +145 -0
  38. package/lib/data-home-migration.js +502 -0
  39. package/lib/desktop-pwa.js +206 -0
  40. package/lib/external-tools.js +221 -0
  41. package/lib/first-launch-protection.js +245 -0
  42. package/lib/packaged-runtime.js +110 -0
  43. package/lib/paths.d.ts +21 -0
  44. package/lib/paths.js +103 -0
  45. package/lib/start-launcher.js +1309 -0
  46. package/mcp-server/dist/config.d.ts +22 -0
  47. package/mcp-server/dist/config.d.ts.map +1 -0
  48. package/mcp-server/dist/config.js +109 -0
  49. package/mcp-server/dist/config.js.map +1 -0
  50. package/mcp-server/dist/http.d.ts +30 -0
  51. package/mcp-server/dist/http.d.ts.map +1 -0
  52. package/mcp-server/dist/http.js +276 -0
  53. package/mcp-server/dist/http.js.map +1 -0
  54. package/mcp-server/dist/index.d.ts +48 -0
  55. package/mcp-server/dist/index.d.ts.map +1 -0
  56. package/mcp-server/dist/index.js +538 -0
  57. package/mcp-server/dist/index.js.map +1 -0
  58. package/mcp-server/dist/preload-http.d.ts +3 -0
  59. package/mcp-server/dist/preload-http.d.ts.map +1 -0
  60. package/mcp-server/dist/preload-http.js +28 -0
  61. package/mcp-server/dist/preload-http.js.map +1 -0
  62. package/mcp-server/dist/preload.d.ts +3 -0
  63. package/mcp-server/dist/preload.d.ts.map +1 -0
  64. package/mcp-server/dist/preload.js +32 -0
  65. package/mcp-server/dist/preload.js.map +1 -0
  66. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts +19 -0
  67. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts.map +1 -0
  68. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js +403 -0
  69. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js.map +1 -0
  70. package/mcp-server/dist/scripts/setup-embeddings.d.ts +3 -0
  71. package/mcp-server/dist/scripts/setup-embeddings.d.ts.map +1 -0
  72. package/mcp-server/dist/scripts/setup-embeddings.js +15 -0
  73. package/mcp-server/dist/scripts/setup-embeddings.js.map +1 -0
  74. package/mcp-server/dist/services/assistant-judgments.d.ts +79 -0
  75. package/mcp-server/dist/services/assistant-judgments.d.ts.map +1 -0
  76. package/mcp-server/dist/services/assistant-judgments.js +128 -0
  77. package/mcp-server/dist/services/assistant-judgments.js.map +1 -0
  78. package/mcp-server/dist/services/browser-assist-gate.d.ts +314 -0
  79. package/mcp-server/dist/services/browser-assist-gate.d.ts.map +1 -0
  80. package/mcp-server/dist/services/browser-assist-gate.js +344 -0
  81. package/mcp-server/dist/services/browser-assist-gate.js.map +1 -0
  82. package/mcp-server/dist/services/browser-assist.d.ts +104 -0
  83. package/mcp-server/dist/services/browser-assist.d.ts.map +1 -0
  84. package/mcp-server/dist/services/browser-assist.js +282 -0
  85. package/mcp-server/dist/services/browser-assist.js.map +1 -0
  86. package/mcp-server/dist/services/browser-bench.d.ts +772 -0
  87. package/mcp-server/dist/services/browser-bench.d.ts.map +1 -0
  88. package/mcp-server/dist/services/browser-bench.js +424 -0
  89. package/mcp-server/dist/services/browser-bench.js.map +1 -0
  90. package/mcp-server/dist/services/browser-judgments.d.ts +196 -0
  91. package/mcp-server/dist/services/browser-judgments.d.ts.map +1 -0
  92. package/mcp-server/dist/services/browser-judgments.js +363 -0
  93. package/mcp-server/dist/services/browser-judgments.js.map +1 -0
  94. package/mcp-server/dist/services/browser-risk.d.ts +166 -0
  95. package/mcp-server/dist/services/browser-risk.d.ts.map +1 -0
  96. package/mcp-server/dist/services/browser-risk.js +458 -0
  97. package/mcp-server/dist/services/browser-risk.js.map +1 -0
  98. package/mcp-server/dist/services/categories.d.ts +61 -0
  99. package/mcp-server/dist/services/categories.d.ts.map +1 -0
  100. package/mcp-server/dist/services/categories.js +377 -0
  101. package/mcp-server/dist/services/categories.js.map +1 -0
  102. package/mcp-server/dist/services/codex-config-heal.d.ts +49 -0
  103. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -0
  104. package/mcp-server/dist/services/codex-config-heal.js +346 -0
  105. package/mcp-server/dist/services/codex-config-heal.js.map +1 -0
  106. package/mcp-server/dist/services/desktop-assist-gate.d.ts +198 -0
  107. package/mcp-server/dist/services/desktop-assist-gate.d.ts.map +1 -0
  108. package/mcp-server/dist/services/desktop-assist-gate.js +202 -0
  109. package/mcp-server/dist/services/desktop-assist-gate.js.map +1 -0
  110. package/mcp-server/dist/services/desktop-assist.d.ts +104 -0
  111. package/mcp-server/dist/services/desktop-assist.d.ts.map +1 -0
  112. package/mcp-server/dist/services/desktop-assist.js +266 -0
  113. package/mcp-server/dist/services/desktop-assist.js.map +1 -0
  114. package/mcp-server/dist/services/desktop-bench.d.ts +553 -0
  115. package/mcp-server/dist/services/desktop-bench.d.ts.map +1 -0
  116. package/mcp-server/dist/services/desktop-bench.js +311 -0
  117. package/mcp-server/dist/services/desktop-bench.js.map +1 -0
  118. package/mcp-server/dist/services/desktop-client.d.ts +23 -0
  119. package/mcp-server/dist/services/desktop-client.d.ts.map +1 -0
  120. package/mcp-server/dist/services/desktop-client.js +79 -0
  121. package/mcp-server/dist/services/desktop-client.js.map +1 -0
  122. package/mcp-server/dist/services/desktop-judgments.d.ts +125 -0
  123. package/mcp-server/dist/services/desktop-judgments.d.ts.map +1 -0
  124. package/mcp-server/dist/services/desktop-judgments.js +177 -0
  125. package/mcp-server/dist/services/desktop-judgments.js.map +1 -0
  126. package/mcp-server/dist/services/desktop-risk.d.ts +283 -0
  127. package/mcp-server/dist/services/desktop-risk.d.ts.map +1 -0
  128. package/mcp-server/dist/services/desktop-risk.js +605 -0
  129. package/mcp-server/dist/services/desktop-risk.js.map +1 -0
  130. package/mcp-server/dist/services/discord.d.ts +112 -0
  131. package/mcp-server/dist/services/discord.d.ts.map +1 -0
  132. package/mcp-server/dist/services/discord.js +477 -0
  133. package/mcp-server/dist/services/discord.js.map +1 -0
  134. package/mcp-server/dist/services/edit-stale.d.ts +81 -0
  135. package/mcp-server/dist/services/edit-stale.d.ts.map +1 -0
  136. package/mcp-server/dist/services/edit-stale.js +358 -0
  137. package/mcp-server/dist/services/edit-stale.js.map +1 -0
  138. package/mcp-server/dist/services/embedding-service.d.ts +16 -0
  139. package/mcp-server/dist/services/embedding-service.d.ts.map +1 -0
  140. package/mcp-server/dist/services/embedding-service.js +126 -0
  141. package/mcp-server/dist/services/embedding-service.js.map +1 -0
  142. package/mcp-server/dist/services/embedding-worker.d.ts +2 -0
  143. package/mcp-server/dist/services/embedding-worker.d.ts.map +1 -0
  144. package/mcp-server/dist/services/embedding-worker.js +52 -0
  145. package/mcp-server/dist/services/embedding-worker.js.map +1 -0
  146. package/mcp-server/dist/services/fb-regions.d.ts +71 -0
  147. package/mcp-server/dist/services/fb-regions.d.ts.map +1 -0
  148. package/mcp-server/dist/services/fb-regions.js +211 -0
  149. package/mcp-server/dist/services/fb-regions.js.map +1 -0
  150. package/mcp-server/dist/services/file-checksums.d.ts +22 -0
  151. package/mcp-server/dist/services/file-checksums.d.ts.map +1 -0
  152. package/mcp-server/dist/services/file-checksums.js +55 -0
  153. package/mcp-server/dist/services/file-checksums.js.map +1 -0
  154. package/mcp-server/dist/services/file-excerpt.d.ts +24 -0
  155. package/mcp-server/dist/services/file-excerpt.d.ts.map +1 -0
  156. package/mcp-server/dist/services/file-excerpt.js +65 -0
  157. package/mcp-server/dist/services/file-excerpt.js.map +1 -0
  158. package/mcp-server/dist/services/identity.d.ts +124 -0
  159. package/mcp-server/dist/services/identity.d.ts.map +1 -0
  160. package/mcp-server/dist/services/identity.js +241 -0
  161. package/mcp-server/dist/services/identity.js.map +1 -0
  162. package/mcp-server/dist/services/local-embeddings.d.ts +2 -0
  163. package/mcp-server/dist/services/local-embeddings.d.ts.map +1 -0
  164. package/mcp-server/dist/services/local-embeddings.js +3 -0
  165. package/mcp-server/dist/services/local-embeddings.js.map +1 -0
  166. package/mcp-server/dist/services/memory-client.d.ts +4 -0
  167. package/mcp-server/dist/services/memory-client.d.ts.map +1 -0
  168. package/mcp-server/dist/services/memory-client.js +27 -0
  169. package/mcp-server/dist/services/memory-client.js.map +1 -0
  170. package/mcp-server/dist/services/memory-judge-backfill.d.ts +135 -0
  171. package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -0
  172. package/mcp-server/dist/services/memory-judge-backfill.js +510 -0
  173. package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -0
  174. package/mcp-server/dist/services/memory-judgments.d.ts +362 -0
  175. package/mcp-server/dist/services/memory-judgments.d.ts.map +1 -0
  176. package/mcp-server/dist/services/memory-judgments.js +674 -0
  177. package/mcp-server/dist/services/memory-judgments.js.map +1 -0
  178. package/mcp-server/dist/services/memory-maintenance.d.ts +108 -0
  179. package/mcp-server/dist/services/memory-maintenance.d.ts.map +1 -0
  180. package/mcp-server/dist/services/memory-maintenance.js +403 -0
  181. package/mcp-server/dist/services/memory-maintenance.js.map +1 -0
  182. package/mcp-server/dist/services/memory-retrieval.d.ts +66 -0
  183. package/mcp-server/dist/services/memory-retrieval.d.ts.map +1 -0
  184. package/mcp-server/dist/services/memory-retrieval.js +412 -0
  185. package/mcp-server/dist/services/memory-retrieval.js.map +1 -0
  186. package/mcp-server/dist/services/memory-schema.d.ts +16 -0
  187. package/mcp-server/dist/services/memory-schema.d.ts.map +1 -0
  188. package/mcp-server/dist/services/memory-schema.js +282 -0
  189. package/mcp-server/dist/services/memory-schema.js.map +1 -0
  190. package/mcp-server/dist/services/memory-sessions.d.ts +24 -0
  191. package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -0
  192. package/mcp-server/dist/services/memory-sessions.js +110 -0
  193. package/mcp-server/dist/services/memory-sessions.js.map +1 -0
  194. package/mcp-server/dist/services/memory-triage.d.ts +60 -0
  195. package/mcp-server/dist/services/memory-triage.d.ts.map +1 -0
  196. package/mcp-server/dist/services/memory-triage.js +189 -0
  197. package/mcp-server/dist/services/memory-triage.js.map +1 -0
  198. package/mcp-server/dist/services/memory-verification.d.ts +24 -0
  199. package/mcp-server/dist/services/memory-verification.d.ts.map +1 -0
  200. package/mcp-server/dist/services/memory-verification.js +92 -0
  201. package/mcp-server/dist/services/memory-verification.js.map +1 -0
  202. package/mcp-server/dist/services/memory-writer.d.ts +26 -0
  203. package/mcp-server/dist/services/memory-writer.d.ts.map +1 -0
  204. package/mcp-server/dist/services/memory-writer.js +126 -0
  205. package/mcp-server/dist/services/memory-writer.js.map +1 -0
  206. package/mcp-server/dist/services/neural-interface.d.ts +439 -0
  207. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -0
  208. package/mcp-server/dist/services/neural-interface.js +1135 -0
  209. package/mcp-server/dist/services/neural-interface.js.map +1 -0
  210. package/mcp-server/dist/services/profiles.d.ts +120 -0
  211. package/mcp-server/dist/services/profiles.d.ts.map +1 -0
  212. package/mcp-server/dist/services/profiles.js +387 -0
  213. package/mcp-server/dist/services/profiles.js.map +1 -0
  214. package/mcp-server/dist/services/secret-gate.d.ts +29 -0
  215. package/mcp-server/dist/services/secret-gate.d.ts.map +1 -0
  216. package/mcp-server/dist/services/secret-gate.js +43 -0
  217. package/mcp-server/dist/services/secret-gate.js.map +1 -0
  218. package/mcp-server/dist/services/server-instructions.d.ts +10 -0
  219. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -0
  220. package/mcp-server/dist/services/server-instructions.js +101 -0
  221. package/mcp-server/dist/services/server-instructions.js.map +1 -0
  222. package/mcp-server/dist/services/sqlite.d.ts +235 -0
  223. package/mcp-server/dist/services/sqlite.d.ts.map +1 -0
  224. package/mcp-server/dist/services/sqlite.js +1185 -0
  225. package/mcp-server/dist/services/sqlite.js.map +1 -0
  226. package/mcp-server/dist/services/typesafe-bench.d.ts +99 -0
  227. package/mcp-server/dist/services/typesafe-bench.d.ts.map +1 -0
  228. package/mcp-server/dist/services/typesafe-bench.js +218 -0
  229. package/mcp-server/dist/services/typesafe-bench.js.map +1 -0
  230. package/mcp-server/dist/services/typesafe-config.d.ts +342 -0
  231. package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -0
  232. package/mcp-server/dist/services/typesafe-config.js +746 -0
  233. package/mcp-server/dist/services/typesafe-config.js.map +1 -0
  234. package/mcp-server/dist/services/typesafe.d.ts +213 -0
  235. package/mcp-server/dist/services/typesafe.d.ts.map +1 -0
  236. package/mcp-server/dist/services/typesafe.js +330 -0
  237. package/mcp-server/dist/services/typesafe.js.map +1 -0
  238. package/mcp-server/dist/services/vector-cache.d.ts +68 -0
  239. package/mcp-server/dist/services/vector-cache.d.ts.map +1 -0
  240. package/mcp-server/dist/services/vector-cache.js +271 -0
  241. package/mcp-server/dist/services/vector-cache.js.map +1 -0
  242. package/mcp-server/dist/services/whiteboard-geometry.d.ts +305 -0
  243. package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -0
  244. package/mcp-server/dist/services/whiteboard-geometry.js +666 -0
  245. package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -0
  246. package/mcp-server/dist/tools/agents.d.ts +212 -0
  247. package/mcp-server/dist/tools/agents.d.ts.map +1 -0
  248. package/mcp-server/dist/tools/agents.js +407 -0
  249. package/mcp-server/dist/tools/agents.js.map +1 -0
  250. package/mcp-server/dist/tools/bluesky.d.ts +39 -0
  251. package/mcp-server/dist/tools/bluesky.d.ts.map +1 -0
  252. package/mcp-server/dist/tools/bluesky.js +1144 -0
  253. package/mcp-server/dist/tools/bluesky.js.map +1 -0
  254. package/mcp-server/dist/tools/browser-advanced.d.ts +58 -0
  255. package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -0
  256. package/mcp-server/dist/tools/browser-advanced.js +106 -0
  257. package/mcp-server/dist/tools/browser-advanced.js.map +1 -0
  258. package/mcp-server/dist/tools/browser-batch.d.ts +99 -0
  259. package/mcp-server/dist/tools/browser-batch.d.ts.map +1 -0
  260. package/mcp-server/dist/tools/browser-batch.js +187 -0
  261. package/mcp-server/dist/tools/browser-batch.js.map +1 -0
  262. package/mcp-server/dist/tools/browser-cheatsheet.d.ts +21 -0
  263. package/mcp-server/dist/tools/browser-cheatsheet.d.ts.map +1 -0
  264. package/mcp-server/dist/tools/browser-cheatsheet.js +144 -0
  265. package/mcp-server/dist/tools/browser-cheatsheet.js.map +1 -0
  266. package/mcp-server/dist/tools/browser-interact.d.ts +239 -0
  267. package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -0
  268. package/mcp-server/dist/tools/browser-interact.js +300 -0
  269. package/mcp-server/dist/tools/browser-interact.js.map +1 -0
  270. package/mcp-server/dist/tools/browser-navigate.d.ts +90 -0
  271. package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -0
  272. package/mcp-server/dist/tools/browser-navigate.js +142 -0
  273. package/mcp-server/dist/tools/browser-navigate.js.map +1 -0
  274. package/mcp-server/dist/tools/browser-observe.d.ts +561 -0
  275. package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -0
  276. package/mcp-server/dist/tools/browser-observe.js +2009 -0
  277. package/mcp-server/dist/tools/browser-observe.js.map +1 -0
  278. package/mcp-server/dist/tools/browser.d.ts +34 -0
  279. package/mcp-server/dist/tools/browser.d.ts.map +1 -0
  280. package/mcp-server/dist/tools/browser.js +112 -0
  281. package/mcp-server/dist/tools/browser.js.map +1 -0
  282. package/mcp-server/dist/tools/card-tools.d.ts +82 -0
  283. package/mcp-server/dist/tools/card-tools.d.ts.map +1 -0
  284. package/mcp-server/dist/tools/card-tools.js +137 -0
  285. package/mcp-server/dist/tools/card-tools.js.map +1 -0
  286. package/mcp-server/dist/tools/card.d.ts +8 -0
  287. package/mcp-server/dist/tools/card.d.ts.map +1 -0
  288. package/mcp-server/dist/tools/card.js +16 -0
  289. package/mcp-server/dist/tools/card.js.map +1 -0
  290. package/mcp-server/dist/tools/category.d.ts +32 -0
  291. package/mcp-server/dist/tools/category.d.ts.map +1 -0
  292. package/mcp-server/dist/tools/category.js +290 -0
  293. package/mcp-server/dist/tools/category.js.map +1 -0
  294. package/mcp-server/dist/tools/choice.d.ts +160 -0
  295. package/mcp-server/dist/tools/choice.d.ts.map +1 -0
  296. package/mcp-server/dist/tools/choice.js +80 -0
  297. package/mcp-server/dist/tools/choice.js.map +1 -0
  298. package/mcp-server/dist/tools/computer.d.ts +71 -0
  299. package/mcp-server/dist/tools/computer.d.ts.map +1 -0
  300. package/mcp-server/dist/tools/computer.js +174 -0
  301. package/mcp-server/dist/tools/computer.js.map +1 -0
  302. package/mcp-server/dist/tools/discord-channel.d.ts +44 -0
  303. package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -0
  304. package/mcp-server/dist/tools/discord-channel.js +236 -0
  305. package/mcp-server/dist/tools/discord-channel.js.map +1 -0
  306. package/mcp-server/dist/tools/discord-guild.d.ts +20 -0
  307. package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -0
  308. package/mcp-server/dist/tools/discord-guild.js +138 -0
  309. package/mcp-server/dist/tools/discord-guild.js.map +1 -0
  310. package/mcp-server/dist/tools/discord-member.d.ts +26 -0
  311. package/mcp-server/dist/tools/discord-member.d.ts.map +1 -0
  312. package/mcp-server/dist/tools/discord-member.js +122 -0
  313. package/mcp-server/dist/tools/discord-member.js.map +1 -0
  314. package/mcp-server/dist/tools/discord-message.d.ts +36 -0
  315. package/mcp-server/dist/tools/discord-message.d.ts.map +1 -0
  316. package/mcp-server/dist/tools/discord-message.js +184 -0
  317. package/mcp-server/dist/tools/discord-message.js.map +1 -0
  318. package/mcp-server/dist/tools/discord-onboarding.d.ts +32 -0
  319. package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -0
  320. package/mcp-server/dist/tools/discord-onboarding.js +179 -0
  321. package/mcp-server/dist/tools/discord-onboarding.js.map +1 -0
  322. package/mcp-server/dist/tools/discord-role.d.ts +34 -0
  323. package/mcp-server/dist/tools/discord-role.d.ts.map +1 -0
  324. package/mcp-server/dist/tools/discord-role.js +178 -0
  325. package/mcp-server/dist/tools/discord-role.js.map +1 -0
  326. package/mcp-server/dist/tools/discord-thread.d.ts +28 -0
  327. package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -0
  328. package/mcp-server/dist/tools/discord-thread.js +88 -0
  329. package/mcp-server/dist/tools/discord-thread.js.map +1 -0
  330. package/mcp-server/dist/tools/discord-webhook.d.ts +32 -0
  331. package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -0
  332. package/mcp-server/dist/tools/discord-webhook.js +154 -0
  333. package/mcp-server/dist/tools/discord-webhook.js.map +1 -0
  334. package/mcp-server/dist/tools/discord.d.ts +7 -0
  335. package/mcp-server/dist/tools/discord.d.ts.map +1 -0
  336. package/mcp-server/dist/tools/discord.js +25 -0
  337. package/mcp-server/dist/tools/discord.js.map +1 -0
  338. package/mcp-server/dist/tools/fb-groups.d.ts +98 -0
  339. package/mcp-server/dist/tools/fb-groups.d.ts.map +1 -0
  340. package/mcp-server/dist/tools/fb-groups.js +369 -0
  341. package/mcp-server/dist/tools/fb-groups.js.map +1 -0
  342. package/mcp-server/dist/tools/forget.d.ts +14 -0
  343. package/mcp-server/dist/tools/forget.d.ts.map +1 -0
  344. package/mcp-server/dist/tools/forget.js +26 -0
  345. package/mcp-server/dist/tools/forget.js.map +1 -0
  346. package/mcp-server/dist/tools/git-tools.d.ts +24 -0
  347. package/mcp-server/dist/tools/git-tools.d.ts.map +1 -0
  348. package/mcp-server/dist/tools/git-tools.js +107 -0
  349. package/mcp-server/dist/tools/git-tools.js.map +1 -0
  350. package/mcp-server/dist/tools/git.d.ts +7 -0
  351. package/mcp-server/dist/tools/git.d.ts.map +1 -0
  352. package/mcp-server/dist/tools/git.js +11 -0
  353. package/mcp-server/dist/tools/git.js.map +1 -0
  354. package/mcp-server/dist/tools/gsc/experience.d.ts +135 -0
  355. package/mcp-server/dist/tools/gsc/experience.d.ts.map +1 -0
  356. package/mcp-server/dist/tools/gsc/experience.js +351 -0
  357. package/mcp-server/dist/tools/gsc/experience.js.map +1 -0
  358. package/mcp-server/dist/tools/gsc/helpers.d.ts +78 -0
  359. package/mcp-server/dist/tools/gsc/helpers.d.ts.map +1 -0
  360. package/mcp-server/dist/tools/gsc/helpers.js +258 -0
  361. package/mcp-server/dist/tools/gsc/helpers.js.map +1 -0
  362. package/mcp-server/dist/tools/gsc/indexing.d.ts +121 -0
  363. package/mcp-server/dist/tools/gsc/indexing.d.ts.map +1 -0
  364. package/mcp-server/dist/tools/gsc/indexing.js +357 -0
  365. package/mcp-server/dist/tools/gsc/indexing.js.map +1 -0
  366. package/mcp-server/dist/tools/gsc/inspect.d.ts +78 -0
  367. package/mcp-server/dist/tools/gsc/inspect.d.ts.map +1 -0
  368. package/mcp-server/dist/tools/gsc/inspect.js +321 -0
  369. package/mcp-server/dist/tools/gsc/inspect.js.map +1 -0
  370. package/mcp-server/dist/tools/gsc/navigate.d.ts +44 -0
  371. package/mcp-server/dist/tools/gsc/navigate.d.ts.map +1 -0
  372. package/mcp-server/dist/tools/gsc/navigate.js +197 -0
  373. package/mcp-server/dist/tools/gsc/navigate.js.map +1 -0
  374. package/mcp-server/dist/tools/gsc/performance.d.ts +84 -0
  375. package/mcp-server/dist/tools/gsc/performance.d.ts.map +1 -0
  376. package/mcp-server/dist/tools/gsc/performance.js +274 -0
  377. package/mcp-server/dist/tools/gsc/performance.js.map +1 -0
  378. package/mcp-server/dist/tools/gsc/settings.d.ts +153 -0
  379. package/mcp-server/dist/tools/gsc/settings.d.ts.map +1 -0
  380. package/mcp-server/dist/tools/gsc/settings.js +425 -0
  381. package/mcp-server/dist/tools/gsc/settings.js.map +1 -0
  382. package/mcp-server/dist/tools/gsc.d.ts +7 -0
  383. package/mcp-server/dist/tools/gsc.d.ts.map +1 -0
  384. package/mcp-server/dist/tools/gsc.js +51 -0
  385. package/mcp-server/dist/tools/gsc.js.map +1 -0
  386. package/mcp-server/dist/tools/image-tools.d.ts +24 -0
  387. package/mcp-server/dist/tools/image-tools.d.ts.map +1 -0
  388. package/mcp-server/dist/tools/image-tools.js +80 -0
  389. package/mcp-server/dist/tools/image-tools.js.map +1 -0
  390. package/mcp-server/dist/tools/image.d.ts +10 -0
  391. package/mcp-server/dist/tools/image.d.ts.map +1 -0
  392. package/mcp-server/dist/tools/image.js +14 -0
  393. package/mcp-server/dist/tools/image.js.map +1 -0
  394. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +97 -0
  395. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -0
  396. package/mcp-server/dist/tools/leonardo-browser-tools.js +228 -0
  397. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -0
  398. package/mcp-server/dist/tools/leonardo.d.ts +13 -0
  399. package/mcp-server/dist/tools/leonardo.d.ts.map +1 -0
  400. package/mcp-server/dist/tools/leonardo.js +21 -0
  401. package/mcp-server/dist/tools/leonardo.js.map +1 -0
  402. package/mcp-server/dist/tools/loop.d.ts +30 -0
  403. package/mcp-server/dist/tools/loop.d.ts.map +1 -0
  404. package/mcp-server/dist/tools/loop.js +401 -0
  405. package/mcp-server/dist/tools/loop.js.map +1 -0
  406. package/mcp-server/dist/tools/memories.d.ts +56 -0
  407. package/mcp-server/dist/tools/memories.d.ts.map +1 -0
  408. package/mcp-server/dist/tools/memories.js +171 -0
  409. package/mcp-server/dist/tools/memories.js.map +1 -0
  410. package/mcp-server/dist/tools/morelogin.d.ts +24 -0
  411. package/mcp-server/dist/tools/morelogin.d.ts.map +1 -0
  412. package/mcp-server/dist/tools/morelogin.js +79 -0
  413. package/mcp-server/dist/tools/morelogin.js.map +1 -0
  414. package/mcp-server/dist/tools/profile.d.ts +17 -0
  415. package/mcp-server/dist/tools/profile.d.ts.map +1 -0
  416. package/mcp-server/dist/tools/profile.js +114 -0
  417. package/mcp-server/dist/tools/profile.js.map +1 -0
  418. package/mcp-server/dist/tools/recall.d.ts +71 -0
  419. package/mcp-server/dist/tools/recall.d.ts.map +1 -0
  420. package/mcp-server/dist/tools/recall.js +147 -0
  421. package/mcp-server/dist/tools/recall.js.map +1 -0
  422. package/mcp-server/dist/tools/reflect.d.ts +56 -0
  423. package/mcp-server/dist/tools/reflect.d.ts.map +1 -0
  424. package/mcp-server/dist/tools/reflect.js +157 -0
  425. package/mcp-server/dist/tools/reflect.js.map +1 -0
  426. package/mcp-server/dist/tools/remember.d.ts +62 -0
  427. package/mcp-server/dist/tools/remember.d.ts.map +1 -0
  428. package/mcp-server/dist/tools/remember.js +201 -0
  429. package/mcp-server/dist/tools/remember.js.map +1 -0
  430. package/mcp-server/dist/tools/response.d.ts +23 -0
  431. package/mcp-server/dist/tools/response.d.ts.map +1 -0
  432. package/mcp-server/dist/tools/response.js +24 -0
  433. package/mcp-server/dist/tools/response.js.map +1 -0
  434. package/mcp-server/dist/tools/restore.d.ts +14 -0
  435. package/mcp-server/dist/tools/restore.d.ts.map +1 -0
  436. package/mcp-server/dist/tools/restore.js +23 -0
  437. package/mcp-server/dist/tools/restore.js.map +1 -0
  438. package/mcp-server/dist/tools/style-guide-tools.d.ts +51 -0
  439. package/mcp-server/dist/tools/style-guide-tools.d.ts.map +1 -0
  440. package/mcp-server/dist/tools/style-guide-tools.js +231 -0
  441. package/mcp-server/dist/tools/style-guide-tools.js.map +1 -0
  442. package/mcp-server/dist/tools/style-guide.d.ts +8 -0
  443. package/mcp-server/dist/tools/style-guide.d.ts.map +1 -0
  444. package/mcp-server/dist/tools/style-guide.js +12 -0
  445. package/mcp-server/dist/tools/style-guide.js.map +1 -0
  446. package/mcp-server/dist/tools/sync.d.ts +20 -0
  447. package/mcp-server/dist/tools/sync.d.ts.map +1 -0
  448. package/mcp-server/dist/tools/sync.js +156 -0
  449. package/mcp-server/dist/tools/sync.js.map +1 -0
  450. package/mcp-server/dist/tools/tictactoe-tools.d.ts +18 -0
  451. package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -0
  452. package/mcp-server/dist/tools/tictactoe-tools.js +78 -0
  453. package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -0
  454. package/mcp-server/dist/tools/tictactoe.d.ts +7 -0
  455. package/mcp-server/dist/tools/tictactoe.d.ts.map +1 -0
  456. package/mcp-server/dist/tools/tictactoe.js +11 -0
  457. package/mcp-server/dist/tools/tictactoe.js.map +1 -0
  458. package/mcp-server/dist/tools/utils.d.ts +19 -0
  459. package/mcp-server/dist/tools/utils.d.ts.map +1 -0
  460. package/mcp-server/dist/tools/utils.js +54 -0
  461. package/mcp-server/dist/tools/utils.js.map +1 -0
  462. package/mcp-server/dist/tools/whiteboard-format.d.ts +88 -0
  463. package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -0
  464. package/mcp-server/dist/tools/whiteboard-format.js +337 -0
  465. package/mcp-server/dist/tools/whiteboard-format.js.map +1 -0
  466. package/mcp-server/dist/tools/whiteboard-tools.d.ts +326 -0
  467. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -0
  468. package/mcp-server/dist/tools/whiteboard-tools.js +222 -0
  469. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -0
  470. package/mcp-server/dist/tools/whiteboard.d.ts +8 -0
  471. package/mcp-server/dist/tools/whiteboard.d.ts.map +1 -0
  472. package/mcp-server/dist/tools/whiteboard.js +16 -0
  473. package/mcp-server/dist/tools/whiteboard.js.map +1 -0
  474. package/mcp-server/dist/tools/youtube/analytics.d.ts +46 -0
  475. package/mcp-server/dist/tools/youtube/analytics.d.ts.map +1 -0
  476. package/mcp-server/dist/tools/youtube/analytics.js +83 -0
  477. package/mcp-server/dist/tools/youtube/analytics.js.map +1 -0
  478. package/mcp-server/dist/tools/youtube/dedup.d.ts +35 -0
  479. package/mcp-server/dist/tools/youtube/dedup.d.ts.map +1 -0
  480. package/mcp-server/dist/tools/youtube/dedup.js +56 -0
  481. package/mcp-server/dist/tools/youtube/dedup.js.map +1 -0
  482. package/mcp-server/dist/tools/youtube/download.d.ts +31 -0
  483. package/mcp-server/dist/tools/youtube/download.d.ts.map +1 -0
  484. package/mcp-server/dist/tools/youtube/download.js +30 -0
  485. package/mcp-server/dist/tools/youtube/download.js.map +1 -0
  486. package/mcp-server/dist/tools/youtube/helpers.d.ts +66 -0
  487. package/mcp-server/dist/tools/youtube/helpers.d.ts.map +1 -0
  488. package/mcp-server/dist/tools/youtube/helpers.js +143 -0
  489. package/mcp-server/dist/tools/youtube/helpers.js.map +1 -0
  490. package/mcp-server/dist/tools/youtube/media.d.ts +43 -0
  491. package/mcp-server/dist/tools/youtube/media.d.ts.map +1 -0
  492. package/mcp-server/dist/tools/youtube/media.js +97 -0
  493. package/mcp-server/dist/tools/youtube/media.js.map +1 -0
  494. package/mcp-server/dist/tools/youtube/metadata.d.ts +33 -0
  495. package/mcp-server/dist/tools/youtube/metadata.d.ts.map +1 -0
  496. package/mcp-server/dist/tools/youtube/metadata.js +106 -0
  497. package/mcp-server/dist/tools/youtube/metadata.js.map +1 -0
  498. package/mcp-server/dist/tools/youtube/navigate.d.ts +30 -0
  499. package/mcp-server/dist/tools/youtube/navigate.d.ts.map +1 -0
  500. package/mcp-server/dist/tools/youtube/navigate.js +71 -0
  501. package/mcp-server/dist/tools/youtube/navigate.js.map +1 -0
  502. package/mcp-server/dist/tools/youtube/playlist.d.ts +29 -0
  503. package/mcp-server/dist/tools/youtube/playlist.d.ts.map +1 -0
  504. package/mcp-server/dist/tools/youtube/playlist.js +128 -0
  505. package/mcp-server/dist/tools/youtube/playlist.js.map +1 -0
  506. package/mcp-server/dist/tools/youtube/schedule.d.ts +31 -0
  507. package/mcp-server/dist/tools/youtube/schedule.d.ts.map +1 -0
  508. package/mcp-server/dist/tools/youtube/schedule.js +147 -0
  509. package/mcp-server/dist/tools/youtube/schedule.js.map +1 -0
  510. package/mcp-server/dist/tools/youtube/source.d.ts +36 -0
  511. package/mcp-server/dist/tools/youtube/source.d.ts.map +1 -0
  512. package/mcp-server/dist/tools/youtube/source.js +85 -0
  513. package/mcp-server/dist/tools/youtube/source.js.map +1 -0
  514. package/mcp-server/dist/tools/youtube/upload.d.ts +53 -0
  515. package/mcp-server/dist/tools/youtube/upload.d.ts.map +1 -0
  516. package/mcp-server/dist/tools/youtube/upload.js +255 -0
  517. package/mcp-server/dist/tools/youtube/upload.js.map +1 -0
  518. package/mcp-server/dist/tools/youtube.d.ts +12 -0
  519. package/mcp-server/dist/tools/youtube.d.ts.map +1 -0
  520. package/mcp-server/dist/tools/youtube.js +38 -0
  521. package/mcp-server/dist/tools/youtube.js.map +1 -0
  522. package/mcp-server/dist/tui.d.ts +3 -0
  523. package/mcp-server/dist/tui.d.ts.map +1 -0
  524. package/mcp-server/dist/tui.js +806 -0
  525. package/mcp-server/dist/tui.js.map +1 -0
  526. package/mcp-server/dist/types.d.ts +77 -0
  527. package/mcp-server/dist/types.d.ts.map +1 -0
  528. package/mcp-server/dist/types.js +2 -0
  529. package/mcp-server/dist/types.js.map +1 -0
  530. package/mcp-server/package-lock.json +4798 -0
  531. package/mcp-server/package.json +55 -38
  532. package/mcp-server/run.mjs +12 -2
  533. package/mcp-server/src/config.ts +48 -3
  534. package/mcp-server/src/http.ts +296 -93
  535. package/mcp-server/src/index.ts +546 -203
  536. package/mcp-server/src/preload-http.ts +19 -18
  537. package/mcp-server/src/preload.ts +19 -18
  538. package/mcp-server/src/scripts/setup-embeddings.ts +9 -0
  539. package/mcp-server/src/services/assistant-judgments.ts +157 -0
  540. package/mcp-server/src/services/browser-assist-gate.ts +383 -0
  541. package/mcp-server/src/services/browser-assist.ts +267 -0
  542. package/mcp-server/src/services/browser-bench.ts +477 -0
  543. package/mcp-server/src/services/browser-judgments.ts +414 -0
  544. package/mcp-server/src/services/browser-risk.ts +484 -0
  545. package/mcp-server/src/services/categories.ts +36 -19
  546. package/mcp-server/src/services/codex-config-heal.ts +403 -0
  547. package/mcp-server/src/services/desktop-assist-gate.ts +251 -0
  548. package/mcp-server/src/services/desktop-assist.ts +308 -0
  549. package/mcp-server/src/services/desktop-bench.ts +372 -0
  550. package/mcp-server/src/services/desktop-client.ts +76 -0
  551. package/mcp-server/src/services/desktop-judgments.ts +218 -0
  552. package/mcp-server/src/services/desktop-risk.ts +743 -0
  553. package/mcp-server/src/services/edit-stale.ts +299 -0
  554. package/mcp-server/src/services/embedding-service.ts +108 -0
  555. package/mcp-server/src/services/embedding-worker.ts +46 -0
  556. package/mcp-server/src/services/fb-regions.ts +221 -0
  557. package/mcp-server/src/services/file-checksums.ts +26 -9
  558. package/mcp-server/src/services/file-excerpt.ts +59 -0
  559. package/mcp-server/src/services/identity.ts +291 -0
  560. package/mcp-server/src/services/local-embeddings.ts +2 -77
  561. package/mcp-server/src/services/memory-client.ts +23 -0
  562. package/mcp-server/src/services/memory-judge-backfill.ts +462 -0
  563. package/mcp-server/src/services/memory-judgments.ts +901 -0
  564. package/mcp-server/src/services/memory-maintenance.ts +360 -0
  565. package/mcp-server/src/services/memory-retrieval.ts +349 -0
  566. package/mcp-server/src/services/memory-schema.ts +280 -0
  567. package/mcp-server/src/services/memory-sessions.ts +87 -0
  568. package/mcp-server/src/services/memory-triage.ts +182 -0
  569. package/mcp-server/src/services/memory-verification.ts +68 -0
  570. package/mcp-server/src/services/memory-writer.ts +125 -0
  571. package/mcp-server/src/services/neural-interface.ts +1217 -73
  572. package/mcp-server/src/services/profiles.ts +428 -0
  573. package/mcp-server/src/services/secret-gate.ts +52 -0
  574. package/mcp-server/src/services/server-instructions.ts +122 -0
  575. package/mcp-server/src/services/sqlite.ts +1456 -823
  576. package/mcp-server/src/services/typesafe-bench.ts +247 -0
  577. package/mcp-server/src/services/typesafe-config.ts +790 -0
  578. package/mcp-server/src/services/typesafe.ts +390 -0
  579. package/mcp-server/src/services/vector-cache.ts +255 -0
  580. package/mcp-server/src/services/whiteboard-geometry.ts +711 -0
  581. package/mcp-server/src/tools/agents.ts +539 -0
  582. package/mcp-server/src/tools/bluesky.ts +1186 -0
  583. package/mcp-server/src/tools/browser-advanced.ts +15 -6
  584. package/mcp-server/src/tools/browser-batch.ts +178 -0
  585. package/mcp-server/src/tools/browser-cheatsheet.ts +155 -0
  586. package/mcp-server/src/tools/browser-interact.ts +362 -255
  587. package/mcp-server/src/tools/browser-navigate.ts +164 -77
  588. package/mcp-server/src/tools/browser-observe.ts +2222 -1330
  589. package/mcp-server/src/tools/browser.ts +181 -107
  590. package/mcp-server/src/tools/card.ts +7 -5
  591. package/mcp-server/src/tools/choice.ts +103 -0
  592. package/mcp-server/src/tools/computer.ts +190 -0
  593. package/mcp-server/src/tools/discord.ts +10 -23
  594. package/mcp-server/src/tools/fb-groups.ts +387 -0
  595. package/mcp-server/src/tools/forget.ts +1 -1
  596. package/mcp-server/src/tools/git.ts +3 -1
  597. package/mcp-server/src/tools/gsc/experience.ts +440 -0
  598. package/mcp-server/src/tools/gsc/helpers.ts +288 -0
  599. package/mcp-server/src/tools/gsc/indexing.ts +495 -0
  600. package/mcp-server/src/tools/gsc/inspect.ts +391 -0
  601. package/mcp-server/src/tools/gsc/navigate.ts +236 -0
  602. package/mcp-server/src/tools/gsc/performance.ts +352 -0
  603. package/mcp-server/src/tools/gsc/settings.ts +564 -0
  604. package/mcp-server/src/tools/gsc.ts +95 -0
  605. package/mcp-server/src/tools/image.ts +3 -1
  606. package/mcp-server/src/tools/leonardo-browser-tools.ts +47 -37
  607. package/mcp-server/src/tools/leonardo.ts +7 -5
  608. package/mcp-server/src/tools/loop.ts +118 -25
  609. package/mcp-server/src/tools/memories.ts +65 -5
  610. package/mcp-server/src/tools/morelogin.ts +81 -0
  611. package/mcp-server/src/tools/profile.ts +122 -0
  612. package/mcp-server/src/tools/recall.ts +105 -261
  613. package/mcp-server/src/tools/reflect.ts +171 -145
  614. package/mcp-server/src/tools/remember.ts +223 -115
  615. package/mcp-server/src/tools/style-guide-tools.ts +250 -0
  616. package/mcp-server/src/tools/style-guide.ts +16 -0
  617. package/mcp-server/src/tools/sync.ts +66 -9
  618. package/mcp-server/src/tools/tictactoe.ts +3 -1
  619. package/mcp-server/src/tools/utils.ts +22 -0
  620. package/mcp-server/src/tools/whiteboard-format.ts +394 -0
  621. package/mcp-server/src/tools/whiteboard-tools.ts +191 -183
  622. package/mcp-server/src/tools/whiteboard.ts +7 -5
  623. package/mcp-server/src/tools/youtube/analytics.ts +106 -0
  624. package/mcp-server/src/tools/youtube/dedup.ts +57 -0
  625. package/mcp-server/src/tools/youtube/download.ts +41 -0
  626. package/mcp-server/src/tools/youtube/helpers.ts +183 -0
  627. package/mcp-server/src/tools/youtube/media.ts +109 -0
  628. package/mcp-server/src/tools/youtube/metadata.ts +112 -0
  629. package/mcp-server/src/tools/youtube/navigate.ts +81 -0
  630. package/mcp-server/src/tools/youtube/playlist.ts +134 -0
  631. package/mcp-server/src/tools/youtube/schedule.ts +158 -0
  632. package/mcp-server/src/tools/youtube/source.ts +101 -0
  633. package/mcp-server/src/tools/youtube/upload.ts +296 -0
  634. package/mcp-server/src/tools/youtube.ts +47 -0
  635. package/mcp-server/src/tui.ts +8 -9
  636. package/neural-interface/games/TicTacToe/1.svg +1 -0
  637. package/neural-interface/games/TicTacToe/2.svg +1 -0
  638. package/neural-interface/games/TicTacToe/3.svg +1 -0
  639. package/neural-interface/games/TicTacToe/4.svg +1 -0
  640. package/neural-interface/games/TicTacToe/5.svg +1 -0
  641. package/neural-interface/games/TicTacToe/6.svg +1 -0
  642. package/neural-interface/games/TicTacToe/7.svg +1 -0
  643. package/neural-interface/games/TicTacToe/8.svg +1 -0
  644. package/neural-interface/games/TicTacToe/9.svg +1 -0
  645. package/neural-interface/games/TicTacToe/Board.svg +1 -0
  646. package/neural-interface/games/TicTacToe/Circle.svg +1 -0
  647. package/neural-interface/games/TicTacToe/Cross.svg +1 -0
  648. package/neural-interface/i18n/en.json +7022 -0
  649. package/neural-interface/i18n/pt-BR.json +7026 -0
  650. package/neural-interface/lib/assistant-api.js +1005 -0
  651. package/neural-interface/lib/assistant-attachments.js +121 -0
  652. package/neural-interface/lib/assistant-brains/claude.js +207 -0
  653. package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +43 -0
  654. package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +56 -0
  655. package/neural-interface/lib/assistant-brains/codex.js +213 -0
  656. package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +47 -0
  657. package/neural-interface/lib/assistant-brains/opencode-route-gate.js +62 -0
  658. package/neural-interface/lib/assistant-brains/opencode.js +320 -0
  659. package/neural-interface/lib/assistant-budget.js +318 -0
  660. package/neural-interface/lib/assistant-catalog.js +731 -0
  661. package/neural-interface/lib/assistant-clarify.js +664 -0
  662. package/neural-interface/lib/assistant-config.js +232 -0
  663. package/neural-interface/lib/assistant-dispatch.js +2744 -0
  664. package/neural-interface/lib/assistant-envelope.js +582 -0
  665. package/neural-interface/lib/assistant-evidence.js +236 -0
  666. package/neural-interface/lib/assistant-hidden-models.js +272 -0
  667. package/neural-interface/lib/assistant-jev.js +117 -0
  668. package/neural-interface/lib/assistant-judgments.js +111 -0
  669. package/neural-interface/lib/assistant-media.js +335 -0
  670. package/neural-interface/lib/assistant-memory.js +398 -0
  671. package/neural-interface/lib/assistant-persona.js +444 -0
  672. package/neural-interface/lib/assistant-plan-permissions.js +448 -0
  673. package/neural-interface/lib/assistant-playbooks/design.md +87 -0
  674. package/neural-interface/lib/assistant-playbooks.js +72 -0
  675. package/neural-interface/lib/assistant-pricing.js +159 -0
  676. package/neural-interface/lib/assistant-route-gate-codex.js +163 -0
  677. package/neural-interface/lib/assistant-route-gate.js +212 -0
  678. package/neural-interface/lib/assistant-router.js +1324 -0
  679. package/neural-interface/lib/assistant-runtime.js +3337 -0
  680. package/neural-interface/lib/assistant-task-prompt.js +472 -0
  681. package/neural-interface/lib/assistant-usage.js +1688 -0
  682. package/neural-interface/lib/augmented-path.js +70 -0
  683. package/neural-interface/lib/automation-storage-migration.js +54 -0
  684. package/neural-interface/lib/backup-service.js +851 -0
  685. package/neural-interface/lib/backup-zip-reader.js +262 -0
  686. package/neural-interface/lib/browser-assist-api.js +41 -0
  687. package/neural-interface/lib/browser-console.js +176 -0
  688. package/neural-interface/lib/browser-execution.js +241 -0
  689. package/neural-interface/lib/browser-extraction.js +191 -0
  690. package/neural-interface/lib/browser-language.js +83 -0
  691. package/neural-interface/lib/browser-screenshot.js +399 -0
  692. package/neural-interface/lib/browser-semantic-context.js +639 -0
  693. package/neural-interface/lib/browser-snapshots.js +192 -0
  694. package/neural-interface/lib/browser-tab-recovery.js +119 -0
  695. package/neural-interface/lib/browser-targets.js +70 -0
  696. package/neural-interface/lib/browser-tool-policy.js +926 -0
  697. package/neural-interface/lib/claude-accounts.js +230 -0
  698. package/neural-interface/lib/claude-agent-bridge.js +3203 -0
  699. package/neural-interface/lib/claude-bypass-policy.js +99 -0
  700. package/neural-interface/lib/claude-executable.js +241 -0
  701. package/neural-interface/lib/claude-history.js +429 -0
  702. package/neural-interface/lib/claude-model-catalog.js +444 -0
  703. package/neural-interface/lib/claude-panel-requests.js +165 -0
  704. package/neural-interface/lib/claude-panel-session.js +272 -0
  705. package/neural-interface/lib/claude-permission-rules.js +153 -0
  706. package/neural-interface/lib/claude-session-cleanup.js +71 -0
  707. package/neural-interface/lib/claude-session-list.js +82 -0
  708. package/neural-interface/lib/claude-session-ops.js +140 -0
  709. package/neural-interface/lib/claude-settings-view.js +51 -0
  710. package/neural-interface/lib/claude-skin-connect.js +79 -0
  711. package/neural-interface/lib/claude-stall-policy.js +7 -0
  712. package/neural-interface/lib/claude-temporary.js +435 -0
  713. package/neural-interface/lib/cli-update-planner.js +312 -0
  714. package/neural-interface/lib/codex-capabilities.d.ts +41 -0
  715. package/neural-interface/lib/codex-capabilities.js +148 -0
  716. package/neural-interface/lib/codex-collaboration-mode.js +17 -0
  717. package/neural-interface/lib/codex-compat-rpc.js +241 -0
  718. package/neural-interface/lib/codex-mcp-approvals.js +56 -0
  719. package/neural-interface/lib/codex-mcp-apps.js +47 -0
  720. package/neural-interface/lib/codex-model-context.js +202 -0
  721. package/neural-interface/lib/codex-plan-store.js +71 -0
  722. package/neural-interface/lib/codex-request-journal.js +242 -0
  723. package/neural-interface/lib/codex-runtime-path.js +213 -0
  724. package/neural-interface/lib/codex-session-catalog.js +231 -0
  725. package/neural-interface/lib/codex-session-settings.js +46 -0
  726. package/neural-interface/lib/codex-sidepanel-permissions.js +110 -0
  727. package/neural-interface/lib/codex-thread-history.js +165 -0
  728. package/neural-interface/lib/codex-user-verification.js +34 -0
  729. package/neural-interface/lib/codex-writer-lifecycle.js +152 -0
  730. package/neural-interface/lib/confined-fs.js +256 -0
  731. package/neural-interface/lib/db.js +922 -0
  732. package/neural-interface/lib/design-md.js +9 -0
  733. package/neural-interface/lib/desktop/api.js +92 -0
  734. package/neural-interface/lib/desktop/audit.js +62 -0
  735. package/neural-interface/lib/desktop/build.js +423 -0
  736. package/neural-interface/lib/desktop/config.js +606 -0
  737. package/neural-interface/lib/desktop/coords.js +76 -0
  738. package/neural-interface/lib/desktop/fake-helper.js +1192 -0
  739. package/neural-interface/lib/desktop/frames.js +77 -0
  740. package/neural-interface/lib/desktop/grants.js +84 -0
  741. package/neural-interface/lib/desktop/guards.js +170 -0
  742. package/neural-interface/lib/desktop/helper/SynabunDesktop.swift +3056 -0
  743. package/neural-interface/lib/desktop/lease.js +51 -0
  744. package/neural-interface/lib/desktop/manager.js +545 -0
  745. package/neural-interface/lib/desktop/press-contexts.js +103 -0
  746. package/neural-interface/lib/desktop/protocol.js +495 -0
  747. package/neural-interface/lib/desktop/service.js +1202 -0
  748. package/neural-interface/lib/effort-levels.js +148 -0
  749. package/neural-interface/lib/event-loop-monitor.js +67 -0
  750. package/neural-interface/lib/exec-loop-command.js +209 -0
  751. package/neural-interface/lib/folder-picker.ps1 +77 -0
  752. package/neural-interface/lib/http-guards.js +287 -0
  753. package/neural-interface/lib/jsonl-lines.js +94 -0
  754. package/neural-interface/lib/loop-logger.js +127 -0
  755. package/neural-interface/lib/mcp-client-config.js +133 -0
  756. package/neural-interface/lib/mcp-installer.js +487 -0
  757. package/neural-interface/lib/mcp-profile-refresh-coordinator.js +78 -0
  758. package/neural-interface/lib/mcp-profile-servers.js +120 -0
  759. package/neural-interface/lib/memo-cache.js +84 -0
  760. package/neural-interface/lib/memory-api.js +758 -0
  761. package/neural-interface/lib/memory-map-api.js +1150 -0
  762. package/neural-interface/lib/memory-map-layout.js +872 -0
  763. package/neural-interface/lib/memory-map-worker.js +165 -0
  764. package/neural-interface/lib/memory-session-capture.js +81 -0
  765. package/neural-interface/lib/memory-timers.js +62 -0
  766. package/neural-interface/lib/morelogin.js +301 -0
  767. package/neural-interface/lib/native-binary-runtime.js +382 -0
  768. package/neural-interface/lib/native-loop-goal.js +33 -0
  769. package/neural-interface/lib/native-loop-providers.js +1002 -0
  770. package/neural-interface/lib/native-loop-runtime.js +747 -0
  771. package/neural-interface/lib/offline-page.js +54 -0
  772. package/neural-interface/lib/opencode-hidden-models.js +113 -0
  773. package/neural-interface/lib/opencode-history.js +253 -0
  774. package/neural-interface/lib/opencode-runtime-config.js +58 -0
  775. package/neural-interface/lib/opencode-v2-client.js +486 -0
  776. package/neural-interface/lib/opencode-v2-ws-requests.js +955 -0
  777. package/neural-interface/lib/path-confine.js +213 -0
  778. package/neural-interface/lib/plugin-installer.js +264 -0
  779. package/neural-interface/lib/project-storage.js +766 -0
  780. package/neural-interface/lib/pty-host/core.js +603 -0
  781. package/neural-interface/lib/pty-host/flow.js +43 -0
  782. package/neural-interface/lib/pty-host/host.js +47 -0
  783. package/neural-interface/lib/pty-host/manager.js +360 -0
  784. package/neural-interface/lib/pty-host/protocol.js +81 -0
  785. package/neural-interface/lib/pty-host/snapshot.js +133 -0
  786. package/neural-interface/lib/remote-policy.js +582 -0
  787. package/neural-interface/lib/rulesets/api.js +175 -0
  788. package/neural-interface/lib/rulesets/fs-safe.js +245 -0
  789. package/neural-interface/lib/rulesets/installer.js +1453 -0
  790. package/neural-interface/lib/rulesets/json-edit.js +186 -0
  791. package/neural-interface/lib/rulesets/lock.js +170 -0
  792. package/neural-interface/lib/rulesets/managed-text.js +314 -0
  793. package/neural-interface/lib/rulesets/normalise.js +24 -0
  794. package/neural-interface/lib/rulesets/render.js +84 -0
  795. package/neural-interface/lib/schedule-launch-intent.js +40 -0
  796. package/neural-interface/lib/session-cache-builder.js +524 -0
  797. package/neural-interface/lib/session-chunker.js +344 -0
  798. package/neural-interface/lib/session-indexer.js +327 -0
  799. package/neural-interface/lib/session-title-generator.js +232 -0
  800. package/neural-interface/lib/skill-prompt-bridge.js +11 -0
  801. package/neural-interface/lib/style-guide/api.js +375 -0
  802. package/neural-interface/lib/style-guide/color.js +352 -0
  803. package/neural-interface/lib/style-guide/export-css.js +99 -0
  804. package/neural-interface/lib/style-guide/export-dtcg.js +209 -0
  805. package/neural-interface/lib/style-guide/export-tailwind.js +102 -0
  806. package/neural-interface/lib/style-guide/fonts.json +227 -0
  807. package/neural-interface/lib/style-guide/import.js +1268 -0
  808. package/neural-interface/lib/style-guide/pointers.js +103 -0
  809. package/neural-interface/lib/style-guide/presets.js +232 -0
  810. package/neural-interface/lib/style-guide/render-design-md.js +319 -0
  811. package/neural-interface/lib/style-guide/schema.js +848 -0
  812. package/neural-interface/lib/style-guide/security.js +43 -0
  813. package/neural-interface/lib/style-guide/store.js +491 -0
  814. package/neural-interface/lib/style-guide/summary.js +106 -0
  815. package/neural-interface/lib/style-guide/tokens.js +170 -0
  816. package/neural-interface/lib/synabun-update-plan.js +324 -0
  817. package/neural-interface/lib/synabun-version.js +179 -0
  818. package/neural-interface/lib/system-restore.js +99 -0
  819. package/neural-interface/lib/terminal-env.js +86 -0
  820. package/neural-interface/lib/ui-blob-store.js +106 -0
  821. package/neural-interface/lib/vector-cache.js +2 -0
  822. package/neural-interface/lib/virtual-socket.js +60 -0
  823. package/neural-interface/lib/whatsapp/api.js +146 -0
  824. package/neural-interface/lib/whatsapp/auth-store.js +389 -0
  825. package/neural-interface/lib/whatsapp/baileys-adapter.js +457 -0
  826. package/neural-interface/lib/whatsapp/brain.js +128 -0
  827. package/neural-interface/lib/whatsapp/bridge.js +1499 -0
  828. package/neural-interface/lib/whatsapp/cards.js +519 -0
  829. package/neural-interface/lib/whatsapp/commands.js +92 -0
  830. package/neural-interface/lib/whatsapp/config.js +291 -0
  831. package/neural-interface/lib/whatsapp/connector/entry.mjs +25 -0
  832. package/neural-interface/lib/whatsapp/connector/manifest.json +6 -0
  833. package/neural-interface/lib/whatsapp/connector/npm-shrinkwrap.json +717 -0
  834. package/neural-interface/lib/whatsapp/connector/package.json +8 -0
  835. package/neural-interface/lib/whatsapp/fake-baileys.js +444 -0
  836. package/neural-interface/lib/whatsapp/format.js +552 -0
  837. package/neural-interface/lib/whatsapp/host-core.js +1225 -0
  838. package/neural-interface/lib/whatsapp/host.js +119 -0
  839. package/neural-interface/lib/whatsapp/identity.js +288 -0
  840. package/neural-interface/lib/whatsapp/inbound.js +149 -0
  841. package/neural-interface/lib/whatsapp/installer.js +562 -0
  842. package/neural-interface/lib/whatsapp/manager.js +638 -0
  843. package/neural-interface/lib/whatsapp/paths.js +81 -0
  844. package/neural-interface/lib/whatsapp/protocol.js +327 -0
  845. package/neural-interface/lib/whatsapp/qr-svg.js +57 -0
  846. package/neural-interface/lib/whatsapp/redact.js +130 -0
  847. package/neural-interface/lib/whatsapp/service.js +1305 -0
  848. package/neural-interface/lib/whatsapp/vendor/qrcodegen.js +848 -0
  849. package/neural-interface/package-lock.json +4431 -0
  850. package/neural-interface/package.json +58 -27
  851. package/neural-interface/public/apple-touch-icon.png +0 -0
  852. package/neural-interface/public/category-logos/synabun.png +0 -0
  853. package/neural-interface/public/claude.svg +1 -0
  854. package/neural-interface/public/favicon-16x16.png +0 -0
  855. package/neural-interface/public/favicon-32x32.png +0 -0
  856. package/neural-interface/public/icon-192.png +0 -0
  857. package/neural-interface/public/icon-512.png +0 -0
  858. package/neural-interface/public/index.html +32 -182
  859. package/neural-interface/public/index2d.html +2 -2
  860. package/neural-interface/public/install-app.html +31 -0
  861. package/neural-interface/public/logo-synabun.png +0 -0
  862. package/neural-interface/public/logoHD.png +0 -0
  863. package/neural-interface/public/manifest.json +2 -0
  864. package/neural-interface/public/mcp.svg +4 -0
  865. package/neural-interface/public/offline.html +670 -299
  866. package/neural-interface/public/onboarding.html +804 -161
  867. package/neural-interface/public/opencode-logo-dark-square.svg +1 -0
  868. package/neural-interface/public/shared/agent-runtime-options.js +596 -0
  869. package/neural-interface/public/shared/api.js +339 -28
  870. package/neural-interface/public/shared/assistant/asst-accounts.js +318 -0
  871. package/neural-interface/public/shared/assistant/asst-agents-dock.js +296 -0
  872. package/neural-interface/public/shared/assistant/asst-api.js +270 -0
  873. package/neural-interface/public/shared/assistant/asst-brain-picker.js +744 -0
  874. package/neural-interface/public/shared/assistant/asst-budget.js +333 -0
  875. package/neural-interface/public/shared/assistant/asst-composer.js +656 -0
  876. package/neural-interface/public/shared/assistant/asst-computer.js +803 -0
  877. package/neural-interface/public/shared/assistant/asst-control.js +1018 -0
  878. package/neural-interface/public/shared/assistant/asst-hosts.js +262 -0
  879. package/neural-interface/public/shared/assistant/asst-mascot.js +313 -0
  880. package/neural-interface/public/shared/assistant/asst-menu.js +375 -0
  881. package/neural-interface/public/shared/assistant/asst-panel.js +1845 -0
  882. package/neural-interface/public/shared/assistant/asst-rack-styles.js +586 -0
  883. package/neural-interface/public/shared/assistant/asst-render.js +3305 -0
  884. package/neural-interface/public/shared/assistant/asst-route.js +1653 -0
  885. package/neural-interface/public/shared/assistant/asst-roving.js +75 -0
  886. package/neural-interface/public/shared/assistant/asst-sanitize.js +117 -0
  887. package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +488 -0
  888. package/neural-interface/public/shared/assistant/asst-sidepanel.js +675 -0
  889. package/neural-interface/public/shared/assistant/asst-slash.js +258 -0
  890. package/neural-interface/public/shared/assistant/asst-state.js +727 -0
  891. package/neural-interface/public/shared/assistant/asst-styles.js +1686 -0
  892. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +1017 -0
  893. package/neural-interface/public/shared/assistant/asst-usage.js +444 -0
  894. package/neural-interface/public/shared/assistant/asst-ws.js +175 -0
  895. package/neural-interface/public/shared/automation-context.js +75 -0
  896. package/neural-interface/public/shared/blob-store.js +99 -0
  897. package/neural-interface/public/shared/cdx/cdx-capabilities.js +118 -0
  898. package/neural-interface/public/shared/cdx/cdx-cards.js +37 -0
  899. package/neural-interface/public/shared/cdx/cdx-commands.js +171 -0
  900. package/neural-interface/public/shared/cdx/cdx-context-menu.js +402 -0
  901. package/neural-interface/public/shared/cdx/cdx-context-model.js +220 -0
  902. package/neural-interface/public/shared/cdx/cdx-features.js +408 -0
  903. package/neural-interface/public/shared/cdx/cdx-icons.js +89 -0
  904. package/neural-interface/public/shared/cdx/cdx-mcp-app-host.js +414 -0
  905. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.html +6 -0
  906. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.js +56 -0
  907. package/neural-interface/public/shared/cdx/cdx-mcp-app.js +178 -0
  908. package/neural-interface/public/shared/cdx/cdx-model-catalog.js +120 -0
  909. package/neural-interface/public/shared/cdx/cdx-output-model.js +261 -0
  910. package/neural-interface/public/shared/cdx/cdx-output.js +382 -0
  911. package/neural-interface/public/shared/cdx/cdx-panel.js +1372 -0
  912. package/neural-interface/public/shared/cdx/cdx-plan.js +266 -0
  913. package/neural-interface/public/shared/cdx/cdx-protocol.js +682 -0
  914. package/neural-interface/public/shared/cdx/cdx-render.js +3381 -0
  915. package/neural-interface/public/shared/cdx/cdx-requests.js +1136 -0
  916. package/neural-interface/public/shared/cdx/cdx-styles.js +3251 -0
  917. package/neural-interface/public/shared/cdx/cdx-tabs.js +7992 -0
  918. package/neural-interface/public/shared/cdx/cdx-ws.js +363 -0
  919. package/neural-interface/public/shared/cli-status.js +169 -0
  920. package/neural-interface/public/shared/command-runner-model.js +30 -0
  921. package/neural-interface/public/shared/constants.js +22 -5
  922. package/neural-interface/public/shared/cp/cp-agents.js +186 -0
  923. package/neural-interface/public/shared/cp/cp-bash.js +252 -0
  924. package/neural-interface/public/shared/cp/cp-compose.js +159 -0
  925. package/neural-interface/public/shared/cp/cp-context-menu.js +309 -0
  926. package/neural-interface/public/shared/cp/cp-context-model.js +157 -0
  927. package/neural-interface/public/shared/cp/cp-context-window.js +80 -0
  928. package/neural-interface/public/shared/cp/cp-ctx.js +11 -0
  929. package/neural-interface/public/shared/cp/cp-diff.js +255 -0
  930. package/neural-interface/public/shared/cp/cp-event-rows.js +637 -0
  931. package/neural-interface/public/shared/cp/cp-events.js +846 -0
  932. package/neural-interface/public/shared/cp/cp-markdown.js +104 -0
  933. package/neural-interface/public/shared/cp/cp-permission-model.js +905 -0
  934. package/neural-interface/public/shared/cp/cp-permissions.js +626 -0
  935. package/neural-interface/public/shared/cp/cp-rehydrate.js +113 -0
  936. package/neural-interface/public/shared/cp/cp-restore.js +224 -0
  937. package/neural-interface/public/shared/cp/cp-session-model.js +338 -0
  938. package/neural-interface/public/shared/cp/cp-session-settings.js +254 -0
  939. package/neural-interface/public/shared/cp/cp-sessions.js +227 -0
  940. package/neural-interface/public/shared/cp/cp-statusline.js +153 -0
  941. package/neural-interface/public/shared/cp/cp-styles.js +349 -0
  942. package/neural-interface/public/shared/cp/cp-tasks-model.js +282 -0
  943. package/neural-interface/public/shared/cp/cp-tasks.js +107 -0
  944. package/neural-interface/public/shared/cp/cp-temporary-view.js +56 -0
  945. package/neural-interface/public/shared/cp/cp-temporary.js +231 -0
  946. package/neural-interface/public/shared/cp/cp-tool-cards.js +326 -0
  947. package/neural-interface/public/shared/cp/cp-tool-results.js +618 -0
  948. package/neural-interface/public/shared/cp/cp-usage-model.js +124 -0
  949. package/neural-interface/public/shared/graph-activity.js +68 -0
  950. package/neural-interface/public/shared/html-shell.js +116 -17
  951. package/neural-interface/public/shared/i18n.js +132 -34
  952. package/neural-interface/public/shared/node-positions-store.js +44 -0
  953. package/neural-interface/public/shared/ocp-hidden-models.js +116 -0
  954. package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +355 -0
  955. package/neural-interface/public/shared/ocp-v2/ocp-v2-autoaccept-button.js +35 -0
  956. package/neural-interface/public/shared/ocp-v2/ocp-v2-automation-ownership.js +72 -0
  957. package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +280 -0
  958. package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +67 -0
  959. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +179 -0
  960. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes.js +164 -0
  961. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +725 -0
  962. package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +75 -0
  963. package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +1204 -0
  964. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm-logic.js +117 -0
  965. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm.js +59 -0
  966. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-gauge.js +252 -0
  967. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +478 -0
  968. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +179 -0
  969. package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +233 -0
  970. package/neural-interface/public/shared/ocp-v2/ocp-v2-icons.js +30 -0
  971. package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +1065 -0
  972. package/neural-interface/public/shared/ocp-v2/ocp-v2-mention-hints.js +182 -0
  973. package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +655 -0
  974. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +2636 -0
  975. package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +601 -0
  976. package/neural-interface/public/shared/ocp-v2/ocp-v2-profile-inheritance.js +78 -0
  977. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +649 -0
  978. package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +35 -0
  979. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +357 -0
  980. package/neural-interface/public/shared/ocp-v2/ocp-v2-render-logic.js +189 -0
  981. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +1869 -0
  982. package/neural-interface/public/shared/ocp-v2/ocp-v2-select.js +42 -0
  983. package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +117 -0
  984. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +1714 -0
  985. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +468 -0
  986. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-widgets.js +63 -0
  987. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +366 -0
  988. package/neural-interface/public/shared/ocp-v2/ocp-v2-settings-link.js +19 -0
  989. package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +343 -0
  990. package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +746 -0
  991. package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +347 -0
  992. package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +338 -0
  993. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +3543 -0
  994. package/neural-interface/public/shared/ocp-v2/ocp-v2-subagents-logic.js +482 -0
  995. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools-logic.js +351 -0
  996. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools.js +168 -0
  997. package/neural-interface/public/shared/ocp-v2/ocp-v2-variantpicker.js +315 -0
  998. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +545 -0
  999. package/neural-interface/public/shared/provider-icons.js +30 -0
  1000. package/neural-interface/public/shared/pwa-install-page.js +34 -0
  1001. package/neural-interface/public/shared/pwa-install.css +12 -0
  1002. package/neural-interface/public/shared/pwa-install.js +28 -0
  1003. package/neural-interface/public/shared/session-title.js +100 -0
  1004. package/neural-interface/public/shared/settings/settings-ia.js +389 -0
  1005. package/neural-interface/public/shared/settings/settings-kit.js +234 -0
  1006. package/neural-interface/public/shared/settings/settings-rules.js +160 -0
  1007. package/neural-interface/public/shared/settings/settings-search.js +463 -0
  1008. package/neural-interface/public/shared/settings/settings-shell.js +570 -0
  1009. package/neural-interface/public/shared/start-bridge.js +583 -0
  1010. package/neural-interface/public/shared/state.js +5 -0
  1011. package/neural-interface/public/shared/storage.js +50 -7
  1012. package/neural-interface/public/shared/styleguide/sg-agents.js +42 -0
  1013. package/neural-interface/public/shared/styleguide/sg-brand.js +4 -0
  1014. package/neural-interface/public/shared/styleguide/sg-color-client.js +388 -0
  1015. package/neural-interface/public/shared/styleguide/sg-colors.js +151 -0
  1016. package/neural-interface/public/shared/styleguide/sg-components.js +35 -0
  1017. package/neural-interface/public/shared/styleguide/sg-history.js +41 -0
  1018. package/neural-interface/public/shared/styleguide/sg-icons-logo.js +38 -0
  1019. package/neural-interface/public/shared/styleguide/sg-imagery.js +4 -0
  1020. package/neural-interface/public/shared/styleguide/sg-import-export.js +48 -0
  1021. package/neural-interface/public/shared/styleguide/sg-kit.js +284 -0
  1022. package/neural-interface/public/shared/styleguide/sg-labels.js +318 -0
  1023. package/neural-interface/public/shared/styleguide/sg-layout.js +4 -0
  1024. package/neural-interface/public/shared/styleguide/sg-motion.js +5 -0
  1025. package/neural-interface/public/shared/styleguide/sg-panel.js +237 -0
  1026. package/neural-interface/public/shared/styleguide/sg-preview.js +138 -0
  1027. package/neural-interface/public/shared/styleguide/sg-rules.js +9 -0
  1028. package/neural-interface/public/shared/styleguide/sg-shape.js +24 -0
  1029. package/neural-interface/public/shared/styleguide/sg-state.js +132 -0
  1030. package/neural-interface/public/shared/styleguide/sg-typography.js +125 -0
  1031. package/neural-interface/public/shared/styles.css +8614 -1477
  1032. package/neural-interface/public/shared/synabun-mascot.js +1625 -0
  1033. package/neural-interface/public/shared/synabun-ticker.js +376 -0
  1034. package/neural-interface/public/shared/term-ready.js +307 -0
  1035. package/neural-interface/public/shared/term-renderer.js +343 -0
  1036. package/neural-interface/public/shared/ui-assistant-panel.js +10 -0
  1037. package/neural-interface/public/shared/ui-assistant.js +77 -0
  1038. package/neural-interface/public/shared/ui-automation-studio.js +5105 -3573
  1039. package/neural-interface/public/shared/ui-claude-panel.js +11685 -6333
  1040. package/neural-interface/public/shared/ui-codex-panel.js +12 -0
  1041. package/neural-interface/public/shared/ui-command-runner.js +251 -468
  1042. package/neural-interface/public/shared/ui-cost-widget.js +55 -34
  1043. package/neural-interface/public/shared/ui-detail.js +77 -14
  1044. package/neural-interface/public/shared/ui-explorer.js +360 -181
  1045. package/neural-interface/public/shared/ui-file-explorer.js +485 -107
  1046. package/neural-interface/public/shared/ui-help.js +2 -2
  1047. package/neural-interface/public/shared/ui-image-gallery.js +45 -21
  1048. package/neural-interface/public/shared/ui-judgments.js +1346 -0
  1049. package/neural-interface/public/shared/ui-keybinds.js +3 -2
  1050. package/neural-interface/public/shared/ui-link.js +105 -51
  1051. package/neural-interface/public/shared/ui-loading.js +222 -11
  1052. package/neural-interface/public/shared/ui-memory-maintenance.js +111 -0
  1053. package/neural-interface/public/shared/ui-menubar.js +100 -31
  1054. package/neural-interface/public/shared/ui-native-loop-router-state.js +94 -0
  1055. package/neural-interface/public/shared/ui-native-loop-router.js +493 -0
  1056. package/neural-interface/public/shared/ui-native-window-id.js +7 -0
  1057. package/neural-interface/public/shared/ui-navbar.js +357 -222
  1058. package/neural-interface/public/shared/ui-notifications.js +58 -12
  1059. package/neural-interface/public/shared/ui-opencode-panel-v2.js +17 -0
  1060. package/neural-interface/public/shared/ui-panels.js +15 -7
  1061. package/neural-interface/public/shared/ui-resume.js +823 -653
  1062. package/neural-interface/public/shared/ui-schedule-queue.js +172 -0
  1063. package/neural-interface/public/shared/ui-schedules-studio.js +1882 -0
  1064. package/neural-interface/public/shared/ui-scroll-follow.js +194 -0
  1065. package/neural-interface/public/shared/ui-sessions.js +789 -34
  1066. package/neural-interface/public/shared/ui-settings.js +5774 -2194
  1067. package/neural-interface/public/shared/ui-sidepanel-layout.js +109 -0
  1068. package/neural-interface/public/shared/ui-sidepanel-runtime.js +19 -0
  1069. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +40 -0
  1070. package/neural-interface/public/shared/ui-sidepanel-sessions.js +221 -0
  1071. package/neural-interface/public/shared/ui-sidepanel-state.js +131 -0
  1072. package/neural-interface/public/shared/ui-sidepanel-tray.js +547 -0
  1073. package/neural-interface/public/shared/ui-sidepanel-windows.js +387 -0
  1074. package/neural-interface/public/shared/ui-skills.js +18 -32
  1075. package/neural-interface/public/shared/ui-styleguide.js +35 -0
  1076. package/neural-interface/public/shared/ui-sync.js +87 -0
  1077. package/neural-interface/public/shared/ui-terminal.js +7863 -6385
  1078. package/neural-interface/public/shared/ui-tool-updates.js +292 -0
  1079. package/neural-interface/public/shared/ui-tooltip.js +156 -15
  1080. package/neural-interface/public/shared/ui-tutorial-draw.js +119 -683
  1081. package/neural-interface/public/shared/ui-tutorial-layout.js +135 -0
  1082. package/neural-interface/public/shared/ui-tutorial-steps.js +59 -2209
  1083. package/neural-interface/public/shared/ui-tutorial.css +102 -0
  1084. package/neural-interface/public/shared/ui-tutorial.js +557 -1076
  1085. package/neural-interface/public/shared/ui-update.js +420 -68
  1086. package/neural-interface/public/shared/ui-whatsapp.js +941 -0
  1087. package/neural-interface/public/shared/ui-whiteboard.js +1076 -233
  1088. package/neural-interface/public/shared/ui-workspaces.js +2 -1
  1089. package/neural-interface/public/shared/utils.js +58 -0
  1090. package/neural-interface/public/shared/vterm-buffer.js +15 -5
  1091. package/neural-interface/public/shared/whatsapp/wa-phone.js +65 -0
  1092. package/neural-interface/public/shared/whatsapp/wa-view.js +411 -0
  1093. package/neural-interface/public/sidepanel-session.html +18 -0
  1094. package/neural-interface/public/sw.js +10 -2
  1095. package/neural-interface/public/synabun.png +0 -0
  1096. package/neural-interface/public/variant/2d/graph.js +1707 -1635
  1097. package/neural-interface/public/variant/2d/lasso.js +2 -1
  1098. package/neural-interface/public/variant/2d/layout.js +595 -594
  1099. package/neural-interface/public/variant/2d/main.js +557 -521
  1100. package/neural-interface/public/variant/2d/settings-gfx.js +18 -24
  1101. package/neural-interface/public/variant/3d/main.js +517 -500
  1102. package/neural-interface/public/variant/3d/map-controls.js +144 -0
  1103. package/neural-interface/public/variant/3d/map-data.js +251 -0
  1104. package/neural-interface/public/variant/3d/map-labels.js +241 -0
  1105. package/neural-interface/public/variant/3d/map-pick.js +90 -0
  1106. package/neural-interface/public/variant/3d/map-renderer.js +521 -0
  1107. package/neural-interface/public/variant/3d/map-shaders.js +158 -0
  1108. package/neural-interface/public/variant/3d/map-view.js +618 -0
  1109. package/neural-interface/public/vendor/three/manifest.json +3 -0
  1110. package/neural-interface/public/vendor/three/three-0.169.0.min.js +3844 -0
  1111. package/neural-interface/public/vendor/xterm/manifest.json +3 -0
  1112. package/neural-interface/public/vendor/xterm/xterm-6.0.0.css +285 -0
  1113. package/neural-interface/public/vendor/xterm/xterm-6.0.0.min.js +192 -0
  1114. package/neural-interface/scripts/build-vendor.mjs +64 -0
  1115. package/neural-interface/scripts/codex-protocol-fixture.mjs +83 -0
  1116. package/neural-interface/scripts/rebuild-pty.js +39 -22
  1117. package/neural-interface/scripts/vendor-three-entry.js +24 -0
  1118. package/neural-interface/scripts/vendor-xterm-entry.js +8 -0
  1119. package/neural-interface/server.js +33983 -15000
  1120. package/neural-interface/skins/default/skin.css +90 -0
  1121. package/neural-interface/skins/default/skin.json +8 -0
  1122. package/neural-interface/templates/rulesets/README.md +9 -0
  1123. package/neural-interface/templates/rulesets/claude.md +3 -0
  1124. package/neural-interface/templates/rulesets/codex.md +2 -0
  1125. package/neural-interface/templates/rulesets/coexistence.md +6 -0
  1126. package/neural-interface/templates/rulesets/core.md +26 -0
  1127. package/neural-interface/templates/rulesets/cursor.md +2 -0
  1128. package/neural-interface/templates/rulesets/gemini.md +2 -0
  1129. package/neural-interface/templates/rulesets/legacy-hashes.json +227 -0
  1130. package/neural-interface/templates/rulesets/manifest.json +12 -0
  1131. package/neural-interface/templates/rulesets/opencode.md +2 -0
  1132. package/package.json +131 -53
  1133. package/postinstall.js +55 -26
  1134. package/preuninstall.js +187 -0
  1135. package/scripts/restore-data-home-from-backup.mjs +239 -0
  1136. package/setup.js +872 -260
  1137. package/skills/leonardo/SKILL.md +19 -10
  1138. package/skills/leonardo/modules/image-prompter.md +18 -12
  1139. package/skills/leonardo/modules/video-prompter.md +19 -13
  1140. package/skills/synabun/SKILL.md +209 -185
  1141. package/skills/synabun/icon.png +0 -0
  1142. package/skills/synabun/modules/audit.md +380 -374
  1143. package/skills/synabun/modules/changelog.md +15 -6
  1144. package/skills/synabun/modules/idea.md +148 -144
  1145. package/skills/synabun/modules/memorize.md +13 -4
  1146. package/skills/synabun/modules/schedule.md +198 -0
  1147. package/skills/synabun/synabunicon.png +0 -0
  1148. package/updater.cmd +31 -0
  1149. package/updater.mjs +382 -0
  1150. package/updater.sh +29 -0
  1151. package/hooks/claude-code/test-user-learning.mjs +0 -531
  1152. package/neural-interface/public/claude-chat.css +0 -878
  1153. package/neural-interface/public/claude-chat.html +0 -92
  1154. package/neural-interface/public/claude-chat.js +0 -1168
  1155. package/neural-interface/public/index-legacy.html +0 -14677
  1156. package/neural-interface/public/index2d-legacy.html +0 -8193
  1157. package/neural-interface/public/shared/html-term-renderer.js +0 -1022
  1158. package/neural-interface/public/variant/3d/background.js +0 -884
  1159. package/neural-interface/public/variant/3d/camera.js +0 -661
  1160. package/neural-interface/public/variant/3d/gfx.js +0 -116
  1161. package/neural-interface/public/variant/3d/graph.js +0 -2399
  1162. package/neural-interface/public/variant/3d/settings-gfx.js +0 -228
  1163. package/neural-interface/templates/CLAUDE-template.md +0 -211
@@ -0,0 +1,349 @@
1
+ import { performance } from 'node:perf_hooks';
2
+ import { createHash } from 'node:crypto';
3
+ import { getDb, memoryVectors, chunkVectors, rowToPayload, rowToSessionChunkPayload } from './sqlite.js';
4
+ import { VectorCache } from './vector-cache.js';
5
+ import { judgeHistoricalQuery, judgeRelevance, orderByJudgedScore, RELEVANCE_CANDIDATE_CLIP, type JudgeContext } from './memory-judgments.js';
6
+ import { generateEmbedding, EMBEDDING_VERSION } from './local-embeddings.js';
7
+ import { projectAliases } from '../config.js';
8
+ import { judgedStale } from './edit-stale.js';
9
+
10
+ export interface RecallOptions {
11
+ query: string; project?: string; currentProject?: string; category?: string; tags?: string[];
12
+ tag_match?: 'any' | 'all'; limit?: number; min_score?: number; min_importance?: number;
13
+ include_sessions?: boolean; recency_boost?: boolean; after?: string; before?: string;
14
+ scope?: 'all' | 'project'; engine?: 'legacy' | 'hybrid';
15
+ // Internal automatic-injection gate; explicit recall keeps keyword-only hits.
16
+ min_semantic_score?: number;
17
+ // Judge the shortlist after fusion. Opt-in: it cannot start until retrieval
18
+ // has finished, so unlike the superseded judgment it is not free wall clock.
19
+ // Off for automatic injection, which answers inside a fixed hook budget.
20
+ rerank?: boolean;
21
+ // false: no judgment of any kind for this call (a session that opted out).
22
+ judge?: boolean;
23
+ // Attribution for the judgments this call makes (origin, session, project).
24
+ judgeContext?: JudgeContext;
25
+ }
26
+ export interface RecallHit {
27
+ id: string; type: 'memory' | 'session'; content: string; project: string; category: string;
28
+ source: string; created_at: string; score: number; revision: number; flags: string[];
29
+ payload: Record<string, any>; reasons: string[];
30
+ semantic_score?: number; passage_score?: number; keyword_coverage?: number; fusion_score?: number;
31
+ }
32
+ export interface RecallResult { results: RecallHit[]; degraded: string[]; engine: string; elapsed_ms: number; timings?: Record<string,number> }
33
+ const passages = new VectorCache(getDb, 'SELECT id,vector FROM memory_passages', 'SELECT vector FROM memory_passages WHERE id=?', 'memory_passages');
34
+ const metrics = { calls: 0, degraded: 0, total_ms: 0, last_ms: 0 };
35
+ const recentTimes: number[]=[];
36
+ const filterCache=new Map<string,Set<string>>();
37
+ let filterConnection: ReturnType<typeof getDb> | null=null;
38
+ let filterEpoch=-1;
39
+ function memoryIds(sql:string,params:(string|number)[]) {
40
+ const d=getDb();
41
+ const epoch=Number(d.prepare("SELECT COALESCE(MAX(seq),0) AS n FROM memory_changes WHERE entity='memory_filters'").get()?.n || 0);
42
+ if(d!==filterConnection || epoch!==filterEpoch){filterCache.clear();filterConnection=d;filterEpoch=epoch;}
43
+ const key=JSON.stringify([sql,params]);
44
+ let ids=filterCache.get(key);
45
+ if(!ids) {
46
+ ids=new Set(d.prepare(`SELECT m.id FROM memories m WHERE ${sql}`).all(...params).map(r=>String(r.id)));
47
+ filterCache.set(key,ids);
48
+ let total=0;for(const value of filterCache.values())total+=value.size;
49
+ while(filterCache.size>32 || (total>100000 && filterCache.size>1)) {
50
+ const oldest=filterCache.keys().next().value!;total-=filterCache.get(oldest)!.size;filterCache.delete(oldest);
51
+ }
52
+ }
53
+ return ids;
54
+ }
55
+ export function retrievalMetrics() {
56
+ const sorted=[...recentTimes].sort((a,b)=>a-b);
57
+ return { ...metrics, p50_ms:sorted[Math.floor(sorted.length*.5)] ?? 0, p95_ms:sorted[Math.floor(sorted.length*.95)] ?? 0 };
58
+ }
59
+ export function resetPassageCache() { passages.invalidate(); }
60
+ export function hybridEnabled(): boolean {
61
+ if (process.env.SYNABUN_MEMORY_ENGINE) return process.env.SYNABUN_MEMORY_ENGINE === 'hybrid';
62
+ const configured=(getDb().prepare("SELECT value FROM kv_config WHERE key='memory_engine'").get() as {value:string} | undefined)?.value;
63
+ // Enabled after the checked-in relevance, latency and compatibility gates.
64
+ // An explicit legacy setting remains an immediate retrieval rollback.
65
+ return configured ? configured === 'hybrid' : true;
66
+ }
67
+ const stopwords = new Set('the a an is are was were to of for in on and or with my our your we i how what when about do did does this that it at as by from please memory memories synabun'.split(' '));
68
+ const conversationalWords = new Set('there here better same something anything can could would should me you us some any also just maybe really now then than'.split(' '));
69
+ export function queryTerms(query: string): string[] {
70
+ const tokens = query.toLowerCase().match(/[\p{L}\p{N}_]+(?:[-./:][\p{L}\p{N}_]+)*/gu) || [];
71
+ const terms = [...new Set(tokens.filter(t => !stopwords.has(t) && t.length > 1))];
72
+ const specific = terms.filter(t => !conversationalWords.has(t));
73
+ return (specific.length ? specific : terms).slice(0, 32);
74
+ }
75
+
76
+ function filterSql(o: RecallOptions, session: boolean) {
77
+ const clauses = session ? ['NOT EXISTS(SELECT 1 FROM memories hidden WHERE hidden.id=m.id AND hidden.trashed_at IS NOT NULL)'] : ['m.trashed_at IS NULL'];
78
+ const params: (string | number)[] = [];
79
+ const project = o.project || (o.scope === 'project' ? o.currentProject : undefined);
80
+ if (o.scope === 'project' && (!project || (!o.project && project === 'global'))) throw new Error('Project scope requires a project or caller project context.');
81
+ if (project) {
82
+ const aliases = projectAliases(project);
83
+ clauses.push(`lower(m.project) IN (${aliases.map(() => '?').join(',')})`);
84
+ params.push(...aliases.map(p => p.toLowerCase()));
85
+ }
86
+ if (o.category) { clauses.push(session ? (o.category === 'conversations' ? '1=1' : '0=1') : 'm.category=?'); if (!session) params.push(o.category); }
87
+ if (o.tags?.length) {
88
+ if (session) clauses.push('0=1'); // session tools are not memory tags
89
+ else {
90
+ clauses.push('(' + o.tags.map(tag => { params.push(tag); return 'EXISTS(SELECT 1 FROM json_each(m.tags) WHERE value=?)'; }).join(o.tag_match === 'all' ? ' AND ' : ' OR ') + ')');
91
+ }
92
+ }
93
+ if (o.min_importance) { clauses.push(session ? '0=1' : 'm.importance>=?'); if (!session) params.push(o.min_importance); }
94
+ if (o.after) { clauses.push(`${session ? 'm.start_timestamp' : 'm.created_at'}>=?`); params.push(o.after); }
95
+ if (o.before) { clauses.push(`${session ? 'm.start_timestamp' : 'm.created_at'}<=?`); params.push(o.before); }
96
+ return { sql: clauses.join(' AND '), params };
97
+ }
98
+
99
+ function hydrate(row: Record<string, any>, session: boolean, score = 0): RecallHit {
100
+ const p = session ? rowToSessionChunkPayload(row) : rowToPayload(row);
101
+ return { id: row.id, type: session ? 'session' : 'memory', content: p.content, project: p.project,
102
+ category: session ? 'conversations' : row.category, source: session ? 'session' : row.source,
103
+ created_at: session ? row.start_timestamp : row.created_at, score,
104
+ revision: session ? 0 : Number(row.revision || 1), flags: [], payload: p, reasons: [] };
105
+ }
106
+
107
+ /** Both adapters call this engine; formatting remains transport-specific. */
108
+ export async function retrieveMemory(o: RecallOptions, embed = generateEmbedding): Promise<RecallResult> {
109
+ const start = performance.now();
110
+ const timings: Record<string,number>={};
111
+ let stage=start;
112
+ const mark=(name:string)=>{const now=performance.now();timings[name]=now-stage;stage=now;};
113
+ const d = getDb();
114
+ const engine = o.engine || (hybridEnabled() ? 'hybrid' : 'legacy');
115
+ const hybrid = engine === 'hybrid';
116
+ const limit = Math.max(1, Math.min(50, o.limit ?? 5));
117
+ const k = hybrid ? 50 : limit * 2;
118
+ const min = o.min_score ?? 0.3;
119
+ const terms = queryTerms(o.query);
120
+ const degraded: string[] = [];
121
+ const found = new Map<string, RecallHit>();
122
+ const ranks = new Map<string, number>();
123
+ const memoryFilter = filterSql(o, false);
124
+ const sessionFilter = filterSql(o, true);
125
+ const wantedSessions = o.include_sessions ?? (/yesterday|last |previous|recent|session|conversation|ontem|sessão|conversa/i.test(o.query));
126
+ let vector: number[] | null = null;
127
+ // UUID reads bypass inference entirely.
128
+ const uuid = o.query.trim().match(/^[0-9a-f]{8}-[0-9a-f-]{27}$/i)?.[0];
129
+ if (uuid) {
130
+ const row = d.prepare(`SELECT m.* FROM memories m WHERE m.id=? AND ${memoryFilter.sql}`).get(uuid, ...memoryFilter.params);
131
+ if (row) { const h = hydrate(row, false, 1); h.reasons = ['exact UUID']; return {results:[h],degraded,engine,elapsed_ms:performance.now()-start}; }
132
+ }
133
+ const pendingEmbedding=embed(o.query).catch(()=>null);
134
+
135
+ function add(hit: RecallHit, rank: number, reason: string) {
136
+ const key = `${hit.type}:${hit.id}`;
137
+ const previous = found.get(key);
138
+ const channel = ({semantic:'semantic_score',passage:'passage_score',keyword:'keyword_coverage'} as const)[reason as 'semantic'|'passage'|'keyword'];
139
+ if (channel) {
140
+ hit[channel] = hit.score;
141
+ if (previous) previous[channel] = Math.max(previous[channel] ?? -Infinity, hit.score);
142
+ }
143
+ // A long document can match many passages; it gets one vote per channel.
144
+ if (previous?.reasons.includes(reason)) { previous.score=Math.max(previous.score,hit.score); return; }
145
+ if (previous) { previous.score = Math.max(previous.score, hit.score); previous.reasons.push(reason); }
146
+ else { hit.reasons.push(reason); found.set(key, hit); }
147
+ ranks.set(key, (ranks.get(key) || 0) + 1 / (60 + rank));
148
+ }
149
+ function search(session: boolean, lexical: boolean) {
150
+ const table = session ? 'session_chunks' : 'memories';
151
+ const filter = session ? sessionFilter : memoryFilter;
152
+ if (lexical) {
153
+ if (!terms.length) return;
154
+ const fts = session ? 'chunk_search' : 'memory_search';
155
+ try {
156
+ const rows = d.prepare(`SELECT m.* FROM ${fts} f JOIN ${table} m ON m.id=f.id
157
+ WHERE ${fts} MATCH ? AND ${filter.sql} ORDER BY bm25(${fts}) LIMIT ?`)
158
+ .all(terms.map(t => `"${t.replace(/"/g,'""')}"`).join(' OR '), ...filter.params, k);
159
+ rows.forEach((row, i) => {
160
+ const h = hydrate(row, session);
161
+ const body = `${h.content} ${h.payload.related_files || h.payload.files_modified || ''}`.toLowerCase();
162
+ const covered = terms.filter(t => body.includes(t)).length / terms.length;
163
+ h.score = covered;
164
+ if (covered >= min) add(h, i + 1, 'keyword');
165
+ });
166
+ } catch (error) { degraded.push(`Keyword index unavailable (${session ? 'sessions' : 'memories'}).`); }
167
+ } else if (vector) {
168
+ const ids = session ? new Set((d.prepare(`SELECT m.id FROM ${table} m WHERE ${filter.sql}`).all(...filter.params)).map(r => String(r.id)))
169
+ : memoryIds(filter.sql,filter.params);
170
+ const hits = (session ? chunkVectors : memoryVectors).topK(vector, k, hybrid ? min : min * 0.5, ids);
171
+ const hydrateRow = d.prepare(`SELECT m.* FROM ${table} m WHERE m.id=? AND ${filter.sql}`);
172
+ hits.forEach((hit, i) => {
173
+ const row = hydrateRow.get(hit.id,...filter.params);
174
+ if (row) add(hydrate(row, session, hit.score), i + 1, 'semantic');
175
+ });
176
+ }
177
+ }
178
+ if(hybrid)search(false,true);
179
+ mark('keyword');
180
+ vector=await pendingEmbedding;
181
+ mark('embedding_wait');
182
+ if(!vector)degraded.push('Local embeddings unavailable; keyword retrieval used.');
183
+ search(false, false);
184
+ mark('document_vectors');
185
+ if (!hybrid && (!vector || found.size < limit)) search(false, true);
186
+ if (hybrid && vector && found.size) {
187
+ const parents=[...found.values()].filter(r=>r.type==='memory').map(r=>r.id).slice(0,100);
188
+ const ids = new Set(d.prepare(`SELECT p.id FROM memory_passages p INDEXED BY memory_passages_parent CROSS JOIN memories m ON m.id=p.memory_id
189
+ JOIN memory_metadata md ON md.memory_id=m.id WHERE p.memory_id IN (${parents.map(()=>'?').join(',')}) AND ${memoryFilter.sql} AND p.model=? AND p.content_hash=md.content_hash
190
+ AND NOT EXISTS(SELECT 1 FROM memory_jobs j WHERE j.entity_id=m.id AND j.kind='index' AND j.status!='complete')`)
191
+ .all(...parents,...memoryFilter.params, EMBEDDING_VERSION).map(r => String(r.id)));
192
+ mark('passage_filter');
193
+ const parentRow = d.prepare('SELECT m.* FROM memory_passages p JOIN memories m ON m.id=p.memory_id WHERE p.id=? AND m.trashed_at IS NULL');
194
+ for (const [i, hit] of passages.topK(vector, k, min, ids).entries()) {
195
+ const row = parentRow.get(hit.id);
196
+ if (row) add(hydrate(row, false, hit.score), i+1, 'passage');
197
+ }
198
+ }
199
+ mark('passage_vectors');
200
+ if (o.include_sessions !== false && (wantedSessions || found.size < 3)) { search(true,false); search(true,true); }
201
+ // Preserve actual document cosine even for a keyword-only candidate. Fusion
202
+ // rank is not a probability and must never substitute for semantic evidence.
203
+ if (vector) {
204
+ const ids = new Set([...found.values()].filter(h=>h.type==='memory').map(h=>h.id));
205
+ for (const h of memoryVectors.topK(vector, ids.size, -Infinity, ids)) {
206
+ const candidate = found.get(`memory:${h.id}`);
207
+ if (candidate) candidate.semantic_score = h.score;
208
+ }
209
+ }
210
+ const now = Date.now();
211
+ const aliases = o.currentProject ? projectAliases(o.currentProject).map(p=>p.toLowerCase()) : [];
212
+ const readRevision=d.prepare('SELECT MAX(revision) AS n FROM memory_revisions WHERE memory_id=?');
213
+ const readRelations=d.prepare(`SELECT r.*,m.id AS live FROM memory_relations r LEFT JOIN memories m ON m.id=CASE WHEN r.from_id=? THEN r.to_id ELSE r.from_id END
214
+ AND m.trashed_at IS NULL WHERE (r.from_id=? OR r.to_id=?) AND r.active=1`);
215
+ for (const [key, h] of found) {
216
+ const age = Math.max(0, (now - Date.parse(h.created_at)) / 86400000) || 0;
217
+ if (hybrid) {
218
+ h.score = ranks.get(key)!;
219
+ // Exact rare identifiers and dates take precedence over generic matches.
220
+ const identifiers = terms.filter(t => /[\d_./:]/.test(t));
221
+ if (identifiers.length && identifiers.every(t => h.content.toLowerCase().includes(t))) { h.score += 0.025; h.reasons.push('exact identifier'); }
222
+ if (o.recency_boost) h.score *= 1 + 0.15 * Math.pow(0.5, age / 14);
223
+ if (!o.project && aliases.includes(h.project.toLowerCase())) h.score *= 1.1;
224
+ h.fusion_score = h.score;
225
+ } else if (h.type === 'memory' && !h.reasons.includes('keyword')) {
226
+ const boost = Math.min(0.1, (h.payload.access_count || 0)*0.01);
227
+ h.score = o.recency_boost ? h.score*0.35 + Math.pow(0.5,age/14)*0.55+boost
228
+ : h.payload.importance >= 8 ? h.score : h.score*0.7+Math.pow(0.5,age/90)*0.2+boost;
229
+ if (!o.project && h.project === o.currentProject) h.score *= 1.2;
230
+ }
231
+ if (h.type === 'memory') {
232
+ const relations = readRelations.all(h.id,h.id,h.id);
233
+ for (const r of relations) {
234
+ if (!r.live) continue;
235
+ if (r.kind === 'supersedes' && r.to_id === h.id) h.flags.push('superseded');
236
+ if (r.kind === 'conflicts_with' || r.kind === 'possible_conflict') h.flags.push(String(r.kind));
237
+ }
238
+ }
239
+ }
240
+ const sorted = [...found.values()].filter(h => hybrid || h.score >= min).sort((a,b) =>
241
+ (!hybrid && a.type !== b.type ? (a.type === 'memory' ? -1 : 1) : b.score-a.score) || a.id.localeCompare(b.id));
242
+ // "Is this query about the past?" only decides whether superseded memories
243
+ // are shown, so it is asked only when one is among the candidates. Firing it
244
+ // on every recall (as the first version did, racing a fixed 1200 ms) made
245
+ // every recall wait on an answer nothing consulted: supersession is rare,
246
+ // and a third of those calls timed out from a cold connection anyway. When
247
+ // it is needed, the surface's own timeout bounds the wait and a miss falls
248
+ // back to the regex below.
249
+ const needsHistorical = hybrid && !o.before && o.judge !== false && sorted.some(h => h.flags.includes('superseded'));
250
+ const historical = needsHistorical ? await judgeHistoricalQuery(o.query, o.judgeContext) : null;
251
+ // Judging needs a shortlist wider than the answer, or there is nothing to reorder.
252
+ const collect = o.rerank && hybrid && o.judge !== false ? Math.max(limit, 10) : limit;
253
+ const results: RecallHit[] = [];
254
+ const seen = new Set<string>();
255
+ const byHash = new Map<string,string>();
256
+ for (const h of sorted) {
257
+ if (o.min_semantic_score !== undefined && Math.max(h.semantic_score ?? -Infinity, h.passage_score ?? -Infinity) < o.min_semantic_score) continue;
258
+ if(!hybrid && results.filter(r=>r.type===h.type).length >= (h.type==='memory' ? limit : Math.max(3,Math.floor(limit/2))))continue;
259
+ if(h.type==='session' && h.payload.dedup_memory_id && seen.has(h.payload.dedup_memory_id))continue;
260
+ // The judgment answers this in any language; the regex, which only ever
261
+ // spoke English and Portuguese, stays as the fallback when it is missing.
262
+ if (hybrid && h.flags.includes('superseded') && !o.before
263
+ && !(historical ?? /history|histor|previous|old|antes|anterior/i.test(o.query))) continue;
264
+ const hash = createHash('sha256').update(`${h.project.toLowerCase()}\0${h.category}\0${h.source === 'session' || h.payload.subcategory === 'session-chunk' ? 'session' : h.source}\0${JSON.stringify([...(h.payload.tags || [])].sort())}\0${h.content}`).digest('hex');
265
+ // A legacy mirrored chunk shares its UUID with the session row.
266
+ if (seen.has(h.id)) continue;
267
+ if (hybrid && byHash.has(hash)) {
268
+ const previous=byHash.get(hash)!;
269
+ const undone=d.prepare("SELECT 1 FROM memory_relations WHERE kind='duplicate_of' AND active=0 AND ((from_id=? AND to_id=?) OR (from_id=? AND to_id=?))")
270
+ .get(h.id,previous,previous,h.id);
271
+ if(!undone)continue;
272
+ }
273
+ seen.add(h.id); seen.add(hash);
274
+ byHash.set(hash,h.id);
275
+ if(h.type === 'memory') h.revision=Number((readRevision.get(h.id) as {n:number}).n || 1);
276
+ if(h.type==='memory' && h.payload.file_checksums && Object.keys(h.payload.file_checksums).length) {
277
+ const verification=d.prepare('SELECT verification,verified_revision,checked_at,stale_verdicts FROM memory_metadata WHERE memory_id=?').get(h.id);
278
+ if(verification?.verification==='stale')h.flags.push('source needs recheck');
279
+ // An edit-time judgment found this revision no longer matches its file.
280
+ if(verification?.stale_verdicts && judgedStale(verification.stale_verdicts,h.revision))h.flags.push('judged stale');
281
+ if(verification?.verified_revision!==h.revision || Date.now()-Date.parse(String(verification?.checked_at || ''))>300000 || !verification?.checked_at) {
282
+ d.prepare(`INSERT INTO memory_jobs(id,kind,entity_id,updated_at) VALUES(?,'verify',?,?)
283
+ ON CONFLICT(kind,entity_id) DO UPDATE SET status=CASE WHEN status='running' THEN status ELSE 'pending' END,attempts=0,updated_at=excluded.updated_at`)
284
+ .run(`verify:${h.id}`,h.id,new Date().toISOString());
285
+ }
286
+ }
287
+ results.push(h);
288
+ if (hybrid && results.length >= collect) break;
289
+ }
290
+ if (collect > limit && results.length > 1) {
291
+ // Rank after fusion, not instead of it. A missing or partial judgment
292
+ // leaves the fusion order in place; only judged hits move.
293
+ const judged = await judgeRelevance(o.query, results.map(h=>({id:h.id,content:excerpt(h.content,o.query,RELEVANCE_CANDIDATE_CLIP)})), o.judgeContext);
294
+ if (judged?.size) {
295
+ const ordered = orderByJudgedScore(results, judged);
296
+ results.splice(0, results.length, ...ordered);
297
+ for (const h of results) if (judged.has(h.id)) h.reasons.push('judged relevance');
298
+ }
299
+ }
300
+ if (collect > limit) results.length = Math.min(results.length, limit);
301
+ const elapsed_ms = performance.now()-start;
302
+ metrics.calls++; metrics.degraded += degraded.length ? 1 : 0; metrics.total_ms += elapsed_ms; metrics.last_ms = elapsed_ms;
303
+ recentTimes.push(elapsed_ms);if(recentTimes.length>500)recentTimes.shift();
304
+ mark('rank_and_metadata');
305
+ return { results, degraded, engine, elapsed_ms, timings };
306
+ }
307
+
308
+ /** Conservative local estimate; explicitly not a provider tokenizer. */
309
+ export function estimateTokens(value: string) { return Math.ceil(Buffer.byteLength(value, 'utf8') / 3); }
310
+ export function excerpt(content: string, query: string, maxChars = 700): string {
311
+ if (content.length <= maxChars) return content;
312
+ const terms = queryTerms(query);
313
+ const spans = content.match(/[^\n.!?]+(?:[.!?](?=\s)|\n|$)/g) || [content];
314
+ const ranked = spans.map((text,index) => ({text,index,score:terms.filter(t => text.toLowerCase().includes(t)).length})).sort((a,b) => b.score-a.score || a.index-b.index);
315
+ const chosen: typeof ranked = [];
316
+ let size = 0;
317
+ for (const span of ranked) {
318
+ if (span.text.length > maxChars) {
319
+ if (chosen.length) continue;
320
+ const term = terms.find(t => span.text.toLowerCase().includes(t));
321
+ const at = term ? span.text.toLowerCase().indexOf(term) : 0;
322
+ const start = Math.max(0,at-100);
323
+ chosen.push({...span,text:(start ? '…' : '')+span.text.slice(start,start+maxChars-2)+'…'}); break;
324
+ }
325
+ if (size+span.text.length+3 > maxChars) continue;
326
+ chosen.push(span); size += span.text.length+3;
327
+ }
328
+ return chosen.sort((a,b)=>a.index-b.index).map(s=>s.text.trim()).join(' … ');
329
+ }
330
+ export function compactRecall(result: RecallResult, query: string, budget = 1500, explain = false) {
331
+ const header = `SynaBun: ${result.engine} retrieval. Token counts are local estimates.${result.degraded.length ? ' '+result.degraded.join(' ') : ''}`;
332
+ const lines = [header];
333
+ for (const h of result.results) {
334
+ const meta = `[${h.id}] r${h.revision} ${h.type} | ${h.project} | ${h.category} | ${h.source} | ${h.created_at}${h.flags.length ? ' | '+h.flags.join(',') : ''}`;
335
+ const remaining = (budget-estimateTokens(lines.join('\n\n')+'\n\n'+meta+'\n'))*3;
336
+ if (remaining < 60) break;
337
+ let chars = Math.min(700,remaining);
338
+ let line = '';
339
+ do {
340
+ line = meta+'\n'+excerpt(h.content,query,chars)+(explain ? '\nMatched: '+h.reasons.join(', ')+'; scores: '+JSON.stringify({semantic:h.semantic_score,passage:h.passage_score,keyword_coverage:h.keyword_coverage,fusion:h.fusion_score}) : '');
341
+ if (estimateTokens([...lines,line].join('\n\n')) <= budget) break;
342
+ chars = Math.floor(chars*0.8);
343
+ } while (chars >= 40);
344
+ if (estimateTokens([...lines,line].join('\n\n')) > budget) continue;
345
+ lines.push(line);
346
+ }
347
+ if (lines.length === 1 && !result.results.length) lines.push('No relevant evidence found.');
348
+ return estimateTokens(lines.join('\n\n')) <= budget ? lines.join('\n\n') : '';
349
+ }
@@ -0,0 +1,280 @@
1
+ import type { DatabaseSync } from 'node:sqlite';
2
+ import { createHash } from 'node:crypto';
3
+
4
+ // Published migration numbers are immutable. Later additions must run even if
5
+ // an earlier build already marked its own schema version complete.
6
+ const migrations = [
7
+ { version: 2, apply: migrateV2 },
8
+ { version: 3, apply: migrateV3 },
9
+ { version: 4, apply: migrateV4 },
10
+ { version: 5, apply: migrateV5 },
11
+ { version: 6, apply: migrateV6 },
12
+ { version: 7, apply: migrateV7 },
13
+ ];
14
+
15
+ /** Additive migrations. Triggers also cover legacy/direct SQL writers. */
16
+ export function migrateMemory(d: DatabaseSync, dbPath: string): void {
17
+ d.exec('CREATE TABLE IF NOT EXISTS memory_migrations (version INTEGER PRIMARY KEY, applied_at TEXT NOT NULL, backup TEXT)');
18
+ const applied = new Set(d.prepare('SELECT version FROM memory_migrations').all().map(row => Number(row.version)));
19
+ const pending = migrations.filter(migration => !applied.has(migration.version));
20
+ if (!pending.length) return;
21
+ // VACUUM INTO makes a consistent copy including committed WAL pages. Two
22
+ // migrating processes may make backups; BEGIN IMMEDIATE serializes the DDL.
23
+ const populated = applied.size > 0 || Boolean(d.prepare('SELECT EXISTS(SELECT 1 FROM memories) OR EXISTS(SELECT 1 FROM session_chunks) AS populated').get()?.populated);
24
+ const backup = populated && dbPath !== ':memory:' ? `${dbPath}.pre-v${pending[0].version}-${Date.now()}-${process.pid}.bak` : null;
25
+ if (backup) d.prepare('VACUUM INTO ?').run(backup);
26
+ d.exec('BEGIN IMMEDIATE');
27
+ try {
28
+ for (const migration of pending) {
29
+ if (d.prepare('SELECT 1 FROM memory_migrations WHERE version = ?').get(migration.version)) continue;
30
+ migration.apply(d);
31
+ d.prepare('INSERT INTO memory_migrations(version,applied_at,backup) VALUES(?,?,?)')
32
+ .run(migration.version, new Date().toISOString(), backup);
33
+ }
34
+ d.exec('COMMIT');
35
+ } catch (error) { d.exec('ROLLBACK'); throw error; }
36
+ }
37
+
38
+ const columns = ['content','category','subcategory','project','tags','importance','source','created_at','updated_at',
39
+ 'accessed_at','access_count','related_files','related_memory_ids','file_checksums','trashed_at','source_session_chunks'];
40
+ const payload = (alias: string) => `json_object(${columns.map(c => `'${c}',${alias}.${c}`).join(',')})`;
41
+
42
+ function migrateV2(d: DatabaseSync): void {
43
+ d.exec(`
44
+ CREATE TABLE memory_changes (seq INTEGER PRIMARY KEY AUTOINCREMENT, entity TEXT NOT NULL, id TEXT NOT NULL);
45
+ CREATE INDEX memory_changes_entity ON memory_changes(entity, seq);
46
+ CREATE INDEX idx_memory_project_lower ON memories(lower(project));
47
+ CREATE INDEX idx_chunk_project_lower ON session_chunks(lower(project));
48
+ CREATE TABLE memory_revisions (memory_id TEXT NOT NULL, revision INTEGER NOT NULL, payload TEXT NOT NULL,
49
+ vector BLOB NOT NULL, recorded_at TEXT NOT NULL, PRIMARY KEY(memory_id, revision));
50
+ CREATE TABLE memory_metadata (memory_id TEXT PRIMARY KEY, kind TEXT NOT NULL DEFAULT 'note',
51
+ source_ref TEXT, content_hash TEXT, idempotency_key TEXT, project TEXT, category TEXT, request_hash TEXT,
52
+ verification TEXT, verified_revision INTEGER, checked_at TEXT);
53
+ CREATE UNIQUE INDEX memory_idempotency ON memory_metadata(project, category, idempotency_key) WHERE idempotency_key IS NOT NULL;
54
+ CREATE TABLE memory_relations (id TEXT PRIMARY KEY, from_id TEXT NOT NULL, to_id TEXT NOT NULL,
55
+ kind TEXT NOT NULL CHECK(kind IN ('duplicate_of','supersedes','conflicts_with','possible_conflict','similar')),
56
+ automatic INTEGER NOT NULL DEFAULT 0, active INTEGER NOT NULL DEFAULT 1, created_at TEXT NOT NULL,
57
+ UNIQUE(from_id, to_id, kind));
58
+ CREATE INDEX memory_relations_from ON memory_relations(from_id, active);
59
+ CREATE INDEX memory_relations_to ON memory_relations(to_id, active);
60
+ CREATE TABLE memory_feedback (id TEXT PRIMARY KEY, memory_id TEXT NOT NULL, value TEXT NOT NULL, created_at TEXT NOT NULL);
61
+ CREATE TABLE memory_jobs (id TEXT PRIMARY KEY, kind TEXT NOT NULL, entity_id TEXT NOT NULL, status TEXT NOT NULL DEFAULT 'pending',
62
+ attempts INTEGER NOT NULL DEFAULT 0, error TEXT, updated_at TEXT NOT NULL, UNIQUE(kind, entity_id));
63
+ CREATE TABLE memory_passages (id TEXT PRIMARY KEY, memory_id TEXT NOT NULL, content_hash TEXT NOT NULL,
64
+ position INTEGER NOT NULL, content TEXT NOT NULL, vector BLOB NOT NULL, model TEXT NOT NULL);
65
+ CREATE INDEX memory_passages_parent ON memory_passages(memory_id);
66
+ CREATE TABLE memory_session_sources (host TEXT NOT NULL, session_id TEXT NOT NULL, source_id TEXT NOT NULL,
67
+ content_hash TEXT NOT NULL, chunk_id TEXT NOT NULL, PRIMARY KEY(host, session_id, source_id));
68
+ CREATE TABLE memory_capture_files (host TEXT NOT NULL, session_id TEXT NOT NULL, file_path TEXT NOT NULL,
69
+ project TEXT NOT NULL, cwd TEXT, byte_offset INTEGER NOT NULL DEFAULT 0, status TEXT NOT NULL DEFAULT 'pending',
70
+ error TEXT, PRIMARY KEY(host,session_id));
71
+ CREATE VIRTUAL TABLE memory_search USING fts5(id UNINDEXED, content, category, project, tags, files, tokenize='unicode61 remove_diacritics 2');
72
+ CREATE VIRTUAL TABLE chunk_search USING fts5(id UNINDEXED, content, summary, project, files, tokenize='unicode61 remove_diacritics 2');
73
+ `);
74
+ // Repair the old external-content index and keep it valid for old readers.
75
+ d.exec(`DROP TABLE memories_fts;
76
+ CREATE VIRTUAL TABLE memories_fts USING fts5(content,category,project,tags,content=memories,content_rowid=rowid,tokenize='porter unicode61');
77
+ INSERT INTO memories_fts(memories_fts) VALUES('rebuild');
78
+ INSERT INTO memory_search SELECT id,content,category,project,tags,related_files FROM memories WHERE trashed_at IS NULL;
79
+ INSERT INTO chunk_search SELECT id,content,summary,project,files_modified FROM session_chunks;
80
+ INSERT INTO memory_revisions SELECT m.id,1,${payload('m')},m.vector,strftime('%Y-%m-%dT%H:%M:%fZ','now') FROM memories m;
81
+ INSERT INTO memory_jobs(id,kind,entity_id,updated_at) SELECT 'index:'||id,'index',id,strftime('%Y-%m-%dT%H:%M:%fZ','now') FROM memories;
82
+ `);
83
+ installMemoryTriggers(d);
84
+ }
85
+
86
+ /** Repair stores opened by early v2 builds, without replaying their migration. */
87
+ function migrateV3(d: DatabaseSync): void {
88
+ const metadataColumns = new Set(d.prepare('PRAGMA table_info(memory_metadata)').all().map(row => String(row.name)));
89
+ for (const [name, type] of Object.entries({ request_hash: 'TEXT', verification: 'TEXT', verified_revision: 'INTEGER', checked_at: 'TEXT' })) {
90
+ if (!metadataColumns.has(name)) d.exec(`ALTER TABLE memory_metadata ADD COLUMN ${name} ${type}`);
91
+ }
92
+ d.exec(`
93
+ CREATE TABLE IF NOT EXISTS memory_capture_files (host TEXT NOT NULL, session_id TEXT NOT NULL, file_path TEXT NOT NULL,
94
+ project TEXT NOT NULL, cwd TEXT, byte_offset INTEGER NOT NULL DEFAULT 0, status TEXT NOT NULL DEFAULT 'pending',
95
+ error TEXT, PRIMARY KEY(host,session_id));
96
+ CREATE INDEX IF NOT EXISTS idx_memory_project_lower ON memories(lower(project));
97
+ CREATE INDEX IF NOT EXISTS idx_chunk_project_lower ON session_chunks(lower(project));
98
+ `);
99
+ // Early retry keys predate request_hash. Recover the original request from
100
+ // its first revision, since later indexing may have replaced content_hash.
101
+ const retryRequests = d.prepare(`SELECT md.memory_id, COALESCE((
102
+ SELECT json_extract(r.payload,'$.content') FROM memory_revisions r
103
+ WHERE r.memory_id=md.memory_id ORDER BY r.revision LIMIT 1),m.content) AS content
104
+ FROM memory_metadata md JOIN memories m ON m.id=md.memory_id
105
+ WHERE md.idempotency_key IS NOT NULL AND md.request_hash IS NULL`).all();
106
+ const updateHash = d.prepare('UPDATE memory_metadata SET request_hash=? WHERE memory_id=?');
107
+ for (const row of retryRequests) {
108
+ updateHash.run(createHash('sha256').update(String(row.content)).digest('hex'), row.memory_id);
109
+ }
110
+ installMemoryTriggers(d);
111
+ // A running client may already have cached filters before these triggers
112
+ // existed. Invalidate that epoch once, without touching content or vectors.
113
+ d.exec("INSERT INTO memory_changes(entity,id) VALUES('memory_filters','schema:3')");
114
+ }
115
+
116
+ /**
117
+ * Room for TypeSafe's judgments beside the stored values, never replacing them.
118
+ * The caller's stated importance stays authoritative in `memories.importance`;
119
+ * `importance_judged` records what the model would have said, so agreement can
120
+ * be measured on real data before anything starts trusting it.
121
+ */
122
+ function migrateV4(d: DatabaseSync): void {
123
+ const metadataColumns = new Set(d.prepare('PRAGMA table_info(memory_metadata)').all().map(row => String(row.name)));
124
+ for (const [name, type] of Object.entries({
125
+ importance_judged: 'REAL', importance_confidence: 'REAL',
126
+ kind_judged: 'TEXT', kind_confidence: 'REAL', judged_at: 'TEXT',
127
+ })) {
128
+ if (!metadataColumns.has(name)) d.exec(`ALTER TABLE memory_metadata ADD COLUMN ${name} ${type}`);
129
+ }
130
+ }
131
+
132
+ /**
133
+ * A log of every TypeSafe judgment (bounded by the writer, see
134
+ * typesafe-config.ts), the jobs index the judge backfill needs, room for the
135
+ * category check beside the other judged columns, and the duplicate_of
136
+ * direction repair. Nothing here touches stored content or vectors.
137
+ */
138
+ function migrateV5(d: DatabaseSync): void {
139
+ d.exec(`
140
+ CREATE TABLE IF NOT EXISTS typesafe_log (
141
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
142
+ created_at TEXT NOT NULL,
143
+ surface TEXT NOT NULL,
144
+ origin TEXT NOT NULL DEFAULT 'live',
145
+ entity_id TEXT,
146
+ model TEXT,
147
+ question_count INTEGER,
148
+ state_preview TEXT,
149
+ answers TEXT,
150
+ latency_ms INTEGER,
151
+ input_tokens INTEGER,
152
+ output_tokens INTEGER,
153
+ cached INTEGER DEFAULT 0,
154
+ error TEXT
155
+ );
156
+ CREATE INDEX IF NOT EXISTS idx_typesafe_log_created ON typesafe_log(created_at DESC);
157
+ CREATE INDEX IF NOT EXISTS idx_typesafe_log_surface ON typesafe_log(surface, created_at DESC);
158
+ CREATE INDEX IF NOT EXISTS idx_typesafe_log_entity ON typesafe_log(entity_id);
159
+ CREATE INDEX IF NOT EXISTS idx_memory_jobs_status_kind ON memory_jobs(status, kind, updated_at);
160
+ `);
161
+ const metadataColumns = new Set(d.prepare('PRAGMA table_info(memory_metadata)').all().map(row => String(row.name)));
162
+ for (const [name, type] of Object.entries({ category_judged: 'TEXT', category_confidence: 'REAL' })) {
163
+ if (!metadataColumns.has(name)) d.exec(`ALTER TABLE memory_metadata ADD COLUMN ${name} ${type}`);
164
+ }
165
+ repairDuplicateDirection(d);
166
+ }
167
+
168
+ /**
169
+ * Trash triage's expendability score beside the other judged columns, so a
170
+ * repeat triage reads it instead of asking again; the basis fingerprints what
171
+ * was judged, and a mismatch means ask again. The content_hash index turns the
172
+ * exact-copy lookups (triage discovery, the index job's duplicate check) from
173
+ * a per-row project scan into an index probe.
174
+ */
175
+ function migrateV6(d: DatabaseSync): void {
176
+ const metadataColumns = new Set(d.prepare('PRAGMA table_info(memory_metadata)').all().map(row => String(row.name)));
177
+ for (const [name, type] of Object.entries({ expendability: 'REAL', expendability_at: 'TEXT', expendability_basis: 'TEXT' })) {
178
+ if (!metadataColumns.has(name)) d.exec(`ALTER TABLE memory_metadata ADD COLUMN ${name} ${type}`);
179
+ }
180
+ d.exec('CREATE INDEX IF NOT EXISTS idx_memory_metadata_content_hash ON memory_metadata(content_hash)');
181
+ }
182
+
183
+ /**
184
+ * Attribution for the judgment log (which session and project asked, which
185
+ * riders shared the request, what the caller did with the answer), and room
186
+ * beside each memory for the edit-time stale verdicts. Additive DDL only: old
187
+ * rows keep NULL sessions and their `live` origin.
188
+ */
189
+ function migrateV7(d: DatabaseSync): void {
190
+ const logColumns = new Set(d.prepare('PRAGMA table_info(typesafe_log)').all().map(row => String(row.name)));
191
+ for (const [name, type] of Object.entries({ session_id: 'TEXT', project: 'TEXT', surfaces: 'TEXT', outcome: 'TEXT' })) {
192
+ if (!logColumns.has(name)) d.exec(`ALTER TABLE typesafe_log ADD COLUMN ${name} ${type}`);
193
+ }
194
+ d.exec(`
195
+ CREATE INDEX IF NOT EXISTS idx_typesafe_log_session ON typesafe_log(session_id, id) WHERE session_id IS NOT NULL;
196
+ CREATE INDEX IF NOT EXISTS idx_typesafe_log_project ON typesafe_log(project, created_at DESC) WHERE project IS NOT NULL;
197
+ `);
198
+ const metadataColumns = new Set(d.prepare('PRAGMA table_info(memory_metadata)').all().map(row => String(row.name)));
199
+ for (const [name, type] of Object.entries({ stale_verdicts: 'TEXT', stale_checked_at: 'TEXT' })) {
200
+ if (!metadataColumns.has(name)) d.exec(`ALTER TABLE memory_metadata ADD COLUMN ${name} ${type}`);
201
+ }
202
+ }
203
+
204
+ /**
205
+ * `duplicate_of` is directional: the NEWER memory points at the older one, so
206
+ * a pair judged from either end collides on one row. Earlier builds relied on
207
+ * every caller computing that direction itself; this makes stored rows match
208
+ * the rule `setRelation` now enforces. When both directions exist, the
209
+ * canonical row survives and inherits an explicit undo (active=0) from either
210
+ * side; lone rows pointing the wrong way are flipped in place.
211
+ */
212
+ export function repairDuplicateDirection(d: DatabaseSync): { collapsed: number; flipped: number } {
213
+ const older = '(f.created_at<t.created_at OR (f.created_at=t.created_at AND f.id<t.id))';
214
+ const newer = '(f.created_at>t.created_at OR (f.created_at=t.created_at AND f.id>t.id))';
215
+ d.exec(`UPDATE memory_relations SET active=0 WHERE kind='duplicate_of' AND active=1 AND id IN (
216
+ SELECT a.id FROM memory_relations a
217
+ JOIN memory_relations b ON b.kind='duplicate_of' AND b.from_id=a.to_id AND b.to_id=a.from_id AND b.active=0
218
+ JOIN memories f ON f.id=a.from_id JOIN memories t ON t.id=a.to_id
219
+ WHERE a.kind='duplicate_of' AND ${newer})`);
220
+ const collapsed = d.prepare(`DELETE FROM memory_relations WHERE kind='duplicate_of' AND id IN (
221
+ SELECT a.id FROM memory_relations a
222
+ JOIN memory_relations b ON b.kind='duplicate_of' AND b.from_id=a.to_id AND b.to_id=a.from_id
223
+ JOIN memories f ON f.id=a.from_id JOIN memories t ON t.id=a.to_id
224
+ WHERE a.kind='duplicate_of' AND ${older})`).run().changes;
225
+ const flipped = d.prepare(`UPDATE memory_relations SET from_id=to_id, to_id=from_id WHERE kind='duplicate_of' AND id IN (
226
+ SELECT r.id FROM memory_relations r JOIN memories f ON f.id=r.from_id JOIN memories t ON t.id=r.to_id
227
+ WHERE r.kind='duplicate_of' AND ${older})`).run().changes;
228
+ return { collapsed: Number(collapsed), flipped: Number(flipped) };
229
+ }
230
+
231
+ function installMemoryTriggers(d: DatabaseSync): void {
232
+ for (const name of ['memory_insert','memory_update','memory_reindex','memory_vector_update','memory_delete']) {
233
+ d.exec(`DROP TRIGGER IF EXISTS ${name}`);
234
+ }
235
+ const revision = (alias: string) => `INSERT INTO memory_revisions SELECT ${alias}.id,
236
+ COALESCE((SELECT MAX(revision) FROM memory_revisions WHERE memory_id=${alias}.id),0)+1,
237
+ ${payload(alias)},${alias}.vector,strftime('%Y-%m-%dT%H:%M:%fZ','now');`;
238
+ const enqueue = `INSERT INTO memory_jobs(id,kind,entity_id,updated_at) VALUES('index:'||new.id,'index',new.id,strftime('%Y-%m-%dT%H:%M:%fZ','now'))
239
+ ON CONFLICT(kind,entity_id) DO UPDATE SET status='pending',attempts=0,error=NULL,updated_at=excluded.updated_at;`;
240
+ const insertSearch = `INSERT INTO memory_search(id,content,category,project,tags,files)
241
+ SELECT new.id,new.content,new.category,new.project,new.tags,new.related_files WHERE new.trashed_at IS NULL;`;
242
+ d.exec(`CREATE TRIGGER memory_insert AFTER INSERT ON memories BEGIN
243
+ DELETE FROM memory_search WHERE id=new.id; ${insertSearch}
244
+ INSERT INTO memories_fts(rowid,content,category,project,tags) VALUES(new.rowid,new.content,new.category,new.project,new.tags);
245
+ INSERT INTO memory_changes(entity,id) VALUES('memories',new.id);
246
+ INSERT INTO memory_changes(entity,id) VALUES('memory_filters',new.id);
247
+ ${revision('new')} ${enqueue}
248
+ END;
249
+ CREATE TRIGGER memory_update AFTER UPDATE OF content,category,subcategory,project,tags,importance,source,created_at,related_files,related_memory_ids,file_checksums,trashed_at,source_session_chunks ON memories BEGIN
250
+ DELETE FROM memory_search WHERE id=new.id; ${insertSearch}
251
+ INSERT INTO memories_fts(memories_fts,rowid,content,category,project,tags) VALUES('delete',old.rowid,old.content,old.category,old.project,old.tags);
252
+ INSERT INTO memories_fts(rowid,content,category,project,tags) VALUES(new.rowid,new.content,new.category,new.project,new.tags);
253
+ INSERT INTO memory_changes(entity,id) VALUES('memory_filters',new.id);
254
+ ${revision('new')}
255
+ END;
256
+ CREATE TRIGGER memory_reindex AFTER UPDATE OF content,project,category,source ON memories BEGIN ${enqueue} END;
257
+ CREATE TRIGGER memory_vector_update AFTER UPDATE OF vector,trashed_at ON memories BEGIN
258
+ INSERT INTO memory_changes(entity,id) VALUES('memories',new.id);
259
+ END;
260
+ CREATE TRIGGER memory_delete AFTER DELETE ON memories BEGIN
261
+ DELETE FROM memory_search WHERE id=old.id;
262
+ INSERT INTO memories_fts(memories_fts,rowid,content,category,project,tags) VALUES('delete',old.rowid,old.content,old.category,old.project,old.tags);
263
+ INSERT INTO memory_changes(entity,id) VALUES('memories',old.id);
264
+ INSERT INTO memory_changes(entity,id) VALUES('memory_filters',old.id);
265
+ DELETE FROM memory_passages WHERE memory_id=old.id;
266
+ DELETE FROM memory_jobs WHERE entity_id=old.id;
267
+ END;
268
+ `);
269
+ for (const table of ['session_chunks', 'memory_passages']) {
270
+ for (const event of ['INSERT','UPDATE','DELETE']) {
271
+ const alias = event === 'DELETE' ? 'old' : 'new';
272
+ d.exec(`DROP TRIGGER IF EXISTS ${table}_${event.toLowerCase()};
273
+ CREATE TRIGGER ${table}_${event.toLowerCase()} AFTER ${event} ON ${table} BEGIN
274
+ INSERT INTO memory_changes(entity,id) VALUES('${table}',${alias}.id);
275
+ ${table === 'session_chunks' ? `DELETE FROM chunk_search WHERE id=${alias}.id;
276
+ ${event !== 'DELETE' ? 'INSERT INTO chunk_search(id,content,summary,project,files) VALUES(new.id,new.content,new.summary,new.project,new.files_modified);' : ''}` : ''}
277
+ END;`);
278
+ }
279
+ }
280
+ }