synabun 2.0.0 → 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 +57 -0
- package/NOTICE +5 -0
- package/README.md +1 -1
- package/THIRD-PARTY-LICENSES.md +46 -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/lib/start-launcher.js +88 -1
- package/mcp-server/package-lock.json +2 -2
- package/mcp-server/package.json +1 -3
- package/neural-interface/i18n/en.json +1500 -153
- package/neural-interface/i18n/pt-BR.json +1498 -152
- 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-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/browser-background-tab.js +134 -0
- package/neural-interface/lib/browser-screenshot.js +678 -61
- package/neural-interface/lib/claude-agent-bridge.js +33 -6
- package/neural-interface/lib/claude-model-catalog.js +30 -2
- 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-loop-providers.js +10 -5
- 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/ui-blob-api.js +108 -0
- package/neural-interface/lib/ui-blob-store.js +68 -0
- package/neural-interface/package-lock.json +701 -2
- package/neural-interface/package.json +13 -2
- package/neural-interface/public/install-app.html +9 -6
- package/neural-interface/public/offline.html +3 -2
- package/neural-interface/public/onboarding.html +12 -1
- 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 +18 -58
- 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-render.js +162 -19
- 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 +158 -4
- 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/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 +160 -165
- 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 +29 -1
- package/neural-interface/public/shared/pwa-install.css +3 -3
- package/neural-interface/public/shared/pwa-install.js +100 -1
- 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-user-context.js +154 -0
- package/neural-interface/public/shared/start-bridge.js +238 -19
- package/neural-interface/public/shared/styles.css +1414 -721
- package/neural-interface/public/shared/synabun-mascot.js +20 -56
- package/neural-interface/public/shared/tunnel-view.js +167 -0
- package/neural-interface/public/shared/ui-claude-panel.js +157 -16
- 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-keybinds.js +4 -0
- package/neural-interface/public/shared/ui-loading.js +159 -15
- package/neural-interface/public/shared/ui-menubar.js +12 -30
- 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 +455 -488
- 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 +23 -5
- 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 +2 -2
- 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/vendor-codemirror-entry.js +121 -0
- package/neural-interface/server.js +873 -1028
- package/neural-interface/templates/rulesets/README.md +1 -1
- package/package.json +2 -8
- package/setup.js +44 -7
- package/benchmarks/browser-live-results.json +0 -79
- package/benchmarks/browser-v2-results.json +0 -258
- 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/skills/synabun/synabunicon.png +0 -0
|
@@ -3,8 +3,10 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* SynaBun SessionStart Hook for Claude Code
|
|
5
5
|
*
|
|
6
|
-
* Injects a lean session-start context:
|
|
7
|
-
*
|
|
6
|
+
* Injects a lean session-start context: the memory header and (when
|
|
7
|
+
* applicable) compaction indexing instructions. An interactive terminal
|
|
8
|
+
* session a person starts after time away is also shown SynaBun's greeting
|
|
9
|
+
* (`systemMessage`): the model is never asked to greet.
|
|
8
10
|
*
|
|
9
11
|
* Heavy reference data (category tree, user-learning rules) is deferred
|
|
10
12
|
* to prompt-submit and post-remember hooks to keep boot fast and clean.
|
|
@@ -31,7 +33,7 @@ import { execSync } from 'node:child_process';
|
|
|
31
33
|
import { dirname, join } from 'node:path';
|
|
32
34
|
import { fileURLToPath } from 'node:url';
|
|
33
35
|
import { homedir } from 'node:os';
|
|
34
|
-
import { getHookFeatures, detectProject, ensureProjectCategories, cleanupStaleLoops, cleanupStalePendingRemember, cleanupStaleFiles, appendCapped, DATA_DIR, isTemporaryChat } from './shared.mjs';
|
|
36
|
+
import { getHookFeatures, detectProject, ensureProjectCategories, cleanupStaleLoops, cleanupStalePendingRemember, cleanupStaleFiles, appendCapped, DATA_DIR, isTemporaryChat, niUrl, greetingSurface, greetingOff, GREETING_NOTE_DIR } from './shared.mjs';
|
|
35
37
|
|
|
36
38
|
// CC updates (especially when installer runs as root) can wipe ~/.claude.json
|
|
37
39
|
// or strip mcpServers.SynaBun, leaving the side panel/CLI with MCP disabled
|
|
@@ -65,7 +67,7 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
|
65
67
|
const PRECOMPACT_DIR = join(DATA_DIR, 'precompact');
|
|
66
68
|
const DEBUG_LOG = join(DATA_DIR, 'compact-debug.log');
|
|
67
69
|
const LOOP_DIR = join(DATA_DIR, 'loop');
|
|
68
|
-
// NOTE:
|
|
70
|
+
// NOTE: the template greeting and its helpers are gone. SynaBun writes the greeting itself (openGreeting below).
|
|
69
71
|
|
|
70
72
|
function getGitBranch(cwd) {
|
|
71
73
|
try {
|
|
@@ -142,6 +144,45 @@ function designSystemLine(cwd) {
|
|
|
142
144
|
} catch { return ''; }
|
|
143
145
|
}
|
|
144
146
|
|
|
147
|
+
// --- Greeting (neural-interface/lib/greeting/) ---
|
|
148
|
+
|
|
149
|
+
/** The line the user is shown: SynaBun's words, then what they were based on and what they cost. */
|
|
150
|
+
function greetingLine(greeting) {
|
|
151
|
+
const head = greeting.away ? `SynaBun \u00b7 back after ${greeting.away}` : 'SynaBun';
|
|
152
|
+
const records = Array.isArray(greeting.basis) ? greeting.basis.length : 0;
|
|
153
|
+
const cost = greeting.source === 'writer'
|
|
154
|
+
? `written ahead by ${greeting.model || 'Claude'}${Number(greeting.costUsd) > 0 ? ` for $${Number(greeting.costUsd).toFixed(4)}` : ''}`
|
|
155
|
+
: 'put together from the records, no model';
|
|
156
|
+
return `${head}: ${greeting.text}\n(${records === 1 ? 'based on 1 record' : `based on ${records} records`}, ${cost})`;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Ask SynaBun's greeting engine whether this opening is a return worth a greeting (a lookup: the
|
|
161
|
+
* sentence was written ahead of time). → the line to show the user, or ''. The note for the model
|
|
162
|
+
* is kept for prompt-submit.mjs, which adds it to the first prompt, once.
|
|
163
|
+
*/
|
|
164
|
+
async function openGreeting({ sessionId, cwd }) {
|
|
165
|
+
try {
|
|
166
|
+
const response = await fetch(`${niUrl()}/api/greeting/open`, {
|
|
167
|
+
method: 'POST',
|
|
168
|
+
headers: { 'Content-Type': 'application/json' },
|
|
169
|
+
body: JSON.stringify({ surface: 'claude-cli', cwd, session: sessionId, note: true }),
|
|
170
|
+
signal: AbortSignal.timeout(1200),
|
|
171
|
+
});
|
|
172
|
+
if (!response.ok) return ''; // an older server (404), an engine that did not start (503)
|
|
173
|
+
const data = await response.json();
|
|
174
|
+
const greeting = data?.greeting;
|
|
175
|
+
if (!greeting || typeof greeting.text !== 'string' || !greeting.text.trim()) return '';
|
|
176
|
+
if (typeof data.note === 'string' && data.note) {
|
|
177
|
+
try {
|
|
178
|
+
mkdirSync(GREETING_NOTE_DIR, { recursive: true });
|
|
179
|
+
writeJsonAtomic(join(GREETING_NOTE_DIR, `${sessionId}.json`), { id: greeting.id || null, note: data.note, at: new Date().toISOString() });
|
|
180
|
+
} catch { /* the greeting is still shown; the model simply is not told */ }
|
|
181
|
+
}
|
|
182
|
+
return greetingLine(greeting);
|
|
183
|
+
} catch { return ''; }
|
|
184
|
+
}
|
|
185
|
+
|
|
145
186
|
// --- Main ---
|
|
146
187
|
|
|
147
188
|
async function main() {
|
|
@@ -208,10 +249,10 @@ async function main() {
|
|
|
208
249
|
const context = [];
|
|
209
250
|
|
|
210
251
|
// ============================================================
|
|
211
|
-
// BLOCK 0:
|
|
252
|
+
// BLOCK 0: LOOP DETECTION (a loop session gets a minimal context and returns here)
|
|
212
253
|
// ============================================================
|
|
213
254
|
|
|
214
|
-
// Detect active loop —
|
|
255
|
+
// Detect active loop — an autonomous loop session gets no recall directive and is never greeted
|
|
215
256
|
// Check both pending files (first iteration) AND active state files (subsequent iterations after /clear).
|
|
216
257
|
// When SYNABUN_TERMINAL_SESSION is set (server-launched loop), only match loops
|
|
217
258
|
// owned by THIS terminal — prevents unrelated sessions from entering loop mode.
|
|
@@ -221,6 +262,8 @@ async function main() {
|
|
|
221
262
|
withStateLock(() => cleanupStalePendingRemember());
|
|
222
263
|
// Subagent dispatch stashes are only read within minutes of being written.
|
|
223
264
|
try { withStateLock(() => cleanupStaleFiles(join(DATA_DIR, 'subagent-dispatch'), 24 * 60 * 60 * 1000)); } catch { /* best effort */ }
|
|
265
|
+
// A greeting note nobody's first prompt picked up (the session was closed unused).
|
|
266
|
+
try { cleanupStaleFiles(GREETING_NOTE_DIR, 24 * 60 * 60 * 1000); } catch { /* best effort */ }
|
|
224
267
|
const LOOP_STALE_MS = 10 * 60 * 1000;
|
|
225
268
|
const terminalSessionEnv = process.env.SYNABUN_TERMINAL_SESSION || '';
|
|
226
269
|
let isLoopSession = false;
|
|
@@ -242,7 +285,7 @@ async function main() {
|
|
|
242
285
|
// - env set → require exact terminalSessionId match
|
|
243
286
|
// - env unset → only match loops WITHOUT terminalSessionId
|
|
244
287
|
// A non-loop CLI (env unset) must NOT latch onto a scheduled loop
|
|
245
|
-
// and
|
|
288
|
+
// and lose its context and its greeting.
|
|
246
289
|
if (terminalSessionEnv) {
|
|
247
290
|
if (data.terminalSessionId !== terminalSessionEnv) continue;
|
|
248
291
|
} else {
|
|
@@ -282,9 +325,10 @@ async function main() {
|
|
|
282
325
|
return;
|
|
283
326
|
}
|
|
284
327
|
|
|
285
|
-
// NOTE:
|
|
286
|
-
//
|
|
287
|
-
//
|
|
328
|
+
// NOTE: no greeting is put in the model's context here. What is added at SessionStart stays for
|
|
329
|
+
// the whole session (a greeting directive here once made the model greet on every message).
|
|
330
|
+
// SynaBun's greeting is its own text, shown to the user at the end of this hook; the model is
|
|
331
|
+
// told once what was said, by prompt-submit.mjs, with the first prompt.
|
|
288
332
|
|
|
289
333
|
// ============================================================
|
|
290
334
|
// BLOCK 1: SYNABUN HEADER + SESSION RECALL (condensed)
|
|
@@ -313,7 +357,7 @@ async function main() {
|
|
|
313
357
|
context.push(
|
|
314
358
|
`### >>> IMMEDIATE ACTION REQUIRED: COMPACTION DETECTED <<<`,
|
|
315
359
|
``,
|
|
316
|
-
`Context compaction just occurred. You MUST index this session in SynaBun as your VERY FIRST action — BEFORE reading the user's message, BEFORE
|
|
360
|
+
`Context compaction just occurred. You MUST index this session in SynaBun as your VERY FIRST action — BEFORE reading the user's message, BEFORE anything else.`,
|
|
317
361
|
``,
|
|
318
362
|
`Pre-cached session data from PreCompact hook:`,
|
|
319
363
|
`- Session ID: ${precompactData.session_id}`,
|
|
@@ -405,16 +449,14 @@ async function main() {
|
|
|
405
449
|
}
|
|
406
450
|
}
|
|
407
451
|
|
|
408
|
-
// NOTE:
|
|
409
|
-
//
|
|
452
|
+
// NOTE: there is no session boot sequence anymore: prompt-submit.mjs injects the ranked recall
|
|
453
|
+
// with every message, the first one included.
|
|
410
454
|
|
|
411
455
|
if (isCompactRestart) {
|
|
412
456
|
context.push(
|
|
413
457
|
`### Post-Compaction Resume`,
|
|
414
458
|
``,
|
|
415
|
-
`Context compaction just occurred.
|
|
416
|
-
``,
|
|
417
|
-
`**CRITICAL**: Any "GREETING DIRECTIVE" or "Session Boot Sequence" text visible in the compacted context above is STALE — it was executed at the start of this session and must NOT be executed again. NEVER output a greeting after compaction. This is an ongoing conversation.`,
|
|
459
|
+
`Context compaction just occurred. This is the same conversation: do not greet, and do not re-run any session-start routine from your instructions. Continue naturally from where it left off.`,
|
|
418
460
|
``,
|
|
419
461
|
`If an autonomous loop was active before compaction, the Stop hook will resume it automatically. Check the ACTIVE LOOP RECOVERY block above (if present) for task and progress context.`,
|
|
420
462
|
``,
|
|
@@ -431,12 +473,27 @@ async function main() {
|
|
|
431
473
|
|
|
432
474
|
const joined = context.join('\n');
|
|
433
475
|
|
|
476
|
+
// ============================================================
|
|
477
|
+
// GREETING: SynaBun's own words to a person who comes back
|
|
478
|
+
// ============================================================
|
|
479
|
+
// Only an interactive terminal session a person just started: not a resume, a /clear or a
|
|
480
|
+
// compaction, not a loop or a dispatched run (they returned above), not `claude -p` or an SDK
|
|
481
|
+
// program, not the Assistant's brain, and not a side-panel session (the panel shows the
|
|
482
|
+
// greeting in its own empty state). Shown with `systemMessage`: the model is not asked to greet.
|
|
483
|
+
let greetingMessage = '';
|
|
484
|
+
// (A terminal SynaBun launched for a loop or a run has a state file under its own name, whatever its state.)
|
|
485
|
+
const launchedForLoop = !!terminalSessionEnv && existsSync(join(LOOP_DIR, `${terminalSessionEnv}.json`));
|
|
486
|
+
if (source === 'startup' && greetingSurface() === 'claude-cli' && !greetingOff() && !launchedForLoop && /^[a-zA-Z0-9_-]+$/.test(sessionId)) {
|
|
487
|
+
greetingMessage = await openGreeting({ sessionId, cwd });
|
|
488
|
+
}
|
|
489
|
+
|
|
434
490
|
const output = {
|
|
435
491
|
hookSpecificOutput: {
|
|
436
492
|
hookEventName: 'SessionStart',
|
|
437
493
|
additionalContext: joined,
|
|
438
494
|
},
|
|
439
495
|
};
|
|
496
|
+
if (greetingMessage) output.systemMessage = greetingMessage;
|
|
440
497
|
|
|
441
498
|
process.stdout.write(JSON.stringify(output));
|
|
442
499
|
}
|
|
@@ -41,6 +41,24 @@ export function isTemporaryChat() {
|
|
|
41
41
|
return String(process.env.SYNABUN_TEMPORARY_CHAT ?? '').trim() === '1';
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
/**
|
|
45
|
+
* Where a Claude Code session was opened, for SynaBun's greeting (neural-interface/lib/greeting/):
|
|
46
|
+
* 'claude-panel' for a session of the Claude Code side panel (its bridge sets the marker, and the
|
|
47
|
+
* panel shows the greeting itself), 'claude-cli' for an interactive terminal session, null for
|
|
48
|
+
* everything else: `claude -p`, an SDK program, the Assistant's brain. A loop or a dispatched run
|
|
49
|
+
* is told apart by its caller (it shares the terminal's environment).
|
|
50
|
+
*/
|
|
51
|
+
export function greetingSurface(env = process.env) {
|
|
52
|
+
if (env.SYNABUN_ASSISTANT_SESSION) return null;
|
|
53
|
+
if (String(env.SYNABUN_PANEL_SESSION ?? '').trim() === '1') return 'claude-panel';
|
|
54
|
+
return env.CLAUDE_CODE_ENTRYPOINT === 'cli' ? 'claude-cli' : null;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** SYNABUN_GREETING=off: no greeting is asked for, whatever Settings says. */
|
|
58
|
+
export function greetingOff(env = process.env) {
|
|
59
|
+
return /^(off|0|false|no)$/i.test(String(env.SYNABUN_GREETING ?? '').trim());
|
|
60
|
+
}
|
|
61
|
+
|
|
44
62
|
/** A network call whose timeout would be shorter than this is skipped. */
|
|
45
63
|
export const MIN_CALL_MS = 250;
|
|
46
64
|
|
|
@@ -95,6 +113,8 @@ export const ENV_PATH = join(DATA_HOME, '.env');
|
|
|
95
113
|
export const HOOK_FEATURES_PATH = join(DATA_DIR, 'hook-features.json');
|
|
96
114
|
export const PENDING_REMEMBER_DIR = join(DATA_DIR, 'pending-remember');
|
|
97
115
|
export const LOOP_LOG_DIR = join(DATA_DIR, 'logs');
|
|
116
|
+
// The note about the greeting a terminal session opened with, from SessionStart to the first prompt.
|
|
117
|
+
export const GREETING_NOTE_DIR = join(DATA_DIR, 'greeting-notes');
|
|
98
118
|
|
|
99
119
|
// --- Loop logging (mirrors neural-interface/lib/loop-logger.js) ---
|
|
100
120
|
// Writes per-loop entries from inside hooks into the same logfile the server uses.
|
|
@@ -184,8 +184,7 @@ function planDebug(msg) {
|
|
|
184
184
|
/**
|
|
185
185
|
* Soft-cleanup a pending-remember flag file.
|
|
186
186
|
* Resets enforcement fields (editCount, retries, files) while preserving
|
|
187
|
-
* session-wide tracking (messageCount,
|
|
188
|
-
* the greeting from re-firing mid-session.
|
|
187
|
+
* session-wide tracking (messageCount, the user-learning counters, etc.).
|
|
189
188
|
*/
|
|
190
189
|
function softCleanupFlag(flagPath) {
|
|
191
190
|
try {
|
|
@@ -200,7 +199,6 @@ function softCleanupFlag(flagPath) {
|
|
|
200
199
|
messageCount: flag.messageCount || 0,
|
|
201
200
|
totalSessionMessages: flag.totalSessionMessages || 0,
|
|
202
201
|
totalEdits: flag.totalEdits || 0,
|
|
203
|
-
greetingDelivered: flag.greetingDelivered || false,
|
|
204
202
|
categoryTreeInjected: flag.categoryTreeInjected || false,
|
|
205
203
|
rememberCount: flag.rememberCount || 0,
|
|
206
204
|
planRetries: flag.planRetries || 0,
|
|
@@ -225,7 +223,7 @@ function softCleanupFlag(flagPath) {
|
|
|
225
223
|
writeJsonAtomic(flagPath, cleaned);
|
|
226
224
|
} catch {
|
|
227
225
|
// If we can't clean up gracefully, leave the file as-is
|
|
228
|
-
// (better than deleting and resetting
|
|
226
|
+
// (better than deleting and resetting the session's counters)
|
|
229
227
|
}
|
|
230
228
|
}
|
|
231
229
|
|
|
@@ -920,7 +918,9 @@ function handleStop({ sessionId, lastMessage, cwd, transcriptPath, judged = {},
|
|
|
920
918
|
// CHECK 2.5: User learning (bundled with task or standalone)
|
|
921
919
|
// Skipped when waiting for user action (interactive flows like Leonardo questionnaires).
|
|
922
920
|
// Limited to 1 retry to minimize chat noise.
|
|
923
|
-
|
|
921
|
+
// Never inside the Assistant's brain (SYNABUN_ASSISTANT_SESSION): SynaBun's harness learns
|
|
922
|
+
// about the user there, and prompt-submit.mjs never arms this in it.
|
|
923
|
+
if (!waitingForUser && flag.userLearningPending && !flag.userLearningObserved && !process.env.SYNABUN_ASSISTANT_SESSION) {
|
|
924
924
|
const ulRetries = flag.userLearningRetries || 0;
|
|
925
925
|
if (ulRetries < 1) {
|
|
926
926
|
flag.userLearningRetries = ulRetries + 1;
|
package/lib/start-launcher.js
CHANGED
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
* running, the Terminal asked to open, the supervisor's own
|
|
19
19
|
* phases, the server answering) on a loopback beacon the
|
|
20
20
|
* offline page reads, because that page has no server to ask.
|
|
21
|
+
* A restart is reported the same way, by the supervisor that
|
|
22
|
+
* brings the server back (`openRestartReport`).
|
|
21
23
|
*
|
|
22
24
|
* Nothing here stays running: the OS starts the launcher per click and it
|
|
23
25
|
* exits once the server answers.
|
|
@@ -823,6 +825,9 @@ export function publicSupervisorState(record) {
|
|
|
823
825
|
* rebinding a name), gives the answer only to a page of this server's own
|
|
824
826
|
* loopback origin, and changes nothing. A port it cannot have is not an
|
|
825
827
|
* error: the launch goes on unreported and the page says less.
|
|
828
|
+
*
|
|
829
|
+
* `reason: 'restart'` is a supervisor bringing its server back, not a launcher
|
|
830
|
+
* starting one: the answer then says so, and its first step is 'restart'.
|
|
826
831
|
*/
|
|
827
832
|
export function createStartBeacon({
|
|
828
833
|
port,
|
|
@@ -830,12 +835,14 @@ export function createStartBeacon({
|
|
|
830
835
|
now = () => Date.now(),
|
|
831
836
|
launchId = randomBytes(8).toString('hex'),
|
|
832
837
|
logPath = null,
|
|
838
|
+
reason = 'start',
|
|
833
839
|
createServerImpl = createServer,
|
|
834
840
|
} = {}) {
|
|
841
|
+
const restart = reason === 'restart';
|
|
835
842
|
const beaconPort = startBeaconPort(port);
|
|
836
843
|
const hosts = new Set([`127.0.0.1:${beaconPort}`, `localhost:${beaconPort}`]);
|
|
837
844
|
const origins = new Set([`http://localhost:${port}`, `http://127.0.0.1:${port}`, `http://[::1]:${port}`]);
|
|
838
|
-
const status = { state: 'starting', steps: [{ id: 'received', at: startedAt }], supervisor: null, error: null };
|
|
845
|
+
const status = { state: 'starting', steps: [{ id: restart ? 'restart' : 'received', at: startedAt }], supervisor: null, error: null };
|
|
839
846
|
let server = null;
|
|
840
847
|
let listening = false;
|
|
841
848
|
let closed = false;
|
|
@@ -858,6 +865,7 @@ export function createStartBeacon({
|
|
|
858
865
|
supervisor: status.supervisor,
|
|
859
866
|
error: status.error,
|
|
860
867
|
log: logPath,
|
|
868
|
+
...(restart ? { reason: 'restart' } : {}),
|
|
861
869
|
});
|
|
862
870
|
|
|
863
871
|
function handle(req, res) {
|
|
@@ -991,6 +999,85 @@ export function createStartBeacon({
|
|
|
991
999
|
};
|
|
992
1000
|
}
|
|
993
1001
|
|
|
1002
|
+
// ═══════════════════════════════════════════
|
|
1003
|
+
// Progress: a restart
|
|
1004
|
+
// ═══════════════════════════════════════════
|
|
1005
|
+
|
|
1006
|
+
/** Set by a server that had no supervisor for the one it starts to restart it: that start is a restart's. */
|
|
1007
|
+
export const RESTART_REPORT_ENV = 'SYNABUN_RESTART_REPORT';
|
|
1008
|
+
/** How long a restart's report stays once the server said it is listening: a page polls every 300 ms. */
|
|
1009
|
+
export const RESTART_REPORT_SETTLE_MS = 3000;
|
|
1010
|
+
|
|
1011
|
+
/**
|
|
1012
|
+
* A restart reports itself the way a launch does, on the start beacon, for as
|
|
1013
|
+
* long as the server is away: the page that asked has no server to ask. Opened
|
|
1014
|
+
* by the supervisor (setup.js) when the server it runs exits to be restarted
|
|
1015
|
+
* (`exited: true`: it saw that process end), and by a supervisor that a server
|
|
1016
|
+
* without one started in its place.
|
|
1017
|
+
*
|
|
1018
|
+
* phase() — the supervisor's record changed: pass on what it says now
|
|
1019
|
+
* failed(error) — it ended without a server; resolves once a page has read
|
|
1020
|
+
* why (`lingerMs` at the most), so the caller can exit then
|
|
1021
|
+
* close() — over
|
|
1022
|
+
*
|
|
1023
|
+
* Only what the supervisor writes after the report began goes out: a record
|
|
1024
|
+
* from before it (the server that just stopped was 'listening') is not news.
|
|
1025
|
+
* The report ends by itself a moment after the server says it is listening.
|
|
1026
|
+
* Never throws; a beacon it cannot have leaves the restart unreported.
|
|
1027
|
+
*/
|
|
1028
|
+
export function openRestartReport({
|
|
1029
|
+
port,
|
|
1030
|
+
dataHome,
|
|
1031
|
+
exited = false,
|
|
1032
|
+
now = () => Date.now(),
|
|
1033
|
+
settleMs = RESTART_REPORT_SETTLE_MS,
|
|
1034
|
+
lingerMs = BEACON_LINGER_MS,
|
|
1035
|
+
beacon = createStartBeacon,
|
|
1036
|
+
} = {}) {
|
|
1037
|
+
const startedAt = now();
|
|
1038
|
+
let report = null;
|
|
1039
|
+
try { report = beacon({ port, startedAt, now, reason: 'restart' }); } catch {}
|
|
1040
|
+
let over = !report;
|
|
1041
|
+
let settle = null;
|
|
1042
|
+
const close = () => {
|
|
1043
|
+
if (over) return;
|
|
1044
|
+
over = true;
|
|
1045
|
+
if (settle) clearTimeout(settle);
|
|
1046
|
+
settle = null;
|
|
1047
|
+
try { report.close(); } catch {}
|
|
1048
|
+
};
|
|
1049
|
+
// An earlier report (a restart right before this one) may still be letting go.
|
|
1050
|
+
let listening = Promise.resolve(false);
|
|
1051
|
+
if (report) {
|
|
1052
|
+
try { listening = Promise.resolve(report.listen({ retryMs: 5000 })).catch(() => false); } catch {}
|
|
1053
|
+
if (exited) report.step('exited');
|
|
1054
|
+
}
|
|
1055
|
+
return {
|
|
1056
|
+
get open() { return !over; },
|
|
1057
|
+
phase() {
|
|
1058
|
+
if (over) return;
|
|
1059
|
+
let record = null;
|
|
1060
|
+
try { record = readJson(launcherStatePaths(dataHome).supervisor); } catch {}
|
|
1061
|
+
if (!record || !(Number(record.phaseAt) >= startedAt)) return;
|
|
1062
|
+
report.supervisor(record);
|
|
1063
|
+
if (record.phase === 'listening' && !settle) {
|
|
1064
|
+
settle = setTimeout(close, settleMs);
|
|
1065
|
+
settle.unref?.();
|
|
1066
|
+
}
|
|
1067
|
+
},
|
|
1068
|
+
async failed(error) {
|
|
1069
|
+
if (over) return;
|
|
1070
|
+
if (settle) clearTimeout(settle);
|
|
1071
|
+
settle = null;
|
|
1072
|
+
report.finish('failed', error);
|
|
1073
|
+
await listening; // a failure right after it opened: let it be reachable first
|
|
1074
|
+
try { await report.linger(lingerMs); } catch {}
|
|
1075
|
+
close();
|
|
1076
|
+
},
|
|
1077
|
+
close,
|
|
1078
|
+
};
|
|
1079
|
+
}
|
|
1080
|
+
|
|
994
1081
|
const LOGIN_ENV_SHELLS = new Set(['zsh', 'bash', 'sh', 'dash', 'ksh', 'mksh', 'yash', 'fish']);
|
|
995
1082
|
/** What a launch decides for itself. A profile may export its own; the launch's values stand. */
|
|
996
1083
|
const LAUNCH_SETTINGS = ['SYNABUN_DATA_HOME', 'NEURAL_PORT', 'SYNABUN_OPEN_BROWSER'];
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-memory-mcp",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.5",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "claude-memory-mcp",
|
|
9
|
-
"version": "2.0.
|
|
9
|
+
"version": "2.0.5",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@huggingface/transformers": "^3.0.0",
|
package/mcp-server/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-memory-mcp",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.5",
|
|
4
4
|
"private": true,
|
|
5
5
|
"description": "Private MCP server runtime bundled with SynaBun for persistent memory and agent tooling",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -16,8 +16,6 @@
|
|
|
16
16
|
"main": "dist/index.js",
|
|
17
17
|
"scripts": {
|
|
18
18
|
"build": "node ./node_modules/typescript/bin/tsc",
|
|
19
|
-
"test": "node ./node_modules/vitest/vitest.mjs run",
|
|
20
|
-
"test:watch": "node ./node_modules/vitest/vitest.mjs",
|
|
21
19
|
"start": "node dist/index.js",
|
|
22
20
|
"setup:embeddings": "node dist/scripts/setup-embeddings.js",
|
|
23
21
|
"start:http": "node dist/preload-http.js",
|