synabun 2.0.0 → 2.0.7
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 +97 -0
- package/NOTICE +5 -0
- package/README.md +2 -1
- package/THIRD-PARTY-LICENSES.md +59 -0
- package/benchmarks/fixtures/browser/README.md +1 -1
- package/benchmarks/fixtures/desktop/README.md +1 -1
- package/docs/whatsapp.md +153 -18
- 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 +26 -3
- package/hooks/claude-code/stop.mjs +5 -5
- package/lib/child-path.js +303 -0
- package/lib/claude-hooks.js +2 -1
- package/lib/data-home-migration.js +2 -0
- package/lib/desktop-app.js +265 -0
- package/lib/external-tools.js +7 -3
- package/lib/log-redact.js +102 -0
- package/lib/packaged-runtime.js +138 -11
- package/lib/start-launcher.js +88 -1
- package/mcp-server/dist/http.d.ts +3 -1
- package/mcp-server/dist/http.d.ts.map +1 -1
- package/mcp-server/dist/http.js +15 -4
- package/mcp-server/dist/http.js.map +1 -1
- package/mcp-server/dist/index.d.ts.map +1 -1
- package/mcp-server/dist/index.js +9 -6
- package/mcp-server/dist/index.js.map +1 -1
- package/mcp-server/dist/services/budget-judgments.d.ts +108 -0
- package/mcp-server/dist/services/budget-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/budget-judgments.js +153 -0
- package/mcp-server/dist/services/budget-judgments.js.map +1 -0
- package/mcp-server/dist/services/codex-config-heal.d.ts +5 -1
- package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
- package/mcp-server/dist/services/codex-config-heal.js +41 -4
- package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
- package/mcp-server/dist/services/identity.d.ts +11 -0
- package/mcp-server/dist/services/identity.d.ts.map +1 -1
- package/mcp-server/dist/services/identity.js +24 -0
- package/mcp-server/dist/services/identity.js.map +1 -1
- package/mcp-server/dist/services/neural-interface.d.ts +13 -0
- package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
- package/mcp-server/dist/services/neural-interface.js +34 -2
- package/mcp-server/dist/services/neural-interface.js.map +1 -1
- package/mcp-server/dist/services/typesafe-config.d.ts +1 -1
- package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -1
- package/mcp-server/dist/services/typesafe-config.js +4 -1
- package/mcp-server/dist/services/typesafe-config.js.map +1 -1
- package/mcp-server/dist/tools/agents.d.ts +10 -7
- package/mcp-server/dist/tools/agents.d.ts.map +1 -1
- package/mcp-server/dist/tools/agents.js +34 -13
- package/mcp-server/dist/tools/agents.js.map +1 -1
- package/mcp-server/dist/tools/whatsapp-send-file.d.ts +17 -0
- package/mcp-server/dist/tools/whatsapp-send-file.d.ts.map +1 -0
- package/mcp-server/dist/tools/whatsapp-send-file.js +44 -0
- package/mcp-server/dist/tools/whatsapp-send-file.js.map +1 -0
- package/mcp-server/dist/tui.js +2 -1
- package/mcp-server/dist/tui.js.map +1 -1
- package/mcp-server/dist/version.d.ts +5 -0
- package/mcp-server/dist/version.d.ts.map +1 -0
- package/mcp-server/dist/version.js +21 -0
- package/mcp-server/dist/version.js.map +1 -0
- package/mcp-server/package-lock.json +2 -2
- package/mcp-server/package.json +1 -3
- package/mcp-server/run.mjs +15 -9
- package/mcp-server/src/http.ts +18 -3
- package/mcp-server/src/index.ts +9 -6
- package/mcp-server/src/services/budget-judgments.ts +183 -0
- package/mcp-server/src/services/codex-config-heal.ts +35 -4
- package/mcp-server/src/services/identity.ts +27 -0
- package/mcp-server/src/services/neural-interface.ts +34 -2
- package/mcp-server/src/services/typesafe-config.ts +4 -1
- package/mcp-server/src/tools/agents.ts +33 -14
- package/mcp-server/src/tools/whatsapp-send-file.ts +51 -0
- package/mcp-server/src/tui.ts +2 -1
- package/mcp-server/src/version.ts +22 -0
- package/neural-interface/i18n/en.json +2126 -209
- package/neural-interface/i18n/pt-BR.json +2123 -207
- package/neural-interface/lib/account-usage.js +163 -0
- package/neural-interface/lib/assistant-api.js +316 -57
- package/neural-interface/lib/assistant-brains/claude.js +19 -2
- package/neural-interface/lib/assistant-brains/codex.js +3 -0
- package/neural-interface/lib/assistant-brains/opencode.js +17 -4
- package/neural-interface/lib/assistant-budget-planner.js +390 -0
- package/neural-interface/lib/assistant-budget-split.js +408 -0
- package/neural-interface/lib/assistant-budget.js +94 -95
- package/neural-interface/lib/assistant-catalog.js +179 -27
- package/neural-interface/lib/assistant-config.js +91 -14
- package/neural-interface/lib/assistant-dispatch.js +494 -138
- package/neural-interface/lib/assistant-hidden-models.js +393 -66
- package/neural-interface/lib/assistant-jev.js +26 -3
- package/neural-interface/lib/assistant-memory.js +24 -10
- package/neural-interface/lib/assistant-persona.js +73 -12
- package/neural-interface/lib/assistant-plan-permissions.js +8 -1
- package/neural-interface/lib/assistant-pricing.js +21 -6
- package/neural-interface/lib/assistant-route-accounts.js +14 -0
- package/neural-interface/lib/assistant-route-gate.js +19 -3
- package/neural-interface/lib/assistant-router.js +373 -42
- package/neural-interface/lib/assistant-runtime.js +488 -59
- 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 +183 -0
- package/neural-interface/lib/augmented-path.js +317 -53
- package/neural-interface/lib/browser-background-tab.js +134 -0
- package/neural-interface/lib/browser-screenshot.js +678 -61
- package/neural-interface/lib/claude-accounts.js +342 -31
- package/neural-interface/lib/claude-agent-bridge.js +123 -9
- package/neural-interface/lib/claude-executable.js +6 -1
- package/neural-interface/lib/claude-model-catalog.js +33 -5
- package/neural-interface/lib/claude-panel-auth.js +221 -0
- package/neural-interface/lib/claude-profile-api-key.js +62 -0
- package/neural-interface/lib/claude-temporary.js +46 -7
- package/neural-interface/lib/cli-install-api.js +137 -0
- package/neural-interface/lib/cli-install.js +797 -0
- package/neural-interface/lib/cli-path.js +130 -0
- package/neural-interface/lib/cli-resolver.js +744 -0
- package/neural-interface/lib/cli-update-planner.js +143 -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/codex-account-auth.js +178 -0
- package/neural-interface/lib/codex-accounts.js +489 -0
- package/neural-interface/lib/codex-capabilities.js +2 -1
- package/neural-interface/lib/codex-compat-rpc.js +8 -2
- package/neural-interface/lib/codex-mcp-approvals.js +5 -1
- package/neural-interface/lib/codex-panel-auth.js +62 -0
- package/neural-interface/lib/codex-session-settings.js +1 -1
- package/neural-interface/lib/codex-settings-schema.js +120 -0
- package/neural-interface/lib/desktop/config.js +3 -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-bash/bzip2.js +339 -0
- package/neural-interface/lib/git-bash/claude-settings.js +73 -0
- package/neural-interface/lib/git-bash/extract-worker.js +34 -0
- package/neural-interface/lib/git-bash/install.js +529 -0
- package/neural-interface/lib/git-bash/licenses/COPYING +360 -0
- package/neural-interface/lib/git-bash/licenses/LGPL-2.1 +511 -0
- package/neural-interface/lib/git-bash/manager.js +268 -0
- package/neural-interface/lib/git-bash/pins.js +206 -0
- package/neural-interface/lib/git-bash/pins.json +34 -0
- package/neural-interface/lib/git-bash/resolver.js +194 -0
- package/neural-interface/lib/git-diff-api.js +103 -0
- package/neural-interface/lib/git-read.js +234 -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/install-details.js +145 -0
- package/neural-interface/lib/machine-names.js +88 -0
- package/neural-interface/lib/mcp-installer.js +14 -2
- package/neural-interface/lib/memory-api.js +31 -7
- package/neural-interface/lib/native-loop-providers.js +26 -8
- package/neural-interface/lib/native-loop-runtime.js +9 -4
- package/neural-interface/lib/os-path.js +319 -0
- package/neural-interface/lib/plugin-installer.js +4 -2
- package/neural-interface/lib/project-storage.js +5 -7
- package/neural-interface/lib/provider-panel-api-key-auth.js +92 -0
- package/neural-interface/lib/provider-panel-terminal-auth.js +95 -0
- package/neural-interface/lib/pty-host/core.js +2 -1
- package/neural-interface/lib/pty-host/manager.js +27 -2
- package/neural-interface/lib/remote-policy.js +20 -11
- package/neural-interface/lib/request-gate.js +589 -0
- package/neural-interface/lib/session-title-generator.js +4 -3
- package/neural-interface/lib/system-about.js +340 -0
- package/neural-interface/lib/system-activity.js +66 -0
- package/neural-interface/lib/terminal-env.js +11 -3
- package/neural-interface/lib/terminal-path.js +55 -0
- package/neural-interface/lib/ui-blob-api.js +108 -0
- package/neural-interface/lib/ui-blob-store.js +68 -0
- package/neural-interface/lib/virtual-socket.js +12 -1
- package/neural-interface/lib/whatsapp/baileys-adapter.js +165 -45
- package/neural-interface/lib/whatsapp/bridge.js +78 -34
- package/neural-interface/lib/whatsapp/commands.js +13 -14
- package/neural-interface/lib/whatsapp/config.js +134 -20
- package/neural-interface/lib/whatsapp/fake-baileys.js +99 -14
- package/neural-interface/lib/whatsapp/host-core.js +168 -35
- package/neural-interface/lib/whatsapp/inbound.js +5 -3
- package/neural-interface/lib/whatsapp/local-file.js +524 -0
- package/neural-interface/lib/whatsapp/manager.js +92 -32
- package/neural-interface/lib/whatsapp/paths.js +11 -1
- package/neural-interface/lib/whatsapp/protocol.js +65 -5
- package/neural-interface/lib/whatsapp/redact.js +63 -0
- package/neural-interface/lib/whatsapp/service.js +343 -91
- package/neural-interface/lib/whatsapp/transcription.js +463 -0
- package/neural-interface/package-lock.json +701 -2
- package/neural-interface/package.json +13 -2
- package/neural-interface/public/index.html +2 -0
- package/neural-interface/public/index2d.html +2 -0
- package/neural-interface/public/install-app.html +9 -6
- package/neural-interface/public/offline.html +19 -3
- package/neural-interface/public/onboarding.html +107 -2
- package/neural-interface/public/shared/account-i18n.js +7 -0
- package/neural-interface/public/shared/account-menu.js +539 -0
- package/neural-interface/public/shared/account-usage.js +19 -0
- package/neural-interface/public/shared/account-view.js +335 -0
- package/neural-interface/public/shared/agent-runtime-options.js +50 -14
- package/neural-interface/public/shared/assistant/asst-accounts.js +182 -184
- package/neural-interface/public/shared/assistant/asst-api.js +32 -2
- package/neural-interface/public/shared/assistant/asst-automation.js +286 -0
- package/neural-interface/public/shared/assistant/asst-brain-picker.js +430 -81
- package/neural-interface/public/shared/assistant/asst-budget.js +259 -303
- package/neural-interface/public/shared/assistant/asst-composer.js +11 -1
- package/neural-interface/public/shared/assistant/asst-mascot.js +140 -61
- package/neural-interface/public/shared/assistant/asst-menu.js +27 -11
- package/neural-interface/public/shared/assistant/asst-panel.js +198 -42
- package/neural-interface/public/shared/assistant/asst-render.js +197 -23
- package/neural-interface/public/shared/assistant/asst-route-models.js +108 -0
- package/neural-interface/public/shared/assistant/asst-route.js +95 -343
- package/neural-interface/public/shared/assistant/asst-routes-editor.js +534 -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-slash.js +1 -1
- package/neural-interface/public/shared/assistant/asst-state.js +186 -2
- package/neural-interface/public/shared/assistant/asst-styles.js +247 -11
- package/neural-interface/public/shared/blob-store.js +111 -22
- package/neural-interface/public/shared/cdx/cdx-commands.js +4 -1
- package/neural-interface/public/shared/cdx/cdx-features.js +22 -14
- package/neural-interface/public/shared/cdx/cdx-icons.js +2 -0
- package/neural-interface/public/shared/cdx/cdx-panel.js +80 -118
- package/neural-interface/public/shared/cdx/cdx-render.js +25 -89
- package/neural-interface/public/shared/cdx/cdx-settings.js +231 -0
- package/neural-interface/public/shared/cdx/cdx-styles.js +164 -107
- package/neural-interface/public/shared/cdx/cdx-tabs.js +348 -668
- package/neural-interface/public/shared/cdx/cdx-ws.js +2 -0
- package/neural-interface/public/shared/claude-account-view.js +3 -0
- package/neural-interface/public/shared/cli-install-view.js +392 -0
- package/neural-interface/public/shared/cli-status.js +282 -22
- package/neural-interface/public/shared/constants.js +6 -1
- package/neural-interface/public/shared/cp/cp-events.js +2 -1
- package/neural-interface/public/shared/cp/cp-rehydrate.js +2 -1
- package/neural-interface/public/shared/cp/cp-styles.js +61 -0
- package/neural-interface/public/shared/desktop-bridge.js +39 -0
- package/neural-interface/public/shared/desktop-titlebar-page.js +59 -0
- package/neural-interface/public/shared/desktop-titlebar-view.js +122 -0
- package/neural-interface/public/shared/desktop-titlebar.js +153 -0
- package/neural-interface/public/shared/desktop-update-view.js +462 -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/git-bash-view.js +145 -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 +161 -165
- package/neural-interface/public/shared/i18n.js +19 -1
- package/neural-interface/public/shared/install-details-view.js +86 -0
- 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 +131 -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 +22 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +158 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +3 -2
- package/neural-interface/public/shared/pwa-install-page.js +32 -2
- 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-about-pane.js +271 -0
- package/neural-interface/public/shared/settings/settings-about.js +254 -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 +33 -4
- package/neural-interface/public/shared/settings/settings-user-context.js +154 -0
- package/neural-interface/public/shared/showcase-privacy.js +489 -0
- package/neural-interface/public/shared/start-bridge.js +238 -19
- package/neural-interface/public/shared/storage.js +30 -3
- package/neural-interface/public/shared/styles.css +1710 -770
- package/neural-interface/public/shared/synabun-mascot.js +68 -58
- package/neural-interface/public/shared/tunnel-view.js +167 -0
- package/neural-interface/public/shared/ui-claude-panel.js +369 -229
- package/neural-interface/public/shared/ui-cli-banner.js +355 -0
- 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-git-bash.js +124 -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 +10 -1
- package/neural-interface/public/shared/ui-keybinds.js +4 -0
- package/neural-interface/public/shared/ui-loading.js +187 -19
- package/neural-interface/public/shared/ui-menubar.js +25 -33
- 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 +48 -22
- package/neural-interface/public/shared/ui-provider-auth.js +104 -0
- package/neural-interface/public/shared/ui-provider-terminal-auth.js +223 -0
- package/neural-interface/public/shared/ui-sessions.js +9 -3
- package/neural-interface/public/shared/ui-settings.js +509 -490
- package/neural-interface/public/shared/ui-sidepanel-runtime.js +2 -1
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +3 -1
- package/neural-interface/public/shared/ui-sync.js +22 -0
- package/neural-interface/public/shared/ui-terminal.js +40 -5
- package/neural-interface/public/shared/ui-tool-updates.js +5 -0
- 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-update.js +594 -5
- package/neural-interface/public/shared/ui-whatsapp.js +21 -6
- 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/whatsapp/wa-view.js +51 -8
- package/neural-interface/public/shared/worker-end.js +253 -0
- package/neural-interface/public/sw.js +2 -2
- package/neural-interface/public/variant/2d/main.js +10 -1
- package/neural-interface/public/variant/3d/main.js +10 -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/vendor-codemirror-entry.js +121 -0
- package/neural-interface/server.js +2085 -1629
- package/neural-interface/templates/rulesets/README.md +1 -1
- package/package.json +5 -8
- package/setup.js +53 -15
- 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
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun — Greeting: what a surface shows (DOM-free)
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// The one greeting every surface shows (the Assistant, the Claude Code, Codex
|
|
6
|
+
// and OpenCode panels, Settings' preview): the sentence SynaBun wrote, how long
|
|
7
|
+
// the person was away, and a disclosure of what it was based on and what it
|
|
8
|
+
// cost. This module decides every word; greeting-card.js draws it.
|
|
9
|
+
//
|
|
10
|
+
// GREETING_COPY is the English; `greeting.*` in i18n/*.json must equal it
|
|
11
|
+
// (tests/greeting-view.test.mjs). Elapsed time is computed here, at display:
|
|
12
|
+
// the sentence itself never says how long it has been, so one written hours
|
|
13
|
+
// ago is still true.
|
|
14
|
+
|
|
15
|
+
export const GREETING_COPY = Object.freeze({
|
|
16
|
+
label: 'Greeting from SynaBun',
|
|
17
|
+
back: 'Back after {time}',
|
|
18
|
+
'time.minute': '1 minute',
|
|
19
|
+
'time.minutes': '{n} minutes',
|
|
20
|
+
'time.hour': '1 hour',
|
|
21
|
+
'time.hours': '{n} hours',
|
|
22
|
+
'time.day': '1 day',
|
|
23
|
+
'time.days': '{n} days',
|
|
24
|
+
'time.week': '1 week',
|
|
25
|
+
'time.weeks': '{n} weeks',
|
|
26
|
+
'time.month': '1 month',
|
|
27
|
+
'time.months': '{n} months',
|
|
28
|
+
'basis.one': 'Based on 1 record',
|
|
29
|
+
'basis.many': 'Based on {n} records',
|
|
30
|
+
'basis.none': 'What this is based on',
|
|
31
|
+
'kind.thread': 'Last conversation',
|
|
32
|
+
'kind.session': 'Last session',
|
|
33
|
+
'kind.open': 'Open',
|
|
34
|
+
'kind.memory': 'Noted',
|
|
35
|
+
'kind.run': 'Run',
|
|
36
|
+
'kind.schedule': 'Schedule',
|
|
37
|
+
'kind.elsewhere': 'Elsewhere',
|
|
38
|
+
'kind.git': 'Working tree',
|
|
39
|
+
'kind.owner': 'About you',
|
|
40
|
+
'agent.assistant': 'Assistant',
|
|
41
|
+
'agent.claude-code': 'Claude Code',
|
|
42
|
+
'agent.codex': 'Codex',
|
|
43
|
+
'agent.opencode': 'OpenCode',
|
|
44
|
+
open: 'Open memory',
|
|
45
|
+
'source.writer': 'Written ahead by {model}',
|
|
46
|
+
'source.fallback': 'Put together from the records, no model',
|
|
47
|
+
'why.not-prepared': 'nothing was written ahead yet',
|
|
48
|
+
'why.out-of-date': 'what was written ahead was older than the news',
|
|
49
|
+
'why.no-writer': 'no Claude sign-in to write with',
|
|
50
|
+
'why.daily-cap': 'the daily limit of writer calls was reached',
|
|
51
|
+
'why.other': 'the writer gave no usable sentence',
|
|
52
|
+
tokens: '{n} tokens',
|
|
53
|
+
prepared: 'written {time} ago',
|
|
54
|
+
free: 'no tokens spent',
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
const num = (value) => (Number.isFinite(Number(value)) && Number(value) > 0 ? Math.round(Number(value)) : 0);
|
|
58
|
+
|
|
59
|
+
/** A string of the greeting, through the app's translator when it has one. */
|
|
60
|
+
export function greetingText(key, params = null, t = null) {
|
|
61
|
+
const full = `greeting.${key}`;
|
|
62
|
+
let value;
|
|
63
|
+
try { value = typeof t === 'function' ? t(full, params || undefined) : undefined; } catch { value = undefined; }
|
|
64
|
+
if (typeof value === 'string' && value && value !== full) return value;
|
|
65
|
+
const fallback = GREETING_COPY[key];
|
|
66
|
+
if (typeof fallback !== 'string') return key;
|
|
67
|
+
return params ? fallback.replace(/\{(\w+)\}/g, (_, name) => (params[name] != null ? String(params[name]) : `{${name}}`)) : fallback;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** "40 minutes" · "3 hours" · "2 days" · "3 weeks" · "4 months", in the app's language. '' for no time. */
|
|
71
|
+
export function formatAway(ms, t = null) {
|
|
72
|
+
if (!Number.isFinite(Number(ms)) || Number(ms) < 0) return '';
|
|
73
|
+
const minutes = Math.round(Number(ms) / 60_000);
|
|
74
|
+
const unit = (one, many, n) => (n === 1 ? greetingText(`time.${one}`, null, t) : greetingText(`time.${many}`, { n }, t));
|
|
75
|
+
if (minutes < 60) return unit('minute', 'minutes', Math.max(1, minutes));
|
|
76
|
+
const hours = Math.round(minutes / 60);
|
|
77
|
+
if (hours < 36) return unit('hour', 'hours', hours);
|
|
78
|
+
const days = Math.round(hours / 24);
|
|
79
|
+
if (days < 21) return unit('day', 'days', days);
|
|
80
|
+
if (days < 75) return unit('week', 'weeks', Math.round(days / 7));
|
|
81
|
+
return unit('month', 'months', Math.round(days / 30));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** "$0.0006" · "<$0.0001" · '' when unknown or nothing. */
|
|
85
|
+
export function formatGreetingCost(value) {
|
|
86
|
+
const usd = Number(value);
|
|
87
|
+
if (!Number.isFinite(usd) || usd <= 0) return '';
|
|
88
|
+
if (usd < 0.0001) return '<$0.0001';
|
|
89
|
+
return `$${usd < 0.01 ? usd.toFixed(4) : usd.toFixed(2)}`;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Everything a surface draws for one greeting (the engine's view: lib/greeting/engine.js).
|
|
94
|
+
* → { id, label, when, text, toggle, rows:[{ kind, kindLabel, label, id, openLabel }], cost } | null
|
|
95
|
+
* `when` is '' when the person was not away (a preview): the caller hides the line.
|
|
96
|
+
*/
|
|
97
|
+
export function greetingView(greeting, { now = Date.now(), t = null } = {}) {
|
|
98
|
+
const text = typeof greeting?.text === 'string' ? greeting.text.trim() : '';
|
|
99
|
+
if (!text) return null;
|
|
100
|
+
const since = Date.parse(greeting.awaySince ?? '');
|
|
101
|
+
const away = Number.isFinite(since) ? formatAway(Math.max(0, now - since), t) : '';
|
|
102
|
+
const basis = Array.isArray(greeting.basis) ? greeting.basis : [];
|
|
103
|
+
const rows = basis.filter((row) => row && typeof row.label === 'string' && row.label.trim()).map((row) => {
|
|
104
|
+
const kind = GREETING_COPY[`kind.${row.kind}`] ? row.kind : 'memory';
|
|
105
|
+
const agent = (kind === 'thread' || kind === 'session') && row.agent && GREETING_COPY[`agent.${row.agent}`] ? greetingText(`agent.${row.agent}`, null, t) : '';
|
|
106
|
+
return {
|
|
107
|
+
kind, kindLabel: agent ? `${greetingText(`kind.${kind}`, null, t)} · ${agent}` : greetingText(`kind.${kind}`, null, t),
|
|
108
|
+
label: row.label.trim(), id: typeof row.id === 'string' && row.id ? row.id : null,
|
|
109
|
+
openLabel: greetingText('open', null, t),
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
const cost = [];
|
|
113
|
+
if (greeting.source === 'writer') {
|
|
114
|
+
cost.push(greetingText('source.writer', { model: greeting.model || 'Claude' }, t));
|
|
115
|
+
const tokens = greeting.tokens && typeof greeting.tokens === 'object' ? num(greeting.tokens.input) + num(greeting.tokens.cacheWrite) + num(greeting.tokens.cacheRead) + num(greeting.tokens.output) : 0;
|
|
116
|
+
if (tokens) cost.push(greetingText('tokens', { n: tokens }, t));
|
|
117
|
+
const usd = formatGreetingCost(greeting.costUsd);
|
|
118
|
+
if (usd) cost.push(usd);
|
|
119
|
+
const prepared = Date.parse(greeting.preparedAt ?? '');
|
|
120
|
+
if (Number.isFinite(prepared) && now - prepared >= 60_000) cost.push(greetingText('prepared', { time: formatAway(now - prepared, t) }, t));
|
|
121
|
+
} else {
|
|
122
|
+
const why = greeting.error && GREETING_COPY[`why.${greeting.error}`] ? greeting.error : (greeting.error ? 'other' : null);
|
|
123
|
+
cost.push(why ? `${greetingText('source.fallback', null, t)}: ${greetingText(`why.${why}`, null, t)}` : greetingText('source.fallback', null, t));
|
|
124
|
+
cost.push(greetingText('free', null, t));
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
id: typeof greeting.id === 'string' ? greeting.id : null,
|
|
128
|
+
label: greetingText('label', null, t),
|
|
129
|
+
when: away ? greetingText('back', { time: away }, t) : '',
|
|
130
|
+
text,
|
|
131
|
+
toggle: rows.length === 0 ? greetingText('basis.none', null, t) : rows.length === 1 ? greetingText('basis.one', null, t) : greetingText('basis.many', { n: rows.length }, t),
|
|
132
|
+
rows,
|
|
133
|
+
cost: cost.join(' · '),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* What /api/greeting/open answered. → { state, greeting, reason }
|
|
139
|
+
* state: 'ok' (a greeting) · 'none' (nothing to say now) · 'old-server' (404: the page is newer than the
|
|
140
|
+
* server) · 'failed' (503: the engine did not start) · 'unreadable'
|
|
141
|
+
*/
|
|
142
|
+
export function readGreetingResponse(status, body) {
|
|
143
|
+
if (status === 404) return { state: 'old-server', greeting: null, reason: null };
|
|
144
|
+
if (status === 503) return { state: 'failed', greeting: null, reason: typeof body?.reason === 'string' ? body.reason : null };
|
|
145
|
+
if (status !== 200 || !body || body.ok !== true) return { state: 'unreadable', greeting: null, reason: null };
|
|
146
|
+
const greeting = body.greeting && typeof body.greeting === 'object' && typeof body.greeting.text === 'string' && body.greeting.text.trim() ? body.greeting : null;
|
|
147
|
+
return { state: greeting ? 'ok' : 'none', greeting, reason: typeof body.reason === 'string' ? body.reason : null };
|
|
148
|
+
}
|
|
@@ -6,6 +6,76 @@
|
|
|
6
6
|
import { getVariant } from './registry.js';
|
|
7
7
|
import { t } from './i18n.js';
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* The File Explorer's editor panel (slides from the file explorer's right edge).
|
|
11
|
+
* The editor itself is CodeMirror, mounted in #fe-editor-host by shared/editor/editor-panel.js,
|
|
12
|
+
* which also fills the shortcuts list, the tab strip (#fe-editor-tabs, there while two or more
|
|
13
|
+
* files are open) and the bars, and builds the find and go-to-line bars.
|
|
14
|
+
*/
|
|
15
|
+
export function getEditorPanelHTML() {
|
|
16
|
+
return `<!-- File Editor (separate panel, slides from file explorer's right edge) -->
|
|
17
|
+
<div id="fe-editor-panel" class="fe-editor-panel">
|
|
18
|
+
<div class="fe-editor-header">
|
|
19
|
+
<button class="fe-editor-back" id="fe-editor-back" data-tooltip="${t('editor.header.close')}" aria-label="${t('editor.header.close')}">
|
|
20
|
+
<svg viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg>
|
|
21
|
+
</button>
|
|
22
|
+
<span class="fe-editor-dot" id="fe-editor-dot"></span>
|
|
23
|
+
<span class="fe-editor-filepath" id="fe-editor-filepath"></span>
|
|
24
|
+
<div style="flex:1"></div>
|
|
25
|
+
<button class="fe-editor-action" id="fe-editor-find-btn" data-tooltip="${t('editor.header.find')}" aria-label="${t('editor.header.find')}">
|
|
26
|
+
<svg viewBox="0 0 24 24"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
|
27
|
+
</button>
|
|
28
|
+
<button class="fe-editor-action" id="fe-editor-word-wrap" data-tooltip="${t('editor.header.wordWrap')}" aria-label="${t('editor.header.wordWrap')}" aria-pressed="true">
|
|
29
|
+
<svg viewBox="0 0 24 24"><path d="M3 6h18M3 12h15a3 3 0 1 1 0 6h-4"/><polyline points="16 16 14 18 16 20"/><path d="M3 18h7"/></svg>
|
|
30
|
+
</button>
|
|
31
|
+
<button class="fe-editor-action" id="fe-editor-view-btn" data-tooltip="${t('editor.header.view')}" aria-label="${t('editor.header.view')}" aria-haspopup="menu" aria-expanded="false">
|
|
32
|
+
<svg viewBox="0 0 24 24"><path d="M4 7h2.5M11.5 7H20M4 17h8.5M17.5 17H20"/><circle cx="9" cy="7" r="2.5"/><circle cx="15" cy="17" r="2.5"/></svg>
|
|
33
|
+
</button>
|
|
34
|
+
<button class="fe-editor-action" id="fe-editor-diff-btn" data-tooltip="${t('editor.header.diff')}" aria-label="${t('editor.header.diff')}" aria-pressed="false" hidden>
|
|
35
|
+
<svg viewBox="0 0 24 24"><path d="M12 3v10M7 8h10M7 19h10"/></svg>
|
|
36
|
+
</button>
|
|
37
|
+
<div class="fe-editor-help-wrap">
|
|
38
|
+
<button class="fe-editor-action fe-editor-help-btn" id="fe-editor-help-btn" data-tooltip="${t('editor.header.shortcuts')}" aria-label="${t('editor.header.shortcuts')}" aria-expanded="false" aria-controls="fe-editor-keybinds">
|
|
39
|
+
<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>
|
|
40
|
+
</button>
|
|
41
|
+
<div class="fe-editor-keybinds" id="fe-editor-keybinds"></div>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="fe-editor-sep"></div>
|
|
44
|
+
<div class="fe-editor-view-toggle" id="fe-editor-view-toggle" style="display:none">
|
|
45
|
+
<button class="fe-editor-toggle-btn active" data-mode="raw" aria-pressed="true">${t('editor.header.raw')}</button>
|
|
46
|
+
<button class="fe-editor-toggle-btn" data-mode="preview" aria-pressed="false">${t('editor.header.preview')}</button>
|
|
47
|
+
</div>
|
|
48
|
+
<div class="fe-editor-sep" id="fe-editor-sep-preview" style="display:none"></div>
|
|
49
|
+
<button class="fe-editor-btn" id="fe-editor-discard" disabled>${t('editor.header.discard')}</button>
|
|
50
|
+
<button class="fe-editor-btn fe-editor-save" id="fe-editor-save" disabled>${t('editor.header.save')}</button>
|
|
51
|
+
<button class="fe-editor-btn" id="fe-editor-close">${t('editor.header.closeButton')}</button>
|
|
52
|
+
</div>
|
|
53
|
+
<div class="fe-editor-tabs" id="fe-editor-tabs" role="tablist" aria-label="${t('editor.tabs.label')}" hidden></div>
|
|
54
|
+
<div class="fe-editor-bars" id="fe-editor-bars"></div>
|
|
55
|
+
<div class="fe-editor-body">
|
|
56
|
+
<div class="fe-editor-host" id="fe-editor-host"></div>
|
|
57
|
+
<div class="fe-editor-preview" id="fe-editor-preview"></div>
|
|
58
|
+
<div class="fe-editor-message" id="fe-editor-message" hidden>
|
|
59
|
+
<div class="fe-editor-message-text" id="fe-editor-message-text" role="status"></div>
|
|
60
|
+
<button class="fe-editor-btn" id="fe-editor-message-retry" hidden>${t('editor.error.retry')}</button>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
<div class="fe-editor-statusbar is-empty" id="fe-editor-statusbar">
|
|
64
|
+
<button type="button" class="fe-editor-status-btn" id="fe-editor-lang"></button>
|
|
65
|
+
<span class="fe-editor-sep"></span>
|
|
66
|
+
<button type="button" class="fe-editor-status-btn" id="fe-editor-indent"></button>
|
|
67
|
+
<span class="fe-editor-sep"></span>
|
|
68
|
+
<button type="button" class="fe-editor-status-btn" id="fe-editor-eol"></button>
|
|
69
|
+
<span class="fe-editor-sep"></span>
|
|
70
|
+
<span id="fe-editor-encoding">UTF-8</span>
|
|
71
|
+
<div style="flex:1"></div>
|
|
72
|
+
<button type="button" class="fe-editor-status-btn" id="fe-editor-cursor"></button>
|
|
73
|
+
<span class="fe-editor-sep"></span>
|
|
74
|
+
<span id="fe-editor-size"></span>
|
|
75
|
+
</div>
|
|
76
|
+
</div>`;
|
|
77
|
+
}
|
|
78
|
+
|
|
9
79
|
/**
|
|
10
80
|
* Returns the full shared HTML string for injection into <body>.
|
|
11
81
|
* Variant-specific elements (camera HUD, controls panel, minimap, etc.)
|
|
@@ -212,6 +282,15 @@ export function getSharedHTML() {
|
|
|
212
282
|
<span class="menu-shortcut" data-keybind-for="toggle-file-explorer"></span>
|
|
213
283
|
</div>
|
|
214
284
|
<div class="menu-sep"></div>
|
|
285
|
+
<div class="menu-item menu-toggle" id="menu-toggle-grid-snap">
|
|
286
|
+
<span class="menu-check">✓</span>
|
|
287
|
+
<span class="menu-text">${t('toolbar.snapToGrid')}</span>
|
|
288
|
+
</div>
|
|
289
|
+
<div class="menu-item" id="menu-tile-terminals">
|
|
290
|
+
<span class="menu-check"></span>
|
|
291
|
+
<span class="menu-text">${t('toolbar.tileTerminals')}</span>
|
|
292
|
+
</div>
|
|
293
|
+
<div class="menu-sep"></div>
|
|
215
294
|
<div id="menu-variant-slot"></div>
|
|
216
295
|
<div class="menu-sep" id="menu-variant-sep" style="display:none"></div>
|
|
217
296
|
<div class="menu-item" id="menu-help">
|
|
@@ -391,6 +470,7 @@ ${is3D ? `
|
|
|
391
470
|
|
|
392
471
|
<div class="bar-center" id="search-container">
|
|
393
472
|
<div id="search-wrapper">
|
|
473
|
+
<svg class="search-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
|
394
474
|
<input type="text" id="search-input" placeholder="${t('search.placeholder')}" autocomplete="off" spellcheck="false">
|
|
395
475
|
<span id="search-badge"></span>
|
|
396
476
|
<button id="search-clear">×</button>
|
|
@@ -425,45 +505,48 @@ ${is3D ? `
|
|
|
425
505
|
</div>
|
|
426
506
|
</div>
|
|
427
507
|
|
|
428
|
-
<!-- Top-Right Controls (
|
|
508
|
+
<!-- Top-Right Controls: one row. The glass dock (workspace switcher, then the tools), then #topright-buttons: the
|
|
509
|
+
tools toggle (#topright-tools-btn, shows and hides the dock) and the agent side panels, always one row of their own.
|
|
510
|
+
Snap to grid and Tile terminals are on the whiteboard rail (#wb-toolbar) and in View. The session pills
|
|
511
|
+
(#term-minimized-tray) are a row under the bar, right-aligned with it (styles.css: "Fit"). -->
|
|
429
512
|
<div id="topright-controls">
|
|
430
513
|
<div id="topright-inner">
|
|
431
|
-
<
|
|
432
|
-
<
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
<
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
514
|
+
<div id="workspace-overlay">
|
|
515
|
+
<button id="ws-indicator" type="button" aria-expanded="false" aria-controls="ws-dropdown" aria-label="${t('toolbar.workspaceNone')}" data-tooltip="${t('toolbar.workspaceNone')}">
|
|
516
|
+
<svg class="ws-icon" viewBox="0 0 24 24"><path d="M12 2L2 7l10 5 10-5-10-5z"/><path d="M2 17l10 5 10-5"/><path d="M2 12l10 5 10-5"/></svg>
|
|
517
|
+
<span id="ws-active-name">No workspace</span>
|
|
518
|
+
<svg class="ws-chevron" viewBox="0 0 24 24"><path d="M6 9l6 6 6-6"/></svg>
|
|
519
|
+
</button>
|
|
520
|
+
<button id="ws-quick-save" class="ws-quick-save" type="button" aria-label="${t('toolbar.quickSave')}" data-tooltip="${t('toolbar.quickSave')}"><svg viewBox="0 0 24 24"><path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"/><polyline points="17 21 17 13 7 13 7 21"/><polyline points="7 3 7 8 15 8"/></svg></button>
|
|
521
|
+
<div id="ws-dropdown" style="display:none;">
|
|
522
|
+
<div class="ws-save-bar">
|
|
523
|
+
<input type="text" id="ws-name-input" placeholder="Save workspace..." autocomplete="off" spellcheck="false">
|
|
524
|
+
<button id="ws-save-btn" data-tooltip="Save"><svg viewBox="0 0 24 24"><path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"/><polyline points="17 21 17 13 7 13 7 21"/><polyline points="7 3 7 8 15 8"/></svg></button>
|
|
525
|
+
</div>
|
|
526
|
+
<button id="ws-clear-btn" class="ws-new-btn"><svg viewBox="0 0 24 24"><path d="M3 6h18"/><path d="M8 6V4h8v2"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"/></svg>Clear workspace</button>
|
|
527
|
+
<div class="ws-divider"></div>
|
|
528
|
+
<div id="ws-list" class="ws-list"></div>
|
|
529
|
+
<div class="ws-divider"></div>
|
|
530
|
+
<div class="ws-footer">
|
|
531
|
+
<button id="ws-export-btn" class="ws-footer-btn" title="Export all workspaces"><svg viewBox="0 0 24 24"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>Export</button>
|
|
532
|
+
<button id="ws-import-btn" class="ws-footer-btn" title="Import workspaces"><svg viewBox="0 0 24 24"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" y1="3" x2="12" y2="15"/></svg>Import</button>
|
|
533
|
+
</div>
|
|
534
|
+
<input type="file" id="ws-import-file" accept=".json" style="display:none;">
|
|
535
|
+
</div>
|
|
536
|
+
</div>
|
|
443
537
|
|
|
444
538
|
<span class="tr-divider"></span>
|
|
445
539
|
|
|
446
|
-
<button id="topright-
|
|
447
|
-
<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
|
|
448
|
-
<span class="count-badge count-badge--green" id="update-badge"></span>
|
|
449
|
-
</button>
|
|
450
|
-
|
|
451
|
-
<button id="topright-keybinds-btn" class="topright-icon-btn" data-tooltip="Keybinds">
|
|
452
|
-
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="4" width="20" height="16" rx="3"/><circle cx="7" cy="9" r="1" fill="currentColor" stroke="none"/><circle cx="12" cy="9" r="1" fill="currentColor" stroke="none"/><circle cx="17" cy="9" r="1" fill="currentColor" stroke="none"/><path d="M7 15h10"/></svg>
|
|
453
|
-
</button>
|
|
454
|
-
|
|
455
|
-
<button id="topright-memory-explorer-btn" class="topright-icon-btn" data-tooltip="Memory Explorer">
|
|
540
|
+
<button id="topright-memory-explorer-btn" class="topright-icon-btn" aria-label="${t('toolbar.memoryExplorer')}" data-tooltip="${t('toolbar.memoryExplorer')}">
|
|
456
541
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z"/><path d="M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z"/><path d="M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4"/></svg>
|
|
457
542
|
</button>
|
|
458
543
|
|
|
459
|
-
<button id="topright-file-explorer-btn" class="topright-icon-btn" data-tooltip="
|
|
544
|
+
<button id="topright-file-explorer-btn" class="topright-icon-btn" aria-label="${t('toolbar.fileExplorer')}" data-tooltip="${t('toolbar.fileExplorer')}">
|
|
460
545
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg>
|
|
461
546
|
</button>
|
|
462
547
|
|
|
463
|
-
<span class="tr-divider"></span>
|
|
464
|
-
|
|
465
548
|
<div id="bookmarks-overlay">
|
|
466
|
-
<button id="topright-bookmarks-btn" class="topright-icon-btn" data-tooltip="
|
|
549
|
+
<button id="topright-bookmarks-btn" class="topright-icon-btn" aria-label="${t('nav.bookmarks')}" data-tooltip="${t('nav.bookmarks')}">
|
|
467
550
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z"/></svg>
|
|
468
551
|
<span class="count-badge count-badge--gold" id="bookmark-count"></span>
|
|
469
552
|
</button>
|
|
@@ -471,40 +554,36 @@ ${is3D ? `
|
|
|
471
554
|
<div id="bookmarks-list"></div>
|
|
472
555
|
</div>
|
|
473
556
|
</div>
|
|
557
|
+
|
|
558
|
+
<button id="topright-trash-btn" class="topright-icon-btn" aria-label="${t('nav.trash')}" data-tooltip="${t('nav.trash')}">
|
|
559
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M4 6h16"/><path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"/><line x1="10" y1="10" x2="10" y2="18"/><line x1="14" y1="10" x2="14" y2="18"/></svg>
|
|
560
|
+
<span class="count-badge count-badge--red" id="titlebar-trash-count"></span>
|
|
561
|
+
</button>
|
|
562
|
+
|
|
563
|
+
<span class="tr-divider"></span>
|
|
564
|
+
|
|
474
565
|
<div id="invite-overlay">
|
|
475
|
-
<button id="invite-btn" class="topright-icon-btn" data-tooltip="
|
|
566
|
+
<button id="invite-btn" class="topright-icon-btn" aria-label="${t('toolbar.share')}" data-tooltip="${t('toolbar.share')}">
|
|
476
567
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="18" cy="5" r="3"/><circle cx="6" cy="12" r="3"/><circle cx="18" cy="19" r="3"/><line x1="8.59" y1="13.51" x2="15.42" y2="17.49"/><line x1="15.41" y1="6.51" x2="8.59" y2="10.49"/></svg>
|
|
477
568
|
<span class="count-badge count-badge--blue" id="invite-session-count" style="display:none"></span>
|
|
478
569
|
</button>
|
|
479
570
|
<div id="invite-dropdown" style="display:none;"></div>
|
|
480
571
|
</div>
|
|
481
572
|
|
|
482
|
-
<
|
|
573
|
+
<button id="topright-keybinds-btn" class="topright-icon-btn" aria-label="${t('toolbar.keybinds')}" data-tooltip="${t('toolbar.keybinds')}">
|
|
574
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="4" width="20" height="16" rx="3"/><circle cx="7" cy="9" r="1" fill="currentColor" stroke="none"/><circle cx="12" cy="9" r="1" fill="currentColor" stroke="none"/><circle cx="17" cy="9" r="1" fill="currentColor" stroke="none"/><path d="M7 15h10"/></svg>
|
|
575
|
+
</button>
|
|
483
576
|
|
|
484
|
-
<
|
|
485
|
-
<
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
<button id="ws-quick-save" class="ws-quick-save" data-tooltip="Quick save"><svg viewBox="0 0 24 24"><path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"/><polyline points="17 21 17 13 7 13 7 21"/><polyline points="7 3 7 8 15 8"/></svg></button>
|
|
489
|
-
<svg class="ws-chevron" viewBox="0 0 24 24"><path d="M6 9l6 6 6-6"/></svg>
|
|
490
|
-
</div>
|
|
491
|
-
<div id="ws-dropdown" style="display:none;">
|
|
492
|
-
<div class="ws-save-bar">
|
|
493
|
-
<input type="text" id="ws-name-input" placeholder="Save workspace..." autocomplete="off" spellcheck="false">
|
|
494
|
-
<button id="ws-save-btn" data-tooltip="Save"><svg viewBox="0 0 24 24"><path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"/><polyline points="17 21 17 13 7 13 7 21"/><polyline points="7 3 7 8 15 8"/></svg></button>
|
|
495
|
-
</div>
|
|
496
|
-
<button id="ws-clear-btn" class="ws-new-btn"><svg viewBox="0 0 24 24"><path d="M3 6h18"/><path d="M8 6V4h8v2"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"/></svg>Clear workspace</button>
|
|
497
|
-
<div class="ws-divider"></div>
|
|
498
|
-
<div id="ws-list" class="ws-list"></div>
|
|
499
|
-
<div class="ws-divider"></div>
|
|
500
|
-
<div class="ws-footer">
|
|
501
|
-
<button id="ws-export-btn" class="ws-footer-btn" title="Export all workspaces"><svg viewBox="0 0 24 24"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>Export</button>
|
|
502
|
-
<button id="ws-import-btn" class="ws-footer-btn" title="Import workspaces"><svg viewBox="0 0 24 24"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" y1="3" x2="12" y2="15"/></svg>Import</button>
|
|
503
|
-
</div>
|
|
504
|
-
<input type="file" id="ws-import-file" accept=".json" style="display:none;">
|
|
505
|
-
</div>
|
|
506
|
-
</div>
|
|
577
|
+
<button id="topright-update-btn" class="topright-icon-btn" style="display:none" data-tooltip="Update available">
|
|
578
|
+
<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
|
|
579
|
+
<span class="count-badge count-badge--green" id="update-badge"></span>
|
|
580
|
+
</button>
|
|
507
581
|
</div>
|
|
582
|
+
<div id="topright-buttons">
|
|
583
|
+
<button id="topright-tools-btn" class="topright-icon-btn" type="button" aria-expanded="true" aria-controls="topright-inner" aria-label="${t('toolbar.hideTools')}" data-tooltip="${t('toolbar.hideTools')}">
|
|
584
|
+
<svg viewBox="0 0 24 24"><path d="M13 17l5-5-5-5"/><path d="M6 17l5-5-5-5"/></svg>
|
|
585
|
+
<span class="topright-tools-dot" aria-hidden="true"></span>
|
|
586
|
+
</button>
|
|
508
587
|
<button id="topright-assistant-panel-btn" class="topright-icon-btn" data-tooltip="${t('assistant.panel.open')}">
|
|
509
588
|
<svg viewBox="0 0 24 24" fill="currentColor"><rect x="8" y="5.5" width="11" height="5" rx="2.5" transform="rotate(-12 13.5 8)"/><rect x="4.5" y="12.5" width="11" height="5" rx="2.5" transform="rotate(-12 10 15)"/></svg>
|
|
510
589
|
</button>
|
|
@@ -520,12 +599,7 @@ ${is3D ? `
|
|
|
520
599
|
<svg viewBox="0 0 24 30" fill="currentColor"><path d="M18 6H6V24H18V6ZM24 30H0V0H24V30Z"/></svg>
|
|
521
600
|
<span class="count-badge count-badge--green" id="opencode-update-badge"></span>
|
|
522
601
|
</button>
|
|
523
|
-
|
|
524
|
-
<svg viewBox="0 0 24 24" class="collapse-chevron"><polyline points="9 18 15 12 9 6"/></svg>
|
|
525
|
-
<span class="collapse-dots">
|
|
526
|
-
<span></span><span></span><span></span>
|
|
527
|
-
</span>
|
|
528
|
-
</button>
|
|
602
|
+
</div>
|
|
529
603
|
<div id="term-minimized-tray"></div>
|
|
530
604
|
</div>
|
|
531
605
|
|
|
@@ -626,130 +700,46 @@ ${is3D ? `
|
|
|
626
700
|
<div id="file-explorer-panel">
|
|
627
701
|
<div class="fe-project-row">
|
|
628
702
|
<div class="fe-project-selector" id="fe-project-selector">
|
|
629
|
-
<button class="fe-project-btn" id="fe-project-btn">
|
|
630
|
-
<svg class="fe-project-icon" viewBox="0 0 24 24"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg>
|
|
631
|
-
<span class="fe-project-label" id="fe-project-label"
|
|
632
|
-
<svg class="fe-project-chevron" viewBox="0 0 24 24"><polyline points="6 9 12 15 18 9"/></svg>
|
|
703
|
+
<button type="button" class="fe-project-btn" id="fe-project-btn">
|
|
704
|
+
<svg class="fe-project-icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg>
|
|
705
|
+
<span class="fe-project-label" id="fe-project-label">${t('fileExplorer.project.none')}</span>
|
|
706
|
+
<svg class="fe-project-chevron" viewBox="0 0 24 24" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>
|
|
633
707
|
</button>
|
|
634
708
|
<div class="fe-project-dropdown" id="fe-project-dropdown"></div>
|
|
635
709
|
</div>
|
|
636
|
-
<button class="fe-branch-btn" id="fe-branch-btn" style="display:none">
|
|
637
|
-
<svg viewBox="0 0 24 24"><line x1="6" y1="3" x2="6" y2="15"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><path d="M18 9a9 9 0 0 1-9 9"/></svg>
|
|
710
|
+
<button type="button" class="fe-branch-btn" id="fe-branch-btn" style="display:none">
|
|
711
|
+
<svg viewBox="0 0 24 24" aria-hidden="true"><line x1="6" y1="3" x2="6" y2="15"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><path d="M18 9a9 9 0 0 1-9 9"/></svg>
|
|
638
712
|
<span class="fe-branch-btn-name" id="fe-branch-btn-name"></span>
|
|
639
713
|
<span class="fe-branch-btn-badge" id="fe-branch-btn-badge"></span>
|
|
640
714
|
</button>
|
|
641
715
|
</div>
|
|
642
716
|
<div class="fe-filter">
|
|
643
|
-
<svg class="fe-filter-icon" viewBox="0 0 24 24"
|
|
644
|
-
<input type="text" id="fe-filter-input" placeholder="
|
|
645
|
-
<button id="fe-filter-clear">×</button>
|
|
717
|
+
<svg class="fe-filter-icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M3 5h18l-7 8v6l-4-2v-4z"/></svg>
|
|
718
|
+
<input type="text" id="fe-filter-input" placeholder="${t('fileExplorer.filter.placeholder')}" aria-label="${t('fileExplorer.filter.label')}" autocomplete="off" spellcheck="false">
|
|
719
|
+
<button type="button" id="fe-filter-clear" aria-label="${t('fileExplorer.filter.clear')}" hidden>×</button>
|
|
646
720
|
</div>
|
|
647
|
-
<div class="fe-toolbar">
|
|
648
|
-
<button class="detail-action-btn" id="fe-
|
|
649
|
-
<button class="detail-action-btn" id="fe-
|
|
721
|
+
<div class="fe-toolbar" role="toolbar" aria-label="${t('fileExplorer.title')}">
|
|
722
|
+
<button type="button" class="detail-action-btn" id="fe-new-file" data-tooltip="${t('fileExplorer.toolbar.newFile')}" aria-label="${t('fileExplorer.toolbar.newFile')}"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="12" y1="12" x2="12" y2="18"/><line x1="9" y1="15" x2="15" y2="15"/></svg></button>
|
|
723
|
+
<button type="button" class="detail-action-btn" id="fe-new-folder" data-tooltip="${t('fileExplorer.toolbar.newFolder')}" aria-label="${t('fileExplorer.toolbar.newFolder')}"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/><line x1="12" y1="11" x2="12" y2="17"/><line x1="9" y1="14" x2="15" y2="14"/></svg></button>
|
|
650
724
|
<div class="detail-action-sep"></div>
|
|
651
|
-
<button class="detail-action-btn" id="fe-
|
|
725
|
+
<button type="button" class="detail-action-btn" id="fe-goto-file" data-tooltip="${t('fileExplorer.toolbar.goToFile')}" aria-label="${t('fileExplorer.toolbar.goToFile')}"><svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="7"/><line x1="16.5" y1="16.5" x2="21" y2="21"/></svg></button>
|
|
726
|
+
<button type="button" class="detail-action-btn" id="fe-reveal-active" data-tooltip="${t('fileExplorer.toolbar.revealActive')}" aria-label="${t('fileExplorer.toolbar.revealActive')}" disabled><svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="8"/><circle cx="12" cy="12" r="2"/><line x1="12" y1="1" x2="12" y2="4"/><line x1="12" y1="20" x2="12" y2="23"/><line x1="1" y1="12" x2="4" y2="12"/><line x1="20" y1="12" x2="23" y2="12"/></svg></button>
|
|
727
|
+
<button type="button" class="detail-action-btn" id="fe-changed-only" data-tooltip="${t('fileExplorer.toolbar.changedOnly')}" aria-label="${t('fileExplorer.toolbar.changedOnly')}" aria-pressed="false"><svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="18" cy="18" r="3"/><circle cx="6" cy="6" r="3"/><path d="M6 21V9a9 9 0 0 0 9 9"/></svg></button>
|
|
652
728
|
<div class="detail-action-sep"></div>
|
|
653
|
-
<button class="detail-action-btn
|
|
654
|
-
<button class="detail-action-btn
|
|
655
|
-
<
|
|
656
|
-
<button class="detail-action-btn" id="fe-refresh" data-tooltip="Refresh"><svg viewBox="0 0 24 24"><polyline points="23 4 23 10 17 10"/><path d="M20.49 15a9 9 0 1 1-2.12-9.36L23 10"/></svg></button>
|
|
729
|
+
<button type="button" class="detail-action-btn" id="fe-collapse-all" data-tooltip="${t('fileExplorer.toolbar.collapseAll')}" aria-label="${t('fileExplorer.toolbar.collapseAll')}"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 14h6v6"/><path d="M20 10h-6V4"/><path d="M14 10l7-7"/><path d="M3 21l7-7"/></svg></button>
|
|
730
|
+
<button type="button" class="detail-action-btn" id="fe-refresh" data-tooltip="${t('fileExplorer.toolbar.refresh')}" aria-label="${t('fileExplorer.toolbar.refresh')}"><svg viewBox="0 0 24 24" aria-hidden="true"><polyline points="23 4 23 10 17 10"/><path d="M20.49 15a9 9 0 1 1-2.12-9.36L23 10"/></svg></button>
|
|
731
|
+
<button type="button" class="detail-action-btn" id="fe-more" data-tooltip="${t('fileExplorer.toolbar.more')}" aria-label="${t('fileExplorer.toolbar.more')}" aria-haspopup="menu"><svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="5" cy="12" r="1.5"/><circle cx="12" cy="12" r="1.5"/><circle cx="19" cy="12" r="1.5"/></svg></button>
|
|
657
732
|
</div>
|
|
658
733
|
<div id="fe-tree" class="fe-tree"></div>
|
|
734
|
+
<div class="fe-notice" id="fe-notice" role="status" hidden><span class="fe-notice-text"></span><button type="button" class="fe-notice-action" hidden></button><button type="button" class="fe-notice-close">×</button></div>
|
|
659
735
|
<div class="fe-footer">
|
|
660
|
-
<span id="fe-count"
|
|
736
|
+
<span id="fe-count" aria-live="polite"></span>
|
|
737
|
+
<span class="fe-restart-hint" id="fe-restart-hint" role="img" tabindex="0" data-tooltip="${t('fileExplorer.state.restartHint')}" aria-label="${t('fileExplorer.state.restartHint')}" hidden><svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="9"/><line x1="12" y1="11" x2="12" y2="16"/><circle cx="12" cy="8" r="0.6"/></svg></span>
|
|
661
738
|
</div>
|
|
662
|
-
<div class="fe-resize-handle" id="fe-resize-handle"></div>
|
|
739
|
+
<div class="fe-resize-handle" id="fe-resize-handle" role="separator" aria-orientation="vertical" aria-label="${t('fileExplorer.resize')}" tabindex="0"></div>
|
|
663
740
|
</div>
|
|
664
741
|
|
|
665
|
-
|
|
666
|
-
<div id="fe-editor-panel" class="fe-editor-panel">
|
|
667
|
-
<div class="fe-editor-header">
|
|
668
|
-
<button class="fe-editor-back" id="fe-editor-back" data-tooltip="Close editor">
|
|
669
|
-
<svg viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg>
|
|
670
|
-
</button>
|
|
671
|
-
<span class="fe-editor-dot" id="fe-editor-dot"></span>
|
|
672
|
-
<span class="fe-editor-filepath" id="fe-editor-filepath"></span>
|
|
673
|
-
<div style="flex:1"></div>
|
|
674
|
-
<button class="fe-editor-action" id="fe-editor-find-btn" data-tooltip="Find (Ctrl+F)">
|
|
675
|
-
<svg viewBox="0 0 24 24"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
|
676
|
-
</button>
|
|
677
|
-
<button class="fe-editor-action" id="fe-editor-word-wrap" data-tooltip="Toggle word wrap">
|
|
678
|
-
<svg viewBox="0 0 24 24"><path d="M3 6h18M3 12h15a3 3 0 1 1 0 6h-4"/><polyline points="16 16 14 18 16 20"/><path d="M3 18h7"/></svg>
|
|
679
|
-
</button>
|
|
680
|
-
<div class="fe-editor-help-wrap">
|
|
681
|
-
<button class="fe-editor-action fe-editor-help-btn" id="fe-editor-help-btn" data-tooltip="Keyboard shortcuts">
|
|
682
|
-
<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>
|
|
683
|
-
</button>
|
|
684
|
-
<div class="fe-editor-keybinds" id="fe-editor-keybinds">
|
|
685
|
-
<div class="fe-editor-keybinds-title">Keyboard Shortcuts</div>
|
|
686
|
-
<div class="fe-editor-kb"><kbd>Ctrl+S</kbd> <span>Save</span></div>
|
|
687
|
-
<div class="fe-editor-kb"><kbd>Ctrl+F</kbd> <span>Find</span></div>
|
|
688
|
-
<div class="fe-editor-kb"><kbd>Ctrl+H</kbd> <span>Replace</span></div>
|
|
689
|
-
<div class="fe-editor-kb"><kbd>Ctrl+G</kbd> <span>Go to Line</span></div>
|
|
690
|
-
<div class="fe-editor-kb"><kbd>Ctrl+D</kbd> <span>Duplicate Line</span></div>
|
|
691
|
-
<div class="fe-editor-kb"><kbd>Ctrl+/</kbd> <span>Toggle Comment</span></div>
|
|
692
|
-
<div class="fe-editor-kb"><kbd>Tab</kbd> <span>Indent</span></div>
|
|
693
|
-
<div class="fe-editor-kb"><kbd>Shift+Tab</kbd> <span>Unindent</span></div>
|
|
694
|
-
<div class="fe-editor-kb"><kbd>Enter</kbd> <span>Auto-indent</span></div>
|
|
695
|
-
<div class="fe-editor-kb"><kbd>Esc</kbd> <span>Close panel</span></div>
|
|
696
|
-
</div>
|
|
697
|
-
</div>
|
|
698
|
-
<div class="fe-editor-sep"></div>
|
|
699
|
-
<div class="fe-editor-view-toggle" id="fe-editor-view-toggle" style="display:none">
|
|
700
|
-
<button class="fe-editor-toggle-btn active" data-mode="raw">Raw</button>
|
|
701
|
-
<button class="fe-editor-toggle-btn" data-mode="preview">Preview</button>
|
|
702
|
-
</div>
|
|
703
|
-
<div class="fe-editor-sep" id="fe-editor-sep-preview" style="display:none"></div>
|
|
704
|
-
<button class="fe-editor-btn" id="fe-editor-discard" disabled>Discard</button>
|
|
705
|
-
<button class="fe-editor-btn fe-editor-save" id="fe-editor-save" disabled>Save</button>
|
|
706
|
-
<button class="fe-editor-btn" id="fe-editor-close">Close</button>
|
|
707
|
-
</div>
|
|
708
|
-
<div class="fe-editor-find" id="fe-editor-find">
|
|
709
|
-
<div class="fe-editor-find-row">
|
|
710
|
-
<input type="text" class="fe-editor-find-input" id="fe-editor-find-input" placeholder="Find..." spellcheck="false" autocomplete="off" />
|
|
711
|
-
<span class="fe-editor-find-count" id="fe-editor-find-count"></span>
|
|
712
|
-
<button class="fe-editor-find-nav" id="fe-editor-find-prev" data-tooltip="Previous">
|
|
713
|
-
<svg viewBox="0 0 24 24"><polyline points="18 15 12 9 6 15"/></svg>
|
|
714
|
-
</button>
|
|
715
|
-
<button class="fe-editor-find-nav" id="fe-editor-find-next" data-tooltip="Next">
|
|
716
|
-
<svg viewBox="0 0 24 24"><polyline points="6 9 12 15 18 9"/></svg>
|
|
717
|
-
</button>
|
|
718
|
-
<button class="fe-editor-find-nav" id="fe-editor-find-close" data-tooltip="Close">
|
|
719
|
-
<svg viewBox="0 0 24 24"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
|
|
720
|
-
</button>
|
|
721
|
-
</div>
|
|
722
|
-
<div class="fe-editor-replace-row">
|
|
723
|
-
<input type="text" class="fe-editor-replace-input" id="fe-editor-replace-input" placeholder="Replace..." spellcheck="false" autocomplete="off" />
|
|
724
|
-
<button class="fe-editor-replace-btn" id="fe-editor-replace">Replace</button>
|
|
725
|
-
<button class="fe-editor-replace-btn" id="fe-editor-replace-all">All</button>
|
|
726
|
-
</div>
|
|
727
|
-
</div>
|
|
728
|
-
<div class="fe-editor-goto" id="fe-editor-goto">
|
|
729
|
-
<span class="fe-editor-goto-label">Go to Line</span>
|
|
730
|
-
<input type="number" class="fe-editor-goto-input" id="fe-editor-goto-input" min="1" placeholder="Line..." />
|
|
731
|
-
</div>
|
|
732
|
-
<div class="fe-editor-body">
|
|
733
|
-
<div class="fe-editor-gutter" id="fe-editor-gutter"></div>
|
|
734
|
-
<div class="fe-editor-line-highlight" id="fe-editor-line-highlight"></div>
|
|
735
|
-
<pre class="fe-editor-highlight" id="fe-editor-highlight" aria-hidden="true"><code id="fe-editor-highlight-code"></code></pre>
|
|
736
|
-
<textarea class="fe-editor-textarea" id="fe-editor-textarea"
|
|
737
|
-
spellcheck="false" autocorrect="off" autocapitalize="off"></textarea>
|
|
738
|
-
<div class="fe-editor-preview" id="fe-editor-preview"></div>
|
|
739
|
-
<div class="fe-editor-scrollmap" id="fe-editor-scrollmap">
|
|
740
|
-
<div class="fe-editor-scrollmap-thumb" id="fe-editor-scrollmap-thumb"></div>
|
|
741
|
-
</div>
|
|
742
|
-
</div>
|
|
743
|
-
<div class="fe-editor-statusbar">
|
|
744
|
-
<span id="fe-editor-lang"></span>
|
|
745
|
-
<div style="flex:1"></div>
|
|
746
|
-
<span id="fe-editor-cursor">Ln 1, Col 1</span>
|
|
747
|
-
<span class="fe-editor-sep"></span>
|
|
748
|
-
<span id="fe-editor-size"></span>
|
|
749
|
-
<span class="fe-editor-sep"></span>
|
|
750
|
-
<span>UTF-8</span>
|
|
751
|
-
</div>
|
|
752
|
-
</div>
|
|
742
|
+
${getEditorPanelHTML()}
|
|
753
743
|
|
|
754
744
|
<!-- Detail cards are spawned dynamically by ui-detail.js -->
|
|
755
745
|
|
|
@@ -833,6 +823,12 @@ ${is3D ? `
|
|
|
833
823
|
<svg viewBox="0 0 24 24"><polyline points="3 6 5 6 21 6"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/></svg>
|
|
834
824
|
</button>
|
|
835
825
|
<div class="wb-tool-sep"></div>
|
|
826
|
+
<button class="wb-tool wb-toggle" id="ws-grid-toggle" type="button" aria-pressed="false" aria-label="${t('toolbar.snapToGrid')}" data-tooltip="${t('toolbar.snapToGrid')}">
|
|
827
|
+
<svg viewBox="0 0 24 24"><g fill="currentColor" stroke="none"><circle cx="6" cy="6" r="1.6"/><circle cx="12" cy="6" r="1.6"/><circle cx="18" cy="6" r="1.6"/><circle cx="6" cy="12" r="1.6"/><circle cx="12" cy="12" r="1.6"/><circle cx="18" cy="12" r="1.6"/><circle cx="6" cy="18" r="1.6"/><circle cx="12" cy="18" r="1.6"/><circle cx="18" cy="18" r="1.6"/></g></svg>
|
|
828
|
+
</button>
|
|
829
|
+
<button class="wb-tool" id="ws-tile-btn" type="button" aria-label="${t('toolbar.tileTerminals')}" data-tooltip="${t('toolbar.tileTerminals')}">
|
|
830
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="8" height="8" rx="2"/><rect x="13" y="3" width="8" height="8" rx="2"/><rect x="3" y="13" width="8" height="8" rx="2"/><rect x="13" y="13" width="8" height="8" rx="2"/></svg>
|
|
831
|
+
</button>
|
|
836
832
|
<button class="wb-tool wb-tool-sm" id="wb-toggle-logo" data-tooltip="Toggle logo">
|
|
837
833
|
<img src="logo-synabun.png" alt="" style="width:18px;height:auto;opacity:0.6;">
|
|
838
834
|
</button>
|