synabun 1.3.0 → 2.0.0-beta

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 (1153) hide show
  1. package/CHANGELOG.md +197 -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 +131 -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/browser-v2.md +109 -0
  20. package/docs/hook-integrity.md +89 -0
  21. package/docs/judgments.md +182 -0
  22. package/docs/style-guide.md +246 -0
  23. package/docs/whatsapp.md +325 -0
  24. package/hooks/claude-code/post-plan.mjs +613 -391
  25. package/hooks/claude-code/post-remember.mjs +246 -122
  26. package/hooks/claude-code/pre-compact.mjs +171 -110
  27. package/hooks/claude-code/pre-task.mjs +133 -0
  28. package/hooks/claude-code/pre-websearch.mjs +15 -4
  29. package/hooks/claude-code/prompt-origin.mjs +94 -0
  30. package/hooks/claude-code/prompt-submit.mjs +1244 -861
  31. package/hooks/claude-code/session-start.mjs +114 -156
  32. package/hooks/claude-code/shared.mjs +1228 -368
  33. package/hooks/claude-code/state.mjs +167 -0
  34. package/hooks/claude-code/stop.mjs +515 -140
  35. package/hooks/claude-code/subagent-start.mjs +154 -0
  36. package/hooks/claude-code/subagent-stop.mjs +102 -0
  37. package/hooks/claude-code/task-gate.mjs +150 -0
  38. package/lib/claude-hooks.js +84 -0
  39. package/lib/claude-usage-audit.js +141 -0
  40. package/lib/client-config-repair.js +144 -0
  41. package/lib/data-home-migration.js +498 -0
  42. package/lib/first-launch-protection.js +240 -0
  43. package/lib/paths.d.ts +21 -0
  44. package/lib/paths.js +103 -0
  45. package/mcp-server/dist/config.d.ts +22 -0
  46. package/mcp-server/dist/config.d.ts.map +1 -0
  47. package/mcp-server/dist/config.js +109 -0
  48. package/mcp-server/dist/config.js.map +1 -0
  49. package/mcp-server/dist/http.d.ts +30 -0
  50. package/mcp-server/dist/http.d.ts.map +1 -0
  51. package/mcp-server/dist/http.js +276 -0
  52. package/mcp-server/dist/http.js.map +1 -0
  53. package/mcp-server/dist/index.d.ts +48 -0
  54. package/mcp-server/dist/index.d.ts.map +1 -0
  55. package/mcp-server/dist/index.js +538 -0
  56. package/mcp-server/dist/index.js.map +1 -0
  57. package/mcp-server/dist/preload-http.d.ts +3 -0
  58. package/mcp-server/dist/preload-http.d.ts.map +1 -0
  59. package/mcp-server/dist/preload-http.js +28 -0
  60. package/mcp-server/dist/preload-http.js.map +1 -0
  61. package/mcp-server/dist/preload.d.ts +3 -0
  62. package/mcp-server/dist/preload.d.ts.map +1 -0
  63. package/mcp-server/dist/preload.js +32 -0
  64. package/mcp-server/dist/preload.js.map +1 -0
  65. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts +19 -0
  66. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts.map +1 -0
  67. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js +403 -0
  68. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js.map +1 -0
  69. package/mcp-server/dist/scripts/setup-embeddings.d.ts +3 -0
  70. package/mcp-server/dist/scripts/setup-embeddings.d.ts.map +1 -0
  71. package/mcp-server/dist/scripts/setup-embeddings.js +15 -0
  72. package/mcp-server/dist/scripts/setup-embeddings.js.map +1 -0
  73. package/mcp-server/dist/services/assistant-judgments.d.ts +79 -0
  74. package/mcp-server/dist/services/assistant-judgments.d.ts.map +1 -0
  75. package/mcp-server/dist/services/assistant-judgments.js +128 -0
  76. package/mcp-server/dist/services/assistant-judgments.js.map +1 -0
  77. package/mcp-server/dist/services/browser-assist-gate.d.ts +314 -0
  78. package/mcp-server/dist/services/browser-assist-gate.d.ts.map +1 -0
  79. package/mcp-server/dist/services/browser-assist-gate.js +344 -0
  80. package/mcp-server/dist/services/browser-assist-gate.js.map +1 -0
  81. package/mcp-server/dist/services/browser-assist.d.ts +104 -0
  82. package/mcp-server/dist/services/browser-assist.d.ts.map +1 -0
  83. package/mcp-server/dist/services/browser-assist.js +282 -0
  84. package/mcp-server/dist/services/browser-assist.js.map +1 -0
  85. package/mcp-server/dist/services/browser-bench.d.ts +772 -0
  86. package/mcp-server/dist/services/browser-bench.d.ts.map +1 -0
  87. package/mcp-server/dist/services/browser-bench.js +424 -0
  88. package/mcp-server/dist/services/browser-bench.js.map +1 -0
  89. package/mcp-server/dist/services/browser-judgments.d.ts +196 -0
  90. package/mcp-server/dist/services/browser-judgments.d.ts.map +1 -0
  91. package/mcp-server/dist/services/browser-judgments.js +363 -0
  92. package/mcp-server/dist/services/browser-judgments.js.map +1 -0
  93. package/mcp-server/dist/services/browser-risk.d.ts +166 -0
  94. package/mcp-server/dist/services/browser-risk.d.ts.map +1 -0
  95. package/mcp-server/dist/services/browser-risk.js +458 -0
  96. package/mcp-server/dist/services/browser-risk.js.map +1 -0
  97. package/mcp-server/dist/services/categories.d.ts +61 -0
  98. package/mcp-server/dist/services/categories.d.ts.map +1 -0
  99. package/mcp-server/dist/services/categories.js +377 -0
  100. package/mcp-server/dist/services/categories.js.map +1 -0
  101. package/mcp-server/dist/services/codex-config-heal.d.ts +49 -0
  102. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -0
  103. package/mcp-server/dist/services/codex-config-heal.js +346 -0
  104. package/mcp-server/dist/services/codex-config-heal.js.map +1 -0
  105. package/mcp-server/dist/services/desktop-assist-gate.d.ts +198 -0
  106. package/mcp-server/dist/services/desktop-assist-gate.d.ts.map +1 -0
  107. package/mcp-server/dist/services/desktop-assist-gate.js +202 -0
  108. package/mcp-server/dist/services/desktop-assist-gate.js.map +1 -0
  109. package/mcp-server/dist/services/desktop-assist.d.ts +104 -0
  110. package/mcp-server/dist/services/desktop-assist.d.ts.map +1 -0
  111. package/mcp-server/dist/services/desktop-assist.js +266 -0
  112. package/mcp-server/dist/services/desktop-assist.js.map +1 -0
  113. package/mcp-server/dist/services/desktop-bench.d.ts +553 -0
  114. package/mcp-server/dist/services/desktop-bench.d.ts.map +1 -0
  115. package/mcp-server/dist/services/desktop-bench.js +311 -0
  116. package/mcp-server/dist/services/desktop-bench.js.map +1 -0
  117. package/mcp-server/dist/services/desktop-client.d.ts +23 -0
  118. package/mcp-server/dist/services/desktop-client.d.ts.map +1 -0
  119. package/mcp-server/dist/services/desktop-client.js +79 -0
  120. package/mcp-server/dist/services/desktop-client.js.map +1 -0
  121. package/mcp-server/dist/services/desktop-judgments.d.ts +125 -0
  122. package/mcp-server/dist/services/desktop-judgments.d.ts.map +1 -0
  123. package/mcp-server/dist/services/desktop-judgments.js +177 -0
  124. package/mcp-server/dist/services/desktop-judgments.js.map +1 -0
  125. package/mcp-server/dist/services/desktop-risk.d.ts +283 -0
  126. package/mcp-server/dist/services/desktop-risk.d.ts.map +1 -0
  127. package/mcp-server/dist/services/desktop-risk.js +605 -0
  128. package/mcp-server/dist/services/desktop-risk.js.map +1 -0
  129. package/mcp-server/dist/services/discord.d.ts +112 -0
  130. package/mcp-server/dist/services/discord.d.ts.map +1 -0
  131. package/mcp-server/dist/services/discord.js +477 -0
  132. package/mcp-server/dist/services/discord.js.map +1 -0
  133. package/mcp-server/dist/services/edit-stale.d.ts +81 -0
  134. package/mcp-server/dist/services/edit-stale.d.ts.map +1 -0
  135. package/mcp-server/dist/services/edit-stale.js +358 -0
  136. package/mcp-server/dist/services/edit-stale.js.map +1 -0
  137. package/mcp-server/dist/services/embedding-service.d.ts +16 -0
  138. package/mcp-server/dist/services/embedding-service.d.ts.map +1 -0
  139. package/mcp-server/dist/services/embedding-service.js +126 -0
  140. package/mcp-server/dist/services/embedding-service.js.map +1 -0
  141. package/mcp-server/dist/services/embedding-worker.d.ts +2 -0
  142. package/mcp-server/dist/services/embedding-worker.d.ts.map +1 -0
  143. package/mcp-server/dist/services/embedding-worker.js +52 -0
  144. package/mcp-server/dist/services/embedding-worker.js.map +1 -0
  145. package/mcp-server/dist/services/fb-regions.d.ts +71 -0
  146. package/mcp-server/dist/services/fb-regions.d.ts.map +1 -0
  147. package/mcp-server/dist/services/fb-regions.js +211 -0
  148. package/mcp-server/dist/services/fb-regions.js.map +1 -0
  149. package/mcp-server/dist/services/file-checksums.d.ts +22 -0
  150. package/mcp-server/dist/services/file-checksums.d.ts.map +1 -0
  151. package/mcp-server/dist/services/file-checksums.js +55 -0
  152. package/mcp-server/dist/services/file-checksums.js.map +1 -0
  153. package/mcp-server/dist/services/file-excerpt.d.ts +24 -0
  154. package/mcp-server/dist/services/file-excerpt.d.ts.map +1 -0
  155. package/mcp-server/dist/services/file-excerpt.js +65 -0
  156. package/mcp-server/dist/services/file-excerpt.js.map +1 -0
  157. package/mcp-server/dist/services/identity.d.ts +124 -0
  158. package/mcp-server/dist/services/identity.d.ts.map +1 -0
  159. package/mcp-server/dist/services/identity.js +241 -0
  160. package/mcp-server/dist/services/identity.js.map +1 -0
  161. package/mcp-server/dist/services/local-embeddings.d.ts +2 -0
  162. package/mcp-server/dist/services/local-embeddings.d.ts.map +1 -0
  163. package/mcp-server/dist/services/local-embeddings.js +3 -0
  164. package/mcp-server/dist/services/local-embeddings.js.map +1 -0
  165. package/mcp-server/dist/services/memory-client.d.ts +4 -0
  166. package/mcp-server/dist/services/memory-client.d.ts.map +1 -0
  167. package/mcp-server/dist/services/memory-client.js +27 -0
  168. package/mcp-server/dist/services/memory-client.js.map +1 -0
  169. package/mcp-server/dist/services/memory-judge-backfill.d.ts +135 -0
  170. package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -0
  171. package/mcp-server/dist/services/memory-judge-backfill.js +510 -0
  172. package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -0
  173. package/mcp-server/dist/services/memory-judgments.d.ts +362 -0
  174. package/mcp-server/dist/services/memory-judgments.d.ts.map +1 -0
  175. package/mcp-server/dist/services/memory-judgments.js +674 -0
  176. package/mcp-server/dist/services/memory-judgments.js.map +1 -0
  177. package/mcp-server/dist/services/memory-maintenance.d.ts +108 -0
  178. package/mcp-server/dist/services/memory-maintenance.d.ts.map +1 -0
  179. package/mcp-server/dist/services/memory-maintenance.js +403 -0
  180. package/mcp-server/dist/services/memory-maintenance.js.map +1 -0
  181. package/mcp-server/dist/services/memory-retrieval.d.ts +66 -0
  182. package/mcp-server/dist/services/memory-retrieval.d.ts.map +1 -0
  183. package/mcp-server/dist/services/memory-retrieval.js +412 -0
  184. package/mcp-server/dist/services/memory-retrieval.js.map +1 -0
  185. package/mcp-server/dist/services/memory-schema.d.ts +16 -0
  186. package/mcp-server/dist/services/memory-schema.d.ts.map +1 -0
  187. package/mcp-server/dist/services/memory-schema.js +282 -0
  188. package/mcp-server/dist/services/memory-schema.js.map +1 -0
  189. package/mcp-server/dist/services/memory-sessions.d.ts +24 -0
  190. package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -0
  191. package/mcp-server/dist/services/memory-sessions.js +110 -0
  192. package/mcp-server/dist/services/memory-sessions.js.map +1 -0
  193. package/mcp-server/dist/services/memory-triage.d.ts +60 -0
  194. package/mcp-server/dist/services/memory-triage.d.ts.map +1 -0
  195. package/mcp-server/dist/services/memory-triage.js +189 -0
  196. package/mcp-server/dist/services/memory-triage.js.map +1 -0
  197. package/mcp-server/dist/services/memory-verification.d.ts +24 -0
  198. package/mcp-server/dist/services/memory-verification.d.ts.map +1 -0
  199. package/mcp-server/dist/services/memory-verification.js +92 -0
  200. package/mcp-server/dist/services/memory-verification.js.map +1 -0
  201. package/mcp-server/dist/services/memory-writer.d.ts +26 -0
  202. package/mcp-server/dist/services/memory-writer.d.ts.map +1 -0
  203. package/mcp-server/dist/services/memory-writer.js +126 -0
  204. package/mcp-server/dist/services/memory-writer.js.map +1 -0
  205. package/mcp-server/dist/services/neural-interface.d.ts +439 -0
  206. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -0
  207. package/mcp-server/dist/services/neural-interface.js +1135 -0
  208. package/mcp-server/dist/services/neural-interface.js.map +1 -0
  209. package/mcp-server/dist/services/profiles.d.ts +120 -0
  210. package/mcp-server/dist/services/profiles.d.ts.map +1 -0
  211. package/mcp-server/dist/services/profiles.js +387 -0
  212. package/mcp-server/dist/services/profiles.js.map +1 -0
  213. package/mcp-server/dist/services/secret-gate.d.ts +29 -0
  214. package/mcp-server/dist/services/secret-gate.d.ts.map +1 -0
  215. package/mcp-server/dist/services/secret-gate.js +43 -0
  216. package/mcp-server/dist/services/secret-gate.js.map +1 -0
  217. package/mcp-server/dist/services/server-instructions.d.ts +10 -0
  218. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -0
  219. package/mcp-server/dist/services/server-instructions.js +101 -0
  220. package/mcp-server/dist/services/server-instructions.js.map +1 -0
  221. package/mcp-server/dist/services/sqlite.d.ts +235 -0
  222. package/mcp-server/dist/services/sqlite.d.ts.map +1 -0
  223. package/mcp-server/dist/services/sqlite.js +1185 -0
  224. package/mcp-server/dist/services/sqlite.js.map +1 -0
  225. package/mcp-server/dist/services/typesafe-bench.d.ts +99 -0
  226. package/mcp-server/dist/services/typesafe-bench.d.ts.map +1 -0
  227. package/mcp-server/dist/services/typesafe-bench.js +218 -0
  228. package/mcp-server/dist/services/typesafe-bench.js.map +1 -0
  229. package/mcp-server/dist/services/typesafe-config.d.ts +342 -0
  230. package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -0
  231. package/mcp-server/dist/services/typesafe-config.js +746 -0
  232. package/mcp-server/dist/services/typesafe-config.js.map +1 -0
  233. package/mcp-server/dist/services/typesafe.d.ts +213 -0
  234. package/mcp-server/dist/services/typesafe.d.ts.map +1 -0
  235. package/mcp-server/dist/services/typesafe.js +330 -0
  236. package/mcp-server/dist/services/typesafe.js.map +1 -0
  237. package/mcp-server/dist/services/vector-cache.d.ts +68 -0
  238. package/mcp-server/dist/services/vector-cache.d.ts.map +1 -0
  239. package/mcp-server/dist/services/vector-cache.js +271 -0
  240. package/mcp-server/dist/services/vector-cache.js.map +1 -0
  241. package/mcp-server/dist/services/whiteboard-geometry.d.ts +305 -0
  242. package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -0
  243. package/mcp-server/dist/services/whiteboard-geometry.js +666 -0
  244. package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -0
  245. package/mcp-server/dist/tools/agents.d.ts +212 -0
  246. package/mcp-server/dist/tools/agents.d.ts.map +1 -0
  247. package/mcp-server/dist/tools/agents.js +407 -0
  248. package/mcp-server/dist/tools/agents.js.map +1 -0
  249. package/mcp-server/dist/tools/bluesky.d.ts +39 -0
  250. package/mcp-server/dist/tools/bluesky.d.ts.map +1 -0
  251. package/mcp-server/dist/tools/bluesky.js +1144 -0
  252. package/mcp-server/dist/tools/bluesky.js.map +1 -0
  253. package/mcp-server/dist/tools/browser-advanced.d.ts +58 -0
  254. package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -0
  255. package/mcp-server/dist/tools/browser-advanced.js +106 -0
  256. package/mcp-server/dist/tools/browser-advanced.js.map +1 -0
  257. package/mcp-server/dist/tools/browser-batch.d.ts +99 -0
  258. package/mcp-server/dist/tools/browser-batch.d.ts.map +1 -0
  259. package/mcp-server/dist/tools/browser-batch.js +187 -0
  260. package/mcp-server/dist/tools/browser-batch.js.map +1 -0
  261. package/mcp-server/dist/tools/browser-cheatsheet.d.ts +21 -0
  262. package/mcp-server/dist/tools/browser-cheatsheet.d.ts.map +1 -0
  263. package/mcp-server/dist/tools/browser-cheatsheet.js +144 -0
  264. package/mcp-server/dist/tools/browser-cheatsheet.js.map +1 -0
  265. package/mcp-server/dist/tools/browser-interact.d.ts +239 -0
  266. package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -0
  267. package/mcp-server/dist/tools/browser-interact.js +300 -0
  268. package/mcp-server/dist/tools/browser-interact.js.map +1 -0
  269. package/mcp-server/dist/tools/browser-navigate.d.ts +90 -0
  270. package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -0
  271. package/mcp-server/dist/tools/browser-navigate.js +142 -0
  272. package/mcp-server/dist/tools/browser-navigate.js.map +1 -0
  273. package/mcp-server/dist/tools/browser-observe.d.ts +561 -0
  274. package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -0
  275. package/mcp-server/dist/tools/browser-observe.js +2009 -0
  276. package/mcp-server/dist/tools/browser-observe.js.map +1 -0
  277. package/mcp-server/dist/tools/browser.d.ts +34 -0
  278. package/mcp-server/dist/tools/browser.d.ts.map +1 -0
  279. package/mcp-server/dist/tools/browser.js +112 -0
  280. package/mcp-server/dist/tools/browser.js.map +1 -0
  281. package/mcp-server/dist/tools/card-tools.d.ts +82 -0
  282. package/mcp-server/dist/tools/card-tools.d.ts.map +1 -0
  283. package/mcp-server/dist/tools/card-tools.js +137 -0
  284. package/mcp-server/dist/tools/card-tools.js.map +1 -0
  285. package/mcp-server/dist/tools/card.d.ts +8 -0
  286. package/mcp-server/dist/tools/card.d.ts.map +1 -0
  287. package/mcp-server/dist/tools/card.js +16 -0
  288. package/mcp-server/dist/tools/card.js.map +1 -0
  289. package/mcp-server/dist/tools/category.d.ts +32 -0
  290. package/mcp-server/dist/tools/category.d.ts.map +1 -0
  291. package/mcp-server/dist/tools/category.js +290 -0
  292. package/mcp-server/dist/tools/category.js.map +1 -0
  293. package/mcp-server/dist/tools/choice.d.ts +160 -0
  294. package/mcp-server/dist/tools/choice.d.ts.map +1 -0
  295. package/mcp-server/dist/tools/choice.js +80 -0
  296. package/mcp-server/dist/tools/choice.js.map +1 -0
  297. package/mcp-server/dist/tools/computer.d.ts +71 -0
  298. package/mcp-server/dist/tools/computer.d.ts.map +1 -0
  299. package/mcp-server/dist/tools/computer.js +174 -0
  300. package/mcp-server/dist/tools/computer.js.map +1 -0
  301. package/mcp-server/dist/tools/discord-channel.d.ts +44 -0
  302. package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -0
  303. package/mcp-server/dist/tools/discord-channel.js +236 -0
  304. package/mcp-server/dist/tools/discord-channel.js.map +1 -0
  305. package/mcp-server/dist/tools/discord-guild.d.ts +20 -0
  306. package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -0
  307. package/mcp-server/dist/tools/discord-guild.js +138 -0
  308. package/mcp-server/dist/tools/discord-guild.js.map +1 -0
  309. package/mcp-server/dist/tools/discord-member.d.ts +26 -0
  310. package/mcp-server/dist/tools/discord-member.d.ts.map +1 -0
  311. package/mcp-server/dist/tools/discord-member.js +122 -0
  312. package/mcp-server/dist/tools/discord-member.js.map +1 -0
  313. package/mcp-server/dist/tools/discord-message.d.ts +36 -0
  314. package/mcp-server/dist/tools/discord-message.d.ts.map +1 -0
  315. package/mcp-server/dist/tools/discord-message.js +184 -0
  316. package/mcp-server/dist/tools/discord-message.js.map +1 -0
  317. package/mcp-server/dist/tools/discord-onboarding.d.ts +32 -0
  318. package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -0
  319. package/mcp-server/dist/tools/discord-onboarding.js +179 -0
  320. package/mcp-server/dist/tools/discord-onboarding.js.map +1 -0
  321. package/mcp-server/dist/tools/discord-role.d.ts +34 -0
  322. package/mcp-server/dist/tools/discord-role.d.ts.map +1 -0
  323. package/mcp-server/dist/tools/discord-role.js +178 -0
  324. package/mcp-server/dist/tools/discord-role.js.map +1 -0
  325. package/mcp-server/dist/tools/discord-thread.d.ts +28 -0
  326. package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -0
  327. package/mcp-server/dist/tools/discord-thread.js +88 -0
  328. package/mcp-server/dist/tools/discord-thread.js.map +1 -0
  329. package/mcp-server/dist/tools/discord-webhook.d.ts +32 -0
  330. package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -0
  331. package/mcp-server/dist/tools/discord-webhook.js +154 -0
  332. package/mcp-server/dist/tools/discord-webhook.js.map +1 -0
  333. package/mcp-server/dist/tools/discord.d.ts +7 -0
  334. package/mcp-server/dist/tools/discord.d.ts.map +1 -0
  335. package/mcp-server/dist/tools/discord.js +25 -0
  336. package/mcp-server/dist/tools/discord.js.map +1 -0
  337. package/mcp-server/dist/tools/fb-groups.d.ts +98 -0
  338. package/mcp-server/dist/tools/fb-groups.d.ts.map +1 -0
  339. package/mcp-server/dist/tools/fb-groups.js +369 -0
  340. package/mcp-server/dist/tools/fb-groups.js.map +1 -0
  341. package/mcp-server/dist/tools/forget.d.ts +14 -0
  342. package/mcp-server/dist/tools/forget.d.ts.map +1 -0
  343. package/mcp-server/dist/tools/forget.js +26 -0
  344. package/mcp-server/dist/tools/forget.js.map +1 -0
  345. package/mcp-server/dist/tools/git-tools.d.ts +24 -0
  346. package/mcp-server/dist/tools/git-tools.d.ts.map +1 -0
  347. package/mcp-server/dist/tools/git-tools.js +107 -0
  348. package/mcp-server/dist/tools/git-tools.js.map +1 -0
  349. package/mcp-server/dist/tools/git.d.ts +7 -0
  350. package/mcp-server/dist/tools/git.d.ts.map +1 -0
  351. package/mcp-server/dist/tools/git.js +11 -0
  352. package/mcp-server/dist/tools/git.js.map +1 -0
  353. package/mcp-server/dist/tools/gsc/experience.d.ts +135 -0
  354. package/mcp-server/dist/tools/gsc/experience.d.ts.map +1 -0
  355. package/mcp-server/dist/tools/gsc/experience.js +351 -0
  356. package/mcp-server/dist/tools/gsc/experience.js.map +1 -0
  357. package/mcp-server/dist/tools/gsc/helpers.d.ts +78 -0
  358. package/mcp-server/dist/tools/gsc/helpers.d.ts.map +1 -0
  359. package/mcp-server/dist/tools/gsc/helpers.js +258 -0
  360. package/mcp-server/dist/tools/gsc/helpers.js.map +1 -0
  361. package/mcp-server/dist/tools/gsc/indexing.d.ts +121 -0
  362. package/mcp-server/dist/tools/gsc/indexing.d.ts.map +1 -0
  363. package/mcp-server/dist/tools/gsc/indexing.js +357 -0
  364. package/mcp-server/dist/tools/gsc/indexing.js.map +1 -0
  365. package/mcp-server/dist/tools/gsc/inspect.d.ts +78 -0
  366. package/mcp-server/dist/tools/gsc/inspect.d.ts.map +1 -0
  367. package/mcp-server/dist/tools/gsc/inspect.js +321 -0
  368. package/mcp-server/dist/tools/gsc/inspect.js.map +1 -0
  369. package/mcp-server/dist/tools/gsc/navigate.d.ts +44 -0
  370. package/mcp-server/dist/tools/gsc/navigate.d.ts.map +1 -0
  371. package/mcp-server/dist/tools/gsc/navigate.js +197 -0
  372. package/mcp-server/dist/tools/gsc/navigate.js.map +1 -0
  373. package/mcp-server/dist/tools/gsc/performance.d.ts +84 -0
  374. package/mcp-server/dist/tools/gsc/performance.d.ts.map +1 -0
  375. package/mcp-server/dist/tools/gsc/performance.js +274 -0
  376. package/mcp-server/dist/tools/gsc/performance.js.map +1 -0
  377. package/mcp-server/dist/tools/gsc/settings.d.ts +153 -0
  378. package/mcp-server/dist/tools/gsc/settings.d.ts.map +1 -0
  379. package/mcp-server/dist/tools/gsc/settings.js +425 -0
  380. package/mcp-server/dist/tools/gsc/settings.js.map +1 -0
  381. package/mcp-server/dist/tools/gsc.d.ts +7 -0
  382. package/mcp-server/dist/tools/gsc.d.ts.map +1 -0
  383. package/mcp-server/dist/tools/gsc.js +51 -0
  384. package/mcp-server/dist/tools/gsc.js.map +1 -0
  385. package/mcp-server/dist/tools/image-tools.d.ts +24 -0
  386. package/mcp-server/dist/tools/image-tools.d.ts.map +1 -0
  387. package/mcp-server/dist/tools/image-tools.js +80 -0
  388. package/mcp-server/dist/tools/image-tools.js.map +1 -0
  389. package/mcp-server/dist/tools/image.d.ts +10 -0
  390. package/mcp-server/dist/tools/image.d.ts.map +1 -0
  391. package/mcp-server/dist/tools/image.js +14 -0
  392. package/mcp-server/dist/tools/image.js.map +1 -0
  393. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +97 -0
  394. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -0
  395. package/mcp-server/dist/tools/leonardo-browser-tools.js +228 -0
  396. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -0
  397. package/mcp-server/dist/tools/leonardo.d.ts +13 -0
  398. package/mcp-server/dist/tools/leonardo.d.ts.map +1 -0
  399. package/mcp-server/dist/tools/leonardo.js +21 -0
  400. package/mcp-server/dist/tools/leonardo.js.map +1 -0
  401. package/mcp-server/dist/tools/loop.d.ts +30 -0
  402. package/mcp-server/dist/tools/loop.d.ts.map +1 -0
  403. package/mcp-server/dist/tools/loop.js +401 -0
  404. package/mcp-server/dist/tools/loop.js.map +1 -0
  405. package/mcp-server/dist/tools/memories.d.ts +56 -0
  406. package/mcp-server/dist/tools/memories.d.ts.map +1 -0
  407. package/mcp-server/dist/tools/memories.js +171 -0
  408. package/mcp-server/dist/tools/memories.js.map +1 -0
  409. package/mcp-server/dist/tools/morelogin.d.ts +24 -0
  410. package/mcp-server/dist/tools/morelogin.d.ts.map +1 -0
  411. package/mcp-server/dist/tools/morelogin.js +79 -0
  412. package/mcp-server/dist/tools/morelogin.js.map +1 -0
  413. package/mcp-server/dist/tools/profile.d.ts +17 -0
  414. package/mcp-server/dist/tools/profile.d.ts.map +1 -0
  415. package/mcp-server/dist/tools/profile.js +114 -0
  416. package/mcp-server/dist/tools/profile.js.map +1 -0
  417. package/mcp-server/dist/tools/recall.d.ts +71 -0
  418. package/mcp-server/dist/tools/recall.d.ts.map +1 -0
  419. package/mcp-server/dist/tools/recall.js +147 -0
  420. package/mcp-server/dist/tools/recall.js.map +1 -0
  421. package/mcp-server/dist/tools/reflect.d.ts +56 -0
  422. package/mcp-server/dist/tools/reflect.d.ts.map +1 -0
  423. package/mcp-server/dist/tools/reflect.js +157 -0
  424. package/mcp-server/dist/tools/reflect.js.map +1 -0
  425. package/mcp-server/dist/tools/remember.d.ts +62 -0
  426. package/mcp-server/dist/tools/remember.d.ts.map +1 -0
  427. package/mcp-server/dist/tools/remember.js +201 -0
  428. package/mcp-server/dist/tools/remember.js.map +1 -0
  429. package/mcp-server/dist/tools/response.d.ts +23 -0
  430. package/mcp-server/dist/tools/response.d.ts.map +1 -0
  431. package/mcp-server/dist/tools/response.js +24 -0
  432. package/mcp-server/dist/tools/response.js.map +1 -0
  433. package/mcp-server/dist/tools/restore.d.ts +14 -0
  434. package/mcp-server/dist/tools/restore.d.ts.map +1 -0
  435. package/mcp-server/dist/tools/restore.js +23 -0
  436. package/mcp-server/dist/tools/restore.js.map +1 -0
  437. package/mcp-server/dist/tools/style-guide-tools.d.ts +51 -0
  438. package/mcp-server/dist/tools/style-guide-tools.d.ts.map +1 -0
  439. package/mcp-server/dist/tools/style-guide-tools.js +231 -0
  440. package/mcp-server/dist/tools/style-guide-tools.js.map +1 -0
  441. package/mcp-server/dist/tools/style-guide.d.ts +8 -0
  442. package/mcp-server/dist/tools/style-guide.d.ts.map +1 -0
  443. package/mcp-server/dist/tools/style-guide.js +12 -0
  444. package/mcp-server/dist/tools/style-guide.js.map +1 -0
  445. package/mcp-server/dist/tools/sync.d.ts +20 -0
  446. package/mcp-server/dist/tools/sync.d.ts.map +1 -0
  447. package/mcp-server/dist/tools/sync.js +156 -0
  448. package/mcp-server/dist/tools/sync.js.map +1 -0
  449. package/mcp-server/dist/tools/tictactoe-tools.d.ts +18 -0
  450. package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -0
  451. package/mcp-server/dist/tools/tictactoe-tools.js +78 -0
  452. package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -0
  453. package/mcp-server/dist/tools/tictactoe.d.ts +7 -0
  454. package/mcp-server/dist/tools/tictactoe.d.ts.map +1 -0
  455. package/mcp-server/dist/tools/tictactoe.js +11 -0
  456. package/mcp-server/dist/tools/tictactoe.js.map +1 -0
  457. package/mcp-server/dist/tools/utils.d.ts +19 -0
  458. package/mcp-server/dist/tools/utils.d.ts.map +1 -0
  459. package/mcp-server/dist/tools/utils.js +54 -0
  460. package/mcp-server/dist/tools/utils.js.map +1 -0
  461. package/mcp-server/dist/tools/whiteboard-format.d.ts +88 -0
  462. package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -0
  463. package/mcp-server/dist/tools/whiteboard-format.js +337 -0
  464. package/mcp-server/dist/tools/whiteboard-format.js.map +1 -0
  465. package/mcp-server/dist/tools/whiteboard-tools.d.ts +326 -0
  466. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -0
  467. package/mcp-server/dist/tools/whiteboard-tools.js +222 -0
  468. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -0
  469. package/mcp-server/dist/tools/whiteboard.d.ts +8 -0
  470. package/mcp-server/dist/tools/whiteboard.d.ts.map +1 -0
  471. package/mcp-server/dist/tools/whiteboard.js +16 -0
  472. package/mcp-server/dist/tools/whiteboard.js.map +1 -0
  473. package/mcp-server/dist/tools/youtube/analytics.d.ts +46 -0
  474. package/mcp-server/dist/tools/youtube/analytics.d.ts.map +1 -0
  475. package/mcp-server/dist/tools/youtube/analytics.js +83 -0
  476. package/mcp-server/dist/tools/youtube/analytics.js.map +1 -0
  477. package/mcp-server/dist/tools/youtube/dedup.d.ts +35 -0
  478. package/mcp-server/dist/tools/youtube/dedup.d.ts.map +1 -0
  479. package/mcp-server/dist/tools/youtube/dedup.js +56 -0
  480. package/mcp-server/dist/tools/youtube/dedup.js.map +1 -0
  481. package/mcp-server/dist/tools/youtube/download.d.ts +31 -0
  482. package/mcp-server/dist/tools/youtube/download.d.ts.map +1 -0
  483. package/mcp-server/dist/tools/youtube/download.js +30 -0
  484. package/mcp-server/dist/tools/youtube/download.js.map +1 -0
  485. package/mcp-server/dist/tools/youtube/helpers.d.ts +66 -0
  486. package/mcp-server/dist/tools/youtube/helpers.d.ts.map +1 -0
  487. package/mcp-server/dist/tools/youtube/helpers.js +143 -0
  488. package/mcp-server/dist/tools/youtube/helpers.js.map +1 -0
  489. package/mcp-server/dist/tools/youtube/media.d.ts +43 -0
  490. package/mcp-server/dist/tools/youtube/media.d.ts.map +1 -0
  491. package/mcp-server/dist/tools/youtube/media.js +97 -0
  492. package/mcp-server/dist/tools/youtube/media.js.map +1 -0
  493. package/mcp-server/dist/tools/youtube/metadata.d.ts +33 -0
  494. package/mcp-server/dist/tools/youtube/metadata.d.ts.map +1 -0
  495. package/mcp-server/dist/tools/youtube/metadata.js +106 -0
  496. package/mcp-server/dist/tools/youtube/metadata.js.map +1 -0
  497. package/mcp-server/dist/tools/youtube/navigate.d.ts +30 -0
  498. package/mcp-server/dist/tools/youtube/navigate.d.ts.map +1 -0
  499. package/mcp-server/dist/tools/youtube/navigate.js +71 -0
  500. package/mcp-server/dist/tools/youtube/navigate.js.map +1 -0
  501. package/mcp-server/dist/tools/youtube/playlist.d.ts +29 -0
  502. package/mcp-server/dist/tools/youtube/playlist.d.ts.map +1 -0
  503. package/mcp-server/dist/tools/youtube/playlist.js +128 -0
  504. package/mcp-server/dist/tools/youtube/playlist.js.map +1 -0
  505. package/mcp-server/dist/tools/youtube/schedule.d.ts +31 -0
  506. package/mcp-server/dist/tools/youtube/schedule.d.ts.map +1 -0
  507. package/mcp-server/dist/tools/youtube/schedule.js +147 -0
  508. package/mcp-server/dist/tools/youtube/schedule.js.map +1 -0
  509. package/mcp-server/dist/tools/youtube/source.d.ts +36 -0
  510. package/mcp-server/dist/tools/youtube/source.d.ts.map +1 -0
  511. package/mcp-server/dist/tools/youtube/source.js +85 -0
  512. package/mcp-server/dist/tools/youtube/source.js.map +1 -0
  513. package/mcp-server/dist/tools/youtube/upload.d.ts +53 -0
  514. package/mcp-server/dist/tools/youtube/upload.d.ts.map +1 -0
  515. package/mcp-server/dist/tools/youtube/upload.js +255 -0
  516. package/mcp-server/dist/tools/youtube/upload.js.map +1 -0
  517. package/mcp-server/dist/tools/youtube.d.ts +12 -0
  518. package/mcp-server/dist/tools/youtube.d.ts.map +1 -0
  519. package/mcp-server/dist/tools/youtube.js +38 -0
  520. package/mcp-server/dist/tools/youtube.js.map +1 -0
  521. package/mcp-server/dist/tui.d.ts +3 -0
  522. package/mcp-server/dist/tui.d.ts.map +1 -0
  523. package/mcp-server/dist/tui.js +806 -0
  524. package/mcp-server/dist/tui.js.map +1 -0
  525. package/mcp-server/dist/types.d.ts +77 -0
  526. package/mcp-server/dist/types.d.ts.map +1 -0
  527. package/mcp-server/dist/types.js +2 -0
  528. package/mcp-server/dist/types.js.map +1 -0
  529. package/mcp-server/package-lock.json +4798 -0
  530. package/mcp-server/package.json +55 -38
  531. package/mcp-server/run.mjs +12 -2
  532. package/mcp-server/src/config.ts +48 -3
  533. package/mcp-server/src/http.ts +296 -93
  534. package/mcp-server/src/index.ts +546 -203
  535. package/mcp-server/src/preload-http.ts +19 -18
  536. package/mcp-server/src/preload.ts +19 -18
  537. package/mcp-server/src/scripts/setup-embeddings.ts +9 -0
  538. package/mcp-server/src/services/assistant-judgments.ts +157 -0
  539. package/mcp-server/src/services/browser-assist-gate.ts +383 -0
  540. package/mcp-server/src/services/browser-assist.ts +267 -0
  541. package/mcp-server/src/services/browser-bench.ts +477 -0
  542. package/mcp-server/src/services/browser-judgments.ts +414 -0
  543. package/mcp-server/src/services/browser-risk.ts +484 -0
  544. package/mcp-server/src/services/categories.ts +36 -19
  545. package/mcp-server/src/services/codex-config-heal.ts +403 -0
  546. package/mcp-server/src/services/desktop-assist-gate.ts +251 -0
  547. package/mcp-server/src/services/desktop-assist.ts +308 -0
  548. package/mcp-server/src/services/desktop-bench.ts +372 -0
  549. package/mcp-server/src/services/desktop-client.ts +76 -0
  550. package/mcp-server/src/services/desktop-judgments.ts +218 -0
  551. package/mcp-server/src/services/desktop-risk.ts +743 -0
  552. package/mcp-server/src/services/edit-stale.ts +299 -0
  553. package/mcp-server/src/services/embedding-service.ts +108 -0
  554. package/mcp-server/src/services/embedding-worker.ts +46 -0
  555. package/mcp-server/src/services/fb-regions.ts +221 -0
  556. package/mcp-server/src/services/file-checksums.ts +26 -9
  557. package/mcp-server/src/services/file-excerpt.ts +59 -0
  558. package/mcp-server/src/services/identity.ts +291 -0
  559. package/mcp-server/src/services/local-embeddings.ts +2 -77
  560. package/mcp-server/src/services/memory-client.ts +23 -0
  561. package/mcp-server/src/services/memory-judge-backfill.ts +462 -0
  562. package/mcp-server/src/services/memory-judgments.ts +901 -0
  563. package/mcp-server/src/services/memory-maintenance.ts +360 -0
  564. package/mcp-server/src/services/memory-retrieval.ts +349 -0
  565. package/mcp-server/src/services/memory-schema.ts +280 -0
  566. package/mcp-server/src/services/memory-sessions.ts +87 -0
  567. package/mcp-server/src/services/memory-triage.ts +182 -0
  568. package/mcp-server/src/services/memory-verification.ts +68 -0
  569. package/mcp-server/src/services/memory-writer.ts +125 -0
  570. package/mcp-server/src/services/neural-interface.ts +1217 -73
  571. package/mcp-server/src/services/profiles.ts +428 -0
  572. package/mcp-server/src/services/secret-gate.ts +52 -0
  573. package/mcp-server/src/services/server-instructions.ts +122 -0
  574. package/mcp-server/src/services/sqlite.ts +1456 -823
  575. package/mcp-server/src/services/typesafe-bench.ts +247 -0
  576. package/mcp-server/src/services/typesafe-config.ts +790 -0
  577. package/mcp-server/src/services/typesafe.ts +390 -0
  578. package/mcp-server/src/services/vector-cache.ts +255 -0
  579. package/mcp-server/src/services/whiteboard-geometry.ts +711 -0
  580. package/mcp-server/src/tools/agents.ts +539 -0
  581. package/mcp-server/src/tools/bluesky.ts +1186 -0
  582. package/mcp-server/src/tools/browser-advanced.ts +15 -6
  583. package/mcp-server/src/tools/browser-batch.ts +178 -0
  584. package/mcp-server/src/tools/browser-cheatsheet.ts +155 -0
  585. package/mcp-server/src/tools/browser-interact.ts +362 -255
  586. package/mcp-server/src/tools/browser-navigate.ts +164 -77
  587. package/mcp-server/src/tools/browser-observe.ts +2222 -1330
  588. package/mcp-server/src/tools/browser.ts +181 -107
  589. package/mcp-server/src/tools/card.ts +7 -5
  590. package/mcp-server/src/tools/choice.ts +103 -0
  591. package/mcp-server/src/tools/computer.ts +190 -0
  592. package/mcp-server/src/tools/discord.ts +10 -23
  593. package/mcp-server/src/tools/fb-groups.ts +387 -0
  594. package/mcp-server/src/tools/forget.ts +1 -1
  595. package/mcp-server/src/tools/git.ts +3 -1
  596. package/mcp-server/src/tools/gsc/experience.ts +440 -0
  597. package/mcp-server/src/tools/gsc/helpers.ts +288 -0
  598. package/mcp-server/src/tools/gsc/indexing.ts +495 -0
  599. package/mcp-server/src/tools/gsc/inspect.ts +391 -0
  600. package/mcp-server/src/tools/gsc/navigate.ts +236 -0
  601. package/mcp-server/src/tools/gsc/performance.ts +352 -0
  602. package/mcp-server/src/tools/gsc/settings.ts +564 -0
  603. package/mcp-server/src/tools/gsc.ts +95 -0
  604. package/mcp-server/src/tools/image.ts +3 -1
  605. package/mcp-server/src/tools/leonardo-browser-tools.ts +47 -37
  606. package/mcp-server/src/tools/leonardo.ts +7 -5
  607. package/mcp-server/src/tools/loop.ts +118 -25
  608. package/mcp-server/src/tools/memories.ts +65 -5
  609. package/mcp-server/src/tools/morelogin.ts +81 -0
  610. package/mcp-server/src/tools/profile.ts +122 -0
  611. package/mcp-server/src/tools/recall.ts +105 -261
  612. package/mcp-server/src/tools/reflect.ts +171 -145
  613. package/mcp-server/src/tools/remember.ts +223 -115
  614. package/mcp-server/src/tools/style-guide-tools.ts +250 -0
  615. package/mcp-server/src/tools/style-guide.ts +16 -0
  616. package/mcp-server/src/tools/sync.ts +66 -9
  617. package/mcp-server/src/tools/tictactoe.ts +3 -1
  618. package/mcp-server/src/tools/utils.ts +22 -0
  619. package/mcp-server/src/tools/whiteboard-format.ts +394 -0
  620. package/mcp-server/src/tools/whiteboard-tools.ts +191 -183
  621. package/mcp-server/src/tools/whiteboard.ts +7 -5
  622. package/mcp-server/src/tools/youtube/analytics.ts +106 -0
  623. package/mcp-server/src/tools/youtube/dedup.ts +57 -0
  624. package/mcp-server/src/tools/youtube/download.ts +41 -0
  625. package/mcp-server/src/tools/youtube/helpers.ts +183 -0
  626. package/mcp-server/src/tools/youtube/media.ts +109 -0
  627. package/mcp-server/src/tools/youtube/metadata.ts +112 -0
  628. package/mcp-server/src/tools/youtube/navigate.ts +81 -0
  629. package/mcp-server/src/tools/youtube/playlist.ts +134 -0
  630. package/mcp-server/src/tools/youtube/schedule.ts +158 -0
  631. package/mcp-server/src/tools/youtube/source.ts +101 -0
  632. package/mcp-server/src/tools/youtube/upload.ts +296 -0
  633. package/mcp-server/src/tools/youtube.ts +47 -0
  634. package/mcp-server/src/tui.ts +8 -9
  635. package/neural-interface/games/TicTacToe/1.svg +1 -0
  636. package/neural-interface/games/TicTacToe/2.svg +1 -0
  637. package/neural-interface/games/TicTacToe/3.svg +1 -0
  638. package/neural-interface/games/TicTacToe/4.svg +1 -0
  639. package/neural-interface/games/TicTacToe/5.svg +1 -0
  640. package/neural-interface/games/TicTacToe/6.svg +1 -0
  641. package/neural-interface/games/TicTacToe/7.svg +1 -0
  642. package/neural-interface/games/TicTacToe/8.svg +1 -0
  643. package/neural-interface/games/TicTacToe/9.svg +1 -0
  644. package/neural-interface/games/TicTacToe/Board.svg +1 -0
  645. package/neural-interface/games/TicTacToe/Circle.svg +1 -0
  646. package/neural-interface/games/TicTacToe/Cross.svg +1 -0
  647. package/neural-interface/i18n/en.json +6983 -0
  648. package/neural-interface/i18n/pt-BR.json +6987 -0
  649. package/neural-interface/lib/assistant-api.js +1005 -0
  650. package/neural-interface/lib/assistant-attachments.js +121 -0
  651. package/neural-interface/lib/assistant-brains/claude.js +207 -0
  652. package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +43 -0
  653. package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +56 -0
  654. package/neural-interface/lib/assistant-brains/codex.js +213 -0
  655. package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +47 -0
  656. package/neural-interface/lib/assistant-brains/opencode-route-gate.js +62 -0
  657. package/neural-interface/lib/assistant-brains/opencode.js +320 -0
  658. package/neural-interface/lib/assistant-budget.js +318 -0
  659. package/neural-interface/lib/assistant-catalog.js +731 -0
  660. package/neural-interface/lib/assistant-clarify.js +664 -0
  661. package/neural-interface/lib/assistant-config.js +232 -0
  662. package/neural-interface/lib/assistant-dispatch.js +2744 -0
  663. package/neural-interface/lib/assistant-envelope.js +579 -0
  664. package/neural-interface/lib/assistant-evidence.js +236 -0
  665. package/neural-interface/lib/assistant-hidden-models.js +272 -0
  666. package/neural-interface/lib/assistant-jev.js +117 -0
  667. package/neural-interface/lib/assistant-judgments.js +111 -0
  668. package/neural-interface/lib/assistant-media.js +335 -0
  669. package/neural-interface/lib/assistant-memory.js +398 -0
  670. package/neural-interface/lib/assistant-persona.js +444 -0
  671. package/neural-interface/lib/assistant-plan-permissions.js +448 -0
  672. package/neural-interface/lib/assistant-playbooks/design.md +87 -0
  673. package/neural-interface/lib/assistant-playbooks.js +72 -0
  674. package/neural-interface/lib/assistant-pricing.js +159 -0
  675. package/neural-interface/lib/assistant-route-gate-codex.js +163 -0
  676. package/neural-interface/lib/assistant-route-gate.js +212 -0
  677. package/neural-interface/lib/assistant-router.js +1324 -0
  678. package/neural-interface/lib/assistant-runtime.js +3337 -0
  679. package/neural-interface/lib/assistant-task-prompt.js +472 -0
  680. package/neural-interface/lib/assistant-usage.js +1688 -0
  681. package/neural-interface/lib/augmented-path.js +50 -0
  682. package/neural-interface/lib/automation-storage-migration.js +54 -0
  683. package/neural-interface/lib/backup-service.js +851 -0
  684. package/neural-interface/lib/backup-zip-reader.js +262 -0
  685. package/neural-interface/lib/browser-assist-api.js +41 -0
  686. package/neural-interface/lib/browser-console.js +176 -0
  687. package/neural-interface/lib/browser-execution.js +241 -0
  688. package/neural-interface/lib/browser-extraction.js +191 -0
  689. package/neural-interface/lib/browser-screenshot.js +399 -0
  690. package/neural-interface/lib/browser-semantic-context.js +639 -0
  691. package/neural-interface/lib/browser-snapshots.js +192 -0
  692. package/neural-interface/lib/browser-tab-recovery.js +119 -0
  693. package/neural-interface/lib/browser-targets.js +70 -0
  694. package/neural-interface/lib/browser-tool-policy.js +926 -0
  695. package/neural-interface/lib/claude-accounts.js +230 -0
  696. package/neural-interface/lib/claude-agent-bridge.js +3296 -0
  697. package/neural-interface/lib/claude-bypass-policy.js +99 -0
  698. package/neural-interface/lib/claude-history.js +429 -0
  699. package/neural-interface/lib/claude-model-catalog.js +483 -0
  700. package/neural-interface/lib/claude-panel-requests.js +165 -0
  701. package/neural-interface/lib/claude-panel-session.js +272 -0
  702. package/neural-interface/lib/claude-permission-rules.js +153 -0
  703. package/neural-interface/lib/claude-session-cleanup.js +71 -0
  704. package/neural-interface/lib/claude-session-list.js +82 -0
  705. package/neural-interface/lib/claude-session-ops.js +140 -0
  706. package/neural-interface/lib/claude-settings-view.js +51 -0
  707. package/neural-interface/lib/claude-skin-connect.js +79 -0
  708. package/neural-interface/lib/claude-stall-policy.js +7 -0
  709. package/neural-interface/lib/claude-temporary.js +435 -0
  710. package/neural-interface/lib/cli-update-planner.js +312 -0
  711. package/neural-interface/lib/codex-capabilities.d.ts +41 -0
  712. package/neural-interface/lib/codex-capabilities.js +148 -0
  713. package/neural-interface/lib/codex-collaboration-mode.js +17 -0
  714. package/neural-interface/lib/codex-compat-rpc.js +241 -0
  715. package/neural-interface/lib/codex-mcp-approvals.js +56 -0
  716. package/neural-interface/lib/codex-mcp-apps.js +47 -0
  717. package/neural-interface/lib/codex-model-context.js +202 -0
  718. package/neural-interface/lib/codex-plan-store.js +71 -0
  719. package/neural-interface/lib/codex-request-journal.js +242 -0
  720. package/neural-interface/lib/codex-runtime-path.js +213 -0
  721. package/neural-interface/lib/codex-session-catalog.js +231 -0
  722. package/neural-interface/lib/codex-session-settings.js +46 -0
  723. package/neural-interface/lib/codex-sidepanel-permissions.js +110 -0
  724. package/neural-interface/lib/codex-thread-history.js +165 -0
  725. package/neural-interface/lib/codex-user-verification.js +34 -0
  726. package/neural-interface/lib/codex-writer-lifecycle.js +152 -0
  727. package/neural-interface/lib/confined-fs.js +256 -0
  728. package/neural-interface/lib/db.js +922 -0
  729. package/neural-interface/lib/design-md.js +9 -0
  730. package/neural-interface/lib/desktop/api.js +92 -0
  731. package/neural-interface/lib/desktop/audit.js +62 -0
  732. package/neural-interface/lib/desktop/build.js +423 -0
  733. package/neural-interface/lib/desktop/config.js +606 -0
  734. package/neural-interface/lib/desktop/coords.js +76 -0
  735. package/neural-interface/lib/desktop/fake-helper.js +1192 -0
  736. package/neural-interface/lib/desktop/frames.js +77 -0
  737. package/neural-interface/lib/desktop/grants.js +84 -0
  738. package/neural-interface/lib/desktop/guards.js +170 -0
  739. package/neural-interface/lib/desktop/helper/SynabunDesktop.swift +3056 -0
  740. package/neural-interface/lib/desktop/lease.js +51 -0
  741. package/neural-interface/lib/desktop/manager.js +545 -0
  742. package/neural-interface/lib/desktop/press-contexts.js +103 -0
  743. package/neural-interface/lib/desktop/protocol.js +495 -0
  744. package/neural-interface/lib/desktop/service.js +1202 -0
  745. package/neural-interface/lib/effort-levels.js +148 -0
  746. package/neural-interface/lib/event-loop-monitor.js +67 -0
  747. package/neural-interface/lib/exec-loop-command.js +209 -0
  748. package/neural-interface/lib/folder-picker.ps1 +77 -0
  749. package/neural-interface/lib/http-guards.js +287 -0
  750. package/neural-interface/lib/jsonl-lines.js +94 -0
  751. package/neural-interface/lib/loop-logger.js +127 -0
  752. package/neural-interface/lib/mcp-client-config.js +133 -0
  753. package/neural-interface/lib/mcp-installer.js +487 -0
  754. package/neural-interface/lib/mcp-profile-refresh-coordinator.js +78 -0
  755. package/neural-interface/lib/mcp-profile-servers.js +120 -0
  756. package/neural-interface/lib/memo-cache.js +84 -0
  757. package/neural-interface/lib/memory-api.js +758 -0
  758. package/neural-interface/lib/memory-map-api.js +1150 -0
  759. package/neural-interface/lib/memory-map-layout.js +872 -0
  760. package/neural-interface/lib/memory-map-worker.js +165 -0
  761. package/neural-interface/lib/memory-session-capture.js +81 -0
  762. package/neural-interface/lib/memory-timers.js +62 -0
  763. package/neural-interface/lib/morelogin.js +301 -0
  764. package/neural-interface/lib/native-binary-runtime.js +650 -0
  765. package/neural-interface/lib/native-loop-goal.js +33 -0
  766. package/neural-interface/lib/native-loop-providers.js +1016 -0
  767. package/neural-interface/lib/native-loop-runtime.js +747 -0
  768. package/neural-interface/lib/opencode-hidden-models.js +113 -0
  769. package/neural-interface/lib/opencode-history.js +253 -0
  770. package/neural-interface/lib/opencode-runtime-config.js +58 -0
  771. package/neural-interface/lib/opencode-v2-client.js +486 -0
  772. package/neural-interface/lib/opencode-v2-ws-requests.js +955 -0
  773. package/neural-interface/lib/path-confine.js +213 -0
  774. package/neural-interface/lib/plugin-installer.js +264 -0
  775. package/neural-interface/lib/project-storage.js +766 -0
  776. package/neural-interface/lib/pty-host/core.js +603 -0
  777. package/neural-interface/lib/pty-host/flow.js +43 -0
  778. package/neural-interface/lib/pty-host/host.js +47 -0
  779. package/neural-interface/lib/pty-host/manager.js +360 -0
  780. package/neural-interface/lib/pty-host/protocol.js +81 -0
  781. package/neural-interface/lib/pty-host/snapshot.js +133 -0
  782. package/neural-interface/lib/remote-policy.js +582 -0
  783. package/neural-interface/lib/rulesets/api.js +175 -0
  784. package/neural-interface/lib/rulesets/fs-safe.js +245 -0
  785. package/neural-interface/lib/rulesets/installer.js +1453 -0
  786. package/neural-interface/lib/rulesets/json-edit.js +186 -0
  787. package/neural-interface/lib/rulesets/lock.js +170 -0
  788. package/neural-interface/lib/rulesets/managed-text.js +314 -0
  789. package/neural-interface/lib/rulesets/normalise.js +24 -0
  790. package/neural-interface/lib/rulesets/render.js +84 -0
  791. package/neural-interface/lib/schedule-launch-intent.js +40 -0
  792. package/neural-interface/lib/session-cache-builder.js +524 -0
  793. package/neural-interface/lib/session-chunker.js +344 -0
  794. package/neural-interface/lib/session-indexer.js +327 -0
  795. package/neural-interface/lib/session-title-generator.js +227 -0
  796. package/neural-interface/lib/skill-prompt-bridge.js +11 -0
  797. package/neural-interface/lib/style-guide/api.js +375 -0
  798. package/neural-interface/lib/style-guide/color.js +352 -0
  799. package/neural-interface/lib/style-guide/export-css.js +99 -0
  800. package/neural-interface/lib/style-guide/export-dtcg.js +209 -0
  801. package/neural-interface/lib/style-guide/export-tailwind.js +102 -0
  802. package/neural-interface/lib/style-guide/fonts.json +227 -0
  803. package/neural-interface/lib/style-guide/import.js +1268 -0
  804. package/neural-interface/lib/style-guide/pointers.js +103 -0
  805. package/neural-interface/lib/style-guide/presets.js +232 -0
  806. package/neural-interface/lib/style-guide/render-design-md.js +319 -0
  807. package/neural-interface/lib/style-guide/schema.js +848 -0
  808. package/neural-interface/lib/style-guide/security.js +43 -0
  809. package/neural-interface/lib/style-guide/store.js +491 -0
  810. package/neural-interface/lib/style-guide/summary.js +106 -0
  811. package/neural-interface/lib/style-guide/tokens.js +170 -0
  812. package/neural-interface/lib/synabun-update-plan.js +305 -0
  813. package/neural-interface/lib/synabun-version.js +179 -0
  814. package/neural-interface/lib/system-restore.js +99 -0
  815. package/neural-interface/lib/terminal-env.js +86 -0
  816. package/neural-interface/lib/ui-blob-store.js +106 -0
  817. package/neural-interface/lib/vector-cache.js +2 -0
  818. package/neural-interface/lib/virtual-socket.js +60 -0
  819. package/neural-interface/lib/whatsapp/api.js +146 -0
  820. package/neural-interface/lib/whatsapp/auth-store.js +389 -0
  821. package/neural-interface/lib/whatsapp/baileys-adapter.js +457 -0
  822. package/neural-interface/lib/whatsapp/brain.js +128 -0
  823. package/neural-interface/lib/whatsapp/bridge.js +1499 -0
  824. package/neural-interface/lib/whatsapp/cards.js +519 -0
  825. package/neural-interface/lib/whatsapp/commands.js +92 -0
  826. package/neural-interface/lib/whatsapp/config.js +291 -0
  827. package/neural-interface/lib/whatsapp/connector/entry.mjs +25 -0
  828. package/neural-interface/lib/whatsapp/connector/manifest.json +6 -0
  829. package/neural-interface/lib/whatsapp/connector/npm-shrinkwrap.json +717 -0
  830. package/neural-interface/lib/whatsapp/connector/package.json +8 -0
  831. package/neural-interface/lib/whatsapp/fake-baileys.js +444 -0
  832. package/neural-interface/lib/whatsapp/format.js +552 -0
  833. package/neural-interface/lib/whatsapp/host-core.js +1225 -0
  834. package/neural-interface/lib/whatsapp/host.js +119 -0
  835. package/neural-interface/lib/whatsapp/identity.js +288 -0
  836. package/neural-interface/lib/whatsapp/inbound.js +149 -0
  837. package/neural-interface/lib/whatsapp/installer.js +562 -0
  838. package/neural-interface/lib/whatsapp/manager.js +638 -0
  839. package/neural-interface/lib/whatsapp/paths.js +81 -0
  840. package/neural-interface/lib/whatsapp/protocol.js +327 -0
  841. package/neural-interface/lib/whatsapp/qr-svg.js +57 -0
  842. package/neural-interface/lib/whatsapp/redact.js +130 -0
  843. package/neural-interface/lib/whatsapp/service.js +1305 -0
  844. package/neural-interface/lib/whatsapp/vendor/qrcodegen.js +848 -0
  845. package/neural-interface/package-lock.json +4682 -0
  846. package/neural-interface/package.json +58 -27
  847. package/neural-interface/public/apple-touch-icon.png +0 -0
  848. package/neural-interface/public/category-logos/synabun.png +0 -0
  849. package/neural-interface/public/claude.svg +1 -0
  850. package/neural-interface/public/favicon-16x16.png +0 -0
  851. package/neural-interface/public/favicon-32x32.png +0 -0
  852. package/neural-interface/public/icon-192.png +0 -0
  853. package/neural-interface/public/icon-512.png +0 -0
  854. package/neural-interface/public/index.html +32 -182
  855. package/neural-interface/public/index2d.html +2 -2
  856. package/neural-interface/public/logo-synabun.png +0 -0
  857. package/neural-interface/public/logoHD.png +0 -0
  858. package/neural-interface/public/mcp.svg +4 -0
  859. package/neural-interface/public/offline.html +335 -299
  860. package/neural-interface/public/onboarding.html +692 -155
  861. package/neural-interface/public/opencode-logo-dark-square.svg +1 -0
  862. package/neural-interface/public/shared/agent-runtime-options.js +596 -0
  863. package/neural-interface/public/shared/api.js +339 -28
  864. package/neural-interface/public/shared/assistant/asst-accounts.js +318 -0
  865. package/neural-interface/public/shared/assistant/asst-agents-dock.js +296 -0
  866. package/neural-interface/public/shared/assistant/asst-api.js +270 -0
  867. package/neural-interface/public/shared/assistant/asst-brain-picker.js +744 -0
  868. package/neural-interface/public/shared/assistant/asst-budget.js +333 -0
  869. package/neural-interface/public/shared/assistant/asst-composer.js +656 -0
  870. package/neural-interface/public/shared/assistant/asst-computer.js +803 -0
  871. package/neural-interface/public/shared/assistant/asst-control.js +1018 -0
  872. package/neural-interface/public/shared/assistant/asst-hosts.js +262 -0
  873. package/neural-interface/public/shared/assistant/asst-mascot.js +311 -0
  874. package/neural-interface/public/shared/assistant/asst-menu.js +375 -0
  875. package/neural-interface/public/shared/assistant/asst-panel.js +1845 -0
  876. package/neural-interface/public/shared/assistant/asst-rack-styles.js +589 -0
  877. package/neural-interface/public/shared/assistant/asst-render.js +3296 -0
  878. package/neural-interface/public/shared/assistant/asst-route.js +1653 -0
  879. package/neural-interface/public/shared/assistant/asst-roving.js +75 -0
  880. package/neural-interface/public/shared/assistant/asst-sanitize.js +117 -0
  881. package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +488 -0
  882. package/neural-interface/public/shared/assistant/asst-sidepanel.js +675 -0
  883. package/neural-interface/public/shared/assistant/asst-slash.js +258 -0
  884. package/neural-interface/public/shared/assistant/asst-state.js +727 -0
  885. package/neural-interface/public/shared/assistant/asst-styles.js +1684 -0
  886. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +1017 -0
  887. package/neural-interface/public/shared/assistant/asst-usage.js +444 -0
  888. package/neural-interface/public/shared/assistant/asst-ws.js +175 -0
  889. package/neural-interface/public/shared/automation-context.js +75 -0
  890. package/neural-interface/public/shared/blob-store.js +99 -0
  891. package/neural-interface/public/shared/cdx/cdx-capabilities.js +118 -0
  892. package/neural-interface/public/shared/cdx/cdx-cards.js +37 -0
  893. package/neural-interface/public/shared/cdx/cdx-commands.js +171 -0
  894. package/neural-interface/public/shared/cdx/cdx-context-menu.js +402 -0
  895. package/neural-interface/public/shared/cdx/cdx-context-model.js +220 -0
  896. package/neural-interface/public/shared/cdx/cdx-features.js +408 -0
  897. package/neural-interface/public/shared/cdx/cdx-icons.js +89 -0
  898. package/neural-interface/public/shared/cdx/cdx-mcp-app-host.js +414 -0
  899. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.html +6 -0
  900. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.js +56 -0
  901. package/neural-interface/public/shared/cdx/cdx-mcp-app.js +178 -0
  902. package/neural-interface/public/shared/cdx/cdx-model-catalog.js +120 -0
  903. package/neural-interface/public/shared/cdx/cdx-output-model.js +261 -0
  904. package/neural-interface/public/shared/cdx/cdx-output.js +382 -0
  905. package/neural-interface/public/shared/cdx/cdx-panel.js +1372 -0
  906. package/neural-interface/public/shared/cdx/cdx-plan.js +266 -0
  907. package/neural-interface/public/shared/cdx/cdx-protocol.js +682 -0
  908. package/neural-interface/public/shared/cdx/cdx-render.js +3381 -0
  909. package/neural-interface/public/shared/cdx/cdx-requests.js +1136 -0
  910. package/neural-interface/public/shared/cdx/cdx-styles.js +3251 -0
  911. package/neural-interface/public/shared/cdx/cdx-tabs.js +7992 -0
  912. package/neural-interface/public/shared/cdx/cdx-ws.js +363 -0
  913. package/neural-interface/public/shared/cli-status.js +169 -0
  914. package/neural-interface/public/shared/constants.js +22 -5
  915. package/neural-interface/public/shared/cp/cp-agents.js +186 -0
  916. package/neural-interface/public/shared/cp/cp-bash.js +252 -0
  917. package/neural-interface/public/shared/cp/cp-compose.js +159 -0
  918. package/neural-interface/public/shared/cp/cp-context-menu.js +309 -0
  919. package/neural-interface/public/shared/cp/cp-context-model.js +157 -0
  920. package/neural-interface/public/shared/cp/cp-context-window.js +80 -0
  921. package/neural-interface/public/shared/cp/cp-ctx.js +11 -0
  922. package/neural-interface/public/shared/cp/cp-diff.js +255 -0
  923. package/neural-interface/public/shared/cp/cp-event-rows.js +637 -0
  924. package/neural-interface/public/shared/cp/cp-events.js +846 -0
  925. package/neural-interface/public/shared/cp/cp-markdown.js +104 -0
  926. package/neural-interface/public/shared/cp/cp-permission-model.js +905 -0
  927. package/neural-interface/public/shared/cp/cp-permissions.js +626 -0
  928. package/neural-interface/public/shared/cp/cp-rehydrate.js +113 -0
  929. package/neural-interface/public/shared/cp/cp-restore.js +224 -0
  930. package/neural-interface/public/shared/cp/cp-session-model.js +338 -0
  931. package/neural-interface/public/shared/cp/cp-session-settings.js +254 -0
  932. package/neural-interface/public/shared/cp/cp-sessions.js +227 -0
  933. package/neural-interface/public/shared/cp/cp-statusline.js +153 -0
  934. package/neural-interface/public/shared/cp/cp-styles.js +349 -0
  935. package/neural-interface/public/shared/cp/cp-tasks-model.js +282 -0
  936. package/neural-interface/public/shared/cp/cp-tasks.js +107 -0
  937. package/neural-interface/public/shared/cp/cp-temporary-view.js +56 -0
  938. package/neural-interface/public/shared/cp/cp-temporary.js +231 -0
  939. package/neural-interface/public/shared/cp/cp-tool-cards.js +326 -0
  940. package/neural-interface/public/shared/cp/cp-tool-results.js +618 -0
  941. package/neural-interface/public/shared/cp/cp-usage-model.js +124 -0
  942. package/neural-interface/public/shared/graph-activity.js +68 -0
  943. package/neural-interface/public/shared/html-shell.js +107 -12
  944. package/neural-interface/public/shared/i18n.js +132 -34
  945. package/neural-interface/public/shared/node-positions-store.js +44 -0
  946. package/neural-interface/public/shared/ocp-hidden-models.js +116 -0
  947. package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +355 -0
  948. package/neural-interface/public/shared/ocp-v2/ocp-v2-autoaccept-button.js +35 -0
  949. package/neural-interface/public/shared/ocp-v2/ocp-v2-automation-ownership.js +72 -0
  950. package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +280 -0
  951. package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +67 -0
  952. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +179 -0
  953. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes.js +164 -0
  954. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +725 -0
  955. package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +75 -0
  956. package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +1204 -0
  957. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm-logic.js +117 -0
  958. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm.js +59 -0
  959. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-gauge.js +252 -0
  960. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +478 -0
  961. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +179 -0
  962. package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +233 -0
  963. package/neural-interface/public/shared/ocp-v2/ocp-v2-icons.js +30 -0
  964. package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +1065 -0
  965. package/neural-interface/public/shared/ocp-v2/ocp-v2-mention-hints.js +182 -0
  966. package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +655 -0
  967. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +2636 -0
  968. package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +601 -0
  969. package/neural-interface/public/shared/ocp-v2/ocp-v2-profile-inheritance.js +78 -0
  970. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +649 -0
  971. package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +35 -0
  972. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +357 -0
  973. package/neural-interface/public/shared/ocp-v2/ocp-v2-render-logic.js +189 -0
  974. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +1869 -0
  975. package/neural-interface/public/shared/ocp-v2/ocp-v2-select.js +42 -0
  976. package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +117 -0
  977. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +1714 -0
  978. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +468 -0
  979. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-widgets.js +63 -0
  980. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +366 -0
  981. package/neural-interface/public/shared/ocp-v2/ocp-v2-settings-link.js +19 -0
  982. package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +343 -0
  983. package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +746 -0
  984. package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +347 -0
  985. package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +338 -0
  986. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +3543 -0
  987. package/neural-interface/public/shared/ocp-v2/ocp-v2-subagents-logic.js +482 -0
  988. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools-logic.js +351 -0
  989. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools.js +168 -0
  990. package/neural-interface/public/shared/ocp-v2/ocp-v2-variantpicker.js +315 -0
  991. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +545 -0
  992. package/neural-interface/public/shared/provider-icons.js +30 -0
  993. package/neural-interface/public/shared/session-title.js +100 -0
  994. package/neural-interface/public/shared/settings/settings-ia.js +389 -0
  995. package/neural-interface/public/shared/settings/settings-kit.js +234 -0
  996. package/neural-interface/public/shared/settings/settings-search.js +463 -0
  997. package/neural-interface/public/shared/settings/settings-shell.js +570 -0
  998. package/neural-interface/public/shared/state.js +5 -0
  999. package/neural-interface/public/shared/storage.js +50 -7
  1000. package/neural-interface/public/shared/styleguide/sg-agents.js +42 -0
  1001. package/neural-interface/public/shared/styleguide/sg-brand.js +4 -0
  1002. package/neural-interface/public/shared/styleguide/sg-color-client.js +388 -0
  1003. package/neural-interface/public/shared/styleguide/sg-colors.js +148 -0
  1004. package/neural-interface/public/shared/styleguide/sg-components.js +35 -0
  1005. package/neural-interface/public/shared/styleguide/sg-history.js +41 -0
  1006. package/neural-interface/public/shared/styleguide/sg-icons-logo.js +38 -0
  1007. package/neural-interface/public/shared/styleguide/sg-imagery.js +4 -0
  1008. package/neural-interface/public/shared/styleguide/sg-import-export.js +47 -0
  1009. package/neural-interface/public/shared/styleguide/sg-kit.js +281 -0
  1010. package/neural-interface/public/shared/styleguide/sg-labels.js +318 -0
  1011. package/neural-interface/public/shared/styleguide/sg-layout.js +4 -0
  1012. package/neural-interface/public/shared/styleguide/sg-motion.js +5 -0
  1013. package/neural-interface/public/shared/styleguide/sg-panel.js +229 -0
  1014. package/neural-interface/public/shared/styleguide/sg-preview.js +138 -0
  1015. package/neural-interface/public/shared/styleguide/sg-rules.js +9 -0
  1016. package/neural-interface/public/shared/styleguide/sg-shape.js +24 -0
  1017. package/neural-interface/public/shared/styleguide/sg-state.js +132 -0
  1018. package/neural-interface/public/shared/styleguide/sg-typography.js +124 -0
  1019. package/neural-interface/public/shared/styles.css +7883 -1155
  1020. package/neural-interface/public/shared/synabun-mascot.js +1625 -0
  1021. package/neural-interface/public/shared/synabun-ticker.js +376 -0
  1022. package/neural-interface/public/shared/term-renderer.js +343 -0
  1023. package/neural-interface/public/shared/ui-assistant-panel.js +10 -0
  1024. package/neural-interface/public/shared/ui-assistant.js +77 -0
  1025. package/neural-interface/public/shared/ui-automation-studio.js +5105 -3573
  1026. package/neural-interface/public/shared/ui-claude-panel.js +11685 -6333
  1027. package/neural-interface/public/shared/ui-codex-panel.js +12 -0
  1028. package/neural-interface/public/shared/ui-cost-widget.js +55 -34
  1029. package/neural-interface/public/shared/ui-detail.js +77 -14
  1030. package/neural-interface/public/shared/ui-explorer.js +360 -181
  1031. package/neural-interface/public/shared/ui-file-explorer.js +485 -107
  1032. package/neural-interface/public/shared/ui-help.js +2 -2
  1033. package/neural-interface/public/shared/ui-image-gallery.js +45 -21
  1034. package/neural-interface/public/shared/ui-judgments.js +1346 -0
  1035. package/neural-interface/public/shared/ui-keybinds.js +3 -2
  1036. package/neural-interface/public/shared/ui-link.js +105 -51
  1037. package/neural-interface/public/shared/ui-loading.js +4 -4
  1038. package/neural-interface/public/shared/ui-memory-maintenance.js +111 -0
  1039. package/neural-interface/public/shared/ui-menubar.js +89 -4
  1040. package/neural-interface/public/shared/ui-native-loop-router-state.js +94 -0
  1041. package/neural-interface/public/shared/ui-native-loop-router.js +493 -0
  1042. package/neural-interface/public/shared/ui-native-window-id.js +7 -0
  1043. package/neural-interface/public/shared/ui-navbar.js +357 -222
  1044. package/neural-interface/public/shared/ui-notifications.js +58 -12
  1045. package/neural-interface/public/shared/ui-opencode-panel-v2.js +17 -0
  1046. package/neural-interface/public/shared/ui-panels.js +15 -7
  1047. package/neural-interface/public/shared/ui-resume.js +823 -653
  1048. package/neural-interface/public/shared/ui-schedule-queue.js +172 -0
  1049. package/neural-interface/public/shared/ui-schedules-studio.js +1882 -0
  1050. package/neural-interface/public/shared/ui-scroll-follow.js +194 -0
  1051. package/neural-interface/public/shared/ui-sessions.js +789 -34
  1052. package/neural-interface/public/shared/ui-settings.js +5793 -2190
  1053. package/neural-interface/public/shared/ui-sidepanel-layout.js +109 -0
  1054. package/neural-interface/public/shared/ui-sidepanel-runtime.js +19 -0
  1055. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +40 -0
  1056. package/neural-interface/public/shared/ui-sidepanel-sessions.js +221 -0
  1057. package/neural-interface/public/shared/ui-sidepanel-state.js +131 -0
  1058. package/neural-interface/public/shared/ui-sidepanel-tray.js +547 -0
  1059. package/neural-interface/public/shared/ui-sidepanel-windows.js +387 -0
  1060. package/neural-interface/public/shared/ui-skills.js +18 -32
  1061. package/neural-interface/public/shared/ui-styleguide.js +35 -0
  1062. package/neural-interface/public/shared/ui-sync.js +87 -0
  1063. package/neural-interface/public/shared/ui-terminal.js +7877 -6385
  1064. package/neural-interface/public/shared/ui-tool-updates.js +292 -0
  1065. package/neural-interface/public/shared/ui-tooltip.js +156 -15
  1066. package/neural-interface/public/shared/ui-tutorial-draw.js +119 -683
  1067. package/neural-interface/public/shared/ui-tutorial-layout.js +135 -0
  1068. package/neural-interface/public/shared/ui-tutorial-steps.js +59 -2209
  1069. package/neural-interface/public/shared/ui-tutorial.css +102 -0
  1070. package/neural-interface/public/shared/ui-tutorial.js +557 -1076
  1071. package/neural-interface/public/shared/ui-update.js +420 -68
  1072. package/neural-interface/public/shared/ui-whatsapp.js +941 -0
  1073. package/neural-interface/public/shared/ui-whiteboard.js +1076 -233
  1074. package/neural-interface/public/shared/ui-workspaces.js +2 -1
  1075. package/neural-interface/public/shared/utils.js +58 -0
  1076. package/neural-interface/public/shared/vterm-buffer.js +15 -5
  1077. package/neural-interface/public/shared/whatsapp/wa-phone.js +65 -0
  1078. package/neural-interface/public/shared/whatsapp/wa-view.js +411 -0
  1079. package/neural-interface/public/sidepanel-session.html +18 -0
  1080. package/neural-interface/public/sw.js +8 -2
  1081. package/neural-interface/public/synabun.png +0 -0
  1082. package/neural-interface/public/variant/2d/graph.js +1707 -1635
  1083. package/neural-interface/public/variant/2d/lasso.js +2 -1
  1084. package/neural-interface/public/variant/2d/layout.js +595 -594
  1085. package/neural-interface/public/variant/2d/main.js +556 -521
  1086. package/neural-interface/public/variant/2d/settings-gfx.js +18 -24
  1087. package/neural-interface/public/variant/3d/main.js +516 -500
  1088. package/neural-interface/public/variant/3d/map-controls.js +144 -0
  1089. package/neural-interface/public/variant/3d/map-data.js +251 -0
  1090. package/neural-interface/public/variant/3d/map-labels.js +241 -0
  1091. package/neural-interface/public/variant/3d/map-pick.js +90 -0
  1092. package/neural-interface/public/variant/3d/map-renderer.js +521 -0
  1093. package/neural-interface/public/variant/3d/map-shaders.js +158 -0
  1094. package/neural-interface/public/variant/3d/map-view.js +618 -0
  1095. package/neural-interface/public/vendor/three/manifest.json +3 -0
  1096. package/neural-interface/public/vendor/three/three-0.169.0.min.js +3844 -0
  1097. package/neural-interface/public/vendor/xterm/manifest.json +3 -0
  1098. package/neural-interface/public/vendor/xterm/xterm-6.0.0.css +285 -0
  1099. package/neural-interface/public/vendor/xterm/xterm-6.0.0.min.js +192 -0
  1100. package/neural-interface/scripts/build-vendor.mjs +64 -0
  1101. package/neural-interface/scripts/codex-protocol-fixture.mjs +83 -0
  1102. package/neural-interface/scripts/rebuild-pty.js +37 -23
  1103. package/neural-interface/scripts/vendor-three-entry.js +24 -0
  1104. package/neural-interface/scripts/vendor-xterm-entry.js +8 -0
  1105. package/neural-interface/server.js +33948 -15000
  1106. package/neural-interface/skins/default/skin.css +90 -0
  1107. package/neural-interface/skins/default/skin.json +8 -0
  1108. package/neural-interface/templates/rulesets/README.md +9 -0
  1109. package/neural-interface/templates/rulesets/claude.md +3 -0
  1110. package/neural-interface/templates/rulesets/codex.md +2 -0
  1111. package/neural-interface/templates/rulesets/coexistence.md +6 -0
  1112. package/neural-interface/templates/rulesets/core.md +26 -0
  1113. package/neural-interface/templates/rulesets/cursor.md +2 -0
  1114. package/neural-interface/templates/rulesets/gemini.md +2 -0
  1115. package/neural-interface/templates/rulesets/legacy-hashes.json +227 -0
  1116. package/neural-interface/templates/rulesets/manifest.json +12 -0
  1117. package/neural-interface/templates/rulesets/opencode.md +2 -0
  1118. package/package.json +119 -53
  1119. package/postinstall.js +125 -26
  1120. package/preuninstall.js +187 -0
  1121. package/scripts/audit-claude-hook-usage.mjs +12 -0
  1122. package/scripts/audit-memory-duplicates.mjs +44 -0
  1123. package/scripts/measure-claude-hook-overhead.mjs +77 -0
  1124. package/scripts/recover-user-config.mjs +254 -0
  1125. package/scripts/restore-data-home-from-backup.mjs +239 -0
  1126. package/setup.js +804 -260
  1127. package/skills/leonardo/SKILL.md +19 -10
  1128. package/skills/leonardo/modules/image-prompter.md +18 -12
  1129. package/skills/leonardo/modules/video-prompter.md +19 -13
  1130. package/skills/synabun/SKILL.md +209 -185
  1131. package/skills/synabun/icon.png +0 -0
  1132. package/skills/synabun/modules/audit.md +380 -374
  1133. package/skills/synabun/modules/changelog.md +15 -6
  1134. package/skills/synabun/modules/idea.md +148 -144
  1135. package/skills/synabun/modules/memorize.md +13 -4
  1136. package/skills/synabun/modules/schedule.md +198 -0
  1137. package/skills/synabun/synabunicon.png +0 -0
  1138. package/updater.cmd +31 -0
  1139. package/updater.mjs +382 -0
  1140. package/updater.sh +29 -0
  1141. package/hooks/claude-code/test-user-learning.mjs +0 -531
  1142. package/neural-interface/public/claude-chat.css +0 -878
  1143. package/neural-interface/public/claude-chat.html +0 -92
  1144. package/neural-interface/public/claude-chat.js +0 -1168
  1145. package/neural-interface/public/index-legacy.html +0 -14677
  1146. package/neural-interface/public/index2d-legacy.html +0 -8193
  1147. package/neural-interface/public/shared/html-term-renderer.js +0 -1022
  1148. package/neural-interface/public/variant/3d/background.js +0 -884
  1149. package/neural-interface/public/variant/3d/camera.js +0 -661
  1150. package/neural-interface/public/variant/3d/gfx.js +0 -116
  1151. package/neural-interface/public/variant/3d/graph.js +0 -2399
  1152. package/neural-interface/public/variant/3d/settings-gfx.js +0 -228
  1153. package/neural-interface/templates/CLAUDE-template.md +0 -211
