synabun 2.0.10 → 2.2.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 (656) hide show
  1. package/CHANGELOG.md +207 -0
  2. package/README.md +25 -2
  3. package/THIRD-PARTY-LICENSES.md +22 -0
  4. package/bin/synabun.js +71 -24
  5. package/docs/whatsapp.md +13 -13
  6. package/hooks/claude-code/pre-websearch.mjs +12 -1
  7. package/hooks/claude-code/shared.mjs +5 -0
  8. package/hooks/claude-code/stop.mjs +1 -1
  9. package/lib/claude-hooks.js +172 -18
  10. package/lib/client-config-repair.js +30 -17
  11. package/lib/desktop-app.js +7 -1
  12. package/lib/external-tools.js +7 -6
  13. package/lib/first-launch-protection.js +57 -12
  14. package/lib/mcp-dist.js +176 -0
  15. package/lib/release-npm-ci.mjs +138 -0
  16. package/lib/release-publish.mjs +91 -0
  17. package/lib/release-scan.mjs +50 -0
  18. package/lib/server-crash-record.js +123 -0
  19. package/lib/server-exit.js +318 -0
  20. package/lib/server-supervisor.js +508 -0
  21. package/lib/start-launcher.js +37 -4
  22. package/lib/tools-cli.js +45 -0
  23. package/lib/update-snapshot.js +302 -0
  24. package/lib/virustotal.mjs +203 -0
  25. package/lib/windows-crash-event.js +269 -0
  26. package/mcp-server/dist/http.d.ts +20 -1
  27. package/mcp-server/dist/http.d.ts.map +1 -1
  28. package/mcp-server/dist/http.js +59 -12
  29. package/mcp-server/dist/http.js.map +1 -1
  30. package/mcp-server/dist/index.d.ts +33 -27
  31. package/mcp-server/dist/index.d.ts.map +1 -1
  32. package/mcp-server/dist/index.js +128 -143
  33. package/mcp-server/dist/index.js.map +1 -1
  34. package/mcp-server/dist/preload.js +1 -1
  35. package/mcp-server/dist/preload.js.map +1 -1
  36. package/mcp-server/dist/services/budget-judgments.d.ts +1 -1
  37. package/mcp-server/dist/services/budget-judgments.d.ts.map +1 -1
  38. package/mcp-server/dist/services/budget-judgments.js +5 -3
  39. package/mcp-server/dist/services/budget-judgments.js.map +1 -1
  40. package/mcp-server/dist/services/codex-config-heal.d.ts +6 -2
  41. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
  42. package/mcp-server/dist/services/codex-config-heal.js +81 -28
  43. package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
  44. package/mcp-server/dist/services/identity.d.ts +2 -2
  45. package/mcp-server/dist/services/identity.js +2 -2
  46. package/mcp-server/dist/services/memory-judge-backfill.d.ts +6 -0
  47. package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -1
  48. package/mcp-server/dist/services/memory-judge-backfill.js +7 -1
  49. package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -1
  50. package/mcp-server/dist/services/memory-sessions.d.ts +1 -1
  51. package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -1
  52. package/mcp-server/dist/services/memory-sessions.js +28 -2
  53. package/mcp-server/dist/services/memory-sessions.js.map +1 -1
  54. package/mcp-server/dist/services/neural-interface.d.ts +18 -11
  55. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
  56. package/mcp-server/dist/services/neural-interface.js +67 -11
  57. package/mcp-server/dist/services/neural-interface.js.map +1 -1
  58. package/mcp-server/dist/services/server-instructions.d.ts +7 -2
  59. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -1
  60. package/mcp-server/dist/services/server-instructions.js +22 -63
  61. package/mcp-server/dist/services/server-instructions.js.map +1 -1
  62. package/mcp-server/dist/services/tool-catalog.d.ts +120 -0
  63. package/mcp-server/dist/services/tool-catalog.d.ts.map +1 -0
  64. package/mcp-server/dist/services/tool-catalog.js +339 -0
  65. package/mcp-server/dist/services/tool-catalog.js.map +1 -0
  66. package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts +12 -0
  67. package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts.map +1 -0
  68. package/mcp-server/dist/services/tool-list-refresh-barrier.js +40 -0
  69. package/mcp-server/dist/services/tool-list-refresh-barrier.js.map +1 -0
  70. package/mcp-server/dist/services/tool-list.d.ts +108 -0
  71. package/mcp-server/dist/services/tool-list.d.ts.map +1 -0
  72. package/mcp-server/dist/services/tool-list.js +334 -0
  73. package/mcp-server/dist/services/tool-list.js.map +1 -0
  74. package/mcp-server/dist/services/tool-runtime.d.ts +161 -0
  75. package/mcp-server/dist/services/tool-runtime.d.ts.map +1 -0
  76. package/mcp-server/dist/services/tool-runtime.js +400 -0
  77. package/mcp-server/dist/services/tool-runtime.js.map +1 -0
  78. package/mcp-server/dist/services/typesafe-config.js +1 -1
  79. package/mcp-server/dist/services/typesafe-config.js.map +1 -1
  80. package/mcp-server/dist/services/whiteboard-geometry.d.ts +26 -2
  81. package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -1
  82. package/mcp-server/dist/services/whiteboard-geometry.js +91 -8
  83. package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -1
  84. package/mcp-server/dist/tools/agents.d.ts +14 -14
  85. package/mcp-server/dist/tools/agents.d.ts.map +1 -1
  86. package/mcp-server/dist/tools/agents.js +29 -19
  87. package/mcp-server/dist/tools/agents.js.map +1 -1
  88. package/mcp-server/dist/tools/browser-batch.d.ts +3 -3
  89. package/mcp-server/dist/tools/choice.d.ts +6 -0
  90. package/mcp-server/dist/tools/choice.d.ts.map +1 -1
  91. package/mcp-server/dist/tools/choice.js +18 -13
  92. package/mcp-server/dist/tools/choice.js.map +1 -1
  93. package/mcp-server/dist/tools/git-tools.js +2 -2
  94. package/mcp-server/dist/tools/git-tools.js.map +1 -1
  95. package/mcp-server/dist/tools/image-tools.d.ts +1 -1
  96. package/mcp-server/dist/tools/image-tools.js +1 -1
  97. package/mcp-server/dist/tools/morelogin.d.ts.map +1 -1
  98. package/mcp-server/dist/tools/morelogin.js +9 -6
  99. package/mcp-server/dist/tools/morelogin.js.map +1 -1
  100. package/mcp-server/dist/tools/skill-tools.d.ts +505 -0
  101. package/mcp-server/dist/tools/skill-tools.d.ts.map +1 -0
  102. package/mcp-server/dist/tools/skill-tools.js +642 -0
  103. package/mcp-server/dist/tools/skill-tools.js.map +1 -0
  104. package/mcp-server/dist/tools/skill.d.ts +7 -0
  105. package/mcp-server/dist/tools/skill.d.ts.map +1 -0
  106. package/mcp-server/dist/tools/skill.js +11 -0
  107. package/mcp-server/dist/tools/skill.js.map +1 -0
  108. package/mcp-server/dist/tools/tool-groups.d.ts +68 -0
  109. package/mcp-server/dist/tools/tool-groups.d.ts.map +1 -0
  110. package/mcp-server/dist/tools/tool-groups.js +147 -0
  111. package/mcp-server/dist/tools/tool-groups.js.map +1 -0
  112. package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -1
  113. package/mcp-server/dist/tools/whiteboard-format.js +7 -4
  114. package/mcp-server/dist/tools/whiteboard-format.js.map +1 -1
  115. package/mcp-server/dist/tools/whiteboard-tools.d.ts +64 -13
  116. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -1
  117. package/mcp-server/dist/tools/whiteboard-tools.js +30 -5
  118. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -1
  119. package/mcp-server/package-lock.json +2 -2
  120. package/mcp-server/package.json +1 -1
  121. package/mcp-server/src/http.ts +75 -12
  122. package/mcp-server/src/index.ts +147 -154
  123. package/mcp-server/src/preload.ts +12 -12
  124. package/mcp-server/src/services/budget-judgments.ts +5 -3
  125. package/mcp-server/src/services/codex-config-heal.ts +80 -29
  126. package/mcp-server/src/services/identity.ts +2 -2
  127. package/mcp-server/src/services/memory-judge-backfill.ts +7 -1
  128. package/mcp-server/src/services/memory-sessions.ts +24 -3
  129. package/mcp-server/src/services/neural-interface.ts +81 -21
  130. package/mcp-server/src/services/server-instructions.ts +29 -64
  131. package/mcp-server/src/services/tool-catalog.ts +403 -0
  132. package/mcp-server/src/services/tool-list-refresh-barrier.ts +33 -0
  133. package/mcp-server/src/services/tool-list.ts +410 -0
  134. package/mcp-server/src/services/tool-runtime.ts +457 -0
  135. package/mcp-server/src/services/typesafe-config.ts +1 -1
  136. package/mcp-server/src/services/whiteboard-geometry.ts +94 -9
  137. package/mcp-server/src/tools/agents.ts +29 -20
  138. package/mcp-server/src/tools/choice.ts +17 -12
  139. package/mcp-server/src/tools/git-tools.ts +2 -2
  140. package/mcp-server/src/tools/image-tools.ts +1 -1
  141. package/mcp-server/src/tools/morelogin.ts +6 -4
  142. package/mcp-server/src/tools/skill-tools.ts +592 -0
  143. package/mcp-server/src/tools/skill.ts +13 -0
  144. package/mcp-server/src/tools/tool-groups.ts +164 -0
  145. package/mcp-server/src/tools/whiteboard-format.ts +9 -3
  146. package/mcp-server/src/tools/whiteboard-tools.ts +39 -5
  147. package/neural-interface/i18n/en.json +3953 -228
  148. package/neural-interface/i18n/pt-BR.json +3901 -179
  149. package/neural-interface/lib/agent-sandbox-elevation.js +6 -0
  150. package/neural-interface/lib/antigravity/acp-client-host.js +554 -0
  151. package/neural-interface/lib/antigravity/acp-connection.js +299 -0
  152. package/neural-interface/lib/antigravity/bypass.js +100 -0
  153. package/neural-interface/lib/antigravity/catalog.js +273 -0
  154. package/neural-interface/lib/antigravity/home.js +260 -0
  155. package/neural-interface/lib/antigravity/migrate-gemini.js +139 -0
  156. package/neural-interface/lib/antigravity/panel-bridge.js +1058 -0
  157. package/neural-interface/lib/antigravity/policy-hook.mjs +78 -0
  158. package/neural-interface/lib/antigravity/policy.js +74 -0
  159. package/neural-interface/lib/antigravity/tool-call.js +178 -0
  160. package/neural-interface/lib/antigravity/transcripts.js +252 -0
  161. package/neural-interface/lib/antigravity/usage.js +43 -0
  162. package/neural-interface/lib/assistant-api.js +128 -28
  163. package/neural-interface/lib/assistant-brains/antigravity.js +423 -0
  164. package/neural-interface/lib/assistant-brains/claude.js +4 -3
  165. package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +12 -2
  166. package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +32 -9
  167. package/neural-interface/lib/assistant-brains/codex.js +9 -5
  168. package/neural-interface/lib/assistant-brains/opencode.js +120 -54
  169. package/neural-interface/lib/assistant-brains/opencode2-browser-policy/index.js +28 -13
  170. package/neural-interface/lib/assistant-brains/opencode2-route-gate/index.js +59 -19
  171. package/neural-interface/lib/assistant-budget-planner.js +7 -3
  172. package/neural-interface/lib/assistant-budget-split.js +42 -15
  173. package/neural-interface/lib/assistant-catalog.js +81 -15
  174. package/neural-interface/lib/assistant-config.js +6 -3
  175. package/neural-interface/lib/assistant-dispatch.js +1073 -200
  176. package/neural-interface/lib/assistant-envelope.js +156 -2
  177. package/neural-interface/lib/assistant-evidence.js +80 -0
  178. package/neural-interface/lib/assistant-hidden-models.js +7 -5
  179. package/neural-interface/lib/assistant-persona.js +93 -19
  180. package/neural-interface/lib/assistant-plan-permissions.js +25 -9
  181. package/neural-interface/lib/assistant-route-gate-codex.js +3 -0
  182. package/neural-interface/lib/assistant-route-gate.js +6 -4
  183. package/neural-interface/lib/assistant-router.js +245 -38
  184. package/neural-interface/lib/assistant-runtime.js +214 -30
  185. package/neural-interface/lib/assistant-task-prompt.js +87 -21
  186. package/neural-interface/lib/assistant-tools.js +51 -0
  187. package/neural-interface/lib/assistant-usage.js +29 -0
  188. package/neural-interface/lib/backup-service.js +626 -4
  189. package/neural-interface/lib/backup-zip-reader.js +10 -5
  190. package/neural-interface/lib/backup-zip-writer.js +257 -0
  191. package/neural-interface/lib/browser-execution.js +10 -2
  192. package/neural-interface/lib/browser-guard-cdp.js +84 -0
  193. package/neural-interface/lib/browser-network-guard.js +476 -0
  194. package/neural-interface/lib/browser-policy-roots.js +64 -0
  195. package/neural-interface/lib/browser-tool-policy.js +198 -38
  196. package/neural-interface/lib/claude-agent-bridge.js +11 -2
  197. package/neural-interface/lib/claude-history-cache.js +210 -0
  198. package/neural-interface/lib/claude-hooks-status.js +103 -0
  199. package/neural-interface/lib/claude-model-catalog.js +5 -1
  200. package/neural-interface/lib/claude-temporary.js +5 -11
  201. package/neural-interface/lib/cli-install-api.js +1 -1
  202. package/neural-interface/lib/cli-install.js +163 -154
  203. package/neural-interface/lib/cli-resolver.js +13 -3
  204. package/neural-interface/lib/cli-update-planner.js +52 -41
  205. package/neural-interface/lib/cloudflared/tunnel.js +42 -2
  206. package/neural-interface/lib/codex-mcp-approvals.js +11 -0
  207. package/neural-interface/lib/codex-rollout-reader.js +52 -0
  208. package/neural-interface/lib/codex-worker-app-server.js +191 -0
  209. package/neural-interface/lib/confined-fs.js +30 -3
  210. package/neural-interface/lib/crash-notice-api.js +98 -0
  211. package/neural-interface/lib/editor-completion-opencode.js +68 -68
  212. package/neural-interface/lib/editor-git-api.js +3 -20
  213. package/neural-interface/lib/exec-loop-command.js +13 -10
  214. package/neural-interface/lib/file-explorer-api.js +74 -40
  215. package/neural-interface/lib/file-explorer-watch.js +9 -3
  216. package/neural-interface/lib/git-bash/install.js +52 -6
  217. package/neural-interface/lib/git-bash/manager.js +59 -17
  218. package/neural-interface/lib/git-bash/pins.js +12 -0
  219. package/neural-interface/lib/git-read.js +2 -2
  220. package/neural-interface/lib/git-status-runner.js +390 -0
  221. package/neural-interface/lib/git-status-watchdog.js +40 -0
  222. package/neural-interface/lib/greeting/budgets.js +1 -0
  223. package/neural-interface/lib/greeting/engine.js +2 -2
  224. package/neural-interface/lib/greeting/sources.js +10 -12
  225. package/neural-interface/lib/greeting/writer.js +1 -1
  226. package/neural-interface/lib/http-guards.js +8 -2
  227. package/neural-interface/lib/install-details.js +4 -1
  228. package/neural-interface/lib/mcp-agent-servers.js +67 -0
  229. package/neural-interface/lib/mcp-client-config.js +35 -33
  230. package/neural-interface/lib/mcp-external-servers.js +332 -0
  231. package/neural-interface/lib/mcp-installer.js +2 -1
  232. package/neural-interface/lib/{mcp-profile-refresh-coordinator.js → mcp-tools-refresh-coordinator.js} +4 -4
  233. package/neural-interface/lib/memory-session-capture.js +17 -3
  234. package/neural-interface/lib/morelogin.js +177 -25
  235. package/neural-interface/lib/native-loop-providers.js +965 -66
  236. package/neural-interface/lib/native-loop-runtime.js +290 -42
  237. package/neural-interface/lib/opencode-config.js +557 -0
  238. package/neural-interface/lib/opencode-db-schema.js +17 -34
  239. package/neural-interface/lib/opencode-history.js +48 -218
  240. package/neural-interface/lib/opencode-mcp-ready.js +108 -0
  241. package/neural-interface/lib/opencode-native-boundary.js +53 -0
  242. package/neural-interface/lib/opencode-protocol.js +249 -112
  243. package/neural-interface/lib/opencode-runtime-config.js +32 -22
  244. package/neural-interface/lib/opencode-serve-records.js +39 -21
  245. package/neural-interface/lib/opencode-v2-client.js +48 -153
  246. package/neural-interface/lib/opencode-v2-ws-requests.js +36 -210
  247. package/neural-interface/lib/opencode-worker-data.js +27 -0
  248. package/neural-interface/lib/opencode2-client.js +73 -37
  249. package/neural-interface/lib/opencode2-proxy.js +23 -63
  250. package/neural-interface/lib/opencode2-translate.js +51 -2
  251. package/neural-interface/lib/owner-authority.js +249 -0
  252. package/neural-interface/lib/page-session.js +275 -0
  253. package/neural-interface/lib/path-confine.js +12 -9
  254. package/neural-interface/lib/peer-identity.js +793 -0
  255. package/neural-interface/lib/pty-host/core.js +28 -1
  256. package/neural-interface/lib/pty-host/lifetime.js +12 -0
  257. package/neural-interface/lib/pty-host/manager.js +12 -1
  258. package/neural-interface/lib/remote-policy.js +1 -1
  259. package/neural-interface/lib/request-gate.js +20 -2
  260. package/neural-interface/lib/rulesets/api.js +7 -6
  261. package/neural-interface/lib/rulesets/fs-safe.js +1 -1
  262. package/neural-interface/lib/rulesets/installer.js +180 -36
  263. package/neural-interface/lib/rulesets/json-edit.js +1 -1
  264. package/neural-interface/lib/rulesets/render.js +1 -1
  265. package/neural-interface/lib/session-cache-builder.js +81 -31
  266. package/neural-interface/lib/session-title-generator.js +58 -36
  267. package/neural-interface/lib/skills/api-v2.js +495 -0
  268. package/neural-interface/lib/skills/bundle.js +418 -0
  269. package/neural-interface/lib/skills/catalog.js +298 -0
  270. package/neural-interface/lib/skills/creation-api.js +191 -0
  271. package/neural-interface/lib/skills/creation-brief.js +247 -0
  272. package/neural-interface/lib/skills/creation-sources.js +285 -0
  273. package/neural-interface/lib/skills/creation.js +843 -0
  274. package/neural-interface/lib/skills/deploy.js +569 -0
  275. package/neural-interface/lib/skills/digest.js +119 -0
  276. package/neural-interface/lib/skills/discover.js +111 -0
  277. package/neural-interface/lib/skills/draft-confinement.js +216 -0
  278. package/neural-interface/lib/skills/eval-confinement.js +399 -0
  279. package/neural-interface/lib/skills/eval-sandbox.js +280 -0
  280. package/neural-interface/lib/skills/eval-trace.js +135 -0
  281. package/neural-interface/lib/skills/evals-api.js +212 -0
  282. package/neural-interface/lib/skills/evals.js +1573 -0
  283. package/neural-interface/lib/skills/export.js +203 -0
  284. package/neural-interface/lib/skills/frontmatter.js +64 -0
  285. package/neural-interface/lib/skills/health.js +75 -0
  286. package/neural-interface/lib/skills/json-edit.js +165 -0
  287. package/neural-interface/lib/skills/known-bridge-digests.json +441 -0
  288. package/neural-interface/lib/skills/known-bridges.js +96 -0
  289. package/neural-interface/lib/skills/library.js +823 -0
  290. package/neural-interface/lib/skills/local-store.js +21 -0
  291. package/neural-interface/lib/skills/migration.js +433 -0
  292. package/neural-interface/lib/skills/operations.js +45 -0
  293. package/neural-interface/lib/skills/ownership.js +427 -0
  294. package/neural-interface/lib/skills/packages.js +88 -0
  295. package/neural-interface/lib/skills/reviews.js +212 -0
  296. package/neural-interface/lib/skills/revision.js +80 -0
  297. package/neural-interface/lib/skills/roots.js +269 -0
  298. package/neural-interface/lib/skills/runtime-checks.js +358 -0
  299. package/neural-interface/lib/skills/scan-assets.js +252 -0
  300. package/neural-interface/lib/skills/scan-context.js +26 -0
  301. package/neural-interface/lib/skills/scan-shell.js +324 -0
  302. package/neural-interface/lib/skills/scan.js +364 -0
  303. package/neural-interface/lib/skills/scanners.js +54 -0
  304. package/neural-interface/lib/skills/service.js +530 -0
  305. package/neural-interface/lib/skills/telemetry.js +119 -0
  306. package/neural-interface/lib/sqlite-integrity-worker.js +22 -0
  307. package/neural-interface/lib/synabun-version.js +1 -1
  308. package/neural-interface/lib/system-activity.js +1 -1
  309. package/neural-interface/lib/tool-lists.js +124 -0
  310. package/neural-interface/lib/whatsapp/brain.js +7 -3
  311. package/neural-interface/lib/whatsapp/bridge.js +6 -3
  312. package/neural-interface/lib/whatsapp/cards.js +22 -9
  313. package/neural-interface/lib/whatsapp/config.js +1 -1
  314. package/neural-interface/lib/worker-confinement.js +1268 -0
  315. package/neural-interface/lib/worker-guard-setting.js +56 -0
  316. package/neural-interface/lib/worker-mcp-channel.js +175 -0
  317. package/neural-interface/lib/worker-question.js +74 -0
  318. package/neural-interface/lib/worker-relay-ports.js +227 -0
  319. package/neural-interface/lib/worker-resume.js +238 -0
  320. package/neural-interface/lib/worker-sandbox.js +329 -0
  321. package/neural-interface/package-lock.json +34 -12
  322. package/neural-interface/package.json +3 -2
  323. package/neural-interface/public/index.html +3 -1
  324. package/neural-interface/public/index2d.html +19 -11
  325. package/neural-interface/public/onboarding.html +3 -3
  326. package/neural-interface/public/shared/account-menu.js +8 -5
  327. package/neural-interface/public/shared/agent-runtime-options.js +125 -31
  328. package/neural-interface/public/shared/agy/agy-bypass.js +47 -0
  329. package/neural-interface/public/shared/agy/agy-client.js +266 -0
  330. package/neural-interface/public/shared/agy/agy-commands.js +120 -0
  331. package/neural-interface/public/shared/agy/agy-copy.js +326 -0
  332. package/neural-interface/public/shared/agy/agy-diff.js +161 -0
  333. package/neural-interface/public/shared/agy/agy-events.js +469 -0
  334. package/neural-interface/public/shared/agy/agy-greeting.js +26 -0
  335. package/neural-interface/public/shared/agy/agy-options.js +232 -0
  336. package/neural-interface/public/shared/agy/agy-panel.js +2543 -0
  337. package/neural-interface/public/shared/agy/agy-render.js +392 -0
  338. package/neural-interface/public/shared/agy/agy-setup.js +149 -0
  339. package/neural-interface/public/shared/agy/agy-styles.js +604 -0
  340. package/neural-interface/public/shared/agy/agy-tabs-logic.js +181 -0
  341. package/neural-interface/public/shared/api.js +1527 -1336
  342. package/neural-interface/public/shared/app-frame.js +192 -0
  343. package/neural-interface/public/shared/assistant/asst-agents-dock.js +36 -6
  344. package/neural-interface/public/shared/assistant/asst-api.js +1 -1
  345. package/neural-interface/public/shared/assistant/asst-ask-styles.js +270 -0
  346. package/neural-interface/public/shared/assistant/asst-ask-tail.js +118 -0
  347. package/neural-interface/public/shared/assistant/asst-ask.js +397 -0
  348. package/neural-interface/public/shared/assistant/asst-brain-picker.js +105 -44
  349. package/neural-interface/public/shared/assistant/asst-budget.js +5 -4
  350. package/neural-interface/public/shared/assistant/asst-control.js +205 -26
  351. package/neural-interface/public/shared/assistant/asst-followups-card.js +383 -0
  352. package/neural-interface/public/shared/assistant/asst-followups.js +417 -0
  353. package/neural-interface/public/shared/assistant/asst-hosts.js +16 -7
  354. package/neural-interface/public/shared/assistant/asst-limit-dock.js +45 -0
  355. package/neural-interface/public/shared/assistant/asst-limit-wait.js +327 -0
  356. package/neural-interface/public/shared/assistant/asst-limit.js +168 -0
  357. package/neural-interface/public/shared/assistant/asst-mascot.js +49 -12
  358. package/neural-interface/public/shared/assistant/asst-menu.js +7 -6
  359. package/neural-interface/public/shared/assistant/asst-panel.js +151 -19
  360. package/neural-interface/public/shared/assistant/asst-rack-styles.js +66 -49
  361. package/neural-interface/public/shared/assistant/asst-render.js +445 -82
  362. package/neural-interface/public/shared/assistant/asst-route.js +304 -53
  363. package/neural-interface/public/shared/assistant/asst-routes-editor.js +9 -8
  364. package/neural-interface/public/shared/assistant/asst-scenes.js +56 -1
  365. package/neural-interface/public/shared/assistant/asst-sidepanel.js +117 -10
  366. package/neural-interface/public/shared/assistant/asst-slash.js +17 -9
  367. package/neural-interface/public/shared/assistant/asst-state.js +87 -24
  368. package/neural-interface/public/shared/assistant/asst-stop.js +127 -0
  369. package/neural-interface/public/shared/assistant/asst-styles.js +93 -21
  370. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +190 -23
  371. package/neural-interface/public/shared/assistant/asst-usage.js +2 -1
  372. package/neural-interface/public/shared/automation-context.js +5 -2
  373. package/neural-interface/public/shared/cc-dropdown.js +89 -19
  374. package/neural-interface/public/shared/cdx/cdx-context-menu.js +10 -9
  375. package/neural-interface/public/shared/cdx/cdx-copy.js +16 -0
  376. package/neural-interface/public/shared/cdx/cdx-output-model.js +22 -1
  377. package/neural-interface/public/shared/cdx/cdx-output.js +34 -10
  378. package/neural-interface/public/shared/cdx/cdx-panel.js +59 -151
  379. package/neural-interface/public/shared/cdx/cdx-preview.js +12 -0
  380. package/neural-interface/public/shared/cdx/cdx-protocol.js +39 -11
  381. package/neural-interface/public/shared/cdx/cdx-render.js +57 -38
  382. package/neural-interface/public/shared/cdx/cdx-requests.js +14 -4
  383. package/neural-interface/public/shared/cdx/cdx-skill-hints.js +54 -0
  384. package/neural-interface/public/shared/cdx/cdx-styles.js +15 -3
  385. package/neural-interface/public/shared/cdx/cdx-tabs.js +127 -44
  386. package/neural-interface/public/shared/cdx/cdx-ws.js +0 -1
  387. package/neural-interface/public/shared/cli-install-controller.js +218 -0
  388. package/neural-interface/public/shared/cli-install-view.js +11 -12
  389. package/neural-interface/public/shared/cli-status.js +11 -10
  390. package/neural-interface/public/shared/constants.js +5 -4
  391. package/neural-interface/public/shared/context-menu-areas.js +34 -0
  392. package/neural-interface/public/shared/context-menu-logic.js +243 -0
  393. package/neural-interface/public/shared/context-menu-model.js +367 -0
  394. package/neural-interface/public/shared/context-menu.js +372 -0
  395. package/neural-interface/public/shared/cp/cp-context-menu.js +10 -9
  396. package/neural-interface/public/shared/cp/cp-restore.js +162 -0
  397. package/neural-interface/public/shared/cp/cp-tool-cards.js +10 -3
  398. package/neural-interface/public/shared/crash-notice-view.js +168 -0
  399. package/neural-interface/public/shared/desktop-bridge.js +17 -0
  400. package/neural-interface/public/shared/desktop-titlebar-view.js +12 -0
  401. package/neural-interface/public/shared/desktop-titlebar.js +13 -4
  402. package/neural-interface/public/shared/desktop-update-view.js +21 -0
  403. package/neural-interface/public/shared/editor/editor-panel-logic.js +2 -2
  404. package/neural-interface/public/shared/explorer/fx-api.js +4 -4
  405. package/neural-interface/public/shared/explorer/fx-links.js +3 -3
  406. package/neural-interface/public/shared/explorer/fx-logic.js +1 -1
  407. package/neural-interface/public/shared/explorer/fx-main.js +48 -16
  408. package/neural-interface/public/shared/explorer/fx-tree.js +1 -0
  409. package/neural-interface/public/shared/greeting/greeting-card.js +2 -2
  410. package/neural-interface/public/shared/greeting/greeting-view.js +1 -0
  411. package/neural-interface/public/shared/html-shell.js +30 -15
  412. package/neural-interface/public/shared/i18n.js +2 -0
  413. package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +7 -7
  414. package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +4 -4
  415. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +3 -101
  416. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +2 -0
  417. package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +1 -3
  418. package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +2 -6
  419. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +11 -11
  420. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +0 -3
  421. package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +8 -4
  422. package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +7 -7
  423. package/neural-interface/public/shared/ocp-v2/ocp-v2-outcome-notifications.js +16 -0
  424. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +74 -259
  425. package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +1 -2
  426. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +95 -202
  427. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +13 -4
  428. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +13 -22
  429. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +4 -4
  430. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +8 -61
  431. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +2 -91
  432. package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +16 -15
  433. package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +8 -21
  434. package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +1 -99
  435. package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +5 -35
  436. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +17 -21
  437. package/neural-interface/public/shared/ocp-v2/{ocp-v2-profile-inheritance.js → ocp-v2-tools-inheritance.js} +16 -16
  438. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +60 -50
  439. package/neural-interface/public/shared/page-session.js +96 -0
  440. package/neural-interface/public/shared/provider-icons.js +4 -2
  441. package/neural-interface/public/shared/registry.js +5 -3
  442. package/neural-interface/public/shared/retired-2d.js +3 -0
  443. package/neural-interface/public/shared/schedules-view.js +195 -61
  444. package/neural-interface/public/shared/settings/settings-claude-hooks.js +135 -0
  445. package/neural-interface/public/shared/settings/settings-data.js +3 -1
  446. package/neural-interface/public/shared/settings/settings-ia.js +6 -6
  447. package/neural-interface/public/shared/settings/settings-opencode.js +89 -0
  448. package/neural-interface/public/shared/settings/settings-rules.js +2 -2
  449. package/neural-interface/public/shared/settings/settings-skill-folders-pane.js +265 -0
  450. package/neural-interface/public/shared/settings/settings-skill-folders.js +130 -0
  451. package/neural-interface/public/shared/settings/settings-worker-guard.js +72 -0
  452. package/neural-interface/public/shared/showcase-privacy.js +6 -1
  453. package/neural-interface/public/shared/sidepanel-session-status.js +3 -3
  454. package/neural-interface/public/shared/skills/ss-args.js +96 -0
  455. package/neural-interface/public/shared/skills/ss-creation.js +222 -0
  456. package/neural-interface/public/shared/skills/ss-dialog.js +133 -0
  457. package/neural-interface/public/shared/skills/ss-doc.js +173 -0
  458. package/neural-interface/public/shared/skills/ss-eval-adapters.js +269 -0
  459. package/neural-interface/public/shared/skills/ss-eval-grade.js +359 -0
  460. package/neural-interface/public/shared/skills/ss-eval-optimise.js +153 -0
  461. package/neural-interface/public/shared/skills/ss-eval-plan.js +315 -0
  462. package/neural-interface/public/shared/skills/ss-evals.js +417 -0
  463. package/neural-interface/public/shared/skills/ss-form.js +159 -0
  464. package/neural-interface/public/shared/skills/ss-frontmatter.js +376 -0
  465. package/neural-interface/public/shared/skills/ss-ids.js +32 -0
  466. package/neural-interface/public/shared/skills/ss-lint.js +149 -0
  467. package/neural-interface/public/shared/skills/ss-presets.js +117 -0
  468. package/neural-interface/public/shared/skills/ss-profiles.js +513 -0
  469. package/neural-interface/public/shared/skills/ss-resources.js +165 -0
  470. package/neural-interface/public/shared/skills/ss-review-view.js +190 -0
  471. package/neural-interface/public/shared/skills/ss-tabs.js +79 -0
  472. package/neural-interface/public/shared/skills/ss-unicode.js +135 -0
  473. package/neural-interface/public/shared/skills/studio/sx-actions.js +222 -0
  474. package/neural-interface/public/shared/skills/studio/sx-cm.js +101 -0
  475. package/neural-interface/public/shared/skills/studio/sx-create-ai-view.js +749 -0
  476. package/neural-interface/public/shared/skills/studio/sx-create-ai.js +237 -0
  477. package/neural-interface/public/shared/skills/studio/sx-create-view.js +254 -0
  478. package/neural-interface/public/shared/skills/studio/sx-create.js +126 -0
  479. package/neural-interface/public/shared/skills/studio/sx-diff-view.js +43 -0
  480. package/neural-interface/public/shared/skills/studio/sx-diff.js +133 -0
  481. package/neural-interface/public/shared/skills/studio/sx-docs.js +480 -0
  482. package/neural-interface/public/shared/skills/studio/sx-dom.js +230 -0
  483. package/neural-interface/public/shared/skills/studio/sx-edit-view.js +848 -0
  484. package/neural-interface/public/shared/skills/studio/sx-editor-model.js +193 -0
  485. package/neural-interface/public/shared/skills/studio/sx-errors.js +22 -0
  486. package/neural-interface/public/shared/skills/studio/sx-fixes-view.js +359 -0
  487. package/neural-interface/public/shared/skills/studio/sx-fixes.js +327 -0
  488. package/neural-interface/public/shared/skills/studio/sx-geometry.js +82 -0
  489. package/neural-interface/public/shared/skills/studio/sx-import.js +262 -0
  490. package/neural-interface/public/shared/skills/studio/sx-inspector.js +308 -0
  491. package/neural-interface/public/shared/skills/studio/sx-install-flow.js +282 -0
  492. package/neural-interface/public/shared/skills/studio/sx-install.js +313 -0
  493. package/neural-interface/public/shared/skills/studio/sx-library-view.js +748 -0
  494. package/neural-interface/public/shared/skills/studio/sx-library.js +479 -0
  495. package/neural-interface/public/shared/skills/studio/sx-main.js +690 -0
  496. package/neural-interface/public/shared/skills/studio/sx-operations-view.js +98 -0
  497. package/neural-interface/public/shared/skills/studio/sx-operations.js +11 -0
  498. package/neural-interface/public/shared/skills/studio/sx-plan.js +158 -0
  499. package/neural-interface/public/shared/skills/studio/sx-publish-view.js +621 -0
  500. package/neural-interface/public/shared/skills/studio/sx-review-view.js +369 -0
  501. package/neural-interface/public/shared/skills/studio/sx-review.js +148 -0
  502. package/neural-interface/public/shared/skills/studio/sx-scan.js +35 -0
  503. package/neural-interface/public/shared/skills/studio/sx-snippets.js +96 -0
  504. package/neural-interface/public/shared/skills/studio/sx-subject.js +249 -0
  505. package/neural-interface/public/shared/skills/studio/sx-test-view.js +994 -0
  506. package/neural-interface/public/shared/skills/studio/sx-test.js +328 -0
  507. package/neural-interface/public/shared/skills/studio/sx-versions-view.js +241 -0
  508. package/neural-interface/public/shared/skills/studio/sx-workspace-view.js +426 -0
  509. package/neural-interface/public/shared/state.js +1 -1
  510. package/neural-interface/public/shared/streaming-markdown.js +58 -0
  511. package/neural-interface/public/shared/styleguide/sg-panel.js +4 -2
  512. package/neural-interface/public/shared/styles.css +1822 -1756
  513. package/neural-interface/public/shared/synabun-mascot.js +1115 -9
  514. package/neural-interface/public/shared/text-cache.js +29 -0
  515. package/neural-interface/public/shared/tool-list-picker.js +55 -0
  516. package/neural-interface/public/shared/tool-list-storage.js +24 -0
  517. package/neural-interface/public/shared/tool-list-view.js +112 -0
  518. package/neural-interface/public/shared/topright-overflow-logic.js +54 -0
  519. package/neural-interface/public/shared/tour/tour-actor.js +268 -0
  520. package/neural-interface/public/shared/tour/tour-beats.js +336 -0
  521. package/neural-interface/public/shared/tour/tour-engine.js +884 -0
  522. package/neural-interface/public/shared/tour/tour-ink.js +390 -0
  523. package/neural-interface/public/shared/tour/tour-stage.js +440 -0
  524. package/neural-interface/public/shared/tour/tour-state.js +40 -0
  525. package/neural-interface/public/shared/tour/tour-tips.js +99 -0
  526. package/neural-interface/public/shared/tour/tour.css +144 -0
  527. package/neural-interface/public/shared/ui-antigravity-panel.js +19 -0
  528. package/neural-interface/public/shared/ui-assistant.js +2 -0
  529. package/neural-interface/public/shared/ui-automation-studio.js +111 -140
  530. package/neural-interface/public/shared/ui-claude-panel.js +376 -82
  531. package/neural-interface/public/shared/ui-cli-banner.js +23 -167
  532. package/neural-interface/public/shared/ui-command-runner.js +6 -3
  533. package/neural-interface/public/shared/ui-context-menu.js +295 -0
  534. package/neural-interface/public/shared/ui-cost-widget.js +57 -59
  535. package/neural-interface/public/shared/ui-crash-notice.js +187 -0
  536. package/neural-interface/public/shared/ui-detail.js +15 -3
  537. package/neural-interface/public/shared/ui-file-explorer.js +48 -6
  538. package/neural-interface/public/shared/ui-file-links.js +2 -2
  539. package/neural-interface/public/shared/ui-games.js +2 -2
  540. package/neural-interface/public/shared/ui-image-gallery.js +50 -47
  541. package/neural-interface/public/shared/ui-judgments.js +1 -1
  542. package/neural-interface/public/shared/ui-keybinds.js +33 -2
  543. package/neural-interface/public/shared/ui-link.js +3 -3
  544. package/neural-interface/public/shared/ui-menubar.js +10 -20
  545. package/neural-interface/public/shared/ui-native-loop-router-state.js +5 -0
  546. package/neural-interface/public/shared/ui-native-loop-router.js +11 -1
  547. package/neural-interface/public/shared/ui-navbar.js +49 -24
  548. package/neural-interface/public/shared/ui-notifications.js +1 -0
  549. package/neural-interface/public/shared/ui-panels.js +96 -65
  550. package/neural-interface/public/shared/ui-resume.js +9 -7
  551. package/neural-interface/public/shared/ui-schedules-studio.js +546 -431
  552. package/neural-interface/public/shared/ui-scroll-follow.js +16 -5
  553. package/neural-interface/public/shared/ui-sessions.js +27 -15
  554. package/neural-interface/public/shared/ui-settings.js +683 -526
  555. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +9 -2
  556. package/neural-interface/public/shared/ui-sidepanel-sessions.js +4 -4
  557. package/neural-interface/public/shared/ui-sidepanel-state.js +23 -12
  558. package/neural-interface/public/shared/ui-sidepanel-tray.js +48 -7
  559. package/neural-interface/public/shared/ui-sidepanel-windows.js +18 -13
  560. package/neural-interface/public/shared/ui-skills.js +33 -2830
  561. package/neural-interface/public/shared/ui-styleguide.js +5 -2
  562. package/neural-interface/public/shared/ui-sync.js +15 -5
  563. package/neural-interface/public/shared/ui-terminal.js +270 -190
  564. package/neural-interface/public/shared/ui-tool-updates.js +6 -4
  565. package/neural-interface/public/shared/ui-tooltip.js +81 -51
  566. package/neural-interface/public/shared/ui-topright-overflow.js +233 -0
  567. package/neural-interface/public/shared/ui-trash.js +6 -4
  568. package/neural-interface/public/shared/ui-tutorial-layout.js +3 -117
  569. package/neural-interface/public/shared/ui-tutorial-preview.js +103 -0
  570. package/neural-interface/public/shared/ui-tutorial-steps.js +3 -65
  571. package/neural-interface/public/shared/ui-tutorial.css +47 -100
  572. package/neural-interface/public/shared/ui-tutorial.js +285 -509
  573. package/neural-interface/public/shared/ui-update.js +38 -2
  574. package/neural-interface/public/shared/ui-whiteboard.js +312 -59
  575. package/neural-interface/public/shared/ui-worker-end.js +5 -1
  576. package/neural-interface/public/shared/ui-workspaces.js +3 -2
  577. package/neural-interface/public/shared/view-variant.js +66 -0
  578. package/neural-interface/public/shared/whatsapp/wa-view.js +3 -3
  579. package/neural-interface/public/shared/whiteboard-list.js +172 -0
  580. package/neural-interface/public/shared/worker-end.js +10 -3
  581. package/neural-interface/public/shared/worker-questions.js +34 -0
  582. package/neural-interface/public/shared/worker-restart.js +12 -0
  583. package/neural-interface/public/sidepanel-session.html +2 -2
  584. package/neural-interface/public/variant/2d/background.js +2 -1
  585. package/neural-interface/public/variant/2d/context-menu.js +8 -2
  586. package/neural-interface/public/variant/2d/graph.js +42 -20
  587. package/neural-interface/public/variant/2d/hulls.js +14 -9
  588. package/neural-interface/public/variant/2d/lasso.js +11 -7
  589. package/neural-interface/public/variant/2d/main.js +32 -1
  590. package/neural-interface/public/variant/2d/minimap.js +11 -13
  591. package/neural-interface/public/variant/3d/main.js +69 -6
  592. package/neural-interface/public/variant/3d/map-controls.js +24 -9
  593. package/neural-interface/public/vendor/caveat/OFL.txt +93 -0
  594. package/neural-interface/public/vendor/caveat/caveat-latin-400-normal.woff2 +0 -0
  595. package/neural-interface/public/vendor/caveat/caveat-latin-700-normal.woff2 +0 -0
  596. package/neural-interface/public/vendor/caveat/caveat.css +17 -0
  597. package/neural-interface/public/vendor/caveat/manifest.json +12 -0
  598. package/neural-interface/public/vendor/yaml/LICENSE +13 -0
  599. package/neural-interface/public/vendor/yaml/manifest.json +4 -0
  600. package/neural-interface/public/vendor/yaml/yaml-2.9.1.min.js +137 -0
  601. package/neural-interface/scripts/build-vendor.mjs +32 -0
  602. package/neural-interface/server.js +4553 -2855
  603. package/neural-interface/templates/rulesets/README.md +1 -1
  604. package/neural-interface/templates/rulesets/core.md +1 -1
  605. package/neural-interface/templates/rulesets/legacy-hashes.json +23 -5
  606. package/neural-interface/templates/rulesets/manifest.json +8 -8
  607. package/npm-shrinkwrap.json +34 -12
  608. package/package.json +17 -3
  609. package/postinstall.js +9 -4
  610. package/preuninstall.js +1 -1
  611. package/setup.js +97 -322
  612. package/skills/skill-forge/SKILL.md +177 -0
  613. package/skills/skill-forge/evals/evals.json +54 -0
  614. package/skills/skill-forge/references/package.md +105 -0
  615. package/skills/skill-forge/references/review-and-recovery.md +63 -0
  616. package/skills/skill-forge/references/runtime-profiles.md +20 -0
  617. package/skills/skill-forge/references/sources-and-capabilities.md +51 -0
  618. package/skills/synabun/SKILL.md +10 -7
  619. package/skills/synabun/modules/audit.md +1 -5
  620. package/skills/synabun/modules/changelog.md +1 -5
  621. package/skills/synabun/modules/idea.md +1 -1
  622. package/skills/synabun/modules/memorize.md +6 -9
  623. package/skills/synabun/modules/schedule.md +6 -6
  624. package/mcp-server/dist/services/profiles.d.ts +0 -120
  625. package/mcp-server/dist/services/profiles.d.ts.map +0 -1
  626. package/mcp-server/dist/services/profiles.js +0 -387
  627. package/mcp-server/dist/services/profiles.js.map +0 -1
  628. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +0 -97
  629. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +0 -1
  630. package/mcp-server/dist/tools/leonardo-browser-tools.js +0 -228
  631. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +0 -1
  632. package/mcp-server/dist/tools/leonardo.d.ts +0 -13
  633. package/mcp-server/dist/tools/leonardo.d.ts.map +0 -1
  634. package/mcp-server/dist/tools/leonardo.js +0 -21
  635. package/mcp-server/dist/tools/leonardo.js.map +0 -1
  636. package/mcp-server/dist/tools/profile.d.ts +0 -17
  637. package/mcp-server/dist/tools/profile.d.ts.map +0 -1
  638. package/mcp-server/dist/tools/profile.js +0 -114
  639. package/mcp-server/dist/tools/profile.js.map +0 -1
  640. package/mcp-server/src/services/profiles.ts +0 -428
  641. package/mcp-server/src/tools/leonardo-browser-tools.ts +0 -291
  642. package/mcp-server/src/tools/leonardo.ts +0 -30
  643. package/mcp-server/src/tools/profile.ts +0 -122
  644. package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +0 -47
  645. package/neural-interface/lib/assistant-brains/opencode-route-gate.js +0 -62
  646. package/neural-interface/lib/mcp-profile-servers.js +0 -120
  647. package/neural-interface/public/shared/ui-tutorial-draw.js +0 -311
  648. package/skills/leonardo/SKILL.md +0 -168
  649. package/skills/leonardo/icon.svg +0 -1
  650. package/skills/leonardo/modules/browser-guide.md +0 -378
  651. package/skills/leonardo/modules/image-prompter.md +0 -283
  652. package/skills/leonardo/modules/model-advisor.md +0 -100
  653. package/skills/leonardo/modules/prompt-library.md +0 -110
  654. package/skills/leonardo/modules/style-guide.md +0 -186
  655. package/skills/leonardo/modules/video-prompter.md +0 -317
  656. /package/neural-interface/templates/rulesets/{gemini.md → antigravity.md} +0 -0
