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
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
// SynaBun sidepanel tray placeholders.
|
|
2
2
|
// Renders minimized pills for persisted sidepanel tabs before a panel is booted.
|
|
3
|
+
// A tab saved while it was working may still be working (its turn outlives the
|
|
4
|
+
// page on the server): its provider's panel boots then, hidden, and asks, and
|
|
5
|
+
// its own pills (its styles, the sessions' real state) take the placeholders'
|
|
6
|
+
// places. Panels whose saved tabs were all idle stay lazy.
|
|
3
7
|
|
|
4
8
|
import { storage } from './storage.js';
|
|
5
9
|
import { emit } from './state.js';
|
|
6
10
|
import { getProviderMeta } from './provider-icons.js';
|
|
7
|
-
import { toggleClaudePanel, isClaudePanelOpen } from './ui-claude-panel.js';
|
|
8
|
-
import { toggleCodexPanel, isCodexPanelOpen } from './ui-codex-panel.js';
|
|
9
|
-
import { toggleOpencodePanel, isOpencodePanelOpen } from './ui-opencode-panel-v2.js';
|
|
11
|
+
import { toggleClaudePanel, isClaudePanelOpen, bootClaudePanel } from './ui-claude-panel.js';
|
|
12
|
+
import { toggleCodexPanel, isCodexPanelOpen, bootCodexPanel } from './ui-codex-panel.js';
|
|
13
|
+
import { toggleOpencodePanel, isOpencodePanelOpen, bootOpencodePanel } from './ui-opencode-panel-v2.js';
|
|
10
14
|
import { nativeLoopWindowId } from './ui-native-window-id.js';
|
|
11
15
|
|
|
12
16
|
const PLACEHOLDER_CLASS = 'sidepanel-tray-placeholder';
|
|
@@ -17,6 +21,8 @@ const PROVIDERS = {
|
|
|
17
21
|
windowKey: 'cp-window-id',
|
|
18
22
|
tabsKeyPrefix: 'synabun-claude-panel-tabs',
|
|
19
23
|
pillClass: 'cp-session-pill',
|
|
24
|
+
// A tab saved while a permission or a question waited on the user (tabNeedsYou in ui-claude-panel.js).
|
|
25
|
+
attentionClass: 'cp-pill-attention',
|
|
20
26
|
eventName: 'claude-panel:show',
|
|
21
27
|
},
|
|
22
28
|
codex: {
|
|
@@ -24,6 +30,8 @@ const PROVIDERS = {
|
|
|
24
30
|
windowKey: 'cxp-window-id',
|
|
25
31
|
tabsKeyPrefix: 'synabun-codex-panel-tabs',
|
|
26
32
|
pillClass: 'cxp-session-pill',
|
|
33
|
+
// A tab saved while an approval or a question card waited on the user (paintTrayPill in cdx-tabs.js).
|
|
34
|
+
attentionClass: 'cxp-pill-attention',
|
|
27
35
|
eventName: 'codex-panel:show',
|
|
28
36
|
},
|
|
29
37
|
opencode: {
|
|
@@ -35,13 +43,30 @@ const PROVIDERS = {
|
|
|
35
43
|
automationKeyPrefix: 'opencode-v2-automations',
|
|
36
44
|
v2Plain: true,
|
|
37
45
|
windowScopedPlain: true,
|
|
46
|
+
// The sessions that were working when the panel last saw them (ocp-v2-panel.js STOR_BUSY).
|
|
47
|
+
busyKeyPrefix: 'opencode-v2-busy',
|
|
38
48
|
legacyV1Prefix: 'synabun-ocp-tabs',
|
|
39
49
|
legacyV1CleanupFlag: 'opencode-v1-cleanup-done',
|
|
40
|
-
|
|
50
|
+
// The v2 panel's own pill (the v1 panel and its ocp-session-pill styles are gone), so a
|
|
51
|
+
// working placeholder wears ocpv2-pill-running like the real one.
|
|
52
|
+
pillClass: 'ocpv2-session-pill',
|
|
41
53
|
eventName: 'opencode-panel:show',
|
|
42
54
|
},
|
|
43
55
|
};
|
|
44
56
|
|
|
57
|
+
// How each panel boots without showing itself, and whether it should: OpenCode only
|
|
58
|
+
// while its server runs (a SynaBun restart stopped every turn, and booting would
|
|
59
|
+
// start the server again just to hear that).
|
|
60
|
+
const BOOT_HIDDEN = {
|
|
61
|
+
claude: { boot: () => bootClaudePanel() },
|
|
62
|
+
codex: { boot: () => bootCodexPanel() },
|
|
63
|
+
opencode: {
|
|
64
|
+
boot: () => bootOpencodePanel(),
|
|
65
|
+
ready: async () => (await (await fetch('/api/opencode-v2/status')).json())?.running === true,
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
const _bootedHidden = new Set();
|
|
69
|
+
|
|
45
70
|
const _loadedProviders = new Set();
|
|
46
71
|
let _initialized = false;
|
|
47
72
|
|
|
@@ -147,8 +172,16 @@ function tabId(provider, tab, index) {
|
|
|
147
172
|
return `${provider}-${index}`;
|
|
148
173
|
}
|
|
149
174
|
|
|
175
|
+
// Working when it was saved: a turn (or, in Codex, a thread being made), or, in Claude, background agents
|
|
176
|
+
// and shells its turn left running (`backgroundWork`, their count: the real pill's tabWorking).
|
|
150
177
|
function isRunning(tab) {
|
|
151
|
-
return !!(tab.running || tab.startingThread);
|
|
178
|
+
return !!(tab.running || tab.startingThread || Number(tab.backgroundWork) > 0);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Waiting on the user when it was saved (Claude, Codex: `needsYou`): its placeholder says so before it says
|
|
182
|
+
// working, and the panel boots to ask, as for a working tab (the reattach brings the card back).
|
|
183
|
+
function needsYou(tab) {
|
|
184
|
+
return tab.needsYou === true;
|
|
152
185
|
}
|
|
153
186
|
|
|
154
187
|
function isForeignActiveAutomation(tab) {
|
|
@@ -168,6 +201,10 @@ function readPayload(key, meta = null) {
|
|
|
168
201
|
const automationBySession = new Map((Array.isArray(automationRows) ? automationRows : [])
|
|
169
202
|
.filter((row) => row?.sessionId && row?.runId)
|
|
170
203
|
.map((row) => [row.sessionId, row]));
|
|
204
|
+
const busyRows = windowId && meta.busyKeyPrefix
|
|
205
|
+
? parseJson(storage.getItem(`${meta.busyKeyPrefix}-${windowId}`), [])
|
|
206
|
+
: [];
|
|
207
|
+
const busy = new Set(Array.isArray(busyRows) ? busyRows : []);
|
|
171
208
|
const tabs = arr
|
|
172
209
|
.filter((s) => typeof s === 'string' && s)
|
|
173
210
|
.map((sid) => {
|
|
@@ -177,7 +214,8 @@ function readPayload(key, meta = null) {
|
|
|
177
214
|
automationRunId: automation?.runId || null,
|
|
178
215
|
automationActive: !!automation?.running,
|
|
179
216
|
automationOwnerId: automation?.ownerId || null,
|
|
180
|
-
|
|
217
|
+
// An automation's pill follows its turn: a warm worker saved between turns ('idle') rests.
|
|
218
|
+
running: (!!automation?.running && automation.turn !== 'idle') || busy.has(sid),
|
|
181
219
|
};
|
|
182
220
|
});
|
|
183
221
|
if (!tabs.length) return null;
|
|
@@ -492,7 +530,9 @@ function createPlaceholder(provider, payload, tab, index) {
|
|
|
492
530
|
<span class="term-minimized-pill-label">${esc(tabLabel(provider, tab))}</span>
|
|
493
531
|
<button class="term-minimized-pill-close" data-tooltip="Close" data-tooltip-pos="top">×</button>
|
|
494
532
|
`;
|
|
495
|
-
|
|
533
|
+
const waiting = !!meta.attentionClass && needsYou(tab);
|
|
534
|
+
if (meta.attentionClass) pill.classList.toggle(meta.attentionClass, waiting);
|
|
535
|
+
pill.classList.toggle(`${meta.pillClass.replace('-session-pill', '')}-pill-running`, !waiting && isRunning(tab));
|
|
496
536
|
pill.dataset.sourceKey = payload.key || '';
|
|
497
537
|
pill.addEventListener('click', () => openProvider(provider, id, payload.key));
|
|
498
538
|
pill.querySelector('.term-minimized-pill-close')?.addEventListener('click', (event) => {
|
|
@@ -517,6 +557,40 @@ function createPlaceholder(provider, payload, tab, index) {
|
|
|
517
557
|
return pill;
|
|
518
558
|
}
|
|
519
559
|
|
|
560
|
+
/**
|
|
561
|
+
* Whether a provider's panel should boot, hidden, to ask after its tabs: one of this window's own
|
|
562
|
+
* saved tabs (the ones its restore brings back; never another window's, which a click migrates)
|
|
563
|
+
* was working when it was saved. Pure: `pills` is meaningfulPills(), `currentKey` this window's key.
|
|
564
|
+
*/
|
|
565
|
+
export function placeholdersNeedBoot(pills, currentKey) {
|
|
566
|
+
return (Array.isArray(pills) ? pills : [])
|
|
567
|
+
.some(({ payload, tab }) => payload?.key === currentKey && (isRunning(tab) || needsYou(tab)));
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
/**
|
|
571
|
+
* What the tabs a window of `provider` saved were doing then, read as the placeholders read them:
|
|
572
|
+
* 'action' when one waited on the user (needsYou), 'working' when one worked, else 'idle'. A detached
|
|
573
|
+
* session window's pill says it before the window loads (ui-sidepanel-sessions.js).
|
|
574
|
+
*/
|
|
575
|
+
export function savedTabsStatus(provider, windowId) {
|
|
576
|
+
const meta = PROVIDERS[provider];
|
|
577
|
+
if (!meta || !windowId) return 'idle';
|
|
578
|
+
const tabs = readPayload(`${meta.tabsKeyPrefix}-${windowId}`, meta)?.tabs || [];
|
|
579
|
+
if (tabs.some((tab) => needsYou(tab))) return 'action';
|
|
580
|
+
return tabs.some((tab) => isRunning(tab)) ? 'working' : 'idle';
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
function bootHiddenIfWorking(provider, pills) {
|
|
584
|
+
const meta = PROVIDERS[provider];
|
|
585
|
+
const entry = BOOT_HIDDEN[provider];
|
|
586
|
+
if (!meta || !entry || _bootedHidden.has(provider) || _loadedProviders.has(provider)) return;
|
|
587
|
+
if (!placeholdersNeedBoot(pills, scopedTabsKey(meta))) return;
|
|
588
|
+
_bootedHidden.add(provider);
|
|
589
|
+
Promise.resolve(entry.ready ? entry.ready() : true)
|
|
590
|
+
.then((ok) => (ok ? entry.boot() : null))
|
|
591
|
+
.catch((err) => console.warn(`[sidepanel-tray] ${provider}: could not boot to ask after its working tabs`, err));
|
|
592
|
+
}
|
|
593
|
+
|
|
520
594
|
export function renderSidepanelTrayPlaceholders() {
|
|
521
595
|
for (const provider of Object.keys(PROVIDERS)) {
|
|
522
596
|
if (_loadedProviders.has(provider)) {
|
|
@@ -524,9 +598,11 @@ export function renderSidepanelTrayPlaceholders() {
|
|
|
524
598
|
continue;
|
|
525
599
|
}
|
|
526
600
|
removePlaceholders(provider);
|
|
527
|
-
|
|
601
|
+
const pills = meaningfulPills(provider);
|
|
602
|
+
for (const { payload, tab, index } of pills) {
|
|
528
603
|
createPlaceholder(provider, payload, tab, index);
|
|
529
604
|
}
|
|
605
|
+
bootHiddenIfWorking(provider, pills);
|
|
530
606
|
}
|
|
531
607
|
}
|
|
532
608
|
|
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
|
|
7
7
|
import { emit, on } from './state.js';
|
|
8
8
|
import { storage } from './storage.js';
|
|
9
|
+
import { safeHref } from './assistant/asst-sanitize.js';
|
|
9
10
|
import { isGuest, hasPermission, showGuestToast } from './ui-sync.js';
|
|
11
|
+
import { registerLaunchPrefetch } from './launch-prefetch.js';
|
|
10
12
|
import {
|
|
11
13
|
fetchSkillsLibrary, fetchSkillsArtifact, saveSkillsArtifact,
|
|
12
14
|
fetchSkillsSubFile, saveSkillsSubFile, createSkillsSubFile, deleteSkillsSubFile,
|
|
@@ -22,6 +24,9 @@ const $ = (id) => document.getElementById(id);
|
|
|
22
24
|
let _panel = null;
|
|
23
25
|
let _backdrop = null;
|
|
24
26
|
let _library = [];
|
|
27
|
+
let _libraryLoaded = false; // the library was read once: later opens paint from it and read it again behind
|
|
28
|
+
let _panelLife = null; // document listeners of the open panel end with it
|
|
29
|
+
let _toolsMenuLife = null; // the tools dropdown's outside-click listener (one at a time)
|
|
25
30
|
let _projects = [];
|
|
26
31
|
let _selected = null; // currently selected artifact
|
|
27
32
|
let _selectedContent = null; // loaded content of selected artifact
|
|
@@ -242,6 +247,8 @@ function toast(msg, type = 'info') {
|
|
|
242
247
|
// ═══════════════════════════════════════════
|
|
243
248
|
|
|
244
249
|
export function initSkillsStudio() {
|
|
250
|
+
// Launch: the library is read once the page has painted (launch-prefetch.js), so the first open paints at once.
|
|
251
|
+
registerLaunchPrefetch('skills-library', prefetchSkillsLibrary, { order: 70 });
|
|
245
252
|
on('skills:open', () => openPanel());
|
|
246
253
|
on('skills:open-wizard', () => { openPanel(); switchToWizard(); });
|
|
247
254
|
on('skills:import', () => { openPanel(); triggerImport(); });
|
|
@@ -276,6 +283,16 @@ async function openPanel() {
|
|
|
276
283
|
_panel.style.top = Math.max(48, (window.innerHeight - 520) / 2) + 'px';
|
|
277
284
|
|
|
278
285
|
wirePanel();
|
|
286
|
+
if (_libraryLoaded) {
|
|
287
|
+
// The library as last read paints at once; it is read again behind it and the list follows in place.
|
|
288
|
+
const countEl = $('ss-total-count');
|
|
289
|
+
if (countEl) countEl.textContent = _library.length;
|
|
290
|
+
renderLibrary();
|
|
291
|
+
renderView();
|
|
292
|
+
requestAnimationFrame(() => { _backdrop?.classList.add('open'); _panel?.classList.add('open'); });
|
|
293
|
+
refreshLibraryInPlace();
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
279
296
|
await loadLibrary();
|
|
280
297
|
renderView();
|
|
281
298
|
|
|
@@ -284,6 +301,10 @@ async function openPanel() {
|
|
|
284
301
|
|
|
285
302
|
function closePanel() {
|
|
286
303
|
if (!_panel) return;
|
|
304
|
+
_panelLife?.abort();
|
|
305
|
+
_panelLife = null;
|
|
306
|
+
_toolsMenuLife?.abort();
|
|
307
|
+
_toolsMenuLife = null;
|
|
287
308
|
if (_backdrop) { _backdrop.remove(); _backdrop = null; }
|
|
288
309
|
_panel.remove();
|
|
289
310
|
_panel = null;
|
|
@@ -340,6 +361,8 @@ function buildPanelHTML() {
|
|
|
340
361
|
}
|
|
341
362
|
|
|
342
363
|
function wirePanel() {
|
|
364
|
+
_panelLife?.abort();
|
|
365
|
+
_panelLife = new AbortController();
|
|
343
366
|
// Close button
|
|
344
367
|
$('ss-close')?.addEventListener('click', closePanel);
|
|
345
368
|
|
|
@@ -376,10 +399,10 @@ function wirePanel() {
|
|
|
376
399
|
if (_view === 'editor' && _tabs.length > 0) { closeTab(_activeTabIdx); return; }
|
|
377
400
|
if (_view === 'wizard') { switchToLibrary(); return; }
|
|
378
401
|
closePanel();
|
|
379
|
-
document.removeEventListener('keydown', onEsc);
|
|
380
402
|
}
|
|
381
403
|
};
|
|
382
|
-
|
|
404
|
+
// Removed with the panel, however it closes (the close button too).
|
|
405
|
+
document.addEventListener('keydown', onEsc, { signal: _panelLife.signal });
|
|
383
406
|
|
|
384
407
|
// Drag/resize are handled by the shared panel system via drag-handle/resize-handle.
|
|
385
408
|
}
|
|
@@ -393,6 +416,7 @@ async function loadLibrary() {
|
|
|
393
416
|
const data = await fetchSkillsLibrary();
|
|
394
417
|
_library = data.artifacts || [];
|
|
395
418
|
_projects = data.projects || [];
|
|
419
|
+
_libraryLoaded = true;
|
|
396
420
|
const countEl = $('ss-total-count');
|
|
397
421
|
if (countEl) countEl.textContent = _library.length;
|
|
398
422
|
renderLibrary();
|
|
@@ -402,6 +426,35 @@ async function loadLibrary() {
|
|
|
402
426
|
}
|
|
403
427
|
}
|
|
404
428
|
|
|
429
|
+
// The library read again behind a panel painted from the kept one: the list is redrawn only when it changed,
|
|
430
|
+
// at the scroll position it had (a failed read leaves the kept library as it is).
|
|
431
|
+
async function refreshLibraryInPlace() {
|
|
432
|
+
const before = JSON.stringify([_library, _projects]);
|
|
433
|
+
try {
|
|
434
|
+
const data = await fetchSkillsLibrary();
|
|
435
|
+
const next = [data.artifacts || [], data.projects || []];
|
|
436
|
+
if (!_panel || JSON.stringify(next) === before) return;
|
|
437
|
+
[_library, _projects] = next;
|
|
438
|
+
const list = $('ss-library');
|
|
439
|
+
const scroll = list ? list.scrollTop : 0;
|
|
440
|
+
const countEl = $('ss-total-count');
|
|
441
|
+
if (countEl) countEl.textContent = _library.length;
|
|
442
|
+
renderLibrary();
|
|
443
|
+
if (list) list.scrollTop = scroll;
|
|
444
|
+
} catch { /* the kept library stays */ }
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/** Launch prefetch: the library read once, so the first open paints at once (nothing is drawn here). */
|
|
448
|
+
export function prefetchSkillsLibrary() {
|
|
449
|
+
if (_libraryLoaded || (isGuest() && !hasPermission('skills'))) return Promise.resolve();
|
|
450
|
+
return fetchSkillsLibrary().then((data) => {
|
|
451
|
+
if (_libraryLoaded) return;
|
|
452
|
+
_library = data.artifacts || [];
|
|
453
|
+
_projects = data.projects || [];
|
|
454
|
+
_libraryLoaded = true;
|
|
455
|
+
}).catch(() => { /* the first open reads it */ });
|
|
456
|
+
}
|
|
457
|
+
|
|
405
458
|
// ═══════════════════════════════════════════
|
|
406
459
|
// VIEW SWITCHING
|
|
407
460
|
// ═══════════════════════════════════════════
|
|
@@ -795,7 +848,7 @@ function buildMetadataForm(artifact, fm) {
|
|
|
795
848
|
|
|
796
849
|
html += `<div class="ss-field">
|
|
797
850
|
<label>Max Turns</label>
|
|
798
|
-
<input type="number" class="ss-input" id="ss-f-max-turns" value="${fm.maxTurns || ''}" min="0" data-fm="maxTurns" placeholder="0 = unlimited">
|
|
851
|
+
<input type="number" class="ss-input" id="ss-f-max-turns" value="${esc(String(fm.maxTurns || ''))}" min="0" data-fm="maxTurns" placeholder="0 = unlimited">
|
|
799
852
|
</div>`;
|
|
800
853
|
|
|
801
854
|
html += `<div class="ss-field">
|
|
@@ -1291,15 +1344,17 @@ function wireToolsDropdown() {
|
|
|
1291
1344
|
updateDirtyState();
|
|
1292
1345
|
});
|
|
1293
1346
|
|
|
1294
|
-
// Close on outside click
|
|
1347
|
+
// Close on outside click. Every editor render wires a new dropdown: the previous one's listener ends here,
|
|
1348
|
+
// and the last one with the panel.
|
|
1295
1349
|
const closeMenu = (e) => {
|
|
1296
1350
|
if (!trigger.contains(e.target) && !menu.contains(e.target)) {
|
|
1297
1351
|
menu.classList.remove('open');
|
|
1298
1352
|
trigger.classList.remove('open');
|
|
1299
1353
|
}
|
|
1300
1354
|
};
|
|
1301
|
-
|
|
1302
|
-
|
|
1355
|
+
_toolsMenuLife?.abort();
|
|
1356
|
+
_toolsMenuLife = new AbortController();
|
|
1357
|
+
document.addEventListener('click', closeMenu, { signal: _toolsMenuLife.signal });
|
|
1303
1358
|
}
|
|
1304
1359
|
|
|
1305
1360
|
// ── Metadata ↔ Frontmatter helpers ──
|
|
@@ -1598,8 +1653,8 @@ function renderMarkdown(md) {
|
|
|
1598
1653
|
// Strip YAML frontmatter
|
|
1599
1654
|
let text = md.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/, '');
|
|
1600
1655
|
|
|
1601
|
-
// Escape HTML first
|
|
1602
|
-
text = text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
1656
|
+
// Escape HTML first (quotes too: a link's target lands in an attribute)
|
|
1657
|
+
text = text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
1603
1658
|
|
|
1604
1659
|
// Code blocks (``` ... ```)
|
|
1605
1660
|
text = text.replace(/```(\w*)\n([\s\S]*?)```/g, (_, lang, code) => {
|
|
@@ -1626,8 +1681,11 @@ function renderMarkdown(md) {
|
|
|
1626
1681
|
// Inline code
|
|
1627
1682
|
text = text.replace(/`([^`]+)`/g, '<code>$1</code>');
|
|
1628
1683
|
|
|
1629
|
-
// Links
|
|
1630
|
-
text = text.replace(/\[([^\]]+)\]\(([^)]+)\)/g,
|
|
1684
|
+
// Links: http(s) and mailto only, checked as the Markdown sanitiser checks them; any other target stays text
|
|
1685
|
+
text = text.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (whole, label, target) => {
|
|
1686
|
+
const href = safeHref(target.replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>').replace(/&/g, '&'));
|
|
1687
|
+
return href ? `<a href="${esc(href)}" target="_blank" rel="noopener noreferrer">${label}</a>` : label;
|
|
1688
|
+
});
|
|
1631
1689
|
|
|
1632
1690
|
// Blockquotes
|
|
1633
1691
|
text = text.replace(/^>\s?(.*)$/gm, '<blockquote>$1</blockquote>');
|
|
@@ -1663,7 +1721,7 @@ function renderMarkdown(md) {
|
|
|
1663
1721
|
return text;
|
|
1664
1722
|
}
|
|
1665
1723
|
|
|
1666
|
-
// ── Mermaid support (lazy-loaded
|
|
1724
|
+
// ── Mermaid support (lazy-loaded, vendored in public/vendor/mermaid/) ──
|
|
1667
1725
|
let _mermaidLoaded = false;
|
|
1668
1726
|
let _mermaidLoading = false;
|
|
1669
1727
|
let _mermaidId = 0;
|
|
@@ -1679,7 +1737,7 @@ async function loadMermaid() {
|
|
|
1679
1737
|
}
|
|
1680
1738
|
_mermaidLoading = true;
|
|
1681
1739
|
try {
|
|
1682
|
-
const mod = await import('
|
|
1740
|
+
const mod = await import('/vendor/mermaid/mermaid-11.17.2.esm.min.mjs');
|
|
1683
1741
|
mod.default.initialize({ startOnLoad: false, theme: 'dark', themeVariables: {
|
|
1684
1742
|
darkMode: true, background: 'transparent', primaryColor: '#1e3a5f',
|
|
1685
1743
|
primaryTextColor: '#e0e0e0', lineColor: '#94a3b8', secondaryColor: '#2a2a4a',
|
|
@@ -66,6 +66,13 @@ const SYNC_HANDLERS = {
|
|
|
66
66
|
|
|
67
67
|
// Settings → OpenCode model checkboxes changed in another window: refresh
|
|
68
68
|
// the localStorage mirror (fires ocp-hidden-models-changed when it differs).
|
|
69
|
+
// OpenCode's provider list changed (a provider connected or removed, a catalog refresh): every window's
|
|
70
|
+
// pickers read it again, also where no OpenCode panel (and so no OpenCode socket) is open.
|
|
71
|
+
'opencode:providers-changed': (msg) => {
|
|
72
|
+
emit('sync:opencode:providers-changed', msg);
|
|
73
|
+
if (typeof document !== 'undefined') document.dispatchEvent(new CustomEvent('ocp-providers-changed'));
|
|
74
|
+
},
|
|
75
|
+
|
|
69
76
|
'opencode:hidden-models-changed': (msg) => {
|
|
70
77
|
applyHiddenModels(msg.models);
|
|
71
78
|
emit('sync:opencode:hidden-models-changed', msg);
|
|
@@ -129,6 +136,8 @@ const SYNC_HANDLERS = {
|
|
|
129
136
|
'assistant:desktop': (msg) => emit('sync:assistant:desktop', msg),
|
|
130
137
|
'assistant:desktop-setup': (msg) => emit('sync:assistant:desktop-setup', msg),
|
|
131
138
|
'assistant:routing-changed': (msg) => emit('sync:assistant:routing-changed', msg),
|
|
139
|
+
// Admin sandbox (lib/agent-sandbox-setting.js): the one global value changed in some window
|
|
140
|
+
'agents:admin-sandbox-changed': (msg) => emit('sync:agents:admin-sandbox-changed', msg),
|
|
132
141
|
|
|
133
142
|
// WhatsApp Link — states and counters only (never a QR, code, number or text); Settings → WhatsApp re-reads /api/whatsapp/status
|
|
134
143
|
'whatsapp:status': (msg) => emit('sync:whatsapp:status', msg),
|
|
@@ -20,6 +20,7 @@ import { readinessKind, typeWhenReady } from './term-ready.js';
|
|
|
20
20
|
import { initRendererManager, acquireRenderer, disposeRenderer, hasWebgl, noteFocus, adoptRenderer, rendererState, rendererStats } from './term-renderer.js';
|
|
21
21
|
import { mountAssistant } from './assistant/asst-panel.js';
|
|
22
22
|
import { getAssistantSession } from './assistant/asst-api.js';
|
|
23
|
+
import { mascotCameoSvg } from './synabun-mascot.js';
|
|
23
24
|
import { brainLabel, normalizeBrain, readStoredBrain, restoredSessionName, sessionNameGivenUp } from './assistant/asst-state.js';
|
|
24
25
|
import { initAssistant, registerAssistantHost, openAssistant, assistantOwnerOf, fetchLiveAssistantSessions, isAssistantSessionLive } from './ui-assistant.js';
|
|
25
26
|
|
|
@@ -447,13 +448,25 @@ function _setBadgeStatus(container, status) {
|
|
|
447
448
|
if (lbl) lbl.textContent = _CLI_LABELS[status] || '';
|
|
448
449
|
}
|
|
449
450
|
|
|
451
|
+
/**
|
|
452
|
+
* An Assistant tab minimises to the Assistant's own tray pill (assistant/asst-styles.js "Tray pill"), the one
|
|
453
|
+
* its sidepanel shows: the mark, the gold cameo and hairline while the session works (its turn or a worker it
|
|
454
|
+
* dispatched), the warn tint while it needs you. No CLI dot and no check: its status is the panel's.
|
|
455
|
+
*/
|
|
456
|
+
function _paintAssistantPill(pill, status) {
|
|
457
|
+
pill.classList.toggle('asp-pill-running', status === CLI_STATUS.WORKING);
|
|
458
|
+
pill.classList.toggle('asp-pill-attention', status === CLI_STATUS.ACTION);
|
|
459
|
+
pill.classList.toggle('asp-pill-done', status === CLI_STATUS.DONE);
|
|
460
|
+
}
|
|
461
|
+
|
|
450
462
|
function _updateSessionBadges(sessionId, status) {
|
|
451
463
|
_notifyStatusChange(sessionId, status);
|
|
452
464
|
const refs = _getBadgeContainers(sessionId);
|
|
453
465
|
_setBadgeStatus(refs.tab, status);
|
|
454
466
|
_setBadgeStatus(refs.float, status);
|
|
467
|
+
if (refs.pill?.classList.contains('asp-session-pill')) _paintAssistantPill(refs.pill, status);
|
|
455
468
|
// Minimized pill badge + icon swap on done
|
|
456
|
-
if (refs.pill) {
|
|
469
|
+
else if (refs.pill) {
|
|
457
470
|
_setBadgeStatus(refs.pill, status);
|
|
458
471
|
const ico = refs.pill.querySelector('.term-minimized-pill-icon');
|
|
459
472
|
if (ico) {
|
|
@@ -646,7 +659,7 @@ function _initFloatProfileDropdown(dd) {
|
|
|
646
659
|
for (const [id, preset] of Object.entries(data.presets)) {
|
|
647
660
|
const opt = document.createElement('div');
|
|
648
661
|
opt.className = 'term-float-profile-option' + (id === data.current ? ' selected' : '');
|
|
649
|
-
opt.innerHTML = `<span class="tfp-name">${preset.label || id}</span><span class="tfp-hint">${preset.tools} tools</span>`;
|
|
662
|
+
opt.innerHTML = `<span class="tfp-name">${_escHtml(String(preset.label || id))}</span><span class="tfp-hint">${_escHtml(String(preset.tools))} tools</span>`;
|
|
650
663
|
opt.addEventListener('click', async (ev) => {
|
|
651
664
|
ev.stopPropagation();
|
|
652
665
|
menu.classList.remove('open');
|
|
@@ -726,7 +739,7 @@ function _initFloatRecallDropdown(dd) {
|
|
|
726
739
|
for (const p of FLOAT_RECALL_META) {
|
|
727
740
|
const opt = document.createElement('div');
|
|
728
741
|
opt.className = 'term-float-recall-option' + (p.value === data.profile ? ' selected' : '');
|
|
729
|
-
opt.innerHTML = `<span class="tfr-name">${p.label}</span><span class="tfr-hint">${p.hint}</span>`;
|
|
742
|
+
opt.innerHTML = `<span class="tfr-name">${_escHtml(p.label)}</span><span class="tfr-hint">${_escHtml(p.hint)}</span>`;
|
|
730
743
|
opt.addEventListener('click', async (ev) => {
|
|
731
744
|
ev.stopPropagation();
|
|
732
745
|
menu.classList.remove('open');
|
|
@@ -1740,7 +1753,7 @@ function pickProject(profile) {
|
|
|
1740
1753
|
|
|
1741
1754
|
const title = document.createElement('div');
|
|
1742
1755
|
title.className = 'term-picker-title';
|
|
1743
|
-
title.innerHTML = `<span class="term-picker-icon">${profileDef?.svg || SVG_SHELL}</span>Open ${label} in...`;
|
|
1756
|
+
title.innerHTML = `<span class="term-picker-icon">${profileDef?.svg || SVG_SHELL}</span>Open ${_escHtml(String(label))} in...`;
|
|
1744
1757
|
|
|
1745
1758
|
const list = document.createElement('div');
|
|
1746
1759
|
list.className = 'term-picker-list';
|
|
@@ -1757,7 +1770,7 @@ function pickProject(profile) {
|
|
|
1757
1770
|
const item = document.createElement('button');
|
|
1758
1771
|
item.className = 'term-picker-item';
|
|
1759
1772
|
const folder = p.path.split(/[\\/]/).pop();
|
|
1760
|
-
item.innerHTML = `<span class="term-picker-item-icon"><svg viewBox="0 0 24 24"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg></span><span class="term-picker-item-label">${p.label || folder}</span><span class="term-picker-item-path">${p.path}</span>`;
|
|
1773
|
+
item.innerHTML = `<span class="term-picker-item-icon"><svg viewBox="0 0 24 24"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg></span><span class="term-picker-item-label">${_escHtml(String(p.label || folder))}</span><span class="term-picker-item-path">${_escHtml(String(p.path))}</span>`;
|
|
1761
1774
|
item.addEventListener('click', () => { overlay.remove(); resolve(p.path); });
|
|
1762
1775
|
list.appendChild(item);
|
|
1763
1776
|
});
|
|
@@ -3288,7 +3301,7 @@ async function reconnectBrowserSession(sessionId, liveData, saved) {
|
|
|
3288
3301
|
<div class="browser-url-bar">
|
|
3289
3302
|
<input type="text" class="browser-url-input" value="${currentUrl.replace(/"/g, '"')}" spellcheck="false" autocomplete="off">
|
|
3290
3303
|
</div>
|
|
3291
|
-
<span class="browser-title-label">${liveData?.title || ''}</span>
|
|
3304
|
+
<span class="browser-title-label">${_escHtml(String(liveData?.title || ''))}</span>
|
|
3292
3305
|
`;
|
|
3293
3306
|
viewport.appendChild(navbar);
|
|
3294
3307
|
|
|
@@ -5133,10 +5146,11 @@ function minimizeTab(sessionId) {
|
|
|
5133
5146
|
if (!tray) { tabState.el.style.display = 'none'; _syncRenderers(); return; }
|
|
5134
5147
|
const prof = PROFILES.find(p => p.id === session.profile);
|
|
5135
5148
|
const pill = document.createElement('div');
|
|
5136
|
-
pill.className = 'term-minimized-pill' + (session._bell ? ' has-bell' : '');
|
|
5149
|
+
pill.className = 'term-minimized-pill' + (session._isAssistant ? ' asp-session-pill' : '') + (session._bell ? ' has-bell' : '');
|
|
5137
5150
|
pill.setAttribute('data-session-id', sessionId);
|
|
5151
|
+
// (An Assistant's carries the running cameo beside its mark: _paintAssistantPill shows one or the other.)
|
|
5138
5152
|
pill.innerHTML = `
|
|
5139
|
-
<span class="term-minimized-pill-icon">${prof?.svg || SVG_SHELL}</span>
|
|
5153
|
+
<span class="term-minimized-pill-icon"${session._isAssistant ? ' aria-hidden="true"' : ''}>${prof?.svg || SVG_SHELL}${session._isAssistant ? mascotCameoSvg() : ''}</span>
|
|
5140
5154
|
<span class="term-minimized-pill-label">${_escHtml(_displayLabel(session))}</span>
|
|
5141
5155
|
<button class="term-minimized-pill-close" data-tooltip="Close">×</button>
|
|
5142
5156
|
`;
|
|
@@ -5150,9 +5164,11 @@ function minimizeTab(sessionId) {
|
|
|
5150
5164
|
tray.appendChild(pill);
|
|
5151
5165
|
tabState.pill = pill;
|
|
5152
5166
|
|
|
5153
|
-
// Set initial CLI status badge on pill
|
|
5167
|
+
// Set initial CLI status badge on pill (an Assistant's: the state the panel last pushed)
|
|
5154
5168
|
const tracked = _cliSessionStatus.get(sessionId);
|
|
5155
|
-
if (tracked) {
|
|
5169
|
+
if (tracked && session._isAssistant) {
|
|
5170
|
+
_paintAssistantPill(pill, tracked.status);
|
|
5171
|
+
} else if (tracked) {
|
|
5156
5172
|
const badge = _ensureBadge(pill);
|
|
5157
5173
|
badge.dataset.status = tracked.status;
|
|
5158
5174
|
const lbl = badge.querySelector('.cli-status-label');
|
|
@@ -6905,9 +6921,9 @@ async function toggleFileTree(sidebar, session) {
|
|
|
6905
6921
|
|
|
6906
6922
|
// Branch (clickable if git)
|
|
6907
6923
|
const branchHtml = data.branch
|
|
6908
|
-
? `<button class="ft-branch" data-tooltip="Switch branch"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="6" y1="3" x2="6" y2="15"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><path d="M18 9a9 9 0 0 1-9 9"/></svg><span class="ft-branch-name">${data.branch}</span></button>`
|
|
6924
|
+
? `<button class="ft-branch" data-tooltip="Switch branch"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="6" y1="3" x2="6" y2="15"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><path d="M18 9a9 9 0 0 1-9 9"/></svg><span class="ft-branch-name">${_escHtml(String(data.branch))}</span></button>`
|
|
6909
6925
|
: '';
|
|
6910
|
-
header.innerHTML = `<span class="ft-header-label" data-tooltip="Click to change path" title="${session.cwd}">${dirName}</span>${branchHtml}`;
|
|
6926
|
+
header.innerHTML = `<span class="ft-header-label" data-tooltip="Click to change path" title="${_escHtml(session.cwd).replace(/"/g, '"')}">${_escHtml(dirName)}</span>${branchHtml}`;
|
|
6911
6927
|
|
|
6912
6928
|
// Wire header label click → inline path editor
|
|
6913
6929
|
header.querySelector('.ft-header-label').addEventListener('click', (e) => {
|
|
@@ -6980,7 +6996,7 @@ async function toggleFileTree(sidebar, session) {
|
|
|
6980
6996
|
|
|
6981
6997
|
renderFileItems(tree, originalItems, session.cwd, 0, session);
|
|
6982
6998
|
} catch (err) {
|
|
6983
|
-
sidebar.innerHTML = `<div class="ft-empty">Error: ${err
|
|
6999
|
+
sidebar.innerHTML = `<div class="ft-empty">Error: ${_escHtml(String(err?.message || err))}</div>`;
|
|
6984
7000
|
}
|
|
6985
7001
|
}
|
|
6986
7002
|
|
|
@@ -7001,7 +7017,7 @@ function renderFileItems(container, items, parentPath, depth, session) {
|
|
|
7001
7017
|
const gitBadge = item.git ? `<span class="ft-git-badge" data-tooltip="${item.git}">${GIT_STATUS_LABEL[item.git] || '?'}</span>` : '';
|
|
7002
7018
|
|
|
7003
7019
|
if (item.type === 'dir') {
|
|
7004
|
-
row.innerHTML = `<span class="ft-chevron">${SVG_CHEVRON}</span><span class="ft-icon">${SVG_DIR}</span><span class="ft-name">${item.name}</span>${gitBadge}`;
|
|
7020
|
+
row.innerHTML = `<span class="ft-chevron">${SVG_CHEVRON}</span><span class="ft-icon">${SVG_DIR}</span><span class="ft-name">${_escHtml(item.name)}</span>${gitBadge}`;
|
|
7005
7021
|
row.dataset.path = fullPath;
|
|
7006
7022
|
row.dataset.expanded = 'false';
|
|
7007
7023
|
|
|
@@ -7045,7 +7061,7 @@ function renderFileItems(container, items, parentPath, depth, session) {
|
|
|
7045
7061
|
}
|
|
7046
7062
|
});
|
|
7047
7063
|
} else {
|
|
7048
|
-
row.innerHTML = `<span class="ft-chevron-spacer"></span><span class="ft-icon">${SVG_FILE}</span><span class="ft-name">${item.name}</span>${gitBadge}`;
|
|
7064
|
+
row.innerHTML = `<span class="ft-chevron-spacer"></span><span class="ft-icon">${SVG_FILE}</span><span class="ft-name">${_escHtml(item.name)}</span>${gitBadge}`;
|
|
7049
7065
|
row.dataset.path = fullPath;
|
|
7050
7066
|
|
|
7051
7067
|
// Click file → type path into terminal
|
|
@@ -7076,9 +7092,9 @@ function renderSearchResults(container, items, session) {
|
|
|
7076
7092
|
// Show relative path — highlight the filename part
|
|
7077
7093
|
const parts = item.name.split('/');
|
|
7078
7094
|
const fileName = parts.pop();
|
|
7079
|
-
const dirPath = parts.length ? `<span class="ft-search-path">${parts.join('/')}/</span>` : '';
|
|
7095
|
+
const dirPath = parts.length ? `<span class="ft-search-path">${_escHtml(parts.join('/'))}/</span>` : '';
|
|
7080
7096
|
|
|
7081
|
-
row.innerHTML = `<span class="ft-icon">${icon}</span>${dirPath}<span class="ft-name">${fileName}</span>`;
|
|
7097
|
+
row.innerHTML = `<span class="ft-icon">${icon}</span>${dirPath}<span class="ft-name">${_escHtml(fileName)}</span>`;
|
|
7082
7098
|
|
|
7083
7099
|
const fullPath = session.cwd.replace(/[\\/]$/, '') + '/' + item.name;
|
|
7084
7100
|
row.dataset.path = fullPath;
|
|
@@ -7235,7 +7251,7 @@ async function openBranchPicker(sidebar, session, anchorEl) {
|
|
|
7235
7251
|
for (const branch of data.branches) {
|
|
7236
7252
|
const item = document.createElement('button');
|
|
7237
7253
|
item.className = `ft-branch-item${branch === data.current ? ' current' : ''}`;
|
|
7238
|
-
item.innerHTML = `<span class="ft-branch-item-name">${branch}</span>${branch === data.current ? '<span class="ft-branch-item-check">✓</span>' : ''}`;
|
|
7254
|
+
item.innerHTML = `<span class="ft-branch-item-name">${_escHtml(branch)}</span>${branch === data.current ? '<span class="ft-branch-item-check">✓</span>' : ''}`;
|
|
7239
7255
|
|
|
7240
7256
|
item.addEventListener('click', async (e) => {
|
|
7241
7257
|
e.stopPropagation();
|
|
@@ -7246,7 +7262,7 @@ async function openBranchPicker(sidebar, session, anchorEl) {
|
|
|
7246
7262
|
|
|
7247
7263
|
// Show loading state
|
|
7248
7264
|
item.classList.add('switching');
|
|
7249
|
-
item.innerHTML = `<span class="ft-branch-item-name">${branch}</span><span class="ft-branch-item-check">...</span>`;
|
|
7265
|
+
item.innerHTML = `<span class="ft-branch-item-name">${_escHtml(branch)}</span><span class="ft-branch-item-check">...</span>`;
|
|
7250
7266
|
|
|
7251
7267
|
try {
|
|
7252
7268
|
const result = await checkoutTerminalBranch(session.cwd, branch);
|
|
@@ -7270,7 +7286,7 @@ async function openBranchPicker(sidebar, session, anchorEl) {
|
|
|
7270
7286
|
}
|
|
7271
7287
|
} catch (err) {
|
|
7272
7288
|
item.classList.remove('switching');
|
|
7273
|
-
item.innerHTML = `<span class="ft-branch-item-name">${branch}</span><span class="ft-branch-item-check" style="color:#ff5252">!</span>`;
|
|
7289
|
+
item.innerHTML = `<span class="ft-branch-item-name">${_escHtml(branch)}</span><span class="ft-branch-item-check" style="color:#ff5252">!</span>`;
|
|
7274
7290
|
writeGitOutput('error', err.message || 'Checkout failed');
|
|
7275
7291
|
}
|
|
7276
7292
|
});
|
|
@@ -200,10 +200,17 @@ function openTrashPanel() {
|
|
|
200
200
|
renderTrashList();
|
|
201
201
|
});
|
|
202
202
|
|
|
203
|
-
//
|
|
203
|
+
// The trash as last read (at start-up, after every change) paints at once; the read below brings it up to
|
|
204
|
+
// date in place, at the list's scroll position, and only when it changed.
|
|
205
|
+
const kept = trashItems.length ? JSON.stringify(trashItems) : null;
|
|
206
|
+
if (kept) { renderTrashFilters(); renderTrashList(); }
|
|
204
207
|
fetchTrashItems().then(() => {
|
|
208
|
+
if (kept && JSON.stringify(trashItems) === kept) return;
|
|
209
|
+
const list = $('tw-list');
|
|
210
|
+
const scroll = list ? list.scrollTop : 0;
|
|
205
211
|
renderTrashFilters();
|
|
206
212
|
renderTrashList();
|
|
213
|
+
if (kept && list && list.isConnected) list.scrollTop = scroll;
|
|
207
214
|
});
|
|
208
215
|
}
|
|
209
216
|
|
|
@@ -74,7 +74,9 @@ export const ONBOARDING_STEPS = [
|
|
|
74
74
|
// targets ordered alternatives, [selector, copyKey = 'body', lastSelector?]. The first one on
|
|
75
75
|
// screen is annotated and its copy shown; `lastSelector` widens the outline to a run
|
|
76
76
|
// of controls. None on screen: the note stays, with the navigation.
|
|
77
|
-
// menu a menubar dropdown opened while the step shows (closed again after)
|
|
77
|
+
// menu a menubar dropdown opened while the step shows (closed again after); an object
|
|
78
|
+
// names it per variant ({ '3d': 'apps' }: none in the other).
|
|
79
|
+
// submenu a submenu of that dropdown opened too, by its data-submenu name, same forms as `menu`.
|
|
78
80
|
// panel 'assistant' shows the Assistant panel for the step when that starts nothing
|
|
79
81
|
// (see assistantPanelPeekable); otherwise the last target, its button, is used.
|
|
80
82
|
// copy per-variant copy key for the first target ({ '2d': 'body2d' }).
|
|
@@ -88,14 +90,16 @@ const TOOLS_TOGGLE = ['#topright-tools-btn'];
|
|
|
88
90
|
|
|
89
91
|
export const FEATURE_STEPS = [
|
|
90
92
|
{ id: 'explain-memory-explorer', chapter: 'memory', targets: [['#topright-memory-explorer-btn'], TOOLS_TOGGLE] },
|
|
91
|
-
|
|
93
|
+
// 3D: the Map submenu of Apps. 2D: the Graph menu.
|
|
94
|
+
{ id: 'explain-graph', chapter: 'memory', menu: { '3d': 'apps' }, submenu: { '3d': 'map' }, copy: { '2d': 'body2d' },
|
|
95
|
+
targets: [['#menu-map-label', 'body', '#menu-map-rebuild'], ['[data-menu="graph"] > .menubar-label', 'body2d']] },
|
|
92
96
|
{ id: 'explain-focus', chapter: 'workspace', targets: [['#wb-toolbar'], ['#titlebar-viz-toggle', 'graph']] },
|
|
93
97
|
{ id: 'explain-workspaces', chapter: 'workspace', targets: [['#ws-indicator'], TOOLS_TOGGLE] },
|
|
94
98
|
{ id: 'explain-terminals', chapter: 'tools', menu: 'apps', targets: [['#menu-terminal-claude', 'body', '#menu-terminal-opencode']] },
|
|
95
99
|
{ id: 'explain-browser', chapter: 'tools', menu: 'apps', targets: [['#menu-terminal-browser']] },
|
|
96
100
|
{ id: 'explain-side-panel', chapter: 'tools', targets: [['#topright-claude-panel-btn', 'body', '#topright-opencode-panel-btn']] },
|
|
97
101
|
{ id: 'explain-automations', chapter: 'automation', menu: 'automations', targets: [['#menu-open-automation-studio']] },
|
|
98
|
-
{ id: 'explain-schedules', chapter: 'automation',
|
|
102
|
+
{ id: 'explain-schedules', chapter: 'automation', targets: [['#menubar-schedules-btn']] },
|
|
99
103
|
{ id: 'assistant-start', chapter: 'assistant', panel: 'assistant', targets: [[`${ACTIVE_TAB} .asst-input`], ASSISTANT_BUTTON] },
|
|
100
104
|
{ id: 'assistant-tools', chapter: 'assistant', panel: 'assistant', targets: [[`${ACTIVE_BAR} .asst-computer-toggle`], ASSISTANT_BUTTON] },
|
|
101
105
|
{ id: 'assistant-route', chapter: 'assistant', panel: 'assistant', targets: [[`${ACTIVE_BAR} .asst-route-chip`], ASSISTANT_BUTTON] },
|