synabun 2.0.9 → 2.1.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 (679) hide show
  1. package/CHANGELOG.md +115 -0
  2. package/README.md +25 -2
  3. package/THIRD-PARTY-LICENSES.md +68 -4
  4. package/bin/synabun.js +71 -24
  5. package/docs/whatsapp.md +2 -2
  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/launcher.mjs +9 -3
  10. package/lib/claude-hooks.js +172 -18
  11. package/lib/client-config-repair.js +17 -8
  12. package/lib/desktop-app.js +7 -1
  13. package/lib/external-tools.js +1 -1
  14. package/lib/first-launch-protection.js +57 -12
  15. package/lib/mcp-dist.js +176 -0
  16. package/lib/release-npm-ci.mjs +138 -0
  17. package/lib/release-publish.mjs +91 -0
  18. package/lib/release-scan.mjs +50 -0
  19. package/lib/server-crash-record.js +123 -0
  20. package/lib/server-exit.js +318 -0
  21. package/lib/server-supervisor.js +508 -0
  22. package/lib/start-launcher.js +43 -5
  23. package/lib/tools-cli.js +45 -0
  24. package/lib/update-snapshot.js +228 -0
  25. package/lib/virustotal.mjs +192 -0
  26. package/lib/windows-crash-event.js +269 -0
  27. package/mcp-server/dist/http.d.ts +20 -1
  28. package/mcp-server/dist/http.d.ts.map +1 -1
  29. package/mcp-server/dist/http.js +59 -12
  30. package/mcp-server/dist/http.js.map +1 -1
  31. package/mcp-server/dist/index.d.ts +33 -27
  32. package/mcp-server/dist/index.d.ts.map +1 -1
  33. package/mcp-server/dist/index.js +128 -143
  34. package/mcp-server/dist/index.js.map +1 -1
  35. package/mcp-server/dist/preload.js +1 -1
  36. package/mcp-server/dist/preload.js.map +1 -1
  37. package/mcp-server/dist/services/codex-config-heal.d.ts +6 -2
  38. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
  39. package/mcp-server/dist/services/codex-config-heal.js +81 -28
  40. package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
  41. package/mcp-server/dist/services/memory-judge-backfill.d.ts +6 -0
  42. package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -1
  43. package/mcp-server/dist/services/memory-judge-backfill.js +7 -1
  44. package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -1
  45. package/mcp-server/dist/services/neural-interface.d.ts +16 -10
  46. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
  47. package/mcp-server/dist/services/neural-interface.js +67 -11
  48. package/mcp-server/dist/services/neural-interface.js.map +1 -1
  49. package/mcp-server/dist/services/server-instructions.d.ts +7 -2
  50. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -1
  51. package/mcp-server/dist/services/server-instructions.js +20 -62
  52. package/mcp-server/dist/services/server-instructions.js.map +1 -1
  53. package/mcp-server/dist/services/tool-catalog.d.ts +120 -0
  54. package/mcp-server/dist/services/tool-catalog.d.ts.map +1 -0
  55. package/mcp-server/dist/services/tool-catalog.js +339 -0
  56. package/mcp-server/dist/services/tool-catalog.js.map +1 -0
  57. package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts +12 -0
  58. package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts.map +1 -0
  59. package/mcp-server/dist/services/tool-list-refresh-barrier.js +40 -0
  60. package/mcp-server/dist/services/tool-list-refresh-barrier.js.map +1 -0
  61. package/mcp-server/dist/services/tool-list.d.ts +108 -0
  62. package/mcp-server/dist/services/tool-list.d.ts.map +1 -0
  63. package/mcp-server/dist/services/tool-list.js +334 -0
  64. package/mcp-server/dist/services/tool-list.js.map +1 -0
  65. package/mcp-server/dist/services/tool-runtime.d.ts +161 -0
  66. package/mcp-server/dist/services/tool-runtime.d.ts.map +1 -0
  67. package/mcp-server/dist/services/tool-runtime.js +400 -0
  68. package/mcp-server/dist/services/tool-runtime.js.map +1 -0
  69. package/mcp-server/dist/services/whiteboard-geometry.d.ts +26 -2
  70. package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -1
  71. package/mcp-server/dist/services/whiteboard-geometry.js +91 -8
  72. package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -1
  73. package/mcp-server/dist/tools/agents.d.ts +10 -10
  74. package/mcp-server/dist/tools/agents.d.ts.map +1 -1
  75. package/mcp-server/dist/tools/agents.js +22 -13
  76. package/mcp-server/dist/tools/agents.js.map +1 -1
  77. package/mcp-server/dist/tools/browser-batch.d.ts +3 -3
  78. package/mcp-server/dist/tools/image-tools.d.ts +1 -1
  79. package/mcp-server/dist/tools/image-tools.js +1 -1
  80. package/mcp-server/dist/tools/skill-tools.d.ts +505 -0
  81. package/mcp-server/dist/tools/skill-tools.d.ts.map +1 -0
  82. package/mcp-server/dist/tools/skill-tools.js +639 -0
  83. package/mcp-server/dist/tools/skill-tools.js.map +1 -0
  84. package/mcp-server/dist/tools/skill.d.ts +7 -0
  85. package/mcp-server/dist/tools/skill.d.ts.map +1 -0
  86. package/mcp-server/dist/tools/skill.js +11 -0
  87. package/mcp-server/dist/tools/skill.js.map +1 -0
  88. package/mcp-server/dist/tools/tool-groups.d.ts +68 -0
  89. package/mcp-server/dist/tools/tool-groups.d.ts.map +1 -0
  90. package/mcp-server/dist/tools/tool-groups.js +147 -0
  91. package/mcp-server/dist/tools/tool-groups.js.map +1 -0
  92. package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -1
  93. package/mcp-server/dist/tools/whiteboard-format.js +7 -4
  94. package/mcp-server/dist/tools/whiteboard-format.js.map +1 -1
  95. package/mcp-server/dist/tools/whiteboard-tools.d.ts +64 -13
  96. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -1
  97. package/mcp-server/dist/tools/whiteboard-tools.js +30 -5
  98. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -1
  99. package/mcp-server/package-lock.json +2 -2
  100. package/mcp-server/package.json +1 -1
  101. package/mcp-server/src/http.ts +75 -12
  102. package/mcp-server/src/index.ts +147 -154
  103. package/mcp-server/src/preload.ts +12 -12
  104. package/mcp-server/src/services/codex-config-heal.ts +80 -29
  105. package/mcp-server/src/services/memory-judge-backfill.ts +7 -1
  106. package/mcp-server/src/services/neural-interface.ts +79 -20
  107. package/mcp-server/src/services/server-instructions.ts +27 -63
  108. package/mcp-server/src/services/tool-catalog.ts +403 -0
  109. package/mcp-server/src/services/tool-list-refresh-barrier.ts +33 -0
  110. package/mcp-server/src/services/tool-list.ts +410 -0
  111. package/mcp-server/src/services/tool-runtime.ts +457 -0
  112. package/mcp-server/src/services/whiteboard-geometry.ts +94 -9
  113. package/mcp-server/src/tools/agents.ts +22 -14
  114. package/mcp-server/src/tools/image-tools.ts +1 -1
  115. package/mcp-server/src/tools/skill-tools.ts +589 -0
  116. package/mcp-server/src/tools/skill.ts +13 -0
  117. package/mcp-server/src/tools/tool-groups.ts +164 -0
  118. package/mcp-server/src/tools/whiteboard-format.ts +9 -3
  119. package/mcp-server/src/tools/whiteboard-tools.ts +39 -5
  120. package/neural-interface/i18n/en.json +3680 -206
  121. package/neural-interface/i18n/pt-BR.json +3628 -157
  122. package/neural-interface/lib/account-usage.js +5 -3
  123. package/neural-interface/lib/app-controls-api.js +161 -0
  124. package/neural-interface/lib/assistant-api.js +148 -35
  125. package/neural-interface/lib/assistant-brains/claude.js +4 -3
  126. package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +12 -2
  127. package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +32 -9
  128. package/neural-interface/lib/assistant-brains/codex.js +9 -5
  129. package/neural-interface/lib/assistant-brains/opencode.js +122 -44
  130. package/neural-interface/lib/assistant-brains/opencode2-browser-policy/index.js +59 -0
  131. package/neural-interface/lib/assistant-brains/opencode2-route-gate/index.js +97 -0
  132. package/neural-interface/lib/assistant-catalog.js +23 -9
  133. package/neural-interface/lib/assistant-dispatch.js +874 -156
  134. package/neural-interface/lib/assistant-envelope.js +22 -2
  135. package/neural-interface/lib/assistant-persona.js +80 -11
  136. package/neural-interface/lib/assistant-plan-permissions.js +10 -9
  137. package/neural-interface/lib/assistant-route-gate-codex.js +3 -0
  138. package/neural-interface/lib/assistant-route-gate.js +6 -4
  139. package/neural-interface/lib/assistant-router.js +13 -8
  140. package/neural-interface/lib/assistant-runtime.js +183 -26
  141. package/neural-interface/lib/assistant-task-prompt.js +78 -14
  142. package/neural-interface/lib/assistant-tools.js +51 -0
  143. package/neural-interface/lib/backup-service.js +620 -3
  144. package/neural-interface/lib/backup-zip-reader.js +10 -5
  145. package/neural-interface/lib/backup-zip-writer.js +257 -0
  146. package/neural-interface/lib/browser-execution.js +10 -2
  147. package/neural-interface/lib/browser-guard-cdp.js +83 -0
  148. package/neural-interface/lib/browser-network-guard.js +284 -0
  149. package/neural-interface/lib/browser-policy-roots.js +64 -0
  150. package/neural-interface/lib/browser-tool-policy.js +186 -31
  151. package/neural-interface/lib/claude-agent-bridge.js +4 -2
  152. package/neural-interface/lib/claude-hooks-status.js +103 -0
  153. package/neural-interface/lib/claude-model-catalog.js +64 -14
  154. package/neural-interface/lib/claude-temporary.js +5 -11
  155. package/neural-interface/lib/cli-install.js +18 -138
  156. package/neural-interface/lib/cli-resolver.js +4 -1
  157. package/neural-interface/lib/cli-update-planner.js +32 -31
  158. package/neural-interface/lib/cloudflared/tunnel.js +42 -2
  159. package/neural-interface/lib/codex-mcp-approvals.js +11 -0
  160. package/neural-interface/lib/codex-settings-schema.js +109 -47
  161. package/neural-interface/lib/codex-worker-app-server.js +172 -0
  162. package/neural-interface/lib/confined-fs.js +30 -3
  163. package/neural-interface/lib/crash-notice-api.js +98 -0
  164. package/neural-interface/lib/editor-completion-opencode.js +164 -67
  165. package/neural-interface/lib/exec-loop-command.js +4 -1
  166. package/neural-interface/lib/http-guards.js +8 -2
  167. package/neural-interface/lib/install-details.js +4 -1
  168. package/neural-interface/lib/launch-cache.js +293 -0
  169. package/neural-interface/lib/login-start.js +524 -0
  170. package/neural-interface/lib/mcp-agent-servers.js +67 -0
  171. package/neural-interface/lib/mcp-client-config.js +0 -29
  172. package/neural-interface/lib/mcp-external-servers.js +323 -0
  173. package/neural-interface/lib/{mcp-profile-refresh-coordinator.js → mcp-tools-refresh-coordinator.js} +4 -4
  174. package/neural-interface/lib/morelogin.js +30 -0
  175. package/neural-interface/lib/native-loop-providers.js +565 -50
  176. package/neural-interface/lib/native-loop-runtime.js +287 -41
  177. package/neural-interface/lib/opencode-config.js +557 -0
  178. package/neural-interface/lib/opencode-db-schema.js +58 -0
  179. package/neural-interface/lib/opencode-history.js +49 -204
  180. package/neural-interface/lib/opencode-mcp-ready.js +108 -0
  181. package/neural-interface/lib/opencode-native-boundary.js +44 -0
  182. package/neural-interface/lib/opencode-protocol.js +310 -0
  183. package/neural-interface/lib/opencode-provider-view.js +81 -0
  184. package/neural-interface/lib/opencode-runtime-config.js +32 -15
  185. package/neural-interface/lib/opencode-serve-records.js +624 -0
  186. package/neural-interface/lib/opencode-v2-client.js +53 -131
  187. package/neural-interface/lib/opencode-v2-ws-requests.js +35 -195
  188. package/neural-interface/lib/opencode-worker-activity.js +229 -0
  189. package/neural-interface/lib/opencode-worker-data.js +27 -0
  190. package/neural-interface/lib/opencode2-client.js +796 -0
  191. package/neural-interface/lib/opencode2-proxy.js +76 -0
  192. package/neural-interface/lib/opencode2-translate.js +1057 -0
  193. package/neural-interface/lib/owner-authority.js +249 -0
  194. package/neural-interface/lib/page-session.js +275 -0
  195. package/neural-interface/lib/peer-identity.js +763 -0
  196. package/neural-interface/lib/process-identity.js +361 -0
  197. package/neural-interface/lib/request-gate.js +17 -2
  198. package/neural-interface/lib/rulesets/api.js +1 -1
  199. package/neural-interface/lib/rulesets/fs-safe.js +1 -1
  200. package/neural-interface/lib/rulesets/installer.js +92 -27
  201. package/neural-interface/lib/rulesets/json-edit.js +1 -1
  202. package/neural-interface/lib/session-cache-builder.js +18 -10
  203. package/neural-interface/lib/session-title-generator.js +58 -18
  204. package/neural-interface/lib/skills/api-v2.js +495 -0
  205. package/neural-interface/lib/skills/bundle.js +418 -0
  206. package/neural-interface/lib/skills/catalog.js +294 -0
  207. package/neural-interface/lib/skills/creation-api.js +191 -0
  208. package/neural-interface/lib/skills/creation-brief.js +247 -0
  209. package/neural-interface/lib/skills/creation-sources.js +267 -0
  210. package/neural-interface/lib/skills/creation.js +843 -0
  211. package/neural-interface/lib/skills/deploy.js +564 -0
  212. package/neural-interface/lib/skills/digest.js +119 -0
  213. package/neural-interface/lib/skills/discover.js +111 -0
  214. package/neural-interface/lib/skills/draft-confinement.js +214 -0
  215. package/neural-interface/lib/skills/eval-confinement.js +397 -0
  216. package/neural-interface/lib/skills/eval-sandbox.js +280 -0
  217. package/neural-interface/lib/skills/eval-trace.js +119 -0
  218. package/neural-interface/lib/skills/evals-api.js +212 -0
  219. package/neural-interface/lib/skills/evals.js +1573 -0
  220. package/neural-interface/lib/skills/export.js +200 -0
  221. package/neural-interface/lib/skills/frontmatter.js +64 -0
  222. package/neural-interface/lib/skills/health.js +75 -0
  223. package/neural-interface/lib/skills/json-edit.js +165 -0
  224. package/neural-interface/lib/skills/known-bridge-digests.json +387 -0
  225. package/neural-interface/lib/skills/known-bridges.js +96 -0
  226. package/neural-interface/lib/skills/library.js +823 -0
  227. package/neural-interface/lib/skills/local-store.js +21 -0
  228. package/neural-interface/lib/skills/migration.js +433 -0
  229. package/neural-interface/lib/skills/operations.js +45 -0
  230. package/neural-interface/lib/skills/ownership.js +427 -0
  231. package/neural-interface/lib/skills/packages.js +88 -0
  232. package/neural-interface/lib/skills/reviews.js +212 -0
  233. package/neural-interface/lib/skills/revision.js +80 -0
  234. package/neural-interface/lib/skills/roots.js +262 -0
  235. package/neural-interface/lib/skills/runtime-checks.js +355 -0
  236. package/neural-interface/lib/skills/scan-assets.js +252 -0
  237. package/neural-interface/lib/skills/scan-context.js +26 -0
  238. package/neural-interface/lib/skills/scan-shell.js +324 -0
  239. package/neural-interface/lib/skills/scan.js +364 -0
  240. package/neural-interface/lib/skills/scanners.js +54 -0
  241. package/neural-interface/lib/skills/service.js +522 -0
  242. package/neural-interface/lib/skills/telemetry.js +113 -0
  243. package/neural-interface/lib/sqlite-integrity-worker.js +22 -0
  244. package/neural-interface/lib/style-guide/api.js +4 -3
  245. package/neural-interface/lib/tool-lists.js +124 -0
  246. package/neural-interface/lib/untrusted-file-headers.js +27 -0
  247. package/neural-interface/lib/whatsapp/bridge.js +6 -3
  248. package/neural-interface/lib/worker-confinement.js +1192 -0
  249. package/neural-interface/lib/worker-guard-setting.js +56 -0
  250. package/neural-interface/lib/worker-mcp-channel.js +175 -0
  251. package/neural-interface/lib/worker-relay-ports.js +227 -0
  252. package/neural-interface/lib/worker-resume.js +229 -0
  253. package/neural-interface/lib/worker-sandbox.js +299 -0
  254. package/neural-interface/package-lock.json +1354 -50
  255. package/neural-interface/package.json +6 -2
  256. package/neural-interface/public/index.html +5 -3
  257. package/neural-interface/public/index2d.html +19 -11
  258. package/neural-interface/public/onboarding.html +2 -2
  259. package/neural-interface/public/shared/account-menu.js +8 -5
  260. package/neural-interface/public/shared/agent-runtime-options.js +76 -16
  261. package/neural-interface/public/shared/api.js +1527 -1336
  262. package/neural-interface/public/shared/app-frame.js +192 -0
  263. package/neural-interface/public/shared/assistant/asst-agents-dock.js +205 -19
  264. package/neural-interface/public/shared/assistant/asst-api.js +11 -3
  265. package/neural-interface/public/shared/assistant/asst-ask-styles.js +270 -0
  266. package/neural-interface/public/shared/assistant/asst-ask-tail.js +118 -0
  267. package/neural-interface/public/shared/assistant/asst-ask.js +397 -0
  268. package/neural-interface/public/shared/assistant/asst-brain-picker.js +241 -112
  269. package/neural-interface/public/shared/assistant/asst-composer.js +1 -1
  270. package/neural-interface/public/shared/assistant/asst-control.js +157 -26
  271. package/neural-interface/public/shared/assistant/asst-followups-card.js +383 -0
  272. package/neural-interface/public/shared/assistant/asst-followups.js +417 -0
  273. package/neural-interface/public/shared/assistant/asst-hosts.js +49 -2
  274. package/neural-interface/public/shared/assistant/asst-limit-dock.js +40 -0
  275. package/neural-interface/public/shared/assistant/asst-limit-wait.js +294 -0
  276. package/neural-interface/public/shared/assistant/asst-limit.js +168 -0
  277. package/neural-interface/public/shared/assistant/asst-mascot.js +49 -12
  278. package/neural-interface/public/shared/assistant/asst-menu.js +84 -12
  279. package/neural-interface/public/shared/assistant/asst-panel.js +303 -44
  280. package/neural-interface/public/shared/assistant/asst-rack-styles.js +93 -58
  281. package/neural-interface/public/shared/assistant/asst-redact.js +186 -0
  282. package/neural-interface/public/shared/assistant/asst-render.js +770 -100
  283. package/neural-interface/public/shared/assistant/asst-route.js +83 -12
  284. package/neural-interface/public/shared/assistant/asst-run-stage.js +231 -0
  285. package/neural-interface/public/shared/assistant/asst-sanitize.js +193 -3
  286. package/neural-interface/public/shared/assistant/asst-scene-styles.js +273 -0
  287. package/neural-interface/public/shared/assistant/asst-scenes.js +530 -0
  288. package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +3 -15
  289. package/neural-interface/public/shared/assistant/asst-sidepanel.js +67 -4
  290. package/neural-interface/public/shared/assistant/asst-slash.js +9 -7
  291. package/neural-interface/public/shared/assistant/asst-state.js +25 -15
  292. package/neural-interface/public/shared/assistant/asst-stop.js +127 -0
  293. package/neural-interface/public/shared/assistant/asst-styles.js +102 -21
  294. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +165 -13
  295. package/neural-interface/public/shared/automation-context.js +5 -2
  296. package/neural-interface/public/shared/cc-dropdown.js +550 -0
  297. package/neural-interface/public/shared/cdx/cdx-context-menu.js +10 -9
  298. package/neural-interface/public/shared/cdx/cdx-copy.js +16 -0
  299. package/neural-interface/public/shared/cdx/cdx-output-model.js +22 -1
  300. package/neural-interface/public/shared/cdx/cdx-output.js +8 -7
  301. package/neural-interface/public/shared/cdx/cdx-panel.js +58 -150
  302. package/neural-interface/public/shared/cdx/cdx-protocol.js +28 -1
  303. package/neural-interface/public/shared/cdx/cdx-render.js +62 -32
  304. package/neural-interface/public/shared/cdx/cdx-requests.js +3 -3
  305. package/neural-interface/public/shared/cdx/cdx-skill-hints.js +54 -0
  306. package/neural-interface/public/shared/cdx/cdx-styles.js +15 -3
  307. package/neural-interface/public/shared/cdx/cdx-tabs.js +201 -74
  308. package/neural-interface/public/shared/cdx/cdx-ws.js +0 -1
  309. package/neural-interface/public/shared/cli-install-view.js +4 -8
  310. package/neural-interface/public/shared/cli-status.js +2 -2
  311. package/neural-interface/public/shared/constants.js +2 -2
  312. package/neural-interface/public/shared/context-menu-areas.js +34 -0
  313. package/neural-interface/public/shared/context-menu-logic.js +243 -0
  314. package/neural-interface/public/shared/context-menu-model.js +366 -0
  315. package/neural-interface/public/shared/context-menu.js +372 -0
  316. package/neural-interface/public/shared/cp/cp-context-menu.js +10 -9
  317. package/neural-interface/public/shared/cp/cp-markdown.js +4 -57
  318. package/neural-interface/public/shared/crash-notice-view.js +168 -0
  319. package/neural-interface/public/shared/data-cache.js +223 -0
  320. package/neural-interface/public/shared/desktop-bridge.js +11 -0
  321. package/neural-interface/public/shared/desktop-titlebar-view.js +78 -1
  322. package/neural-interface/public/shared/desktop-titlebar.js +214 -28
  323. package/neural-interface/public/shared/desktop-update-view.js +35 -5
  324. package/neural-interface/public/shared/editor/editor-panel-logic.js +2 -2
  325. package/neural-interface/public/shared/file-links.js +73 -8
  326. package/neural-interface/public/shared/html-shell.js +78 -86
  327. package/neural-interface/public/shared/i18n.js +2 -0
  328. package/neural-interface/public/shared/launch-prefetch.js +59 -0
  329. package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +7 -7
  330. package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +4 -4
  331. package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +3 -2
  332. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +3 -101
  333. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +9 -2
  334. package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +1 -3
  335. package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +2 -6
  336. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +11 -11
  337. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +0 -3
  338. package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +8 -4
  339. package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +7 -7
  340. package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +54 -17
  341. package/neural-interface/public/shared/ocp-v2/ocp-v2-outcome-notifications.js +16 -0
  342. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +140 -254
  343. package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +1 -2
  344. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +97 -203
  345. package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +11 -9
  346. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +15 -4
  347. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +7 -22
  348. package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +401 -0
  349. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +20 -13
  350. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +8 -61
  351. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +53 -82
  352. package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +16 -15
  353. package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +8 -21
  354. package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +1 -99
  355. package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +5 -35
  356. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +48 -40
  357. package/neural-interface/public/shared/ocp-v2/{ocp-v2-profile-inheritance.js → ocp-v2-tools-inheritance.js} +16 -16
  358. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +205 -62
  359. package/neural-interface/public/shared/opencode-providers.js +39 -0
  360. package/neural-interface/public/shared/page-session.js +96 -0
  361. package/neural-interface/public/shared/registry.js +5 -3
  362. package/neural-interface/public/shared/retired-2d.js +3 -0
  363. package/neural-interface/public/shared/schedules-view.js +452 -0
  364. package/neural-interface/public/shared/settings/settings-app-pane.js +335 -0
  365. package/neural-interface/public/shared/settings/settings-app.js +243 -0
  366. package/neural-interface/public/shared/settings/settings-claude-hooks.js +135 -0
  367. package/neural-interface/public/shared/settings/settings-data.js +90 -0
  368. package/neural-interface/public/shared/settings/settings-ia.js +23 -6
  369. package/neural-interface/public/shared/settings/settings-opencode.js +89 -0
  370. package/neural-interface/public/shared/settings/settings-skill-folders-pane.js +265 -0
  371. package/neural-interface/public/shared/settings/settings-skill-folders.js +130 -0
  372. package/neural-interface/public/shared/settings/settings-worker-guard.js +72 -0
  373. package/neural-interface/public/shared/sidepanel-session-status.js +49 -0
  374. package/neural-interface/public/shared/skills/ss-args.js +96 -0
  375. package/neural-interface/public/shared/skills/ss-creation.js +219 -0
  376. package/neural-interface/public/shared/skills/ss-dialog.js +130 -0
  377. package/neural-interface/public/shared/skills/ss-doc.js +173 -0
  378. package/neural-interface/public/shared/skills/ss-eval-adapters.js +269 -0
  379. package/neural-interface/public/shared/skills/ss-eval-grade.js +359 -0
  380. package/neural-interface/public/shared/skills/ss-eval-optimise.js +153 -0
  381. package/neural-interface/public/shared/skills/ss-eval-plan.js +315 -0
  382. package/neural-interface/public/shared/skills/ss-evals.js +417 -0
  383. package/neural-interface/public/shared/skills/ss-form.js +159 -0
  384. package/neural-interface/public/shared/skills/ss-frontmatter.js +376 -0
  385. package/neural-interface/public/shared/skills/ss-ids.js +32 -0
  386. package/neural-interface/public/shared/skills/ss-lint.js +141 -0
  387. package/neural-interface/public/shared/skills/ss-presets.js +117 -0
  388. package/neural-interface/public/shared/skills/ss-profiles.js +475 -0
  389. package/neural-interface/public/shared/skills/ss-resources.js +165 -0
  390. package/neural-interface/public/shared/skills/ss-review-view.js +190 -0
  391. package/neural-interface/public/shared/skills/ss-tabs.js +79 -0
  392. package/neural-interface/public/shared/skills/ss-unicode.js +135 -0
  393. package/neural-interface/public/shared/skills/studio/sx-actions.js +222 -0
  394. package/neural-interface/public/shared/skills/studio/sx-cm.js +101 -0
  395. package/neural-interface/public/shared/skills/studio/sx-create-ai-view.js +749 -0
  396. package/neural-interface/public/shared/skills/studio/sx-create-ai.js +236 -0
  397. package/neural-interface/public/shared/skills/studio/sx-create-view.js +254 -0
  398. package/neural-interface/public/shared/skills/studio/sx-create.js +126 -0
  399. package/neural-interface/public/shared/skills/studio/sx-diff-view.js +43 -0
  400. package/neural-interface/public/shared/skills/studio/sx-diff.js +133 -0
  401. package/neural-interface/public/shared/skills/studio/sx-docs.js +480 -0
  402. package/neural-interface/public/shared/skills/studio/sx-dom.js +229 -0
  403. package/neural-interface/public/shared/skills/studio/sx-edit-view.js +848 -0
  404. package/neural-interface/public/shared/skills/studio/sx-editor-model.js +193 -0
  405. package/neural-interface/public/shared/skills/studio/sx-errors.js +22 -0
  406. package/neural-interface/public/shared/skills/studio/sx-geometry.js +82 -0
  407. package/neural-interface/public/shared/skills/studio/sx-import.js +262 -0
  408. package/neural-interface/public/shared/skills/studio/sx-inspector.js +308 -0
  409. package/neural-interface/public/shared/skills/studio/sx-install-flow.js +279 -0
  410. package/neural-interface/public/shared/skills/studio/sx-install.js +296 -0
  411. package/neural-interface/public/shared/skills/studio/sx-library-view.js +639 -0
  412. package/neural-interface/public/shared/skills/studio/sx-library.js +475 -0
  413. package/neural-interface/public/shared/skills/studio/sx-main.js +681 -0
  414. package/neural-interface/public/shared/skills/studio/sx-operations-view.js +98 -0
  415. package/neural-interface/public/shared/skills/studio/sx-operations.js +11 -0
  416. package/neural-interface/public/shared/skills/studio/sx-plan.js +158 -0
  417. package/neural-interface/public/shared/skills/studio/sx-publish-view.js +621 -0
  418. package/neural-interface/public/shared/skills/studio/sx-review-view.js +369 -0
  419. package/neural-interface/public/shared/skills/studio/sx-review.js +148 -0
  420. package/neural-interface/public/shared/skills/studio/sx-scan.js +35 -0
  421. package/neural-interface/public/shared/skills/studio/sx-snippets.js +96 -0
  422. package/neural-interface/public/shared/skills/studio/sx-subject.js +248 -0
  423. package/neural-interface/public/shared/skills/studio/sx-test-view.js +994 -0
  424. package/neural-interface/public/shared/skills/studio/sx-test.js +328 -0
  425. package/neural-interface/public/shared/skills/studio/sx-versions-view.js +241 -0
  426. package/neural-interface/public/shared/skills/studio/sx-workspace-view.js +425 -0
  427. package/neural-interface/public/shared/styleguide/sg-panel.js +4 -2
  428. package/neural-interface/public/shared/styles.css +2065 -2150
  429. package/neural-interface/public/shared/synabun-mascot.js +1115 -9
  430. package/neural-interface/public/shared/tool-list-picker.js +55 -0
  431. package/neural-interface/public/shared/tool-list-storage.js +24 -0
  432. package/neural-interface/public/shared/tool-list-view.js +112 -0
  433. package/neural-interface/public/shared/tour/tour-actor.js +268 -0
  434. package/neural-interface/public/shared/tour/tour-beats.js +336 -0
  435. package/neural-interface/public/shared/tour/tour-engine.js +884 -0
  436. package/neural-interface/public/shared/tour/tour-ink.js +390 -0
  437. package/neural-interface/public/shared/tour/tour-stage.js +440 -0
  438. package/neural-interface/public/shared/tour/tour-state.js +40 -0
  439. package/neural-interface/public/shared/tour/tour-tips.js +99 -0
  440. package/neural-interface/public/shared/tour/tour.css +144 -0
  441. package/neural-interface/public/shared/ui-assistant.js +27 -5
  442. package/neural-interface/public/shared/ui-automation-studio.js +155 -152
  443. package/neural-interface/public/shared/ui-bookmarks.js +2 -1
  444. package/neural-interface/public/shared/ui-claude-panel.js +153 -13
  445. package/neural-interface/public/shared/ui-codex-panel.js +1 -0
  446. package/neural-interface/public/shared/ui-command-runner.js +6 -3
  447. package/neural-interface/public/shared/ui-context-menu.js +295 -0
  448. package/neural-interface/public/shared/ui-cost-widget.js +57 -59
  449. package/neural-interface/public/shared/ui-crash-notice.js +187 -0
  450. package/neural-interface/public/shared/ui-detail.js +21 -9
  451. package/neural-interface/public/shared/ui-file-links.js +1 -0
  452. package/neural-interface/public/shared/ui-image-gallery.js +56 -52
  453. package/neural-interface/public/shared/ui-invite.js +18 -2
  454. package/neural-interface/public/shared/ui-keybinds.js +26 -1
  455. package/neural-interface/public/shared/ui-link.js +9 -9
  456. package/neural-interface/public/shared/ui-menubar.js +229 -40
  457. package/neural-interface/public/shared/ui-native-loop-router-state.js +5 -0
  458. package/neural-interface/public/shared/ui-native-loop-router.js +9 -1
  459. package/neural-interface/public/shared/ui-navbar.js +4 -24
  460. package/neural-interface/public/shared/ui-opencode-panel-v2.js +1 -0
  461. package/neural-interface/public/shared/ui-panels.js +96 -65
  462. package/neural-interface/public/shared/ui-schedules-studio.js +2267 -953
  463. package/neural-interface/public/shared/ui-sessions.js +20 -7
  464. package/neural-interface/public/shared/ui-settings.js +679 -496
  465. package/neural-interface/public/shared/ui-sidebar.js +4 -4
  466. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +13 -0
  467. package/neural-interface/public/shared/ui-sidepanel-sessions.js +56 -5
  468. package/neural-interface/public/shared/ui-sidepanel-state.js +23 -12
  469. package/neural-interface/public/shared/ui-sidepanel-tray.js +84 -8
  470. package/neural-interface/public/shared/ui-sidepanel-windows.js +16 -11
  471. package/neural-interface/public/shared/ui-skills.js +42 -2781
  472. package/neural-interface/public/shared/ui-styleguide.js +5 -2
  473. package/neural-interface/public/shared/ui-sync.js +22 -5
  474. package/neural-interface/public/shared/ui-terminal.js +159 -199
  475. package/neural-interface/public/shared/ui-tool-updates.js +3 -1
  476. package/neural-interface/public/shared/ui-tooltip.js +10 -5
  477. package/neural-interface/public/shared/ui-trash.js +14 -5
  478. package/neural-interface/public/shared/ui-tutorial-layout.js +3 -117
  479. package/neural-interface/public/shared/ui-tutorial-preview.js +103 -0
  480. package/neural-interface/public/shared/ui-tutorial-steps.js +3 -61
  481. package/neural-interface/public/shared/ui-tutorial.css +47 -100
  482. package/neural-interface/public/shared/ui-tutorial.js +285 -499
  483. package/neural-interface/public/shared/ui-update.js +121 -16
  484. package/neural-interface/public/shared/ui-whiteboard.js +313 -59
  485. package/neural-interface/public/shared/ui-worker-end.js +4 -0
  486. package/neural-interface/public/shared/ui-workspaces.js +3 -2
  487. package/neural-interface/public/shared/view-variant.js +66 -0
  488. package/neural-interface/public/shared/whatsapp/wa-view.js +1 -1
  489. package/neural-interface/public/shared/whiteboard-list.js +172 -0
  490. package/neural-interface/public/shared/worker-end.js +10 -3
  491. package/neural-interface/public/shared/worker-restart.js +12 -0
  492. package/neural-interface/public/sidepanel-session.html +1 -1
  493. package/neural-interface/public/variant/2d/background.js +2 -1
  494. package/neural-interface/public/variant/2d/context-menu.js +8 -2
  495. package/neural-interface/public/variant/2d/graph.js +42 -20
  496. package/neural-interface/public/variant/2d/hulls.js +14 -9
  497. package/neural-interface/public/variant/2d/lasso.js +11 -7
  498. package/neural-interface/public/variant/2d/main.js +36 -2
  499. package/neural-interface/public/variant/2d/minimap.js +11 -13
  500. package/neural-interface/public/variant/3d/main.js +72 -6
  501. package/neural-interface/public/variant/3d/map-controls.js +24 -9
  502. package/neural-interface/public/vendor/caveat/OFL.txt +93 -0
  503. package/neural-interface/public/vendor/caveat/caveat-latin-400-normal.woff2 +0 -0
  504. package/neural-interface/public/vendor/caveat/caveat-latin-700-normal.woff2 +0 -0
  505. package/neural-interface/public/vendor/caveat/caveat.css +17 -0
  506. package/neural-interface/public/vendor/caveat/manifest.json +12 -0
  507. package/neural-interface/public/vendor/highlight/LICENSE +29 -0
  508. package/neural-interface/public/vendor/highlight/github-dark-dimmed-11.12.0.min.css +9 -0
  509. package/neural-interface/public/vendor/highlight/highlight-11.12.0.min.js +1262 -0
  510. package/neural-interface/public/vendor/highlight/manifest.json +5 -0
  511. package/neural-interface/public/vendor/html2canvas/LICENSE +22 -0
  512. package/neural-interface/public/vendor/html2canvas/html2canvas-1.4.1.min.js +20 -0
  513. package/neural-interface/public/vendor/html2canvas/manifest.json +4 -0
  514. package/neural-interface/public/vendor/marked/LICENSE.md +44 -0
  515. package/neural-interface/public/vendor/marked/manifest.json +4 -0
  516. package/neural-interface/public/vendor/marked/marked-14.1.4.esm.js +2502 -0
  517. package/neural-interface/public/vendor/mermaid/LICENSE +21 -0
  518. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/abnfDiagram-PAR5IXJI.mjs +1 -0
  519. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architecture-7GRP2DOG-M7G3SWCO.mjs +1 -0
  520. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architectureDiagram-2PNWDENW.mjs +36 -0
  521. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/blockDiagram-PUWGUBOA.mjs +129 -0
  522. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/c4Diagram-3NLNHZP5.mjs +38 -0
  523. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-2NMSUPJH.mjs +1 -0
  524. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-32MCUW2P.mjs +206 -0
  525. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3NPNU5GP.mjs +1 -0
  526. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3SMGFRGC.mjs +1 -0
  527. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4CAJECRU.mjs +14 -0
  528. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4OADUZ5Q.mjs +10 -0
  529. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IMINLNL.mjs +1 -0
  530. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IQCK5RY.mjs +3 -0
  531. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5MVFYWFU.mjs +1 -0
  532. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AQ6EADP3.mjs +1 -0
  533. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AZZRMDJM.mjs +15 -0
  534. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-CLS4B6BI.mjs +168 -0
  535. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-DZP67EKU.mjs +70 -0
  536. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-EICP7K5X.mjs +1 -0
  537. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-GDY2UAB4.mjs +1 -0
  538. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-H7VHZCWX.mjs +1 -0
  539. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-IJBDOHL6.mjs +1 -0
  540. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JFFVMJIA.mjs +1 -0
  541. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JQRUD6KW.mjs +1 -0
  542. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JZGDI5JK.mjs +1 -0
  543. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-KD6SPIPN.mjs +2 -0
  544. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NF366YI6.mjs +231 -0
  545. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NUDPKBEF.mjs +32 -0
  546. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-OJINMHTS.mjs +1 -0
  547. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Q6NGPIAH.mjs +2 -0
  548. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-QJSWEUOL.mjs +132 -0
  549. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-R7JDMUKV.mjs +1 -0
  550. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RCXAM2GK.mjs +1 -0
  551. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RT4MAWR3.mjs +1 -0
  552. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SFMINX4W.mjs +1 -0
  553. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SLDQ463B.mjs +88 -0
  554. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-STOV2HOB.mjs +1 -0
  555. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-T5OCTHI4.mjs +1 -0
  556. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-TCEHX7R3.mjs +1 -0
  557. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VQC2EELJ.mjs +1 -0
  558. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VRZKL3EH.mjs +1 -0
  559. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VTHDQ7BV.mjs +1 -0
  560. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VY2OSTJR.mjs +2 -0
  561. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-WUBWJARI.mjs +1 -0
  562. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YBMQ5JGJ.mjs +2 -0
  563. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YDMLL4PJ.mjs +1 -0
  564. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Z6V44ARX.mjs +62 -0
  565. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZJJ7VQJP.mjs +339 -0
  566. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZNLK7HRR.mjs +1 -0
  567. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZQN7UHIL.mjs +1 -0
  568. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZS6VBONO.mjs +174 -0
  569. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZUNWM646.mjs +1 -0
  570. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-FGAMPOII.mjs +1 -0
  571. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-v2-AI5RJEK4.mjs +1 -0
  572. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cose-bilkent-Q72C2OJ3.mjs +1 -0
  573. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefin-OW5HDTMX-6OCTWOGG.mjs +1 -0
  574. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefinDiagram-2OOWUY4M.mjs +62 -0
  575. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/dagre-MPVFI544.mjs +4 -0
  576. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-AE4NWXFW.mjs +24 -0
  577. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-BUJID5UG.mjs +41 -0
  578. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-C44CZ5NI.mjs +24 -0
  579. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-EYOLEXXS.mjs +30 -0
  580. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-P7B6PWOJ.mjs +3 -0
  581. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ebnfDiagram-FTPZ3PV6.mjs +1 -0
  582. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/erDiagram-H3ERR26V.mjs +99 -0
  583. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/eventmodeling-NTZA5JFV-WKSWQHFS.mjs +1 -0
  584. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/flowDiagram-YHGXBVSY.mjs +1 -0
  585. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ganttDiagram-RWFTB7ED.mjs +292 -0
  586. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraph-4MIJSDKK-JH2HKYUO.mjs +1 -0
  587. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraphDiagram-MAR6GKOP.mjs +106 -0
  588. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/info-A6RAGUB7-3TX3OFWW.mjs +1 -0
  589. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/infoDiagram-LV547AFH.mjs +2 -0
  590. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ishikawaDiagram-PUJQGNDS.mjs +70 -0
  591. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/journeyDiagram-EW5QJT4W.mjs +139 -0
  592. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/kanban-definition-JSQERAZB.mjs +89 -0
  593. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/katex-CZ4GXH2S.mjs +257 -0
  594. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/mindmap-definition-VBJCLQLM.mjs +96 -0
  595. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/packet-AYTQ26CC-MKII6P3Y.mjs +1 -0
  596. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pegDiagram-7WILOQTJ.mjs +1 -0
  597. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pie-WAS4IAKB-6B4OPMJ5.mjs +1 -0
  598. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pieDiagram-EFA7CBSB.mjs +39 -0
  599. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/quadrantDiagram-WARVYA7P.mjs +7 -0
  600. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/radar-RG4KPBEZ-UPTR3XUL.mjs +1 -0
  601. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-74A4TZTK-MEFUPFMS.mjs +1 -0
  602. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-abnf-HS5TGJTU-R5YG2S5D.mjs +1 -0
  603. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-ebnf-LZEXJU2U-G5QEX2L6.mjs +1 -0
  604. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-peg-WCYAUIDC-H5I2ZRY2.mjs +1 -0
  605. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroadDiagram-5NIQVNLQ.mjs +1 -0
  606. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/requirementDiagram-SXREGOKZ.mjs +84 -0
  607. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sankeyDiagram-VV74M2VP.mjs +40 -0
  608. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sequenceDiagram-52ZFIFDL.mjs +162 -0
  609. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sizeCapture-FGA5AGYP.mjs +1 -0
  610. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-3QAKPIVI.mjs +1 -0
  611. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-v2-HN2P4RDZ.mjs +1 -0
  612. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanes-QLVP42QD.mjs +1 -0
  613. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanesDiagram-JKPDBFCN.mjs +8 -0
  614. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/timeline-definition-GS45XAXW.mjs +120 -0
  615. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treeView-Q6P3EWNA-ZRJGANNQ.mjs +1 -0
  616. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treemap-WGGIJYW6-K64VN5AS.mjs +1 -0
  617. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/vennDiagram-QIQU2ZRJ.mjs +34 -0
  618. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardley-WFR3VGLG-D67OWCCH.mjs +1 -0
  619. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardleyDiagram-U6YNM66N.mjs +78 -0
  620. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/xychartDiagram-XJAZEDNM.mjs +7 -0
  621. package/neural-interface/public/vendor/mermaid/manifest.json +4 -0
  622. package/neural-interface/public/vendor/mermaid/mermaid-11.17.2.esm.min.mjs +14 -0
  623. package/neural-interface/public/vendor/yaml/LICENSE +13 -0
  624. package/neural-interface/public/vendor/yaml/manifest.json +4 -0
  625. package/neural-interface/public/vendor/yaml/yaml-2.9.1.min.js +137 -0
  626. package/neural-interface/scripts/build-vendor.mjs +116 -3
  627. package/neural-interface/server.js +4834 -2541
  628. package/neural-interface/templates/rulesets/core.md +1 -1
  629. package/neural-interface/templates/rulesets/legacy-hashes.json +18 -0
  630. package/neural-interface/templates/rulesets/manifest.json +8 -8
  631. package/npm-shrinkwrap.json +18 -12
  632. package/package.json +16 -3
  633. package/postinstall.js +9 -4
  634. package/preuninstall.js +1 -1
  635. package/setup.js +97 -322
  636. package/skills/skill-forge/SKILL.md +177 -0
  637. package/skills/skill-forge/evals/evals.json +54 -0
  638. package/skills/skill-forge/references/package.md +105 -0
  639. package/skills/skill-forge/references/review-and-recovery.md +63 -0
  640. package/skills/skill-forge/references/runtime-profiles.md +20 -0
  641. package/skills/skill-forge/references/sources-and-capabilities.md +51 -0
  642. package/skills/synabun/SKILL.md +10 -7
  643. package/skills/synabun/modules/audit.md +1 -5
  644. package/skills/synabun/modules/changelog.md +1 -5
  645. package/skills/synabun/modules/idea.md +1 -1
  646. package/skills/synabun/modules/memorize.md +6 -9
  647. package/skills/synabun/modules/schedule.md +5 -5
  648. package/mcp-server/dist/services/profiles.d.ts +0 -120
  649. package/mcp-server/dist/services/profiles.d.ts.map +0 -1
  650. package/mcp-server/dist/services/profiles.js +0 -387
  651. package/mcp-server/dist/services/profiles.js.map +0 -1
  652. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +0 -97
  653. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +0 -1
  654. package/mcp-server/dist/tools/leonardo-browser-tools.js +0 -228
  655. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +0 -1
  656. package/mcp-server/dist/tools/leonardo.d.ts +0 -13
  657. package/mcp-server/dist/tools/leonardo.d.ts.map +0 -1
  658. package/mcp-server/dist/tools/leonardo.js +0 -21
  659. package/mcp-server/dist/tools/leonardo.js.map +0 -1
  660. package/mcp-server/dist/tools/profile.d.ts +0 -17
  661. package/mcp-server/dist/tools/profile.d.ts.map +0 -1
  662. package/mcp-server/dist/tools/profile.js +0 -114
  663. package/mcp-server/dist/tools/profile.js.map +0 -1
  664. package/mcp-server/src/services/profiles.ts +0 -428
  665. package/mcp-server/src/tools/leonardo-browser-tools.ts +0 -291
  666. package/mcp-server/src/tools/leonardo.ts +0 -30
  667. package/mcp-server/src/tools/profile.ts +0 -122
  668. package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +0 -47
  669. package/neural-interface/lib/assistant-brains/opencode-route-gate.js +0 -62
  670. package/neural-interface/lib/mcp-profile-servers.js +0 -120
  671. package/neural-interface/public/shared/ui-tutorial-draw.js +0 -311
  672. package/skills/leonardo/SKILL.md +0 -168
  673. package/skills/leonardo/icon.svg +0 -1
  674. package/skills/leonardo/modules/browser-guide.md +0 -378
  675. package/skills/leonardo/modules/image-prompter.md +0 -283
  676. package/skills/leonardo/modules/model-advisor.md +0 -100
  677. package/skills/leonardo/modules/prompt-library.md +0 -110
  678. package/skills/leonardo/modules/style-guide.md +0 -186
  679. package/skills/leonardo/modules/video-prompter.md +0 -317
