synabun 2.0.0-beta → 2.0.5

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 (374) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/NOTICE +5 -0
  3. package/README.md +1 -1
  4. package/THIRD-PARTY-LICENSES.md +51 -0
  5. package/benchmarks/fixtures/browser/README.md +1 -1
  6. package/benchmarks/fixtures/desktop/README.md +1 -1
  7. package/docs/whatsapp.md +2 -2
  8. package/hooks/claude-code/pre-compact.mjs +11 -0
  9. package/hooks/claude-code/prompt-submit.mjs +60 -184
  10. package/hooks/claude-code/session-start.mjs +73 -16
  11. package/hooks/claude-code/shared.mjs +20 -0
  12. package/hooks/claude-code/stop.mjs +5 -5
  13. package/launcher.mjs +40 -0
  14. package/lib/claude-hooks.js +61 -8
  15. package/lib/client-config-repair.js +4 -3
  16. package/lib/data-home-migration.js +4 -0
  17. package/lib/desktop-pwa.js +206 -0
  18. package/lib/external-tools.js +221 -0
  19. package/lib/first-launch-protection.js +5 -0
  20. package/lib/packaged-runtime.js +110 -0
  21. package/lib/start-launcher.js +1396 -0
  22. package/mcp-server/package-lock.json +2 -2
  23. package/mcp-server/package.json +1 -3
  24. package/neural-interface/i18n/en.json +1540 -154
  25. package/neural-interface/i18n/pt-BR.json +1538 -153
  26. package/neural-interface/lib/assistant-api.js +62 -6
  27. package/neural-interface/lib/assistant-brains/claude.js +4 -0
  28. package/neural-interface/lib/assistant-catalog.js +179 -27
  29. package/neural-interface/lib/assistant-config.js +31 -2
  30. package/neural-interface/lib/assistant-dispatch.js +62 -13
  31. package/neural-interface/lib/assistant-envelope.js +9 -6
  32. package/neural-interface/lib/assistant-hidden-models.js +393 -66
  33. package/neural-interface/lib/assistant-memory.js +24 -10
  34. package/neural-interface/lib/assistant-persona.js +6 -2
  35. package/neural-interface/lib/assistant-pricing.js +21 -6
  36. package/neural-interface/lib/assistant-runtime.js +181 -12
  37. package/neural-interface/lib/assistant-task-prompt.js +13 -3
  38. package/neural-interface/lib/assistant-test-density.js +142 -0
  39. package/neural-interface/lib/assistant-user-context-budgets.js +123 -0
  40. package/neural-interface/lib/assistant-user-context.js +908 -0
  41. package/neural-interface/lib/assistant-user-knowledge.js +328 -0
  42. package/neural-interface/lib/assistant-user-learn.js +404 -0
  43. package/neural-interface/lib/assistant-user-threads.js +226 -0
  44. package/neural-interface/lib/assistant-user-writer.js +181 -0
  45. package/neural-interface/lib/augmented-path.js +23 -3
  46. package/neural-interface/lib/browser-background-tab.js +134 -0
  47. package/neural-interface/lib/browser-language.js +83 -0
  48. package/neural-interface/lib/browser-screenshot.js +678 -61
  49. package/neural-interface/lib/claude-agent-bridge.js +87 -153
  50. package/neural-interface/lib/claude-executable.js +241 -0
  51. package/neural-interface/lib/claude-model-catalog.js +82 -93
  52. package/neural-interface/lib/claude-temporary.js +46 -7
  53. package/neural-interface/lib/cloudflared/install.js +533 -0
  54. package/neural-interface/lib/cloudflared/manager.js +545 -0
  55. package/neural-interface/lib/cloudflared/pins.js +115 -0
  56. package/neural-interface/lib/cloudflared/pins.json +63 -0
  57. package/neural-interface/lib/cloudflared/tunnel.js +265 -0
  58. package/neural-interface/lib/editor-completion-endpoint.js +264 -0
  59. package/neural-interface/lib/editor-completion-opencode.js +436 -0
  60. package/neural-interface/lib/editor-completion.js +714 -0
  61. package/neural-interface/lib/editor-config.js +149 -0
  62. package/neural-interface/lib/editor-files-api.js +268 -0
  63. package/neural-interface/lib/editor-git-api.js +134 -0
  64. package/neural-interface/lib/file-explorer-api.js +1039 -0
  65. package/neural-interface/lib/file-explorer-system.js +355 -0
  66. package/neural-interface/lib/file-explorer-trash.ps1 +85 -0
  67. package/neural-interface/lib/file-explorer-watch.js +239 -0
  68. package/neural-interface/lib/git-diff-api.js +103 -0
  69. package/neural-interface/lib/git-read.js +202 -0
  70. package/neural-interface/lib/greeting/api.js +89 -0
  71. package/neural-interface/lib/greeting/budgets.js +90 -0
  72. package/neural-interface/lib/greeting/engine.js +461 -0
  73. package/neural-interface/lib/greeting/facts.js +320 -0
  74. package/neural-interface/lib/greeting/sources.js +252 -0
  75. package/neural-interface/lib/greeting/writer.js +139 -0
  76. package/neural-interface/lib/http-guards.js +189 -13
  77. package/neural-interface/lib/machine-names.js +88 -0
  78. package/neural-interface/lib/memory-api.js +31 -7
  79. package/neural-interface/lib/native-binary-runtime.js +69 -337
  80. package/neural-interface/lib/native-loop-providers.js +40 -49
  81. package/neural-interface/lib/offline-page.js +54 -0
  82. package/neural-interface/lib/plugin-installer.js +4 -2
  83. package/neural-interface/lib/project-storage.js +5 -7
  84. package/neural-interface/lib/request-gate.js +589 -0
  85. package/neural-interface/lib/session-title-generator.js +5 -0
  86. package/neural-interface/lib/synabun-update-plan.js +19 -0
  87. package/neural-interface/lib/ui-blob-api.js +108 -0
  88. package/neural-interface/lib/ui-blob-store.js +68 -0
  89. package/neural-interface/package-lock.json +701 -253
  90. package/neural-interface/package.json +13 -2
  91. package/neural-interface/public/install-app.html +34 -0
  92. package/neural-interface/public/manifest.json +2 -0
  93. package/neural-interface/public/offline.html +402 -66
  94. package/neural-interface/public/onboarding.html +264 -147
  95. package/neural-interface/public/shared/agent-runtime-options.js +22 -6
  96. package/neural-interface/public/shared/assistant/asst-automation.js +286 -0
  97. package/neural-interface/public/shared/assistant/asst-brain-picker.js +312 -62
  98. package/neural-interface/public/shared/assistant/asst-composer.js +11 -1
  99. package/neural-interface/public/shared/assistant/asst-mascot.js +26 -64
  100. package/neural-interface/public/shared/assistant/asst-menu.js +12 -8
  101. package/neural-interface/public/shared/assistant/asst-panel.js +150 -28
  102. package/neural-interface/public/shared/assistant/asst-rack-styles.js +0 -3
  103. package/neural-interface/public/shared/assistant/asst-render.js +219 -67
  104. package/neural-interface/public/shared/assistant/asst-route-models.js +108 -0
  105. package/neural-interface/public/shared/assistant/asst-route.js +23 -329
  106. package/neural-interface/public/shared/assistant/asst-routes-editor.js +495 -0
  107. package/neural-interface/public/shared/assistant/asst-sanitize.js +8 -1
  108. package/neural-interface/public/shared/assistant/asst-sidepanel.js +31 -9
  109. package/neural-interface/public/shared/assistant/asst-state.js +185 -1
  110. package/neural-interface/public/shared/assistant/asst-styles.js +162 -6
  111. package/neural-interface/public/shared/blob-store.js +111 -22
  112. package/neural-interface/public/shared/cdx/cdx-panel.js +32 -11
  113. package/neural-interface/public/shared/cdx/cdx-render.js +25 -89
  114. package/neural-interface/public/shared/cdx/cdx-styles.js +36 -0
  115. package/neural-interface/public/shared/cdx/cdx-tabs.js +87 -4
  116. package/neural-interface/public/shared/command-runner-model.js +30 -0
  117. package/neural-interface/public/shared/constants.js +6 -1
  118. package/neural-interface/public/shared/cp/cp-rehydrate.js +2 -1
  119. package/neural-interface/public/shared/cp/cp-styles.js +15 -0
  120. package/neural-interface/public/shared/editor/editor-ai-logic.js +409 -0
  121. package/neural-interface/public/shared/editor/editor-ai.js +619 -0
  122. package/neural-interface/public/shared/editor/editor-commands.js +212 -0
  123. package/neural-interface/public/shared/editor/editor-compare.js +103 -0
  124. package/neural-interface/public/shared/editor/editor-completion-list.js +172 -0
  125. package/neural-interface/public/shared/editor/editor-doc.js +257 -0
  126. package/neural-interface/public/shared/editor/editor-git-logic.js +131 -0
  127. package/neural-interface/public/shared/editor/editor-git.js +95 -0
  128. package/neural-interface/public/shared/editor/editor-languages.js +156 -0
  129. package/neural-interface/public/shared/editor/editor-lint.js +229 -0
  130. package/neural-interface/public/shared/editor/editor-loader.js +51 -0
  131. package/neural-interface/public/shared/editor/editor-markdown.js +90 -0
  132. package/neural-interface/public/shared/editor/editor-menu.js +233 -0
  133. package/neural-interface/public/shared/editor/editor-minimap.js +371 -0
  134. package/neural-interface/public/shared/editor/editor-palette-logic.js +192 -0
  135. package/neural-interface/public/shared/editor/editor-palette.js +125 -0
  136. package/neural-interface/public/shared/editor/editor-panel-logic.js +288 -0
  137. package/neural-interface/public/shared/editor/editor-panel.js +2099 -0
  138. package/neural-interface/public/shared/editor/editor-prefs.js +224 -0
  139. package/neural-interface/public/shared/editor/editor-safety.js +500 -0
  140. package/neural-interface/public/shared/editor/editor-search.js +352 -0
  141. package/neural-interface/public/shared/editor/editor-statusbar.js +144 -0
  142. package/neural-interface/public/shared/editor/editor-tabs-logic.js +331 -0
  143. package/neural-interface/public/shared/editor/editor-tabs.js +233 -0
  144. package/neural-interface/public/shared/editor/editor-theme.js +244 -0
  145. package/neural-interface/public/shared/editor/editor-view.js +332 -0
  146. package/neural-interface/public/shared/explorer/fx-api.js +216 -0
  147. package/neural-interface/public/shared/explorer/fx-links.js +204 -0
  148. package/neural-interface/public/shared/explorer/fx-logic.js +537 -0
  149. package/neural-interface/public/shared/explorer/fx-main.js +865 -0
  150. package/neural-interface/public/shared/explorer/fx-names.js +87 -0
  151. package/neural-interface/public/shared/explorer/fx-ops.js +370 -0
  152. package/neural-interface/public/shared/explorer/fx-popups.js +490 -0
  153. package/neural-interface/public/shared/explorer/fx-tree.js +790 -0
  154. package/neural-interface/public/shared/file-links.js +339 -0
  155. package/neural-interface/public/shared/greeting/greeting-card.js +178 -0
  156. package/neural-interface/public/shared/greeting/greeting-view.js +148 -0
  157. package/neural-interface/public/shared/html-shell.js +169 -170
  158. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +4 -0
  159. package/neural-interface/public/shared/ocp-v2/ocp-v2-greeting.js +47 -0
  160. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +99 -17
  161. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +7 -1
  162. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +5 -0
  163. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +40 -0
  164. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +3 -2
  165. package/neural-interface/public/shared/pwa-install-page.js +62 -0
  166. package/neural-interface/public/shared/pwa-install.css +12 -0
  167. package/neural-interface/public/shared/pwa-install.js +127 -0
  168. package/neural-interface/public/shared/settings/settings-code-editor-pane.js +412 -0
  169. package/neural-interface/public/shared/settings/settings-code-editor.js +328 -0
  170. package/neural-interface/public/shared/settings/settings-greeting.js +133 -0
  171. package/neural-interface/public/shared/settings/settings-ia.js +18 -4
  172. package/neural-interface/public/shared/settings/settings-rules.js +160 -0
  173. package/neural-interface/public/shared/settings/settings-user-context.js +154 -0
  174. package/neural-interface/public/shared/start-bridge.js +802 -0
  175. package/neural-interface/public/shared/styleguide/sg-colors.js +5 -2
  176. package/neural-interface/public/shared/styleguide/sg-import-export.js +4 -3
  177. package/neural-interface/public/shared/styleguide/sg-kit.js +4 -1
  178. package/neural-interface/public/shared/styleguide/sg-panel.js +9 -1
  179. package/neural-interface/public/shared/styleguide/sg-typography.js +1 -0
  180. package/neural-interface/public/shared/styles.css +2219 -1117
  181. package/neural-interface/public/shared/synabun-mascot.js +20 -56
  182. package/neural-interface/public/shared/term-ready.js +307 -0
  183. package/neural-interface/public/shared/tunnel-view.js +167 -0
  184. package/neural-interface/public/shared/ui-claude-panel.js +160 -19
  185. package/neural-interface/public/shared/ui-command-runner.js +251 -468
  186. package/neural-interface/public/shared/ui-detail.js +15 -0
  187. package/neural-interface/public/shared/ui-explorer.js +22 -0
  188. package/neural-interface/public/shared/ui-file-explorer.js +481 -2496
  189. package/neural-interface/public/shared/ui-file-links.js +103 -0
  190. package/neural-interface/public/shared/ui-help.js +26 -0
  191. package/neural-interface/public/shared/ui-invite.js +126 -116
  192. package/neural-interface/public/shared/ui-judgments.js +1 -1
  193. package/neural-interface/public/shared/ui-keybinds.js +4 -0
  194. package/neural-interface/public/shared/ui-loading.js +367 -12
  195. package/neural-interface/public/shared/ui-menubar.js +21 -55
  196. package/neural-interface/public/shared/ui-native-loop-router-state.js +11 -0
  197. package/neural-interface/public/shared/ui-native-loop-router.js +15 -2
  198. package/neural-interface/public/shared/ui-navbar.js +45 -21
  199. package/neural-interface/public/shared/ui-settings.js +491 -547
  200. package/neural-interface/public/shared/ui-sidepanel-runtime.js +2 -1
  201. package/neural-interface/public/shared/ui-sync.js +16 -0
  202. package/neural-interface/public/shared/ui-terminal.js +153 -149
  203. package/neural-interface/public/shared/ui-tunnel.js +130 -0
  204. package/neural-interface/public/shared/ui-tutorial-steps.js +6 -2
  205. package/neural-interface/public/shared/ui-whiteboard.js +12 -0
  206. package/neural-interface/public/shared/ui-worker-end.js +245 -0
  207. package/neural-interface/public/shared/ui-workspaces.js +41 -27
  208. package/neural-interface/public/shared/worker-end.js +251 -0
  209. package/neural-interface/public/sw.js +3 -1
  210. package/neural-interface/public/variant/2d/main.js +2 -1
  211. package/neural-interface/public/variant/3d/main.js +2 -1
  212. package/neural-interface/public/vendor/codemirror/chunks/apl-CSDKT72Z.js +1 -0
  213. package/neural-interface/public/vendor/codemirror/chunks/asciiarmor-JYYPU5BM.js +1 -0
  214. package/neural-interface/public/vendor/codemirror/chunks/asn1-NRWCZDA6.js +1 -0
  215. package/neural-interface/public/vendor/codemirror/chunks/asterisk-5OU6D4ZQ.js +1 -0
  216. package/neural-interface/public/vendor/codemirror/chunks/brainfuck-ID4N4SYC.js +1 -0
  217. package/neural-interface/public/vendor/codemirror/chunks/chunk-4RZWGCS2.js +1 -0
  218. package/neural-interface/public/vendor/codemirror/chunks/chunk-ACTJM3JR.js +11 -0
  219. package/neural-interface/public/vendor/codemirror/chunks/chunk-S6BMAXLK.js +1 -0
  220. package/neural-interface/public/vendor/codemirror/chunks/chunk-TO2RDOHQ.js +3 -0
  221. package/neural-interface/public/vendor/codemirror/chunks/chunk-US2GMZZQ.js +13 -0
  222. package/neural-interface/public/vendor/codemirror/chunks/chunk-WYYO5ZAJ.js +1 -0
  223. package/neural-interface/public/vendor/codemirror/chunks/chunk-XALZTDJC.js +1 -0
  224. package/neural-interface/public/vendor/codemirror/chunks/chunk-YRNUTRDV.js +1 -0
  225. package/neural-interface/public/vendor/codemirror/chunks/chunk-Z3QOKH62.js +1 -0
  226. package/neural-interface/public/vendor/codemirror/chunks/clike-OWQBSOGL.js +1 -0
  227. package/neural-interface/public/vendor/codemirror/chunks/clojure-KV75UQWC.js +1 -0
  228. package/neural-interface/public/vendor/codemirror/chunks/cmake-GTEP5Y3C.js +1 -0
  229. package/neural-interface/public/vendor/codemirror/chunks/cobol-WCZ7QEGJ.js +1 -0
  230. package/neural-interface/public/vendor/codemirror/chunks/coffeescript-TGLBOT6B.js +1 -0
  231. package/neural-interface/public/vendor/codemirror/chunks/commonlisp-WVVI432V.js +1 -0
  232. package/neural-interface/public/vendor/codemirror/chunks/crystal-S6R6HLKQ.js +1 -0
  233. package/neural-interface/public/vendor/codemirror/chunks/css-PDA2RINP.js +1 -0
  234. package/neural-interface/public/vendor/codemirror/chunks/cypher-HL5QPL4C.js +1 -0
  235. package/neural-interface/public/vendor/codemirror/chunks/d-HHJH2HAJ.js +1 -0
  236. package/neural-interface/public/vendor/codemirror/chunks/diff-MN3A35BY.js +1 -0
  237. package/neural-interface/public/vendor/codemirror/chunks/dist-25SQLBVS.js +3 -0
  238. package/neural-interface/public/vendor/codemirror/chunks/dist-27ZGGJJS.js +1 -0
  239. package/neural-interface/public/vendor/codemirror/chunks/dist-4E52OJIF.js +1 -0
  240. package/neural-interface/public/vendor/codemirror/chunks/dist-6FT73XDC.js +2 -0
  241. package/neural-interface/public/vendor/codemirror/chunks/dist-BE6YGRMW.js +1 -0
  242. package/neural-interface/public/vendor/codemirror/chunks/dist-CJSGKW2O.js +1 -0
  243. package/neural-interface/public/vendor/codemirror/chunks/dist-CRPH2WLI.js +1 -0
  244. package/neural-interface/public/vendor/codemirror/chunks/dist-CTG7JEQN.js +1 -0
  245. package/neural-interface/public/vendor/codemirror/chunks/dist-I3FEVELX.js +1 -0
  246. package/neural-interface/public/vendor/codemirror/chunks/dist-IM5BBSWZ.js +1 -0
  247. package/neural-interface/public/vendor/codemirror/chunks/dist-KERUKTIF.js +1 -0
  248. package/neural-interface/public/vendor/codemirror/chunks/dist-LXTMWZAM.js +1 -0
  249. package/neural-interface/public/vendor/codemirror/chunks/dist-MABASSET.js +1 -0
  250. package/neural-interface/public/vendor/codemirror/chunks/dist-MJVBUZLL.js +3 -0
  251. package/neural-interface/public/vendor/codemirror/chunks/dist-MNB3WZVU.js +1 -0
  252. package/neural-interface/public/vendor/codemirror/chunks/dist-QYWXOE3U.js +7 -0
  253. package/neural-interface/public/vendor/codemirror/chunks/dist-TEBOFWLZ.js +1 -0
  254. package/neural-interface/public/vendor/codemirror/chunks/dist-UNXFROM3.js +1 -0
  255. package/neural-interface/public/vendor/codemirror/chunks/dist-XL2SLQO6.js +1 -0
  256. package/neural-interface/public/vendor/codemirror/chunks/dist-XO42Y3AP.js +6 -0
  257. package/neural-interface/public/vendor/codemirror/chunks/dist-Y2WWDWJK.js +1 -0
  258. package/neural-interface/public/vendor/codemirror/chunks/dist-YFEZKWMU.js +1 -0
  259. package/neural-interface/public/vendor/codemirror/chunks/dist-ZY7SWQO6.js +1 -0
  260. package/neural-interface/public/vendor/codemirror/chunks/dockerfile-3Y4R4NCH.js +1 -0
  261. package/neural-interface/public/vendor/codemirror/chunks/dtd-5343GJ4P.js +1 -0
  262. package/neural-interface/public/vendor/codemirror/chunks/dylan-FI2CXSW2.js +1 -0
  263. package/neural-interface/public/vendor/codemirror/chunks/ebnf-GNQ77YWA.js +1 -0
  264. package/neural-interface/public/vendor/codemirror/chunks/ecl-MRPUAE2L.js +1 -0
  265. package/neural-interface/public/vendor/codemirror/chunks/eiffel-DZROES27.js +1 -0
  266. package/neural-interface/public/vendor/codemirror/chunks/elm-4KICRFKQ.js +1 -0
  267. package/neural-interface/public/vendor/codemirror/chunks/erlang-3IHYC263.js +1 -0
  268. package/neural-interface/public/vendor/codemirror/chunks/factor-C6D3E5UK.js +1 -0
  269. package/neural-interface/public/vendor/codemirror/chunks/fcl-VYTWUJMI.js +1 -0
  270. package/neural-interface/public/vendor/codemirror/chunks/forth-ZBO2EH5M.js +1 -0
  271. package/neural-interface/public/vendor/codemirror/chunks/fortran-5NDCRWIK.js +1 -0
  272. package/neural-interface/public/vendor/codemirror/chunks/gas-SKRMOXFP.js +1 -0
  273. package/neural-interface/public/vendor/codemirror/chunks/gherkin-L45YXZLW.js +1 -0
  274. package/neural-interface/public/vendor/codemirror/chunks/groovy-GLPTLN44.js +1 -0
  275. package/neural-interface/public/vendor/codemirror/chunks/haskell-E7NF7P4Y.js +1 -0
  276. package/neural-interface/public/vendor/codemirror/chunks/haxe-K2NVDOB6.js +1 -0
  277. package/neural-interface/public/vendor/codemirror/chunks/http-Q6DRQIJB.js +1 -0
  278. package/neural-interface/public/vendor/codemirror/chunks/idl-MZYNJVLN.js +1 -0
  279. package/neural-interface/public/vendor/codemirror/chunks/javascript-6YRYK2HR.js +1 -0
  280. package/neural-interface/public/vendor/codemirror/chunks/julia-HXEL2T5G.js +1 -0
  281. package/neural-interface/public/vendor/codemirror/chunks/livescript-MV7CI2JZ.js +1 -0
  282. package/neural-interface/public/vendor/codemirror/chunks/lua-E36NHOOD.js +1 -0
  283. package/neural-interface/public/vendor/codemirror/chunks/mathematica-3XOZZCMC.js +1 -0
  284. package/neural-interface/public/vendor/codemirror/chunks/mbox-ODYGFKS7.js +1 -0
  285. package/neural-interface/public/vendor/codemirror/chunks/mirc-WB43AWF5.js +1 -0
  286. package/neural-interface/public/vendor/codemirror/chunks/mllike-ZT6ET7ZH.js +1 -0
  287. package/neural-interface/public/vendor/codemirror/chunks/modelica-LLMZPFGA.js +1 -0
  288. package/neural-interface/public/vendor/codemirror/chunks/mscgen-2OPNNYFH.js +1 -0
  289. package/neural-interface/public/vendor/codemirror/chunks/mumps-6P3HWJH6.js +1 -0
  290. package/neural-interface/public/vendor/codemirror/chunks/nginx-TCGKQTRW.js +1 -0
  291. package/neural-interface/public/vendor/codemirror/chunks/nsis-ATIGIXTJ.js +1 -0
  292. package/neural-interface/public/vendor/codemirror/chunks/ntriples-5PLBI5OV.js +1 -0
  293. package/neural-interface/public/vendor/codemirror/chunks/octave-QF2S3NL6.js +1 -0
  294. package/neural-interface/public/vendor/codemirror/chunks/oz-JFIVFFH2.js +1 -0
  295. package/neural-interface/public/vendor/codemirror/chunks/pascal-JG6SW76V.js +1 -0
  296. package/neural-interface/public/vendor/codemirror/chunks/perl-4B3IWVVO.js +1 -0
  297. package/neural-interface/public/vendor/codemirror/chunks/pig-ABEBH4MI.js +1 -0
  298. package/neural-interface/public/vendor/codemirror/chunks/powershell-H32XE7TL.js +1 -0
  299. package/neural-interface/public/vendor/codemirror/chunks/properties-NN644MMA.js +1 -0
  300. package/neural-interface/public/vendor/codemirror/chunks/protobuf-YKWQK2J3.js +1 -0
  301. package/neural-interface/public/vendor/codemirror/chunks/pug-RIYXEKFW.js +1 -0
  302. package/neural-interface/public/vendor/codemirror/chunks/puppet-JZQ5WPEV.js +1 -0
  303. package/neural-interface/public/vendor/codemirror/chunks/python-EBCGGHAC.js +1 -0
  304. package/neural-interface/public/vendor/codemirror/chunks/q-5UMH2YQY.js +1 -0
  305. package/neural-interface/public/vendor/codemirror/chunks/r-7XMGG453.js +1 -0
  306. package/neural-interface/public/vendor/codemirror/chunks/rpm-IEV7TSLR.js +1 -0
  307. package/neural-interface/public/vendor/codemirror/chunks/ruby-T4SPFPNM.js +1 -0
  308. package/neural-interface/public/vendor/codemirror/chunks/sas-GEDX67ET.js +1 -0
  309. package/neural-interface/public/vendor/codemirror/chunks/scheme-FTLOWKPC.js +1 -0
  310. package/neural-interface/public/vendor/codemirror/chunks/shell-HUFRKFSJ.js +1 -0
  311. package/neural-interface/public/vendor/codemirror/chunks/sieve-P5QUDVYO.js +1 -0
  312. package/neural-interface/public/vendor/codemirror/chunks/smalltalk-2SORJNQI.js +1 -0
  313. package/neural-interface/public/vendor/codemirror/chunks/solr-M22TGAR5.js +1 -0
  314. package/neural-interface/public/vendor/codemirror/chunks/sparql-4M3KL752.js +1 -0
  315. package/neural-interface/public/vendor/codemirror/chunks/spreadsheet-3K23LA4N.js +1 -0
  316. package/neural-interface/public/vendor/codemirror/chunks/sql-VHRFMUBI.js +1 -0
  317. package/neural-interface/public/vendor/codemirror/chunks/stex-QZDAQUY2.js +1 -0
  318. package/neural-interface/public/vendor/codemirror/chunks/stylus-7ZDKAKBD.js +1 -0
  319. package/neural-interface/public/vendor/codemirror/chunks/swift-WCLCLGMR.js +1 -0
  320. package/neural-interface/public/vendor/codemirror/chunks/tcl-JLMU6WOK.js +1 -0
  321. package/neural-interface/public/vendor/codemirror/chunks/textile-4CHDKZ4T.js +1 -0
  322. package/neural-interface/public/vendor/codemirror/chunks/tiddlywiki-DKMCZZQ4.js +1 -0
  323. package/neural-interface/public/vendor/codemirror/chunks/tiki-F4JIG36Q.js +1 -0
  324. package/neural-interface/public/vendor/codemirror/chunks/toml-BHMHTIM2.js +1 -0
  325. package/neural-interface/public/vendor/codemirror/chunks/troff-YQ2KV5NT.js +1 -0
  326. package/neural-interface/public/vendor/codemirror/chunks/ttcn-ZHRCVFJY.js +1 -0
  327. package/neural-interface/public/vendor/codemirror/chunks/ttcn-cfg-KJOVTY4X.js +1 -0
  328. package/neural-interface/public/vendor/codemirror/chunks/turtle-535P5N6I.js +1 -0
  329. package/neural-interface/public/vendor/codemirror/chunks/vb-76UMQHOT.js +1 -0
  330. package/neural-interface/public/vendor/codemirror/chunks/vbscript-CGNDTK6Z.js +1 -0
  331. package/neural-interface/public/vendor/codemirror/chunks/velocity-VSJDO5T5.js +1 -0
  332. package/neural-interface/public/vendor/codemirror/chunks/verilog-4T6ETXIP.js +1 -0
  333. package/neural-interface/public/vendor/codemirror/chunks/vhdl-T7FNAXUN.js +1 -0
  334. package/neural-interface/public/vendor/codemirror/chunks/webidl-P6MJSJ6J.js +1 -0
  335. package/neural-interface/public/vendor/codemirror/chunks/xquery-UOVILRGN.js +1 -0
  336. package/neural-interface/public/vendor/codemirror/chunks/yacas-CV2APROL.js +1 -0
  337. package/neural-interface/public/vendor/codemirror/chunks/z80-3KFNVM4M.js +1 -0
  338. package/neural-interface/public/vendor/codemirror/codemirror-6.43.14-75f05e67.min.js +2 -0
  339. package/neural-interface/public/vendor/codemirror/manifest.json +60 -0
  340. package/neural-interface/scripts/build-vendor.mjs +78 -2
  341. package/neural-interface/scripts/rebuild-pty.js +15 -12
  342. package/neural-interface/scripts/vendor-codemirror-entry.js +121 -0
  343. package/neural-interface/server.js +1092 -1212
  344. package/neural-interface/templates/rulesets/README.md +1 -1
  345. package/package.json +13 -7
  346. package/postinstall.js +11 -81
  347. package/setup.js +111 -6
  348. package/benchmarks/browser-live-results.json +0 -79
  349. package/benchmarks/browser-v2-results.json +0 -258
  350. package/docs/browser-v2.md +0 -109
  351. package/docs/hook-integrity.md +0 -89
  352. package/docs/judgments.md +0 -182
  353. package/docs/style-guide.md +0 -246
  354. package/neural-interface/lib/codex-capabilities.d.ts +0 -41
  355. package/neural-interface/public/category-logos/claude.svg +0 -1
  356. package/neural-interface/public/category-logos/gemini-color.svg +0 -1
  357. package/neural-interface/public/category-logos/openai.svg +0 -1
  358. package/neural-interface/public/category-logos/synabun.png +0 -0
  359. package/neural-interface/public/claude.svg +0 -1
  360. package/neural-interface/public/gallery.svg +0 -6
  361. package/neural-interface/public/leonardoai.svg +0 -1
  362. package/neural-interface/public/mcp.svg +0 -4
  363. package/neural-interface/public/opencode-logo-dark-square.svg +0 -1
  364. package/neural-interface/public/pin-svgrepo-com.svg +0 -25
  365. package/neural-interface/public/sessionicon.svg +0 -8
  366. package/neural-interface/public/toolbar-album.svg +0 -8
  367. package/neural-interface/public/toolbar-question.svg +0 -6
  368. package/neural-interface/public/toolbar-sessions.svg +0 -6
  369. package/neural-interface/scripts/codex-protocol-fixture.mjs +0 -83
  370. package/scripts/audit-claude-hook-usage.mjs +0 -12
  371. package/scripts/audit-memory-duplicates.mjs +0 -44
  372. package/scripts/measure-claude-hook-overhead.mjs +0 -77
  373. package/scripts/recover-user-config.mjs +0 -254
  374. package/skills/synabun/synabunicon.png +0 -0
