synabun 1.3.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1163) hide show
  1. package/CHANGELOG.md +205 -662
  2. package/LICENSE-COMMERCIAL.md +33 -0
  3. package/NOTICE +17 -0
  4. package/README.md +175 -853
  5. package/THIRD-PARTY-LICENSES.md +136 -0
  6. package/benchmarks/browser-live-results.json +79 -0
  7. package/benchmarks/browser-v2-results.json +258 -0
  8. package/benchmarks/fixtures/browser/README.md +57 -0
  9. package/benchmarks/fixtures/browser/page-state.json +132 -0
  10. package/benchmarks/fixtures/browser/social.json +92 -0
  11. package/benchmarks/fixtures/browser/target.json +319 -0
  12. package/benchmarks/fixtures/desktop/README.md +58 -0
  13. package/benchmarks/fixtures/desktop/abstention.json +59 -0
  14. package/benchmarks/fixtures/desktop/adversarial.json +22 -0
  15. package/benchmarks/fixtures/desktop/forbidden.json +93 -0
  16. package/benchmarks/fixtures/desktop/generate.mjs +1023 -0
  17. package/benchmarks/fixtures/desktop/target.json +136 -0
  18. package/bin/synabun.js +30 -0
  19. package/docs/whatsapp.md +325 -0
  20. package/hooks/claude-code/post-plan.mjs +613 -391
  21. package/hooks/claude-code/post-remember.mjs +246 -122
  22. package/hooks/claude-code/pre-compact.mjs +171 -110
  23. package/hooks/claude-code/pre-task.mjs +133 -0
  24. package/hooks/claude-code/pre-websearch.mjs +15 -4
  25. package/hooks/claude-code/prompt-origin.mjs +94 -0
  26. package/hooks/claude-code/prompt-submit.mjs +1244 -861
  27. package/hooks/claude-code/session-start.mjs +114 -156
  28. package/hooks/claude-code/shared.mjs +1228 -368
  29. package/hooks/claude-code/state.mjs +167 -0
  30. package/hooks/claude-code/stop.mjs +515 -140
  31. package/hooks/claude-code/subagent-start.mjs +154 -0
  32. package/hooks/claude-code/subagent-stop.mjs +102 -0
  33. package/hooks/claude-code/task-gate.mjs +150 -0
  34. package/launcher.mjs +40 -0
  35. package/lib/claude-hooks.js +137 -0
  36. package/lib/claude-usage-audit.js +141 -0
  37. package/lib/client-config-repair.js +145 -0
  38. package/lib/data-home-migration.js +502 -0
  39. package/lib/desktop-pwa.js +206 -0
  40. package/lib/external-tools.js +221 -0
  41. package/lib/first-launch-protection.js +245 -0
  42. package/lib/packaged-runtime.js +110 -0
  43. package/lib/paths.d.ts +21 -0
  44. package/lib/paths.js +103 -0
  45. package/lib/start-launcher.js +1309 -0
  46. package/mcp-server/dist/config.d.ts +22 -0
  47. package/mcp-server/dist/config.d.ts.map +1 -0
  48. package/mcp-server/dist/config.js +109 -0
  49. package/mcp-server/dist/config.js.map +1 -0
  50. package/mcp-server/dist/http.d.ts +30 -0
  51. package/mcp-server/dist/http.d.ts.map +1 -0
  52. package/mcp-server/dist/http.js +276 -0
  53. package/mcp-server/dist/http.js.map +1 -0
  54. package/mcp-server/dist/index.d.ts +48 -0
  55. package/mcp-server/dist/index.d.ts.map +1 -0
  56. package/mcp-server/dist/index.js +538 -0
  57. package/mcp-server/dist/index.js.map +1 -0
  58. package/mcp-server/dist/preload-http.d.ts +3 -0
  59. package/mcp-server/dist/preload-http.d.ts.map +1 -0
  60. package/mcp-server/dist/preload-http.js +28 -0
  61. package/mcp-server/dist/preload-http.js.map +1 -0
  62. package/mcp-server/dist/preload.d.ts +3 -0
  63. package/mcp-server/dist/preload.d.ts.map +1 -0
  64. package/mcp-server/dist/preload.js +32 -0
  65. package/mcp-server/dist/preload.js.map +1 -0
  66. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts +19 -0
  67. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts.map +1 -0
  68. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js +403 -0
  69. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js.map +1 -0
  70. package/mcp-server/dist/scripts/setup-embeddings.d.ts +3 -0
  71. package/mcp-server/dist/scripts/setup-embeddings.d.ts.map +1 -0
  72. package/mcp-server/dist/scripts/setup-embeddings.js +15 -0
  73. package/mcp-server/dist/scripts/setup-embeddings.js.map +1 -0
  74. package/mcp-server/dist/services/assistant-judgments.d.ts +79 -0
  75. package/mcp-server/dist/services/assistant-judgments.d.ts.map +1 -0
  76. package/mcp-server/dist/services/assistant-judgments.js +128 -0
  77. package/mcp-server/dist/services/assistant-judgments.js.map +1 -0
  78. package/mcp-server/dist/services/browser-assist-gate.d.ts +314 -0
  79. package/mcp-server/dist/services/browser-assist-gate.d.ts.map +1 -0
  80. package/mcp-server/dist/services/browser-assist-gate.js +344 -0
  81. package/mcp-server/dist/services/browser-assist-gate.js.map +1 -0
  82. package/mcp-server/dist/services/browser-assist.d.ts +104 -0
  83. package/mcp-server/dist/services/browser-assist.d.ts.map +1 -0
  84. package/mcp-server/dist/services/browser-assist.js +282 -0
  85. package/mcp-server/dist/services/browser-assist.js.map +1 -0
  86. package/mcp-server/dist/services/browser-bench.d.ts +772 -0
  87. package/mcp-server/dist/services/browser-bench.d.ts.map +1 -0
  88. package/mcp-server/dist/services/browser-bench.js +424 -0
  89. package/mcp-server/dist/services/browser-bench.js.map +1 -0
  90. package/mcp-server/dist/services/browser-judgments.d.ts +196 -0
  91. package/mcp-server/dist/services/browser-judgments.d.ts.map +1 -0
  92. package/mcp-server/dist/services/browser-judgments.js +363 -0
  93. package/mcp-server/dist/services/browser-judgments.js.map +1 -0
  94. package/mcp-server/dist/services/browser-risk.d.ts +166 -0
  95. package/mcp-server/dist/services/browser-risk.d.ts.map +1 -0
  96. package/mcp-server/dist/services/browser-risk.js +458 -0
  97. package/mcp-server/dist/services/browser-risk.js.map +1 -0
  98. package/mcp-server/dist/services/categories.d.ts +61 -0
  99. package/mcp-server/dist/services/categories.d.ts.map +1 -0
  100. package/mcp-server/dist/services/categories.js +377 -0
  101. package/mcp-server/dist/services/categories.js.map +1 -0
  102. package/mcp-server/dist/services/codex-config-heal.d.ts +49 -0
  103. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -0
  104. package/mcp-server/dist/services/codex-config-heal.js +346 -0
  105. package/mcp-server/dist/services/codex-config-heal.js.map +1 -0
  106. package/mcp-server/dist/services/desktop-assist-gate.d.ts +198 -0
  107. package/mcp-server/dist/services/desktop-assist-gate.d.ts.map +1 -0
  108. package/mcp-server/dist/services/desktop-assist-gate.js +202 -0
  109. package/mcp-server/dist/services/desktop-assist-gate.js.map +1 -0
  110. package/mcp-server/dist/services/desktop-assist.d.ts +104 -0
  111. package/mcp-server/dist/services/desktop-assist.d.ts.map +1 -0
  112. package/mcp-server/dist/services/desktop-assist.js +266 -0
  113. package/mcp-server/dist/services/desktop-assist.js.map +1 -0
  114. package/mcp-server/dist/services/desktop-bench.d.ts +553 -0
  115. package/mcp-server/dist/services/desktop-bench.d.ts.map +1 -0
  116. package/mcp-server/dist/services/desktop-bench.js +311 -0
  117. package/mcp-server/dist/services/desktop-bench.js.map +1 -0
  118. package/mcp-server/dist/services/desktop-client.d.ts +23 -0
  119. package/mcp-server/dist/services/desktop-client.d.ts.map +1 -0
  120. package/mcp-server/dist/services/desktop-client.js +79 -0
  121. package/mcp-server/dist/services/desktop-client.js.map +1 -0
  122. package/mcp-server/dist/services/desktop-judgments.d.ts +125 -0
  123. package/mcp-server/dist/services/desktop-judgments.d.ts.map +1 -0
  124. package/mcp-server/dist/services/desktop-judgments.js +177 -0
  125. package/mcp-server/dist/services/desktop-judgments.js.map +1 -0
  126. package/mcp-server/dist/services/desktop-risk.d.ts +283 -0
  127. package/mcp-server/dist/services/desktop-risk.d.ts.map +1 -0
  128. package/mcp-server/dist/services/desktop-risk.js +605 -0
  129. package/mcp-server/dist/services/desktop-risk.js.map +1 -0
  130. package/mcp-server/dist/services/discord.d.ts +112 -0
  131. package/mcp-server/dist/services/discord.d.ts.map +1 -0
  132. package/mcp-server/dist/services/discord.js +477 -0
  133. package/mcp-server/dist/services/discord.js.map +1 -0
  134. package/mcp-server/dist/services/edit-stale.d.ts +81 -0
  135. package/mcp-server/dist/services/edit-stale.d.ts.map +1 -0
  136. package/mcp-server/dist/services/edit-stale.js +358 -0
  137. package/mcp-server/dist/services/edit-stale.js.map +1 -0
  138. package/mcp-server/dist/services/embedding-service.d.ts +16 -0
  139. package/mcp-server/dist/services/embedding-service.d.ts.map +1 -0
  140. package/mcp-server/dist/services/embedding-service.js +126 -0
  141. package/mcp-server/dist/services/embedding-service.js.map +1 -0
  142. package/mcp-server/dist/services/embedding-worker.d.ts +2 -0
  143. package/mcp-server/dist/services/embedding-worker.d.ts.map +1 -0
  144. package/mcp-server/dist/services/embedding-worker.js +52 -0
  145. package/mcp-server/dist/services/embedding-worker.js.map +1 -0
  146. package/mcp-server/dist/services/fb-regions.d.ts +71 -0
  147. package/mcp-server/dist/services/fb-regions.d.ts.map +1 -0
  148. package/mcp-server/dist/services/fb-regions.js +211 -0
  149. package/mcp-server/dist/services/fb-regions.js.map +1 -0
  150. package/mcp-server/dist/services/file-checksums.d.ts +22 -0
  151. package/mcp-server/dist/services/file-checksums.d.ts.map +1 -0
  152. package/mcp-server/dist/services/file-checksums.js +55 -0
  153. package/mcp-server/dist/services/file-checksums.js.map +1 -0
  154. package/mcp-server/dist/services/file-excerpt.d.ts +24 -0
  155. package/mcp-server/dist/services/file-excerpt.d.ts.map +1 -0
  156. package/mcp-server/dist/services/file-excerpt.js +65 -0
  157. package/mcp-server/dist/services/file-excerpt.js.map +1 -0
  158. package/mcp-server/dist/services/identity.d.ts +124 -0
  159. package/mcp-server/dist/services/identity.d.ts.map +1 -0
  160. package/mcp-server/dist/services/identity.js +241 -0
  161. package/mcp-server/dist/services/identity.js.map +1 -0
  162. package/mcp-server/dist/services/local-embeddings.d.ts +2 -0
  163. package/mcp-server/dist/services/local-embeddings.d.ts.map +1 -0
  164. package/mcp-server/dist/services/local-embeddings.js +3 -0
  165. package/mcp-server/dist/services/local-embeddings.js.map +1 -0
  166. package/mcp-server/dist/services/memory-client.d.ts +4 -0
  167. package/mcp-server/dist/services/memory-client.d.ts.map +1 -0
  168. package/mcp-server/dist/services/memory-client.js +27 -0
  169. package/mcp-server/dist/services/memory-client.js.map +1 -0
  170. package/mcp-server/dist/services/memory-judge-backfill.d.ts +135 -0
  171. package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -0
  172. package/mcp-server/dist/services/memory-judge-backfill.js +510 -0
  173. package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -0
  174. package/mcp-server/dist/services/memory-judgments.d.ts +362 -0
  175. package/mcp-server/dist/services/memory-judgments.d.ts.map +1 -0
  176. package/mcp-server/dist/services/memory-judgments.js +674 -0
  177. package/mcp-server/dist/services/memory-judgments.js.map +1 -0
  178. package/mcp-server/dist/services/memory-maintenance.d.ts +108 -0
  179. package/mcp-server/dist/services/memory-maintenance.d.ts.map +1 -0
  180. package/mcp-server/dist/services/memory-maintenance.js +403 -0
  181. package/mcp-server/dist/services/memory-maintenance.js.map +1 -0
  182. package/mcp-server/dist/services/memory-retrieval.d.ts +66 -0
  183. package/mcp-server/dist/services/memory-retrieval.d.ts.map +1 -0
  184. package/mcp-server/dist/services/memory-retrieval.js +412 -0
  185. package/mcp-server/dist/services/memory-retrieval.js.map +1 -0
  186. package/mcp-server/dist/services/memory-schema.d.ts +16 -0
  187. package/mcp-server/dist/services/memory-schema.d.ts.map +1 -0
  188. package/mcp-server/dist/services/memory-schema.js +282 -0
  189. package/mcp-server/dist/services/memory-schema.js.map +1 -0
  190. package/mcp-server/dist/services/memory-sessions.d.ts +24 -0
  191. package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -0
  192. package/mcp-server/dist/services/memory-sessions.js +110 -0
  193. package/mcp-server/dist/services/memory-sessions.js.map +1 -0
  194. package/mcp-server/dist/services/memory-triage.d.ts +60 -0
  195. package/mcp-server/dist/services/memory-triage.d.ts.map +1 -0
  196. package/mcp-server/dist/services/memory-triage.js +189 -0
  197. package/mcp-server/dist/services/memory-triage.js.map +1 -0
  198. package/mcp-server/dist/services/memory-verification.d.ts +24 -0
  199. package/mcp-server/dist/services/memory-verification.d.ts.map +1 -0
  200. package/mcp-server/dist/services/memory-verification.js +92 -0
  201. package/mcp-server/dist/services/memory-verification.js.map +1 -0
  202. package/mcp-server/dist/services/memory-writer.d.ts +26 -0
  203. package/mcp-server/dist/services/memory-writer.d.ts.map +1 -0
  204. package/mcp-server/dist/services/memory-writer.js +126 -0
  205. package/mcp-server/dist/services/memory-writer.js.map +1 -0
  206. package/mcp-server/dist/services/neural-interface.d.ts +439 -0
  207. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -0
  208. package/mcp-server/dist/services/neural-interface.js +1135 -0
  209. package/mcp-server/dist/services/neural-interface.js.map +1 -0
  210. package/mcp-server/dist/services/profiles.d.ts +120 -0
  211. package/mcp-server/dist/services/profiles.d.ts.map +1 -0
  212. package/mcp-server/dist/services/profiles.js +387 -0
  213. package/mcp-server/dist/services/profiles.js.map +1 -0
  214. package/mcp-server/dist/services/secret-gate.d.ts +29 -0
  215. package/mcp-server/dist/services/secret-gate.d.ts.map +1 -0
  216. package/mcp-server/dist/services/secret-gate.js +43 -0
  217. package/mcp-server/dist/services/secret-gate.js.map +1 -0
  218. package/mcp-server/dist/services/server-instructions.d.ts +10 -0
  219. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -0
  220. package/mcp-server/dist/services/server-instructions.js +101 -0
  221. package/mcp-server/dist/services/server-instructions.js.map +1 -0
  222. package/mcp-server/dist/services/sqlite.d.ts +235 -0
  223. package/mcp-server/dist/services/sqlite.d.ts.map +1 -0
  224. package/mcp-server/dist/services/sqlite.js +1185 -0
  225. package/mcp-server/dist/services/sqlite.js.map +1 -0
  226. package/mcp-server/dist/services/typesafe-bench.d.ts +99 -0
  227. package/mcp-server/dist/services/typesafe-bench.d.ts.map +1 -0
  228. package/mcp-server/dist/services/typesafe-bench.js +218 -0
  229. package/mcp-server/dist/services/typesafe-bench.js.map +1 -0
  230. package/mcp-server/dist/services/typesafe-config.d.ts +342 -0
  231. package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -0
  232. package/mcp-server/dist/services/typesafe-config.js +746 -0
  233. package/mcp-server/dist/services/typesafe-config.js.map +1 -0
  234. package/mcp-server/dist/services/typesafe.d.ts +213 -0
  235. package/mcp-server/dist/services/typesafe.d.ts.map +1 -0
  236. package/mcp-server/dist/services/typesafe.js +330 -0
  237. package/mcp-server/dist/services/typesafe.js.map +1 -0
  238. package/mcp-server/dist/services/vector-cache.d.ts +68 -0
  239. package/mcp-server/dist/services/vector-cache.d.ts.map +1 -0
  240. package/mcp-server/dist/services/vector-cache.js +271 -0
  241. package/mcp-server/dist/services/vector-cache.js.map +1 -0
  242. package/mcp-server/dist/services/whiteboard-geometry.d.ts +305 -0
  243. package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -0
  244. package/mcp-server/dist/services/whiteboard-geometry.js +666 -0
  245. package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -0
  246. package/mcp-server/dist/tools/agents.d.ts +212 -0
  247. package/mcp-server/dist/tools/agents.d.ts.map +1 -0
  248. package/mcp-server/dist/tools/agents.js +407 -0
  249. package/mcp-server/dist/tools/agents.js.map +1 -0
  250. package/mcp-server/dist/tools/bluesky.d.ts +39 -0
  251. package/mcp-server/dist/tools/bluesky.d.ts.map +1 -0
  252. package/mcp-server/dist/tools/bluesky.js +1144 -0
  253. package/mcp-server/dist/tools/bluesky.js.map +1 -0
  254. package/mcp-server/dist/tools/browser-advanced.d.ts +58 -0
  255. package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -0
  256. package/mcp-server/dist/tools/browser-advanced.js +106 -0
  257. package/mcp-server/dist/tools/browser-advanced.js.map +1 -0
  258. package/mcp-server/dist/tools/browser-batch.d.ts +99 -0
  259. package/mcp-server/dist/tools/browser-batch.d.ts.map +1 -0
  260. package/mcp-server/dist/tools/browser-batch.js +187 -0
  261. package/mcp-server/dist/tools/browser-batch.js.map +1 -0
  262. package/mcp-server/dist/tools/browser-cheatsheet.d.ts +21 -0
  263. package/mcp-server/dist/tools/browser-cheatsheet.d.ts.map +1 -0
  264. package/mcp-server/dist/tools/browser-cheatsheet.js +144 -0
  265. package/mcp-server/dist/tools/browser-cheatsheet.js.map +1 -0
  266. package/mcp-server/dist/tools/browser-interact.d.ts +239 -0
  267. package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -0
  268. package/mcp-server/dist/tools/browser-interact.js +300 -0
  269. package/mcp-server/dist/tools/browser-interact.js.map +1 -0
  270. package/mcp-server/dist/tools/browser-navigate.d.ts +90 -0
  271. package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -0
  272. package/mcp-server/dist/tools/browser-navigate.js +142 -0
  273. package/mcp-server/dist/tools/browser-navigate.js.map +1 -0
  274. package/mcp-server/dist/tools/browser-observe.d.ts +561 -0
  275. package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -0
  276. package/mcp-server/dist/tools/browser-observe.js +2009 -0
  277. package/mcp-server/dist/tools/browser-observe.js.map +1 -0
  278. package/mcp-server/dist/tools/browser.d.ts +34 -0
  279. package/mcp-server/dist/tools/browser.d.ts.map +1 -0
  280. package/mcp-server/dist/tools/browser.js +112 -0
  281. package/mcp-server/dist/tools/browser.js.map +1 -0
  282. package/mcp-server/dist/tools/card-tools.d.ts +82 -0
  283. package/mcp-server/dist/tools/card-tools.d.ts.map +1 -0
  284. package/mcp-server/dist/tools/card-tools.js +137 -0
  285. package/mcp-server/dist/tools/card-tools.js.map +1 -0
  286. package/mcp-server/dist/tools/card.d.ts +8 -0
  287. package/mcp-server/dist/tools/card.d.ts.map +1 -0
  288. package/mcp-server/dist/tools/card.js +16 -0
  289. package/mcp-server/dist/tools/card.js.map +1 -0
  290. package/mcp-server/dist/tools/category.d.ts +32 -0
  291. package/mcp-server/dist/tools/category.d.ts.map +1 -0
  292. package/mcp-server/dist/tools/category.js +290 -0
  293. package/mcp-server/dist/tools/category.js.map +1 -0
  294. package/mcp-server/dist/tools/choice.d.ts +160 -0
  295. package/mcp-server/dist/tools/choice.d.ts.map +1 -0
  296. package/mcp-server/dist/tools/choice.js +80 -0
  297. package/mcp-server/dist/tools/choice.js.map +1 -0
  298. package/mcp-server/dist/tools/computer.d.ts +71 -0
  299. package/mcp-server/dist/tools/computer.d.ts.map +1 -0
  300. package/mcp-server/dist/tools/computer.js +174 -0
  301. package/mcp-server/dist/tools/computer.js.map +1 -0
  302. package/mcp-server/dist/tools/discord-channel.d.ts +44 -0
  303. package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -0
  304. package/mcp-server/dist/tools/discord-channel.js +236 -0
  305. package/mcp-server/dist/tools/discord-channel.js.map +1 -0
  306. package/mcp-server/dist/tools/discord-guild.d.ts +20 -0
  307. package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -0
  308. package/mcp-server/dist/tools/discord-guild.js +138 -0
  309. package/mcp-server/dist/tools/discord-guild.js.map +1 -0
  310. package/mcp-server/dist/tools/discord-member.d.ts +26 -0
  311. package/mcp-server/dist/tools/discord-member.d.ts.map +1 -0
  312. package/mcp-server/dist/tools/discord-member.js +122 -0
  313. package/mcp-server/dist/tools/discord-member.js.map +1 -0
  314. package/mcp-server/dist/tools/discord-message.d.ts +36 -0
  315. package/mcp-server/dist/tools/discord-message.d.ts.map +1 -0
  316. package/mcp-server/dist/tools/discord-message.js +184 -0
  317. package/mcp-server/dist/tools/discord-message.js.map +1 -0
  318. package/mcp-server/dist/tools/discord-onboarding.d.ts +32 -0
  319. package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -0
  320. package/mcp-server/dist/tools/discord-onboarding.js +179 -0
  321. package/mcp-server/dist/tools/discord-onboarding.js.map +1 -0
  322. package/mcp-server/dist/tools/discord-role.d.ts +34 -0
  323. package/mcp-server/dist/tools/discord-role.d.ts.map +1 -0
  324. package/mcp-server/dist/tools/discord-role.js +178 -0
  325. package/mcp-server/dist/tools/discord-role.js.map +1 -0
  326. package/mcp-server/dist/tools/discord-thread.d.ts +28 -0
  327. package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -0
  328. package/mcp-server/dist/tools/discord-thread.js +88 -0
  329. package/mcp-server/dist/tools/discord-thread.js.map +1 -0
  330. package/mcp-server/dist/tools/discord-webhook.d.ts +32 -0
  331. package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -0
  332. package/mcp-server/dist/tools/discord-webhook.js +154 -0
  333. package/mcp-server/dist/tools/discord-webhook.js.map +1 -0
  334. package/mcp-server/dist/tools/discord.d.ts +7 -0
  335. package/mcp-server/dist/tools/discord.d.ts.map +1 -0
  336. package/mcp-server/dist/tools/discord.js +25 -0
  337. package/mcp-server/dist/tools/discord.js.map +1 -0
  338. package/mcp-server/dist/tools/fb-groups.d.ts +98 -0
  339. package/mcp-server/dist/tools/fb-groups.d.ts.map +1 -0
  340. package/mcp-server/dist/tools/fb-groups.js +369 -0
  341. package/mcp-server/dist/tools/fb-groups.js.map +1 -0
  342. package/mcp-server/dist/tools/forget.d.ts +14 -0
  343. package/mcp-server/dist/tools/forget.d.ts.map +1 -0
  344. package/mcp-server/dist/tools/forget.js +26 -0
  345. package/mcp-server/dist/tools/forget.js.map +1 -0
  346. package/mcp-server/dist/tools/git-tools.d.ts +24 -0
  347. package/mcp-server/dist/tools/git-tools.d.ts.map +1 -0
  348. package/mcp-server/dist/tools/git-tools.js +107 -0
  349. package/mcp-server/dist/tools/git-tools.js.map +1 -0
  350. package/mcp-server/dist/tools/git.d.ts +7 -0
  351. package/mcp-server/dist/tools/git.d.ts.map +1 -0
  352. package/mcp-server/dist/tools/git.js +11 -0
  353. package/mcp-server/dist/tools/git.js.map +1 -0
  354. package/mcp-server/dist/tools/gsc/experience.d.ts +135 -0
  355. package/mcp-server/dist/tools/gsc/experience.d.ts.map +1 -0
  356. package/mcp-server/dist/tools/gsc/experience.js +351 -0
  357. package/mcp-server/dist/tools/gsc/experience.js.map +1 -0
  358. package/mcp-server/dist/tools/gsc/helpers.d.ts +78 -0
  359. package/mcp-server/dist/tools/gsc/helpers.d.ts.map +1 -0
  360. package/mcp-server/dist/tools/gsc/helpers.js +258 -0
  361. package/mcp-server/dist/tools/gsc/helpers.js.map +1 -0
  362. package/mcp-server/dist/tools/gsc/indexing.d.ts +121 -0
  363. package/mcp-server/dist/tools/gsc/indexing.d.ts.map +1 -0
  364. package/mcp-server/dist/tools/gsc/indexing.js +357 -0
  365. package/mcp-server/dist/tools/gsc/indexing.js.map +1 -0
  366. package/mcp-server/dist/tools/gsc/inspect.d.ts +78 -0
  367. package/mcp-server/dist/tools/gsc/inspect.d.ts.map +1 -0
  368. package/mcp-server/dist/tools/gsc/inspect.js +321 -0
  369. package/mcp-server/dist/tools/gsc/inspect.js.map +1 -0
  370. package/mcp-server/dist/tools/gsc/navigate.d.ts +44 -0
  371. package/mcp-server/dist/tools/gsc/navigate.d.ts.map +1 -0
  372. package/mcp-server/dist/tools/gsc/navigate.js +197 -0
  373. package/mcp-server/dist/tools/gsc/navigate.js.map +1 -0
  374. package/mcp-server/dist/tools/gsc/performance.d.ts +84 -0
  375. package/mcp-server/dist/tools/gsc/performance.d.ts.map +1 -0
  376. package/mcp-server/dist/tools/gsc/performance.js +274 -0
  377. package/mcp-server/dist/tools/gsc/performance.js.map +1 -0
  378. package/mcp-server/dist/tools/gsc/settings.d.ts +153 -0
  379. package/mcp-server/dist/tools/gsc/settings.d.ts.map +1 -0
  380. package/mcp-server/dist/tools/gsc/settings.js +425 -0
  381. package/mcp-server/dist/tools/gsc/settings.js.map +1 -0
  382. package/mcp-server/dist/tools/gsc.d.ts +7 -0
  383. package/mcp-server/dist/tools/gsc.d.ts.map +1 -0
  384. package/mcp-server/dist/tools/gsc.js +51 -0
  385. package/mcp-server/dist/tools/gsc.js.map +1 -0
  386. package/mcp-server/dist/tools/image-tools.d.ts +24 -0
  387. package/mcp-server/dist/tools/image-tools.d.ts.map +1 -0
  388. package/mcp-server/dist/tools/image-tools.js +80 -0
  389. package/mcp-server/dist/tools/image-tools.js.map +1 -0
  390. package/mcp-server/dist/tools/image.d.ts +10 -0
  391. package/mcp-server/dist/tools/image.d.ts.map +1 -0
  392. package/mcp-server/dist/tools/image.js +14 -0
  393. package/mcp-server/dist/tools/image.js.map +1 -0
  394. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +97 -0
  395. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -0
  396. package/mcp-server/dist/tools/leonardo-browser-tools.js +228 -0
  397. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -0
  398. package/mcp-server/dist/tools/leonardo.d.ts +13 -0
  399. package/mcp-server/dist/tools/leonardo.d.ts.map +1 -0
  400. package/mcp-server/dist/tools/leonardo.js +21 -0
  401. package/mcp-server/dist/tools/leonardo.js.map +1 -0
  402. package/mcp-server/dist/tools/loop.d.ts +30 -0
  403. package/mcp-server/dist/tools/loop.d.ts.map +1 -0
  404. package/mcp-server/dist/tools/loop.js +401 -0
  405. package/mcp-server/dist/tools/loop.js.map +1 -0
  406. package/mcp-server/dist/tools/memories.d.ts +56 -0
  407. package/mcp-server/dist/tools/memories.d.ts.map +1 -0
  408. package/mcp-server/dist/tools/memories.js +171 -0
  409. package/mcp-server/dist/tools/memories.js.map +1 -0
  410. package/mcp-server/dist/tools/morelogin.d.ts +24 -0
  411. package/mcp-server/dist/tools/morelogin.d.ts.map +1 -0
  412. package/mcp-server/dist/tools/morelogin.js +79 -0
  413. package/mcp-server/dist/tools/morelogin.js.map +1 -0
  414. package/mcp-server/dist/tools/profile.d.ts +17 -0
  415. package/mcp-server/dist/tools/profile.d.ts.map +1 -0
  416. package/mcp-server/dist/tools/profile.js +114 -0
  417. package/mcp-server/dist/tools/profile.js.map +1 -0
  418. package/mcp-server/dist/tools/recall.d.ts +71 -0
  419. package/mcp-server/dist/tools/recall.d.ts.map +1 -0
  420. package/mcp-server/dist/tools/recall.js +147 -0
  421. package/mcp-server/dist/tools/recall.js.map +1 -0
  422. package/mcp-server/dist/tools/reflect.d.ts +56 -0
  423. package/mcp-server/dist/tools/reflect.d.ts.map +1 -0
  424. package/mcp-server/dist/tools/reflect.js +157 -0
  425. package/mcp-server/dist/tools/reflect.js.map +1 -0
  426. package/mcp-server/dist/tools/remember.d.ts +62 -0
  427. package/mcp-server/dist/tools/remember.d.ts.map +1 -0
  428. package/mcp-server/dist/tools/remember.js +201 -0
  429. package/mcp-server/dist/tools/remember.js.map +1 -0
  430. package/mcp-server/dist/tools/response.d.ts +23 -0
  431. package/mcp-server/dist/tools/response.d.ts.map +1 -0
  432. package/mcp-server/dist/tools/response.js +24 -0
  433. package/mcp-server/dist/tools/response.js.map +1 -0
  434. package/mcp-server/dist/tools/restore.d.ts +14 -0
  435. package/mcp-server/dist/tools/restore.d.ts.map +1 -0
  436. package/mcp-server/dist/tools/restore.js +23 -0
  437. package/mcp-server/dist/tools/restore.js.map +1 -0
  438. package/mcp-server/dist/tools/style-guide-tools.d.ts +51 -0
  439. package/mcp-server/dist/tools/style-guide-tools.d.ts.map +1 -0
  440. package/mcp-server/dist/tools/style-guide-tools.js +231 -0
  441. package/mcp-server/dist/tools/style-guide-tools.js.map +1 -0
  442. package/mcp-server/dist/tools/style-guide.d.ts +8 -0
  443. package/mcp-server/dist/tools/style-guide.d.ts.map +1 -0
  444. package/mcp-server/dist/tools/style-guide.js +12 -0
  445. package/mcp-server/dist/tools/style-guide.js.map +1 -0
  446. package/mcp-server/dist/tools/sync.d.ts +20 -0
  447. package/mcp-server/dist/tools/sync.d.ts.map +1 -0
  448. package/mcp-server/dist/tools/sync.js +156 -0
  449. package/mcp-server/dist/tools/sync.js.map +1 -0
  450. package/mcp-server/dist/tools/tictactoe-tools.d.ts +18 -0
  451. package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -0
  452. package/mcp-server/dist/tools/tictactoe-tools.js +78 -0
  453. package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -0
  454. package/mcp-server/dist/tools/tictactoe.d.ts +7 -0
  455. package/mcp-server/dist/tools/tictactoe.d.ts.map +1 -0
  456. package/mcp-server/dist/tools/tictactoe.js +11 -0
  457. package/mcp-server/dist/tools/tictactoe.js.map +1 -0
  458. package/mcp-server/dist/tools/utils.d.ts +19 -0
  459. package/mcp-server/dist/tools/utils.d.ts.map +1 -0
  460. package/mcp-server/dist/tools/utils.js +54 -0
  461. package/mcp-server/dist/tools/utils.js.map +1 -0
  462. package/mcp-server/dist/tools/whiteboard-format.d.ts +88 -0
  463. package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -0
  464. package/mcp-server/dist/tools/whiteboard-format.js +337 -0
  465. package/mcp-server/dist/tools/whiteboard-format.js.map +1 -0
  466. package/mcp-server/dist/tools/whiteboard-tools.d.ts +326 -0
  467. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -0
  468. package/mcp-server/dist/tools/whiteboard-tools.js +222 -0
  469. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -0
  470. package/mcp-server/dist/tools/whiteboard.d.ts +8 -0
  471. package/mcp-server/dist/tools/whiteboard.d.ts.map +1 -0
  472. package/mcp-server/dist/tools/whiteboard.js +16 -0
  473. package/mcp-server/dist/tools/whiteboard.js.map +1 -0
  474. package/mcp-server/dist/tools/youtube/analytics.d.ts +46 -0
  475. package/mcp-server/dist/tools/youtube/analytics.d.ts.map +1 -0
  476. package/mcp-server/dist/tools/youtube/analytics.js +83 -0
  477. package/mcp-server/dist/tools/youtube/analytics.js.map +1 -0
  478. package/mcp-server/dist/tools/youtube/dedup.d.ts +35 -0
  479. package/mcp-server/dist/tools/youtube/dedup.d.ts.map +1 -0
  480. package/mcp-server/dist/tools/youtube/dedup.js +56 -0
  481. package/mcp-server/dist/tools/youtube/dedup.js.map +1 -0
  482. package/mcp-server/dist/tools/youtube/download.d.ts +31 -0
  483. package/mcp-server/dist/tools/youtube/download.d.ts.map +1 -0
  484. package/mcp-server/dist/tools/youtube/download.js +30 -0
  485. package/mcp-server/dist/tools/youtube/download.js.map +1 -0
  486. package/mcp-server/dist/tools/youtube/helpers.d.ts +66 -0
  487. package/mcp-server/dist/tools/youtube/helpers.d.ts.map +1 -0
  488. package/mcp-server/dist/tools/youtube/helpers.js +143 -0
  489. package/mcp-server/dist/tools/youtube/helpers.js.map +1 -0
  490. package/mcp-server/dist/tools/youtube/media.d.ts +43 -0
  491. package/mcp-server/dist/tools/youtube/media.d.ts.map +1 -0
  492. package/mcp-server/dist/tools/youtube/media.js +97 -0
  493. package/mcp-server/dist/tools/youtube/media.js.map +1 -0
  494. package/mcp-server/dist/tools/youtube/metadata.d.ts +33 -0
  495. package/mcp-server/dist/tools/youtube/metadata.d.ts.map +1 -0
  496. package/mcp-server/dist/tools/youtube/metadata.js +106 -0
  497. package/mcp-server/dist/tools/youtube/metadata.js.map +1 -0
  498. package/mcp-server/dist/tools/youtube/navigate.d.ts +30 -0
  499. package/mcp-server/dist/tools/youtube/navigate.d.ts.map +1 -0
  500. package/mcp-server/dist/tools/youtube/navigate.js +71 -0
  501. package/mcp-server/dist/tools/youtube/navigate.js.map +1 -0
  502. package/mcp-server/dist/tools/youtube/playlist.d.ts +29 -0
  503. package/mcp-server/dist/tools/youtube/playlist.d.ts.map +1 -0
  504. package/mcp-server/dist/tools/youtube/playlist.js +128 -0
  505. package/mcp-server/dist/tools/youtube/playlist.js.map +1 -0
  506. package/mcp-server/dist/tools/youtube/schedule.d.ts +31 -0
  507. package/mcp-server/dist/tools/youtube/schedule.d.ts.map +1 -0
  508. package/mcp-server/dist/tools/youtube/schedule.js +147 -0
  509. package/mcp-server/dist/tools/youtube/schedule.js.map +1 -0
  510. package/mcp-server/dist/tools/youtube/source.d.ts +36 -0
  511. package/mcp-server/dist/tools/youtube/source.d.ts.map +1 -0
  512. package/mcp-server/dist/tools/youtube/source.js +85 -0
  513. package/mcp-server/dist/tools/youtube/source.js.map +1 -0
  514. package/mcp-server/dist/tools/youtube/upload.d.ts +53 -0
  515. package/mcp-server/dist/tools/youtube/upload.d.ts.map +1 -0
  516. package/mcp-server/dist/tools/youtube/upload.js +255 -0
  517. package/mcp-server/dist/tools/youtube/upload.js.map +1 -0
  518. package/mcp-server/dist/tools/youtube.d.ts +12 -0
  519. package/mcp-server/dist/tools/youtube.d.ts.map +1 -0
  520. package/mcp-server/dist/tools/youtube.js +38 -0
  521. package/mcp-server/dist/tools/youtube.js.map +1 -0
  522. package/mcp-server/dist/tui.d.ts +3 -0
  523. package/mcp-server/dist/tui.d.ts.map +1 -0
  524. package/mcp-server/dist/tui.js +806 -0
  525. package/mcp-server/dist/tui.js.map +1 -0
  526. package/mcp-server/dist/types.d.ts +77 -0
  527. package/mcp-server/dist/types.d.ts.map +1 -0
  528. package/mcp-server/dist/types.js +2 -0
  529. package/mcp-server/dist/types.js.map +1 -0
  530. package/mcp-server/package-lock.json +4798 -0
  531. package/mcp-server/package.json +55 -38
  532. package/mcp-server/run.mjs +12 -2
  533. package/mcp-server/src/config.ts +48 -3
  534. package/mcp-server/src/http.ts +296 -93
  535. package/mcp-server/src/index.ts +546 -203
  536. package/mcp-server/src/preload-http.ts +19 -18
  537. package/mcp-server/src/preload.ts +19 -18
  538. package/mcp-server/src/scripts/setup-embeddings.ts +9 -0
  539. package/mcp-server/src/services/assistant-judgments.ts +157 -0
  540. package/mcp-server/src/services/browser-assist-gate.ts +383 -0
  541. package/mcp-server/src/services/browser-assist.ts +267 -0
  542. package/mcp-server/src/services/browser-bench.ts +477 -0
  543. package/mcp-server/src/services/browser-judgments.ts +414 -0
  544. package/mcp-server/src/services/browser-risk.ts +484 -0
  545. package/mcp-server/src/services/categories.ts +36 -19
  546. package/mcp-server/src/services/codex-config-heal.ts +403 -0
  547. package/mcp-server/src/services/desktop-assist-gate.ts +251 -0
  548. package/mcp-server/src/services/desktop-assist.ts +308 -0
  549. package/mcp-server/src/services/desktop-bench.ts +372 -0
  550. package/mcp-server/src/services/desktop-client.ts +76 -0
  551. package/mcp-server/src/services/desktop-judgments.ts +218 -0
  552. package/mcp-server/src/services/desktop-risk.ts +743 -0
  553. package/mcp-server/src/services/edit-stale.ts +299 -0
  554. package/mcp-server/src/services/embedding-service.ts +108 -0
  555. package/mcp-server/src/services/embedding-worker.ts +46 -0
  556. package/mcp-server/src/services/fb-regions.ts +221 -0
  557. package/mcp-server/src/services/file-checksums.ts +26 -9
  558. package/mcp-server/src/services/file-excerpt.ts +59 -0
  559. package/mcp-server/src/services/identity.ts +291 -0
  560. package/mcp-server/src/services/local-embeddings.ts +2 -77
  561. package/mcp-server/src/services/memory-client.ts +23 -0
  562. package/mcp-server/src/services/memory-judge-backfill.ts +462 -0
  563. package/mcp-server/src/services/memory-judgments.ts +901 -0
  564. package/mcp-server/src/services/memory-maintenance.ts +360 -0
  565. package/mcp-server/src/services/memory-retrieval.ts +349 -0
  566. package/mcp-server/src/services/memory-schema.ts +280 -0
  567. package/mcp-server/src/services/memory-sessions.ts +87 -0
  568. package/mcp-server/src/services/memory-triage.ts +182 -0
  569. package/mcp-server/src/services/memory-verification.ts +68 -0
  570. package/mcp-server/src/services/memory-writer.ts +125 -0
  571. package/mcp-server/src/services/neural-interface.ts +1217 -73
  572. package/mcp-server/src/services/profiles.ts +428 -0
  573. package/mcp-server/src/services/secret-gate.ts +52 -0
  574. package/mcp-server/src/services/server-instructions.ts +122 -0
  575. package/mcp-server/src/services/sqlite.ts +1456 -823
  576. package/mcp-server/src/services/typesafe-bench.ts +247 -0
  577. package/mcp-server/src/services/typesafe-config.ts +790 -0
  578. package/mcp-server/src/services/typesafe.ts +390 -0
  579. package/mcp-server/src/services/vector-cache.ts +255 -0
  580. package/mcp-server/src/services/whiteboard-geometry.ts +711 -0
  581. package/mcp-server/src/tools/agents.ts +539 -0
  582. package/mcp-server/src/tools/bluesky.ts +1186 -0
  583. package/mcp-server/src/tools/browser-advanced.ts +15 -6
  584. package/mcp-server/src/tools/browser-batch.ts +178 -0
  585. package/mcp-server/src/tools/browser-cheatsheet.ts +155 -0
  586. package/mcp-server/src/tools/browser-interact.ts +362 -255
  587. package/mcp-server/src/tools/browser-navigate.ts +164 -77
  588. package/mcp-server/src/tools/browser-observe.ts +2222 -1330
  589. package/mcp-server/src/tools/browser.ts +181 -107
  590. package/mcp-server/src/tools/card.ts +7 -5
  591. package/mcp-server/src/tools/choice.ts +103 -0
  592. package/mcp-server/src/tools/computer.ts +190 -0
  593. package/mcp-server/src/tools/discord.ts +10 -23
  594. package/mcp-server/src/tools/fb-groups.ts +387 -0
  595. package/mcp-server/src/tools/forget.ts +1 -1
  596. package/mcp-server/src/tools/git.ts +3 -1
  597. package/mcp-server/src/tools/gsc/experience.ts +440 -0
  598. package/mcp-server/src/tools/gsc/helpers.ts +288 -0
  599. package/mcp-server/src/tools/gsc/indexing.ts +495 -0
  600. package/mcp-server/src/tools/gsc/inspect.ts +391 -0
  601. package/mcp-server/src/tools/gsc/navigate.ts +236 -0
  602. package/mcp-server/src/tools/gsc/performance.ts +352 -0
  603. package/mcp-server/src/tools/gsc/settings.ts +564 -0
  604. package/mcp-server/src/tools/gsc.ts +95 -0
  605. package/mcp-server/src/tools/image.ts +3 -1
  606. package/mcp-server/src/tools/leonardo-browser-tools.ts +47 -37
  607. package/mcp-server/src/tools/leonardo.ts +7 -5
  608. package/mcp-server/src/tools/loop.ts +118 -25
  609. package/mcp-server/src/tools/memories.ts +65 -5
  610. package/mcp-server/src/tools/morelogin.ts +81 -0
  611. package/mcp-server/src/tools/profile.ts +122 -0
  612. package/mcp-server/src/tools/recall.ts +105 -261
  613. package/mcp-server/src/tools/reflect.ts +171 -145
  614. package/mcp-server/src/tools/remember.ts +223 -115
  615. package/mcp-server/src/tools/style-guide-tools.ts +250 -0
  616. package/mcp-server/src/tools/style-guide.ts +16 -0
  617. package/mcp-server/src/tools/sync.ts +66 -9
  618. package/mcp-server/src/tools/tictactoe.ts +3 -1
  619. package/mcp-server/src/tools/utils.ts +22 -0
  620. package/mcp-server/src/tools/whiteboard-format.ts +394 -0
  621. package/mcp-server/src/tools/whiteboard-tools.ts +191 -183
  622. package/mcp-server/src/tools/whiteboard.ts +7 -5
  623. package/mcp-server/src/tools/youtube/analytics.ts +106 -0
  624. package/mcp-server/src/tools/youtube/dedup.ts +57 -0
  625. package/mcp-server/src/tools/youtube/download.ts +41 -0
  626. package/mcp-server/src/tools/youtube/helpers.ts +183 -0
  627. package/mcp-server/src/tools/youtube/media.ts +109 -0
  628. package/mcp-server/src/tools/youtube/metadata.ts +112 -0
  629. package/mcp-server/src/tools/youtube/navigate.ts +81 -0
  630. package/mcp-server/src/tools/youtube/playlist.ts +134 -0
  631. package/mcp-server/src/tools/youtube/schedule.ts +158 -0
  632. package/mcp-server/src/tools/youtube/source.ts +101 -0
  633. package/mcp-server/src/tools/youtube/upload.ts +296 -0
  634. package/mcp-server/src/tools/youtube.ts +47 -0
  635. package/mcp-server/src/tui.ts +8 -9
  636. package/neural-interface/games/TicTacToe/1.svg +1 -0
  637. package/neural-interface/games/TicTacToe/2.svg +1 -0
  638. package/neural-interface/games/TicTacToe/3.svg +1 -0
  639. package/neural-interface/games/TicTacToe/4.svg +1 -0
  640. package/neural-interface/games/TicTacToe/5.svg +1 -0
  641. package/neural-interface/games/TicTacToe/6.svg +1 -0
  642. package/neural-interface/games/TicTacToe/7.svg +1 -0
  643. package/neural-interface/games/TicTacToe/8.svg +1 -0
  644. package/neural-interface/games/TicTacToe/9.svg +1 -0
  645. package/neural-interface/games/TicTacToe/Board.svg +1 -0
  646. package/neural-interface/games/TicTacToe/Circle.svg +1 -0
  647. package/neural-interface/games/TicTacToe/Cross.svg +1 -0
  648. package/neural-interface/i18n/en.json +7022 -0
  649. package/neural-interface/i18n/pt-BR.json +7026 -0
  650. package/neural-interface/lib/assistant-api.js +1005 -0
  651. package/neural-interface/lib/assistant-attachments.js +121 -0
  652. package/neural-interface/lib/assistant-brains/claude.js +207 -0
  653. package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +43 -0
  654. package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +56 -0
  655. package/neural-interface/lib/assistant-brains/codex.js +213 -0
  656. package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +47 -0
  657. package/neural-interface/lib/assistant-brains/opencode-route-gate.js +62 -0
  658. package/neural-interface/lib/assistant-brains/opencode.js +320 -0
  659. package/neural-interface/lib/assistant-budget.js +318 -0
  660. package/neural-interface/lib/assistant-catalog.js +731 -0
  661. package/neural-interface/lib/assistant-clarify.js +664 -0
  662. package/neural-interface/lib/assistant-config.js +232 -0
  663. package/neural-interface/lib/assistant-dispatch.js +2744 -0
  664. package/neural-interface/lib/assistant-envelope.js +582 -0
  665. package/neural-interface/lib/assistant-evidence.js +236 -0
  666. package/neural-interface/lib/assistant-hidden-models.js +272 -0
  667. package/neural-interface/lib/assistant-jev.js +117 -0
  668. package/neural-interface/lib/assistant-judgments.js +111 -0
  669. package/neural-interface/lib/assistant-media.js +335 -0
  670. package/neural-interface/lib/assistant-memory.js +398 -0
  671. package/neural-interface/lib/assistant-persona.js +444 -0
  672. package/neural-interface/lib/assistant-plan-permissions.js +448 -0
  673. package/neural-interface/lib/assistant-playbooks/design.md +87 -0
  674. package/neural-interface/lib/assistant-playbooks.js +72 -0
  675. package/neural-interface/lib/assistant-pricing.js +159 -0
  676. package/neural-interface/lib/assistant-route-gate-codex.js +163 -0
  677. package/neural-interface/lib/assistant-route-gate.js +212 -0
  678. package/neural-interface/lib/assistant-router.js +1324 -0
  679. package/neural-interface/lib/assistant-runtime.js +3337 -0
  680. package/neural-interface/lib/assistant-task-prompt.js +472 -0
  681. package/neural-interface/lib/assistant-usage.js +1688 -0
  682. package/neural-interface/lib/augmented-path.js +70 -0
  683. package/neural-interface/lib/automation-storage-migration.js +54 -0
  684. package/neural-interface/lib/backup-service.js +851 -0
  685. package/neural-interface/lib/backup-zip-reader.js +262 -0
  686. package/neural-interface/lib/browser-assist-api.js +41 -0
  687. package/neural-interface/lib/browser-console.js +176 -0
  688. package/neural-interface/lib/browser-execution.js +241 -0
  689. package/neural-interface/lib/browser-extraction.js +191 -0
  690. package/neural-interface/lib/browser-language.js +83 -0
  691. package/neural-interface/lib/browser-screenshot.js +399 -0
  692. package/neural-interface/lib/browser-semantic-context.js +639 -0
  693. package/neural-interface/lib/browser-snapshots.js +192 -0
  694. package/neural-interface/lib/browser-tab-recovery.js +119 -0
  695. package/neural-interface/lib/browser-targets.js +70 -0
  696. package/neural-interface/lib/browser-tool-policy.js +926 -0
  697. package/neural-interface/lib/claude-accounts.js +230 -0
  698. package/neural-interface/lib/claude-agent-bridge.js +3203 -0
  699. package/neural-interface/lib/claude-bypass-policy.js +99 -0
  700. package/neural-interface/lib/claude-executable.js +241 -0
  701. package/neural-interface/lib/claude-history.js +429 -0
  702. package/neural-interface/lib/claude-model-catalog.js +444 -0
  703. package/neural-interface/lib/claude-panel-requests.js +165 -0
  704. package/neural-interface/lib/claude-panel-session.js +272 -0
  705. package/neural-interface/lib/claude-permission-rules.js +153 -0
  706. package/neural-interface/lib/claude-session-cleanup.js +71 -0
  707. package/neural-interface/lib/claude-session-list.js +82 -0
  708. package/neural-interface/lib/claude-session-ops.js +140 -0
  709. package/neural-interface/lib/claude-settings-view.js +51 -0
  710. package/neural-interface/lib/claude-skin-connect.js +79 -0
  711. package/neural-interface/lib/claude-stall-policy.js +7 -0
  712. package/neural-interface/lib/claude-temporary.js +435 -0
  713. package/neural-interface/lib/cli-update-planner.js +312 -0
  714. package/neural-interface/lib/codex-capabilities.d.ts +41 -0
  715. package/neural-interface/lib/codex-capabilities.js +148 -0
  716. package/neural-interface/lib/codex-collaboration-mode.js +17 -0
  717. package/neural-interface/lib/codex-compat-rpc.js +241 -0
  718. package/neural-interface/lib/codex-mcp-approvals.js +56 -0
  719. package/neural-interface/lib/codex-mcp-apps.js +47 -0
  720. package/neural-interface/lib/codex-model-context.js +202 -0
  721. package/neural-interface/lib/codex-plan-store.js +71 -0
  722. package/neural-interface/lib/codex-request-journal.js +242 -0
  723. package/neural-interface/lib/codex-runtime-path.js +213 -0
  724. package/neural-interface/lib/codex-session-catalog.js +231 -0
  725. package/neural-interface/lib/codex-session-settings.js +46 -0
  726. package/neural-interface/lib/codex-sidepanel-permissions.js +110 -0
  727. package/neural-interface/lib/codex-thread-history.js +165 -0
  728. package/neural-interface/lib/codex-user-verification.js +34 -0
  729. package/neural-interface/lib/codex-writer-lifecycle.js +152 -0
  730. package/neural-interface/lib/confined-fs.js +256 -0
  731. package/neural-interface/lib/db.js +922 -0
  732. package/neural-interface/lib/design-md.js +9 -0
  733. package/neural-interface/lib/desktop/api.js +92 -0
  734. package/neural-interface/lib/desktop/audit.js +62 -0
  735. package/neural-interface/lib/desktop/build.js +423 -0
  736. package/neural-interface/lib/desktop/config.js +606 -0
  737. package/neural-interface/lib/desktop/coords.js +76 -0
  738. package/neural-interface/lib/desktop/fake-helper.js +1192 -0
  739. package/neural-interface/lib/desktop/frames.js +77 -0
  740. package/neural-interface/lib/desktop/grants.js +84 -0
  741. package/neural-interface/lib/desktop/guards.js +170 -0
  742. package/neural-interface/lib/desktop/helper/SynabunDesktop.swift +3056 -0
  743. package/neural-interface/lib/desktop/lease.js +51 -0
  744. package/neural-interface/lib/desktop/manager.js +545 -0
  745. package/neural-interface/lib/desktop/press-contexts.js +103 -0
  746. package/neural-interface/lib/desktop/protocol.js +495 -0
  747. package/neural-interface/lib/desktop/service.js +1202 -0
  748. package/neural-interface/lib/effort-levels.js +148 -0
  749. package/neural-interface/lib/event-loop-monitor.js +67 -0
  750. package/neural-interface/lib/exec-loop-command.js +209 -0
  751. package/neural-interface/lib/folder-picker.ps1 +77 -0
  752. package/neural-interface/lib/http-guards.js +287 -0
  753. package/neural-interface/lib/jsonl-lines.js +94 -0
  754. package/neural-interface/lib/loop-logger.js +127 -0
  755. package/neural-interface/lib/mcp-client-config.js +133 -0
  756. package/neural-interface/lib/mcp-installer.js +487 -0
  757. package/neural-interface/lib/mcp-profile-refresh-coordinator.js +78 -0
  758. package/neural-interface/lib/mcp-profile-servers.js +120 -0
  759. package/neural-interface/lib/memo-cache.js +84 -0
  760. package/neural-interface/lib/memory-api.js +758 -0
  761. package/neural-interface/lib/memory-map-api.js +1150 -0
  762. package/neural-interface/lib/memory-map-layout.js +872 -0
  763. package/neural-interface/lib/memory-map-worker.js +165 -0
  764. package/neural-interface/lib/memory-session-capture.js +81 -0
  765. package/neural-interface/lib/memory-timers.js +62 -0
  766. package/neural-interface/lib/morelogin.js +301 -0
  767. package/neural-interface/lib/native-binary-runtime.js +382 -0
  768. package/neural-interface/lib/native-loop-goal.js +33 -0
  769. package/neural-interface/lib/native-loop-providers.js +1002 -0
  770. package/neural-interface/lib/native-loop-runtime.js +747 -0
  771. package/neural-interface/lib/offline-page.js +54 -0
  772. package/neural-interface/lib/opencode-hidden-models.js +113 -0
  773. package/neural-interface/lib/opencode-history.js +253 -0
  774. package/neural-interface/lib/opencode-runtime-config.js +58 -0
  775. package/neural-interface/lib/opencode-v2-client.js +486 -0
  776. package/neural-interface/lib/opencode-v2-ws-requests.js +955 -0
  777. package/neural-interface/lib/path-confine.js +213 -0
  778. package/neural-interface/lib/plugin-installer.js +264 -0
  779. package/neural-interface/lib/project-storage.js +766 -0
  780. package/neural-interface/lib/pty-host/core.js +603 -0
  781. package/neural-interface/lib/pty-host/flow.js +43 -0
  782. package/neural-interface/lib/pty-host/host.js +47 -0
  783. package/neural-interface/lib/pty-host/manager.js +360 -0
  784. package/neural-interface/lib/pty-host/protocol.js +81 -0
  785. package/neural-interface/lib/pty-host/snapshot.js +133 -0
  786. package/neural-interface/lib/remote-policy.js +582 -0
  787. package/neural-interface/lib/rulesets/api.js +175 -0
  788. package/neural-interface/lib/rulesets/fs-safe.js +245 -0
  789. package/neural-interface/lib/rulesets/installer.js +1453 -0
  790. package/neural-interface/lib/rulesets/json-edit.js +186 -0
  791. package/neural-interface/lib/rulesets/lock.js +170 -0
  792. package/neural-interface/lib/rulesets/managed-text.js +314 -0
  793. package/neural-interface/lib/rulesets/normalise.js +24 -0
  794. package/neural-interface/lib/rulesets/render.js +84 -0
  795. package/neural-interface/lib/schedule-launch-intent.js +40 -0
  796. package/neural-interface/lib/session-cache-builder.js +524 -0
  797. package/neural-interface/lib/session-chunker.js +344 -0
  798. package/neural-interface/lib/session-indexer.js +327 -0
  799. package/neural-interface/lib/session-title-generator.js +232 -0
  800. package/neural-interface/lib/skill-prompt-bridge.js +11 -0
  801. package/neural-interface/lib/style-guide/api.js +375 -0
  802. package/neural-interface/lib/style-guide/color.js +352 -0
  803. package/neural-interface/lib/style-guide/export-css.js +99 -0
  804. package/neural-interface/lib/style-guide/export-dtcg.js +209 -0
  805. package/neural-interface/lib/style-guide/export-tailwind.js +102 -0
  806. package/neural-interface/lib/style-guide/fonts.json +227 -0
  807. package/neural-interface/lib/style-guide/import.js +1268 -0
  808. package/neural-interface/lib/style-guide/pointers.js +103 -0
  809. package/neural-interface/lib/style-guide/presets.js +232 -0
  810. package/neural-interface/lib/style-guide/render-design-md.js +319 -0
  811. package/neural-interface/lib/style-guide/schema.js +848 -0
  812. package/neural-interface/lib/style-guide/security.js +43 -0
  813. package/neural-interface/lib/style-guide/store.js +491 -0
  814. package/neural-interface/lib/style-guide/summary.js +106 -0
  815. package/neural-interface/lib/style-guide/tokens.js +170 -0
  816. package/neural-interface/lib/synabun-update-plan.js +324 -0
  817. package/neural-interface/lib/synabun-version.js +179 -0
  818. package/neural-interface/lib/system-restore.js +99 -0
  819. package/neural-interface/lib/terminal-env.js +86 -0
  820. package/neural-interface/lib/ui-blob-store.js +106 -0
  821. package/neural-interface/lib/vector-cache.js +2 -0
  822. package/neural-interface/lib/virtual-socket.js +60 -0
  823. package/neural-interface/lib/whatsapp/api.js +146 -0
  824. package/neural-interface/lib/whatsapp/auth-store.js +389 -0
  825. package/neural-interface/lib/whatsapp/baileys-adapter.js +457 -0
  826. package/neural-interface/lib/whatsapp/brain.js +128 -0
  827. package/neural-interface/lib/whatsapp/bridge.js +1499 -0
  828. package/neural-interface/lib/whatsapp/cards.js +519 -0
  829. package/neural-interface/lib/whatsapp/commands.js +92 -0
  830. package/neural-interface/lib/whatsapp/config.js +291 -0
  831. package/neural-interface/lib/whatsapp/connector/entry.mjs +25 -0
  832. package/neural-interface/lib/whatsapp/connector/manifest.json +6 -0
  833. package/neural-interface/lib/whatsapp/connector/npm-shrinkwrap.json +717 -0
  834. package/neural-interface/lib/whatsapp/connector/package.json +8 -0
  835. package/neural-interface/lib/whatsapp/fake-baileys.js +444 -0
  836. package/neural-interface/lib/whatsapp/format.js +552 -0
  837. package/neural-interface/lib/whatsapp/host-core.js +1225 -0
  838. package/neural-interface/lib/whatsapp/host.js +119 -0
  839. package/neural-interface/lib/whatsapp/identity.js +288 -0
  840. package/neural-interface/lib/whatsapp/inbound.js +149 -0
  841. package/neural-interface/lib/whatsapp/installer.js +562 -0
  842. package/neural-interface/lib/whatsapp/manager.js +638 -0
  843. package/neural-interface/lib/whatsapp/paths.js +81 -0
  844. package/neural-interface/lib/whatsapp/protocol.js +327 -0
  845. package/neural-interface/lib/whatsapp/qr-svg.js +57 -0
  846. package/neural-interface/lib/whatsapp/redact.js +130 -0
  847. package/neural-interface/lib/whatsapp/service.js +1305 -0
  848. package/neural-interface/lib/whatsapp/vendor/qrcodegen.js +848 -0
  849. package/neural-interface/package-lock.json +4431 -0
  850. package/neural-interface/package.json +58 -27
  851. package/neural-interface/public/apple-touch-icon.png +0 -0
  852. package/neural-interface/public/category-logos/synabun.png +0 -0
  853. package/neural-interface/public/claude.svg +1 -0
  854. package/neural-interface/public/favicon-16x16.png +0 -0
  855. package/neural-interface/public/favicon-32x32.png +0 -0
  856. package/neural-interface/public/icon-192.png +0 -0
  857. package/neural-interface/public/icon-512.png +0 -0
  858. package/neural-interface/public/index.html +32 -182
  859. package/neural-interface/public/index2d.html +2 -2
  860. package/neural-interface/public/install-app.html +31 -0
  861. package/neural-interface/public/logo-synabun.png +0 -0
  862. package/neural-interface/public/logoHD.png +0 -0
  863. package/neural-interface/public/manifest.json +2 -0
  864. package/neural-interface/public/mcp.svg +4 -0
  865. package/neural-interface/public/offline.html +670 -299
  866. package/neural-interface/public/onboarding.html +804 -161
  867. package/neural-interface/public/opencode-logo-dark-square.svg +1 -0
  868. package/neural-interface/public/shared/agent-runtime-options.js +596 -0
  869. package/neural-interface/public/shared/api.js +339 -28
  870. package/neural-interface/public/shared/assistant/asst-accounts.js +318 -0
  871. package/neural-interface/public/shared/assistant/asst-agents-dock.js +296 -0
  872. package/neural-interface/public/shared/assistant/asst-api.js +270 -0
  873. package/neural-interface/public/shared/assistant/asst-brain-picker.js +744 -0
  874. package/neural-interface/public/shared/assistant/asst-budget.js +333 -0
  875. package/neural-interface/public/shared/assistant/asst-composer.js +656 -0
  876. package/neural-interface/public/shared/assistant/asst-computer.js +803 -0
  877. package/neural-interface/public/shared/assistant/asst-control.js +1018 -0
  878. package/neural-interface/public/shared/assistant/asst-hosts.js +262 -0
  879. package/neural-interface/public/shared/assistant/asst-mascot.js +313 -0
  880. package/neural-interface/public/shared/assistant/asst-menu.js +375 -0
  881. package/neural-interface/public/shared/assistant/asst-panel.js +1845 -0
  882. package/neural-interface/public/shared/assistant/asst-rack-styles.js +586 -0
  883. package/neural-interface/public/shared/assistant/asst-render.js +3305 -0
  884. package/neural-interface/public/shared/assistant/asst-route.js +1653 -0
  885. package/neural-interface/public/shared/assistant/asst-roving.js +75 -0
  886. package/neural-interface/public/shared/assistant/asst-sanitize.js +117 -0
  887. package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +488 -0
  888. package/neural-interface/public/shared/assistant/asst-sidepanel.js +675 -0
  889. package/neural-interface/public/shared/assistant/asst-slash.js +258 -0
  890. package/neural-interface/public/shared/assistant/asst-state.js +727 -0
  891. package/neural-interface/public/shared/assistant/asst-styles.js +1686 -0
  892. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +1017 -0
  893. package/neural-interface/public/shared/assistant/asst-usage.js +444 -0
  894. package/neural-interface/public/shared/assistant/asst-ws.js +175 -0
  895. package/neural-interface/public/shared/automation-context.js +75 -0
  896. package/neural-interface/public/shared/blob-store.js +99 -0
  897. package/neural-interface/public/shared/cdx/cdx-capabilities.js +118 -0
  898. package/neural-interface/public/shared/cdx/cdx-cards.js +37 -0
  899. package/neural-interface/public/shared/cdx/cdx-commands.js +171 -0
  900. package/neural-interface/public/shared/cdx/cdx-context-menu.js +402 -0
  901. package/neural-interface/public/shared/cdx/cdx-context-model.js +220 -0
  902. package/neural-interface/public/shared/cdx/cdx-features.js +408 -0
  903. package/neural-interface/public/shared/cdx/cdx-icons.js +89 -0
  904. package/neural-interface/public/shared/cdx/cdx-mcp-app-host.js +414 -0
  905. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.html +6 -0
  906. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.js +56 -0
  907. package/neural-interface/public/shared/cdx/cdx-mcp-app.js +178 -0
  908. package/neural-interface/public/shared/cdx/cdx-model-catalog.js +120 -0
  909. package/neural-interface/public/shared/cdx/cdx-output-model.js +261 -0
  910. package/neural-interface/public/shared/cdx/cdx-output.js +382 -0
  911. package/neural-interface/public/shared/cdx/cdx-panel.js +1372 -0
  912. package/neural-interface/public/shared/cdx/cdx-plan.js +266 -0
  913. package/neural-interface/public/shared/cdx/cdx-protocol.js +682 -0
  914. package/neural-interface/public/shared/cdx/cdx-render.js +3381 -0
  915. package/neural-interface/public/shared/cdx/cdx-requests.js +1136 -0
  916. package/neural-interface/public/shared/cdx/cdx-styles.js +3251 -0
  917. package/neural-interface/public/shared/cdx/cdx-tabs.js +7992 -0
  918. package/neural-interface/public/shared/cdx/cdx-ws.js +363 -0
  919. package/neural-interface/public/shared/cli-status.js +169 -0
  920. package/neural-interface/public/shared/command-runner-model.js +30 -0
  921. package/neural-interface/public/shared/constants.js +22 -5
  922. package/neural-interface/public/shared/cp/cp-agents.js +186 -0
  923. package/neural-interface/public/shared/cp/cp-bash.js +252 -0
  924. package/neural-interface/public/shared/cp/cp-compose.js +159 -0
  925. package/neural-interface/public/shared/cp/cp-context-menu.js +309 -0
  926. package/neural-interface/public/shared/cp/cp-context-model.js +157 -0
  927. package/neural-interface/public/shared/cp/cp-context-window.js +80 -0
  928. package/neural-interface/public/shared/cp/cp-ctx.js +11 -0
  929. package/neural-interface/public/shared/cp/cp-diff.js +255 -0
  930. package/neural-interface/public/shared/cp/cp-event-rows.js +637 -0
  931. package/neural-interface/public/shared/cp/cp-events.js +846 -0
  932. package/neural-interface/public/shared/cp/cp-markdown.js +104 -0
  933. package/neural-interface/public/shared/cp/cp-permission-model.js +905 -0
  934. package/neural-interface/public/shared/cp/cp-permissions.js +626 -0
  935. package/neural-interface/public/shared/cp/cp-rehydrate.js +113 -0
  936. package/neural-interface/public/shared/cp/cp-restore.js +224 -0
  937. package/neural-interface/public/shared/cp/cp-session-model.js +338 -0
  938. package/neural-interface/public/shared/cp/cp-session-settings.js +254 -0
  939. package/neural-interface/public/shared/cp/cp-sessions.js +227 -0
  940. package/neural-interface/public/shared/cp/cp-statusline.js +153 -0
  941. package/neural-interface/public/shared/cp/cp-styles.js +349 -0
  942. package/neural-interface/public/shared/cp/cp-tasks-model.js +282 -0
  943. package/neural-interface/public/shared/cp/cp-tasks.js +107 -0
  944. package/neural-interface/public/shared/cp/cp-temporary-view.js +56 -0
  945. package/neural-interface/public/shared/cp/cp-temporary.js +231 -0
  946. package/neural-interface/public/shared/cp/cp-tool-cards.js +326 -0
  947. package/neural-interface/public/shared/cp/cp-tool-results.js +618 -0
  948. package/neural-interface/public/shared/cp/cp-usage-model.js +124 -0
  949. package/neural-interface/public/shared/graph-activity.js +68 -0
  950. package/neural-interface/public/shared/html-shell.js +116 -17
  951. package/neural-interface/public/shared/i18n.js +132 -34
  952. package/neural-interface/public/shared/node-positions-store.js +44 -0
  953. package/neural-interface/public/shared/ocp-hidden-models.js +116 -0
  954. package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +355 -0
  955. package/neural-interface/public/shared/ocp-v2/ocp-v2-autoaccept-button.js +35 -0
  956. package/neural-interface/public/shared/ocp-v2/ocp-v2-automation-ownership.js +72 -0
  957. package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +280 -0
  958. package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +67 -0
  959. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +179 -0
  960. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes.js +164 -0
  961. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +725 -0
  962. package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +75 -0
  963. package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +1204 -0
  964. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm-logic.js +117 -0
  965. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm.js +59 -0
  966. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-gauge.js +252 -0
  967. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +478 -0
  968. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +179 -0
  969. package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +233 -0
  970. package/neural-interface/public/shared/ocp-v2/ocp-v2-icons.js +30 -0
  971. package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +1065 -0
  972. package/neural-interface/public/shared/ocp-v2/ocp-v2-mention-hints.js +182 -0
  973. package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +655 -0
  974. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +2636 -0
  975. package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +601 -0
  976. package/neural-interface/public/shared/ocp-v2/ocp-v2-profile-inheritance.js +78 -0
  977. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +649 -0
  978. package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +35 -0
  979. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +357 -0
  980. package/neural-interface/public/shared/ocp-v2/ocp-v2-render-logic.js +189 -0
  981. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +1869 -0
  982. package/neural-interface/public/shared/ocp-v2/ocp-v2-select.js +42 -0
  983. package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +117 -0
  984. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +1714 -0
  985. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +468 -0
  986. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-widgets.js +63 -0
  987. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +366 -0
  988. package/neural-interface/public/shared/ocp-v2/ocp-v2-settings-link.js +19 -0
  989. package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +343 -0
  990. package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +746 -0
  991. package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +347 -0
  992. package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +338 -0
  993. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +3543 -0
  994. package/neural-interface/public/shared/ocp-v2/ocp-v2-subagents-logic.js +482 -0
  995. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools-logic.js +351 -0
  996. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools.js +168 -0
  997. package/neural-interface/public/shared/ocp-v2/ocp-v2-variantpicker.js +315 -0
  998. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +545 -0
  999. package/neural-interface/public/shared/provider-icons.js +30 -0
  1000. package/neural-interface/public/shared/pwa-install-page.js +34 -0
  1001. package/neural-interface/public/shared/pwa-install.css +12 -0
  1002. package/neural-interface/public/shared/pwa-install.js +28 -0
  1003. package/neural-interface/public/shared/session-title.js +100 -0
  1004. package/neural-interface/public/shared/settings/settings-ia.js +389 -0
  1005. package/neural-interface/public/shared/settings/settings-kit.js +234 -0
  1006. package/neural-interface/public/shared/settings/settings-rules.js +160 -0
  1007. package/neural-interface/public/shared/settings/settings-search.js +463 -0
  1008. package/neural-interface/public/shared/settings/settings-shell.js +570 -0
  1009. package/neural-interface/public/shared/start-bridge.js +583 -0
  1010. package/neural-interface/public/shared/state.js +5 -0
  1011. package/neural-interface/public/shared/storage.js +50 -7
  1012. package/neural-interface/public/shared/styleguide/sg-agents.js +42 -0
  1013. package/neural-interface/public/shared/styleguide/sg-brand.js +4 -0
  1014. package/neural-interface/public/shared/styleguide/sg-color-client.js +388 -0
  1015. package/neural-interface/public/shared/styleguide/sg-colors.js +151 -0
  1016. package/neural-interface/public/shared/styleguide/sg-components.js +35 -0
  1017. package/neural-interface/public/shared/styleguide/sg-history.js +41 -0
  1018. package/neural-interface/public/shared/styleguide/sg-icons-logo.js +38 -0
  1019. package/neural-interface/public/shared/styleguide/sg-imagery.js +4 -0
  1020. package/neural-interface/public/shared/styleguide/sg-import-export.js +48 -0
  1021. package/neural-interface/public/shared/styleguide/sg-kit.js +284 -0
  1022. package/neural-interface/public/shared/styleguide/sg-labels.js +318 -0
  1023. package/neural-interface/public/shared/styleguide/sg-layout.js +4 -0
  1024. package/neural-interface/public/shared/styleguide/sg-motion.js +5 -0
  1025. package/neural-interface/public/shared/styleguide/sg-panel.js +237 -0
  1026. package/neural-interface/public/shared/styleguide/sg-preview.js +138 -0
  1027. package/neural-interface/public/shared/styleguide/sg-rules.js +9 -0
  1028. package/neural-interface/public/shared/styleguide/sg-shape.js +24 -0
  1029. package/neural-interface/public/shared/styleguide/sg-state.js +132 -0
  1030. package/neural-interface/public/shared/styleguide/sg-typography.js +125 -0
  1031. package/neural-interface/public/shared/styles.css +8614 -1477
  1032. package/neural-interface/public/shared/synabun-mascot.js +1625 -0
  1033. package/neural-interface/public/shared/synabun-ticker.js +376 -0
  1034. package/neural-interface/public/shared/term-ready.js +307 -0
  1035. package/neural-interface/public/shared/term-renderer.js +343 -0
  1036. package/neural-interface/public/shared/ui-assistant-panel.js +10 -0
  1037. package/neural-interface/public/shared/ui-assistant.js +77 -0
  1038. package/neural-interface/public/shared/ui-automation-studio.js +5105 -3573
  1039. package/neural-interface/public/shared/ui-claude-panel.js +11685 -6333
  1040. package/neural-interface/public/shared/ui-codex-panel.js +12 -0
  1041. package/neural-interface/public/shared/ui-command-runner.js +251 -468
  1042. package/neural-interface/public/shared/ui-cost-widget.js +55 -34
  1043. package/neural-interface/public/shared/ui-detail.js +77 -14
  1044. package/neural-interface/public/shared/ui-explorer.js +360 -181
  1045. package/neural-interface/public/shared/ui-file-explorer.js +485 -107
  1046. package/neural-interface/public/shared/ui-help.js +2 -2
  1047. package/neural-interface/public/shared/ui-image-gallery.js +45 -21
  1048. package/neural-interface/public/shared/ui-judgments.js +1346 -0
  1049. package/neural-interface/public/shared/ui-keybinds.js +3 -2
  1050. package/neural-interface/public/shared/ui-link.js +105 -51
  1051. package/neural-interface/public/shared/ui-loading.js +222 -11
  1052. package/neural-interface/public/shared/ui-memory-maintenance.js +111 -0
  1053. package/neural-interface/public/shared/ui-menubar.js +100 -31
  1054. package/neural-interface/public/shared/ui-native-loop-router-state.js +94 -0
  1055. package/neural-interface/public/shared/ui-native-loop-router.js +493 -0
  1056. package/neural-interface/public/shared/ui-native-window-id.js +7 -0
  1057. package/neural-interface/public/shared/ui-navbar.js +357 -222
  1058. package/neural-interface/public/shared/ui-notifications.js +58 -12
  1059. package/neural-interface/public/shared/ui-opencode-panel-v2.js +17 -0
  1060. package/neural-interface/public/shared/ui-panels.js +15 -7
  1061. package/neural-interface/public/shared/ui-resume.js +823 -653
  1062. package/neural-interface/public/shared/ui-schedule-queue.js +172 -0
  1063. package/neural-interface/public/shared/ui-schedules-studio.js +1882 -0
  1064. package/neural-interface/public/shared/ui-scroll-follow.js +194 -0
  1065. package/neural-interface/public/shared/ui-sessions.js +789 -34
  1066. package/neural-interface/public/shared/ui-settings.js +5774 -2194
  1067. package/neural-interface/public/shared/ui-sidepanel-layout.js +109 -0
  1068. package/neural-interface/public/shared/ui-sidepanel-runtime.js +19 -0
  1069. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +40 -0
  1070. package/neural-interface/public/shared/ui-sidepanel-sessions.js +221 -0
  1071. package/neural-interface/public/shared/ui-sidepanel-state.js +131 -0
  1072. package/neural-interface/public/shared/ui-sidepanel-tray.js +547 -0
  1073. package/neural-interface/public/shared/ui-sidepanel-windows.js +387 -0
  1074. package/neural-interface/public/shared/ui-skills.js +18 -32
  1075. package/neural-interface/public/shared/ui-styleguide.js +35 -0
  1076. package/neural-interface/public/shared/ui-sync.js +87 -0
  1077. package/neural-interface/public/shared/ui-terminal.js +7863 -6385
  1078. package/neural-interface/public/shared/ui-tool-updates.js +292 -0
  1079. package/neural-interface/public/shared/ui-tooltip.js +156 -15
  1080. package/neural-interface/public/shared/ui-tutorial-draw.js +119 -683
  1081. package/neural-interface/public/shared/ui-tutorial-layout.js +135 -0
  1082. package/neural-interface/public/shared/ui-tutorial-steps.js +59 -2209
  1083. package/neural-interface/public/shared/ui-tutorial.css +102 -0
  1084. package/neural-interface/public/shared/ui-tutorial.js +557 -1076
  1085. package/neural-interface/public/shared/ui-update.js +420 -68
  1086. package/neural-interface/public/shared/ui-whatsapp.js +941 -0
  1087. package/neural-interface/public/shared/ui-whiteboard.js +1076 -233
  1088. package/neural-interface/public/shared/ui-workspaces.js +2 -1
  1089. package/neural-interface/public/shared/utils.js +58 -0
  1090. package/neural-interface/public/shared/vterm-buffer.js +15 -5
  1091. package/neural-interface/public/shared/whatsapp/wa-phone.js +65 -0
  1092. package/neural-interface/public/shared/whatsapp/wa-view.js +411 -0
  1093. package/neural-interface/public/sidepanel-session.html +18 -0
  1094. package/neural-interface/public/sw.js +10 -2
  1095. package/neural-interface/public/synabun.png +0 -0
  1096. package/neural-interface/public/variant/2d/graph.js +1707 -1635
  1097. package/neural-interface/public/variant/2d/lasso.js +2 -1
  1098. package/neural-interface/public/variant/2d/layout.js +595 -594
  1099. package/neural-interface/public/variant/2d/main.js +557 -521
  1100. package/neural-interface/public/variant/2d/settings-gfx.js +18 -24
  1101. package/neural-interface/public/variant/3d/main.js +517 -500
  1102. package/neural-interface/public/variant/3d/map-controls.js +144 -0
  1103. package/neural-interface/public/variant/3d/map-data.js +251 -0
  1104. package/neural-interface/public/variant/3d/map-labels.js +241 -0
  1105. package/neural-interface/public/variant/3d/map-pick.js +90 -0
  1106. package/neural-interface/public/variant/3d/map-renderer.js +521 -0
  1107. package/neural-interface/public/variant/3d/map-shaders.js +158 -0
  1108. package/neural-interface/public/variant/3d/map-view.js +618 -0
  1109. package/neural-interface/public/vendor/three/manifest.json +3 -0
  1110. package/neural-interface/public/vendor/three/three-0.169.0.min.js +3844 -0
  1111. package/neural-interface/public/vendor/xterm/manifest.json +3 -0
  1112. package/neural-interface/public/vendor/xterm/xterm-6.0.0.css +285 -0
  1113. package/neural-interface/public/vendor/xterm/xterm-6.0.0.min.js +192 -0
  1114. package/neural-interface/scripts/build-vendor.mjs +64 -0
  1115. package/neural-interface/scripts/codex-protocol-fixture.mjs +83 -0
  1116. package/neural-interface/scripts/rebuild-pty.js +39 -22
  1117. package/neural-interface/scripts/vendor-three-entry.js +24 -0
  1118. package/neural-interface/scripts/vendor-xterm-entry.js +8 -0
  1119. package/neural-interface/server.js +33983 -15000
  1120. package/neural-interface/skins/default/skin.css +90 -0
  1121. package/neural-interface/skins/default/skin.json +8 -0
  1122. package/neural-interface/templates/rulesets/README.md +9 -0
  1123. package/neural-interface/templates/rulesets/claude.md +3 -0
  1124. package/neural-interface/templates/rulesets/codex.md +2 -0
  1125. package/neural-interface/templates/rulesets/coexistence.md +6 -0
  1126. package/neural-interface/templates/rulesets/core.md +26 -0
  1127. package/neural-interface/templates/rulesets/cursor.md +2 -0
  1128. package/neural-interface/templates/rulesets/gemini.md +2 -0
  1129. package/neural-interface/templates/rulesets/legacy-hashes.json +227 -0
  1130. package/neural-interface/templates/rulesets/manifest.json +12 -0
  1131. package/neural-interface/templates/rulesets/opencode.md +2 -0
  1132. package/package.json +131 -53
  1133. package/postinstall.js +55 -26
  1134. package/preuninstall.js +187 -0
  1135. package/scripts/restore-data-home-from-backup.mjs +239 -0
  1136. package/setup.js +872 -260
  1137. package/skills/leonardo/SKILL.md +19 -10
  1138. package/skills/leonardo/modules/image-prompter.md +18 -12
  1139. package/skills/leonardo/modules/video-prompter.md +19 -13
  1140. package/skills/synabun/SKILL.md +209 -185
  1141. package/skills/synabun/icon.png +0 -0
  1142. package/skills/synabun/modules/audit.md +380 -374
  1143. package/skills/synabun/modules/changelog.md +15 -6
  1144. package/skills/synabun/modules/idea.md +148 -144
  1145. package/skills/synabun/modules/memorize.md +13 -4
  1146. package/skills/synabun/modules/schedule.md +198 -0
  1147. package/skills/synabun/synabunicon.png +0 -0
  1148. package/updater.cmd +31 -0
  1149. package/updater.mjs +382 -0
  1150. package/updater.sh +29 -0
  1151. package/hooks/claude-code/test-user-learning.mjs +0 -531
  1152. package/neural-interface/public/claude-chat.css +0 -878
  1153. package/neural-interface/public/claude-chat.html +0 -92
  1154. package/neural-interface/public/claude-chat.js +0 -1168
  1155. package/neural-interface/public/index-legacy.html +0 -14677
  1156. package/neural-interface/public/index2d-legacy.html +0 -8193
  1157. package/neural-interface/public/shared/html-term-renderer.js +0 -1022
  1158. package/neural-interface/public/variant/3d/background.js +0 -884
  1159. package/neural-interface/public/variant/3d/camera.js +0 -661
  1160. package/neural-interface/public/variant/3d/gfx.js +0 -116
  1161. package/neural-interface/public/variant/3d/graph.js +0 -2399
  1162. package/neural-interface/public/variant/3d/settings-gfx.js +0 -228
  1163. package/neural-interface/templates/CLAUDE-template.md +0 -211