@@ -1,3 +1,5 @@
1
+ import { workerRestart } from '../worker-restart.js';
2
+ import { t } from '../i18n.js';
1
3
  import { hostedSidepanelId, sidepanelHost } from '../ui-sidepanel-runtime.js';
2
4
  // ─────────────────────────────────────────────────────────────────────────────
3
5
  // OpenCode V2 — Panel container
@@ -10,19 +12,21 @@ import { hostedSidepanelId, sidepanelHost } from '../ui-sidepanel-runtime.js';
10
12
 
11
13
  import { state, emit, on } from '../state.js';
12
14
  import { storage } from '../storage.js';
15
+ import { frameRect } from '../app-frame.js';
13
16
  import { fetchProjects } from '../api.js';
14
17
  import { injectStyles } from './ocp-v2-styles.js';
15
- import { connect, api, hasSessionStore, onSessionCompacted, onEvent, supports, isDescendantSession } from './ocp-v2-ws.js';
18
+ import { connect, api, hasSessionStore, onSessionCompacted, onEvent, onReconnect, supports, isDescendantSession } from './ocp-v2-ws.js';
16
19
  import {
17
- menuSessions, pickReusableEmptySession, shareView, SHARE_CONFIRM_TEXT, createPendingRenames, createStoppedShares,
20
+ menuSessions, pickReusableEmptySession, createPendingRenames,
21
+ sessionBusyFromEvent, sessionBusyFromStatus, tabPillState, automationTurnPhase,
18
22
  } from './ocp-v2-sessions-logic.js';
