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
|
@@ -897,6 +897,7 @@ async function refreshSessions() {
|
|
|
897
897
|
const fetchedAt = Date.now();
|
|
898
898
|
loops = (loopRes.loops || []).map(l => ({ ...l, _fetchedAt: fetchedAt }));
|
|
899
899
|
staleLoopCount = loopRes.staleCount || 0;
|
|
900
|
+
_sessionsLoaded = true;
|
|
900
901
|
emitLoopsUpdate();
|
|
901
902
|
// Refresh notification feed alongside session/loop data
|
|
902
903
|
refreshRulesStatus().then(() => render()).catch(() => {});
|
|
@@ -1015,7 +1016,8 @@ async function loadProviderModels(provider) {
|
|
|
1015
1016
|
const r = await fetch('/api/claude/config').then(r => r.json());
|
|
1016
1017
|
models = (r?.models || []).map(m => ({ id: m.id, label: m.label || m.id }));
|
|
1017
1018
|
} else if (provider === 'opencode') {
|
|
1018
|
-
|
|
1019
|
+
// The connected providers (the compact view), not the whole models.dev catalog.
|
|
1020
|
+
const r = await fetch('/api/opencode/providers/full?view=compact').then(r => r.json()).catch(() => null);
|
|
1019
1021
|
const provs = r?.providers || r?.data || r || [];
|
|
1020
1022
|
const flat = [];
|
|
1021
1023
|
for (const p of (Array.isArray(provs) ? provs : Object.values(provs || {}))) {
|
|
@@ -1148,6 +1150,9 @@ function formatDuration(ms) {
|
|
|
1148
1150
|
|
|
1149
1151
|
// ── Panel open/close ──
|
|
1150
1152
|
|
|
1153
|
+
let _sessionsLoaded = false; // a read of the lists succeeded once: later opens paint from it first
|
|
1154
|
+
let _panelLife = null; // the open panel's document listeners end with it
|
|
1155
|
+
|
|
1151
1156
|
function openPanel() {
|
|
1152
1157
|
if (_panel) { _panel.focus(); return; }
|
|
1153
1158
|
|
|
@@ -1173,13 +1178,17 @@ function openPanel() {
|
|
|
1173
1178
|
wirePanel();
|
|
1174
1179
|
isVisible = true;
|
|
1175
1180
|
connectWs();
|
|
1181
|
+
// What the last read found paints at once; the read below brings it up to date.
|
|
1182
|
+
if (_sessionsLoaded) render();
|
|
1176
1183
|
refreshSessions();
|
|
1177
1184
|
|
|
1178
|
-
// ESC key to close
|
|
1185
|
+
// ESC key to close (removed with the panel, however it closes)
|
|
1186
|
+
_panelLife?.abort();
|
|
1187
|
+
_panelLife = new AbortController();
|
|
1179
1188
|
const onEsc = (e) => {
|
|
1180
|
-
if (e.key === 'Escape' && _panel)
|
|
1189
|
+
if (e.key === 'Escape' && _panel) closePanel();
|
|
1181
1190
|
};
|
|
1182
|
-
document.addEventListener('keydown', onEsc);
|
|
1191
|
+
document.addEventListener('keydown', onEsc, { signal: _panelLife.signal });
|
|
1183
1192
|
|
|
1184
1193
|
requestAnimationFrame(() => {
|
|
1185
1194
|
_backdrop.classList.add('open');
|
|
@@ -1189,6 +1198,8 @@ function openPanel() {
|
|
|
1189
1198
|
|
|
1190
1199
|
function closePanel() {
|
|
1191
1200
|
if (!_panel) return;
|
|
1201
|
+
_panelLife?.abort();
|
|
1202
|
+
_panelLife = null;
|
|
1192
1203
|
stopStalledTicker();
|
|
1193
1204
|
if (_backdrop) { _backdrop.remove(); _backdrop = null; }
|
|
1194
1205
|
_panel.remove();
|
|
@@ -3,6 +3,7 @@ import { buildJudgmentsTab, wireJudgmentsTab } from './ui-judgments.js';
|
|
|
3
3
|
import { buildWhatsAppTab, wireWhatsAppTab } from './ui-whatsapp.js';
|
|
4
4
|
import { buildCodeEditorTab, wireCodeEditorTab } from './settings/settings-code-editor-pane.js';
|
|
5
5
|
import { buildAboutTab, wireAboutTab } from './settings/settings-about-pane.js';
|
|
6
|
+
import { buildAppTab, wireAppTab } from './settings/settings-app-pane.js';
|
|
6
7
|
import { SETTINGS_GROUPS, SETTINGS_PAGES, DEFAULT_SETTINGS_PAGE, pageKeys, getSettingsPage, resolveSettingsTarget, homeOfControl } from './settings/settings-ia.js';
|
|
7
8
|
import * as kit from './settings/settings-kit.js';
|
|
8
9
|
import { RULES_HOST_LABELS, describeRulesHost, describeRulesInstall, describeRulesInstallAll } from './settings/settings-rules.js';
|
|
@@ -20,12 +21,14 @@ setGitBashTranslator((key, params) => kit.tx(`gitBash.${key}`, params));
|
|
|
20
21
|
import { initI18n, isReady as i18nReady, SUPPORTED_LOCALES, LOCALE_NAMES, SYSTEM_LOCALE, getLocale, getLocaleChoice, setLocaleChoice, getSystemLocale, englishTranslator, loadEnglishTranslator } from './i18n.js';
|
|
21
22
|
import { wireSettingsShell, wireSettingsSearch, collectSearchRows, revealSettingsTarget, followSettingsTarget, onSettingsTakeover, applyStoredSections, storeSectionState } from './settings/settings-shell.js';
|
|
22
23
|
import { buildSettingsSearchIndex } from './settings/settings-search.js';
|
|
24
|
+
import { prefetchSettingsData, readSettingsData, refreshSettingsData } from './settings/settings-data.js';
|
|
25
|
+
import { registerLaunchPrefetch } from './launch-prefetch.js';
|
|
23
26
|
// ═══════════════════════════════════════════
|
|
24
27
|
// UI-SETTINGS — Settings modal with shared tabs + variant tab injection
|
|
25
28
|
// ═══════════════════════════════════════════
|
|
26
29
|
//
|
|
27
30
|
// The most complex shared UI module. Builds a floating settings panel with
|
|
28
|
-
//
|
|
31
|
+
// fourteen task pages in six groups (./settings/settings-ia.js). A page is a
|
|
29
32
|
// title, a one-line purpose and section cards (./settings/settings-kit.js);
|
|
30
33
|
// each builder below owns one pane of a page. Variant-registered tabs (the 2D
|
|
31
34
|
// Graphics tab) join the Appearance page. Old tab ids still open the right page.
|
|
@@ -76,6 +79,8 @@ const TAB_ICONS = {
|
|
|
76
79
|
whatsapp: '<svg viewBox="0 0 24 24"><path d="M3.5 20.5l1.3-3.9A8.5 8.5 0 1 1 8 19.6z"/><path d="M9.5 8.5c.4 2.6 2.9 5.2 5.5 5.6l1-1.2 1.6.8c-.3 1-1.1 1.6-2.1 1.5-2.9-.3-5.8-3.2-6.1-6.1-.1-1 .5-1.8 1.5-2.1l.8 1.6z"/></svg>',
|
|
77
80
|
morelogin: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"><path d="M12 11.5a1 1 0 0 0-1 1c0 1.8-.3 3.6-1.2 5.2"/><path d="M7.8 14.5a8 8 0 0 0-.6 4.3"/><path d="M12 7.5a4.5 4.5 0 0 1 4.5 4.5c0 .6 0 1.2-.1 1.8"/><path d="M5 9.2a7 7 0 0 1 11-1.9"/><path d="M15 13a3 3 0 0 1-3 3"/></svg>',
|
|
78
81
|
editor: '<svg viewBox="0 0 24 24"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/><line x1="13.5" y1="5" x2="10.5" y2="19"/></svg>',
|
|
82
|
+
// Settings > App: the software's own controls (a window with its title bar)
|
|
83
|
+
app: '<svg viewBox="0 0 24 24"><rect x="3" y="4" width="18" height="16" rx="2"/><line x1="3" y1="9" x2="21" y2="9"/><line x1="6.5" y1="6.5" x2="6.51" y2="6.5"/><line x1="9.5" y1="6.5" x2="9.51" y2="6.5"/></svg>',
|
|
79
84
|
about: '<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="11"/><line x1="12" y1="7.5" x2="12.01" y2="7.5"/></svg>',
|
|
80
85
|
};
|
|
81
86
|
|
|
@@ -1665,17 +1670,17 @@ function buildSkillsTab(ccSkills) {
|
|
|
1665
1670
|
const anyOn = targets.some(t => installed[t.id]);
|
|
1666
1671
|
const chips = targets.map(t => `
|
|
1667
1672
|
<button type="button" class="cc-skill-target${installed[t.id] ? ' on' : ''}"
|
|
1668
|
-
data-cc-skill="${skill.dirName}"
|
|
1673
|
+
data-cc-skill="${kit.esc(skill.dirName)}"
|
|
1669
1674
|
data-cc-target="${t.id}"
|
|
1670
1675
|
data-state="${installed[t.id] ? 'on' : 'off'}"
|
|
1671
1676
|
${kit.inv('SKL001')} data-stg-pressed="on" aria-pressed="${installed[t.id] ? 'true' : 'false'}"
|
|
1672
1677
|
title="${kit.te('settings.redesign.skills.installFor', { skill: skill.name, assistant: t.label })}">${t.label}</button>
|
|
1673
1678
|
`).join('');
|
|
1674
1679
|
return `
|
|
1675
|
-
<div class="cc-skill-row${anyOn ? ' installed' : ''}" data-skill-name="${skill.dirName}">
|
|
1680
|
+
<div class="cc-skill-row${anyOn ? ' installed' : ''}" data-skill-name="${kit.esc(skill.dirName)}">
|
|
1676
1681
|
<div class="cc-skill-info">
|
|
1677
|
-
<span class="cc-skill-name">/${skill.name}</span>
|
|
1678
|
-
<span class="cc-skill-desc">${skill.description || ''}</span>
|
|
1682
|
+
<span class="cc-skill-name">/${kit.esc(skill.name)}</span>
|
|
1683
|
+
<span class="cc-skill-desc">${kit.esc(skill.description || '')}</span>
|
|
1679
1684
|
</div>
|
|
1680
1685
|
<div class="cc-skill-targets" role="group" aria-label="${kit.te('settings.redesign.skills.targets', { skill: skill.name })}">${chips}</div>
|
|
1681
1686
|
</div>`;
|
|
@@ -3168,10 +3173,45 @@ function landOnSearchEntry(overlay, entry, { focus = false, watch = true } = {})
|
|
|
3168
3173
|
}
|
|
3169
3174
|
|
|
3170
3175
|
// ═══════════════════════════════════════════
|
|
3176
|
+
// The search index of a locale (and of the variant tabs the page registered): what the strings are, not what
|
|
3177
|
+
// the panes hold, so it is made once (at launch idle, or by the first open) and every open reuses it.
|
|
3178
|
+
let _searchIndexMemo = null;
|
|
3179
|
+
function memoSearchIndex(en, variantTabs, build) {
|
|
3180
|
+
const key = JSON.stringify([getLocale(), typeof en === 'function', (variantTabs || []).map(tab => [tab.id, tab.label || ''])]);
|
|
3181
|
+
if (_searchIndexMemo?.key !== key) _searchIndexMemo = { key, index: build() };
|
|
3182
|
+
return _searchIndexMemo.index;
|
|
3183
|
+
}
|
|
3184
|
+
|
|
3185
|
+
/** Make the index now (launch idle), with the English names when the locale is another (loaded once, here). */
|
|
3186
|
+
function prebuildSettingsSearchIndex() {
|
|
3187
|
+
const variantTabs = getSettingsTabs();
|
|
3188
|
+
const make = (en) => memoSearchIndex(en, variantTabs, () => buildSettingsSearchIndex({ t: kit.tx, en, variants: variantTabs.map(tab => ({ id: tab.id, label: tab.label })) }));
|
|
3189
|
+
if (getLocale() === 'en') { make(null); return undefined; }
|
|
3190
|
+
const english = englishTranslator();
|
|
3191
|
+
if (english) { make(english); return undefined; }
|
|
3192
|
+
make(null);
|
|
3193
|
+
return loadEnglishTranslator().then((en) => { if (en) make(en); }).catch(() => {});
|
|
3194
|
+
}
|
|
3195
|
+
|
|
3171
3196
|
// MAIN ENTRY — openSettingsModal
|
|
3172
3197
|
// ═══════════════════════════════════════════
|
|
3173
3198
|
|
|
3174
|
-
|
|
3199
|
+
// An open that comes while another is still reading its data joins it: one panel, the later options applied.
|
|
3200
|
+
let _settingsOpening = null;
|
|
3201
|
+
export function openSettingsModal(options = {}) {
|
|
3202
|
+
if (_settingsOpening) {
|
|
3203
|
+
return _settingsOpening.then(() => {
|
|
3204
|
+
const panel = document.getElementById('settings-panel');
|
|
3205
|
+
if (panel) { panel.style.zIndex = '300001'; applySettingsOpenOptions(panel, options); }
|
|
3206
|
+
});
|
|
3207
|
+
}
|
|
3208
|
+
const opening = openSettingsModalNow(options);
|
|
3209
|
+
const guarded = opening.catch(() => {}).finally(() => { if (_settingsOpening === guarded) _settingsOpening = null; });
|
|
3210
|
+
_settingsOpening = guarded;
|
|
3211
|
+
return opening;
|
|
3212
|
+
}
|
|
3213
|
+
|
|
3214
|
+
async function openSettingsModalNow(options = {}) {
|
|
3175
3215
|
// If already open, just bring it to front
|
|
3176
3216
|
const existing = document.getElementById('settings-panel');
|
|
3177
3217
|
if (existing) {
|
|
@@ -3207,26 +3247,17 @@ export async function openSettingsModal(options = {}) {
|
|
|
3207
3247
|
let userContextReading = readUserContextResponse({ status: 0 });
|
|
3208
3248
|
|
|
3209
3249
|
try {
|
|
3210
|
-
|
|
3211
|
-
|
|
3212
|
-
|
|
3213
|
-
|
|
3214
|
-
|
|
3215
|
-
|
|
3216
|
-
|
|
3217
|
-
|
|
3218
|
-
|
|
3219
|
-
|
|
3220
|
-
|
|
3221
|
-
fetch('/api/claude-code/tool-permissions').then(r => r.json()),
|
|
3222
|
-
fetch('/api/claude-code/tool-categories').then(r => r.json()),
|
|
3223
|
-
fetch('/api/discord/config').then(r => r.json()),
|
|
3224
|
-
fetch('/api/skins').then(r => r.json()),
|
|
3225
|
-
fetch('/api/file-icons').then(r => r.json()),
|
|
3226
|
-
fetch('/api/youtube/config').then(r => r.json()),
|
|
3227
|
-
fetch('/api/typesafe/config').then(r => r.json()),
|
|
3228
|
-
loadUserContextReading(),
|
|
3229
|
-
]);
|
|
3250
|
+
// Read through the page's data cache (settings/settings-data.js): kept answers at once (each open its own
|
|
3251
|
+
// copy; read again in the background when old), so Settings waits only the first time.
|
|
3252
|
+
const reads = await readSettingsData();
|
|
3253
|
+
// The greeting and the user context are readings of what their endpoints answered (no answer is a reading too).
|
|
3254
|
+
const readingOf = (entry, make) => ({ status: 'fulfilled', value: entry?.status === 'fulfilled' ? make(entry.value) : make({ status: 0, error: entry?.reason?.message }) });
|
|
3255
|
+
const greetRes = readingOf(reads.greeting, readGreetingStatus);
|
|
3256
|
+
const userContextRes = readingOf(reads.userContext, readUserContextResponse);
|
|
3257
|
+
const settingsRes = reads.settings, connRes = reads.connections, ccRes = reads.integrations, skillsRes = reads.skills;
|
|
3258
|
+
const tunnelRes = reads.tunnel, keyRes = reads.mcpKey, bridgeRes = reads.openclaw, setupRes = reads.setup, cliRes = reads.cli;
|
|
3259
|
+
const toolPermsRes = reads.toolPermissions, toolCatsRes = reads.toolCategories, discordRes = reads.discord, skinsRes = reads.skins;
|
|
3260
|
+
const iconsRes = reads.icons, youtubeRes = reads.youtube, typesafeRes = reads.typesafe;
|
|
3230
3261
|
if (typesafeRes.status === 'fulfilled' && typesafeRes.value.ok) typesafeConfig = typesafeRes.value;
|
|
3231
3262
|
if (userContextRes.status === 'fulfilled') userContextReading = userContextRes.value;
|
|
3232
3263
|
if (settingsRes.status === 'fulfilled') settings = settingsRes.value;
|
|
@@ -3256,6 +3287,8 @@ export async function openSettingsModal(options = {}) {
|
|
|
3256
3287
|
|| getSettingsPage(storage.getItem(KEYS.SETTINGS_LAST_PAGE))?.id
|
|
3257
3288
|
|| DEFAULT_SETTINGS_PAGE;
|
|
3258
3289
|
const openerEl = document.activeElement;
|
|
3290
|
+
// Listeners on document and window that belong to this panel end with it (close aborts it).
|
|
3291
|
+
const panelLife = new AbortController();
|
|
3259
3292
|
|
|
3260
3293
|
// ── Panel ──
|
|
3261
3294
|
const overlay = document.createElement('div');
|
|
@@ -3320,6 +3353,7 @@ export async function openSettingsModal(options = {}) {
|
|
|
3320
3353
|
skins: buildSkinsTab(skinsData.skins, skinsData.active),
|
|
3321
3354
|
interface: buildInterfaceTab(),
|
|
3322
3355
|
icons: buildIconsTab(customIconsData),
|
|
3356
|
+
app: buildAppTab(),
|
|
3323
3357
|
about: buildAboutTab(),
|
|
3324
3358
|
}, variantTabs, initialPage)}
|
|
3325
3359
|
</div>
|
|
@@ -3361,10 +3395,14 @@ export async function openSettingsModal(options = {}) {
|
|
|
3361
3395
|
// ── Close helper ──
|
|
3362
3396
|
const close = () => {
|
|
3363
3397
|
document.removeEventListener('keydown', onSettingsEsc);
|
|
3398
|
+
const first = !panelLife.signal.aborted;
|
|
3399
|
+
panelLife.abort();
|
|
3364
3400
|
// Tabs that poll (Judgments) clear their timers on this event.
|
|
3365
3401
|
overlay.dispatchEvent(new CustomEvent('settings-close'));
|
|
3366
3402
|
backdrop.remove();
|
|
3367
3403
|
overlay.remove();
|
|
3404
|
+
// What was changed here is what the next open shows: its reads are asked for again now, in the background.
|
|
3405
|
+
if (first) refreshSettingsData();
|
|
3368
3406
|
// Give the keyboard back to whatever opened Settings.
|
|
3369
3407
|
if (openerEl && openerEl !== document.body && document.body.contains(openerEl)) { try { openerEl.focus({ preventScroll: true }); } catch {} }
|
|
3370
3408
|
};
|
|
@@ -3525,12 +3563,12 @@ export async function openSettingsModal(options = {}) {
|
|
|
3525
3563
|
+ '</div>';
|
|
3526
3564
|
html += '<div style="padding:4px 0">';
|
|
3527
3565
|
if (data.parent) {
|
|
3528
|
-
html += `<div class="cc-browse-item" data-path="${
|
|
3566
|
+
html += `<div class="cc-browse-item" data-path="${kit.esc(data.parent)}" style="padding:4px 10px;cursor:pointer;font-size:12px;display:flex;align-items:center;gap:6px;color:var(--t-muted)">`
|
|
3529
3567
|
+ '<svg viewBox="0 0 24 24" style="width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:2"><polyline points="15 18 9 12 15 6"/></svg>'
|
|
3530
3568
|
+ '' + kit.te('settings.redesign.server.parent') + '</div>';
|
|
3531
3569
|
}
|
|
3532
3570
|
for (const d of data.directories) {
|
|
3533
|
-
html += `<div class="cc-browse-item" data-path="${
|
|
3571
|
+
html += `<div class="cc-browse-item" data-path="${kit.esc(data.current + '/' + d)}" style="padding:4px 10px;cursor:pointer;font-size:12px;display:flex;align-items:center;gap:6px">`
|
|
3534
3572
|
+ '<svg viewBox="0 0 24 24" style="width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:2"><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>'
|
|
3535
3573
|
+ escapeHtml(d) + '</div>';
|
|
3536
3574
|
}
|
|
@@ -3914,7 +3952,7 @@ export async function openSettingsModal(options = {}) {
|
|
|
3914
3952
|
container.querySelectorAll('.stg-dropdown.open').forEach(dd => {
|
|
3915
3953
|
if (!dd.contains(e.target)) dd.classList.remove('open');
|
|
3916
3954
|
});
|
|
3917
|
-
});
|
|
3955
|
+
}, { signal: panelLife.signal });
|
|
3918
3956
|
}
|
|
3919
3957
|
|
|
3920
3958
|
function syncStgDropdown(container, hiddenId) {
|
|
@@ -4410,6 +4448,9 @@ export async function openSettingsModal(options = {}) {
|
|
|
4410
4448
|
// ── Code editor: AI autocomplete (loads and saves itself) ──
|
|
4411
4449
|
wireCodeEditorTab(overlay);
|
|
4412
4450
|
|
|
4451
|
+
// ── App: updates, start at login, the window, maintenance (loads itself when its page is shown) ──
|
|
4452
|
+
wireAppTab(overlay, { toast: showCCToast });
|
|
4453
|
+
|
|
4413
4454
|
// ── About: version, links, system and dependencies (loads itself the first time its page is shown) ──
|
|
4414
4455
|
wireAboutTab(overlay, { toast: showCCToast });
|
|
4415
4456
|
|
|
@@ -4788,7 +4829,7 @@ export async function openSettingsModal(options = {}) {
|
|
|
4788
4829
|
|
|
4789
4830
|
// Re-poll when tab regains visibility (covers Permissions API gaps on Safari).
|
|
4790
4831
|
const visHandler = () => { if (!document.hidden) refreshNotifPermRow(); };
|
|
4791
|
-
document.addEventListener('visibilitychange', visHandler);
|
|
4832
|
+
document.addEventListener('visibilitychange', visHandler, { signal: panelLife.signal });
|
|
4792
4833
|
|
|
4793
4834
|
// Request permission
|
|
4794
4835
|
if (requestPermBtn) {
|
|
@@ -5591,7 +5632,7 @@ export async function openSettingsModal(options = {}) {
|
|
|
5591
5632
|
overlay.querySelectorAll('.bc-dropdown.open').forEach(dd => {
|
|
5592
5633
|
if (!dd.contains(e.target)) dd.classList.remove('open');
|
|
5593
5634
|
});
|
|
5594
|
-
});
|
|
5635
|
+
}, { signal: panelLife.signal });
|
|
5595
5636
|
|
|
5596
5637
|
// Sync dropdown display from hidden input value (for applyBrowserConfig)
|
|
5597
5638
|
function syncBcDropdowns() {
|
|
@@ -6091,12 +6132,12 @@ export async function openSettingsModal(options = {}) {
|
|
|
6091
6132
|
+ '</div>';
|
|
6092
6133
|
html += '<div style="padding:4px 0">';
|
|
6093
6134
|
if (data.parent) {
|
|
6094
|
-
html += `<div class="cc-browse-item" data-path="${
|
|
6135
|
+
html += `<div class="cc-browse-item" data-path="${kit.esc(data.parent)}" style="padding:4px 10px;cursor:pointer;font-size:12px;display:flex;align-items:center;gap:6px;color:var(--t-muted)">`
|
|
6095
6136
|
+ '<svg viewBox="0 0 24 24" style="width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:2"><polyline points="15 18 9 12 15 6"/></svg>'
|
|
6096
6137
|
+ '' + kit.te('settings.redesign.browser.parent') + '</div>';
|
|
6097
6138
|
}
|
|
6098
6139
|
for (const d of data.directories) {
|
|
6099
|
-
html += `<div class="cc-browse-item" data-path="${
|
|
6140
|
+
html += `<div class="cc-browse-item" data-path="${kit.esc(data.current + '/' + d)}" style="padding:4px 10px;cursor:pointer;font-size:12px;display:flex;align-items:center;gap:6px">`
|
|
6100
6141
|
+ '<svg viewBox="0 0 24 24" style="width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:2"><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>'
|
|
6101
6142
|
+ escapeHtml(d) + '</div>';
|
|
6102
6143
|
}
|
|
@@ -7274,7 +7315,7 @@ export async function openSettingsModal(options = {}) {
|
|
|
7274
7315
|
const ocpToolsEl = overlay.querySelector('#stg-ocp-tools');
|
|
7275
7316
|
const ocpHistoryMetaEl = overlay.querySelector('#stg-ocp-history-meta');
|
|
7276
7317
|
const ocpHistoryClearBtn = overlay.querySelector('#stg-ocp-clear-history');
|
|
7277
|
-
const esc = s => String(s || '').replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
7318
|
+
const esc = s => String(s || '').replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
7278
7319
|
|
|
7279
7320
|
// ── Helpers ──
|
|
7280
7321
|
let _ocpConnected = new Set();
|
|
@@ -8181,7 +8222,8 @@ export async function openSettingsModal(options = {}) {
|
|
|
8181
8222
|
attempts++;
|
|
8182
8223
|
if (attempts > 60) { clearInterval(poll); if (waitEl) waitEl.style.display = 'none'; return; }
|
|
8183
8224
|
try {
|
|
8184
|
-
|
|
8225
|
+
// Only `connected` is read: the compact view (connected providers), not the whole catalog every 2 s.
|
|
8226
|
+
const pr = await fetch('/api/opencode/providers/full?view=compact');
|
|
8185
8227
|
const pd = await pr.json();
|
|
8186
8228
|
const connected = pd.data?.connected || [];
|
|
8187
8229
|
if (connected.includes(provId)) {
|
|
@@ -9382,7 +9424,7 @@ export async function openSettingsModal(options = {}) {
|
|
|
9382
9424
|
// ── Search: the index is built from the strings of the active locale; what the panes load is read at query time ──
|
|
9383
9425
|
// In another locale the English names are searched too (someone who learned the settings in English still finds
|
|
9384
9426
|
// them): from the bundle i18n already holds as its fallback, or, when it has none, loaded once as the field is first used.
|
|
9385
|
-
const searchIndex = (en) => buildSettingsSearchIndex({ t: kit.tx, en, variants: variantTabs.map(tab => ({ id: tab.id, label: tab.label })) });
|
|
9427
|
+
const searchIndex = (en) => memoSearchIndex(en, variantTabs, () => buildSettingsSearchIndex({ t: kit.tx, en, variants: variantTabs.map(tab => ({ id: tab.id, label: tab.label })) }));
|
|
9386
9428
|
const english = getLocale() === 'en' ? null : englishTranslator();
|
|
9387
9429
|
wireSettingsSearch(overlay, {
|
|
9388
9430
|
index: searchIndex(english),
|
|
@@ -9580,6 +9622,15 @@ export function initSettings() {
|
|
|
9580
9622
|
const reopenPage = takeSettingsReopen();
|
|
9581
9623
|
if (reopenPage) setTimeout(() => openSettingsModal({ tab: reopenPage, expand: ['stg-sec-language'] }), 0);
|
|
9582
9624
|
|
|
9625
|
+
// Launch: what Settings is built from, and its search index (the English names too), read and made once the
|
|
9626
|
+
// page has painted, so the first open and the first search wait for nothing.
|
|
9627
|
+
registerLaunchPrefetch('settings-data', () => prefetchSettingsData(), { order: 60, owner: true });
|
|
9628
|
+
registerLaunchPrefetch('settings-search-index', () => prebuildSettingsSearchIndex(), { order: 62 });
|
|
9629
|
+
// Changes other windows announce: the next open shows them.
|
|
9630
|
+
on('sync:skin:changed', () => refreshSettingsData(['skins']));
|
|
9631
|
+
on('sync:greeting:changed', () => refreshSettingsData(['greeting']));
|
|
9632
|
+
on('sync:assistant:user-context-changed', () => refreshSettingsData(['userContext']));
|
|
9633
|
+
|
|
9583
9634
|
// Expose sync functions for inline onclick attributes (if any remain)
|
|
9584
9635
|
window.checkSyncStatus = checkSyncStatus;
|
|
9585
9636
|
window.copySyncPrompt = copySyncPrompt;
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
import { state, emit, on } from './state.js';
|
|
19
19
|
import { KEYS, COLOR_PALETTE } from './constants.js';
|
|
20
20
|
import { storage } from './storage.js';
|
|
21
|
-
import { normalizeNodes } from './utils.js';
|
|
21
|
+
import { normalizeNodes, escapeHtml } from './utils.js';
|
|
22
22
|
import { catColor, upgradeSelect } from './colors.js';
|
|
23
23
|
import { isGuest, hasPermission, showGuestToast } from './ui-sync.js';
|
|
24
24
|
import {
|
|
@@ -212,7 +212,7 @@ function openDescEditor(cat, chipEl) {
|
|
|
212
212
|
const currentDesc = state.categoryDescriptions[cat] || '';
|
|
213
213
|
editor.innerHTML = `
|
|
214
214
|
<label>Description for "${cat}"</label>
|
|
215
|
-
<textarea class="desc-textarea">${currentDesc}</textarea>
|
|
215
|
+
<textarea class="desc-textarea">${escapeHtml(currentDesc)}</textarea>
|
|
216
216
|
<div class="category-desc-actions">
|
|
217
217
|
<button class="action-btn action-btn--ghost desc-cancel-btn">Cancel</button>
|
|
218
218
|
<button class="action-btn action-btn--primary desc-save-btn">Save</button>
|
|
@@ -277,7 +277,7 @@ export function openCategoryChangeModal(node) {
|
|
|
277
277
|
<div class="cat-modal-option${isActive ? ' active' : ''}" data-cat="${cat}">
|
|
278
278
|
<div class="cat-opt-dot" style="color:${catColor(cat)}; background:${catColor(cat)}"></div>
|
|
279
279
|
<span class="cat-opt-name">${cat}</span>
|
|
280
|
-
${desc ? `<span class="cat-opt-desc">${desc}</span>` : ''}
|
|
280
|
+
${desc ? `<span class="cat-opt-desc">${escapeHtml(desc)}</span>` : ''}
|
|
281
281
|
</div>`;
|
|
282
282
|
});
|
|
283
283
|
|
|
@@ -476,7 +476,7 @@ async function editCategoryUI(name) {
|
|
|
476
476
|
|
|
477
477
|
<div class="ecm-field">
|
|
478
478
|
<label>Description</label>
|
|
479
|
-
<textarea class="edit-cat-desc ecm-input ecm-textarea" rows="4" placeholder="What this category is for...">${currentDesc}</textarea>
|
|
479
|
+
<textarea class="edit-cat-desc ecm-input ecm-textarea" rows="4" placeholder="What this category is for...">${escapeHtml(currentDesc)}</textarea>
|
|
480
480
|
</div>
|
|
481
481
|
|
|
482
482
|
<div class="ecm-divider"></div>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { hostedSidepanelId, sidepanelHost } from './ui-sidepanel-runtime.js';
|
|
2
2
|
import { emit } from './state.js';
|
|
3
|
+
import { sessionWindowStatus } from './sidepanel-session-status.js';
|
|
3
4
|
|
|
4
5
|
const host = sidepanelHost();
|
|
5
6
|
const provider = new URLSearchParams(location.search).get('provider');
|
|
@@ -32,6 +33,18 @@ if (hostedSidepanelId && host) {
|
|
|
32
33
|
const syncTitle = () => host.title(hostedSidepanelId, title?.textContent?.trim());
|
|
33
34
|
if (title) new MutationObserver(syncTitle).observe(title, { childList: true, subtree: true, characterData: true });
|
|
34
35
|
syncTitle();
|
|
36
|
+
// What its sessions do, for this window's pill in the main window: read from this document's own tray
|
|
37
|
+
// pills, which the panel paints from its sessions' state, and sent when it changes.
|
|
38
|
+
const tray = document.getElementById('term-minimized-tray');
|
|
39
|
+
let sentStatus = '';
|
|
40
|
+
const syncStatus = () => {
|
|
41
|
+
const status = sessionWindowStatus([...(tray?.querySelectorAll('.term-minimized-pill') || [])].map((pill) => [...pill.classList]));
|
|
42
|
+
if (status === sentStatus) return;
|
|
43
|
+
sentStatus = status;
|
|
44
|
+
host.status?.(hostedSidepanelId, status);
|
|
45
|
+
};
|
|
46
|
+
if (tray) new MutationObserver(syncStatus).observe(tray, { childList: true, subtree: true, attributes: true, attributeFilter: ['class'] });
|
|
47
|
+
syncStatus();
|
|
35
48
|
host.ready(hostedSidepanelId, { focus, defaults, end, receive(kind, data) {
|
|
36
49
|
if (kind === 'path') return receivePath(data);
|
|
37
50
|
emit(kind === 'image' ? 'wb:send-to-panel' : kind, data);
|
|
@@ -2,9 +2,15 @@ import { storage } from './storage.js';
|
|
|
2
2
|
import { state, emit } from './state.js';
|
|
3
3
|
import { hostedSidepanelId } from './ui-sidepanel-runtime.js';
|
|
4
4
|
import { registerSidepanel, setSidepanelVisible, focusSidepanel, detachSidepanel, getSidepanelPresentation, sendToFocusedSession } from './ui-sidepanel-windows.js';
|
|
5
|
+
import { getProviderMeta } from './provider-icons.js';
|
|
6
|
+
import { normalizeSessionWindowStatus } from './sidepanel-session-status.js';
|
|
7
|
+
import { savedTabsStatus } from './ui-sidepanel-tray.js';
|
|
5
8
|
|
|
6
9
|
let manifestKey;
|
|
7
10
|
const PROVIDERS = { claude: 'Claude', codex: 'Codex', opencode: 'OpenCode' };
|
|
11
|
+
// provider-icons.js ids: the window's pill wears its provider's icon and colour.
|
|
12
|
+
const PROVIDER_IDS = { claude: 'claude-code', codex: 'codex', opencode: 'opencode' };
|
|
13
|
+
const STATUS_WORDS = { working: 'working', action: 'needs you' };
|
|
8
14
|
const entries = new Map();
|
|
9
15
|
const editorOwners = new Map();
|
|
10
16
|
let initialized = false;
|
|
@@ -38,6 +44,11 @@ function pillFor(entry) {
|
|
|
38
44
|
const pill = document.createElement('div');
|
|
39
45
|
pill.className = 'term-minimized-pill sp-session-pill';
|
|
40
46
|
pill.dataset.sessionWindow = entry.id;
|
|
47
|
+
const meta = getProviderMeta(PROVIDER_IDS[entry.provider]);
|
|
48
|
+
pill.style.setProperty('--sp-pill-color', meta.color);
|
|
49
|
+
const icon = document.createElement('span');
|
|
50
|
+
icon.className = 'term-minimized-pill-icon';
|
|
51
|
+
icon.innerHTML = meta.icon; // provider-icons.js's own SVG
|
|
41
52
|
const label = document.createElement('span');
|
|
42
53
|
label.className = 'term-minimized-pill-label';
|
|
43
54
|
const close = document.createElement('button');
|
|
@@ -45,7 +56,7 @@ function pillFor(entry) {
|
|
|
45
56
|
close.textContent = '×';
|
|
46
57
|
close.title = 'End detached session';
|
|
47
58
|
close.addEventListener('click', event => { event.stopPropagation(); end(entry).catch(showError.bind(null, entry)); });
|
|
48
|
-
pill.append(label, close);
|
|
59
|
+
pill.append(icon, label, close);
|
|
49
60
|
pill.addEventListener('click', () => show(entry));
|
|
50
61
|
tray.append(pill);
|
|
51
62
|
entry.pill = pill;
|
|
@@ -55,16 +66,25 @@ function pillFor(entry) {
|
|
|
55
66
|
function renderPill(entry) {
|
|
56
67
|
const pill = pillFor(entry);
|
|
57
68
|
if (!pill) return;
|
|
58
|
-
|
|
69
|
+
const name = entry.title || `${PROVIDERS[entry.provider]} session`;
|
|
70
|
+
pill.querySelector('.term-minimized-pill-label').textContent = name;
|
|
59
71
|
// Visible session pills also act as a window switcher when windows overlap.
|
|
60
72
|
pill.classList.toggle('active', !!getSidepanelPresentation(entry.id)?.visible);
|
|
73
|
+
// What its sessions do, as the window's own tray pills say it (ui-sidepanel-session-entry.js): working
|
|
74
|
+
// like a tray pill, or needing you (a session in it waits on an answer).
|
|
75
|
+
const status = normalizeSessionWindowStatus(entry.status);
|
|
76
|
+
pill.classList.toggle('sp-pill-running', status === 'working');
|
|
77
|
+
pill.classList.toggle('sp-pill-attention', status === 'action');
|
|
78
|
+
pill.dataset.status = status;
|
|
79
|
+
pill.title = STATUS_WORDS[status] ? `${name} · ${STATUS_WORDS[status]}` : name;
|
|
61
80
|
}
|
|
62
81
|
|
|
63
82
|
function showError(entry, error) {
|
|
64
83
|
if (entry.loading) entry.loading.textContent = `Could not open session: ${error?.message || error}`;
|
|
65
84
|
}
|
|
66
85
|
|
|
67
|
-
|
|
86
|
+
/** The window and its session's frame, made once. Whether it shows is setSidepanelVisible's: show(). */
|
|
87
|
+
function mount(entry) {
|
|
68
88
|
if (!entry.element) {
|
|
69
89
|
const element = document.createElement('section');
|
|
70
90
|
element.className = 'sp-session-window';
|
|
@@ -103,6 +123,10 @@ function show(entry) {
|
|
|
103
123
|
const lang = new URLSearchParams(window.location.search).get('lang');
|
|
104
124
|
frame.src = `/sidepanel-session.html?provider=${entry.provider}${lang ? `&lang=${encodeURIComponent(lang)}` : ''}`;
|
|
105
125
|
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function show(entry) {
|
|
129
|
+
mount(entry);
|
|
106
130
|
setSidepanelVisible(entry.id, true);
|
|
107
131
|
}
|
|
108
132
|
|
|
@@ -167,6 +191,15 @@ export function initDetachedAgentSessions() {
|
|
|
167
191
|
.sp-session-button:hover { color:white; background:#ffffff18; }
|
|
168
192
|
.sp-session-window iframe { border:0; width:100%; flex:1; min-height:0; border-radius:0 0 15px 15px; }
|
|
169
193
|
.sp-session-loading { padding:12px; font:12px sans-serif; color:#cbd5e1; }
|
|
194
|
+
.sp-session-pill .term-minimized-pill-icon { color: color-mix(in srgb, var(--sp-pill-color, #fff) 45%, transparent); transition: color .2s; }
|
|
195
|
+
.sp-session-pill.sp-pill-running { border-color: color-mix(in srgb, var(--sp-pill-color, #fff) 42%, transparent); }
|
|
196
|
+
.sp-session-pill.sp-pill-running .term-minimized-pill-icon { color: var(--sp-pill-color, #fff); }
|
|
197
|
+
.sp-session-pill.sp-pill-running .term-minimized-pill-label::before { content: ''; display: inline-block; width: 6px;
|
|
198
|
+
height: 6px; margin-right: 6px; border-radius: 50%; background: var(--sp-pill-color, #fff); vertical-align: middle;
|
|
199
|
+
animation: sp-pill-pulse 1.2s ease-in-out infinite; }
|
|
200
|
+
.sp-session-pill.sp-pill-attention { border-color: color-mix(in srgb, var(--accent-orange, #FFB74D) 42%, transparent); }
|
|
201
|
+
.sp-session-pill.sp-pill-attention .term-minimized-pill-icon { color: var(--accent-orange, #FFB74D); }
|
|
202
|
+
@keyframes sp-pill-pulse { 0%, 100% { opacity: .4; } 50% { opacity: 1; } }
|
|
170
203
|
.sp-session-pill.active { border-color:#3b82f680; }
|
|
171
204
|
`;
|
|
172
205
|
document.head.append(style);
|
|
@@ -189,6 +222,15 @@ export function initDetachedAgentSessions() {
|
|
|
189
222
|
entry.title = next; if (entry.label) entry.label.textContent = next; renderPill(entry); save();
|
|
190
223
|
},
|
|
191
224
|
fail: (id, error) => { const entry = entries.get(id); if (entry) showError(entry, error); },
|
|
225
|
+
// What the window's sessions do, sent by the window when it changes (sidepanel-session-status.js).
|
|
226
|
+
status(id, status) {
|
|
227
|
+
const entry = entries.get(id);
|
|
228
|
+
if (!entry) return;
|
|
229
|
+
const next = normalizeSessionWindowStatus(status);
|
|
230
|
+
if (entry.status === next) return;
|
|
231
|
+
entry.status = next;
|
|
232
|
+
renderPill(entry);
|
|
233
|
+
},
|
|
192
234
|
send(id, kind, data) {
|
|
193
235
|
const entry = entries.get(id);
|
|
194
236
|
if (!entry) return;
|
|
@@ -217,7 +259,16 @@ export function initDetachedAgentSessions() {
|
|
|
217
259
|
try {
|
|
218
260
|
for (const record of JSON.parse(storage.getItem(manifestKey) || '[]')) {
|
|
219
261
|
if (!/^session-[a-f0-9-]+$/.test(record.id) || !PROVIDERS[record.provider]) continue;
|
|
220
|
-
entries.set(record.id, record);
|
|
262
|
+
entries.set(record.id, record);
|
|
263
|
+
// A window whose session was working, or waiting on the user, when the page went away (its saved tabs say
|
|
264
|
+
// so, read as the tray's placeholders read them) says it at once, and its panel loads, hidden, to say what
|
|
265
|
+
// the session does now.
|
|
266
|
+
const saved = savedTabsStatus(record.provider, record.id);
|
|
267
|
+
if (saved !== 'idle') {
|
|
268
|
+
record.status = saved;
|
|
269
|
+
try { mount(record); } catch (error) { console.warn('[sidepanel-sessions] could not load a working window', error); }
|
|
270
|
+
}
|
|
271
|
+
renderPill(record);
|
|
221
272
|
}
|
|
222
273
|
} catch { /* Missing or invalid saved manifest starts with no extra windows. */ }
|
|
223
274
|
}
|