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 { syncOpenCodeWorkerQuestions, forgetWorkerQuestions } from './ocp-v2-ws.js';
2
+ import { workerRestart } from '../worker-restart.js';
3
+ import { t } from '../i18n.js';
1
4
  import { hostedSidepanelId, sidepanelHost } from '../ui-sidepanel-runtime.js';
2
5
  // ─────────────────────────────────────────────────────────────────────────────
3
6
  // OpenCode V2 — Panel container
@@ -10,20 +13,21 @@ import { hostedSidepanelId, sidepanelHost } from '../ui-sidepanel-runtime.js';
10
13
 
11
14
  import { state, emit, on } from '../state.js';
12
15
  import { storage } from '../storage.js';
16
+ import { frameRect } from '../app-frame.js';
13
17
  import { fetchProjects } from '../api.js';
14
18
  import { injectStyles } from './ocp-v2-styles.js';
15
19
  import { connect, api, hasSessionStore, onSessionCompacted, onEvent, onReconnect, supports, isDescendantSession } from './ocp-v2-ws.js';
16
20
  import {
17
- menuSessions, pickReusableEmptySession, shareView, SHARE_CONFIRM_TEXT, createPendingRenames, createStoppedShares,
21
+ menuSessions, pickReusableEmptySession, createPendingRenames,
18
22
  sessionBusyFromEvent, sessionBusyFromStatus, tabPillState, automationTurnPhase,
19
23
  } from './ocp-v2-sessions-logic.js';
20
24
  import {
21
- forkSession, shareSession, unshareSession, undoLastTurn, restoreReverted,
25
+ forkSession, undoLastTurn, restoreReverted,
22
26
  loadSelectedSession, applySessionSelections, restoreDraftAttachments,
23
27
  readTranscriptExport, stopForNavigation, createSessionForNavigation, renameSession,
24
28
  navigateAfter, adoptReusableSession, landWithoutTabs, shouldNameCreatedSession, renameBox,
25
29
  } from './ocp-v2-session-actions.js';
26
- import { captureBinding, latestOnly, latestFor, createNavigation } from './ocp-v2-binding.js';
30
+ import { captureBinding, latestFor, createNavigation } from './ocp-v2-binding.js';
27
31
  import { createConfirmations } from './ocp-v2-confirm-logic.js';
28
32
  import { syncConfirmRow } from './ocp-v2-confirm.js';
29
33
  import { closeWithPromptsConfirm, prefilledDraft, samePrompts } from './ocp-v2-composer-logic.js';
@@ -42,7 +46,7 @@ import { createAutoAcceptControl } from './ocp-v2-autoaccept-button.js';
42
46
  import { mountTodoWidget } from './ocp-v2-session-widgets.js';
43
47
  import { mountChangesBar } from './ocp-v2-changes.js';
44
48
  import { mountEnvironmentPopover } from './ocp-v2-status.js';
45
- import { watchWorktree, newSessionPlan, checkoutOutcome } from './ocp-v2-changes-logic.js';
49
+ import { newSessionPlan, checkoutOutcome } from './ocp-v2-changes-logic.js';
46
50
  import { mountRenderer } from './ocp-v2-render.js';
47
51
  import { offerGreeting } from './ocp-v2-greeting.js';
48
52
  import { mountCompose, focusCompose, appendPathToCompose } from './ocp-v2-send.js';
@@ -108,6 +112,7 @@ const _sessionBusy = new Map();
108
112
  const _automationContinuedManually = new Set();
109
113
  const _automationManualSendInFlight = new Set();
110
114
  const _foreignActiveAutomationSessions = new Set();
115
+ const _workerRestarts = new Map();
111
116
  const _workerEnds = new Map(); // sessionId -> end card of the dispatched worker it belongs to (ui-worker-end.js)
112
117
  let _renderer = null;
113
118
  let _visible = false;
@@ -136,30 +141,20 @@ let _composer = null; // the primary panel's composer (mountCompose)
136
141
  let _cliBanner = null; // the CLI banner and send-block (ui-cli-banner.js)
137
142
  let _cliWasBlocked = false; // the banner held sends back last time it said (a change to usable heals the serve)
138
143
  // Where the panel goes. Every choice of the user (a tab, a session in the
139
- // menu, New session, a project, a worktree) begins an intent, and a navigation
144
+ // menu, New session, a project) begins an intent, and a navigation
140
145
  // binds the panel only while its intent is the latest one: a later choice wins
141
146
  // over an older one that is still in flight (ocp-v2-binding.js). What the
142
147
  // panel starts by itself (boot, the recovery, an automation asking for focus)
143
148
  // only observes: it never overtakes a choice of the user.
144
149
  const _nav = createNavigation(getDefaultStore());
