synabun 1.3.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1163) hide show
  1. package/CHANGELOG.md +205 -662
  2. package/LICENSE-COMMERCIAL.md +33 -0
  3. package/NOTICE +17 -0
  4. package/README.md +175 -853
  5. package/THIRD-PARTY-LICENSES.md +136 -0
  6. package/benchmarks/browser-live-results.json +79 -0
  7. package/benchmarks/browser-v2-results.json +258 -0
  8. package/benchmarks/fixtures/browser/README.md +57 -0
  9. package/benchmarks/fixtures/browser/page-state.json +132 -0
  10. package/benchmarks/fixtures/browser/social.json +92 -0
  11. package/benchmarks/fixtures/browser/target.json +319 -0
  12. package/benchmarks/fixtures/desktop/README.md +58 -0
  13. package/benchmarks/fixtures/desktop/abstention.json +59 -0
  14. package/benchmarks/fixtures/desktop/adversarial.json +22 -0
  15. package/benchmarks/fixtures/desktop/forbidden.json +93 -0
  16. package/benchmarks/fixtures/desktop/generate.mjs +1023 -0
  17. package/benchmarks/fixtures/desktop/target.json +136 -0
  18. package/bin/synabun.js +30 -0
  19. package/docs/whatsapp.md +325 -0
  20. package/hooks/claude-code/post-plan.mjs +613 -391
  21. package/hooks/claude-code/post-remember.mjs +246 -122
  22. package/hooks/claude-code/pre-compact.mjs +171 -110
  23. package/hooks/claude-code/pre-task.mjs +133 -0
  24. package/hooks/claude-code/pre-websearch.mjs +15 -4
  25. package/hooks/claude-code/prompt-origin.mjs +94 -0
  26. package/hooks/claude-code/prompt-submit.mjs +1244 -861
  27. package/hooks/claude-code/session-start.mjs +114 -156
  28. package/hooks/claude-code/shared.mjs +1228 -368
  29. package/hooks/claude-code/state.mjs +167 -0
  30. package/hooks/claude-code/stop.mjs +515 -140
  31. package/hooks/claude-code/subagent-start.mjs +154 -0
  32. package/hooks/claude-code/subagent-stop.mjs +102 -0
  33. package/hooks/claude-code/task-gate.mjs +150 -0
  34. package/launcher.mjs +40 -0
  35. package/lib/claude-hooks.js +137 -0
  36. package/lib/claude-usage-audit.js +141 -0
  37. package/lib/client-config-repair.js +145 -0
  38. package/lib/data-home-migration.js +502 -0
  39. package/lib/desktop-pwa.js +206 -0
  40. package/lib/external-tools.js +221 -0
  41. package/lib/first-launch-protection.js +245 -0
  42. package/lib/packaged-runtime.js +110 -0
  43. package/lib/paths.d.ts +21 -0
  44. package/lib/paths.js +103 -0
  45. package/lib/start-launcher.js +1309 -0
  46. package/mcp-server/dist/config.d.ts +22 -0
  47. package/mcp-server/dist/config.d.ts.map +1 -0
  48. package/mcp-server/dist/config.js +109 -0
  49. package/mcp-server/dist/config.js.map +1 -0
  50. package/mcp-server/dist/http.d.ts +30 -0
  51. package/mcp-server/dist/http.d.ts.map +1 -0
  52. package/mcp-server/dist/http.js +276 -0
  53. package/mcp-server/dist/http.js.map +1 -0
  54. package/mcp-server/dist/index.d.ts +48 -0
  55. package/mcp-server/dist/index.d.ts.map +1 -0
  56. package/mcp-server/dist/index.js +538 -0
  57. package/mcp-server/dist/index.js.map +1 -0
  58. package/mcp-server/dist/preload-http.d.ts +3 -0
  59. package/mcp-server/dist/preload-http.d.ts.map +1 -0
  60. package/mcp-server/dist/preload-http.js +28 -0
  61. package/mcp-server/dist/preload-http.js.map +1 -0
  62. package/mcp-server/dist/preload.d.ts +3 -0
  63. package/mcp-server/dist/preload.d.ts.map +1 -0
  64. package/mcp-server/dist/preload.js +32 -0
  65. package/mcp-server/dist/preload.js.map +1 -0
  66. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts +19 -0
  67. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts.map +1 -0
  68. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js +403 -0
  69. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js.map +1 -0
  70. package/mcp-server/dist/scripts/setup-embeddings.d.ts +3 -0
  71. package/mcp-server/dist/scripts/setup-embeddings.d.ts.map +1 -0
  72. package/mcp-server/dist/scripts/setup-embeddings.js +15 -0
  73. package/mcp-server/dist/scripts/setup-embeddings.js.map +1 -0
  74. package/mcp-server/dist/services/assistant-judgments.d.ts +79 -0
  75. package/mcp-server/dist/services/assistant-judgments.d.ts.map +1 -0
  76. package/mcp-server/dist/services/assistant-judgments.js +128 -0
  77. package/mcp-server/dist/services/assistant-judgments.js.map +1 -0
  78. package/mcp-server/dist/services/browser-assist-gate.d.ts +314 -0
  79. package/mcp-server/dist/services/browser-assist-gate.d.ts.map +1 -0
  80. package/mcp-server/dist/services/browser-assist-gate.js +344 -0
  81. package/mcp-server/dist/services/browser-assist-gate.js.map +1 -0
  82. package/mcp-server/dist/services/browser-assist.d.ts +104 -0
  83. package/mcp-server/dist/services/browser-assist.d.ts.map +1 -0
  84. package/mcp-server/dist/services/browser-assist.js +282 -0
  85. package/mcp-server/dist/services/browser-assist.js.map +1 -0
  86. package/mcp-server/dist/services/browser-bench.d.ts +772 -0
  87. package/mcp-server/dist/services/browser-bench.d.ts.map +1 -0
  88. package/mcp-server/dist/services/browser-bench.js +424 -0
  89. package/mcp-server/dist/services/browser-bench.js.map +1 -0
  90. package/mcp-server/dist/services/browser-judgments.d.ts +196 -0
  91. package/mcp-server/dist/services/browser-judgments.d.ts.map +1 -0
  92. package/mcp-server/dist/services/browser-judgments.js +363 -0
  93. package/mcp-server/dist/services/browser-judgments.js.map +1 -0
  94. package/mcp-server/dist/services/browser-risk.d.ts +166 -0
  95. package/mcp-server/dist/services/browser-risk.d.ts.map +1 -0
  96. package/mcp-server/dist/services/browser-risk.js +458 -0
  97. package/mcp-server/dist/services/browser-risk.js.map +1 -0
  98. package/mcp-server/dist/services/categories.d.ts +61 -0
  99. package/mcp-server/dist/services/categories.d.ts.map +1 -0
  100. package/mcp-server/dist/services/categories.js +377 -0
  101. package/mcp-server/dist/services/categories.js.map +1 -0
  102. package/mcp-server/dist/services/codex-config-heal.d.ts +49 -0
  103. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -0
  104. package/mcp-server/dist/services/codex-config-heal.js +346 -0
  105. package/mcp-server/dist/services/codex-config-heal.js.map +1 -0
  106. package/mcp-server/dist/services/desktop-assist-gate.d.ts +198 -0
  107. package/mcp-server/dist/services/desktop-assist-gate.d.ts.map +1 -0
  108. package/mcp-server/dist/services/desktop-assist-gate.js +202 -0
  109. package/mcp-server/dist/services/desktop-assist-gate.js.map +1 -0
  110. package/mcp-server/dist/services/desktop-assist.d.ts +104 -0
  111. package/mcp-server/dist/services/desktop-assist.d.ts.map +1 -0
  112. package/mcp-server/dist/services/desktop-assist.js +266 -0
  113. package/mcp-server/dist/services/desktop-assist.js.map +1 -0
  114. package/mcp-server/dist/services/desktop-bench.d.ts +553 -0
  115. package/mcp-server/dist/services/desktop-bench.d.ts.map +1 -0
  116. package/mcp-server/dist/services/desktop-bench.js +311 -0
  117. package/mcp-server/dist/services/desktop-bench.js.map +1 -0
  118. package/mcp-server/dist/services/desktop-client.d.ts +23 -0
  119. package/mcp-server/dist/services/desktop-client.d.ts.map +1 -0
  120. package/mcp-server/dist/services/desktop-client.js +79 -0
  121. package/mcp-server/dist/services/desktop-client.js.map +1 -0
  122. package/mcp-server/dist/services/desktop-judgments.d.ts +125 -0
  123. package/mcp-server/dist/services/desktop-judgments.d.ts.map +1 -0
  124. package/mcp-server/dist/services/desktop-judgments.js +177 -0
  125. package/mcp-server/dist/services/desktop-judgments.js.map +1 -0
  126. package/mcp-server/dist/services/desktop-risk.d.ts +283 -0
  127. package/mcp-server/dist/services/desktop-risk.d.ts.map +1 -0
  128. package/mcp-server/dist/services/desktop-risk.js +605 -0
  129. package/mcp-server/dist/services/desktop-risk.js.map +1 -0
  130. package/mcp-server/dist/services/discord.d.ts +112 -0
  131. package/mcp-server/dist/services/discord.d.ts.map +1 -0
  132. package/mcp-server/dist/services/discord.js +477 -0
  133. package/mcp-server/dist/services/discord.js.map +1 -0
  134. package/mcp-server/dist/services/edit-stale.d.ts +81 -0
  135. package/mcp-server/dist/services/edit-stale.d.ts.map +1 -0
  136. package/mcp-server/dist/services/edit-stale.js +358 -0
  137. package/mcp-server/dist/services/edit-stale.js.map +1 -0
  138. package/mcp-server/dist/services/embedding-service.d.ts +16 -0
  139. package/mcp-server/dist/services/embedding-service.d.ts.map +1 -0
  140. package/mcp-server/dist/services/embedding-service.js +126 -0
  141. package/mcp-server/dist/services/embedding-service.js.map +1 -0
  142. package/mcp-server/dist/services/embedding-worker.d.ts +2 -0
  143. package/mcp-server/dist/services/embedding-worker.d.ts.map +1 -0
  144. package/mcp-server/dist/services/embedding-worker.js +52 -0
  145. package/mcp-server/dist/services/embedding-worker.js.map +1 -0
  146. package/mcp-server/dist/services/fb-regions.d.ts +71 -0
  147. package/mcp-server/dist/services/fb-regions.d.ts.map +1 -0
  148. package/mcp-server/dist/services/fb-regions.js +211 -0
  149. package/mcp-server/dist/services/fb-regions.js.map +1 -0
  150. package/mcp-server/dist/services/file-checksums.d.ts +22 -0
  151. package/mcp-server/dist/services/file-checksums.d.ts.map +1 -0
  152. package/mcp-server/dist/services/file-checksums.js +55 -0
  153. package/mcp-server/dist/services/file-checksums.js.map +1 -0
  154. package/mcp-server/dist/services/file-excerpt.d.ts +24 -0
  155. package/mcp-server/dist/services/file-excerpt.d.ts.map +1 -0
  156. package/mcp-server/dist/services/file-excerpt.js +65 -0
  157. package/mcp-server/dist/services/file-excerpt.js.map +1 -0
  158. package/mcp-server/dist/services/identity.d.ts +124 -0
  159. package/mcp-server/dist/services/identity.d.ts.map +1 -0
  160. package/mcp-server/dist/services/identity.js +241 -0
  161. package/mcp-server/dist/services/identity.js.map +1 -0
  162. package/mcp-server/dist/services/local-embeddings.d.ts +2 -0
  163. package/mcp-server/dist/services/local-embeddings.d.ts.map +1 -0
  164. package/mcp-server/dist/services/local-embeddings.js +3 -0
  165. package/mcp-server/dist/services/local-embeddings.js.map +1 -0
  166. package/mcp-server/dist/services/memory-client.d.ts +4 -0
  167. package/mcp-server/dist/services/memory-client.d.ts.map +1 -0
  168. package/mcp-server/dist/services/memory-client.js +27 -0
  169. package/mcp-server/dist/services/memory-client.js.map +1 -0
  170. package/mcp-server/dist/services/memory-judge-backfill.d.ts +135 -0
  171. package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -0
  172. package/mcp-server/dist/services/memory-judge-backfill.js +510 -0
  173. package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -0
  174. package/mcp-server/dist/services/memory-judgments.d.ts +362 -0
  175. package/mcp-server/dist/services/memory-judgments.d.ts.map +1 -0
  176. package/mcp-server/dist/services/memory-judgments.js +674 -0
  177. package/mcp-server/dist/services/memory-judgments.js.map +1 -0
  178. package/mcp-server/dist/services/memory-maintenance.d.ts +108 -0
  179. package/mcp-server/dist/services/memory-maintenance.d.ts.map +1 -0
  180. package/mcp-server/dist/services/memory-maintenance.js +403 -0
  181. package/mcp-server/dist/services/memory-maintenance.js.map +1 -0
  182. package/mcp-server/dist/services/memory-retrieval.d.ts +66 -0
  183. package/mcp-server/dist/services/memory-retrieval.d.ts.map +1 -0
  184. package/mcp-server/dist/services/memory-retrieval.js +412 -0
  185. package/mcp-server/dist/services/memory-retrieval.js.map +1 -0
  186. package/mcp-server/dist/services/memory-schema.d.ts +16 -0
  187. package/mcp-server/dist/services/memory-schema.d.ts.map +1 -0
  188. package/mcp-server/dist/services/memory-schema.js +282 -0
  189. package/mcp-server/dist/services/memory-schema.js.map +1 -0
  190. package/mcp-server/dist/services/memory-sessions.d.ts +24 -0
  191. package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -0
  192. package/mcp-server/dist/services/memory-sessions.js +110 -0
  193. package/mcp-server/dist/services/memory-sessions.js.map +1 -0
  194. package/mcp-server/dist/services/memory-triage.d.ts +60 -0
  195. package/mcp-server/dist/services/memory-triage.d.ts.map +1 -0
  196. package/mcp-server/dist/services/memory-triage.js +189 -0
  197. package/mcp-server/dist/services/memory-triage.js.map +1 -0
  198. package/mcp-server/dist/services/memory-verification.d.ts +24 -0
  199. package/mcp-server/dist/services/memory-verification.d.ts.map +1 -0
  200. package/mcp-server/dist/services/memory-verification.js +92 -0
  201. package/mcp-server/dist/services/memory-verification.js.map +1 -0
  202. package/mcp-server/dist/services/memory-writer.d.ts +26 -0
  203. package/mcp-server/dist/services/memory-writer.d.ts.map +1 -0
  204. package/mcp-server/dist/services/memory-writer.js +126 -0
  205. package/mcp-server/dist/services/memory-writer.js.map +1 -0
  206. package/mcp-server/dist/services/neural-interface.d.ts +439 -0
  207. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -0
  208. package/mcp-server/dist/services/neural-interface.js +1135 -0
  209. package/mcp-server/dist/services/neural-interface.js.map +1 -0
  210. package/mcp-server/dist/services/profiles.d.ts +120 -0
  211. package/mcp-server/dist/services/profiles.d.ts.map +1 -0
  212. package/mcp-server/dist/services/profiles.js +387 -0
  213. package/mcp-server/dist/services/profiles.js.map +1 -0
  214. package/mcp-server/dist/services/secret-gate.d.ts +29 -0
  215. package/mcp-server/dist/services/secret-gate.d.ts.map +1 -0
  216. package/mcp-server/dist/services/secret-gate.js +43 -0
  217. package/mcp-server/dist/services/secret-gate.js.map +1 -0
  218. package/mcp-server/dist/services/server-instructions.d.ts +10 -0
  219. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -0
  220. package/mcp-server/dist/services/server-instructions.js +101 -0
  221. package/mcp-server/dist/services/server-instructions.js.map +1 -0
  222. package/mcp-server/dist/services/sqlite.d.ts +235 -0
  223. package/mcp-server/dist/services/sqlite.d.ts.map +1 -0
  224. package/mcp-server/dist/services/sqlite.js +1185 -0
  225. package/mcp-server/dist/services/sqlite.js.map +1 -0
  226. package/mcp-server/dist/services/typesafe-bench.d.ts +99 -0
  227. package/mcp-server/dist/services/typesafe-bench.d.ts.map +1 -0
  228. package/mcp-server/dist/services/typesafe-bench.js +218 -0
  229. package/mcp-server/dist/services/typesafe-bench.js.map +1 -0
  230. package/mcp-server/dist/services/typesafe-config.d.ts +342 -0
  231. package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -0
  232. package/mcp-server/dist/services/typesafe-config.js +746 -0
  233. package/mcp-server/dist/services/typesafe-config.js.map +1 -0
  234. package/mcp-server/dist/services/typesafe.d.ts +213 -0
  235. package/mcp-server/dist/services/typesafe.d.ts.map +1 -0
  236. package/mcp-server/dist/services/typesafe.js +330 -0
  237. package/mcp-server/dist/services/typesafe.js.map +1 -0
  238. package/mcp-server/dist/services/vector-cache.d.ts +68 -0
  239. package/mcp-server/dist/services/vector-cache.d.ts.map +1 -0
  240. package/mcp-server/dist/services/vector-cache.js +271 -0
  241. package/mcp-server/dist/services/vector-cache.js.map +1 -0
  242. package/mcp-server/dist/services/whiteboard-geometry.d.ts +305 -0
  243. package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -0
  244. package/mcp-server/dist/services/whiteboard-geometry.js +666 -0
  245. package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -0
  246. package/mcp-server/dist/tools/agents.d.ts +212 -0
  247. package/mcp-server/dist/tools/agents.d.ts.map +1 -0
  248. package/mcp-server/dist/tools/agents.js +407 -0
  249. package/mcp-server/dist/tools/agents.js.map +1 -0
  250. package/mcp-server/dist/tools/bluesky.d.ts +39 -0
  251. package/mcp-server/dist/tools/bluesky.d.ts.map +1 -0
  252. package/mcp-server/dist/tools/bluesky.js +1144 -0
  253. package/mcp-server/dist/tools/bluesky.js.map +1 -0
  254. package/mcp-server/dist/tools/browser-advanced.d.ts +58 -0
  255. package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -0
  256. package/mcp-server/dist/tools/browser-advanced.js +106 -0
  257. package/mcp-server/dist/tools/browser-advanced.js.map +1 -0
  258. package/mcp-server/dist/tools/browser-batch.d.ts +99 -0
  259. package/mcp-server/dist/tools/browser-batch.d.ts.map +1 -0
  260. package/mcp-server/dist/tools/browser-batch.js +187 -0
  261. package/mcp-server/dist/tools/browser-batch.js.map +1 -0
  262. package/mcp-server/dist/tools/browser-cheatsheet.d.ts +21 -0
  263. package/mcp-server/dist/tools/browser-cheatsheet.d.ts.map +1 -0
  264. package/mcp-server/dist/tools/browser-cheatsheet.js +144 -0
  265. package/mcp-server/dist/tools/browser-cheatsheet.js.map +1 -0
  266. package/mcp-server/dist/tools/browser-interact.d.ts +239 -0
  267. package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -0
  268. package/mcp-server/dist/tools/browser-interact.js +300 -0
  269. package/mcp-server/dist/tools/browser-interact.js.map +1 -0
  270. package/mcp-server/dist/tools/browser-navigate.d.ts +90 -0
  271. package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -0
  272. package/mcp-server/dist/tools/browser-navigate.js +142 -0
  273. package/mcp-server/dist/tools/browser-navigate.js.map +1 -0
  274. package/mcp-server/dist/tools/browser-observe.d.ts +561 -0
  275. package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -0
  276. package/mcp-server/dist/tools/browser-observe.js +2009 -0
  277. package/mcp-server/dist/tools/browser-observe.js.map +1 -0
  278. package/mcp-server/dist/tools/browser.d.ts +34 -0
  279. package/mcp-server/dist/tools/browser.d.ts.map +1 -0
  280. package/mcp-server/dist/tools/browser.js +112 -0
  281. package/mcp-server/dist/tools/browser.js.map +1 -0
  282. package/mcp-server/dist/tools/card-tools.d.ts +82 -0
  283. package/mcp-server/dist/tools/card-tools.d.ts.map +1 -0
  284. package/mcp-server/dist/tools/card-tools.js +137 -0
  285. package/mcp-server/dist/tools/card-tools.js.map +1 -0
  286. package/mcp-server/dist/tools/card.d.ts +8 -0
  287. package/mcp-server/dist/tools/card.d.ts.map +1 -0
  288. package/mcp-server/dist/tools/card.js +16 -0
  289. package/mcp-server/dist/tools/card.js.map +1 -0
  290. package/mcp-server/dist/tools/category.d.ts +32 -0
  291. package/mcp-server/dist/tools/category.d.ts.map +1 -0
  292. package/mcp-server/dist/tools/category.js +290 -0
  293. package/mcp-server/dist/tools/category.js.map +1 -0
  294. package/mcp-server/dist/tools/choice.d.ts +160 -0
  295. package/mcp-server/dist/tools/choice.d.ts.map +1 -0
  296. package/mcp-server/dist/tools/choice.js +80 -0
  297. package/mcp-server/dist/tools/choice.js.map +1 -0
  298. package/mcp-server/dist/tools/computer.d.ts +71 -0
  299. package/mcp-server/dist/tools/computer.d.ts.map +1 -0
  300. package/mcp-server/dist/tools/computer.js +174 -0
  301. package/mcp-server/dist/tools/computer.js.map +1 -0
  302. package/mcp-server/dist/tools/discord-channel.d.ts +44 -0
  303. package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -0
  304. package/mcp-server/dist/tools/discord-channel.js +236 -0
  305. package/mcp-server/dist/tools/discord-channel.js.map +1 -0
  306. package/mcp-server/dist/tools/discord-guild.d.ts +20 -0
  307. package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -0
  308. package/mcp-server/dist/tools/discord-guild.js +138 -0
  309. package/mcp-server/dist/tools/discord-guild.js.map +1 -0
  310. package/mcp-server/dist/tools/discord-member.d.ts +26 -0
  311. package/mcp-server/dist/tools/discord-member.d.ts.map +1 -0
  312. package/mcp-server/dist/tools/discord-member.js +122 -0
  313. package/mcp-server/dist/tools/discord-member.js.map +1 -0
  314. package/mcp-server/dist/tools/discord-message.d.ts +36 -0
  315. package/mcp-server/dist/tools/discord-message.d.ts.map +1 -0
  316. package/mcp-server/dist/tools/discord-message.js +184 -0
  317. package/mcp-server/dist/tools/discord-message.js.map +1 -0
  318. package/mcp-server/dist/tools/discord-onboarding.d.ts +32 -0
  319. package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -0
  320. package/mcp-server/dist/tools/discord-onboarding.js +179 -0
  321. package/mcp-server/dist/tools/discord-onboarding.js.map +1 -0
  322. package/mcp-server/dist/tools/discord-role.d.ts +34 -0
  323. package/mcp-server/dist/tools/discord-role.d.ts.map +1 -0
  324. package/mcp-server/dist/tools/discord-role.js +178 -0
  325. package/mcp-server/dist/tools/discord-role.js.map +1 -0
  326. package/mcp-server/dist/tools/discord-thread.d.ts +28 -0
  327. package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -0
  328. package/mcp-server/dist/tools/discord-thread.js +88 -0
  329. package/mcp-server/dist/tools/discord-thread.js.map +1 -0
  330. package/mcp-server/dist/tools/discord-webhook.d.ts +32 -0
  331. package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -0
  332. package/mcp-server/dist/tools/discord-webhook.js +154 -0
  333. package/mcp-server/dist/tools/discord-webhook.js.map +1 -0
  334. package/mcp-server/dist/tools/discord.d.ts +7 -0
  335. package/mcp-server/dist/tools/discord.d.ts.map +1 -0
  336. package/mcp-server/dist/tools/discord.js +25 -0
  337. package/mcp-server/dist/tools/discord.js.map +1 -0
  338. package/mcp-server/dist/tools/fb-groups.d.ts +98 -0
  339. package/mcp-server/dist/tools/fb-groups.d.ts.map +1 -0
  340. package/mcp-server/dist/tools/fb-groups.js +369 -0
  341. package/mcp-server/dist/tools/fb-groups.js.map +1 -0
  342. package/mcp-server/dist/tools/forget.d.ts +14 -0
  343. package/mcp-server/dist/tools/forget.d.ts.map +1 -0
  344. package/mcp-server/dist/tools/forget.js +26 -0
  345. package/mcp-server/dist/tools/forget.js.map +1 -0
  346. package/mcp-server/dist/tools/git-tools.d.ts +24 -0
  347. package/mcp-server/dist/tools/git-tools.d.ts.map +1 -0
  348. package/mcp-server/dist/tools/git-tools.js +107 -0
  349. package/mcp-server/dist/tools/git-tools.js.map +1 -0
  350. package/mcp-server/dist/tools/git.d.ts +7 -0
  351. package/mcp-server/dist/tools/git.d.ts.map +1 -0
  352. package/mcp-server/dist/tools/git.js +11 -0
  353. package/mcp-server/dist/tools/git.js.map +1 -0
  354. package/mcp-server/dist/tools/gsc/experience.d.ts +135 -0
  355. package/mcp-server/dist/tools/gsc/experience.d.ts.map +1 -0
  356. package/mcp-server/dist/tools/gsc/experience.js +351 -0
  357. package/mcp-server/dist/tools/gsc/experience.js.map +1 -0
  358. package/mcp-server/dist/tools/gsc/helpers.d.ts +78 -0
  359. package/mcp-server/dist/tools/gsc/helpers.d.ts.map +1 -0
  360. package/mcp-server/dist/tools/gsc/helpers.js +258 -0
  361. package/mcp-server/dist/tools/gsc/helpers.js.map +1 -0
  362. package/mcp-server/dist/tools/gsc/indexing.d.ts +121 -0
  363. package/mcp-server/dist/tools/gsc/indexing.d.ts.map +1 -0
  364. package/mcp-server/dist/tools/gsc/indexing.js +357 -0
  365. package/mcp-server/dist/tools/gsc/indexing.js.map +1 -0
  366. package/mcp-server/dist/tools/gsc/inspect.d.ts +78 -0
  367. package/mcp-server/dist/tools/gsc/inspect.d.ts.map +1 -0
  368. package/mcp-server/dist/tools/gsc/inspect.js +321 -0
  369. package/mcp-server/dist/tools/gsc/inspect.js.map +1 -0
  370. package/mcp-server/dist/tools/gsc/navigate.d.ts +44 -0
  371. package/mcp-server/dist/tools/gsc/navigate.d.ts.map +1 -0
  372. package/mcp-server/dist/tools/gsc/navigate.js +197 -0
  373. package/mcp-server/dist/tools/gsc/navigate.js.map +1 -0
  374. package/mcp-server/dist/tools/gsc/performance.d.ts +84 -0
  375. package/mcp-server/dist/tools/gsc/performance.d.ts.map +1 -0
  376. package/mcp-server/dist/tools/gsc/performance.js +274 -0
  377. package/mcp-server/dist/tools/gsc/performance.js.map +1 -0
  378. package/mcp-server/dist/tools/gsc/settings.d.ts +153 -0
  379. package/mcp-server/dist/tools/gsc/settings.d.ts.map +1 -0
  380. package/mcp-server/dist/tools/gsc/settings.js +425 -0
  381. package/mcp-server/dist/tools/gsc/settings.js.map +1 -0
  382. package/mcp-server/dist/tools/gsc.d.ts +7 -0
  383. package/mcp-server/dist/tools/gsc.d.ts.map +1 -0
  384. package/mcp-server/dist/tools/gsc.js +51 -0
  385. package/mcp-server/dist/tools/gsc.js.map +1 -0
  386. package/mcp-server/dist/tools/image-tools.d.ts +24 -0
  387. package/mcp-server/dist/tools/image-tools.d.ts.map +1 -0
  388. package/mcp-server/dist/tools/image-tools.js +80 -0
  389. package/mcp-server/dist/tools/image-tools.js.map +1 -0
  390. package/mcp-server/dist/tools/image.d.ts +10 -0
  391. package/mcp-server/dist/tools/image.d.ts.map +1 -0
  392. package/mcp-server/dist/tools/image.js +14 -0
  393. package/mcp-server/dist/tools/image.js.map +1 -0
  394. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +97 -0
  395. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -0
  396. package/mcp-server/dist/tools/leonardo-browser-tools.js +228 -0
  397. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -0
  398. package/mcp-server/dist/tools/leonardo.d.ts +13 -0
  399. package/mcp-server/dist/tools/leonardo.d.ts.map +1 -0
  400. package/mcp-server/dist/tools/leonardo.js +21 -0
  401. package/mcp-server/dist/tools/leonardo.js.map +1 -0
  402. package/mcp-server/dist/tools/loop.d.ts +30 -0
  403. package/mcp-server/dist/tools/loop.d.ts.map +1 -0
  404. package/mcp-server/dist/tools/loop.js +401 -0
  405. package/mcp-server/dist/tools/loop.js.map +1 -0
  406. package/mcp-server/dist/tools/memories.d.ts +56 -0
  407. package/mcp-server/dist/tools/memories.d.ts.map +1 -0
  408. package/mcp-server/dist/tools/memories.js +171 -0
  409. package/mcp-server/dist/tools/memories.js.map +1 -0
  410. package/mcp-server/dist/tools/morelogin.d.ts +24 -0
  411. package/mcp-server/dist/tools/morelogin.d.ts.map +1 -0
  412. package/mcp-server/dist/tools/morelogin.js +79 -0
  413. package/mcp-server/dist/tools/morelogin.js.map +1 -0
  414. package/mcp-server/dist/tools/profile.d.ts +17 -0
  415. package/mcp-server/dist/tools/profile.d.ts.map +1 -0
  416. package/mcp-server/dist/tools/profile.js +114 -0
  417. package/mcp-server/dist/tools/profile.js.map +1 -0
  418. package/mcp-server/dist/tools/recall.d.ts +71 -0
  419. package/mcp-server/dist/tools/recall.d.ts.map +1 -0
  420. package/mcp-server/dist/tools/recall.js +147 -0
  421. package/mcp-server/dist/tools/recall.js.map +1 -0
  422. package/mcp-server/dist/tools/reflect.d.ts +56 -0
  423. package/mcp-server/dist/tools/reflect.d.ts.map +1 -0
  424. package/mcp-server/dist/tools/reflect.js +157 -0
  425. package/mcp-server/dist/tools/reflect.js.map +1 -0
  426. package/mcp-server/dist/tools/remember.d.ts +62 -0
  427. package/mcp-server/dist/tools/remember.d.ts.map +1 -0
  428. package/mcp-server/dist/tools/remember.js +201 -0
  429. package/mcp-server/dist/tools/remember.js.map +1 -0
  430. package/mcp-server/dist/tools/response.d.ts +23 -0
  431. package/mcp-server/dist/tools/response.d.ts.map +1 -0
  432. package/mcp-server/dist/tools/response.js +24 -0
  433. package/mcp-server/dist/tools/response.js.map +1 -0
  434. package/mcp-server/dist/tools/restore.d.ts +14 -0
  435. package/mcp-server/dist/tools/restore.d.ts.map +1 -0
  436. package/mcp-server/dist/tools/restore.js +23 -0
  437. package/mcp-server/dist/tools/restore.js.map +1 -0
  438. package/mcp-server/dist/tools/style-guide-tools.d.ts +51 -0
  439. package/mcp-server/dist/tools/style-guide-tools.d.ts.map +1 -0
  440. package/mcp-server/dist/tools/style-guide-tools.js +231 -0
  441. package/mcp-server/dist/tools/style-guide-tools.js.map +1 -0
  442. package/mcp-server/dist/tools/style-guide.d.ts +8 -0
  443. package/mcp-server/dist/tools/style-guide.d.ts.map +1 -0
  444. package/mcp-server/dist/tools/style-guide.js +12 -0
  445. package/mcp-server/dist/tools/style-guide.js.map +1 -0
  446. package/mcp-server/dist/tools/sync.d.ts +20 -0
  447. package/mcp-server/dist/tools/sync.d.ts.map +1 -0
  448. package/mcp-server/dist/tools/sync.js +156 -0
  449. package/mcp-server/dist/tools/sync.js.map +1 -0
  450. package/mcp-server/dist/tools/tictactoe-tools.d.ts +18 -0
  451. package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -0
  452. package/mcp-server/dist/tools/tictactoe-tools.js +78 -0
  453. package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -0
  454. package/mcp-server/dist/tools/tictactoe.d.ts +7 -0
  455. package/mcp-server/dist/tools/tictactoe.d.ts.map +1 -0
  456. package/mcp-server/dist/tools/tictactoe.js +11 -0
  457. package/mcp-server/dist/tools/tictactoe.js.map +1 -0
  458. package/mcp-server/dist/tools/utils.d.ts +19 -0
  459. package/mcp-server/dist/tools/utils.d.ts.map +1 -0
  460. package/mcp-server/dist/tools/utils.js +54 -0
  461. package/mcp-server/dist/tools/utils.js.map +1 -0
  462. package/mcp-server/dist/tools/whiteboard-format.d.ts +88 -0
  463. package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -0
  464. package/mcp-server/dist/tools/whiteboard-format.js +337 -0
  465. package/mcp-server/dist/tools/whiteboard-format.js.map +1 -0
  466. package/mcp-server/dist/tools/whiteboard-tools.d.ts +326 -0
  467. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -0
  468. package/mcp-server/dist/tools/whiteboard-tools.js +222 -0
  469. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -0
  470. package/mcp-server/dist/tools/whiteboard.d.ts +8 -0
  471. package/mcp-server/dist/tools/whiteboard.d.ts.map +1 -0
  472. package/mcp-server/dist/tools/whiteboard.js +16 -0
  473. package/mcp-server/dist/tools/whiteboard.js.map +1 -0
  474. package/mcp-server/dist/tools/youtube/analytics.d.ts +46 -0
  475. package/mcp-server/dist/tools/youtube/analytics.d.ts.map +1 -0
  476. package/mcp-server/dist/tools/youtube/analytics.js +83 -0
  477. package/mcp-server/dist/tools/youtube/analytics.js.map +1 -0
  478. package/mcp-server/dist/tools/youtube/dedup.d.ts +35 -0
  479. package/mcp-server/dist/tools/youtube/dedup.d.ts.map +1 -0
  480. package/mcp-server/dist/tools/youtube/dedup.js +56 -0
  481. package/mcp-server/dist/tools/youtube/dedup.js.map +1 -0
  482. package/mcp-server/dist/tools/youtube/download.d.ts +31 -0
  483. package/mcp-server/dist/tools/youtube/download.d.ts.map +1 -0
  484. package/mcp-server/dist/tools/youtube/download.js +30 -0
  485. package/mcp-server/dist/tools/youtube/download.js.map +1 -0
  486. package/mcp-server/dist/tools/youtube/helpers.d.ts +66 -0
  487. package/mcp-server/dist/tools/youtube/helpers.d.ts.map +1 -0
  488. package/mcp-server/dist/tools/youtube/helpers.js +143 -0
  489. package/mcp-server/dist/tools/youtube/helpers.js.map +1 -0
  490. package/mcp-server/dist/tools/youtube/media.d.ts +43 -0
  491. package/mcp-server/dist/tools/youtube/media.d.ts.map +1 -0
  492. package/mcp-server/dist/tools/youtube/media.js +97 -0
  493. package/mcp-server/dist/tools/youtube/media.js.map +1 -0
  494. package/mcp-server/dist/tools/youtube/metadata.d.ts +33 -0
  495. package/mcp-server/dist/tools/youtube/metadata.d.ts.map +1 -0
  496. package/mcp-server/dist/tools/youtube/metadata.js +106 -0
  497. package/mcp-server/dist/tools/youtube/metadata.js.map +1 -0
  498. package/mcp-server/dist/tools/youtube/navigate.d.ts +30 -0
  499. package/mcp-server/dist/tools/youtube/navigate.d.ts.map +1 -0
  500. package/mcp-server/dist/tools/youtube/navigate.js +71 -0
  501. package/mcp-server/dist/tools/youtube/navigate.js.map +1 -0
  502. package/mcp-server/dist/tools/youtube/playlist.d.ts +29 -0
  503. package/mcp-server/dist/tools/youtube/playlist.d.ts.map +1 -0
  504. package/mcp-server/dist/tools/youtube/playlist.js +128 -0
  505. package/mcp-server/dist/tools/youtube/playlist.js.map +1 -0
  506. package/mcp-server/dist/tools/youtube/schedule.d.ts +31 -0
  507. package/mcp-server/dist/tools/youtube/schedule.d.ts.map +1 -0
  508. package/mcp-server/dist/tools/youtube/schedule.js +147 -0
  509. package/mcp-server/dist/tools/youtube/schedule.js.map +1 -0
  510. package/mcp-server/dist/tools/youtube/source.d.ts +36 -0
  511. package/mcp-server/dist/tools/youtube/source.d.ts.map +1 -0
  512. package/mcp-server/dist/tools/youtube/source.js +85 -0
  513. package/mcp-server/dist/tools/youtube/source.js.map +1 -0
  514. package/mcp-server/dist/tools/youtube/upload.d.ts +53 -0
  515. package/mcp-server/dist/tools/youtube/upload.d.ts.map +1 -0
  516. package/mcp-server/dist/tools/youtube/upload.js +255 -0
  517. package/mcp-server/dist/tools/youtube/upload.js.map +1 -0
  518. package/mcp-server/dist/tools/youtube.d.ts +12 -0
  519. package/mcp-server/dist/tools/youtube.d.ts.map +1 -0
  520. package/mcp-server/dist/tools/youtube.js +38 -0
  521. package/mcp-server/dist/tools/youtube.js.map +1 -0
  522. package/mcp-server/dist/tui.d.ts +3 -0
  523. package/mcp-server/dist/tui.d.ts.map +1 -0
  524. package/mcp-server/dist/tui.js +806 -0
  525. package/mcp-server/dist/tui.js.map +1 -0
  526. package/mcp-server/dist/types.d.ts +77 -0
  527. package/mcp-server/dist/types.d.ts.map +1 -0
  528. package/mcp-server/dist/types.js +2 -0
  529. package/mcp-server/dist/types.js.map +1 -0
  530. package/mcp-server/package-lock.json +4798 -0
  531. package/mcp-server/package.json +55 -38
  532. package/mcp-server/run.mjs +12 -2
  533. package/mcp-server/src/config.ts +48 -3
  534. package/mcp-server/src/http.ts +296 -93
  535. package/mcp-server/src/index.ts +546 -203
  536. package/mcp-server/src/preload-http.ts +19 -18
  537. package/mcp-server/src/preload.ts +19 -18
  538. package/mcp-server/src/scripts/setup-embeddings.ts +9 -0
  539. package/mcp-server/src/services/assistant-judgments.ts +157 -0
  540. package/mcp-server/src/services/browser-assist-gate.ts +383 -0
  541. package/mcp-server/src/services/browser-assist.ts +267 -0
  542. package/mcp-server/src/services/browser-bench.ts +477 -0
  543. package/mcp-server/src/services/browser-judgments.ts +414 -0
  544. package/mcp-server/src/services/browser-risk.ts +484 -0
  545. package/mcp-server/src/services/categories.ts +36 -19
  546. package/mcp-server/src/services/codex-config-heal.ts +403 -0
  547. package/mcp-server/src/services/desktop-assist-gate.ts +251 -0
  548. package/mcp-server/src/services/desktop-assist.ts +308 -0
  549. package/mcp-server/src/services/desktop-bench.ts +372 -0
  550. package/mcp-server/src/services/desktop-client.ts +76 -0
  551. package/mcp-server/src/services/desktop-judgments.ts +218 -0
  552. package/mcp-server/src/services/desktop-risk.ts +743 -0
  553. package/mcp-server/src/services/edit-stale.ts +299 -0
  554. package/mcp-server/src/services/embedding-service.ts +108 -0
  555. package/mcp-server/src/services/embedding-worker.ts +46 -0
  556. package/mcp-server/src/services/fb-regions.ts +221 -0
  557. package/mcp-server/src/services/file-checksums.ts +26 -9
  558. package/mcp-server/src/services/file-excerpt.ts +59 -0
  559. package/mcp-server/src/services/identity.ts +291 -0
  560. package/mcp-server/src/services/local-embeddings.ts +2 -77
  561. package/mcp-server/src/services/memory-client.ts +23 -0
  562. package/mcp-server/src/services/memory-judge-backfill.ts +462 -0
  563. package/mcp-server/src/services/memory-judgments.ts +901 -0
  564. package/mcp-server/src/services/memory-maintenance.ts +360 -0
  565. package/mcp-server/src/services/memory-retrieval.ts +349 -0
  566. package/mcp-server/src/services/memory-schema.ts +280 -0
  567. package/mcp-server/src/services/memory-sessions.ts +87 -0
  568. package/mcp-server/src/services/memory-triage.ts +182 -0
  569. package/mcp-server/src/services/memory-verification.ts +68 -0
  570. package/mcp-server/src/services/memory-writer.ts +125 -0
  571. package/mcp-server/src/services/neural-interface.ts +1217 -73
  572. package/mcp-server/src/services/profiles.ts +428 -0
  573. package/mcp-server/src/services/secret-gate.ts +52 -0
  574. package/mcp-server/src/services/server-instructions.ts +122 -0
  575. package/mcp-server/src/services/sqlite.ts +1456 -823
  576. package/mcp-server/src/services/typesafe-bench.ts +247 -0
  577. package/mcp-server/src/services/typesafe-config.ts +790 -0
  578. package/mcp-server/src/services/typesafe.ts +390 -0
  579. package/mcp-server/src/services/vector-cache.ts +255 -0
  580. package/mcp-server/src/services/whiteboard-geometry.ts +711 -0
  581. package/mcp-server/src/tools/agents.ts +539 -0
  582. package/mcp-server/src/tools/bluesky.ts +1186 -0
  583. package/mcp-server/src/tools/browser-advanced.ts +15 -6
  584. package/mcp-server/src/tools/browser-batch.ts +178 -0
  585. package/mcp-server/src/tools/browser-cheatsheet.ts +155 -0
  586. package/mcp-server/src/tools/browser-interact.ts +362 -255
  587. package/mcp-server/src/tools/browser-navigate.ts +164 -77
  588. package/mcp-server/src/tools/browser-observe.ts +2222 -1330
  589. package/mcp-server/src/tools/browser.ts +181 -107
  590. package/mcp-server/src/tools/card.ts +7 -5
  591. package/mcp-server/src/tools/choice.ts +103 -0
  592. package/mcp-server/src/tools/computer.ts +190 -0
  593. package/mcp-server/src/tools/discord.ts +10 -23
  594. package/mcp-server/src/tools/fb-groups.ts +387 -0
  595. package/mcp-server/src/tools/forget.ts +1 -1
  596. package/mcp-server/src/tools/git.ts +3 -1
  597. package/mcp-server/src/tools/gsc/experience.ts +440 -0
  598. package/mcp-server/src/tools/gsc/helpers.ts +288 -0
  599. package/mcp-server/src/tools/gsc/indexing.ts +495 -0
  600. package/mcp-server/src/tools/gsc/inspect.ts +391 -0
  601. package/mcp-server/src/tools/gsc/navigate.ts +236 -0
  602. package/mcp-server/src/tools/gsc/performance.ts +352 -0
  603. package/mcp-server/src/tools/gsc/settings.ts +564 -0
  604. package/mcp-server/src/tools/gsc.ts +95 -0
  605. package/mcp-server/src/tools/image.ts +3 -1
  606. package/mcp-server/src/tools/leonardo-browser-tools.ts +47 -37
  607. package/mcp-server/src/tools/leonardo.ts +7 -5
  608. package/mcp-server/src/tools/loop.ts +118 -25
  609. package/mcp-server/src/tools/memories.ts +65 -5
  610. package/mcp-server/src/tools/morelogin.ts +81 -0
  611. package/mcp-server/src/tools/profile.ts +122 -0
  612. package/mcp-server/src/tools/recall.ts +105 -261
  613. package/mcp-server/src/tools/reflect.ts +171 -145
  614. package/mcp-server/src/tools/remember.ts +223 -115
  615. package/mcp-server/src/tools/style-guide-tools.ts +250 -0
  616. package/mcp-server/src/tools/style-guide.ts +16 -0
  617. package/mcp-server/src/tools/sync.ts +66 -9
  618. package/mcp-server/src/tools/tictactoe.ts +3 -1
  619. package/mcp-server/src/tools/utils.ts +22 -0
  620. package/mcp-server/src/tools/whiteboard-format.ts +394 -0
  621. package/mcp-server/src/tools/whiteboard-tools.ts +191 -183
  622. package/mcp-server/src/tools/whiteboard.ts +7 -5
  623. package/mcp-server/src/tools/youtube/analytics.ts +106 -0
  624. package/mcp-server/src/tools/youtube/dedup.ts +57 -0
  625. package/mcp-server/src/tools/youtube/download.ts +41 -0
  626. package/mcp-server/src/tools/youtube/helpers.ts +183 -0
  627. package/mcp-server/src/tools/youtube/media.ts +109 -0
  628. package/mcp-server/src/tools/youtube/metadata.ts +112 -0
  629. package/mcp-server/src/tools/youtube/navigate.ts +81 -0
  630. package/mcp-server/src/tools/youtube/playlist.ts +134 -0
  631. package/mcp-server/src/tools/youtube/schedule.ts +158 -0
  632. package/mcp-server/src/tools/youtube/source.ts +101 -0
  633. package/mcp-server/src/tools/youtube/upload.ts +296 -0
  634. package/mcp-server/src/tools/youtube.ts +47 -0
  635. package/mcp-server/src/tui.ts +8 -9
  636. package/neural-interface/games/TicTacToe/1.svg +1 -0
  637. package/neural-interface/games/TicTacToe/2.svg +1 -0
  638. package/neural-interface/games/TicTacToe/3.svg +1 -0
  639. package/neural-interface/games/TicTacToe/4.svg +1 -0
  640. package/neural-interface/games/TicTacToe/5.svg +1 -0
  641. package/neural-interface/games/TicTacToe/6.svg +1 -0
  642. package/neural-interface/games/TicTacToe/7.svg +1 -0
  643. package/neural-interface/games/TicTacToe/8.svg +1 -0
  644. package/neural-interface/games/TicTacToe/9.svg +1 -0
  645. package/neural-interface/games/TicTacToe/Board.svg +1 -0
  646. package/neural-interface/games/TicTacToe/Circle.svg +1 -0
  647. package/neural-interface/games/TicTacToe/Cross.svg +1 -0
  648. package/neural-interface/i18n/en.json +7022 -0
  649. package/neural-interface/i18n/pt-BR.json +7026 -0
  650. package/neural-interface/lib/assistant-api.js +1005 -0
  651. package/neural-interface/lib/assistant-attachments.js +121 -0
  652. package/neural-interface/lib/assistant-brains/claude.js +207 -0
  653. package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +43 -0
  654. package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +56 -0
  655. package/neural-interface/lib/assistant-brains/codex.js +213 -0
  656. package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +47 -0
  657. package/neural-interface/lib/assistant-brains/opencode-route-gate.js +62 -0
  658. package/neural-interface/lib/assistant-brains/opencode.js +320 -0
  659. package/neural-interface/lib/assistant-budget.js +318 -0
  660. package/neural-interface/lib/assistant-catalog.js +731 -0
  661. package/neural-interface/lib/assistant-clarify.js +664 -0
  662. package/neural-interface/lib/assistant-config.js +232 -0
  663. package/neural-interface/lib/assistant-dispatch.js +2744 -0
  664. package/neural-interface/lib/assistant-envelope.js +582 -0
  665. package/neural-interface/lib/assistant-evidence.js +236 -0
  666. package/neural-interface/lib/assistant-hidden-models.js +272 -0
  667. package/neural-interface/lib/assistant-jev.js +117 -0
  668. package/neural-interface/lib/assistant-judgments.js +111 -0
  669. package/neural-interface/lib/assistant-media.js +335 -0
  670. package/neural-interface/lib/assistant-memory.js +398 -0
  671. package/neural-interface/lib/assistant-persona.js +444 -0
  672. package/neural-interface/lib/assistant-plan-permissions.js +448 -0
  673. package/neural-interface/lib/assistant-playbooks/design.md +87 -0
  674. package/neural-interface/lib/assistant-playbooks.js +72 -0
  675. package/neural-interface/lib/assistant-pricing.js +159 -0
  676. package/neural-interface/lib/assistant-route-gate-codex.js +163 -0
  677. package/neural-interface/lib/assistant-route-gate.js +212 -0
  678. package/neural-interface/lib/assistant-router.js +1324 -0
  679. package/neural-interface/lib/assistant-runtime.js +3337 -0
  680. package/neural-interface/lib/assistant-task-prompt.js +472 -0
  681. package/neural-interface/lib/assistant-usage.js +1688 -0
  682. package/neural-interface/lib/augmented-path.js +70 -0
  683. package/neural-interface/lib/automation-storage-migration.js +54 -0
  684. package/neural-interface/lib/backup-service.js +851 -0
  685. package/neural-interface/lib/backup-zip-reader.js +262 -0
  686. package/neural-interface/lib/browser-assist-api.js +41 -0
  687. package/neural-interface/lib/browser-console.js +176 -0
  688. package/neural-interface/lib/browser-execution.js +241 -0
  689. package/neural-interface/lib/browser-extraction.js +191 -0
  690. package/neural-interface/lib/browser-language.js +83 -0
  691. package/neural-interface/lib/browser-screenshot.js +399 -0
  692. package/neural-interface/lib/browser-semantic-context.js +639 -0
  693. package/neural-interface/lib/browser-snapshots.js +192 -0
  694. package/neural-interface/lib/browser-tab-recovery.js +119 -0
  695. package/neural-interface/lib/browser-targets.js +70 -0
  696. package/neural-interface/lib/browser-tool-policy.js +926 -0
  697. package/neural-interface/lib/claude-accounts.js +230 -0
  698. package/neural-interface/lib/claude-agent-bridge.js +3203 -0
  699. package/neural-interface/lib/claude-bypass-policy.js +99 -0
  700. package/neural-interface/lib/claude-executable.js +241 -0
  701. package/neural-interface/lib/claude-history.js +429 -0
  702. package/neural-interface/lib/claude-model-catalog.js +444 -0
  703. package/neural-interface/lib/claude-panel-requests.js +165 -0
  704. package/neural-interface/lib/claude-panel-session.js +272 -0
  705. package/neural-interface/lib/claude-permission-rules.js +153 -0
  706. package/neural-interface/lib/claude-session-cleanup.js +71 -0
  707. package/neural-interface/lib/claude-session-list.js +82 -0
  708. package/neural-interface/lib/claude-session-ops.js +140 -0
  709. package/neural-interface/lib/claude-settings-view.js +51 -0
  710. package/neural-interface/lib/claude-skin-connect.js +79 -0
  711. package/neural-interface/lib/claude-stall-policy.js +7 -0
  712. package/neural-interface/lib/claude-temporary.js +435 -0
  713. package/neural-interface/lib/cli-update-planner.js +312 -0
  714. package/neural-interface/lib/codex-capabilities.d.ts +41 -0
  715. package/neural-interface/lib/codex-capabilities.js +148 -0
  716. package/neural-interface/lib/codex-collaboration-mode.js +17 -0
  717. package/neural-interface/lib/codex-compat-rpc.js +241 -0
  718. package/neural-interface/lib/codex-mcp-approvals.js +56 -0
  719. package/neural-interface/lib/codex-mcp-apps.js +47 -0
  720. package/neural-interface/lib/codex-model-context.js +202 -0
  721. package/neural-interface/lib/codex-plan-store.js +71 -0
  722. package/neural-interface/lib/codex-request-journal.js +242 -0
  723. package/neural-interface/lib/codex-runtime-path.js +213 -0
  724. package/neural-interface/lib/codex-session-catalog.js +231 -0
  725. package/neural-interface/lib/codex-session-settings.js +46 -0
  726. package/neural-interface/lib/codex-sidepanel-permissions.js +110 -0
  727. package/neural-interface/lib/codex-thread-history.js +165 -0
  728. package/neural-interface/lib/codex-user-verification.js +34 -0
  729. package/neural-interface/lib/codex-writer-lifecycle.js +152 -0
  730. package/neural-interface/lib/confined-fs.js +256 -0
  731. package/neural-interface/lib/db.js +922 -0
  732. package/neural-interface/lib/design-md.js +9 -0
  733. package/neural-interface/lib/desktop/api.js +92 -0
  734. package/neural-interface/lib/desktop/audit.js +62 -0
  735. package/neural-interface/lib/desktop/build.js +423 -0
  736. package/neural-interface/lib/desktop/config.js +606 -0
  737. package/neural-interface/lib/desktop/coords.js +76 -0
  738. package/neural-interface/lib/desktop/fake-helper.js +1192 -0
  739. package/neural-interface/lib/desktop/frames.js +77 -0
  740. package/neural-interface/lib/desktop/grants.js +84 -0
  741. package/neural-interface/lib/desktop/guards.js +170 -0
  742. package/neural-interface/lib/desktop/helper/SynabunDesktop.swift +3056 -0
  743. package/neural-interface/lib/desktop/lease.js +51 -0
  744. package/neural-interface/lib/desktop/manager.js +545 -0
  745. package/neural-interface/lib/desktop/press-contexts.js +103 -0
  746. package/neural-interface/lib/desktop/protocol.js +495 -0
  747. package/neural-interface/lib/desktop/service.js +1202 -0
  748. package/neural-interface/lib/effort-levels.js +148 -0
  749. package/neural-interface/lib/event-loop-monitor.js +67 -0
  750. package/neural-interface/lib/exec-loop-command.js +209 -0
  751. package/neural-interface/lib/folder-picker.ps1 +77 -0
  752. package/neural-interface/lib/http-guards.js +287 -0
  753. package/neural-interface/lib/jsonl-lines.js +94 -0
  754. package/neural-interface/lib/loop-logger.js +127 -0
  755. package/neural-interface/lib/mcp-client-config.js +133 -0
  756. package/neural-interface/lib/mcp-installer.js +487 -0
  757. package/neural-interface/lib/mcp-profile-refresh-coordinator.js +78 -0
  758. package/neural-interface/lib/mcp-profile-servers.js +120 -0
  759. package/neural-interface/lib/memo-cache.js +84 -0
  760. package/neural-interface/lib/memory-api.js +758 -0
  761. package/neural-interface/lib/memory-map-api.js +1150 -0
  762. package/neural-interface/lib/memory-map-layout.js +872 -0
  763. package/neural-interface/lib/memory-map-worker.js +165 -0
  764. package/neural-interface/lib/memory-session-capture.js +81 -0
  765. package/neural-interface/lib/memory-timers.js +62 -0
  766. package/neural-interface/lib/morelogin.js +301 -0
  767. package/neural-interface/lib/native-binary-runtime.js +382 -0
  768. package/neural-interface/lib/native-loop-goal.js +33 -0
  769. package/neural-interface/lib/native-loop-providers.js +1002 -0
  770. package/neural-interface/lib/native-loop-runtime.js +747 -0
  771. package/neural-interface/lib/offline-page.js +54 -0
  772. package/neural-interface/lib/opencode-hidden-models.js +113 -0
  773. package/neural-interface/lib/opencode-history.js +253 -0
  774. package/neural-interface/lib/opencode-runtime-config.js +58 -0
  775. package/neural-interface/lib/opencode-v2-client.js +486 -0
  776. package/neural-interface/lib/opencode-v2-ws-requests.js +955 -0
  777. package/neural-interface/lib/path-confine.js +213 -0
  778. package/neural-interface/lib/plugin-installer.js +264 -0
  779. package/neural-interface/lib/project-storage.js +766 -0
  780. package/neural-interface/lib/pty-host/core.js +603 -0
  781. package/neural-interface/lib/pty-host/flow.js +43 -0
  782. package/neural-interface/lib/pty-host/host.js +47 -0
  783. package/neural-interface/lib/pty-host/manager.js +360 -0
  784. package/neural-interface/lib/pty-host/protocol.js +81 -0
  785. package/neural-interface/lib/pty-host/snapshot.js +133 -0
  786. package/neural-interface/lib/remote-policy.js +582 -0
  787. package/neural-interface/lib/rulesets/api.js +175 -0
  788. package/neural-interface/lib/rulesets/fs-safe.js +245 -0
  789. package/neural-interface/lib/rulesets/installer.js +1453 -0
  790. package/neural-interface/lib/rulesets/json-edit.js +186 -0
  791. package/neural-interface/lib/rulesets/lock.js +170 -0
  792. package/neural-interface/lib/rulesets/managed-text.js +314 -0
  793. package/neural-interface/lib/rulesets/normalise.js +24 -0
  794. package/neural-interface/lib/rulesets/render.js +84 -0
  795. package/neural-interface/lib/schedule-launch-intent.js +40 -0
  796. package/neural-interface/lib/session-cache-builder.js +524 -0
  797. package/neural-interface/lib/session-chunker.js +344 -0
  798. package/neural-interface/lib/session-indexer.js +327 -0
  799. package/neural-interface/lib/session-title-generator.js +232 -0
  800. package/neural-interface/lib/skill-prompt-bridge.js +11 -0
  801. package/neural-interface/lib/style-guide/api.js +375 -0
  802. package/neural-interface/lib/style-guide/color.js +352 -0
  803. package/neural-interface/lib/style-guide/export-css.js +99 -0
  804. package/neural-interface/lib/style-guide/export-dtcg.js +209 -0
  805. package/neural-interface/lib/style-guide/export-tailwind.js +102 -0
  806. package/neural-interface/lib/style-guide/fonts.json +227 -0
  807. package/neural-interface/lib/style-guide/import.js +1268 -0
  808. package/neural-interface/lib/style-guide/pointers.js +103 -0
  809. package/neural-interface/lib/style-guide/presets.js +232 -0
  810. package/neural-interface/lib/style-guide/render-design-md.js +319 -0
  811. package/neural-interface/lib/style-guide/schema.js +848 -0
  812. package/neural-interface/lib/style-guide/security.js +43 -0
  813. package/neural-interface/lib/style-guide/store.js +491 -0
  814. package/neural-interface/lib/style-guide/summary.js +106 -0
  815. package/neural-interface/lib/style-guide/tokens.js +170 -0
  816. package/neural-interface/lib/synabun-update-plan.js +324 -0
  817. package/neural-interface/lib/synabun-version.js +179 -0
  818. package/neural-interface/lib/system-restore.js +99 -0
  819. package/neural-interface/lib/terminal-env.js +86 -0
  820. package/neural-interface/lib/ui-blob-store.js +106 -0
  821. package/neural-interface/lib/vector-cache.js +2 -0
  822. package/neural-interface/lib/virtual-socket.js +60 -0
  823. package/neural-interface/lib/whatsapp/api.js +146 -0
  824. package/neural-interface/lib/whatsapp/auth-store.js +389 -0
  825. package/neural-interface/lib/whatsapp/baileys-adapter.js +457 -0
  826. package/neural-interface/lib/whatsapp/brain.js +128 -0
  827. package/neural-interface/lib/whatsapp/bridge.js +1499 -0
  828. package/neural-interface/lib/whatsapp/cards.js +519 -0
  829. package/neural-interface/lib/whatsapp/commands.js +92 -0
  830. package/neural-interface/lib/whatsapp/config.js +291 -0
  831. package/neural-interface/lib/whatsapp/connector/entry.mjs +25 -0
  832. package/neural-interface/lib/whatsapp/connector/manifest.json +6 -0
  833. package/neural-interface/lib/whatsapp/connector/npm-shrinkwrap.json +717 -0
  834. package/neural-interface/lib/whatsapp/connector/package.json +8 -0
  835. package/neural-interface/lib/whatsapp/fake-baileys.js +444 -0
  836. package/neural-interface/lib/whatsapp/format.js +552 -0
  837. package/neural-interface/lib/whatsapp/host-core.js +1225 -0
  838. package/neural-interface/lib/whatsapp/host.js +119 -0
  839. package/neural-interface/lib/whatsapp/identity.js +288 -0
  840. package/neural-interface/lib/whatsapp/inbound.js +149 -0
  841. package/neural-interface/lib/whatsapp/installer.js +562 -0
  842. package/neural-interface/lib/whatsapp/manager.js +638 -0
  843. package/neural-interface/lib/whatsapp/paths.js +81 -0
  844. package/neural-interface/lib/whatsapp/protocol.js +327 -0
  845. package/neural-interface/lib/whatsapp/qr-svg.js +57 -0
  846. package/neural-interface/lib/whatsapp/redact.js +130 -0
  847. package/neural-interface/lib/whatsapp/service.js +1305 -0
  848. package/neural-interface/lib/whatsapp/vendor/qrcodegen.js +848 -0
  849. package/neural-interface/package-lock.json +4431 -0
  850. package/neural-interface/package.json +58 -27
  851. package/neural-interface/public/apple-touch-icon.png +0 -0
  852. package/neural-interface/public/category-logos/synabun.png +0 -0
  853. package/neural-interface/public/claude.svg +1 -0
  854. package/neural-interface/public/favicon-16x16.png +0 -0
  855. package/neural-interface/public/favicon-32x32.png +0 -0
  856. package/neural-interface/public/icon-192.png +0 -0
  857. package/neural-interface/public/icon-512.png +0 -0
  858. package/neural-interface/public/index.html +32 -182
  859. package/neural-interface/public/index2d.html +2 -2
  860. package/neural-interface/public/install-app.html +31 -0
  861. package/neural-interface/public/logo-synabun.png +0 -0
  862. package/neural-interface/public/logoHD.png +0 -0
  863. package/neural-interface/public/manifest.json +2 -0
  864. package/neural-interface/public/mcp.svg +4 -0
  865. package/neural-interface/public/offline.html +670 -299
  866. package/neural-interface/public/onboarding.html +804 -161
  867. package/neural-interface/public/opencode-logo-dark-square.svg +1 -0
  868. package/neural-interface/public/shared/agent-runtime-options.js +596 -0
  869. package/neural-interface/public/shared/api.js +339 -28
  870. package/neural-interface/public/shared/assistant/asst-accounts.js +318 -0
  871. package/neural-interface/public/shared/assistant/asst-agents-dock.js +296 -0
  872. package/neural-interface/public/shared/assistant/asst-api.js +270 -0
  873. package/neural-interface/public/shared/assistant/asst-brain-picker.js +744 -0
  874. package/neural-interface/public/shared/assistant/asst-budget.js +333 -0
  875. package/neural-interface/public/shared/assistant/asst-composer.js +656 -0
  876. package/neural-interface/public/shared/assistant/asst-computer.js +803 -0
  877. package/neural-interface/public/shared/assistant/asst-control.js +1018 -0
  878. package/neural-interface/public/shared/assistant/asst-hosts.js +262 -0
  879. package/neural-interface/public/shared/assistant/asst-mascot.js +313 -0
  880. package/neural-interface/public/shared/assistant/asst-menu.js +375 -0
  881. package/neural-interface/public/shared/assistant/asst-panel.js +1845 -0
  882. package/neural-interface/public/shared/assistant/asst-rack-styles.js +586 -0
  883. package/neural-interface/public/shared/assistant/asst-render.js +3305 -0
  884. package/neural-interface/public/shared/assistant/asst-route.js +1653 -0
  885. package/neural-interface/public/shared/assistant/asst-roving.js +75 -0
  886. package/neural-interface/public/shared/assistant/asst-sanitize.js +117 -0
  887. package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +488 -0
  888. package/neural-interface/public/shared/assistant/asst-sidepanel.js +675 -0
  889. package/neural-interface/public/shared/assistant/asst-slash.js +258 -0
  890. package/neural-interface/public/shared/assistant/asst-state.js +727 -0
  891. package/neural-interface/public/shared/assistant/asst-styles.js +1686 -0
  892. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +1017 -0
  893. package/neural-interface/public/shared/assistant/asst-usage.js +444 -0
  894. package/neural-interface/public/shared/assistant/asst-ws.js +175 -0
  895. package/neural-interface/public/shared/automation-context.js +75 -0
  896. package/neural-interface/public/shared/blob-store.js +99 -0
  897. package/neural-interface/public/shared/cdx/cdx-capabilities.js +118 -0
  898. package/neural-interface/public/shared/cdx/cdx-cards.js +37 -0
  899. package/neural-interface/public/shared/cdx/cdx-commands.js +171 -0
  900. package/neural-interface/public/shared/cdx/cdx-context-menu.js +402 -0
  901. package/neural-interface/public/shared/cdx/cdx-context-model.js +220 -0
  902. package/neural-interface/public/shared/cdx/cdx-features.js +408 -0
  903. package/neural-interface/public/shared/cdx/cdx-icons.js +89 -0
  904. package/neural-interface/public/shared/cdx/cdx-mcp-app-host.js +414 -0
  905. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.html +6 -0
  906. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.js +56 -0
  907. package/neural-interface/public/shared/cdx/cdx-mcp-app.js +178 -0
  908. package/neural-interface/public/shared/cdx/cdx-model-catalog.js +120 -0
  909. package/neural-interface/public/shared/cdx/cdx-output-model.js +261 -0
  910. package/neural-interface/public/shared/cdx/cdx-output.js +382 -0
  911. package/neural-interface/public/shared/cdx/cdx-panel.js +1372 -0
  912. package/neural-interface/public/shared/cdx/cdx-plan.js +266 -0
  913. package/neural-interface/public/shared/cdx/cdx-protocol.js +682 -0
  914. package/neural-interface/public/shared/cdx/cdx-render.js +3381 -0
  915. package/neural-interface/public/shared/cdx/cdx-requests.js +1136 -0
  916. package/neural-interface/public/shared/cdx/cdx-styles.js +3251 -0
  917. package/neural-interface/public/shared/cdx/cdx-tabs.js +7992 -0
  918. package/neural-interface/public/shared/cdx/cdx-ws.js +363 -0
  919. package/neural-interface/public/shared/cli-status.js +169 -0
  920. package/neural-interface/public/shared/command-runner-model.js +30 -0
  921. package/neural-interface/public/shared/constants.js +22 -5
  922. package/neural-interface/public/shared/cp/cp-agents.js +186 -0
  923. package/neural-interface/public/shared/cp/cp-bash.js +252 -0
  924. package/neural-interface/public/shared/cp/cp-compose.js +159 -0
  925. package/neural-interface/public/shared/cp/cp-context-menu.js +309 -0
  926. package/neural-interface/public/shared/cp/cp-context-model.js +157 -0
  927. package/neural-interface/public/shared/cp/cp-context-window.js +80 -0
  928. package/neural-interface/public/shared/cp/cp-ctx.js +11 -0
  929. package/neural-interface/public/shared/cp/cp-diff.js +255 -0
  930. package/neural-interface/public/shared/cp/cp-event-rows.js +637 -0
  931. package/neural-interface/public/shared/cp/cp-events.js +846 -0
  932. package/neural-interface/public/shared/cp/cp-markdown.js +104 -0
  933. package/neural-interface/public/shared/cp/cp-permission-model.js +905 -0
  934. package/neural-interface/public/shared/cp/cp-permissions.js +626 -0
  935. package/neural-interface/public/shared/cp/cp-rehydrate.js +113 -0
  936. package/neural-interface/public/shared/cp/cp-restore.js +224 -0
  937. package/neural-interface/public/shared/cp/cp-session-model.js +338 -0
  938. package/neural-interface/public/shared/cp/cp-session-settings.js +254 -0
  939. package/neural-interface/public/shared/cp/cp-sessions.js +227 -0
  940. package/neural-interface/public/shared/cp/cp-statusline.js +153 -0
  941. package/neural-interface/public/shared/cp/cp-styles.js +349 -0
  942. package/neural-interface/public/shared/cp/cp-tasks-model.js +282 -0
  943. package/neural-interface/public/shared/cp/cp-tasks.js +107 -0
  944. package/neural-interface/public/shared/cp/cp-temporary-view.js +56 -0
  945. package/neural-interface/public/shared/cp/cp-temporary.js +231 -0
  946. package/neural-interface/public/shared/cp/cp-tool-cards.js +326 -0
  947. package/neural-interface/public/shared/cp/cp-tool-results.js +618 -0
  948. package/neural-interface/public/shared/cp/cp-usage-model.js +124 -0
  949. package/neural-interface/public/shared/graph-activity.js +68 -0
  950. package/neural-interface/public/shared/html-shell.js +116 -17
  951. package/neural-interface/public/shared/i18n.js +132 -34
  952. package/neural-interface/public/shared/node-positions-store.js +44 -0
  953. package/neural-interface/public/shared/ocp-hidden-models.js +116 -0
  954. package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +355 -0
  955. package/neural-interface/public/shared/ocp-v2/ocp-v2-autoaccept-button.js +35 -0
  956. package/neural-interface/public/shared/ocp-v2/ocp-v2-automation-ownership.js +72 -0
  957. package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +280 -0
  958. package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +67 -0
  959. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +179 -0
  960. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes.js +164 -0
  961. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +725 -0
  962. package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +75 -0
  963. package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +1204 -0
  964. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm-logic.js +117 -0
  965. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm.js +59 -0
  966. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-gauge.js +252 -0
  967. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +478 -0
  968. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +179 -0
  969. package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +233 -0
  970. package/neural-interface/public/shared/ocp-v2/ocp-v2-icons.js +30 -0
  971. package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +1065 -0
  972. package/neural-interface/public/shared/ocp-v2/ocp-v2-mention-hints.js +182 -0
  973. package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +655 -0
  974. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +2636 -0
  975. package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +601 -0
  976. package/neural-interface/public/shared/ocp-v2/ocp-v2-profile-inheritance.js +78 -0
  977. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +649 -0
  978. package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +35 -0
  979. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +357 -0
  980. package/neural-interface/public/shared/ocp-v2/ocp-v2-render-logic.js +189 -0
  981. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +1869 -0
  982. package/neural-interface/public/shared/ocp-v2/ocp-v2-select.js +42 -0
  983. package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +117 -0
  984. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +1714 -0
  985. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +468 -0
  986. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-widgets.js +63 -0
  987. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +366 -0
  988. package/neural-interface/public/shared/ocp-v2/ocp-v2-settings-link.js +19 -0
  989. package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +343 -0
  990. package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +746 -0
  991. package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +347 -0
  992. package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +338 -0
  993. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +3543 -0
  994. package/neural-interface/public/shared/ocp-v2/ocp-v2-subagents-logic.js +482 -0
  995. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools-logic.js +351 -0
  996. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools.js +168 -0
  997. package/neural-interface/public/shared/ocp-v2/ocp-v2-variantpicker.js +315 -0
  998. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +545 -0
  999. package/neural-interface/public/shared/provider-icons.js +30 -0
  1000. package/neural-interface/public/shared/pwa-install-page.js +34 -0
  1001. package/neural-interface/public/shared/pwa-install.css +12 -0
  1002. package/neural-interface/public/shared/pwa-install.js +28 -0
  1003. package/neural-interface/public/shared/session-title.js +100 -0
  1004. package/neural-interface/public/shared/settings/settings-ia.js +389 -0
  1005. package/neural-interface/public/shared/settings/settings-kit.js +234 -0
  1006. package/neural-interface/public/shared/settings/settings-rules.js +160 -0
  1007. package/neural-interface/public/shared/settings/settings-search.js +463 -0
  1008. package/neural-interface/public/shared/settings/settings-shell.js +570 -0
  1009. package/neural-interface/public/shared/start-bridge.js +583 -0
  1010. package/neural-interface/public/shared/state.js +5 -0
  1011. package/neural-interface/public/shared/storage.js +50 -7
  1012. package/neural-interface/public/shared/styleguide/sg-agents.js +42 -0
  1013. package/neural-interface/public/shared/styleguide/sg-brand.js +4 -0
  1014. package/neural-interface/public/shared/styleguide/sg-color-client.js +388 -0
  1015. package/neural-interface/public/shared/styleguide/sg-colors.js +151 -0
  1016. package/neural-interface/public/shared/styleguide/sg-components.js +35 -0
  1017. package/neural-interface/public/shared/styleguide/sg-history.js +41 -0
  1018. package/neural-interface/public/shared/styleguide/sg-icons-logo.js +38 -0
  1019. package/neural-interface/public/shared/styleguide/sg-imagery.js +4 -0
  1020. package/neural-interface/public/shared/styleguide/sg-import-export.js +48 -0
  1021. package/neural-interface/public/shared/styleguide/sg-kit.js +284 -0
  1022. package/neural-interface/public/shared/styleguide/sg-labels.js +318 -0
  1023. package/neural-interface/public/shared/styleguide/sg-layout.js +4 -0
  1024. package/neural-interface/public/shared/styleguide/sg-motion.js +5 -0
  1025. package/neural-interface/public/shared/styleguide/sg-panel.js +237 -0
  1026. package/neural-interface/public/shared/styleguide/sg-preview.js +138 -0
  1027. package/neural-interface/public/shared/styleguide/sg-rules.js +9 -0
  1028. package/neural-interface/public/shared/styleguide/sg-shape.js +24 -0
  1029. package/neural-interface/public/shared/styleguide/sg-state.js +132 -0
  1030. package/neural-interface/public/shared/styleguide/sg-typography.js +125 -0
  1031. package/neural-interface/public/shared/styles.css +8614 -1477
  1032. package/neural-interface/public/shared/synabun-mascot.js +1625 -0
  1033. package/neural-interface/public/shared/synabun-ticker.js +376 -0
  1034. package/neural-interface/public/shared/term-ready.js +307 -0
  1035. package/neural-interface/public/shared/term-renderer.js +343 -0
  1036. package/neural-interface/public/shared/ui-assistant-panel.js +10 -0
  1037. package/neural-interface/public/shared/ui-assistant.js +77 -0
  1038. package/neural-interface/public/shared/ui-automation-studio.js +5105 -3573
  1039. package/neural-interface/public/shared/ui-claude-panel.js +11685 -6333
  1040. package/neural-interface/public/shared/ui-codex-panel.js +12 -0
  1041. package/neural-interface/public/shared/ui-command-runner.js +251 -468
  1042. package/neural-interface/public/shared/ui-cost-widget.js +55 -34
  1043. package/neural-interface/public/shared/ui-detail.js +77 -14
  1044. package/neural-interface/public/shared/ui-explorer.js +360 -181
  1045. package/neural-interface/public/shared/ui-file-explorer.js +485 -107
  1046. package/neural-interface/public/shared/ui-help.js +2 -2
  1047. package/neural-interface/public/shared/ui-image-gallery.js +45 -21
  1048. package/neural-interface/public/shared/ui-judgments.js +1346 -0
  1049. package/neural-interface/public/shared/ui-keybinds.js +3 -2
  1050. package/neural-interface/public/shared/ui-link.js +105 -51
  1051. package/neural-interface/public/shared/ui-loading.js +222 -11
  1052. package/neural-interface/public/shared/ui-memory-maintenance.js +111 -0
  1053. package/neural-interface/public/shared/ui-menubar.js +100 -31
  1054. package/neural-interface/public/shared/ui-native-loop-router-state.js +94 -0
  1055. package/neural-interface/public/shared/ui-native-loop-router.js +493 -0
  1056. package/neural-interface/public/shared/ui-native-window-id.js +7 -0
  1057. package/neural-interface/public/shared/ui-navbar.js +357 -222
  1058. package/neural-interface/public/shared/ui-notifications.js +58 -12
  1059. package/neural-interface/public/shared/ui-opencode-panel-v2.js +17 -0
  1060. package/neural-interface/public/shared/ui-panels.js +15 -7
  1061. package/neural-interface/public/shared/ui-resume.js +823 -653
  1062. package/neural-interface/public/shared/ui-schedule-queue.js +172 -0
  1063. package/neural-interface/public/shared/ui-schedules-studio.js +1882 -0
  1064. package/neural-interface/public/shared/ui-scroll-follow.js +194 -0
  1065. package/neural-interface/public/shared/ui-sessions.js +789 -34
  1066. package/neural-interface/public/shared/ui-settings.js +5774 -2194
  1067. package/neural-interface/public/shared/ui-sidepanel-layout.js +109 -0
  1068. package/neural-interface/public/shared/ui-sidepanel-runtime.js +19 -0
  1069. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +40 -0
  1070. package/neural-interface/public/shared/ui-sidepanel-sessions.js +221 -0
  1071. package/neural-interface/public/shared/ui-sidepanel-state.js +131 -0
  1072. package/neural-interface/public/shared/ui-sidepanel-tray.js +547 -0
  1073. package/neural-interface/public/shared/ui-sidepanel-windows.js +387 -0
  1074. package/neural-interface/public/shared/ui-skills.js +18 -32
  1075. package/neural-interface/public/shared/ui-styleguide.js +35 -0
  1076. package/neural-interface/public/shared/ui-sync.js +87 -0
  1077. package/neural-interface/public/shared/ui-terminal.js +7863 -6385
  1078. package/neural-interface/public/shared/ui-tool-updates.js +292 -0
  1079. package/neural-interface/public/shared/ui-tooltip.js +156 -15
  1080. package/neural-interface/public/shared/ui-tutorial-draw.js +119 -683
  1081. package/neural-interface/public/shared/ui-tutorial-layout.js +135 -0
  1082. package/neural-interface/public/shared/ui-tutorial-steps.js +59 -2209
  1083. package/neural-interface/public/shared/ui-tutorial.css +102 -0
  1084. package/neural-interface/public/shared/ui-tutorial.js +557 -1076
  1085. package/neural-interface/public/shared/ui-update.js +420 -68
  1086. package/neural-interface/public/shared/ui-whatsapp.js +941 -0
  1087. package/neural-interface/public/shared/ui-whiteboard.js +1076 -233
  1088. package/neural-interface/public/shared/ui-workspaces.js +2 -1
  1089. package/neural-interface/public/shared/utils.js +58 -0
  1090. package/neural-interface/public/shared/vterm-buffer.js +15 -5
  1091. package/neural-interface/public/shared/whatsapp/wa-phone.js +65 -0
  1092. package/neural-interface/public/shared/whatsapp/wa-view.js +411 -0
  1093. package/neural-interface/public/sidepanel-session.html +18 -0
  1094. package/neural-interface/public/sw.js +10 -2
  1095. package/neural-interface/public/synabun.png +0 -0
  1096. package/neural-interface/public/variant/2d/graph.js +1707 -1635
  1097. package/neural-interface/public/variant/2d/lasso.js +2 -1
  1098. package/neural-interface/public/variant/2d/layout.js +595 -594
  1099. package/neural-interface/public/variant/2d/main.js +557 -521
  1100. package/neural-interface/public/variant/2d/settings-gfx.js +18 -24
  1101. package/neural-interface/public/variant/3d/main.js +517 -500
  1102. package/neural-interface/public/variant/3d/map-controls.js +144 -0
  1103. package/neural-interface/public/variant/3d/map-data.js +251 -0
  1104. package/neural-interface/public/variant/3d/map-labels.js +241 -0
  1105. package/neural-interface/public/variant/3d/map-pick.js +90 -0
  1106. package/neural-interface/public/variant/3d/map-renderer.js +521 -0
  1107. package/neural-interface/public/variant/3d/map-shaders.js +158 -0
  1108. package/neural-interface/public/variant/3d/map-view.js +618 -0
  1109. package/neural-interface/public/vendor/three/manifest.json +3 -0
  1110. package/neural-interface/public/vendor/three/three-0.169.0.min.js +3844 -0
  1111. package/neural-interface/public/vendor/xterm/manifest.json +3 -0
  1112. package/neural-interface/public/vendor/xterm/xterm-6.0.0.css +285 -0
  1113. package/neural-interface/public/vendor/xterm/xterm-6.0.0.min.js +192 -0
  1114. package/neural-interface/scripts/build-vendor.mjs +64 -0
  1115. package/neural-interface/scripts/codex-protocol-fixture.mjs +83 -0
  1116. package/neural-interface/scripts/rebuild-pty.js +39 -22
  1117. package/neural-interface/scripts/vendor-three-entry.js +24 -0
  1118. package/neural-interface/scripts/vendor-xterm-entry.js +8 -0
  1119. package/neural-interface/server.js +33983 -15000
  1120. package/neural-interface/skins/default/skin.css +90 -0
  1121. package/neural-interface/skins/default/skin.json +8 -0
  1122. package/neural-interface/templates/rulesets/README.md +9 -0
  1123. package/neural-interface/templates/rulesets/claude.md +3 -0
  1124. package/neural-interface/templates/rulesets/codex.md +2 -0
  1125. package/neural-interface/templates/rulesets/coexistence.md +6 -0
  1126. package/neural-interface/templates/rulesets/core.md +26 -0
  1127. package/neural-interface/templates/rulesets/cursor.md +2 -0
  1128. package/neural-interface/templates/rulesets/gemini.md +2 -0
  1129. package/neural-interface/templates/rulesets/legacy-hashes.json +227 -0
  1130. package/neural-interface/templates/rulesets/manifest.json +12 -0
  1131. package/neural-interface/templates/rulesets/opencode.md +2 -0
  1132. package/package.json +131 -53
  1133. package/postinstall.js +55 -26
  1134. package/preuninstall.js +187 -0
  1135. package/scripts/restore-data-home-from-backup.mjs +239 -0
  1136. package/setup.js +872 -260
  1137. package/skills/leonardo/SKILL.md +19 -10
  1138. package/skills/leonardo/modules/image-prompter.md +18 -12
  1139. package/skills/leonardo/modules/video-prompter.md +19 -13
  1140. package/skills/synabun/SKILL.md +209 -185
  1141. package/skills/synabun/icon.png +0 -0
  1142. package/skills/synabun/modules/audit.md +380 -374
  1143. package/skills/synabun/modules/changelog.md +15 -6
  1144. package/skills/synabun/modules/idea.md +148 -144
  1145. package/skills/synabun/modules/memorize.md +13 -4
  1146. package/skills/synabun/modules/schedule.md +198 -0
  1147. package/skills/synabun/synabunicon.png +0 -0
  1148. package/updater.cmd +31 -0
  1149. package/updater.mjs +382 -0
  1150. package/updater.sh +29 -0
  1151. package/hooks/claude-code/test-user-learning.mjs +0 -531
  1152. package/neural-interface/public/claude-chat.css +0 -878
  1153. package/neural-interface/public/claude-chat.html +0 -92
  1154. package/neural-interface/public/claude-chat.js +0 -1168
  1155. package/neural-interface/public/index-legacy.html +0 -14677
  1156. package/neural-interface/public/index2d-legacy.html +0 -8193
  1157. package/neural-interface/public/shared/html-term-renderer.js +0 -1022
  1158. package/neural-interface/public/variant/3d/background.js +0 -884
  1159. package/neural-interface/public/variant/3d/camera.js +0 -661
  1160. package/neural-interface/public/variant/3d/gfx.js +0 -116
  1161. package/neural-interface/public/variant/3d/graph.js +0 -2399
  1162. package/neural-interface/public/variant/3d/settings-gfx.js +0 -228
  1163. package/neural-interface/templates/CLAUDE-template.md +0 -211