@@ -0,0 +1,746 @@
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
+ import { getDb } from './sqlite.js';
18
+ import { autoHealGate, readTargetBench, DEFAULT_BROWSER_ASSIST, BROWSER_TARGET_DEFAULTS } from './browser-assist-gate.js';
19
+ // 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.
20
+ import { desktopPressGate, readDesktopTargetBench, DEFAULT_DESKTOP_ASSIST, DESKTOP_TARGET_DEFAULTS } from './desktop-assist-gate.js';
21
+ // --- Surfaces ---
22
+ export const SURFACES = [
23
+ 'relations', 'importance-kind', 'historical-query', 'rerank', 'prompt-urgency', 'agent-message',
24
+ 'duplicate-gate', 'secret-gate', 'category-check', 'stale-check', 'brief-rank', 'turn-worth',
25
+ 'loop-goal', 'trash-triage',
26
+ 'browser-page-state', 'browser-target', 'browser-social',
27
+ 'task-boundary', 'session-lookup', 'user-learning', 'claim-check',
28
+ 'edit-stale', 'supersession', 'compact-digest', 'plan-conflict',
29
+ 'worker-outcome', 'worker-claim', 'desktop-target',
30
+ ];
31
+ /**
32
+ * Who asked. `live` is the historical catch-all: rows written before origins
33
+ * were split keep it, and the `live` log filter means every real-time origin
34
+ * (everything except backfill and bench) so saved filters keep working.
35
+ */
36
+ export const ORIGINS = ['live', 'hook', 'tool', 'maintenance', 'loop', 'ui', 'script', 'assistant', 'backfill', 'bench'];
37
+ /** What the Judgments tab shows beside each toggle. Fallbacks are the exact heuristics that run when a surface is off. */
38
+ export const SURFACE_META = {
39
+ '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' },
40
+ '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' },
41
+ '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' },
42
+ '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 },
43
+ '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 },
44
+ '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 },
45
+ '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' },
46
+ '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)' },
47
+ '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' },
48
+ 'stale-check': { label: 'Stale check', description: 'In sync, whether a memory still describes a file whose checksum changed.', fallback: 'checksum diff only' },
49
+ '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 },
50
+ '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 },
51
+ '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 },
52
+ 'trash-triage': { label: 'Trash triage', description: 'Ranks forget candidates by how little they would be missed.', fallback: 'importance ascending, age descending' },
53
+ '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' },
54
+ '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' },
55
+ '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' },
56
+ '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 },
57
+ '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 },
58
+ '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 },
59
+ '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 },
60
+ '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' },
61
+ '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' },
62
+ '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 },
63
+ '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 },
64
+ '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' },
65
+ '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' },
66
+ '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' },
67
+ };
68
+ const SURFACE_DEFAULTS = {
69
+ 'relations': { enabled: true, timeoutMs: 8000, minConfidence: 0.7 },
70
+ 'importance-kind': { enabled: true, timeoutMs: 8000, minConfidence: 0.6 },
71
+ 'historical-query': { enabled: true, timeoutMs: 1200 },
72
+ // 1.5 sits between Tangential (1) and Background (2): an injected memory has to help.
73
+ 'rerank': { enabled: true, timeoutMs: 1500, minScore: 1.5 },
74
+ 'prompt-urgency': { enabled: true, timeoutMs: 1200 },
75
+ 'agent-message': { enabled: true, timeoutMs: 1200 },
76
+ 'duplicate-gate': { enabled: true, timeoutMs: 1500, minConfidence: 0.85 },
77
+ 'secret-gate': { enabled: true, timeoutMs: 1500, minConfidence: 0.7 },
78
+ 'category-check': { enabled: true, timeoutMs: 2000, minConfidence: 0.6 },
79
+ 'stale-check': { enabled: true, timeoutMs: 3000, minConfidence: 0.6 },
80
+ 'brief-rank': { enabled: true, timeoutMs: 1500, minScore: 1.5 },
81
+ 'turn-worth': { enabled: true, timeoutMs: 1200, minConfidence: 0.35, bashOnlyMinProbability: 0.8 },
82
+ 'loop-goal': { enabled: true, timeoutMs: 3000, minConfidence: 0.8 },
83
+ 'trash-triage': { enabled: true, timeoutMs: 8000 },
84
+ 'browser-page-state': { enabled: true, timeoutMs: 1000, minConfidence: 0.65, minProbability: 0.8 },
85
+ 'browser-target': { ...BROWSER_TARGET_DEFAULTS },
86
+ 'browser-social': { enabled: true, timeoutMs: 1200, minConfidence: 0.75 },
87
+ // Riders share their lead's request; their timeout is the lead's.
88
+ 'task-boundary': { enabled: true, timeoutMs: 1200, minProbability: 0.6 },
89
+ 'session-lookup': { enabled: true, timeoutMs: 1200, minProbability: 0.7 },
90
+ 'user-learning': { enabled: true, timeoutMs: 1200, minProbability: 0.7 },
91
+ // Can block a Stop, so the bar is high.
92
+ 'claim-check': { enabled: true, timeoutMs: 1200, minProbability: 0.9 },
93
+ // P(still accurate) below minProbability is reported as stale.
94
+ 'edit-stale': { enabled: true, timeoutMs: 3000, minProbability: 0.4, maxItems: 3, debounceMs: 15000 },
95
+ // It hides the older memory from current-state recall, so the bar is very high.
96
+ 'supersession': { enabled: true, timeoutMs: 8000, minProbability: 0.9 },
97
+ 'compact-digest': { enabled: true, timeoutMs: 5000, minConfidence: 0.5, maxItems: 40 },
98
+ 'plan-conflict': { enabled: true, timeoutMs: 4000, minProbability: 0.75, maxItems: 6 },
99
+ // Off the brain's critical path: it runs where a worker turn or a result-retry turn would.
100
+ 'worker-outcome': { enabled: true, timeoutMs: 2500, minConfidence: 0.7 },
101
+ // Rider of worker-outcome. Flags a run for verification, so the bar is the claim-check bar.
102
+ 'worker-claim': { enabled: true, timeoutMs: 2500, minProbability: 0.9 },
103
+ 'desktop-target': { ...DESKTOP_TARGET_DEFAULTS },
104
+ };
105
+ // --- Config shape ---
106
+ /** docs.typesafe.ai/models, 2026-09-19: aliases plus the versioned id they resolve to. */
107
+ export const KNOWN_MODELS = ['jev-latest', 'jev-preview', 'jev-1.13.0'];
108
+ export const DEFAULT_MODEL = 'jev-latest';
109
+ export const DEFAULT_BASE_URL = 'https://api.typesafe.ai';
110
+ /** List price for jev-1.13.0, USD per million input tokens; output tokens are free. */
111
+ export const DEFAULT_COST_PER_MILLION_INPUT = 0.042;
112
+ export const DEFAULT_COST_PER_MILLION_OUTPUT = 0;
113
+ export const DEFAULT_BACKFILL_STATE = {
114
+ status: 'idle', startedAt: null, pausedAt: null, finishedAt: null, pausedReason: null,
115
+ limit: null, project: null, total: 0,
116
+ judged: 0, skipped: 0, failures: 0, consecutiveFailures: 0,
117
+ relationsCreated: { similar: 0, possible_conflict: 0, duplicate_of: 0 },
118
+ disagreements: { kind: 0, importance: 0 },
119
+ tokensIn: 0, tokensOut: 0, latencyMsTotal: 0,
120
+ lastError: null, lastErrorAt: null, estimate: null, report: null,
121
+ };
122
+ export const DEFAULT_TYPESAFE_CONFIG = {
123
+ version: 1,
124
+ enabled: true,
125
+ model: DEFAULT_MODEL,
126
+ baseUrl: null,
127
+ defaultTimeoutMs: 8000,
128
+ costPerMillionInput: DEFAULT_COST_PER_MILLION_INPUT,
129
+ costPerMillionOutput: DEFAULT_COST_PER_MILLION_OUTPUT,
130
+ applyJudgedImportance: false,
131
+ applyMinConfidence: 0.6,
132
+ backfillConcurrency: 3,
133
+ benchRunAt: null,
134
+ bench: {},
135
+ surfaces: SURFACE_DEFAULTS,
136
+ backfill: DEFAULT_BACKFILL_STATE,
137
+ browserAssist: DEFAULT_BROWSER_ASSIST,
138
+ desktopAssist: DEFAULT_DESKTOP_ASSIST,
139
+ updatedAt: null,
140
+ };
141
+ const CONFIG_KEY = 'typesafe_config';
142
+ const CONFIG_TTL_MS = 3000;
143
+ /** Per-surface limits beyond the two thresholds: [min, max, integer]. */
144
+ const SURFACE_LIMITS = {
145
+ minScore: [0, 4, false],
146
+ maxItems: [1, 50, true],
147
+ debounceMs: [0, 600000, true],
148
+ bashOnlyMinProbability: [0, 1, false],
149
+ };
150
+ const SURFACE_LIMIT_KEYS = Object.keys(SURFACE_LIMITS);
151
+ const clone = (value) => JSON.parse(JSON.stringify(value));
152
+ const isObject = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
153
+ /** Layer a stored/partial config over the defaults. Unknown surfaces are ignored; missing ones keep their defaults. */
154
+ export function mergeTypeSafeConfig(base, patch) {
155
+ const next = clone(base);
156
+ if (!isObject(patch))
157
+ return next;
158
+ const p = patch;
159
+ if (typeof p.enabled === 'boolean')
160
+ next.enabled = p.enabled;
161
+ if (typeof p.model === 'string' && p.model.trim())
162
+ next.model = p.model.trim();
163
+ if (p.baseUrl === null || typeof p.baseUrl === 'string')
164
+ next.baseUrl = p.baseUrl ? String(p.baseUrl).trim() || null : null;
165
+ for (const key of ['defaultTimeoutMs', 'costPerMillionInput', 'costPerMillionOutput', 'applyMinConfidence', 'backfillConcurrency']) {
166
+ const n = Number(p[key]);
167
+ if (p[key] !== undefined && Number.isFinite(n))
168
+ next[key] = n;
169
+ }
170
+ if (typeof p.applyJudgedImportance === 'boolean')
171
+ next.applyJudgedImportance = p.applyJudgedImportance;
172
+ if (p.benchRunAt === null || typeof p.benchRunAt === 'string')
173
+ next.benchRunAt = p.benchRunAt;
174
+ if (isObject(p.bench))
175
+ next.bench = { ...next.bench, ...p.bench };
176
+ if (isObject(p.surfaces)) {
177
+ for (const name of SURFACES) {
178
+ const s = p.surfaces[name];
179
+ if (!isObject(s))
180
+ continue;
181
+ const current = next.surfaces[name];
182
+ if (typeof s.enabled === 'boolean')
183
+ current.enabled = s.enabled;
184
+ if (s.timeoutMs !== undefined && Number.isFinite(Number(s.timeoutMs)))
185
+ current.timeoutMs = Number(s.timeoutMs);
186
+ if (s.minConfidence !== undefined && Number.isFinite(Number(s.minConfidence)))
187
+ current.minConfidence = Number(s.minConfidence);
188
+ if (s.minProbability !== undefined && Number.isFinite(Number(s.minProbability)))
189
+ current.minProbability = Number(s.minProbability);
190
+ for (const key of SURFACE_LIMIT_KEYS) {
191
+ if (s[key] !== undefined && Number.isFinite(Number(s[key])))
192
+ current[key] = Number(s[key]);
193
+ }
194
+ }
195
+ }
196
+ if (isObject(p.backfill)) {
197
+ const b = p.backfill;
198
+ next.backfill = { ...next.backfill, ...b,
199
+ relationsCreated: { ...next.backfill.relationsCreated, ...(isObject(b.relationsCreated) ? b.relationsCreated : {}) },
200
+ disagreements: { ...next.backfill.disagreements, ...(isObject(b.disagreements) ? b.disagreements : {}) },
201
+ };
202
+ }
203
+ if (isObject(p.browserAssist)) {
204
+ const b = p.browserAssist;
205
+ next.browserAssist ??= clone(DEFAULT_BROWSER_ASSIST);
206
+ if (typeof b.autoHealEnabled === 'boolean')
207
+ next.browserAssist.autoHealEnabled = b.autoHealEnabled;
208
+ // A malformed stored bench reads as "keep what we had", which for a fresh
209
+ // merge over the defaults is null: the gate stays shut.
210
+ if (b.targetBench !== undefined) {
211
+ const bench = readTargetBench(b.targetBench);
212
+ if (bench !== undefined)
213
+ next.browserAssist.targetBench = bench;
214
+ }
215
+ }
216
+ if (isObject(p.desktopAssist)) {
217
+ const d = p.desktopAssist;
218
+ next.desktopAssist ??= clone(DEFAULT_DESKTOP_ASSIST);
219
+ if (typeof d.pressEnabled === 'boolean')
220
+ next.desktopAssist.pressEnabled = d.pressEnabled;
221
+ // As for the browser record: a malformed stored bench keeps what we had, so a fresh merge stays locked.
222
+ if (d.targetBench !== undefined) {
223
+ const bench = readDesktopTargetBench(d.targetBench);
224
+ if (bench !== undefined)
225
+ next.desktopAssist.targetBench = bench;
226
+ }
227
+ }
228
+ if (typeof p.updatedAt === 'string')
229
+ next.updatedAt = p.updatedAt;
230
+ return next;
231
+ }
232
+ /**
233
+ * Turn an untrusted request body into a patch, or throw with a message the
234
+ * endpoint can return as a 400. Lives here so the HTTP route, the tests and
235
+ * the UI all agree on the limits.
236
+ */
237
+ export function validateTypeSafeConfigPatch(body, current = typesafeConfig()) {
238
+ if (!isObject(body))
239
+ throw new Error('Config patch must be an object.');
240
+ const patch = {};
241
+ const num = (key, min, max, integer = false) => {
242
+ const raw = body[key];
243
+ if (raw === undefined)
244
+ return undefined;
245
+ const n = Number(raw);
246
+ if (!Number.isFinite(n) || n < min || n > max || (integer && !Number.isInteger(n)))
247
+ throw new Error(`${key} must be ${integer ? 'an integer' : 'a number'} between ${min} and ${max}.`);
248
+ return n;
249
+ };
250
+ if (body.enabled !== undefined) {
251
+ if (typeof body.enabled !== 'boolean')
252
+ throw new Error('enabled must be a boolean.');
253
+ patch.enabled = body.enabled;
254
+ }
255
+ if (body.model !== undefined) {
256
+ if (typeof body.model !== 'string' || !body.model.trim() || body.model.length > 64 || !/^[A-Za-z0-9._-]+$/.test(body.model.trim()))
257
+ throw new Error('model must be a short model id such as jev-latest.');
258
+ patch.model = body.model.trim();
259
+ }
260
+ if (body.baseUrl !== undefined) {
261
+ if (body.baseUrl === null || body.baseUrl === '')
262
+ patch.baseUrl = null;
263
+ else if (typeof body.baseUrl !== 'string' || !/^https?:\/\/[^\s]+$/.test(body.baseUrl.trim()))
264
+ throw new Error('baseUrl must be an http(s) URL or empty for the default.');
265
+ else
266
+ patch.baseUrl = body.baseUrl.trim().replace(/\/+$/, '');
267
+ }
268
+ const defaultTimeoutMs = num('defaultTimeoutMs', 200, 30000, true);
269
+ if (defaultTimeoutMs !== undefined)
270
+ patch.defaultTimeoutMs = defaultTimeoutMs;
271
+ const costIn = num('costPerMillionInput', 0, 1000);
272
+ if (costIn !== undefined)
273
+ patch.costPerMillionInput = costIn;
274
+ const costOut = num('costPerMillionOutput', 0, 1000);
275
+ if (costOut !== undefined)
276
+ patch.costPerMillionOutput = costOut;
277
+ const minConf = num('applyMinConfidence', 0, 1);
278
+ if (minConf !== undefined)
279
+ patch.applyMinConfidence = minConf;
280
+ const concurrency = num('backfillConcurrency', 1, 8, true);
281
+ if (concurrency !== undefined)
282
+ patch.backfillConcurrency = concurrency;
283
+ if (body.applyJudgedImportance !== undefined) {
284
+ if (typeof body.applyJudgedImportance !== 'boolean')
285
+ throw new Error('applyJudgedImportance must be a boolean.');
286
+ if (body.applyJudgedImportance && !current.benchRunAt)
287
+ throw new Error('Run the importance bench before applying judged importance.');
288
+ patch.applyJudgedImportance = body.applyJudgedImportance;
289
+ }
290
+ if (body.surfaces !== undefined) {
291
+ if (!isObject(body.surfaces))
292
+ throw new Error('surfaces must be an object keyed by surface name.');
293
+ patch.surfaces = {};
294
+ for (const [name, value] of Object.entries(body.surfaces)) {
295
+ if (!SURFACES.includes(name))
296
+ throw new Error(`Unknown surface: ${name}`);
297
+ if (!isObject(value))
298
+ throw new Error(`surfaces.${name} must be an object.`);
299
+ const s = {};
300
+ if (value.enabled !== undefined) {
301
+ if (typeof value.enabled !== 'boolean')
302
+ throw new Error(`surfaces.${name}.enabled must be a boolean.`);
303
+ s.enabled = value.enabled;
304
+ }
305
+ if (value.timeoutMs !== undefined) {
306
+ const n = Number(value.timeoutMs);
307
+ if (!Number.isInteger(n) || n < 200 || n > 30000)
308
+ throw new Error(`surfaces.${name}.timeoutMs must be an integer between 200 and 30000.`);
309
+ s.timeoutMs = n;
310
+ }
311
+ if (value.minConfidence !== undefined) {
312
+ const n = Number(value.minConfidence);
313
+ if (!Number.isFinite(n) || n < 0 || n > 1)
314
+ throw new Error(`surfaces.${name}.minConfidence must be between 0 and 1.`);
315
+ s.minConfidence = n;
316
+ }
317
+ if (value.minProbability !== undefined) {
318
+ const n = Number(value.minProbability);
319
+ if (!Number.isFinite(n) || n < 0 || n > 1)
320
+ throw new Error(`surfaces.${name}.minProbability must be between 0 and 1.`);
321
+ s.minProbability = n;
322
+ }
323
+ for (const key of SURFACE_LIMIT_KEYS) {
324
+ if (value[key] === undefined)
325
+ continue;
326
+ const [min, max, integer] = SURFACE_LIMITS[key];
327
+ const n = Number(value[key]);
328
+ if (!Number.isFinite(n) || n < min || n > max || (integer && !Number.isInteger(n)))
329
+ throw new Error(`surfaces.${name}.${key} must be ${integer ? 'an integer' : 'a number'} between ${min} and ${max}.`);
330
+ s[key] = n;
331
+ }
332
+ patch.surfaces[name] = s;
333
+ }
334
+ }
335
+ // Last on purpose: the gate is judged against current + THIS request, so one
336
+ // PUT cannot lower a threshold and switch auto-heal on together.
337
+ if (body.browserAssist !== undefined) {
338
+ if (!isObject(body.browserAssist))
339
+ throw new Error('browserAssist must be an object.');
340
+ const b = body.browserAssist;
341
+ if (b.targetBench !== undefined)
342
+ throw new Error('browserAssist.targetBench is written by the browser benchmark, not by the settings API.');
343
+ const extra = Object.keys(b).find(key => key !== 'autoHealEnabled');
344
+ if (extra)
345
+ throw new Error(`Unknown browserAssist field: ${extra}`);
346
+ if (b.autoHealEnabled !== undefined) {
347
+ if (typeof b.autoHealEnabled !== 'boolean')
348
+ throw new Error('browserAssist.autoHealEnabled must be a boolean.');
349
+ if (b.autoHealEnabled) {
350
+ const gate = autoHealGate(mergeTypeSafeConfig(current, patch));
351
+ if (!gate.eligible)
352
+ throw new Error(`Safe auto-heal stays locked: ${gate.reasons.join(' ')}`);
353
+ }
354
+ patch.browserAssist = { autoHealEnabled: b.autoHealEnabled };
355
+ }
356
+ }
357
+ // After browserAssist, for the same reason: judged against current + everything else this request changes.
358
+ if (body.desktopAssist !== undefined) {
359
+ if (!isObject(body.desktopAssist))
360
+ throw new Error('desktopAssist must be an object.');
361
+ const d = body.desktopAssist;
362
+ if (d.targetBench !== undefined)
363
+ throw new Error('desktopAssist.targetBench is written by the desktop benchmark, not by the settings API.');
364
+ const extra = Object.keys(d).find(key => key !== 'pressEnabled');
365
+ if (extra)
366
+ throw new Error(`Unknown desktopAssist field: ${extra}`);
367
+ if (d.pressEnabled !== undefined) {
368
+ if (typeof d.pressEnabled !== 'boolean')
369
+ throw new Error('desktopAssist.pressEnabled must be a boolean.');
370
+ if (d.pressEnabled) {
371
+ const gate = desktopPressGate(mergeTypeSafeConfig(current, patch));
372
+ if (!gate.eligible)
373
+ throw new Error(`Press by intent stays locked: ${gate.reasons.join(' ')}`);
374
+ }
375
+ patch.desktopAssist = { pressEnabled: d.pressEnabled };
376
+ }
377
+ }
378
+ return patch;
379
+ }
380
+ let cached = null;
381
+ let cachedAt = 0;
382
+ function readStored() {
383
+ try {
384
+ const row = getDb().prepare('SELECT value FROM kv_config WHERE key=?').get(CONFIG_KEY);
385
+ if (!row?.value)
386
+ return null;
387
+ const parsed = JSON.parse(String(row.value));
388
+ return isObject(parsed) ? parsed : null;
389
+ }
390
+ catch {
391
+ return null;
392
+ }
393
+ }
394
+ /** The effective config, re-read from kv_config at most every CONFIG_TTL_MS. Never throws. */
395
+ export function typesafeConfig() {
396
+ const now = Date.now();
397
+ if (cached && now - cachedAt < CONFIG_TTL_MS)
398
+ return cached;
399
+ cached = mergeTypeSafeConfig(DEFAULT_TYPESAFE_CONFIG, readStored());
400
+ cachedAt = now;
401
+ return cached;
402
+ }
403
+ /** Drop the cached copy so the next read hits the database (called after every write in this process). */
404
+ export function invalidateTypeSafeConfig() { cached = null; cachedAt = 0; }
405
+ /** Per-surface settings; unknown names get the global default so a new surface is never silently disabled. */
406
+ export function surfaceConfig(name) {
407
+ const cfg = typesafeConfig();
408
+ return cfg.surfaces[name] ?? { enabled: true, timeoutMs: cfg.defaultTimeoutMs };
409
+ }
410
+ export function typesafeMasterEnabled() { return typesafeConfig().enabled; }
411
+ /**
412
+ * Read-merge-write under BEGIN IMMEDIATE so two writers (the settings PUT and
413
+ * the backfill progress flush) cannot lose each other's fields. Callers must
414
+ * not hold a transaction of their own; if one is open the write still lands,
415
+ * just without the lock.
416
+ */
417
+ export function mutateTypeSafeConfig(fn) {
418
+ const d = getDb();
419
+ const write = () => {
420
+ const current = mergeTypeSafeConfig(DEFAULT_TYPESAFE_CONFIG, readStored());
421
+ const result = fn(current);
422
+ const next = mergeTypeSafeConfig(current, result);
423
+ next.updatedAt = new Date().toISOString();
424
+ d.prepare('INSERT INTO kv_config(key,value) VALUES(?,?) ON CONFLICT(key) DO UPDATE SET value=excluded.value').run(CONFIG_KEY, JSON.stringify(next));
425
+ return next;
426
+ };
427
+ let next;
428
+ let locked = false;
429
+ try {
430
+ d.exec('BEGIN IMMEDIATE');
431
+ locked = true;
432
+ }
433
+ catch {
434
+ locked = false;
435
+ }
436
+ try {
437
+ next = write();
438
+ if (locked)
439
+ d.exec('COMMIT');
440
+ }
441
+ catch (error) {
442
+ if (locked) {
443
+ try {
444
+ d.exec('ROLLBACK');
445
+ }
446
+ catch { /* already rolled back */ }
447
+ }
448
+ throw error;
449
+ }
450
+ invalidateTypeSafeConfig();
451
+ return next;
452
+ }
453
+ export function updateTypeSafeConfig(patch) {
454
+ return mutateTypeSafeConfig(() => patch);
455
+ }
456
+ /** Rows kept. ~1 KB each; 2,000 covered two minutes of a backfill, 20,000 covers a few hours. */
457
+ export const LOG_KEEP = 20000;
458
+ const PRUNE_EVERY = 25;
459
+ let insertsSincePrune = 0;
460
+ const OUTCOME_MAX_CHARS = 4096;
461
+ const SESSION_ID_RE = /^[A-Za-z0-9_.:-]{1,128}$/;
462
+ /** A session id fit for the log, or null. */
463
+ export function cleanSessionId(value) {
464
+ return typeof value === 'string' && SESSION_ID_RE.test(value) ? value : null;
465
+ }
466
+ /**
467
+ * The session a memory was written from, read back from its `source_ref`
468
+ * (`remember` stores the caller's session there; compaction stores
469
+ * `synabun-compaction:<session>:<generation>`).
470
+ */
471
+ export function logSessionFromRef(ref) {
472
+ if (typeof ref !== 'string' || !ref)
473
+ return null;
474
+ const compaction = ref.match(/^synabun-compaction:([^:]+):/);
475
+ return cleanSessionId(compaction ? compaction[1] : ref);
476
+ }
477
+ /** Append one row and return its id. Never throws: the log is diagnostics, not the judgment. */
478
+ export function writeTypeSafeLog(row) {
479
+ try {
480
+ const d = getDb();
481
+ 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)
482
+ VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`).run(row.created_at ?? new Date().toISOString(), row.surface, row.origin, row.entity_id, row.model, row.question_count, row.state_preview, row.answers == null ? null : JSON.stringify(row.answers), Math.round(row.latency_ms), row.input_tokens, row.output_tokens, row.cached, row.error, cleanSessionId(row.session_id), typeof row.project === 'string' && row.project ? row.project.slice(0, 200) : null, row.surfaces?.length ? JSON.stringify(row.surfaces) : null);
483
+ if (++insertsSincePrune >= PRUNE_EVERY) {
484
+ insertsSincePrune = 0;
485
+ pruneTypeSafeLog();
486
+ }
487
+ return Number(result.lastInsertRowid);
488
+ }
489
+ catch {
490
+ return null; /* diagnostics must never fail the caller */
491
+ }
492
+ }
493
+ /** Record what the caller did with a judgment. Bounded; never throws. */
494
+ export function annotateTypeSafeLog(id, outcome) {
495
+ if (!id)
496
+ return;
497
+ try {
498
+ let text = JSON.stringify(outcome);
499
+ if (text.length > OUTCOME_MAX_CHARS)
500
+ text = JSON.stringify({ truncated: true, chars: text.length });
501
+ getDb().prepare('UPDATE typesafe_log SET outcome=? WHERE id=?').run(text, id);
502
+ }
503
+ catch { /* diagnostics */ }
504
+ }
505
+ /** Point rows logged under a provisional entity id at the one that was finally stored. */
506
+ export function relinkTypeSafeLog(fromEntity, toEntity) {
507
+ if (!fromEntity || !toEntity || fromEntity === toEntity)
508
+ return;
509
+ try {
510
+ getDb().prepare('UPDATE typesafe_log SET entity_id=? WHERE entity_id=?').run(toEntity, fromEntity);
511
+ }
512
+ catch { /* diagnostics */ }
513
+ }
514
+ /** Keep only the newest `keep` rows. Returns the number deleted. */
515
+ export function pruneTypeSafeLog(keep = LOG_KEEP) {
516
+ try {
517
+ const result = getDb().prepare('DELETE FROM typesafe_log WHERE id <= (SELECT id FROM typesafe_log ORDER BY id DESC LIMIT 1 OFFSET ?)').run(keep);
518
+ return Number(result.changes);
519
+ }
520
+ catch {
521
+ return 0;
522
+ }
523
+ }
524
+ const parseJson = (value) => {
525
+ if (value == null)
526
+ return null;
527
+ try {
528
+ return JSON.parse(String(value));
529
+ }
530
+ catch {
531
+ return String(value);
532
+ }
533
+ };
534
+ export function readTypeSafeLog(query = {}) {
535
+ const limit = Math.max(1, Math.min(500, Math.floor(Number(query.limit) || 50)));
536
+ const where = [];
537
+ const params = [];
538
+ // A rider is found by its own name too: it shares its lead's row.
539
+ if (query.surface) {
540
+ where.push("(surface=? OR EXISTS(SELECT 1 FROM json_each(COALESCE(surfaces,'[]')) WHERE value=?))");
541
+ params.push(String(query.surface), String(query.surface));
542
+ }
543
+ if (query.origin === 'live')
544
+ where.push("origin NOT IN ('backfill','bench')");
545
+ else if (query.origin) {
546
+ where.push('origin=?');
547
+ params.push(String(query.origin));
548
+ }
549
+ if (query.entityId) {
550
+ where.push('entity_id=?');
551
+ params.push(String(query.entityId));
552
+ }
553
+ if (query.sessionId) {
554
+ where.push('session_id=?');
555
+ params.push(String(query.sessionId));
556
+ }
557
+ if (query.project) {
558
+ where.push('project=?');
559
+ params.push(String(query.project));
560
+ }
561
+ if (query.before) {
562
+ where.push('created_at<?');
563
+ params.push(String(query.before));
564
+ }
565
+ if (query.after) {
566
+ where.push('created_at>=?');
567
+ params.push(String(query.after));
568
+ }
569
+ const order = query.order === 'asc' ? 'ASC' : 'DESC';
570
+ try {
571
+ const rows = getDb().prepare(`SELECT * FROM typesafe_log ${where.length ? 'WHERE ' + where.join(' AND ') : ''} ORDER BY id ${order} LIMIT ?`).all(...params, limit);
572
+ return rows.map(row => ({
573
+ ...row,
574
+ answers: parseJson(row.answers),
575
+ surfaces: parseJson(row.surfaces) ?? null,
576
+ outcome: parseJson(row.outcome),
577
+ }));
578
+ }
579
+ catch {
580
+ return [];
581
+ }
582
+ }
583
+ export function typesafeLogCount() {
584
+ try {
585
+ return Number(getDb().prepare('SELECT count(*) AS n FROM typesafe_log').get().n);
586
+ }
587
+ catch {
588
+ return 0;
589
+ }
590
+ }
591
+ let statsCache = null;
592
+ const STATS_TTL_MS = 10_000;
593
+ const emptyWindow = () => ({ calls: 0, failures: 0, avgMs: 0, inputTokens: 0 });
594
+ /**
595
+ * Real-time judgments over the last 24 h and 7 days, read from the log rather
596
+ * than from per-process counters, so they survive a restart and include every
597
+ * process. Riders count toward their own surface; tokens count toward the lead,
598
+ * which is the request that paid for them. Backfill and bench are excluded.
599
+ */
600
+ export function typesafeLogStats() {
601
+ const now = Date.now();
602
+ if (statsCache && now - statsCache.at < STATS_TTL_MS)
603
+ return statsCache.value;
604
+ const h24 = new Date(now - 86_400_000).toISOString();
605
+ const d7 = new Date(now - 7 * 86_400_000).toISOString();
606
+ const value = { at: new Date(now).toISOString(), oldest: null, surfaces: {}, totals: { h24: emptyWindow(), d7: emptyWindow() } };
607
+ try {
608
+ const d = getDb();
609
+ value.oldest = d.prepare('SELECT MIN(created_at) AS t FROM typesafe_log').get()?.t ?? null;
610
+ const perSurface = d.prepare(`SELECT s.value AS surface,
611
+ SUM(l.created_at>=?) AS calls24, SUM(l.created_at>=? AND l.error IS NOT NULL) AS failures24,
612
+ AVG(CASE WHEN l.created_at>=? AND l.error IS NULL AND l.cached=0 THEN l.latency_ms END) AS avg24,
613
+ SUM(CASE WHEN l.created_at>=? AND s.value=l.surface THEN l.input_tokens ELSE 0 END) AS tokens24,
614
+ COUNT(*) AS calls7, SUM(l.error IS NOT NULL) AS failures7,
615
+ AVG(CASE WHEN l.error IS NULL AND l.cached=0 THEN l.latency_ms END) AS avg7,
616
+ SUM(CASE WHEN s.value=l.surface THEN l.input_tokens ELSE 0 END) AS tokens7
617
+ FROM typesafe_log l, json_each(COALESCE(l.surfaces, json_array(l.surface))) s
618
+ WHERE l.created_at>=? AND l.origin NOT IN ('backfill','bench') GROUP BY s.value`).all(h24, h24, h24, h24, d7);
619
+ for (const r of perSurface) {
620
+ value.surfaces[String(r.surface)] = {
621
+ h24: { calls: Number(r.calls24) || 0, failures: Number(r.failures24) || 0, avgMs: Math.round(Number(r.avg24) || 0), inputTokens: Number(r.tokens24) || 0 },
622
+ d7: { calls: Number(r.calls7) || 0, failures: Number(r.failures7) || 0, avgMs: Math.round(Number(r.avg7) || 0), inputTokens: Number(r.tokens7) || 0 },
623
+ };
624
+ }
625
+ const totals = d.prepare(`SELECT SUM(created_at>=?) AS calls24, SUM(created_at>=? AND error IS NOT NULL) AS failures24,
626
+ AVG(CASE WHEN created_at>=? AND error IS NULL AND cached=0 THEN latency_ms END) AS avg24,
627
+ SUM(CASE WHEN created_at>=? THEN input_tokens ELSE 0 END) AS tokens24,
628
+ COUNT(*) AS calls7, SUM(error IS NOT NULL) AS failures7,
629
+ AVG(CASE WHEN error IS NULL AND cached=0 THEN latency_ms END) AS avg7, SUM(input_tokens) AS tokens7
630
+ FROM typesafe_log WHERE created_at>=? AND origin NOT IN ('backfill','bench')`).get(h24, h24, h24, h24, d7);
631
+ if (totals) {
632
+ value.totals = {
633
+ h24: { calls: Number(totals.calls24) || 0, failures: Number(totals.failures24) || 0, avgMs: Math.round(Number(totals.avg24) || 0), inputTokens: Number(totals.tokens24) || 0 },
634
+ d7: { calls: Number(totals.calls7) || 0, failures: Number(totals.failures7) || 0, avgMs: Math.round(Number(totals.avg7) || 0), inputTokens: Number(totals.tokens7) || 0 },
635
+ };
636
+ }
637
+ }
638
+ catch { /* an unreadable log reads as empty */ }
639
+ statsCache = { at: now, value };
640
+ return value;
641
+ }
642
+ /** Sessions that asked for judgments, newest first, with per-surface counts (riders included). */
643
+ export function typesafeSessions(query = {}) {
644
+ const limit = Math.max(1, Math.min(200, Math.floor(Number(query.limit) || 30)));
645
+ const since = query.since && Number.isFinite(Date.parse(query.since)) ? new Date(query.since).toISOString() : new Date(Date.now() - 7 * 86_400_000).toISOString();
646
+ try {
647
+ const d = getDb();
648
+ const where = ['session_id IS NOT NULL', 'created_at>=?'];
649
+ const params = [since];
650
+ if (query.project) {
651
+ where.push('project=?');
652
+ params.push(String(query.project));
653
+ }
654
+ const rows = d.prepare(`SELECT session_id, MAX(project) AS project, MIN(created_at) AS first_at, MAX(created_at) AS last_at,
655
+ COUNT(*) AS calls, SUM(error IS NOT NULL) AS failures
656
+ FROM typesafe_log WHERE ${where.join(' AND ')} GROUP BY session_id ORDER BY last_at DESC LIMIT ?`).all(...params, limit);
657
+ if (!rows.length)
658
+ return [];
659
+ const ids = rows.map(r => String(r.session_id));
660
+ const counts = d.prepare(`SELECT l.session_id, s.value AS surface, COUNT(*) AS n
661
+ FROM typesafe_log l, json_each(COALESCE(l.surfaces, json_array(l.surface))) s
662
+ WHERE l.session_id IN (${ids.map(() => '?').join(',')}) AND l.created_at>=? GROUP BY l.session_id, s.value`).all(...ids, since);
663
+ const bySession = new Map();
664
+ for (const c of counts) {
665
+ const key = String(c.session_id);
666
+ const entry = bySession.get(key) ?? {};
667
+ entry[String(c.surface)] = Number(c.n) || 0;
668
+ bySession.set(key, entry);
669
+ }
670
+ return rows.map(r => ({
671
+ session_id: String(r.session_id), project: r.project == null ? null : String(r.project),
672
+ first_at: String(r.first_at), last_at: String(r.last_at),
673
+ calls: Number(r.calls) || 0, failures: Number(r.failures) || 0,
674
+ surfaces: bySession.get(String(r.session_id)) ?? {},
675
+ }));
676
+ }
677
+ catch {
678
+ return [];
679
+ }
680
+ }
681
+ /**
682
+ * `precise` patterns are unambiguous on their own (a prefix or envelope that
683
+ * only a real token has). The rest need context or a judgment before they
684
+ * are treated as secrets: `token=abcdef12` might be an example.
685
+ */
686
+ export const CREDENTIAL_PATTERNS = [
687
+ { type: 'private-key', re: /-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g, precise: true },
688
+ { type: 'api-key', re: /\b(?:sk|rk|pk)[-_](?:live|test|proj|ant|or|api)?[-_]?[A-Za-z0-9_-]{16,}/g, precise: true },
689
+ { type: 'github-token', re: /\bgh[pousr]_[A-Za-z0-9]{20,}\b/g, precise: true },
690
+ { type: 'slack-token', re: /\bxox[abprs]-[A-Za-z0-9-]{10,}/g, precise: true },
691
+ { type: 'aws-key', re: /\bAKIA[0-9A-Z]{16}\b/g, precise: true },
692
+ { type: 'jwt', re: /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/g, precise: true },
693
+ { type: 'bearer', re: /\bBearer\s+([A-Za-z0-9._~+/=-]{16,})/g, group: 1, precise: false },
694
+ { 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 },
695
+ ];
696
+ /** Every credential-looking span, non-overlapping, earliest first. */
697
+ export function findCredentialSpans(text) {
698
+ const spans = [];
699
+ for (const pattern of CREDENTIAL_PATTERNS) {
700
+ pattern.re.lastIndex = 0;
701
+ for (const match of text.matchAll(pattern.re)) {
702
+ const whole = match[0];
703
+ const secret = pattern.group ? match[pattern.group] : whole;
704
+ if (!secret)
705
+ continue;
706
+ const offset = pattern.group ? whole.indexOf(secret) : 0;
707
+ const start = (match.index ?? 0) + offset;
708
+ spans.push({ start, end: start + secret.length, text: secret, type: pattern.type, precise: pattern.precise });
709
+ }
710
+ }
711
+ spans.sort((a, b) => a.start - b.start || b.end - a.end);
712
+ const kept = [];
713
+ for (const span of spans) {
714
+ const last = kept[kept.length - 1];
715
+ if (last && span.start < last.end)
716
+ continue;
717
+ kept.push(span);
718
+ }
719
+ return kept;
720
+ }
721
+ /** Replace the given spans (or every credential-looking span) with `[redacted:<type>]`. */
722
+ export function redactSpans(text, spans = findCredentialSpans(text)) {
723
+ let out = '';
724
+ let cursor = 0;
725
+ for (const span of [...spans].sort((a, b) => a.start - b.start)) {
726
+ if (span.start < cursor)
727
+ continue;
728
+ out += text.slice(cursor, span.start) + `[redacted:${span.type}]`;
729
+ cursor = span.end;
730
+ }
731
+ return out + text.slice(cursor);
732
+ }
733
+ export function redactCredentials(text) { return redactSpans(text); }
734
+ /** A bounded, credential-free preview of a judgment's state for the log. Redact first, then cut. */
735
+ export function statePreview(state, limit = 500) {
736
+ let text;
737
+ try {
738
+ text = typeof state === 'string' ? state : JSON.stringify(state);
739
+ }
740
+ catch {
741
+ text = String(state);
742
+ }
743
+ const clean = redactCredentials(text ?? '');
744
+ return clean.length > limit ? clean.slice(0, limit - 1) + '…' : clean;
745
+ }
746
+ //# sourceMappingURL=typesafe-config.js.map