synabun 1.3.0 → 2.0.0-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1153) hide show
  1. package/CHANGELOG.md +197 -662
  2. package/LICENSE-COMMERCIAL.md +33 -0
  3. package/NOTICE +17 -0
  4. package/README.md +175 -853
  5. package/THIRD-PARTY-LICENSES.md +131 -0
  6. package/benchmarks/browser-live-results.json +79 -0
  7. package/benchmarks/browser-v2-results.json +258 -0
  8. package/benchmarks/fixtures/browser/README.md +57 -0
  9. package/benchmarks/fixtures/browser/page-state.json +132 -0
  10. package/benchmarks/fixtures/browser/social.json +92 -0
  11. package/benchmarks/fixtures/browser/target.json +319 -0
  12. package/benchmarks/fixtures/desktop/README.md +58 -0
  13. package/benchmarks/fixtures/desktop/abstention.json +59 -0
  14. package/benchmarks/fixtures/desktop/adversarial.json +22 -0
  15. package/benchmarks/fixtures/desktop/forbidden.json +93 -0
  16. package/benchmarks/fixtures/desktop/generate.mjs +1023 -0
  17. package/benchmarks/fixtures/desktop/target.json +136 -0
  18. package/bin/synabun.js +30 -0
  19. package/docs/browser-v2.md +109 -0
  20. package/docs/hook-integrity.md +89 -0
  21. package/docs/judgments.md +182 -0
  22. package/docs/style-guide.md +246 -0
  23. package/docs/whatsapp.md +325 -0
  24. package/hooks/claude-code/post-plan.mjs +613 -391
  25. package/hooks/claude-code/post-remember.mjs +246 -122
  26. package/hooks/claude-code/pre-compact.mjs +171 -110
  27. package/hooks/claude-code/pre-task.mjs +133 -0
  28. package/hooks/claude-code/pre-websearch.mjs +15 -4
  29. package/hooks/claude-code/prompt-origin.mjs +94 -0
  30. package/hooks/claude-code/prompt-submit.mjs +1244 -861
  31. package/hooks/claude-code/session-start.mjs +114 -156
  32. package/hooks/claude-code/shared.mjs +1228 -368
  33. package/hooks/claude-code/state.mjs +167 -0
  34. package/hooks/claude-code/stop.mjs +515 -140
  35. package/hooks/claude-code/subagent-start.mjs +154 -0
  36. package/hooks/claude-code/subagent-stop.mjs +102 -0
  37. package/hooks/claude-code/task-gate.mjs +150 -0
  38. package/lib/claude-hooks.js +84 -0
  39. package/lib/claude-usage-audit.js +141 -0
  40. package/lib/client-config-repair.js +144 -0
  41. package/lib/data-home-migration.js +498 -0
  42. package/lib/first-launch-protection.js +240 -0
  43. package/lib/paths.d.ts +21 -0
  44. package/lib/paths.js +103 -0
  45. package/mcp-server/dist/config.d.ts +22 -0
  46. package/mcp-server/dist/config.d.ts.map +1 -0
  47. package/mcp-server/dist/config.js +109 -0
  48. package/mcp-server/dist/config.js.map +1 -0
  49. package/mcp-server/dist/http.d.ts +30 -0
  50. package/mcp-server/dist/http.d.ts.map +1 -0
  51. package/mcp-server/dist/http.js +276 -0
  52. package/mcp-server/dist/http.js.map +1 -0
  53. package/mcp-server/dist/index.d.ts +48 -0
  54. package/mcp-server/dist/index.d.ts.map +1 -0
  55. package/mcp-server/dist/index.js +538 -0
  56. package/mcp-server/dist/index.js.map +1 -0
  57. package/mcp-server/dist/preload-http.d.ts +3 -0
  58. package/mcp-server/dist/preload-http.d.ts.map +1 -0
  59. package/mcp-server/dist/preload-http.js +28 -0
  60. package/mcp-server/dist/preload-http.js.map +1 -0
  61. package/mcp-server/dist/preload.d.ts +3 -0
  62. package/mcp-server/dist/preload.d.ts.map +1 -0
  63. package/mcp-server/dist/preload.js +32 -0
  64. package/mcp-server/dist/preload.js.map +1 -0
  65. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts +19 -0
  66. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts.map +1 -0
  67. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js +403 -0
  68. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js.map +1 -0
  69. package/mcp-server/dist/scripts/setup-embeddings.d.ts +3 -0
  70. package/mcp-server/dist/scripts/setup-embeddings.d.ts.map +1 -0
  71. package/mcp-server/dist/scripts/setup-embeddings.js +15 -0
  72. package/mcp-server/dist/scripts/setup-embeddings.js.map +1 -0
  73. package/mcp-server/dist/services/assistant-judgments.d.ts +79 -0
  74. package/mcp-server/dist/services/assistant-judgments.d.ts.map +1 -0
  75. package/mcp-server/dist/services/assistant-judgments.js +128 -0
  76. package/mcp-server/dist/services/assistant-judgments.js.map +1 -0
  77. package/mcp-server/dist/services/browser-assist-gate.d.ts +314 -0
  78. package/mcp-server/dist/services/browser-assist-gate.d.ts.map +1 -0
  79. package/mcp-server/dist/services/browser-assist-gate.js +344 -0
  80. package/mcp-server/dist/services/browser-assist-gate.js.map +1 -0
  81. package/mcp-server/dist/services/browser-assist.d.ts +104 -0
  82. package/mcp-server/dist/services/browser-assist.d.ts.map +1 -0
  83. package/mcp-server/dist/services/browser-assist.js +282 -0
  84. package/mcp-server/dist/services/browser-assist.js.map +1 -0
  85. package/mcp-server/dist/services/browser-bench.d.ts +772 -0
  86. package/mcp-server/dist/services/browser-bench.d.ts.map +1 -0
  87. package/mcp-server/dist/services/browser-bench.js +424 -0
  88. package/mcp-server/dist/services/browser-bench.js.map +1 -0
  89. package/mcp-server/dist/services/browser-judgments.d.ts +196 -0
  90. package/mcp-server/dist/services/browser-judgments.d.ts.map +1 -0
  91. package/mcp-server/dist/services/browser-judgments.js +363 -0
  92. package/mcp-server/dist/services/browser-judgments.js.map +1 -0
  93. package/mcp-server/dist/services/browser-risk.d.ts +166 -0
  94. package/mcp-server/dist/services/browser-risk.d.ts.map +1 -0
  95. package/mcp-server/dist/services/browser-risk.js +458 -0
  96. package/mcp-server/dist/services/browser-risk.js.map +1 -0
  97. package/mcp-server/dist/services/categories.d.ts +61 -0
  98. package/mcp-server/dist/services/categories.d.ts.map +1 -0
  99. package/mcp-server/dist/services/categories.js +377 -0
  100. package/mcp-server/dist/services/categories.js.map +1 -0
  101. package/mcp-server/dist/services/codex-config-heal.d.ts +49 -0
  102. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -0
  103. package/mcp-server/dist/services/codex-config-heal.js +346 -0
  104. package/mcp-server/dist/services/codex-config-heal.js.map +1 -0
  105. package/mcp-server/dist/services/desktop-assist-gate.d.ts +198 -0
  106. package/mcp-server/dist/services/desktop-assist-gate.d.ts.map +1 -0
  107. package/mcp-server/dist/services/desktop-assist-gate.js +202 -0
  108. package/mcp-server/dist/services/desktop-assist-gate.js.map +1 -0
  109. package/mcp-server/dist/services/desktop-assist.d.ts +104 -0
  110. package/mcp-server/dist/services/desktop-assist.d.ts.map +1 -0
  111. package/mcp-server/dist/services/desktop-assist.js +266 -0
  112. package/mcp-server/dist/services/desktop-assist.js.map +1 -0
  113. package/mcp-server/dist/services/desktop-bench.d.ts +553 -0
  114. package/mcp-server/dist/services/desktop-bench.d.ts.map +1 -0
  115. package/mcp-server/dist/services/desktop-bench.js +311 -0
  116. package/mcp-server/dist/services/desktop-bench.js.map +1 -0
  117. package/mcp-server/dist/services/desktop-client.d.ts +23 -0
  118. package/mcp-server/dist/services/desktop-client.d.ts.map +1 -0
  119. package/mcp-server/dist/services/desktop-client.js +79 -0
  120. package/mcp-server/dist/services/desktop-client.js.map +1 -0
  121. package/mcp-server/dist/services/desktop-judgments.d.ts +125 -0
  122. package/mcp-server/dist/services/desktop-judgments.d.ts.map +1 -0
  123. package/mcp-server/dist/services/desktop-judgments.js +177 -0
  124. package/mcp-server/dist/services/desktop-judgments.js.map +1 -0
  125. package/mcp-server/dist/services/desktop-risk.d.ts +283 -0
  126. package/mcp-server/dist/services/desktop-risk.d.ts.map +1 -0
  127. package/mcp-server/dist/services/desktop-risk.js +605 -0
  128. package/mcp-server/dist/services/desktop-risk.js.map +1 -0
  129. package/mcp-server/dist/services/discord.d.ts +112 -0
  130. package/mcp-server/dist/services/discord.d.ts.map +1 -0
  131. package/mcp-server/dist/services/discord.js +477 -0
  132. package/mcp-server/dist/services/discord.js.map +1 -0
  133. package/mcp-server/dist/services/edit-stale.d.ts +81 -0
  134. package/mcp-server/dist/services/edit-stale.d.ts.map +1 -0
  135. package/mcp-server/dist/services/edit-stale.js +358 -0
  136. package/mcp-server/dist/services/edit-stale.js.map +1 -0
  137. package/mcp-server/dist/services/embedding-service.d.ts +16 -0
  138. package/mcp-server/dist/services/embedding-service.d.ts.map +1 -0
  139. package/mcp-server/dist/services/embedding-service.js +126 -0
  140. package/mcp-server/dist/services/embedding-service.js.map +1 -0
  141. package/mcp-server/dist/services/embedding-worker.d.ts +2 -0
  142. package/mcp-server/dist/services/embedding-worker.d.ts.map +1 -0
  143. package/mcp-server/dist/services/embedding-worker.js +52 -0
  144. package/mcp-server/dist/services/embedding-worker.js.map +1 -0
  145. package/mcp-server/dist/services/fb-regions.d.ts +71 -0
  146. package/mcp-server/dist/services/fb-regions.d.ts.map +1 -0
  147. package/mcp-server/dist/services/fb-regions.js +211 -0
  148. package/mcp-server/dist/services/fb-regions.js.map +1 -0
  149. package/mcp-server/dist/services/file-checksums.d.ts +22 -0
  150. package/mcp-server/dist/services/file-checksums.d.ts.map +1 -0
  151. package/mcp-server/dist/services/file-checksums.js +55 -0
  152. package/mcp-server/dist/services/file-checksums.js.map +1 -0
  153. package/mcp-server/dist/services/file-excerpt.d.ts +24 -0
  154. package/mcp-server/dist/services/file-excerpt.d.ts.map +1 -0
  155. package/mcp-server/dist/services/file-excerpt.js +65 -0
  156. package/mcp-server/dist/services/file-excerpt.js.map +1 -0
  157. package/mcp-server/dist/services/identity.d.ts +124 -0
  158. package/mcp-server/dist/services/identity.d.ts.map +1 -0
  159. package/mcp-server/dist/services/identity.js +241 -0
  160. package/mcp-server/dist/services/identity.js.map +1 -0
  161. package/mcp-server/dist/services/local-embeddings.d.ts +2 -0
  162. package/mcp-server/dist/services/local-embeddings.d.ts.map +1 -0
  163. package/mcp-server/dist/services/local-embeddings.js +3 -0
  164. package/mcp-server/dist/services/local-embeddings.js.map +1 -0
  165. package/mcp-server/dist/services/memory-client.d.ts +4 -0
  166. package/mcp-server/dist/services/memory-client.d.ts.map +1 -0
  167. package/mcp-server/dist/services/memory-client.js +27 -0
  168. package/mcp-server/dist/services/memory-client.js.map +1 -0
  169. package/mcp-server/dist/services/memory-judge-backfill.d.ts +135 -0
  170. package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -0
  171. package/mcp-server/dist/services/memory-judge-backfill.js +510 -0
  172. package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -0
  173. package/mcp-server/dist/services/memory-judgments.d.ts +362 -0
  174. package/mcp-server/dist/services/memory-judgments.d.ts.map +1 -0
  175. package/mcp-server/dist/services/memory-judgments.js +674 -0
  176. package/mcp-server/dist/services/memory-judgments.js.map +1 -0
  177. package/mcp-server/dist/services/memory-maintenance.d.ts +108 -0
  178. package/mcp-server/dist/services/memory-maintenance.d.ts.map +1 -0
  179. package/mcp-server/dist/services/memory-maintenance.js +403 -0
  180. package/mcp-server/dist/services/memory-maintenance.js.map +1 -0
  181. package/mcp-server/dist/services/memory-retrieval.d.ts +66 -0
  182. package/mcp-server/dist/services/memory-retrieval.d.ts.map +1 -0
  183. package/mcp-server/dist/services/memory-retrieval.js +412 -0
  184. package/mcp-server/dist/services/memory-retrieval.js.map +1 -0
  185. package/mcp-server/dist/services/memory-schema.d.ts +16 -0
  186. package/mcp-server/dist/services/memory-schema.d.ts.map +1 -0
  187. package/mcp-server/dist/services/memory-schema.js +282 -0
  188. package/mcp-server/dist/services/memory-schema.js.map +1 -0
  189. package/mcp-server/dist/services/memory-sessions.d.ts +24 -0
  190. package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -0
  191. package/mcp-server/dist/services/memory-sessions.js +110 -0
  192. package/mcp-server/dist/services/memory-sessions.js.map +1 -0
  193. package/mcp-server/dist/services/memory-triage.d.ts +60 -0
  194. package/mcp-server/dist/services/memory-triage.d.ts.map +1 -0
  195. package/mcp-server/dist/services/memory-triage.js +189 -0
  196. package/mcp-server/dist/services/memory-triage.js.map +1 -0
  197. package/mcp-server/dist/services/memory-verification.d.ts +24 -0
  198. package/mcp-server/dist/services/memory-verification.d.ts.map +1 -0
  199. package/mcp-server/dist/services/memory-verification.js +92 -0
  200. package/mcp-server/dist/services/memory-verification.js.map +1 -0
  201. package/mcp-server/dist/services/memory-writer.d.ts +26 -0
  202. package/mcp-server/dist/services/memory-writer.d.ts.map +1 -0
  203. package/mcp-server/dist/services/memory-writer.js +126 -0
  204. package/mcp-server/dist/services/memory-writer.js.map +1 -0
  205. package/mcp-server/dist/services/neural-interface.d.ts +439 -0
  206. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -0
  207. package/mcp-server/dist/services/neural-interface.js +1135 -0
  208. package/mcp-server/dist/services/neural-interface.js.map +1 -0
  209. package/mcp-server/dist/services/profiles.d.ts +120 -0
  210. package/mcp-server/dist/services/profiles.d.ts.map +1 -0
  211. package/mcp-server/dist/services/profiles.js +387 -0
  212. package/mcp-server/dist/services/profiles.js.map +1 -0
  213. package/mcp-server/dist/services/secret-gate.d.ts +29 -0
  214. package/mcp-server/dist/services/secret-gate.d.ts.map +1 -0
  215. package/mcp-server/dist/services/secret-gate.js +43 -0
  216. package/mcp-server/dist/services/secret-gate.js.map +1 -0
  217. package/mcp-server/dist/services/server-instructions.d.ts +10 -0
  218. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -0
  219. package/mcp-server/dist/services/server-instructions.js +101 -0
  220. package/mcp-server/dist/services/server-instructions.js.map +1 -0
  221. package/mcp-server/dist/services/sqlite.d.ts +235 -0
  222. package/mcp-server/dist/services/sqlite.d.ts.map +1 -0
  223. package/mcp-server/dist/services/sqlite.js +1185 -0
  224. package/mcp-server/dist/services/sqlite.js.map +1 -0
  225. package/mcp-server/dist/services/typesafe-bench.d.ts +99 -0
  226. package/mcp-server/dist/services/typesafe-bench.d.ts.map +1 -0
  227. package/mcp-server/dist/services/typesafe-bench.js +218 -0
  228. package/mcp-server/dist/services/typesafe-bench.js.map +1 -0
  229. package/mcp-server/dist/services/typesafe-config.d.ts +342 -0
  230. package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -0
  231. package/mcp-server/dist/services/typesafe-config.js +746 -0
  232. package/mcp-server/dist/services/typesafe-config.js.map +1 -0
  233. package/mcp-server/dist/services/typesafe.d.ts +213 -0
  234. package/mcp-server/dist/services/typesafe.d.ts.map +1 -0
  235. package/mcp-server/dist/services/typesafe.js +330 -0
  236. package/mcp-server/dist/services/typesafe.js.map +1 -0
  237. package/mcp-server/dist/services/vector-cache.d.ts +68 -0
  238. package/mcp-server/dist/services/vector-cache.d.ts.map +1 -0
  239. package/mcp-server/dist/services/vector-cache.js +271 -0
  240. package/mcp-server/dist/services/vector-cache.js.map +1 -0
  241. package/mcp-server/dist/services/whiteboard-geometry.d.ts +305 -0
  242. package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -0
  243. package/mcp-server/dist/services/whiteboard-geometry.js +666 -0
  244. package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -0
  245. package/mcp-server/dist/tools/agents.d.ts +212 -0
  246. package/mcp-server/dist/tools/agents.d.ts.map +1 -0
  247. package/mcp-server/dist/tools/agents.js +407 -0
  248. package/mcp-server/dist/tools/agents.js.map +1 -0
  249. package/mcp-server/dist/tools/bluesky.d.ts +39 -0
  250. package/mcp-server/dist/tools/bluesky.d.ts.map +1 -0
  251. package/mcp-server/dist/tools/bluesky.js +1144 -0
  252. package/mcp-server/dist/tools/bluesky.js.map +1 -0
  253. package/mcp-server/dist/tools/browser-advanced.d.ts +58 -0
  254. package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -0
  255. package/mcp-server/dist/tools/browser-advanced.js +106 -0
  256. package/mcp-server/dist/tools/browser-advanced.js.map +1 -0
  257. package/mcp-server/dist/tools/browser-batch.d.ts +99 -0
  258. package/mcp-server/dist/tools/browser-batch.d.ts.map +1 -0
  259. package/mcp-server/dist/tools/browser-batch.js +187 -0
  260. package/mcp-server/dist/tools/browser-batch.js.map +1 -0
  261. package/mcp-server/dist/tools/browser-cheatsheet.d.ts +21 -0
  262. package/mcp-server/dist/tools/browser-cheatsheet.d.ts.map +1 -0
  263. package/mcp-server/dist/tools/browser-cheatsheet.js +144 -0
  264. package/mcp-server/dist/tools/browser-cheatsheet.js.map +1 -0
  265. package/mcp-server/dist/tools/browser-interact.d.ts +239 -0
  266. package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -0
  267. package/mcp-server/dist/tools/browser-interact.js +300 -0
  268. package/mcp-server/dist/tools/browser-interact.js.map +1 -0
  269. package/mcp-server/dist/tools/browser-navigate.d.ts +90 -0
  270. package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -0
  271. package/mcp-server/dist/tools/browser-navigate.js +142 -0
  272. package/mcp-server/dist/tools/browser-navigate.js.map +1 -0
  273. package/mcp-server/dist/tools/browser-observe.d.ts +561 -0
  274. package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -0
  275. package/mcp-server/dist/tools/browser-observe.js +2009 -0
  276. package/mcp-server/dist/tools/browser-observe.js.map +1 -0
  277. package/mcp-server/dist/tools/browser.d.ts +34 -0
  278. package/mcp-server/dist/tools/browser.d.ts.map +1 -0
  279. package/mcp-server/dist/tools/browser.js +112 -0
  280. package/mcp-server/dist/tools/browser.js.map +1 -0
  281. package/mcp-server/dist/tools/card-tools.d.ts +82 -0
  282. package/mcp-server/dist/tools/card-tools.d.ts.map +1 -0
  283. package/mcp-server/dist/tools/card-tools.js +137 -0
  284. package/mcp-server/dist/tools/card-tools.js.map +1 -0
  285. package/mcp-server/dist/tools/card.d.ts +8 -0
  286. package/mcp-server/dist/tools/card.d.ts.map +1 -0
  287. package/mcp-server/dist/tools/card.js +16 -0
  288. package/mcp-server/dist/tools/card.js.map +1 -0
  289. package/mcp-server/dist/tools/category.d.ts +32 -0
  290. package/mcp-server/dist/tools/category.d.ts.map +1 -0
  291. package/mcp-server/dist/tools/category.js +290 -0
  292. package/mcp-server/dist/tools/category.js.map +1 -0
  293. package/mcp-server/dist/tools/choice.d.ts +160 -0
  294. package/mcp-server/dist/tools/choice.d.ts.map +1 -0
  295. package/mcp-server/dist/tools/choice.js +80 -0
  296. package/mcp-server/dist/tools/choice.js.map +1 -0
  297. package/mcp-server/dist/tools/computer.d.ts +71 -0
  298. package/mcp-server/dist/tools/computer.d.ts.map +1 -0
  299. package/mcp-server/dist/tools/computer.js +174 -0
  300. package/mcp-server/dist/tools/computer.js.map +1 -0
  301. package/mcp-server/dist/tools/discord-channel.d.ts +44 -0
  302. package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -0
  303. package/mcp-server/dist/tools/discord-channel.js +236 -0
  304. package/mcp-server/dist/tools/discord-channel.js.map +1 -0
  305. package/mcp-server/dist/tools/discord-guild.d.ts +20 -0
  306. package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -0
  307. package/mcp-server/dist/tools/discord-guild.js +138 -0
  308. package/mcp-server/dist/tools/discord-guild.js.map +1 -0
  309. package/mcp-server/dist/tools/discord-member.d.ts +26 -0
  310. package/mcp-server/dist/tools/discord-member.d.ts.map +1 -0
  311. package/mcp-server/dist/tools/discord-member.js +122 -0
  312. package/mcp-server/dist/tools/discord-member.js.map +1 -0
  313. package/mcp-server/dist/tools/discord-message.d.ts +36 -0
  314. package/mcp-server/dist/tools/discord-message.d.ts.map +1 -0
  315. package/mcp-server/dist/tools/discord-message.js +184 -0
  316. package/mcp-server/dist/tools/discord-message.js.map +1 -0
  317. package/mcp-server/dist/tools/discord-onboarding.d.ts +32 -0
  318. package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -0
  319. package/mcp-server/dist/tools/discord-onboarding.js +179 -0
  320. package/mcp-server/dist/tools/discord-onboarding.js.map +1 -0
  321. package/mcp-server/dist/tools/discord-role.d.ts +34 -0
  322. package/mcp-server/dist/tools/discord-role.d.ts.map +1 -0
  323. package/mcp-server/dist/tools/discord-role.js +178 -0
  324. package/mcp-server/dist/tools/discord-role.js.map +1 -0
  325. package/mcp-server/dist/tools/discord-thread.d.ts +28 -0
  326. package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -0
  327. package/mcp-server/dist/tools/discord-thread.js +88 -0
  328. package/mcp-server/dist/tools/discord-thread.js.map +1 -0
  329. package/mcp-server/dist/tools/discord-webhook.d.ts +32 -0
  330. package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -0
  331. package/mcp-server/dist/tools/discord-webhook.js +154 -0
  332. package/mcp-server/dist/tools/discord-webhook.js.map +1 -0
  333. package/mcp-server/dist/tools/discord.d.ts +7 -0
  334. package/mcp-server/dist/tools/discord.d.ts.map +1 -0
  335. package/mcp-server/dist/tools/discord.js +25 -0
  336. package/mcp-server/dist/tools/discord.js.map +1 -0
  337. package/mcp-server/dist/tools/fb-groups.d.ts +98 -0
  338. package/mcp-server/dist/tools/fb-groups.d.ts.map +1 -0
  339. package/mcp-server/dist/tools/fb-groups.js +369 -0
  340. package/mcp-server/dist/tools/fb-groups.js.map +1 -0
  341. package/mcp-server/dist/tools/forget.d.ts +14 -0
  342. package/mcp-server/dist/tools/forget.d.ts.map +1 -0
  343. package/mcp-server/dist/tools/forget.js +26 -0
  344. package/mcp-server/dist/tools/forget.js.map +1 -0
  345. package/mcp-server/dist/tools/git-tools.d.ts +24 -0
  346. package/mcp-server/dist/tools/git-tools.d.ts.map +1 -0
  347. package/mcp-server/dist/tools/git-tools.js +107 -0
  348. package/mcp-server/dist/tools/git-tools.js.map +1 -0
  349. package/mcp-server/dist/tools/git.d.ts +7 -0
  350. package/mcp-server/dist/tools/git.d.ts.map +1 -0
  351. package/mcp-server/dist/tools/git.js +11 -0
  352. package/mcp-server/dist/tools/git.js.map +1 -0
  353. package/mcp-server/dist/tools/gsc/experience.d.ts +135 -0
  354. package/mcp-server/dist/tools/gsc/experience.d.ts.map +1 -0
  355. package/mcp-server/dist/tools/gsc/experience.js +351 -0
  356. package/mcp-server/dist/tools/gsc/experience.js.map +1 -0
  357. package/mcp-server/dist/tools/gsc/helpers.d.ts +78 -0
  358. package/mcp-server/dist/tools/gsc/helpers.d.ts.map +1 -0
  359. package/mcp-server/dist/tools/gsc/helpers.js +258 -0
  360. package/mcp-server/dist/tools/gsc/helpers.js.map +1 -0
  361. package/mcp-server/dist/tools/gsc/indexing.d.ts +121 -0
  362. package/mcp-server/dist/tools/gsc/indexing.d.ts.map +1 -0
  363. package/mcp-server/dist/tools/gsc/indexing.js +357 -0
  364. package/mcp-server/dist/tools/gsc/indexing.js.map +1 -0
  365. package/mcp-server/dist/tools/gsc/inspect.d.ts +78 -0
  366. package/mcp-server/dist/tools/gsc/inspect.d.ts.map +1 -0
  367. package/mcp-server/dist/tools/gsc/inspect.js +321 -0
  368. package/mcp-server/dist/tools/gsc/inspect.js.map +1 -0
  369. package/mcp-server/dist/tools/gsc/navigate.d.ts +44 -0
  370. package/mcp-server/dist/tools/gsc/navigate.d.ts.map +1 -0
  371. package/mcp-server/dist/tools/gsc/navigate.js +197 -0
  372. package/mcp-server/dist/tools/gsc/navigate.js.map +1 -0
  373. package/mcp-server/dist/tools/gsc/performance.d.ts +84 -0
  374. package/mcp-server/dist/tools/gsc/performance.d.ts.map +1 -0
  375. package/mcp-server/dist/tools/gsc/performance.js +274 -0
  376. package/mcp-server/dist/tools/gsc/performance.js.map +1 -0
  377. package/mcp-server/dist/tools/gsc/settings.d.ts +153 -0
  378. package/mcp-server/dist/tools/gsc/settings.d.ts.map +1 -0
  379. package/mcp-server/dist/tools/gsc/settings.js +425 -0
  380. package/mcp-server/dist/tools/gsc/settings.js.map +1 -0
  381. package/mcp-server/dist/tools/gsc.d.ts +7 -0
  382. package/mcp-server/dist/tools/gsc.d.ts.map +1 -0
  383. package/mcp-server/dist/tools/gsc.js +51 -0
  384. package/mcp-server/dist/tools/gsc.js.map +1 -0
  385. package/mcp-server/dist/tools/image-tools.d.ts +24 -0
  386. package/mcp-server/dist/tools/image-tools.d.ts.map +1 -0
  387. package/mcp-server/dist/tools/image-tools.js +80 -0
  388. package/mcp-server/dist/tools/image-tools.js.map +1 -0
  389. package/mcp-server/dist/tools/image.d.ts +10 -0
  390. package/mcp-server/dist/tools/image.d.ts.map +1 -0
  391. package/mcp-server/dist/tools/image.js +14 -0
  392. package/mcp-server/dist/tools/image.js.map +1 -0
  393. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +97 -0
  394. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -0
  395. package/mcp-server/dist/tools/leonardo-browser-tools.js +228 -0
  396. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -0
  397. package/mcp-server/dist/tools/leonardo.d.ts +13 -0
  398. package/mcp-server/dist/tools/leonardo.d.ts.map +1 -0
  399. package/mcp-server/dist/tools/leonardo.js +21 -0
  400. package/mcp-server/dist/tools/leonardo.js.map +1 -0
  401. package/mcp-server/dist/tools/loop.d.ts +30 -0
  402. package/mcp-server/dist/tools/loop.d.ts.map +1 -0
  403. package/mcp-server/dist/tools/loop.js +401 -0
  404. package/mcp-server/dist/tools/loop.js.map +1 -0
  405. package/mcp-server/dist/tools/memories.d.ts +56 -0
  406. package/mcp-server/dist/tools/memories.d.ts.map +1 -0
  407. package/mcp-server/dist/tools/memories.js +171 -0
  408. package/mcp-server/dist/tools/memories.js.map +1 -0
  409. package/mcp-server/dist/tools/morelogin.d.ts +24 -0
  410. package/mcp-server/dist/tools/morelogin.d.ts.map +1 -0
  411. package/mcp-server/dist/tools/morelogin.js +79 -0
  412. package/mcp-server/dist/tools/morelogin.js.map +1 -0
  413. package/mcp-server/dist/tools/profile.d.ts +17 -0
  414. package/mcp-server/dist/tools/profile.d.ts.map +1 -0
  415. package/mcp-server/dist/tools/profile.js +114 -0
  416. package/mcp-server/dist/tools/profile.js.map +1 -0
  417. package/mcp-server/dist/tools/recall.d.ts +71 -0
  418. package/mcp-server/dist/tools/recall.d.ts.map +1 -0
  419. package/mcp-server/dist/tools/recall.js +147 -0
  420. package/mcp-server/dist/tools/recall.js.map +1 -0
  421. package/mcp-server/dist/tools/reflect.d.ts +56 -0
  422. package/mcp-server/dist/tools/reflect.d.ts.map +1 -0
  423. package/mcp-server/dist/tools/reflect.js +157 -0
  424. package/mcp-server/dist/tools/reflect.js.map +1 -0
  425. package/mcp-server/dist/tools/remember.d.ts +62 -0
  426. package/mcp-server/dist/tools/remember.d.ts.map +1 -0
  427. package/mcp-server/dist/tools/remember.js +201 -0
  428. package/mcp-server/dist/tools/remember.js.map +1 -0
  429. package/mcp-server/dist/tools/response.d.ts +23 -0
  430. package/mcp-server/dist/tools/response.d.ts.map +1 -0
  431. package/mcp-server/dist/tools/response.js +24 -0
  432. package/mcp-server/dist/tools/response.js.map +1 -0
  433. package/mcp-server/dist/tools/restore.d.ts +14 -0
  434. package/mcp-server/dist/tools/restore.d.ts.map +1 -0
  435. package/mcp-server/dist/tools/restore.js +23 -0
  436. package/mcp-server/dist/tools/restore.js.map +1 -0
  437. package/mcp-server/dist/tools/style-guide-tools.d.ts +51 -0
  438. package/mcp-server/dist/tools/style-guide-tools.d.ts.map +1 -0
  439. package/mcp-server/dist/tools/style-guide-tools.js +231 -0
  440. package/mcp-server/dist/tools/style-guide-tools.js.map +1 -0
  441. package/mcp-server/dist/tools/style-guide.d.ts +8 -0
  442. package/mcp-server/dist/tools/style-guide.d.ts.map +1 -0
  443. package/mcp-server/dist/tools/style-guide.js +12 -0
  444. package/mcp-server/dist/tools/style-guide.js.map +1 -0
  445. package/mcp-server/dist/tools/sync.d.ts +20 -0
  446. package/mcp-server/dist/tools/sync.d.ts.map +1 -0
  447. package/mcp-server/dist/tools/sync.js +156 -0
  448. package/mcp-server/dist/tools/sync.js.map +1 -0
  449. package/mcp-server/dist/tools/tictactoe-tools.d.ts +18 -0
  450. package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -0
  451. package/mcp-server/dist/tools/tictactoe-tools.js +78 -0
  452. package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -0
  453. package/mcp-server/dist/tools/tictactoe.d.ts +7 -0
  454. package/mcp-server/dist/tools/tictactoe.d.ts.map +1 -0
  455. package/mcp-server/dist/tools/tictactoe.js +11 -0
  456. package/mcp-server/dist/tools/tictactoe.js.map +1 -0
  457. package/mcp-server/dist/tools/utils.d.ts +19 -0
  458. package/mcp-server/dist/tools/utils.d.ts.map +1 -0
  459. package/mcp-server/dist/tools/utils.js +54 -0
  460. package/mcp-server/dist/tools/utils.js.map +1 -0
  461. package/mcp-server/dist/tools/whiteboard-format.d.ts +88 -0
  462. package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -0
  463. package/mcp-server/dist/tools/whiteboard-format.js +337 -0
  464. package/mcp-server/dist/tools/whiteboard-format.js.map +1 -0
  465. package/mcp-server/dist/tools/whiteboard-tools.d.ts +326 -0
  466. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -0
  467. package/mcp-server/dist/tools/whiteboard-tools.js +222 -0
  468. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -0
  469. package/mcp-server/dist/tools/whiteboard.d.ts +8 -0
  470. package/mcp-server/dist/tools/whiteboard.d.ts.map +1 -0
  471. package/mcp-server/dist/tools/whiteboard.js +16 -0
  472. package/mcp-server/dist/tools/whiteboard.js.map +1 -0
  473. package/mcp-server/dist/tools/youtube/analytics.d.ts +46 -0
  474. package/mcp-server/dist/tools/youtube/analytics.d.ts.map +1 -0
  475. package/mcp-server/dist/tools/youtube/analytics.js +83 -0
  476. package/mcp-server/dist/tools/youtube/analytics.js.map +1 -0
  477. package/mcp-server/dist/tools/youtube/dedup.d.ts +35 -0
  478. package/mcp-server/dist/tools/youtube/dedup.d.ts.map +1 -0
  479. package/mcp-server/dist/tools/youtube/dedup.js +56 -0
  480. package/mcp-server/dist/tools/youtube/dedup.js.map +1 -0
  481. package/mcp-server/dist/tools/youtube/download.d.ts +31 -0
  482. package/mcp-server/dist/tools/youtube/download.d.ts.map +1 -0
  483. package/mcp-server/dist/tools/youtube/download.js +30 -0
  484. package/mcp-server/dist/tools/youtube/download.js.map +1 -0
  485. package/mcp-server/dist/tools/youtube/helpers.d.ts +66 -0
  486. package/mcp-server/dist/tools/youtube/helpers.d.ts.map +1 -0
  487. package/mcp-server/dist/tools/youtube/helpers.js +143 -0
  488. package/mcp-server/dist/tools/youtube/helpers.js.map +1 -0
  489. package/mcp-server/dist/tools/youtube/media.d.ts +43 -0
  490. package/mcp-server/dist/tools/youtube/media.d.ts.map +1 -0
  491. package/mcp-server/dist/tools/youtube/media.js +97 -0
  492. package/mcp-server/dist/tools/youtube/media.js.map +1 -0
  493. package/mcp-server/dist/tools/youtube/metadata.d.ts +33 -0
  494. package/mcp-server/dist/tools/youtube/metadata.d.ts.map +1 -0
  495. package/mcp-server/dist/tools/youtube/metadata.js +106 -0
  496. package/mcp-server/dist/tools/youtube/metadata.js.map +1 -0
  497. package/mcp-server/dist/tools/youtube/navigate.d.ts +30 -0
  498. package/mcp-server/dist/tools/youtube/navigate.d.ts.map +1 -0
  499. package/mcp-server/dist/tools/youtube/navigate.js +71 -0
  500. package/mcp-server/dist/tools/youtube/navigate.js.map +1 -0
  501. package/mcp-server/dist/tools/youtube/playlist.d.ts +29 -0
  502. package/mcp-server/dist/tools/youtube/playlist.d.ts.map +1 -0
  503. package/mcp-server/dist/tools/youtube/playlist.js +128 -0
  504. package/mcp-server/dist/tools/youtube/playlist.js.map +1 -0
  505. package/mcp-server/dist/tools/youtube/schedule.d.ts +31 -0
  506. package/mcp-server/dist/tools/youtube/schedule.d.ts.map +1 -0
  507. package/mcp-server/dist/tools/youtube/schedule.js +147 -0
  508. package/mcp-server/dist/tools/youtube/schedule.js.map +1 -0
  509. package/mcp-server/dist/tools/youtube/source.d.ts +36 -0
  510. package/mcp-server/dist/tools/youtube/source.d.ts.map +1 -0
  511. package/mcp-server/dist/tools/youtube/source.js +85 -0
  512. package/mcp-server/dist/tools/youtube/source.js.map +1 -0
  513. package/mcp-server/dist/tools/youtube/upload.d.ts +53 -0
  514. package/mcp-server/dist/tools/youtube/upload.d.ts.map +1 -0
  515. package/mcp-server/dist/tools/youtube/upload.js +255 -0
  516. package/mcp-server/dist/tools/youtube/upload.js.map +1 -0
  517. package/mcp-server/dist/tools/youtube.d.ts +12 -0
  518. package/mcp-server/dist/tools/youtube.d.ts.map +1 -0
  519. package/mcp-server/dist/tools/youtube.js +38 -0
  520. package/mcp-server/dist/tools/youtube.js.map +1 -0
  521. package/mcp-server/dist/tui.d.ts +3 -0
  522. package/mcp-server/dist/tui.d.ts.map +1 -0
  523. package/mcp-server/dist/tui.js +806 -0
  524. package/mcp-server/dist/tui.js.map +1 -0
  525. package/mcp-server/dist/types.d.ts +77 -0
  526. package/mcp-server/dist/types.d.ts.map +1 -0
  527. package/mcp-server/dist/types.js +2 -0
  528. package/mcp-server/dist/types.js.map +1 -0
  529. package/mcp-server/package-lock.json +4798 -0
  530. package/mcp-server/package.json +55 -38
  531. package/mcp-server/run.mjs +12 -2
  532. package/mcp-server/src/config.ts +48 -3
  533. package/mcp-server/src/http.ts +296 -93
  534. package/mcp-server/src/index.ts +546 -203
  535. package/mcp-server/src/preload-http.ts +19 -18
  536. package/mcp-server/src/preload.ts +19 -18
  537. package/mcp-server/src/scripts/setup-embeddings.ts +9 -0
  538. package/mcp-server/src/services/assistant-judgments.ts +157 -0
  539. package/mcp-server/src/services/browser-assist-gate.ts +383 -0
  540. package/mcp-server/src/services/browser-assist.ts +267 -0
  541. package/mcp-server/src/services/browser-bench.ts +477 -0
  542. package/mcp-server/src/services/browser-judgments.ts +414 -0
  543. package/mcp-server/src/services/browser-risk.ts +484 -0
  544. package/mcp-server/src/services/categories.ts +36 -19
  545. package/mcp-server/src/services/codex-config-heal.ts +403 -0
  546. package/mcp-server/src/services/desktop-assist-gate.ts +251 -0
  547. package/mcp-server/src/services/desktop-assist.ts +308 -0
  548. package/mcp-server/src/services/desktop-bench.ts +372 -0
  549. package/mcp-server/src/services/desktop-client.ts +76 -0
  550. package/mcp-server/src/services/desktop-judgments.ts +218 -0
  551. package/mcp-server/src/services/desktop-risk.ts +743 -0
  552. package/mcp-server/src/services/edit-stale.ts +299 -0
  553. package/mcp-server/src/services/embedding-service.ts +108 -0
  554. package/mcp-server/src/services/embedding-worker.ts +46 -0
  555. package/mcp-server/src/services/fb-regions.ts +221 -0
  556. package/mcp-server/src/services/file-checksums.ts +26 -9
  557. package/mcp-server/src/services/file-excerpt.ts +59 -0
  558. package/mcp-server/src/services/identity.ts +291 -0
  559. package/mcp-server/src/services/local-embeddings.ts +2 -77
  560. package/mcp-server/src/services/memory-client.ts +23 -0
  561. package/mcp-server/src/services/memory-judge-backfill.ts +462 -0
  562. package/mcp-server/src/services/memory-judgments.ts +901 -0
  563. package/mcp-server/src/services/memory-maintenance.ts +360 -0
  564. package/mcp-server/src/services/memory-retrieval.ts +349 -0
  565. package/mcp-server/src/services/memory-schema.ts +280 -0
  566. package/mcp-server/src/services/memory-sessions.ts +87 -0
  567. package/mcp-server/src/services/memory-triage.ts +182 -0
  568. package/mcp-server/src/services/memory-verification.ts +68 -0
  569. package/mcp-server/src/services/memory-writer.ts +125 -0
  570. package/mcp-server/src/services/neural-interface.ts +1217 -73
  571. package/mcp-server/src/services/profiles.ts +428 -0
  572. package/mcp-server/src/services/secret-gate.ts +52 -0
  573. package/mcp-server/src/services/server-instructions.ts +122 -0
  574. package/mcp-server/src/services/sqlite.ts +1456 -823
  575. package/mcp-server/src/services/typesafe-bench.ts +247 -0
  576. package/mcp-server/src/services/typesafe-config.ts +790 -0
  577. package/mcp-server/src/services/typesafe.ts +390 -0
  578. package/mcp-server/src/services/vector-cache.ts +255 -0
  579. package/mcp-server/src/services/whiteboard-geometry.ts +711 -0
  580. package/mcp-server/src/tools/agents.ts +539 -0
  581. package/mcp-server/src/tools/bluesky.ts +1186 -0
  582. package/mcp-server/src/tools/browser-advanced.ts +15 -6
  583. package/mcp-server/src/tools/browser-batch.ts +178 -0
  584. package/mcp-server/src/tools/browser-cheatsheet.ts +155 -0
  585. package/mcp-server/src/tools/browser-interact.ts +362 -255
  586. package/mcp-server/src/tools/browser-navigate.ts +164 -77
  587. package/mcp-server/src/tools/browser-observe.ts +2222 -1330
  588. package/mcp-server/src/tools/browser.ts +181 -107
  589. package/mcp-server/src/tools/card.ts +7 -5
  590. package/mcp-server/src/tools/choice.ts +103 -0
  591. package/mcp-server/src/tools/computer.ts +190 -0
  592. package/mcp-server/src/tools/discord.ts +10 -23
  593. package/mcp-server/src/tools/fb-groups.ts +387 -0
  594. package/mcp-server/src/tools/forget.ts +1 -1
  595. package/mcp-server/src/tools/git.ts +3 -1
  596. package/mcp-server/src/tools/gsc/experience.ts +440 -0
  597. package/mcp-server/src/tools/gsc/helpers.ts +288 -0
  598. package/mcp-server/src/tools/gsc/indexing.ts +495 -0
  599. package/mcp-server/src/tools/gsc/inspect.ts +391 -0
  600. package/mcp-server/src/tools/gsc/navigate.ts +236 -0
  601. package/mcp-server/src/tools/gsc/performance.ts +352 -0
  602. package/mcp-server/src/tools/gsc/settings.ts +564 -0
  603. package/mcp-server/src/tools/gsc.ts +95 -0
  604. package/mcp-server/src/tools/image.ts +3 -1
  605. package/mcp-server/src/tools/leonardo-browser-tools.ts +47 -37
  606. package/mcp-server/src/tools/leonardo.ts +7 -5
  607. package/mcp-server/src/tools/loop.ts +118 -25
  608. package/mcp-server/src/tools/memories.ts +65 -5
  609. package/mcp-server/src/tools/morelogin.ts +81 -0
  610. package/mcp-server/src/tools/profile.ts +122 -0
  611. package/mcp-server/src/tools/recall.ts +105 -261
  612. package/mcp-server/src/tools/reflect.ts +171 -145
  613. package/mcp-server/src/tools/remember.ts +223 -115
  614. package/mcp-server/src/tools/style-guide-tools.ts +250 -0
  615. package/mcp-server/src/tools/style-guide.ts +16 -0
  616. package/mcp-server/src/tools/sync.ts +66 -9
  617. package/mcp-server/src/tools/tictactoe.ts +3 -1
  618. package/mcp-server/src/tools/utils.ts +22 -0
  619. package/mcp-server/src/tools/whiteboard-format.ts +394 -0
  620. package/mcp-server/src/tools/whiteboard-tools.ts +191 -183
  621. package/mcp-server/src/tools/whiteboard.ts +7 -5
  622. package/mcp-server/src/tools/youtube/analytics.ts +106 -0
  623. package/mcp-server/src/tools/youtube/dedup.ts +57 -0
  624. package/mcp-server/src/tools/youtube/download.ts +41 -0
  625. package/mcp-server/src/tools/youtube/helpers.ts +183 -0
  626. package/mcp-server/src/tools/youtube/media.ts +109 -0
  627. package/mcp-server/src/tools/youtube/metadata.ts +112 -0
  628. package/mcp-server/src/tools/youtube/navigate.ts +81 -0
  629. package/mcp-server/src/tools/youtube/playlist.ts +134 -0
  630. package/mcp-server/src/tools/youtube/schedule.ts +158 -0
  631. package/mcp-server/src/tools/youtube/source.ts +101 -0
  632. package/mcp-server/src/tools/youtube/upload.ts +296 -0
  633. package/mcp-server/src/tools/youtube.ts +47 -0
  634. package/mcp-server/src/tui.ts +8 -9
  635. package/neural-interface/games/TicTacToe/1.svg +1 -0
  636. package/neural-interface/games/TicTacToe/2.svg +1 -0
  637. package/neural-interface/games/TicTacToe/3.svg +1 -0
  638. package/neural-interface/games/TicTacToe/4.svg +1 -0
  639. package/neural-interface/games/TicTacToe/5.svg +1 -0
  640. package/neural-interface/games/TicTacToe/6.svg +1 -0
  641. package/neural-interface/games/TicTacToe/7.svg +1 -0
  642. package/neural-interface/games/TicTacToe/8.svg +1 -0
  643. package/neural-interface/games/TicTacToe/9.svg +1 -0
  644. package/neural-interface/games/TicTacToe/Board.svg +1 -0
  645. package/neural-interface/games/TicTacToe/Circle.svg +1 -0
  646. package/neural-interface/games/TicTacToe/Cross.svg +1 -0
  647. package/neural-interface/i18n/en.json +6983 -0
  648. package/neural-interface/i18n/pt-BR.json +6987 -0
  649. package/neural-interface/lib/assistant-api.js +1005 -0
  650. package/neural-interface/lib/assistant-attachments.js +121 -0
  651. package/neural-interface/lib/assistant-brains/claude.js +207 -0
  652. package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +43 -0
  653. package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +56 -0
  654. package/neural-interface/lib/assistant-brains/codex.js +213 -0
  655. package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +47 -0
  656. package/neural-interface/lib/assistant-brains/opencode-route-gate.js +62 -0
  657. package/neural-interface/lib/assistant-brains/opencode.js +320 -0
  658. package/neural-interface/lib/assistant-budget.js +318 -0
  659. package/neural-interface/lib/assistant-catalog.js +731 -0
  660. package/neural-interface/lib/assistant-clarify.js +664 -0
  661. package/neural-interface/lib/assistant-config.js +232 -0
  662. package/neural-interface/lib/assistant-dispatch.js +2744 -0
  663. package/neural-interface/lib/assistant-envelope.js +579 -0
  664. package/neural-interface/lib/assistant-evidence.js +236 -0
  665. package/neural-interface/lib/assistant-hidden-models.js +272 -0
  666. package/neural-interface/lib/assistant-jev.js +117 -0
  667. package/neural-interface/lib/assistant-judgments.js +111 -0
  668. package/neural-interface/lib/assistant-media.js +335 -0
  669. package/neural-interface/lib/assistant-memory.js +398 -0
  670. package/neural-interface/lib/assistant-persona.js +444 -0
  671. package/neural-interface/lib/assistant-plan-permissions.js +448 -0
  672. package/neural-interface/lib/assistant-playbooks/design.md +87 -0
  673. package/neural-interface/lib/assistant-playbooks.js +72 -0
  674. package/neural-interface/lib/assistant-pricing.js +159 -0
  675. package/neural-interface/lib/assistant-route-gate-codex.js +163 -0
  676. package/neural-interface/lib/assistant-route-gate.js +212 -0
  677. package/neural-interface/lib/assistant-router.js +1324 -0
  678. package/neural-interface/lib/assistant-runtime.js +3337 -0
  679. package/neural-interface/lib/assistant-task-prompt.js +472 -0
  680. package/neural-interface/lib/assistant-usage.js +1688 -0
  681. package/neural-interface/lib/augmented-path.js +50 -0
  682. package/neural-interface/lib/automation-storage-migration.js +54 -0
  683. package/neural-interface/lib/backup-service.js +851 -0
  684. package/neural-interface/lib/backup-zip-reader.js +262 -0
  685. package/neural-interface/lib/browser-assist-api.js +41 -0
  686. package/neural-interface/lib/browser-console.js +176 -0
  687. package/neural-interface/lib/browser-execution.js +241 -0
  688. package/neural-interface/lib/browser-extraction.js +191 -0
  689. package/neural-interface/lib/browser-screenshot.js +399 -0
  690. package/neural-interface/lib/browser-semantic-context.js +639 -0
  691. package/neural-interface/lib/browser-snapshots.js +192 -0
  692. package/neural-interface/lib/browser-tab-recovery.js +119 -0
  693. package/neural-interface/lib/browser-targets.js +70 -0
  694. package/neural-interface/lib/browser-tool-policy.js +926 -0
  695. package/neural-interface/lib/claude-accounts.js +230 -0
  696. package/neural-interface/lib/claude-agent-bridge.js +3296 -0
  697. package/neural-interface/lib/claude-bypass-policy.js +99 -0
  698. package/neural-interface/lib/claude-history.js +429 -0
  699. package/neural-interface/lib/claude-model-catalog.js +483 -0
  700. package/neural-interface/lib/claude-panel-requests.js +165 -0
  701. package/neural-interface/lib/claude-panel-session.js +272 -0
  702. package/neural-interface/lib/claude-permission-rules.js +153 -0
  703. package/neural-interface/lib/claude-session-cleanup.js +71 -0
  704. package/neural-interface/lib/claude-session-list.js +82 -0
  705. package/neural-interface/lib/claude-session-ops.js +140 -0
  706. package/neural-interface/lib/claude-settings-view.js +51 -0
  707. package/neural-interface/lib/claude-skin-connect.js +79 -0
  708. package/neural-interface/lib/claude-stall-policy.js +7 -0
  709. package/neural-interface/lib/claude-temporary.js +435 -0
  710. package/neural-interface/lib/cli-update-planner.js +312 -0
  711. package/neural-interface/lib/codex-capabilities.d.ts +41 -0
  712. package/neural-interface/lib/codex-capabilities.js +148 -0
  713. package/neural-interface/lib/codex-collaboration-mode.js +17 -0
  714. package/neural-interface/lib/codex-compat-rpc.js +241 -0
  715. package/neural-interface/lib/codex-mcp-approvals.js +56 -0
  716. package/neural-interface/lib/codex-mcp-apps.js +47 -0
  717. package/neural-interface/lib/codex-model-context.js +202 -0
  718. package/neural-interface/lib/codex-plan-store.js +71 -0
  719. package/neural-interface/lib/codex-request-journal.js +242 -0
  720. package/neural-interface/lib/codex-runtime-path.js +213 -0
  721. package/neural-interface/lib/codex-session-catalog.js +231 -0
  722. package/neural-interface/lib/codex-session-settings.js +46 -0
  723. package/neural-interface/lib/codex-sidepanel-permissions.js +110 -0
  724. package/neural-interface/lib/codex-thread-history.js +165 -0
  725. package/neural-interface/lib/codex-user-verification.js +34 -0
  726. package/neural-interface/lib/codex-writer-lifecycle.js +152 -0
  727. package/neural-interface/lib/confined-fs.js +256 -0
  728. package/neural-interface/lib/db.js +922 -0
  729. package/neural-interface/lib/design-md.js +9 -0
  730. package/neural-interface/lib/desktop/api.js +92 -0
  731. package/neural-interface/lib/desktop/audit.js +62 -0
  732. package/neural-interface/lib/desktop/build.js +423 -0
  733. package/neural-interface/lib/desktop/config.js +606 -0
  734. package/neural-interface/lib/desktop/coords.js +76 -0
  735. package/neural-interface/lib/desktop/fake-helper.js +1192 -0
  736. package/neural-interface/lib/desktop/frames.js +77 -0
  737. package/neural-interface/lib/desktop/grants.js +84 -0
  738. package/neural-interface/lib/desktop/guards.js +170 -0
  739. package/neural-interface/lib/desktop/helper/SynabunDesktop.swift +3056 -0
  740. package/neural-interface/lib/desktop/lease.js +51 -0
  741. package/neural-interface/lib/desktop/manager.js +545 -0
  742. package/neural-interface/lib/desktop/press-contexts.js +103 -0
  743. package/neural-interface/lib/desktop/protocol.js +495 -0
  744. package/neural-interface/lib/desktop/service.js +1202 -0
  745. package/neural-interface/lib/effort-levels.js +148 -0
  746. package/neural-interface/lib/event-loop-monitor.js +67 -0
  747. package/neural-interface/lib/exec-loop-command.js +209 -0
  748. package/neural-interface/lib/folder-picker.ps1 +77 -0
  749. package/neural-interface/lib/http-guards.js +287 -0
  750. package/neural-interface/lib/jsonl-lines.js +94 -0
  751. package/neural-interface/lib/loop-logger.js +127 -0
  752. package/neural-interface/lib/mcp-client-config.js +133 -0
  753. package/neural-interface/lib/mcp-installer.js +487 -0
  754. package/neural-interface/lib/mcp-profile-refresh-coordinator.js +78 -0
  755. package/neural-interface/lib/mcp-profile-servers.js +120 -0
  756. package/neural-interface/lib/memo-cache.js +84 -0
  757. package/neural-interface/lib/memory-api.js +758 -0
  758. package/neural-interface/lib/memory-map-api.js +1150 -0
  759. package/neural-interface/lib/memory-map-layout.js +872 -0
  760. package/neural-interface/lib/memory-map-worker.js +165 -0
  761. package/neural-interface/lib/memory-session-capture.js +81 -0
  762. package/neural-interface/lib/memory-timers.js +62 -0
  763. package/neural-interface/lib/morelogin.js +301 -0
  764. package/neural-interface/lib/native-binary-runtime.js +650 -0
  765. package/neural-interface/lib/native-loop-goal.js +33 -0
  766. package/neural-interface/lib/native-loop-providers.js +1016 -0
  767. package/neural-interface/lib/native-loop-runtime.js +747 -0
  768. package/neural-interface/lib/opencode-hidden-models.js +113 -0
  769. package/neural-interface/lib/opencode-history.js +253 -0
  770. package/neural-interface/lib/opencode-runtime-config.js +58 -0
  771. package/neural-interface/lib/opencode-v2-client.js +486 -0
  772. package/neural-interface/lib/opencode-v2-ws-requests.js +955 -0
  773. package/neural-interface/lib/path-confine.js +213 -0
  774. package/neural-interface/lib/plugin-installer.js +264 -0
  775. package/neural-interface/lib/project-storage.js +766 -0
  776. package/neural-interface/lib/pty-host/core.js +603 -0
  777. package/neural-interface/lib/pty-host/flow.js +43 -0
  778. package/neural-interface/lib/pty-host/host.js +47 -0
  779. package/neural-interface/lib/pty-host/manager.js +360 -0
  780. package/neural-interface/lib/pty-host/protocol.js +81 -0
  781. package/neural-interface/lib/pty-host/snapshot.js +133 -0
  782. package/neural-interface/lib/remote-policy.js +582 -0
  783. package/neural-interface/lib/rulesets/api.js +175 -0
  784. package/neural-interface/lib/rulesets/fs-safe.js +245 -0
  785. package/neural-interface/lib/rulesets/installer.js +1453 -0
  786. package/neural-interface/lib/rulesets/json-edit.js +186 -0
  787. package/neural-interface/lib/rulesets/lock.js +170 -0
  788. package/neural-interface/lib/rulesets/managed-text.js +314 -0
  789. package/neural-interface/lib/rulesets/normalise.js +24 -0
  790. package/neural-interface/lib/rulesets/render.js +84 -0
  791. package/neural-interface/lib/schedule-launch-intent.js +40 -0
  792. package/neural-interface/lib/session-cache-builder.js +524 -0
  793. package/neural-interface/lib/session-chunker.js +344 -0
  794. package/neural-interface/lib/session-indexer.js +327 -0
  795. package/neural-interface/lib/session-title-generator.js +227 -0
  796. package/neural-interface/lib/skill-prompt-bridge.js +11 -0
  797. package/neural-interface/lib/style-guide/api.js +375 -0
  798. package/neural-interface/lib/style-guide/color.js +352 -0
  799. package/neural-interface/lib/style-guide/export-css.js +99 -0
  800. package/neural-interface/lib/style-guide/export-dtcg.js +209 -0
  801. package/neural-interface/lib/style-guide/export-tailwind.js +102 -0
  802. package/neural-interface/lib/style-guide/fonts.json +227 -0
  803. package/neural-interface/lib/style-guide/import.js +1268 -0
  804. package/neural-interface/lib/style-guide/pointers.js +103 -0
  805. package/neural-interface/lib/style-guide/presets.js +232 -0
  806. package/neural-interface/lib/style-guide/render-design-md.js +319 -0
  807. package/neural-interface/lib/style-guide/schema.js +848 -0
  808. package/neural-interface/lib/style-guide/security.js +43 -0
  809. package/neural-interface/lib/style-guide/store.js +491 -0
  810. package/neural-interface/lib/style-guide/summary.js +106 -0
  811. package/neural-interface/lib/style-guide/tokens.js +170 -0
  812. package/neural-interface/lib/synabun-update-plan.js +305 -0
  813. package/neural-interface/lib/synabun-version.js +179 -0
  814. package/neural-interface/lib/system-restore.js +99 -0
  815. package/neural-interface/lib/terminal-env.js +86 -0
  816. package/neural-interface/lib/ui-blob-store.js +106 -0
  817. package/neural-interface/lib/vector-cache.js +2 -0
  818. package/neural-interface/lib/virtual-socket.js +60 -0
  819. package/neural-interface/lib/whatsapp/api.js +146 -0
  820. package/neural-interface/lib/whatsapp/auth-store.js +389 -0
  821. package/neural-interface/lib/whatsapp/baileys-adapter.js +457 -0
  822. package/neural-interface/lib/whatsapp/brain.js +128 -0
  823. package/neural-interface/lib/whatsapp/bridge.js +1499 -0
  824. package/neural-interface/lib/whatsapp/cards.js +519 -0
  825. package/neural-interface/lib/whatsapp/commands.js +92 -0
  826. package/neural-interface/lib/whatsapp/config.js +291 -0
  827. package/neural-interface/lib/whatsapp/connector/entry.mjs +25 -0
  828. package/neural-interface/lib/whatsapp/connector/manifest.json +6 -0
  829. package/neural-interface/lib/whatsapp/connector/npm-shrinkwrap.json +717 -0
  830. package/neural-interface/lib/whatsapp/connector/package.json +8 -0
  831. package/neural-interface/lib/whatsapp/fake-baileys.js +444 -0
  832. package/neural-interface/lib/whatsapp/format.js +552 -0
  833. package/neural-interface/lib/whatsapp/host-core.js +1225 -0
  834. package/neural-interface/lib/whatsapp/host.js +119 -0
  835. package/neural-interface/lib/whatsapp/identity.js +288 -0
  836. package/neural-interface/lib/whatsapp/inbound.js +149 -0
  837. package/neural-interface/lib/whatsapp/installer.js +562 -0
  838. package/neural-interface/lib/whatsapp/manager.js +638 -0
  839. package/neural-interface/lib/whatsapp/paths.js +81 -0
  840. package/neural-interface/lib/whatsapp/protocol.js +327 -0
  841. package/neural-interface/lib/whatsapp/qr-svg.js +57 -0
  842. package/neural-interface/lib/whatsapp/redact.js +130 -0
  843. package/neural-interface/lib/whatsapp/service.js +1305 -0
  844. package/neural-interface/lib/whatsapp/vendor/qrcodegen.js +848 -0
  845. package/neural-interface/package-lock.json +4682 -0
  846. package/neural-interface/package.json +58 -27
  847. package/neural-interface/public/apple-touch-icon.png +0 -0
  848. package/neural-interface/public/category-logos/synabun.png +0 -0
  849. package/neural-interface/public/claude.svg +1 -0
  850. package/neural-interface/public/favicon-16x16.png +0 -0
  851. package/neural-interface/public/favicon-32x32.png +0 -0
  852. package/neural-interface/public/icon-192.png +0 -0
  853. package/neural-interface/public/icon-512.png +0 -0
  854. package/neural-interface/public/index.html +32 -182
  855. package/neural-interface/public/index2d.html +2 -2
  856. package/neural-interface/public/logo-synabun.png +0 -0
  857. package/neural-interface/public/logoHD.png +0 -0
  858. package/neural-interface/public/mcp.svg +4 -0
  859. package/neural-interface/public/offline.html +335 -299
  860. package/neural-interface/public/onboarding.html +692 -155
  861. package/neural-interface/public/opencode-logo-dark-square.svg +1 -0
  862. package/neural-interface/public/shared/agent-runtime-options.js +596 -0
  863. package/neural-interface/public/shared/api.js +339 -28
  864. package/neural-interface/public/shared/assistant/asst-accounts.js +318 -0
  865. package/neural-interface/public/shared/assistant/asst-agents-dock.js +296 -0
  866. package/neural-interface/public/shared/assistant/asst-api.js +270 -0
  867. package/neural-interface/public/shared/assistant/asst-brain-picker.js +744 -0
  868. package/neural-interface/public/shared/assistant/asst-budget.js +333 -0
  869. package/neural-interface/public/shared/assistant/asst-composer.js +656 -0
  870. package/neural-interface/public/shared/assistant/asst-computer.js +803 -0
  871. package/neural-interface/public/shared/assistant/asst-control.js +1018 -0
  872. package/neural-interface/public/shared/assistant/asst-hosts.js +262 -0
  873. package/neural-interface/public/shared/assistant/asst-mascot.js +311 -0
  874. package/neural-interface/public/shared/assistant/asst-menu.js +375 -0
  875. package/neural-interface/public/shared/assistant/asst-panel.js +1845 -0
  876. package/neural-interface/public/shared/assistant/asst-rack-styles.js +589 -0
  877. package/neural-interface/public/shared/assistant/asst-render.js +3296 -0
  878. package/neural-interface/public/shared/assistant/asst-route.js +1653 -0
  879. package/neural-interface/public/shared/assistant/asst-roving.js +75 -0
  880. package/neural-interface/public/shared/assistant/asst-sanitize.js +117 -0
  881. package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +488 -0
  882. package/neural-interface/public/shared/assistant/asst-sidepanel.js +675 -0
  883. package/neural-interface/public/shared/assistant/asst-slash.js +258 -0
  884. package/neural-interface/public/shared/assistant/asst-state.js +727 -0
  885. package/neural-interface/public/shared/assistant/asst-styles.js +1684 -0
  886. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +1017 -0
  887. package/neural-interface/public/shared/assistant/asst-usage.js +444 -0
  888. package/neural-interface/public/shared/assistant/asst-ws.js +175 -0
  889. package/neural-interface/public/shared/automation-context.js +75 -0
  890. package/neural-interface/public/shared/blob-store.js +99 -0
  891. package/neural-interface/public/shared/cdx/cdx-capabilities.js +118 -0
  892. package/neural-interface/public/shared/cdx/cdx-cards.js +37 -0
  893. package/neural-interface/public/shared/cdx/cdx-commands.js +171 -0
  894. package/neural-interface/public/shared/cdx/cdx-context-menu.js +402 -0
  895. package/neural-interface/public/shared/cdx/cdx-context-model.js +220 -0
  896. package/neural-interface/public/shared/cdx/cdx-features.js +408 -0
  897. package/neural-interface/public/shared/cdx/cdx-icons.js +89 -0
  898. package/neural-interface/public/shared/cdx/cdx-mcp-app-host.js +414 -0
  899. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.html +6 -0
  900. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.js +56 -0
  901. package/neural-interface/public/shared/cdx/cdx-mcp-app.js +178 -0
  902. package/neural-interface/public/shared/cdx/cdx-model-catalog.js +120 -0
  903. package/neural-interface/public/shared/cdx/cdx-output-model.js +261 -0
  904. package/neural-interface/public/shared/cdx/cdx-output.js +382 -0
  905. package/neural-interface/public/shared/cdx/cdx-panel.js +1372 -0
  906. package/neural-interface/public/shared/cdx/cdx-plan.js +266 -0
  907. package/neural-interface/public/shared/cdx/cdx-protocol.js +682 -0
  908. package/neural-interface/public/shared/cdx/cdx-render.js +3381 -0
  909. package/neural-interface/public/shared/cdx/cdx-requests.js +1136 -0
  910. package/neural-interface/public/shared/cdx/cdx-styles.js +3251 -0
  911. package/neural-interface/public/shared/cdx/cdx-tabs.js +7992 -0
  912. package/neural-interface/public/shared/cdx/cdx-ws.js +363 -0
  913. package/neural-interface/public/shared/cli-status.js +169 -0
  914. package/neural-interface/public/shared/constants.js +22 -5
  915. package/neural-interface/public/shared/cp/cp-agents.js +186 -0
  916. package/neural-interface/public/shared/cp/cp-bash.js +252 -0
  917. package/neural-interface/public/shared/cp/cp-compose.js +159 -0
  918. package/neural-interface/public/shared/cp/cp-context-menu.js +309 -0
  919. package/neural-interface/public/shared/cp/cp-context-model.js +157 -0
  920. package/neural-interface/public/shared/cp/cp-context-window.js +80 -0
  921. package/neural-interface/public/shared/cp/cp-ctx.js +11 -0
  922. package/neural-interface/public/shared/cp/cp-diff.js +255 -0
  923. package/neural-interface/public/shared/cp/cp-event-rows.js +637 -0
  924. package/neural-interface/public/shared/cp/cp-events.js +846 -0
  925. package/neural-interface/public/shared/cp/cp-markdown.js +104 -0
  926. package/neural-interface/public/shared/cp/cp-permission-model.js +905 -0
  927. package/neural-interface/public/shared/cp/cp-permissions.js +626 -0
  928. package/neural-interface/public/shared/cp/cp-rehydrate.js +113 -0
  929. package/neural-interface/public/shared/cp/cp-restore.js +224 -0
  930. package/neural-interface/public/shared/cp/cp-session-model.js +338 -0
  931. package/neural-interface/public/shared/cp/cp-session-settings.js +254 -0
  932. package/neural-interface/public/shared/cp/cp-sessions.js +227 -0
  933. package/neural-interface/public/shared/cp/cp-statusline.js +153 -0
  934. package/neural-interface/public/shared/cp/cp-styles.js +349 -0
  935. package/neural-interface/public/shared/cp/cp-tasks-model.js +282 -0
  936. package/neural-interface/public/shared/cp/cp-tasks.js +107 -0
  937. package/neural-interface/public/shared/cp/cp-temporary-view.js +56 -0
  938. package/neural-interface/public/shared/cp/cp-temporary.js +231 -0
  939. package/neural-interface/public/shared/cp/cp-tool-cards.js +326 -0
  940. package/neural-interface/public/shared/cp/cp-tool-results.js +618 -0
  941. package/neural-interface/public/shared/cp/cp-usage-model.js +124 -0
  942. package/neural-interface/public/shared/graph-activity.js +68 -0
  943. package/neural-interface/public/shared/html-shell.js +107 -12
  944. package/neural-interface/public/shared/i18n.js +132 -34
  945. package/neural-interface/public/shared/node-positions-store.js +44 -0
  946. package/neural-interface/public/shared/ocp-hidden-models.js +116 -0
  947. package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +355 -0
  948. package/neural-interface/public/shared/ocp-v2/ocp-v2-autoaccept-button.js +35 -0
  949. package/neural-interface/public/shared/ocp-v2/ocp-v2-automation-ownership.js +72 -0
  950. package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +280 -0
  951. package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +67 -0
  952. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +179 -0
  953. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes.js +164 -0
  954. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +725 -0
  955. package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +75 -0
  956. package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +1204 -0
  957. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm-logic.js +117 -0
  958. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm.js +59 -0
  959. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-gauge.js +252 -0
  960. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +478 -0
  961. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +179 -0
  962. package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +233 -0
  963. package/neural-interface/public/shared/ocp-v2/ocp-v2-icons.js +30 -0
  964. package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +1065 -0
  965. package/neural-interface/public/shared/ocp-v2/ocp-v2-mention-hints.js +182 -0
  966. package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +655 -0
  967. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +2636 -0
  968. package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +601 -0
  969. package/neural-interface/public/shared/ocp-v2/ocp-v2-profile-inheritance.js +78 -0
  970. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +649 -0
  971. package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +35 -0
  972. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +357 -0
  973. package/neural-interface/public/shared/ocp-v2/ocp-v2-render-logic.js +189 -0
  974. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +1869 -0
  975. package/neural-interface/public/shared/ocp-v2/ocp-v2-select.js +42 -0
  976. package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +117 -0
  977. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +1714 -0
  978. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +468 -0
  979. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-widgets.js +63 -0
  980. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +366 -0
  981. package/neural-interface/public/shared/ocp-v2/ocp-v2-settings-link.js +19 -0
  982. package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +343 -0
  983. package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +746 -0
  984. package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +347 -0
  985. package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +338 -0
  986. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +3543 -0
  987. package/neural-interface/public/shared/ocp-v2/ocp-v2-subagents-logic.js +482 -0
  988. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools-logic.js +351 -0
  989. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools.js +168 -0
  990. package/neural-interface/public/shared/ocp-v2/ocp-v2-variantpicker.js +315 -0
  991. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +545 -0
  992. package/neural-interface/public/shared/provider-icons.js +30 -0
  993. package/neural-interface/public/shared/session-title.js +100 -0
  994. package/neural-interface/public/shared/settings/settings-ia.js +389 -0
  995. package/neural-interface/public/shared/settings/settings-kit.js +234 -0
  996. package/neural-interface/public/shared/settings/settings-search.js +463 -0
  997. package/neural-interface/public/shared/settings/settings-shell.js +570 -0
  998. package/neural-interface/public/shared/state.js +5 -0
  999. package/neural-interface/public/shared/storage.js +50 -7
  1000. package/neural-interface/public/shared/styleguide/sg-agents.js +42 -0
  1001. package/neural-interface/public/shared/styleguide/sg-brand.js +4 -0
  1002. package/neural-interface/public/shared/styleguide/sg-color-client.js +388 -0
  1003. package/neural-interface/public/shared/styleguide/sg-colors.js +148 -0
  1004. package/neural-interface/public/shared/styleguide/sg-components.js +35 -0
  1005. package/neural-interface/public/shared/styleguide/sg-history.js +41 -0
  1006. package/neural-interface/public/shared/styleguide/sg-icons-logo.js +38 -0
  1007. package/neural-interface/public/shared/styleguide/sg-imagery.js +4 -0
  1008. package/neural-interface/public/shared/styleguide/sg-import-export.js +47 -0
  1009. package/neural-interface/public/shared/styleguide/sg-kit.js +281 -0
  1010. package/neural-interface/public/shared/styleguide/sg-labels.js +318 -0
  1011. package/neural-interface/public/shared/styleguide/sg-layout.js +4 -0
  1012. package/neural-interface/public/shared/styleguide/sg-motion.js +5 -0
  1013. package/neural-interface/public/shared/styleguide/sg-panel.js +229 -0
  1014. package/neural-interface/public/shared/styleguide/sg-preview.js +138 -0
  1015. package/neural-interface/public/shared/styleguide/sg-rules.js +9 -0
  1016. package/neural-interface/public/shared/styleguide/sg-shape.js +24 -0
  1017. package/neural-interface/public/shared/styleguide/sg-state.js +132 -0
  1018. package/neural-interface/public/shared/styleguide/sg-typography.js +124 -0
  1019. package/neural-interface/public/shared/styles.css +7883 -1155
  1020. package/neural-interface/public/shared/synabun-mascot.js +1625 -0
  1021. package/neural-interface/public/shared/synabun-ticker.js +376 -0
  1022. package/neural-interface/public/shared/term-renderer.js +343 -0
  1023. package/neural-interface/public/shared/ui-assistant-panel.js +10 -0
  1024. package/neural-interface/public/shared/ui-assistant.js +77 -0
  1025. package/neural-interface/public/shared/ui-automation-studio.js +5105 -3573
  1026. package/neural-interface/public/shared/ui-claude-panel.js +11685 -6333
  1027. package/neural-interface/public/shared/ui-codex-panel.js +12 -0
  1028. package/neural-interface/public/shared/ui-cost-widget.js +55 -34
  1029. package/neural-interface/public/shared/ui-detail.js +77 -14
  1030. package/neural-interface/public/shared/ui-explorer.js +360 -181
  1031. package/neural-interface/public/shared/ui-file-explorer.js +485 -107
  1032. package/neural-interface/public/shared/ui-help.js +2 -2
  1033. package/neural-interface/public/shared/ui-image-gallery.js +45 -21
  1034. package/neural-interface/public/shared/ui-judgments.js +1346 -0
  1035. package/neural-interface/public/shared/ui-keybinds.js +3 -2
  1036. package/neural-interface/public/shared/ui-link.js +105 -51
  1037. package/neural-interface/public/shared/ui-loading.js +4 -4
  1038. package/neural-interface/public/shared/ui-memory-maintenance.js +111 -0
  1039. package/neural-interface/public/shared/ui-menubar.js +89 -4
  1040. package/neural-interface/public/shared/ui-native-loop-router-state.js +94 -0
  1041. package/neural-interface/public/shared/ui-native-loop-router.js +493 -0
  1042. package/neural-interface/public/shared/ui-native-window-id.js +7 -0
  1043. package/neural-interface/public/shared/ui-navbar.js +357 -222
  1044. package/neural-interface/public/shared/ui-notifications.js +58 -12
  1045. package/neural-interface/public/shared/ui-opencode-panel-v2.js +17 -0
  1046. package/neural-interface/public/shared/ui-panels.js +15 -7
  1047. package/neural-interface/public/shared/ui-resume.js +823 -653
  1048. package/neural-interface/public/shared/ui-schedule-queue.js +172 -0
  1049. package/neural-interface/public/shared/ui-schedules-studio.js +1882 -0
  1050. package/neural-interface/public/shared/ui-scroll-follow.js +194 -0
  1051. package/neural-interface/public/shared/ui-sessions.js +789 -34
  1052. package/neural-interface/public/shared/ui-settings.js +5793 -2190
  1053. package/neural-interface/public/shared/ui-sidepanel-layout.js +109 -0
  1054. package/neural-interface/public/shared/ui-sidepanel-runtime.js +19 -0
  1055. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +40 -0
  1056. package/neural-interface/public/shared/ui-sidepanel-sessions.js +221 -0
  1057. package/neural-interface/public/shared/ui-sidepanel-state.js +131 -0
  1058. package/neural-interface/public/shared/ui-sidepanel-tray.js +547 -0
  1059. package/neural-interface/public/shared/ui-sidepanel-windows.js +387 -0
  1060. package/neural-interface/public/shared/ui-skills.js +18 -32
  1061. package/neural-interface/public/shared/ui-styleguide.js +35 -0
  1062. package/neural-interface/public/shared/ui-sync.js +87 -0
  1063. package/neural-interface/public/shared/ui-terminal.js +7877 -6385
  1064. package/neural-interface/public/shared/ui-tool-updates.js +292 -0
  1065. package/neural-interface/public/shared/ui-tooltip.js +156 -15
  1066. package/neural-interface/public/shared/ui-tutorial-draw.js +119 -683
  1067. package/neural-interface/public/shared/ui-tutorial-layout.js +135 -0
  1068. package/neural-interface/public/shared/ui-tutorial-steps.js +59 -2209
  1069. package/neural-interface/public/shared/ui-tutorial.css +102 -0
  1070. package/neural-interface/public/shared/ui-tutorial.js +557 -1076
  1071. package/neural-interface/public/shared/ui-update.js +420 -68
  1072. package/neural-interface/public/shared/ui-whatsapp.js +941 -0
  1073. package/neural-interface/public/shared/ui-whiteboard.js +1076 -233
  1074. package/neural-interface/public/shared/ui-workspaces.js +2 -1
  1075. package/neural-interface/public/shared/utils.js +58 -0
  1076. package/neural-interface/public/shared/vterm-buffer.js +15 -5
  1077. package/neural-interface/public/shared/whatsapp/wa-phone.js +65 -0
  1078. package/neural-interface/public/shared/whatsapp/wa-view.js +411 -0
  1079. package/neural-interface/public/sidepanel-session.html +18 -0
  1080. package/neural-interface/public/sw.js +8 -2
  1081. package/neural-interface/public/synabun.png +0 -0
  1082. package/neural-interface/public/variant/2d/graph.js +1707 -1635
  1083. package/neural-interface/public/variant/2d/lasso.js +2 -1
  1084. package/neural-interface/public/variant/2d/layout.js +595 -594
  1085. package/neural-interface/public/variant/2d/main.js +556 -521
  1086. package/neural-interface/public/variant/2d/settings-gfx.js +18 -24
  1087. package/neural-interface/public/variant/3d/main.js +516 -500
  1088. package/neural-interface/public/variant/3d/map-controls.js +144 -0
  1089. package/neural-interface/public/variant/3d/map-data.js +251 -0
  1090. package/neural-interface/public/variant/3d/map-labels.js +241 -0
  1091. package/neural-interface/public/variant/3d/map-pick.js +90 -0
  1092. package/neural-interface/public/variant/3d/map-renderer.js +521 -0
  1093. package/neural-interface/public/variant/3d/map-shaders.js +158 -0
  1094. package/neural-interface/public/variant/3d/map-view.js +618 -0
  1095. package/neural-interface/public/vendor/three/manifest.json +3 -0
  1096. package/neural-interface/public/vendor/three/three-0.169.0.min.js +3844 -0
  1097. package/neural-interface/public/vendor/xterm/manifest.json +3 -0
  1098. package/neural-interface/public/vendor/xterm/xterm-6.0.0.css +285 -0
  1099. package/neural-interface/public/vendor/xterm/xterm-6.0.0.min.js +192 -0
  1100. package/neural-interface/scripts/build-vendor.mjs +64 -0
  1101. package/neural-interface/scripts/codex-protocol-fixture.mjs +83 -0
  1102. package/neural-interface/scripts/rebuild-pty.js +37 -23
  1103. package/neural-interface/scripts/vendor-three-entry.js +24 -0
  1104. package/neural-interface/scripts/vendor-xterm-entry.js +8 -0
  1105. package/neural-interface/server.js +33948 -15000
  1106. package/neural-interface/skins/default/skin.css +90 -0
  1107. package/neural-interface/skins/default/skin.json +8 -0
  1108. package/neural-interface/templates/rulesets/README.md +9 -0
  1109. package/neural-interface/templates/rulesets/claude.md +3 -0
  1110. package/neural-interface/templates/rulesets/codex.md +2 -0
  1111. package/neural-interface/templates/rulesets/coexistence.md +6 -0
  1112. package/neural-interface/templates/rulesets/core.md +26 -0
  1113. package/neural-interface/templates/rulesets/cursor.md +2 -0
  1114. package/neural-interface/templates/rulesets/gemini.md +2 -0
  1115. package/neural-interface/templates/rulesets/legacy-hashes.json +227 -0
  1116. package/neural-interface/templates/rulesets/manifest.json +12 -0
  1117. package/neural-interface/templates/rulesets/opencode.md +2 -0
  1118. package/package.json +119 -53
  1119. package/postinstall.js +125 -26
  1120. package/preuninstall.js +187 -0
  1121. package/scripts/audit-claude-hook-usage.mjs +12 -0
  1122. package/scripts/audit-memory-duplicates.mjs +44 -0
  1123. package/scripts/measure-claude-hook-overhead.mjs +77 -0
  1124. package/scripts/recover-user-config.mjs +254 -0
  1125. package/scripts/restore-data-home-from-backup.mjs +239 -0
  1126. package/setup.js +804 -260
  1127. package/skills/leonardo/SKILL.md +19 -10
  1128. package/skills/leonardo/modules/image-prompter.md +18 -12
  1129. package/skills/leonardo/modules/video-prompter.md +19 -13
  1130. package/skills/synabun/SKILL.md +209 -185
  1131. package/skills/synabun/icon.png +0 -0
  1132. package/skills/synabun/modules/audit.md +380 -374
  1133. package/skills/synabun/modules/changelog.md +15 -6
  1134. package/skills/synabun/modules/idea.md +148 -144
  1135. package/skills/synabun/modules/memorize.md +13 -4
  1136. package/skills/synabun/modules/schedule.md +198 -0
  1137. package/skills/synabun/synabunicon.png +0 -0
  1138. package/updater.cmd +31 -0
  1139. package/updater.mjs +382 -0
  1140. package/updater.sh +29 -0
  1141. package/hooks/claude-code/test-user-learning.mjs +0 -531
  1142. package/neural-interface/public/claude-chat.css +0 -878
  1143. package/neural-interface/public/claude-chat.html +0 -92
  1144. package/neural-interface/public/claude-chat.js +0 -1168
  1145. package/neural-interface/public/index-legacy.html +0 -14677
  1146. package/neural-interface/public/index2d-legacy.html +0 -8193
  1147. package/neural-interface/public/shared/html-term-renderer.js +0 -1022
  1148. package/neural-interface/public/variant/3d/background.js +0 -884
  1149. package/neural-interface/public/variant/3d/camera.js +0 -661
  1150. package/neural-interface/public/variant/3d/gfx.js +0 -116
  1151. package/neural-interface/public/variant/3d/graph.js +0 -2399
  1152. package/neural-interface/public/variant/3d/settings-gfx.js +0 -228
  1153. package/neural-interface/templates/CLAUDE-template.md +0 -211