145
- // What publishes or destroys is asked in the panel, in two steps, never with a
146
- // native dialog (ocp-v2-confirm-logic.js). `surface` says where the question
147
- // is drawn: 'menu' under its row of the session menu, 'panel' above the
148
- // compose box, 'dialog' in the naming dialog.
150
+ // What destroys is asked in the panel, in two steps, never with a native
151
+ // dialog (ocp-v2-confirm-logic.js). `surface` says where the question is
152
+ // drawn: 'menu' under its row of the session menu, 'panel' above the compose
153
+ // box.
149
154
  const _confirms = createConfirmations({ store: getDefaultStore() });
150
155
  let _confirmSlotEl = null;
151
156
  const _menuConfirmAnchors = new Map(); // question key -> the menu row it is asked under
152
157
  _confirms.onChange(() => { syncSessionMenuConfirm(); syncPanelConfirm(); });
153
- // Share links whose sharing this panel stopped. OpenCode goes on reporting
154
- // them (createStoppedShares in ocp-v2-sessions-logic.js), so the store takes
155
- // such a link out of any session info it is handed, and so do the session
156
- // menu and the tab cache. One list for every window, kept across reloads.
157
- const STOR_STOPPED_SHARES = 'opencode-v2-stopped-shares';
158
- const _stoppedShares = createStoppedShares({
159
- load: () => JSON.parse(storage.getItem(STOR_STOPPED_SHARES) || '{}'),
160
- save: (entries) => storage.setItem(STOR_STOPPED_SHARES, JSON.stringify(entries)),
161
- });
162
- getDefaultStore().setSessionInfoFilter?.((info) => _stoppedShares.clean(info));
163
158
 
