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
@@ -11,12 +11,23 @@
11
11
  * emitted by its old Settings writer. All unrelated configuration is left
12
12
  * byte-for-byte intact. Repairs keep a backup; file writes are atomic,
13
13
  * preserve the original mode, and are idempotent.
14
+ *
15
+ * The managed keys: SYNABUN_TOOLS = "all" (every SynaBun tool; a Codex
16
+ * runtime's own list is only its focus) and SYNABUN_TOOL_CATALOG_MODE =
17
+ * "deferred". SYNABUN_PROFILE, the key a tool list replaced, is never written.
18
+ * Its old managed value "full" is left where it is: a Neural Interface from
19
+ * before tool lists (until it restarts, or another install sharing this file)
20
+ * repairs any config without it, and the MCP child reads SYNABUN_TOOLS first,
21
+ * so the line is inert and the two never undo each other's repair. Any other
22
+ * SYNABUN_PROFILE value is removed.
14
23
  */
15
24
  import {
16
25
  chmodSync,
17
26
  copyFileSync,
18
27
  existsSync,
28
+ lstatSync,
19
29
  readFileSync,
30
+ realpathSync,
20
31
  renameSync,
21
32
  statSync,
22
33
  unlinkSync,
@@ -28,15 +39,19 @@ const ENV_SECTION = `${BASE_SECTION}.env`;
28
39
  const TOOL_SECTION_PREFIX = `${BASE_SECTION}.tools.`;
29
40
  const SECTION_HEADER_RE = /^\[([^\]]+)\]\s*$/m;
30
41
  const INLINE_ENV_LINE_RE = /^env\s*=\s*\{([^}]*)\}\s*\r?\n?/m;
31
- const MANAGED_PROFILE_KEY = 'SYNABUN_PROFILE';
32
- const CODEX_PROFILE = 'full';
42
+ const MANAGED_TOOLS_KEY = 'SYNABUN_TOOLS';
43
+ const CODEX_TOOLS = 'all';
44
+ const LEGACY_PROFILE_KEY = 'SYNABUN_PROFILE';
45
+ /** The value a Neural Interface from before tool lists writes and repairs: left alone (see the header). */
46
+ const LEGACY_CODEX_PROFILE = 'full';
33
47
  const TOOL_CATALOG_MODE_KEY = 'SYNABUN_TOOL_CATALOG_MODE';
34
48
  const CODEX_TOOL_CATALOG_MODE = 'deferred';
35
49
 
36
50
  export type CodexConfigIssue =
37
51
  | 'duplicate_env'
38
52
  | 'legacy_inline_env'
39
- | 'managed_profile_override'
53
+ | 'managed_tools_override'
54
+ | 'legacy_profile_key'
40
55
  | 'missing_deferred_catalog'
41
56
  | 'missing_transport'
42
57
  | 'orphan_env'
@@ -60,8 +75,9 @@ export type HealReason =
60
75
  | 'removed_ignored_settings'
61
76
  | 'removed_duplicate_inline_env'
62
77
  | 'normalized_inline_env'
63
- | 'removed_managed_profile_override'
64
- | 'set_full_profile'
78
+ | 'migrated_profile_key'
79
+ | 'set_all_tools'
80
+ | 'removed_legacy_profile_key'
65
81
  | 'enabled_deferred_catalog'
66
82
  | 'removed_orphan_sections';
67
83
 
@@ -182,8 +198,9 @@ function upsertTomlKey(body: string, key: string, serializedValue: string): stri
182
198
  const keyRe = new RegExp(`^${escapeRegExp(key)}\\s*=.*$`, 'm');
183
199
  if (keyRe.test(body)) return body.replace(keyRe, `${key} = ${serializedValue}`);
184
200
  const newline = body.includes('\r\n') ? '\r\n' : '\n';
185
- const trimmed = body.replace(/^\r?\n/, '').replace(/[ \t]*$/, '');
186
- return `${newline}${key} = ${serializedValue}${trimmed ? `${newline}${trimmed}` : ''}${newline}`;
201
+ // The new key goes first; the rest of the body keeps its own lines, the blank one before the next table included.
202
+ const rest = body.replace(/^\r?\n/, '');
203
+ return `${newline}${key} = ${serializedValue}${newline}${rest}`;
187
204
  }
