synabun 2.0.7 → 2.0.10
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 +67 -0
- package/README.md +1 -1
- package/THIRD-PARTY-LICENSES.md +46 -4
- package/hooks/claude-code/post-plan.mjs +6 -30
- package/hooks/claude-code/session-start.mjs +1 -4
- package/hooks/claude-code/shared.mjs +106 -72
- package/launcher.mjs +9 -3
- package/lib/package-processes.js +670 -0
- package/lib/runtime-dependencies.js +225 -0
- package/lib/start-launcher.js +6 -1
- package/mcp-server/dist/services/browser-bench.d.ts +1 -1
- package/mcp-server/dist/services/browser-bench.d.ts.map +1 -1
- package/mcp-server/dist/services/browser-bench.js +1 -1
- package/mcp-server/dist/services/browser-bench.js.map +1 -1
- package/mcp-server/dist/services/categories.d.ts +35 -2
- package/mcp-server/dist/services/categories.d.ts.map +1 -1
- package/mcp-server/dist/services/categories.js +77 -33
- package/mcp-server/dist/services/categories.js.map +1 -1
- package/mcp-server/dist/services/desktop-bench.d.ts +7 -7
- package/mcp-server/dist/services/desktop-bench.d.ts.map +1 -1
- package/mcp-server/dist/services/desktop-bench.js +1 -1
- package/mcp-server/dist/services/desktop-bench.js.map +1 -1
- package/mcp-server/dist/tools/agents.d.ts +1 -1
- package/mcp-server/dist/tools/agents.d.ts.map +1 -1
- package/mcp-server/dist/tools/agents.js +1 -1
- package/mcp-server/dist/tools/agents.js.map +1 -1
- package/mcp-server/dist/tools/bluesky.js +1 -1
- package/mcp-server/dist/tools/bluesky.js.map +1 -1
- package/mcp-server/dist/tools/browser-advanced.d.ts +1 -1
- package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -1
- package/mcp-server/dist/tools/browser-advanced.js +1 -1
- package/mcp-server/dist/tools/browser-advanced.js.map +1 -1
- package/mcp-server/dist/tools/browser-batch.d.ts +1 -1
- package/mcp-server/dist/tools/browser-batch.d.ts.map +1 -1
- package/mcp-server/dist/tools/browser-batch.js +1 -1
- package/mcp-server/dist/tools/browser-batch.js.map +1 -1
- package/mcp-server/dist/tools/browser-cheatsheet.d.ts +1 -1
- package/mcp-server/dist/tools/browser-cheatsheet.d.ts.map +1 -1
- package/mcp-server/dist/tools/browser-cheatsheet.js +1 -1
- package/mcp-server/dist/tools/browser-cheatsheet.js.map +1 -1
- package/mcp-server/dist/tools/browser-interact.d.ts +1 -1
- package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -1
- package/mcp-server/dist/tools/browser-interact.js +1 -1
- package/mcp-server/dist/tools/browser-interact.js.map +1 -1
- package/mcp-server/dist/tools/browser-navigate.d.ts +1 -1
- package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -1
- package/mcp-server/dist/tools/browser-navigate.js +1 -1
- package/mcp-server/dist/tools/browser-navigate.js.map +1 -1
- package/mcp-server/dist/tools/browser-observe.d.ts +1 -1
- package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -1
- package/mcp-server/dist/tools/browser-observe.js +1 -1
- package/mcp-server/dist/tools/browser-observe.js.map +1 -1
- package/mcp-server/dist/tools/card-tools.d.ts +1 -1
- package/mcp-server/dist/tools/card-tools.d.ts.map +1 -1
- package/mcp-server/dist/tools/card-tools.js +1 -1
- package/mcp-server/dist/tools/card-tools.js.map +1 -1
- package/mcp-server/dist/tools/category.d.ts +1 -1
- package/mcp-server/dist/tools/category.d.ts.map +1 -1
- package/mcp-server/dist/tools/category.js +5 -1
- package/mcp-server/dist/tools/category.js.map +1 -1
- package/mcp-server/dist/tools/choice.d.ts +1 -1
- package/mcp-server/dist/tools/choice.d.ts.map +1 -1
- package/mcp-server/dist/tools/choice.js +1 -1
- package/mcp-server/dist/tools/choice.js.map +1 -1
- package/mcp-server/dist/tools/computer.d.ts +1 -1
- package/mcp-server/dist/tools/computer.d.ts.map +1 -1
- package/mcp-server/dist/tools/computer.js +1 -1
- package/mcp-server/dist/tools/computer.js.map +1 -1
- package/mcp-server/dist/tools/discord-channel.d.ts +1 -1
- package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -1
- package/mcp-server/dist/tools/discord-channel.js +1 -1
- package/mcp-server/dist/tools/discord-channel.js.map +1 -1
- package/mcp-server/dist/tools/discord-guild.d.ts +1 -1
- package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -1
- package/mcp-server/dist/tools/discord-guild.js +1 -1
- package/mcp-server/dist/tools/discord-guild.js.map +1 -1
- package/mcp-server/dist/tools/discord-member.d.ts +1 -1
- package/mcp-server/dist/tools/discord-member.d.ts.map +1 -1
- package/mcp-server/dist/tools/discord-member.js +1 -1
- package/mcp-server/dist/tools/discord-member.js.map +1 -1
- package/mcp-server/dist/tools/discord-message.d.ts +1 -1
- package/mcp-server/dist/tools/discord-message.d.ts.map +1 -1
- package/mcp-server/dist/tools/discord-message.js +1 -1
- package/mcp-server/dist/tools/discord-message.js.map +1 -1
- package/mcp-server/dist/tools/discord-onboarding.d.ts +1 -1
- package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -1
- package/mcp-server/dist/tools/discord-onboarding.js +1 -1
- package/mcp-server/dist/tools/discord-onboarding.js.map +1 -1
- package/mcp-server/dist/tools/discord-role.d.ts +1 -1
- package/mcp-server/dist/tools/discord-role.d.ts.map +1 -1
- package/mcp-server/dist/tools/discord-role.js +1 -1
- package/mcp-server/dist/tools/discord-role.js.map +1 -1
- package/mcp-server/dist/tools/discord-thread.d.ts +1 -1
- package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -1
- package/mcp-server/dist/tools/discord-thread.js +1 -1
- package/mcp-server/dist/tools/discord-thread.js.map +1 -1
- package/mcp-server/dist/tools/discord-webhook.d.ts +1 -1
- package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -1
- package/mcp-server/dist/tools/discord-webhook.js +1 -1
- package/mcp-server/dist/tools/discord-webhook.js.map +1 -1
- package/mcp-server/dist/tools/fb-groups.d.ts +1 -1
- package/mcp-server/dist/tools/fb-groups.d.ts.map +1 -1
- package/mcp-server/dist/tools/fb-groups.js +1 -1
- package/mcp-server/dist/tools/fb-groups.js.map +1 -1
- package/mcp-server/dist/tools/forget.d.ts +1 -1
- package/mcp-server/dist/tools/forget.d.ts.map +1 -1
- package/mcp-server/dist/tools/forget.js +1 -1
- package/mcp-server/dist/tools/forget.js.map +1 -1
- package/mcp-server/dist/tools/git-tools.d.ts +1 -1
- package/mcp-server/dist/tools/git-tools.d.ts.map +1 -1
- package/mcp-server/dist/tools/git-tools.js +1 -1
- package/mcp-server/dist/tools/git-tools.js.map +1 -1
- package/mcp-server/dist/tools/gsc/experience.d.ts +1 -1
- package/mcp-server/dist/tools/gsc/experience.d.ts.map +1 -1
- package/mcp-server/dist/tools/gsc/experience.js +1 -1
- package/mcp-server/dist/tools/gsc/experience.js.map +1 -1
- package/mcp-server/dist/tools/gsc/indexing.d.ts +1 -1
- package/mcp-server/dist/tools/gsc/indexing.d.ts.map +1 -1
- package/mcp-server/dist/tools/gsc/indexing.js +1 -1
- package/mcp-server/dist/tools/gsc/indexing.js.map +1 -1
- package/mcp-server/dist/tools/gsc/inspect.d.ts +1 -1
- package/mcp-server/dist/tools/gsc/inspect.d.ts.map +1 -1
- package/mcp-server/dist/tools/gsc/inspect.js +1 -1
- package/mcp-server/dist/tools/gsc/inspect.js.map +1 -1
- package/mcp-server/dist/tools/gsc/navigate.d.ts +1 -1
- package/mcp-server/dist/tools/gsc/navigate.d.ts.map +1 -1
- package/mcp-server/dist/tools/gsc/navigate.js +1 -1
- package/mcp-server/dist/tools/gsc/navigate.js.map +1 -1
- package/mcp-server/dist/tools/gsc/performance.d.ts +1 -1
- package/mcp-server/dist/tools/gsc/performance.d.ts.map +1 -1
- package/mcp-server/dist/tools/gsc/performance.js +1 -1
- package/mcp-server/dist/tools/gsc/performance.js.map +1 -1
- package/mcp-server/dist/tools/gsc/settings.d.ts +1 -1
- package/mcp-server/dist/tools/gsc/settings.d.ts.map +1 -1
- package/mcp-server/dist/tools/gsc/settings.js +1 -1
- package/mcp-server/dist/tools/gsc/settings.js.map +1 -1
- package/mcp-server/dist/tools/image-tools.d.ts +1 -1
- package/mcp-server/dist/tools/image-tools.d.ts.map +1 -1
- package/mcp-server/dist/tools/image-tools.js +1 -1
- package/mcp-server/dist/tools/image-tools.js.map +1 -1
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +1 -1
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -1
- package/mcp-server/dist/tools/leonardo-browser-tools.js +1 -1
- package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -1
- package/mcp-server/dist/tools/loop.d.ts +1 -1
- package/mcp-server/dist/tools/loop.d.ts.map +1 -1
- package/mcp-server/dist/tools/loop.js +1 -1
- package/mcp-server/dist/tools/loop.js.map +1 -1
- package/mcp-server/dist/tools/memories.d.ts +1 -1
- package/mcp-server/dist/tools/memories.d.ts.map +1 -1
- package/mcp-server/dist/tools/memories.js +1 -1
- package/mcp-server/dist/tools/memories.js.map +1 -1
- package/mcp-server/dist/tools/morelogin.d.ts +1 -1
- package/mcp-server/dist/tools/morelogin.d.ts.map +1 -1
- package/mcp-server/dist/tools/morelogin.js +1 -1
- package/mcp-server/dist/tools/morelogin.js.map +1 -1
- package/mcp-server/dist/tools/profile.d.ts +1 -1
- package/mcp-server/dist/tools/profile.d.ts.map +1 -1
- package/mcp-server/dist/tools/profile.js +1 -1
- package/mcp-server/dist/tools/profile.js.map +1 -1
- package/mcp-server/dist/tools/recall.d.ts +1 -1
- package/mcp-server/dist/tools/recall.d.ts.map +1 -1
- package/mcp-server/dist/tools/recall.js +1 -1
- package/mcp-server/dist/tools/recall.js.map +1 -1
- package/mcp-server/dist/tools/reflect.d.ts +1 -1
- package/mcp-server/dist/tools/reflect.d.ts.map +1 -1
- package/mcp-server/dist/tools/reflect.js +1 -1
- package/mcp-server/dist/tools/reflect.js.map +1 -1
- package/mcp-server/dist/tools/remember.d.ts +1 -1
- package/mcp-server/dist/tools/remember.d.ts.map +1 -1
- package/mcp-server/dist/tools/remember.js +13 -11
- package/mcp-server/dist/tools/remember.js.map +1 -1
- package/mcp-server/dist/tools/restore.d.ts +1 -1
- package/mcp-server/dist/tools/restore.d.ts.map +1 -1
- package/mcp-server/dist/tools/restore.js +1 -1
- package/mcp-server/dist/tools/restore.js.map +1 -1
- package/mcp-server/dist/tools/style-guide-tools.d.ts +1 -1
- package/mcp-server/dist/tools/style-guide-tools.d.ts.map +1 -1
- package/mcp-server/dist/tools/style-guide-tools.js +1 -1
- package/mcp-server/dist/tools/style-guide-tools.js.map +1 -1
- package/mcp-server/dist/tools/sync.d.ts +1 -1
- package/mcp-server/dist/tools/sync.d.ts.map +1 -1
- package/mcp-server/dist/tools/sync.js +1 -1
- package/mcp-server/dist/tools/sync.js.map +1 -1
- package/mcp-server/dist/tools/tictactoe-tools.d.ts +1 -1
- package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -1
- package/mcp-server/dist/tools/tictactoe-tools.js +1 -1
- package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -1
- package/mcp-server/dist/tools/utils.d.ts +1 -1
- package/mcp-server/dist/tools/utils.d.ts.map +1 -1
- package/mcp-server/dist/tools/utils.js +1 -1
- package/mcp-server/dist/tools/utils.js.map +1 -1
- package/mcp-server/dist/tools/whatsapp-send-file.d.ts +1 -1
- package/mcp-server/dist/tools/whatsapp-send-file.d.ts.map +1 -1
- package/mcp-server/dist/tools/whatsapp-send-file.js +1 -1
- package/mcp-server/dist/tools/whatsapp-send-file.js.map +1 -1
- package/mcp-server/dist/tools/whiteboard-tools.d.ts +3 -3
- package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -1
- package/mcp-server/dist/tools/whiteboard-tools.js +1 -1
- package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -1
- package/mcp-server/dist/tools/youtube/analytics.d.ts +1 -1
- package/mcp-server/dist/tools/youtube/analytics.d.ts.map +1 -1
- package/mcp-server/dist/tools/youtube/analytics.js +1 -1
- package/mcp-server/dist/tools/youtube/analytics.js.map +1 -1
- package/mcp-server/dist/tools/youtube/download.d.ts +1 -1
- package/mcp-server/dist/tools/youtube/download.d.ts.map +1 -1
- package/mcp-server/dist/tools/youtube/download.js +1 -1
- package/mcp-server/dist/tools/youtube/download.js.map +1 -1
- package/mcp-server/dist/tools/youtube/media.d.ts +1 -1
- package/mcp-server/dist/tools/youtube/media.d.ts.map +1 -1
- package/mcp-server/dist/tools/youtube/media.js +1 -1
- package/mcp-server/dist/tools/youtube/media.js.map +1 -1
- package/mcp-server/dist/tools/youtube/metadata.d.ts +1 -1
- package/mcp-server/dist/tools/youtube/metadata.d.ts.map +1 -1
- package/mcp-server/dist/tools/youtube/metadata.js +1 -1
- package/mcp-server/dist/tools/youtube/metadata.js.map +1 -1
- package/mcp-server/dist/tools/youtube/navigate.d.ts +1 -1
- package/mcp-server/dist/tools/youtube/navigate.d.ts.map +1 -1
- package/mcp-server/dist/tools/youtube/navigate.js +1 -1
- package/mcp-server/dist/tools/youtube/navigate.js.map +1 -1
- package/mcp-server/dist/tools/youtube/playlist.d.ts +1 -1
- package/mcp-server/dist/tools/youtube/playlist.d.ts.map +1 -1
- package/mcp-server/dist/tools/youtube/playlist.js +1 -1
- package/mcp-server/dist/tools/youtube/playlist.js.map +1 -1
- package/mcp-server/dist/tools/youtube/schedule.d.ts +1 -1
- package/mcp-server/dist/tools/youtube/schedule.d.ts.map +1 -1
- package/mcp-server/dist/tools/youtube/schedule.js +1 -1
- package/mcp-server/dist/tools/youtube/schedule.js.map +1 -1
- package/mcp-server/dist/tools/youtube/source.d.ts +1 -1
- package/mcp-server/dist/tools/youtube/source.d.ts.map +1 -1
- package/mcp-server/dist/tools/youtube/source.js +1 -1
- package/mcp-server/dist/tools/youtube/source.js.map +1 -1
- package/mcp-server/dist/tools/youtube/upload.d.ts +1 -1
- package/mcp-server/dist/tools/youtube/upload.d.ts.map +1 -1
- package/mcp-server/dist/tools/youtube/upload.js +4 -9
- package/mcp-server/dist/tools/youtube/upload.js.map +1 -1
- package/mcp-server/dist/tui.js +16 -4
- package/mcp-server/dist/tui.js.map +1 -1
- package/mcp-server/package-lock.json +3 -3
- package/mcp-server/package.json +3 -3
- package/mcp-server/src/services/browser-bench.ts +1 -1
- package/mcp-server/src/services/categories.ts +77 -32
- package/mcp-server/src/services/desktop-bench.ts +1 -1
- package/mcp-server/src/tools/agents.ts +1 -1
- package/mcp-server/src/tools/bluesky.ts +1 -1
- package/mcp-server/src/tools/browser-advanced.ts +1 -1
- package/mcp-server/src/tools/browser-batch.ts +1 -1
- package/mcp-server/src/tools/browser-cheatsheet.ts +1 -1
- package/mcp-server/src/tools/browser-interact.ts +1 -1
- package/mcp-server/src/tools/browser-navigate.ts +1 -1
- package/mcp-server/src/tools/browser-observe.ts +1 -1
- package/mcp-server/src/tools/card-tools.ts +1 -1
- package/mcp-server/src/tools/category.ts +6 -1
- package/mcp-server/src/tools/choice.ts +1 -1
- package/mcp-server/src/tools/computer.ts +1 -1
- package/mcp-server/src/tools/discord-channel.ts +1 -1
- package/mcp-server/src/tools/discord-guild.ts +1 -1
- package/mcp-server/src/tools/discord-member.ts +1 -1
- package/mcp-server/src/tools/discord-message.ts +1 -1
- package/mcp-server/src/tools/discord-onboarding.ts +1 -1
- package/mcp-server/src/tools/discord-role.ts +1 -1
- package/mcp-server/src/tools/discord-thread.ts +1 -1
- package/mcp-server/src/tools/discord-webhook.ts +1 -1
- package/mcp-server/src/tools/fb-groups.ts +1 -1
- package/mcp-server/src/tools/forget.ts +1 -1
- package/mcp-server/src/tools/git-tools.ts +1 -1
- package/mcp-server/src/tools/gsc/experience.ts +1 -1
- package/mcp-server/src/tools/gsc/indexing.ts +1 -1
- package/mcp-server/src/tools/gsc/inspect.ts +1 -1
- package/mcp-server/src/tools/gsc/navigate.ts +1 -1
- package/mcp-server/src/tools/gsc/performance.ts +1 -1
- package/mcp-server/src/tools/gsc/settings.ts +1 -1
- package/mcp-server/src/tools/image-tools.ts +1 -1
- package/mcp-server/src/tools/leonardo-browser-tools.ts +1 -1
- package/mcp-server/src/tools/loop.ts +1 -1
- package/mcp-server/src/tools/memories.ts +1 -1
- package/mcp-server/src/tools/morelogin.ts +1 -1
- package/mcp-server/src/tools/profile.ts +1 -1
- package/mcp-server/src/tools/recall.ts +1 -1
- package/mcp-server/src/tools/reflect.ts +1 -1
- package/mcp-server/src/tools/remember.ts +13 -12
- package/mcp-server/src/tools/restore.ts +1 -1
- package/mcp-server/src/tools/style-guide-tools.ts +1 -1
- package/mcp-server/src/tools/sync.ts +1 -1
- package/mcp-server/src/tools/tictactoe-tools.ts +1 -1
- package/mcp-server/src/tools/utils.ts +1 -1
- package/mcp-server/src/tools/whatsapp-send-file.ts +1 -1
- package/mcp-server/src/tools/whiteboard-tools.ts +1 -1
- package/mcp-server/src/tools/youtube/analytics.ts +1 -1
- package/mcp-server/src/tools/youtube/download.ts +1 -1
- package/mcp-server/src/tools/youtube/media.ts +1 -1
- package/mcp-server/src/tools/youtube/metadata.ts +1 -1
- package/mcp-server/src/tools/youtube/navigate.ts +1 -1
- package/mcp-server/src/tools/youtube/playlist.ts +1 -1
- package/mcp-server/src/tools/youtube/schedule.ts +1 -1
- package/mcp-server/src/tools/youtube/source.ts +1 -1
- package/mcp-server/src/tools/youtube/upload.ts +4 -12
- package/mcp-server/src/tui.ts +22 -9
- package/neural-interface/i18n/en.json +236 -7
- package/neural-interface/i18n/pt-BR.json +238 -9
- package/neural-interface/lib/account-usage.js +5 -3
- package/neural-interface/lib/agent-sandbox-elevation.js +102 -0
- package/neural-interface/lib/agent-sandbox-setting.js +57 -0
- package/neural-interface/lib/app-controls-api.js +161 -0
- package/neural-interface/lib/assistant-api.js +40 -7
- package/neural-interface/lib/assistant-brains/opencode.js +13 -1
- package/neural-interface/lib/assistant-brains/opencode2-browser-policy/index.js +44 -0
- package/neural-interface/lib/assistant-brains/opencode2-route-gate/index.js +57 -0
- package/neural-interface/lib/assistant-catalog.js +17 -2
- package/neural-interface/lib/assistant-dispatch.js +3 -0
- package/neural-interface/lib/assistant-envelope.js +19 -1
- package/neural-interface/lib/assistant-route-gate-codex.js +3 -1
- package/neural-interface/lib/assistant-runtime.js +131 -8
- package/neural-interface/lib/claude-model-catalog.js +64 -14
- package/neural-interface/lib/codex-account-auth.js +4 -2
- package/neural-interface/lib/codex-accounts.js +14 -1
- package/neural-interface/lib/codex-settings-schema.js +111 -47
- package/neural-interface/lib/editor-completion-opencode.js +132 -35
- package/neural-interface/lib/exec-loop-command.js +11 -2
- package/neural-interface/lib/install-details.js +23 -5
- package/neural-interface/lib/launch-cache.js +293 -0
- package/neural-interface/lib/login-start.js +524 -0
- package/neural-interface/lib/native-loop-providers.js +24 -4
- package/neural-interface/lib/native-loop-runtime.js +19 -0
- package/neural-interface/lib/opencode-db-schema.js +75 -0
- package/neural-interface/lib/opencode-history.js +16 -1
- package/neural-interface/lib/opencode-protocol.js +173 -0
- package/neural-interface/lib/opencode-provider-view.js +81 -0
- package/neural-interface/lib/opencode-runtime-config.js +10 -3
- package/neural-interface/lib/opencode-serve-records.js +606 -0
- package/neural-interface/lib/opencode-v2-client.js +33 -6
- package/neural-interface/lib/opencode-v2-ws-requests.js +19 -5
- package/neural-interface/lib/opencode-worker-activity.js +229 -0
- package/neural-interface/lib/opencode2-client.js +760 -0
- package/neural-interface/lib/opencode2-proxy.js +116 -0
- package/neural-interface/lib/opencode2-translate.js +1008 -0
- package/neural-interface/lib/process-identity.js +361 -0
- package/neural-interface/lib/provider-panel-terminal-auth.js +3 -2
- package/neural-interface/lib/session-cache-builder.js +26 -5
- package/neural-interface/lib/session-indexer.js +3 -1
- package/neural-interface/lib/session-title-generator.js +20 -0
- package/neural-interface/lib/style-guide/api.js +4 -3
- package/neural-interface/lib/untrusted-file-headers.js +27 -0
- package/neural-interface/package-lock.json +1342 -44
- package/neural-interface/package.json +5 -1
- package/neural-interface/public/index.html +2 -2
- package/neural-interface/public/shared/account-menu.js +4 -1
- package/neural-interface/public/shared/account-usage.js +62 -2
- package/neural-interface/public/shared/account-view.js +2 -1
- package/neural-interface/public/shared/agent-runtime-options.js +55 -11
- package/neural-interface/public/shared/assistant/asst-account-menu.js +298 -0
- package/neural-interface/public/shared/assistant/asst-agents-dock.js +172 -17
- package/neural-interface/public/shared/assistant/asst-api.js +18 -3
- package/neural-interface/public/shared/assistant/asst-brain-picker.js +424 -152
- package/neural-interface/public/shared/assistant/asst-composer.js +1 -1
- package/neural-interface/public/shared/assistant/asst-hosts.js +49 -2
- package/neural-interface/public/shared/assistant/asst-menu.js +275 -77
- package/neural-interface/public/shared/assistant/asst-model-chip.js +135 -0
- package/neural-interface/public/shared/assistant/asst-panel.js +236 -35
- package/neural-interface/public/shared/assistant/asst-rack-styles.js +28 -10
- package/neural-interface/public/shared/assistant/asst-redact.js +186 -0
- package/neural-interface/public/shared/assistant/asst-render.js +382 -36
- package/neural-interface/public/shared/assistant/asst-run-stage.js +231 -0
- package/neural-interface/public/shared/assistant/asst-sanitize.js +193 -3
- package/neural-interface/public/shared/assistant/asst-scene-styles.js +273 -0
- package/neural-interface/public/shared/assistant/asst-scenes.js +528 -0
- package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +3 -15
- package/neural-interface/public/shared/assistant/asst-state.js +14 -0
- package/neural-interface/public/shared/assistant/asst-styles.js +109 -17
- package/neural-interface/public/shared/assistant/asst-tool-kinds.js +13 -1
- package/neural-interface/public/shared/cc-dropdown.js +480 -0
- package/neural-interface/public/shared/cdx/cdx-panel.js +14 -2
- package/neural-interface/public/shared/cdx/cdx-render.js +15 -3
- package/neural-interface/public/shared/cdx/cdx-styles.js +49 -5
- package/neural-interface/public/shared/cdx/cdx-tabs.js +152 -35
- package/neural-interface/public/shared/cp/cp-markdown.js +4 -57
- package/neural-interface/public/shared/data-cache.js +223 -0
- package/neural-interface/public/shared/desktop-bridge.js +11 -0
- package/neural-interface/public/shared/desktop-titlebar-view.js +78 -1
- package/neural-interface/public/shared/desktop-titlebar.js +214 -28
- package/neural-interface/public/shared/desktop-update-view.js +15 -5
- package/neural-interface/public/shared/file-links.js +73 -8
- package/neural-interface/public/shared/html-shell.js +74 -80
- package/neural-interface/public/shared/launch-prefetch.js +59 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +3 -2
- package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +11 -3
- package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +54 -17
- package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +97 -3
- package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +3 -2
- package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +11 -9
- package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +15 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +1 -1
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +401 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +16 -9
- package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +60 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +83 -5
- package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +195 -19
- package/neural-interface/public/shared/opencode-providers.js +39 -0
- package/neural-interface/public/shared/schedules-view.js +318 -0
- package/neural-interface/public/shared/settings/settings-app-pane.js +335 -0
- package/neural-interface/public/shared/settings/settings-app.js +243 -0
- package/neural-interface/public/shared/settings/settings-data.js +88 -0
- package/neural-interface/public/shared/settings/settings-ia.js +17 -0
- package/neural-interface/public/shared/showcase-privacy.js +2 -1
- package/neural-interface/public/shared/sidepanel-session-status.js +49 -0
- package/neural-interface/public/shared/styles.css +543 -372
- package/neural-interface/public/shared/ui-assistant.js +27 -5
- package/neural-interface/public/shared/ui-automation-studio.js +67 -27
- package/neural-interface/public/shared/ui-bookmarks.js +2 -1
- package/neural-interface/public/shared/ui-claude-panel.js +126 -12
- package/neural-interface/public/shared/ui-codex-panel.js +1 -0
- package/neural-interface/public/shared/ui-detail.js +6 -6
- package/neural-interface/public/shared/ui-explorer.js +2 -0
- package/neural-interface/public/shared/ui-file-links.js +1 -0
- package/neural-interface/public/shared/ui-image-gallery.js +6 -5
- package/neural-interface/public/shared/ui-invite.js +18 -2
- package/neural-interface/public/shared/ui-link.js +9 -9
- package/neural-interface/public/shared/ui-menubar.js +232 -33
- package/neural-interface/public/shared/ui-native-loop-router.js +2 -0
- package/neural-interface/public/shared/ui-opencode-panel-v2.js +1 -0
- package/neural-interface/public/shared/ui-schedules-studio.js +2099 -869
- package/neural-interface/public/shared/ui-sessions.js +15 -4
- package/neural-interface/public/shared/ui-settings.js +87 -36
- package/neural-interface/public/shared/ui-sidebar.js +4 -4
- package/neural-interface/public/shared/ui-sidepanel-session-entry.js +13 -0
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +55 -4
- package/neural-interface/public/shared/ui-sidepanel-tray.js +84 -8
- package/neural-interface/public/shared/ui-skills.js +70 -12
- package/neural-interface/public/shared/ui-sync.js +9 -0
- package/neural-interface/public/shared/ui-terminal.js +36 -20
- package/neural-interface/public/shared/ui-trash.js +8 -1
- package/neural-interface/public/shared/ui-tutorial-steps.js +7 -3
- package/neural-interface/public/shared/ui-tutorial.js +15 -5
- package/neural-interface/public/shared/ui-update.js +87 -16
- package/neural-interface/public/shared/ui-whiteboard.js +2 -1
- package/neural-interface/public/variant/2d/main.js +4 -1
- package/neural-interface/public/variant/3d/main.js +3 -0
- package/neural-interface/public/vendor/highlight/LICENSE +29 -0
- package/neural-interface/public/vendor/highlight/github-dark-dimmed-11.12.0.min.css +9 -0
- package/neural-interface/public/vendor/highlight/highlight-11.12.0.min.js +1262 -0
- package/neural-interface/public/vendor/highlight/manifest.json +5 -0
- package/neural-interface/public/vendor/html2canvas/LICENSE +22 -0
- package/neural-interface/public/vendor/html2canvas/html2canvas-1.4.1.min.js +20 -0
- package/neural-interface/public/vendor/html2canvas/manifest.json +4 -0
- package/neural-interface/public/vendor/marked/LICENSE.md +44 -0
- package/neural-interface/public/vendor/marked/manifest.json +4 -0
- package/neural-interface/public/vendor/marked/marked-14.1.4.esm.js +2502 -0
- package/neural-interface/public/vendor/mermaid/LICENSE +21 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/abnfDiagram-PAR5IXJI.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architecture-7GRP2DOG-M7G3SWCO.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architectureDiagram-2PNWDENW.mjs +36 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/blockDiagram-PUWGUBOA.mjs +129 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/c4Diagram-3NLNHZP5.mjs +38 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-2NMSUPJH.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-32MCUW2P.mjs +206 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3NPNU5GP.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3SMGFRGC.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4CAJECRU.mjs +14 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4OADUZ5Q.mjs +10 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IMINLNL.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IQCK5RY.mjs +3 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5MVFYWFU.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AQ6EADP3.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AZZRMDJM.mjs +15 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-CLS4B6BI.mjs +168 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-DZP67EKU.mjs +70 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-EICP7K5X.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-GDY2UAB4.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-H7VHZCWX.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-IJBDOHL6.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JFFVMJIA.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JQRUD6KW.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JZGDI5JK.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-KD6SPIPN.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NF366YI6.mjs +231 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NUDPKBEF.mjs +32 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-OJINMHTS.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Q6NGPIAH.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-QJSWEUOL.mjs +132 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-R7JDMUKV.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RCXAM2GK.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RT4MAWR3.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SFMINX4W.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SLDQ463B.mjs +88 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-STOV2HOB.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-T5OCTHI4.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-TCEHX7R3.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VQC2EELJ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VRZKL3EH.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VTHDQ7BV.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VY2OSTJR.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-WUBWJARI.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YBMQ5JGJ.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YDMLL4PJ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Z6V44ARX.mjs +62 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZJJ7VQJP.mjs +339 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZNLK7HRR.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZQN7UHIL.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZS6VBONO.mjs +174 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZUNWM646.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-FGAMPOII.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-v2-AI5RJEK4.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cose-bilkent-Q72C2OJ3.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefin-OW5HDTMX-6OCTWOGG.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefinDiagram-2OOWUY4M.mjs +62 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/dagre-MPVFI544.mjs +4 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-AE4NWXFW.mjs +24 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-BUJID5UG.mjs +41 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-C44CZ5NI.mjs +24 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-EYOLEXXS.mjs +30 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-P7B6PWOJ.mjs +3 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ebnfDiagram-FTPZ3PV6.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/erDiagram-H3ERR26V.mjs +99 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/eventmodeling-NTZA5JFV-WKSWQHFS.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/flowDiagram-YHGXBVSY.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ganttDiagram-RWFTB7ED.mjs +292 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraph-4MIJSDKK-JH2HKYUO.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraphDiagram-MAR6GKOP.mjs +106 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/info-A6RAGUB7-3TX3OFWW.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/infoDiagram-LV547AFH.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ishikawaDiagram-PUJQGNDS.mjs +70 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/journeyDiagram-EW5QJT4W.mjs +139 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/kanban-definition-JSQERAZB.mjs +89 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/katex-CZ4GXH2S.mjs +257 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/mindmap-definition-VBJCLQLM.mjs +96 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/packet-AYTQ26CC-MKII6P3Y.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pegDiagram-7WILOQTJ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pie-WAS4IAKB-6B4OPMJ5.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pieDiagram-EFA7CBSB.mjs +39 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/quadrantDiagram-WARVYA7P.mjs +7 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/radar-RG4KPBEZ-UPTR3XUL.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-74A4TZTK-MEFUPFMS.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-abnf-HS5TGJTU-R5YG2S5D.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-ebnf-LZEXJU2U-G5QEX2L6.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-peg-WCYAUIDC-H5I2ZRY2.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroadDiagram-5NIQVNLQ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/requirementDiagram-SXREGOKZ.mjs +84 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sankeyDiagram-VV74M2VP.mjs +40 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sequenceDiagram-52ZFIFDL.mjs +162 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sizeCapture-FGA5AGYP.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-3QAKPIVI.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-v2-HN2P4RDZ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanes-QLVP42QD.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanesDiagram-JKPDBFCN.mjs +8 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/timeline-definition-GS45XAXW.mjs +120 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treeView-Q6P3EWNA-ZRJGANNQ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treemap-WGGIJYW6-K64VN5AS.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/vennDiagram-QIQU2ZRJ.mjs +34 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardley-WFR3VGLG-D67OWCCH.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardleyDiagram-U6YNM66N.mjs +78 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/xychartDiagram-XJAZEDNM.mjs +7 -0
- package/neural-interface/public/vendor/mermaid/manifest.json +4 -0
- package/neural-interface/public/vendor/mermaid/mermaid-11.17.2.esm.min.mjs +14 -0
- package/neural-interface/scripts/build-vendor.mjs +84 -3
- package/neural-interface/scripts/rebuild-pty.js +14 -2
- package/neural-interface/server.js +1279 -372
- package/npm-shrinkwrap.json +4424 -0
- package/package.json +54 -2
- package/postinstall.js +61 -47
- package/preuninstall.js +8 -35
- package/setup.js +76 -44
- package/skills/synabun/modules/idea.md +1 -1
- package/skills/synabun/modules/schedule.md +2 -2
- package/updater.cmd +2 -2
- package/updater.mjs +97 -3
|
@@ -24,6 +24,7 @@ export const DESKTOP_COPY = Object.freeze({
|
|
|
24
24
|
tooltip: 'SynaBun update available: v{current} → v{latest}',
|
|
25
25
|
tooltipDownloading: 'Downloading SynaBun v{latest}',
|
|
26
26
|
tooltipReady: 'SynaBun v{latest} is ready: it installs when SynaBun is idle',
|
|
27
|
+
tooltipReadyOff: 'SynaBun v{latest} is ready to install',
|
|
27
28
|
titleAvailable: 'Update available',
|
|
28
29
|
titleDownloading: 'Downloading the update',
|
|
29
30
|
titleDownloaded: 'Update ready',
|
|
@@ -46,6 +47,9 @@ export const DESKTOP_COPY = Object.freeze({
|
|
|
46
47
|
hide: 'Hide',
|
|
47
48
|
hideHint: 'The download continues while this is hidden. SynaBun installs the update by itself when nothing is running.',
|
|
48
49
|
readyBody: 'SynaBun v{version} is downloaded. It installs by itself once nothing is running: SynaBun shows a one-minute notice, then restarts into it. It also installs when you quit SynaBun.',
|
|
50
|
+
// Automatic updates off (Settings > App): it waits for Install now.
|
|
51
|
+
offBody: 'Automatic updates are off. Install now downloads it and restarts SynaBun into it once nothing is running.',
|
|
52
|
+
readyBodyOff: 'SynaBun v{version} is downloaded. Automatic updates are off: it installs when you choose Install now.',
|
|
49
53
|
waitingBody: 'Waiting for: {list}.',
|
|
50
54
|
countdownBody: 'SynaBun restarts into v{version} in {seconds} s.',
|
|
51
55
|
postponedBody: 'Postponed until {time}. It also installs when you quit SynaBun.',
|
|
@@ -62,12 +66,14 @@ export const DESKTOP_COPY = Object.freeze({
|
|
|
62
66
|
errorFallback: 'SynaBun could not check for updates. Check the connection and try again.',
|
|
63
67
|
errorNext: 'SynaBun keeps the version it runs and tries again at its next check. You can try now, or download the new version yourself.',
|
|
64
68
|
manualLink: 'Download it yourself',
|
|
69
|
+
settingsLink: 'Update settings',
|
|
65
70
|
close: 'Close',
|
|
66
71
|
retry: 'Try again',
|
|
67
72
|
testFeed: 'test feed',
|
|
68
73
|
metaAvailable: 'From the SynaBun app',
|
|
69
74
|
metaDownloading: 'Downloading: {percent}%',
|
|
70
75
|
metaDownloaded: 'Ready: installs when SynaBun is idle',
|
|
76
|
+
metaReadyOff: 'Ready to install',
|
|
71
77
|
metaCountdown: 'Restarting to install it',
|
|
72
78
|
metaPostponed: 'Postponed: installs on quit or later',
|
|
73
79
|
}),
|
|
@@ -193,6 +199,8 @@ export function readDesktopUpdateState(state) {
|
|
|
193
199
|
manualFile: text(s.manualFile, 4096),
|
|
194
200
|
testFeed: s.testFeed === true,
|
|
195
201
|
auto: readAuto(s.auto),
|
|
202
|
+
// Settings > App; an app from before the setting says nothing: on.
|
|
203
|
+
autoUpdate: s.autoUpdate !== false,
|
|
196
204
|
updated: readUpdated(s.updated),
|
|
197
205
|
releasesUrl: readReleasesUrl(s.releasesUrl),
|
|
198
206
|
};
|
|
@@ -236,6 +244,7 @@ export function versionDataFromDesktop(state) {
|
|
|
236
244
|
testFeed: s.testFeed,
|
|
237
245
|
checkedAt: s.checkedAt,
|
|
238
246
|
auto: s.auto,
|
|
247
|
+
autoUpdate: s.autoUpdate,
|
|
239
248
|
};
|
|
240
249
|
}
|
|
241
250
|
|
|
@@ -311,11 +320,12 @@ export function desktopUpdateView(state, {
|
|
|
311
320
|
case 'available':
|
|
312
321
|
view.dot = 1;
|
|
313
322
|
view.title = say('titleAvailable');
|
|
314
|
-
view.body = [say('snapshot', { version })];
|
|
323
|
+
view.body = s.autoUpdate ? [say('snapshot', { version })] : [say('offBody'), say('snapshot', { version })];
|
|
315
324
|
view.notesLabel = say('notesLabel');
|
|
316
325
|
view.notes = s.notes || say('notesEmpty');
|
|
317
326
|
view.backup = { id: 'backup', label: say('backup') };
|
|
318
|
-
|
|
327
|
+
// Automatic updates off: one click downloads and installs it (no download on its own to wait for).
|
|
328
|
+
view.actions = [action('later', 'ghost', 'later'), s.autoUpdate ? action('download', 'primary', 'download') : action('install-now', 'primary', 'installNow')];
|
|
319
329
|
break;
|
|
320
330
|
case 'downloading':
|
|
321
331
|
view.dot = 2;
|
|
@@ -328,8 +338,8 @@ export function desktopUpdateView(state, {
|
|
|
328
338
|
case 'downloaded': {
|
|
329
339
|
view.dot = 3;
|
|
330
340
|
view.title = say('titleDownloaded');
|
|
331
|
-
view.body = [say('readyBody', { version })];
|
|
332
341
|
const auto = s.auto;
|
|
342
|
+
view.body = [s.autoUpdate || auto?.now ? say('readyBody', { version }) : say('readyBodyOff', { version })];
|
|
333
343
|
if (auto?.phase === 'countdown' && auto.installAt) {
|
|
334
344
|
view.body.push(say('countdownBody', { version, seconds: secondsUntil(auto.installAt, now) }));
|
|
335
345
|
view.ticking = true;
|
|
@@ -395,7 +405,7 @@ export function desktopUpdateMeta(state, { t = fillDesktopCopy } = {}) {
|
|
|
395
405
|
case 'downloaded':
|
|
396
406
|
if (s.auto?.phase === 'countdown') return t('update.metaCountdown');
|
|
397
407
|
if (s.auto?.phase === 'postponed') return t('update.metaPostponed');
|
|
398
|
-
return t('update.metaDownloaded');
|
|
408
|
+
return s.autoUpdate || s.auto?.now ? t('update.metaDownloaded') : t('update.metaReadyOff');
|
|
399
409
|
case 'installing': return t('update.titleInstalling');
|
|
400
410
|
case 'available': case 'move': case 'manual': return t('update.metaAvailable');
|
|
401
411
|
default: return '';
|
|
@@ -408,7 +418,7 @@ export function desktopUpdateTooltip(state, { t = fillDesktopCopy } = {}) {
|
|
|
408
418
|
const params = { current: s.current, latest: s.latest || '' };
|
|
409
419
|
const step = desktopUpdateStep(s);
|
|
410
420
|
if (step === 'downloading') return t('update.tooltipDownloading', params);
|
|
411
|
-
if (step === 'downloaded') return t('update.tooltipReady', params);
|
|
421
|
+
if (step === 'downloaded') return t(s.autoUpdate || s.auto?.now ? 'update.tooltipReady' : 'update.tooltipReadyOff', params);
|
|
412
422
|
return t('update.tooltip', params);
|
|
413
423
|
}
|
|
414
424
|
|
|
@@ -36,20 +36,54 @@ const SCHEME_RE = /^([a-z][a-z0-9+.-]*):/i;
|
|
|
36
36
|
const PLACE_ONLY_RE = /^\d+(?::\d+)?(?:#.*)?$/;
|
|
37
37
|
const LINE_SUFFIX_RE = /:(\d+)(?::(\d+))?$/;
|
|
38
38
|
const LINE_HASH_RE = /^#L(\d+)(?:C(\d+))?(?:-L?\d+(?:C\d+)?)?$/i;
|
|
39
|
+
// Schemes a browser runs or draws content from: never a file's name, not even before a line number.
|
|
40
|
+
const ACTIVE_SCHEMES = new Set(['javascript', 'vbscript', 'livescript', 'data', 'blob', 'filesystem', 'about', 'view-source']);
|
|
41
|
+
// What a scheme can hide behind: a browser drops tabs and line breaks anywhere in a URL and controls at its
|
|
42
|
+
// ends; format characters show nothing; an entity can be left over from a second escape.
|
|
43
|
+
const HIDDEN_RE = /[\u0000-\u001f\u007f-\u009f\u00ad\u200b-\u200f\u2028\u2029\u2060-\u2064\ufeff]/g;
|
|
44
|
+
const ENTITY_RE = /&(?:#(\d+)|#x([0-9a-f]+)|([a-z]+));?/gi;
|
|
45
|
+
const NAMED_ENTITIES = { colon: ':', tab: '\t', newline: '\n', nbsp: ' ', sol: '/', bsol: '\\', num: '#', quest: '?', period: '.', amp: '&', semi: ';', lpar: '(', rpar: ')' };
|
|
39
46
|
|
|
40
47
|
const slashes = (path) => String(path ?? '').replace(/\\/g, '/');
|
|
41
48
|
|
|
49
|
+
function decodeEntities(text) {
|
|
50
|
+
let out = text;
|
|
51
|
+
for (let round = 0; round < 4; round += 1) { // `&#106;` is `j` once more
|
|
52
|
+
const next = out.replace(ENTITY_RE, (whole, dec, hex, name) => {
|
|
53
|
+
if (name) return NAMED_ENTITIES[name.toLowerCase()] ?? whole;
|
|
54
|
+
const code = dec ? Number(dec) : parseInt(hex, 16);
|
|
55
|
+
return code > 0 && code <= 0x10ffff ? String.fromCodePoint(code) : '';
|
|
56
|
+
});
|
|
57
|
+
if (next === out) break;
|
|
58
|
+
out = next;
|
|
59
|
+
}
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** A target as its scheme is read: entities decoded, hidden characters dropped, no spaces at the ends, lower case. */
|
|
64
|
+
function schemeView(value) {
|
|
65
|
+
return decodeEntities(value).replace(HIDDEN_RE, '').trim().toLowerCase();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// An active scheme, read with its spaces squeezed out too: `java script:` is no URL to a browser, and no file either.
|
|
69
|
+
const isActive = (seen) => ACTIVE_SCHEMES.has(SCHEME_RE.exec(seen.replace(/\s+/g, ''))?.[1]);
|
|
70
|
+
|
|
42
71
|
/** How a target reads: a `path`, a `file` URL, a `web` address (http, https), or null for anything else. */
|
|
43
72
|
function kindOf(value) {
|
|
44
73
|
if (!value || value.length > MAX_TARGET_LENGTH) return null;
|
|
45
|
-
|
|
74
|
+
const seen = schemeView(value);
|
|
75
|
+
if (!seen || seen.startsWith('#') || seen.startsWith('?') || seen.startsWith('//') || isActive(seen)) return null;
|
|
46
76
|
if (DRIVE_RE.test(value)) return 'path';
|
|
47
|
-
const scheme = SCHEME_RE.exec(
|
|
77
|
+
const scheme = SCHEME_RE.exec(seen);
|
|
48
78
|
if (!scheme) return 'path';
|
|
49
|
-
|
|
79
|
+
// A scheme put together from hidden characters or entities (`JaVa\tScript:`, `javascript:`) is no
|
|
80
|
+
// file's and no address of this app.
|
|
81
|
+
const written = SCHEME_RE.exec(value);
|
|
82
|
+
if (!written || written[1].toLowerCase() !== scheme[1]) return null;
|
|
83
|
+
const name = scheme[1];
|
|
50
84
|
if (name === 'file') return 'file';
|
|
51
85
|
if (name === 'http' || name === 'https') return 'web';
|
|
52
|
-
const rest = value.slice(
|
|
86
|
+
const rest = value.slice(written[0].length);
|
|
53
87
|
if (rest.startsWith('//')) return null;
|
|
54
88
|
return PLACE_ONLY_RE.test(rest) ? 'path' : null;
|
|
55
89
|
}
|
|
@@ -231,6 +265,33 @@ export function fillFileLinkCopy(key, params = {}) {
|
|
|
231
265
|
|
|
232
266
|
// ── The click ──
|
|
233
267
|
|
|
268
|
+
/**
|
|
269
|
+
* Whether a link would run a script or draw data when the browser follows it: its `href` (or an SVG link's
|
|
270
|
+
* `xlink:href`) read the way kindOf reads a target (entities decoded, controls and invisible characters dropped,
|
|
271
|
+
* lower case), and the scheme the browser itself resolved. Nothing else an anchor carries is asked.
|
|
272
|
+
* @param {Element} anchor
|
|
273
|
+
*/
|
|
274
|
+
export function isActiveLink(anchor) {
|
|
275
|
+
for (const name of ['href', 'xlink:href']) {
|
|
276
|
+
const value = anchor.getAttribute?.(name);
|
|
277
|
+
if (value != null && isActive(schemeView(String(value)))) return true;
|
|
278
|
+
}
|
|
279
|
+
const resolved = typeof anchor.protocol === 'string' ? anchor.protocol.replace(/:$/, '').toLowerCase() : '';
|
|
280
|
+
return ACTIVE_SCHEMES.has(resolved);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// A kept target is the sanitiser's note of the href as written (safeHref resolved it against the page, or dropped
|
|
284
|
+
// it). It counts only while it is a file's and the href says the same thing; anything else is the href's to say.
|
|
285
|
+
function keptTarget(anchor, href) {
|
|
286
|
+
const kept = anchor.getAttribute('data-file-target');
|
|
287
|
+
if (!kept || localFileHref(kept) == null) return null;
|
|
288
|
+
if (href == null) return kept; // file:, C:\…, name.ext:12: the sanitiser writes no href for them
|
|
289
|
+
try {
|
|
290
|
+
const base = anchor.baseURI || `${new URL(href).origin}/`;
|
|
291
|
+
return new URL(kept.trim(), base).href === new URL(href, base).href ? kept : null;
|
|
292
|
+
} catch { return null; }
|
|
293
|
+
}
|
|
294
|
+
|
|
234
295
|
/**
|
|
235
296
|
* What a link points at, as the agent wrote it.
|
|
236
297
|
* @param {Element} anchor
|
|
@@ -239,9 +300,9 @@ export function fillFileLinkCopy(key, params = {}) {
|
|
|
239
300
|
* @returns {{ raw: string, text: boolean } | null}
|
|
240
301
|
*/
|
|
241
302
|
export function readFileLink(anchor, { textLinks = '' } = {}) {
|
|
242
|
-
const kept = anchor.getAttribute('data-file-target');
|
|
243
|
-
if (kept) return { raw: kept, text: false };
|
|
244
303
|
const href = anchor.getAttribute('href');
|
|
304
|
+
const kept = keptTarget(anchor, href);
|
|
305
|
+
if (kept) return { raw: kept, text: false };
|
|
245
306
|
if (textLinks && anchor.matches(textLinks) && (!href || href === '#')) return { raw: anchor.textContent || '', text: true };
|
|
246
307
|
return href ? { raw: href, text: false } : null;
|
|
247
308
|
}
|
|
@@ -255,7 +316,8 @@ export function readFileLink(anchor, { textLinks = '' } = {}) {
|
|
|
255
316
|
* @param {() => string} page.origin the page's origin
|
|
256
317
|
* @param {(key: string, params?: object) => string} page.say a `fileLinks.*` sentence
|
|
257
318
|
* @param {(message: string) => void} page.notify shows a short message
|
|
258
|
-
* @param {(anchor: Element) => void} page.follow goes where a link of this app leads, as the browser would
|
|
319
|
+
* @param {(anchor: Element) => void} page.follow goes where a link of this app leads, as the browser would (only
|
|
320
|
+
* ever for an http(s) address of this app that is the anchor's own href: never a script link)
|
|
259
321
|
*/
|
|
260
322
|
export function createFileLinkHandlers(page) {
|
|
261
323
|
const whereOf = (anchor, options) => {
|
|
@@ -302,12 +364,15 @@ export function createFileLinkHandlers(page) {
|
|
|
302
364
|
* @param {(message: string) => void} [options.notify] shows the reason a link was not opened
|
|
303
365
|
* @returns {Promise<string> | null} null when the click is not this handler's (the browser follows the
|
|
304
366
|
* link as before); else the click is taken and the promise says how it ended: 'opened', 'copied',
|
|
305
|
-
* 'followed', or the reason the user was told
|
|
367
|
+
* 'followed', 'blocked' (a script or data link), or the reason the user was told
|
|
306
368
|
*/
|
|
307
369
|
function handleClick(event, options = {}) {
|
|
308
370
|
if (event.defaultPrevented || event.button > 0) return null;
|
|
309
371
|
const anchor = event.target?.closest?.('a');
|
|
310
372
|
if (!anchor || (options.within && !options.within.contains(anchor))) return null;
|
|
373
|
+
// A script or data link in an agent's message goes nowhere, however it is spelled and whatever else the anchor
|
|
374
|
+
// says (a kept target, a download): the Codex panel's Markdown is not sanitised, so its href can still be one.
|
|
375
|
+
if (isActiveLink(anchor)) { event.preventDefault(); return Promise.resolve('blocked'); }
|
|
311
376
|
if (anchor.hasAttribute?.('download')) return null; // a file the app itself offers
|
|
312
377
|
const link = readFileLink(anchor, options);
|
|
313
378
|
if (!link) return null;
|
|
@@ -203,26 +203,34 @@ export function getSharedHTML() {
|
|
|
203
203
|
<span class="menu-text"><span class="menu-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><circle cx="12" cy="12" r="10"/><ellipse cx="12" cy="12" rx="4" ry="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M4.5 7h15M4.5 17h15" stroke-width="1"/></svg></span> ${t('menu.apps.browser')}</span>
|
|
204
204
|
<span class="menu-shortcut" data-keybind-for="launch-browser"></span>
|
|
205
205
|
</div>
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
<span class="menu-
|
|
209
|
-
<span class="menu-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
<
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
206
|
+
<!-- Browser apps: a submenu (ui-menubar.js wireSubmenus) -->
|
|
207
|
+
<div class="menu-item menu-submenu-parent" id="menu-browser-apps" data-submenu="browser-apps" aria-haspopup="menu" aria-expanded="false">
|
|
208
|
+
<span class="menu-check"></span>
|
|
209
|
+
<span class="menu-text"><span class="menu-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="7" height="7" rx="1"/><rect x="14" y="3" width="7" height="7" rx="1"/><rect x="3" y="14" width="7" height="7" rx="1"/><rect x="14" y="14" width="7" height="7" rx="1"/></svg></span> ${t('menu.apps.browserApps')}</span>
|
|
210
|
+
<span class="menu-submenu-arrow" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 18 15 12 9 6"/></svg></span>
|
|
211
|
+
</div>
|
|
212
|
+
<div class="menubar-submenu" data-submenu-for="browser-apps" role="menu">
|
|
213
|
+
<div class="menu-item" id="menu-terminal-youtube">
|
|
214
|
+
<span class="menu-check"></span>
|
|
215
|
+
<span class="menu-text"><span class="menu-icon"><svg viewBox="0 0 24 24" fill="currentColor"><path d="M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z"/></svg></span> ${t('menu.apps.youtube')}</span>
|
|
216
|
+
<span class="menu-shortcut" data-keybind-for="launch-youtube"></span>
|
|
217
|
+
</div>
|
|
218
|
+
<div class="menu-item" id="menu-terminal-discord">
|
|
219
|
+
<span class="menu-check"></span>
|
|
220
|
+
<span class="menu-text"><span class="menu-icon"><svg viewBox="0 0 24 24" fill="currentColor"><path d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.095 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.095 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z"/></svg></span> Discord</span>
|
|
221
|
+
</div>
|
|
222
|
+
<div class="menu-item" id="menu-terminal-x">
|
|
223
|
+
<span class="menu-check"></span>
|
|
224
|
+
<span class="menu-text"><span class="menu-icon"><svg viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg></span> X</span>
|
|
225
|
+
</div>
|
|
226
|
+
<div class="menu-item" id="menu-terminal-whatsapp">
|
|
227
|
+
<span class="menu-check"></span>
|
|
228
|
+
<span class="menu-text"><span class="menu-icon"><svg viewBox="0 0 24 24" fill="currentColor"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/></svg></span> WhatsApp</span>
|
|
229
|
+
</div>
|
|
230
|
+
<div class="menu-item" id="menu-app-leonardo" hidden>
|
|
231
|
+
<span class="menu-check"></span>
|
|
232
|
+
<span class="menu-text"><span class="menu-icon"><svg viewBox="0 0 24 24" fill="currentColor"><path d="M9.5 2l1.5 3.5L14.5 7l-3.5 1.5L9.5 12l-1.5-3.5L4.5 7l3.5-1.5L9.5 2zM19 10l1 2 2 1-2 1-1 2-1-2-2-1 2-1 1-2zM5 17l1 2 2 1-2 1-1 2-1-2-2-1 2-1 1-2z"/></svg></span> Leonardo.AI</span>
|
|
233
|
+
</div>
|
|
226
234
|
</div>
|
|
227
235
|
<div class="menu-sep"></div>
|
|
228
236
|
<div class="menu-item" id="menu-command-runner">
|
|
@@ -239,6 +247,48 @@ export function getSharedHTML() {
|
|
|
239
247
|
<span class="menu-shortcut">T</span>
|
|
240
248
|
</div>
|
|
241
249
|
<div class="menu-sep"></div>
|
|
250
|
+
${is3D ? ` <!-- Map (3D memory map) -->
|
|
251
|
+
<div class="menu-item menu-submenu-parent" id="menu-map-label" data-submenu="map" aria-haspopup="menu" aria-expanded="false">
|
|
252
|
+
<span class="menu-check"></span>
|
|
253
|
+
<span class="menu-text"><span class="menu-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="1 6 1 22 8 18 16 22 23 18 23 2 16 6 8 2 1 6"/><line x1="8" y1="2" x2="8" y2="18"/><line x1="16" y1="6" x2="16" y2="22"/></svg></span> ${t('nav.map')}</span>
|
|
254
|
+
<span class="menu-submenu-arrow" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 18 15 12 9 6"/></svg></span>
|
|
255
|
+
</div>
|
|
256
|
+
<div class="menubar-submenu" data-submenu-for="map" role="menu">
|
|
257
|
+
<div class="menu-item" id="menu-map-frame-all">
|
|
258
|
+
<span class="menu-check"></span>
|
|
259
|
+
<span class="menu-text">${t('map.menu.frameAll')}</span>
|
|
260
|
+
<span class="menu-shortcut" data-keybind-for="map-frame-all"></span>
|
|
261
|
+
</div>
|
|
262
|
+
<div class="menu-item menu-toggle" id="menu-map-neighbors">
|
|
263
|
+
<span class="menu-check">✓</span>
|
|
264
|
+
<span class="menu-text">${t('map.menu.neighbors')}</span>
|
|
265
|
+
</div>
|
|
266
|
+
<div class="menu-item menu-toggle" id="menu-map-recency">
|
|
267
|
+
<span class="menu-check">✓</span>
|
|
268
|
+
<span class="menu-text">${t('map.menu.recency')}</span>
|
|
269
|
+
</div>
|
|
270
|
+
<div class="menu-item menu-toggle" id="menu-map-grid">
|
|
271
|
+
<span class="menu-check">✓</span>
|
|
272
|
+
<span class="menu-text">${t('map.menu.grid')}</span>
|
|
273
|
+
</div>
|
|
274
|
+
<div class="menu-item" id="menu-map-rebuild">
|
|
275
|
+
<span class="menu-check"></span>
|
|
276
|
+
<span class="menu-text">${t('map.menu.rebuild')}</span>
|
|
277
|
+
</div>
|
|
278
|
+
</div>
|
|
279
|
+
` : ''} <!-- Games -->
|
|
280
|
+
<div class="menu-item menu-submenu-parent" id="menu-games-label" data-submenu="games" aria-haspopup="menu" aria-expanded="false">
|
|
281
|
+
<span class="menu-check"></span>
|
|
282
|
+
<span class="menu-text"><span class="menu-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="6" y1="11" x2="10" y2="11"/><line x1="8" y1="9" x2="8" y2="13"/><line x1="15" y1="12" x2="15.01" y2="12"/><line x1="18" y1="10" x2="18.01" y2="10"/><path d="M17.32 5H6.68a4 4 0 0 0-3.978 3.59c-.006.052-.01.101-.017.152C2.604 9.416 2 14.456 2 16a3 3 0 0 0 3 3c1 0 1.5-.5 2-1l1.414-1.414A2 2 0 0 1 9.828 16h4.344a2 2 0 0 1 1.414.586L17 18c.5.5 1 1 2 1a3 3 0 0 0 3-3c0-1.545-.604-6.584-.685-7.258-.007-.05-.011-.1-.017-.151A4 4 0 0 0 17.32 5z"/></svg></span> ${t('nav.games')}</span>
|
|
283
|
+
<span class="menu-submenu-arrow" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 18 15 12 9 6"/></svg></span>
|
|
284
|
+
</div>
|
|
285
|
+
<div class="menubar-submenu" data-submenu-for="games" role="menu">
|
|
286
|
+
<div class="menu-item" id="menu-game-tictactoe">
|
|
287
|
+
<span class="menu-check"></span>
|
|
288
|
+
<span class="menu-text"><span class="menu-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="8" y1="2" x2="8" y2="22"/><line x1="16" y1="2" x2="16" y2="22"/><line x1="2" y1="8" x2="22" y2="8"/><line x1="2" y1="16" x2="22" y2="16"/></svg></span> ${t('menu.games.ticTacToe')}</span>
|
|
289
|
+
</div>
|
|
290
|
+
</div>
|
|
291
|
+
<div class="menu-sep"></div>
|
|
242
292
|
<div class="menu-item" id="menu-install-app" style="display:none">
|
|
243
293
|
<span class="menu-check"></span>
|
|
244
294
|
<span class="menu-text"><span class="menu-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" 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></span> Install as App</span>
|
|
@@ -301,39 +351,8 @@ export function getSharedHTML() {
|
|
|
301
351
|
</div>
|
|
302
352
|
</div>
|
|
303
353
|
|
|
304
|
-
${is3D ? `
|
|
305
|
-
<!--
|
|
306
|
-
<div class="menubar-item" data-menu="graph">
|
|
307
|
-
<button class="menubar-label">${t('nav.map')}</button>
|
|
308
|
-
<div class="menubar-dropdown glass">
|
|
309
|
-
<div class="menu-item" id="menu-map-frame-all">
|
|
310
|
-
<span class="menu-check"></span>
|
|
311
|
-
<span class="menu-text">${t('map.menu.frameAll')}</span>
|
|
312
|
-
<span class="menu-shortcut" data-keybind-for="map-frame-all"></span>
|
|
313
|
-
</div>
|
|
314
|
-
<div class="menu-sep"></div>
|
|
315
|
-
<div class="menu-item menu-toggle" id="menu-map-neighbors">
|
|
316
|
-
<span class="menu-check">✓</span>
|
|
317
|
-
<span class="menu-text">${t('map.menu.neighbors')}</span>
|
|
318
|
-
</div>
|
|
319
|
-
<div class="menu-item menu-toggle" id="menu-map-recency">
|
|
320
|
-
<span class="menu-check">✓</span>
|
|
321
|
-
<span class="menu-text">${t('map.menu.recency')}</span>
|
|
322
|
-
</div>
|
|
323
|
-
<div class="menu-item menu-toggle" id="menu-map-grid">
|
|
324
|
-
<span class="menu-check">✓</span>
|
|
325
|
-
<span class="menu-text">${t('map.menu.grid')}</span>
|
|
326
|
-
</div>
|
|
327
|
-
<div class="menu-sep"></div>
|
|
328
|
-
<div class="menu-item" id="menu-map-rebuild">
|
|
329
|
-
<span class="menu-check"></span>
|
|
330
|
-
<span class="menu-text">${t('map.menu.rebuild')}</span>
|
|
331
|
-
</div>
|
|
332
|
-
</div>
|
|
333
|
-
</div>
|
|
334
|
-
|
|
335
|
-
` : `
|
|
336
|
-
<!-- Graph menu -->
|
|
354
|
+
${is3D ? '' : `
|
|
355
|
+
<!-- Graph menu (2D; the 3D Map's controls are a section of Apps) -->
|
|
337
356
|
<div class="menubar-item" data-menu="graph">
|
|
338
357
|
<button class="menubar-label">${t('nav.graph')}</button>
|
|
339
358
|
<div class="menubar-dropdown glass">
|
|
@@ -423,23 +442,6 @@ ${is3D ? `
|
|
|
423
442
|
<span class="menu-shortcut">A</span>
|
|
424
443
|
</div>
|
|
425
444
|
<div class="menu-sep"></div>
|
|
426
|
-
<div class="menu-item" id="menu-automations-schedules">
|
|
427
|
-
<span class="menu-check"></span>
|
|
428
|
-
<span class="menu-text"><span class="menu-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/></svg></span> Schedules</span>
|
|
429
|
-
</div>
|
|
430
|
-
<div class="menu-item" id="menu-automations-schedule-new">
|
|
431
|
-
<span class="menu-check"></span>
|
|
432
|
-
<span class="menu-text">New Cron Schedule</span>
|
|
433
|
-
</div>
|
|
434
|
-
<div class="menu-item" id="menu-automations-quick-timer">
|
|
435
|
-
<span class="menu-check"></span>
|
|
436
|
-
<span class="menu-text">Quick Timer</span>
|
|
437
|
-
</div>
|
|
438
|
-
<div class="menu-item" id="menu-automations-schedule-groups">
|
|
439
|
-
<span class="menu-check"></span>
|
|
440
|
-
<span class="menu-text">Schedule Groups</span>
|
|
441
|
-
</div>
|
|
442
|
-
<div class="menu-sep"></div>
|
|
443
445
|
<div class="menu-item" id="menu-automations-new">
|
|
444
446
|
<span class="menu-check"></span>
|
|
445
447
|
<span class="menu-text">${t('menu.automations.newAutomation')}</span>
|
|
@@ -451,16 +453,8 @@ ${is3D ? `
|
|
|
451
453
|
</div>
|
|
452
454
|
</div>
|
|
453
455
|
|
|
454
|
-
<!--
|
|
455
|
-
<
|
|
456
|
-
<button class="menubar-label">${t('nav.games')}</button>
|
|
457
|
-
<div class="menubar-dropdown glass">
|
|
458
|
-
<div class="menu-item" id="menu-game-tictactoe">
|
|
459
|
-
<span class="menu-check"></span>
|
|
460
|
-
<span class="menu-text"><span class="menu-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="8" y1="2" x2="8" y2="22"/><line x1="16" y1="2" x2="16" y2="22"/><line x1="2" y1="8" x2="22" y2="8"/><line x1="2" y1="16" x2="22" y2="16"/></svg></span> ${t('menu.games.ticTacToe')}</span>
|
|
461
|
-
</div>
|
|
462
|
-
</div>
|
|
463
|
-
</div>
|
|
456
|
+
<!-- Schedules (opens and closes the Schedules window; no dropdown) -->
|
|
457
|
+
<button type="button" class="menubar-label menubar-action" id="menubar-schedules-btn" aria-expanded="false" aria-controls="schedules-studio-panel">${t('nav.schedules')}</button>
|
|
464
458
|
|
|
465
459
|
<!-- Settings (text button) -->
|
|
466
460
|
<button class="menubar-label menubar-action" id="menubar-settings-btn">${t('nav.settings')}</button>
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun Neural Interface — launch prefetch
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
// What windows, menus and dropdowns wait for when they open, read once the
|
|
5
|
+
// page has painted: in idle time, one step after another with a pause
|
|
6
|
+
// between two, so the page never stutters for it and the first open of each
|
|
7
|
+
// window paints from the data cache (data-cache.js). Each module registers
|
|
8
|
+
// its own steps (registerLaunchPrefetch); the page starts the queue after its
|
|
9
|
+
// first paint (startLaunchPrefetch). A step that fails is the window's to ask
|
|
10
|
+
// again when it opens. `owner` steps read what an invite guest may not.
|
|
11
|
+
|
|
12
|
+
import { whenIdle } from './data-cache.js';
|
|
13
|
+
|
|
14
|
+
const STEP_LIMIT_MS = 15_000; // a step that hangs does not hold the ones after it
|
|
15
|
+
const STEP_GAP_MS = 120;
|
|
16
|
+
|
|
17
|
+
const steps = [];
|
|
18
|
+
let started = false;
|
|
19
|
+
let running = false;
|
|
20
|
+
let guest = () => false;
|
|
21
|
+
|
|
22
|
+
/** Add a step: `run()` reads something into a cache. Lower `order` runs first. */
|
|
23
|
+
export function registerLaunchPrefetch(name, run, { order = 50, owner = false } = {}) {
|
|
24
|
+
if (typeof run !== 'function' || steps.some((step) => step.name === name)) return;
|
|
25
|
+
steps.push({ name, run, order, owner, done: false });
|
|
26
|
+
steps.sort((a, b) => a.order - b.order);
|
|
27
|
+
if (started) pump();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Start the queue (once): after the first paint, `delayMs` later and in idle time. */
|
|
31
|
+
export function startLaunchPrefetch({ delayMs = 600, isGuest = () => false } = {}) {
|
|
32
|
+
if (started) return;
|
|
33
|
+
started = true;
|
|
34
|
+
guest = typeof isGuest === 'function' ? isGuest : () => false;
|
|
35
|
+
setTimeout(pump, delayMs);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function pump() {
|
|
39
|
+
if (running) return;
|
|
40
|
+
const next = steps.find((step) => !step.done);
|
|
41
|
+
if (!next) return;
|
|
42
|
+
running = true;
|
|
43
|
+
whenIdle(async () => {
|
|
44
|
+
next.done = true;
|
|
45
|
+
let skip = false;
|
|
46
|
+
try { skip = next.owner && guest(); } catch { skip = false; }
|
|
47
|
+
if (!skip) {
|
|
48
|
+
let timer = null;
|
|
49
|
+
try {
|
|
50
|
+
await Promise.race([
|
|
51
|
+
Promise.resolve().then(next.run),
|
|
52
|
+
new Promise((done) => { timer = setTimeout(done, STEP_LIMIT_MS); }),
|
|
53
|
+
]);
|
|
54
|
+
} catch { /* the window asks again when it opens */ }
|
|
55
|
+
clearTimeout(timer);
|
|
56
|
+
}
|
|
57
|
+
setTimeout(() => { running = false; pump(); }, STEP_GAP_MS);
|
|
58
|
+
}, { timeout: 2000 });
|
|
59
|
+
}
|
|
@@ -39,14 +39,15 @@ export function createCapabilities() {
|
|
|
39
39
|
/**
|
|
40
40
|
* Send `payload` only when the server lists its type; otherwise resolve the
|
|
41
41
|
* reply a failed request would have produced, without touching the socket.
|
|
42
|
+
* `options` go to `send` as they are (ocp-v2-ws.js: `turnOf`).
|
|
42
43
|
*/
|
|
43
|
-
export function gatedRequest(caps, send, payload, timeoutMs) {
|
|
44
|
+
export function gatedRequest(caps, send, payload, timeoutMs, options) {
|
|
44
45
|
if (!caps.has(payload?.type)) {
|
|
45
46
|
return Promise.resolve({
|
|
46
47
|
type: `${payload?.type}:result`, ok: false, unsupported: true, status: 501, error: UNSUPPORTED_MESSAGE,
|
|
47
48
|
});
|
|
48
49
|
}
|
|
49
|
-
return send(payload, timeoutMs);
|
|
50
|
+
return options === undefined ? send(payload, timeoutMs) : send(payload, timeoutMs, options);
|
|
50
51
|
}
|
|
51
52
|
|
|
52
53
|
/** True when a reply is a failure: transport error, ok:false, or HTTP >= 400. */
|
|
@@ -117,7 +117,8 @@ export function createChildPanel({
|
|
|
117
117
|
|
|
118
118
|
// The chain of parents (replaces the session-menu dropdown — a sub-agent
|
|
119
119
|
// panel has only one session). The first crumb is the session in the main
|
|
120
|
-
// panel
|
|
120
|
+
// panel (the way back, on screen at every width); one after it is a
|
|
121
|
+
// sub-agent that has this one as its sub-agent.
|
|
121
122
|
_crumbsEl = document.createElement('div');
|
|
122
123
|
_crumbsEl.className = 'ocpv2-child-crumbs';
|
|
123
124
|
header.appendChild(_crumbsEl);
|
|
@@ -361,10 +362,14 @@ export function createChildPanel({
|
|
|
361
362
|
// (The first crumb keeps the class the single parent link had.)
|
|
362
363
|
crumb.className = index ? 'ocpv2-child-crumb' : 'ocpv2-child-crumb ocpv2-child-parent-link';
|
|
363
364
|
crumb.dataset.sessionId = String(parent.sessionId || '');
|
|
364
|
-
|
|
365
|
+
// Named by what it does: in a narrow header the way back is its arrow alone.
|
|
366
|
+
const name = index ? `Open sub-agent ${title}` : `Back to ${title}`;
|
|
367
|
+
crumb.setAttribute('data-tooltip', name);
|
|
368
|
+
crumb.setAttribute('aria-label', name);
|
|
365
369
|
if (!index) {
|
|
366
370
|
const arrow = document.createElement('span');
|
|
367
371
|
arrow.className = 'ocpv2-child-parent-arrow';
|
|
372
|
+
arrow.setAttribute('aria-hidden', 'true');
|
|
368
373
|
arrow.textContent = '↳';
|
|
369
374
|
crumb.appendChild(arrow);
|
|
370
375
|
}
|
|
@@ -419,9 +424,12 @@ export function createChildPanel({
|
|
|
419
424
|
_statusEl.removeAttribute('data-tooltip');
|
|
420
425
|
}
|
|
421
426
|
}
|
|
427
|
+
const title = sessionTitleFor(store);
|
|
422
428
|
if (_titleEl && !_titleEl.querySelector('.ocpv2-rename-input')) {
|
|
423
|
-
_titleEl.textContent =
|
|
429
|
+
_titleEl.textContent = title;
|
|
424
430
|
}
|
|
431
|
+
// The whole name, for when the header shows only part of it.
|
|
432
|
+
if (_titleEl?.parentElement) _titleEl.parentElement.title = title;
|
|
425
433
|
if (_renameBtn) _renameBtn.disabled = !s.sessionId;
|
|
426
434
|
renderCrumbs();
|
|
427
435
|
renderPill();
|