@@ -1,47 +1,19 @@
1
1
  // OpenCode history maintenance.
2
2
  //
3
- // This module deliberately owns a very small allowlist of history tables and
4
- // artifact directories. Provider credentials, account state, project records,
5
- // OpenCode configuration, user project files, and git repositories outside the
6
- // OpenCode data directory are never touched.
7
-
8
- // The server runs the destructive operation in a worker so VACUUM can reclaim
9
- // a large history database without freezing SynaBun's HTTP/WebSocket loop.
3
+ // OpenCode 2 keeps its sessions in its own database (opencode.db: session_v2,
4
+ // session_message, its event log, its instruction and inbox tables). SynaBun
5
+ // reads how many there are, read-only, and clears them through OpenCode's own
6
+ // API (DELETE /api/session/:id, which takes a session's child sessions and its
7
+ // rows with it); it never writes OpenCode's database or deletes its folders.
8
+ // Provider credentials, account state, projects, configuration and user files
9
+ // are never touched.
10
10
 
11
11
  import { DatabaseSync } from 'node:sqlite';
12
- import { existsSync, lstatSync, mkdirSync, readdirSync, rmSync, statSync } from 'node:fs';
13
- import { basename, dirname, parse, resolve, sep } from 'node:path';
14
- import { isMainThread, parentPort, Worker, workerData } from 'node:worker_threads';
12
+ import { existsSync, statSync } from 'node:fs';
13
+ import { basename, dirname, parse, resolve } from 'node:path';
15
14
 