19
23
  import {
20
- forkSession, shareSession, unshareSession, undoLastTurn, restoreReverted,
24
+ forkSession, undoLastTurn, restoreReverted,
21
25
  loadSelectedSession, applySessionSelections, restoreDraftAttachments,
22
26
  readTranscriptExport, stopForNavigation, createSessionForNavigation, renameSession,
23
27
  navigateAfter, adoptReusableSession, landWithoutTabs, shouldNameCreatedSession, renameBox,
24
28
  } from './ocp-v2-session-actions.js';
25
- import { captureBinding, latestOnly, latestFor, createNavigation } from './ocp-v2-binding.js';
29
+ import { captureBinding, latestFor, createNavigation } from './ocp-v2-binding.js';
26
30
  import { createConfirmations } from './ocp-v2-confirm-logic.js';
27
31
  import { syncConfirmRow } from './ocp-v2-confirm.js';
28
32
  import { closeWithPromptsConfirm, prefilledDraft, samePrompts } from './ocp-v2-composer-logic.js';
@@ -41,7 +45,7 @@ import { createAutoAcceptControl } from './ocp-v2-autoaccept-button.js';
41
45
  import { mountTodoWidget } from './ocp-v2-session-widgets.js';
42
46
  import { mountChangesBar } from './ocp-v2-changes.js';
