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,790 @@
1
+ /**
2
+ * Runtime knobs and the judgment log for the TypeSafe client.
3
+ *
4
+ * Knobs are data, not constants. The Neural Interface mounts mcp-server/dist
5
+ * in-process and every stdio MCP server is its own process, so a setting in
6
+ * code needs a rebuild plus a restart of each of them before it changes. One
7
+ * JSON row in kv_config, re-read at most every few seconds, is what lets the
8
+ * Judgments tab flip a surface off and have every process obey it before the
9
+ * next call goes out.
10
+ *
11
+ * This module imports only sqlite.js and browser-assist-gate.js, a leaf of node
12
+ * builtins. Nothing beneath either imports the TypeSafe client, so typesafe.ts
13
+ * can depend on it without a cycle. Every function here swallows storage
14
+ * errors: a broken kv row or a closed database must degrade to the defaults,
15
+ * never break `judge()`.
16
+ */
17
+
18
+ import { getDb } from './sqlite.js';
19
+ import { autoHealGate, readTargetBench, DEFAULT_BROWSER_ASSIST, BROWSER_TARGET_DEFAULTS, type BrowserAssistConfig } from './browser-assist-gate.js';
20
+ export type { BrowserAssistConfig, BrowserTargetBench } from './browser-assist-gate.js';
21
+ // desktop-assist-gate.ts is a leaf as well (node builtins, the browser gate and the pure risk modules): no cycle back into this file.
22
+ import { desktopPressGate, readDesktopTargetBench, DEFAULT_DESKTOP_ASSIST, DESKTOP_TARGET_DEFAULTS, type DesktopAssistConfig } from './desktop-assist-gate.js';
23
+ export type { DesktopAssistConfig, DesktopTargetBench } from './desktop-assist-gate.js';
24
+
25
+ // --- Surfaces ---
26
+
27
+ export const SURFACES = [
28
+ 'relations', 'importance-kind', 'historical-query', 'rerank', 'prompt-urgency', 'agent-message',
29
+ 'duplicate-gate', 'secret-gate', 'category-check', 'stale-check', 'brief-rank', 'turn-worth',
30
+ 'loop-goal', 'trash-triage',
31
+ 'browser-page-state', 'browser-target', 'browser-social',
32
+ 'task-boundary', 'session-lookup', 'user-learning', 'claim-check',
33
+ 'edit-stale', 'supersession', 'compact-digest', 'plan-conflict',
34
+ 'worker-outcome', 'worker-claim', 'desktop-target',
35
+ ] as const;
36
+ export type SurfaceName = typeof SURFACES[number];
37
+
38
+ /**
39
+ * Who asked. `live` is the historical catch-all: rows written before origins
40
+ * were split keep it, and the `live` log filter means every real-time origin
41
+ * (everything except backfill and bench) so saved filters keep working.
42
+ */
43
+ export const ORIGINS = ['live', 'hook', 'tool', 'maintenance', 'loop', 'ui', 'script', 'assistant', 'backfill', 'bench'] as const;
44
+ export type JudgeOrigin = typeof ORIGINS[number];
45
+
46
+ export interface SurfaceSettings {
47
+ enabled: boolean; timeoutMs: number; minConfidence?: number;
48
+ /** Noul P(yes) floor on surfaces that ask both kinds. Existing surfaces keep `minConfidence` as they always used it. */
49
+ minProbability?: number;
50
+ /** Relevance floor on the 0–4 rubric: a judged candidate below it is not injected (rerank / brief-rank in the hooks). */
51
+ minScore?: number;
52
+ /** Upper bound on items judged per event (edit-stale memories, digest messages, plan decisions). */
53
+ maxItems?: number;
54
+ /** Quiet period before a burst of events is judged once (edit-stale). */
55
+ debounceMs?: number;
56
+ /** turn-worth only: the stricter bar for a turn whose only work ran through Bash. */
57
+ bashOnlyMinProbability?: number;
58
+ }
59
+ export interface SurfaceMeta {
60
+ label: string; description: string; fallback: string;
61
+ /** Asked inside that surface's request: shares its round trip and timeout. */
62
+ ridesWith?: SurfaceName;
63
+ /** Total budget of the hook that waits on this surface; the tab warns when the timeout leaves no room. */
64
+ budgetMs?: number;
65
+ }
66
+
67
+ /** What the Judgments tab shows beside each toggle. Fallbacks are the exact heuristics that run when a surface is off. */
68
+ export const SURFACE_META: Record<SurfaceName, SurfaceMeta> = {
69
+ 'relations': { label: 'Relations', description: 'How each indexed memory relates to its nearest neighbours: duplicate, conflict, related or unrelated.', fallback: '0.92 cosine cutoff plus the negation-word regex' },
70
+ 'importance-kind': { label: 'Importance & kind', description: 'Long-term importance band and record kind at index time. Importance is recorded, and applied only when the bench-gated toggle is on.', fallback: 'kind from the category-name regex; importance stays the writer\'s' },
71
+ 'historical-query': { label: 'Historical query', description: 'Whether a recall asks about the past, so superseded memories are included. Asked only when a superseded memory is among the candidates.', fallback: '/history|previous|old|antes|anterior/i' },
72
+ 'rerank': { label: 'Rerank', description: 'Reorders a recall shortlist by judged relevance: recall with rerank:true (the greeting boot directive asks for it only when the greeting is on), the prompt auto-recall hook and the Assistant\'s per-turn recall, which also drop memories below the relevance floor.', fallback: 'fusion order; cosine ≥ 0.4 decides what is injected', budgetMs: 3000 },
73
+ 'prompt-urgency': { label: 'Prompt urgency', description: 'How much searching memory would change the reply to a new prompt (UserPromptSubmit hook and the Assistant\'s per-turn recall, which skips or trims the injected memories by it).', fallback: 'Tier 1/2/3 regex ladder plus the non-English check (the Assistant: its skip regex)', budgetMs: 3000 },
74
+ 'agent-message': { label: 'Agent message', description: 'Whether the final assistant message is blocked on a human or waiting on the user (Stop hook).', fallback: 'substring phrase lists', budgetMs: 3000 },
75
+ 'duplicate-gate': { label: 'Duplicate gate', description: 'At remember, refuses a memory that restates a fact already stored and points at it.', fallback: 'no gate; maintenance relates duplicates later' },
76
+ 'secret-gate': { label: 'Secret gate', description: 'At remember and reflect, confirms credential-looking spans and redacts them before anything is embedded.', fallback: 'redact only high-precision patterns (sk-, ghp_, xox, AKIA, private keys, JWTs)' },
77
+ 'category-check': { label: 'Category check', description: 'At remember, which category fits the content; disagreement with the caller\'s pick is recorded and reported, never applied.', fallback: 'none; stored as requested' },
78
+ 'stale-check': { label: 'Stale check', description: 'In sync, whether a memory still describes a file whose checksum changed.', fallback: 'checksum diff only' },
79
+ 'brief-rank': { label: 'Brief rank', description: 'Ranks the memories injected into a subagent (PreToolUse Task and SubagentStart hooks) by judged relevance to its task, dropping those below the relevance floor.', fallback: 'fusion order', budgetMs: 3000 },
80
+ 'turn-worth': { label: 'Turn worth', description: 'At Stop, whether the turn produced work worth remembering before the unstored-edits nag fires. A turn whose only work ran through Bash needs the stricter bash-only bar.', fallback: 'edit-count threshold; Bash-only turns carry no obligation', budgetMs: 3000 },
81
+ 'loop-goal': { label: 'Loop goal', description: 'Ends a loop early when its stated task is judged complete, from the iteration\'s own output (native loops) or its journal. Never asked after the final iteration.', fallback: 'iteration budget', budgetMs: 3000 },
82
+ 'trash-triage': { label: 'Trash triage', description: 'Ranks forget candidates by how little they would be missed.', fallback: 'importance ascending, age descending' },
83
+ 'browser-page-state': { label: 'Browser page state', description: 'After browser_navigate and on empty extractor results: whether the page is usable, loading, behind a sign-in, verification or consent wall, errored or genuinely empty, and whether a stated intent is already satisfied. Advisory.', fallback: 'the navigation response and deterministic DOM signals, unannotated' },
84
+ 'browser-target': { label: 'Browser target', description: 'Ranks visible controls against a snapshot intent or a failed selector\'s target hint. Advisory; one safe auto-heal click only behind the benchmark gate.', fallback: 'exact ref/selector resolution, exact-name textHint healing, fuzzy hint order' },
85
+ 'browser-social': { label: 'Browser social', description: 'Reads an ambiguous Facebook or X composer state and names the likely submit or trigger control. Advisory; never clicks, types or publishes.', fallback: 'locale lists, structural heuristics and the publishing probes' },
86
+ 'task-boundary': { label: 'Task boundary', description: 'On a new prompt while edits are not yet stored in memory: does it start a different task, or continue or correct the work in progress? Decides the "store it before moving on" nudge.', fallback: 'nudge only when a Stop came after the edits; an interrupted turn means a correction', ridesWith: 'prompt-urgency', budgetMs: 3000 },
87
+ 'session-lookup': { label: 'Session lookup', description: 'Whether a prompt asks about an earlier session (what was decided, where work was left), which starts the conversation-recall workflow.', fallback: 'English-only phrase regexes', ridesWith: 'prompt-urgency', budgetMs: 3000 },
88
+ 'user-learning': { label: 'User learning', description: 'Whether a prompt shows a lasting preference about how the developer wants work done, which asks for a communication-style note.', fallback: 'every Nth message', ridesWith: 'prompt-urgency', budgetMs: 3000 },
89
+ 'claim-check': { label: 'Claim check', description: 'At Stop, whether the final message claims success (tests pass, fixed, verified) that the turn\'s own command output does not show. Blocks the stop at most once per prompt.', fallback: 'no check', ridesWith: 'agent-message', budgetMs: 3000 },
90
+ 'edit-stale': { label: 'Edit stale check', description: 'After an Edit or Write, whether memories that list the edited file still describe it. Runs off the request path after a quiet period; verdicts reach the next prompt or Stop and show as a recall flag.', fallback: 'checksum diff only; judged only by an explicit sync' },
91
+ 'supersession': { label: 'Supersession', description: 'At index time, whether a new memory is a newer statement of the same thing as an older one in its project and category. Writes a reversible supersedes relation, which hides the older memory from current-state recall.', fallback: 'supersedes only by hand (reflect supersedes)', ridesWith: 'relations' },
92
+ 'compact-digest': { label: 'Compaction digest', description: 'Before compaction, which messages across the whole session carry a goal, decision, finding or open issue, so the compaction memory keeps them.', fallback: 'the first 15 prompts and 5 replies', budgetMs: 10000 },
93
+ 'plan-conflict': { label: 'Plan conflict', description: 'When a plan is approved, whether it goes against a decision or preference already stored for the project. An advisory note; never blocks.', fallback: 'no check', budgetMs: 15000 },
94
+ 'worker-outcome': { label: 'Worker outcome', description: 'Assistant workers: reads done / blocked / needs input from a final message that has no ## Result block (instead of spending a retry turn), and what kept a failed or blocked run from finishing (capability, access, needs the user, transient), which decides whether escalation is offered.', fallback: 'one result-retry worker turn; every failed, blocked or result-less run offers a one-tier escalation' },
95
+ 'worker-claim': { label: 'Worker claim', description: 'Assistant workers: whether a run reported done while claiming success (tests pass, fixed, verified) that its own command output does not show. Flags the run so the Assistant verifies before reporting; asked only when the turn exposed commands or tool results.', fallback: 'no check', ridesWith: 'worker-outcome' },
96
+ 'desktop-target': { label: 'Desktop target', description: 'Computer use: ranks the visible controls of the front window against a computer_ax intent. Advisory; one low-risk press by intent only behind the desktop benchmark gate.', fallback: 'the full accessibility tree, or a word-overlap ranking when an intent is given' },
97
+ };
98
+
99
+ const SURFACE_DEFAULTS: Record<SurfaceName, SurfaceSettings> = {
100
+ 'relations': { enabled: true, timeoutMs: 8000, minConfidence: 0.7 },
101
+ 'importance-kind': { enabled: true, timeoutMs: 8000, minConfidence: 0.6 },
102
+ 'historical-query': { enabled: true, timeoutMs: 1200 },
103
+ // 1.5 sits between Tangential (1) and Background (2): an injected memory has to help.
104
+ 'rerank': { enabled: true, timeoutMs: 1500, minScore: 1.5 },
105
+ 'prompt-urgency': { enabled: true, timeoutMs: 1200 },
106
+ 'agent-message': { enabled: true, timeoutMs: 1200 },
107
+ 'duplicate-gate': { enabled: true, timeoutMs: 1500, minConfidence: 0.85 },
108
+ 'secret-gate': { enabled: true, timeoutMs: 1500, minConfidence: 0.7 },
109
+ 'category-check': { enabled: true, timeoutMs: 2000, minConfidence: 0.6 },
110
+ 'stale-check': { enabled: true, timeoutMs: 3000, minConfidence: 0.6 },
111
+ 'brief-rank': { enabled: true, timeoutMs: 1500, minScore: 1.5 },
112
+ 'turn-worth': { enabled: true, timeoutMs: 1200, minConfidence: 0.35, bashOnlyMinProbability: 0.8 },
113
+ 'loop-goal': { enabled: true, timeoutMs: 3000, minConfidence: 0.8 },
114
+ 'trash-triage': { enabled: true, timeoutMs: 8000 },
115
+ 'browser-page-state': { enabled: true, timeoutMs: 1000, minConfidence: 0.65, minProbability: 0.8 },
116
+ 'browser-target': { ...BROWSER_TARGET_DEFAULTS },
117
+ 'browser-social': { enabled: true, timeoutMs: 1200, minConfidence: 0.75 },
118
+ // Riders share their lead's request; their timeout is the lead's.
119
+ 'task-boundary': { enabled: true, timeoutMs: 1200, minProbability: 0.6 },
120
+ 'session-lookup': { enabled: true, timeoutMs: 1200, minProbability: 0.7 },
121
+ 'user-learning': { enabled: true, timeoutMs: 1200, minProbability: 0.7 },
122
+ // Can block a Stop, so the bar is high.
123
+ 'claim-check': { enabled: true, timeoutMs: 1200, minProbability: 0.9 },
124
+ // P(still accurate) below minProbability is reported as stale.
125
+ 'edit-stale': { enabled: true, timeoutMs: 3000, minProbability: 0.4, maxItems: 3, debounceMs: 15000 },
126
+ // It hides the older memory from current-state recall, so the bar is very high.
127
+ 'supersession': { enabled: true, timeoutMs: 8000, minProbability: 0.9 },
128
+ 'compact-digest': { enabled: true, timeoutMs: 5000, minConfidence: 0.5, maxItems: 40 },
129
+ 'plan-conflict': { enabled: true, timeoutMs: 4000, minProbability: 0.75, maxItems: 6 },
130
+ // Off the brain's critical path: it runs where a worker turn or a result-retry turn would.
131
+ 'worker-outcome': { enabled: true, timeoutMs: 2500, minConfidence: 0.7 },
132
+ // Rider of worker-outcome. Flags a run for verification, so the bar is the claim-check bar.
133
+ 'worker-claim': { enabled: true, timeoutMs: 2500, minProbability: 0.9 },
134
+ 'desktop-target': { ...DESKTOP_TARGET_DEFAULTS },
135
+ };
136
+
137
+ // --- Config shape ---
138
+
139
+ /** docs.typesafe.ai/models, 2026-09-19: aliases plus the versioned id they resolve to. */
140
+ export const KNOWN_MODELS = ['jev-latest', 'jev-preview', 'jev-1.13.0'];
141
+ export const DEFAULT_MODEL = 'jev-latest';
142
+ export const DEFAULT_BASE_URL = 'https://api.typesafe.ai';
143
+ /** List price for jev-1.13.0, USD per million input tokens; output tokens are free. */
144
+ export const DEFAULT_COST_PER_MILLION_INPUT = 0.042;
145
+ export const DEFAULT_COST_PER_MILLION_OUTPUT = 0;
146
+
147
+ export interface BackfillEstimate {
148
+ rows: number;
149
+ meanChars: number;
150
+ sample: { size: number; withCandidates: number; meanCandidates: number; meanCandidateChars: number };
151
+ calls: { importanceKind: number; relations: number };
152
+ tokens: { input: number; output: number };
153
+ costUsd: number | null;
154
+ rates: { input: number; output: number };
155
+ /** Where the per-request token figures came from: measured backfill rows in the log, the bench, or the size formula. */
156
+ basis: 'formula' | 'bench' | 'log';
157
+ wallClockMs: number;
158
+ concurrency: number;
159
+ at: string;
160
+ }
161
+
162
+ export interface BackfillReport {
163
+ startedAt: string | null; finishedAt: string; wallClockMs: number;
164
+ total: number; judged: number; skipped: number; failures: number;
165
+ relationsCreated: { similar: number; possible_conflict: number; duplicate_of: number };
166
+ disagreements: { kind: number; kindRate: number; importance: number; importanceRate: number };
167
+ tokensIn: number; tokensOut: number; costUsd: number | null; avgLatencyMs: number;
168
+ coverageAfter: { judged: number; total: number };
169
+ }
170
+
171
+ export interface BackfillState {
172
+ status: 'idle' | 'running' | 'paused' | 'cancelled' | 'done';
173
+ startedAt: string | null; pausedAt: string | null; finishedAt: string | null;
174
+ pausedReason: 'user' | 'failures' | null;
175
+ limit: number | null; project: string | null; total: number;
176
+ judged: number; skipped: number; failures: number; consecutiveFailures: number;
177
+ relationsCreated: { similar: number; possible_conflict: number; duplicate_of: number };
178
+ disagreements: { kind: number; importance: number };
179
+ tokensIn: number; tokensOut: number; latencyMsTotal: number;
180
+ lastError: string | null; lastErrorAt: string | null;
181
+ estimate: BackfillEstimate | null; report: BackfillReport | null;
182
+ }
183
+
184
+ export interface BenchSummary { at: string; n: number; agreement: number | null; file: string | null; avgInputTokensPerItem?: number }
185
+
186
+ export interface TypeSafeConfig {
187
+ version: 1;
188
+ /** UI master switch. The env kill switch SYNABUN_TYPESAFE=off still wins. */
189
+ enabled: boolean;
190
+ model: string;
191
+ /** null → env TYPESAFE_BASE_URL → DEFAULT_BASE_URL. */
192
+ baseUrl: string | null;
193
+ defaultTimeoutMs: number;
194
+ costPerMillionInput: number;
195
+ costPerMillionOutput: number;
196
+ /** Default off; refused while benchRunAt is null. */
197
+ applyJudgedImportance: boolean;
198
+ applyMinConfidence: number;
199
+ backfillConcurrency: number;
200
+ benchRunAt: string | null;
201
+ bench: Partial<Record<'importance' | 'kind' | 'relation' | 'historical', BenchSummary>>;
202
+ surfaces: Record<SurfaceName, SurfaceSettings>;
203
+ backfill: BackfillState;
204
+ /** `autoHealEnabled` is intent; whether it takes effect is `autoHealGate()`, recomputed where the click would happen. */
205
+ browserAssist: BrowserAssistConfig;
206
+ /** `pressEnabled` is intent; whether it takes effect is `desktopPressGate()`, recomputed where the press would happen. */
207
+ desktopAssist: DesktopAssistConfig;
208
+ updatedAt: string | null;
209
+ }
210
+
211
+ export const DEFAULT_BACKFILL_STATE: BackfillState = {
212
+ status: 'idle', startedAt: null, pausedAt: null, finishedAt: null, pausedReason: null,
213
+ limit: null, project: null, total: 0,
214
+ judged: 0, skipped: 0, failures: 0, consecutiveFailures: 0,
215
+ relationsCreated: { similar: 0, possible_conflict: 0, duplicate_of: 0 },
216
+ disagreements: { kind: 0, importance: 0 },
217
+ tokensIn: 0, tokensOut: 0, latencyMsTotal: 0,
218
+ lastError: null, lastErrorAt: null, estimate: null, report: null,
219
+ };
220
+
221
+ export const DEFAULT_TYPESAFE_CONFIG: TypeSafeConfig = {
222
+ version: 1,
223
+ enabled: true,
224
+ model: DEFAULT_MODEL,
225
+ baseUrl: null,
226
+ defaultTimeoutMs: 8000,
227
+ costPerMillionInput: DEFAULT_COST_PER_MILLION_INPUT,
228
+ costPerMillionOutput: DEFAULT_COST_PER_MILLION_OUTPUT,
229
+ applyJudgedImportance: false,
230
+ applyMinConfidence: 0.6,
231
+ backfillConcurrency: 3,
232
+ benchRunAt: null,
233
+ bench: {},
234
+ surfaces: SURFACE_DEFAULTS,
235
+ backfill: DEFAULT_BACKFILL_STATE,
236
+ browserAssist: DEFAULT_BROWSER_ASSIST,
237
+ desktopAssist: DEFAULT_DESKTOP_ASSIST,
238
+ updatedAt: null,
239
+ };
240
+
241
+ export interface TypeSafeConfigPatch {
242
+ enabled?: boolean;
243
+ model?: string;
244
+ baseUrl?: string | null;
245
+ defaultTimeoutMs?: number;
246
+ costPerMillionInput?: number;
247
+ costPerMillionOutput?: number;
248
+ applyJudgedImportance?: boolean;
249
+ applyMinConfidence?: number;
250
+ backfillConcurrency?: number;
251
+ benchRunAt?: string | null;
252
+ bench?: TypeSafeConfig['bench'];
253
+ surfaces?: Partial<Record<SurfaceName, Partial<SurfaceSettings>>>;
254
+ backfill?: Partial<BackfillState>;
255
+ browserAssist?: Partial<BrowserAssistConfig>;
256
+ desktopAssist?: Partial<DesktopAssistConfig>;
257
+ }
258
+
259
+ const CONFIG_KEY = 'typesafe_config';
260
+ const CONFIG_TTL_MS = 3000;
261
+
262
+ /** Per-surface limits beyond the two thresholds: [min, max, integer]. */
263
+ const SURFACE_LIMITS = {
264
+ minScore: [0, 4, false],
265
+ maxItems: [1, 50, true],
266
+ debounceMs: [0, 600000, true],
267
+ bashOnlyMinProbability: [0, 1, false],
268
+ } as const;
269
+ const SURFACE_LIMIT_KEYS = Object.keys(SURFACE_LIMITS) as (keyof typeof SURFACE_LIMITS)[];
270
+
271
+ const clone = <T>(value: T): T => JSON.parse(JSON.stringify(value)) as T;
272
+ const isObject = (value: unknown): value is Record<string, unknown> => !!value && typeof value === 'object' && !Array.isArray(value);
273
+
274
+ /** Layer a stored/partial config over the defaults. Unknown surfaces are ignored; missing ones keep their defaults. */
275
+ export function mergeTypeSafeConfig(base: TypeSafeConfig, patch: TypeSafeConfigPatch | Partial<TypeSafeConfig> | null | undefined): TypeSafeConfig {
276
+ const next = clone(base);
277
+ if (!isObject(patch)) return next;
278
+ const p = patch as Record<string, unknown>;
279
+ if (typeof p.enabled === 'boolean') next.enabled = p.enabled;
280
+ if (typeof p.model === 'string' && p.model.trim()) next.model = p.model.trim();
281
+ if (p.baseUrl === null || typeof p.baseUrl === 'string') next.baseUrl = p.baseUrl ? String(p.baseUrl).trim() || null : null;
282
+ for (const key of ['defaultTimeoutMs', 'costPerMillionInput', 'costPerMillionOutput', 'applyMinConfidence', 'backfillConcurrency'] as const) {
283
+ const n = Number(p[key]);
284
+ if (p[key] !== undefined && Number.isFinite(n)) (next as unknown as Record<string, number>)[key] = n;
285
+ }
286
+ if (typeof p.applyJudgedImportance === 'boolean') next.applyJudgedImportance = p.applyJudgedImportance;
287
+ if (p.benchRunAt === null || typeof p.benchRunAt === 'string') next.benchRunAt = p.benchRunAt as string | null;
288
+ if (isObject(p.bench)) next.bench = { ...next.bench, ...(p.bench as TypeSafeConfig['bench']) };
289
+ if (isObject(p.surfaces)) {
290
+ for (const name of SURFACES) {
291
+ const s = (p.surfaces as Record<string, unknown>)[name];
292
+ if (!isObject(s)) continue;
293
+ const current = next.surfaces[name];
294
+ if (typeof s.enabled === 'boolean') current.enabled = s.enabled;
295
+ if (s.timeoutMs !== undefined && Number.isFinite(Number(s.timeoutMs))) current.timeoutMs = Number(s.timeoutMs);
296
+ if (s.minConfidence !== undefined && Number.isFinite(Number(s.minConfidence))) current.minConfidence = Number(s.minConfidence);
297
+ if (s.minProbability !== undefined && Number.isFinite(Number(s.minProbability))) current.minProbability = Number(s.minProbability);
298
+ for (const key of SURFACE_LIMIT_KEYS) {
299
+ if (s[key] !== undefined && Number.isFinite(Number(s[key]))) current[key] = Number(s[key]);
300
+ }
301
+ }
302
+ }
303
+ if (isObject(p.backfill)) {
304
+ const b = p.backfill as Partial<BackfillState>;
305
+ next.backfill = { ...next.backfill, ...b,
306
+ relationsCreated: { ...next.backfill.relationsCreated, ...(isObject(b.relationsCreated) ? b.relationsCreated : {}) },
307
+ disagreements: { ...next.backfill.disagreements, ...(isObject(b.disagreements) ? b.disagreements : {}) },
308
+ };
309
+ }
310
+ if (isObject(p.browserAssist)) {
311
+ const b = p.browserAssist as Record<string, unknown>;
312
+ next.browserAssist ??= clone(DEFAULT_BROWSER_ASSIST);
313
+ if (typeof b.autoHealEnabled === 'boolean') next.browserAssist.autoHealEnabled = b.autoHealEnabled;
314
+ // A malformed stored bench reads as "keep what we had", which for a fresh
315
+ // merge over the defaults is null: the gate stays shut.
316
+ if (b.targetBench !== undefined) { const bench = readTargetBench(b.targetBench); if (bench !== undefined) next.browserAssist.targetBench = bench; }
317
+ }
318
+ if (isObject(p.desktopAssist)) {
319
+ const d = p.desktopAssist as Record<string, unknown>;
320
+ next.desktopAssist ??= clone(DEFAULT_DESKTOP_ASSIST);
321
+ if (typeof d.pressEnabled === 'boolean') next.desktopAssist.pressEnabled = d.pressEnabled;
322
+ // As for the browser record: a malformed stored bench keeps what we had, so a fresh merge stays locked.
323
+ if (d.targetBench !== undefined) { const bench = readDesktopTargetBench(d.targetBench); if (bench !== undefined) next.desktopAssist.targetBench = bench; }
324
+ }
325
+ if (typeof p.updatedAt === 'string') next.updatedAt = p.updatedAt;
326
+ return next;
327
+ }
328
+
329
+ /**
330
+ * Turn an untrusted request body into a patch, or throw with a message the
331
+ * endpoint can return as a 400. Lives here so the HTTP route, the tests and
332
+ * the UI all agree on the limits.
333
+ */
334
+ export function validateTypeSafeConfigPatch(body: unknown, current: TypeSafeConfig = typesafeConfig()): TypeSafeConfigPatch {
335
+ if (!isObject(body)) throw new Error('Config patch must be an object.');
336
+ const patch: TypeSafeConfigPatch = {};
337
+ const num = (key: string, min: number, max: number, integer = false) => {
338
+ const raw = body[key];
339
+ if (raw === undefined) return undefined;
340
+ const n = Number(raw);
341
+ if (!Number.isFinite(n) || n < min || n > max || (integer && !Number.isInteger(n))) throw new Error(`${key} must be ${integer ? 'an integer' : 'a number'} between ${min} and ${max}.`);
342
+ return n;
343
+ };
344
+ if (body.enabled !== undefined) { if (typeof body.enabled !== 'boolean') throw new Error('enabled must be a boolean.'); patch.enabled = body.enabled; }
345
+ if (body.model !== undefined) {
346
+ if (typeof body.model !== 'string' || !body.model.trim() || body.model.length > 64 || !/^[A-Za-z0-9._-]+$/.test(body.model.trim())) throw new Error('model must be a short model id such as jev-latest.');
347
+ patch.model = body.model.trim();
348
+ }
349
+ if (body.baseUrl !== undefined) {
350
+ if (body.baseUrl === null || body.baseUrl === '') patch.baseUrl = null;
351
+ else if (typeof body.baseUrl !== 'string' || !/^https?:\/\/[^\s]+$/.test(body.baseUrl.trim())) throw new Error('baseUrl must be an http(s) URL or empty for the default.');
352
+ else patch.baseUrl = body.baseUrl.trim().replace(/\/+$/, '');
353
+ }
354
+ const defaultTimeoutMs = num('defaultTimeoutMs', 200, 30000, true); if (defaultTimeoutMs !== undefined) patch.defaultTimeoutMs = defaultTimeoutMs;
355
+ const costIn = num('costPerMillionInput', 0, 1000); if (costIn !== undefined) patch.costPerMillionInput = costIn;
356
+ const costOut = num('costPerMillionOutput', 0, 1000); if (costOut !== undefined) patch.costPerMillionOutput = costOut;
357
+ const minConf = num('applyMinConfidence', 0, 1); if (minConf !== undefined) patch.applyMinConfidence = minConf;
358
+ const concurrency = num('backfillConcurrency', 1, 8, true); if (concurrency !== undefined) patch.backfillConcurrency = concurrency;
359
+ if (body.applyJudgedImportance !== undefined) {
360
+ if (typeof body.applyJudgedImportance !== 'boolean') throw new Error('applyJudgedImportance must be a boolean.');
361
+ if (body.applyJudgedImportance && !current.benchRunAt) throw new Error('Run the importance bench before applying judged importance.');
362
+ patch.applyJudgedImportance = body.applyJudgedImportance;
363
+ }
364
+ if (body.surfaces !== undefined) {
365
+ if (!isObject(body.surfaces)) throw new Error('surfaces must be an object keyed by surface name.');
366
+ patch.surfaces = {};
367
+ for (const [name, value] of Object.entries(body.surfaces)) {
368
+ if (!(SURFACES as readonly string[]).includes(name)) throw new Error(`Unknown surface: ${name}`);
369
+ if (!isObject(value)) throw new Error(`surfaces.${name} must be an object.`);
370
+ const s: Partial<SurfaceSettings> = {};
371
+ if (value.enabled !== undefined) { if (typeof value.enabled !== 'boolean') throw new Error(`surfaces.${name}.enabled must be a boolean.`); s.enabled = value.enabled; }
372
+ if (value.timeoutMs !== undefined) {
373
+ const n = Number(value.timeoutMs);
374
+ if (!Number.isInteger(n) || n < 200 || n > 30000) throw new Error(`surfaces.${name}.timeoutMs must be an integer between 200 and 30000.`);
375
+ s.timeoutMs = n;
376
+ }
377
+ if (value.minConfidence !== undefined) {
378
+ const n = Number(value.minConfidence);
379
+ if (!Number.isFinite(n) || n < 0 || n > 1) throw new Error(`surfaces.${name}.minConfidence must be between 0 and 1.`);
380
+ s.minConfidence = n;
381
+ }
382
+ if (value.minProbability !== undefined) {
383
+ const n = Number(value.minProbability);
384
+ if (!Number.isFinite(n) || n < 0 || n > 1) throw new Error(`surfaces.${name}.minProbability must be between 0 and 1.`);
385
+ s.minProbability = n;
386
+ }
387
+ for (const key of SURFACE_LIMIT_KEYS) {
388
+ if (value[key] === undefined) continue;
389
+ const [min, max, integer] = SURFACE_LIMITS[key];
390
+ const n = Number(value[key]);
391
+ if (!Number.isFinite(n) || n < min || n > max || (integer && !Number.isInteger(n))) throw new Error(`surfaces.${name}.${key} must be ${integer ? 'an integer' : 'a number'} between ${min} and ${max}.`);
392
+ s[key] = n;
393
+ }
394
+ patch.surfaces[name as SurfaceName] = s;
395
+ }
396
+ }
397
+ // Last on purpose: the gate is judged against current + THIS request, so one
398
+ // PUT cannot lower a threshold and switch auto-heal on together.
399
+ if (body.browserAssist !== undefined) {
400
+ if (!isObject(body.browserAssist)) throw new Error('browserAssist must be an object.');
401
+ const b = body.browserAssist;
402
+ if (b.targetBench !== undefined) throw new Error('browserAssist.targetBench is written by the browser benchmark, not by the settings API.');
403
+ const extra = Object.keys(b).find(key => key !== 'autoHealEnabled');
404
+ if (extra) throw new Error(`Unknown browserAssist field: ${extra}`);
405
+ if (b.autoHealEnabled !== undefined) {
406
+ if (typeof b.autoHealEnabled !== 'boolean') throw new Error('browserAssist.autoHealEnabled must be a boolean.');
407
+ if (b.autoHealEnabled) {
408
+ const gate = autoHealGate(mergeTypeSafeConfig(current, patch));
409
+ if (!gate.eligible) throw new Error(`Safe auto-heal stays locked: ${gate.reasons.join(' ')}`);
410
+ }
411
+ patch.browserAssist = { autoHealEnabled: b.autoHealEnabled };
412
+ }
413
+ }
414
+ // After browserAssist, for the same reason: judged against current + everything else this request changes.
415
+ if (body.desktopAssist !== undefined) {
416
+ if (!isObject(body.desktopAssist)) throw new Error('desktopAssist must be an object.');
417
+ const d = body.desktopAssist;
418
+ if (d.targetBench !== undefined) throw new Error('desktopAssist.targetBench is written by the desktop benchmark, not by the settings API.');
419
+ const extra = Object.keys(d).find(key => key !== 'pressEnabled');
420
+ if (extra) throw new Error(`Unknown desktopAssist field: ${extra}`);
421
+ if (d.pressEnabled !== undefined) {
422
+ if (typeof d.pressEnabled !== 'boolean') throw new Error('desktopAssist.pressEnabled must be a boolean.');
423
+ if (d.pressEnabled) {
424
+ const gate = desktopPressGate(mergeTypeSafeConfig(current, patch));
425
+ if (!gate.eligible) throw new Error(`Press by intent stays locked: ${gate.reasons.join(' ')}`);
426
+ }
427
+ patch.desktopAssist = { pressEnabled: d.pressEnabled };
428
+ }
429
+ }
430
+ return patch;
431
+ }
432
+
433
+ let cached: TypeSafeConfig | null = null;
434
+ let cachedAt = 0;
435
+
436
+ function readStored(): Partial<TypeSafeConfig> | null {
437
+ try {
438
+ const row = getDb().prepare('SELECT value FROM kv_config WHERE key=?').get(CONFIG_KEY) as { value?: string } | undefined;
439
+ if (!row?.value) return null;
440
+ const parsed = JSON.parse(String(row.value)) as unknown;
441
+ return isObject(parsed) ? parsed as Partial<TypeSafeConfig> : null;
442
+ } catch { return null; }
443
+ }
444
+
445
+ /** The effective config, re-read from kv_config at most every CONFIG_TTL_MS. Never throws. */
446
+ export function typesafeConfig(): TypeSafeConfig {
447
+ const now = Date.now();
448
+ if (cached && now - cachedAt < CONFIG_TTL_MS) return cached;
449
+ cached = mergeTypeSafeConfig(DEFAULT_TYPESAFE_CONFIG, readStored());
450
+ cachedAt = now;
451
+ return cached;
452
+ }
453
+
454
+ /** Drop the cached copy so the next read hits the database (called after every write in this process). */
455
+ export function invalidateTypeSafeConfig(): void { cached = null; cachedAt = 0; }
456
+
457
+ /** Per-surface settings; unknown names get the global default so a new surface is never silently disabled. */
458
+ export function surfaceConfig(name: string): SurfaceSettings {
459
+ const cfg = typesafeConfig();
460
+ return cfg.surfaces[name as SurfaceName] ?? { enabled: true, timeoutMs: cfg.defaultTimeoutMs };
461
+ }
462
+
463
+ export function typesafeMasterEnabled(): boolean { return typesafeConfig().enabled; }
464
+
465
+ /**
466
+ * Read-merge-write under BEGIN IMMEDIATE so two writers (the settings PUT and
467
+ * the backfill progress flush) cannot lose each other's fields. Callers must
468
+ * not hold a transaction of their own; if one is open the write still lands,
469
+ * just without the lock.
470
+ */
471
+ export function mutateTypeSafeConfig(fn: (current: TypeSafeConfig) => TypeSafeConfig | TypeSafeConfigPatch): TypeSafeConfig {
472
+ const d = getDb();
473
+ const write = () => {
474
+ const current = mergeTypeSafeConfig(DEFAULT_TYPESAFE_CONFIG, readStored());
475
+ const result = fn(current);
476
+ const next = mergeTypeSafeConfig(current, result);
477
+ next.updatedAt = new Date().toISOString();
478
+ d.prepare('INSERT INTO kv_config(key,value) VALUES(?,?) ON CONFLICT(key) DO UPDATE SET value=excluded.value').run(CONFIG_KEY, JSON.stringify(next));
479
+ return next;
480
+ };
481
+ let next: TypeSafeConfig;
482
+ let locked = false;
483
+ try { d.exec('BEGIN IMMEDIATE'); locked = true; } catch { locked = false; }
484
+ try {
485
+ next = write();
486
+ if (locked) d.exec('COMMIT');
487
+ } catch (error) {
488
+ if (locked) { try { d.exec('ROLLBACK'); } catch { /* already rolled back */ } }
489
+ throw error;
490
+ }
491
+ invalidateTypeSafeConfig();
492
+ return next;
493
+ }
494
+
495
+ export function updateTypeSafeConfig(patch: TypeSafeConfigPatch): TypeSafeConfig {
496
+ return mutateTypeSafeConfig(() => patch);
497
+ }
498
+
499
+ // --- Judgment log ---
500
+
501
+ export interface TypeSafeLogRow {
502
+ id?: number;
503
+ created_at?: string;
504
+ surface: string;
505
+ origin: JudgeOrigin;
506
+ entity_id: string | null;
507
+ model: string | null;
508
+ question_count: number;
509
+ state_preview: string;
510
+ answers: unknown;
511
+ latency_ms: number;
512
+ input_tokens: number;
513
+ output_tokens: number;
514
+ cached: 0 | 1;
515
+ error: string | null;
516
+ /** Claude session, native loop run, or MCP memory session that asked. */
517
+ session_id?: string | null;
518
+ project?: string | null;
519
+ /** Lead surface first, then the riders whose questions shared the request; null means [surface]. */
520
+ surfaces?: string[] | null;
521
+ /** What the caller did with the answer (injected vs dropped, stale or not…), written after the fact. */
522
+ outcome?: unknown;
523
+ }
524
+
525
+ /** Rows kept. ~1 KB each; 2,000 covered two minutes of a backfill, 20,000 covers a few hours. */
526
+ export const LOG_KEEP = 20000;
527
+ const PRUNE_EVERY = 25;
528
+ let insertsSincePrune = 0;
529
+ const OUTCOME_MAX_CHARS = 4096;
530
+ const SESSION_ID_RE = /^[A-Za-z0-9_.:-]{1,128}$/;
531
+
532
+ /** A session id fit for the log, or null. */
533
+ export function cleanSessionId(value: unknown): string | null {
534
+ return typeof value === 'string' && SESSION_ID_RE.test(value) ? value : null;
535
+ }
536
+
537
+ /**
538
+ * The session a memory was written from, read back from its `source_ref`
539
+ * (`remember` stores the caller's session there; compaction stores
540
+ * `synabun-compaction:<session>:<generation>`).
541
+ */
542
+ export function logSessionFromRef(ref: unknown): string | null {
543
+ if (typeof ref !== 'string' || !ref) return null;
544
+ const compaction = ref.match(/^synabun-compaction:([^:]+):/);
545
+ return cleanSessionId(compaction ? compaction[1] : ref);
546
+ }
547
+
548
+ /** Append one row and return its id. Never throws: the log is diagnostics, not the judgment. */
549
+ export function writeTypeSafeLog(row: TypeSafeLogRow): number | null {
550
+ try {
551
+ const d = getDb();
552
+ const result = d.prepare(`INSERT INTO typesafe_log(created_at,surface,origin,entity_id,model,question_count,state_preview,answers,latency_ms,input_tokens,output_tokens,cached,error,session_id,project,surfaces)
553
+ VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`).run(
554
+ row.created_at ?? new Date().toISOString(), row.surface, row.origin, row.entity_id, row.model, row.question_count,
555
+ row.state_preview, row.answers == null ? null : JSON.stringify(row.answers),
556
+ Math.round(row.latency_ms), row.input_tokens, row.output_tokens, row.cached, row.error,
557
+ cleanSessionId(row.session_id), typeof row.project === 'string' && row.project ? row.project.slice(0, 200) : null,
558
+ row.surfaces?.length ? JSON.stringify(row.surfaces) : null,
559
+ );
560
+ if (++insertsSincePrune >= PRUNE_EVERY) { insertsSincePrune = 0; pruneTypeSafeLog(); }
561
+ return Number(result.lastInsertRowid);
562
+ } catch { return null; /* diagnostics must never fail the caller */ }
563
+ }
564
+
565
+ /** Record what the caller did with a judgment. Bounded; never throws. */
566
+ export function annotateTypeSafeLog(id: number | null | undefined, outcome: unknown): void {
567
+ if (!id) return;
568
+ try {
569
+ let text = JSON.stringify(outcome);
570
+ if (text.length > OUTCOME_MAX_CHARS) text = JSON.stringify({ truncated: true, chars: text.length });
571
+ getDb().prepare('UPDATE typesafe_log SET outcome=? WHERE id=?').run(text, id);
572
+ } catch { /* diagnostics */ }
573
+ }
574
+
575
+ /** Point rows logged under a provisional entity id at the one that was finally stored. */
576
+ export function relinkTypeSafeLog(fromEntity: string, toEntity: string): void {
577
+ if (!fromEntity || !toEntity || fromEntity === toEntity) return;
578
+ try { getDb().prepare('UPDATE typesafe_log SET entity_id=? WHERE entity_id=?').run(toEntity, fromEntity); } catch { /* diagnostics */ }
579
+ }
580
+
581
+ /** Keep only the newest `keep` rows. Returns the number deleted. */
582
+ export function pruneTypeSafeLog(keep = LOG_KEEP): number {
583
+ try {
584
+ const result = getDb().prepare('DELETE FROM typesafe_log WHERE id <= (SELECT id FROM typesafe_log ORDER BY id DESC LIMIT 1 OFFSET ?)').run(keep);
585
+ return Number(result.changes);
586
+ } catch { return 0; }
587
+ }
588
+
589
+ export interface LogQuery {
590
+ limit?: number; surface?: string; origin?: string; entityId?: string; before?: string;
591
+ sessionId?: string; project?: string; after?: string; order?: 'asc' | 'desc';
592
+ }
593
+
594
+ const parseJson = (value: unknown): unknown => {
595
+ if (value == null) return null;
596
+ try { return JSON.parse(String(value)); } catch { return String(value); }
597
+ };
598
+
599
+ export function readTypeSafeLog(query: LogQuery = {}): TypeSafeLogRow[] {
600
+ const limit = Math.max(1, Math.min(500, Math.floor(Number(query.limit) || 50)));
601
+ const where: string[] = [];
602
+ const params: (string | number)[] = [];
603
+ // A rider is found by its own name too: it shares its lead's row.
604
+ if (query.surface) { where.push("(surface=? OR EXISTS(SELECT 1 FROM json_each(COALESCE(surfaces,'[]')) WHERE value=?))"); params.push(String(query.surface), String(query.surface)); }
605
+ if (query.origin === 'live') where.push("origin NOT IN ('backfill','bench')");
606
+ else if (query.origin) { where.push('origin=?'); params.push(String(query.origin)); }
607
+ if (query.entityId) { where.push('entity_id=?'); params.push(String(query.entityId)); }
608
+ if (query.sessionId) { where.push('session_id=?'); params.push(String(query.sessionId)); }
609
+ if (query.project) { where.push('project=?'); params.push(String(query.project)); }
610
+ if (query.before) { where.push('created_at<?'); params.push(String(query.before)); }
611
+ if (query.after) { where.push('created_at>=?'); params.push(String(query.after)); }
612
+ const order = query.order === 'asc' ? 'ASC' : 'DESC';
613
+ try {
614
+ const rows = getDb().prepare(`SELECT * FROM typesafe_log ${where.length ? 'WHERE ' + where.join(' AND ') : ''} ORDER BY id ${order} LIMIT ?`).all(...params, limit);
615
+ return rows.map(row => ({
616
+ ...(row as unknown as TypeSafeLogRow),
617
+ answers: parseJson(row.answers),
618
+ surfaces: (parseJson(row.surfaces) as string[] | null) ?? null,
619
+ outcome: parseJson(row.outcome),
620
+ }));
621
+ } catch { return []; }
622
+ }
623
+
624
+ export function typesafeLogCount(): number {
625
+ try { return Number((getDb().prepare('SELECT count(*) AS n FROM typesafe_log').get() as { n: number }).n); } catch { return 0; }
626
+ }
627
+
628
+ export interface LogWindowStats { calls: number; failures: number; avgMs: number; inputTokens: number }
629
+ export interface TypeSafeLogStats {
630
+ at: string; oldest: string | null;
631
+ surfaces: Record<string, { h24: LogWindowStats; d7: LogWindowStats }>;
632
+ totals: { h24: LogWindowStats; d7: LogWindowStats };
633
+ }
634
+
635
+ let statsCache: { at: number; value: TypeSafeLogStats } | null = null;
636
+ const STATS_TTL_MS = 10_000;
637
+ const emptyWindow = (): LogWindowStats => ({ calls: 0, failures: 0, avgMs: 0, inputTokens: 0 });
638
+
639
+ /**
640
+ * Real-time judgments over the last 24 h and 7 days, read from the log rather
641
+ * than from per-process counters, so they survive a restart and include every
642
+ * process. Riders count toward their own surface; tokens count toward the lead,
643
+ * which is the request that paid for them. Backfill and bench are excluded.
644
+ */
645
+ export function typesafeLogStats(): TypeSafeLogStats {
646
+ const now = Date.now();
647
+ if (statsCache && now - statsCache.at < STATS_TTL_MS) return statsCache.value;
648
+ const h24 = new Date(now - 86_400_000).toISOString();
649
+ const d7 = new Date(now - 7 * 86_400_000).toISOString();
650
+ const value: TypeSafeLogStats = { at: new Date(now).toISOString(), oldest: null, surfaces: {}, totals: { h24: emptyWindow(), d7: emptyWindow() } };
651
+ try {
652
+ const d = getDb();
653
+ value.oldest = (d.prepare('SELECT MIN(created_at) AS t FROM typesafe_log').get() as { t: string | null } | undefined)?.t ?? null;
654
+ const perSurface = d.prepare(`SELECT s.value AS surface,
655
+ SUM(l.created_at>=?) AS calls24, SUM(l.created_at>=? AND l.error IS NOT NULL) AS failures24,
656
+ AVG(CASE WHEN l.created_at>=? AND l.error IS NULL AND l.cached=0 THEN l.latency_ms END) AS avg24,
657
+ SUM(CASE WHEN l.created_at>=? AND s.value=l.surface THEN l.input_tokens ELSE 0 END) AS tokens24,
658
+ COUNT(*) AS calls7, SUM(l.error IS NOT NULL) AS failures7,
659
+ AVG(CASE WHEN l.error IS NULL AND l.cached=0 THEN l.latency_ms END) AS avg7,
660
+ SUM(CASE WHEN s.value=l.surface THEN l.input_tokens ELSE 0 END) AS tokens7
661
+ FROM typesafe_log l, json_each(COALESCE(l.surfaces, json_array(l.surface))) s
662
+ WHERE l.created_at>=? AND l.origin NOT IN ('backfill','bench') GROUP BY s.value`).all(h24, h24, h24, h24, d7);
663
+ for (const r of perSurface) {
664
+ value.surfaces[String(r.surface)] = {
665
+ h24: { calls: Number(r.calls24) || 0, failures: Number(r.failures24) || 0, avgMs: Math.round(Number(r.avg24) || 0), inputTokens: Number(r.tokens24) || 0 },
666
+ d7: { calls: Number(r.calls7) || 0, failures: Number(r.failures7) || 0, avgMs: Math.round(Number(r.avg7) || 0), inputTokens: Number(r.tokens7) || 0 },
667
+ };
668
+ }
669
+ const totals = d.prepare(`SELECT SUM(created_at>=?) AS calls24, SUM(created_at>=? AND error IS NOT NULL) AS failures24,
670
+ AVG(CASE WHEN created_at>=? AND error IS NULL AND cached=0 THEN latency_ms END) AS avg24,
671
+ SUM(CASE WHEN created_at>=? THEN input_tokens ELSE 0 END) AS tokens24,
672
+ COUNT(*) AS calls7, SUM(error IS NOT NULL) AS failures7,
673
+ AVG(CASE WHEN error IS NULL AND cached=0 THEN latency_ms END) AS avg7, SUM(input_tokens) AS tokens7
674
+ FROM typesafe_log WHERE created_at>=? AND origin NOT IN ('backfill','bench')`).get(h24, h24, h24, h24, d7) as Record<string, unknown> | undefined;
675
+ if (totals) {
676
+ value.totals = {
677
+ h24: { calls: Number(totals.calls24) || 0, failures: Number(totals.failures24) || 0, avgMs: Math.round(Number(totals.avg24) || 0), inputTokens: Number(totals.tokens24) || 0 },
678
+ d7: { calls: Number(totals.calls7) || 0, failures: Number(totals.failures7) || 0, avgMs: Math.round(Number(totals.avg7) || 0), inputTokens: Number(totals.tokens7) || 0 },
679
+ };
680
+ }
681
+ } catch { /* an unreadable log reads as empty */ }
682
+ statsCache = { at: now, value };
683
+ return value;
684
+ }
685
+
686
+ export interface TypeSafeSessionRow {
687
+ session_id: string; project: string | null; first_at: string; last_at: string;
688
+ calls: number; failures: number; surfaces: Record<string, number>;
689
+ }
690
+
691
+ /** Sessions that asked for judgments, newest first, with per-surface counts (riders included). */
692
+ export function typesafeSessions(query: { since?: string; project?: string; limit?: number } = {}): TypeSafeSessionRow[] {
693
+ const limit = Math.max(1, Math.min(200, Math.floor(Number(query.limit) || 30)));
694
+ const since = query.since && Number.isFinite(Date.parse(query.since)) ? new Date(query.since).toISOString() : new Date(Date.now() - 7 * 86_400_000).toISOString();
695
+ try {
696
+ const d = getDb();
697
+ const where = ['session_id IS NOT NULL', 'created_at>=?'];
698
+ const params: (string | number)[] = [since];
699
+ if (query.project) { where.push('project=?'); params.push(String(query.project)); }
700
+ const rows = d.prepare(`SELECT session_id, MAX(project) AS project, MIN(created_at) AS first_at, MAX(created_at) AS last_at,
701
+ COUNT(*) AS calls, SUM(error IS NOT NULL) AS failures
702
+ FROM typesafe_log WHERE ${where.join(' AND ')} GROUP BY session_id ORDER BY last_at DESC LIMIT ?`).all(...params, limit);
703
+ if (!rows.length) return [];
704
+ const ids = rows.map(r => String(r.session_id));
705
+ const counts = d.prepare(`SELECT l.session_id, s.value AS surface, COUNT(*) AS n
706
+ FROM typesafe_log l, json_each(COALESCE(l.surfaces, json_array(l.surface))) s
707
+ WHERE l.session_id IN (${ids.map(() => '?').join(',')}) AND l.created_at>=? GROUP BY l.session_id, s.value`).all(...ids, since);
708
+ const bySession = new Map<string, Record<string, number>>();
709
+ for (const c of counts) {
710
+ const key = String(c.session_id);
711
+ const entry = bySession.get(key) ?? {};
712
+ entry[String(c.surface)] = Number(c.n) || 0;
713
+ bySession.set(key, entry);
714
+ }
715
+ return rows.map(r => ({
716
+ session_id: String(r.session_id), project: r.project == null ? null : String(r.project),
717
+ first_at: String(r.first_at), last_at: String(r.last_at),
718
+ calls: Number(r.calls) || 0, failures: Number(r.failures) || 0,
719
+ surfaces: bySession.get(String(r.session_id)) ?? {},
720
+ }));
721
+ } catch { return []; }
722
+ }
723
+
724
+ // --- Credential redaction (shared by the log preview and the secret gate) ---
725
+
726
+ export interface CredentialPattern { type: string; re: RegExp; /** capture group that holds the secret; the rest of the match is kept */ group?: number; precise: boolean }
727
+
728
+ /**
729
+ * `precise` patterns are unambiguous on their own (a prefix or envelope that
730
+ * only a real token has). The rest need context or a judgment before they
731
+ * are treated as secrets: `token=abcdef12` might be an example.
732
+ */
733
+ export const CREDENTIAL_PATTERNS: CredentialPattern[] = [
734
+ { type: 'private-key', re: /-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g, precise: true },
735
+ { type: 'api-key', re: /\b(?:sk|rk|pk)[-_](?:live|test|proj|ant|or|api)?[-_]?[A-Za-z0-9_-]{16,}/g, precise: true },
736
+ { type: 'github-token', re: /\bgh[pousr]_[A-Za-z0-9]{20,}\b/g, precise: true },
737
+ { type: 'slack-token', re: /\bxox[abprs]-[A-Za-z0-9-]{10,}/g, precise: true },
738
+ { type: 'aws-key', re: /\bAKIA[0-9A-Z]{16}\b/g, precise: true },
739
+ { type: 'jwt', re: /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/g, precise: true },
740
+ { type: 'bearer', re: /\bBearer\s+([A-Za-z0-9._~+/=-]{16,})/g, group: 1, precise: false },
741
+ { type: 'secret', re: /(?:api[_-]?key|access[_-]?token|refresh[_-]?token|auth[_-]?token|secret[_-]?key|client[_-]?secret|password|passwd|pwd|token|secret|authorization)\s*["']?\s*[:=]\s*["']?([^\s"',;]{8,})/gi, group: 1, precise: false },
742
+ ];
743
+
744
+ export interface CredentialSpan { start: number; end: number; text: string; type: string; precise: boolean }
745
+
746
+ /** Every credential-looking span, non-overlapping, earliest first. */
747
+ export function findCredentialSpans(text: string): CredentialSpan[] {
748
+ const spans: CredentialSpan[] = [];
749
+ for (const pattern of CREDENTIAL_PATTERNS) {
750
+ pattern.re.lastIndex = 0;
751
+ for (const match of text.matchAll(pattern.re)) {
752
+ const whole = match[0];
753
+ const secret = pattern.group ? match[pattern.group] : whole;
754
+ if (!secret) continue;
755
+ const offset = pattern.group ? whole.indexOf(secret) : 0;
756
+ const start = (match.index ?? 0) + offset;
757
+ spans.push({ start, end: start + secret.length, text: secret, type: pattern.type, precise: pattern.precise });
758
+ }
759
+ }
760
+ spans.sort((a, b) => a.start - b.start || b.end - a.end);
761
+ const kept: CredentialSpan[] = [];
762
+ for (const span of spans) {
763
+ const last = kept[kept.length - 1];
764
+ if (last && span.start < last.end) continue;
765
+ kept.push(span);
766
+ }
767
+ return kept;
768
+ }
769
+
770
+ /** Replace the given spans (or every credential-looking span) with `[redacted:<type>]`. */
771
+ export function redactSpans(text: string, spans: CredentialSpan[] = findCredentialSpans(text)): string {
772
+ let out = '';
773
+ let cursor = 0;
774
+ for (const span of [...spans].sort((a, b) => a.start - b.start)) {
775
+ if (span.start < cursor) continue;
776
+ out += text.slice(cursor, span.start) + `[redacted:${span.type}]`;
777
+ cursor = span.end;
778
+ }
779
+ return out + text.slice(cursor);
780
+ }
781
+
782
+ export function redactCredentials(text: string): string { return redactSpans(text); }
783
+
784
+ /** A bounded, credential-free preview of a judgment's state for the log. Redact first, then cut. */
785
+ export function statePreview(state: unknown, limit = 500): string {
786
+ let text: string;
787
+ try { text = typeof state === 'string' ? state : JSON.stringify(state); } catch { text = String(state); }
788
+ const clean = redactCredentials(text ?? '');
789
+ return clean.length > limit ? clean.slice(0, limit - 1) + '…' : clean;
790
+ }