188
205
 
189
206
  function removeTomlKey(body: string, key: string): string {
@@ -196,10 +213,11 @@ function renderEnvSection(env: Record<string, string>, newline: string): string
196
213
  return `[${ENV_SECTION}]${newline}${lines.join(newline)}${newline}`;
197
214
  }
198
215
 
199
- function upsertEnvSection(content: string, env: Record<string, string>): string {
216
+ function upsertEnvSection(content: string, env: Record<string, string>, { remove = [] }: { remove?: readonly string[] } = {}): string {
200
217
  const newline = content.includes('\r\n') ? '\r\n' : '\n';
201
218
  const sanitized = { ...env };
202
- sanitized[MANAGED_PROFILE_KEY] = CODEX_PROFILE;
219
+ for (const key of remove) delete sanitized[key];
220
+ sanitized[MANAGED_TOOLS_KEY] = CODEX_TOOLS;
203
221
  sanitized[TOOL_CATALOG_MODE_KEY] = CODEX_TOOL_CATALOG_MODE;
204
222
 
205
223
  if (!hasSection(content, ENV_SECTION)) {
@@ -208,12 +226,17 @@ function upsertEnvSection(content: string, env: Record<string, string>): string
208
226
  }
209
227
 
210
228
  let body = sectionBody(content, ENV_SECTION);
229
+ for (const key of remove) body = removeTomlKey(body, key);
211
230
  for (const [key, value] of Object.entries(sanitized)) {
212
231
  body = upsertTomlKey(body, key, quote(value));
213
232
  }
214
233
  return replaceSectionBody(content, ENV_SECTION, body);
215
234
  }
216
235
 
236
+ function hasKey(env: Record<string, string>, key: string): boolean {
237
+ return Object.prototype.hasOwnProperty.call(env, key);
238
+ }
239
+
217
240
  function baseInlineEnv(content: string): Record<string, string> {
218
241
  const body = sectionBody(content, BASE_SECTION);
219
242
  const match = INLINE_ENV_LINE_RE.exec(body);
@@ -242,13 +265,16 @@ export function inspectCodexConfigContent(content: string): CodexConfigInspectio
242
265
 
243
266
  if (inlineEnv && hasEnv) issues.push('duplicate_env');
244
267
  else if (inlineEnv) issues.push('legacy_inline_env');
245
- const configuredProfile = tableEnv[MANAGED_PROFILE_KEY] || inlineValues[MANAGED_PROFILE_KEY];
246
- if (hasBase && hasTransport(content) && configuredProfile !== CODEX_PROFILE) {
247
- issues.push('managed_profile_override');
248
- }
249
- if (hasBase && hasTransport(content)
250
- && (tableEnv[TOOL_CATALOG_MODE_KEY] || inlineValues[TOOL_CATALOG_MODE_KEY]) !== CODEX_TOOL_CATALOG_MODE) {
251
- issues.push('missing_deferred_catalog');
268
+ if (hasBase && hasTransport(content)) {
269
+ const tools = tableEnv[MANAGED_TOOLS_KEY] || inlineValues[MANAGED_TOOLS_KEY];
270
+ const hasProfile = hasKey(tableEnv, LEGACY_PROFILE_KEY) || hasKey(inlineValues, LEGACY_PROFILE_KEY);
271
+ const profile = tableEnv[LEGACY_PROFILE_KEY] ?? inlineValues[LEGACY_PROFILE_KEY];
272
+ // A config from before tool lists names only SYNABUN_PROFILE: migrating it is one issue, not two.
273
+ if (tools !== CODEX_TOOLS) issues.push(!tools && hasProfile ? 'legacy_profile_key' : 'managed_tools_override');
274
+ if (hasProfile && profile !== LEGACY_CODEX_PROFILE && !issues.includes('legacy_profile_key')) issues.push('legacy_profile_key');
275
+ if ((tableEnv[TOOL_CATALOG_MODE_KEY] || inlineValues[TOOL_CATALOG_MODE_KEY]) !== CODEX_TOOL_CATALOG_MODE) {
276
+ issues.push('missing_deferred_catalog');
277
+ }
252
278
  }
253
279
  if (hasBase && !hasTransport(content)) issues.push('missing_transport');
254
280
  if (!hasBase && hasEnv) issues.push('orphan_env');
@@ -286,23 +312,33 @@ export function repairCodexConfigContent(content: string): { content: string; re
286
312
  const tableEnv = parseEnvTable(next);
287
313
  const hadInline = INLINE_ENV_LINE_RE.test(sectionBody(next, BASE_SECTION));
288
314
  const hadTable = hasSection(next, ENV_SECTION);
289
- const hadCanonicalProfile = (tableEnv[MANAGED_PROFILE_KEY] || inlineEnv[MANAGED_PROFILE_KEY]) === CODEX_PROFILE;
315
+ const configuredTools = tableEnv[MANAGED_TOOLS_KEY] || inlineEnv[MANAGED_TOOLS_KEY];
316
+ const hadAllTools = configuredTools === CODEX_TOOLS;
317
+ const hasProfile = hasKey(tableEnv, LEGACY_PROFILE_KEY) || hasKey(inlineEnv, LEGACY_PROFILE_KEY);
318
+ // "full" stays: an older Neural Interface writes it back into a config without it (through an account's link to
319
+ // this file, its write replaces the link), and next to SYNABUN_TOOLS it decides nothing.
320
+ const keepProfile = (tableEnv[LEGACY_PROFILE_KEY] ?? inlineEnv[LEGACY_PROFILE_KEY]) === LEGACY_CODEX_PROFILE;
290
321
  const hadDeferredCatalog = (tableEnv[TOOL_CATALOG_MODE_KEY] || inlineEnv[TOOL_CATALOG_MODE_KEY]) === CODEX_TOOL_CATALOG_MODE;
291
322
  const mergedEnv = { ...inlineEnv, ...tableEnv };
292
- mergedEnv[MANAGED_PROFILE_KEY] = CODEX_PROFILE;
293
- mergedEnv[TOOL_CATALOG_MODE_KEY] = CODEX_TOOL_CATALOG_MODE;
323
+ const remove = hasProfile && !keepProfile ? [LEGACY_PROFILE_KEY] : [];
294
324
 
295
325
  if (hadInline) next = stripInlineEnv(next);
296
- next = upsertEnvSection(next, mergedEnv);
326
+ next = upsertEnvSection(next, mergedEnv, { remove });
297
327
 
298
328
  if (next === content) return { content, reason: null };
299
329
  if (hadInline && hadTable) return { content: next, reason: 'removed_duplicate_inline_env' };
300
330
  if (hadInline) return { content: next, reason: 'normalized_inline_env' };
301
- if (!hadCanonicalProfile) return { content: next, reason: 'set_full_profile' };
331
+ if (!configuredTools && hasProfile) return { content: next, reason: 'migrated_profile_key' };
332
+ if (!hadAllTools) return { content: next, reason: 'set_all_tools' };
333
+ if (remove.length) return { content: next, reason: 'removed_legacy_profile_key' };
302
334
  if (!hadDeferredCatalog) return { content: next, reason: 'enabled_deferred_catalog' };
303
335
  return { content: next, reason: null };
304
336
  }
305
337
 
338
+ /**
339
+ * Register SynaBun with this definition. SYNABUN_PROFILE is never written from a definition; one already there is
340
+ * kept only as "full", like the heal keeps it.
341
+ */
306
342
  export function upsertCodexMcpContent(content: string, definition: CodexMcpDefinition): string {
307
343
  let next = repairCodexConfigContent(content).content;
308
344
  const newline = next.includes('\r\n') ? '\r\n' : '\n';
@@ -319,7 +355,10 @@ export function upsertCodexMcpContent(content: string, definition: CodexMcpDefin
319
355
  }
320
356
 
321
357
  const existingEnv = parseEnvTable(next);
322
- next = upsertEnvSection(next, { ...existingEnv, ...definition.env });
358
+ const env: Record<string, string> = { ...existingEnv, ...definition.env };
359
+ delete env[LEGACY_PROFILE_KEY];
360
+ const remove = hasKey(existingEnv, LEGACY_PROFILE_KEY) && existingEnv[LEGACY_PROFILE_KEY] !== LEGACY_CODEX_PROFILE ? [LEGACY_PROFILE_KEY] : [];
361
+ next = upsertEnvSection(next, env, { remove });
323
362
  return next.endsWith(newline) ? next : `${next}${newline}`;
324
363
  }
325
364
 
@@ -331,16 +370,28 @@ export function removeCodexMcpContent(content: string): string {
331
370
  ]);
332
371
  }
333
372
 
373
+ /**
374
+ * The file a path writes to. A Codex account's CODEX_HOME links config.toml to the canonical one: a write goes to
375
+ * the file the link names, so the link (and the sharing it gives every account) stays.
376
+ */
377
+ function writeTarget(configPath: string): string {
378
+ try {
379
+ if (lstatSync(configPath).isSymbolicLink()) return realpathSync(configPath);
380
+ } catch { /* a new file, or a link to nothing: written in place */ }
381
+ return configPath;
382
+ }
383
+
334
384
  function atomicWrite(configPath: string, content: string): void {
335
- const mode = existsSync(configPath) ? statSync(configPath).mode : null;
336
- const tmpPath = `${configPath}.synabun-${process.pid}.tmp`;
385
+ const target = writeTarget(configPath);
386
+ const mode = existsSync(target) ? statSync(target).mode : null;
387
+ const tmpPath = `${target}.synabun-${process.pid}.tmp`;
337
388
  writeFileSync(tmpPath, content, 'utf-8');
338
389
  if (mode !== null) chmodSync(tmpPath, mode);
339
390
  try {
340
- renameSync(tmpPath, configPath);
391
+ renameSync(tmpPath, target);
341
392
  } catch (renameErr) {
342
- try { copyFileSync(tmpPath, configPath); } catch { /* preserve original when possible */ }
343
- if (existsSync(configPath) && readFileSync(configPath, 'utf-8') === content) {
393
+ try { copyFileSync(tmpPath, target); } catch { /* preserve original when possible */ }
394
+ if (existsSync(target) && readFileSync(target, 'utf-8') === content) {
344
395
  try { unlinkSync(tmpPath); } catch { /* best effort */ }
345
396
  return;
346
397
  }
@@ -377,8 +428,8 @@ export function healCodexConfig(configPath: string): HealResult {
377
428
  }
378
429
 
379
430
  try {
380
- // Keep the exact original, including unrelated tables and its permissions.
381
- const backup = `${configPath}.synabun-backup-${Date.now()}-${process.pid}`;
431
+ // Keep the exact original, including unrelated tables and its permissions, next to the file it came from.
432
+ const backup = `${writeTarget(configPath)}.synabun-backup-${Date.now()}-${process.pid}`;
382
433
  copyFileSync(configPath, backup);
383
434
  atomicWrite(configPath, repaired.content);
384
435
  } catch (err) {
@@ -192,7 +192,7 @@ export function runWithBrainCredential<T>(credential: string | null, fn: () => T
192
192
  /**
193
193
  * The WhatsApp brain credential of the current caller (whatsapp_send_file sends it on its one request
194
194
  * and nowhere else): the request's own header over HTTP (X-Synabun-Brain-Token, the Claude brain),
195
- * SYNABUN_BRAIN_TOKEN for stdio children (the Codex and OpenCode brains). Never the host process's
195
+ * SYNABUN_BRAIN_TOKEN for stdio children (the Codex, OpenCode and Antigravity brains). Never the host process's
196
196
  * env for an HTTP caller.
197
197
  */
198
198
  export function callerBrainCredential(): string | null {
@@ -203,7 +203,7 @@ export function callerBrainCredential(): string | null {
203
203
  /**
204
204
  * Role of the current caller: the ALS identity's role over HTTP (derived from
205
205
  * X-Synabun-Role on every request), or SYNABUN_ROLE for stdio children —
206
- * Codex/OpenCode assistant brains pass the role to their MCP child via env.
206
+ * Codex/OpenCode/Antigravity assistant brains pass the role to their MCP child via env.
207
207
  * In HTTP mode a missing ALS store is a propagation bug, so the host
208
208
  * process's own env must never grant a role to an unidentified caller.
209
209
  */
@@ -303,13 +303,19 @@ let timer: ReturnType<typeof setInterval> | null = null;
303
303
  /** Forget in-memory pacing state (start/resume, and tests). Persisted counters are untouched. */
304
304
  export function resetJudgeBackfillRunner(): void { consecutiveFailures = 0; nextTickAt = 0; }
305
305
 
306
+ /**
307
+ * Persist the counters gathered since the last flush. `force` flushes now instead of at the next due point; with
308
+ * nothing gathered nothing is written, forced or not: a server that stops (stopJudgeBackfill) commits nothing to
309
+ * memory.db then, so a pre-update snapshot taken before its stop still stands for the database
310
+ * (checkUpgradeSnapshotFreshness in neural-interface/lib/backup-service.js).
311
+ */
306
312
  function flushProgress(force = false): void {
307
313
  const due = force || jobsSinceFlush >= FLUSH_EVERY_JOBS || Date.now() - lastFlushAt >= FLUSH_EVERY_MS;
308
314
  if (!due) return;
309
315
  const pending = delta;
310
316
  const hasChanges = pending.judged || pending.skipped || pending.failures || pending.lastError;
311
317
  delta = emptyDelta(); jobsSinceFlush = 0; lastFlushAt = Date.now();
312
- if (!hasChanges && !force) return;
318
+ if (!hasChanges) return;
313
319
  try {
314
320
  mutateTypeSafeConfig(current => {
315
321
  const b = current.backfill;
@@ -2,7 +2,7 @@ import { createHash } from 'node:crypto';
2
2
  import { getDb } from './sqlite.js';
3
3
 
4
4
  export interface MemoryEvent {
5
- host: 'claude-code'|'codex'|'opencode'; session_id: string; source_id: string;
5
+ host: 'claude-code'|'codex'|'opencode'|'antigravity'; session_id: string; source_id: string;
6
6
  project: string; timestamp: string; role: 'user'|'assistant'|'tool'; text: string;
7
7
  cwd?: string; tools?: string[]; files?: string[];
8
8
  }
@@ -18,6 +18,15 @@ function visibleText(content: any): string {
18
18
  function clean(text: string) {
19
19
  return text.replace(/<(system-reminder|environment_context|permissions|INSTRUCTIONS)>[\s\S]*?<\/\1>/g,'').trim();
20
20
  }
21
+ // SynaBun's greeting note in an Antigravity prompt (neural-interface/public/shared/agy/agy-greeting.js, same markers).
22
+ const AGY_GREETING_NOTE = /\[SYNABUN_GREETING_START\][\s\S]*?\[SYNABUN_GREETING_END\][ \t]*(?:\r?\n)*/g;
23
+ const AGY_META_BLOCKS = /<(ADDITIONAL_METADATA|USER_SETTINGS_CHANGE|EPHEMERAL_MESSAGE|SYSTEM_MESSAGE)>[\s\S]*?<\/\1>/g;
24
+ /** What a person typed, out of Antigravity's USER_INPUT step (agy wraps it in <USER_REQUEST> with blocks of its own). */
25
+ function antigravityUserWords(content: unknown) {
26
+ const text = String(content ?? '');
27
+ const request = /<USER_REQUEST>\r?\n?([\s\S]*?)\r?\n?<\/USER_REQUEST>/.exec(text);
28
+ return (request ? request[1] : text.replace(AGY_META_BLOCKS, '')).replace(AGY_GREETING_NOTE, '').trim();
29
+ }
21
30
  /** Normalize only visible provider records, never reasoning or system text. */
22
31
  export function normalizeMemoryEvents(host: MemoryEvent['host'], records: any[], context: {session_id:string;project:string;cwd?:string}): MemoryEvent[] {
23
32
  const events: MemoryEvent[] = [];
@@ -25,6 +34,7 @@ export function normalizeMemoryEvents(host: MemoryEvent['host'], records: any[],
25
34
  let role: MemoryEvent['role']|undefined;
26
35
  let text = '';
27
36
  let tools: string[] = [];
37
+ let sourceId: string|undefined;
28
38
  if (host === 'claude-code') {
29
39
  if (record.isMeta || record.isSidechain) continue;
30
40
  if (record.type === 'user' && !record.toolUseResult && !record.sourceToolAssistantUUID) role='user';
@@ -38,6 +48,17 @@ export function normalizeMemoryEvents(host: MemoryEvent['host'], records: any[],
38
48
  if (p?.type === 'agentMessage') { role='assistant'; text=String(p.text || ''); }
39
49
  if (p?.type === 'commandExecution') { role='tool'; text=String(p.aggregatedOutput || ''); tools=['commandExecution']; }
40
50
  if (p?.type === 'function_call_output') {role='tool';text=String(p.output || '');}
51
+ } else if (host === 'antigravity') {
52
+ // agy's transcript.jsonl (brain/<id>/.system_generated/logs): one line per step, keyed by its index (a
53
+ // re-read of the file, from any offset, gives every step the same source id). The person's words and the
54
+ // model's answers only: never its `thinking`, agy's own system messages, or tool output.
55
+ if (Number.isInteger(record.step_index)) sourceId = `step:${record.step_index}`;
56
+ if (record.type === 'USER_INPUT' && record.source === 'USER_EXPLICIT') { role='user'; text=antigravityUserWords(record.content); }
57
+ if (record.type === 'PLANNER_RESPONSE' && record.source === 'MODEL') {
58
+ role='assistant';
59
+ text=typeof record.content === 'string' ? record.content : '';
60
+ tools=(Array.isArray(record.tool_calls) ? record.tool_calls : []).map((c:any)=>String(c?.name || '')).filter(Boolean);
61
+ }
41
62
  } else {
42
63
  const info = record.info || record;
43
64
  if (['user','assistant'].includes(info.role)) role=info.role;
@@ -46,8 +67,8 @@ export function normalizeMemoryEvents(host: MemoryEvent['host'], records: any[],
46
67
  }
47
68
  text=clean(text);
48
69
  if (!role || !text || text.startsWith('# AGENTS.md')) continue;
49
- const timestamp = record.timestamp || record.info?.time?.created || record.createdAt;
50
- events.push({...context,host,source_id:String(record.uuid || record.id || record.info?.id || `${index}`),role,text,tools,
70
+ const timestamp = record.timestamp || record.info?.time?.created || record.createdAt || record.created_at;
71
+ events.push({...context,host,source_id:sourceId ?? String(record.uuid || record.id || record.info?.id || `${index}`),role,text,tools,
51
72
  timestamp: timestamp && Number.isFinite(new Date(timestamp).getTime()) ? new Date(timestamp).toISOString() : '1970-01-01T00:00:00.000Z'});
52
73
  }
53
74
  return events;
@@ -12,6 +12,7 @@ import {
12
12
  getIdentity,
13
13
  effectivePins,
14
14
  terminalIdFor,
15
+ callerBrainCredential,
15
16
  callerRole,
16
17
  setReleaseHook,
17
18
  peekStdioIdentity,
@@ -163,11 +164,18 @@ async function requestOnce(
163
164
  // orchestrator apart from a worker run (workers must never dispatch).
164
165
  const role = callerRole();
165
166
  if (role) headers['X-Synabun-Role'] = role;
167
+ // A brain whose pin no session resolves (the Codex brain's MCP child, codex-sp-<uuid>) is known to
168
+ // /api/assistant/* by its launch credential: the role header alone names nobody there. Sent with the
169
+ // assistant role on those routes only; a worker has no role and no credential (its environment is stripped).
170
+ if (role === 'assistant' && path.startsWith('/api/assistant/')) {
171
+ const credential = callerBrainCredential();
172
+ if (credential) headers['X-Synabun-Brain-Token'] = credential;
173
+ }
166
174
  headers['X-Synabun-Request-Id'] = requestId;
167
175
  headers['X-Synabun-Deadline'] = String(deadline);
168
176
  // Lets the server refuse advisory payloads and auto-heal for a batch step on its own authority.
169
177
  if (batchContext.getStore()) headers['X-Synabun-Batch'] = '1';
170
- // One request's own headers (whatsappSendFile's brain credential): never sent on any other request.
178
+ // One request's own headers (whatsappSendFile's brain credential, the skills requests'): sent on that request only.
171
179
  for (const [name, value] of Object.entries(extraHeaders)) if (value) headers[name] = value;
172
180
  const opts: RequestInit = {
173
181
  method,
@@ -278,37 +286,74 @@ async function request(
278
286
  }
279
287
 
280
288
  /**
281
- * Best-effort reconciliation for an MCP process that changed its own tool
282
- * profile. Only sidepanel/automation children carry an explicit terminal id;
283
- * standalone CLI processes stay process-local without contacting Neural
284
- * Interface. The server derives the owning runtime from X-Synabun-Terminal.
289
+ * Best-effort reconciliation for an MCP runtime that changed its own tools
290
+ * (tool_groups). Only runtimes SynaBun launched carry a terminal pin (the
291
+ * stdio child's SYNABUN_TERMINAL_SESSION, an HTTP session's X-Synabun-Terminal);
292
+ * any other runtime stays local without contacting the Neural Interface, which
293
+ * derives the owning runtime from that pin and never from the body.
285
294
  */
286
- export type RuntimeMcpProfileReport = {
295
+ export type RuntimeToolsReport = {
287
296
  reported: boolean;
288
297
  hostRefresh: 'scheduled' | 'notification' | 'not-needed' | 'unavailable';
289
- runtimeKind?: 'opencode' | 'codex' | 'loop';
298
+ runtimeKind?: 'opencode' | 'codex' | 'loop' | 'channel';
290
299
  correlationId?: string;
300
+ /** The route that took it: runtime-profile is a Neural Interface from before tool lists. */
301
+ route?: 'runtime-tools' | 'runtime-profile';
291
302
  error?: string;
292
303
  };
293
304
 
294
- export async function reportRuntimeMcpProfile(
295
- profile: string,
296
- options: { catalogMode?: 'profiled' | 'deferred' } = {}
297
- ): Promise<RuntimeMcpProfileReport> {
298
- if (!String(process.env.SYNABUN_TERMINAL_SESSION || '').trim()) {
305
+ const RUNTIME_REPORT_TIMEOUT = 2_000;
306
+
307
+ /** One report: its status and its JSON body, or null for a body that is not JSON (a route the server does not have). */
308
+ async function postRuntimeReport(path: string, body: Record<string, unknown>): Promise<{ status: number; json: NiResponse | null; error?: string }> {
309
+ const controller = new AbortController();
310
+ const timer = setTimeout(() => controller.abort(), RUNTIME_REPORT_TIMEOUT);
311
+ try {
312
+ const headers: Record<string, string> = { 'Content-Type': 'application/json', 'X-Synabun-Terminal': terminalIdFor(getIdentity()) };
313
+ const role = callerRole();
314
+ if (role) headers['X-Synabun-Role'] = role;
315
+ const res = await fetch(`${BASE_URL}${path}`, { method: 'POST', headers, body: JSON.stringify(body), signal: controller.signal });
316
+ const text = await res.text();
317
+ let json: NiResponse | null = null;
318
+ try {
319
+ const parsed = JSON.parse(text);
320
+ json = parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed as NiResponse : null;
321
+ } catch { /* not JSON */ }
322
+ return { status: res.status, json };
323
+ } catch (err) {
324
+ const msg = err instanceof Error ? err.message : String(err);
325
+ return { status: 0, json: null, error: controller.signal.aborted ? `Runtime tools report timed out after ${RUNTIME_REPORT_TIMEOUT}ms` : `Neural Interface unreachable: ${msg}` };
326
+ } finally {
327
+ clearTimeout(timer);
328
+ }
329
+ }
330
+
331
+ export async function reportRuntimeTools(
332
+ groups: readonly string[],
333
+ options: { mode: 'strict' | 'focus'; legacyProfile: string; refresh?: 'in-band' },
334
+ ): Promise<RuntimeToolsReport> {
335
+ if (!effectivePins(getIdentity()).terminalSessionId) {
299
336
  return { reported: false, hostRefresh: 'notification' };
300
337
  }
301
- const result = await request('POST', '/api/mcp/runtime-profile', {
302
- profile,
303
- catalogMode: options.catalogMode || 'profiled',
304
- }, 2_000);
305
- if (result.ok) {
338
+ let route: 'runtime-tools' | 'runtime-profile' = 'runtime-tools';
339
+ let answer = await postRuntimeReport('/api/mcp/runtime-tools', { tools: [...groups], mode: options.mode, ...(options.refresh ? { refresh: options.refresh } : {}) });
340
+ // A Neural Interface from before tool lists has no such route (its 404 is not JSON); its own route takes the
341
+ // old shape. Its runtime-profile 404 for a runtime that is gone is JSON, so it is never retried.
342
+ if (answer.status === 404 && !answer.json) {
343
+ route = 'runtime-profile';
344
+ answer = await postRuntimeReport('/api/mcp/runtime-profile', {
345
+ profile: options.legacyProfile,
346
+ catalogMode: options.mode === 'focus' ? 'deferred' : 'profiled',
347
+ });
348
+ }
349
+ const result = answer.json;
350
+ if (result?.ok && answer.status >= 200 && answer.status < 300) {
306
351
  const hostRefresh = result.hostRefresh === 'scheduled'
307
352
  || result.hostRefresh === 'notification'
308
353
  || result.hostRefresh === 'not-needed'
309
354
  ? result.hostRefresh
310
355
  : 'unavailable';
311
- const runtimeKind = result.runtimeKind === 'opencode' || result.runtimeKind === 'codex' || result.runtimeKind === 'loop'
356
+ const runtimeKind = result.runtimeKind === 'opencode' || result.runtimeKind === 'codex' || result.runtimeKind === 'loop' || result.runtimeKind === 'channel'
312
357
  ? result.runtimeKind
313
358
  : undefined;
314
359
  return {
@@ -316,12 +361,14 @@ export async function reportRuntimeMcpProfile(
316
361
  hostRefresh,
317
362
  runtimeKind,
318
363
  correlationId: typeof result.correlationId === 'string' ? result.correlationId : undefined,
364
+ route,
319
365
  };
320
366
  }
321
367
  return {
322
368
  reported: false,
323
369
  hostRefresh: 'unavailable',
324
- error: typeof result.error === 'string' ? result.error : 'Runtime profile report failed',
370
+ route,
371
+ error: typeof result?.error === 'string' ? result.error : (answer.error || `Runtime tools report failed (HTTP ${answer.status})`),
325
372
  };
326
373
  }
327
374
 
@@ -1342,12 +1389,25 @@ export async function moreloginUseDefault(envId: string | null): Promise<NiRespo
1342
1389
  return request('POST', '/api/morelogin/use-default', envId ? { envId } : { clear: true });
1343
1390
  }
1344
1391
 
1392
+ // ── Skills (the role-gated `skills` tool group) ──
1393
+ // One thin call over /api/skills-studio/v2 (neural-interface/lib/skills/api-v2.js, creation-api.js), which owns every
1394
+ // rule: an agent reads, drafts, checks and submits for review; installing and approving are the owner's, from the
1395
+ // app's own page, and the routes refuse them to a request that carries the agent headers requestOnce sends. The
1396
+ // caller's brain credential (identity.ts callerBrainCredential: its own request's over HTTP, SYNABUN_BRAIN_TOKEN for a
1397
+ // stdio child) rides along: the server knows the Assistant by it (AI drafting needs it), never by X-Synabun-Role.
1398
+
1399
+ export async function skillsV2(method: 'GET' | 'POST' | 'PATCH', path: string, body?: Record<string, unknown>, timeout = LONG_TIMEOUT): Promise<NiResponse> {
1400
+ const credential = callerBrainCredential();
1401
+ return requestOnce(method, `/api/skills-studio/v2${path}`, body, timeout, credential ? { 'X-Synabun-Brain-Token': credential } : {});
1402
+ }
1403
+
1345
1404
  // ── SynaBun assistant orchestration (role-gated `agents` tool group) ──
1346
1405
  // Thin proxies over /api/assistant/* (neural-interface/lib/assistant-api.js),
1347
1406
  // which owns dispatch state, rails and authorization. requestOnce already
1348
1407
  // sends X-Synabun-Terminal (the assistant pin) and X-Synabun-Role.
1349
1408
 
1350
- export type AssistantProvider = 'claude-code' | 'codex' | 'opencode';
1409
+ /** A worker provider (each one can be the Assistant's brain too; 'antigravity' runs both over ACP). */
1410
+ export type AssistantProvider = 'claude-code' | 'codex' | 'opencode' | 'antigravity';
1351
1411
 
1352
1412
  export type AssistantDispatchBody = {
1353
1413
  /** Optional when routeId names an approved route (the server applies it). */
@@ -1357,7 +1417,7 @@ export type AssistantDispatchBody = {
1357
1417
  assistantSessionId: string;
1358
1418
  model?: string;
1359
1419
  effort?: string;
1360
- mcpProfile?: string;
1420
+ tools?: string[];
1361
1421
  routeId?: string;
1362
1422
  taskClass?: string;
1363
1423
  confidence?: number;