synabun 2.0.10 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (656) hide show
  1. package/CHANGELOG.md +207 -0
  2. package/README.md +25 -2
  3. package/THIRD-PARTY-LICENSES.md +22 -0
  4. package/bin/synabun.js +71 -24
  5. package/docs/whatsapp.md +13 -13
  6. package/hooks/claude-code/pre-websearch.mjs +12 -1
  7. package/hooks/claude-code/shared.mjs +5 -0
  8. package/hooks/claude-code/stop.mjs +1 -1
  9. package/lib/claude-hooks.js +172 -18
  10. package/lib/client-config-repair.js +30 -17
  11. package/lib/desktop-app.js +7 -1
  12. package/lib/external-tools.js +7 -6
  13. package/lib/first-launch-protection.js +57 -12
  14. package/lib/mcp-dist.js +176 -0
  15. package/lib/release-npm-ci.mjs +138 -0
  16. package/lib/release-publish.mjs +91 -0
  17. package/lib/release-scan.mjs +50 -0
  18. package/lib/server-crash-record.js +123 -0
  19. package/lib/server-exit.js +318 -0
  20. package/lib/server-supervisor.js +508 -0
  21. package/lib/start-launcher.js +37 -4
  22. package/lib/tools-cli.js +45 -0
  23. package/lib/update-snapshot.js +302 -0
  24. package/lib/virustotal.mjs +203 -0
  25. package/lib/windows-crash-event.js +269 -0
  26. package/mcp-server/dist/http.d.ts +20 -1
  27. package/mcp-server/dist/http.d.ts.map +1 -1
  28. package/mcp-server/dist/http.js +59 -12
  29. package/mcp-server/dist/http.js.map +1 -1
  30. package/mcp-server/dist/index.d.ts +33 -27
  31. package/mcp-server/dist/index.d.ts.map +1 -1
  32. package/mcp-server/dist/index.js +128 -143
  33. package/mcp-server/dist/index.js.map +1 -1
  34. package/mcp-server/dist/preload.js +1 -1
  35. package/mcp-server/dist/preload.js.map +1 -1
  36. package/mcp-server/dist/services/budget-judgments.d.ts +1 -1
  37. package/mcp-server/dist/services/budget-judgments.d.ts.map +1 -1
  38. package/mcp-server/dist/services/budget-judgments.js +5 -3
  39. package/mcp-server/dist/services/budget-judgments.js.map +1 -1
  40. package/mcp-server/dist/services/codex-config-heal.d.ts +6 -2
  41. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
  42. package/mcp-server/dist/services/codex-config-heal.js +81 -28
  43. package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
  44. package/mcp-server/dist/services/identity.d.ts +2 -2
  45. package/mcp-server/dist/services/identity.js +2 -2
  46. package/mcp-server/dist/services/memory-judge-backfill.d.ts +6 -0
  47. package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -1
  48. package/mcp-server/dist/services/memory-judge-backfill.js +7 -1
  49. package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -1
  50. package/mcp-server/dist/services/memory-sessions.d.ts +1 -1
  51. package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -1
  52. package/mcp-server/dist/services/memory-sessions.js +28 -2
  53. package/mcp-server/dist/services/memory-sessions.js.map +1 -1
  54. package/mcp-server/dist/services/neural-interface.d.ts +18 -11
  55. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
  56. package/mcp-server/dist/services/neural-interface.js +67 -11
  57. package/mcp-server/dist/services/neural-interface.js.map +1 -1
  58. package/mcp-server/dist/services/server-instructions.d.ts +7 -2
  59. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -1
  60. package/mcp-server/dist/services/server-instructions.js +22 -63
  61. package/mcp-server/dist/services/server-instructions.js.map +1 -1
  62. package/mcp-server/dist/services/tool-catalog.d.ts +120 -0
  63. package/mcp-server/dist/services/tool-catalog.d.ts.map +1 -0
  64. package/mcp-server/dist/services/tool-catalog.js +339 -0
  65. package/mcp-server/dist/services/tool-catalog.js.map +1 -0
  66. package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts +12 -0
  67. package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts.map +1 -0
  68. package/mcp-server/dist/services/tool-list-refresh-barrier.js +40 -0
  69. package/mcp-server/dist/services/tool-list-refresh-barrier.js.map +1 -0
  70. package/mcp-server/dist/services/tool-list.d.ts +108 -0
  71. package/mcp-server/dist/services/tool-list.d.ts.map +1 -0
  72. package/mcp-server/dist/services/tool-list.js +334 -0
  73. package/mcp-server/dist/services/tool-list.js.map +1 -0
  74. package/mcp-server/dist/services/tool-runtime.d.ts +161 -0
  75. package/mcp-server/dist/services/tool-runtime.d.ts.map +1 -0
  76. package/mcp-server/dist/services/tool-runtime.js +400 -0
  77. package/mcp-server/dist/services/tool-runtime.js.map +1 -0
  78. package/mcp-server/dist/services/typesafe-config.js +1 -1
  79. package/mcp-server/dist/services/typesafe-config.js.map +1 -1
  80. package/mcp-server/dist/services/whiteboard-geometry.d.ts +26 -2
  81. package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -1
  82. package/mcp-server/dist/services/whiteboard-geometry.js +91 -8
  83. package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -1
  84. package/mcp-server/dist/tools/agents.d.ts +14 -14
  85. package/mcp-server/dist/tools/agents.d.ts.map +1 -1
  86. package/mcp-server/dist/tools/agents.js +29 -19
  87. package/mcp-server/dist/tools/agents.js.map +1 -1
  88. package/mcp-server/dist/tools/browser-batch.d.ts +3 -3
  89. package/mcp-server/dist/tools/choice.d.ts +6 -0
  90. package/mcp-server/dist/tools/choice.d.ts.map +1 -1
  91. package/mcp-server/dist/tools/choice.js +18 -13
  92. package/mcp-server/dist/tools/choice.js.map +1 -1
  93. package/mcp-server/dist/tools/git-tools.js +2 -2
  94. package/mcp-server/dist/tools/git-tools.js.map +1 -1
  95. package/mcp-server/dist/tools/image-tools.d.ts +1 -1
  96. package/mcp-server/dist/tools/image-tools.js +1 -1
  97. package/mcp-server/dist/tools/morelogin.d.ts.map +1 -1
  98. package/mcp-server/dist/tools/morelogin.js +9 -6
  99. package/mcp-server/dist/tools/morelogin.js.map +1 -1
  100. package/mcp-server/dist/tools/skill-tools.d.ts +505 -0
  101. package/mcp-server/dist/tools/skill-tools.d.ts.map +1 -0
  102. package/mcp-server/dist/tools/skill-tools.js +642 -0
  103. package/mcp-server/dist/tools/skill-tools.js.map +1 -0
  104. package/mcp-server/dist/tools/skill.d.ts +7 -0
  105. package/mcp-server/dist/tools/skill.d.ts.map +1 -0
  106. package/mcp-server/dist/tools/skill.js +11 -0
  107. package/mcp-server/dist/tools/skill.js.map +1 -0
  108. package/mcp-server/dist/tools/tool-groups.d.ts +68 -0
  109. package/mcp-server/dist/tools/tool-groups.d.ts.map +1 -0
  110. package/mcp-server/dist/tools/tool-groups.js +147 -0
  111. package/mcp-server/dist/tools/tool-groups.js.map +1 -0
  112. package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -1
  113. package/mcp-server/dist/tools/whiteboard-format.js +7 -4
  114. package/mcp-server/dist/tools/whiteboard-format.js.map +1 -1
  115. package/mcp-server/dist/tools/whiteboard-tools.d.ts +64 -13
  116. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -1
  117. package/mcp-server/dist/tools/whiteboard-tools.js +30 -5
  118. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -1
  119. package/mcp-server/package-lock.json +2 -2
  120. package/mcp-server/package.json +1 -1
  121. package/mcp-server/src/http.ts +75 -12
  122. package/mcp-server/src/index.ts +147 -154
  123. package/mcp-server/src/preload.ts +12 -12
  124. package/mcp-server/src/services/budget-judgments.ts +5 -3
  125. package/mcp-server/src/services/codex-config-heal.ts +80 -29
  126. package/mcp-server/src/services/identity.ts +2 -2
  127. package/mcp-server/src/services/memory-judge-backfill.ts +7 -1
  128. package/mcp-server/src/services/memory-sessions.ts +24 -3
  129. package/mcp-server/src/services/neural-interface.ts +81 -21
  130. package/mcp-server/src/services/server-instructions.ts +29 -64
  131. package/mcp-server/src/services/tool-catalog.ts +403 -0
  132. package/mcp-server/src/services/tool-list-refresh-barrier.ts +33 -0
  133. package/mcp-server/src/services/tool-list.ts +410 -0
  134. package/mcp-server/src/services/tool-runtime.ts +457 -0
  135. package/mcp-server/src/services/typesafe-config.ts +1 -1
  136. package/mcp-server/src/services/whiteboard-geometry.ts +94 -9
  137. package/mcp-server/src/tools/agents.ts +29 -20
  138. package/mcp-server/src/tools/choice.ts +17 -12
  139. package/mcp-server/src/tools/git-tools.ts +2 -2
  140. package/mcp-server/src/tools/image-tools.ts +1 -1
  141. package/mcp-server/src/tools/morelogin.ts +6 -4
  142. package/mcp-server/src/tools/skill-tools.ts +592 -0
  143. package/mcp-server/src/tools/skill.ts +13 -0
  144. package/mcp-server/src/tools/tool-groups.ts +164 -0
  145. package/mcp-server/src/tools/whiteboard-format.ts +9 -3
  146. package/mcp-server/src/tools/whiteboard-tools.ts +39 -5
  147. package/neural-interface/i18n/en.json +3953 -228
  148. package/neural-interface/i18n/pt-BR.json +3901 -179
  149. package/neural-interface/lib/agent-sandbox-elevation.js +6 -0
  150. package/neural-interface/lib/antigravity/acp-client-host.js +554 -0
  151. package/neural-interface/lib/antigravity/acp-connection.js +299 -0
  152. package/neural-interface/lib/antigravity/bypass.js +100 -0
  153. package/neural-interface/lib/antigravity/catalog.js +273 -0
  154. package/neural-interface/lib/antigravity/home.js +260 -0
  155. package/neural-interface/lib/antigravity/migrate-gemini.js +139 -0
  156. package/neural-interface/lib/antigravity/panel-bridge.js +1058 -0
  157. package/neural-interface/lib/antigravity/policy-hook.mjs +78 -0
  158. package/neural-interface/lib/antigravity/policy.js +74 -0
  159. package/neural-interface/lib/antigravity/tool-call.js +178 -0
  160. package/neural-interface/lib/antigravity/transcripts.js +252 -0
  161. package/neural-interface/lib/antigravity/usage.js +43 -0
  162. package/neural-interface/lib/assistant-api.js +128 -28
  163. package/neural-interface/lib/assistant-brains/antigravity.js +423 -0
  164. package/neural-interface/lib/assistant-brains/claude.js +4 -3
  165. package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +12 -2
  166. package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +32 -9
  167. package/neural-interface/lib/assistant-brains/codex.js +9 -5
  168. package/neural-interface/lib/assistant-brains/opencode.js +120 -54
  169. package/neural-interface/lib/assistant-brains/opencode2-browser-policy/index.js +28 -13
  170. package/neural-interface/lib/assistant-brains/opencode2-route-gate/index.js +59 -19
  171. package/neural-interface/lib/assistant-budget-planner.js +7 -3
  172. package/neural-interface/lib/assistant-budget-split.js +42 -15
  173. package/neural-interface/lib/assistant-catalog.js +81 -15
  174. package/neural-interface/lib/assistant-config.js +6 -3
  175. package/neural-interface/lib/assistant-dispatch.js +1073 -200
  176. package/neural-interface/lib/assistant-envelope.js +156 -2
  177. package/neural-interface/lib/assistant-evidence.js +80 -0
  178. package/neural-interface/lib/assistant-hidden-models.js +7 -5
  179. package/neural-interface/lib/assistant-persona.js +93 -19
  180. package/neural-interface/lib/assistant-plan-permissions.js +25 -9
  181. package/neural-interface/lib/assistant-route-gate-codex.js +3 -0
  182. package/neural-interface/lib/assistant-route-gate.js +6 -4
  183. package/neural-interface/lib/assistant-router.js +245 -38
  184. package/neural-interface/lib/assistant-runtime.js +214 -30
  185. package/neural-interface/lib/assistant-task-prompt.js +87 -21
  186. package/neural-interface/lib/assistant-tools.js +51 -0
  187. package/neural-interface/lib/assistant-usage.js +29 -0
  188. package/neural-interface/lib/backup-service.js +626 -4
  189. package/neural-interface/lib/backup-zip-reader.js +10 -5
  190. package/neural-interface/lib/backup-zip-writer.js +257 -0
  191. package/neural-interface/lib/browser-execution.js +10 -2
  192. package/neural-interface/lib/browser-guard-cdp.js +84 -0
  193. package/neural-interface/lib/browser-network-guard.js +476 -0
  194. package/neural-interface/lib/browser-policy-roots.js +64 -0
  195. package/neural-interface/lib/browser-tool-policy.js +198 -38
  196. package/neural-interface/lib/claude-agent-bridge.js +11 -2
  197. package/neural-interface/lib/claude-history-cache.js +210 -0
  198. package/neural-interface/lib/claude-hooks-status.js +103 -0
  199. package/neural-interface/lib/claude-model-catalog.js +5 -1
  200. package/neural-interface/lib/claude-temporary.js +5 -11
  201. package/neural-interface/lib/cli-install-api.js +1 -1
  202. package/neural-interface/lib/cli-install.js +163 -154
  203. package/neural-interface/lib/cli-resolver.js +13 -3
  204. package/neural-interface/lib/cli-update-planner.js +52 -41
  205. package/neural-interface/lib/cloudflared/tunnel.js +42 -2
  206. package/neural-interface/lib/codex-mcp-approvals.js +11 -0
  207. package/neural-interface/lib/codex-rollout-reader.js +52 -0
  208. package/neural-interface/lib/codex-worker-app-server.js +191 -0
  209. package/neural-interface/lib/confined-fs.js +30 -3
  210. package/neural-interface/lib/crash-notice-api.js +98 -0
  211. package/neural-interface/lib/editor-completion-opencode.js +68 -68
  212. package/neural-interface/lib/editor-git-api.js +3 -20
  213. package/neural-interface/lib/exec-loop-command.js +13 -10
  214. package/neural-interface/lib/file-explorer-api.js +74 -40
  215. package/neural-interface/lib/file-explorer-watch.js +9 -3
  216. package/neural-interface/lib/git-bash/install.js +52 -6
  217. package/neural-interface/lib/git-bash/manager.js +59 -17
  218. package/neural-interface/lib/git-bash/pins.js +12 -0
  219. package/neural-interface/lib/git-read.js +2 -2
  220. package/neural-interface/lib/git-status-runner.js +390 -0
  221. package/neural-interface/lib/git-status-watchdog.js +40 -0
  222. package/neural-interface/lib/greeting/budgets.js +1 -0
  223. package/neural-interface/lib/greeting/engine.js +2 -2
  224. package/neural-interface/lib/greeting/sources.js +10 -12
  225. package/neural-interface/lib/greeting/writer.js +1 -1
  226. package/neural-interface/lib/http-guards.js +8 -2
  227. package/neural-interface/lib/install-details.js +4 -1
  228. package/neural-interface/lib/mcp-agent-servers.js +67 -0
  229. package/neural-interface/lib/mcp-client-config.js +35 -33
  230. package/neural-interface/lib/mcp-external-servers.js +332 -0
  231. package/neural-interface/lib/mcp-installer.js +2 -1
  232. package/neural-interface/lib/{mcp-profile-refresh-coordinator.js → mcp-tools-refresh-coordinator.js} +4 -4
  233. package/neural-interface/lib/memory-session-capture.js +17 -3
  234. package/neural-interface/lib/morelogin.js +177 -25
  235. package/neural-interface/lib/native-loop-providers.js +965 -66
  236. package/neural-interface/lib/native-loop-runtime.js +290 -42
  237. package/neural-interface/lib/opencode-config.js +557 -0
  238. package/neural-interface/lib/opencode-db-schema.js +17 -34
  239. package/neural-interface/lib/opencode-history.js +48 -218
  240. package/neural-interface/lib/opencode-mcp-ready.js +108 -0
  241. package/neural-interface/lib/opencode-native-boundary.js +53 -0
  242. package/neural-interface/lib/opencode-protocol.js +249 -112
  243. package/neural-interface/lib/opencode-runtime-config.js +32 -22
  244. package/neural-interface/lib/opencode-serve-records.js +39 -21
  245. package/neural-interface/lib/opencode-v2-client.js +48 -153
  246. package/neural-interface/lib/opencode-v2-ws-requests.js +36 -210
  247. package/neural-interface/lib/opencode-worker-data.js +27 -0
  248. package/neural-interface/lib/opencode2-client.js +73 -37
  249. package/neural-interface/lib/opencode2-proxy.js +23 -63
  250. package/neural-interface/lib/opencode2-translate.js +51 -2
  251. package/neural-interface/lib/owner-authority.js +249 -0
  252. package/neural-interface/lib/page-session.js +275 -0
  253. package/neural-interface/lib/path-confine.js +12 -9
  254. package/neural-interface/lib/peer-identity.js +793 -0
  255. package/neural-interface/lib/pty-host/core.js +28 -1
  256. package/neural-interface/lib/pty-host/lifetime.js +12 -0
  257. package/neural-interface/lib/pty-host/manager.js +12 -1
  258. package/neural-interface/lib/remote-policy.js +1 -1
  259. package/neural-interface/lib/request-gate.js +20 -2
  260. package/neural-interface/lib/rulesets/api.js +7 -6
  261. package/neural-interface/lib/rulesets/fs-safe.js +1 -1
  262. package/neural-interface/lib/rulesets/installer.js +180 -36
  263. package/neural-interface/lib/rulesets/json-edit.js +1 -1
  264. package/neural-interface/lib/rulesets/render.js +1 -1
  265. package/neural-interface/lib/session-cache-builder.js +81 -31
  266. package/neural-interface/lib/session-title-generator.js +58 -36
  267. package/neural-interface/lib/skills/api-v2.js +495 -0
  268. package/neural-interface/lib/skills/bundle.js +418 -0
  269. package/neural-interface/lib/skills/catalog.js +298 -0
  270. package/neural-interface/lib/skills/creation-api.js +191 -0
  271. package/neural-interface/lib/skills/creation-brief.js +247 -0
  272. package/neural-interface/lib/skills/creation-sources.js +285 -0
  273. package/neural-interface/lib/skills/creation.js +843 -0
  274. package/neural-interface/lib/skills/deploy.js +569 -0
  275. package/neural-interface/lib/skills/digest.js +119 -0
  276. package/neural-interface/lib/skills/discover.js +111 -0
  277. package/neural-interface/lib/skills/draft-confinement.js +216 -0
  278. package/neural-interface/lib/skills/eval-confinement.js +399 -0
  279. package/neural-interface/lib/skills/eval-sandbox.js +280 -0
  280. package/neural-interface/lib/skills/eval-trace.js +135 -0
  281. package/neural-interface/lib/skills/evals-api.js +212 -0
  282. package/neural-interface/lib/skills/evals.js +1573 -0
  283. package/neural-interface/lib/skills/export.js +203 -0
  284. package/neural-interface/lib/skills/frontmatter.js +64 -0
  285. package/neural-interface/lib/skills/health.js +75 -0
  286. package/neural-interface/lib/skills/json-edit.js +165 -0
  287. package/neural-interface/lib/skills/known-bridge-digests.json +441 -0
  288. package/neural-interface/lib/skills/known-bridges.js +96 -0
  289. package/neural-interface/lib/skills/library.js +823 -0
  290. package/neural-interface/lib/skills/local-store.js +21 -0
  291. package/neural-interface/lib/skills/migration.js +433 -0
  292. package/neural-interface/lib/skills/operations.js +45 -0
  293. package/neural-interface/lib/skills/ownership.js +427 -0
  294. package/neural-interface/lib/skills/packages.js +88 -0
  295. package/neural-interface/lib/skills/reviews.js +212 -0
  296. package/neural-interface/lib/skills/revision.js +80 -0
  297. package/neural-interface/lib/skills/roots.js +269 -0
  298. package/neural-interface/lib/skills/runtime-checks.js +358 -0
  299. package/neural-interface/lib/skills/scan-assets.js +252 -0
  300. package/neural-interface/lib/skills/scan-context.js +26 -0
  301. package/neural-interface/lib/skills/scan-shell.js +324 -0
  302. package/neural-interface/lib/skills/scan.js +364 -0
  303. package/neural-interface/lib/skills/scanners.js +54 -0
  304. package/neural-interface/lib/skills/service.js +530 -0
  305. package/neural-interface/lib/skills/telemetry.js +119 -0
  306. package/neural-interface/lib/sqlite-integrity-worker.js +22 -0
  307. package/neural-interface/lib/synabun-version.js +1 -1
  308. package/neural-interface/lib/system-activity.js +1 -1
  309. package/neural-interface/lib/tool-lists.js +124 -0
  310. package/neural-interface/lib/whatsapp/brain.js +7 -3
  311. package/neural-interface/lib/whatsapp/bridge.js +6 -3
  312. package/neural-interface/lib/whatsapp/cards.js +22 -9
  313. package/neural-interface/lib/whatsapp/config.js +1 -1
  314. package/neural-interface/lib/worker-confinement.js +1268 -0
  315. package/neural-interface/lib/worker-guard-setting.js +56 -0
  316. package/neural-interface/lib/worker-mcp-channel.js +175 -0
  317. package/neural-interface/lib/worker-question.js +74 -0
  318. package/neural-interface/lib/worker-relay-ports.js +227 -0
  319. package/neural-interface/lib/worker-resume.js +238 -0
  320. package/neural-interface/lib/worker-sandbox.js +329 -0
  321. package/neural-interface/package-lock.json +34 -12
  322. package/neural-interface/package.json +3 -2
  323. package/neural-interface/public/index.html +3 -1
  324. package/neural-interface/public/index2d.html +19 -11
  325. package/neural-interface/public/onboarding.html +3 -3
  326. package/neural-interface/public/shared/account-menu.js +8 -5
  327. package/neural-interface/public/shared/agent-runtime-options.js +125 -31
  328. package/neural-interface/public/shared/agy/agy-bypass.js +47 -0
  329. package/neural-interface/public/shared/agy/agy-client.js +266 -0
  330. package/neural-interface/public/shared/agy/agy-commands.js +120 -0
  331. package/neural-interface/public/shared/agy/agy-copy.js +326 -0
  332. package/neural-interface/public/shared/agy/agy-diff.js +161 -0
  333. package/neural-interface/public/shared/agy/agy-events.js +469 -0
  334. package/neural-interface/public/shared/agy/agy-greeting.js +26 -0
  335. package/neural-interface/public/shared/agy/agy-options.js +232 -0
  336. package/neural-interface/public/shared/agy/agy-panel.js +2543 -0
  337. package/neural-interface/public/shared/agy/agy-render.js +392 -0
  338. package/neural-interface/public/shared/agy/agy-setup.js +149 -0
  339. package/neural-interface/public/shared/agy/agy-styles.js +604 -0
  340. package/neural-interface/public/shared/agy/agy-tabs-logic.js +181 -0
  341. package/neural-interface/public/shared/api.js +1527 -1336
  342. package/neural-interface/public/shared/app-frame.js +192 -0
  343. package/neural-interface/public/shared/assistant/asst-agents-dock.js +36 -6
  344. package/neural-interface/public/shared/assistant/asst-api.js +1 -1
  345. package/neural-interface/public/shared/assistant/asst-ask-styles.js +270 -0
  346. package/neural-interface/public/shared/assistant/asst-ask-tail.js +118 -0
  347. package/neural-interface/public/shared/assistant/asst-ask.js +397 -0
  348. package/neural-interface/public/shared/assistant/asst-brain-picker.js +105 -44
  349. package/neural-interface/public/shared/assistant/asst-budget.js +5 -4
  350. package/neural-interface/public/shared/assistant/asst-control.js +205 -26
  351. package/neural-interface/public/shared/assistant/asst-followups-card.js +383 -0
  352. package/neural-interface/public/shared/assistant/asst-followups.js +417 -0
  353. package/neural-interface/public/shared/assistant/asst-hosts.js +16 -7
  354. package/neural-interface/public/shared/assistant/asst-limit-dock.js +45 -0
  355. package/neural-interface/public/shared/assistant/asst-limit-wait.js +327 -0
  356. package/neural-interface/public/shared/assistant/asst-limit.js +168 -0
  357. package/neural-interface/public/shared/assistant/asst-mascot.js +49 -12
  358. package/neural-interface/public/shared/assistant/asst-menu.js +7 -6
  359. package/neural-interface/public/shared/assistant/asst-panel.js +151 -19
  360. package/neural-interface/public/shared/assistant/asst-rack-styles.js +66 -49
  361. package/neural-interface/public/shared/assistant/asst-render.js +445 -82
  362. package/neural-interface/public/shared/assistant/asst-route.js +304 -53
  363. package/neural-interface/public/shared/assistant/asst-routes-editor.js +9 -8
  364. package/neural-interface/public/shared/assistant/asst-scenes.js +56 -1
  365. package/neural-interface/public/shared/assistant/asst-sidepanel.js +117 -10
  366. package/neural-interface/public/shared/assistant/asst-slash.js +17 -9
  367. package/neural-interface/public/shared/assistant/asst-state.js +87 -24
  368. package/neural-interface/public/shared/assistant/asst-stop.js +127 -0
  369. package/neural-interface/public/shared/assistant/asst-styles.js +93 -21
  370. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +190 -23
  371. package/neural-interface/public/shared/assistant/asst-usage.js +2 -1
  372. package/neural-interface/public/shared/automation-context.js +5 -2
  373. package/neural-interface/public/shared/cc-dropdown.js +89 -19
  374. package/neural-interface/public/shared/cdx/cdx-context-menu.js +10 -9
  375. package/neural-interface/public/shared/cdx/cdx-copy.js +16 -0
  376. package/neural-interface/public/shared/cdx/cdx-output-model.js +22 -1
  377. package/neural-interface/public/shared/cdx/cdx-output.js +34 -10
  378. package/neural-interface/public/shared/cdx/cdx-panel.js +59 -151
  379. package/neural-interface/public/shared/cdx/cdx-preview.js +12 -0
  380. package/neural-interface/public/shared/cdx/cdx-protocol.js +39 -11
  381. package/neural-interface/public/shared/cdx/cdx-render.js +57 -38
  382. package/neural-interface/public/shared/cdx/cdx-requests.js +14 -4
  383. package/neural-interface/public/shared/cdx/cdx-skill-hints.js +54 -0
  384. package/neural-interface/public/shared/cdx/cdx-styles.js +15 -3
  385. package/neural-interface/public/shared/cdx/cdx-tabs.js +127 -44
  386. package/neural-interface/public/shared/cdx/cdx-ws.js +0 -1
  387. package/neural-interface/public/shared/cli-install-controller.js +218 -0
  388. package/neural-interface/public/shared/cli-install-view.js +11 -12
  389. package/neural-interface/public/shared/cli-status.js +11 -10
  390. package/neural-interface/public/shared/constants.js +5 -4
  391. package/neural-interface/public/shared/context-menu-areas.js +34 -0
  392. package/neural-interface/public/shared/context-menu-logic.js +243 -0
  393. package/neural-interface/public/shared/context-menu-model.js +367 -0
  394. package/neural-interface/public/shared/context-menu.js +372 -0
  395. package/neural-interface/public/shared/cp/cp-context-menu.js +10 -9
  396. package/neural-interface/public/shared/cp/cp-restore.js +162 -0
  397. package/neural-interface/public/shared/cp/cp-tool-cards.js +10 -3
  398. package/neural-interface/public/shared/crash-notice-view.js +168 -0
  399. package/neural-interface/public/shared/desktop-bridge.js +17 -0
  400. package/neural-interface/public/shared/desktop-titlebar-view.js +12 -0
  401. package/neural-interface/public/shared/desktop-titlebar.js +13 -4
  402. package/neural-interface/public/shared/desktop-update-view.js +21 -0
  403. package/neural-interface/public/shared/editor/editor-panel-logic.js +2 -2
  404. package/neural-interface/public/shared/explorer/fx-api.js +4 -4
  405. package/neural-interface/public/shared/explorer/fx-links.js +3 -3
  406. package/neural-interface/public/shared/explorer/fx-logic.js +1 -1
  407. package/neural-interface/public/shared/explorer/fx-main.js +48 -16
  408. package/neural-interface/public/shared/explorer/fx-tree.js +1 -0
  409. package/neural-interface/public/shared/greeting/greeting-card.js +2 -2
  410. package/neural-interface/public/shared/greeting/greeting-view.js +1 -0
  411. package/neural-interface/public/shared/html-shell.js +30 -15
  412. package/neural-interface/public/shared/i18n.js +2 -0
  413. package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +7 -7
  414. package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +4 -4
  415. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +3 -101
  416. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +2 -0
  417. package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +1 -3
  418. package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +2 -6
  419. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +11 -11
  420. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +0 -3
  421. package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +8 -4
  422. package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +7 -7
  423. package/neural-interface/public/shared/ocp-v2/ocp-v2-outcome-notifications.js +16 -0
  424. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +74 -259
  425. package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +1 -2
  426. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +95 -202
  427. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +13 -4
  428. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +13 -22
  429. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +4 -4
  430. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +8 -61
  431. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +2 -91
  432. package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +16 -15
  433. package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +8 -21
  434. package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +1 -99
  435. package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +5 -35
  436. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +17 -21
  437. package/neural-interface/public/shared/ocp-v2/{ocp-v2-profile-inheritance.js → ocp-v2-tools-inheritance.js} +16 -16
  438. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +60 -50
  439. package/neural-interface/public/shared/page-session.js +96 -0
  440. package/neural-interface/public/shared/provider-icons.js +4 -2
  441. package/neural-interface/public/shared/registry.js +5 -3
  442. package/neural-interface/public/shared/retired-2d.js +3 -0
  443. package/neural-interface/public/shared/schedules-view.js +195 -61
  444. package/neural-interface/public/shared/settings/settings-claude-hooks.js +135 -0
  445. package/neural-interface/public/shared/settings/settings-data.js +3 -1
  446. package/neural-interface/public/shared/settings/settings-ia.js +6 -6
  447. package/neural-interface/public/shared/settings/settings-opencode.js +89 -0
  448. package/neural-interface/public/shared/settings/settings-rules.js +2 -2
  449. package/neural-interface/public/shared/settings/settings-skill-folders-pane.js +265 -0
  450. package/neural-interface/public/shared/settings/settings-skill-folders.js +130 -0
  451. package/neural-interface/public/shared/settings/settings-worker-guard.js +72 -0
  452. package/neural-interface/public/shared/showcase-privacy.js +6 -1
  453. package/neural-interface/public/shared/sidepanel-session-status.js +3 -3
  454. package/neural-interface/public/shared/skills/ss-args.js +96 -0
  455. package/neural-interface/public/shared/skills/ss-creation.js +222 -0
  456. package/neural-interface/public/shared/skills/ss-dialog.js +133 -0
  457. package/neural-interface/public/shared/skills/ss-doc.js +173 -0
  458. package/neural-interface/public/shared/skills/ss-eval-adapters.js +269 -0
  459. package/neural-interface/public/shared/skills/ss-eval-grade.js +359 -0
  460. package/neural-interface/public/shared/skills/ss-eval-optimise.js +153 -0
  461. package/neural-interface/public/shared/skills/ss-eval-plan.js +315 -0
  462. package/neural-interface/public/shared/skills/ss-evals.js +417 -0
  463. package/neural-interface/public/shared/skills/ss-form.js +159 -0
  464. package/neural-interface/public/shared/skills/ss-frontmatter.js +376 -0
  465. package/neural-interface/public/shared/skills/ss-ids.js +32 -0
  466. package/neural-interface/public/shared/skills/ss-lint.js +149 -0
  467. package/neural-interface/public/shared/skills/ss-presets.js +117 -0
  468. package/neural-interface/public/shared/skills/ss-profiles.js +513 -0
  469. package/neural-interface/public/shared/skills/ss-resources.js +165 -0
  470. package/neural-interface/public/shared/skills/ss-review-view.js +190 -0
  471. package/neural-interface/public/shared/skills/ss-tabs.js +79 -0
  472. package/neural-interface/public/shared/skills/ss-unicode.js +135 -0
  473. package/neural-interface/public/shared/skills/studio/sx-actions.js +222 -0
  474. package/neural-interface/public/shared/skills/studio/sx-cm.js +101 -0
  475. package/neural-interface/public/shared/skills/studio/sx-create-ai-view.js +749 -0
  476. package/neural-interface/public/shared/skills/studio/sx-create-ai.js +237 -0
  477. package/neural-interface/public/shared/skills/studio/sx-create-view.js +254 -0
  478. package/neural-interface/public/shared/skills/studio/sx-create.js +126 -0
  479. package/neural-interface/public/shared/skills/studio/sx-diff-view.js +43 -0
  480. package/neural-interface/public/shared/skills/studio/sx-diff.js +133 -0
  481. package/neural-interface/public/shared/skills/studio/sx-docs.js +480 -0
  482. package/neural-interface/public/shared/skills/studio/sx-dom.js +230 -0
  483. package/neural-interface/public/shared/skills/studio/sx-edit-view.js +848 -0
  484. package/neural-interface/public/shared/skills/studio/sx-editor-model.js +193 -0
  485. package/neural-interface/public/shared/skills/studio/sx-errors.js +22 -0
  486. package/neural-interface/public/shared/skills/studio/sx-fixes-view.js +359 -0
  487. package/neural-interface/public/shared/skills/studio/sx-fixes.js +327 -0
  488. package/neural-interface/public/shared/skills/studio/sx-geometry.js +82 -0
  489. package/neural-interface/public/shared/skills/studio/sx-import.js +262 -0
  490. package/neural-interface/public/shared/skills/studio/sx-inspector.js +308 -0
  491. package/neural-interface/public/shared/skills/studio/sx-install-flow.js +282 -0
  492. package/neural-interface/public/shared/skills/studio/sx-install.js +313 -0
  493. package/neural-interface/public/shared/skills/studio/sx-library-view.js +748 -0
  494. package/neural-interface/public/shared/skills/studio/sx-library.js +479 -0
  495. package/neural-interface/public/shared/skills/studio/sx-main.js +690 -0
  496. package/neural-interface/public/shared/skills/studio/sx-operations-view.js +98 -0
  497. package/neural-interface/public/shared/skills/studio/sx-operations.js +11 -0
  498. package/neural-interface/public/shared/skills/studio/sx-plan.js +158 -0
  499. package/neural-interface/public/shared/skills/studio/sx-publish-view.js +621 -0
  500. package/neural-interface/public/shared/skills/studio/sx-review-view.js +369 -0
  501. package/neural-interface/public/shared/skills/studio/sx-review.js +148 -0
  502. package/neural-interface/public/shared/skills/studio/sx-scan.js +35 -0
  503. package/neural-interface/public/shared/skills/studio/sx-snippets.js +96 -0
  504. package/neural-interface/public/shared/skills/studio/sx-subject.js +249 -0
  505. package/neural-interface/public/shared/skills/studio/sx-test-view.js +994 -0
  506. package/neural-interface/public/shared/skills/studio/sx-test.js +328 -0
  507. package/neural-interface/public/shared/skills/studio/sx-versions-view.js +241 -0
  508. package/neural-interface/public/shared/skills/studio/sx-workspace-view.js +426 -0
  509. package/neural-interface/public/shared/state.js +1 -1
  510. package/neural-interface/public/shared/streaming-markdown.js +58 -0
  511. package/neural-interface/public/shared/styleguide/sg-panel.js +4 -2
  512. package/neural-interface/public/shared/styles.css +1822 -1756
  513. package/neural-interface/public/shared/synabun-mascot.js +1115 -9
  514. package/neural-interface/public/shared/text-cache.js +29 -0
  515. package/neural-interface/public/shared/tool-list-picker.js +55 -0
  516. package/neural-interface/public/shared/tool-list-storage.js +24 -0
  517. package/neural-interface/public/shared/tool-list-view.js +112 -0
  518. package/neural-interface/public/shared/topright-overflow-logic.js +54 -0
  519. package/neural-interface/public/shared/tour/tour-actor.js +268 -0
  520. package/neural-interface/public/shared/tour/tour-beats.js +336 -0
  521. package/neural-interface/public/shared/tour/tour-engine.js +884 -0
  522. package/neural-interface/public/shared/tour/tour-ink.js +390 -0
  523. package/neural-interface/public/shared/tour/tour-stage.js +440 -0
  524. package/neural-interface/public/shared/tour/tour-state.js +40 -0
  525. package/neural-interface/public/shared/tour/tour-tips.js +99 -0
  526. package/neural-interface/public/shared/tour/tour.css +144 -0
  527. package/neural-interface/public/shared/ui-antigravity-panel.js +19 -0
  528. package/neural-interface/public/shared/ui-assistant.js +2 -0
  529. package/neural-interface/public/shared/ui-automation-studio.js +111 -140
  530. package/neural-interface/public/shared/ui-claude-panel.js +376 -82
  531. package/neural-interface/public/shared/ui-cli-banner.js +23 -167
  532. package/neural-interface/public/shared/ui-command-runner.js +6 -3
  533. package/neural-interface/public/shared/ui-context-menu.js +295 -0
  534. package/neural-interface/public/shared/ui-cost-widget.js +57 -59
  535. package/neural-interface/public/shared/ui-crash-notice.js +187 -0
  536. package/neural-interface/public/shared/ui-detail.js +15 -3
  537. package/neural-interface/public/shared/ui-file-explorer.js +48 -6
  538. package/neural-interface/public/shared/ui-file-links.js +2 -2
  539. package/neural-interface/public/shared/ui-games.js +2 -2
  540. package/neural-interface/public/shared/ui-image-gallery.js +50 -47
  541. package/neural-interface/public/shared/ui-judgments.js +1 -1
  542. package/neural-interface/public/shared/ui-keybinds.js +33 -2
  543. package/neural-interface/public/shared/ui-link.js +3 -3
  544. package/neural-interface/public/shared/ui-menubar.js +10 -20
  545. package/neural-interface/public/shared/ui-native-loop-router-state.js +5 -0
  546. package/neural-interface/public/shared/ui-native-loop-router.js +11 -1
  547. package/neural-interface/public/shared/ui-navbar.js +49 -24
  548. package/neural-interface/public/shared/ui-notifications.js +1 -0
  549. package/neural-interface/public/shared/ui-panels.js +96 -65
  550. package/neural-interface/public/shared/ui-resume.js +9 -7
  551. package/neural-interface/public/shared/ui-schedules-studio.js +546 -431
  552. package/neural-interface/public/shared/ui-scroll-follow.js +16 -5
  553. package/neural-interface/public/shared/ui-sessions.js +27 -15
  554. package/neural-interface/public/shared/ui-settings.js +683 -526
  555. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +9 -2
  556. package/neural-interface/public/shared/ui-sidepanel-sessions.js +4 -4
  557. package/neural-interface/public/shared/ui-sidepanel-state.js +23 -12
  558. package/neural-interface/public/shared/ui-sidepanel-tray.js +48 -7
  559. package/neural-interface/public/shared/ui-sidepanel-windows.js +18 -13
  560. package/neural-interface/public/shared/ui-skills.js +33 -2830
  561. package/neural-interface/public/shared/ui-styleguide.js +5 -2
  562. package/neural-interface/public/shared/ui-sync.js +15 -5
  563. package/neural-interface/public/shared/ui-terminal.js +270 -190
  564. package/neural-interface/public/shared/ui-tool-updates.js +6 -4
  565. package/neural-interface/public/shared/ui-tooltip.js +81 -51
  566. package/neural-interface/public/shared/ui-topright-overflow.js +233 -0
  567. package/neural-interface/public/shared/ui-trash.js +6 -4
  568. package/neural-interface/public/shared/ui-tutorial-layout.js +3 -117
  569. package/neural-interface/public/shared/ui-tutorial-preview.js +103 -0
  570. package/neural-interface/public/shared/ui-tutorial-steps.js +3 -65
  571. package/neural-interface/public/shared/ui-tutorial.css +47 -100
  572. package/neural-interface/public/shared/ui-tutorial.js +285 -509
  573. package/neural-interface/public/shared/ui-update.js +38 -2
  574. package/neural-interface/public/shared/ui-whiteboard.js +312 -59
  575. package/neural-interface/public/shared/ui-worker-end.js +5 -1
  576. package/neural-interface/public/shared/ui-workspaces.js +3 -2
  577. package/neural-interface/public/shared/view-variant.js +66 -0
  578. package/neural-interface/public/shared/whatsapp/wa-view.js +3 -3
  579. package/neural-interface/public/shared/whiteboard-list.js +172 -0
  580. package/neural-interface/public/shared/worker-end.js +10 -3
  581. package/neural-interface/public/shared/worker-questions.js +34 -0
  582. package/neural-interface/public/shared/worker-restart.js +12 -0
  583. package/neural-interface/public/sidepanel-session.html +2 -2
  584. package/neural-interface/public/variant/2d/background.js +2 -1
  585. package/neural-interface/public/variant/2d/context-menu.js +8 -2
  586. package/neural-interface/public/variant/2d/graph.js +42 -20
  587. package/neural-interface/public/variant/2d/hulls.js +14 -9
  588. package/neural-interface/public/variant/2d/lasso.js +11 -7
  589. package/neural-interface/public/variant/2d/main.js +32 -1
  590. package/neural-interface/public/variant/2d/minimap.js +11 -13
  591. package/neural-interface/public/variant/3d/main.js +69 -6
  592. package/neural-interface/public/variant/3d/map-controls.js +24 -9
  593. package/neural-interface/public/vendor/caveat/OFL.txt +93 -0
  594. package/neural-interface/public/vendor/caveat/caveat-latin-400-normal.woff2 +0 -0
  595. package/neural-interface/public/vendor/caveat/caveat-latin-700-normal.woff2 +0 -0
  596. package/neural-interface/public/vendor/caveat/caveat.css +17 -0
  597. package/neural-interface/public/vendor/caveat/manifest.json +12 -0
  598. package/neural-interface/public/vendor/yaml/LICENSE +13 -0
  599. package/neural-interface/public/vendor/yaml/manifest.json +4 -0
  600. package/neural-interface/public/vendor/yaml/yaml-2.9.1.min.js +137 -0
  601. package/neural-interface/scripts/build-vendor.mjs +32 -0
  602. package/neural-interface/server.js +4553 -2855
  603. package/neural-interface/templates/rulesets/README.md +1 -1
  604. package/neural-interface/templates/rulesets/core.md +1 -1
  605. package/neural-interface/templates/rulesets/legacy-hashes.json +23 -5
  606. package/neural-interface/templates/rulesets/manifest.json +8 -8
  607. package/npm-shrinkwrap.json +34 -12
  608. package/package.json +17 -3
  609. package/postinstall.js +9 -4
  610. package/preuninstall.js +1 -1
  611. package/setup.js +97 -322
  612. package/skills/skill-forge/SKILL.md +177 -0
  613. package/skills/skill-forge/evals/evals.json +54 -0
  614. package/skills/skill-forge/references/package.md +105 -0
  615. package/skills/skill-forge/references/review-and-recovery.md +63 -0
  616. package/skills/skill-forge/references/runtime-profiles.md +20 -0
  617. package/skills/skill-forge/references/sources-and-capabilities.md +51 -0
  618. package/skills/synabun/SKILL.md +10 -7
  619. package/skills/synabun/modules/audit.md +1 -5
  620. package/skills/synabun/modules/changelog.md +1 -5
  621. package/skills/synabun/modules/idea.md +1 -1
  622. package/skills/synabun/modules/memorize.md +6 -9
  623. package/skills/synabun/modules/schedule.md +6 -6
  624. package/mcp-server/dist/services/profiles.d.ts +0 -120
  625. package/mcp-server/dist/services/profiles.d.ts.map +0 -1
  626. package/mcp-server/dist/services/profiles.js +0 -387
  627. package/mcp-server/dist/services/profiles.js.map +0 -1
  628. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +0 -97
  629. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +0 -1
  630. package/mcp-server/dist/tools/leonardo-browser-tools.js +0 -228
  631. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +0 -1
  632. package/mcp-server/dist/tools/leonardo.d.ts +0 -13
  633. package/mcp-server/dist/tools/leonardo.d.ts.map +0 -1
  634. package/mcp-server/dist/tools/leonardo.js +0 -21
  635. package/mcp-server/dist/tools/leonardo.js.map +0 -1
  636. package/mcp-server/dist/tools/profile.d.ts +0 -17
  637. package/mcp-server/dist/tools/profile.d.ts.map +0 -1
  638. package/mcp-server/dist/tools/profile.js +0 -114
  639. package/mcp-server/dist/tools/profile.js.map +0 -1
  640. package/mcp-server/src/services/profiles.ts +0 -428
  641. package/mcp-server/src/tools/leonardo-browser-tools.ts +0 -291
  642. package/mcp-server/src/tools/leonardo.ts +0 -30
  643. package/mcp-server/src/tools/profile.ts +0 -122
  644. package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +0 -47
  645. package/neural-interface/lib/assistant-brains/opencode-route-gate.js +0 -62
  646. package/neural-interface/lib/mcp-profile-servers.js +0 -120
  647. package/neural-interface/public/shared/ui-tutorial-draw.js +0 -311
  648. package/skills/leonardo/SKILL.md +0 -168
  649. package/skills/leonardo/icon.svg +0 -1
  650. package/skills/leonardo/modules/browser-guide.md +0 -378
  651. package/skills/leonardo/modules/image-prompter.md +0 -283
  652. package/skills/leonardo/modules/model-advisor.md +0 -100
  653. package/skills/leonardo/modules/prompt-library.md +0 -110
  654. package/skills/leonardo/modules/style-guide.md +0 -186
  655. package/skills/leonardo/modules/video-prompter.md +0 -317
  656. /package/neural-interface/templates/rulesets/{gemini.md → antigravity.md} +0 -0
