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,4 @@
1
+ import { cxpText, cxpSessionLabel } from './cdx-copy.js';
1
2
  import { mountCodexSettings } from './cdx-settings.js';
2
3
  import { t } from '../i18n.js';
3
4
  import { getCliState, isCliInstalling } from '../cli-status.js';
@@ -15,6 +16,7 @@ import '../account-i18n.js';
15
16
  import { restoreMcpAppCards, teardownMcpApps, retireMcpAppNode, stripMcpAppRuntime } from './cdx-mcp-app-host.js';
16
17
  import { renderTurnDiff, completeTurnOutputs } from './cdx-render.js';
17
18
  import { hydrateOutputControls } from './cdx-output.js';
19
+ import { sanitizeStoredHtml } from '../assistant/asst-sanitize.js';
18
20
  import {
19
21
  beginPlanTurn, capturePlanItem, finishPlanTurn, getPlanMarkdown, syncPlanMirrors, recordPlanTurn,
20
22
  migrateLegacyPlan, recoverPlanFromHistory, planBelongsToTab, useMessageAsPlan,
@@ -30,6 +32,7 @@ import {
30
32
  } from '../agent-runtime-options.js';
31
33
  import { CodexModelCatalog, codexModelAccountKey, codexContextAvailability } from './cdx-model-catalog.js';
32
34
  import { nativeLoopWindowId } from '../ui-native-window-id.js';
35
+ import { skillHintEntries, skillsForPrompt, skillsListRequest } from './cdx-skill-hints.js';
33
36
  import { syncSidepanelLayout, focusSidepanel, isHostedSessionFocused } from '../ui-sidepanel-windows.js';
34
37
  import { notify, NOTIF_TYPE } from '../ui-notifications.js';
35
38
  import { createStickyScrollController } from '../ui-scroll-follow.js';
@@ -297,7 +300,6 @@ function buildWsCallbacks(tab, options = {}) {
297
300
  userVerification: true,
298
301
  windowId: windowId,
299
302
  accountId: _accountId || 'default',
300
- mcpProfile: tab.mcpProfile || null,
301
303
  ...codexRuntimeSelection(tab),
302
304
  });
303
305
  } else {
@@ -309,7 +311,6 @@ function buildWsCallbacks(tab, options = {}) {
309
311
  threadId: _threadId || null,
310
312
  cwd: _project || null,
311
313
  accountId: _accountId || 'default',
312
- mcpProfile: tab.mcpProfile || null,
313
314
  ...codexRuntimeSelection(tab),
314
315
  });
315
316
  }
@@ -368,7 +369,6 @@ function buildWsCallbacks(tab, options = {}) {
368
369
  _accountId = msg.accountId;
369
370
  if (_boundTab) _boundTab.accountId = _accountId;
370
371
  }
371
- if (msg.mcpProfile && _boundTab) _boundTab.mcpProfile = msg.mcpProfile;
372
372
  // A reattached app-server can still have a different process-active
373
373
  // thread. Preserve the tab's displayed thread instead of adopting it.
374
374
  _threadId = _threadId || msg.threadId || null;
@@ -378,6 +378,9 @@ function buildWsCallbacks(tab, options = {}) {
378
378
  if (_boundTab) _boundTab.running = true;
379
379
  setStatus('Resuming…', 'working');
380
380
  resetStallTimer();
381
+ // The turn it found is still at work: so is the tab's pill (the panel may be hidden, the tab in the background).
382
+ updateTrayPillRunning();
383
+ renderPills();
381
384
  } else if (msg.running === false && (!msg.threadId || String(msg.threadId) === String(_threadId || ''))) {
382
385
  // A plan can finish while disconnected. The server's idle reply
383
386
  // releases the stale running/query state before history recovery.
@@ -391,7 +394,6 @@ function buildWsCallbacks(tab, options = {}) {
391
394
  threadId: _threadId || null,
392
395
  cwd: _project || null,
393
396
  accountId: _accountId || 'default',
394
- mcpProfile: tab.mcpProfile || null,
395
397
  ...codexRuntimeSelection(tab),
396
398
  });
397
399
  } else {
@@ -404,7 +406,6 @@ function buildWsCallbacks(tab, options = {}) {
404
406
  threadId: _threadId || null,
405
407
  cwd: _project || null,
406
408
  accountId: _accountId || 'default',
407
- mcpProfile: tab.mcpProfile || null,
408
409
  ...codexRuntimeSelection(tab),
409
410
  });
410
411
  }