@@ -13,6 +13,7 @@ import {
13
13
  } from './cdx-plan.js';
14
14
  import { fetchBlobNamespace, putBlob, deleteBlob, flushBlobs } from '../blob-store.js';
15
15
  import { state as appState, on as appOn } from '../state.js';
16
+ import { forgetGreeting, mountGreeting } from '../greeting/greeting-card.js';
16
17
  import { fetchProjects, searchSessions } from '../api.js';
17
18
  import {
18
19
  getCodexModelName,
@@ -24,6 +25,8 @@ import { syncSidepanelLayout, focusSidepanel, isHostedSessionFocused } from '../
24
25
  import { notify, NOTIF_TYPE } from '../ui-notifications.js';
25
26
  import { createStickyScrollController } from '../ui-scroll-follow.js';
26
27
  import { requestGeneratedSessionTitle } from '../session-title.js';
28
+ import { fileLinkText } from '../ui-file-links.js';
29
+ import { WORKER_END_CLASS, backToAssistant, buildWorkerEndCard, endWorkerRunOnClose, forgetWorkerEnd } from '../ui-worker-end.js';
27
30
  import {
28
31
  CODEX_COMMANDS, CODEX_COMMAND_BY_NAME, parseCodexCommand, codexCommandHints,
29
32
  capabilityAvailability, latestCompletedCodexText, configValue, configRestriction,
@@ -467,6 +470,8 @@ function buildWsCallbacks(tab, options = {}) {
467
470
  clearTranscript();
468
471
  }
469
472
  restoreServerRequests(heldRequests);
473
+ // The history rebuilt the transcript: a dispatched worker's end card goes back at its end.
474
+ placeWorkerEnd(tab);
470
475
  if (options.historyOnly) {
471
476
  tab._automationHydrated = true;
472
477
  closeAutomationHistorySocket(tab);
@@ -1247,6 +1252,7 @@ function writeThreadSnapshot(tab, { force = false } = {}) {
1247
1252
  const accountId = String(tab.accountId || 'default');
1248
1253
  const snapshotNodes = [...messagesEl.children].filter((node) => (
1249
1254
  !node.classList?.contains('cxp-empty') && !node.classList?.contains('cxp-thinking')
1255
+ && !node.classList?.contains(WORKER_END_CLASS)
1250
1256
  ));
1251
1257
  const ownsEveryNode = codexTranscriptNodesHaveOwnership(snapshotNodes, { threadId, accountId });
1252
1258
  if (!ownsEveryNode) {
@@ -1257,6 +1263,8 @@ function writeThreadSnapshot(tab, { force = false } = {}) {
1257
1263
  }
1258
1264
  const snapshotEl = messagesEl.cloneNode(true);
1259
1265
  stripMcpAppRuntime(snapshotEl);
1266
+ // A worker's end card is drawn again from its run, never restored from markup.
1267
+ snapshotEl.querySelectorAll(`.${WORKER_END_CLASS}`).forEach((node) => node.remove());
1260
1268
  const html = snapshotEl.innerHTML || '';
1261
1269
  if (!html.trim()) return;
1262
1270
  const ownedItemNodes = snapshotNodes.filter((node) => node.dataset?.itemId);
@@ -1506,6 +1514,11 @@ function storedAutoAccept() {
1506
1514
  function releaseAutomationForManualUse(tab = _boundTab) {
1507
1515
  const runId = detachTerminalCodexAutomation(tab, storedAutoAccept());
1508
1516
  if (!runId) return false;
1517
+ // While the tab still shows the run's thread, the dock's Focus on the run raises it (cdx-panel.js).
1518
+ tab.releasedRunId = runId;
1519
+ forgetWorkerEnd(runId);
1520
+ tab._workerEnd = null;
1521
+ placeWorkerEnd(tab);
1509
1522
  window.dispatchEvent(new CustomEvent('native-loop:dismissed', { detail: { runId } }));
1510
1523
  if (isActiveTab(tab)) syncToolbarState();
1511
1524
  saveTabs();
@@ -2843,6 +2856,7 @@ export function createTab(saved = {}, { autoSwitch = true } = {}) {
2843
2856
  automationRunId,
2844
2857
  automationActive: !!saved.automationActive,
2845
2858
  automationOwnerId: saved.automationOwnerId || null,
2859
+ releasedRunId: automationRunId ? null : (saved.releasedRunId || null),
2846
2860
  };
2847
2861
  tab.messagesEl = createMessagesEl(tab);
2848
2862
  tab.pillEl = createTrayPill(tab);
@@ -2870,15 +2884,18 @@ export function closeTab(idx, { detachAutomation = false } = {}) {
2870
2884
  const tab = _tabs[idx];
2871
2885
  teardownMcpApps(tab, 'Tab closed');
2872
2886
  if (tab.automationRunId && !detachAutomation) {
2887
+ const runId = tab.automationRunId;
2873
2888
  window.dispatchEvent(new CustomEvent('native-loop:dismissed', {
2874
- detail: { runId: tab.automationRunId },
2889
+ detail: { runId },
2875
2890
  }));
2876
- fetch('/api/loop/stop', {
2891
+ // A worker that finished its task is completed; any other run is stopped.
2892
+ endWorkerRunOnClose(runId, () => fetch('/api/loop/stop', {
2877
2893
  method: 'POST',
2878
2894
  headers: { 'Content-Type': 'application/json' },
2879
- body: JSON.stringify({ runId: tab.automationRunId }),
2880
- }).catch(() => {});
2895
+ body: JSON.stringify({ runId }),
2896
+ }).catch(() => {}));
2881
2897
  }
2898
+ if (tab.automationRunId) forgetWorkerEnd(tab.automationRunId);
2882
2899
  wsDisconnectTab(tab, { releaseWriter: !tabHasActiveWriterWork(tab) });
2883
2900
  tab.closed = true;
2884
2901
  tab.titleRequestController?.abort();
@@ -2923,6 +2940,31 @@ export function closeTab(idx, { detachAutomation = false } = {}) {
2923
2940
  saveTabs();
2924
2941
  }
2925
2942
 
2943
+ /**
2944
+ * The end of a worker the Assistant dispatched (ui-worker-end.js), as
2945
+ * `tab._workerEnd` says it: one card, the last node of the transcript, put
2946
+ * back after a history render and never in a snapshot. Its button closes the
2947
+ * tab the way the X does (a warm worker that finished its task is completed,
2948
+ * one still at work is stopped; its record stays for the Assistant) and shows
2949
+ * the Assistant session that dispatched it.
2950
+ */
2951
+ export function placeWorkerEnd(tab) {
2952
+ const messagesEl = tab?.messagesEl;
2953
+ if (!messagesEl || tab.closed) return;
2954
+ messagesEl.querySelectorAll(`:scope > .${WORKER_END_CLASS}`).forEach((node) => node.remove());
2955
+ const view = tab._workerEnd;
2956
+ if (!view) return;
2957
+ messagesEl.appendChild(buildWorkerEndCard(view, {
2958
+ classes: { card: 'cxp-worker-end', title: 'cxp-post-plan-header', detail: 'cxp-post-plan-note', button: 'cxp-request-btn' },
2959
+ onBack: () => {
2960
+ const idx = _tabs.indexOf(tab);
2961
+ if (idx >= 0) closeTab(idx);
2962
+ backToAssistant(view.assistantSessionId);
2963
+ },
2964
+ }));
2965
+ if (isActiveTab(tab)) scrollEnd(true);
2966
+ }
2967
+
2926
2968
  export function saveTabs() {
2927
2969
  try {
2928
2970
  commitBoundState();
@@ -2977,6 +3019,7 @@ export function saveTabs() {
2977
3019
  automationRunId: tab.automationRunId || null,
2978
3020
  automationActive: !!tab.automationActive,
2979
3021
  automationOwnerId: tab.automationOwnerId || null,
3022
+ releasedRunId: tab.releasedRunId || null,
2980
3023
  };
2981
3024
  });
2982
3025
  const localRunIds = new Set(localTabs.map((tab) => tab.automationRunId).filter(Boolean));
@@ -3097,6 +3140,34 @@ export function updateTrayPillRunning() {
3097
3140
  }
3098
3141
 
3099
3142
 
3143
+ // ── Greeting (shared/greeting/, lib/greeting/) ──
3144
+ // What SynaBun says when a person comes back and opens a new thread: one or two sentences in the
3145
+ // empty state, written by SynaBun ahead of time (the thread's model never greets). Only for the
3146
+ // bound tab while it holds no thread and shows no automation run; the short wait lets a tab that
3147
+ // was made for a run, or is restoring a thread, say so first. Its id goes back with the first
3148
+ // prompt (`greetingId`), so the model is told once what was said.
3149
+ function offerGreetingSoon() {
3150
+ const tab = _boundTab;
3151
+ if (!tab) return;
3152
+ setTimeout(() => { try { offerGreeting(tab); } catch { /* a thread always opens */ } }, 300);
3153
+ }
3154
+ function offerGreeting(tab) {
3155
+ if (tab !== _boundTab || tab.closed || _threadId || _running || _startingThread || tab.automationActive || tab.automationRunId) return;
3156
+ const host = _messagesEl?.querySelector(':scope > .cxp-empty');
3157
+ if (!host || host.style.display === 'none') return;
3158
+ // "Restoring Codex thread…" / "Starting fresh Codex thread…": not an idle new thread.
3159
+ if (host.querySelector('.cxp-empty-status')?.textContent) return;
3160
+ const key = () => `${tab.id}.${tab.greetSeq || 0}`;
3161
+ const session = key();
3162
+ mountGreeting(host, {
3163
+ surface: 'codex-panel', session, cwd: _project || tab.project || '',
3164
+ onOpenMemory: (id) => { if (id) emit('memory:open', { id }); },
3165
+ isCurrent: () => tab === _boundTab && !_threadId && session === key() && !!_messagesEl?.contains(host),
3166
+ }).then((greeting) => {
3167
+ if (session === key()) tab.greeting = greeting ? { id: greeting.id, session } : null;
3168
+ }).catch(() => {});
3169
+ }
3170
+
3100
3171
  // ── Thread state (lines 4711-5000) ──
3101
3172
  function hideEmpty() {
3102
3173
  const empty = _messagesEl?.querySelector('.cxp-empty');
@@ -3125,6 +3196,7 @@ export function clearTranscript(emptyText = freshThreadText()) {
3125
3196
  for (const child of [..._messagesEl.children]) retireMcpAppNode(child, () => child.remove());
3126
3197
  _messagesEl.insertAdjacentHTML('afterbegin', `<div class="cxp-empty"><div class="cxp-empty-logo">${OPENAI_ICON}</div><span class="cxp-empty-name">Codex</span><span class="cxp-empty-status"></span></div>`);
3127
3198
  document.dispatchEvent(new CustomEvent('cdx-empty-rebuilt'));
3199
+ if (!emptyText) offerGreetingSoon();
3128
3200
  _items.clear();
3129
3201
  _requestCards.clear();
3130
3202
  _blockingServerRequests = new Map();
@@ -3285,6 +3357,8 @@ export function resetThreadState({ tone = 'ready', preserveStatus = false } = {}
3285
3357
  clearPostCompactionState(_boundTab, { updateTranscript: false });
3286
3358
  setSessionLabel('New session', { persist: false });
3287
3359
  if (!preserveStatus) setStatus(_project ? 'Fresh thread ready' : 'Select a project', tone);
3360
+ // A new thread in the same tab is a new opening for the greeting.
3361
+ if (_boundTab) { _boundTab.greetSeq = (_boundTab.greetSeq || 0) + 1; _boundTab.greeting = null; }
3288
3362
  clearTranscript();
3289
3363
  syncInputEnabled();
3290
3364
  syncSessionControls();
@@ -4954,6 +5028,14 @@ export function dispatchPrompt(prompt, { tab = activeTab(), images = null, paths
4954
5028
  };
4955
5029
  if (tab?.model) msg.model = tab.model;
4956
5030
  if (tab?.effort && tab.effort !== 'off') msg.effort = tab.effort;
5031
+ // A person's own turn: the greeting engine keeps when they were last here. The greeting this
5032
+ // tab opened with goes back once, with the first prompt of its new thread.
5033
+ msg.human = true;
5034
+ if (tab?.greeting?.id) {
5035
+ if (msg.fresh) msg.greetingId = tab.greeting.id;
5036
+ forgetGreeting('codex-panel', tab.greeting.session);
5037
+ tab.greeting = null;
5038
+ }
4957
5039
  if (imageList.length) {
4958
5040
  msg.images = imageList;
4959
5041
  }
@@ -7929,6 +8011,7 @@ export function initContextBridge() {
7929
8011
  withRequestTab: withTab,
7930
8012
  sendSocket,
7931
8013
  emit,
8014
+ fileLinkText,
7932
8015
  activeTab,
7933
8016
  isActiveTab,
7934
8017
  dispatchPrompt,
@@ -0,0 +1,30 @@
1
+ // Pure library selection; saved command text and user ordering stay untouched.
2
+ const normalize = value => String(value ?? '').normalize('NFD').replace(/[\u0300-\u036f]/g, '').toLocaleLowerCase();
3
+ const byOrder = (a, b) => (a.order ?? 0) - (b.order ?? 0);
4
+ const lastRun = command => Number(command.lastRunAt) || 0;
5
+
6
+ export function selectCommandGroups(data, { query = '', categoryId = '', sort = 'saved' } = {}) {
7
+ const terms = normalize(query).trim().split(/\s+/).filter(Boolean);
8
+ const groups = [...data.categories].sort(byOrder)
9
+ .filter(category => !categoryId || category.id === categoryId)
10
+ .map(category => {
11
+ const commands = data.commands.filter(command => {
12
+ if (command.categoryId !== category.id) return false;
13
+ const text = normalize([command.name, command.command, command.cwd, category.name].join(' '));
14
+ return terms.every(term => text.includes(term));
15
+ }).sort(sort === 'recent' ? (a, b) => lastRun(b) - lastRun(a) || byOrder(a, b) : byOrder);
16
+ return { category, commands };
17
+ }).filter(group => !terms.length || group.commands.length);
18
+ if (sort === 'recent') groups.sort((a, b) =>
19
+ Math.max(0, ...b.commands.map(lastRun)) - Math.max(0, ...a.commands.map(lastRun)) || byOrder(a.category, b.category));
20
+ return groups;
21
+ }
22
+
23
+ export function commandLaunchPayload(command) {
24
+ return { command: command.command, cwd: command.cwd || null, label: command.name };
25
+ }
26
+
27
+ // Internet connectivity does not gate commands served by the local workspace.
28
+ export function isCommandLaunchAvailable(online, hostname) {
29
+ return online !== false || ['localhost', '127.0.0.1', '[::1]', '::1'].includes(hostname);
30
+ }
@@ -64,6 +64,7 @@ export const KEYS = {
64
64
  WORKSPACES: 'neural-workspaces',
65
65
  ACTIVE_WORKSPACE: 'neural-active-workspace', // sessionStorage
66
66
  GRID_SNAP: 'neural-grid-snap',
67
+ TOPRIGHT_TOOLS_HIDDEN: 'neural-topright-tools-hidden', // the workspace tools toggle is off ('true')
67
68
  CATEGORIES_VISIBLE: 'neural-categories-visible',
68
69
  WHITEBOARD: 'neural-whiteboard',
69
70
  WHITEBOARD_RULESET_ALERT_DISMISSED: 'neural-whiteboard-ruleset-alert-dismissed',
@@ -85,6 +86,10 @@ export const KEYS = {
85
86
  FILE_EXPLORER_SORT: 'neural-file-explorer-sort',
86
87
  FILE_EXPLORER_PROJECT: 'neural-file-explorer-project',
87
88
  FILE_EXPLORER_FOLDER_COLORS: 'neural-file-explorer-folder-colors',
89
+ // Per project: the open folders, the selection, the scroll position, "changed only" (shared/explorer/fx-main.js).
90
+ FILE_EXPLORER_TREE: 'neural-file-explorer-tree',
91
+ // Code editor — open tabs per project { v, projects: { [path]: { at, active, tabs: [{ path, pinned, anchor, head, top, dirty }] } } }
92
+ EDITOR_TABS: 'neural-editor-tabs',
88
93
  ACTIVE_SKIN: 'neural-active-skin',
89
94
  COST_WIDGET_POS: 'neural-cost-widget-pos',
90
95
  COST_WIDGET_COLLAPSED: 'neural-cost-widget-collapsed',
@@ -97,6 +102,7 @@ export const KEYS = {
97
102
  ASSISTANT_DOCK_OPEN: 'neural-assistant-dock-open',
98
103
  ASSISTANT_DOCK_SHOW_ALL:'neural-assistant-dock-show-all',
99
104
  ASSISTANT_ROUTE_MODE: 'neural-assistant-route-mode', // last-used route mode (always-ask|ask-unsure|never)
105
+ ASSISTANT_TEST_DENSITY: 'neural-assistant-test-density', // last-used test density (none|light|standard|thorough)
100
106
  // Assistant sidepanel — open tabs {v:1, activeIdx, tabs:[{sessionId,label,userRenamed}]}
101
107
  ASSISTANT_PANEL_TABS: 'synabun-assistant-panel-tabs',
102
108
  };
@@ -141,7 +147,6 @@ export const KEYBIND_META = {
141
147
  'toggle-explorer': { label: 'Toggle Explorer', group: 'Navigation' },
142
148
  'toggle-focus-mode': { label: 'Toggle Focus Mode', group: 'Navigation' },
143
149
  'toggle-minimap': { label: 'Toggle Minimap', group: 'View' },
144
- 'toggle-toolbar': { label: 'Hide All Toolbars', group: 'View' },
145
150
  'open-settings': { label: 'Open Settings', group: 'Settings' },
146
151
  'open-keybinds': { label: 'Open Keybinds', group: 'Settings' },
147
152
  'launch-assistant': { label: 'Assistant', group: 'Launch App', icon: 'assistant' },
@@ -14,7 +14,8 @@
14
14
 
15
15
  import { pagerState } from './cp-restore.js';
16
16
 
17
- const STALE_ROWS = '.thinking, .msg-permission-prompt, .post-plan-card';
17
+ // (A worker's end card is drawn again from its run: ui-worker-end.js.)
18
+ const STALE_ROWS = '.thinking, .msg-permission-prompt, .post-plan-card, .worker-end-card';
18
19
  const STALE_PROMPTS = '.cp-plan-approval-card.active-perm, .perm-card.active-perm, .cp-rewind-confirm';
19
20
  const SELF_WIRED_CARDS = '.tool-card.cp-bash-card, .tool-card.cp-diff-card, .tool-card.cp-agent-card';
20
21
 
@@ -346,4 +346,19 @@ a.cp-chip:hover { text-decoration: underline; }
346
346
  .cp-ctxpop-copy { padding: 0; border: none; background: none; font: inherit; line-height: 20px; cursor: pointer; }
347
347
  .cp-ctxpop-copy:hover, .cp-ctxpop-copy.cp-ctxpop-copied { color: rgba(220,195,140,0.9); }
348
348
  .cp-ctxpop-btn:focus-visible, .cp-ctxpop-link:focus-visible, .cp-ctxpop-copy:focus-visible { outline: 1px solid rgba(255,255,255,0.45); outline-offset: 2px; }
349
+
350
+ /* ═══ A dispatched worker's end (ui-worker-end.js) ═══
351
+ The post-plan card's frame, header and primary action, in the transcript column. The title says the state in
352
+ words; its colour is the panel's success / warning / error. */
353
+ .cp-messages .cp-worker-end { margin: 8px 14px 10px 48px; padding: 8px 10px; border: 1px solid rgba(255,255,255,0.07); border-radius: 8px; background: rgba(255,255,255,0.02); }
354
+ .cp-worker-end .post-plan-header { margin-bottom: 4px; }
355
+ .cp-worker-end[data-tone="ok"] .post-plan-header { color: #5fcf83; }
356
+ .cp-worker-end[data-tone="warn"] .post-plan-header { color: #e0a33e; }
357
+ .cp-worker-end[data-tone="err"] .post-plan-header { color: #ef7070; }
358
+ .cp-worker-end .worker-end-detail { font: 11.5px/1.55 Inter, sans-serif; color: var(--t-secondary); overflow-wrap: anywhere; }
359
+ .cp-worker-end .worker-end-meta { margin-top: 4px; font: 9.5px/1.5 'JetBrains Mono', monospace; color: rgba(255,255,255,0.28); }
360
+ .cp-worker-end .worker-end-note { margin-top: 4px; font: 10.5px/1.5 Inter, sans-serif; color: var(--t-muted); }
361
+ .cp-worker-end .post-plan-actions { margin-top: 8px; }
362
+ .cp-worker-end .post-plan-action:disabled { opacity: 0.45; cursor: default; }
363
+ .cp-worker-end .post-plan-action:focus-visible { outline: 1px solid rgba(255,255,255,0.45); outline-offset: 2px; }
349
364
  `;