synabun 2.0.0-beta → 2.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +65 -0
- package/NOTICE +5 -0
- package/README.md +1 -1
- package/THIRD-PARTY-LICENSES.md +51 -0
- package/benchmarks/fixtures/browser/README.md +1 -1
- package/benchmarks/fixtures/desktop/README.md +1 -1
- package/docs/whatsapp.md +2 -2
- package/hooks/claude-code/pre-compact.mjs +11 -0
- package/hooks/claude-code/prompt-submit.mjs +60 -184
- package/hooks/claude-code/session-start.mjs +73 -16
- package/hooks/claude-code/shared.mjs +20 -0
- package/hooks/claude-code/stop.mjs +5 -5
- package/launcher.mjs +40 -0
- package/lib/claude-hooks.js +61 -8
- package/lib/client-config-repair.js +4 -3
- package/lib/data-home-migration.js +4 -0
- package/lib/desktop-pwa.js +206 -0
- package/lib/external-tools.js +221 -0
- package/lib/first-launch-protection.js +5 -0
- package/lib/packaged-runtime.js +110 -0
- package/lib/start-launcher.js +1396 -0
- package/mcp-server/package-lock.json +2 -2
- package/mcp-server/package.json +1 -3
- package/neural-interface/i18n/en.json +1540 -154
- package/neural-interface/i18n/pt-BR.json +1538 -153
- package/neural-interface/lib/assistant-api.js +62 -6
- package/neural-interface/lib/assistant-brains/claude.js +4 -0
- package/neural-interface/lib/assistant-catalog.js +179 -27
- package/neural-interface/lib/assistant-config.js +31 -2
- package/neural-interface/lib/assistant-dispatch.js +62 -13
- package/neural-interface/lib/assistant-envelope.js +9 -6
- package/neural-interface/lib/assistant-hidden-models.js +393 -66
- package/neural-interface/lib/assistant-memory.js +24 -10
- package/neural-interface/lib/assistant-persona.js +6 -2
- package/neural-interface/lib/assistant-pricing.js +21 -6
- package/neural-interface/lib/assistant-runtime.js +181 -12
- package/neural-interface/lib/assistant-task-prompt.js +13 -3
- package/neural-interface/lib/assistant-test-density.js +142 -0
- package/neural-interface/lib/assistant-user-context-budgets.js +123 -0
- package/neural-interface/lib/assistant-user-context.js +908 -0
- package/neural-interface/lib/assistant-user-knowledge.js +328 -0
- package/neural-interface/lib/assistant-user-learn.js +404 -0
- package/neural-interface/lib/assistant-user-threads.js +226 -0
- package/neural-interface/lib/assistant-user-writer.js +181 -0
- package/neural-interface/lib/augmented-path.js +23 -3
- package/neural-interface/lib/browser-background-tab.js +134 -0
- package/neural-interface/lib/browser-language.js +83 -0
- package/neural-interface/lib/browser-screenshot.js +678 -61
- package/neural-interface/lib/claude-agent-bridge.js +87 -153
- package/neural-interface/lib/claude-executable.js +241 -0
- package/neural-interface/lib/claude-model-catalog.js +82 -93
- package/neural-interface/lib/claude-temporary.js +46 -7
- package/neural-interface/lib/cloudflared/install.js +533 -0
- package/neural-interface/lib/cloudflared/manager.js +545 -0
- package/neural-interface/lib/cloudflared/pins.js +115 -0
- package/neural-interface/lib/cloudflared/pins.json +63 -0
- package/neural-interface/lib/cloudflared/tunnel.js +265 -0
- package/neural-interface/lib/editor-completion-endpoint.js +264 -0
- package/neural-interface/lib/editor-completion-opencode.js +436 -0
- package/neural-interface/lib/editor-completion.js +714 -0
- package/neural-interface/lib/editor-config.js +149 -0
- package/neural-interface/lib/editor-files-api.js +268 -0
- package/neural-interface/lib/editor-git-api.js +134 -0
- package/neural-interface/lib/file-explorer-api.js +1039 -0
- package/neural-interface/lib/file-explorer-system.js +355 -0
- package/neural-interface/lib/file-explorer-trash.ps1 +85 -0
- package/neural-interface/lib/file-explorer-watch.js +239 -0
- package/neural-interface/lib/git-diff-api.js +103 -0
- package/neural-interface/lib/git-read.js +202 -0
- package/neural-interface/lib/greeting/api.js +89 -0
- package/neural-interface/lib/greeting/budgets.js +90 -0
- package/neural-interface/lib/greeting/engine.js +461 -0
- package/neural-interface/lib/greeting/facts.js +320 -0
- package/neural-interface/lib/greeting/sources.js +252 -0
- package/neural-interface/lib/greeting/writer.js +139 -0
- package/neural-interface/lib/http-guards.js +189 -13
- package/neural-interface/lib/machine-names.js +88 -0
- package/neural-interface/lib/memory-api.js +31 -7
- package/neural-interface/lib/native-binary-runtime.js +69 -337
- package/neural-interface/lib/native-loop-providers.js +40 -49
- package/neural-interface/lib/offline-page.js +54 -0
- package/neural-interface/lib/plugin-installer.js +4 -2
- package/neural-interface/lib/project-storage.js +5 -7
- package/neural-interface/lib/request-gate.js +589 -0
- package/neural-interface/lib/session-title-generator.js +5 -0
- package/neural-interface/lib/synabun-update-plan.js +19 -0
- package/neural-interface/lib/ui-blob-api.js +108 -0
- package/neural-interface/lib/ui-blob-store.js +68 -0
- package/neural-interface/package-lock.json +701 -253
- package/neural-interface/package.json +13 -2
- package/neural-interface/public/install-app.html +34 -0
- package/neural-interface/public/manifest.json +2 -0
- package/neural-interface/public/offline.html +402 -66
- package/neural-interface/public/onboarding.html +264 -147
- package/neural-interface/public/shared/agent-runtime-options.js +22 -6
- package/neural-interface/public/shared/assistant/asst-automation.js +286 -0
- package/neural-interface/public/shared/assistant/asst-brain-picker.js +312 -62
- package/neural-interface/public/shared/assistant/asst-composer.js +11 -1
- package/neural-interface/public/shared/assistant/asst-mascot.js +26 -64
- package/neural-interface/public/shared/assistant/asst-menu.js +12 -8
- package/neural-interface/public/shared/assistant/asst-panel.js +150 -28
- package/neural-interface/public/shared/assistant/asst-rack-styles.js +0 -3
- package/neural-interface/public/shared/assistant/asst-render.js +219 -67
- package/neural-interface/public/shared/assistant/asst-route-models.js +108 -0
- package/neural-interface/public/shared/assistant/asst-route.js +23 -329
- package/neural-interface/public/shared/assistant/asst-routes-editor.js +495 -0
- package/neural-interface/public/shared/assistant/asst-sanitize.js +8 -1
- package/neural-interface/public/shared/assistant/asst-sidepanel.js +31 -9
- package/neural-interface/public/shared/assistant/asst-state.js +185 -1
- package/neural-interface/public/shared/assistant/asst-styles.js +162 -6
- package/neural-interface/public/shared/blob-store.js +111 -22
- package/neural-interface/public/shared/cdx/cdx-panel.js +32 -11
- package/neural-interface/public/shared/cdx/cdx-render.js +25 -89
- package/neural-interface/public/shared/cdx/cdx-styles.js +36 -0
- package/neural-interface/public/shared/cdx/cdx-tabs.js +87 -4
- package/neural-interface/public/shared/command-runner-model.js +30 -0
- package/neural-interface/public/shared/constants.js +6 -1
- package/neural-interface/public/shared/cp/cp-rehydrate.js +2 -1
- package/neural-interface/public/shared/cp/cp-styles.js +15 -0
- package/neural-interface/public/shared/editor/editor-ai-logic.js +409 -0
- package/neural-interface/public/shared/editor/editor-ai.js +619 -0
- package/neural-interface/public/shared/editor/editor-commands.js +212 -0
- package/neural-interface/public/shared/editor/editor-compare.js +103 -0
- package/neural-interface/public/shared/editor/editor-completion-list.js +172 -0
- package/neural-interface/public/shared/editor/editor-doc.js +257 -0
- package/neural-interface/public/shared/editor/editor-git-logic.js +131 -0
- package/neural-interface/public/shared/editor/editor-git.js +95 -0
- package/neural-interface/public/shared/editor/editor-languages.js +156 -0
- package/neural-interface/public/shared/editor/editor-lint.js +229 -0
- package/neural-interface/public/shared/editor/editor-loader.js +51 -0
- package/neural-interface/public/shared/editor/editor-markdown.js +90 -0
- package/neural-interface/public/shared/editor/editor-menu.js +233 -0
- package/neural-interface/public/shared/editor/editor-minimap.js +371 -0
- package/neural-interface/public/shared/editor/editor-palette-logic.js +192 -0
- package/neural-interface/public/shared/editor/editor-palette.js +125 -0
- package/neural-interface/public/shared/editor/editor-panel-logic.js +288 -0
- package/neural-interface/public/shared/editor/editor-panel.js +2099 -0
- package/neural-interface/public/shared/editor/editor-prefs.js +224 -0
- package/neural-interface/public/shared/editor/editor-safety.js +500 -0
- package/neural-interface/public/shared/editor/editor-search.js +352 -0
- package/neural-interface/public/shared/editor/editor-statusbar.js +144 -0
- package/neural-interface/public/shared/editor/editor-tabs-logic.js +331 -0
- package/neural-interface/public/shared/editor/editor-tabs.js +233 -0
- package/neural-interface/public/shared/editor/editor-theme.js +244 -0
- package/neural-interface/public/shared/editor/editor-view.js +332 -0
- package/neural-interface/public/shared/explorer/fx-api.js +216 -0
- package/neural-interface/public/shared/explorer/fx-links.js +204 -0
- package/neural-interface/public/shared/explorer/fx-logic.js +537 -0
- package/neural-interface/public/shared/explorer/fx-main.js +865 -0
- package/neural-interface/public/shared/explorer/fx-names.js +87 -0
- package/neural-interface/public/shared/explorer/fx-ops.js +370 -0
- package/neural-interface/public/shared/explorer/fx-popups.js +490 -0
- package/neural-interface/public/shared/explorer/fx-tree.js +790 -0
- package/neural-interface/public/shared/file-links.js +339 -0
- package/neural-interface/public/shared/greeting/greeting-card.js +178 -0
- package/neural-interface/public/shared/greeting/greeting-view.js +148 -0
- package/neural-interface/public/shared/html-shell.js +169 -170
- package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +4 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-greeting.js +47 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +99 -17
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +7 -1
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +5 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +40 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +3 -2
- package/neural-interface/public/shared/pwa-install-page.js +62 -0
- package/neural-interface/public/shared/pwa-install.css +12 -0
- package/neural-interface/public/shared/pwa-install.js +127 -0
- package/neural-interface/public/shared/settings/settings-code-editor-pane.js +412 -0
- package/neural-interface/public/shared/settings/settings-code-editor.js +328 -0
- package/neural-interface/public/shared/settings/settings-greeting.js +133 -0
- package/neural-interface/public/shared/settings/settings-ia.js +18 -4
- package/neural-interface/public/shared/settings/settings-rules.js +160 -0
- package/neural-interface/public/shared/settings/settings-user-context.js +154 -0
- package/neural-interface/public/shared/start-bridge.js +802 -0
- package/neural-interface/public/shared/styleguide/sg-colors.js +5 -2
- package/neural-interface/public/shared/styleguide/sg-import-export.js +4 -3
- package/neural-interface/public/shared/styleguide/sg-kit.js +4 -1
- package/neural-interface/public/shared/styleguide/sg-panel.js +9 -1
- package/neural-interface/public/shared/styleguide/sg-typography.js +1 -0
- package/neural-interface/public/shared/styles.css +2219 -1117
- package/neural-interface/public/shared/synabun-mascot.js +20 -56
- package/neural-interface/public/shared/term-ready.js +307 -0
- package/neural-interface/public/shared/tunnel-view.js +167 -0
- package/neural-interface/public/shared/ui-claude-panel.js +160 -19
- package/neural-interface/public/shared/ui-command-runner.js +251 -468
- package/neural-interface/public/shared/ui-detail.js +15 -0
- package/neural-interface/public/shared/ui-explorer.js +22 -0
- package/neural-interface/public/shared/ui-file-explorer.js +481 -2496
- package/neural-interface/public/shared/ui-file-links.js +103 -0
- package/neural-interface/public/shared/ui-help.js +26 -0
- package/neural-interface/public/shared/ui-invite.js +126 -116
- package/neural-interface/public/shared/ui-judgments.js +1 -1
- package/neural-interface/public/shared/ui-keybinds.js +4 -0
- package/neural-interface/public/shared/ui-loading.js +367 -12
- package/neural-interface/public/shared/ui-menubar.js +21 -55
- package/neural-interface/public/shared/ui-native-loop-router-state.js +11 -0
- package/neural-interface/public/shared/ui-native-loop-router.js +15 -2
- package/neural-interface/public/shared/ui-navbar.js +45 -21
- package/neural-interface/public/shared/ui-settings.js +491 -547
- package/neural-interface/public/shared/ui-sidepanel-runtime.js +2 -1
- package/neural-interface/public/shared/ui-sync.js +16 -0
- package/neural-interface/public/shared/ui-terminal.js +153 -149
- package/neural-interface/public/shared/ui-tunnel.js +130 -0
- package/neural-interface/public/shared/ui-tutorial-steps.js +6 -2
- package/neural-interface/public/shared/ui-whiteboard.js +12 -0
- package/neural-interface/public/shared/ui-worker-end.js +245 -0
- package/neural-interface/public/shared/ui-workspaces.js +41 -27
- package/neural-interface/public/shared/worker-end.js +251 -0
- package/neural-interface/public/sw.js +3 -1
- package/neural-interface/public/variant/2d/main.js +2 -1
- package/neural-interface/public/variant/3d/main.js +2 -1
- package/neural-interface/public/vendor/codemirror/chunks/apl-CSDKT72Z.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/asciiarmor-JYYPU5BM.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/asn1-NRWCZDA6.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/asterisk-5OU6D4ZQ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/brainfuck-ID4N4SYC.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-4RZWGCS2.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-ACTJM3JR.js +11 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-S6BMAXLK.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-TO2RDOHQ.js +3 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-US2GMZZQ.js +13 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-WYYO5ZAJ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-XALZTDJC.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-YRNUTRDV.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-Z3QOKH62.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/clike-OWQBSOGL.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/clojure-KV75UQWC.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/cmake-GTEP5Y3C.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/cobol-WCZ7QEGJ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/coffeescript-TGLBOT6B.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/commonlisp-WVVI432V.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/crystal-S6R6HLKQ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/css-PDA2RINP.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/cypher-HL5QPL4C.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/d-HHJH2HAJ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/diff-MN3A35BY.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-25SQLBVS.js +3 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-27ZGGJJS.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-4E52OJIF.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-6FT73XDC.js +2 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-BE6YGRMW.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-CJSGKW2O.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-CRPH2WLI.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-CTG7JEQN.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-I3FEVELX.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-IM5BBSWZ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-KERUKTIF.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-LXTMWZAM.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-MABASSET.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-MJVBUZLL.js +3 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-MNB3WZVU.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-QYWXOE3U.js +7 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-TEBOFWLZ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-UNXFROM3.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-XL2SLQO6.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-XO42Y3AP.js +6 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-Y2WWDWJK.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-YFEZKWMU.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-ZY7SWQO6.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dockerfile-3Y4R4NCH.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dtd-5343GJ4P.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dylan-FI2CXSW2.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/ebnf-GNQ77YWA.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/ecl-MRPUAE2L.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/eiffel-DZROES27.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/elm-4KICRFKQ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/erlang-3IHYC263.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/factor-C6D3E5UK.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/fcl-VYTWUJMI.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/forth-ZBO2EH5M.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/fortran-5NDCRWIK.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/gas-SKRMOXFP.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/gherkin-L45YXZLW.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/groovy-GLPTLN44.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/haskell-E7NF7P4Y.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/haxe-K2NVDOB6.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/http-Q6DRQIJB.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/idl-MZYNJVLN.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/javascript-6YRYK2HR.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/julia-HXEL2T5G.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/livescript-MV7CI2JZ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/lua-E36NHOOD.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/mathematica-3XOZZCMC.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/mbox-ODYGFKS7.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/mirc-WB43AWF5.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/mllike-ZT6ET7ZH.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/modelica-LLMZPFGA.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/mscgen-2OPNNYFH.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/mumps-6P3HWJH6.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/nginx-TCGKQTRW.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/nsis-ATIGIXTJ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/ntriples-5PLBI5OV.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/octave-QF2S3NL6.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/oz-JFIVFFH2.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/pascal-JG6SW76V.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/perl-4B3IWVVO.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/pig-ABEBH4MI.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/powershell-H32XE7TL.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/properties-NN644MMA.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/protobuf-YKWQK2J3.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/pug-RIYXEKFW.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/puppet-JZQ5WPEV.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/python-EBCGGHAC.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/q-5UMH2YQY.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/r-7XMGG453.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/rpm-IEV7TSLR.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/ruby-T4SPFPNM.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/sas-GEDX67ET.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/scheme-FTLOWKPC.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/shell-HUFRKFSJ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/sieve-P5QUDVYO.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/smalltalk-2SORJNQI.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/solr-M22TGAR5.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/sparql-4M3KL752.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/spreadsheet-3K23LA4N.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/sql-VHRFMUBI.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/stex-QZDAQUY2.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/stylus-7ZDKAKBD.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/swift-WCLCLGMR.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/tcl-JLMU6WOK.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/textile-4CHDKZ4T.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/tiddlywiki-DKMCZZQ4.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/tiki-F4JIG36Q.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/toml-BHMHTIM2.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/troff-YQ2KV5NT.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/ttcn-ZHRCVFJY.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/ttcn-cfg-KJOVTY4X.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/turtle-535P5N6I.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/vb-76UMQHOT.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/vbscript-CGNDTK6Z.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/velocity-VSJDO5T5.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/verilog-4T6ETXIP.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/vhdl-T7FNAXUN.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/webidl-P6MJSJ6J.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/xquery-UOVILRGN.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/yacas-CV2APROL.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/z80-3KFNVM4M.js +1 -0
- package/neural-interface/public/vendor/codemirror/codemirror-6.43.14-75f05e67.min.js +2 -0
- package/neural-interface/public/vendor/codemirror/manifest.json +60 -0
- package/neural-interface/scripts/build-vendor.mjs +78 -2
- package/neural-interface/scripts/rebuild-pty.js +15 -12
- package/neural-interface/scripts/vendor-codemirror-entry.js +121 -0
- package/neural-interface/server.js +1092 -1212
- package/neural-interface/templates/rulesets/README.md +1 -1
- package/package.json +13 -7
- package/postinstall.js +11 -81
- package/setup.js +111 -6
- package/benchmarks/browser-live-results.json +0 -79
- package/benchmarks/browser-v2-results.json +0 -258
- package/docs/browser-v2.md +0 -109
- package/docs/hook-integrity.md +0 -89
- package/docs/judgments.md +0 -182
- package/docs/style-guide.md +0 -246
- package/neural-interface/lib/codex-capabilities.d.ts +0 -41
- package/neural-interface/public/category-logos/claude.svg +0 -1
- package/neural-interface/public/category-logos/gemini-color.svg +0 -1
- package/neural-interface/public/category-logos/openai.svg +0 -1
- package/neural-interface/public/category-logos/synabun.png +0 -0
- package/neural-interface/public/claude.svg +0 -1
- package/neural-interface/public/gallery.svg +0 -6
- package/neural-interface/public/leonardoai.svg +0 -1
- package/neural-interface/public/mcp.svg +0 -4
- package/neural-interface/public/opencode-logo-dark-square.svg +0 -1
- package/neural-interface/public/pin-svgrepo-com.svg +0 -25
- package/neural-interface/public/sessionicon.svg +0 -8
- package/neural-interface/public/toolbar-album.svg +0 -8
- package/neural-interface/public/toolbar-question.svg +0 -6
- package/neural-interface/public/toolbar-sessions.svg +0 -6
- package/neural-interface/scripts/codex-protocol-fixture.mjs +0 -83
- package/scripts/audit-claude-hook-usage.mjs +0 -12
- package/scripts/audit-memory-duplicates.mjs +0 -44
- package/scripts/measure-claude-hook-overhead.mjs +0 -77
- package/scripts/recover-user-config.mjs +0 -254
- package/skills/synabun/synabunicon.png +0 -0
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
// send/stop) · file input. The other runtime controls live in the toolbar.
|
|
13
13
|
|
|
14
14
|
import { matchSlashCommands, SLASH_COMMANDS } from './asst-slash.js';
|
|
15
|
+
import { isLongPaste, typedText } from './asst-automation.js';
|
|
15
16
|
|
|
16
17
|
const TEXT_EXTENSIONS = new Set([
|
|
17
18
|
'txt', 'md', 'js', 'ts', 'jsx', 'tsx', 'json', 'html', 'css', 'scss', 'less', 'xml', 'svg',
|
|
@@ -151,6 +152,7 @@ export function createComposer(hostEl, hooks = {}) {
|
|
|
151
152
|
files: [], // { name, content }
|
|
152
153
|
uploads: [], // { name, size, mime, path, status: 'uploading'|'done', progress, controller }
|
|
153
154
|
memories: [], // node objects
|
|
155
|
+
pastes: [], // long text pastes still to be told apart from typed words (asst-automation.js typedText)
|
|
154
156
|
slashOpen: false,
|
|
155
157
|
slashIndex: 0,
|
|
156
158
|
slashItems: [],
|
|
@@ -321,6 +323,9 @@ export function createComposer(hostEl, hooks = {}) {
|
|
|
321
323
|
if (!text && !state.images.length && !state.files.length && !state.uploads.length && !state.memories.length) return;
|
|
322
324
|
const payload = {
|
|
323
325
|
text,
|
|
326
|
+
// What the user typed, without the long pastes: all SynaBun may learn about them from (the prompt keeps everything).
|
|
327
|
+
typed: typedText(text, state.pastes),
|
|
328
|
+
pastes: state.pastes.slice(),
|
|
324
329
|
images: state.images.slice(),
|
|
325
330
|
files: state.files.slice(),
|
|
326
331
|
uploads: state.uploads.map(({ name, size, mime, path }) => ({ name, size, mime, path })),
|
|
@@ -334,6 +339,7 @@ export function createComposer(hostEl, hooks = {}) {
|
|
|
334
339
|
state.files = [];
|
|
335
340
|
state.uploads = [];
|
|
336
341
|
state.memories = [];
|
|
342
|
+
state.pastes = [];
|
|
337
343
|
renderAttachments();
|
|
338
344
|
closeSlash();
|
|
339
345
|
autoResize();
|
|
@@ -409,9 +415,12 @@ export function createComposer(hostEl, hooks = {}) {
|
|
|
409
415
|
return Number.isFinite(x) && Number.isFinite(y) ? { x, y } : null;
|
|
410
416
|
}
|
|
411
417
|
|
|
412
|
-
// ── Paste (images) ──
|
|
418
|
+
// ── Paste (images; long text is remembered as pasted, not typed) ──
|
|
413
419
|
textarea.addEventListener('paste', (e) => {
|
|
414
420
|
if (!e.clipboardData) return;
|
|
421
|
+
let pasted = '';
|
|
422
|
+
try { pasted = e.clipboardData.getData?.('text/plain') || ''; } catch { pasted = ''; }
|
|
423
|
+
if (isLongPaste(pasted)) state.pastes = [...state.pastes, pasted].slice(-20);
|
|
415
424
|
for (const item of e.clipboardData.items) {
|
|
416
425
|
if (item.type.startsWith('image/')) {
|
|
417
426
|
const blob = item.getAsFile();
|
|
@@ -596,6 +605,7 @@ export function createComposer(hostEl, hooks = {}) {
|
|
|
596
605
|
state.files.push(...(payload.files || []));
|
|
597
606
|
state.uploads.push(...(payload.uploads || []).map((u) => ({ ...u, status: 'done', progress: 1 })));
|
|
598
607
|
state.memories.push(...(payload.memories || []));
|
|
608
|
+
state.pastes = [...state.pastes, ...(payload.pastes || [])].slice(-20);
|
|
599
609
|
renderAttachments();
|
|
600
610
|
autoResize();
|
|
601
611
|
updateSlash();
|
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
// SynaBun Assistant — the panel's mascot director
|
|
3
3
|
// ═══════════════════════════════════════════
|
|
4
4
|
// The renderer (asst-render.js) owns the rigs and says which one is on screen:
|
|
5
|
-
// the hero (the empty state's character
|
|
6
|
-
//
|
|
7
|
-
// in the panel's own state, above the pose the
|
|
5
|
+
// the hero (the empty state's character; a send hands it over to the
|
|
6
|
+
// "Thinking" row's at once), the live rack's stage or the "Thinking" row's.
|
|
7
|
+
// This module dresses that one in the panel's own state, above the pose the
|
|
8
|
+
// renderer gives it:
|
|
8
9
|
//
|
|
9
10
|
// offline the socket dropped (the Reconnecting banner); one startle on reconnect
|
|
10
11
|
// blocked a card waits on you: eyes on it, two pulses, then still
|
|
@@ -14,12 +15,15 @@
|
|
|
14
15
|
// sleep the hero only, after 90 s with no input while nothing runs;
|
|
15
16
|
// the rig wakes itself on a pointer move or a key
|
|
16
17
|
//
|
|
17
|
-
// Anything else is the renderer's pose: the hero idles
|
|
18
|
-
// the stage acts out its call. A pose the director sets is
|
|
19
|
-
// leaves it alone until the director lets go and asks it
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
//
|
|
18
|
+
// Anything else is the renderer's pose: the hero idles, the "Thinking" row's
|
|
19
|
+
// character thinks, the stage acts out its call. A pose the director sets is
|
|
20
|
+
// held: the renderer leaves it alone until the director lets go and asks it
|
|
21
|
+
// to restore its own. A director knows its own panel only: nothing in this
|
|
22
|
+
// module is shared between directors, so every open session dresses and
|
|
23
|
+
// animates its own character at the same time as every other one (a rig that
|
|
24
|
+
// is off screen parks itself: synabun-mascot.js). Pure logic: the clock,
|
|
25
|
+
// timers and page input come in through `env`, so node:test drives it with
|
|
26
|
+
// fakes (tests/assistant-mascot.test.mjs).
|
|
23
27
|
|
|
24
28
|
export const MASCOT_TIMING = Object.freeze({
|
|
25
29
|
watchEveryMs: 120,
|
|
@@ -58,32 +62,16 @@ export function lookToward(box, point, { horizontal = false } = {}) {
|
|
|
58
62
|
return { x: unit((vx / d) * m), y: unit((vy / d) * m) };
|
|
59
63
|
}
|
|
60
64
|
|
|
61
|
-
// ── One panel animates: the visible one used last ──
|
|
62
|
-
const directors = new Set();
|
|
63
|
-
let lead = null;
|
|
64
|
-
let seq = 0;
|
|
65
|
-
|
|
66
|
-
function elect() {
|
|
67
|
-
let best = null;
|
|
68
|
-
for (const d of directors) if (d.visible() && (!best || d.activeAt() > best.activeAt())) best = d;
|
|
69
|
-
if (!best) for (const d of directors) if (!best || d.activeAt() > best.activeAt()) best = d;
|
|
70
|
-
if (best === lead) return;
|
|
71
|
-
const prev = lead;
|
|
72
|
-
lead = best;
|
|
73
|
-
prev?.leadChanged();
|
|
74
|
-
best?.leadChanged();
|
|
75
|
-
}
|
|
76
|
-
|
|
77
65
|
/**
|
|
78
|
-
* createMascotDirector({ getTarget, caret,
|
|
79
|
-
* getTarget() → the renderer's visible mascot { kind: 'hero'|'stage',
|
|
80
|
-
* parked?(), hold(on), restore() } or null; caret() → the caret's
|
|
81
|
-
* point or null
|
|
82
|
-
* isVisible() → the panel is on screen.
|
|
66
|
+
* createMascotDirector({ getTarget, caret, env })
|
|
67
|
+
* getTarget() → the renderer's visible mascot { kind: 'hero'|'stage'|'working',
|
|
68
|
+
* rig, el, parked?(), hold(on), restore() } or null; caret() → the caret's
|
|
69
|
+
* client point or null.
|
|
83
70
|
* env: { now, setTimeout, clearTimeout, input(fn) → unsubscribe (page pointer
|
|
84
71
|
* and key input), lastInputAt() }.
|
|
72
|
+
* All of its state is its own: one director per panel, any number at once.
|
|
85
73
|
*/
|
|
86
|
-
export function createMascotDirector({ getTarget = () => null, caret = () => null,
|
|
74
|
+
export function createMascotDirector({ getTarget = () => null, caret = () => null, env = {} } = {}) {
|
|
87
75
|
const now = env.now || (() => Date.now());
|
|
88
76
|
const later = env.setTimeout || ((fn, ms) => setTimeout(fn, ms));
|
|
89
77
|
const cancel = env.clearTimeout || ((id) => clearTimeout(id));
|
|
@@ -106,7 +94,6 @@ export function createMascotDirector({ getTarget = () => null, caret = () => nul
|
|
|
106
94
|
let sleepTimer = 0;
|
|
107
95
|
let lastInput = now();
|
|
108
96
|
let stopInput = null;
|
|
109
|
-
let activeAt = (seq += 1);
|
|
110
97
|
|
|
111
98
|
const safe = (fn) => { try { return fn(); } catch { return undefined; } };
|
|
112
99
|
const boxOf = (t) => safe(() => t.el?.getBoundingClientRect?.()) || null;
|
|
@@ -197,7 +184,6 @@ export function createMascotDirector({ getTarget = () => null, caret = () => nul
|
|
|
197
184
|
/** The draft changed: `present` false (an empty draft) ends the watch. */
|
|
198
185
|
function type(present = true) {
|
|
199
186
|
if (destroyed) return;
|
|
200
|
-
touch();
|
|
201
187
|
noteInput();
|
|
202
188
|
if (!present) { stopTyping(); return; }
|
|
203
189
|
const first = !typing;
|
|
@@ -235,27 +221,13 @@ export function createMascotDirector({ getTarget = () => null, caret = () => nul
|
|
|
235
221
|
armSleep();
|
|
236
222
|
}
|
|
237
223
|
|
|
238
|
-
function touch() {
|
|
239
|
-
activeAt = (seq += 1);
|
|
240
|
-
elect();
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
const self = {
|
|
244
|
-
visible: () => !destroyed && safe(isVisible) !== false,
|
|
245
|
-
activeAt: () => activeAt,
|
|
246
|
-
leadChanged() { if (!destroyed) safe(() => setEnabled(lead === self)); },
|
|
247
|
-
};
|
|
248
|
-
directors.add(self);
|
|
249
|
-
touch();
|
|
250
|
-
if (lead !== self) self.leadChanged();
|
|
251
|
-
|
|
252
224
|
return {
|
|
253
225
|
/** The draft changed (typing): the mascot watches the caret column. */
|
|
254
226
|
type,
|
|
255
227
|
/** Blur, or the draft went away. */
|
|
256
228
|
stopTyping,
|
|
257
|
-
/** A prompt went out: the watch hands over at once (the renderer
|
|
258
|
-
sent() {
|
|
229
|
+
/** A prompt went out: the watch hands over at once (the renderer gives the hero to the "Thinking" row). */
|
|
230
|
+
sent() { stopTyping(); },
|
|
259
231
|
/** A card waits on the user (`rectOf()` → its box), or none (null). */
|
|
260
232
|
setBlocked(rectOf) {
|
|
261
233
|
blocked = typeof rectOf === 'function' ? rectOf : null;
|
|
@@ -283,20 +255,12 @@ export function createMascotDirector({ getTarget = () => null, caret = () => nul
|
|
|
283
255
|
},
|
|
284
256
|
/** The turn ended with `pose` ('success' | 'error' | null): played once on the rig on screen. */
|
|
285
257
|
turnEnded,
|
|
286
|
-
/** The renderer's visible mascot changed
|
|
287
|
-
retarget() {
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
if (t && t !== target && t.kind === 'stage') touch();
|
|
291
|
-
apply();
|
|
292
|
-
},
|
|
293
|
-
/** The user is here (focus, a click): this panel animates. */
|
|
294
|
-
touch() { touch(); noteInput(); },
|
|
295
|
-
/** The host showed or hid the panel. */
|
|
296
|
-
visibilityChanged() { elect(); },
|
|
297
|
-
isLead: () => lead === self,
|
|
258
|
+
/** The renderer's visible mascot changed. */
|
|
259
|
+
retarget() { apply(); },
|
|
260
|
+
/** The user is here (focus, a click): a sleeping hero wakes, the quiet starts over. */
|
|
261
|
+
touch() { if (!destroyed) noteInput(); },
|
|
298
262
|
/** For tests and devtools: what the director holds right now. */
|
|
299
|
-
state: () => ({ target: target?.kind || null, pose: shown.split('|')[0] || null, typing, blocked: !!blocked, offline, sleeping, oneShot: oneShot?.pose || null
|
|
263
|
+
state: () => ({ target: target?.kind || null, pose: shown.split('|')[0] || null, typing, blocked: !!blocked, offline, sleeping, oneShot: oneShot?.pose || null }),
|
|
300
264
|
destroy() {
|
|
301
265
|
if (destroyed) return;
|
|
302
266
|
if (target && holding) safe(() => target.hold(false));
|
|
@@ -304,8 +268,6 @@ export function createMascotDirector({ getTarget = () => null, caret = () => nul
|
|
|
304
268
|
for (const id of [typingTimer, lookTimer, sleepTimer]) if (id) cancel(id);
|
|
305
269
|
dropOneShot();
|
|
306
270
|
if (stopInput) { safe(stopInput); stopInput = null; }
|
|
307
|
-
directors.delete(self);
|
|
308
|
-
if (lead === self) { lead = null; elect(); }
|
|
309
271
|
},
|
|
310
272
|
};
|
|
311
273
|
}
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
// info { label, value } → non-interactive row
|
|
22
22
|
// tag { label } → non-interactive badge row
|
|
23
23
|
// input { placeholder, value, onSubmit } → inline text field
|
|
24
|
+
// `restoreFocus` on an item or input sends focus back to the anchor once it is chosen.
|
|
24
25
|
// Keys: ↑/↓ move, Home/End jump, Enter/Space activate, Esc closes (focus back
|
|
25
26
|
// to the anchor), Tab closes. The optional filter hides non-matching items and
|
|
26
27
|
// any group left empty.
|
|
@@ -72,6 +73,7 @@ export function closeMenu({ restoreFocus = false } = {}) {
|
|
|
72
73
|
menu.remove();
|
|
73
74
|
if (anchor?.isConnected) {
|
|
74
75
|
if (anchor.getAttribute('aria-haspopup')) anchor.setAttribute('aria-expanded', 'false');
|
|
76
|
+
anchor.removeAttribute('aria-controls');
|
|
75
77
|
if (restoreFocus) { try { anchor.focus({ preventScroll: true }); } catch { /* detached */ } }
|
|
76
78
|
}
|
|
77
79
|
try { onClose?.(); } catch { /* listener error */ }
|
|
@@ -115,7 +117,7 @@ function buildItems(list, items, { role, onActivate }) {
|
|
|
115
117
|
input.value = spec.value || '';
|
|
116
118
|
input.setAttribute('aria-label', spec.label || spec.placeholder || 'Value');
|
|
117
119
|
input.dataset.submit = '1';
|
|
118
|
-
input._asstSubmit = (value) => { closeMenu(); spec.onSubmit?.(value); };
|
|
120
|
+
input._asstSubmit = (value) => { closeMenu({ restoreFocus: !!spec.restoreFocus }); spec.onSubmit?.(value); };
|
|
119
121
|
list.appendChild(input);
|
|
120
122
|
continue;
|
|
121
123
|
}
|
|
@@ -160,7 +162,7 @@ function buildItems(list, items, { role, onActivate }) {
|
|
|
160
162
|
}
|
|
161
163
|
|
|
162
164
|
/** Hide items that do not match `query`, then any header/separator left without items. */
|
|
163
|
-
export function applyMenuFilter(list, query) {
|
|
165
|
+
export function applyMenuFilter(list, query, emptyLabel = 'No matches') {
|
|
164
166
|
const q = String(query || '').trim().toLowerCase();
|
|
165
167
|
const rows = [...list.children];
|
|
166
168
|
for (const row of rows) {
|
|
@@ -192,7 +194,7 @@ export function applyMenuFilter(list, query) {
|
|
|
192
194
|
let empty = list.querySelector('.asst-dd-empty.asst-dd-noresults');
|
|
193
195
|
const hasItem = rows.some(r => !r.hidden && (r.classList.contains('asst-dd-item') || r.classList.contains('asst-dd-input')));
|
|
194
196
|
if (q && !hasItem) {
|
|
195
|
-
if (!empty) { empty = el('div', 'asst-dd-empty asst-dd-noresults',
|
|
197
|
+
if (!empty) { empty = el('div', 'asst-dd-empty asst-dd-noresults', emptyLabel); list.appendChild(empty); }
|
|
196
198
|
empty.hidden = false;
|
|
197
199
|
} else if (empty) empty.hidden = true;
|
|
198
200
|
}
|
|
@@ -287,12 +289,13 @@ export function openMenu(anchor, opts = {}) {
|
|
|
287
289
|
item.onSelect?.(item, node);
|
|
288
290
|
};
|
|
289
291
|
buildItems(list, items, { role, onActivate: activate });
|
|
290
|
-
if (width) menu.style.minWidth = `${width}px`;
|
|
292
|
+
if (width) menu.style.minWidth = opts.repositionOnResize ? `min(${width}px, calc(100vw - 16px))` : `${width}px`;
|
|
293
|
+
if (width && opts.repositionOnResize) menu.style.width = `min(${width}px, calc(100vw - 16px))`;
|
|
291
294
|
document.body.appendChild(menu);
|
|
292
295
|
positionMenu(menu, anchor, placement);
|
|
293
296
|
|
|
294
297
|
if (filterInput) {
|
|
295
|
-
filterInput.addEventListener('input', () => { applyMenuFilter(list, filterInput.value); positionMenu(menu, anchor, placement); });
|
|
298
|
+
filterInput.addEventListener('input', () => { applyMenuFilter(list, filterInput.value, opts.filterEmptyLabel); positionMenu(menu, anchor, placement); });
|
|
296
299
|
}
|
|
297
300
|
|
|
298
301
|
const onDocDown = (e) => {
|
|
@@ -341,16 +344,17 @@ export function openMenu(anchor, opts = {}) {
|
|
|
341
344
|
// Keep single-letter global keybinds out of an open menu.
|
|
342
345
|
e.stopPropagation();
|
|
343
346
|
};
|
|
344
|
-
const onResize = () => closeMenu();
|
|
347
|
+
const onResize = () => opts.repositionOnResize ? positionMenu(menu, anchor, placement) : closeMenu();
|
|
348
|
+
const onBlur = () => closeMenu();
|
|
345
349
|
document.addEventListener('mousedown', onDocDown, true);
|
|
346
350
|
document.addEventListener('keydown', onKey, true);
|
|
347
351
|
window.addEventListener('resize', onResize);
|
|
348
|
-
window.addEventListener('blur',
|
|
352
|
+
window.addEventListener('blur', onBlur);
|
|
349
353
|
const cleanup = () => {
|
|
350
354
|
document.removeEventListener('mousedown', onDocDown, true);
|
|
351
355
|
document.removeEventListener('keydown', onKey, true);
|
|
352
356
|
window.removeEventListener('resize', onResize);
|
|
353
|
-
window.removeEventListener('blur',
|
|
357
|
+
window.removeEventListener('blur', onBlur);
|
|
354
358
|
};
|
|
355
359
|
|
|
356
360
|
_open = { menu, anchor, onClose, cleanup };
|