@@ -0,0 +1,846 @@
1
+ // ── SDK event → view model (DOM-free) ──
2
+ // The monolith's handleTabEvent keeps the events that drive tab state (init,
3
+ // assistant, stream deltas, tool results, result accounting). Everything else an
4
+ // SDK session can emit is read here into a plain description; cp-event-rows.js
5
+ // turns that description into DOM. Nothing in this file touches the document, so
6
+ // tests import it directly (tests/claude-panel-events.test.mjs).
7
+
8
+ const clip = (s, n) => {
9
+ const t = String(s ?? '');
10
+ return t.length > n ? `${t.slice(0, n - 1)}…` : t;
11
+ };
12
+
13
+ // ── Engine hello ──
14
+
15
+ /**
16
+ * The connection's first message: whether the SDK bridge answers, and what it
17
+ * can do. It is the only engine: a server that answers with anything else (one
18
+ * that was not restarted and still has the retired per-turn engine selected)
19
+ * is a tab without an engine, and says so.
20
+ */
21
+ export function readEngineHello(msg) {
22
+ const engine = String(msg?.engine || '');
23
+ const sdk = engine === 'sdk';
24
+ return {
25
+ engine,
26
+ sdk,
27
+ unavailable: !sdk,
28
+ error: sdk ? '' : (engine === 'unavailable'
29
+ ? String(msg?.error || 'the engine did not start')
30
+ : `the server answered with ${engine ? `the retired "${engine}" engine` : 'no engine'}. Restart the SynaBun server.`),
31
+ sdkVersion: msg?.sdkVersion || '',
32
+ // A server that has not been restarted since the panel was updated sends no
33
+ // list: every capability-gated feature stays hidden.
34
+ capabilities: Array.isArray(msg?.capabilities) ? msg.capabilities.filter(c => typeof c === 'string') : [],
35
+ };
36
+ }
37
+
38
+ export function hasCapability(tab, name) {
39
+ return !!tab?.capabilities && typeof tab.capabilities.has === 'function' && tab.capabilities.has(name);
40
+ }
41
+
42
+ // ── Slash commands: the panel or the CLI ──
43
+ // A typed "/cmd" is either answered by the panel or sent on as a prompt, where
44
+ // the CLI runs its own implementation. Before the parity build the CLI ran
45
+ // every command the panel had no entry for, and the ones below; a local handler
46
+ // that needs bridge support must not take a command away from a server that
47
+ // does not have that support yet (public/ reloads before lib/ restarts).
48
+ const CLI_NATIVE = new Set(['init', 'doctor']);
49
+ const LOCAL_NEEDS = { context: 'session_requests', mcp: 'session_requests', 'add-dir': 'session_settings' };
50
+
51
+ /**
52
+ * 'cli' (send the text through) or 'local' (the panel's handler answers).
53
+ * @param spec the panel's own entry for the command (may carry `needs`), or null
54
+ */
55
+ export function slashCommandRoute(cmd, spec, { has = () => false } = {}) {
56
+ if (!spec) return 'cli';
57
+ if (CLI_NATIVE.has(cmd)) return 'cli';
58
+ const needs = spec.needs || LOCAL_NEEDS[cmd];
59
+ return needs && !has(needs) ? 'cli' : 'local';
60
+ }
61
+
62
+ // ── Prompt buffering ──
63
+ // While a permission card, a question or an elicitation waits for the user,
64
+ // the tab holds every incoming message so nothing renders past the prompt.
65
+ // The messages that *resolve* a prompt must not be held, or the card waits for
66
+ // itself: a new or cancelled control request, a reattach, and the MCP server's
67
+ // confirmation that a URL elicitation was completed in the browser.
68
+ export function bypassesPromptBuffer(msg) {
69
+ const type = msg?.type;
70
+ if (type === 'control_request' || type === 'control_cancelled' || type === 'reattach_result') return true;
71
+ return type === 'event' && msg.event?.type === 'system' && msg.event?.subtype === 'elicitation_complete';
72
+ }
73
+
74
+ // ── Session state ──
75
+ // `idle` is the CLI saying the turn is over. Normally the tab has finished by
76
+ // then (the result arrived). If it still shows a turn running a few seconds
77
+ // later, with nothing received since and no prompt waiting for the user, the
78
+ // message that ends it was lost: the tab is released instead of spinning on.
79
+ export function idleEndsTurn(tab, activityWhenIdle) {
80
+ if (!tab || tab.closed || !tab.running) return false;
81
+ if (tab.sessionState !== 'idle') return false;
82
+ if (tab._activePerm || tab.pendingAskRequestId || tab._msgBuffer?.length) return false;
83
+ return tab._lastWsActivity === activityWhenIdle;
84
+ }
85
+
86
+ // ── Turn results ──
87
+
88
+ const TERMINAL_REASONS = {
89
+ blocking_limit: 'the context is full and could not be compacted',
90
+ rapid_refill_breaker: 'the context kept refilling right after compaction',
91
+ prompt_too_long: 'the prompt is too long for the model',
92
+ image_error: 'an image could not be processed',
93
+ model_error: 'the model returned an error',
94
+ api_error: 'the API returned an error',
95
+ malformed_tool_use_exhausted: 'the model kept sending malformed tool calls',
96
+ stop_hook_prevented: 'a Stop hook blocked the turn from ending',
97
+ hook_stopped: 'a hook stopped the turn',
98
+ tool_deferred: 'a tool call was deferred',
99
+ tool_deferred_unavailable: 'a deferred tool is no longer available',
100
+ max_turns: 'the turn limit was reached',
101
+ budget_exhausted: 'the spend limit was reached',
102
+ structured_output_retry_exhausted: 'structured output could not be produced',
103
+ turn_setup_failed: 'the turn could not be set up',
104
+ };
105
+
106
+ const STARTUP_FAILURES = {
107
+ org_pin_api_key_conflict: 'Managed settings require an organization sign-in, but an API key is configured.',
108
+ provider_not_allowed: 'Managed settings do not allow the API provider this session is set up for.',
109
+ org_verify_failed: "The sign-in's organization could not be verified. Check the network, then sign in again.",
110
+ org_pin_mismatch: 'This sign-in belongs to an organization the managed settings do not allow.',
111
+ managed_settings_invalid: 'Managed policy settings could not be read or leave no allowed model.',
112
+ remote_settings_required_unavailable: 'Managed settings the organization requires could not be loaded.',
113
+ gateway_signin_required: 'The Cloud gateway ended this sign-in. Sign in again.',
114
+ gateway_access_denied: 'The Cloud gateway refused managed settings for this account.',
115
+ proxy_invalid: 'A proxy setting is not a complete URL.',
116
+ temp_dir_unusable: 'The temp directory is unsafe or could not be created.',
117
+ cwd_unavailable: 'The working directory was deleted, moved or cannot be read. Pick another project.',
118
+ shell_tool_missing: 'No shell tool is available (Git Bash or PowerShell).',
119
+ session_held_by_background: 'This conversation is running as a background session. Stop it there first.',
120
+ worktree_resume_refused: "The session's worktree failed its safety checks.",
121
+ worktree_unverified: "The session's worktree could not be verified right now. Retrying may work.",
122
+ cli_version_too_old: 'This Claude Code version is below the minimum Anthropic requires. Update Claude Code.',
123
+ bypass_root: 'Bypass permissions mode cannot run as root.',
124
+ };
125
+
126
+ /**
127
+ * Why a turn ended. `text` is what the transcript shows for a failed turn
128
+ * (empty when there is nothing to add), `notify` what the notification should be.
129
+ * @param ev an SDK result message
130
+ * @param ctx { recentlyAborted, assistantErrorShown }
131
+ */
132
+ export function describeResult(ev, ctx = {}) {
133
+ const subtype = String(ev?.subtype || '');
134
+ const reason = String(ev?.terminal_reason || '');
135
+ const errors = (Array.isArray(ev?.errors) ? ev.errors : []).map(e => String(e ?? '').trim()).filter(Boolean);
136
+ const out = { isError: false, aborted: false, text: '', notify: 'done', subtype, reason };
137
+
138
+ if (subtype === 'success' || subtype === '') {
139
+ if (ev?.is_error === true) {
140
+ // The turn ended on an API error. The CLI also delivers that text as a
141
+ // synthetic assistant message; do not print it twice.
142
+ out.isError = true;
143
+ out.notify = 'error';
144
+ if (!ctx.assistantErrorShown) out.text = clip(String(ev.result || 'The turn ended with an API error.').trim(), 1200);
145
+ }
146
+ return out;
147
+ }
148
+
149
+ // The result an interrupt produces: the tab already says "Aborted."
150
+ if (reason.startsWith('aborted') || (ctx.recentlyAborted && !errors.length && !ev?.error && !ev?.startup_failure_reason)) {
151
+ out.aborted = true;
152
+ out.notify = 'none';
153
+ return out;
154
+ }
155
+
156
+ out.isError = true;
157
+ out.notify = 'error';
158
+ let head;
159
+ if (subtype === 'error_max_turns') {
160
+ head = `Stopped: the turn limit was reached${Number(ev?.num_turns) > 0 ? ` (${ev.num_turns} turns)` : ''}.`;
161
+ } else if (subtype === 'error_max_budget_usd') {
162
+ head = `Stopped: the session's spend limit was reached${Number(ev?.total_cost_usd) > 0 ? ` ($${Number(ev.total_cost_usd).toFixed(2)} so far)` : ''}.`;
163
+ } else if (subtype === 'error_max_structured_output_retries') {
164
+ head = 'Stopped: structured output could not be produced after several retries.';
165
+ } else if (ev?.startup_failure_reason) {
166
+ head = `Claude Code did not start: ${STARTUP_FAILURES[ev.startup_failure_reason] || ev.startup_failure_reason}`;
167
+ } else if (TERMINAL_REASONS[reason]) {
168
+ head = `The turn stopped: ${TERMINAL_REASONS[reason]}.`;
169
+ } else if (errors.length || ev?.error || ev?.result) {
170
+ head = '';
171
+ } else {
172
+ head = `The turn ended with an error${reason ? ` (${reason})` : ''}.`;
173
+ }
174
+ // `error` and a string `result` are not SDK fields on an error result; the
175
+ // bridge and older engines still send them.
176
+ const detail = errors.length
177
+ ? errors.slice(0, 3).map(e => clip(e, 600))
178
+ : [ev?.error, typeof ev?.result === 'string' ? ev.result : ''].map(e => String(e || '').trim()).filter(Boolean).slice(0, 1).map(e => clip(e, 600));
179
+ const lines = [head, ...detail.filter(d => d && d !== head)].filter(Boolean);
180
+ if (errors.length > 3) lines.push(`(+${errors.length - 3} more)`);
181
+ out.text = lines.join('\n');
182
+ return out;
183
+ }
184
+
185
+ // ── Formatting ──
186
+
187
+ export function fmtTokens(n) {
188
+ const v = Number(n) || 0;
189
+ const trim = (x) => x.replace(/\.0$/, '');
190
+ if (v >= 1_000_000) return `${trim((v / 1_000_000).toFixed(v >= 10_000_000 ? 0 : 1))}M`;
191
+ if (v >= 1000) return `${trim((v / 1000).toFixed(v >= 100_000 ? 0 : 1))}k`;
192
+ return String(Math.round(v));
193
+ }
194
+
195
+ export function fmtDuration(ms) {
196
+ const v = Number(ms);
197
+ if (!Number.isFinite(v) || v < 0) return '';
198
+ if (v < 1000) return `${Math.round(v)}ms`;
199
+ const s = v / 1000;
200
+ if (s < 60) return `${s.toFixed(s < 10 ? 1 : 0)}s`;
201
+ const m = Math.floor(s / 60);
202
+ if (m < 60) return `${m}m ${String(Math.floor(s % 60)).padStart(2, '0')}s`;
203
+ return `${Math.floor(m / 60)}h ${String(m % 60).padStart(2, '0')}m`;
204
+ }
205
+
206
+ /** A reset time as the user reads it: "14:30", or "Mon 14:30" when it is another day. */
207
+ export function fmtResetTime(at, now = Date.now()) {
208
+ let ms = Number(at);
209
+ if (!Number.isFinite(ms) || ms <= 0) return '';
210
+ if (ms < 1e12) ms *= 1000; // the API reports seconds
211
+ const d = new Date(ms);
212
+ const pad = (x) => String(x).padStart(2, '0');
213
+ const clock = `${pad(d.getHours())}:${pad(d.getMinutes())}`;
214
+ const today = new Date(now);
215
+ const sameDay = d.getFullYear() === today.getFullYear() && d.getMonth() === today.getMonth() && d.getDate() === today.getDate();
216
+ return sameDay ? clock : `${['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'][d.getDay()]} ${clock}`;
217
+ }
218
+
219
+ // CLI output meant for a terminal: drop the colour codes.
220
+ export function stripAnsi(s) {
221
+ // eslint-disable-next-line no-control-regex
222
+ return String(s ?? '').replace(/\u001b\[[0-9;?]*[ -/]*[@-~]/g, '');
223
+ }
224
+
225
+ // ── Turn footer (duration, steps, per-model usage and cost) ──
226
+
227
+ const USAGE_FIELDS = ['inputTokens', 'outputTokens', 'cacheReadInputTokens', 'cacheCreationInputTokens', 'thinkingTokens', 'webSearchRequests', 'costUSD'];
228
+
229
+ /**
230
+ * result.modelUsage is cumulative for the CLI process. The turn's own share is
231
+ * the difference from the previous result; a counter that went down means the
232
+ * process was replaced (or /clear reset it), and then the new value is the share.
233
+ */
234
+ export function turnModelUsage(modelUsage, prev = {}) {
235
+ const models = [];
236
+ const next = {};
237
+ for (const [model, cur] of Object.entries(modelUsage && typeof modelUsage === 'object' ? modelUsage : {})) {
238
+ if (!cur || typeof cur !== 'object') continue;
239
+ const before = prev?.[model] || {};
240
+ const snapshot = {};
241
+ const delta = {};
242
+ let reset = false;
243
+ for (const f of USAGE_FIELDS) {
244
+ snapshot[f] = Number(cur[f]) || 0;
245
+ delta[f] = snapshot[f] - (Number(before[f]) || 0);
246
+ if (delta[f] < -1e-9) reset = true;
247
+ }
248
+ if (reset) for (const f of USAGE_FIELDS) delta[f] = snapshot[f];
249
+ next[model] = snapshot;
250
+ const input = delta.inputTokens + delta.cacheReadInputTokens + delta.cacheCreationInputTokens;
251
+ if (input <= 0 && delta.outputTokens <= 0 && delta.costUSD <= 0) continue;
252
+ models.push({
253
+ model,
254
+ input,
255
+ uncachedInput: delta.inputTokens,
256
+ cacheRead: delta.cacheReadInputTokens,
257
+ cacheWrite: delta.cacheCreationInputTokens,
258
+ output: delta.outputTokens,
259
+ thinking: delta.thinkingTokens,
260
+ webSearches: delta.webSearchRequests,
261
+ cost: delta.costUSD,
262
+ costBasis: cur.costBasis || '',
263
+ });
264
+ }
265
+ models.sort((a, b) => b.cost - a.cost || b.output - a.output);
266
+ return { models, next };
267
+ }
268
+
269
+ const shortModel = (id) => String(id || '').replace(/^claude-/, '').replace(/-\d{8}$/, '');
270
+
271
+ /**
272
+ * The line under a finished turn. `text` is empty when the result carries
273
+ * nothing worth a row; `next` is the usage snapshot to pass as `prev` next time.
274
+ */
275
+ export function describeTurnFooter(ev, prev = {}, ctx = {}) {
276
+ const usage = turnModelUsage(ev?.modelUsage, prev || {});
277
+ const next = usage.next;
278
+ // A resumed session's first result already carries the earlier turns, and
279
+ // there is no previous result to subtract: say nothing about tokens or cost.
280
+ const models = ctx.noBaseline ? [] : usage.models;
281
+ const parts = [];
282
+ const duration = fmtDuration(ev?.duration_ms);
283
+ if (duration && Number(ev?.duration_ms) > 0) parts.push(duration);
284
+ const steps = Number(ev?.num_turns) || 0;
285
+ if (steps > 1) parts.push(`${steps} steps`);
286
+ if (models.length === 1) {
287
+ const m = models[0];
288
+ parts.push(`${shortModel(m.model)} ${fmtTokens(m.input)} in · ${fmtTokens(m.output)} out`);
289
+ } else if (models.length > 1) {
290
+ parts.push(`${models.length} models ${fmtTokens(models.reduce((n, m) => n + m.input, 0))} in · ${fmtTokens(models.reduce((n, m) => n + m.output, 0))} out`);
291
+ }
292
+ const cost = models.reduce((n, m) => n + m.cost, 0);
293
+ if (cost > 0) parts.push(`$${cost < 0.01 ? cost.toFixed(4) : cost.toFixed(2)}`);
294
+ if (ev?.fast_mode_state === 'on') parts.push('fast mode');
295
+ else if (ev?.fast_mode_state === 'cooldown') parts.push('fast mode cooling down');
296
+ const stop = ev?.stop_reason || ctx.stopReason || '';
297
+ if (stop === 'max_tokens') parts.push('cut off at the output limit');
298
+ const title = models.map((m) => {
299
+ const bits = [`${m.model}: ${m.uncachedInput.toLocaleString('en-US')} input`];
300
+ if (m.cacheRead) bits.push(`${m.cacheRead.toLocaleString('en-US')} cache read`);
301
+ if (m.cacheWrite) bits.push(`${m.cacheWrite.toLocaleString('en-US')} cache write`);
302
+ bits.push(`${m.output.toLocaleString('en-US')} output`);
303
+ if (m.thinking > 0) bits.push(`${m.thinking.toLocaleString('en-US')} of it thinking`);
304
+ if (m.webSearches > 0) bits.push(`${m.webSearches} web search${m.webSearches === 1 ? '' : 'es'}`);
305
+ if (m.cost > 0) bits.push(`$${m.cost.toFixed(4)}${m.costBasis && m.costBasis !== 'list' ? ` (${m.costBasis} pricing)` : ''}`);
306
+ return bits.join(', ');
307
+ }).join('\n');
308
+ return { text: parts.join(' · '), title, models, cost, next };
309
+ }
310
+
311
+ /** A pass-through slash command that answered only through the result text. */
312
+ export function localCommandOutput(ev) {
313
+ if (!ev || ev.subtype !== 'success' || ev.is_error) return '';
314
+ if (typeof ev.local_command !== 'string' || !ev.local_command) return '';
315
+ return typeof ev.result === 'string' ? stripAnsi(ev.result).trim() : '';
316
+ }
317
+
318
+ // ── Compaction ──
319
+
320
+ export function describeCompactBoundary(ev) {
321
+ const m = ev?.compact_metadata || {};
322
+ const pre = Number(m.pre_tokens) || 0;
323
+ const post = Number(m.post_tokens) || 0;
324
+ let text = `Context compacted${m.trigger === 'auto' ? ' automatically' : ''}`;
325
+ if (pre > 0 && post > 0) text += `: ${fmtTokens(pre)} → ${fmtTokens(post)} tokens`;
326
+ else if (pre > 0) text += `: was ${fmtTokens(pre)} tokens`;
327
+ if (Number(m.duration_ms) > 0) text += ` in ${fmtDuration(m.duration_ms)}`;
328
+ return text;
329
+ }
330
+
331
+ // ── Rate limits ──
332
+
333
+ const LIMIT_NAMES = {
334
+ five_hour: '5-hour limit',
335
+ seven_day: 'weekly limit',
336
+ seven_day_opus: 'weekly Opus limit',
337
+ seven_day_sonnet: 'weekly Sonnet limit',
338
+ seven_day_overage_included: 'weekly limit',
339
+ overage: 'extra usage limit',
340
+ };
341
+ const LIMIT_PILLS = { five_hour: '5h', seven_day: '7d', seven_day_opus: '7d Opus', seven_day_sonnet: '7d Sonnet', seven_day_overage_included: '7d', overage: 'extra' };
342
+
343
+ /** Read a rate_limit_event into a statusline pill and a transcript line. */
344
+ export function describeRateLimit(info, now = Date.now()) {
345
+ const i = info && typeof info === 'object' ? info : {};
346
+ const name = LIMIT_NAMES[i.rateLimitType] || 'usage limit';
347
+ const short = LIMIT_PILLS[i.rateLimitType] || 'limit';
348
+ const resets = fmtResetTime(i.resetsAt, now);
349
+ let pct = Number(i.utilization);
350
+ if (Number.isFinite(pct)) pct = Math.round(pct <= 1 ? pct * 100 : pct); else pct = null;
351
+ const overage = i.isUsingOverage === true || i.overageInUse === true;
352
+ const key = `${i.rateLimitType || ''}:${i.status || ''}:${overage ? 'overage' : ''}`;
353
+ const tail = resets ? ` Resets ${resets}.` : '';
354
+
355
+ if (i.status === 'rejected') {
356
+ let text = `You've hit your ${name}.${tail}`;
357
+ if (i.overageStatus === 'rejected') text += ' Extra usage is not available.';
358
+ else if (overage) text += ' Extra usage is covering requests.';
359
+ if (i.errorCode === 'credits_required') text += ' Usage credits are required to continue.';
360
+ return { level: 'blocked', pill: `${short} limit${resets ? ` · ${resets}` : ''}`, text, key };
361
+ }
362
+ if (i.status === 'allowed_warning') {
363
+ return {
364
+ level: 'warn',
365
+ pill: `${short}${pct != null ? ` ${pct}%` : ''}`,
366
+ text: `Approaching your ${name}${pct != null ? `: ${pct}% used` : ''}.${tail}`,
367
+ key,
368
+ };
369
+ }
370
+ if (overage) {
371
+ return { level: 'warn', pill: 'extra usage', text: `Now using extra usage: your ${name} is used up.${tail}`, key };
372
+ }
373
+ return { level: 'ok', pill: '', text: '', key };
374
+ }
375
+
376
+ // The CLI's own limit sentences arrive as ordinary assistant text. These are the
377
+ // prefixes the SDK exports for recognising them (sdk.d.ts USAGE_*_PREFIXES,
378
+ // ORG_POLICY_LIMIT_PREFIXES); a host cannot import the SDK into a browser page.
379
+ const USAGE_LIMIT_ERROR_PREFIXES = ["You've hit your", "You've reached your", "You're out of usage credits", 'Your org is out of usage · add funds to continue', 'Your org is out of usage · contact your admin', "Your seat type doesn't include usage credits", "Your seat type doesn't include usage", 'Your usage allocation has been disabled by your admin', "Your group's usage limit is set to $0", 'Fable 5 requires usage credits', "You're out of extra usage", "Your seat type doesn't include extra usage"];
380
+ const USAGE_TRANSITION_PREFIXES = ["You're now using usage credits", "You're now using your usage allocation", 'Now using your usage allocation', 'Now using usage credits', "You're now using extra usage", 'Now using extra usage'];
381
+ const USAGE_WARNING_PREFIXES = ["You've used", "You're close to"];
382
+ const ORG_POLICY_LIMIT_PREFIXES = ['This service is disabled for your org'];
383
+
384
+ /** `blocked` | `warn` | `notice` for a limit sentence, else ''. */
385
+ export function classifyLimitText(text) {
386
+ const t = String(text || '').trimStart();
387
+ if (!t) return '';
388
+ const starts = (list) => list.some(p => t.startsWith(p));
389
+ if (starts(USAGE_LIMIT_ERROR_PREFIXES) || starts(ORG_POLICY_LIMIT_PREFIXES)) return 'blocked';
390
+ if (starts(USAGE_WARNING_PREFIXES)) return 'warn';
391
+ if (starts(USAGE_TRANSITION_PREFIXES)) return 'notice';
392
+ return '';
393
+ }
394
+
395
+ // ── Assistant message state ──
396
+
397
+ const ASSISTANT_ERRORS = {
398
+ authentication_failed: ['Not signed in', 'The sign-in is missing or expired. Run `claude` in a terminal and use /login, then send again.'],
399
+ oauth_org_not_allowed: ['Organization not allowed', "This sign-in's organization is not allowed to use Claude Code here."],
400
+ account_on_hold: ['Account on hold', 'The account is on hold. Check billing on claude.ai.'],
401
+ verification_required: ['Verification required', 'Finish the account verification on claude.ai, then send again.'],
402
+ billing_error: ['Billing problem', 'Check the payment method or the remaining credits.'],
403
+ rate_limit: ['Rate limited', 'Wait for the limit to reset, or switch to another model.'],
404
+ overloaded: ['API overloaded', 'The API is overloaded. Send again in a moment.'],
405
+ invalid_request: ['Request rejected', 'The API rejected the request as invalid.'],
406
+ model_not_found: ['Model not available', 'This model is not available to the account. Pick another model.'],
407
+ server_error: ['API error', 'The API had a server error. Send again in a moment.'],
408
+ max_output_tokens: ['Output limit reached', 'The reply hit the output limit and was cut off.'],
409
+ cloud_credential_error: ['Cloud credentials', 'The cloud provider credentials are missing or expired.'],
410
+ unknown: ['Error', ''],
411
+ };
412
+
413
+ const blockText = (message) => (Array.isArray(message?.content) ? message.content : [])
414
+ .filter(b => b?.type === 'text').map(b => b.text || '').join('\n');
415
+
416
+ /** What the wrapper of an assistant message says beyond its content blocks. */
417
+ export function describeAssistantState(ev) {
418
+ const message = ev?.message || {};
419
+ const out = { error: null, aborted: ev?.aborted === true, truncated: message.stop_reason === 'max_tokens', timestamp: '', limit: '', uuid: ev?.uuid || '', supersedes: [] };
420
+ if (ev?.error) {
421
+ const [title, hint] = ASSISTANT_ERRORS[ev.error] || [String(ev.error).replace(/_/g, ' '), ''];
422
+ out.error = { kind: String(ev.error), title, hint };
423
+ if (ev.error === 'max_output_tokens') out.truncated = true;
424
+ }
425
+ if (typeof ev?.timestamp === 'string' && !Number.isNaN(Date.parse(ev.timestamp))) out.timestamp = ev.timestamp;
426
+ if (Array.isArray(ev?.supersedes)) out.supersedes = ev.supersedes.filter(u => typeof u === 'string');
427
+ // Limit sentences come as synthetic messages (no real model behind them).
428
+ if (ev?.error || message.model === '<synthetic>') out.limit = classifyLimitText(blockText(message));
429
+ return out;
430
+ }
431
+
432
+ const httpUrl = (u) => (typeof u === 'string' && /^https?:\/\//i.test(u) ? u : '');
433
+
434
+ /**
435
+ * The blocks of an assistant message the three classic kinds (text, thinking,
436
+ * tool_use) do not cover: server-side tool calls and their results, citations
437
+ * on text, redacted thinking.
438
+ */
439
+ export function splitAssistantBlocks(content) {
440
+ const out = { serverTools: [], serverResults: [], citations: [], redacted: 0, any: false };
441
+ const seen = new Set();
442
+ for (const b of Array.isArray(content) ? content : []) {
443
+ if (!b || typeof b !== 'object') continue;
444
+ if (b.type === 'redacted_thinking') { out.redacted++; continue; }
445
+ if (b.type === 'server_tool_use' || b.type === 'mcp_tool_use') {
446
+ if (b.id) out.serverTools.push({ id: b.id, name: b.server_name ? `${b.server_name}: ${b.name}` : String(b.name || 'server tool'), input: b.input && typeof b.input === 'object' ? b.input : {} });
447
+ continue;
448
+ }
449
+ if (typeof b.type === 'string' && b.type !== 'tool_result' && b.type.endsWith('_tool_result') && b.tool_use_id) {
450
+ const links = [];
451
+ const texts = [];
452
+ let isError = b.is_error === true;
453
+ const visit = (c) => {
454
+ if (c == null) return;
455
+ if (typeof c === 'string') { if (c.trim()) texts.push(c.trim()); return; }
456
+ if (Array.isArray(c)) { c.forEach(visit); return; }
457
+ if (typeof c !== 'object') return;
458
+ if (c.error_code) { isError = true; texts.push(`Error: ${c.error_code}`); return; }
459
+ const url = httpUrl(c.url);
460
+ if (url) { links.push({ title: String(c.title || url), url }); return; }
461
+ for (const k of ['text', 'stdout', 'stderr']) if (typeof c[k] === 'string' && c[k].trim()) texts.push(c[k].trim());
462
+ if (c.content != null) visit(c.content);
463
+ };
464
+ visit(b.content);
465
+ out.serverResults.push({ toolUseId: b.tool_use_id, kind: b.type, links, text: clip(texts.join('\n'), 4000), isError });
466
+ continue;
467
+ }
468
+ if (b.type === 'text' && Array.isArray(b.citations)) {
469
+ for (const c of b.citations) {
470
+ const url = httpUrl(c?.url);
471
+ const title = String(c?.title || c?.document_title || url || '').trim();
472
+ const key = url || title;
473
+ if (!key || seen.has(key)) continue;
474
+ seen.add(key);
475
+ out.citations.push({ title: title || url, url });
476
+ }
477
+ }
478
+ }
479
+ out.any = out.redacted > 0 || out.serverTools.length > 0 || out.serverResults.length > 0 || out.citations.length > 0;
480
+ return out;
481
+ }
482
+
483
+ // ── Streaming tool input ──
484
+
485
+ const PREVIEW_KEYS = ['command', 'file_path', 'notebook_path', 'pattern', 'url', 'query', 'description', 'skill', 'path', 'prompt'];
486
+
487
+ /**
488
+ * What a tool call is about, read from the JSON the model has typed so far
489
+ * (input_json_delta). The JSON is incomplete by definition: pull the first
490
+ * telling string field out with a tolerant match instead of parsing it.
491
+ */
492
+ export function previewPartialToolInput(partialJson) {
493
+ const src = String(partialJson || '');
494
+ for (const key of PREVIEW_KEYS) {
495
+ const m = src.match(new RegExp(`"${key}"\\s*:\\s*"((?:[^"\\\\]|\\\\.)*)`));
496
+ if (!m || !m[1]) continue;
497
+ let value = m[1];
498
+ try { value = JSON.parse(`"${value.replace(/\\$/, '')}"`); } catch { value = value.replace(/\\n/g, ' ').replace(/\\(.)/g, '$1'); }
499
+ value = String(value).split('\n')[0].trim();
500
+ if (!value) continue;
501
+ if (key === 'file_path' || key === 'notebook_path' || key === 'path') value = value.split(/[/\\]/).pop() || value;
502
+ return { key, value: clip(value, 60) };
503
+ }
504
+ return null;
505
+ }
506
+
507
+ // ── Slash commands ──
508
+
509
+ /**
510
+ * The CLI's command list as the hint menu uses it. Rows can share a name: the
511
+ * one marked `builtin` is the one `/name` runs. Commands whose UX is bound to
512
+ * the terminal (init.terminal_slash_commands) are left out.
513
+ */
514
+ export function normalizeSlashCommands(list, { terminalOnly = [] } = {}) {
515
+ const hidden = new Set((Array.isArray(terminalOnly) ? terminalOnly : []).map(n => String(n).replace(/^\//, '').toLowerCase()));
516
+ const byName = new Map();
517
+ for (const raw of Array.isArray(list) ? list : []) {
518
+ const c = typeof raw === 'string' ? { name: raw } : raw;
519
+ if (!c?.name) continue;
520
+ const name = String(c.name).replace(/^\//, '');
521
+ const key = name.toLowerCase();
522
+ if (hidden.has(key)) continue;
523
+ const row = {
524
+ name,
525
+ description: c.description || 'CLI command',
526
+ argumentHint: c.argumentHint || c.argument_hint || '',
527
+ aliases: (Array.isArray(c.aliases) ? c.aliases : []).map(a => String(a).replace(/^\//, '')).filter(Boolean),
528
+ builtin: c.builtin === true,
529
+ };
530
+ const existing = byName.get(key);
531
+ if (!existing || (row.builtin && !existing.builtin)) byName.set(key, row);
532
+ }
533
+ return [...byName.values()];
534
+ }
535
+
536
+ /** Commands whose name or alias starts with what was typed; `via` names the alias that matched. */
537
+ export function matchSlashCommands(list, typed) {
538
+ const q = String(typed || '').toLowerCase();
539
+ if (!q) return [];
540
+ const out = [];
541
+ for (const c of Array.isArray(list) ? list : []) {
542
+ const name = String(c?.name || '').toLowerCase();
543
+ if (!name) continue;
544
+ if (name.startsWith(q)) { out.push({ ...c, via: '' }); continue; }
545
+ const alias = (c.aliases || []).find(a => String(a).toLowerCase().startsWith(q));
546
+ if (alias) out.push({ ...c, via: alias });
547
+ }
548
+ return out;
549
+ }
550
+
551
+ /** A bare "/" lists every command, as the CLI does: one row per name, in list order. */
552
+ export function listSlashCommands(list) {
553
+ const out = [];
554
+ const seen = new Set();
555
+ for (const c of Array.isArray(list) ? list : []) {
556
+ const name = String(c?.name || '').toLowerCase();
557
+ if (!name || seen.has(name)) continue;
558
+ seen.add(name);
559
+ out.push({ ...c, via: '' });
560
+ }
561
+ return out;
562
+ }
563
+
564
+ /**
565
+ * How tall the slash menu may be: `room` is the space between the top of the
566
+ * panel and the input the menu opens above. The whole list scrolls inside that,
567
+ * so it never leaves the panel; two rows stay visible in the shortest panel.
568
+ */
569
+ export function slashMenuMaxHeight(room, { cap = 320, floor = 72, gap = 8 } = {}) {
570
+ const r = Number(room);
571
+ if (!Number.isFinite(r) || r <= 0) return cap; // not laid out (hidden panel): the stylesheet's cap
572
+ return Math.max(floor, Math.min(cap, Math.floor(r - gap)));
573
+ }
574
+
575
+ /**
576
+ * The panel's own commands a server can serve, and the ones that wait for its
577
+ * restart (their `needs` capability is not advertised).
578
+ */
579
+ export function splitCommandsByCapability(commands, has = () => false) {
580
+ const available = [];
581
+ const locked = [];
582
+ for (const c of Array.isArray(commands) ? commands : []) (c?.needs && !has(c.needs) ? locked : available).push(c);
583
+ return { available, locked };
584
+ }
585
+
586
+ // ── Session info (init) ──
587
+
588
+ /** The fields of system/init the status card and the slash menu read. */
589
+ export function readInit(ev) {
590
+ const list = (v) => (Array.isArray(v) ? v : []);
591
+ return {
592
+ model: ev?.model || '',
593
+ cliVersion: ev?.claude_code_version || '',
594
+ cwd: ev?.cwd || '',
595
+ apiKeySource: ev?.apiKeySource || '',
596
+ outputStyle: ev?.output_style || '',
597
+ permissionMode: ev?.permissionMode || '',
598
+ effort: ev?.effort ?? null,
599
+ fastMode: ev?.fast_mode_state || '',
600
+ tools: list(ev?.tools).length,
601
+ skills: list(ev?.skills),
602
+ agents: list(ev?.agents),
603
+ plugins: list(ev?.plugins).map(p => ({ name: p?.name || '', version: p?.version || '' })).filter(p => p.name),
604
+ pluginErrors: list(ev?.plugin_errors).map(e => ({ plugin: e?.plugin || '', type: e?.type || '', message: e?.message || '' })).filter(e => e.plugin || e.message),
605
+ mcpServers: list(ev?.mcp_servers).map(s => ({ name: s?.name || '', status: s?.status || '', source: s?.source || '' })).filter(s => s.name),
606
+ terminalSlashCommands: list(ev?.terminal_slash_commands),
607
+ capabilities: list(ev?.capabilities),
608
+ betas: list(ev?.betas),
609
+ };
610
+ }
611
+
612
+ const KEY_SOURCES = { none: 'claude.ai sign-in', ANTHROPIC_API_KEY: 'ANTHROPIC_API_KEY (environment)', apiKeyHelper: 'apiKeyHelper', '/login managed key': 'Console key from /login' };
613
+
614
+ /**
615
+ * Rows of the /status card: [label, value, tone]. `init` is readInit()'s output
616
+ * (null before the first turn), `account` the bridge's account info when it sent one.
617
+ */
618
+ export function statusRows({ init = null, account = null, tab = {} } = {}) {
619
+ const rows = [];
620
+ const add = (k, v, tone = '') => { if (v !== '' && v != null) rows.push([k, String(v), tone]); };
621
+ add('Session', tab.sessionId ? `${tab.sessionId}${tab.label ? ` · ${tab.label}` : ''}` : '(new)');
622
+ if (!init) {
623
+ add('Details', 'Send a message to start the session; its details appear here afterwards.', 'muted');
624
+ return rows;
625
+ }
626
+ add('Model', init.model);
627
+ add('Claude Code', init.cliVersion + (tab.sdkVersion ? ` · SDK ${tab.sdkVersion}` : ''));
628
+ add('Working directory', init.cwd);
629
+ if (account?.email || account?.organization) add('Account', [account.email, account.organization, account.subscriptionType].filter(Boolean).join(' · '));
630
+ add('Credential', KEY_SOURCES[init.apiKeySource] || init.apiKeySource);
631
+ add('Permission mode', init.permissionMode);
632
+ if (init.effort) add('Effort', init.effort);
633
+ if (init.fastMode && init.fastMode !== 'off') add('Fast mode', init.fastMode);
634
+ if (init.outputStyle && init.outputStyle !== 'default') add('Output style', init.outputStyle);
635
+ add('Tools', init.tools ? `${init.tools}` : '');
636
+ if (init.mcpServers.length) {
637
+ const bad = init.mcpServers.filter(s => !/connect|ok|ready|running/i.test(s.status));
638
+ add('MCP servers', init.mcpServers.map(s => `${s.name} (${s.status || 'unknown'})`).join(', '), bad.length ? 'warn' : 'ok');
639
+ }
640
+ if (init.skills.length) add('Skills', `${init.skills.length}`);
641
+ if (init.agents.length) add('Agents', init.agents.join(', '));
642
+ if (init.plugins.length) add('Plugins', init.plugins.map(p => (p.version ? `${p.name} ${p.version}` : p.name)).join(', '));
643
+ for (const e of init.pluginErrors) add('Plugin error', `${e.plugin || 'plugin'}: ${e.message || e.type}`, 'warn');
644
+ if (tab.turns != null) add('Turns', `${tab.turns}`);
645
+ if (Number(tab.sessionCost) > 0) add('Cost', `$${Number(tab.sessionCost).toFixed(4)}`);
646
+ return rows;
647
+ }
648
+
649
+ // ── Everything else ──
650
+
651
+ /** `type/subtype`, the name an event is logged and deduplicated under. */
652
+ export function eventLabel(ev) {
653
+ const type = String(ev?.type || 'unknown');
654
+ return ev?.subtype ? `${type}/${ev.subtype}` : type;
655
+ }
656
+
657
+ // Liveness and bookkeeping frames with nothing to show.
658
+ const IGNORED = new Set([
659
+ 'keep_alive',
660
+ 'system/worker_shutting_down',
661
+ 'system/mirror_error',
662
+ 'system/control_request_progress',
663
+ ]);
664
+
665
+ const RESET_TRIGGERS = { clear: 'Conversation cleared', plan_mode_exit: 'Conversation cleared to implement the plan', fresh_session: 'Fresh session started for the approved plan', onboarding: 'Conversation reset' };
666
+
667
+ /**
668
+ * Describe an event the monolith's own branches did not consume. The `kind`
669
+ * says which renderer of cp-event-rows.js takes it; `unknown` is the fallback
670
+ * for types this panel has no renderer for.
671
+ */
672
+ export function describeEvent(ev) {
673
+ const label = eventLabel(ev);
674
+ if (IGNORED.has(label)) return { kind: 'ignore', label };
675
+ switch (label) {
676
+ case 'system/informational': {
677
+ const text = stripAnsi(ev.content).trim();
678
+ if (!text) return { kind: 'ignore', label };
679
+ const level = ev.prevent_continuation ? 'warn'
680
+ : ev.level === 'warning' ? 'warn'
681
+ : ev.level === 'suggestion' ? 'notice'
682
+ : ev.level === 'info' ? 'transcript' : 'status';
683
+ return { kind: 'row', label, level, text: clip(text, 1500), key: ev.tool_use_id ? `info:${ev.tool_use_id}` : '' };
684
+ }
685
+ case 'system/notification': {
686
+ const text = stripAnsi(ev.text).trim();
687
+ if (!text) return { kind: 'ignore', label };
688
+ const loud = ev.priority === 'high' || ev.priority === 'immediate';
689
+ return { kind: 'row', label, level: loud ? 'warn' : 'status', text: clip(text, 800), key: ev.key ? `notif:${ev.key}` : '' };
690
+ }
691
+ case 'system/api_retry': {
692
+ const attempt = Number(ev.attempt) || 1;
693
+ const max = Number(ev.max_retries) || 0;
694
+ const why = ev.error && ev.error !== 'unknown' ? String(ev.error).replace(/_/g, ' ') : (ev.error_status ? `HTTP ${ev.error_status}` : (ev.no_response ? 'no response' : 'connection error'));
695
+ const wait = Number(ev.retry_delay_ms) > 0 ? fmtDuration(ev.retry_delay_ms) : '';
696
+ const count = max ? `${attempt}/${max}` : `${attempt}`;
697
+ return {
698
+ kind: 'retry', label,
699
+ verb: `Retrying ${count} · ${why}`,
700
+ text: `API request failed (${why}${ev.error_status ? `, ${ev.error_status}` : ''}). Retry ${count}${wait ? ` in ${wait}` : ''}.`,
701
+ key: 'api_retry',
702
+ };
703
+ }
704
+ case 'system/status':
705
+ return {
706
+ kind: 'status', label,
707
+ status: ev.status ?? null,
708
+ permissionMode: typeof ev.permissionMode === 'string' ? ev.permissionMode : '',
709
+ compactResult: ev.compact_result || '',
710
+ compactError: ev.compact_error ? clip(ev.compact_error, 600) : '',
711
+ };
712
+ case 'system/local_command_output': {
713
+ const text = stripAnsi(ev.content).trim();
714
+ return text ? { kind: 'command_output', label, text } : { kind: 'ignore', label };
715
+ }
716
+ case 'system/permission_denied':
717
+ return {
718
+ kind: 'denied', label,
719
+ toolUseId: ev.tool_use_id || '',
720
+ toolName: ev.tool_name || '',
721
+ reasonType: ev.decision_reason_type || '',
722
+ reason: clip(ev.decision_reason || ev.message || '', 400),
723
+ agentId: ev.agent_id || '',
724
+ };
725
+ case 'rate_limit_event':
726
+ return { kind: 'rate_limit', label, info: ev.rate_limit_info || {} };
727
+ case 'system/model_refusal_fallback':
728
+ case 'system/model_refusal_no_fallback': {
729
+ const fallback = ev.subtype === 'model_refusal_fallback';
730
+ const local = ev.scope === 'local';
731
+ const lines = [stripAnsi(ev.content).trim()];
732
+ if (fallback && ev.direction === 'retry') {
733
+ lines.push(local
734
+ ? `That response came from ${ev.fallback_model}; the session stays on ${ev.original_model}.`
735
+ : `The session continues on ${ev.fallback_model} (was ${ev.original_model}).`);
736
+ }
737
+ if (ev.api_refusal_explanation) lines.push(clip(String(ev.api_refusal_explanation), 600));
738
+ return {
739
+ kind: 'refusal', label,
740
+ text: lines.filter(Boolean).join('\n') || 'The model declined this request.',
741
+ category: ev.api_refusal_category || '',
742
+ retracted: Array.isArray(ev.retracted_message_uuids) ? ev.retracted_message_uuids : [],
743
+ refusedUserUuid: ev.refused_user_message_uuid || '',
744
+ fallbackModel: fallback ? (ev.fallback_model || '') : '',
745
+ sessionModelChanged: fallback && !local && ev.direction === 'retry',
746
+ };
747
+ }
748
+ case 'system/session_info':
749
+ return { kind: 'session_info', label, info: ev.info && typeof ev.info === 'object' ? ev.info : {} };
750
+ case 'system/hook_started':
751
+ return { kind: 'hook', label, phase: 'started', id: ev.hook_id || '', ev };
752
+ case 'system/hook_progress':
753
+ return { kind: 'ignore', label }; // the response carries the whole output
754
+ case 'system/hook_response':
755
+ return { kind: 'hook', label, phase: 'done', id: ev.hook_id || '', ev };
756
+ case 'system/task_started':
757
+ case 'system/task_progress':
758
+ case 'system/task_updated':
759
+ case 'system/task_notification':
760
+ return { kind: 'task', label, ev };
761
+ case 'system/cache_cost':
762
+ return { kind: 'cache_cost', label, ev };
763
+ case 'system/session_crons':
764
+ return { kind: 'crons', label, crons: Array.isArray(ev.crons) ? ev.crons : [] };
765
+ case 'system/session_state_changed':
766
+ // The CLI's own word: running, idle (the turn is over), requires_action
767
+ // (it waits for an answer). The bridge reads it for its turn accounting too.
768
+ return ['running', 'idle', 'requires_action'].includes(ev.state) ? { kind: 'session_state', label, state: ev.state } : { kind: 'ignore', label };
769
+ case 'prompt_suggestion': {
770
+ const text = String(ev.suggestion || '').trim();
771
+ return text ? { kind: 'suggestion', label, text: clip(text, 400) } : { kind: 'ignore', label };
772
+ }
773
+ case 'system/plugins_list':
774
+ return {
775
+ kind: 'plugins', label,
776
+ plugins: (Array.isArray(ev.plugins) ? ev.plugins : []).map(p => ({ name: p?.name || '', version: p?.version || '' })).filter(p => p.name),
777
+ agents: Array.isArray(ev.agents) ? ev.agents : null,
778
+ };
779
+ case 'system/commands_changed':
780
+ return { kind: 'commands', label, commands: Array.isArray(ev.commands) ? ev.commands : [] };
781
+ case 'tool_progress':
782
+ return {
783
+ kind: 'tool_progress', label,
784
+ toolUseId: ev.tool_use_id || '',
785
+ elapsed: Number(ev.elapsed_time_seconds) || 0,
786
+ retry: ev.subagent_retry
787
+ ? `retrying ${ev.subagent_retry.attempt}/${ev.subagent_retry.max_retries}${ev.subagent_retry.error_category ? ` (${String(ev.subagent_retry.error_category).replace(/_/g, ' ')})` : ''}`
788
+ : '',
789
+ };
790
+ case 'system/thinking_tokens':
791
+ return { kind: 'thinking_tokens', label, tokens: Number(ev.estimated_tokens) || 0 };
792
+ case 'tool_use_summary': {
793
+ const text = String(ev.summary || '').trim();
794
+ return text
795
+ ? { kind: 'summary', label, text: clip(text, 400), toolUseIds: Array.isArray(ev.preceding_tool_use_ids) ? ev.preceding_tool_use_ids : [] }
796
+ : { kind: 'ignore', label };
797
+ }
798
+ case 'system/memory_recall': {
799
+ const memories = (Array.isArray(ev.memories) ? ev.memories : []).map(m => ({
800
+ path: String(m?.path || ''), scope: m?.scope || 'personal', content: typeof m?.content === 'string' ? clip(m.content, 2000) : '',
801
+ })).filter(m => m.path || m.content);
802
+ if (!memories.length) return { kind: 'ignore', label };
803
+ return {
804
+ kind: 'memory_recall', label, memories,
805
+ text: ev.mode === 'synthesize'
806
+ ? 'Recalled from Claude memory (summary)'
807
+ : `Recalled ${memories.length} Claude memory file${memories.length === 1 ? '' : 's'}`,
808
+ };
809
+ }
810
+ case 'conversation_reset':
811
+ return { kind: 'reset', label, text: RESET_TRIGGERS[ev.trigger] || 'Conversation reset', timestamp: ev.timestamp || '', newConversationId: ev.new_conversation_id || '' };
812
+ case 'auth_status': {
813
+ const output = (Array.isArray(ev.output) ? ev.output : []).map(l => stripAnsi(l)).filter(l => l.trim());
814
+ return { kind: 'auth', label, authenticating: ev.isAuthenticating === true, text: output.join('\n'), error: ev.error ? String(ev.error) : '' };
815
+ }
816
+ case 'system/elicitation_complete':
817
+ return { kind: 'row', label, level: 'status', text: `${ev.mcp_server_name || 'MCP server'}: sign-in step completed.`, key: '', elicitationId: ev.elicitation_id || '' };
818
+ case 'system/plugin_install': {
819
+ const name = ev.name ? ` ${ev.name}` : '';
820
+ const text = ev.status === 'started' ? 'Installing plugins…'
821
+ : ev.status === 'installed' ? `Plugin marketplace${name} installed.`
822
+ : ev.status === 'failed' ? `Plugin install failed${name ? ` for${name}` : ''}${ev.error ? `: ${clip(ev.error, 300)}` : '.'}`
823
+ : 'Plugin install finished.';
824
+ return { kind: 'row', label, level: ev.status === 'failed' ? 'warn' : 'status', text, key: ev.status === 'failed' ? '' : 'plugin_install' };
825
+ }
826
+ case 'system/files_persisted': {
827
+ const ok = Array.isArray(ev.files) ? ev.files.length : 0;
828
+ const failed = Array.isArray(ev.failed) ? ev.failed : [];
829
+ if (!ok && !failed.length) return { kind: 'ignore', label };
830
+ const parts = [];
831
+ if (ok) parts.push(`${ok} file${ok === 1 ? '' : 's'} saved`);
832
+ if (failed.length) parts.push(`${failed.length} failed (${failed.slice(0, 3).map(f => f?.filename || '?').join(', ')})`);
833
+ return { kind: 'row', label, level: failed.length ? 'warn' : 'status', text: `Files persisted: ${parts.join(', ')}.`, key: '' };
834
+ }
835
+ case 'active_goal': {
836
+ const v = ev.value;
837
+ if (!v) return { kind: 'row', label, level: 'status', text: 'Goal cleared.', key: 'active_goal' };
838
+ return {
839
+ kind: 'row', label, level: 'status', key: 'active_goal',
840
+ text: `Goal: ${clip(v.condition, 300)}${Number(v.iterations) > 0 ? ` (iteration ${v.iterations})` : ''}${v.last_reason ? `. ${clip(v.last_reason, 200)}` : ''}`,
841
+ };
842
+ }
843
+ default:
844
+ return { kind: 'unknown', label };
845
+ }
846
+ }