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
@@ -208,6 +208,7 @@ export function normalizeSynaBunChoiceElicitation(params = {}) {
208
208
  if (options.length < 2) return null;
209
209
  return {
210
210
  id,
211
+ multiSelect: question.multiSelect === true,
211
212
  header: String(question?.header || id),
212
213
  question: String(question?.question || ''),
213
214
  options,
@@ -226,16 +227,16 @@ export function buildSynaBunChoiceContent(questions = [], answers = {}) {
226
227
  const content = {};
227
228
  for (const question of questions) {
228
229
  const id = question?.id;
229
- const answer = id ? answers[id]?.answers?.[0] : '';
230
- if (!id || !answer) continue;
231
- const option = (question.options || []).find((candidate) => candidate.label === answer);
232
- if (option) {
233
- content[id] = option.value || option.label;
234
- continue;
235
- }
236
- const meta = question._synabunMcp || {};
237
- content[id] = meta.otherValue || SYNABUN_OTHER_VALUE;
238
- content[meta.otherField || `${id}__other`] = answer;
230
+ const selected = id ? answers[id]?.answers || [] : [];
231
+ if (!id || !selected.length) continue;
232
+ const values = selected.map((answer) => {
233
+ const option = (question.options || []).find((candidate) => candidate.label === answer);
234
+ if (option) return option.value || option.label;
235
+ const meta = question._synabunMcp || {};
236
+ content[meta.otherField || `${id}__other`] = answer;
237
+ return meta.otherValue || SYNABUN_OTHER_VALUE;
238
+ });
239
+ content[id] = question.multiSelect ? values : values[0];
239
240
  }
240
241
  return content;
241
242
  }
@@ -252,7 +253,34 @@ export function codexMcpElicitationMeta(params = {}) {
252
253
  }
253
254
 
254
255
  export function isCodexMcpToolApproval(params = {}) {
255
- return codexMcpElicitationMeta(params).codex_approval_kind === 'mcp_tool_call';
256
+ return params?.mode !== 'openai/userVerification'
257
+ && params?.mode !== 'url'
258
+ && codexMcpElicitationMeta(params).codex_approval_kind === 'mcp_tool_call';
259
+ }
260
+
261
+ /** Native Codex approvals need not include tool_name (codex-rs/core/src/mcp_tool_call.rs). */
262
+ export function codexMcpToolApproval(params = {}) {
263
+ if (!isCodexMcpToolApproval(params)) return null;
264
+ const meta = codexMcpElicitationMeta(params);
265
+ const serverName = typeof params.serverName === 'string' ? params.serverName : '';
266
+ let toolName = [meta.tool_name, meta.toolName].find(value => typeof value === 'string' && value.trim())?.trim() || '';
267
+ if (!toolName && serverName && typeof params.message === 'string') {
268
+ // Only Codex's exact fallback template is an identity source. Human tool
269
+ // titles and custom prompt prose are not names suitable for a policy check.
270
+ const prefix = `Allow the ${serverName} MCP server to run tool "`;
271
+ if (params.message.startsWith(prefix) && params.message.endsWith('"?')) {
272
+ const name = params.message.slice(prefix.length, -2);
273
+ if (name && !/["\r\n]/.test(name)) toolName = name;
274
+ }
275
+ }
276
+ const qualified = /^mcp__(.+?)__(.+)$/.exec(toolName);
277
+ if (qualified) toolName = qualified[1] === serverName ? qualified[2] : '';
278
+ return {
279
+ serverName,
280
+ toolName,
281
+ fullName: serverName && toolName ? `mcp__${serverName}__${toolName}` : '',
282
+ input: meta.tool_params ?? meta.arguments ?? {},
283
+ };
256
284
  }
257
285
 
258
286
  export function normalizeCodexMcpApprovalPersistence(params = {}) {
@@ -1,3 +1,4 @@
1
+ import { cxpText } from './cdx-copy.js';
1
2
  // ═══════════════════════════════════════════
2
3
  // SynaBun — Codex Panel: Render Module
3
4
  // Text utilities, card rendering, delta appending, and history rendering.
@@ -18,6 +19,7 @@ import { OUTPUT_LIMITS, boundedText, jsonAnswer, prettyJsonFences, readableStruc
18
19
  import { renderReadableOutput, renderReadableBlock, cleanOutputBlocks, hydrateOutputControls, observeOutputBlocks, renderDiffView, restoreDiffViews } from './cdx-output.js';
19
20
  import { fileLinkTitle, fillFileLinkCopy, isInsideRoots, parseFileLinkTarget, readFileLink } from '../file-links.js';
20
21
  import { sanitizeHtmlString } from '../assistant/asst-sanitize.js';
22
+ import { createTextCache } from '../text-cache.js';
21
23
  export { setCardExpanded } from './cdx-cards.js';
22
24
 
23
25
  // ── Shared context (set by cdx-tabs via setRenderContext) ──
@@ -104,8 +106,9 @@ export function esc(s) {
104
106
  // `<img onerror>` in a reply would run in SynaBun's origin with no click. Every
105
107
  // Markdown sink of the panel takes md()'s output, so it goes through the
106
108
  // allowlist sanitiser the Assistant, Claude and OpenCode panels use, here, once.
107
- const _mdCache = new Map();
108
- const _MD_CACHE_LIMIT = 512;
109
+ const _mdCache = createTextCache();
110
+ export const markdownCacheStats = () => _mdCache.stats();
111
+ export const clearMarkdownCache = () => _mdCache.clear();
109
112
  let _mdRenderer = null;
110
113
  let _mdParser;
111
114
  function markdownFallback(text) {
@@ -129,7 +132,7 @@ export function md(text) {
129
132
  _mdRenderer = renderer;
130
133
  _mdParser = parser;
131
134
  }
132
- const key = text || '';
135
+ const key = String(text || '');
133
136
  if (key.length > OUTPUT_LIMITS.input) return `<pre class="cxp-card-pre cxp-output-raw"><code>${esc(boundedText(key))}</code></pre>`;
134
137
  const cached = _mdCache.get(key);
135
138
  if (cached !== undefined) return cached;
@@ -143,10 +146,6 @@ export function md(text) {
143
146
  // A page with no DOM to sanitise in, or a sanitiser that fails, gets escaped text: never raw HTML.
144
147
  try { html = sanitizeHtmlString(html); }
145
148
  catch { html = markdownFallback(key); }
146
- if (_mdCache.size >= _MD_CACHE_LIMIT) {
147
- const firstKey = _mdCache.keys().next().value;
148
- if (firstKey !== undefined) _mdCache.delete(firstKey);
149
- }
150
149
  _mdCache.set(key, html);
151
150
  return html;
152
151
  }
@@ -174,7 +173,7 @@ function extractCompactAssistantSummary(text) {
174
173
  .replace(/^[#>\-\*\d\.\s]+/gm, '')
175
174
  .replace(/\s+/g, ' ')
176
175
  .trim();
177
- if (!value) return 'Working through the next step';
176
+ if (!value) return cxpText('working', 'Working through the next step');
178
177
  return value;
179
178
  }
180
179
 
@@ -620,7 +619,7 @@ function resolveFileChangeSummary(item) {
620
619
  const changes = Array.isArray(item?.changes) ? item.changes.slice(0, OUTPUT_LIMITS.files) : [];
621
620
  const lines = changes.map((change) => describeFileChange(change)).filter(Boolean);
622
621
  if (lines.length) return lines.join('\n');
623
- return 'Pending file changes';
622
+ return cxpText('pendingFiles', 'Pending file changes');
624
623
  }
625
624
 
626
625
  function collectStructuredText(value, seen = new Set()) {
@@ -808,14 +807,27 @@ export function sanitizeStoredTranscriptDom(container) {
808
807
  });
809
808
  if (!_ctx.running) container.querySelectorAll('.cxp-reasoning').forEach(card => {
810
809
  const body = card.querySelector('.cxp-reasoning-body');
811
- if (body && /^Waiting for reasoning summary/.test(body.textContent)) body.textContent = 'No reasoning summary was provided.';
810
+ const text = body?.textContent.trim() || '';
811
+ if (!text || ['Waiting for reasoning summary...', 'No reasoning summary was provided.', cxpText('waitingReasoning', 'Waiting for reasoning summary...'), cxpText('noReasoning', 'No reasoning summary was provided.')].includes(text)) { card.remove(); return; }
812
+ const title = card.querySelector('.cxp-card-title');
813
+ if (title) title.textContent = cxpText('reasoning', 'Reasoning Summary');
812
814
  const pill = card.querySelector('.cxp-status-pill');
813
- if (pill?.textContent === 'live') pill.textContent = 'complete';
815
+ if (pill) pill.textContent = cxpText('status_complete', 'complete');
814
816
  });
815
817
  syncStatusPillTones(container);
816
818
  cleanOutputBlocks(container);
817
819
  // Old snapshots retain their classes; replace just their verbose diff body.
818
820
  container.querySelectorAll('[data-item-type="fileChange"]').forEach(card => {
821
+ const title = card.querySelector('.cxp-card-title');
822
+ if (title) title.textContent = cxpText('fileChange', 'File change');
823
+ const pill = card.querySelector('.cxp-status-pill');
824
+ const completed = ['completed', cxpText('status_completed', 'completed')].includes(pill?.textContent);
825
+ const subtitle = card.querySelector('.cxp-card-subtitle');
826
+ if (subtitle) subtitle.textContent = fileChangeSubtitle({ status: completed ? 'completed' : '' });
827
+ if (completed && pill) pill.textContent = cxpText('status_completed', 'completed');
828
+ const meta = card.querySelector('.cxp-card-meta');
829
+ const count = meta?.textContent.match(/^(\d+) file changes?$/)?.[1];
830
+ if (count) meta.textContent = cxpText(Number(count) === 1 ? 'oneFileChange' : 'fileChanges', Number(count) === 1 ? '1 file change' : '{count} file changes', { count });
819
831
  const fold = card.querySelector('.cxp-fold-diff');
820
832
  const raw = fold?.querySelector('.cxp-card-pre-diff')?.textContent;
821
833
  if (!raw) return;
@@ -2033,14 +2045,17 @@ function getReasoningPreviewText(state) {
2033
2045
  const contentText = Array.isArray(state?.contentLines)
2034
2046
  ? state.contentLines.map((line) => String(line || '').trim()).filter(Boolean).join(' ')
2035
2047
  : '';
2036
- return _ctx.cleanPreview(summaryText || contentText || 'Working through the next step');
2048
+ return _ctx.cleanPreview(summaryText || contentText || cxpText('working', 'Working through the next step'));
2037
2049
  }
2038
2050
 
2039
2051
  function updateReasoningChrome(state, { complete = false } = {}) {
2040
2052
  if (!state) return;
2041
- if (state.summaryEl) state.summaryEl.textContent = complete && !state.summaryLines?.some(line => String(line).trim()) && !state.contentLines?.some(line => String(line).trim()) ? 'No reasoning summary was provided.' : getReasoningPreviewText(state);
2042
- if (state.pillEl) state.pillEl.textContent = complete ? 'complete' : 'live';
2043
- if (state.el) state.el.classList.toggle('cxp-reasoning-done', !!complete);
2053
+ if (state.summaryEl) state.summaryEl.textContent = complete && !state.summaryLines?.some(line => String(line).trim()) && !state.contentLines?.some(line => String(line).trim()) ? cxpText('noReasoning', 'No reasoning summary was provided.') : getReasoningPreviewText(state);
2054
+ if (state.pillEl) state.pillEl.textContent = complete ? cxpText('status_complete', 'complete') : cxpText('live', 'live');
2055
+ if (state.el) {
2056
+ state.el.hidden = !state.summaryLines?.some(line => String(line).trim()) && !state.contentLines?.some(line => String(line).trim());
2057
+ state.el.classList.toggle('cxp-reasoning-done', !!complete);
2058
+ }
2044
2059
  }
2045
2060
 
2046
2061
  function cacheCollapsedCardState(state, item, itemType) {
@@ -2100,15 +2115,9 @@ function cacheCollapsedCardState(state, item, itemType) {
2100
2115
  case 'fileChange': {
2101
2116
  const changes = Array.isArray(item.changes) ? item.changes : [];
2102
2117
  if (hasOwnField(item, 'changes')) {
2103
- state.fileMetaText = changes.length ? `${changes.length} file change${changes.length > 1 ? 's' : ''}` : 'Pending file changes';
2118
+ state.fileMetaText = changes.length ? cxpText(changes.length === 1 ? 'oneFileChange' : 'fileChanges', changes.length === 1 ? '1 file change' : '{count} file changes', { count: changes.length }) : cxpText('pendingFiles', 'Pending file changes');
2104
2119
  state.filesText = resolveFileChangeSummary(item);
2105
- const diffText = changes
2106
- .map((change) => extractStructuredText(change?.diff || change?.patch || change?.content || change?.output || ''))
2107
- .filter(Boolean)
2108
- .join('\n\n');
2109
- if (item.aggregatedOutput != null || diffText) {
2110
- state.outputBuf = extractStructuredText(item.aggregatedOutput) || item.aggregatedOutput || diffText;
2111
- }
2120
+ if (item.aggregatedOutput != null) state.outputBuf = extractStructuredText(item.aggregatedOutput) || item.aggregatedOutput || '';
2112
2121
  } else if (item.aggregatedOutput != null) {
2113
2122
  state.outputBuf = extractStructuredText(item.aggregatedOutput) || item.aggregatedOutput || '';
2114
2123
  }
@@ -2162,8 +2171,8 @@ export function flushCardBody(state) {
2162
2171
  setOptionalSection(state.resultSectionEl, state.resultEl, state.resultText || '');
2163
2172
  break;
2164
2173
  case 'fileChange':
2165
- if (state.metaEl) state.metaEl.textContent = state.fileMetaText || 'Pending file changes';
2166
- if (state.filesEl) state.filesEl.textContent = state.filesText || 'Pending file changes';
2174
+ if (state.metaEl) state.metaEl.textContent = state.fileMetaText || cxpText('pendingFiles', 'Pending file changes');
2175
+ if (state.filesEl) state.filesEl.textContent = state.filesText || cxpText('pendingFiles', 'Pending file changes');
2167
2176
  refreshFileChangeView(state);
2168
2177
  break;
2169
2178
  case 'collabAgentToolCall':
@@ -2388,6 +2397,7 @@ export function ensureReasoningState(item) {
2388
2397
 
2389
2398
  const details = document.createElement('details');
2390
2399
  details.className = 'cxp-card cxp-reasoning';
2400
+ details.hidden = true;
2391
2401
  details.dataset.itemId = item.id || '';
2392
2402
  details.dataset.expanded = '1';
2393
2403
 
@@ -2395,8 +2405,8 @@ export function ensureReasoningState(item) {
2395
2405
  summary.innerHTML = `
2396
2406
  <span class="cxp-card-icon">${ICON_SPARK}</span>
2397
2407
  <span class="cxp-card-titles">
2398
- <span class="cxp-card-title">Reasoning Summary</span>
2399
- <span class="cxp-card-subtitle">Working through the next step</span>
2408
+ <span class="cxp-card-title">${cxpText('reasoning', 'Reasoning Summary')}</span>
2409
+ <span class="cxp-card-subtitle">${cxpText('working', 'Working through the next step')}</span>
2400
2410
  </span>
2401
2411
  <span class="cxp-think-dots"><span></span><span></span><span></span></span>
2402
2412
  <span class="cxp-status-pill">live</span>
@@ -2643,10 +2653,14 @@ export function completeTurnOutputs(turnId) {
2643
2653
  }
2644
2654
  }
2645
2655
 
2656
+ function fileChangeSubtitle(item) {
2657
+ return item.status === 'completed' ? cxpText('filesUpdated', 'File updates applied') : cxpText('fileUpdates', 'File updates');
2658
+ }
2659
+
2646
2660
  export function ensureFileChangeState(item) {
2647
2661
  let state = _ctx.items.get(item.id);
2648
2662
  if (state) return state;
2649
- const card = createCard(item, ICON_FILES, 'File change', 'Proposed file updates');
2663
+ const card = createCard(item, ICON_FILES, cxpText('fileChange', 'File change'), fileChangeSubtitle(item));
2650
2664
  setCardExpanded(card.el, true);
2651
2665
 
2652
2666
  const summary = document.createElement('div');
@@ -2657,7 +2671,7 @@ export function ensureFileChangeState(item) {
2657
2671
  filesSection.className = 'cxp-card-section';
2658
2672
  const filesLabel = document.createElement('div');
2659
2673
  filesLabel.className = 'cxp-card-section-label';
2660
- filesLabel.textContent = 'Files changed';
2674
+ filesLabel.textContent = cxpText('filesChanged', 'Files changed');
2661
2675
  const filesBody = document.createElement('div');
2662
2676
  filesBody.className = 'cxp-card-meta';
2663
2677
  filesSection.append(filesLabel, filesBody);
@@ -2672,6 +2686,7 @@ export function ensureFileChangeState(item) {
2672
2686
  type: 'fileChange',
2673
2687
  el: card.el,
2674
2688
  pillEl: card.pill,
2689
+ subtitleEl: card.subtitleEl,
2675
2690
  metaEl: summary,
2676
2691
  filesEl: filesBody,
2677
2692
  outputSectionEl: outputEl,
@@ -2889,8 +2904,9 @@ export function updateItemFromData(item) {
2889
2904
  state.titleEl.textContent = head?.title || h.detail || item.type || 'Item';
2890
2905
  if (head && state.subtitleEl) state.subtitleEl.textContent = head.subtitle;
2891
2906
  }
2907
+ if (itemType === 'fileChange' && state.subtitleEl) state.subtitleEl.textContent = fileChangeSubtitle(state._lastItem);
2892
2908
  if (state.pillEl && item.status != null) state.pillEl.textContent = _ctx.formatStatus(item.status);
2893
- if (isCardBodyHidden(state)) { state._bodyDirty = true; _ctx.scheduleThreadSnapshotSave(_ctx.boundTab); return; }
2909
+ if (itemType !== 'reasoning' && isCardBodyHidden(state)) { state._bodyDirty = true; _ctx.scheduleThreadSnapshotSave(_ctx.boundTab); return; }
2894
2910
  }
2895
2911
 
2896
2912
  switch (itemType) {
@@ -2978,8 +2994,8 @@ export function updateItemFromData(item) {
2978
2994
  }
2979
2995
  case 'fileChange': {
2980
2996
  state.pillEl.textContent = _ctx.formatStatus(item.status);
2981
- state.metaEl.textContent = state.fileMetaText || 'Pending file changes';
2982
- if (state.filesEl) state.filesEl.textContent = state.filesText || 'Pending file changes';
2997
+ state.metaEl.textContent = state.fileMetaText || cxpText('pendingFiles', 'Pending file changes');
2998
+ if (state.filesEl) state.filesEl.textContent = state.filesText || cxpText('pendingFiles', 'Pending file changes');
2983
2999
  if (item.aggregatedOutput != null) {
2984
3000
  state.outputBuf = extractStructuredText(item.aggregatedOutput) || item.aggregatedOutput || '';
2985
3001
  }
@@ -3104,26 +3120,26 @@ export function appendAgentDelta(itemId, delta) {
3104
3120
 
3105
3121
  export function appendPlanDelta(itemId, delta) {
3106
3122
  const state = ensurePlanState({ id: itemId });
3107
- if (state.pillEl) state.pillEl.textContent = 'live';
3123
+ if (state.pillEl) state.pillEl.textContent = cxpText('live', 'live');
3108
3124
  state.buffer += delta || '';
3109
3125
  if (isCardBodyHidden(state)) { state._bodyDirty = true; return; }
3110
3126
  setMarkdownBuffer(state, state.buffer, false);
3111
3127
  }
3112
3128
 
3113
3129
  export function getReasoningBodyText(state, { complete = false } = {}) {
3114
- if (!state) return complete ? 'No reasoning summary was provided.' : 'Waiting for reasoning summary...';
3130
+ if (!state) return complete ? cxpText('noReasoning', 'No reasoning summary was provided.') : cxpText('waitingReasoning', 'Waiting for reasoning summary...');
3115
3131
  const contentText = Array.isArray(state.contentLines) ? state.contentLines.join('').trim() : '';
3116
3132
  if (contentText) return contentText;
3117
3133
  const summaryText = Array.isArray(state.summaryLines)
3118
3134
  ? state.summaryLines.map((line) => String(line || '').trim()).filter(Boolean).join('\n')
3119
3135
  : '';
3120
- return summaryText || (complete ? 'No reasoning summary was provided.' : 'Waiting for reasoning summary...');
3136
+ return summaryText || (complete ? cxpText('noReasoning', 'No reasoning summary was provided.') : cxpText('waitingReasoning', 'Waiting for reasoning summary...'));
3121
3137
  }
3122
3138
 
3123
3139
  export function appendReasoningDelta(itemId, delta, isSummary = false, summaryIndex = null) {
3124
3140
  const state = ensureReasoningState({ id: itemId });
3125
3141
  state.el?.classList.remove('cxp-reasoning-done');
3126
- if (state.pillEl) state.pillEl.textContent = 'live';
3142
+ if (state.pillEl) state.pillEl.textContent = cxpText('live', 'live');
3127
3143
  if (!state.userToggled && state.el && !state.el.open) {
3128
3144
  state.suppressToggleTracking = true;
3129
3145
  state.el.open = true;
@@ -3246,7 +3262,10 @@ export function resolveHistoryRenderSource(thread, fallbackItems = null, storedS
3246
3262
  // `authoritative`: the thread's turns are its whole history (a revert reply),
3247
3263
  // so the saved rendering is never used in their place, even when none remain.
3248
3264
  export function renderHistory(thread, fallbackItems = null, { authoritative = false } = {}) {
3249
- _ctx.flushThreadSnapshotSave(_ctx.boundTab);
3265
+ // A save still pending for what is on screen is written before the transcript is rebuilt; with nothing
3266
+ // pending there is nothing to keep (no forced serialisation of the whole transcript on every open).
3267
+ const pendingTab = _ctx.boundTab;
3268
+ if (pendingTab?.snapshotTimer || pendingTab?.snapshotIdleHandle) _ctx.flushThreadSnapshotSave(pendingTab);
3250
3269
  const preservedTokenUsage = thread?.id && _ctx.threadId && thread.id === _ctx.threadId
3251
3270
  ? _ctx.threadTokenUsage
3252
3271
  : null;
@@ -3323,7 +3342,7 @@ export function renderHistory(thread, fallbackItems = null, { authoritative = fa
3323
3342
  });
3324
3343
  _ctx.hideEmpty();
3325
3344
  _ctx.scrollEnd(true);
3326
- _ctx.flushThreadSnapshotSave(_ctx.boundTab);
3345
+ _ctx.scheduleThreadSnapshotSave(_ctx.boundTab);
3327
3346
  renderPostPlanActions(_ctx.boundTab);
3328
3347
  renderPostCompactionActions(_ctx.boundTab);
3329
3348
  }
@@ -12,7 +12,7 @@ import {
12
12
  buildSynaBunChoiceContent,
13
13
  codexApprovalDecisionActions,
14
14
  codexHeldServerRequests,
15
- codexMcpElicitationMeta,
15
+ codexMcpToolApproval,
16
16
  codexMcpToolApprovalActions,
17
17
  codexPermissionApprovalActions,
18
18
  codexRequestIdentityKey,
@@ -417,7 +417,7 @@ export function renderUserInputRequest(requestId, params, protocol = {}) {
417
417
  <span class="cxp-ask-option-desc">${esc(optionDesc)}</span>
418
418
  `;
419
419
  const retainedValue = answers[answerKey]?.answers?.[0];
420
- if (!isOtherOption && retainedValue === optionLabel) btn.classList.add('selected');
420
+ if (!isOtherOption && (answers[answerKey]?.answers || []).includes(optionLabel)) btn.classList.add('selected');
421
421
  btn.addEventListener('click', async () => {
422
422
  if (isChangelogAsk && /edit first/i.test(optionLabel)) {
423
423
  const allButtons = Array.from(optionsEl.querySelectorAll('.cxp-ask-option'));
@@ -434,6 +434,16 @@ export function renderUserInputRequest(requestId, params, protocol = {}) {
434
434
  if (!opened) _ctx.restoreChangelogButtons(allButtons);
435
435
  return;
436
436
  }
437
+ if (question.multiSelect && !isOtherOption) {
438
+ otherWrap.hidden = true;
439
+ const selected = new Set(answers[answerKey]?.answers || []);
440
+ if (selected.has(optionLabel)) selected.delete(optionLabel); else selected.add(optionLabel);
441
+ const labels = new Set(explicitOptions.map((o) => typeof o === 'string' ? o : o.label));
442
+ const values = [...selected].filter((label) => labels.has(label));
443
+ if (values.length) answers[answerKey] = { answers: values }; else delete answers[answerKey];
444
+ optionsEl.querySelectorAll('.cxp-ask-option').forEach((node) => node.classList.toggle('selected', values.includes(node.querySelector('.cxp-ask-option-label')?.textContent)));
445
+ persistEditingDraft(); syncSubmit(); return;
446
+ }
437
447
  optionsEl.querySelectorAll('.cxp-ask-option').forEach((node) => node.classList.remove('selected'));
438
448
  btn.classList.add('selected');
439
449
  if (isOtherOption) {
@@ -546,9 +556,9 @@ export function isElicitationValueSatisfied(value, schema) {
546
556
 
547
557
  export function renderMcpToolApprovalRequest(requestId, params) {
548
558
  if (_ctx.requestCards.has(String(requestId))) return;
549
- const metadata = codexMcpElicitationMeta(params);
559
+ const approval = codexMcpToolApproval(params);
550
560
  const serverName = String(params?.serverName || 'MCP');
551
- const toolName = String(metadata.tool_name || metadata.toolName || 'unknown tool');
561
+ const toolName = approval?.toolName || 'unknown tool';
552
562
  const entry = createInteractiveRequestCard(requestId, {
553
563
  title: `${serverName} Tool Approval`,
554
564
  subtitle: 'mcp tool approval',
@@ -0,0 +1,54 @@
1
+ // ═══════════════════════════════════════════
2
+ // SynaBun Neural Interface — Codex panel: native skills in the slash hints
3
+ // ═══════════════════════════════════════════
4
+ //
5
+ // Codex lists its skills itself (app-server skills/list): each with its name, its SKILL.md path and its scope.
6
+ // A hint keeps that path, so picking one sends Codex's own `skill` input (name + path: the exact skill, even when
7
+ // two share a name) with the prompt, instead of only the text "/name" (SK-050). Same-named skills are told apart
8
+ // by their scope in the hint. No DOM: cdx-tabs.js draws the hints, the tests read this.
9
+
10
+ const SCOPE_LABEL = { user: 'personal', repo: 'repository', system: 'Codex', admin: 'admin' };
11
+
12
+ /**
13
+ * Hint rows of native skills: `{ cmd, desc, skill: { name, path }, scope }`, enabled ones only, sorted.
14
+ * @param {object[]} skills skills/list entries (name, description, path, scope, enabled)
15
+ * @param {Set<string>} [taken] commands already shown (built-ins win their name)
16
+ */
17
+ export function skillHintEntries(skills, taken = new Set()) {
18
+ const rows = (Array.isArray(skills) ? skills : [])
19
+ .filter((s) => s && s.enabled !== false)
20
+ .map((s) => {
21
+ const name = String(s.name || s.dirName || '').trim();
22
+ return { cmd: name ? `/${name}` : '', desc: String(s.description || '').trim(), skill: typeof s.path === 'string' && s.path ? { name, path: s.path } : null, scope: s.scope || null };
23
+ })
24
+ .filter((row) => row.cmd !== '/' && row.cmd && !taken.has(row.cmd));
25
+ const counts = rows.reduce((m, r) => m.set(r.cmd, (m.get(r.cmd) || 0) + 1), new Map());
26
+ for (const row of rows) {
27
+ if (counts.get(row.cmd) > 1) row.desc = `(${SCOPE_LABEL[row.scope] || row.scope || 'other'}) ${row.desc}`.trim();
28
+ }
29
+ return rows.sort((a, b) => a.cmd.localeCompare(b.cmd) || String(a.scope).localeCompare(String(b.scope)));
30
+ }
31
+
32
+ /**
33
+ * The native skill inputs a prompt carries: the picked skill, while the prompt still starts with its /name.
34
+ * @param {string} prompt the text being sent
35
+ * @param {{ cmd: string, name: string, path: string }|null} pending what was picked from the hints
36
+ * @returns {{ name: string, path: string }[]}
37
+ */
38
+ export function skillsForPrompt(prompt, pending) {
39
+ if (!pending || typeof pending.cmd !== 'string' || typeof pending.path !== 'string') return [];
40
+ const text = String(prompt || '').trimStart();
41
+ if (text !== pending.cmd && !text.startsWith(`${pending.cmd} `) && !text.startsWith(`${pending.cmd}\n`)) return [];
42
+ return [{ name: pending.name, path: pending.path }];
43
+ }
44
+
45
+ /**
46
+ * The skills_list request the panel sends for a tab: Codex's app-server (0.164.0, checked 2026-10-23) keeps its skill
47
+ * list until asked with forceReload, and sends no notification of its own when a skill folder appears or changes, so
48
+ * after SynaBun installed, removed or changed a skill (skills:changed) the next request forces the reload; otherwise
49
+ * the cached list is enough. The forced reload also refreshes the skills the app-server offers its threads.
50
+ * @param {{ project?: string|null }} tab @param {boolean} changed whether a skills:changed arrived since the last list
51
+ */
52
+ export function skillsListRequest(tab, changed) {
53
+ return { cwds: tab?.project ? [tab.project] : [], forceReload: changed === true };
54
+ }
@@ -125,6 +125,10 @@ export function injectStyles() {
125
125
  opacity: 1;
126
126
  overflow: visible;
127
127
  }
128
+ /* Windows: the shell is 92% opaque, so the blur behind it barely shows, yet Chromium recomputes it on every
129
+ repaint inside the panel (a transcript rendering, a stream). There it goes; the colour stays. */
130
+ html.platform-win32 .codex-panel,
131
+ html.desktop-titlebar--win32 .codex-panel { backdrop-filter: none; -webkit-backdrop-filter: none; }
128
132
  /* A floating terminal is promoted above the panel when focused. Raise the
129
133
  whole stacking context while a footer menu is open so it stays visible. */
130
134
  .codex-panel:has(.cxp-dropdown.open) {
@@ -352,6 +356,12 @@ export function injectStyles() {
352
356
  display: inline-flex; align-items: center; gap: 3px;
353
357
  position: relative;
354
358
  }
359
+ /* SVGs with only a viewBox have platform-dependent intrinsic sizes. */
360
+ .cxp-toolbar-toggle > svg {
361
+ width: var(--cxp-space-3);
362
+ height: var(--cxp-space-3);
363
+ flex-shrink: 0;
364
+ }
355
365
  .cxp-toolbar-toggle::after {
356
366
  content: '';
357
367
  position: absolute; bottom: 0; left: 25%; right: 25%;
@@ -774,6 +784,7 @@ export function injectStyles() {
774
784
  /* ── Project bar and dropdowns ── */
775
785
  .cxp-projectbar {
776
786
  display: flex;
787
+ flex-wrap: wrap;
777
788
  align-items: center;
778
789
  gap: 4px;
779
790
  padding: 4px 10px 0;
@@ -796,7 +807,6 @@ export function injectStyles() {
796
807
  transition: background var(--cxp-dur-fast);
797
808
  }
798
809
  .cxp-dropdown-sm { max-width: 72px; }
799
- #cxp-profile { max-width: 80px; }
800
810
  .cxp-dropdown:hover {
801
811
  background: var(--cxp-surface-1);
802
812
  }
@@ -1691,6 +1701,7 @@ export function injectStyles() {
1691
1701
  .cxp-thinking .cxp-msg-think-dots span:nth-child(2) { animation-delay: 0.2s; }
1692
1702
  .cxp-think-dots span:nth-child(3),
1693
1703
  .cxp-thinking .cxp-msg-think-dots span:nth-child(3) { animation-delay: 0.4s; }
1704
+ .cxp-reasoning[hidden] { display: none; }
1694
1705
  .cxp-reasoning.cxp-reasoning-done .cxp-think-dots { display: none; }
1695
1706
  .cxp-thinking {
1696
1707
  display: flex;
@@ -2521,7 +2532,7 @@ export function injectStyles() {
2521
2532
  }
2522
2533
  /* The wrap draws the input's edge: 1px of padding over a border-coloured fill. */
2523
2534
  .cxp-input-wrap {
2524
- flex: 1; position: relative;
2535
+ flex: 0 0 auto; position: relative;
2525
2536
  margin: 8px 8px 2px;
2526
2537
  border-radius: var(--cxp-radius-lg);
2527
2538
  padding: 1px;
@@ -2687,6 +2698,7 @@ export function injectStyles() {
2687
2698
  background: var(--cxp-surface-2);
2688
2699
  }
2689
2700
  .cxp-projectbar-actions {
2701
+ flex-shrink: 0;
2690
2702
  display: flex;
2691
2703
  align-items: center;
2692
2704
  gap: 2px;
@@ -3087,7 +3099,7 @@ export function injectStyles() {
3087
3099
  color: var(--cxp-text-2);
3088
3100
  background: var(--cxp-surface-1);
3089
3101
  margin-bottom: 2px;
3090
- cursor: grab;
3102
+ cursor: move;
3091
3103
  }
3092
3104
  .cxp-queue-item.dragging { opacity: 0.4; }
3093
3105
  .cxp-queue-item.drag-over { box-shadow: inset 0 2px 0 var(--cxp-text-2); }