@@ -422,10 +423,6 @@ function buildWsCallbacks(tab, options = {}) {
422
423
  restoreMcpAppCards(_messagesEl, { tab: _boundTab, items: _items, request: requestSocketPayloadForTab, draft: setMcpAppDraft });
423
424
  if (_boundTab) _boundTab.bootstrapped = true;
424
425
  ensureCodexTerminalAuth(tab);
425
- if (msg.mcpProfile && _boundTab) {
426
- _boundTab.mcpProfile = msg.mcpProfile;
427
- if (activeTab() === _boundTab) _onActiveTabChanged?.(_boundTab);
428
- }
429
426
  if (Object.prototype.hasOwnProperty.call(msg, 'threadId')) {
430
427
  _threadId = msg.threadId || null;
431
428
  if (_boundTab) _boundTab.threadId = _threadId;
@@ -589,20 +586,17 @@ function buildWsCallbacks(tab, options = {}) {
589
586
  },
590
587
 
591
588
  onInterruptAck(msg) {
592
- _running = false;
593
- _activeTurnId = null;
594
- if (_boundTab) {
595
- _boundTab.running = false;
596
- _boundTab.activeTurnId = null;
597
- if (_boundTab._abortRetry) {
598
- clearTimeout(_boundTab._abortRetry);
599
- _boundTab._abortRetry = null;
600
- }
589
+ if (_boundTab?._abortRetry) {
590
+ clearTimeout(_boundTab._abortRetry);
591
+ _boundTab._abortRetry = null;
601
592
  }
602
593
  clearInterruptTimer();
603
- stopStallTimer();
594
+ // A prompt sent after the Stop has a turn of its own: the ack is not about it.
595
+ if (!interruptAckEndsTurn(_boundTab)) return;
596
+ // The stopped turn is over: the tab, its pill and the saved tabs say so (setRunning), even
597
+ // when something marked it working again before the ack came back.
598
+ setRunning(false);
604
599
  setStatus('Interrupted', 'muted');
605
- syncInputEnabled();
606
600
  syncSessionControls();
607
601
  releaseInactiveIdleTab(_boundTab);
608
602
  },
@@ -693,11 +687,6 @@ function buildWsCallbacks(tab, options = {}) {
693
687
  }
694
688
  renderStatusChrome();
695
689
  }
696
- if (msg.type === 'mcp_profile_changed' && msg.profile) {
697
- if (_boundTab) _boundTab.mcpProfile = msg.profile;
698
- if (activeTab() === _boundTab) _onActiveTabChanged?.(_boundTab);
699
- saveTabs();
700
- }
701
690
  if (msg.type === 'mcp_approval_updated' && msg.name) {
702
691
  const server = _mcpServers.get(msg.name);
703
692
  if (server) {
@@ -847,6 +836,9 @@ let _interruptRetried = false;
847
836
  let _prevInputTokens = 0;
848
837
  let _skillsCache = null;
849
838
  let _skillsPromise = null;
839
+ // A skills:changed arrived since the list was last read: the next skills_list asks the app-server to reload its skills
840
+ // (cdx-skill-hints.js skillsListRequest).
841
+ let _skillsChanged = false;
850
842
  let _blockingServerRequests = new Map();
851
843
  let _bufferedSocketMessages = [];
852
844
 
@@ -959,6 +951,7 @@ function rememberBlockingServerRequest(requestId, method, params = {}) {
959
951
  if (_boundTab) _boundTab.blockingServerRequests = _blockingServerRequests;
960
952
  syncWorkStatus();
961
953
  syncInputEnabled();
954
+ updateTrayPillRunning(); // the pill needs you
962
955
  saveTabs();
963
956
  }
964
957
 
@@ -968,6 +961,7 @@ function clearBlockingServerRequest(requestId, { flushBuffered = true } = {}) {
968
961
  if (_boundTab) _boundTab.blockingServerRequests = _blockingServerRequests;
969
962
  syncWorkStatus();
970
963
  syncInputEnabled();
964
+ updateTrayPillRunning();
971
965
  saveTabs();
972
966
  if (flushBuffered && !hasBlockingServerRequests()) flushBufferedSocketMessages();
973
967
  releaseInactiveIdleTab(_boundTab);
@@ -985,6 +979,7 @@ function clearAllBlockingServerRequests() {
985
979
  }
986
980
  syncWorkStatus();
987
981
  syncInputEnabled();
982
+ updateTrayPillRunning();
988
983
  }
989
984
 
990
985
  function shouldBufferSocketMessage(kind, payload) {
@@ -1064,6 +1059,11 @@ function applySocketError(msg) {
1064
1059
 
1065
1060
  function applySocketClosed() {
1066
1061
  appendSystem('Codex session closed', 'muted');
1062
+ // The app-server ran the turn: it exited, the turn went with it (the server forgot it too).
1063
+ if (_running) {
1064
+ setRunning(false);
1065
+ setStatus('Codex session closed', 'muted');
1066
+ }
1067
1067
  }
1068
1068
 
1069
1069
  function applyBufferedSocketMessage(entry) {
@@ -1459,7 +1459,7 @@ let _hljs = null;
1459
1459
 
1460
1460
  (async () => {
1461
1461
  try {
1462
- const mod = await import('https://cdn.jsdelivr.net/npm/marked@14/lib/marked.esm.js').catch(() => null);
1462
+ const mod = await import('/vendor/marked/marked-14.1.4.esm.js').catch(() => null);
1463
1463
  if (mod) {
1464
1464
  _marked = mod.marked || mod.default;
1465
1465
  if (_marked?.setOptions) _marked.setOptions({ breaks: true, gfm: true });
@@ -1471,10 +1471,10 @@ let _hljs = null;
1471
1471
  try {
1472
1472
  const link = document.createElement('link');
1473
1473
  link.rel = 'stylesheet';
1474
- link.href = 'https://cdn.jsdelivr.net/npm/highlight.js@11/styles/github-dark-dimmed.min.css';
1474
+ link.href = '/vendor/highlight/github-dark-dimmed-11.12.0.min.css';
1475
1475
  document.head.appendChild(link);
1476
1476
  const script = document.createElement('script');
1477
- script.src = 'https://cdn.jsdelivr.net/npm/highlight.js@11/lib/highlight.min.js';
1477
+ script.src = '/vendor/highlight/highlight-11.12.0.min.js';
1478
1478
  script.onload = () => { _hljs = window.hljs || null; };
1479
1479
  document.head.appendChild(script);
1480
1480
  } catch {}
@@ -1852,14 +1852,19 @@ async function restoreCanonicalPlan(tab, thread) {
1852
1852
  }
1853
1853
 
1854
1854
  // ── Formatting & helpers (lines 1148-1421) ──
1855
+ function codexStatusText(status) {
1856
+ const known = {"pending": "pending", "completed": "completed", "complete": "complete", "inProgress": "in progress", "failed": "failed", "declined": "declined"};
1857
+ return Object.hasOwn(known, status) ? cxpText(`status_${status}`, known[status]) : status;
1858
+ }
1859
+
1855
1860
  export function formatStatus(status) {
1856
- if (!status) return 'pending';
1857
- if (typeof status === 'string') return status;
1861
+ if (!status) return codexStatusText('pending');
1862
+ if (typeof status === 'string') return codexStatusText(status);
1858
1863
  if (typeof status === 'object') {
1859
1864
  const [key, val] = Object.entries(status)[0] || [];
1860
- if (!key) return 'pending';
1861
- if (val && typeof val === 'object' && val.message) return `${key}: ${val.message}`;
1862
- return key;
1865
+ if (!key) return codexStatusText('pending');
1866
+ if (val && typeof val === 'object' && val.message) return `${codexStatusText(key)}: ${val.message}`;
1867
+ return codexStatusText(key);
1863
1868
  }
1864
1869
  return String(status);
1865
1870
  }
@@ -2417,14 +2422,26 @@ export function restoreActiveBinding(fallbackState) {
2417
2422
  else restoreBoundState(fallbackState);
2418
2423
  }
2419
2424
 
2425
+ // How many withTab calls are under way. The outermost one hands the binding back to the active tab; a
2426
+ // nested one hands it back to the tab the call around it bound, with what that call had done so far
2427
+ // written to it first. (The history of a tab in the background renders while another tab is shown, and
2428
+ // a nested withTab in it used to leave the rest of that history to the shown tab: its held approvals
2429
+ // were looked up there and never came back.)
2430
+ let _withTabDepth = 0;
2431
+
2420
2432
  export function withTab(tab, fn) {
2421
2433
  const prev = snapshotBoundState();
2434
+ const outer = _withTabDepth > 0 ? _boundTab : null;
2435
+ if (outer) commitBoundState();
2436
+ _withTabDepth += 1;
2422
2437
  bindTabState(tab);
2423
2438
  try {
2424
2439
  return fn();
2425
2440
  } finally {
2426
2441
  commitBoundState();
2427
- restoreActiveBinding(prev);
2442
+ _withTabDepth -= 1;
2443
+ if (outer) bindTabState(outer);
2444
+ else restoreActiveBinding(prev);
2428
2445
  }
2429
2446
  }
2430
2447
 
@@ -2436,10 +2453,10 @@ export function setSessionLabel(label, { persist = true } = {}) {
2436
2453
  }
2437
2454
  if (isActiveTab(_boundTab)) {
2438
2455
  const labelEl = panelEl('#cxp-session-label');
2439
- if (labelEl) labelEl.replaceChildren(document.createTextNode(_sessionLabel));
2456
+ if (labelEl) labelEl.replaceChildren(document.createTextNode(cxpSessionLabel(_sessionLabel)));
2440
2457
  // The whole name, for when the header shows only part of it.
2441
2458
  const sessionBtn = panelEl('#cxp-session-btn');
2442
- if (sessionBtn) sessionBtn.title = _sessionLabel;
2459
+ if (sessionBtn) sessionBtn.title = cxpSessionLabel(_sessionLabel);
2443
2460
  syncLegacyState();
2444
2461
  }
2445
2462
  updateTrayPillLabel();
@@ -2487,6 +2504,11 @@ function scheduleCodexTitleReassert(tab) {
2487
2504
 
2488
2505
  function applyCodexProviderTitle(title) {
2489
2506
  const tab = _boundTab;
2507
+ // Dispatch metadata owns the panel label; reading history must never rename the provider thread.
2508
+ if (tab?.automationRunId) {
2509
+ setSessionLabel(tab.automationTitle || tab.sessionLabel);
2510
+ return;
2511
+ }
2490
2512
  const incoming = normalizeSessionLabel(title || '');
2491
2513
  const desiredTitle = normalizeSessionLabel(tab?.pendingSessionLabel || tab?.sessionLabel || '');
2492
2514
  const authoritative = tab
@@ -2676,12 +2698,16 @@ function createTrayPill(tab) {
2676
2698
  export function renderPills() {
2677
2699
  const active = activeTab();
2678
2700
  for (const tab of _tabs) {
2679
- if (!tab.pillEl?.isConnected) tab.pillEl = createTrayPill(tab);
2701
+ if (!tab.pillEl?.isConnected) {
2702
+ tab.pillEl = createTrayPill(tab);
2703
+ // The bound tab's own reference too, or its running state would go on reaching the old node.
2704
+ if (tab === _boundTab) _trayPill = tab.pillEl;
2705
+ }
2680
2706
  if (!tab.pillEl) continue;
2681
2707
  // Read directly from tab to avoid nested withTab clobbering uncommitted state
2682
2708
  const label = tab.pillEl.querySelector('.term-minimized-pill-label');
2683
2709
  if (label) label.textContent = tab.sessionLabel || 'New session';
2684
- tab.pillEl.classList.toggle('cxp-pill-running', !!(tab.running || tab.startingThread));
2710
+ paintTrayPill(tab.pillEl, tab);
2685
2711
  const shouldShow = hasMeaningfulTrayState(tab) && (!_getVisible() || tab !== active);
2686
2712
  tab.pillEl.style.display = shouldShow ? '' : 'none';
2687
2713
  }
@@ -2763,7 +2789,6 @@ export function createTab(saved = {}, { autoSwitch = true } = {}) {
2763
2789
  const inheritedAccountId = saved.accountId ?? activeTab()?.accountId ?? 'default';
2764
2790
  const inheritedEffort = saved.effort ?? activeTab()?.effort ?? (storage.getItem(STOR.effort) || 'off');
2765
2791
  const inheritedAutoAccept = codexNewTabAutoAccept(saved, activeTab(), storedAutoAccept());
2766
- const inheritedMcpProfile = saved.mcpProfile ?? null;
2767
2792
  const automationRunId = saved.automationRunId || null;
2768
2793
  const inheritedPlanMode = automationRunId ? false : (saved.planMode ?? activeTab()?.planMode ?? false);
2769
2794
  const hasExplicitTitle = !!title && !['new session', 'saved session', 'untitled session', 'codex'].includes(title.toLowerCase());
@@ -2791,7 +2816,6 @@ export function createTab(saved = {}, { autoSwitch = true } = {}) {
2791
2816
  extendedContextVerificationArmed: false,
2792
2817
  effort: inheritedEffort,
2793
2818
  autoAccept: inheritedAutoAccept,
2794
- mcpProfile: inheritedMcpProfile,
2795
2819
  planMode: inheritedPlanMode,
2796
2820
  sessionListRequest: null,
2797
2821
  threadStartRequest: null,
@@ -2873,7 +2897,9 @@ export function createTab(saved = {}, { autoSwitch = true } = {}) {
2873
2897
  isolationRejections: {},
2874
2898
  ownedThreadIds: new Set(),
2875
2899
  automationRunId,
2900
+ automationTitle: automationRunId ? (saved.automationTitle || title || '') : '',
2876
2901
  automationActive: !!saved.automationActive,
2902
+ automationAwaits: false, // the run's turn ended asking the user (runAwaitsAnswer, set by its attach): the pill needs you
2877
2903
  automationOwnerId: saved.automationOwnerId || null,
2878
2904
  releasedRunId: automationRunId ? null : (saved.releasedRunId || null),
2879
2905
  };
@@ -3013,7 +3039,6 @@ export function saveTabs() {
3013
3039
  contextMode: normalizeCodexContextMode(tab.contextMode),
3014
3040
  effort: tab.effort || 'off',
3015
3041
  autoAccept: !!tab.autoAccept,
3016
- mcpProfile: tab.mcpProfile || null,
3017
3042
  planMode: !!tab.planMode,
3018
3043
  planFilePath: tab.planFilePath || '',
3019
3044
  planContent: tab.planContent || '',
@@ -3036,9 +3061,17 @@ export function saveTabs() {
3036
3061
  postCompactionPending: tab.postCompactionPromptSource === 'manual' && !!tab.postCompactionPending,
3037
3062
  postCompactionPromptSource: tab.postCompactionPromptSource === 'manual' ? 'manual' : '',
3038
3063
  automationRunId: tab.automationRunId || null,
3064
+ automationTitle: tab.automationTitle || '',
3039
3065
  automationActive: !!tab.automationActive,
3040
3066
  automationOwnerId: tab.automationOwnerId || null,
3041
3067
  releasedRunId: tab.releasedRunId || null,
3068
+ // Whether it was working when this was written: after a reload its placeholder pill says so and
3069
+ // the panel boots to ask (ui-sidepanel-tray.js), and the tab reattaches at once (restoreTabs).
3070
+ // Never restored as running: only the reattach's answer says that. `needsYou`: an approval or a
3071
+ // question card waited on the user; the reattach replays the request the bridge still holds.
3072
+ running: !!tab.running,
3073
+ startingThread: !!tab.startingThread,
3074
+ needsYou: tab.blockingServerRequests?.size > 0 || !!tab.automationAwaits,
3042
3075
  };
3043
3076
  });
3044
3077
  const localRunIds = new Set(localTabs.map((tab) => tab.automationRunId).filter(Boolean));
@@ -3125,9 +3158,11 @@ export function restoreTabs() {
3125
3158
  if (raw) {
3126
3159
  const data = JSON.parse(raw);
3127
3160
  if (Array.isArray(data?.tabs) && data.tabs.length) {
3161
+ const wereWorking = [];
3128
3162
  for (const saved of data.tabs) {
3129
3163
  if (saved.automationActive && saved.automationOwnerId !== nativeLoopWindowId) continue;
3130
- createTab(saved, { autoSwitch: false });
3164
+ const tab = createTab(saved, { autoSwitch: false });
3165
+ if (tab && !tab.automationRunId && (saved.running || saved.startingThread || saved.needsYou)) wereWorking.push(tab);
3131
3166
  }
3132
3167
  if (!_tabs.length) throw new Error('No restorable Codex tabs');
3133
3168
  _activeTabIdx = Math.min(Math.max(Number(data.activeIdx) || 0, 0), _tabs.length - 1);
@@ -3135,6 +3170,11 @@ export function restoreTabs() {
3135
3170
  if (!_tabs.length) throw new Error('No restorable Codex tabs');
3136
3171
  updateActiveTabView();
3137
3172
  saveTabs();
3173
+ // A tab that was working when the page went away asks after its turn now, hidden or in the
3174
+ // background (a restored tab reattaches first: its turn outlives the page on the server), so
3175
+ // its pill says what the thread does. An idle one is let go again once it is ready
3176
+ // (releaseInactiveIdleTab); idle tabs stay unconnected until they are shown.
3177
+ for (const tab of wereWorking) if (_tabs.includes(tab) && !tab.ws) connectTab(tab);
3138
3178
  return;
3139
3179
  }
3140
3180
  }
@@ -3158,8 +3198,47 @@ export function updateTrayPillLabel() {
3158
3198
  if (label) label.textContent = _sessionLabel;
3159
3199
  }
3160
3200
 
3201
+ /**
3202
+ * What a tab's tray pill says: it needs you while an approval or a question card waits on your answer
3203
+ * (its blocking server requests), or, for a dispatched worker, while its turn ended asking you something
3204
+ * (the run's outcome: automationAwaits), else it works while a turn runs or a thread is being made.
3205
+ * sidepanel-session-status.js reads the same classes for a detached window's pill.
3206
+ */
3207
+ function paintTrayPill(pill, { running, startingThread, blockingServerRequests, automationAwaits }) {
3208
+ if (!pill) return;
3209
+ const needsYou = blockingServerRequests?.size > 0 || !!automationAwaits;
3210
+ pill.classList.toggle('cxp-pill-attention', needsYou);
3211
+ pill.classList.toggle('cxp-pill-running', !needsYou && !!(running || startingThread));
3212
+ }
3213
+
3161
3214
  export function updateTrayPillRunning() {
3162
- _trayPill?.classList.toggle('cxp-pill-running', !!(_running || _startingThread));
3215
+ paintTrayPill(_trayPill, {
3216
+ running: _running, startingThread: _startingThread, blockingServerRequests: _blockingServerRequests, automationAwaits: _boundTab?.automationAwaits,
3217
+ });
3218
+ }
3219
+
3220
+ /**
3221
+ * The bound tab's work ended (or began) outside setRunning: the tab, its pill and the saved tabs say
3222
+ * so now. The tab is written first: renderPills and saveTabs read it, never the bound copy, and a
3223
+ * nested withTab binds the tab again from it (withTab itself writes it back only when it returns).
3224
+ */
3225
+ function publishWorkState() {
3226
+ if (_boundTab) {
3227
+ _boundTab.running = _running;
3228
+ _boundTab.startingThread = _startingThread;
3229
+ }
3230
+ updateTrayPillRunning();
3231
+ renderPills();
3232
+ saveTabs();
3233
+ }
3234
+
3235
+ /**
3236
+ * Whether a Stop's ack ends the tab's running state: not once a prompt was sent after that Stop
3237
+ * (dispatchPrompt counts them, interruptTab notes the count it stopped at), whose turn is its own.
3238
+ */
3239
+ function interruptAckEndsTurn(tab) {
3240
+ if (!tab || tab.interruptedAtPrompt == null) return true;
3241
+ return (tab.promptCount || 0) === tab.interruptedAtPrompt;
3163
3242
  }
3164
3243
 
3165
3244
 
@@ -3258,6 +3337,7 @@ export function clearTranscript(emptyText = freshThreadText()) {
3258
3337
  showEmpty(emptyText);
3259
3338
  setCompactingUI(false);
3260
3339
  renderStatusChrome();
3340
+ updateTrayPillRunning(); // (its request cards went with the transcript)
3261
3341
  }
3262
3342
 
3263
3343
  export function renderStoredTranscript(snapshot, emptyText = freshThreadText()) {
@@ -3267,7 +3347,10 @@ export function renderStoredTranscript(snapshot, emptyText = freshThreadText())
3267
3347
 
3268
3348
  clearTranscript(emptyText);
3269
3349
  _messagesEl.querySelectorAll(':scope > .cxp-empty').forEach(node => node.remove());
3270
- _messagesEl.insertAdjacentHTML('beforeend', normalized.html);
3350
+ // A snapshot is the transcript's own markup, saved and read back from storage, and a build before the panel
3351
+ // sanitised its Markdown saved model HTML in it as it was: it is rebuilt from the stored-transcript allowlist
3352
+ // (asst-sanitize.js, the sanitiser live output goes through) before it reaches the page.
3353
+ _messagesEl.append(sanitizeStoredHtml(normalized.html));
3271
3354
  const acceptedItemIds = new Set(normalized.acceptedItemIds);
3272
3355
  const acceptedTurnIds = new Set(normalized.acceptedTurnIds);
3273
3356
  const restoredNodes = [..._messagesEl.children].filter((node) => (
@@ -3365,6 +3448,11 @@ export function resetThreadState({ tone = 'ready', preserveStatus = false } = {}
3365
3448
  _running = false;
3366
3449
  _startingThread = false;
3367
3450
  if (_boundTab) {
3451
+ // On the tab at once: clearPlanHandoffState below binds the tab again (updatePostPlanTranscriptMeta's
3452
+ // withTab), which read its old running state back over these and saved the reset tab as working.
3453
+ _boundTab.running = false;
3454
+ _boundTab.startingThread = false;
3455
+ _boundTab.activeTurnId = null;
3368
3456
  _boundTab.ownedThreadIds = new Set();
3369
3457
  _boundTab.expectedThreadId = null;
3370
3458
  _boundTab.expectedThreadRequestId = null;
@@ -3385,8 +3473,7 @@ export function resetThreadState({ tone = 'ready', preserveStatus = false } = {}
3385
3473
  clearTranscript();
3386
3474
  syncInputEnabled();
3387
3475
  syncSessionControls();
3388
- renderPills();
3389
- saveTabs();
3476
+ publishWorkState();
3390
3477
  }
3391
3478
 
3392
3479
  export function setActiveProject(projectPath, { reset = true, preserveStatus = false, tone = 'ready' } = {}) {
@@ -3433,7 +3520,7 @@ export function setThread(thread) {
3433
3520
  _freshThread = false;
3434
3521
  // History and a new thread carry the provider's name or, without one, the
3435
3522
  // first prompt. A name the user gave stays, and is sent to the provider again.
3436
- if (_boundTab?.titleByUser && hasCustomSessionLabel(_boundTab)) {
3523
+ if (_boundTab?.automationRunId || (_boundTab?.titleByUser && hasCustomSessionLabel(_boundTab))) {
3437
3524
  applyCodexProviderTitle(getThreadLabel(thread, _sessionLabel || 'New session'));
3438
3525
  } else {
3439
3526
  setSessionLabel(getThreadLabel(thread, 'New session'));
@@ -3577,12 +3664,12 @@ async function startNewThread(tab = activeTab()) {
3577
3664
  } finally {
3578
3665
  if (!tab.closed) withTab(tab, () => {
3579
3666
  _startingThread = false;
3667
+ // The tab first, then what reads it (the pill, the saved tabs, the toolbar): renderPills
3668
+ // used to find it still starting and put the running class back on the pill.
3669
+ publishWorkState();
3580
3670
  syncInputEnabled();
3581
3671
  syncToolbarState();
3582
3672
  syncSessionControls();
3583
- updateTrayPillRunning();
3584
- renderPills();
3585
- saveTabs();
3586
3673
  releaseInactiveIdleTab(tab);
3587
3674
  });
3588
3675
  }
@@ -4438,7 +4525,7 @@ export function promptNameNewSession() {
4438
4525
  <div class="cxp-name-modal-row">
4439
4526
  <label class="cxp-name-modal-label">Project</label>
4440
4527
  <select class="cxp-name-modal-select" data-role="project">
4441
- ${projectOptions.map(p => `<option value="${String(p.value).replace(/"/g, '&quot;')}">${p.label}</option>`).join('')}
4528
+ ${projectOptions.map(p => `<option value="${esc(p.value)}">${esc(p.label)}</option>`).join('')}
4442
4529
  </select>
4443
4530
  </div>
4444
4531
  <div class="cxp-name-modal-row">
@@ -4476,7 +4563,8 @@ export function promptNameNewSession() {
4476
4563
  branchSel.innerHTML = '<option value="">(none)</option>';
4477
4564
  branchSel.disabled = true;
4478
4565
  } else {
4479
- branchSel.innerHTML = branches.map(b => `<option value="${b.replace(/"/g, '&quot;')}">${b}</option>`).join('');
4566
+ // A branch name is the repository's (an agent can make one): text, never markup.
4567
+ branchSel.innerHTML = branches.map(b => `<option value="${esc(b)}">${esc(b)}</option>`).join('');
4480
4568
  if (branchOriginal) branchSel.value = branchOriginal;
4481
4569
  branchSel.disabled = false;
4482
4570
  }
@@ -5052,6 +5140,10 @@ export function dispatchPrompt(prompt, { tab = activeTab(), images = null, paths
5052
5140
  };
5053
5141
  if (tab?.model) msg.model = tab.model;
5054
5142
  if (tab?.effort && tab.effort !== 'off') msg.effort = tab.effort;
5143
+ // A native skill picked from the hints (SK-050): sent as Codex's own skill input, once.
5144
+ const nativeSkills = skillsForPrompt(inputText, tab?.pendingSkill);
5145
+ if (nativeSkills.length) msg.skills = nativeSkills;
5146
+ if (tab) tab.pendingSkill = null;
5055
5147
  // A person's own turn: the greeting engine keeps when they were last here. The greeting this
5056
5148
  // tab opened with goes back once, with the first prompt of its new thread.
5057
5149
  msg.human = true;
@@ -5078,6 +5170,8 @@ export function dispatchPrompt(prompt, { tab = activeTab(), images = null, paths
5078
5170
  }
5079
5171
  if (tab) {
5080
5172
  tab.extendedContextVerificationArmed = normalizeCodexContextMode(tab.contextMode) === 'extended';
5173
+ // A Stop's late ack must not end this prompt's turn (interruptAckEndsTurn).
5174
+ tab.promptCount = (tab.promptCount || 0) + 1;
5081
5175
  }
5082
5176
  requestCodexSessionTitle(tab, inputText, {
5083
5177
  paths: [...pathList, ...mentionList.map((mention) => mention.path).filter(Boolean)],
@@ -5417,7 +5511,8 @@ export function handleNotify(method, params) {
5417
5511
  flushPostCompactionPrompt(_boundTab);
5418
5512
  }
5419
5513
  if (_boundTab?.providerTitleDirty) scheduleCodexTitleReassert(_boundTab);
5420
- if (!shouldHoldForPlanApproval(_boundTab)) advanceQueue();
5514
+ // The queue of the tab whose turn this was, never the one on screen.
5515
+ if (!shouldHoldForPlanApproval(tab)) advanceQueue(tab);
5421
5516
  releaseInactiveIdleTab(tab);
5422
5517
  }
5423
5518
  break;
@@ -5877,7 +5972,7 @@ export function syncToolbarState() {
5877
5972
  effortBtn.title = `Reasoning effort: ${selected?.label || effort}`;
5878
5973
  effortBtn.classList.toggle('active', effort !== 'off');
5879
5974
  const label = effortBtn.querySelector('.cxp-btn-label');
5880
- if (label) label.textContent = effort === 'off' ? 'Effort' : (selected?.label || effort);
5975
+ if (label) label.textContent = effort === 'off' ? cxpText('effortLabel', 'Effort') : cxpText(`effort_${effort}`, selected?.label || effort);
5881
5976
  const dots = effortBtn.querySelectorAll('.cxp-effort-dots i');
5882
5977
  const litCount = Math.max(0, options.findIndex((option) => option.id === effort));
5883
5978
  dots.forEach((d, i) => d.classList.toggle('lit', i < litCount));
@@ -5908,7 +6003,7 @@ export function syncToolbarState() {
5908
6003
  contextBtn.disabled = !!(tab?.running || tab?.startingThread || tab?.compacting)
5909
6004
  || (mode !== 'extended' && !supportsExtended);
5910
6005
  const label = contextBtn.querySelector('.cxp-btn-label');
5911
- if (label) label.textContent = mode === 'extended' ? 'Extended' : 'Default';
6006
+ if (label) label.textContent = mode === 'extended' ? cxpText('extended', 'Extended') : cxpText('default', 'Default');
5912
6007
  if (availability.reason) {
5913
6008
  contextBtn.title = availability.reason;
5914
6009
  } else if (mode !== 'extended') {
@@ -6130,6 +6225,7 @@ export function interruptTab(tab = activeTab()) {
6130
6225
  clearTimeout(tab._abortRetry);
6131
6226
  tab._abortRetry = null;
6132
6227
  }
6228
+ tab.interruptedAtPrompt = tab.promptCount || 0;
6133
6229
  sendSocket({ type: 'interrupt', sessionId: tab.id, threadId });
6134
6230
  tab._abortRetry = setTimeout(() => {
6135
6231
  tab._abortRetry = null;
@@ -6160,6 +6256,7 @@ export function interruptAllTabs() {
6160
6256
  const ws = tab.ws;
6161
6257
  const threadId = tab.threadId || null;
6162
6258
  if (ws && ws.readyState === 1) {
6259
+ tab.interruptedAtPrompt = tab.promptCount || 0;
6163
6260
  try {
6164
6261
  ws.send(JSON.stringify({
6165
6262
  type: 'interrupt',
@@ -6935,6 +7032,14 @@ export function steerActiveTurn() {
6935
7032
  return true;
6936
7033
  }
6937
7034
 
7035
+ /**
7036
+ * Whether `tab` has a turn running. The bound tab's is the module's own state (the freshest: withTab
7037
+ * writes it back to the tab only when it returns); any other tab's is its own.
7038
+ */
7039
+ function tabTurnRunning(tab) {
7040
+ return tab === _boundTab ? _running : !!tab?.running;
7041
+ }
7042
+
6938
7043
  export function syncQueueTray() {
6939
7044
  const tab = activeTab();
6940
7045
  if (!tab) return;
@@ -6952,7 +7057,8 @@ export function syncQueueTray() {
6952
7057
  if (hint) {
6953
7058
  hint.textContent = count > 0
6954
7059
  ? `${count} message${count > 1 ? 's' : ''} queued${tab.queuePaused ? ' (paused)' : ''}. Enter steers. Tab queues the next turn.`
6955
- : _running
7060
+ // The tab on screen's turn, not the bound tab's (a tab working in the background is bound while its events run).
7061
+ : tabTurnRunning(tab)
6956
7062
  ? 'Enter steers the active turn. Tab queues the next turn. Shift+Enter inserts a newline.'
6957
7063
  : 'Enter sends. Shift+Enter inserts a newline.';
6958
7064
  }
@@ -7012,7 +7118,7 @@ export function toggleQueuePause() {
7012
7118
  if (!tab) return;
7013
7119
  tab.queuePaused = !tab.queuePaused;
7014
7120
  syncQueueTray();
7015
- if (!tab.queuePaused) advanceQueue();
7121
+ if (!tab.queuePaused) advanceQueue(tab);
7016
7122
  saveTabs();
7017
7123
  }
7018
7124
 
@@ -7024,11 +7130,17 @@ export function clearQueue() {
7024
7130
  saveTabs();
7025
7131
  }
7026
7132
 
7027
- export function advanceQueue() {
7028
- const tab = activeTab();
7029
- if (!tab || _running || tab.queuePaused || !tab.queue.length || hasBlockingServerRequests() || shouldHoldForPlanApproval(tab)) return;
7133
+ /**
7134
+ * Send the next prompt queued in `tab`, the tab it was typed in, on that tab's own connection and
7135
+ * thread: a background tab whose turn ends advances its own queue, never the one on screen (the
7136
+ * module state is the bound tab's, so the tab is bound first).
7137
+ */
7138
+ export function advanceQueue(tab = activeTab()) {
7139
+ if (!tab || tab.closed) return false;
7140
+ if (_boundTab !== tab) return withTab(tab, () => advanceQueue(tab));
7141
+ if (_running || tab.queuePaused || !tab.queue?.length || hasBlockingServerRequests() || shouldHoldForPlanApproval(tab)) return false;
7030
7142
  const next = tab.queue.shift();
7031
- if (!next) return;
7143
+ if (!next) return false;
7032
7144
  if (tab.planMode) {
7033
7145
  preparePlanModeTurn(tab);
7034
7146
  }
@@ -7040,13 +7152,19 @@ export function advanceQueue() {
7040
7152
  mentions: next.mentions || [],
7041
7153
  forcePlanModePrefix: tab.planMode,
7042
7154
  });
7043
- if (!sent) return;
7155
+ if (!sent) {
7156
+ // Not sent: it stays first in its tab's queue.
7157
+ tab.queue.unshift(next);
7158
+ syncQueueTray();
7159
+ return false;
7160
+ }
7044
7161
  // Render queued user message immediately with images
7045
7162
  if (queueImages?.length) {
7046
7163
  appendLocalUserMessage(next.text || '', queueImages);
7047
7164
  tab._pendingSendImages = queueImages;
7048
7165
  }
7049
7166
  syncQueueTray();
7167
+ return true;
7050
7168
  }
7051
7169
 
7052
7170
  // ── Phase 2: Image attachments ──
@@ -7101,6 +7219,15 @@ export function renderImageStrip() {
7101
7219
  // ── Whiteboard "Send to Panel" — receive image via event bus ──
7102
7220
  // Any window or surface changed a Codex account (signed in or out, a key, its mode, renamed, added,
7103
7221
  // removed): the menu re-reads the list, and the tabs on that account re-check sign-in.
7222
+ // A skill was installed, removed or changed (Skills Studio, Settings, an agent): the app-server is asked to reload its
7223
+ // skills at once (it does not watch the folders itself), so the hints and the thread's skills are current before the
7224
+ // next "/" is typed.
7225
+ appOn('sync:skills:changed', () => {
7226
+ _skillsCache = null; _skillsPromise = null; _skillsChanged = true;
7227
+ if (!activeTab()) return;
7228
+ _skillsPromise = loadSlashCommands().catch(() => {}).finally(() => { _skillsPromise = null; });
7229
+ });
7230
+
7104
7231
  appOn('sync:codex:accounts-changed', (msg = {}) => {
7105
7232
  refreshCodexAccounts().catch(() => {});
7106
7233
  for (const tab of _tabs) if (!msg.accountId || serverAccountId(tab.accountId) === msg.accountId) void tab.terminalAuthView?.refresh();
@@ -7377,16 +7504,12 @@ export async function loadSlashCommands() {
7377
7504
  if (!tab) return commands;
7378
7505
  const capabilities = await getCodexCapabilities(tab);
7379
7506
  commands = codexCommandHints(capabilities);
7380
- const data = await requestSocketPayloadForTab(tab, 'skills_list', { cwds: tab.project ? [tab.project] : [] });
7507
+ const reload = _skillsChanged;
7508
+ const data = await requestSocketPayloadForTab(tab, 'skills_list', skillsListRequest(tab, reload));
7509
+ if (reload) _skillsChanged = false;
7381
7510
  const seen = new Set(BUILTIN_SLASH_COMMANDS.map((entry) => entry.cmd));
7382
- const skillCommands = flattenNativeCatalog(data, 'skills')
7383
- .filter((skill) => skill.enabled !== false)
7384
- .map((skill) => ({
7385
- cmd: '/' + String(skill.name || skill.dirName || '').trim(),
7386
- desc: String(skill.description || '').trim(),
7387
- }))
7388
- .filter((skill) => skill.cmd !== '/' && !seen.has(skill.cmd))
7389
- .sort((a, b) => a.cmd.localeCompare(b.cmd));
7511
+ // Each native skill keeps its SKILL.md path: picking it sends Codex's own skill input (cdx-skill-hints.js).
7512
+ const skillCommands = skillHintEntries(flattenNativeCatalog(data, 'skills'), seen);
7390
7513
  _skillsCache = [...commands, ...skillCommands];
7391
7514
  } catch {
7392
7515
  _skillsCache = commands;
@@ -7449,15 +7572,19 @@ export function showSlashHints(text) {
7449
7572
  descSpan.className = 'cxp-slash-hint-desc';
7450
7573
  descSpan.textContent = c.desc;
7451
7574
  item.append(cmdSpan, descSpan);
7452
- item.addEventListener('click', () => selectSlashHint(c.cmd));
7575
+ item._hint = c;
7576
+ item.addEventListener('click', () => selectSlashHint(c.cmd, c));
7453
7577
  hintsEl.appendChild(item);
7454
7578
  });
7455
7579
  }
7456
7580
 
7457
- export function selectSlashHint(cmd) {
7581
+ export function selectSlashHint(cmd, hint = null) {
7458
7582
  const input = panelEl('#cxp-input');
7459
7583
  hideComposerHints();
7460
7584
  if (!input) return;
7585
+ // A native skill picked here goes as Codex's own skill input with the prompt, while the prompt starts with it.
7586
+ const pickTab = activeTab();
7587
+ if (pickTab) pickTab.pendingSkill = hint?.skill ? { cmd: hint.cmd, name: hint.skill.name, path: hint.skill.path } : null;
7461
7588
  const command = CODEX_COMMAND_BY_NAME.get(String(cmd).replace(/^\//, ''));
7462
7589
  if (command?.name === 'model') {
7463
7590
  panelEl('#cxp-model')?.classList.toggle('open');
@@ -7495,7 +7622,7 @@ export function confirmSlashHint() {
7495
7622
  return true;
7496
7623
  }
7497
7624
  const cmdEl = items[_slashActiveIdx]?.querySelector('.cxp-slash-hint-cmd');
7498
- if (cmdEl) selectSlashHint(cmdEl.textContent);
7625
+ if (cmdEl) selectSlashHint(cmdEl.textContent, items[_slashActiveIdx]._hint || null);
7499
7626
  return true;
7500
7627
  }
7501
7628