@@ -0,0 +1,901 @@
1
+ /**
2
+ * SynaBun's judgment definitions — the questions, not the transport.
3
+ *
4
+ * Each function here replaces a heuristic that used to be a regex or a bare
5
+ * similarity constant. All of them return null when the judgment is
6
+ * unavailable, and every caller keeps its original heuristic as the fallback
7
+ * path. Keep the wording of instructions/criteria stable: changing them
8
+ * invalidates the cache and moves the numbers the bench was calibrated on.
9
+ */
10
+
11
+ import { createHash } from 'node:crypto';
12
+ import { judge, choice, noul, score, readChoice, readNoul, readScore, type Answers, type JudgeOptions } from './typesafe.js';
13
+
14
+ /** Where a judgment came from and what it is about, for the log and the usage counters. */
15
+ export type JudgeContext = Pick<JudgeOptions, 'origin' | 'entityId' | 'onUsage' | 'noCache' | 'timeoutMs' | 'sessionId' | 'project' | 'onLogged'>;
16
+
17
+ /**
18
+ * Bound a text before it goes into a state. The API counts every token and
19
+ * caps state plus the longest question at 32k; a 40k-char memory with three
20
+ * 40k-char neighbours is a 400, not a better question. Relations went over
21
+ * that cap on large JSON captures during the first backfill.
22
+ */
23
+ const clip = (text: string, max: number) => (text.length > max ? `${text.slice(0, max)}… [truncated, ${text.length} chars total]` : text);
24
+ /** Per-text budgets: one memory alone, and each text in a multi-text state. */
25
+ const MEMORY_CLIP = 12_000;
26
+ const CANDIDATE_CLIP = 6_000;
27
+
28
+ // --- Importance (Surface B) ---
29
+
30
+ /**
31
+ * SynaBun's documented 1-10 bands as ordered Score levels, indexed from 0.
32
+ * The band -> integer mapping lives in code, not in the model: the model
33
+ * judges position on a rubric, code decides what that means numerically.
34
+ */
35
+ export const IMPORTANCE_LEVELS = [
36
+ 'Trivial: a passing detail with no reuse value — a typo, a one-off command, small talk.',
37
+ 'Low: mildly useful context that would rarely change a future decision.',
38
+ 'Normal: a routine but real outcome — a completed task, a config change, a fix worth recalling.',
39
+ 'Significant: a non-obvious finding, an API quirk, or a gotcha that will save real time later.',
40
+ 'Critical: something that prevents damage or rework — a hard-won lesson, a dangerous operation to avoid.',
41
+ 'Foundational: a core architectural decision the whole project rests on.',
42
+ ];
43
+ const BAND_TO_IMPORTANCE = [1.5, 3.5, 5, 6.5, 8.5, 10];
44
+
45
+ /** Interpolate a fractional band position onto the 1-10 importance scale. */
46
+ export function bandToImportance(band: number): number {
47
+ const clamped = Math.max(0, Math.min(band, BAND_TO_IMPORTANCE.length - 1));
48
+ const low = Math.floor(clamped);
49
+ const high = Math.min(low + 1, BAND_TO_IMPORTANCE.length - 1);
50
+ return BAND_TO_IMPORTANCE[low] + (BAND_TO_IMPORTANCE[high] - BAND_TO_IMPORTANCE[low]) * (clamped - low);
51
+ }
52
+
53
+ export const MEMORY_KINDS = {
54
+ decision: 'A choice that was made and the reasoning behind it — architecture, approach, tooling, policy.',
55
+ issue: 'A bug, failure, breakage or open problem, whether or not it was resolved.',
56
+ preference: 'How this person wants work done — style, tone, workflow, tools they favour or refuse.',
57
+ fact: 'A stable piece of reference information: an ID, a path, a credential location, an API contract.',
58
+ note: 'Anything else worth keeping that is not a decision, issue, preference or reference fact.',
59
+ } as const;
60
+
61
+ export interface MemoryJudgment {
62
+ importance: number | null;
63
+ importanceConfidence: number;
64
+ kind: string | null;
65
+ kindConfidence: number;
66
+ }
67
+
68
+ /**
69
+ * Judge a memory's long-term importance and its kind in one request.
70
+ * Both questions read the same state, so they run in parallel server-side.
71
+ */
72
+ export async function judgeMemory(
73
+ content: string,
74
+ context: { category?: string; project?: string } = {},
75
+ options: JudgeContext = {},
76
+ ): Promise<MemoryJudgment | null> {
77
+ const answers = await judge(
78
+ { memory_text: clip(content, MEMORY_CLIP), category: context.category ?? null, project: context.project ?? null },
79
+ {
80
+ importance: score(
81
+ 'How important is `memory_text` to this project long-term? Judge the durable value of the ' +
82
+ 'information itself, not how long the text is or how confidently it is written.',
83
+ IMPORTANCE_LEVELS,
84
+ ),
85
+ kind: choice(
86
+ 'What kind of record is `memory_text`? Judge the content, not the category label it was filed under.',
87
+ MEMORY_KINDS as unknown as Record<string, string>,
88
+ ),
89
+ },
90
+ { ...options, surface: 'importance-kind' },
91
+ );
92
+ if (!answers) return null;
93
+ const importance = readScore(answers.importance);
94
+ const kind = readChoice(answers.kind);
95
+ return {
96
+ importance: importance ? bandToImportance(importance.score) : null,
97
+ importanceConfidence: importance?.confidence ?? 0,
98
+ kind: kind?.choice ?? null,
99
+ kindConfidence: kind?.confidence ?? 0,
100
+ };
101
+ }
102
+
103
+ // --- Relations (Surface A) ---
104
+
105
+ /** Relation kinds `memory_relations.kind` accepts for an automatic verdict. */
106
+ export type JudgedRelation = 'duplicate_of' | 'possible_conflict' | 'similar' | null;
107
+
108
+ // A knowledge base full of automation logs contains many near-identical records
109
+ // that describe SEPARATE OCCURRENCES of a recurring event — the same scheduled
110
+ // post on four different days. Without saying so, a judgment reads the shared
111
+ // wording plus the differing date as a contradiction. Every option below has to
112
+ // distinguish "another occurrence" from "an incompatible claim".
113
+ const RELATION_OPTIONS = {
114
+ duplicate: 'The same fact about the same single occurrence, stated twice. One could be deleted without losing information. NOT two records of a recurring event that happened on different dates.',
115
+ conflicting: 'They make incompatible claims about the same thing at the same time — accepting one means rejecting the other. A later record describing a separate, repeated occurrence is NOT a conflict, and neither is a record that simply updates or supersedes an older state.',
116
+ related: 'About the same subject and useful together — including repeated runs of the same recurring activity on different dates, where each record documents its own occurrence.',
117
+ unrelated: 'They only share vocabulary or topic area. Neither helps you understand the other.',
118
+ };
119
+
120
+ export interface RelationJudgment {
121
+ relation: JudgedRelation;
122
+ confidence: number;
123
+ contradiction: number | null;
124
+ /** P(the later-dated record replaces the earlier one); null when not asked or not answered. */
125
+ supersedes: number | null;
126
+ }
127
+
128
+ /** Cutoffs mapRelation applies; the duplicate one is the relations surface's minConfidence. */
129
+ export interface RelationThresholds { duplicate: number; contradiction: number }
130
+ export const DEFAULT_RELATION_THRESHOLDS: RelationThresholds = { duplicate: 0.7, contradiction: 0.5 };
131
+
132
+ /**
133
+ * Decide how each candidate relates to one source memory.
134
+ *
135
+ * Replaces a bare cosine cutoff plus a negation-word regex. Every candidate is
136
+ * judged in a single request against shared state — the source text is sent
137
+ * once rather than once per pair. For each candidate the Choice picks the
138
+ * relation and an independent Noul gives a calibrated contradiction
139
+ * probability, used to stop a low-confidence "conflicting" from writing a
140
+ * conflict flag.
141
+ */
142
+ export async function judgeRelations(
143
+ source: { content: string; recordedAt?: string } | string,
144
+ candidates: { id: string; content: string; recordedAt?: string }[],
145
+ options: JudgeContext & { askSupersession?: boolean; thresholds?: RelationThresholds } = {},
146
+ ): Promise<Map<string, RelationJudgment> | null> {
147
+ if (!candidates.length) return new Map();
148
+ const { askSupersession = false, thresholds = DEFAULT_RELATION_THRESHOLDS, ...context } = options;
149
+ const src = typeof source === 'string' ? { content: source } : source;
150
+ const questions: Record<string, ReturnType<typeof choice> | ReturnType<typeof noul>> = {};
151
+ candidates.forEach((_, i) => {
152
+ // Supersession rides in the same request: it reads the same pair and dates.
153
+ if (askSupersession) questions[`supersedes_${i}`] = supersessionQuestion(i);
154
+ questions[`relation_${i}`] = choice(
155
+ `Two records from the same knowledge base were retrieved as similar. How does \`candidates[${i}]\` relate to \`memory\`? ` +
156
+ 'Compare `memory.recorded_at` against the candidate\'s own `recorded_at`: records written on different dates usually ' +
157
+ 'document separate occurrences rather than competing versions of one fact.',
158
+ RELATION_OPTIONS,
159
+ );
160
+ questions[`contradiction_${i}`] = noul(
161
+ `Do \`memory.content\` and \`candidates[${i}].content\` make claims that cannot both be true at the same time?`,
162
+ {
163
+ true: 'They assert mutually exclusive things about the same subject at the same moment — believing one requires disbelieving the other.',
164
+ false: 'They agree, describe different subjects, one merely adds detail, or they record the SAME recurring activity happening on different dates. Two logs of a scheduled job on separate days are both true.',
165
+ },
166
+ );
167
+ });
168
+ const answers = await judge(
169
+ {
170
+ memory: { content: clip(src.content, CANDIDATE_CLIP), recorded_at: src.recordedAt ?? null },
171
+ candidates: candidates.map(c => ({ content: clip(c.content, CANDIDATE_CLIP), recorded_at: c.recordedAt ?? null })),
172
+ },
173
+ questions,
174
+ { ...context, surface: 'relations', riders: askSupersession ? ['supersession'] : undefined },
175
+ );
176
+ if (!answers) return null;
177
+ const verdicts = new Map<string, RelationJudgment>();
178
+ candidates.forEach((candidate, i) => {
179
+ const relation = readChoice(answers[`relation_${i}`]);
180
+ if (!relation) return;
181
+ const contradiction = readNoul(answers[`contradiction_${i}`]);
182
+ verdicts.set(candidate.id, {
183
+ relation: mapRelation(relation.choice, relation.confidence, contradiction, thresholds),
184
+ confidence: relation.confidence,
185
+ contradiction,
186
+ supersedes: askSupersession ? readNoul(answers[`supersedes_${i}`]) : null,
187
+ });
188
+ });
189
+ return verdicts;
190
+ }
191
+
192
+ /**
193
+ * "Is the later record a newer statement of the same single thing?" Only the
194
+ * dates decide direction; the caller writes `supersedes` from newer to older.
195
+ * Recurring activities are the trap: a Tuesday log does not replace Monday's.
196
+ */
197
+ const supersessionQuestion = (i: number) => noul(
198
+ `\`memory\` and \`candidates[${i}]\` are two records from the same project and category, each dated by its \`recorded_at\`. ` +
199
+ 'Is the later-dated of the two a newer statement of the same single thing the earlier one describes — the same setting, value, rule, ' +
200
+ 'decision, status or design, since changed — so that the earlier record no longer describes how things are now?',
201
+ {
202
+ true: 'The later record replaces the earlier one: same subject, its value or state has changed since, and keeping the earlier one as current would mislead.',
203
+ false: 'Both stay true: different things, separate occurrences of a recurring activity on different dates, the later one only adds detail, or both state the same fact.',
204
+ },
205
+ );
206
+
207
+ /**
208
+ * Map a judgment onto a stored relation.
209
+ *
210
+ * `duplicate_of` suppresses a memory in the interface, so it needs agreement
211
+ * from a confident Choice. A conflict flag needs the contradiction Noul to
212
+ * agree as well — the two questions are answered independently, so requiring
213
+ * both is a real check rather than asking the same thing twice.
214
+ */
215
+ export function mapRelation(label: string, confidence: number, contradiction: number | null, thresholds: RelationThresholds = DEFAULT_RELATION_THRESHOLDS): JudgedRelation {
216
+ if (label === 'unrelated') return null;
217
+ if (label === 'duplicate') return confidence >= thresholds.duplicate ? 'duplicate_of' : 'similar';
218
+ if (label === 'conflicting') return contradiction === null || contradiction >= thresholds.contradiction ? 'possible_conflict' : 'similar';
219
+ return 'similar';
220
+ }
221
+
222
+ // --- Recall (Surface C) ---
223
+
224
+ /**
225
+ * Is the caller asking about prior/superseded state?
226
+ *
227
+ * Replaces `/history|histor|previous|old|antes|anterior/i`, which only ever
228
+ * spoke English and Portuguese — every other language silently lost its
229
+ * superseded results.
230
+ */
231
+ export async function judgeHistoricalQuery(query: string, options: JudgeContext = {}): Promise<boolean | null> {
232
+ const answers = await judge(
233
+ { query },
234
+ {
235
+ historical: noul(
236
+ 'Is `query` asking about the past — what something used to be, how it changed, or an ' +
237
+ 'earlier version — rather than asking only for the current state of things?',
238
+ {
239
+ true: 'Asks for history, prior versions, what changed, or what a thing was before.',
240
+ false: 'Asks only what is true now.',
241
+ },
242
+ ),
243
+ },
244
+ // Recall is on the hot path; a slow judgment is worth less than the
245
+ // existing fusion ordering shipped on time. The budget is the surface's
246
+ // timeout (1200 ms by default) so the settings page can tune it.
247
+ { ...options, surface: 'historical-query' },
248
+ );
249
+ const value = readNoul(answers?.historical);
250
+ return value === null ? null : value >= 0.5;
251
+ }
252
+
253
+ /** Ordered rubric for "how much does this record help answer the query". */
254
+ export const RELEVANCE_LEVELS = [
255
+ 'Irrelevant: shares only vocabulary or topic area, and does not help answer the query.',
256
+ 'Tangential: the same general subject, but it does not address what was actually asked.',
257
+ 'Background: useful supporting context that makes the answer easier to act on.',
258
+ 'Direct: addresses the specific thing the query asks about.',
259
+ 'Decisive: contains the answer itself, or the constraint that determines it.',
260
+ ];
261
+
262
+ /**
263
+ * Relevance budgets. A 16k-character task prompt plus ten whole memories was
264
+ * 6–17k tokens of state and timed out inside a 1.5 s hook budget. Callers send
265
+ * an excerpt centred on the query terms (what would be injected, plus nearby
266
+ * context); these clips are the safety net. The query is cut, not the search:
267
+ * retrieval still used all of it.
268
+ */
269
+ export const RELEVANCE_QUERY_CLIP = 2_000;
270
+ export const RELEVANCE_CANDIDATE_CLIP = 1_000;
271
+
272
+ /**
273
+ * Score each retrieved candidate against the query, in one request.
274
+ *
275
+ * Runs after fusion, never instead of it: fusion decides what is retrievable,
276
+ * this decides what leads. Returns null on any failure so the caller ships the
277
+ * fusion order untouched. A single candidate is judged only when the caller
278
+ * will act on its score alone (`single`: a relevance floor).
279
+ */
280
+ export async function judgeRelevance(
281
+ query: string,
282
+ candidates: { id: string; content: string }[],
283
+ options: JudgeContext & { surface?: 'rerank' | 'brief-rank'; single?: boolean } = {},
284
+ ): Promise<Map<string, number> | null> {
285
+ const { surface = 'rerank', single = false, ...context } = options;
286
+ if (candidates.length < (single ? 1 : 2)) return new Map();
287
+ const questions: Record<string, ReturnType<typeof score>> = {};
288
+ candidates.forEach((_, i) => {
289
+ questions[`relevance_${i}`] = score(
290
+ `How much does \`candidates[${i}].content\` help answer \`query\`?`,
291
+ RELEVANCE_LEVELS,
292
+ );
293
+ });
294
+ const answers = await judge(
295
+ { query: clip(query, RELEVANCE_QUERY_CLIP), candidates: candidates.map(c => ({ content: clip(c.content, RELEVANCE_CANDIDATE_CLIP) })) },
296
+ questions,
297
+ { ...context, surface },
298
+ );
299
+ if (!answers) return null;
300
+ const scores = new Map<string, number>();
301
+ candidates.forEach((candidate, i) => {
302
+ const relevance = readScore(answers[`relevance_${i}`]);
303
+ if (relevance) scores.set(candidate.id, relevance.score);
304
+ });
305
+ return scores.size ? scores : null;
306
+ }
307
+
308
+ /**
309
+ * Reorder by judged relevance, moving only judged items: they are re-sorted
310
+ * among the positions judged items already hold, and every unjudged item keeps
311
+ * its fusion position. Ties keep fusion order (the sort is stable).
312
+ */
313
+ export function orderByJudgedScore<T extends { id: string }>(items: T[], scores: Map<string, number>): T[] {
314
+ const slots: number[] = [];
315
+ items.forEach((item, i) => { if (scores.has(item.id)) slots.push(i); });
316
+ const judged = slots.map(i => items[i]).sort((a, b) => scores.get(b.id)! - scores.get(a.id)!);
317
+ const out = [...items];
318
+ slots.forEach((slot, k) => { out[slot] = judged[k]; });
319
+ return out;
320
+ }
321
+
322
+ /** The rubric label nearest a fractional relevance score ("Direct", "Tangential"…). */
323
+ export function relevanceLevel(value: number): string {
324
+ const index = Math.max(0, Math.min(RELEVANCE_LEVELS.length - 1, Math.round(value)));
325
+ return RELEVANCE_LEVELS[index].split(':')[0];
326
+ }
327
+
328
+ // --- Hooks (Surface D) ---
329
+
330
+ export type RecallUrgency = 'must' | 'should' | 'consider' | 'skip';
331
+
332
+ const RECALL_OPTIONS = {
333
+ must: 'Asks directly about past work, a prior decision, or something "we" already did or discussed.',
334
+ should: 'Continues existing project work where earlier context would likely change the answer.',
335
+ consider: 'A new task in a known project; prior context might help but the request stands alone.',
336
+ skip: 'Self-contained — a greeting, a one-off question, or a fully specified instruction needing no history.',
337
+ };
338
+
339
+ export interface PromptJudgment { urgency: RecallUrgency; confidence: number }
340
+
341
+ const urgencyQuestion = () => choice(
342
+ 'A developer sent `prompt` to an AI assistant that has a persistent memory of their past work. ' +
343
+ 'How much would searching that memory before answering change the quality of the reply? ' +
344
+ 'Judge the intent in any language.',
345
+ RECALL_OPTIONS,
346
+ );
347
+
348
+ /** Replaces the Tier1/Tier2/Tier3 regex ladder plus the non-Latin character ratio test. */
349
+ export async function judgePrompt(prompt: string, project?: string, options: JudgeContext = {}): Promise<PromptJudgment | null> {
350
+ const answers = await judge(
351
+ { prompt, project: project ?? null },
352
+ { urgency: urgencyQuestion() },
353
+ { ...options, surface: 'prompt-urgency' },
354
+ );
355
+ const urgency = readChoice(answers?.urgency);
356
+ if (!urgency || !(urgency.choice in RECALL_OPTIONS)) return null;
357
+ return { urgency: urgency.choice as RecallUrgency, confidence: urgency.confidence };
358
+ }
359
+
360
+ export interface PromptTurnAsk { urgency: boolean; newTask: boolean; pastSession: boolean; revealsPreference: boolean }
361
+ export interface PromptTurnInput {
362
+ prompt: string; project?: string;
363
+ /** Edits made for earlier requests and not yet stored in memory; only read when `newTask` is asked. */
364
+ unsavedWork?: { previousPrompt?: string | null; files?: string[]; editCount?: number } | null;
365
+ }
366
+ export interface PromptTurnJudgment {
367
+ urgency?: RecallUrgency; confidence?: number;
368
+ /** P(yes) per rider; absent when not asked or not answered. */
369
+ newTask?: number; pastSession?: number; revealsPreference?: number;
370
+ }
371
+
372
+ const PROMPT_TURN_CLIP = 6_000;
373
+
374
+ /**
375
+ * Everything the prompt hook wants to know about a new prompt, in one request.
376
+ * Urgency leads; the riders (task boundary, session lookup, user learning) ride
377
+ * along only when asked, and their answers cannot see each other's. Asking for
378
+ * urgency alone sends exactly what `judgePrompt` sends, so the cache and the
379
+ * calibration it was benched on survive. `unsaved_work` joins the state only
380
+ * when the task-boundary question needs it.
381
+ */
382
+ export async function judgePromptTurn(input: PromptTurnInput, ask: PromptTurnAsk, options: JudgeContext = {}): Promise<PromptTurnJudgment | null> {
383
+ const riders = ([['task-boundary', ask.newTask], ['session-lookup', ask.pastSession], ['user-learning', ask.revealsPreference]] as const)
384
+ .filter(([, on]) => on).map(([name]) => name as string);
385
+ if (!ask.urgency && !riders.length) return null;
386
+ if (ask.urgency && !riders.length) {
387
+ const verdict = await judgePrompt(input.prompt, input.project, options);
388
+ return verdict ? { urgency: verdict.urgency, confidence: verdict.confidence } : null;
389
+ }
390
+ const state: Record<string, unknown> = { prompt: clip(input.prompt, PROMPT_TURN_CLIP), project: input.project ?? null };
391
+ if (ask.newTask && input.unsavedWork) {
392
+ state.unsaved_work = {
393
+ previous_prompt: input.unsavedWork.previousPrompt ? clip(input.unsavedWork.previousPrompt, 2000) : null,
394
+ files_edited: (input.unsavedWork.files ?? []).slice(0, 10),
395
+ edit_count: input.unsavedWork.editCount ?? 0,
396
+ };
397
+ }
398
+ const questions: Record<string, ReturnType<typeof choice> | ReturnType<typeof noul>> = {};
399
+ if (ask.urgency) questions.urgency = urgencyQuestion();
400
+ if (ask.newTask) {
401
+ questions.new_task = noul(
402
+ '`prompt` is the developer\'s newest message. `unsaved_work` describes changes the assistant made for earlier requests that are not yet recorded in memory: ' +
403
+ 'the files it edited and, in `unsaved_work.previous_prompt`, the request that started them. Does `prompt` begin a different task instead of continuing that work?',
404
+ {
405
+ true: 'A different task: a new feature, bug, question or area of the code, or the developer says the earlier work is done or dropped.',
406
+ false: 'The same work continues: a follow-up, a correction, a review, a test, a question about those edits or their result, or approval to go on.',
407
+ },
408
+ );
409
+ }
410
+ if (ask.pastSession) {
411
+ questions.past_session = noul(
412
+ 'Does `prompt` ask about an earlier session or conversation with the assistant — what was said, decided or done then, or where that work was left — ' +
413
+ 'so that answering needs the record of that past session rather than the current code or this conversation?',
414
+ {
415
+ true: 'It points back to a previous session: "what did we decide yesterday", "continue where we left off", "find the chat where we fixed the login bug".',
416
+ false: 'It concerns the code, the project or the current conversation; a mention of time or history on its own does not count.',
417
+ },
418
+ );
419
+ }
420
+ if (ask.revealsPreference) {
421
+ questions.reveals_preference = noul(
422
+ 'Does `prompt` show how this developer wants the assistant to work in general — a correction of its approach, a standing instruction, ' +
423
+ 'or a preference about style, tools, communication or workflow that should still apply after this request?',
424
+ {
425
+ true: 'A lasting preference or rule: "always run the tests before committing", "stop adding comments", "answer in Portuguese", "don\'t touch the dist folder", or frustration with a habit of the assistant.',
426
+ false: 'Only this request\'s content, or a preference that applies to this one task alone.',
427
+ },
428
+ );
429
+ }
430
+ // The lead is the request's owner: its switch and timeout govern the call.
431
+ const lead = ask.urgency ? 'prompt-urgency' : riders[0];
432
+ const answers = await judge(state, questions, { ...options, surface: lead, riders: riders.filter(r => r !== lead) });
433
+ if (!answers) return null;
434
+ const out: PromptTurnJudgment = {};
435
+ const urgency = readChoice(answers.urgency);
436
+ if (urgency && urgency.choice in RECALL_OPTIONS) { out.urgency = urgency.choice as RecallUrgency; out.confidence = urgency.confidence; }
437
+ const newTask = readNoul(answers.new_task), pastSession = readNoul(answers.past_session), preference = readNoul(answers.reveals_preference);
438
+ if (newTask !== null) out.newTask = newTask;
439
+ if (pastSession !== null) out.pastSession = pastSession;
440
+ if (preference !== null) out.revealsPreference = preference;
441
+ return Object.keys(out).length ? out : null;
442
+ }
443
+
444
+ export interface BlockedJudgment { humanBlocker: boolean; waitingForUser: boolean }
445
+
446
+ /**
447
+ * Two independent reads of the agent's last message, batched over one state.
448
+ * Replaces two near-identical substring lists in stop.mjs.
449
+ */
450
+ export async function judgeAgentMessage(message: string): Promise<BlockedJudgment | null> {
451
+ const answers: Answers | null = await judge(
452
+ { agent_message: message },
453
+ {
454
+ human_blocker: noul(
455
+ 'Has the assistant stopped because a person must act in a browser before it can continue — ' +
456
+ 'signing in, solving a CAPTCHA, or entering a verification code?',
457
+ {
458
+ true: 'It is blocked on a credential or challenge only a human can supply.',
459
+ false: 'It finished, or it is blocked on something else entirely.',
460
+ },
461
+ ),
462
+ waiting_for_user: noul(
463
+ 'Is the assistant waiting on any user action at all before it can continue — a file, a choice, ' +
464
+ 'a confirmation, or a credential?',
465
+ {
466
+ true: 'It asked for something and cannot usefully proceed until it arrives.',
467
+ false: 'It completed its work or is reporting a result.',
468
+ },
469
+ ),
470
+ },
471
+ { surface: 'agent-message' },
472
+ );
473
+ if (!answers) return null;
474
+ const blocker = readNoul(answers.human_blocker);
475
+ const waiting = readNoul(answers.waiting_for_user);
476
+ if (blocker === null && waiting === null) return null;
477
+ return { humanBlocker: (blocker ?? 0) >= 0.5, waitingForUser: (waiting ?? 0) >= 0.5 };
478
+ }
479
+
480
+ // --- Write-time gates (Surface E) ---
481
+
482
+ /**
483
+ * Is a new memory the same fact as one already stored? One Noul per
484
+ * candidate over shared state. Returns P(duplicate) per candidate id, or
485
+ * null when unavailable — the caller then stores the memory as before and
486
+ * maintenance relates duplicates later.
487
+ */
488
+ export async function judgeDuplicates(
489
+ content: string,
490
+ candidates: { id: string; content: string; recordedAt?: string }[],
491
+ options: JudgeContext = {},
492
+ ): Promise<Map<string, number> | null> {
493
+ if (!candidates.length) return new Map();
494
+ const questions: Record<string, ReturnType<typeof noul>> = {};
495
+ candidates.forEach((_, i) => {
496
+ questions[`duplicate_${i}`] = noul(
497
+ `Would storing \`memory.content\` beside \`candidates[${i}].content\` add nothing, because both state the same fact about the same single occurrence?`,
498
+ {
499
+ true: 'Same fact, same occurrence: keeping both duplicates information. Wording, order or level of detail may differ.',
500
+ false: 'They differ in substance: a separate occurrence of a recurring activity (another date or run), an update that changes or supersedes the older record, additional findings, or a different subject.',
501
+ },
502
+ );
503
+ });
504
+ const answers = await judge(
505
+ {
506
+ memory: { content: clip(content, 6000), recorded_at: new Date().toISOString() },
507
+ candidates: candidates.map(c => ({ content: clip(c.content, 6000), recorded_at: c.recordedAt ?? null })),
508
+ },
509
+ questions,
510
+ { ...options, surface: 'duplicate-gate' },
511
+ );
512
+ if (!answers) return null;
513
+ const verdicts = new Map<string, number>();
514
+ candidates.forEach((candidate, i) => {
515
+ const p = readNoul(answers[`duplicate_${i}`]);
516
+ if (p !== null) verdicts.set(candidate.id, p);
517
+ });
518
+ return verdicts;
519
+ }
520
+
521
+ /**
522
+ * Keep a secret's shape without disclosing it: the first four and last two
523
+ * characters, bullets for the middle, and the true length. Short values keep
524
+ * only two characters.
525
+ */
526
+ export function maskSecret(value: string): string {
527
+ if (value.length <= 8) return `${value.slice(0, 2)}${'•'.repeat(Math.max(1, value.length - 2))} (${value.length} chars)`;
528
+ return `${value.slice(0, 4)}${'•'.repeat(Math.min(12, value.length - 6))}${value.slice(-2)} (${value.length} chars)`;
529
+ }
530
+
531
+ /**
532
+ * Are credential-looking spans real secrets? The regex prefilter decides
533
+ * what to ask about; this decides whether each span is a live credential or
534
+ * a placeholder, an example, a hash or an identifier. Returns P(secret) per
535
+ * span index (same order as `spans`), or null.
536
+ */
537
+ export async function judgeSecretSpans(
538
+ text: string,
539
+ spans: { value: string; type: string }[],
540
+ options: JudgeContext = {},
541
+ ): Promise<(number | null)[] | null> {
542
+ if (!spans.length) return [];
543
+ // The gate exists to keep secrets out of storage; shipping them to a third
544
+ // party to ask whether they are secrets would defeat it. Every candidate is
545
+ // masked before it leaves the machine, both as a span and inside the text.
546
+ // The judgment works from shape and context: prefix, length, surroundings.
547
+ const masked = spans.map(s => maskSecret(s.value));
548
+ let safeText = text;
549
+ spans.forEach((s, i) => { if (s.value) safeText = safeText.split(s.value).join(masked[i]); });
550
+ const questions: Record<string, ReturnType<typeof noul>> = {};
551
+ spans.forEach((_, i) => {
552
+ questions[`secret_${i}`] = noul(
553
+ `Is \`spans[${i}].value\`, as it appears in \`text\`, a real credential that would grant access if used — rather than a placeholder, an example, a variable name, a hash, or an identifier? ` +
554
+ 'Every value is partially masked on purpose (bullets replace its middle); judge from the visible prefix and suffix, the stated length, and the surrounding text.',
555
+ {
556
+ true: 'A real secret: an API key, access token, password or private key that is or was valid for some service.',
557
+ false: 'Not a secret in effect: a placeholder such as sk-xxxx or YOUR_KEY_HERE, a documentation example, an ID or checksum, a variable name, or a note about where a secret is kept.',
558
+ },
559
+ );
560
+ });
561
+ const answers = await judge(
562
+ { text: clip(safeText, 8000), spans: spans.map((s, i) => ({ value: masked[i], looks_like: s.type })) },
563
+ questions,
564
+ { ...options, surface: 'secret-gate' },
565
+ );
566
+ if (!answers) return null;
567
+ return spans.map((_, i) => readNoul(answers[`secret_${i}`]));
568
+ }
569
+
570
+ export interface CategoryJudgment { category: string; confidence: number; probabilities?: Record<string, number> }
571
+
572
+ /**
573
+ * Which category's description fits the content? A Choice over the live
574
+ * leaf categories plus a no-match option. The caller's pick is in the state
575
+ * so the model can weigh it, and in the options so it can be confirmed.
576
+ * Recorded and reported, never applied: the writer keeps the final say.
577
+ */
578
+ export async function judgeCategory(
579
+ content: string,
580
+ filedUnder: string,
581
+ categories: Record<string, string | null>,
582
+ options: JudgeContext = {},
583
+ ): Promise<CategoryJudgment | null> {
584
+ const names = Object.keys(categories);
585
+ if (names.length < 2) return null;
586
+ const answers = await judge(
587
+ { memory_text: clip(content, 6000), filed_under: filedUnder },
588
+ {
589
+ category: choice(
590
+ 'Which category best fits `memory_text`? Judge the content against each category\'s stated purpose. `filed_under` is where the writer put it; it may be right or wrong.',
591
+ { ...categories, 'none-of-these': 'No listed category describes this record.' },
592
+ ),
593
+ },
594
+ { ...options, surface: 'category-check' },
595
+ );
596
+ const verdict = readChoice(answers?.category);
597
+ if (!verdict) return null;
598
+ const answer = answers!.category;
599
+ return { category: verdict.choice, confidence: verdict.confidence, probabilities: answer.type === 'choice' ? answer.probabilities : undefined };
600
+ }
601
+
602
+ // --- Sync (Surface F) ---
603
+
604
+ /**
605
+ * Does a memory still describe a file that changed? The checksum only says
606
+ * the bytes moved; this says whether what the memory claims moved with them.
607
+ * Returns P(still accurate), or null.
608
+ */
609
+ export async function judgeStaleMemory(
610
+ memory: string,
611
+ file: { path: string; excerpt: string; truncated: boolean },
612
+ options: JudgeContext & { surface?: 'stale-check' | 'edit-stale' } = {},
613
+ ): Promise<number | null> {
614
+ const { surface = 'stale-check', ...context } = options;
615
+ const answers = await judge(
616
+ { memory: { content: clip(memory, 6000) }, file: { path: file.path, current_content: clip(file.excerpt, 8000), truncated: file.truncated } },
617
+ {
618
+ accurate: noul(
619
+ 'Does `memory.content` still accurately describe `file.current_content` as it is now?',
620
+ {
621
+ true: 'Still accurate: the file changed in ways that do not contradict the memory, or the memory describes something the file still does.',
622
+ false: 'Stale: the memory names code, paths, values, behaviour or structure that the current file no longer matches.',
623
+ },
624
+ ),
625
+ },
626
+ { ...context, surface },
627
+ );
628
+ return readNoul(answers?.accurate);
629
+ }
630
+
631
+ // --- Hooks, continued (Surface G) ---
632
+
633
+ export interface StopTurnJudgment {
634
+ humanBlocker?: boolean; waitingForUser?: boolean; worthRemembering?: boolean; worthProbability?: number;
635
+ /** P(the final message claims success the turn's own output does not show); absent unless asked. */
636
+ claimProbability?: number;
637
+ }
638
+
639
+ export interface TurnCommand { command: string; exit?: string | null; output_tail?: string | null }
640
+ export interface TurnToolResult { tool: string; is_error?: boolean; tail?: string | null }
641
+
642
+ /**
643
+ * "Does the final message claim a success the turn's own output does not
644
+ * show?" over `assistant_message`, `bash_commands` and `tool_results`. Shared
645
+ * by the Stop hook (claim-check) and the Assistant's workers (worker-claim), so
646
+ * the P ≥ 0.9 calibration carries over. Keep the wording stable.
647
+ */
648
+ export function unsupportedClaimQuestion() {
649
+ return noul(
650
+ '`assistant_message` is the assistant\'s report at the end of a turn; `bash_commands` and `tool_results` are what actually ran in that turn, with the end of each output. ' +
651
+ 'Does `assistant_message` state that something was verified, fixed, passing or working — tests pass, the build succeeds, the bug no longer happens — ' +
652
+ 'when nothing in `bash_commands` or `tool_results` shows it, or the output shown contradicts it?',
653
+ {
654
+ true: 'At least one success claim is unsupported: no command or tool result in this turn demonstrates it, or an exit code or error in the output contradicts it.',
655
+ false: 'Every success it claims is shown by a command or tool result here, it clearly marks things as untested or expected, or it makes no such claim.',
656
+ },
657
+ );
658
+ }
659
+
660
+ /**
661
+ * Everything the Stop hook wants to know about a finished turn, in one
662
+ * request: is the agent blocked on a person, is it waiting on the user, did
663
+ * the turn produce work worth remembering, and does the final message claim
664
+ * more than the turn showed. The surfaces are toggled independently, so only
665
+ * the enabled questions are asked; the batch is logged under the first of
666
+ * agent-message, turn-worth, claim-check that is on, with the rest as riders.
667
+ * What ran (commands, tool results) joins the shared state whenever the hook
668
+ * sends it: the claim question needs it as evidence, and the worth question
669
+ * needs it to see work that went through Bash instead of Edit/Write. A hook
670
+ * that sends neither gets exactly the state it always sent.
671
+ */
672
+ export async function judgeStopTurn(
673
+ input: { message: string; filesEdited?: string[]; editCount?: number; commands?: TurnCommand[]; toolResults?: TurnToolResult[] },
674
+ ask: { agentMessage: boolean; turnWorth: boolean; claimCheck?: boolean },
675
+ options: JudgeContext & { worthThreshold?: number } = {},
676
+ ): Promise<StopTurnJudgment | null> {
677
+ if (!ask.agentMessage && !ask.turnWorth && !ask.claimCheck) return null;
678
+ const questions: Record<string, ReturnType<typeof noul>> = {};
679
+ if (ask.agentMessage) {
680
+ questions.human_blocker = noul(
681
+ 'Has the assistant stopped because a person must act in a browser before it can continue — signing in, solving a CAPTCHA, or entering a verification code? Judge `assistant_message`.',
682
+ { true: 'It is blocked on a credential or challenge only a human can supply.', false: 'It finished, or it is blocked on something else entirely.' },
683
+ );
684
+ questions.waiting_for_user = noul(
685
+ 'Is the assistant waiting on any user action at all before it can continue — a file, a choice, a confirmation, or a credential? Judge `assistant_message`.',
686
+ { true: 'It asked for something and cannot usefully proceed until it arrives.', false: 'It completed its work or is reporting a result.' },
687
+ );
688
+ }
689
+ const ran = Boolean(input.commands?.length || input.toolResults?.length);
690
+ if (ask.turnWorth) {
691
+ questions.worth_remembering = noul(
692
+ ran
693
+ ? 'Did this turn produce work a future session would need to know about — a fix, a decision, a configuration change, or a non-obvious finding — judging from `assistant_message`, `files_edited`, `edit_count` and the commands in `bash_commands`?'
694
+ : 'Did this turn produce work a future session would need to know about — a fix, a decision, a configuration change, or a non-obvious finding — judging from `assistant_message`, `files_edited` and `edit_count`?',
695
+ {
696
+ true: 'Meaningful work: code or configuration changed in a way that matters, a bug was fixed, a decision was made, or a finding was reached that would save time later.',
697
+ false: 'Trivial or incomplete: a typo or formatting change, a scratch or temporary file, an experiment that was reverted, or nothing was actually finished.',
698
+ },
699
+ );
700
+ }
701
+ if (ask.claimCheck) questions.unsupported_claim = unsupportedClaimQuestion();
702
+ const { worthThreshold = 0.35, ...context } = options;
703
+ const state: Record<string, unknown> = { assistant_message: clip(input.message, 6000), files_edited: (input.filesEdited ?? []).slice(0, 20), edit_count: input.editCount ?? 0 };
704
+ if (ran || ask.claimCheck) {
705
+ state.bash_commands = (input.commands ?? []).slice(-8).map(c => ({ command: clip(String(c.command ?? ''), 300), exit: c.exit ?? null, output_tail: c.output_tail ? String(c.output_tail).slice(-500) : null }));
706
+ state.tool_results = (input.toolResults ?? []).slice(-6).map(t => ({ tool: String(t.tool ?? ''), is_error: Boolean(t.is_error), tail: t.tail ? String(t.tail).slice(-500) : null }));
707
+ }
708
+ const order = [['agent-message', ask.agentMessage], ['turn-worth', ask.turnWorth], ['claim-check', !!ask.claimCheck]] as const;
709
+ const asked = order.filter(([, on]) => on).map(([name]) => name as string);
710
+ const answers = await judge(state, questions, { ...context, surface: asked[0], riders: asked.slice(1) });
711
+ if (!answers) return null;
712
+ const out: StopTurnJudgment = {};
713
+ const blocker = readNoul(answers.human_blocker), waiting = readNoul(answers.waiting_for_user), worth = readNoul(answers.worth_remembering);
714
+ const claim = readNoul(answers.unsupported_claim);
715
+ if (blocker !== null) out.humanBlocker = blocker >= 0.5;
716
+ if (waiting !== null) out.waitingForUser = waiting >= 0.5;
717
+ if (worth !== null) { out.worthRemembering = worth >= worthThreshold; out.worthProbability = worth; }
718
+ if (claim !== null) out.claimProbability = claim;
719
+ return Object.keys(out).length ? out : null;
720
+ }
721
+
722
+ export interface LoopGoalInput {
723
+ task: string; context?: string | null;
724
+ journal?: { iteration?: number; summary?: string }[]; progressSummary?: string | null;
725
+ lastMessage: string; iteration: number; total: number;
726
+ }
727
+
728
+ /**
729
+ * Is a loop's stated task finished? Replaces "run until the iteration budget
730
+ * is spent". Returns P(goal met), or null; the caller applies its threshold
731
+ * and keeps the budget as the fallback.
732
+ */
733
+ export async function judgeLoopGoal(input: LoopGoalInput, options: JudgeContext = {}): Promise<number | null> {
734
+ if (!input.task?.trim()) return null;
735
+ const answers = await judge(
736
+ {
737
+ task: clip(input.task, 4000), context: input.context ? clip(input.context, 2000) : null,
738
+ iterations_done: input.iteration, iterations_total: input.total,
739
+ journal: (input.journal ?? []).slice(-5).map(j => ({ iteration: j.iteration ?? null, summary: clip(String(j.summary ?? ''), 800) })),
740
+ progress_summary: input.progressSummary ? clip(input.progressSummary, 2000) : null,
741
+ last_message: clip(input.lastMessage, 4000),
742
+ },
743
+ {
744
+ goal_met: noul(
745
+ 'Has `task` been fully accomplished — judging from `last_message`, the final reply of iteration `iterations_done` of `iterations_total`, and from `journal` and `progress_summary` when they are present — so that running another iteration would add nothing?',
746
+ {
747
+ true: 'Done: every part of the task is complete or explicitly exhausted — nothing left to post, process, check or fix.',
748
+ false: 'Not done: work remains, the last iteration hit an error or a blocker, or the task is open-ended and each iteration still produces new results.',
749
+ },
750
+ ),
751
+ },
752
+ { ...options, surface: 'loop-goal' },
753
+ );
754
+ return readNoul(answers?.goal_met);
755
+ }
756
+
757
+ // --- Compaction and plans (Surface I) ---
758
+
759
+ export const DIGEST_LABELS = {
760
+ goal: 'The developer states what they want: the task, a requirement, a constraint or how success will be judged.',
761
+ decision: 'A choice is made or confirmed: an approach, a design, a tool, a rule, or an option rejected and why.',
762
+ finding: 'Something is learned: a root cause, a measurement, how some code or system actually behaves, an error explained.',
763
+ open_issue: 'Something is left unresolved: a failing check, a known bug, a TODO, or a question still waiting for an answer.',
764
+ routine: 'Nothing a later session needs: progress narration, acknowledgements, tool chatter or pleasantries.',
765
+ } as const;
766
+ export type DigestLabel = keyof typeof DIGEST_LABELS;
767
+
768
+ export interface DigestMessage { i: number; role: 'user' | 'assistant'; text: string }
769
+ export interface DigestVerdict { i: number; label: DigestLabel; confidence: number }
770
+
771
+ const DIGEST_BATCH = 20;
772
+ const DIGEST_TEXT_CLIP = 700;
773
+
774
+ /**
775
+ * Label each message of a session about to be compacted, so the compaction
776
+ * memory keeps the goals, decisions, findings and open issues instead of
777
+ * whatever happened to come first. Batches of 20 run in parallel; a failed
778
+ * batch loses only its own labels. Returns null when nothing was labelled.
779
+ */
780
+ export async function judgeCompactDigest(messages: DigestMessage[], context: { goal?: string | null }, options: JudgeContext & { maxItems?: number } = {}): Promise<DigestVerdict[] | null> {
781
+ const { maxItems = 40, ...rest } = options;
782
+ const items = messages.slice(0, Math.max(1, maxItems));
783
+ if (!items.length) return [];
784
+ const batches: DigestMessage[][] = [];
785
+ for (let k = 0; k < items.length; k += DIGEST_BATCH) batches.push(items.slice(k, k + DIGEST_BATCH));
786
+ const results = await Promise.all(batches.map(async batch => {
787
+ const questions: Record<string, ReturnType<typeof choice>> = {};
788
+ batch.forEach((_, i) => {
789
+ questions[`label_${i}`] = choice(
790
+ `\`messages[${i}]\` is one message from a coding session between a developer (\`role\` user) and an AI assistant (\`role\` assistant); ` +
791
+ '`session_goal` is the developer\'s opening request. Which kind of information in `messages[' + i + ']` would a later session, ' +
792
+ 'starting after this conversation is compacted, most need to keep?',
793
+ DIGEST_LABELS as unknown as Record<string, string>,
794
+ );
795
+ });
796
+ const answers = await judge(
797
+ { session_goal: context.goal ? clip(context.goal, 1000) : null, messages: batch.map(m => ({ role: m.role, text: clip(m.text, DIGEST_TEXT_CLIP) })) },
798
+ questions,
799
+ { ...rest, surface: 'compact-digest' },
800
+ );
801
+ if (!answers) return [] as DigestVerdict[];
802
+ const out: DigestVerdict[] = [];
803
+ batch.forEach((message, i) => {
804
+ const verdict = readChoice(answers[`label_${i}`]);
805
+ if (verdict && verdict.choice in DIGEST_LABELS) out.push({ i: message.i, label: verdict.choice as DigestLabel, confidence: verdict.confidence });
806
+ });
807
+ return out;
808
+ }));
809
+ const verdicts = results.flat();
810
+ return verdicts.length ? verdicts : null;
811
+ }
812
+
813
+ export interface PlanDecision { id: string; content: string; recordedAt?: string | null; kind?: string | null }
814
+
815
+ /**
816
+ * Would carrying out an approved plan go against something already decided?
817
+ * One Noul per stored decision or preference over shared state. Returns
818
+ * P(conflict) per decision id, or null. Advisory: the hook only reports it.
819
+ */
820
+ export async function judgePlanConflicts(plan: string, decisions: PlanDecision[], options: JudgeContext = {}): Promise<Map<string, number> | null> {
821
+ if (!decisions.length) return new Map();
822
+ const questions: Record<string, ReturnType<typeof noul>> = {};
823
+ decisions.forEach((_, i) => {
824
+ questions[`conflict_${i}`] = noul(
825
+ `\`plan\` is what an AI assistant is about to implement in this project. \`decisions[${i}]\` is something recorded earlier in the same project: ` +
826
+ `a decision that was made or a preference the developer stated. Would carrying out \`plan\` as written go against \`decisions[${i}].content\` — ` +
827
+ 'doing what it ruled out, choosing an option it rejected, or undoing what it chose?',
828
+ {
829
+ true: 'Following the plan breaks or reverses the recorded decision or preference.',
830
+ false: 'The plan agrees with it, builds on it, concerns something else, or explicitly says it is replacing that decision on purpose.',
831
+ },
832
+ );
833
+ });
834
+ const answers = await judge(
835
+ { plan: clip(plan, 8000), decisions: decisions.map(d => ({ content: clip(d.content, 1500), recorded_at: d.recordedAt ?? null, kind: d.kind ?? null })) },
836
+ questions,
837
+ { ...options, surface: 'plan-conflict' },
838
+ );
839
+ if (!answers) return null;
840
+ const out = new Map<string, number>();
841
+ decisions.forEach((decision, i) => {
842
+ const p = readNoul(answers[`conflict_${i}`]);
843
+ if (p !== null) out.set(decision.id, p);
844
+ });
845
+ return out;
846
+ }
847
+
848
+ // --- Trash triage (Surface H) ---
849
+
850
+ /** Ordered rubric for "how much would be lost if this memory were deleted", least loss last. */
851
+ export const EXPENDABILITY_LEVELS = [
852
+ 'Irreplaceable: a decision, a credential location, a hard-won lesson or a project fact recorded nowhere else.',
853
+ 'Valuable: useful reference that would take real effort to rediscover.',
854
+ 'Marginal: mildly useful; losing it would cost a little at most.',
855
+ 'Redundant: the same information exists in another memory, in the code, or in documentation.',
856
+ 'Expendable: obsolete, a passing note, or an automation log nobody would look for again.',
857
+ ];
858
+
859
+ export interface ExpendabilityCandidate {
860
+ id: string; content: string; category: string; importance: number; createdAt: string; accessCount: number; duplicateOf?: string | null;
861
+ }
862
+
863
+ const expendabilityQuestion = (i: number) =>
864
+ `How expendable is \`candidates[${i}]\`: how much would be lost if it were deleted from this knowledge base? Weigh its content, whether \`candidates[${i}].duplicate_of_another\` names a surviving copy, and how often it has been recalled.`;
865
+ const expendabilityEntry = (c: ExpendabilityCandidate) =>
866
+ ({ content: clip(c.content, 3000), category: c.category, importance: c.importance, created_at: c.createdAt, times_recalled: c.accessCount, duplicate_of_another: c.duplicateOf ?? null });
867
+
868
+ /**
869
+ * Fingerprint of everything one expendability judgment sees — model, rubric,
870
+ * question and the candidate's own entry — so a stored score stays usable
871
+ * exactly as long as asking again would send the same thing.
872
+ */
873
+ export function expendabilityBasis(candidate: ExpendabilityCandidate, model: string): string {
874
+ return createHash('sha256')
875
+ .update(JSON.stringify({ model, levels: EXPENDABILITY_LEVELS, question: expendabilityQuestion(0), entry: expendabilityEntry(candidate) }))
876
+ .digest('hex').slice(0, 16);
877
+ }
878
+
879
+ /**
880
+ * Score each forget candidate on the expendability rubric, batched over
881
+ * one state. Higher = safer to delete. Never deletes anything itself.
882
+ */
883
+ export async function judgeExpendability(candidates: ExpendabilityCandidate[], options: JudgeContext = {}): Promise<Map<string, number> | null> {
884
+ if (!candidates.length) return new Map();
885
+ const questions: Record<string, ReturnType<typeof score>> = {};
886
+ candidates.forEach((_, i) => {
887
+ questions[`expendability_${i}`] = score(expendabilityQuestion(i), EXPENDABILITY_LEVELS);
888
+ });
889
+ const answers = await judge(
890
+ { candidates: candidates.map(c => expendabilityEntry(c)) },
891
+ questions,
892
+ { ...options, surface: 'trash-triage' },
893
+ );
894
+ if (!answers) return null;
895
+ const scores = new Map<string, number>();
896
+ candidates.forEach((candidate, i) => {
897
+ const s = readScore(answers[`expendability_${i}`]);
898
+ if (s) scores.set(candidate.id, s.score);
899
+ });
900
+ return scores.size ? scores : null;
901
+ }