16
15
  export const OPENCODE_HISTORY_CONFIRMATION = 'DELETE OPENCODE HISTORY';
17
16
 
18
- // OpenCode 2 keeps its sessions in other tables of the same file (session_v2,
19
- // session_message, its event log): the OpenCode 1 list below would delete its
20
- // messages and events and leave its sessions, which breaks that database. So an
21
- // OpenCode 2 database is never cleared here.
22
- export const OPENCODE2_HISTORY_REFUSAL = 'This OpenCode data belongs to OpenCode 2, whose history SynaBun does not clear. Delete OpenCode 2 sessions from OpenCode itself.';
23
- const isOpencode2Database = (tables) => tables.has('session_v2');
24
-
25
- const HISTORY_TABLES_CHILD_FIRST = [
26
- 'part',
27
- 'message',
28
- 'todo',
29
- 'session_share',
30
- 'session_input',
31
- 'session_message',
32
- 'session_context_epoch',
33
- 'event',
34
- 'event_sequence',
35
- 'session',
36
- ];
37
-
38
- const HISTORY_ARTIFACT_PATHS = [
39
- ['snapshot'],
40
- ['repos'],
41
- ['storage', 'session_diff'],
42
- ['tool-output'],
43
- ];
44
-
45
17
  function fileBytes(path) {
46
18
  try {
47
19
  return statSync(path).size || 0;
@@ -54,25 +26,12 @@ function databaseBytes(dbPath) {
54
26
  return fileBytes(dbPath) + fileBytes(`${dbPath}-wal`) + fileBytes(`${dbPath}-shm`);
55
27
  }
56
28
 
57
- function entryBytes(path) {
58
- let stat;
59
- try {
60
- stat = lstatSync(path);
61
- } catch {
62
- return 0;
63
- }
64
- if (!stat.isDirectory() || stat.isSymbolicLink()) return stat.size || 0;
65
- let total = 0;
66
- for (const name of readdirSync(path)) total += entryBytes(resolve(path, name));
67
- return total;
68
- }
69
-
70
29
  function assertSafePaths(dbPath, dataRoot) {
71
30
  const root = resolve(dataRoot);
72
31
  const database = resolve(dbPath);
73
- if (root === parse(root).root) throw new Error('Refusing to clear an unsafe OpenCode data root');
32
+ if (root === parse(root).root) throw new Error('Refusing to read an unsafe OpenCode data root');
74
33
  if (basename(root).toLowerCase() !== 'opencode') {
75
- throw new Error('Refusing to clear a data root that is not the OpenCode directory');
34
+ throw new Error('Refusing to read a data root that is not the OpenCode directory');
76
35
  }
77
36
  if (database !== resolve(root, 'opencode.db')) {
78
37
  throw new Error('OpenCode database must be the opencode.db file inside its data root');
@@ -80,51 +39,19 @@ function assertSafePaths(dbPath, dataRoot) {
80
39
  return { database, root };
81
40
  }
82
41
 
83
- function tableNames(db) {
84
- return new Set(db.prepare("SELECT name FROM sqlite_master WHERE type = 'table'").all()
85
- .map((row) => String(row?.name || '')));
86
- }
87
-
88
- function countRows(db, table, tables) {
89
- if (!tables.has(table)) return 0;
90
- const row = db.prepare(`SELECT COUNT(*) AS count FROM "${table}"`).get();
91
- return Number(row?.count || 0);
92
- }
93
-
94
- function artifactStats(dataRoot) {
95
- let bytes = 0;
96
- let entries = 0;
97
- for (const segments of HISTORY_ARTIFACT_PATHS) {
98
- const path = resolve(dataRoot, ...segments);
99
- if (!existsSync(path)) continue;
100
- bytes += entryBytes(path);
101
- entries += 1;
102
- }
103
- return { bytes, entries };
104
- }
105
-
42
+ /** `{ sessions, databaseBytes }`: OpenCode's sessions (session_v2 rows, child sessions included) and its database's size. */
106
43
  export function getOpenCodeHistoryStats({ dbPath, dataRoot = dirname(dbPath) }) {
107
- const { database, root } = assertSafePaths(dbPath, dataRoot);
108
- const artifacts = artifactStats(root);
109
- const stats = {
110
- sessions: 0,
111
- databaseBytes: databaseBytes(database),
112
- artifactBytes: artifacts.bytes,
113
- };
44
+ const { database } = assertSafePaths(dbPath, dataRoot);
45
+ const stats = { sessions: 0, databaseBytes: databaseBytes(database) };
114
46
  if (!existsSync(database)) return stats;
115
-
116
47
  let db;
117
48
  try {
118
49
  db = new DatabaseSync(database, { readOnly: true });
119
50
  db.exec('PRAGMA busy_timeout = 2000');
120
- const tables = tableNames(db);
121
- if (isOpencode2Database(tables)) {
122
- stats.sessions = countRows(db, 'session_v2', tables);
123
- stats.opencode2 = true;
124
- stats.clearable = false;
125
- stats.reason = OPENCODE2_HISTORY_REFUSAL;
126
- } else {
127
- stats.sessions = countRows(db, 'session', tables);
51
+ const tables = new Set(db.prepare("SELECT name FROM sqlite_master WHERE type = 'table'").all().map((row) => String(row?.name || '')));
52
+ if (tables.has('session_v2')) {
53
+ const row = db.prepare('SELECT COUNT(*) AS count FROM "session_v2"').get();
54
+ stats.sessions = Number(row?.count || 0);
128
55
  }
129
56
  } finally {
130
57
  try { db?.close(); } catch {}
@@ -132,137 +59,40 @@ export function getOpenCodeHistoryStats({ dbPath, dataRoot = dirname(dbPath) })
132
59
  return stats;
133
60
  }
134
61
 
135
- function clearArtifactDirectory(path, warnings) {
136
- if (!existsSync(path)) return { files: 0, bytes: 0 };
137
- const stat = lstatSync(path);
138
-
139
- // Never traverse a symlink out of the OpenCode data directory. Removing the
140
- // link still detaches it from OpenCode, but the external target is retained.
141
- if (stat.isSymbolicLink()) {
142
- const bytes = stat.size || 0;
143
- rmSync(path, { force: true });
144
- mkdirSync(path, { recursive: true });
145
- warnings.push(`Removed linked artifact directory ${path} without following its external target`);
146
- return { files: 1, bytes };
147
- }
148
- if (!stat.isDirectory()) {
149
- const bytes = stat.size || 0;
150
- rmSync(path, { force: true });
151
- mkdirSync(path, { recursive: true });
152
- return { files: 1, bytes };
153
- }
154
-
155
- let files = 0;
156
- let bytes = 0;
157
- for (const name of readdirSync(path)) {
158
- const target = resolve(path, name);
159
- if (target !== path && !target.startsWith(`${path}${sep}`)) {
160
- throw new Error(`Refusing to clear unsafe artifact path: ${target}`);
161
- }
162
- bytes += entryBytes(target);
163
- rmSync(target, { recursive: true, force: true });
164
- files += 1;
165
- }
166
- return { files, bytes };
167
- }
168
-
169
- export function clearOpenCodeHistory({ dbPath, dataRoot = dirname(dbPath), vacuum = true }) {
170
- const { database, root } = assertSafePaths(dbPath, dataRoot);
171
- const warnings = [];
172
- const result = {
173
- sessionsDeleted: 0,
174
- messagesDeleted: 0,
175
- partsDeleted: 0,
176
- databaseBytesBefore: databaseBytes(database),
177
- databaseBytesAfter: 0,
178
- artifactEntriesDeleted: 0,
179
- artifactBytesDeleted: 0,
180
- vacuumed: false,
181
- warnings,
182
- };
183
-
184
- if (existsSync(database)) {
185
- let db;
186
- try {
187
- db = new DatabaseSync(database);
188
- db.exec('PRAGMA foreign_keys = ON');
189
- db.exec('PRAGMA busy_timeout = 10000');
190
- const tables = tableNames(db);
191
- if (isOpencode2Database(tables)) throw new Error(OPENCODE2_HISTORY_REFUSAL);
192
- result.sessionsDeleted = countRows(db, 'session', tables);
193
- result.messagesDeleted = countRows(db, 'message', tables);
194
- result.partsDeleted = countRows(db, 'part', tables);
195
-
196
- db.exec('BEGIN IMMEDIATE');
197
- try {
198
- for (const table of HISTORY_TABLES_CHILD_FIRST) {
199
- if (tables.has(table)) db.exec(`DELETE FROM "${table}"`);
200
- }
201
- db.exec('COMMIT');
202
- } catch (error) {
203
- try { db.exec('ROLLBACK'); } catch {}
204
- throw error;
205
- }
206
-
207
- if (vacuum) {
208
- try {
209
- try { db.exec('PRAGMA wal_checkpoint(TRUNCATE)'); } catch {}
210
- db.exec('VACUUM');
211
- try { db.exec('PRAGMA wal_checkpoint(TRUNCATE)'); } catch {}
212
- result.vacuumed = true;
213
- } catch (error) {
214
- warnings.push(`History was deleted, but database compaction failed: ${error.message}`);
62
+ const errorText = (error) => (typeof error === 'string' ? error : error?.message || error?.data?.message || error?._tag || 'unknown error');
63
+
64
+ /**
65
+ * Delete every OpenCode session through `client` (lib/opencode2-client.js: `session.list` and `session.delete`,
66
+ * answering `{ data, error, response }`): a page of root sessions at a time, newest first, live ones and then
67
+ * archived ones; a root takes its child sessions with it. A session already gone (404) counts as deleted. Stops on
68
+ * a page where nothing could be deleted; what failed is in `failed`. Resolves
69
+ * `{ sessionsDeleted, failed: [{ id, error }], warnings }`; throws when the list itself cannot be read.
70
+ */
71
+ export async function clearOpenCodeHistory(client, { pageSize = 100, maxPages = 1000 } = {}) {
72
+ const result = { sessionsDeleted: 0, failed: [], warnings: [] };
73
+ const failedIds = new Set();
74
+ for (const archived of [false, true]) {
75
+ for (let page = 0; page < maxPages; page++) {
76
+ const listed = await client.session.list({ roots: true, limit: pageSize, ...(archived ? { archived: true } : {}) });
77
+ if (listed?.error) throw new Error(`OpenCode did not list its sessions: ${errorText(listed.error)}`);
78
+ const ids = (Array.isArray(listed?.data) ? listed.data : []).map((session) => session?.id).filter((id) => id && !failedIds.has(id));
79
+ if (!ids.length) break;
80
+ let deleted = 0;
81
+ for (const id of ids) {
82
+ const removed = await client.session.delete({ sessionID: id });
83
+ if (removed?.error && Number(removed.response?.status) !== 404) {
84
+ failedIds.add(id);
85
+ result.failed.push({ id, error: errorText(removed.error) });
86
+ } else {
87
+ result.sessionsDeleted += 1;
88
+ deleted += 1;
215
89
  }
216
90
  }
217
- } finally {
218
- try { db?.close(); } catch {}
91
+ if (!deleted) break;
219
92
  }
220
93
  }
221
-
222
- for (const segments of HISTORY_ARTIFACT_PATHS) {
223
- const artifactPath = resolve(root, ...segments);
224
- if (artifactPath !== root && !artifactPath.startsWith(`${root}${sep}`)) {
225
- throw new Error(`Refusing to clear unsafe artifact path: ${artifactPath}`);
226
- }
227
- try {
228
- const cleared = clearArtifactDirectory(artifactPath, warnings);
229
- result.artifactEntriesDeleted += cleared.files;
230
- result.artifactBytesDeleted += cleared.bytes;
231
- } catch (error) {
232
- warnings.push(`Could not clear ${artifactPath}: ${error.message}`);
233
- }
94
+ if (result.failed.length) {
95
+ result.warnings.push(`${result.failed.length} OpenCode session(s) could not be deleted (${result.failed[0].error}).`);
234
96
  }
235
-
236
- result.databaseBytesAfter = databaseBytes(database);
237
97
  return result;
238
98
  }
239
-
240
- export function clearOpenCodeHistoryInWorker(options) {
241
- return new Promise((resolvePromise, rejectPromise) => {
242
- const worker = new Worker(new URL(import.meta.url), {
243
- workerData: { operation: 'clear-opencode-history', options },
244
- });
245
- let settled = false;
246
- worker.once('message', (message) => {
247
- settled = true;
248
- if (message?.ok) resolvePromise(message.result);
249
- else rejectPromise(new Error(message?.error || 'OpenCode history worker failed'));
250
- });
251
- worker.once('error', (error) => {
252
- settled = true;
253
- rejectPromise(error);
254
- });
255
- worker.once('exit', (code) => {
256
- if (!settled && code !== 0) rejectPromise(new Error(`OpenCode history worker exited with code ${code}`));
257
- else if (!settled) rejectPromise(new Error('OpenCode history worker exited before returning a result'));
258
- });
259
- });
260
- }
261
-
262
- if (!isMainThread && workerData?.operation === 'clear-opencode-history') {
263
- try {
264
- parentPort?.postMessage({ ok: true, result: clearOpenCodeHistory(workerData.options) });
265
- } catch (error) {
266
- parentPort?.postMessage({ ok: false, error: error?.message || String(error) });
267
- }
268
- }
@@ -0,0 +1,108 @@
1
+ // OpenCode connects MCP in the background, then debounces tool registration by 100 ms.
2
+ // A connected status alone is too early for either direct tools or the Code Mode catalog.
3
+ import { resolve } from 'node:path';
4
+ import { mcpServersOf, opencodeConfigFilePath, readOpencodeConfigDocument } from './opencode-config.js';
5
+ import { mcpStatusRouteAvailability } from './assistant-route-gate.js';
6
+
7
+ export const OPENCODE_MCP_READY_TIMEOUT_MS = 35_000;
8
+ export const OPENCODE_MCP_SETTLE_MS = 750;
9
+ export const OPENCODE_MCP_LIST_GRACE_MS = 3_000;
10
+ const states = new WeakMap();
11
+ const knob = (value, fallback) => Number.isFinite(value) && value >= 0 ? value : fallback;
12
+
13
+ export function synabunMcpState(servers) {
14
+ const verdict = mcpStatusRouteAvailability(servers);
15
+ if (verdict?.available) return 'connected';
16
+ if (verdict) return 'down';
17
+ const names = Array.isArray(servers) ? servers.map((server) => server?.name) : Object.keys(servers || {});
18
+ return names.some((name) => String(name || '').toLowerCase() === 'synabun') ? 'starting' : 'missing';
19
+ }
20
+
21
+ export function synabunConfigured(xdgRoot) {
22
+ try {
23
+ const doc = readOpencodeConfigDocument(opencodeConfigFilePath(resolve(xdgRoot, 'opencode')));
24
+ if (!doc.exists || doc.error) return false;
25
+ const entry = Object.entries(mcpServersOf(doc.config)).find(([name]) => name.toLowerCase() === 'synabun')?.[1];
26
+ return !!entry && entry.disabled !== true;
27
+ } catch { return false; }
28
+ }
29
+
30
+ function stateFor(client, directory) {
31
+ let directories = states.get(client);
32
+ if (!directories) { directories = new Map(); states.set(client, directories); }
33
+ const key = directory || '';
34
+ if (!directories.has(key)) directories.set(key, { readyAt: Date.now(), seenAt: null, gaveUp: false });
35
+ return directories.get(key);
36
+ }
37
+
38
+ /** Reconnects invalidate only this client's directory; the reconnect and next prompt share the same settle. */
39
+ export function invalidateSynabunTools(client, directory) {
40
+ Object.assign(stateFor(client, directory), { readyAt: Date.now(), seenAt: null, gaveUp: false });
41
+ }
42
+
43
+ // Bound even a hung status request; an AbortSignal wakes both a request and a settle immediately.
44
+ async function interruptible(promise, ms, signal) {
45
+ let timer, abort;
46
+ try {
47
+ return await Promise.race([
48
+ Promise.resolve(promise).then((value) => ({ value }), () => ({ failed: true })),
49
+ new Promise((done) => {
50
+ timer = setTimeout(() => done({ timedOut: true }), Math.max(0, ms));
51
+ abort = () => done({ aborted: true });
52
+ if (signal?.aborted) abort();
53
+ else signal?.addEventListener('abort', abort, { once: true });
54
+ }),
55
+ ]);
56
+ } finally { clearTimeout(timer); signal?.removeEventListener('abort', abort); }
57
+ }
58
+
59
+ /** false means Stop/dispose: the caller must send no prompt. Cached per serve client + directory. */
60
+ export async function waitForSynabunTools(client, {
61
+ directory, expected = true, signal, stopped = () => false, onStatus = null, onTimeout = () => {},
62
+ readyTimeoutMs, settleMs, listGraceMs, pollMs,
63
+ } = {}) {
64
+ const cancelled = () => signal?.aborted || stopped();
65
+ if (cancelled()) return false;
66
+ if (!expected && !onStatus) return !cancelled();
67
+ if (typeof client?.mcp?.status !== 'function') return !cancelled();
68
+ const state = stateFor(client, directory);
69
+ const cap = knob(readyTimeoutMs, OPENCODE_MCP_READY_TIMEOUT_MS);
70
+ const settle = knob(settleMs, OPENCODE_MCP_SETTLE_MS);
71
+ const grace = knob(listGraceMs, OPENCODE_MCP_LIST_GRACE_MS);
72
+ const poll = Math.max(1, knob(pollMs, 100));
73
+ const deadline = Date.now() + cap;
74
+ const expired = () => {
75
+ if (!state.gaveUp) { state.gaveUp = true; onTimeout(cap); }
76
+ return !cancelled();
77
+ };
78
+ for (;;) {
79
+ const statusBudget = state.gaveUp || !expected ? poll : Math.max(1, deadline - Date.now());
80
+ const response = await interruptible(Promise.resolve().then(() => client.mcp.status({ directory })), statusBudget, signal);
81
+ if (cancelled() || response.aborted) return false;
82
+ if (response.timedOut) return expected ? expired() : true;
83
+ if (response.failed || response.value?.error || Number(response.value?.status) >= 400) return true;
84
+ const servers = response.value?.data || response.value || [];
85
+ if (!expected) { onStatus?.(servers); return !cancelled(); }
86
+ const status = synabunMcpState(servers);
87
+ const now = Date.now();
88
+ let pause = poll;
89
+ if (status === 'connected') {
90
+ state.seenAt ??= now;
91
+ const left = state.seenAt + settle - now;
92
+ if (left <= 0) { state.gaveUp = false; onStatus?.(servers); return !cancelled(); }
93
+ // Recovering after a previous cap still settles once; it never repeats the startup bound.
94
+ pause = Math.min(poll, left);
95
+ } else {
96
+ state.seenAt = null;
97
+ if (status === 'down' || (status === 'missing' && now - state.readyAt >= grace)) { onStatus?.(servers); return !cancelled(); }
98
+ if (state.gaveUp) { onStatus?.(servers); return true; }
99
+ }
100
+ if (now >= deadline) { onStatus?.(servers); return expired(); }
101
+ await interruptible(new Promise(() => {}), Math.min(pause, deadline - now), signal);
102
+ if (cancelled()) return false;
103
+ }
104
+ }
105
+
106
+ export function synabunToolsTimeoutText(ms, surface = 'session') {
107
+ return `SynaBun's tools are not ready in this OpenCode ${surface}: its SynaBun MCP server has not connected after ${Math.round(ms / 1000)} s, so this turn goes out without them${surface === 'brain' ? ' (no routing or memory)' : ''}. Check Settings → OpenCode or recreate this ${surface}.`;
108
+ }
@@ -0,0 +1,53 @@
1
+ // Native page WebSockets are safe only behind a server boundary established at
2
+ // listen time. This is a capability allowlist, not a generic OpenCode version
3
+ // check: 2.1.4's HTTP/upgrade authentication and stdout password path were
4
+ // inspected and tested. Unknown binaries/command wrappers keep the old guard.
5
+ // 2.2.5 (Homebrew anomalyco/tap/opencode-v2) checked 2026-11-01 against throwaway
6
+ // serves on 127.0.0.1: no password variable → it prints "server password <secret>"
7
+ // on stdout; every /api route (session, config, event, pty, shell, file, mcp, and
8
+ // the new tunnel and pairing) answers 401 without it, both plain and as a
9
+ // WebSocket upgrade, and 200 with it; one listener, bound to 127.0.0.1 only.
10
+ // Non-/api paths serve the static web UI (HTML), as before.
11
+ export const NATIVE_SERVE_VERSIONS = Object.freeze(['2.1.4', '2.2.5']);
12
+
13
+ export function nativeServeCapability({ version, commandLine = false, passwordFrom } = {}) {
14
+ const bare = String(version || '').trim().replace(/^opencode\s+/, '').replace(/^v/, '');
15
+ return !commandLine && passwordFrom === 'stdout' && NATIVE_SERVE_VERSIONS.includes(bare);
16
+ }
17
+
18
+ export function createNativeServeBoundary() {
19
+ const processes = new Map();
20
+ const contexts = new Map();
21
+ const error = () => new Error(`Native browser WebSockets require authenticated OpenCode ${NATIVE_SERVE_VERSIONS.join(' or ')} serves with private stdout credentials; wait for startup, stop unverified serves or use the verified executable path.`);
22
+ return {
23
+ assertLaunch(safe) { if (!safe && contexts.size) throw error(); },
24
+ track(proc, { port, safe = false }) {
25
+ if (!proc || proc.exitCode != null || proc.signalCode != null) return;
26
+ processes.set(proc, { port: Number(port), safe, ready: false });
27
+ const release = () => processes.delete(proc);
28
+ proc.once('exit', release);
29
+ proc.once('error', () => { if (!proc.pid) release(); });
30
+ },
31
+ ready(proc) { const entry = processes.get(proc); if (entry) entry.ready = true; },
32
+ protect(context, { ports, unverifiedRecords = [] }) {
33
+ if (contexts.has(context)) return contexts.get(context);
34
+ const verified = new Set();
35
+ for (const { port, safe, ready } of processes.values()) {
36
+ if (!safe || !ready) throw error();
37
+ verified.add(port);
38
+ }
39
+ if ([...ports].some(port => !verified.has(Number(port))) || unverifiedRecords.length) throw error();
40
+ const browser = context.browser();
41
+ const release = () => {
42
+ if (contexts.get(context) !== release) return;
43
+ contexts.delete(context);
44
+ context.removeListener('close', release);
45
+ browser.removeListener('disconnected', release);
46
+ };
47
+ contexts.set(context, release);
48
+ context.once('close', release);
49
+ browser.once('disconnected', release);
50
+ return release;
51
+ },
52
+ };
53
+ }