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
@@ -0,0 +1,550 @@
1
+ // The app's custom dropdown (DESIGN.md "Settings custom dropdown", `.cc-dropdown`): a hidden
2
+ // <input id> holds the value, a trigger button shows the choice, a menu lists the choices.
3
+ // settings-kit.js dropdown() writes the same markup for Settings; this module writes it with its
4
+ // ARIA and drives every dropdown under a root from one set of listeners, so markup drawn again
5
+ // with innerHTML needs no wiring of its own.
6
+ //
7
+ // Every dropdown in SynaBun is this one: a native <select> is not allowed (tests/no-native-select.test.mjs).
8
+ // Adding one, as the Schedules window (ui-schedules-studio.js) does:
9
+ // 1. Markup: dropdownHTML(id, [{ value, label, selected }], { labelledBy }); in Settings, settings-kit.js dropdown().
10
+ // 2. Wiring: wireDropdowns(container, { signal }) once; markup drawn later needs nothing more.
11
+ // 3. Reading: the hidden input's `.value`, and its `change` event (it bubbles), as with a <select>.
12
+ // 4. Changing: setDropdownItems(input, entries), setDropdownValue(input, value), setDropdownDisabled(input, on).
13
+ // 5. Focusing it or marking it invalid: controlOf(input) is its trigger.
14
+ //
15
+ // To the code around it, it reads like a <select>: the input's `.value` is the choice, and a
16
+ // choice the user makes fires `input` and `change` on the input (bubbling). Choices are
17
+ // `{ value, label, selected, disabled }` (labels are text), or `{ group, options }` for a heading.
18
+ // The chosen one is the last marked `selected`, else the first that is not disabled: a <select>'s
19
+ // rule, so a list rebuilt from saved data shows what was saved. setDropdownItems() is
20
+ // `select.innerHTML = …`, setDropdownValue() is `select.value = …`; neither fires an event.
21
+ //
22
+ // Keyboard and ARIA are the WAI-ARIA select-only combobox: the focus stays on the trigger and the
23
+ // highlighted option is its aria-activedescendant. Enter, Space or an arrow opens; arrows, Home,
24
+ // End, Page Up/Down and typing move; Enter or Space chooses; Escape closes without a change; Tab
25
+ // closes and moves on, the choice as it was. An open menu is placed `fixed` against its trigger,
26
+ // so a scrolling pane never cuts it off, and kept inside the box that clips it (a window).
27
+
28
+ import { placementArea } from './app-frame.js';
29
+
30
+ const ARROW = '<svg class="cc-dropdown-arrow" viewBox="0 0 24 24" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>';
31
+ const GAP = 4; // between the trigger and its menu
32
+ const EDGE = 6; // the least room left between a menu and the edge of what clips it
33
+ const PAGE = 10; // options a Page Up/Down moves
34
+ const TYPE_PAUSE = 500; // ms between keys that still extend a type-ahead search
35
+
36
+ const esc = (value) => String(value ?? '').replace(/[&<>"']/g, (c) => ({
37
+ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;',
38
+ }[c]));
39
+
40
+ // ── What decides (no DOM) ──
41
+
42
+ /** The options of a list of entries, headings left out, in their order. */
43
+ export function flatOptions(entries) {
44
+ const out = [];
45
+ for (const entry of entries || []) {
46
+ if (entry && Array.isArray(entry.options)) out.push(...entry.options.filter(Boolean));
47
+ else if (entry) out.push(entry);
48
+ }
49
+ return out;
50
+ }
51
+
52
+ /** The chosen option as a <select> picks it: the last marked selected, else the first enabled; -1 for none. */
53
+ export function chosenIndex(options) {
54
+ let last = -1;
55
+ options.forEach((option, i) => { if (option.selected) last = i; });
56
+ return last >= 0 ? last : options.findIndex(option => !option.disabled);
57
+ }
58
+
59
+ /** The first or last option that is not disabled; -1 for none. */
60
+ export function edgeIndex(options, which) {
61
+ if (which === 'first') return options.findIndex(option => !option.disabled);
62
+ for (let i = options.length - 1; i >= 0; i--) if (!options[i].disabled) return i;
63
+ return -1;
64
+ }
65
+
66
+ /** `steps` enabled options away from `from` (negative: up), stopping at the ends. From none, the first or last. */
67
+ export function stepIndex(options, from, steps) {
68
+ if (from < 0 || from >= options.length) return edgeIndex(options, steps < 0 ? 'last' : 'first');
69
+ const dir = Math.sign(steps) || 1;
70
+ let left = Math.abs(steps) || 1;
71
+ let found = from;
72
+ for (let i = from + dir; i >= 0 && i < options.length; i += dir) {
73
+ if (options[i].disabled) continue;
74
+ found = i;
75
+ if (--left === 0) break;
76
+ }
77
+ return found;
78
+ }
79
+
80
+ /**
81
+ * Type-ahead: the option whose label starts with what was typed, searching on from the highlighted
82
+ * one and round. One letter typed again moves on to the next option with that letter, as a <select> does.
83
+ */
84
+ export function matchIndex(options, typed, from = -1) {
85
+ const query = String(typed || '').toLocaleLowerCase();
86
+ if (!query) return -1;
87
+ const repeated = [...query].every(c => c === query[0]);
88
+ const needle = repeated ? query[0] : query;
89
+ const n = options.length;
90
+ const start = repeated ? from + 1 : Math.max(from, 0);
91
+ for (let k = 0; k < n; k++) {
92
+ const i = (((start + k) % n) + n) % n;
93
+ const option = options[i];
94
+ if (!option.disabled && String(option.label ?? '').trim().toLocaleLowerCase().startsWith(needle)) return i;
95
+ }
96
+ return -1;
97
+ }
98
+
99
+ /** Multi-choice values in menu order. Disabled selected rows are mandatory. */
100
+ export function multipleValues(options) {
101
+ const exclusive = options.find(o => o.selected && o.exclusive && !o.scope);
102
+ if (exclusive) return [String(exclusive.value ?? '')];
103
+ const scoped = new Set(options.filter(o => o.selected && o.exclusive && o.scope).map(o => o.scope));
104
+ return options.filter(o => o.selected && (!scoped.has(o.scope) || o.exclusive)).map(o => String(o.value ?? ''));
105
+ }
106
+
107
+ /** Exclusive rows may apply globally (inheritance) or within a named section. */
108
+ export function toggleMultiple(options, values, index) {
109
+ const option = options[index];
110
+ if (!option || option.disabled) return [...values];
111
+ if (option.exclusive && !option.scope) return [String(option.value ?? '')];
112
+ const selected = new Set(values);
113
+ for (const row of options) {
114
+ if ((row.exclusive && !row.scope) || (option.exclusive && row.scope === option.scope) || (!option.exclusive && row.exclusive && row.scope === option.scope)) selected.delete(String(row.value ?? ''));
115
+ }
116
+ const value = String(option.value ?? '');
117
+ if (option.exclusive) selected.add(value);
118
+ else if (selected.has(value)) selected.delete(value); else selected.add(value);
119
+ return multipleValues(options.map(row => ({ ...row, selected: selected.has(String(row.value ?? '')) || (!option.exclusive && row.disabled && row.selected) })));
120
+ }
121
+
122
+ const multipleText = (options, values) => options.filter(o => values.includes(String(o.value ?? '')))
123
+ .map(o => o.label).join(', ');
124
+
125
+ // ── Markup ──
126
+
127
+ function optionHTML(id, option, index, chosen) {
128
+ const label = String(option.label ?? '');
129
+ const active = Array.isArray(chosen) ? (chosen.includes(String(option.value ?? '')) || (option.automatic && option.selected)) : index === chosen;
130
+ return `<div class="cc-dropdown-item${active ? ' active' : ''}" id="${esc(id)}-opt-${index}" role="option" aria-selected="${active}"`
131
+ + `${option.disabled ? ' aria-disabled="true"' : ''} data-value="${esc(option.value ?? '')}" data-index="${index}"${option.exclusive ? ' data-exclusive="true"' : ''}${option.scope ? ` data-scope="${esc(option.scope)}"` : ''}${option.automatic ? ' data-automatic="true"' : ''} data-label="${esc(label)}" title="${esc(option.caption || label)}">${Array.isArray(chosen) ? '<span class="cc-dropdown-check" aria-hidden="true"></span>' : ''}<span>${esc(label)}${option.caption ? `<small class="cc-dropdown-caption">${esc(option.caption)}</small>` : ''}</span></div>`;
132
+ }
133
+
134
+ /** The menu's options (and headings) for `entries`, the `chosen` index marked. */
135
+ export function menuHTML(id, entries, chosen = chosenIndex(flatOptions(entries))) {
136
+ let index = 0;
137
+ let group = 0;
138
+ return (entries || []).filter(Boolean).map((entry) => {
139
+ if (!Array.isArray(entry.options)) return optionHTML(id, entry, index++, chosen);
140
+ const headId = `${id}-grp-${group++}`;
141
+ const options = entry.options.filter(Boolean).map(option => optionHTML(id, option, index++, chosen)).join('');
142
+ return `<div class="cc-dropdown-optgroup" role="group" aria-labelledby="${esc(headId)}"><div class="cc-dropdown-group" id="${esc(headId)}" role="presentation">${esc(entry.group ?? '')}</div>${options}</div>`;
143
+ }).join('');
144
+ }
145
+
146
+ /**
147
+ * A dropdown: the hidden input (`id`, with `inputAttrs`) and the `.cc-dropdown` it belongs to.
148
+ * Name it with `labelledBy` (the id of its visible label) or `label`. `classes` and `attrs` go on
149
+ * the `.cc-dropdown`.
150
+ */
151
+ export function dropdownHTML(id, entries, { classes = '', labelledBy = '', label = '', attrs = '', inputAttrs = '', disabled = false, multiple = false, summary = '' } = {}) {
152
+ const options = flatOptions(entries);
153
+ const chosen = multiple ? multipleValues(options) : chosenIndex(options);
154
+ const current = chosen >= 0 ? options[chosen] : null;
155
+ const name = labelledBy ? ` aria-labelledby="${esc(labelledBy)}"` : label ? ` aria-label="${esc(label)}"` : '';
156
+ const text = multiple ? (summary || multipleText(options, chosen)) : String(current?.label ?? '');
157
+ return `<input type="hidden" id="${esc(id)}" value="${esc(multiple ? chosen.join(',') : current?.value ?? '')}"${disabled ? ' disabled' : ''}${inputAttrs ? ` ${inputAttrs}` : ''}>`
158
+ + `<div class="cc-dropdown${classes ? ` ${classes}` : ''}${disabled ? ' disabled' : ''}" data-for="${esc(id)}"${multiple ? ' data-multiple="true"' : ''}${attrs ? ` ${attrs}` : ''}>`
159
+ + `<button type="button" class="cc-dropdown-trigger" id="${esc(id)}-trigger" role="combobox" aria-haspopup="listbox" aria-expanded="false" aria-controls="${esc(id)}-menu"${name}${disabled ? ' disabled' : ''}>`
160
+ + `<span class="cc-dropdown-value" title="${esc(text)}">${esc(text)}</span>${ARROW}</button>`
161
+ + `<div class="cc-dropdown-menu" id="${esc(id)}-menu" role="listbox"${multiple ? ' aria-multiselectable="true"' : ''}${name} tabindex="-1">${menuHTML(id, entries, chosen)}</div>`
162
+ + '</div>';
163
+ }
164
+
165
+ // ── The DOM: finding the parts ──
166
+
167
+ const partsOf = (dd) => ({
168
+ trigger: dd.querySelector(':scope > .cc-dropdown-trigger'),
169
+ menu: dd.querySelector(':scope > .cc-dropdown-menu'),
170
+ label: dd.querySelector(':scope > .cc-dropdown-trigger .cc-dropdown-value'),
171
+ input: dd.dataset.for ? document.getElementById(dd.dataset.for) : null,
172
+ });
173
+ const itemsOf = (dd) => [...(partsOf(dd).menu?.querySelectorAll('.cc-dropdown-item') || [])];
174
+ const optionsOf = (items) => items.map(el => ({ value: el.dataset.value ?? '', label: el.dataset.label ?? el.textContent, disabled: el.getAttribute('aria-disabled') === 'true', exclusive: el.dataset.exclusive === 'true', scope: el.dataset.scope || undefined, selected: el.classList.contains('active') }));
175
+ const highlightedOf = (items) => items.findIndex(el => el.classList.contains('highlight'));
176
+ const chosenOf = (items) => items.findIndex(el => el.classList.contains('active'));
177
+ const isOpen = (dd) => !!dd?.classList.contains('open');
178
+
179
+ /** The `.cc-dropdown` of a hidden input, or null. */
180
+ export function dropdownOf(input) {
181
+ if (!input?.id) return null;
182
+ const next = input.nextElementSibling;
183
+ if (next?.classList.contains('cc-dropdown') && next.dataset.for === input.id) return next;
184
+ return document.querySelector(`.cc-dropdown[data-for="${CSS.escape(input.id)}"]`);
185
+ }
186
+
187
+ /** What takes the focus for a field: a dropdown's trigger for its hidden input, else the element itself. */
188
+ export function controlOf(el) {
189
+ const dd = el && el.type === 'hidden' ? dropdownOf(el) : null;
190
+ return (dd && partsOf(dd).trigger) || el;
191
+ }
192
+
193
+ // Markup written by settings-kit.js dropdown() has no roles or ids: they are added when it opens.
194
+ function ensureAria(dd) {
195
+ const { trigger, menu, input } = partsOf(dd);
196
+ const base = input?.id || dd.dataset.for || 'cc-dropdown';
197
+ if (!trigger.hasAttribute('role')) trigger.setAttribute('role', 'combobox');
198
+ if (!menu.id) menu.id = `${base}-menu`;
199
+ trigger.setAttribute('aria-controls', menu.id);
200
+ if (!menu.hasAttribute('role')) menu.setAttribute('role', 'listbox');
201
+ itemsOf(dd).forEach((el, i) => {
202
+ if (!el.id) el.id = `${base}-opt-${i}`;
203
+ if (!el.hasAttribute('role')) el.setAttribute('role', 'option');
204
+ el.setAttribute('aria-selected', String(el.classList.contains('active')));
205
+ });
206
+ }
207
+
208
+ // ── Choosing, opening, closing ──
209
+
210
+ function showChosen(dd, index) {
211
+ const { label, input } = partsOf(dd);
212
+ const items = itemsOf(dd);
213
+ items.forEach((el, i) => {
214
+ el.classList.toggle('active', i === index);
215
+ el.setAttribute('aria-selected', String(i === index));
216
+ });
217
+ const item = items[index];
218
+ if (input) input.value = item ? item.dataset.value ?? '' : '';
219
+ if (label) {
220
+ label.textContent = item ? item.textContent : '';
221
+ label.title = label.textContent;
222
+ }
223
+ }
224
+
225
+ function showMultiple(dd, values) {
226
+ const { label, input } = partsOf(dd);
227
+ const items = itemsOf(dd);
228
+ items.forEach(el => {
229
+ const active = values.includes(el.dataset.value ?? '') || el.dataset.automatic === 'true';
230
+ el.classList.toggle('active', active);
231
+ el.setAttribute('aria-selected', String(active));
232
+ });
233
+ if (input) input.value = values.join(',');
234
+ if (label) {
235
+ label.textContent = multipleText(optionsOf(items), values);
236
+ label.title = label.textContent;
237
+ }
238
+ }
239
+
240
+ function highlight(dd, index) {
241
+ const { trigger, menu } = partsOf(dd);
242
+ const items = itemsOf(dd);
243
+ items.forEach((el, i) => el.classList.toggle('highlight', i === index));
244
+ const item = items[index];
245
+ if (!item) { trigger?.removeAttribute('aria-activedescendant'); return; }
246
+ trigger?.setAttribute('aria-activedescendant', item.id);
247
+ // The menu scrolls itself; scrollIntoView would also move the panes and the window behind it.
248
+ const box = menu.getBoundingClientRect();
249
+ const row = item.getBoundingClientRect();
250
+ if (row.top < box.top + menu.clientTop) menu.scrollTop -= box.top + menu.clientTop - row.top;
251
+ else if (row.bottom > box.top + menu.clientTop + menu.clientHeight) menu.scrollTop += row.bottom - (box.top + menu.clientTop + menu.clientHeight);
252
+ }
253
+
254
+ // What a fixed menu is placed against and cut off by: the nearest ancestor that is a containing
255
+ // block for fixed boxes (a transform, a filter, containment: a floating window), else the viewport.
256
+ function fixedContainer(el) {
257
+ for (let node = el.parentElement; node && node !== document.documentElement; node = node.parentElement) {
258
+ const cs = getComputedStyle(node);
259
+ if (cs.transform !== 'none' || cs.perspective !== 'none' || cs.filter !== 'none'
260
+ || (cs.backdropFilter && cs.backdropFilter !== 'none') || (cs.webkitBackdropFilter && cs.webkitBackdropFilter !== 'none')
261
+ || /paint|layout|strict|content/.test(cs.contain || '') || (cs.containerType && cs.containerType !== 'normal')
262
+ || /transform|perspective|filter/.test(cs.willChange || '')) return node;
263
+ }
264
+ return null;
265
+ }
266
+
267
+ function place(dd) {
268
+ const { trigger, menu } = partsOf(dd);
269
+ const style = menu.style;
270
+ Object.assign(style, { position: 'fixed', left: '0px', top: '0px', right: 'auto', bottom: 'auto', width: 'auto', maxHeight: 'none', minWidth: '0px', maxWidth: 'none' });
271
+ const origin = menu.getBoundingClientRect(); // where the containing block's (0, 0) is on screen
272
+ const t = trigger.getBoundingClientRect();
273
+ // The app frame for a trigger inside it (app-frame.js), else the window; then whatever clips the menu
274
+ const area = placementArea(t.left + t.width / 2, t.top + t.height / 2);
275
+ let room = { left: area.left, top: area.top, right: area.right, bottom: area.bottom };
276
+ const box = fixedContainer(dd);
277
+ if (box) {
278
+ const cs = getComputedStyle(box);
279
+ if (cs.overflowX !== 'visible' || cs.overflowY !== 'visible') {
280
+ const r = box.getBoundingClientRect();
281
+ room = { left: Math.max(room.left, r.left), top: Math.max(room.top, r.top), right: Math.min(room.right, r.right), bottom: Math.min(room.bottom, r.bottom) };
282
+ }
283
+ }
284
+ room = { left: room.left + EDGE, top: room.top + EDGE, right: room.right - EDGE, bottom: room.bottom - EDGE };
285
+ const roomWidth = Math.max(0, room.right - room.left);
286
+ style.maxWidth = `${roomWidth}px`;
287
+ style.minWidth = `${Math.min(t.width, roomWidth)}px`;
288
+ const height = menu.offsetHeight;
289
+ const below = room.bottom - t.bottom - GAP;
290
+ const above = t.top - GAP - room.top;
291
+ const down = height <= below || below >= above;
292
+ const space = Math.max(0, down ? below : above);
293
+ if (height > space) style.maxHeight = `${space}px`;
294
+ const shown = Math.min(height, space);
295
+ const width = menu.offsetWidth;
296
+ const left = Math.max(room.left, Math.min(t.left, room.right - width));
297
+ const top = down ? t.bottom + GAP : t.top - GAP - shown;
298
+ style.left = `${Math.round(left - origin.left)}px`;
299
+ style.top = `${Math.round(top - origin.top)}px`;
300
+ dd.classList.toggle('drop-up', !down);
301
+ dd._ccPlacedAt = { left: t.left, top: t.top };
302
+ }
303
+
304
+ // Has the trigger moved since its menu was placed (a pane scrolled under it)?
305
+ function moved(dd) {
306
+ const at = dd._ccPlacedAt;
307
+ const now = partsOf(dd).trigger?.getBoundingClientRect();
308
+ return !at || !now || Math.abs(now.left - at.left) > 1 || Math.abs(now.top - at.top) > 1;
309
+ }
310
+
311
+ function open(dd, index = null) {
312
+ const { trigger } = partsOf(dd);
313
+ if (!trigger || trigger.disabled || dd.classList.contains('disabled')) return;
314
+ for (const other of document.querySelectorAll('.cc-dropdown.open')) if (other !== dd) close(other);
315
+ ensureAria(dd);
316
+ dd._ccBefore = partsOf(dd).input?.value;
317
+ dd._ccBeforeLabel = partsOf(dd).label?.textContent;
318
+ dd._ccBeforeMenu = partsOf(dd).menu?.innerHTML;
319
+ dd.classList.add('open');
320
+ trigger.setAttribute('aria-expanded', 'true');
321
+ partsOf(dd).input?.dispatchEvent(new Event('cc-dropdown-open', { bubbles: true }));
322
+ if (document.activeElement !== trigger) trigger.focus({ preventScroll: true });
323
+ place(dd);
324
+ const items = itemsOf(dd);
325
+ const options = optionsOf(items);
326
+ const chosen = chosenOf(items);
327
+ highlight(dd, index ?? (chosen >= 0 && !options[chosen].disabled ? chosen : edgeIndex(options, 'first')));
328
+ }
329
+
330
+ function close(dd, { focus = false, cancel = false } = {}) {
331
+ const { trigger, menu, input, label } = partsOf(dd);
332
+ const changed = isOpen(dd) && dd.dataset.multiple === 'true' && input && input.value !== dd._ccBefore;
333
+ if (cancel && changed) {
334
+ if (menu && dd._ccBeforeMenu != null) menu.innerHTML = dd._ccBeforeMenu;
335
+ showMultiple(dd, dd._ccBefore === '' ? [''] : dd._ccBefore.split(','));
336
+ if (label) { label.textContent = dd._ccBeforeLabel; label.title = label.textContent; }
337
+ }
338
+ dd.classList.remove('open', 'drop-up');
339
+ trigger?.setAttribute('aria-expanded', 'false');
340
+ trigger?.removeAttribute('aria-activedescendant');
341
+ for (const el of itemsOf(dd)) el.classList.remove('highlight');
342
+ menu?.removeAttribute('style');
343
+ dd._ccPlacedAt = null;
344
+ if (focus && trigger?.isConnected) trigger.focus({ preventScroll: true });
345
+ if (changed && !cancel) {
346
+ input.dispatchEvent(new Event('input', { bubbles: true }));
347
+ input.dispatchEvent(new Event('change', { bubbles: true }));
348
+ }
349
+ }
350
+
351
+ /** The user's choice: shown, the menu closed, the focus on the trigger, then `input` and `change` when it changed. */
352
+ function choose(dd, index) {
353
+ const items = itemsOf(dd);
354
+ const item = items[index];
355
+ const { input } = partsOf(dd);
356
+ if (!item || item.getAttribute('aria-disabled') === 'true') { close(dd, { focus: true }); return; }
357
+ if (dd.dataset.multiple === 'true') {
358
+ showMultiple(dd, toggleMultiple(optionsOf(items), items.filter(el => el.classList.contains('active')).map(el => el.dataset.value), index));
359
+ input?.dispatchEvent(new Event('cc-dropdown-draft', { bubbles: true }));
360
+ highlight(dd, index);
361
+ return;
362
+ }
363
+ const changed = !!input && input.value !== (item.dataset.value ?? '');
364
+ showChosen(dd, index);
365
+ close(dd, { focus: true });
366
+ // After the focus is back: a listener that draws the form again finds the trigger focused.
367
+ if (changed) {
368
+ input.dispatchEvent(new Event('input', { bubbles: true }));
369
+ input.dispatchEvent(new Event('change', { bubbles: true }));
370
+ }
371
+ }
372
+
373
+ // ── What the code around it calls ──
374
+
375
+ /** `select.innerHTML = …`: new choices; the chosen one by the <select> rule; an open menu stays open. No event. */
376
+ export function setDropdownItems(input, entries) {
377
+ const dd = dropdownOf(input);
378
+ if (!dd) return;
379
+ const { menu } = partsOf(dd);
380
+ const wasOpen = isOpen(dd);
381
+ const before = wasOpen ? itemsOf(dd)[highlightedOf(itemsOf(dd))]?.dataset.value : undefined;
382
+ const options = flatOptions(entries);
383
+ const multiple = dd.dataset.multiple === 'true';
384
+ const chosen = multiple ? multipleValues(options) : chosenIndex(options);
385
+ menu.innerHTML = menuHTML(input.id, entries, chosen);
386
+ if (multiple) showMultiple(dd, chosen); else showChosen(dd, chosen);
387
+ if (!wasOpen) return;
388
+ place(dd);
389
+ const items = itemsOf(dd);
390
+ const again = before === undefined ? -1 : items.findIndex(el => el.dataset.value === before);
391
+ highlight(dd, again >= 0 ? again : chosenOf(items));
392
+ }
393
+
394
+ /** `select.value = …`: the first choice with that value, or none (the value is then ''). No event. */
395
+ export function setDropdownValue(input, value) {
396
+ const dd = dropdownOf(input);
397
+ if (!dd) { if (input) input.value = value ?? ''; return; }
398
+ if (dd.dataset.multiple === 'true') {
399
+ showMultiple(dd, Array.isArray(value) ? value.map(String) : String(value ?? '').split(','));
400
+ return;
401
+ }
402
+ showChosen(dd, itemsOf(dd).findIndex(el => el.dataset.value === String(value ?? '')));
403
+ }
404
+
405
+ /** `select.disabled = …`: the input, the trigger and the look. A disabled dropdown closes. */
406
+ export function setDropdownDisabled(input, disabled) {
407
+ const dd = dropdownOf(input);
408
+ if (input) input.disabled = !!disabled;
409
+ if (!dd) return;
410
+ if (disabled && isOpen(dd)) close(dd, { cancel: true });
411
+ dd.classList.toggle('disabled', !!disabled);
412
+ const { trigger } = partsOf(dd);
413
+ if (trigger) trigger.disabled = !!disabled;
414
+ }
415
+
416
+ /** Closes every open dropdown under `root`; true when one was open. `focus` puts the focus back on its trigger. */
417
+ export function closeDropdowns(root = document, { focus = false, cancel = false } = {}) {
418
+ const open = [...root.querySelectorAll('.cc-dropdown.open')];
419
+ for (const dd of open) close(dd, { focus, cancel });
420
+ return open.length > 0;
421
+ }
422
+
423
+ /**
424
+ * Drives every `.cc-dropdown` under `root`, now and drawn later. `signal` (an AbortSignal) takes
425
+ * the listeners off again, the document's and the window's too.
426
+ */
427
+ export function wireDropdowns(root, { signal } = {}) {
428
+ const on = (target, type, handler, options = {}) => target.addEventListener(type, handler, { ...options, signal });
429
+ let typed = '';
430
+ let typedAt = 0;
431
+ let swallowSpaceUp = false;
432
+
433
+ const typeAhead = (dd, char) => {
434
+ const now = Date.now();
435
+ typed = (now - typedAt > TYPE_PAUSE ? '' : typed) + char;
436
+ typedAt = now;
437
+ const items = itemsOf(dd);
438
+ const index = matchIndex(optionsOf(items), typed, highlightedOf(items));
439
+ if (index >= 0) highlight(dd, index);
440
+ };
441
+ const typing = () => !!typed && Date.now() - typedAt <= TYPE_PAUSE;
442
+ // Each opening starts a search of its own: letters typed before it closed do not carry over.
443
+ const show = (dd, index) => { typed = ''; open(dd, index); };
444
+ const printable = (e) => e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey && e.key !== ' ';
445
+
446
+ on(root, 'click', (e) => {
447
+ const item = e.target.closest?.('.cc-dropdown-item');
448
+ if (item && root.contains(item)) {
449
+ const dd = item.closest('.cc-dropdown');
450
+ if (item.getAttribute('aria-disabled') !== 'true') choose(dd, itemsOf(dd).indexOf(item));
451
+ return;
452
+ }
453
+ const trigger = e.target.closest?.('.cc-dropdown-trigger');
454
+ if (!trigger || !root.contains(trigger)) return;
455
+ const dd = trigger.closest('.cc-dropdown');
456
+ if (isOpen(dd)) close(dd, { focus: true }); else show(dd);
457
+ });
458
+
459
+ // The focus stays on the trigger while a choice is clicked.
460
+ on(root, 'mousedown', (e) => { if (e.target.closest?.('.cc-dropdown-menu')) e.preventDefault(); });
461
+ on(root, 'mouseover', (e) => {
462
+ const item = e.target.closest?.('.cc-dropdown-item');
463
+ if (!item || item.getAttribute('aria-disabled') === 'true') return;
464
+ const dd = item.closest('.cc-dropdown');
465
+ if (isOpen(dd)) highlight(dd, itemsOf(dd).indexOf(item));
466
+ });
467
+
468
+ on(root, 'keydown', (e) => {
469
+ const trigger = e.target.closest?.('.cc-dropdown-trigger');
470
+ if (!trigger || !root.contains(trigger) || trigger.disabled) return;
471
+ const dd = trigger.closest('.cc-dropdown');
472
+ const items = itemsOf(dd);
473
+ const options = optionsOf(items);
474
+ const current = highlightedOf(items);
475
+ if (!isOpen(dd)) {
476
+ if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(e.key)) {
477
+ e.preventDefault();
478
+ if (e.key === ' ') swallowSpaceUp = true;
479
+ show(dd);
480
+ } else if (e.key === 'Home' || e.key === 'End') {
481
+ e.preventDefault();
482
+ show(dd, edgeIndex(options, e.key === 'Home' ? 'first' : 'last'));
483
+ } else if (printable(e)) {
484
+ e.preventDefault();
485
+ show(dd);
486
+ typeAhead(dd, e.key);
487
+ }
488
+ return;
489
+ }
490
+ switch (e.key) {
491
+ case 'ArrowDown':
492
+ case 'ArrowUp':
493
+ e.preventDefault();
494
+ if (e.altKey && e.key === 'ArrowUp') choose(dd, current);
495
+ else highlight(dd, stepIndex(options, current, e.key === 'ArrowDown' ? 1 : -1));
496
+ break;
497
+ case 'PageDown':
498
+ case 'PageUp':
499
+ e.preventDefault();
500
+ highlight(dd, stepIndex(options, current, e.key === 'PageDown' ? PAGE : -PAGE));
501
+ break;
502
+ case 'Home':
503
+ case 'End':
504
+ e.preventDefault();
505
+ highlight(dd, edgeIndex(options, e.key === 'Home' ? 'first' : 'last'));
506
+ break;
507
+ case 'Enter':
508
+ e.preventDefault();
509
+ choose(dd, current);
510
+ break;
511
+ case ' ':
512
+ e.preventDefault();
513
+ swallowSpaceUp = true;
514
+ if (typing()) typeAhead(dd, ' '); else choose(dd, current);
515
+ break;
516
+ case 'Escape':
517
+ e.preventDefault();
518
+ e.stopPropagation();
519
+ close(dd, { focus: true, cancel: true });
520
+ break;
521
+ case 'Tab':
522
+ close(dd); // the focus moves on as usual; the choice stays as it was
523
+ break;
524
+ default:
525
+ if (printable(e)) { e.preventDefault(); typeAhead(dd, e.key); }
526
+ }
527
+ });
528
+ // A Space that opened or chose must not also click the trigger when it is let go.
529
+ on(root, 'keyup', (e) => {
530
+ if (e.key === ' ' && swallowSpaceUp) { swallowSpaceUp = false; e.preventDefault(); }
531
+ });
532
+
533
+ on(root, 'focusout', (e) => {
534
+ const dd = e.target.closest?.('.cc-dropdown');
535
+ if (dd && isOpen(dd) && !dd.contains(e.relatedTarget)) close(dd);
536
+ });
537
+ on(document, 'pointerdown', (e) => {
538
+ for (const dd of root.querySelectorAll('.cc-dropdown.open')) if (!dd.contains(e.target)) close(dd);
539
+ }, { capture: true });
540
+ // A pane that scrolls the trigger away from its menu closes the menu. A scroll event arrives a frame
541
+ // late, so one from before the menu opened (a click that first scrolled its trigger into view)
542
+ // finds the trigger where the menu was placed, and is let be.
543
+ on(document, 'scroll', (e) => {
544
+ for (const dd of root.querySelectorAll('.cc-dropdown.open')) {
545
+ const target = e.target === document ? document.documentElement : e.target;
546
+ if (!partsOf(dd).menu.contains(target) && target.contains?.(dd) && moved(dd)) close(dd);
547
+ }
548
+ }, { capture: true });
549
+ on(window, 'resize', () => closeDropdowns(root));
550
+ }
@@ -164,6 +164,7 @@ function build(m, { copied = false } = {}) {
164
164
  * opts.onManage() opens the MCP servers; without it there is no "Manage"
165
165
  * opts.onSettings() opens Codex settings; without it there is no "Settings"
166
166
  * opts.onAccount() opens the account menu; without it there is no Account row
167
+ * opts.bounds() the area the popover stays in ({ left, top, right, bottom }: the app frame); the window without it
167
168
  * Returns { element, open(), close({ focus }), isOpen(), sync(), destroy() }.
168
169
  */
169
170
  export function mountContextMenu(actionsEl, panelEl, opts = {}) {
@@ -215,23 +216,23 @@ export function mountContextMenu(actionsEl, panelEl, opts = {}) {
215
216
  }
216
217
 
217
218
  // Below the cog, its right edge on the cog's; above it when there is more room
218
- // there; always inside the viewport, scrolling inside when it is taller.
219
+ // there; always inside the app frame, scrolling inside when it is taller.
219
220
  function place() {
220
221
  if (!open || !pop) return;
221
222
  const r = cog.getBoundingClientRect();
222
- const vw = window.innerWidth;
223
- const vh = window.innerHeight;
224
- const width = Math.max(0, Math.min(WIDTH, vw - MARGIN * 2));
223
+ // Inside the area the panel names (the app frame), else the window
224
+ const f = opts.bounds?.() || { left: 0, top: 0, right: window.innerWidth, bottom: window.innerHeight, width: window.innerWidth };
225
+ const width = Math.max(0, Math.min(WIDTH, f.width - MARGIN * 2));
225
226
  pop.style.width = `${width}px`;
226
- const below = vh - r.bottom - GAP - MARGIN;
227
- const above = r.top - GAP - MARGIN;
227
+ const below = f.bottom - r.bottom - GAP - MARGIN;
228
+ const above = r.top - f.top - GAP - MARGIN;
228
229
  const up = below < 220 && above > below;
229
230
  pop.style.maxHeight = `${Math.max(120, up ? above : below)}px`;
230
231
  const height = pop.offsetHeight;
231
- const left = Math.max(MARGIN, Math.min(r.right - width, vw - width - MARGIN));
232
+ const left = Math.max(f.left + MARGIN, Math.min(r.right - width, f.right - width - MARGIN));
232
233
  const top = up
233
- ? Math.max(MARGIN, r.top - GAP - height)
234
- : Math.max(MARGIN, Math.min(r.bottom + GAP, vh - MARGIN - height));
234
+ ? Math.max(f.top + MARGIN, r.top - GAP - height)
235
+ : Math.max(f.top + MARGIN, Math.min(r.bottom + GAP, f.bottom - MARGIN - height));
235
236
  pop.style.left = `${Math.round(left)}px`;
236
237
  pop.style.top = `${Math.round(top)}px`;
237
238
  // Once it has its width: only now is a cut value known.
@@ -0,0 +1,16 @@
1
+ let translate = null;
2
+ export function setCodexTranslator(fn) { translate = typeof fn === 'function' ? fn : null; }
3
+
4
+ // Detached panels/tests can render before the locale bundle is ready.
5
+ export function cxpText(key, english, params) {
6
+ const path = `codexPanel.${key}`;
7
+ const value = translate?.(path, params) || path;
8
+ if (value !== path) return value;
9
+ return english.replace(/\{(\w+)\}/g, (_, name) => params?.[name] ?? `{${name}}`);
10
+ }
11
+
12
+ export function cxpSessionLabel(label) {
13
+ if (label === 'New session') return cxpText('newSession', 'New session');
14
+ if (label === 'Saved session') return cxpText('savedSession', 'Saved session');
15
+ return label;
16
+ }
@@ -236,7 +236,10 @@ export function fileChangeDiffs(item = {}) {
236
236
  if (raw && (/^(?:diff --git |--- )/m.test(raw) || changes.length <= 1 && /^@@ /m.test(raw))) return parseUnifiedDiff(raw, changes.length === 1 ? changeInfo(changes[0]) : {});
237
237
  const files = changes.slice(0, OUTPUT_LIMITS.files).flatMap(change => {
238
238
  const info = changeInfo(change);
239
- const patch = change.diff || change.patch || change.content || change.output || '';
239
+ const patch = change.diff ?? change.patch ?? change.content ?? change.output;
240
+ if ((info.status === 'added' || info.status === 'deleted') && typeof patch === 'string') {
241
+ return [wholeFileDiff(patch, info)];
242
+ }
240
243
  if (!patch) return [{ ...info, lines: [], hunks: [], added: 0, removed: 0, raw: '', unavailable: true }];
241
244
  return parseUnifiedDiff(typeof patch === 'string' ? patch : readableStructuredValue(patch), info);
242
245
  });
@@ -244,6 +247,24 @@ export function fileChangeDiffs(item = {}) {
244
247
  return files;
245
248
  }
246
249
 
250
+ function wholeFileDiff(content, info) {
251
+ const added = info.status === 'added';
252
+ const text = content.replace(/\r\n/g, '\n');
253
+ const lines = text === '' ? [] : text.split('\n');
254
+ if (text.endsWith('\n')) lines.pop();
255
+ const sign = added ? '+' : '-';
256
+ const raw = `@@ -${added ? '0,0' : `1,${lines.length}`} +${added ? `1,${lines.length}` : '0,0'} @@\n`
257
+ + lines.map(line => `${sign}${line}\n`).join('')
258
+ + (text && !text.endsWith('\n') ? '\\n' : '');
259
+ const oversized = content.length > OUTPUT_LIMITS.input || lines.length > OUTPUT_LIMITS.diffLines;
260
+ return { ...info, lines: oversized ? [] : lines.map((text, i) => ({
261
+ kind: added ? 'add' : 'delete', sign, text,
262
+ oldLine: added ? null : i + 1, newLine: added ? i + 1 : null,
263
+ })), hunks: [{ oldStart: added ? 0 : 1, newStart: added ? 1 : 0 }],
264
+ added: added ? lines.length : 0, removed: added ? 0 : lines.length,
265
+ raw, oversized };
266
+ }
267
+
247
268
  function changeInfo(change) {
248
269
  const kind = typeof change.kind === 'object' ? change.kind : { type: change.kind || change.type };
249
270
  const moved = kind.move_path || kind.movePath || change.newPath;