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,922 @@
1
+ /**
2
+ * Shared SQLite database layer for the Neural Interface.
3
+ * Uses node:sqlite (built-in since Node 22.5.0).
4
+ * Shares the same memory.db file as the MCP server (WAL mode for concurrent access).
5
+ */
6
+
7
+ import { DatabaseSync } from 'node:sqlite';
8
+ import { resolve, dirname } from 'path';
9
+ import { existsSync, mkdirSync } from 'fs';
10
+ import { getDb as sharedDb, closeDatabase, memoryVectors, chunkVectors, searchMemories as sharedSearch, searchSessionChunks as sharedSessionSearch, updatePayload as sharedUpdate, deleteMemory as sharedDelete } from '../../mcp-server/dist/services/sqlite.js';
11
+ import { generateEmbedding, generateEmbeddingBatch, warmupEmbeddings, EMBEDDING_MODEL, EMBEDDING_DIMENSIONS } from '../../mcp-server/dist/services/local-embeddings.js';
12
+ export { memoryVectors, chunkVectors, warmupEmbeddings, EMBEDDING_MODEL };
13
+ export const EMBEDDING_DIMS = EMBEDDING_DIMENSIONS;
14
+ export const getEmbedding = generateEmbedding;
15
+ export const getEmbeddingBatch = generateEmbeddingBatch;
16
+ import { getDataHome } from '../../lib/paths.js';
17
+
18
+ function getDefaultDbPath() {
19
+ const dataDir = process.env.MEMORY_DATA_DIR || resolve(getDataHome(), 'mcp-data');
20
+ return resolve(dataDir, 'memory.db');
21
+ }
22
+
23
+ let db = null;
24
+
25
+ // --- Embedding ---
26
+
27
+ export function getEmbeddingDims() {
28
+ return EMBEDDING_DIMS;
29
+ }
30
+
31
+ // --- Database ---
32
+
33
+ export function getDbPath() {
34
+ const envPath = process.env.SQLITE_DB_PATH;
35
+ const defaultPath = getDefaultDbPath();
36
+ if (!envPath) return defaultPath;
37
+ // If the env path's parent directory doesn't exist (e.g. Windows path on Mac),
38
+ // fall back to the local default so cross-OS restores work instantly
39
+ if (!existsSync(dirname(envPath))) return defaultPath;
40
+ return envPath;
41
+ }
42
+
43
+ export function getDb() {
44
+ if (!db) {
45
+ const dbPath = getDbPath();
46
+ const dir = dirname(dbPath);
47
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
48
+
49
+ db = sharedDb();
50
+ try { db.exec(SESSION_CACHE_SQL); } catch { /* session_cache migration */ }
51
+ try {
52
+ const sessionCacheColumns = new Set(
53
+ db.prepare('PRAGMA table_info(session_cache)').all().map((column) => String(column?.name || '')),
54
+ );
55
+ if (!sessionCacheColumns.has('account_id')) db.exec('ALTER TABLE session_cache ADD COLUMN account_id TEXT');
56
+ } catch { /* additive session_cache migration */ }
57
+ try { db.exec(SESSION_FTS_SQL); } catch { /* FTS5 may already exist */ }
58
+ }
59
+ return db;
60
+ }
61
+
62
+ const SESSION_CACHE_SQL = `
63
+ CREATE TABLE IF NOT EXISTS session_cache (
64
+ session_id TEXT NOT NULL,
65
+ provider TEXT NOT NULL,
66
+ project TEXT,
67
+ project_path TEXT,
68
+ git_branch TEXT,
69
+ first_prompt TEXT,
70
+ message_count INTEGER DEFAULT 0,
71
+ created TEXT,
72
+ modified TEXT,
73
+ file_path TEXT,
74
+ file_size INTEGER,
75
+ file_mtime TEXT,
76
+ body_size INTEGER,
77
+ deleted INTEGER DEFAULT 0,
78
+ account_id TEXT,
79
+ PRIMARY KEY (session_id, provider)
80
+ );
81
+ CREATE INDEX IF NOT EXISTS idx_session_cache_provider_modified
82
+ ON session_cache(provider, modified DESC);
83
+ CREATE INDEX IF NOT EXISTS idx_session_cache_project
84
+ ON session_cache(project_path);
85
+ `;
86
+
87
+ const SESSION_FTS_SQL = `
88
+ CREATE VIRTUAL TABLE IF NOT EXISTS session_fts USING fts5(
89
+ session_id UNINDEXED,
90
+ provider UNINDEXED,
91
+ project UNINDEXED,
92
+ first_prompt,
93
+ body,
94
+ tokenize = 'porter unicode61 remove_diacritics 2'
95
+ );
96
+ `;
97
+
98
+ export function closeDb() {
99
+ if (db) {
100
+ closeDatabase();
101
+ db = null;
102
+ }
103
+ memoryVectors.invalidate();
104
+ chunkVectors.invalidate();
105
+ }
106
+
107
+ // --- In-memory vector caches (see vector-cache.js for coherence model) ---
108
+ // Exported so same-connection writers (session-indexer, server.js bridge
109
+ // import) can patch the cache — same-connection writes do NOT bump
110
+ // PRAGMA data_version, so they must update the cache explicitly.
111
+
112
+ // --- X/Twitter engagement ledger (cross-schedule dedup) ---
113
+
114
+ /**
115
+ * Read the shared engagement ledger written by the X automations and return a
116
+ * deduped recent set of engaged handles + tweet status IDs, plus the permanent
117
+ * blocklist (accounts that blocked us).
118
+ *
119
+ * Templates log every reply/quote/follow/post with tags that include "x-engaged"
120
+ * plus "acct:<account>", "handle:<handle>" and (for replies/quotes) "status:<id>";
121
+ * a block is logged with "action:blocked". launchScheduledLoop() reads this to
122
+ * inject a "do not re-engage" skip-list into every run, so no post or author is
123
+ * hit twice ACROSS schedules, and blockers are never re-attempted. Deterministic —
124
+ * does not depend on the agent recalling memory. Account-scoped when `account` is
125
+ * given (each X account keeps its own ledger). Never throws (a ledger lookup
126
+ * failure must not block a scheduled launch).
127
+ *
128
+ * @param {{account?:string|null, days?:number, limit?:number}} opts
129
+ * @returns {{handles:string[], statusIds:string[], blocked:string[], error?:string}}
130
+ */
131
+ export function getRecentXEngagements({ account = null, days = 7, limit = 200 } = {}) {
132
+ const acct = account ? String(account).trim().replace(/^@/, '').toLowerCase() : null;
133
+ const acctLike = acct ? `%"acct:${acct}"%` : null;
134
+ const collect = (rows, handleSet, statusSet) => {
135
+ for (const row of rows) {
136
+ let tags;
137
+ try { tags = JSON.parse(row.tags || '[]'); } catch { continue; }
138
+ if (!Array.isArray(tags)) continue;
139
+ for (const t of tags) {
140
+ if (typeof t !== 'string') continue;
141
+ if (t.startsWith('handle:')) {
142
+ const h = t.slice(7).trim().replace(/^@/, '').toLowerCase();
143
+ if (h) handleSet.add(h);
144
+ } else if (statusSet && t.startsWith('status:')) {
145
+ const s = t.slice(7).trim();
146
+ if (s) statusSet.add(s);
147
+ }
148
+ }
149
+ }
150
+ };
151
+ try {
152
+ const db = getDb();
153
+ const since = new Date(Date.now() - days * 86400000).toISOString();
154
+ const handles = new Set();
155
+ const statusIds = new Set();
156
+ const blocked = new Set();
157
+
158
+ // Recent engagements (windowed), excluding permanent blocks.
159
+ let engSql = `SELECT tags FROM memories
160
+ WHERE trashed_at IS NULL
161
+ AND tags LIKE '%x-engaged%'
162
+ AND tags NOT LIKE '%action:blocked%'
163
+ AND created_at >= ?`;
164
+ const engParams = [since];
165
+ if (acctLike) { engSql += ` AND tags LIKE ?`; engParams.push(acctLike); }
166
+ engSql += ` ORDER BY created_at DESC LIMIT ?`;
167
+ engParams.push(limit);
168
+ collect(db.prepare(engSql).all(...engParams), handles, statusIds);
169
+
170
+ // Permanent blocklist (accounts that blocked us) — no time window.
171
+ let blkSql = `SELECT tags FROM memories
172
+ WHERE trashed_at IS NULL
173
+ AND tags LIKE '%action:blocked%'`;
174
+ const blkParams = [];
175
+ if (acctLike) { blkSql += ` AND tags LIKE ?`; blkParams.push(acctLike); }
176
+ blkSql += ` ORDER BY created_at DESC LIMIT ?`;
177
+ blkParams.push(limit);
178
+ collect(db.prepare(blkSql).all(...blkParams), blocked, null);
179
+
180
+ return { handles: [...handles], statusIds: [...statusIds], blocked: [...blocked] };
181
+ } catch (err) {
182
+ return { handles: [], statusIds: [], blocked: [], error: err.message };
183
+ }
184
+ }
185
+
186
+ export const X_ACTION_TYPES = ['reply', 'like', 'quote', 'follow', 'repost'];
187
+
188
+ /**
189
+ * Count the X actions already spent by an account since `sinceIso`, bucketed by type.
190
+ *
191
+ * Companion to getRecentXEngagements(): that one answers "who have we already hit",
192
+ * this one answers "how much have we already done today". The engagement templates
193
+ * tag every mutation with "x-engaged" + "acct:<account>" + "action:<type>", so the
194
+ * count is deterministic rather than the model's recollection of its own run. The
195
+ * launcher turns this into a per-run budget line, which is the only thing stopping
196
+ * six independent lanes from each spending a full day's quota.
197
+ *
198
+ * `action:blocked` rows are engagement *outcomes*, not actions we took, so they are
199
+ * excluded — matching the blocklist carve-out in getRecentXEngagements().
200
+ * Never throws (a budget lookup failure must not block a scheduled launch); on error
201
+ * every counter reads 0 so a broken ledger fails open rather than freezing all lanes.
202
+ *
203
+ * @param {{account?:string|null, sinceIso?:string, limit?:number}} opts
204
+ * @returns {{reply:number, like:number, quote:number, follow:number, repost:number, total:number, error?:string}}
205
+ */
206
+ export function getXActionBudget({ account = null, sinceIso, limit = 500 } = {}) {
207
+ const counts = Object.fromEntries(X_ACTION_TYPES.map(t => [t, 0]));
208
+ const empty = { ...counts, total: 0 };
209
+ const acct = account ? String(account).trim().replace(/^@/, '').toLowerCase() : null;
210
+ try {
211
+ const db = getDb();
212
+ const since = sinceIso || new Date(Date.now() - 86400000).toISOString();
213
+ let sql = `SELECT tags FROM memories
214
+ WHERE trashed_at IS NULL
215
+ AND tags LIKE '%x-engaged%'
216
+ AND tags NOT LIKE '%action:blocked%'
217
+ AND created_at >= ?`;
218
+ const params = [since];
219
+ if (acct) { sql += ` AND tags LIKE ?`; params.push(`%"acct:${acct}"%`); }
220
+ sql += ` ORDER BY created_at DESC LIMIT ?`;
221
+ params.push(limit);
222
+
223
+ let total = 0;
224
+ for (const row of db.prepare(sql).all(...params)) {
225
+ let tags;
226
+ try { tags = JSON.parse(row.tags || '[]'); } catch { continue; }
227
+ if (!Array.isArray(tags)) continue;
228
+ // One memory logs one action. Count the first recognised action tag only, so a
229
+ // ledger entry that also mentions a sibling action does not double-charge.
230
+ for (const t of tags) {
231
+ if (typeof t !== 'string' || !t.startsWith('action:')) continue;
232
+ const kind = t.slice(7).trim().toLowerCase();
233
+ if (!Object.hasOwn(counts, kind)) continue;
234
+ counts[kind]++;
235
+ total++;
236
+ break;
237
+ }
238
+ }
239
+ return { ...counts, total };
240
+ } catch (err) {
241
+ return { ...empty, error: err.message };
242
+ }
243
+ }
244
+
245
+ /**
246
+ * Per-day ceilings for each engagement ramp tier, shared by every X lane of an account.
247
+ * The tier is STATE (written by the daily metrics run after it checks the account is
248
+ * clean); the ceilings are CODE, so a model cannot talk itself into a wider budget by
249
+ * rewriting a memory. Tier 1 is the most conservative starting point.
250
+ */
251
+ export const X_ENGAGEMENT_TIERS = {
252
+ 1: { reply: 12, like: 30, quote: 0, follow: 6, repost: 2 },
253
+ 2: { reply: 24, like: 45, quote: 1, follow: 8, repost: 3 },
254
+ 3: { reply: 36, like: 60, quote: 2, follow: 12, repost: 4 },
255
+ };
256
+ export const X_DEFAULT_TIER = 1;
257
+
258
+ /**
259
+ * Read the current engagement ramp tier from the account's canonical
260
+ * `<program>-x-engagement-caps` memory (for example `acme-x-engagement-caps`; when
261
+ * several accounts keep one, the acct: tag picks the account).
262
+ * Falls back to the most conservative tier whenever the memory is missing,
263
+ * unparseable, or names a tier that does not exist — an unreadable ledger must narrow
264
+ * the budget, never widen it.
265
+ *
266
+ * @param {{account?:string|null}} opts
267
+ * @returns {{tier:number, caps:{reply:number,like:number,quote:number,follow:number,repost:number}, source:'memory'|'default', error?:string}}
268
+ */
269
+ export function getXEngagementTier({ account = null } = {}) {
270
+ const fallback = { tier: X_DEFAULT_TIER, caps: X_ENGAGEMENT_TIERS[X_DEFAULT_TIER], source: 'default' };
271
+ const acct = account ? String(account).trim().replace(/^@/, '').toLowerCase() : null;
272
+ try {
273
+ const db = getDb();
274
+ let sql = `SELECT content FROM memories
275
+ WHERE trashed_at IS NULL
276
+ AND tags LIKE '%-x-engagement-caps"%'`;
277
+ const params = [];
278
+ if (acct) { sql += ` AND (tags LIKE ? OR tags NOT LIKE '%"acct:%')`; params.push(`%"acct:${acct}"%`); }
279
+ sql += ` ORDER BY created_at DESC LIMIT 1`;
280
+ const row = db.prepare(sql).all(...params)[0];
281
+ if (!row?.content) return fallback;
282
+ const m = /\btier\s*[:=]\s*(\d+)/i.exec(row.content);
283
+ const tier = m ? Number(m[1]) : NaN;
284
+ if (!Object.hasOwn(X_ENGAGEMENT_TIERS, tier)) return fallback;
285
+ return { tier, caps: X_ENGAGEMENT_TIERS[tier], source: 'memory' };
286
+ } catch (err) {
287
+ return { ...fallback, error: err.message };
288
+ }
289
+ }
290
+
291
+ // ── Facebook shared action budget (same contract as the X budget above) ──
292
+
293
+ export const FB_ACTION_TYPES = ['page_post', 'group_post', 'comment', 'invite', 'join'];
294
+
295
+ /**
296
+ * Per-day ceilings for each Facebook ramp tier, shared by every Facebook lane on the
297
+ * box (every Facebook schedule group posts through the same Page, profile and
298
+ * browser). The tier is STATE (written by the metrics run after it checks the account
299
+ * is clean); the ceilings are CODE, so a model cannot talk itself into a wider budget
300
+ * by rewriting a memory. Tier 1 is the most conservative starting point; page_post is
301
+ * what replaced the old 20-hour Page cap.
302
+ */
303
+ export const FB_ENGAGEMENT_TIERS = {
304
+ 1: { page_post: 3, group_post: 12, comment: 8, invite: 20, join: 3 },
305
+ 2: { page_post: 3, group_post: 12, comment: 14, invite: 40, join: 5 },
306
+ 3: { page_post: 4, group_post: 16, comment: 20, invite: 60, join: 8 },
307
+ };
308
+ export const FB_DEFAULT_TIER = 1;
309
+
310
+ /**
311
+ * Count the Facebook actions already spent since `sinceIso`, bucketed by type.
312
+ *
313
+ * page_post / comment / invite / join come from memories tagged "fb-action" +
314
+ * "action:<type>" (one memory = one action, unless the row also carries "count:<n>",
315
+ * which charges n — the invite lane logs one memory per batch). group_post comes from
316
+ * the fb_post_log ledger (visible-post + pending-approval rows) because every group
317
+ * lane already ticks `fb_groups mark` after each submission, so that table is the
318
+ * authoritative count rather than the model's recollection of its own run.
319
+ *
320
+ * Never throws (a budget lookup failure must not block a scheduled launch); on error
321
+ * every counter reads 0 so a broken ledger fails open rather than freezing all lanes.
322
+ *
323
+ * @param {{account?:string|null, sinceIso?:string, limit?:number}} opts
324
+ * @returns {{page_post:number, group_post:number, comment:number, invite:number, join:number, total:number, error?:string}}
325
+ */
326
+ export function getFbActionBudget({ account = null, sinceIso, limit = 500 } = {}) {
327
+ const counts = Object.fromEntries(FB_ACTION_TYPES.map(t => [t, 0]));
328
+ const empty = { ...counts, total: 0 };
329
+ const acct = account ? String(account).trim().replace(/^@/, '').toLowerCase() : null;
330
+ try {
331
+ const db = getDb();
332
+ const since = sinceIso || new Date(Date.now() - 86400000).toISOString();
333
+ let sql = `SELECT tags FROM memories
334
+ WHERE trashed_at IS NULL
335
+ AND tags LIKE '%"fb-action"%'
336
+ AND tags NOT LIKE '%action:blocked%'
337
+ AND created_at >= ?`;
338
+ const params = [since];
339
+ if (acct) { sql += ` AND tags LIKE ?`; params.push(`%"acct:${acct}"%`); }
340
+ sql += ` ORDER BY created_at DESC LIMIT ?`;
341
+ params.push(limit);
342
+
343
+ let total = 0;
344
+ for (const row of db.prepare(sql).all(...params)) {
345
+ let tags;
346
+ try { tags = JSON.parse(row.tags || '[]'); } catch { continue; }
347
+ if (!Array.isArray(tags)) continue;
348
+ // One memory logs one action (first recognised action tag wins, so a row that
349
+ // also mentions a sibling action is not double-charged). A "count:<n>" tag
350
+ // charges n instead — used by invite batches.
351
+ let kind = null;
352
+ let n = 1;
353
+ for (const t of tags) {
354
+ if (typeof t !== 'string') continue;
355
+ if (!kind && t.startsWith('action:')) {
356
+ const k = t.slice(7).trim().toLowerCase();
357
+ if (Object.hasOwn(counts, k)) kind = k;
358
+ } else if (t.startsWith('count:')) {
359
+ const c = parseInt(t.slice(6), 10);
360
+ if (Number.isFinite(c) && c > 0) n = Math.min(c, 500);
361
+ }
362
+ }
363
+ if (!kind) continue;
364
+ counts[kind] += n;
365
+ total += n;
366
+ }
367
+
368
+ // group_post: the fb_groups posting ledger. Guarded — the table is owned by the
369
+ // MCP server's schema, so a brand-new database may not have it yet (reads 0).
370
+ try {
371
+ const row = db.prepare(
372
+ `SELECT COUNT(*) AS n FROM fb_post_log
373
+ WHERE posted_at >= ?
374
+ AND status IN ('visible-post', 'pending-approval', 'posted', 'pending')`,
375
+ ).get(since);
376
+ const n = Number(row?.n || 0);
377
+ counts.group_post += n;
378
+ total += n;
379
+ } catch { /* no ledger table yet */ }
380
+
381
+ return { ...counts, total };
382
+ } catch (err) {
383
+ return { ...empty, error: err.message };
384
+ }
385
+ }
386
+
387
+ /**
388
+ * Read the current Facebook ramp tier from the newest caps memory (the tag in the
389
+ * query below). Falls back to the most conservative tier whenever the memory is missing,
390
+ * unparseable, or names a tier that does not exist — an unreadable ledger must narrow
391
+ * the budget, never widen it.
392
+ *
393
+ * @returns {{tier:number, caps:{page_post:number, group_post:number, comment:number, invite:number, join:number}, source:'memory'|'default', error?:string}}
394
+ */
395
+ export function getFbEngagementTier() {
396
+ const fallback = { tier: FB_DEFAULT_TIER, caps: FB_ENGAGEMENT_TIERS[FB_DEFAULT_TIER], source: 'default' };
397
+ try {
398
+ const db = getDb();
399
+ const row = db.prepare(
400
+ `SELECT content FROM memories
401
+ WHERE trashed_at IS NULL
402
+ AND tags LIKE '%critpix-fb-engagement-caps%'
403
+ ORDER BY created_at DESC LIMIT 1`,
404
+ ).all()[0];
405
+ if (!row?.content) return fallback;
406
+ const m = /\btier\s*[:=]\s*(\d+)/i.exec(row.content);
407
+ const tier = m ? Number(m[1]) : NaN;
408
+ if (!Object.hasOwn(FB_ENGAGEMENT_TIERS, tier)) return fallback;
409
+ return { tier, caps: FB_ENGAGEMENT_TIERS[tier], source: 'memory' };
410
+ } catch (err) {
411
+ return { ...fallback, error: err.message };
412
+ }
413
+ }
414
+
415
+ // --- KV Config ---
416
+
417
+ const KV_DDL = 'CREATE TABLE IF NOT EXISTS kv_config (key TEXT PRIMARY KEY, value TEXT NOT NULL)';
418
+
419
+ export function getKvConfig(key) {
420
+ const d = getDb();
421
+ d.exec(KV_DDL);
422
+ const row = d.prepare('SELECT value FROM kv_config WHERE key = ?').get(key);
423
+ return row ? row.value : null;
424
+ }
425
+
426
+ export function setKvConfig(key, value) {
427
+ const d = getDb();
428
+ d.exec(KV_DDL);
429
+ d.prepare('INSERT OR REPLACE INTO kv_config (key, value) VALUES (?, ?)').run(key, String(value));
430
+ }
431
+
432
+ // --- Vector helpers ---
433
+
434
+ export function encodeVector(vector) {
435
+ return new Uint8Array(new Float32Array(vector).buffer);
436
+ }
437
+
438
+ export function decodeVector(blob) {
439
+ return Array.from(new Float32Array(blob.buffer, blob.byteOffset, blob.byteLength / 4));
440
+ }
441
+
442
+ export function cosineSimilarity(a, b) {
443
+ let dot = 0;
444
+ for (let i = 0; i < a.length; i++) dot += a[i] * b[i];
445
+ return dot;
446
+ }
447
+
448
+ // --- Memory queries ---
449
+
450
+ /**
451
+ * Search memories by vector similarity.
452
+ * Optionally filter by category/project/tags. Excludes trashed and system_metadata.
453
+ */
454
+ export function searchMemories(vector, limit = 10, { category, project, tags, minImportance, scoreThreshold = 0.3, includeTrash = false } = {}) {
455
+ const d = getDb();
456
+ const clauses = [];
457
+ const params = [];
458
+
459
+ if (category) {
460
+ clauses.push('category = ?');
461
+ params.push(category);
462
+ }
463
+ if (project) {
464
+ clauses.push('project = ?');
465
+ params.push(project);
466
+ }
467
+ if (tags && tags.length > 0) {
468
+ for (const tag of tags) {
469
+ clauses.push(`EXISTS (SELECT 1 FROM json_each(tags) WHERE json_each.value = ?)`);
470
+ params.push(tag);
471
+ }
472
+ }
473
+ if (minImportance) {
474
+ clauses.push('importance >= ?');
475
+ params.push(minImportance);
476
+ }
477
+
478
+ // Trash search is a rare admin path — the cache only holds live rows,
479
+ // so fall back to a direct scan when trash must be included.
480
+ if (includeTrash) {
481
+ const where = clauses.length > 0 ? 'WHERE ' + clauses.join(' AND ') : '';
482
+ const rows = d.prepare(`
483
+ SELECT id, vector, content, category, subcategory, project, tags, importance, source,
484
+ created_at, updated_at, accessed_at, access_count, related_files,
485
+ related_memory_ids, file_checksums, trashed_at, source_session_chunks
486
+ FROM memories ${where}
487
+ `).all(...params);
488
+
489
+ const scored = rows.map(row => {
490
+ const rowVec = decodeVector(row.vector);
491
+ const score = cosineSimilarity(vector, rowVec);
492
+ return { ...rowToPayload(row), id: row.id, score, vector: rowVec };
493
+ }).filter(r => r.score >= scoreThreshold);
494
+
495
+ scored.sort((a, b) => b.score - a.score);
496
+ return scored.slice(0, limit);
497
+ }
498
+
499
+ const must = [];
500
+ if (category) must.push({key:'category',match:{value:category}});
501
+ if (project) must.push({key:'project',match:{value:project}});
502
+ if (minImportance) must.push({key:'importance',range:{gte:minImportance}});
503
+ const should = (tags || []).map(tag=>({key:'tags',match:{value:tag}}));
504
+ return sharedSearch(vector,limit,{must,should},scoreThreshold).map(r=>({
505
+ id:r.id,score:r.score,...r.payload,vector:decodeVector(d.prepare('SELECT vector FROM memories WHERE id=?').get(r.id).vector),
506
+ }));
507
+ }
508
+
509
+ /**
510
+ * Get all memories (for graph view, links computation, etc.)
511
+ */
512
+ export function getAllMemories({ includeVectors = false, includeTrash = false } = {}) {
513
+ const d = getDb();
514
+ const vectorCol = includeVectors ? ', vector' : '';
515
+ const where = includeTrash ? '' : 'WHERE trashed_at IS NULL';
516
+
517
+ const rows = d.prepare(`
518
+ SELECT id, content, category, subcategory, project, tags, importance, source,
519
+ created_at, updated_at, accessed_at, access_count, related_files,
520
+ related_memory_ids, file_checksums, trashed_at, source_session_chunks
521
+ ${vectorCol}
522
+ FROM memories ${where}
523
+ ORDER BY created_at DESC
524
+ `).all();
525
+
526
+ return rows.map(row => {
527
+ const payload = rowToPayload(row);
528
+ const result = { id: row.id, ...payload };
529
+ if (includeVectors && row.vector) {
530
+ result.vector = decodeVector(row.vector);
531
+ }
532
+ return result;
533
+ });
534
+ }
535
+
536
+ /**
537
+ * Get all memories with vectors for link computation.
538
+ */
539
+ export function getAllMemoriesWithVectors() {
540
+ const d = getDb();
541
+ const rows = d.prepare(`
542
+ SELECT id, vector, content, category, subcategory, project, tags, importance, source,
543
+ created_at, updated_at, accessed_at, access_count, related_files,
544
+ related_memory_ids, file_checksums, trashed_at, source_session_chunks
545
+ FROM memories WHERE trashed_at IS NULL
546
+ `).all();
547
+
548
+ return rows.map(row => ({
549
+ id: row.id,
550
+ vector: decodeVector(row.vector),
551
+ ...rowToPayload(row),
552
+ }));
553
+ }
554
+
555
+ export function getMemoryById(id) {
556
+ const d = getDb();
557
+ const row = d.prepare(`
558
+ SELECT id, content, category, subcategory, project, tags, importance, source,
559
+ created_at, updated_at, accessed_at, access_count, related_files,
560
+ related_memory_ids, file_checksums, trashed_at, source_session_chunks
561
+ FROM memories WHERE id = ?
562
+ `).get(id);
563
+
564
+ if (!row) return null;
565
+ return { id: row.id, ...rowToPayload(row) };
566
+ }
567
+
568
+ export function getMemoryWithVector(id) {
569
+ const d = getDb();
570
+ const row = d.prepare(`
571
+ SELECT id, vector, content, category, subcategory, project, tags, importance, source,
572
+ created_at, updated_at, accessed_at, access_count, related_files,
573
+ related_memory_ids, file_checksums, trashed_at, source_session_chunks
574
+ FROM memories WHERE id = ?
575
+ `).get(id);
576
+
577
+ if (!row) return null;
578
+ return { id: row.id, vector: decodeVector(row.vector), ...rowToPayload(row) };
579
+ }
580
+
581
+ export function updateMemoryPayload(id, updates) {
582
+ return sharedUpdate(id, updates);
583
+ }
584
+
585
+ export function softDeleteMemory(id) {
586
+ const d = getDb();
587
+ d.prepare('UPDATE memories SET trashed_at = ? WHERE id = ?').run(new Date().toISOString(), id);
588
+ memoryVectors.remove(id);
589
+ }
590
+
591
+ export function hardDeleteMemory(id) {
592
+ return sharedDelete(id);
593
+ }
594
+
595
+ export function restoreMemory(id) {
596
+ const d = getDb();
597
+ d.prepare('UPDATE memories SET trashed_at = NULL WHERE id = ?').run(id);
598
+ memoryVectors.setFromDb(id);
599
+ }
600
+
601
+ export function getTrashedMemories() {
602
+ const d = getDb();
603
+ const rows = d.prepare(`
604
+ SELECT id, content, category, subcategory, project, tags, importance, source,
605
+ created_at, updated_at, accessed_at, access_count, related_files,
606
+ related_memory_ids, file_checksums, trashed_at, source_session_chunks
607
+ FROM memories WHERE trashed_at IS NOT NULL
608
+ ORDER BY trashed_at DESC
609
+ `).all();
610
+
611
+ return rows.map(row => ({ id: row.id, ...rowToPayload(row) }));
612
+ }
613
+
614
+ export function purgeTrash() {
615
+ const d = getDb();
616
+ const rows = d.prepare('SELECT id FROM memories WHERE trashed_at IS NOT NULL').all();
617
+ d.exec('BEGIN IMMEDIATE');
618
+ try { for(const row of rows)sharedDelete(row.id);d.exec('COMMIT'); } catch(error){d.exec('ROLLBACK');memoryVectors.invalidate();throw error;}
619
+ return rows.map(r => r.id);
620
+ }
621
+
622
+ export function countMemories(filter = {}) {
623
+ const d = getDb();
624
+ const clauses = ['trashed_at IS NULL'];
625
+ const params = [];
626
+
627
+ if (filter.category) {
628
+ clauses.push('category = ?');
629
+ params.push(filter.category);
630
+ }
631
+ if (filter.project) {
632
+ clauses.push('project = ?');
633
+ params.push(filter.project);
634
+ }
635
+
636
+ const result = d.prepare(`SELECT COUNT(*) as cnt FROM memories WHERE ${clauses.join(' AND ')}`).get(...params);
637
+ return result.cnt;
638
+ }
639
+
640
+ export function getMemoryStats() {
641
+ const d = getDb();
642
+
643
+ const total = d.prepare('SELECT COUNT(*) as cnt FROM memories WHERE trashed_at IS NULL').get().cnt;
644
+ const trashedCount = d.prepare('SELECT COUNT(*) as cnt FROM memories WHERE trashed_at IS NOT NULL').get().cnt;
645
+
646
+ const catRows = d.prepare('SELECT category, COUNT(*) as cnt FROM memories WHERE trashed_at IS NULL GROUP BY category').all();
647
+ const by_category = {};
648
+ for (const row of catRows) by_category[row.category] = row.cnt;
649
+
650
+ const projRows = d.prepare('SELECT project, COUNT(*) as cnt FROM memories WHERE trashed_at IS NULL GROUP BY project').all();
651
+ const by_project = {};
652
+ for (const row of projRows) by_project[row.project || 'global'] = row.cnt;
653
+
654
+ const dateRow = d.prepare('SELECT MIN(created_at) as oldest, MAX(created_at) as newest FROM memories WHERE trashed_at IS NULL').get();
655
+
656
+ return {
657
+ total,
658
+ trashedCount,
659
+ by_category,
660
+ by_project,
661
+ oldest: dateRow.oldest,
662
+ newest: dateRow.newest,
663
+ };
664
+ }
665
+
666
+ /**
667
+ * Get memories by category for export.
668
+ */
669
+ export function getMemoriesByCategory(category) {
670
+ const d = getDb();
671
+ const rows = d.prepare(`
672
+ SELECT id, content, category, subcategory, project, tags, importance, source,
673
+ created_at, updated_at, accessed_at, access_count, related_files,
674
+ related_memory_ids, file_checksums, trashed_at, source_session_chunks
675
+ FROM memories WHERE category = ? AND trashed_at IS NULL
676
+ ORDER BY created_at DESC
677
+ `).all(category);
678
+
679
+ return rows.map(row => ({ id: row.id, ...rowToPayload(row) }));
680
+ }
681
+
682
+ /**
683
+ * Batch update category for memories.
684
+ */
685
+ export function updateMemoriesCategory(ids, newCategory) {
686
+ const d = getDb();
687
+ d.exec('BEGIN');
688
+ try {
689
+ const stmt = d.prepare('UPDATE memories SET category = ? WHERE id = ?');
690
+ for (const id of ids) {
691
+ stmt.run(newCategory, id);
692
+ }
693
+ d.exec('COMMIT');
694
+ } catch (err) {
695
+ d.exec('ROLLBACK');
696
+ throw err;
697
+ }
698
+ }
699
+
700
+ // --- Categories ---
701
+
702
+ export function getCategories() {
703
+ const d = getDb();
704
+ return d.prepare('SELECT name, description, created_at, parent, color, is_parent FROM categories ORDER BY name').all();
705
+ }
706
+
707
+ export function saveCategories(categories) {
708
+ const d = getDb();
709
+ d.exec('BEGIN');
710
+ try {
711
+ const existing = new Set(d.prepare('SELECT name FROM categories').all().map(r => r.name));
712
+ const incoming = new Set(categories.map(c => c.name));
713
+
714
+ for (const name of existing) {
715
+ if (!incoming.has(name)) {
716
+ d.prepare('DELETE FROM categories WHERE name = ?').run(name);
717
+ }
718
+ }
719
+
720
+ const stmt = d.prepare('INSERT OR REPLACE INTO categories (name, description, created_at, parent, color, is_parent) VALUES (?, ?, ?, ?, ?, ?)');
721
+ for (const cat of categories) {
722
+ stmt.run(cat.name, cat.description, cat.created_at, cat.parent || null, cat.color || null, cat.is_parent ? 1 : 0);
723
+ }
724
+ d.exec('COMMIT');
725
+ } catch (err) {
726
+ d.exec('ROLLBACK');
727
+ throw err;
728
+ }
729
+ }
730
+
731
+ // --- Session Chunks ---
732
+
733
+ export function countSessionChunks() {
734
+ const d = getDb();
735
+ return d.prepare('SELECT COUNT(*) as cnt FROM session_chunks').get().cnt;
736
+ }
737
+
738
+ export function searchSessionChunks(vector, limit = 10, { project, scoreThreshold = 0.3 } = {}) {
739
+ return sharedSessionSearch(vector,limit,project ? {must:[{key:'project',match:{value:project}}]} : undefined,scoreThreshold);
740
+ }
741
+
742
+ // --- Row conversion helpers ---
743
+
744
+ function parseJson(val, fallback) {
745
+ if (val == null || val === '') return fallback;
746
+ if (typeof val === 'string') {
747
+ try { return JSON.parse(val); } catch { return fallback; }
748
+ }
749
+ return val;
750
+ }
751
+
752
+ function rowToPayload(row) {
753
+ return {
754
+ content: row.content,
755
+ category: row.category,
756
+ subcategory: row.subcategory || undefined,
757
+ project: row.project,
758
+ tags: parseJson(row.tags, []),
759
+ importance: row.importance ?? 5,
760
+ source: row.source || 'self-discovered',
761
+ created_at: row.created_at,
762
+ updated_at: row.updated_at,
763
+ accessed_at: row.accessed_at,
764
+ access_count: row.access_count ?? 0,
765
+ related_files: parseJson(row.related_files, undefined),
766
+ related_memory_ids: parseJson(row.related_memory_ids, undefined),
767
+ file_checksums: parseJson(row.file_checksums, undefined),
768
+ trashed_at: row.trashed_at || null,
769
+ source_session_chunks: parseJson(row.source_session_chunks, undefined),
770
+ };
771
+ }
772
+
773
+ // --- Session cache + FTS helpers ---
774
+
775
+ export function upsertSessionCache(entry) {
776
+ const d = getDb();
777
+ d.prepare(`INSERT OR REPLACE INTO session_cache
778
+ (session_id, provider, project, project_path, git_branch, first_prompt, message_count,
779
+ created, modified, file_path, file_size, file_mtime, body_size, deleted, account_id)
780
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(
781
+ entry.session_id, entry.provider, entry.project || null, entry.project_path || null,
782
+ entry.git_branch || null, entry.first_prompt || null, entry.message_count || 0,
783
+ entry.created || null, entry.modified || null, entry.file_path || null,
784
+ entry.file_size || null, entry.file_mtime || null, entry.body_size || 0,
785
+ entry.deleted ? 1 : 0, entry.account_id || null,
786
+ );
787
+ }
788
+
789
+ export function upsertSessionFts(entry) {
790
+ const d = getDb();
791
+ d.prepare('DELETE FROM session_fts WHERE session_id = ? AND provider = ?')
792
+ .run(entry.session_id, entry.provider);
793
+ d.prepare(`INSERT INTO session_fts
794
+ (session_id, provider, project, first_prompt, body)
795
+ VALUES (?, ?, ?, ?, ?)`).run(
796
+ entry.session_id, entry.provider, entry.project || null,
797
+ entry.first_prompt || '', entry.body || '',
798
+ );
799
+ }
800
+
801
+ export function getSessionCacheEntry(sessionId, provider) {
802
+ const d = getDb();
803
+ return d.prepare('SELECT * FROM session_cache WHERE session_id = ? AND provider = ?')
804
+ .get(sessionId, provider) || null;
805
+ }
806
+
807
+ export function getSessionCacheFileMeta(filePath, provider) {
808
+ const d = getDb();
809
+ return d.prepare('SELECT file_size, file_mtime FROM session_cache WHERE file_path = ? AND provider = ?')
810
+ .get(filePath, provider) || null;
811
+ }
812
+
813
+ export function markSessionDeleted(sessionId, provider, deleted = true) {
814
+ const d = getDb();
815
+ d.prepare('UPDATE session_cache SET deleted = ? WHERE session_id = ? AND provider = ?')
816
+ .run(deleted ? 1 : 0, sessionId, provider);
817
+ }
818
+
819
+ export function listSessionCache(provider, { projectPath, limit = 100, offset = 0 } = {}) {
820
+ const d = getDb();
821
+ const clauses = ['provider = ?'];
822
+ const params = [provider];
823
+ if (projectPath) {
824
+ clauses.push('project_path = ?');
825
+ params.push(projectPath);
826
+ }
827
+ const sql = `SELECT * FROM session_cache WHERE ${clauses.join(' AND ')}
828
+ ORDER BY modified DESC LIMIT ? OFFSET ?`;
829
+ params.push(limit, offset);
830
+ return d.prepare(sql).all(...params);
831
+ }
832
+
833
+ /** Remove only a provider's derived Resume/search cache. Source histories live
834
+ * outside memory.db and are intentionally unaffected by this helper. */
835
+ export function clearSessionCacheProvider(provider) {
836
+ const normalized = String(provider || '').trim();
837
+ if (!normalized) throw new Error('Session cache provider is required');
838
+ const d = getDb();
839
+ const cached = Number(d.prepare('SELECT COUNT(*) AS count FROM session_cache WHERE provider = ?')
840
+ .get(normalized)?.count || 0);
841
+ const fts = Number(d.prepare('SELECT COUNT(*) AS count FROM session_fts WHERE provider = ?')
842
+ .get(normalized)?.count || 0);
843
+ d.exec('BEGIN IMMEDIATE');
844
+ try {
845
+ d.prepare('DELETE FROM session_fts WHERE provider = ?').run(normalized);
846
+ d.prepare('DELETE FROM session_cache WHERE provider = ?').run(normalized);
847
+ d.exec('COMMIT');
848
+ } catch (error) {
849
+ try { d.exec('ROLLBACK'); } catch {}
850
+ throw error;
851
+ }
852
+ return { cached, fts };
853
+ }
854
+
855
+ /** Escape a user-provided query for safe FTS5 MATCH.
856
+ * Strips control chars, wraps each token in quotes, joins with AND. */
857
+ export function buildFtsQuery(raw) {
858
+ if (!raw) return '';
859
+ const cleaned = String(raw)
860
+ .replace(/["'()]/g, ' ')
861
+ .replace(/[\r\n\t]+/g, ' ')
862
+ .trim();
863
+ if (!cleaned) return '';
864
+ const tokens = cleaned.split(/\s+/).filter(t => t.length >= 2);
865
+ if (tokens.length === 0) return '';
866
+ return tokens.map(t => `"${t}"*`).join(' AND ');
867
+ }
868
+
869
+ /** Run FTS5 search over session_fts. Returns array of { session_id, provider, rank, snippet }. */
870
+ export function searchSessionFts(query, { provider, project, limit = 50 } = {}) {
871
+ const d = getDb();
872
+ const matchQuery = buildFtsQuery(query);
873
+ if (!matchQuery) return [];
874
+
875
+ const clauses = ['session_fts MATCH ?'];
876
+ const params = [matchQuery];
877
+
878
+ if (provider) {
879
+ clauses.push('provider = ?');
880
+ params.push(provider);
881
+ }
882
+ if (project) {
883
+ clauses.push('project = ?');
884
+ params.push(project);
885
+ }
886
+
887
+ const sql = `SELECT session_id, provider, project,
888
+ snippet(session_fts, 4, '<mark>', '</mark>', '…', 16) AS snippet,
889
+ bm25(session_fts) AS rank
890
+ FROM session_fts
891
+ WHERE ${clauses.join(' AND ')}
892
+ ORDER BY rank
893
+ LIMIT ?`;
894
+ params.push(limit);
895
+ try {
896
+ return d.prepare(sql).all(...params);
897
+ } catch {
898
+ return [];
899
+ }
900
+ }
901
+
902
+ function rowToSessionPayload(row) {
903
+ return {
904
+ content: row.content,
905
+ summary: row.summary || '',
906
+ session_id: row.session_id || '',
907
+ project: row.project || '',
908
+ git_branch: row.git_branch || null,
909
+ cwd: row.cwd || null,
910
+ chunk_index: row.chunk_index ?? 0,
911
+ start_timestamp: row.start_timestamp || '',
912
+ end_timestamp: row.end_timestamp || '',
913
+ tools_used: parseJson(row.tools_used, []),
914
+ files_modified: parseJson(row.files_modified, []),
915
+ files_read: parseJson(row.files_read, []),
916
+ user_messages: parseJson(row.user_messages, []),
917
+ turn_count: row.turn_count ?? 0,
918
+ related_memory_ids: parseJson(row.related_memory_ids, []),
919
+ dedup_memory_id: row.dedup_memory_id || null,
920
+ indexed_at: row.indexed_at || '',
921
+ };
922
+ }