164
159
  function forkClonedOpenCodePersistence() {
165
160
  try {
@@ -469,6 +464,7 @@ function buildPanel() {
469
464
  onAttachPath: (path) => appendPathToCompose(path),
470
465
  });
471
466
  _contextMenu = mountContextMenu(actions, panel, getDefaultStore(), {
467
+ bounds: frameRect, // the popover stays in the app frame
472
468
  compact: createCompactControl(getDefaultStore()),
473
469
  autoAccept: createAutoAcceptControl(getDefaultStore()),
474
470
  onManage: () => environment.open(),
@@ -585,10 +581,6 @@ function buildPanel() {
585
581
  const result = failIfRefused(await forkSession(getDefaultStore(), api), 'Fork failed');
586
582
  if (result?.ok) await openCreatedSession(result.session, { activate: !result.moved, nav });
587
583
  },
588
- // Asked every time, in the session menu: /share only opens the question
589
- // there, and its button publishes the transcript at a public URL.
590
- share: () => shareActiveSession(),
591
- unshare: () => stopSharingActiveSession(),
592
584
  };
593
585
  composer = _composer = mountCompose(compose, getDefaultStore(), {
594
586
  slashActions,
@@ -667,7 +659,6 @@ function buildPanel() {
667
659
  if (eventType !== 'session.updated' && eventType !== 'session.deleted' && eventType !== 'session.created') return;
668
660
  if (eventType === 'session.deleted') {
669
661
  const sid = ev?.info?.id || ev?.sessionID || ev?.sessionId;
670
- if (sid) _stoppedShares.resume(sid);
671
662
  if (sid && _tabSessionIds.includes(sid)) {
672
663
  handlePillClose(sid).catch((err) => console.warn('[ocp-v2-panel] close of a deleted session failed', err));
673
664
  }
@@ -894,7 +885,7 @@ function updateOpenCodeTitleLocally(sessionId, title) {
894
885
  ? active.sessionInfo
895
886
  : _tabInfoCache.get(sessionId);
896
887
  const updated = { ...(current || {}), id: sessionId, title };
897
- _tabInfoCache.set(sessionId, _stoppedShares.clean(updated));
888
+ _tabInfoCache.set(sessionId, updated);
898
889
  if (sessionId === active.sessionId) setSession(sessionId, updated);
899
890
  ensureTab(sessionId, updated);
900
891
  renderPill();
@@ -1088,8 +1079,6 @@ let _sessionMenuSearch = '';
1088
1079
  let _sessionMenuArchived = false;
1089
1080
  let _sessionMenuBodyEl = null;
1090
1081
  let _sessionMenuRefreshTimer = null;
1091
- let _sharePolicy = null; // OpenCode's `share` setting, read once per menu open
1092
- const _sharePolicyReads = latestOnly();
1093
1082
  // The list under the search box: the newest read wins, and only for the
1094
1083
  // filters (search text, archived or not) the menu still shows.
1095
1084
  const _sessionMenuReads = latestFor();
@@ -1159,20 +1148,6 @@ async function renderSessionMenu() {
1159
1148
  _sessionMenuEl.appendChild(_sessionMenuBodyEl);
1160
1149
  _menuConfirmAnchors.clear();
1161
1150
 
1162
- // Whether sharing is allowed at all (D2: hidden when the config disables it).
1163
- // The policy is the project's: an answer for an earlier opening of the menu,
1164
- // or for the session the panel has left, is not this menu's.
1165
- _sharePolicy = null;
1166
- const policyIsFresh = _sharePolicyReads.begin();
1167
- const policyAt = captureBinding(getDefaultStore());
1168
- api.sessionSharePolicy({ cwd: policyAt.cwd || undefined }).then((res) => {
1169
- if (!policyIsFresh() || !policyAt.isCurrent()) return;
1170
- if (!replyFailed(res)) {
1171
- _sharePolicy = res.data?.share || 'manual';
1172
- scheduleSessionMenuRefresh(0);
1173
- }
1174
- }).catch(() => {});
1175
-
1176
1151
  await refreshSessionMenuBody();
1177
1152
  setTimeout(() => input.focus(), 0);
1178
1153
  }
@@ -1210,8 +1185,7 @@ async function refreshSessionMenuBody() {
1210
1185
  const cwd = s.cwd || storage.getItem(STOR_PROJECT) || '';
1211
1186
  // Sessions of every project are listed, so one from another registered
1212
1187
  // project can be resumed; sub-agent sessions open from their parent instead.
1213
- // (A link whose sharing the panel stopped is not a share: the row says so.)
1214
- const all = menuSessions(sessions, { search }).slice(0, SESSION_MENU_LIMIT).map((row) => _stoppedShares.clean(row));
1188
+ const all = menuSessions(sessions, { search }).slice(0, SESSION_MENU_LIMIT);
1215
1189
 
1216
1190
  body.innerHTML = '';
1217
1191
  _menuConfirmAnchors.clear();
@@ -1256,82 +1230,14 @@ async function refreshSessionMenuBody() {
1256
1230
  syncSessionMenuConfirm();
1257
1231
  }
1258
1232
 
1259
- // Publishing is two steps, both in the panel. "Share session…" (or /share)
1260
- // only asks: the question under it says what becomes public, and its button
1261
- // shares. Nothing is published by one click, and never by a native dialog.
1262
- async function shareActiveSession() {
1263
- const sid = getState().sessionId;
1264
- if (!sid) return null;
1265
- if (!_sessionMenuEl?.classList.contains('open')) openSessionMenu();
1266
- const result = await shareSession(getDefaultStore(), api, () => _confirms.ask({
1267
- key: `share:${sid}`, surface: 'menu', text: SHARE_CONFIRM_TEXT, confirmLabel: 'Share publicly',
1268
- }), { stopped: _stoppedShares });
1269
- if (result && result.ok === false && !result.cancelled && !result.moved) pushError({ message: result.error || 'Share failed' });
1270
- if (result?.ok && result.url) {
1271
- try { await navigator.clipboard.writeText(result.url); } catch {}
1272
- if (_sessionMenuEl?.classList.contains('open')) scheduleSessionMenuRefresh(0);
1273
- else openSessionMenu();
1274
- }
1275
- return result;
1276
- }
1277
-
1278
- // Stop sharing: the link goes from everything the panel holds of that
1279
- // session (the store, the tab cache, the menu), also when the panel was on
1280
- // another session by the time OpenCode answered.
1281
- async function stopSharingActiveSession() {
1282
- const sid = getState().sessionId;
1283
- const result = await unshareSession(getDefaultStore(), api, { stopped: _stoppedShares });
1284
- if (result && result.ok === false && !result.moved) pushError({ message: result.error || 'Could not stop sharing' });
1285
- if (sid) forgetStoppedShare(sid);
1286
- return result;
1287
- }
1288
-
1289
- function forgetStoppedShare(sessionId) {
1290
- const cached = _tabInfoCache.get(sessionId);
1291
- if (cached) _tabInfoCache.set(sessionId, _stoppedShares.clean(cached));
1292
- const known = getState().knownSessions;
1293
- if (known?.has?.(sessionId)) known.set(sessionId, _stoppedShares.clean(known.get(sessionId)));
1294
- scheduleSessionMenuRefresh(0);
1295
- }
1296
-
1297
- // Share / export / fork for the session that is open.
1233
+ // Export / fork for the session that is open.
1298
1234
  function appendActiveSessionActions(body, s) {
1299
1235
  if (!s.sessionId) return;
1300
- const share = shareView(s.sessionInfo, _sharePolicy, supports);
1301
1236
  const report = (result, fallback) => {
1302
1237
  if (result && result.ok === false && !result.cancelled && !result.moved) pushError({ message: result.error || fallback });
1303
1238
  return result;
1304
1239
  };
1305
1240
 
1306
- // Asked every time, under this item: the click only opens the question.
1307
- // (The item is there while its question is armed, whatever the policy read
1308
- // says by then: /share asks before that read is back.)
1309
- const shareKey = `share:${s.sessionId}`;
1310
- if ((share.canShare && _sharePolicy) || _confirms.isArmed(shareKey)) {
1311
- const shareItem = menuItem('Share session…', () => {
1312
- shareActiveSession().catch((err) => pushError({ message: err?.message || 'Share failed' }));
1313
- }, { muted: true });
1314
- _menuConfirmAnchors.set(shareKey, shareItem);
1315
- body.appendChild(shareItem);
1316
- }
1317
- if (share.showLink) {
1318
- body.appendChild(menuItem('Copy share link', async () => {
1319
- // A failed copy is reported in the session whose link it was.
1320
- const at = captureBinding(getDefaultStore());
1321
- try { await navigator.clipboard.writeText(share.url); } catch (err) {
1322
- if (at.isCurrent()) pushError({ message: err?.message || 'Copy failed' });
1323
- }
1324
- }, { muted: true, meta: 'public' }));
1325
- const url = document.createElement('div');
1326
- url.className = 'ocpv2-session-share-url';
1327
- url.textContent = share.url;
1328
- body.appendChild(url);
1329
- }
1330
- if (share.canUnshare) {
1331
- body.appendChild(menuItem('Stop sharing', () => {
1332
- stopSharingActiveSession().catch((err) => pushError({ message: err?.message || 'Could not stop sharing' }));
1333
- }, { muted: true }));
1334
- }
1335
1241
  if (s.messageOrder.length) {
1336
1242
  body.appendChild(menuItem('Export transcript', () => {
1337
1243
  closeSessionMenu();
@@ -1371,7 +1277,7 @@ function buildSessionMenuItem(sess, s, cwd, { archived, filters }) {
1371
1277
  labelEl.textContent = title;
1372
1278
  item.appendChild(labelEl);
1373
1279
 
1374
- const meta = [projectName, sess.share?.url ? 'shared' : ''].filter(Boolean).join(' · ');
1280
+ const meta = projectName || '';
1375
1281
  if (meta) {
1376
1282
  const metaEl = document.createElement('span');
1377
1283
  metaEl.className = 'ocpv2-session-item-meta';
@@ -1567,7 +1473,7 @@ async function restoreSessionSelections(sid, info) {
1567
1473
  applySessionSelections(getDefaultStore(), full);
1568
1474
  // Fresh metadata too: keeps the title right after a switch.
1569
1475
  getDefaultStore().setSessionInfo(full);
1570
- _tabInfoCache.set(sid, _stoppedShares.clean({ ...(_tabInfoCache.get(sid) || {}), ...full }));
1476
+ _tabInfoCache.set(sid, { ...(_tabInfoCache.get(sid) || {}), ...full });
1571
1477
  if (!info) ensureTab(sid, full);
1572
1478
  });
1573
1479
  }
@@ -1689,7 +1595,7 @@ async function boot() {
1689
1595
  const info = byId.get(sid);
1690
1596
  if (info) {
1691
1597
  liveTabs.push(sid);
1692
- _tabInfoCache.set(sid, _stoppedShares.clean(info));
1598
+ _tabInfoCache.set(sid, info);
1693
1599
  ensureOpenCodeTitleState(sid, info, { manual: true });
1694
1600
  }
1695
1601
  }
@@ -1699,7 +1605,7 @@ async function boot() {
1699
1605
  if (!liveTabs.length && _pendingAutomationAttach?.sessionId) {
1700
1606
  const { sessionId, info } = _pendingAutomationAttach;
1701
1607
  liveTabs.push(sessionId);
1702
- _tabInfoCache.set(sessionId, _stoppedShares.clean(info || { id: sessionId }));
1608
+ _tabInfoCache.set(sessionId, info || { id: sessionId });
1703
1609
  ensureOpenCodeTitleState(sessionId, info, { manual: true });
1704
1610
  _tabSessionIds = [...liveTabs];
1705
1611
  saveTabSessions();
@@ -1711,7 +1617,12 @@ async function boot() {
1711
1617
  // the session on screen stays.
1712
1618
  renderPill();
1713
1619
  } else if (liveTabs.length) {
1714
- const targetSid = liveTabs[liveTabs.length - 1];
1620
+ const pendingSid = globalThis.__synabunPendingTab?.provider === 'opencode'
1621
+ ? String(globalThis.__synabunPendingTab.tabId || '')
1622
+ : '';
1623
+ const targetSid = (pendingSid && liveTabs.includes(pendingSid))
1624
+ ? pendingSid
1625
+ : liveTabs[liveTabs.length - 1];
1715
1626
  const targetInfo = _tabInfoCache.get(targetSid) || null;
1716
1627
  bootNav.apply(() => {
1717
1628
  setSession(targetSid, targetInfo);
@@ -1959,14 +1870,6 @@ function promptNameNewSession(targetSessionId = null) {
1959
1870
  <label class="ocpv2-name-modal-label">Branch</label>
1960
1871
  <select class="ocpv2-name-modal-select" data-role="branch" disabled></select>
1961
1872
  </div>
1962
- <div class="ocpv2-name-modal-row ocpv2-name-modal-worktree" hidden>
1963
- <label class="ocpv2-name-modal-label">Worktree</label>
1964
- <label class="ocpv2-name-modal-check">
1965
- <input type="checkbox" data-role="worktree" />
1966
- <span>Run in a new git worktree</span>
1967
- </label>
1968
- </div>
1969
- <div class="ocpv2-name-modal-worktrees" hidden></div>
1970
1873
  <input type="text" class="ocpv2-name-modal-input" placeholder="Session name..." maxlength="120" />
1971
1874
  <div class="ocpv2-name-modal-actions">
1972
1875
  <button type="button" class="ocpv2-name-modal-btn skip">Skip</button>
@@ -1991,14 +1894,6 @@ function promptNameNewSession(targetSessionId = null) {
1991
1894
 
1992
1895
  let branchOriginal = null;
1993
1896
  let branchesKnown = false;
1994
- // A session in a new worktree starts from what the project has checked out
1995
- // now; the project's own checkout is never switched for it.
1996
- const syncBranchLock = () => {
1997
- const locked = !!worktreeCheck?.checked;
1998
- if (locked && branchOriginal) branchSel.value = branchOriginal;
1999
- branchSel.disabled = locked || !branchesKnown;
2000
- branchSel.title = locked ? 'A new worktree starts from the branch the project has checked out.' : '';
2001
- };
2002
1897
  let branchRequest = 0;
2003
1898
  async function refreshBranches(path) {
2004
1899
  const request = ++branchRequest;
@@ -2021,75 +1916,13 @@ function promptNameNewSession(targetSessionId = null) {
2021
1916
  if (branchOriginal) branchSel.value = branchOriginal;
2022
1917
  branchesKnown = true;
2023
1918
  }
2024
- syncBranchLock();
1919
+ branchSel.disabled = !branchesKnown;
2025
1920
  }
2026
1921
 
2027
- // Worktrees: an isolated checkout OpenCode creates for the session, so its
2028
- // edits stay out of the main working tree. Offered only when the server can.
2029
- const worktreeRow = overlay.querySelector('.ocpv2-name-modal-worktree');
2030
- const worktreeCheck = overlay.querySelector('input[data-role="worktree"]');
2031
- const worktreeList = overlay.querySelector('.ocpv2-name-modal-worktrees');
2032
- worktreeCheck?.addEventListener('change', syncBranchLock);
2033
1922
  refreshBranches(projectSel?.value || initialProject);
2034
- const worktreeReads = latestOnly();
2035
- // Removing a worktree is asked in the dialog, under its row.
2036
- const worktreeConfirmAnchors = new Map();
2037
- const dialogQuestion = (view) => view.surface === 'dialog';
2038
- const offWorktreeConfirm = _confirms.onChange(() => {
2039
- syncConfirmRow(_confirms, worktreeList, 'dialog', (key) => worktreeConfirmAnchors.get(key));
2040
- });
2041
- async function refreshWorktrees(path) {
2042
- // The rows are read again: a question about one of them is off.
2043
- _confirms.cancel(dialogQuestion);
2044
- worktreeConfirmAnchors.clear();
2045
- const canCreate = supports('worktree:create') && !!path;
2046
- worktreeRow.hidden = !canCreate;
2047
- if (!canCreate) worktreeCheck.checked = false;
2048
- syncBranchLock();
2049
- worktreeList.hidden = true;
2050
- worktreeList.textContent = '';
2051
- if (!path || !supports('worktree:list', 'worktree:remove')) return;
2052
- const latest = worktreeReads.begin();
2053
- const res = await api.worktreeList({ cwd: path }).catch(() => null);
2054
- // A newer read (another project picked, a worktree removed) owns the list.
2055
- if (!latest() || replyFailed(res) || !Array.isArray(res.data) || !res.data.length || projectSel?.value !== path) return;
2056
- worktreeList.hidden = false;
2057
- for (const tree of res.data) {
2058
- const row = document.createElement('div');
2059
- row.className = 'ocpv2-permission-more';
2060
- const name = document.createElement('code');
2061
- name.textContent = tree.branch ? `${tree.name} (${tree.branch})` : tree.name;
2062
- name.title = tree.directory;
2063
- const remove = document.createElement('button');
2064
- remove.type = 'button';
2065
- remove.className = 'ocpv2-permission-link';
2066
- remove.textContent = 'Remove';
2067
- remove.addEventListener('click', async () => {
2068
- // This click only asks; the button of the question removes it.
2069
- const key = `worktree-remove:${tree.directory}`;
2070
- worktreeConfirmAnchors.set(key, row);
2071
- const agreed = await _confirms.ask({
2072
- key, surface: 'dialog', confirmLabel: 'Remove worktree',
2073
- text: `Remove the worktree "${tree.name}"? Its directory and uncommitted changes are deleted.`,
2074
- });
2075
- if (!agreed) return;
2076
- const removed = await api.worktreeRemove({ cwd: path, directory: tree.directory }).catch((err) => ({ ok: false, error: err?.message }));
2077
- // The failure is about the worktree, not about a session: it is shown
2078
- // wherever the panel is. The list is this dialog's: it is read again
2079
- // only while the dialog is open and still on that project.
2080
- if (replyFailed(removed)) { pushError({ message: replyError(removed, 'Could not remove the worktree') }); return; }
2081
- if (done || projectSel?.value !== path) return;
2082
- refreshWorktrees(path);
2083
- });
2084
- row.append(name, remove);
2085
- worktreeList.appendChild(row);
2086
- }
2087
- }
2088
- refreshWorktrees(projectSel?.value || initialProject);
2089
1923
 
2090
1924
  projectSel?.addEventListener('change', () => {
2091
1925
  refreshBranches(projectSel.value);
2092
- refreshWorktrees(projectSel.value);
2093
1926
  });
2094
1927
 
2095
1928
  setTimeout(() => { input.focus(); input.select(); }, 10);
@@ -2098,8 +1931,6 @@ function promptNameNewSession(targetSessionId = null) {
2098
1931
  const close = () => {
2099
1932
  if (done) return;
2100
1933
  done = true;
2101
- offWorktreeConfirm();
2102
- _confirms.cancel(dialogQuestion);
2103
1934
  overlay.remove();
2104
1935
  };
2105
1936
 
@@ -2108,29 +1939,20 @@ function promptNameNewSession(targetSessionId = null) {
2108
1939
  const nextTitle = input.value.trim();
2109
1940
  const chosenProject = projectSel?.value || '';
2110
1941
  const chosenBranch = branchSel?.value || '';
2111
- const wantsWorktree = !!worktreeCheck?.checked && !!chosenProject;
2112
1942
  close();
2113
1943
  // Skip leaves the freshly-created session in place — same as Claude/Codex
2114
1944
  // where dismissing the rename modal keeps the empty new tab.
2115
1945
  if (cancel) return;
2116
1946
 
2117
1947
  const plan = newSessionPlan({
2118
- project: chosenProject, branch: chosenBranch, currentBranch: branchOriginal || '',
2119
- wantsWorktree, cwd: getState().cwd || '',
1948
+ project: chosenProject, branch: chosenBranch, currentBranch: branchOriginal || '', cwd: getState().cwd || '',
2120
1949
  });
2121
1950
  const projectChanged = plan.projectChanged;
2122
1951
  // What Save starts is a navigation of its own when it creates a session
2123
- // (in a worktree, in another project): it owns the panel from this click
2124
- // on, unless the user chooses something else while it waits. A Save that
2125
- // only names the session navigates nowhere and begins no intent.
2126
- const nav = (plan.worktree || projectChanged) ? _nav.begin() : null;
2127
-
2128
- // The worktree first: an isolated session never switches the branch of the
2129
- // project's own checkout.
2130
- if (plan.worktree) {
2131
- await startSessionInNewWorktree(chosenProject, nextTitle, nav);
2132
- return;
2133
- }
1952
+ // (in another project): it owns the panel from this click on, unless the
1953
+ // user chooses something else while it waits. A Save that only names the
1954
+ // session navigates nowhere and begins no intent.
1955
+ const nav = projectChanged ? _nav.begin() : null;
2134
1956
 
2135
1957
  if (plan.checkout) {
2136
1958
  // A session started after a failed switch would run on the wrong base.
@@ -2198,40 +2020,6 @@ function promptNameNewSession(targetSessionId = null) {
2198
2020
  });
2199
2021
  }
2200
2022
 
2201
- // "Run in a new git worktree": OpenCode creates the worktree (and runs the
2202
- // project's start command in it), then the session is created inside it. The
2203
- // project stays the remembered default; only this session lives in the worktree.
2204
- async function startSessionInNewWorktree(projectPath, title, nav = _nav.begin()) {
2205
- // Subscribe before creating: the ready event can beat the reply. Events are
2206
- // held until the reply names this worktree, so another creation finishing
2207
- // (or failing) first is not mistaken for this one.
2208
- const watch = watchWorktree(onEvent, { timeoutMs: 60_000 });
2209
- const created = await api.worktreeCreate({ cwd: projectPath }).catch((err) => ({ ok: false, error: err?.message }));
2210
- if (replyFailed(created) || !created.data?.directory) {
2211
- watch.cancel();
2212
- pushError({ message: replyError(created, 'Could not create the worktree') });
2213
- return;
2214
- }
2215
- watch.identify(created.data.name);
2216
- const state = await watch.result;
2217
- if (!state.ok) {
2218
- pushError({ message: state.error });
2219
- return;
2220
- }
2221
- // Up to a minute has passed. The session is created in the worktree either
2222
- // way; it takes the panel only when the user did not navigate meanwhile
2223
- // (`nav`), and is a tab otherwise.
2224
- if (nav.isCurrent()) {
2225
- const prevSid = getState().sessionId;
2226
- if (prevSid) ensureTab(prevSid, getState().sessionInfo);
2227
- }
2228
- try {
2229
- await startFreshSession({ title: title || undefined, cwd: created.data.directory, nav });
2230
- } catch (err) {
2231
- pushError({ message: err?.message || 'New session failed' });
2232
- }
2233
- }
2234
-
2235
2023
  async function closeCurrentSession() {
2236
2024
  // Update the UI first; server cleanup is best-effort and must not block the
2237
2025
  // only visible tab from closing.
@@ -2356,7 +2144,7 @@ function saveTabSessions() {
2356
2144
 
2357
2145
  function ensureTab(sessionId, info = null) {
2358
2146
  if (!sessionId) return;
2359
- if (info) _tabInfoCache.set(sessionId, _stoppedShares.clean(info));
2147
+ if (info) _tabInfoCache.set(sessionId, info);
2360
2148
  if (!_tabSessionIds.includes(sessionId)) {
2361
2149
  _tabSessionIds.push(sessionId);
2362
2150
  saveTabSessions();
@@ -2451,6 +2239,8 @@ function removeTab(sessionId, { byUser = false } = {}) {
2451
2239
  forgetWorkerEnd(_automationRunIds.get(sessionId));
2452
2240
  _workerEnds.delete(sessionId);
2453
2241
  _automationRunIds.delete(sessionId);
2242
+ forgetWorkerQuestions(sessionId);
2243
+ forgetWorkerQuestions(sessionId);
2454
2244
  unregisterAutomationSession(sessionId);
2455
2245
  _automationRunning.delete(sessionId);
2456
2246
  _automationTurn.delete(sessionId);
@@ -2491,7 +2281,7 @@ function createTabPill(sessionId) {
2491
2281
  });
2492
2282
  pill.querySelector('.term-minimized-pill-close')?.addEventListener('click', (event) => {
2493
2283
  event.stopPropagation();
2494
- closeTabByUser(sessionId, 'pill close');
2284
+ closeTabByUser(sessionId, 'pill close', { deleteBeforeClose: true });
2495
2285
  });
2496
2286
  tray.appendChild(pill);
2497
2287
  return pill;
@@ -2501,10 +2291,16 @@ function createTabPill(sessionId) {
2501
2291
  // continued the terminal automation manually; backend cleanup is best-effort.
2502
2292
  // Asked first when prompts are still waiting in that session; declined: the
2503
2293
  // tab stays, nothing is deleted, and this resolves false.
2504
- async function closeTabByUser(sessionId, context) {
2294
+ async function closeTabByUser(sessionId, context, { deleteBeforeClose = false } = {}) {
2505
2295
  if (!(await mayCloseTab(sessionId))) return false;
2506
- const wasRunning = sessionId === getState().sessionId && !!getState().running;
2507
- closeSessionBackend(sessionId, { wasRunning, context }).catch(() => {});
2296
+ // Only the tray X waits for deletion, including a turn in a background tab.
2297
+ // Worker tabs retain their existing stop/dismiss and transcript ownership.
2298
+ const deletePillSession = deleteBeforeClose && !_automationRunIds.has(sessionId);
2299
+ const wasRunning = sessionId === getState().sessionId
2300
+ ? !!getState().running
2301
+ : deletePillSession && _sessionBusy.get(sessionId) === true;
2302
+ const backendClose = closeSessionBackend(sessionId, { wasRunning, context }).catch(() => {});
2303
+ if (deletePillSession) await backendClose;
2508
2304
  try { await handlePillClose(sessionId, { byUser: true }); }
2509
2305
  catch (err) { console.warn(`[ocp-v2-panel] local ${context} failed`, err); }
2510
2306
  return true;
@@ -2516,7 +2312,17 @@ async function closeTabByUser(sessionId, context) {
2516
2312
  // Assistant session that dispatched it.
2517
2313
  function workerEndCard(sessionId) {
2518
2314
  const view = sessionId ? _workerEnds.get(sessionId) : null;
2519
- if (!view) return null;
2315
+ if (!view) {
2316
+ const restart = _workerRestarts.get(sessionId);
2317
+ if (!restart?.key) return null;
2318
+ return { sig: restart.stamp, build: () => {
2319
+ const el = document.createElement('div');
2320
+ el.className = 'ocpv2-post-plan-card ocpv2-post-plan-body';
2321
+ el.setAttribute('role', 'status');
2322
+ el.textContent = t(restart.key);
2323
+ return el;
2324
+ } };
2325
+ }
2520
2326
  return {
2521
2327
  sig: view.sig,
2522
2328
  build: () => buildWorkerEndCard(view, {
@@ -2644,9 +2450,13 @@ async function handlePillClose(sessionId, { byUser = false } = {}) {
2644
2450
  }
2645
2451
 
2646
2452
  // Sub-agent child panel coordination ─────────────────────────────────────────
2647
- on('opencode-panel:show', async () => {
2453
+ on('opencode-panel:show', async (data) => {
2648
2454
  try {
2455
+ const requestedId = typeof data?.tabId === 'string' ? data.tabId : '';
2649
2456
  await showPrimaryOpencodePanel();
2457
+ if (requestedId && _tabSessionIds.includes(requestedId)) {
2458
+ await switchToSession(requestedId, _tabInfoCache.get(requestedId) || null);
2459
+ }
2650
2460
  } catch (err) {
2651
2461
  console.warn('[ocp-v2-panel] show request failed', err);
2652
2462
  }
@@ -2665,7 +2475,7 @@ on('opencode-panel:request-show', async () => {
2665
2475
  on('opencode-panel:request-new-session', () => { beginNewSession(); });
2666
2476
 
2667
2477
  // Whiteboard "Send to Panel" → attach image to compose footer if OCP v2 is the
2668
- // active sidepanel. Mirrors the gating used by Claude/Codex/OCP v1 so the event
2478
+ // active sidepanel. Mirrors the gating used by Claude/Codex/Antigravity so the event
2669
2479
  // is consumed by exactly one panel.
2670
2480
  on('wb:send-to-panel', async ({ dataUrl }) => {
2671
2481
  if (!dataUrl) return;
@@ -2727,12 +2537,15 @@ export async function attachOpenCodeAutomation(run, { focus = !!run?.focus, isCa
2727
2537
  // Establish ownership before connect()/boot(): native provider events use a
2728
2538
  // separate socket and may report a Task child while this attach is awaiting.
2729
2539
  const previousRunId = _automationRunIds.get(sessionId);
2730
- const running = run.status === 'starting' || run.status === 'running';
2540
+ const restart = workerRestart(run);
2541
+ const running = restart.active;
2542
+ _workerRestarts.set(sessionId, restart);
2731
2543
  // The user continued this run's session by hand after the run ended: the tab stays theirs.
2732
2544
  const released = !running && previousRunId === run.runId
2733
2545
  && (_automationContinuedManually.has(sessionId) || _automationManualSendInFlight.has(sessionId));
2734
2546
  _automationRunIds.set(sessionId, run.runId);
2735
2547
  registerAutomationSession(sessionId, run.runId);
2548
+ syncOpenCodeWorkerQuestions(run);
2736
2549
  if (running || previousRunId !== run.runId) {
2737
2550
  _automationContinuedManually.delete(sessionId);
2738
2551
  _automationManualSendInFlight.delete(sessionId);
@@ -2748,7 +2561,7 @@ export async function attachOpenCodeAutomation(run, { focus = !!run?.focus, isCa
2748
2561
  id: sessionId,
2749
2562
  title: run.title || 'Automation',
2750
2563
  directory: run.cwd || '',
2751
- mcpProfile: run.mcpProfile || null,
2564
+ tools: run.tools || null,
2752
2565
  time: { updated: Date.now() },
2753
2566
  };
2754
2567
  if (!_booted) _pendingAutomationAttach = { sessionId, info };
@@ -2778,16 +2591,17 @@ export async function attachOpenCodeAutomation(run, { focus = !!run?.focus, isCa
2778
2591
  if (!_visible) await showPrimaryOpencodePanel();
2779
2592
  await switchToSession(sessionId, info, { nav });
2780
2593
  } else if (getState().sessionId === sessionId) {
2781
- setRunning(running);
2594
+ setRunning(running && !restart.suspended);
2782
2595
  await rehydrateActiveSession().catch(() => {});
2783
2596
  }
2784
- if (getState().sessionId === sessionId) setRunning(running);
2597
+ if (getState().sessionId === sessionId) setRunning(running && !restart.suspended);
2598
+ _renderer?.render();
2785
2599
  // (A dispatched worker's failure, with its reason, is on its end card.)
2786
2600
  if (run.status === 'failed' && run.error && !isDispatchedRun(run) && getState().sessionId === sessionId
2787
2601
  && _tabInfoCache.get(sessionId)?._automationLifecycleError !== run.error) {
2788
2602
  const cachedInfo = _tabInfoCache.get(sessionId) || info;
2789
2603
  cachedInfo._automationLifecycleError = run.error;
2790
- _tabInfoCache.set(sessionId, _stoppedShares.clean(cachedInfo));
2604
+ _tabInfoCache.set(sessionId, cachedInfo);
2791
2605
  pushError({ message: run.error });
2792
2606
  }
2793
2607
  trackWorkerEnd(run, { apply: (view) => showWorkerEnd(sessionId, view) });
@@ -2800,6 +2614,7 @@ export async function detachOpenCodeAutomation(runId) {
2800
2614
  if (!entry) return false;
2801
2615
  const [sessionId] = entry;
2802
2616
  _automationRunIds.delete(sessionId);
2617
+ forgetWorkerQuestions(sessionId);
2803
2618
  _automationRunning.delete(sessionId);
2804
2619
  _automationTurn.delete(sessionId);
2805
2620
  _automationContinuedManually.delete(sessionId);
@@ -305,8 +305,7 @@ export async function handlePostPlanAction(action, store) {
305
305
  const res = await api.compact({
306
306
  sessionId: at.sessionId,
307
307
  cwd: at.cwd || undefined,
308
- mcpProfile: at.mcpProfile || undefined,
309
- model: at.model || undefined,
308
+ tools: at.tools || undefined,
310
309
  });
311
310
  // The compaction was that session's. On another binding there is no plan
312
311
  // card of it to relabel and nobody to tell about its failure.