@@ -1,3 +1,6 @@
1
+ import { migrateStoredTools } from './tool-list-storage.js';
2
+ import { wireDropdowns } from './cc-dropdown.js';
3
+ import { configureToolPickerTranslation, toolPickerHTML, readToolPicker, updateToolPicker, taskToolHost as strictToolHost, toolWord } from './tool-list-picker.js';
1
4
  // ═══════════════════════════════════════════
2
5
  // SynaBun Neural Interface — Automation Studio
3
6
  // Browse, configure, launch, and track loop automations.
@@ -18,12 +21,16 @@ import {
18
21
  import {
19
22
  CLI_PROFILES,
20
23
  ensureModelsForProfile,
21
- fetchMcpProfilePresets,
24
+ fetchToolCatalog,
25
+ getCachedToolCatalog,
22
26
  fetchCodexAccounts,
23
27
  getCachedCodexAccounts,
24
28
  getEffortLevelsForProfile,
25
29
  getModelsForProfile,
26
30
  isDynamicModelProfile,
31
+ migrateLaunchRecords,
32
+ migrateProviderId,
33
+ migrateProviderModel,
27
34
  modelSelectorValue,
28
35
  modelMatchesSelector,
29
36
  normalizeEffortForProfile,
@@ -68,6 +75,7 @@ import {
68
75
  cancelQuickTimer,
69
76
  triggerQuickTimerNow,
70
77
  } from './api.js';
78
+ import { centeredInFrame, placementArea } from './app-frame.js';
71
79
 
72
80
  const $ = (id) => document.getElementById(id);
73
81
 
@@ -179,8 +187,7 @@ const AS_ICONS = {
179
187
  // External SVG logos (fill-based, from public/ directory)
180
188
  claude: `<svg viewBox="0 0 24 24" width="14" height="14" fill="currentColor" fill-rule="evenodd"><path d="M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z"/></svg>`,
181
189
  openai: `<svg viewBox="0 0 24 24" width="14" height="14" fill="currentColor" fill-rule="evenodd"><path d="M9.205 8.658v-2.26c0-.19.072-.333.238-.428l4.543-2.616c.619-.357 1.356-.523 2.117-.523 2.854 0 4.662 2.212 4.662 4.566 0 .167 0 .357-.024.547l-4.71-2.759a.797.797 0 00-.856 0l-5.97 3.473zm10.609 8.8V12.06c0-.333-.143-.57-.429-.737l-5.97-3.473 1.95-1.118a.433.433 0 01.476 0l4.543 2.617c1.309.76 2.189 2.378 2.189 3.948 0 1.808-1.07 3.473-2.76 4.163zM7.802 12.703l-1.95-1.142c-.167-.095-.239-.238-.239-.428V5.899c0-2.545 1.95-4.472 4.591-4.472 1 0 1.927.333 2.712.928L8.23 5.067c-.285.166-.428.404-.428.737v6.898zM12 15.128l-2.795-1.57v-3.33L12 8.658l2.795 1.57v3.33L12 15.128zm1.796 7.23c-1 0-1.927-.332-2.712-.927l4.686-2.712c.285-.166.428-.404.428-.737v-6.898l1.974 1.142c.167.095.238.238.238.428v5.233c0 2.545-1.974 4.472-4.614 4.472zm-5.637-5.303l-4.544-2.617c-1.308-.761-2.188-2.378-2.188-3.948A4.482 4.482 0 014.21 6.327v5.423c0 .333.143.571.428.738l5.947 3.449-1.95 1.118a.432.432 0 01-.476 0zm-.262 3.9c-2.688 0-4.662-2.021-4.662-4.519 0-.19.024-.38.047-.57l4.686 2.71c.286.167.571.167.856 0l5.97-3.448v2.26c0 .19-.07.333-.237.428l-4.543 2.616c-.619.357-1.356.523-2.117.523zm5.899 2.83a5.947 5.947 0 005.827-4.756C22.287 18.339 24 15.84 24 13.296c0-1.665-.713-3.282-1.998-4.448.119-.5.19-.999.19-1.498 0-3.401-2.759-5.947-5.946-5.947-.642 0-1.26.095-1.88.31A5.962 5.962 0 0010.205 0a5.947 5.947 0 00-5.827 4.757C1.713 5.447 0 7.945 0 10.49c0 1.666.713 3.283 1.998 4.448-.119.5-.19 1-.19 1.499 0 3.401 2.759 5.946 5.946 5.946.642 0 1.26-.095 1.88-.309a5.96 5.96 0 004.162 1.713z"/></svg>`,
182
- gemini: `<svg viewBox="0 0 24 24" width="14" height="14" fill="currentColor" fill-rule="evenodd"><path d="M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z"/></svg>`,
183
- leonardo: `<svg viewBox="0 0 24 24" width="14" height="14" fill="currentColor"><path d="M9.5 2l1.5 3.5L14.5 7l-3.5 1.5L9.5 12l-1.5-3.5L4.5 7l3.5-1.5L9.5 2zM19 10l1 2 2 1-2 1-1 2-1-2-2-1 2-1 1-2zM5 17l1 2 2 1-2 1-1 2-1-2-2-1 2-1 1-2z"/></svg>`,
190
+ antigravity: `<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4.5 20 12 4l7.5 16"/><path d="M8.2 20a3.8 3.8 0 0 1 7.6 0"/></svg>`,
184
191
  pin: _s('<path d="M8 14v-3"/><path d="M4 11h8"/><path d="M10.5 2.5l3 3-2 2 .5 2-4.5.5.5-4.5 2-.5z"/>'),
185
192
 
186
193
  // UI chrome
@@ -191,8 +198,8 @@ const AS_ICONS = {
191
198
  export: _s('<path d="M8 2v8M4 6l4-4 4 4"/><path d="M2 11v2a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1v-2"/>'),
192
199
  };
193
200
 
194
- /** Resolve icon key → SVG HTML. Falls back to refresh icon for unknown keys. */
195
- function icon(key) { return AS_ICONS[key] || AS_ICONS.refresh; }
201
+ /** Resolve icon key → SVG HTML. Falls back to refresh icon for unknown keys ('gemini' reads as 'antigravity'). */
202
+ function icon(key) { return AS_ICONS[migrateProviderId(key)] || AS_ICONS.refresh; }
196
203
 
197
204
  /** Icon keys available for template selection (excludes UI-only icons). */
198
205
  const ICON_KEYS = Object.keys(AS_ICONS).filter(k => !['back','forward','down','close','export','plus','bolt','blank'].includes(k));
@@ -201,20 +208,20 @@ const _modelLoadRequests = new Set();
201
208
  const _modelLoadAttempts = new Set();
202
209
 
203
210
  // Persistent launch preferences (remembered across launches in session)
204
- let _launchProfile = storage.getItem('as-launch-profile') || 'claude-code';
211
+ let _launchProfile = migrateProviderId(storage.getItem('as-launch-profile') || 'claude-code');
205
212
  const _initialLaunchSelection = normalizeAutomationSelection(
206
- storage.getItem('as-launch-profile') || 'claude-code',
207
- storage.getItem('as-launch-model'), storage.getItem('as-launch-context-mode'),
213
+ _launchProfile,
214
+ migrateProviderModel(_launchProfile, storage.getItem('as-launch-model')), storage.getItem('as-launch-context-mode'),
208
215
  );
209
216
  let _launchModel = _initialLaunchSelection.model;
210
217
  let _launchContextMode = _initialLaunchSelection.contextMode || 'default';
211
218
  storage.setItem('as-launch-model', _launchModel || '');
212
219
  storage.setItem('as-launch-context-mode', _launchContextMode);
213
220
  let _launchEffort = storage.getItem('as-launch-effort') || 'off';
214
- let _launchMcpProfile = storage.getItem('as-launch-mcp-profile') || 'full';
221
+ let _launchTools = (() => { try { return JSON.parse(storage.getItem('as-launch-tools') || 'null'); } catch { return null; } })();
215
222
  let _launchAccount = storage.getItem('as-launch-account') || 'default'; // Codex ChatGPT account (CODEX_HOME)
216
223
  let _qtAccountsRequested = false; // lazy-fetch guard for quick-timer account chips
217
- let _mcpProfilePresets = null; // cached presets from API
224
+ let _dropdownAbort = null;
218
225
 
219
226
  // Render the Codex account selector chips (one button per saved ChatGPT account).
220
227
  function renderAccountChips(selectedId) {
@@ -264,34 +271,17 @@ function loadLaunchAccounts(root) {
264
271
  }).catch(() => {});
265
272
  }
266
273
 
267
- async function fetchMcpProfiles() {
268
- if (_mcpProfilePresets) return _mcpProfilePresets;
269
- try {
270
- const presets = await fetchMcpProfilePresets();
271
- if (presets && Object.keys(presets).length) {
272
- _mcpProfilePresets = presets;
273
- return _mcpProfilePresets;
274
- }
275
- } catch {}
276
- return {};
277
- }
278
-
279
- function renderMcpProfileChips(presets, selected) {
280
- const entries = Object.entries(presets);
281
- if (entries.length > 5) {
282
- const options = entries.map(([id, p]) => ({
283
- id,
284
- label: p.label || id,
285
- desc: `${p.tools} tools`,
286
- }));
287
- return renderLaunchSelect('mcp', options, selected);
288
- }
289
- return entries.map(([id, p]) => `
290
- <button class="as-launch-mcp-profile${id === selected ? ' active' : ''}" data-mcp-profile="${_escLaunch(id)}">
291
- <span class="as-launch-mcp-profile-name">${_escLaunch(p.label || id)}</span>
292
- <span class="as-launch-mcp-profile-tools">${_escLaunch(p.tools)} tools</span>
293
- </button>
294
- `).join('');
274
+ async function renderLaunchToolPicker(root, provider) {
275
+ let catalog = await fetchToolCatalog(false, { cwd: _pendingLaunchParams?.cwd || '' });
276
+ if (_launchMode === 'agent' && !root.querySelector('#as-agent-synabun')?.checked && catalog) catalog = { ...catalog, defaultTools: [] };
277
+ const container = root.querySelector('#as-launch-tools');
278
+ if (!container) return;
279
+ container.innerHTML = strictToolHost(provider) ? toolPickerHTML('as-launch-tool-list', _launchTools, { catalog, provider, inheritLabel: toolWord('default'), usesBrowser: !!_pendingLaunchParams?.usesBrowser }) : toolWord('focus');
280
+ container.querySelector('#as-launch-tool-list')?.addEventListener('change', (event) => {
281
+ _launchTools = readToolPicker(event.target);
282
+ storage.setItem('as-launch-tools', JSON.stringify(_launchTools));
283
+ updateToolPicker(event.target, _launchTools, { inheritLabel: toolWord('default'), usesBrowser: !!_pendingLaunchParams?.usesBrowser });
284
+ });
295
285
  }
296
286
 
297
287
  // ── Preset Templates with Wizard Steps ──
@@ -894,7 +884,7 @@ function showLaunchInline(params) {
894
884
  if (params.usesBrowser && (!params.context || !params.context.includes('BROWSER REQUIRED'))) {
895
885
  params.context = BROWSER_CONTEXT;
896
886
  }
897
- // Apply template-preset launch defaults (CLI / model / effort / MCP profile)
887
+ // Apply template-preset launch defaults (CLI / model / effort / tool list)
898
888
  if (params.profile) {
899
889
  if (params.profile !== _launchProfile && !params.model) {
900
890
  _launchModel = null;
@@ -910,7 +900,7 @@ function showLaunchInline(params) {
910
900
  storage.setItem('as-launch-model', _launchModel || '');
911
901
  }
912
902
  if (params.effort) { _launchEffort = params.effort; storage.setItem('as-launch-effort', _launchEffort); }
913
- if (params.mcpProfile) { _launchMcpProfile = params.mcpProfile; storage.setItem('as-launch-mcp-profile', _launchMcpProfile); }
903
+ if (params.tools !== undefined) { _launchTools = params.tools; storage.setItem('as-launch-tools', JSON.stringify(_launchTools)); }
914
904
  if (params.codexAccountId) { _launchAccount = params.codexAccountId; storage.setItem('as-launch-account', _launchAccount); }
915
905
  _pendingLaunchParams = params;
916
906
  _launchPanelActive = true;
@@ -985,11 +975,9 @@ function showLaunchInline(params) {
985
975
  ${renderEffortChips(profile, _launchEffort)}
986
976
  </div>
987
977
  </div>
988
- <div class="as-launch-section" id="as-launch-mcp-section" style="${profile !== 'claude-code' ? '' : 'display:none'}">
989
- <label class="as-launch-label">MCP Profile</label>
990
- <div class="as-launch-mcp-profiles" id="as-launch-mcp-profiles">
991
- <span class="as-launch-mcp-loading">Loading profiles...</span>
992
- </div>
978
+ <div class="as-launch-section" id="as-launch-tools-section">
979
+ <label class="as-launch-label">${toolWord('label')}</label>
980
+ <div id="as-launch-tools">${strictToolHost(profile) ? '' : toolWord('focus')}</div>
993
981
  </div>
994
982
  <div class="as-launch-section" id="as-launch-account-section" style="${profile === 'codex' ? '' : 'display:none'}">
995
983
  <label class="as-launch-label">OpenAI Account</label>
@@ -1056,16 +1044,7 @@ function showLaunchInline(params) {
1056
1044
 
1057
1045
  wireLaunchInline(contentEl);
1058
1046
 
1059
- // Async-load MCP profiles for codex/gemini
1060
- if (profile !== 'claude-code') {
1061
- fetchMcpProfiles().then(presets => {
1062
- const container = contentEl.querySelector('#as-launch-mcp-profiles');
1063
- if (container && presets && Object.keys(presets).length) {
1064
- container.innerHTML = renderMcpProfileChips(presets, _launchMcpProfile);
1065
- wireMcpProfileChips(contentEl);
1066
- }
1067
- });
1068
- }
1047
+ void renderLaunchToolPicker(contentEl, profile);
1069
1048
 
1070
1049
  // Async-load dynamic models and re-render chips when ready.
1071
1050
  // Retries a couple of times in case OpenCode is still booting.
@@ -1138,6 +1117,11 @@ function dynamicModelEmptyText(profileId) {
1138
1117
  ? 'No Claude Code models found — check the Claude CLI install in Settings → Terminal.'
1139
1118
  : 'Loading Claude Code models...';
1140
1119
  }
1120
+ if (profileId === 'antigravity') {
1121
+ return loaded
1122
+ ? 'No Antigravity models found — check the Antigravity CLI install in Settings → Terminal.'
1123
+ : 'Loading Antigravity models...';
1124
+ }
1141
1125
  return 'No model selection available';
1142
1126
  }
1143
1127
 
@@ -1347,6 +1331,7 @@ function wireLaunchInline(container) {
1347
1331
  const root = container.querySelector('.as-launch-inline');
1348
1332
  if (!root) return;
1349
1333
  applyAgentModeGating(root, _launchProfile);
1334
+ root.querySelector('#as-agent-synabun')?.addEventListener('change', () => { void renderLaunchToolPicker(root, _launchProfile); });
1350
1335
 
1351
1336
  // Mode toggle (Loop vs Agent)
1352
1337
  root.querySelectorAll('.as-launch-mode').forEach(btn => {
@@ -1360,6 +1345,7 @@ function wireLaunchInline(container) {
1360
1345
  if (agentFields) agentFields.style.display = _launchMode === 'agent' ? '' : 'none';
1361
1346
  const confirmBtn = root.querySelector('#as-launch-confirm-btn');
1362
1347
  if (confirmBtn) confirmBtn.textContent = _launchMode === 'agent' ? 'Launch Agent' : 'Launch';
1348
+ void renderLaunchToolPicker(root, _launchProfile);
1363
1349
  });
1364
1350
  });
1365
1351
 
@@ -1419,20 +1405,7 @@ function wireLaunchInline(container) {
1419
1405
  }
1420
1406
  }
1421
1407
  applyAgentModeGating(root, profileId);
1422
- // Show/hide MCP profile section (Codex/Gemini only — Claude Code has tool search)
1423
- const mcpSection = root.querySelector('#as-launch-mcp-section');
1424
- if (mcpSection) {
1425
- mcpSection.style.display = profileId !== 'claude-code' ? '' : 'none';
1426
- if (profileId !== 'claude-code') {
1427
- fetchMcpProfiles().then(presets => {
1428
- const container = root.querySelector('#as-launch-mcp-profiles');
1429
- if (container && presets && Object.keys(presets).length) {
1430
- container.innerHTML = renderMcpProfileChips(presets, _launchMcpProfile);
1431
- wireMcpProfileChips(root);
1432
- }
1433
- });
1434
- }
1435
- }
1408
+ void renderLaunchToolPicker(root, profileId);
1436
1409
  // Show/hide OpenAI account section (Codex only — selects which ChatGPT login the loop runs under)
1437
1410
  const accountSection = root.querySelector('#as-launch-account-section');
1438
1411
  if (accountSection) {
@@ -1496,21 +1469,6 @@ function wireEffortChips(container) {
1496
1469
  });
1497
1470
  }
1498
1471
 
1499
- function wireMcpProfileChips(container) {
1500
- container.querySelectorAll('.as-launch-mcp-profile').forEach(btn => {
1501
- btn.addEventListener('click', () => {
1502
- container.querySelectorAll('.as-launch-mcp-profile').forEach(b => b.classList.remove('active'));
1503
- btn.classList.add('active');
1504
- _launchMcpProfile = btn.dataset.mcpProfile;
1505
- storage.setItem('as-launch-mcp-profile', _launchMcpProfile);
1506
- });
1507
- });
1508
- wireLaunchSelect(container, 'mcp', (value) => {
1509
- _launchMcpProfile = value;
1510
- storage.setItem('as-launch-mcp-profile', _launchMcpProfile);
1511
- });
1512
- }
1513
-
1514
1472
  function closeLaunchInline() {
1515
1473
  _pendingLaunchParams = null;
1516
1474
  _launchPanelActive = false;
@@ -1534,7 +1492,7 @@ async function confirmLaunch() {
1534
1492
  return;
1535
1493
  }
1536
1494
  const effort = normalizeEffortForProfile(_launchProfile, _launchEffort) || undefined;
1537
- const mcpProfile = _launchProfile !== 'claude-code' ? _launchMcpProfile : undefined;
1495
+ const tools = strictToolHost(_launchProfile) ? _launchTools : undefined;
1538
1496
  const codexAccountId = _launchProfile === 'codex' ? (_launchAccount || 'default') : undefined;
1539
1497
  const params = {
1540
1498
  ..._pendingLaunchParams,
@@ -1542,7 +1500,7 @@ async function confirmLaunch() {
1542
1500
  model: _launchModel,
1543
1501
  contextMode: _launchContextMode,
1544
1502
  effort,
1545
- mcpProfile,
1503
+ tools,
1546
1504
  codexAccountId,
1547
1505
  sidepanelWindowId: getNativeLoopRouterWindowId(),
1548
1506
  sidepanelClaimToken: getNativeLoopRouterClaimToken(),
@@ -1571,6 +1529,7 @@ async function confirmLaunch() {
1571
1529
  cwd: params.cwd || undefined,
1572
1530
  maxTurns: params.usesBrowser ? 100 : 75,
1573
1531
  withSynabun,
1532
+ tools: tools ?? (withSynabun ? getCachedToolCatalog()?.defaultTools ?? ['mcp:*'] : []),
1574
1533
  browserProfile: (withSynabun && params.usesBrowser) ? true : undefined,
1575
1534
  mode: agentSubmode,
1576
1535
  iterations: agentSubmode === 'loop' ? agentIterations : 1,
@@ -1758,14 +1717,31 @@ async function openPanel(opts = {}) {
1758
1717
  document.body.appendChild(_backdrop);
1759
1718
 
1760
1719
  _panel = document.createElement('div');
1720
+ _dropdownAbort?.abort();
1721
+ _dropdownAbort = new AbortController();
1722
+ wireDropdowns(_panel, { signal: _dropdownAbort.signal });
1723
+ _panel.addEventListener('change', event => {
1724
+ if (event.target.id === 'as-qt-tools') {
1725
+ _launchTools = readToolPicker(event.target);
1726
+ storage.setItem('as-launch-tools', JSON.stringify(_launchTools));
1727
+ updateToolPicker(event.target, _launchTools, { inheritLabel: toolWord('templateDefault'), usesBrowser: !!$('as-qt-browser')?.checked });
1728
+ }
1729
+ if (['as-qt-browser', 'as-qt-template', 'as-f-browser'].includes(event.target.id)) queueMicrotask(() => {
1730
+ const detail = event.target.id === 'as-f-browser';
1731
+ const input = $(detail ? 'as-f-mcp' : 'as-qt-tools');
1732
+ updateToolPicker(input, readToolPicker(input, { requested: true }), { inheritLabel: toolWord(detail ? 'default' : 'templateDefault'), usesBrowser: !!$(detail ? 'as-f-browser' : 'as-qt-browser')?.checked });
1733
+ });
1734
+ }, { signal: _dropdownAbort.signal });
1735
+ void fetchToolCatalog();
1761
1736
  _panel.className = 'automation-studio-panel glass resizable';
1762
1737
  _panel.id = 'automation-studio-panel';
1763
1738
  _panel.innerHTML = buildPanelHTML();
1764
1739
  document.body.appendChild(_panel);
1765
1740
 
1766
- // Always open centered at default size
1767
- _panel.style.left = Math.max(20, (window.innerWidth - 900) / 2) + 'px';
1768
- _panel.style.top = Math.max(48, (window.innerHeight - 520) / 2) + 'px';
1741
+ // Always open centered at default size, in the app frame
1742
+ const at = centeredInFrame(900, 520);
1743
+ _panel.style.left = at.left + 'px';
1744
+ _panel.style.top = at.top + 'px';
1769
1745
 
1770
1746
  wirePanel();
1771
1747
  const kept = _keptData;
@@ -1815,6 +1791,7 @@ function closePanel() {
1815
1791
  for (const [evt, fn] of _docListeners) document.removeEventListener(evt, fn);
1816
1792
  _docListeners = [];
1817
1793
  if (_backdrop) { _backdrop.remove(); _backdrop = null; }
1794
+ _dropdownAbort?.abort();
1818
1795
  _panel.remove(); _panel = null;
1819
1796
  _templates = []; _activeLoop = null;
1820
1797
  _view = 'welcome'; _selected = null;
@@ -2178,11 +2155,12 @@ function positionFloating(el, x, y) {
2178
2155
  el.style.left = `${x}px`;
2179
2156
  el.style.top = `${y}px`;
2180
2157
  el.style.zIndex = '300010';
2181
- // Adjust after mounting to keep in viewport
2158
+ // Adjust after mounting to keep in the app frame (the window for a point outside it)
2182
2159
  requestAnimationFrame(() => {
2183
2160
  const r = el.getBoundingClientRect();
2184
- if (r.right > window.innerWidth - 8) el.style.left = `${Math.max(8, window.innerWidth - r.width - 8)}px`;
2185
- if (r.bottom > window.innerHeight - 8) el.style.top = `${Math.max(8, window.innerHeight - r.height - 8)}px`;
2161
+ const b = placementArea(x, y);
2162
+ if (r.right > b.right - 8) el.style.left = `${Math.max(b.left + 8, b.right - r.width - 8)}px`;
2163
+ if (r.bottom > b.bottom - 8) el.style.top = `${Math.max(b.top + 8, b.bottom - r.height - 8)}px`;
2186
2164
  });
2187
2165
  }
2188
2166
 
@@ -2364,9 +2342,11 @@ async function promptCreateFolder() {
2364
2342
  // ═══════════════════════════════════════════
2365
2343
 
2366
2344
  async function loadData() {
2345
+ _launchTools = await migrateStoredTools(storage, 'as-launch-tools', 'as-launch-mcp-profile');
2346
+ await fetchToolCatalog();
2367
2347
  // One round trip for the three lists (they were asked one after another), then the agents.
2368
2348
  const [templates, folders, active] = await Promise.allSettled([fetchLoopTemplates(), fetchLoopFolders(), fetchActiveLoop()]);
2369
- _templates = templates.status === 'fulfilled' ? templates.value : [];
2349
+ _templates = templates.status === 'fulfilled' ? migrateLaunchRecords(templates.value) : [];
2370
2350
  _folders = folders.status === 'fulfilled' ? folders.value : [];
2371
2351
  _activeLoop = active.status === 'fulfilled' ? active.value : null;
2372
2352
  await refreshAgents();
@@ -2721,7 +2701,7 @@ function buildDetailMeta(t, isPreset) {
2721
2701
  const tModel = (t.model && tModelsList.some(m => modelMatchesSelector(m, t.model))) ? normalizeAutomationSelection(tProfile, t.model).model : (modelSelectorValue(tDefaultModel) || '');
2722
2702
  const tContextMode = t.contextMode || normalizeAutomationSelection(tProfile, t.model).contextMode || 'default';
2723
2703
  const tEffort = t.effort || 'off';
2724
- const tMcp = t.mcpProfile || 'full';
2704
+ const tTools = t.tools ?? null;
2725
2705
  return `
2726
2706
  <div class="as-meta-section">
2727
2707
  <div class="as-field">
@@ -2838,11 +2818,9 @@ function buildDetailMeta(t, isPreset) {
2838
2818
  ${getEffortLevelsForProfile(tProfile).map(e => `<option value="${esc(e.id)}"${e.id === tEffort ? ' selected' : ''}>${esc(e.label)} \u2014 ${esc(e.desc)}</option>`).join('')}
2839
2819
  </select>
2840
2820
  </div>
2841
- <div class="as-runtime-field" id="as-f-mcp-field" style="${tProfile !== 'claude-code' ? '' : 'display:none'}">
2842
- <label>MCP</label>
2843
- <select class="as-input as-select" id="as-f-mcp">
2844
- <option value="${esc(tMcp)}" selected>${esc(tMcp)} (loading\u2026)</option>
2845
- </select>
2821
+ <div class="as-runtime-field" id="as-f-mcp-field">
2822
+ <label>${toolWord('label')}</label>
2823
+ ${strictToolHost(tProfile) ? toolPickerHTML('as-f-mcp', tTools, { provider: tProfile, inheritLabel: toolWord('default'), usesBrowser: t.usesBrowser }) : toolWord('focus')}
2846
2824
  </div>
2847
2825
  </div>
2848
2826
  </div>
@@ -2901,7 +2879,7 @@ function wireDetailView(isPreset) {
2901
2879
  wireCategoryPicker(isPreset);
2902
2880
  wireFolderPicker(isPreset);
2903
2881
 
2904
- // Launch defaults (CLI profile / model / effort / MCP profile)
2882
+ // Launch defaults (CLI profile / model / effort / tool list)
2905
2883
  wireLaunchDefaults(isPreset);
2906
2884
 
2907
2885
  // Markdown toolbar
@@ -3050,7 +3028,7 @@ function wireLaunchDefaults(isPreset) {
3050
3028
  const modelSel = $('as-f-model');
3051
3029
  const contextSel = $('as-f-context');
3052
3030
  const effortSel = $('as-f-effort');
3053
- const mcpSel = $('as-f-mcp');
3031
+ let mcpSel = $('as-f-mcp');
3054
3032
  const effortField = $('as-f-effort-field');
3055
3033
  const mcpField = $('as-f-mcp-field');
3056
3034
  const templateAccountId = _selected?.codexAccountId || 'default';
@@ -3058,23 +3036,14 @@ function wireLaunchDefaults(isPreset) {
3058
3036
 
3059
3037
  effortSel?.addEventListener('change', () => { if (!isPreset) markDirty(); });
3060
3038
 
3061
- const loadMcpOptions = () => {
3062
- if (!mcpSel) return;
3063
- const current = mcpSel.value || 'full';
3064
- fetchMcpProfiles().then(presets => {
3065
- if (!presets || !Object.keys(presets).length) return;
3066
- const opts = Object.entries(presets).map(([id, p]) => {
3067
- const label = p.label || id;
3068
- const tools = p.tools != null ? ` — ${p.tools} tools` : '';
3069
- const sel = id === current ? ' selected' : '';
3070
- return `<option value="${esc(id)}"${sel}>${esc(label)}${esc(tools)}</option>`;
3071
- }).join('');
3072
- mcpSel.innerHTML = opts;
3073
- if (!presets[current]) {
3074
- const first = Object.keys(presets)[0];
3075
- if (first) mcpSel.value = first;
3076
- }
3077
- });
3039
+ const loadToolOptions = async () => {
3040
+ const tools = mcpSel ? readToolPicker(mcpSel) : _selected?.tools ?? null;
3041
+ const catalog = await fetchToolCatalog();
3042
+ if (!mcpField?.isConnected) return;
3043
+ const provider = profileSel.value;
3044
+ mcpField.innerHTML = `<label>${toolWord('label')}</label>${strictToolHost(provider) ? toolPickerHTML('as-f-mcp', tools, { catalog, provider, inheritLabel: toolWord('default'), usesBrowser: !!$('as-f-browser')?.checked }) : toolWord('focus')}`;
3045
+ mcpSel = $('as-f-mcp');
3046
+ mcpSel?.addEventListener('change', () => { if (!isPreset) markDirty(); updateToolPicker(mcpSel, readToolPicker(mcpSel), { inheritLabel: toolWord('default'), usesBrowser: !!$('as-f-browser')?.checked }); });
3078
3047
  };
3079
3048
 
3080
3049
  const renderModelOptions = (profileId, preferredId) => {
@@ -3124,8 +3093,7 @@ function wireLaunchDefaults(isPreset) {
3124
3093
  renderEffortOptions(profileId, 'off');
3125
3094
  if (effortField) effortField.style.display = profileSupportsEffort(profileId) ? '' : 'none';
3126
3095
  if (mcpField) {
3127
- mcpField.style.display = profileId !== 'claude-code' ? '' : 'none';
3128
- if (profileId !== 'claude-code') loadMcpOptions();
3096
+ void loadToolOptions();
3129
3097
  }
3130
3098
  if (!isPreset) markDirty();
3131
3099
  });
@@ -3137,7 +3105,7 @@ function wireLaunchDefaults(isPreset) {
3137
3105
  contextSel?.addEventListener('change', () => { if (!isPreset) markDirty(); });
3138
3106
  mcpSel?.addEventListener('change', () => { if (!isPreset) markDirty(); });
3139
3107
 
3140
- if (profileSel.value !== 'claude-code') loadMcpOptions();
3108
+ void loadToolOptions();
3141
3109
  renderEffortOptions(profileSel.value, effortSel?.value || 'off');
3142
3110
  if (effortField) effortField.style.display = profileSupportsEffort(profileSel.value) ? '' : 'none';
3143
3111
  refreshDynamicModelOptionsIfNeeded(profileSel.value, modelSel?.value || null);
@@ -3175,7 +3143,7 @@ async function saveCurrentTemplate() {
3175
3143
  const model = $('as-f-model')?.value || null;
3176
3144
  const contextMode = $('as-f-context')?.value || 'default';
3177
3145
  const effort = normalizeEffortForProfile(profile || 'claude-code', $('as-f-effort')?.value || null);
3178
- const mcpProfile = profile && profile !== 'claude-code' ? ($('as-f-mcp')?.value || null) : null;
3146
+ const tools = strictToolHost(profile) ? ($('as-f-mcp') ? readToolPicker($('as-f-mcp')) : _selected?.tools ?? null) : null;
3179
3147
  const folderIdRaw = $('as-f-folder')?.value;
3180
3148
  const folderId = folderIdRaw ? folderIdRaw : null;
3181
3149
 
@@ -3188,12 +3156,12 @@ async function saveCurrentTemplate() {
3188
3156
  showToast('This context window is unavailable for the selected model'); return;
3189
3157
  }
3190
3158
 
3191
- const payload = { name, icon: iconKey, category, task, context: '', description: description || task.slice(0, 120), iterations, maxMinutes, usesBrowser, profile, model, contextMode, effort, mcpProfile, folderId };
3159
+ const payload = { name, icon: iconKey, category, task, context: '', description: description || task.slice(0, 120), iterations, maxMinutes, usesBrowser, profile, model, contextMode, effort, tools, folderId };
3192
3160
 
3193
3161
  try {
3194
3162
  if (_selected.id) { await updateLoopTemplate(_selected.id, payload); }
3195
3163
  else { const result = await createLoopTemplate(payload); if (result?.id) _selected.id = result.id; }
3196
- _templates = await fetchLoopTemplates();
3164
+ _templates = migrateLaunchRecords(await fetchLoopTemplates());
3197
3165
  const updated = _templates.find(t => t.id === _selected.id);
3198
3166
  if (updated) _selected = updated;
3199
3167
  _originalContent = task;
@@ -3295,11 +3263,11 @@ async function customizePreset(preset) {
3295
3263
  model: $('as-f-model')?.value || null,
3296
3264
  contextMode: $('as-f-context')?.value || 'default',
3297
3265
  effort: normalizeEffortForProfile($('as-f-profile')?.value || 'claude-code', $('as-f-effort')?.value || null),
3298
- mcpProfile: ($('as-f-profile')?.value || 'claude-code') !== 'claude-code' ? ($('as-f-mcp')?.value || null) : null,
3266
+ tools: strictToolHost($('as-f-profile')?.value) ? readToolPicker($('as-f-mcp')) : null,
3299
3267
  };
3300
3268
  const result = await createLoopTemplate(payload);
3301
3269
  if (result?.id) {
3302
- _templates = await fetchLoopTemplates();
3270
+ _templates = migrateLaunchRecords(await fetchLoopTemplates());
3303
3271
  const newTpl = _templates.find(t => t.id === result.id);
3304
3272
  if (newTpl) {
3305
3273
  showToast('Customized \u2014 edit and save your copy');
@@ -3322,13 +3290,13 @@ function handleTestRun() {
3322
3290
  const model = $('as-f-model')?.value || _selected.model || null;
3323
3291
  const contextMode = $('as-f-context')?.value || _selected.contextMode || 'default';
3324
3292
  const effort = normalizeEffortForProfile(profile || 'claude-code', $('as-f-effort')?.value || _selected.effort || null);
3325
- const mcpProfile = profile && profile !== 'claude-code' ? ($('as-f-mcp')?.value || _selected.mcpProfile || null) : null;
3293
+ const tools = strictToolHost(profile) ? ($('as-f-mcp') ? readToolPicker($('as-f-mcp')) : _selected?.tools ?? null) : null;
3326
3294
  serverLaunchLoop({
3327
3295
  task: cmd,
3328
3296
  context: null,
3329
3297
  iterations: 1, maxMinutes: 10,
3330
3298
  usesBrowser,
3331
- profile, model, contextMode, effort, mcpProfile,
3299
+ profile, model, contextMode, effort, tools,
3332
3300
  });
3333
3301
  }
3334
3302
 
@@ -3357,12 +3325,12 @@ function proceedWithLaunch() {
3357
3325
  const model = $('as-f-model')?.value || _selected.model || null;
3358
3326
  const contextMode = $('as-f-context')?.value || _selected.contextMode || 'default';
3359
3327
  const effort = normalizeEffortForProfile(profile || 'claude-code', $('as-f-effort')?.value || _selected.effort || null);
3360
- const mcpProfile = profile && profile !== 'claude-code' ? ($('as-f-mcp')?.value || _selected.mcpProfile || null) : null;
3328
+ const tools = strictToolHost(profile) ? ($('as-f-mcp') ? readToolPicker($('as-f-mcp')) : _selected?.tools ?? null) : null;
3361
3329
  serverLaunchLoop({
3362
3330
  task: cmd,
3363
3331
  context: null,
3364
3332
  iterations, maxMinutes, usesBrowser,
3365
- profile, model, contextMode, effort, mcpProfile,
3333
+ profile, model, contextMode, effort, tools,
3366
3334
  });
3367
3335
  }
3368
3336
 
@@ -3960,7 +3928,7 @@ function setupScheduleWebSocket() {
3960
3928
  // Quick timer events
3961
3929
  on('sync:quick-timer:set', (data) => {
3962
3930
  if (data?.timerId && !_quickTimers.some(t => t.id === data.timerId)) {
3963
- _quickTimers.push({ id: data.timerId, templateName: data.templateName, firesAt: data.firesAt, minutes: data.minutes, profile: data.profile, model: data.model, contextMode: data.contextMode, effort: data.effort, mcpProfile: data.mcpProfile, usesBrowser: data.usesBrowser });
3931
+ _quickTimers.push({ id: data.timerId, templateName: data.templateName, firesAt: data.firesAt, minutes: data.minutes, profile: data.profile, model: data.model, contextMode: data.contextMode, effort: data.effort, tools: data.tools, usesBrowser: data.usesBrowser });
3964
3932
  if (_view === 'schedules') renderSchedulesMain();
3965
3933
  }
3966
3934
  });
@@ -4419,13 +4387,13 @@ async function handlePanelClick(e) {
4419
4387
  if (!automationContextAvailable(qtProfile, qtModel, qtContextMode)) { showToast('This context window is unavailable for the selected model and account'); break; }
4420
4388
  const qtBrowser = !!$('as-qt-browser')?.checked;
4421
4389
  const qtEffort = normalizeEffortForProfile(qtProfile, _launchEffort) || undefined;
4422
- const qtMcpProfile = qtProfile !== 'claude-code' ? _launchMcpProfile : undefined;
4390
+ const qtTools = strictToolHost(qtProfile) ? readToolPicker($('as-qt-tools')) : undefined;
4423
4391
  const qtAccount = qtProfile === 'codex' ? (_launchAccount || 'default') : undefined;
4424
4392
  try {
4425
- const result = await createQuickTimer(templateId, mins, { profile: qtProfile, model: qtModel, contextMode: qtContextMode, usesBrowser: qtBrowser, effort: qtEffort, mcpProfile: qtMcpProfile, codexAccountId: qtAccount });
4393
+ const result = await createQuickTimer(templateId, mins, { profile: qtProfile, model: qtModel, contextMode: qtContextMode, usesBrowser: qtBrowser, effort: qtEffort, tools: qtTools, codexAccountId: qtAccount });
4426
4394
  // Guard: WebSocket sync:quick-timer:set may arrive before this HTTP response
4427
4395
  if (!_quickTimers.some(t => t.id === result.timerId)) {
4428
- _quickTimers.push({ id: result.timerId, templateId, templateName: result.templateName, firesAt: result.firesAt, minutes: result.minutes, profile: result.profile, model: result.model, contextMode: result.contextMode, effort: result.effort, mcpProfile: result.mcpProfile, usesBrowser: result.usesBrowser });
4396
+ _quickTimers.push({ id: result.timerId, templateId, templateName: result.templateName, firesAt: result.firesAt, minutes: result.minutes, profile: result.profile, model: result.model, contextMode: result.contextMode, effort: result.effort, tools: result.tools, usesBrowser: result.usesBrowser });
4429
4397
  }
4430
4398
  _selectedQtMinutes = null;
4431
4399
  _qtUsesBrowser = null;
@@ -4446,7 +4414,7 @@ async function handlePanelClick(e) {
4446
4414
  if (!automationContextAvailable(qtProfile, qtModel, qtContextMode)) { showToast('This context window is unavailable for the selected model and account'); break; }
4447
4415
  const qtBrowser = !!$('as-qt-browser')?.checked;
4448
4416
  const qtEffort = normalizeEffortForProfile(qtProfile, _launchEffort) || undefined;
4449
- const qtMcpProfile = qtProfile !== 'claude-code' ? _launchMcpProfile : undefined;
4417
+ const qtTools = strictToolHost(qtProfile) ? readToolPicker($('as-qt-tools')) : undefined;
4450
4418
  const qtAccount = qtProfile === 'codex' ? (_launchAccount || 'default') : undefined;
4451
4419
  try {
4452
4420
  const result = await triggerQuickTimerNow(templateId, {
@@ -4455,7 +4423,7 @@ async function handlePanelClick(e) {
4455
4423
  contextMode: qtContextMode,
4456
4424
  usesBrowser: qtBrowser,
4457
4425
  effort: qtEffort,
4458
- mcpProfile: qtMcpProfile,
4426
+ tools: qtTools,
4459
4427
  codexAccountId: qtAccount,
4460
4428
  sidepanelWindowId: getNativeLoopRouterWindowId(),
4461
4429
  sidepanelClaimToken: getNativeLoopRouterClaimToken(),
@@ -4614,9 +4582,9 @@ function wireInputSync(container) {
4614
4582
  // ═══════════════════════════════════════════
4615
4583
 
4616
4584
  async function loadScheduleData() {
4617
- try { _schedules = await fetchSchedules(); } catch { _schedules = []; }
4585
+ try { _schedules = migrateLaunchRecords(await fetchSchedules()); } catch { _schedules = []; }
4618
4586
  try { _scheduleTimerData = await fetchScheduleTimers(); } catch { _scheduleTimerData = {}; }
4619
- try { _quickTimers = await fetchQuickTimers(); } catch { _quickTimers = []; }
4587
+ try { _quickTimers = migrateLaunchRecords(await fetchQuickTimers()); } catch { _quickTimers = []; }
4620
4588
  }
4621
4589
 
4622
4590
  const CRON_PRESET_GROUPS = [
@@ -4728,7 +4696,7 @@ function renderSchedulesMain() {
4728
4696
  const profileLabel = CLI_PROFILES.find(p => p.id === qt.profile)?.label || qt.profile || 'Claude Code';
4729
4697
  const modelObj = qt.model ? getModelsForProfile(qt.profile || 'claude-code').find(m => modelMatchesSelector(m, qt.model)) : null;
4730
4698
  const modelLabel = modelObj?.label || (qt.profile === 'opencode' ? qt.model : '');
4731
- const metaParts = [profileLabel, modelLabel, qt.contextMode && qt.contextMode !== 'default' ? `context:${qt.contextMode}` : '', qt.effort ? `think:${qt.effort}` : '', qt.mcpProfile ? `mcp:${qt.mcpProfile}` : '', qt.usesBrowser ? 'Browser' : ''].filter(Boolean);
4699
+ const metaParts = [profileLabel, modelLabel, qt.contextMode && qt.contextMode !== 'default' ? `context:${qt.contextMode}` : '', qt.effort ? `think:${qt.effort}` : '', qt.tools ? `${toolWord('label')}: ${qt.tools.join(', ')}` : '', qt.usesBrowser ? 'Browser' : ''].filter(Boolean);
4732
4700
  timerCards += `
4733
4701
  <div class="as-qt-active-card">
4734
4702
  <div class="as-qt-active-pulse"></div>
@@ -4834,6 +4802,7 @@ function renderSchedulesMain() {
4834
4802
  <span class="as-launch-label">Think</span>
4835
4803
  <div class="as-launch-efforts" id="as-qt-efforts">${qtEffortChips}</div>
4836
4804
  </div>
4805
+ <div class="as-qt-group"><label>${toolWord('label')}</label>${strictToolHost(qtProfile) ? toolPickerHTML('as-qt-tools', _launchTools, { provider: qtProfile, inheritLabel: toolWord('templateDefault'), usesBrowser: qtBrowserDefault }) : toolWord('focus')}</div>
4837
4806
  <div class="as-qt-group" id="as-qt-account-section" style="${qtProfile === 'codex' ? '' : 'display:none'}">
4838
4807
  <span class="as-launch-label">OpenAI Account</span>
4839
4808
  <div class="as-launch-accounts" id="as-qt-accounts">${qtAccountChips}</div>
@@ -5134,7 +5103,7 @@ function triggerImport() {
5134
5103
  showToast('Invalid file format'); return;
5135
5104
  }
5136
5105
  const result = await importLoopTemplates(data);
5137
- _templates = await fetchLoopTemplates();
5106
+ _templates = migrateLaunchRecords(await fetchLoopTemplates());
5138
5107
  renderView();
5139
5108
  showToast(`Imported: ${result.added} added, ${result.updated} updated`);
5140
5109
  } catch (err) { showToast('Import failed: ' + err.message); }
@@ -5143,3 +5112,5 @@ function triggerImport() {
5143
5112
  document.body.appendChild(input);
5144
5113
  input.click();
5145
5114
  }
5115
+
5116
+ configureToolPickerTranslation(t);