43
47
  import { mountEnvironmentPopover } from './ocp-v2-status.js';
44
- import { watchWorktree, newSessionPlan, checkoutOutcome } from './ocp-v2-changes-logic.js';
48
+ import { newSessionPlan, checkoutOutcome } from './ocp-v2-changes-logic.js';
45
49
  import { mountRenderer } from './ocp-v2-render.js';
46
50
  import { offerGreeting } from './ocp-v2-greeting.js';
47
51
  import { mountCompose, focusCompose, appendPathToCompose } from './ocp-v2-send.js';
@@ -82,6 +86,9 @@ let OCP_WINDOW_ID = (() => {
82
86
  let STOR_TABS = `opencode-v2-tabs-${OCP_WINDOW_ID}`;
83
87
  let STOR_AUTOMATIONS = `opencode-v2-automations-${OCP_WINDOW_ID}`;
84
88
  let STOR_TITLE_STATES = `opencode-v2-title-states-${OCP_WINDOW_ID}`;
89
+ // The tabs whose session was working when last seen: after a reload their placeholder pills say so and
90
+ // the panel boots to ask OpenCode (ui-sidepanel-tray.js). Never read as the truth: OpenCode's answer is.
91
+ let STOR_BUSY = `opencode-v2-busy-${OCP_WINDOW_ID}`;
85
92
  const STOR_WINDOW_REGISTRY = 'opencode-v2-windows';
86
93
  const HEAL_DEBOUNCE_MS = 800;
87
94
  const HEAL_RETRY_MAX_MS = 30000;
@@ -94,9 +101,17 @@ let _tabPills = new Map(); // sessionId -> pill element
94
101
  let _tabInfoCache = new Map(); // sessionId -> last-known session info (title, etc.)
95
102
  const _automationRunIds = new Map(); // sessionId -> native loop runId
96
103
  const _automationRunning = new Set();
104
+ // sessionId → what a live automation run's turn does ('working', 'waiting' on the user, 'idle' between turns:
105
+ // automationTurnPhase of the run's descriptor): its pill follows the turn, not the run.
106
+ const _automationTurn = new Map();
107
+ // sessionId → working (true) or idle (false), for the tabs that are not on screen: OpenCode's run events
108
+ // and session:status answers say it (noteSessionBusy); the session on screen leaves its own run state
109
+ // here when the user moves on (renderPill), so its pill keeps moving while its turn goes on.
110
+ const _sessionBusy = new Map();
97
111
  const _automationContinuedManually = new Set();
98
112
  const _automationManualSendInFlight = new Set();
99
113
  const _foreignActiveAutomationSessions = new Set();
114
+ const _workerRestarts = new Map();
100
115
  const _workerEnds = new Map(); // sessionId -> end card of the dispatched worker it belongs to (ui-worker-end.js)
101
116
  let _renderer = null;
102
117
  let _visible = false;
@@ -125,30 +140,20 @@ let _composer = null; // the primary panel's composer (mountCompose)
125
140
  let _cliBanner = null; // the CLI banner and send-block (ui-cli-banner.js)
126
141
  let _cliWasBlocked = false; // the banner held sends back last time it said (a change to usable heals the serve)
127
142
  // Where the panel goes. Every choice of the user (a tab, a session in the
128
- // menu, New session, a project, a worktree) begins an intent, and a navigation
143
+ // menu, New session, a project) begins an intent, and a navigation
129
144
  // binds the panel only while its intent is the latest one: a later choice wins
130
145
  // over an older one that is still in flight (ocp-v2-binding.js). What the
131
146
  // panel starts by itself (boot, the recovery, an automation asking for focus)
132
147
  // only observes: it never overtakes a choice of the user.
133
148
  const _nav = createNavigation(getDefaultStore());
134
- // What publishes or destroys is asked in the panel, in two steps, never with a
135
- // native dialog (ocp-v2-confirm-logic.js). `surface` says where the question
136
- // is drawn: 'menu' under its row of the session menu, 'panel' above the
137
- // compose box, 'dialog' in the naming dialog.
149
+ // What destroys is asked in the panel, in two steps, never with a native
150
+ // dialog (ocp-v2-confirm-logic.js). `surface` says where the question is
151
+ // drawn: 'menu' under its row of the session menu, 'panel' above the compose
152
+ // box.
138
153
  const _confirms = createConfirmations({ store: getDefaultStore() });
139
154
  let _confirmSlotEl = null;
140
155
  const _menuConfirmAnchors = new Map(); // question key -> the menu row it is asked under
141
156
  _confirms.onChange(() => { syncSessionMenuConfirm(); syncPanelConfirm(); });
142
- // Share links whose sharing this panel stopped. OpenCode goes on reporting
143
- // them (createStoppedShares in ocp-v2-sessions-logic.js), so the store takes
144
- // such a link out of any session info it is handed, and so do the session
145
- // menu and the tab cache. One list for every window, kept across reloads.
146
- const STOR_STOPPED_SHARES = 'opencode-v2-stopped-shares';
147
- const _stoppedShares = createStoppedShares({
148
- load: () => JSON.parse(storage.getItem(STOR_STOPPED_SHARES) || '{}'),
149
- save: (entries) => storage.setItem(STOR_STOPPED_SHARES, JSON.stringify(entries)),
150
- });
151
- getDefaultStore().setSessionInfoFilter?.((info) => _stoppedShares.clean(info));
152
157
 
153
158
  function forkClonedOpenCodePersistence() {
154
159
  try {
@@ -173,6 +178,7 @@ function forkClonedOpenCodePersistence() {
173
178
  STOR_TABS = `opencode-v2-tabs-${OCP_WINDOW_ID}`;
174
179
  STOR_AUTOMATIONS = `opencode-v2-automations-${OCP_WINDOW_ID}`;
175
180
  STOR_TITLE_STATES = `opencode-v2-title-states-${OCP_WINDOW_ID}`;
181
+ STOR_BUSY = `opencode-v2-busy-${OCP_WINDOW_ID}`;
176
182
  if (transferableTabs.length) storage.setItem(STOR_TABS, JSON.stringify(transferableTabs));
177
183
  if (transferableRows.length) storage.setItem(STOR_AUTOMATIONS, JSON.stringify(transferableRows));
178
184
  if (Object.keys(transferableTitleStates).length) storage.setItem(STOR_TITLE_STATES, JSON.stringify(transferableTitleStates));
@@ -188,6 +194,7 @@ function cleanStaleOpenCodeWindows() {
188
194
  storage.removeItem(`opencode-v2-tabs-${windowId}`);
189
195
  storage.removeItem(`opencode-v2-automations-${windowId}`);
190
196
  storage.removeItem(`opencode-v2-title-states-${windowId}`);
197
+ storage.removeItem(`opencode-v2-busy-${windowId}`);
191
198
  delete registry[windowId];
192
199
  }
193
200
  registry[OCP_WINDOW_ID] = now;
@@ -243,6 +250,8 @@ function saveAutomationTabs() {
243
250
  sessionId,
244
251
  runId,
245
252
  running: _automationRunning.has(sessionId),
253
+ // What its turn did when this was written (automationTurnPhase): a reload's placeholder pill follows it.
254
+ turn: _automationTurn.get(sessionId) || null,
246
255
  ownerId: nativeLoopWindowId,
247
256
  continuedManually: _automationContinuedManually.has(sessionId),
248
257
  }));
@@ -264,6 +273,44 @@ function saveAutomationTabs() {
264
273
  } catch {}
265
274
  }
266
275
 
276
+ // ── What the tabs that are not on screen are doing (_sessionBusy) ──
277
+
278
+ function saveBusySessions() {
279
+ try {
280
+ const busy = _tabSessionIds.filter((sid) => _sessionBusy.get(sid) === true);
281
+ if (busy.length) storage.setItem(STOR_BUSY, JSON.stringify(busy));
282
+ else storage.removeItem(STOR_BUSY);
283
+ } catch {}
284
+ }
285
+
286
+ /** Record what a session is doing; true when that changed. */
287
+ function rememberBusy(sessionId, busy) {
288
+ if (!sessionId || _sessionBusy.get(sessionId) === !!busy) return false;
289
+ _sessionBusy.set(sessionId, !!busy);
290
+ saveBusySessions();
291
+ return true;
292
+ }
293
+
294
+ /** A tab's session started or ended a turn while another one is on screen: its pill follows. */
295
+ function noteSessionBusy(sessionId, busy) {
296
+ if (rememberBusy(sessionId, busy) && _tabSessionIds.includes(sessionId)) renderPill();
297
+ }
298
+
299
+ /**
300
+ * Ask OpenCode what every tab that is not on screen is doing: after a boot (only the session on screen
301
+ * is read back by its rehydrate) and after the socket came back (their events of the outage reached no
302
+ * one). A server that does not answer session:status leaves what is known.
303
+ */
304
+ async function probeTabStatuses() {
305
+ const activeSid = getState().sessionId;
306
+ await Promise.all(_tabSessionIds.filter((sid) => sid && sid !== activeSid).map(async (sid) => {
307
+ let res = null;
308
+ try { res = await api.sessionStatus({ sessionId: sid, cwd: _tabInfoCache.get(sid)?.directory || undefined }); } catch { res = null; }
309
+ const busy = sessionBusyFromStatus(res);
310
+ if (busy !== null && sid !== getState().sessionId && _tabSessionIds.includes(sid)) noteSessionBusy(sid, busy);
311
+ }));
312
+ }
313
+
267
314
  try {
268
315
  const rows = JSON.parse(storage.getItem(STOR_AUTOMATIONS) || '[]');
269
316
  for (const row of Array.isArray(rows) ? rows : []) {
@@ -416,6 +463,7 @@ function buildPanel() {
416
463
  onAttachPath: (path) => appendPathToCompose(path),
417
464
  });
418
465
  _contextMenu = mountContextMenu(actions, panel, getDefaultStore(), {
466
+ bounds: frameRect, // the popover stays in the app frame
419
467
  compact: createCompactControl(getDefaultStore()),
420
468
  autoAccept: createAutoAcceptControl(getDefaultStore()),
421
469
  onManage: () => environment.open(),
@@ -532,10 +580,6 @@ function buildPanel() {
532
580
  const result = failIfRefused(await forkSession(getDefaultStore(), api), 'Fork failed');
533
581
  if (result?.ok) await openCreatedSession(result.session, { activate: !result.moved, nav });
534
582
  },
535
- // Asked every time, in the session menu: /share only opens the question
536
- // there, and its button publishes the transcript at a public URL.
537
- share: () => shareActiveSession(),
538
- unshare: () => stopSharingActiveSession(),
539
583
  };
540
584
  composer = _composer = mountCompose(compose, getDefaultStore(), {
541
585
  slashActions,
@@ -608,10 +652,12 @@ function buildPanel() {
608
652
  // Sessions change outside this panel too (another window, the CLI, a title
609
653
  // OpenCode generated): keep the open menu and the tab list in step.
610
654
  onEvent((eventType, ev) => {
655
+ // A tab that is not on screen goes on running its turn: its pill says what OpenCode says it does.
656
+ const run = sessionBusyFromEvent(eventType, ev);
657
+ if (run && run.sessionId !== getState().sessionId && _tabSessionIds.includes(run.sessionId)) noteSessionBusy(run.sessionId, run.busy);
611
658
  if (eventType !== 'session.updated' && eventType !== 'session.deleted' && eventType !== 'session.created') return;
612
659
  if (eventType === 'session.deleted') {
613
660
  const sid = ev?.info?.id || ev?.sessionID || ev?.sessionId;
614
- if (sid) _stoppedShares.resume(sid);
615
661
  if (sid && _tabSessionIds.includes(sid)) {
616
662
  handlePillClose(sid).catch((err) => console.warn('[ocp-v2-panel] close of a deleted session failed', err));
617
663
  }
@@ -626,6 +672,11 @@ function buildPanel() {
626
672
  const sid = getState().sessionId;
627
673
  if (sid) refreshSessionMessages(sid).catch((err) => console.warn('[ocp-v2-panel] post-compaction refresh failed', err));
628
674
  });
675
+
676
+ // Back after an outage: what the other tabs did meanwhile reached no one (the session on screen heals itself).
677
+ onReconnect(() => {
678
+ if (_booted) probeTabStatuses().catch((err) => console.warn('[ocp-v2-panel] tab status probe failed', err));
679
+ });
629
680
  }
630
681
 
631
682
  // A reverted prompt goes back into the composer with what it carried, each
@@ -833,7 +884,7 @@ function updateOpenCodeTitleLocally(sessionId, title) {
833
884
  ? active.sessionInfo
834
885
  : _tabInfoCache.get(sessionId);
835
886
  const updated = { ...(current || {}), id: sessionId, title };
836
- _tabInfoCache.set(sessionId, _stoppedShares.clean(updated));
887
+ _tabInfoCache.set(sessionId, updated);
837
888
  if (sessionId === active.sessionId) setSession(sessionId, updated);
838
889
  ensureTab(sessionId, updated);
839
890
  renderPill();
@@ -1027,8 +1078,6 @@ let _sessionMenuSearch = '';
1027
1078
  let _sessionMenuArchived = false;
1028
1079
  let _sessionMenuBodyEl = null;
1029
1080
  let _sessionMenuRefreshTimer = null;
1030
- let _sharePolicy = null; // OpenCode's `share` setting, read once per menu open
1031
- const _sharePolicyReads = latestOnly();
1032
1081
  // The list under the search box: the newest read wins, and only for the
1033
1082
  // filters (search text, archived or not) the menu still shows.
1034
1083
  const _sessionMenuReads = latestFor();
@@ -1098,20 +1147,6 @@ async function renderSessionMenu() {
1098
1147
  _sessionMenuEl.appendChild(_sessionMenuBodyEl);
1099
1148
  _menuConfirmAnchors.clear();
1100
1149
 
1101
- // Whether sharing is allowed at all (D2: hidden when the config disables it).
1102
- // The policy is the project's: an answer for an earlier opening of the menu,
1103
- // or for the session the panel has left, is not this menu's.
1104
- _sharePolicy = null;
1105
- const policyIsFresh = _sharePolicyReads.begin();
1106
- const policyAt = captureBinding(getDefaultStore());
1107
- api.sessionSharePolicy({ cwd: policyAt.cwd || undefined }).then((res) => {
1108
- if (!policyIsFresh() || !policyAt.isCurrent()) return;
1109
- if (!replyFailed(res)) {
1110
- _sharePolicy = res.data?.share || 'manual';
1111
- scheduleSessionMenuRefresh(0);
1112
- }
1113
- }).catch(() => {});
1114
-
1115
1150
  await refreshSessionMenuBody();
1116
1151
  setTimeout(() => input.focus(), 0);
1117
1152
  }
@@ -1149,8 +1184,7 @@ async function refreshSessionMenuBody() {
1149
1184
  const cwd = s.cwd || storage.getItem(STOR_PROJECT) || '';
1150
1185
  // Sessions of every project are listed, so one from another registered
1151
1186
  // project can be resumed; sub-agent sessions open from their parent instead.
1152
- // (A link whose sharing the panel stopped is not a share: the row says so.)
1153
- const all = menuSessions(sessions, { search }).slice(0, SESSION_MENU_LIMIT).map((row) => _stoppedShares.clean(row));
1187
+ const all = menuSessions(sessions, { search }).slice(0, SESSION_MENU_LIMIT);
1154
1188
 
1155
1189
  body.innerHTML = '';
1156
1190
  _menuConfirmAnchors.clear();
@@ -1195,82 +1229,14 @@ async function refreshSessionMenuBody() {
1195
1229
  syncSessionMenuConfirm();
1196
1230
  }
1197
1231
 
1198
- // Publishing is two steps, both in the panel. "Share session…" (or /share)
1199
- // only asks: the question under it says what becomes public, and its button
1200
- // shares. Nothing is published by one click, and never by a native dialog.
1201
- async function shareActiveSession() {
1202
- const sid = getState().sessionId;
1203
- if (!sid) return null;
1204
- if (!_sessionMenuEl?.classList.contains('open')) openSessionMenu();
1205
- const result = await shareSession(getDefaultStore(), api, () => _confirms.ask({
1206
- key: `share:${sid}`, surface: 'menu', text: SHARE_CONFIRM_TEXT, confirmLabel: 'Share publicly',
1207
- }), { stopped: _stoppedShares });
1208
- if (result && result.ok === false && !result.cancelled && !result.moved) pushError({ message: result.error || 'Share failed' });
1209
- if (result?.ok && result.url) {
1210
- try { await navigator.clipboard.writeText(result.url); } catch {}
1211
- if (_sessionMenuEl?.classList.contains('open')) scheduleSessionMenuRefresh(0);
1212
- else openSessionMenu();
1213
- }
1214
- return result;
1215
- }
1216
-
1217
- // Stop sharing: the link goes from everything the panel holds of that
1218
- // session (the store, the tab cache, the menu), also when the panel was on
1219
- // another session by the time OpenCode answered.
1220
- async function stopSharingActiveSession() {
1221
- const sid = getState().sessionId;
1222
- const result = await unshareSession(getDefaultStore(), api, { stopped: _stoppedShares });
1223
- if (result && result.ok === false && !result.moved) pushError({ message: result.error || 'Could not stop sharing' });
1224
- if (sid) forgetStoppedShare(sid);
1225
- return result;
1226
- }
1227
-
1228
- function forgetStoppedShare(sessionId) {
1229
- const cached = _tabInfoCache.get(sessionId);
1230
- if (cached) _tabInfoCache.set(sessionId, _stoppedShares.clean(cached));
1231
- const known = getState().knownSessions;
1232
- if (known?.has?.(sessionId)) known.set(sessionId, _stoppedShares.clean(known.get(sessionId)));
1233
- scheduleSessionMenuRefresh(0);
1234
- }
1235
-
1236
- // Share / export / fork for the session that is open.
1232
+ // Export / fork for the session that is open.
1237
1233
  function appendActiveSessionActions(body, s) {
1238
1234
  if (!s.sessionId) return;
1239
- const share = shareView(s.sessionInfo, _sharePolicy, supports);
1240
1235
  const report = (result, fallback) => {
1241
1236
  if (result && result.ok === false && !result.cancelled && !result.moved) pushError({ message: result.error || fallback });
1242
1237
  return result;
1243
1238
  };
1244
1239
 
1245
- // Asked every time, under this item: the click only opens the question.
1246
- // (The item is there while its question is armed, whatever the policy read
1247
- // says by then: /share asks before that read is back.)
1248
- const shareKey = `share:${s.sessionId}`;
1249
- if ((share.canShare && _sharePolicy) || _confirms.isArmed(shareKey)) {
1250
- const shareItem = menuItem('Share session…', () => {
1251
- shareActiveSession().catch((err) => pushError({ message: err?.message || 'Share failed' }));
1252
- }, { muted: true });
1253
- _menuConfirmAnchors.set(shareKey, shareItem);
1254
- body.appendChild(shareItem);
1255
- }
1256
- if (share.showLink) {
1257
- body.appendChild(menuItem('Copy share link', async () => {
1258
- // A failed copy is reported in the session whose link it was.
1259
- const at = captureBinding(getDefaultStore());
1260
- try { await navigator.clipboard.writeText(share.url); } catch (err) {
1261
- if (at.isCurrent()) pushError({ message: err?.message || 'Copy failed' });
1262
- }
1263
- }, { muted: true, meta: 'public' }));
1264
- const url = document.createElement('div');
1265
- url.className = 'ocpv2-session-share-url';
1266
- url.textContent = share.url;
1267
- body.appendChild(url);
1268
- }
1269
- if (share.canUnshare) {
1270
- body.appendChild(menuItem('Stop sharing', () => {
1271
- stopSharingActiveSession().catch((err) => pushError({ message: err?.message || 'Could not stop sharing' }));
1272
- }, { muted: true }));
1273
- }
1274
1240
  if (s.messageOrder.length) {
1275
1241
  body.appendChild(menuItem('Export transcript', () => {
1276
1242
  closeSessionMenu();
@@ -1310,7 +1276,7 @@ function buildSessionMenuItem(sess, s, cwd, { archived, filters }) {
1310
1276
  labelEl.textContent = title;
1311
1277
  item.appendChild(labelEl);
1312
1278
 
1313
- const meta = [projectName, sess.share?.url ? 'shared' : ''].filter(Boolean).join(' · ');
1279
+ const meta = projectName || '';
1314
1280
  if (meta) {
1315
1281
  const metaEl = document.createElement('span');
1316
1282
  metaEl.className = 'ocpv2-session-item-meta';
@@ -1506,7 +1472,7 @@ async function restoreSessionSelections(sid, info) {
1506
1472
  applySessionSelections(getDefaultStore(), full);
1507
1473
  // Fresh metadata too: keeps the title right after a switch.
1508
1474
  getDefaultStore().setSessionInfo(full);
1509
- _tabInfoCache.set(sid, _stoppedShares.clean({ ...(_tabInfoCache.get(sid) || {}), ...full }));
1475
+ _tabInfoCache.set(sid, { ...(_tabInfoCache.get(sid) || {}), ...full });
1510
1476
  if (!info) ensureTab(sid, full);
1511
1477
  });
1512
1478
  }
@@ -1628,7 +1594,7 @@ async function boot() {
1628
1594
  const info = byId.get(sid);
1629
1595
  if (info) {
1630
1596
  liveTabs.push(sid);
1631
- _tabInfoCache.set(sid, _stoppedShares.clean(info));
1597
+ _tabInfoCache.set(sid, info);
1632
1598
  ensureOpenCodeTitleState(sid, info, { manual: true });
1633
1599
  }
1634
1600
  }
@@ -1638,7 +1604,7 @@ async function boot() {
1638
1604
  if (!liveTabs.length && _pendingAutomationAttach?.sessionId) {
1639
1605
  const { sessionId, info } = _pendingAutomationAttach;
1640
1606
  liveTabs.push(sessionId);
1641
- _tabInfoCache.set(sessionId, _stoppedShares.clean(info || { id: sessionId }));
1607
+ _tabInfoCache.set(sessionId, info || { id: sessionId });
1642
1608
  ensureOpenCodeTitleState(sessionId, info, { manual: true });
1643
1609
  _tabSessionIds = [...liveTabs];
1644
1610
  saveTabSessions();
@@ -1672,6 +1638,10 @@ async function boot() {
1672
1638
  create: (nav) => startFreshSession({ cwd: lastProject || undefined, nav }),
1673
1639
  });
1674
1640
  }
1641
+ // The other tabs: their turns may have outlived the page too. Asked before the placeholders go
1642
+ // (a short wait at most), so a working tab's pill does not blink idle in between.
1643
+ const probed = probeTabStatuses().catch((err) => console.warn('[ocp-v2-panel] tab status probe failed', err));
1644
+ await Promise.race([probed, new Promise((resolveWait) => setTimeout(resolveWait, 600))]);
1675
1645
  _booted = true;
1676
1646
  // Tell ui-sidepanel-tray we own opencode pills now — it drops any
1677
1647
  // placeholder pills it was rendering from storage.
@@ -1894,14 +1864,6 @@ function promptNameNewSession(targetSessionId = null) {
1894
1864
  <label class="ocpv2-name-modal-label">Branch</label>
1895
1865
  <select class="ocpv2-name-modal-select" data-role="branch" disabled></select>
1896
1866
  </div>
1897
- <div class="ocpv2-name-modal-row ocpv2-name-modal-worktree" hidden>
1898
- <label class="ocpv2-name-modal-label">Worktree</label>
1899
- <label class="ocpv2-name-modal-check">
1900
- <input type="checkbox" data-role="worktree" />
1901
- <span>Run in a new git worktree</span>
1902
- </label>
1903
- </div>
1904
- <div class="ocpv2-name-modal-worktrees" hidden></div>
1905
1867
  <input type="text" class="ocpv2-name-modal-input" placeholder="Session name..." maxlength="120" />
1906
1868
  <div class="ocpv2-name-modal-actions">
1907
1869
  <button type="button" class="ocpv2-name-modal-btn skip">Skip</button>
@@ -1926,14 +1888,6 @@ function promptNameNewSession(targetSessionId = null) {
1926
1888
 
1927
1889
  let branchOriginal = null;
1928
1890
  let branchesKnown = false;
1929
- // A session in a new worktree starts from what the project has checked out
1930
- // now; the project's own checkout is never switched for it.
1931
- const syncBranchLock = () => {
1932
- const locked = !!worktreeCheck?.checked;
1933
- if (locked && branchOriginal) branchSel.value = branchOriginal;
1934
- branchSel.disabled = locked || !branchesKnown;
1935
- branchSel.title = locked ? 'A new worktree starts from the branch the project has checked out.' : '';
1936
- };
1937
1891
  let branchRequest = 0;
1938
1892
  async function refreshBranches(path) {
1939
1893
  const request = ++branchRequest;
@@ -1956,75 +1910,13 @@ function promptNameNewSession(targetSessionId = null) {
1956
1910
  if (branchOriginal) branchSel.value = branchOriginal;
1957
1911
  branchesKnown = true;
1958
1912
  }
1959
- syncBranchLock();
1913
+ branchSel.disabled = !branchesKnown;
1960
1914
  }
1961
1915
 
1962
- // Worktrees: an isolated checkout OpenCode creates for the session, so its
1963
- // edits stay out of the main working tree. Offered only when the server can.
1964
- const worktreeRow = overlay.querySelector('.ocpv2-name-modal-worktree');
1965
- const worktreeCheck = overlay.querySelector('input[data-role="worktree"]');
1966
- const worktreeList = overlay.querySelector('.ocpv2-name-modal-worktrees');
1967
- worktreeCheck?.addEventListener('change', syncBranchLock);
1968
1916
  refreshBranches(projectSel?.value || initialProject);
1969
- const worktreeReads = latestOnly();
1970
- // Removing a worktree is asked in the dialog, under its row.
1971
- const worktreeConfirmAnchors = new Map();
1972
- const dialogQuestion = (view) => view.surface === 'dialog';
1973
- const offWorktreeConfirm = _confirms.onChange(() => {
1974
- syncConfirmRow(_confirms, worktreeList, 'dialog', (key) => worktreeConfirmAnchors.get(key));
1975
- });
1976
- async function refreshWorktrees(path) {
1977
- // The rows are read again: a question about one of them is off.
1978
- _confirms.cancel(dialogQuestion);
1979
- worktreeConfirmAnchors.clear();
1980
- const canCreate = supports('worktree:create') && !!path;
1981
- worktreeRow.hidden = !canCreate;
1982
- if (!canCreate) worktreeCheck.checked = false;
1983
- syncBranchLock();
1984
- worktreeList.hidden = true;
1985
- worktreeList.textContent = '';
1986
- if (!path || !supports('worktree:list', 'worktree:remove')) return;
1987
- const latest = worktreeReads.begin();
1988
- const res = await api.worktreeList({ cwd: path }).catch(() => null);
1989
- // A newer read (another project picked, a worktree removed) owns the list.
1990
- if (!latest() || replyFailed(res) || !Array.isArray(res.data) || !res.data.length || projectSel?.value !== path) return;
1991
- worktreeList.hidden = false;
1992
- for (const tree of res.data) {
1993
- const row = document.createElement('div');
1994
- row.className = 'ocpv2-permission-more';
1995
- const name = document.createElement('code');
1996
- name.textContent = tree.branch ? `${tree.name} (${tree.branch})` : tree.name;
1997
- name.title = tree.directory;
1998
- const remove = document.createElement('button');
1999
- remove.type = 'button';
2000
- remove.className = 'ocpv2-permission-link';
2001
- remove.textContent = 'Remove';
2002
- remove.addEventListener('click', async () => {
2003
- // This click only asks; the button of the question removes it.
2004
- const key = `worktree-remove:${tree.directory}`;
2005
- worktreeConfirmAnchors.set(key, row);
2006
- const agreed = await _confirms.ask({
2007
- key, surface: 'dialog', confirmLabel: 'Remove worktree',
2008
- text: `Remove the worktree "${tree.name}"? Its directory and uncommitted changes are deleted.`,
2009
- });
2010
- if (!agreed) return;
2011
- const removed = await api.worktreeRemove({ cwd: path, directory: tree.directory }).catch((err) => ({ ok: false, error: err?.message }));
2012
- // The failure is about the worktree, not about a session: it is shown
2013
- // wherever the panel is. The list is this dialog's: it is read again
2014
- // only while the dialog is open and still on that project.
2015
- if (replyFailed(removed)) { pushError({ message: replyError(removed, 'Could not remove the worktree') }); return; }
2016
- if (done || projectSel?.value !== path) return;
2017
- refreshWorktrees(path);
2018
- });
2019
- row.append(name, remove);
2020
- worktreeList.appendChild(row);
2021
- }
2022
- }
2023
- refreshWorktrees(projectSel?.value || initialProject);
2024
1917
 
2025
1918
  projectSel?.addEventListener('change', () => {
2026
1919
  refreshBranches(projectSel.value);
2027
- refreshWorktrees(projectSel.value);
2028
1920
  });
2029
1921
 
2030
1922
  setTimeout(() => { input.focus(); input.select(); }, 10);
@@ -2033,8 +1925,6 @@ function promptNameNewSession(targetSessionId = null) {
2033
1925
  const close = () => {
2034
1926
  if (done) return;
2035
1927
  done = true;
2036
- offWorktreeConfirm();
2037
- _confirms.cancel(dialogQuestion);
2038
1928
  overlay.remove();
2039
1929
  };
2040
1930
 
@@ -2043,29 +1933,20 @@ function promptNameNewSession(targetSessionId = null) {
2043
1933
  const nextTitle = input.value.trim();
2044
1934
  const chosenProject = projectSel?.value || '';
2045
1935
  const chosenBranch = branchSel?.value || '';
2046
- const wantsWorktree = !!worktreeCheck?.checked && !!chosenProject;
2047
1936
  close();
2048
1937
  // Skip leaves the freshly-created session in place — same as Claude/Codex
2049
1938
  // where dismissing the rename modal keeps the empty new tab.
2050
1939
  if (cancel) return;
2051
1940
 
2052
1941
  const plan = newSessionPlan({
2053
- project: chosenProject, branch: chosenBranch, currentBranch: branchOriginal || '',
2054
- wantsWorktree, cwd: getState().cwd || '',
1942
+ project: chosenProject, branch: chosenBranch, currentBranch: branchOriginal || '', cwd: getState().cwd || '',
2055
1943
  });
2056
1944
  const projectChanged = plan.projectChanged;
2057
1945
  // What Save starts is a navigation of its own when it creates a session
2058
- // (in a worktree, in another project): it owns the panel from this click
2059
- // on, unless the user chooses something else while it waits. A Save that
2060
- // only names the session navigates nowhere and begins no intent.
2061
- const nav = (plan.worktree || projectChanged) ? _nav.begin() : null;
2062
-
2063
- // The worktree first: an isolated session never switches the branch of the
2064
- // project's own checkout.
2065
- if (plan.worktree) {
2066
- await startSessionInNewWorktree(chosenProject, nextTitle, nav);
2067
- return;
2068
- }
1946
+ // (in another project): it owns the panel from this click on, unless the
1947
+ // user chooses something else while it waits. A Save that only names the
1948
+ // session navigates nowhere and begins no intent.
1949
+ const nav = projectChanged ? _nav.begin() : null;
2069
1950
 
2070
1951
  if (plan.checkout) {
2071
1952
  // A session started after a failed switch would run on the wrong base.
@@ -2133,40 +2014,6 @@ function promptNameNewSession(targetSessionId = null) {
2133
2014
  });
2134
2015
  }
2135
2016
 
2136
- // "Run in a new git worktree": OpenCode creates the worktree (and runs the
2137
- // project's start command in it), then the session is created inside it. The
2138
- // project stays the remembered default; only this session lives in the worktree.
2139
- async function startSessionInNewWorktree(projectPath, title, nav = _nav.begin()) {
2140
- // Subscribe before creating: the ready event can beat the reply. Events are
2141
- // held until the reply names this worktree, so another creation finishing
2142
- // (or failing) first is not mistaken for this one.
2143
- const watch = watchWorktree(onEvent, { timeoutMs: 60_000 });
2144
- const created = await api.worktreeCreate({ cwd: projectPath }).catch((err) => ({ ok: false, error: err?.message }));
2145
- if (replyFailed(created) || !created.data?.directory) {
2146
- watch.cancel();
2147
- pushError({ message: replyError(created, 'Could not create the worktree') });
2148
- return;
2149
- }
2150
- watch.identify(created.data.name);
2151
- const state = await watch.result;
2152
- if (!state.ok) {
2153
- pushError({ message: state.error });
2154
- return;
2155
- }
2156
- // Up to a minute has passed. The session is created in the worktree either
2157
- // way; it takes the panel only when the user did not navigate meanwhile
2158
- // (`nav`), and is a tab otherwise.
2159
- if (nav.isCurrent()) {
2160
- const prevSid = getState().sessionId;
2161
- if (prevSid) ensureTab(prevSid, getState().sessionInfo);
2162
- }
2163
- try {
2164
- await startFreshSession({ title: title || undefined, cwd: created.data.directory, nav });
2165
- } catch (err) {
2166
- pushError({ message: err?.message || 'New session failed' });
2167
- }
2168
- }
2169
-
2170
2017
  async function closeCurrentSession() {
2171
2018
  // Update the UI first; server cleanup is best-effort and must not block the
2172
2019
  // only visible tab from closing.
@@ -2291,7 +2138,7 @@ function saveTabSessions() {
2291
2138
 
2292
2139
  function ensureTab(sessionId, info = null) {
2293
2140
  if (!sessionId) return;
2294
- if (info) _tabInfoCache.set(sessionId, _stoppedShares.clean(info));
2141
+ if (info) _tabInfoCache.set(sessionId, info);
2295
2142
  if (!_tabSessionIds.includes(sessionId)) {
2296
2143
  _tabSessionIds.push(sessionId);
2297
2144
  saveTabSessions();
@@ -2388,9 +2235,11 @@ function removeTab(sessionId, { byUser = false } = {}) {
2388
2235
  _automationRunIds.delete(sessionId);
2389
2236
  unregisterAutomationSession(sessionId);
2390
2237
  _automationRunning.delete(sessionId);
2238
+ _automationTurn.delete(sessionId);
2391
2239
  _automationContinuedManually.delete(sessionId);
2392
2240
  _automationManualSendInFlight.delete(sessionId);
2393
2241
  saveAutomationTabs();
2242
+ if (_sessionBusy.delete(sessionId)) saveBusySessions();
2394
2243
  const pill = _tabPills.get(sessionId);
2395
2244
  if (pill?.isConnected) pill.remove();
2396
2245
  _tabPills.delete(sessionId);
@@ -2449,7 +2298,17 @@ async function closeTabByUser(sessionId, context) {
2449
2298
  // Assistant session that dispatched it.
2450
2299
  function workerEndCard(sessionId) {
2451
2300
  const view = sessionId ? _workerEnds.get(sessionId) : null;
2452
- if (!view) return null;
2301
+ if (!view) {
2302
+ const restart = _workerRestarts.get(sessionId);
2303
+ if (!restart?.key) return null;
2304
+ return { sig: restart.stamp, build: () => {
2305
+ const el = document.createElement('div');
2306
+ el.className = 'ocpv2-post-plan-card ocpv2-post-plan-body';
2307
+ el.setAttribute('role', 'status');
2308
+ el.textContent = t(restart.key);
2309
+ return el;
2310
+ } };
2311
+ }
2453
2312
  return {
2454
2313
  sig: view.sig,
2455
2314
  build: () => buildWorkerEndCard(view, {
@@ -2481,6 +2340,8 @@ function renderPill() {
2481
2340
  if (!tray) return;
2482
2341
  const activeSid = getState().sessionId;
2483
2342
  if (activeSid) ensureTab(activeSid, getState().sessionInfo);
2343
+ // What the session on screen is doing stays known for its tab once the user moves on.
2344
+ if (activeSid) rememberBusy(activeSid, !!getState().running);
2484
2345
 
2485
2346
  // Drop pills for sessions no longer in the tab list
2486
2347
  for (const [sid, pill] of Array.from(_tabPills.entries())) {
@@ -2501,7 +2362,14 @@ function renderPill() {
2501
2362
  if (labelEl) labelEl.textContent = tabLabelFor(sid);
2502
2363
  const isActive = sid === activeSid;
2503
2364
  pill.classList.toggle('ocpv2-pill-active', isActive);
2504
- pill.classList.toggle('ocpv2-pill-running', _automationRunning.has(sid) || (isActive && !!getState().running));
2365
+ // One pill per session, each with its own state: a tab the user left goes on showing its turn, an
2366
+ // automation its turn (not its run), and a session that waits on the user says so.
2367
+ const state = tabPillState({
2368
+ sessionId: sid, activeSessionId: activeSid, running: !!getState().running,
2369
+ busy: _sessionBusy.get(sid) === true, automation: _automationTurn.get(sid) || null,
2370
+ });
2371
+ pill.classList.toggle('ocpv2-pill-running', state === 'working');
2372
+ pill.classList.toggle('ocpv2-pill-waiting', state === 'waiting');
2505
2373
  pill.style.display = (isActive && _visible) ? 'none' : '';
2506
2374
  }
2507
2375
  // The sub-agent pills of the session on screen sit under its pill.
@@ -2624,6 +2492,16 @@ export async function endHostedOpenCodeSessions() {
2624
2492
 
2625
2493
  export function isOpencodePanelOpen() { return _visible || isChildPanelOpen(); }
2626
2494
 
2495
+ /**
2496
+ * Boot the panel without showing it (ui-sidepanel-tray.js, when a tab saved while it worked comes back
2497
+ * after a reload): its tabs come back and OpenCode is asked what each session does, so their pills say it.
2498
+ */
2499
+ export async function bootOpencodePanel() {
2500
+ if (!_panelEl) buildPanel();
2501
+ await connect();
2502
+ await boot();
2503
+ }
2504
+
2627
2505
  export async function toggleOpencodePanel() {
2628
2506
  if (_visible || isChildPanelOpen()) {
2629
2507
  requestOpencodeView({ hideAll: true });
@@ -2641,7 +2519,9 @@ export async function attachOpenCodeAutomation(run, { focus = !!run?.focus, isCa
2641
2519
  // Establish ownership before connect()/boot(): native provider events use a
2642
2520
  // separate socket and may report a Task child while this attach is awaiting.
2643
2521
  const previousRunId = _automationRunIds.get(sessionId);
2644
- const running = run.status === 'starting' || run.status === 'running';
2522
+ const restart = workerRestart(run);
2523
+ const running = restart.active;
2524
+ _workerRestarts.set(sessionId, restart);
2645
2525
  // The user continued this run's session by hand after the run ended: the tab stays theirs.
2646
2526
  const released = !running && previousRunId === run.runId
2647
2527
  && (_automationContinuedManually.has(sessionId) || _automationManualSendInFlight.has(sessionId));
@@ -2653,12 +2533,16 @@ export async function attachOpenCodeAutomation(run, { focus = !!run?.focus, isCa
2653
2533
  }
2654
2534
  if (running) _automationRunning.add(sessionId);
2655
2535
  else _automationRunning.delete(sessionId);
2536
+ // Every update of the run (its turn starts, waits on you, ends) comes through here: the pill follows it.
2537
+ const phase = automationTurnPhase(run);
2538
+ if (phase) _automationTurn.set(sessionId, phase);
2539
+ else _automationTurn.delete(sessionId);
2656
2540
  saveAutomationTabs();
2657
2541
  const info = {
2658
2542
  id: sessionId,
2659
2543
  title: run.title || 'Automation',
2660
2544
  directory: run.cwd || '',
2661
- mcpProfile: run.mcpProfile || null,
2545
+ tools: run.tools || null,
2662
2546
  time: { updated: Date.now() },
2663
2547
  };
2664
2548
  if (!_booted) _pendingAutomationAttach = { sessionId, info };
@@ -2688,16 +2572,17 @@ export async function attachOpenCodeAutomation(run, { focus = !!run?.focus, isCa
2688
2572
  if (!_visible) await showPrimaryOpencodePanel();
2689
2573
  await switchToSession(sessionId, info, { nav });
2690
2574
  } else if (getState().sessionId === sessionId) {
2691
- setRunning(running);
2575
+ setRunning(running && !restart.suspended);
2692
2576
  await rehydrateActiveSession().catch(() => {});
2693
2577
  }
2694
- if (getState().sessionId === sessionId) setRunning(running);
2578
+ if (getState().sessionId === sessionId) setRunning(running && !restart.suspended);
2579
+ _renderer?.render();
2695
2580
  // (A dispatched worker's failure, with its reason, is on its end card.)
2696
2581
  if (run.status === 'failed' && run.error && !isDispatchedRun(run) && getState().sessionId === sessionId
2697
2582
  && _tabInfoCache.get(sessionId)?._automationLifecycleError !== run.error) {
2698
2583
  const cachedInfo = _tabInfoCache.get(sessionId) || info;
2699
2584
  cachedInfo._automationLifecycleError = run.error;
2700
- _tabInfoCache.set(sessionId, _stoppedShares.clean(cachedInfo));
2585
+ _tabInfoCache.set(sessionId, cachedInfo);
2701
2586
  pushError({ message: run.error });
2702
2587
  }
2703
2588
  trackWorkerEnd(run, { apply: (view) => showWorkerEnd(sessionId, view) });
@@ -2711,6 +2596,7 @@ export async function detachOpenCodeAutomation(runId) {
2711
2596
  const [sessionId] = entry;
2712
2597
  _automationRunIds.delete(sessionId);
2713
2598
  _automationRunning.delete(sessionId);
2599
+ _automationTurn.delete(sessionId);
2714
2600
  _automationContinuedManually.delete(sessionId);
2715
2601
  _automationManualSendInFlight.delete(sessionId);
2716
2602
  saveAutomationTabs();