@@ -0,0 +1,731 @@
1
+ // ═══════════════════════════════════════════
2
+ // SynaBun — Assistant model catalog (providers · models · tier · price · vision)
3
+ // ═══════════════════════════════════════════
4
+ //
5
+ // One normalized view of every model the assistant can route to: Claude Code
6
+ // (CLI model list), Codex (app-server model/list) and OpenCode (the shared
7
+ // serve's /provider, connected providers only). Claude and Codex rows are
8
+ // priced from the one list-price table (assistant-pricing.js), the same one
9
+ // the usage ledger prices tokens with; OpenCode rows carry the price the serve
10
+ // reports. A Codex row keeps `price: null` (plan billing: routing treats it as
11
+ // having no price of its own) and shows the list-price equivalent in
12
+ // `listPrice`. Each row carries a
13
+ // tier guess, list price, vision capability, what it generates besides text
14
+ // (`outputs`: image / video) and context window so the brain (the dsh-style
15
+ // planner) and the router can pick cheap-first, send image work to a model that
16
+ // can see, and image / video creation to a model that makes them. Everything
17
+ // I/O is injected; parsers are pure.
18
+
19
+ import { sortEfforts, variantNames } from './effort-levels.js';
20
+ import { listPrice } from './assistant-pricing.js';
21
+
22
+ export const CATALOG_PROVIDERS = ['claude-code', 'codex', 'opencode'];
23
+ export const TIERS = ['small', 'medium', 'large'];
24
+
25
+ const SMALL_HINTS = /(haiku|mini|nano|flash|lite|luna|small|tiny|\bair\b|[:\-_ ](1|2|3|4|7|8|9|12|14|20|24|27|30|32)b\b)/i;
26
+ const LARGE_HINTS = /(opus|fable|astra|ultra|\bpro\b|-pro\b|large|[:\-_ ](1\d\d|[2-9]\d\d)b\b|-sol\b)/i;
27
+ const MEDIUM_HINTS = /(sonnet|terra|medium|balanced)/i;
28
+ const CODEX_HIDDEN = /computer[-_ ]?use/i;
29
+ // Codex's built-in image_generation tool (`codex exec` saves each image under
30
+ // <CODEX_HOME>/generated_images/<thread>/): every GPT agent model can call it.
31
+ const CODEX_IMAGE_TOOL = /^gpt-/i;
32
+ export const MEDIA_KINDS = Object.freeze(['image', 'video']);
33
+
34
+ function num(value) { const n = Number(value); return Number.isFinite(n) ? n : null; }
35
+ function arr(value) { return Array.isArray(value) ? value : []; }
36
+ function stripOneM(id) { return String(id || '').replace(/\[1m\]$/i, ''); }
37
+
38
+ // ── context-window variants ──────────────────────────────────────────────────
39
+ // A model offered at two context windows is two rows, and each hides on its
40
+ // own: Claude Code marks the 1M window with the CLI's "[1m]" suffix
41
+ // ("opus[1m]"), Codex's opt-in extended window is "<id>[extended]" (the Codex
42
+ // brain sends it as contextMode "extended", a dispatched worker as
43
+ // model_context_window).
44
+ const CONTEXT_SUFFIX = /\[(1m|extended)\]$/i;
45
+ export const ONE_M_CONTEXT = 1_000_000;
46
+
47
+ /** '1m' | 'extended' | null. */
48
+ export function contextVariantOf(id) {
49
+ const m = String(id || '').match(CONTEXT_SUFFIX);
50
+ return m ? m[1].toLowerCase() : null;
51
+ }
52
+ /** "[1m]" / "[extended]" / "". */
53
+ export function contextSuffix(id) { const v = contextVariantOf(id); return v ? `[${v}]` : ''; }
54
+ /** The id without its context suffix. */
55
+ export function baseModelId(id) { return String(id || '').replace(CONTEXT_SUFFIX, ''); }
56
+
57
+ /** Claude's legacy "<id>:<window>" selector → "<id>[1m]" / "<id>" (server.js toCliModelName). */
58
+ export function canonicalModelId(provider, id) {
59
+ const raw = String(id || '').trim();
60
+ const m = provider === 'claude-code' ? raw.match(/^([^:]+):(\d+)$/) : null;
61
+ if (!m) return raw;
62
+ return Number(m[2]) > 200000 ? `${m[1]}[1m]` : m[1];
63
+ }
64
+
65
+ /** Does this Claude model run at 1M? Opus 4.6+, Sonnet 4+, Fable; not Haiku or older Opus. */
66
+ export function claudeSupportsOneMillion(model) {
67
+ const m = String(model || '').toLowerCase();
68
+ if (!/(opus|sonnet|fable)/.test(m)) return false;
69
+ return !/(haiku|claude-3|opus-4-[0-5](?:-|$)|opus-4-\d{8}|opus-4$)/.test(m);
70
+ }
71
+
72
+ /** "200k", "1M", "extended 872k": the window a row runs at ('' when unknown). */
73
+ export function contextLabel(row) {
74
+ const ctx = num(row?.contextWindow);
75
+ const size = !ctx ? '' : ctx >= 1_000_000 ? `${Math.round(ctx / 100_000) / 10}M`.replace('.0M', 'M') : `${Math.round(ctx / 1000)}k`;
76
+ return contextVariantOf(row?.id) === 'extended' ? `extended${size ? ` ${size}` : ''}` : size;
77
+ }
78
+
79
+ /** The id an alias row runs as, context included ("opus[1m]" → "claude-opus-5-5[1m]"), lower-case. */
80
+ function resolvedKey(row) {
81
+ if (!row?.upstream) return null;
82
+ return `${baseModelId(row.upstream)}${contextSuffix(row.id)}`.toLowerCase();
83
+ }
84
+
85
+ /**
86
+ * Every Claude row that can run at 1M gets a "[1m]" sibling right after it,
87
+ * unless the CLI already lists one: the CLI accepts "<id>[1m]" for those
88
+ * models even when its list leaves it out. `default` has no 1M form.
89
+ */
90
+ export function withClaudeContextVariants(rows) {
91
+ const list = arr(rows);
92
+ const ids = new Set(list.map((row) => String(row.id).toLowerCase()));
93
+ const out = [];
94
+ for (const row of list) {
95
+ out.push(row);
96
+ if (row.id === 'default' || contextVariantOf(row.id) || !claudeSupportsOneMillion(row.upstream || row.id)) continue;
97
+ const id = `${row.id}[1m]`;
98
+ if (ids.has(id.toLowerCase())) continue;
99
+ ids.add(id.toLowerCase());
100
+ const label = /1m context/i.test(row.label) ? row.label : `${row.label} (1M context)`;
101
+ out.push({ ...row, id, label, contextWindow: ONE_M_CONTEXT, isDefault: false, derived: true });
102
+ }
103
+ return out;
104
+ }
105
+
106
+ /** Tier guess: name hints first, then output-price bands. */
107
+ export function guessTier(row = {}) {
108
+ const name = `${row.id || ''} ${row.label || ''} ${row.upstream || ''}`;
109
+ if (SMALL_HINTS.test(name)) return 'small';
110
+ if (LARGE_HINTS.test(name)) return 'large';
111
+ if (MEDIUM_HINTS.test(name)) return 'medium';
112
+ const out = num(row.price?.output);
113
+ if (out === null || out <= 0) return 'medium';
114
+ if (out <= 1.5) return 'small';
115
+ if (out <= 8) return 'medium';
116
+ return 'large';
117
+ }
118
+
119
+ function priceFrom(cost) {
120
+ if (!cost || typeof cost !== 'object') return null;
121
+ const input = num(cost.input);
122
+ const output = num(cost.output);
123
+ if (input === null && output === null) return null;
124
+ const cacheRead = num(cost.cache?.read ?? cost.cache_read ?? cost.cacheRead);
125
+ const basis = (input || 0) > 0 || (output || 0) > 0 ? 'list' : 'free';
126
+ return { input: input ?? 0, output: output ?? 0, cacheRead, unit: 'usd_per_mtok', basis };
127
+ }
128
+
129
+ function unwrapOpenCode(data) {
130
+ if (!data || typeof data !== 'object') return { all: [], connected: null, defaults: {} };
131
+ const body = data.data && typeof data.data === 'object' && !Array.isArray(data.data) && (data.data.all || data.data.connected) ? data.data : data;
132
+ const all = Array.isArray(body.all) ? body.all : (body.all && typeof body.all === 'object' ? Object.values(body.all) : []);
133
+ // An explicit `connected` list (even an empty one) decides; null = none given, every listed provider counts.
134
+ const connected = Array.isArray(body.connected) ? body.connected.map(String) : null;
135
+ return { all, connected, defaults: body.default && typeof body.default === 'object' ? body.default : {} };
136
+ }
137
+
138
+ /**
139
+ * What an OpenCode model generates: v2 capabilities.output.{image,video}, else
140
+ * v1 models.dev modalities.output, else unknown (null). Only `true` qualifies a
141
+ * model for image / video creation.
142
+ */
143
+ function openCodeOutputs(model = {}) {
144
+ const output = model.capabilities?.output;
145
+ if (output && typeof output === 'object') {
146
+ const flag = (value) => (typeof value === 'boolean' ? value : null);
147
+ return { outputs: { image: flag(output.image), video: flag(output.video) }, outputsSource: 'catalog' };
148
+ }
149
+ if (Array.isArray(model.modalities?.output)) {
150
+ const list = model.modalities.output.map((m) => String(m).toLowerCase());
151
+ return { outputs: { image: list.includes('image'), video: list.includes('video') }, outputsSource: 'catalog' };
152
+ }
153
+ return { outputs: { image: null, video: null }, outputsSource: 'unknown' };
154
+ }
155
+
156
+ /** Does this catalog row generate `medium` ('image' | 'video')? Only a confirmed `true` counts. */
157
+ export function rowMakes(row, medium) {
158
+ return !!row && MEDIA_KINDS.includes(medium) && row.outputs?.[medium] === true;
159
+ }
160
+
161
+ function globToRegExp(pattern) {
162
+ const escaped = String(pattern).replace(/[.+^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*').replace(/\?/g, '.');
163
+ return new RegExp(`^${escaped}$`, 'i');
164
+ }
165
+
166
+ /**
167
+ * OpenCode /provider → rows for connected providers only (223 known providers,
168
+ * a handful connected). Accepts the v2 shape (capabilities.input.image,
169
+ * cost, limit.context, variants) and the v1 models.dev shape (modalities).
170
+ * `filter` = optional list of globs over "providerID/modelID".
171
+ */
172
+ export function parseOpenCodeProviders(data, { filter = null } = {}) {
173
+ const { all, connected, defaults } = unwrapOpenCode(data);
174
+ const connectedSet = connected ? new Set(connected) : null;
175
+ const globs = Array.isArray(filter) && filter.length ? filter.map(globToRegExp) : null;
176
+ const rows = [];
177
+ for (const provider of all) {
178
+ const pid = provider?.id || provider?.providerID;
179
+ if (!pid || (connectedSet && !connectedSet.has(pid))) continue;
180
+ const models = Array.isArray(provider.models)
181
+ ? provider.models
182
+ : Object.entries(provider.models || {}).map(([id, value]) => ({ id, ...(value && typeof value === 'object' ? value : {}) }));
183
+ for (const model of models) {
184
+ const mid = model?.id || model?.modelID;
185
+ if (!mid) continue;
186
+ const id = `${pid}/${mid}`;
187
+ if (globs && !globs.some((re) => re.test(id))) continue;
188
+ const caps = model.capabilities || {};
189
+ let vision = null;
190
+ let visionSource = 'catalog';
191
+ if (caps.input && typeof caps.input === 'object' && typeof caps.input.image === 'boolean') vision = caps.input.image;
192
+ else if (Array.isArray(model.modalities?.input)) vision = model.modalities.input.includes('image');
193
+ else if (typeof model.attachment === 'boolean' || typeof caps.attachment === 'boolean') { vision = !!(model.attachment ?? caps.attachment); visionSource = 'guess'; }
194
+ const price = priceFrom(model.cost);
195
+ const row = {
196
+ provider: 'opencode', id, upstream: pid, label: model.name || mid, family: model.family || null,
197
+ vision, visionSource,
198
+ ...openCodeOutputs(model),
199
+ reasoning: typeof caps.reasoning === 'boolean' ? caps.reasoning : (typeof model.reasoning === 'boolean' ? model.reasoning : null),
200
+ toolcall: typeof caps.toolcall === 'boolean' ? caps.toolcall : (typeof model.tool_call === 'boolean' ? model.tool_call : null),
201
+ contextWindow: num(model.limit?.context),
202
+ price,
203
+ efforts: sortEfforts(variantNames(model.variants)),
204
+ defaultEffort: null,
205
+ isDefault: defaults[pid] === mid,
206
+ status: model.status || null,
207
+ };
208
+ row.tier = guessTier(row);
209
+ rows.push(row);
210
+ }
211
+ }
212
+ return rows;
213
+ }
214
+
215
+ /** The catalog's price object for a list-price table row. */
216
+ function tablePrice(row, basis) {
217
+ return row ? { input: row.input, output: row.output, cacheRead: row.cacheRead ?? null, unit: 'usd_per_mtok', basis } : null;
218
+ }
219
+
220
+ /**
221
+ * Claude CLI model list → rows priced from the list-price table (assistant-pricing.js).
222
+ * `pricing` (tests, older callers) replaces the table: { [id]: [in, out, cacheWrite, cacheRead] } in $/MTok.
223
+ */
224
+ export function normalizeClaudeRows(rows, { pricing = null } = {}) {
225
+ return arr(rows).map((m) => (typeof m === 'string' ? { id: m, label: m } : m)).filter((m) => m?.id).map((m) => {
226
+ const resolved = stripOneM(m.resolvedModel || m.id);
227
+ const p = pricing ? (pricing[resolved] || pricing[stripOneM(m.id)] || null) : null;
228
+ const listed = pricing ? null : tablePrice(listPrice('claude-code', resolved) || listPrice('claude-code', m.id), 'list');
229
+ const row = {
230
+ provider: 'claude-code', id: String(m.id), upstream: resolved, label: m.label || m.id, family: resolved.replace(/-\d.*$/, '') || null,
231
+ vision: true, visionSource: 'provider', reasoning: true, toolcall: true,
232
+ // Claude reads images but generates neither images nor video.
233
+ outputs: { image: false, video: false }, outputsSource: 'provider',
234
+ contextWindow: num(m.contextWindow),
235
+ price: Array.isArray(p) ? { input: p[0], output: p[1], cacheRead: p[3] ?? null, unit: 'usd_per_mtok', basis: 'list' } : listed,
236
+ efforts: sortEfforts(arr(m.effortLevels)), defaultEffort: null,
237
+ isDefault: m.id === 'default' || m.tier === 'default',
238
+ status: m.cliReady === false ? 'unavailable' : 'active',
239
+ };
240
+ row.tier = guessTier({ ...row, label: `${row.label} ${resolved}` });
241
+ return row;
242
+ });
243
+ }
244
+
245
+ /**
246
+ * Codex app-server model/list → rows. Codex bills the ChatGPT plan, so `price`
247
+ * stays null (routing ranks a row by its own price and a plan row has none).
248
+ * With `priceOf` (model id → a list price, the ledger's own lookup) a row also
249
+ * carries `listPrice`: what its tokens cost at OpenAI's list price, the figure
250
+ * the usage ledger books for it. A
251
+ * model whose maxContextWindow beats its contextWindow also gets an
252
+ * "<id>[extended]" row at the larger window (the Codex sidepanel's extended mode).
253
+ */
254
+ export function normalizeCodexRows(rows, { priceOf = null } = {}) {
255
+ return arr(rows).map((m) => (typeof m === 'string' ? { id: m, model: m } : m)).filter((m) => (m?.id || m?.model) && !m.hidden).filter((m) => !CODEX_HIDDEN.test(`${m.id || ''} ${m.model || ''}`)).flatMap((m) => {
256
+ const id = String(m.model || m.id);
257
+ const modalities = arr(m.inputModalities);
258
+ const row = {
259
+ provider: 'codex', id, upstream: id, label: m.displayName || id, family: id.replace(/-\w+$/, ''),
260
+ vision: modalities.length ? modalities.includes('image') : (/^gpt-[5-9]/i.test(id) ? true : null),
261
+ visionSource: modalities.length ? 'catalog' : 'guess',
262
+ // Images through Codex's built-in image_generation tool; Codex makes no video.
263
+ outputs: { image: CODEX_IMAGE_TOOL.test(id) ? true : null, video: false }, outputsSource: 'tool',
264
+ reasoning: true, toolcall: true,
265
+ contextWindow: num(m.contextWindow),
266
+ price: null,
267
+ ...(() => { let listed = null; try { listed = tablePrice(priceOf?.(id) || null, 'plan'); } catch { listed = null; } return listed ? { listPrice: listed } : {}; })(),
268
+ efforts: sortEfforts(arr(m.supportedReasoningEfforts ?? m.supported_reasoning_efforts)),
269
+ defaultEffort: m.defaultReasoningEffort || null,
270
+ isDefault: !!m.isDefault,
271
+ status: m.upgradeInfo?.retirementAt ? 'retiring' : 'active',
272
+ description: m.description || null,
273
+ };
274
+ row.tier = guessTier(row);
275
+ const max = num(m.maxContextWindow ?? m.max_context_window);
276
+ if (!max || !row.contextWindow || max <= row.contextWindow) return [row];
277
+ return [row, { ...row, id: `${id}[extended]`, label: `${row.label} (extended)`, contextWindow: max, isDefault: false }];
278
+ });
279
+ }
280
+
281
+ /** The ids the user hid for `provider` (catalog.hidden, else the older opencodeHidden). */
282
+ function hiddenList(catalog, provider) {
283
+ const map = catalog?.hidden;
284
+ if (map && typeof map === 'object' && Array.isArray(map[provider])) return map[provider];
285
+ return provider === 'opencode' ? arr(catalog?.opencodeHidden) : [];
286
+ }
287
+
288
+ /** How many models the provider listed before hiding (0 = list unavailable). */
289
+ export function listedCount(catalog, provider) {
290
+ const listed = Number(catalog?.listed?.[provider]);
291
+ if (Number.isFinite(listed)) return listed;
292
+ return provider === 'opencode' ? Number(catalog?.opencodeListed) || 0 : 0;
293
+ }
294
+
295
+ /** Is this catalog row one the user hid? (id, id without [1m], or its resolved model). */
296
+ export function rowIsHidden(catalog, row) {
297
+ return !!(row?.id && hiddenModelId(catalog, row.provider, row.id, { row }));
298
+ }
299
+
300
+ /**
301
+ * The hidden id (Assistant → Models, or Settings → OpenCode) that `id` names,
302
+ * else null. Case-insensitive. Claude Code / Codex: the id itself, or the
303
+ * model its catalog row resolves to at the same context window (hiding
304
+ * "claude-opus-5-5" hides "opus", hiding "claude-opus-5-5[1m]" hides
305
+ * "opus[1m]"). Context variants hide independently: hiding "opus" leaves
306
+ * "opus[1m]" alone and the other way round; same for "gpt-x" / "gpt-x[extended]".
307
+ * OpenCode: the full "provider/model" id, or a bare model id.
308
+ */
309
+ export function hiddenModelId(catalog, provider, id, { row = null } = {}) {
310
+ if (!provider || !id) return null;
311
+ const hidden = hiddenList(catalog, provider);
312
+ if (!hidden.length) return null;
313
+ const want = canonicalModelId(provider, String(id).trim()).toLowerCase();
314
+ if (provider === 'opencode') {
315
+ const full = hidden.find((h) => String(h).toLowerCase() === want);
316
+ if (full || want.includes('/')) return full || null;
317
+ return hidden.find((h) => String(h).split('/').slice(1).join('/').toLowerCase() === want) || null;
318
+ }
319
+ const direct = hidden.find((h) => String(h).toLowerCase() === want);
320
+ if (direct) return direct;
321
+ const own = row || [...arr(catalog?.hiddenRows?.[provider]), ...arr(catalog?.models?.[provider])]
322
+ .find((r) => String(r?.id || '').toLowerCase() === want);
323
+ const resolved = resolvedKey(own);
324
+ if (!resolved || resolved === want) return null;
325
+ return hidden.find((h) => String(h).toLowerCase() === resolved) || null;
326
+ }
327
+
328
+ /**
329
+ * Resolve a model id against the catalog. Returns { row, match } or null when
330
+ * the provider list is known and the id is not in it. match: exact | alias |
331
+ * resolved | unlisted (a claude-* id the CLI accepts but does not list) |
332
+ * unverified (the provider list is empty/unavailable — accept, can't check).
333
+ * A model the user hid (Assistant → Models, Settings → OpenCode) is never
334
+ * found (null) — checked before the unlisted and unverified paths, so a hidden
335
+ * claude-* id or a provider that is down cannot slip through — and neither is
336
+ * anything when the user hid every model of a provider that listed some.
337
+ */
338
+ export function findModel(catalog, provider, id) {
339
+ if (!id) return null;
340
+ if (hiddenModelId(catalog, provider, id)) return null;
341
+ const rows = arr(catalog?.models?.[provider]);
342
+ if (!rows.length) {
343
+ // An authoritative empty list (OpenCode with nothing connected) is not an unavailable one.
344
+ if (listedCount(catalog, provider) > 0 || catalog?.known?.[provider] === true) return null;
345
+ return { row: null, match: 'unverified' };
346
+ }
347
+ // Context-aware: "opus[1m]" never falls back to the 200k "opus" row, nor
348
+ // "gpt-x[extended]" to "gpt-x" (each is its own row).
349
+ const want = canonicalModelId(provider, String(id).trim());
350
+ const exact = rows.find((row) => row.id === want);
351
+ if (exact) return { row: exact, match: 'exact' };
352
+ const bare = want.toLowerCase();
353
+ const alias = rows.find((row) => row.id.toLowerCase() === bare);
354
+ if (alias) return { row: alias, match: 'alias' };
355
+ if (provider === 'claude-code') {
356
+ const resolved = rows.find((row) => resolvedKey(row) === bare);
357
+ if (resolved) return { row: resolved, match: 'resolved' };
358
+ if (/^claude-/i.test(want)) return { row: null, match: 'unlisted' };
359
+ }
360
+ if (provider === 'opencode' && !want.includes('/')) {
361
+ const byModel = rows.filter((row) => row.id.split('/').slice(1).join('/').toLowerCase() === bare);
362
+ if (byModel.length === 1) return { row: byModel[0], match: 'alias' };
363
+ }
364
+ return null;
365
+ }
366
+
367
+ /**
368
+ * The provider's default row (null model → what the provider would use).
369
+ * OpenCode's `default` map is per upstream provider; the model a null request
370
+ * really gets comes from OpenCode's own config, so it is unknown here.
371
+ */
372
+ export function defaultModelRow(catalog, provider) {
373
+ if (provider === 'opencode') return null;
374
+ const rows = arr(catalog?.models?.[provider]).filter((row) => !rowIsHidden(catalog, row));
375
+ const own = rows.find((row) => row.isDefault);
376
+ if (own) return own;
377
+ // The provider's own default is hidden: the first visible model stands in
378
+ // (the dispatcher pins it, so a null model never falls back to a hidden one).
379
+ if (defaultIsHidden(catalog, provider)) return rows.find((row) => row.status !== 'unavailable') || rows[0] || null;
380
+ return provider === 'claude-code' ? rows[0] || null : null;
381
+ }
382
+
383
+ /** The user hid the row a null model would run on (Claude Code / Codex only). */
384
+ export function defaultIsHidden(catalog, provider) {
385
+ if (provider === 'opencode') return false;
386
+ if (arr(catalog?.hiddenRows?.[provider]).some((row) => row.isDefault)) return true;
387
+ return arr(catalog?.models?.[provider]).some((row) => row.isDefault && rowIsHidden(catalog, row));
388
+ }
389
+
390
+ /** The provider listed models but the user hid every one of them. */
391
+ export function openCodeConnectedKnown(data) {
392
+ return Array.isArray(unwrapOpenCode(data).connected);
393
+ }
394
+
395
+ /** The provider answered authoritatively and has no model at all (OpenCode with nothing connected). */
396
+ export function providerEmpty(catalog, provider) {
397
+ return catalog?.known?.[provider] === true && !arr(catalog?.models?.[provider]).length && !arr(catalog?.hiddenRows?.[provider]).length;
398
+ }
399
+
400
+ export function providerAllHidden(catalog, provider) {
401
+ if (listedCount(catalog, provider) <= 0) return false;
402
+ return !arr(catalog?.models?.[provider]).some((row) => !rowIsHidden(catalog, row));
403
+ }
404
+
405
+ /**
406
+ * The enabled row to run instead of a hidden model `id` (or of a null model
407
+ * whose default is hidden): the same model at another context window ("gpt-x"
408
+ * → "gpt-x[extended]", "opus" → "default"), else the provider's enabled
409
+ * default, else its first enabled row. null when the user hid every model of
410
+ * the provider, and for OpenCode (a null OpenCode model runs OpenCode's own
411
+ * configured default, which the catalog cannot name).
412
+ */
413
+ export function enabledStandIn(catalog, provider, id = null) {
414
+ if (!provider || provider === 'opencode') return null;
415
+ const rows = arr(catalog?.models?.[provider]).filter((row) => !rowIsHidden(catalog, row) && row.status !== 'unavailable');
416
+ if (!rows.length) return null;
417
+ if (id) {
418
+ const want = canonicalModelId(provider, String(id).trim()).toLowerCase();
419
+ const own = [...arr(catalog?.hiddenRows?.[provider]), ...arr(catalog?.models?.[provider])]
420
+ .find((row) => String(row?.id || '').toLowerCase() === want);
421
+ const family = baseModelId(own?.upstream || want).toLowerCase();
422
+ const sibling = rows.find((row) => baseModelId(row.upstream || row.id).toLowerCase() === family);
423
+ if (sibling) return sibling;
424
+ }
425
+ const own = defaultModelRow(catalog, provider);
426
+ return own && rows.includes(own) ? own : rows[0];
427
+ }
428
+
429
+ /** "$4/$20", "free", or for a plan-billed row "plan" (with `listPrice`: "plan (list $2/$10)", the list-price equivalent). */
430
+ export function priceText(price, listPrice = null) {
431
+ const fmt = (n) => `$${Number(n).toFixed(n >= 10 ? 0 : 2).replace(/\.00$/, '')}`;
432
+ if (!price) return listPrice ? `plan (list ${fmt(listPrice.input)}/${fmt(listPrice.output)})` : 'plan';
433
+ if (price.basis === 'free') return 'free';
434
+ return `${fmt(price.input)}/${fmt(price.output)}`;
435
+ }
436
+
437
+ function ctxText(ctx) {
438
+ if (!ctx) return '';
439
+ if (ctx >= 1_000_000) return `${Math.round(ctx / 100_000) / 10}M ctx`.replace('.0M', 'M');
440
+ return `${Math.round(ctx / 1000)}k ctx`;
441
+ }
442
+
443
+ /** One routing-sheet line: `id · tier · $in/$out · vision · image-out · video-out · ctx · efforts`. */
444
+ export function formatModelLine(row) {
445
+ const parts = [row.id, row.tier || '?', priceText(row.price, row.listPrice)];
446
+ if (row.vision) parts.push('vision');
447
+ if (rowMakes(row, 'image')) parts.push('image-out');
448
+ if (rowMakes(row, 'video')) parts.push('video-out');
449
+ const ctx = ctxText(row.contextWindow);
450
+ if (ctx) parts.push(ctx);
451
+ if (row.efforts?.length) parts.push(`effort ${row.efforts.join('|')}`);
452
+ return parts.join(' · ');
453
+ }
454
+
455
+ /** Every effort any of `rows` supports, in canonical order. */
456
+ export function providerEfforts(rows) { return sortEfforts(arr(rows).flatMap((row) => arr(row?.efforts))); }
457
+
458
+ function outputPrice(row) { const out = num(row?.price?.output); return out === null ? Number.POSITIVE_INFINITY : out; }
459
+
460
+ /**
461
+ * Pick a compact, representative slice per provider for the brain's routing
462
+ * sheet: the brain's own model, remembered preferences, the cheapest model that
463
+ * makes images and the cheapest that makes video, provider defaults, the
464
+ * cheapest capable model per tier and the cheapest vision model. Claude and
465
+ * Codex lists are short; OpenCode can list hundreds, so it is sampled.
466
+ */
467
+ export function selectSheetModels(catalog, { brain = {}, preferences = {}, max = 8 } = {}) {
468
+ const out = {};
469
+ const pinned = new Map(); // provider → Set(ids)
470
+ const pin = (provider, id) => { if (!provider || !id) return; if (!pinned.has(provider)) pinned.set(provider, new Set()); pinned.get(provider).add(String(id)); };
471
+ if (brain?.provider && brain?.model) pin(brain.provider, brain.model);
472
+ for (const pref of Object.values(preferences || {})) if (pref?.provider && pref?.model) pin(pref.provider, pref.model);
473
+ for (const provider of CATALOG_PROVIDERS) {
474
+ const rows = arr(catalog?.models?.[provider]).filter((row) => row.status !== 'unavailable');
475
+ if (!rows.length) { out[provider] = []; continue; }
476
+ const picked = [];
477
+ const seen = new Set();
478
+ const keyOf = (row) => (provider === 'claude-code' ? `${row.upstream}${contextSuffix(row.id)}` : row.id);
479
+ const add = (row) => {
480
+ if (!row || picked.length >= max) return;
481
+ const key = keyOf(row);
482
+ if (seen.has(key)) return;
483
+ seen.add(key);
484
+ picked.push(row);
485
+ };
486
+ // Image / video creation only runs on a model that makes them: the cheapest
487
+ // maker of each medium keeps a slot, even when pinned routes fill the rest.
488
+ const makers = [];
489
+ for (const medium of MEDIA_KINDS) {
490
+ const row = [...rows].filter((r) => rowMakes(r, medium)).sort((a, b) => outputPrice(a) - outputPrice(b))[0];
491
+ if (row && !makers.includes(row)) makers.push(row);
492
+ }
493
+ const reserved = () => makers.filter((row) => !seen.has(keyOf(row))).length;
494
+ for (const id of pinned.get(provider) || []) {
495
+ const row = findModel(catalog, provider, id)?.row || null;
496
+ if (row && (makers.includes(row) || picked.length < max - reserved())) add(row);
497
+ }
498
+ for (const row of makers) add(row);
499
+ if (provider === 'claude-code') {
500
+ // Newest first per family; alias ids (opus, sonnet, haiku) read better.
501
+ const families = new Map();
502
+ for (const row of rows) {
503
+ const family = /fable/i.test(row.upstream) ? 'fable' : /opus/i.test(row.upstream) ? 'opus' : /sonnet/i.test(row.upstream) ? 'sonnet' : /haiku/i.test(row.upstream) ? 'haiku' : row.upstream;
504
+ const current = families.get(family);
505
+ if (!current) families.set(family, row);
506
+ else if (current.id === 'default' && row.upstream === current.upstream) families.set(family, row);
507
+ }
508
+ for (const row of families.values()) add(row);
509
+ } else if (provider === 'codex') {
510
+ for (const row of rows) add(row);
511
+ } else {
512
+ const upstream = brain?.provider === 'opencode' && brain?.model ? String(brain.model).split('/')[0] : null;
513
+ const capable = rows.filter((row) => row.toolcall !== false && row.status !== 'deprecated');
514
+ const byPrice = [...capable].sort((a, b) => outputPrice(a) - outputPrice(b));
515
+ const local = upstream ? byPrice.filter((row) => row.upstream === upstream) : [];
516
+ for (const tier of TIERS) add(local.find((row) => row.tier === tier) || null);
517
+ add(byPrice.find((row) => row.vision) || null);
518
+ for (const tier of TIERS) add(byPrice.find((row) => row.tier === tier) || null);
519
+ for (const row of capable.filter((r) => r.isDefault)) add(row);
520
+ }
521
+ out[provider] = picked;
522
+ }
523
+ return out;
524
+ }
525
+
526
+ /** Compact brain-facing rows: { id, tier, vision, outputs (makers only), price:[in,out]|null, efforts, defaultEffort, ctx }. */
527
+ export function compactRow(row) {
528
+ return {
529
+ id: row.id, label: row.label, tier: row.tier || null, vision: row.vision ?? null,
530
+ // Only a model that makes images or video carries it (true = qualifies for image / video creation).
531
+ outputs: rowMakes(row, 'image') || rowMakes(row, 'video') ? { image: row.outputs.image ?? null, video: row.outputs.video ?? null } : undefined,
532
+ price: row.price ? [row.price.input, row.price.output] : null,
533
+ // A plan-billed row: what its tokens cost at list price (the ledger's figure), not a charge.
534
+ ...(row.listPrice ? { listPrice: [row.listPrice.input, row.listPrice.output] } : {}),
535
+ efforts: row.efforts?.length ? row.efforts : undefined,
536
+ defaultEffort: row.defaultEffort || undefined,
537
+ ctx: row.contextWindow || undefined,
538
+ ctxLabel: contextLabel(row) || undefined,
539
+ default: row.isDefault || undefined,
540
+ };
541
+ }
542
+
543
+ /**
544
+ * @param {object} deps
545
+ * @param {(path:string)=>Promise<object|null>} deps.fetchJson self-fetch of the Neural Interface REST API
546
+ * @param {object} [deps.claudePricing] replaces the list-price table for Claude rows (tests)
547
+ * @param {(model:string)=>object|null} [deps.codexPrice] list price of a Codex model (the ledger's lookup); default: the table
548
+ * @param {()=>object} [deps.listAccounts] → { codex:[...], 'claude-code':[...] }
549
+ * @param {()=>object} [deps.readFilter] → { opencode:[globs] } (routing.catalogFilter)
550
+ * @param {()=>object} [deps.readHidden] → { 'claude-code': [], codex: [], opencode: [] } ids the user
551
+ * hid (Assistant → Models; OpenCode's list is Settings → OpenCode's). A bare array = OpenCode ids.
552
+ */
553
+ export function createAssistantCatalog({
554
+ fetchJson,
555
+ claudePricing = null,
556
+ codexPrice = (model) => listPrice('codex', model),
557
+ listAccounts = () => ({}),
558
+ readFilter = () => ({}),
559
+ readHidden = () => [],
560
+ ttlMs = 30_000,
561
+ now = Date.now,
562
+ log = () => {},
563
+ } = {}) {
564
+ if (typeof fetchJson !== 'function') throw new Error('createAssistantCatalog requires fetchJson');
565
+ let cache = null;
566
+ let inflight = null;
567
+
568
+ async function build() {
569
+ const [claudeModels, codexModels, opencodeProviders, projects, mcpProfile] = await Promise.all([
570
+ fetchJson('/api/claude/models'), fetchJson('/api/codex/models'), fetchJson('/api/opencode/providers/full'),
571
+ fetchJson('/api/projects'), fetchJson('/api/mcp/profile'),
572
+ ]);
573
+ const pickArray = (value, keys = []) => {
574
+ if (Array.isArray(value)) return value;
575
+ for (const key of keys) if (Array.isArray(value?.[key])) return value[key];
576
+ return [];
577
+ };
578
+ const filter = (() => { try { return readFilter() || {}; } catch { return {}; } })();
579
+ const presets = mcpProfile?.presets && typeof mcpProfile.presets === 'object'
580
+ ? Object.entries(mcpProfile.presets).map(([name, preset]) => ({ name, label: preset?.label || name, groups: preset?.groups || [], tools: preset?.tools || null }))
581
+ : [];
582
+ let accounts = {};
583
+ try { accounts = listAccounts() || {}; } catch (error) { log('catalog:accounts-error', error?.message || String(error)); }
584
+ // Models the user hid (Assistant → Models, Settings → OpenCode) never reach
585
+ // the sheet, agent_catalog, route options or validation; `listed` tells
586
+ // findModel a provider's list was available even when every row is hidden.
587
+ const hidden = (() => {
588
+ let raw = {};
589
+ try { raw = readHidden() || {}; } catch {}
590
+ if (Array.isArray(raw)) raw = { opencode: raw };
591
+ return Object.fromEntries(CATALOG_PROVIDERS.map((p) => [p, arr(raw[p]).map(String)]));
592
+ })();
593
+ const all = {
594
+ 'claude-code': withClaudeContextVariants(normalizeClaudeRows(pickArray(claudeModels, ['models']), { pricing: claudePricing })),
595
+ codex: normalizeCodexRows(pickArray(codexModels, ['models']), { priceOf: codexPrice }),
596
+ opencode: parseOpenCodeProviders(opencodeProviders, { filter: filter.opencode || null }),
597
+ };
598
+ const lookup = { hidden };
599
+ const models = {};
600
+ const hiddenRows = {};
601
+ const listedCounts = {};
602
+ for (const p of CATALOG_PROVIDERS) {
603
+ models[p] = [];
604
+ hiddenRows[p] = [];
605
+ listedCounts[p] = all[p].length;
606
+ for (const row of all[p]) (hidden[p].length && hiddenModelId(lookup, p, row.id, { row }) ? hiddenRows[p] : models[p]).push(row);
607
+ }
608
+ const opencode = models.opencode;
609
+ return {
610
+ generatedAt: new Date(now()).toISOString(),
611
+ models,
612
+ hidden,
613
+ hiddenRows,
614
+ listed: listedCounts,
615
+ // The provider answered with an authoritative list, even an empty one (OpenCode's `connected`).
616
+ known: { opencode: openCodeConnectedKnown(opencodeProviders) },
617
+ opencodeTotal: opencode.length,
618
+ opencodeListed: listedCounts.opencode,
619
+ opencodeHidden: hidden.opencode,
620
+ projects: pickArray(projects, ['projects']),
621
+ profiles: presets,
622
+ mcpProfiles: { presets, default: mcpProfile?.defaultProfile || mcpProfile?.profile || 'full' },
623
+ accounts,
624
+ // Efforts are per model (row.efforts); a provider's list is the union of its rows'.
625
+ providers: [
626
+ { id: 'claude-code', brain: true, efforts: providerEfforts(models['claude-code']), permissionPolicies: ['auto', 'ask'] },
627
+ { id: 'codex', brain: true, efforts: providerEfforts(models.codex), permissionPolicies: ['auto', 'restricted'] },
628
+ { id: 'opencode', brain: true, efforts: providerEfforts(models.opencode), permissionPolicies: ['auto', 'ask'] },
629
+ ],
630
+ };
631
+ }
632
+
633
+ async function full({ force = false } = {}) {
634
+ if (!force && cache && now() - cache.at < ttlMs) return cache.value;
635
+ if (inflight) return inflight;
636
+ inflight = build().then((value) => { cache = { at: now(), value }; return value; }).finally(() => { inflight = null; });
637
+ return inflight;
638
+ }
639
+
640
+ /** Every row, hidden ones included, per provider (the Models manager, id resolution). */
641
+ async function manageRows({ force = false } = {}) {
642
+ const value = await full({ force });
643
+ return Object.fromEntries(CATALOG_PROVIDERS.map((p) => [p, [...arr(value.models?.[p]), ...arr(value.hiddenRows?.[p])]]));
644
+ }
645
+
646
+ /**
647
+ * view 'full' (default): every visible row. view 'brain': compact rows,
648
+ * OpenCode capped; `provider` + `q` narrow the list (agent_catalog search).
649
+ * view 'manage': every row with hidden: true|false and hiddenBy (the list
650
+ * entry that hides it), plus `archived`: every hidden id per provider with
651
+ * the rows it covers; listed:false = no current row (still restorable).
652
+ */
653
+ async function get({ force = false, view = 'full', provider = null, q = null, brain = null, preferences = {} } = {}) {
654
+ const value = await full({ force });
655
+ if (view === 'manage') {
656
+ const models = {};
657
+ const archived = {};
658
+ for (const p of CATALOG_PROVIDERS) {
659
+ if (provider && p !== provider) continue;
660
+ const hiddenIds = new Set(arr(value.hiddenRows?.[p]).map((row) => row.id));
661
+ const rows = [...arr(value.models?.[p]), ...arr(value.hiddenRows?.[p])];
662
+ const covers = new Map(); // hidden id (lower-case) → rows it hides
663
+ models[p] = rows.map((row) => {
664
+ const hidden = hiddenIds.has(row.id);
665
+ const hiddenBy = hidden ? hiddenModelId(value, p, row.id, { row }) || row.id : null;
666
+ if (hiddenBy) {
667
+ const key = String(hiddenBy).toLowerCase();
668
+ if (!covers.has(key)) covers.set(key, []);
669
+ covers.get(key).push({ id: row.id, label: row.label || row.id, context: contextLabel(row) || null });
670
+ }
671
+ return { ...compactRow(row), provider: p, upstream: row.upstream || null, status: row.status || null, context: contextLabel(row) || null, hidden, hiddenBy };
672
+ });
673
+ archived[p] = arr(value.hidden?.[p]).map((id) => {
674
+ const covered = covers.get(String(id).toLowerCase()) || [];
675
+ return { id, listed: covered.length > 0, group: p === 'opencode' ? String(id).split('/')[0] : null, rows: covered };
676
+ });
677
+ }
678
+ return { view: 'manage', generatedAt: value.generatedAt, models, archived, hidden: value.hidden, listed: value.listed };
679
+ }
680
+ if (view !== 'brain' && !provider && !q) return value;
681
+ const needle = q ? String(q).toLowerCase() : null;
682
+ const matches = (row) => !needle || `${row.id} ${row.label} ${row.family || ''}`.toLowerCase().includes(needle);
683
+ const models = {};
684
+ if (provider || needle) {
685
+ for (const p of CATALOG_PROVIDERS) {
686
+ if (provider && p !== provider) continue;
687
+ models[p] = value.models[p].filter(matches).slice(0, 60).map(compactRow);
688
+ }
689
+ } else {
690
+ const sheet = selectSheetModels(value, { brain, preferences, max: 40 });
691
+ for (const p of CATALOG_PROVIDERS) models[p] = (p === 'opencode' ? sheet[p] : value.models[p]).map(compactRow);
692
+ }
693
+ const { opencodeHidden, hidden, hiddenRows, ...rest } = value;
694
+ const hiddenCount = Object.fromEntries(CATALOG_PROVIDERS.map((p) => [p, arr(hiddenRows?.[p]).length]));
695
+ return { ...rest, view: 'brain', models, opencodeTotal: value.opencodeTotal, hiddenCount, opencodeHiddenCount: arr(opencodeHidden).length };
696
+ }
697
+
698
+ function peek() { return cache?.value || null; }
699
+ function find(provider, id) { return findModel(peek(), provider, id); }
700
+ /**
701
+ * The hidden id `id` names for `provider`, else null. Works before the first
702
+ * build (the lists are read directly; alias → resolved matching needs rows).
703
+ */
704
+ function hiddenId(provider, id) {
705
+ const value = peek();
706
+ if (value?.hidden) return hiddenModelId(value, provider, id);
707
+ let raw = {};
708
+ try { raw = readHidden() || {}; } catch {}
709
+ if (Array.isArray(raw)) raw = { opencode: raw };
710
+ return hiddenModelId({ hidden: raw }, provider, id);
711
+ }
712
+
713
+ /** Capabilities of a brain/target model: { vision, tier, price, label, contextWindow, source }. */
714
+ function brainInfo(brain = {}) {
715
+ const catalog = peek();
716
+ const provider = brain?.provider;
717
+ if (!catalog || !provider) return { vision: null, tier: null, price: null, label: brain?.model || null, contextWindow: null, source: 'unknown' };
718
+ const hit = brain.model ? findModel(catalog, provider, brain.model) : null;
719
+ const row = hit?.row || (!brain.model ? defaultModelRow(catalog, provider) : null);
720
+ if (!row) {
721
+ const claudeUnlisted = provider === 'claude-code' && hit?.match === 'unlisted';
722
+ const source = hit?.match || (hiddenModelId(catalog, provider, brain.model) ? 'disabled' : 'unknown');
723
+ return { vision: claudeUnlisted ? true : null, tier: null, price: null, label: brain.model || null, contextWindow: null, source };
724
+ }
725
+ return { vision: row.vision ?? null, tier: row.tier || null, price: row.price || null, label: row.label || row.id, contextWindow: row.contextWindow || null, source: hit?.match || 'default', id: row.id };
726
+ }
727
+
728
+ function invalidate() { cache = null; }
729
+
730
+ return { get, full, peek, find, hiddenId, manageRows, brainInfo, invalidate };
731
+ }