synabun 2.0.5 → 2.0.9
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 +78 -0
- package/README.md +2 -1
- package/THIRD-PARTY-LICENSES.md +13 -0
- package/docs/whatsapp.md +151 -16
- package/hooks/claude-code/post-plan.mjs +6 -30
- package/hooks/claude-code/session-start.mjs +1 -4
- package/hooks/claude-code/shared.mjs +112 -75
- package/lib/child-path.js +303 -0
- package/lib/claude-hooks.js +2 -1
- package/lib/data-home-migration.js +2 -0
- package/lib/desktop-app.js +265 -0
- package/lib/external-tools.js +7 -3
- package/lib/log-redact.js +102 -0
- package/lib/package-processes.js +670 -0
- package/lib/packaged-runtime.js +138 -11
- package/lib/runtime-dependencies.js +225 -0
- package/mcp-server/dist/http.d.ts +3 -1
- package/mcp-server/dist/http.d.ts.map +1 -1
- package/mcp-server/dist/http.js +15 -4
- package/mcp-server/dist/http.js.map +1 -1
- package/mcp-server/dist/index.d.ts.map +1 -1
- package/mcp-server/dist/index.js +9 -6
- package/mcp-server/dist/index.js.map +1 -1
- package/mcp-server/dist/services/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/budget-judgments.d.ts +108 -0
- package/mcp-server/dist/services/budget-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/budget-judgments.js +153 -0
- package/mcp-server/dist/services/budget-judgments.js.map +1 -0
- package/mcp-server/dist/services/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/codex-config-heal.d.ts +5 -1
- package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
- package/mcp-server/dist/services/codex-config-heal.js +41 -4
- package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
- package/mcp-server/dist/services/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/services/identity.d.ts +11 -0
- package/mcp-server/dist/services/identity.d.ts.map +1 -1
- package/mcp-server/dist/services/identity.js +24 -0
- package/mcp-server/dist/services/identity.js.map +1 -1
- package/mcp-server/dist/services/neural-interface.d.ts +13 -0
- package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
- package/mcp-server/dist/services/neural-interface.js +34 -2
- package/mcp-server/dist/services/neural-interface.js.map +1 -1
- package/mcp-server/dist/services/typesafe-config.d.ts +1 -1
- package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -1
- package/mcp-server/dist/services/typesafe-config.js +4 -1
- package/mcp-server/dist/services/typesafe-config.js.map +1 -1
- package/mcp-server/dist/tools/agents.d.ts +11 -8
- package/mcp-server/dist/tools/agents.d.ts.map +1 -1
- package/mcp-server/dist/tools/agents.js +35 -14
- 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 +17 -0
- package/mcp-server/dist/tools/whatsapp-send-file.d.ts.map +1 -0
- package/mcp-server/dist/tools/whatsapp-send-file.js +44 -0
- package/mcp-server/dist/tools/whatsapp-send-file.js.map +1 -0
- package/mcp-server/dist/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 +18 -5
- package/mcp-server/dist/tui.js.map +1 -1
- package/mcp-server/dist/version.d.ts +5 -0
- package/mcp-server/dist/version.d.ts.map +1 -0
- package/mcp-server/dist/version.js +21 -0
- package/mcp-server/dist/version.js.map +1 -0
- package/mcp-server/package-lock.json +3 -3
- package/mcp-server/package.json +3 -3
- package/mcp-server/run.mjs +15 -9
- package/mcp-server/src/http.ts +18 -3
- package/mcp-server/src/index.ts +9 -6
- package/mcp-server/src/services/browser-bench.ts +1 -1
- package/mcp-server/src/services/budget-judgments.ts +183 -0
- package/mcp-server/src/services/categories.ts +77 -32
- package/mcp-server/src/services/codex-config-heal.ts +35 -4
- package/mcp-server/src/services/desktop-bench.ts +1 -1
- package/mcp-server/src/services/identity.ts +27 -0
- package/mcp-server/src/services/neural-interface.ts +34 -2
- package/mcp-server/src/services/typesafe-config.ts +4 -1
- package/mcp-server/src/tools/agents.ts +34 -15
- 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 +51 -0
- 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 +24 -10
- package/mcp-server/src/version.ts +22 -0
- package/neural-interface/i18n/en.json +645 -57
- package/neural-interface/i18n/pt-BR.json +644 -56
- package/neural-interface/lib/account-usage.js +163 -0
- package/neural-interface/lib/agent-sandbox-elevation.js +102 -0
- package/neural-interface/lib/agent-sandbox-setting.js +57 -0
- package/neural-interface/lib/assistant-api.js +274 -52
- package/neural-interface/lib/assistant-brains/claude.js +15 -2
- package/neural-interface/lib/assistant-brains/codex.js +3 -0
- package/neural-interface/lib/assistant-brains/opencode.js +17 -4
- package/neural-interface/lib/assistant-budget-planner.js +390 -0
- package/neural-interface/lib/assistant-budget-split.js +408 -0
- package/neural-interface/lib/assistant-budget.js +94 -95
- package/neural-interface/lib/assistant-config.js +62 -14
- package/neural-interface/lib/assistant-dispatch.js +432 -125
- package/neural-interface/lib/assistant-jev.js +26 -3
- package/neural-interface/lib/assistant-persona.js +68 -11
- package/neural-interface/lib/assistant-plan-permissions.js +8 -1
- package/neural-interface/lib/assistant-route-accounts.js +14 -0
- package/neural-interface/lib/assistant-route-gate-codex.js +3 -1
- package/neural-interface/lib/assistant-route-gate.js +19 -3
- package/neural-interface/lib/assistant-router.js +373 -42
- package/neural-interface/lib/assistant-runtime.js +312 -48
- package/neural-interface/lib/assistant-user-writer.js +4 -2
- package/neural-interface/lib/augmented-path.js +317 -53
- package/neural-interface/lib/claude-accounts.js +342 -31
- package/neural-interface/lib/claude-agent-bridge.js +90 -3
- package/neural-interface/lib/claude-executable.js +6 -1
- package/neural-interface/lib/claude-model-catalog.js +3 -3
- package/neural-interface/lib/claude-panel-auth.js +221 -0
- package/neural-interface/lib/claude-profile-api-key.js +62 -0
- package/neural-interface/lib/cli-install-api.js +137 -0
- package/neural-interface/lib/cli-install.js +797 -0
- package/neural-interface/lib/cli-path.js +130 -0
- package/neural-interface/lib/cli-resolver.js +744 -0
- package/neural-interface/lib/cli-update-planner.js +143 -7
- package/neural-interface/lib/codex-account-auth.js +180 -0
- package/neural-interface/lib/codex-accounts.js +502 -0
- package/neural-interface/lib/codex-capabilities.js +2 -1
- package/neural-interface/lib/codex-compat-rpc.js +8 -2
- package/neural-interface/lib/codex-mcp-approvals.js +5 -1
- package/neural-interface/lib/codex-panel-auth.js +62 -0
- package/neural-interface/lib/codex-session-settings.js +1 -1
- package/neural-interface/lib/codex-settings-schema.js +122 -0
- package/neural-interface/lib/desktop/config.js +3 -0
- package/neural-interface/lib/exec-loop-command.js +3 -1
- package/neural-interface/lib/git-bash/bzip2.js +339 -0
- package/neural-interface/lib/git-bash/claude-settings.js +73 -0
- package/neural-interface/lib/git-bash/extract-worker.js +34 -0
- package/neural-interface/lib/git-bash/install.js +529 -0
- package/neural-interface/lib/git-bash/licenses/COPYING +360 -0
- package/neural-interface/lib/git-bash/licenses/LGPL-2.1 +511 -0
- package/neural-interface/lib/git-bash/manager.js +268 -0
- package/neural-interface/lib/git-bash/pins.js +206 -0
- package/neural-interface/lib/git-bash/pins.json +34 -0
- package/neural-interface/lib/git-bash/resolver.js +194 -0
- package/neural-interface/lib/git-read.js +34 -2
- package/neural-interface/lib/install-details.js +163 -0
- package/neural-interface/lib/mcp-installer.js +14 -2
- package/neural-interface/lib/native-loop-providers.js +22 -4
- package/neural-interface/lib/native-loop-runtime.js +9 -4
- package/neural-interface/lib/os-path.js +319 -0
- package/neural-interface/lib/provider-panel-api-key-auth.js +92 -0
- package/neural-interface/lib/provider-panel-terminal-auth.js +96 -0
- package/neural-interface/lib/pty-host/core.js +2 -1
- package/neural-interface/lib/pty-host/manager.js +27 -2
- package/neural-interface/lib/remote-policy.js +20 -11
- package/neural-interface/lib/session-indexer.js +3 -1
- package/neural-interface/lib/session-title-generator.js +6 -3
- package/neural-interface/lib/system-about.js +340 -0
- package/neural-interface/lib/system-activity.js +66 -0
- package/neural-interface/lib/terminal-env.js +11 -3
- package/neural-interface/lib/terminal-path.js +55 -0
- package/neural-interface/lib/virtual-socket.js +12 -1
- package/neural-interface/lib/whatsapp/baileys-adapter.js +165 -45
- package/neural-interface/lib/whatsapp/bridge.js +78 -34
- package/neural-interface/lib/whatsapp/commands.js +13 -14
- package/neural-interface/lib/whatsapp/config.js +134 -20
- package/neural-interface/lib/whatsapp/fake-baileys.js +99 -14
- package/neural-interface/lib/whatsapp/host-core.js +168 -35
- package/neural-interface/lib/whatsapp/inbound.js +5 -3
- package/neural-interface/lib/whatsapp/local-file.js +524 -0
- package/neural-interface/lib/whatsapp/manager.js +92 -32
- package/neural-interface/lib/whatsapp/paths.js +11 -1
- package/neural-interface/lib/whatsapp/protocol.js +65 -5
- package/neural-interface/lib/whatsapp/redact.js +63 -0
- package/neural-interface/lib/whatsapp/service.js +343 -91
- package/neural-interface/lib/whatsapp/transcription.js +463 -0
- package/neural-interface/package-lock.json +2 -2
- package/neural-interface/package.json +1 -1
- package/neural-interface/public/index.html +2 -0
- package/neural-interface/public/index2d.html +2 -0
- package/neural-interface/public/offline.html +16 -1
- package/neural-interface/public/onboarding.html +96 -2
- package/neural-interface/public/shared/account-i18n.js +7 -0
- package/neural-interface/public/shared/account-menu.js +542 -0
- package/neural-interface/public/shared/account-usage.js +79 -0
- package/neural-interface/public/shared/account-view.js +336 -0
- package/neural-interface/public/shared/agent-runtime-options.js +28 -8
- package/neural-interface/public/shared/assistant/asst-account-menu.js +298 -0
- package/neural-interface/public/shared/assistant/asst-accounts.js +182 -184
- package/neural-interface/public/shared/assistant/asst-api.js +39 -2
- package/neural-interface/public/shared/assistant/asst-brain-picker.js +288 -32
- package/neural-interface/public/shared/assistant/asst-budget.js +259 -303
- package/neural-interface/public/shared/assistant/asst-mascot.js +126 -7
- package/neural-interface/public/shared/assistant/asst-menu.js +219 -80
- package/neural-interface/public/shared/assistant/asst-model-chip.js +135 -0
- package/neural-interface/public/shared/assistant/asst-panel.js +87 -16
- package/neural-interface/public/shared/assistant/asst-render.js +38 -7
- package/neural-interface/public/shared/assistant/asst-route.js +72 -14
- package/neural-interface/public/shared/assistant/asst-routes-editor.js +45 -6
- package/neural-interface/public/shared/assistant/asst-slash.js +1 -1
- package/neural-interface/public/shared/assistant/asst-state.js +1 -1
- package/neural-interface/public/shared/assistant/asst-styles.js +160 -29
- package/neural-interface/public/shared/cdx/cdx-commands.js +4 -1
- package/neural-interface/public/shared/cdx/cdx-features.js +22 -14
- package/neural-interface/public/shared/cdx/cdx-icons.js +2 -0
- package/neural-interface/public/shared/cdx/cdx-panel.js +49 -108
- package/neural-interface/public/shared/cdx/cdx-settings.js +231 -0
- package/neural-interface/public/shared/cdx/cdx-styles.js +172 -111
- package/neural-interface/public/shared/cdx/cdx-tabs.js +264 -664
- package/neural-interface/public/shared/cdx/cdx-ws.js +2 -0
- package/neural-interface/public/shared/claude-account-view.js +3 -0
- package/neural-interface/public/shared/cli-install-view.js +392 -0
- package/neural-interface/public/shared/cli-status.js +282 -22
- package/neural-interface/public/shared/cp/cp-events.js +2 -1
- package/neural-interface/public/shared/cp/cp-styles.js +46 -0
- package/neural-interface/public/shared/desktop-bridge.js +39 -0
- package/neural-interface/public/shared/desktop-titlebar-page.js +59 -0
- package/neural-interface/public/shared/desktop-titlebar-view.js +122 -0
- package/neural-interface/public/shared/desktop-titlebar.js +153 -0
- package/neural-interface/public/shared/desktop-update-view.js +462 -0
- package/neural-interface/public/shared/editor/editor-panel.js +1 -1
- package/neural-interface/public/shared/explorer/fx-main.js +1 -1
- package/neural-interface/public/shared/git-bash-view.js +145 -0
- package/neural-interface/public/shared/html-shell.js +1 -0
- package/neural-interface/public/shared/i18n.js +19 -1
- package/neural-interface/public/shared/install-details-view.js +86 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +4 -1
- package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +36 -1
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +17 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +169 -2
- package/neural-interface/public/shared/pwa-install-page.js +3 -1
- package/neural-interface/public/shared/settings/settings-about-pane.js +271 -0
- package/neural-interface/public/shared/settings/settings-about.js +254 -0
- package/neural-interface/public/shared/settings/settings-ia.js +15 -0
- package/neural-interface/public/shared/showcase-privacy.js +490 -0
- package/neural-interface/public/shared/storage.js +30 -3
- package/neural-interface/public/shared/styles.css +281 -32
- package/neural-interface/public/shared/synabun-mascot.js +48 -2
- package/neural-interface/public/shared/ui-claude-panel.js +262 -217
- package/neural-interface/public/shared/ui-cli-banner.js +355 -0
- package/neural-interface/public/shared/ui-explorer.js +2 -0
- package/neural-interface/public/shared/ui-git-bash.js +124 -0
- package/neural-interface/public/shared/ui-judgments.js +10 -1
- package/neural-interface/public/shared/ui-loading.js +30 -6
- package/neural-interface/public/shared/ui-menubar.js +13 -3
- package/neural-interface/public/shared/ui-navbar.js +3 -1
- package/neural-interface/public/shared/ui-provider-auth.js +104 -0
- package/neural-interface/public/shared/ui-provider-terminal-auth.js +223 -0
- package/neural-interface/public/shared/ui-sessions.js +9 -3
- package/neural-interface/public/shared/ui-settings.js +55 -3
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +3 -1
- package/neural-interface/public/shared/ui-sync.js +8 -0
- package/neural-interface/public/shared/ui-terminal.js +17 -0
- package/neural-interface/public/shared/ui-tool-updates.js +5 -0
- package/neural-interface/public/shared/ui-update.js +598 -7
- package/neural-interface/public/shared/ui-whatsapp.js +21 -6
- package/neural-interface/public/shared/whatsapp/wa-view.js +51 -8
- package/neural-interface/public/shared/worker-end.js +2 -0
- package/neural-interface/public/sw.js +1 -1
- package/neural-interface/public/variant/2d/main.js +10 -1
- package/neural-interface/public/variant/3d/main.js +10 -1
- package/neural-interface/scripts/rebuild-pty.js +14 -2
- package/neural-interface/server.js +1384 -679
- package/npm-shrinkwrap.json +4424 -0
- package/package.json +57 -2
- package/postinstall.js +61 -47
- package/preuninstall.js +8 -35
- package/setup.js +80 -47
- package/skills/synabun/modules/idea.md +1 -1
- package/skills/synabun/modules/schedule.md +1 -1
- package/updater.cmd +2 -2
- package/updater.mjs +97 -3
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
// Claude and Codex accounts as every surface shows them: each side panel's
|
|
2
|
+
// header account menu (public/shared/account-menu.js), its sign-in screen, the
|
|
3
|
+
// Assistant's brain picker and accounts manager. The rows come from the server
|
|
4
|
+
// (lib/claude-accounts.js and lib/codex-accounts.js describe(): provider, mode,
|
|
5
|
+
// signedIn, identity, subscription, apiKey); this module only decides the words
|
|
6
|
+
// and what a choice does. No imports and no DOM: node --test loads it.
|
|
7
|
+
//
|
|
8
|
+
// ACCOUNT_COPY is the English; `accounts.*` in i18n/en.json must equal it and
|
|
9
|
+
// i18n/pt-BR.json translates it. A page hands its translator in once
|
|
10
|
+
// (setAccountTranslator); without one (a test, a detached window before i18n
|
|
11
|
+
// loads) the English is used.
|
|
12
|
+
|
|
13
|
+
export const ACCOUNT_COPY = Object.freeze({
|
|
14
|
+
subscriptionBadge: '{service} account',
|
|
15
|
+
apiKeyBadge: 'API key',
|
|
16
|
+
apiShort: 'API',
|
|
17
|
+
signedOut: 'Signed out',
|
|
18
|
+
checking: 'Checking…',
|
|
19
|
+
keyUnreadable: 'Key unreadable',
|
|
20
|
+
defaultName: 'Default',
|
|
21
|
+
current: 'This tab',
|
|
22
|
+
nowNote: 'Applies now: the next message runs under {label}.',
|
|
23
|
+
nextNote: 'This chat stays on {current}. {label} opens in a new chat.',
|
|
24
|
+
sameNote: 'This tab already uses {label}.',
|
|
25
|
+
missingNote: 'That account is no longer set up. Choose another one.',
|
|
26
|
+
menuNoteNow: 'The account you pick applies from the next message.',
|
|
27
|
+
menuNoteChat: 'This chat stays on {label}. Picking another account opens a new chat.',
|
|
28
|
+
newChatUnder: 'This chat runs under {label}.',
|
|
29
|
+
tooManyTabs: 'Close a tab first: the most tabs are open.',
|
|
30
|
+
menuTitle: '{provider} accounts',
|
|
31
|
+
triggerLabel: '{provider} account: {summary}',
|
|
32
|
+
manage: 'Manage {label}',
|
|
33
|
+
back: 'All accounts',
|
|
34
|
+
addAccount: 'Add account',
|
|
35
|
+
refresh: 'Refresh',
|
|
36
|
+
subscriptionShort: 'Subscription',
|
|
37
|
+
emptyAccounts: 'No accounts yet.',
|
|
38
|
+
usageLeft: '{percent}% left',
|
|
39
|
+
usageLimited: 'Limit reached',
|
|
40
|
+
usageResets: 'Resets {time}',
|
|
41
|
+
reading: 'Reading the accounts…',
|
|
42
|
+
readFailed: 'Could not read the accounts. Try again.',
|
|
43
|
+
needsServer: 'Choosing an account needs a newer SynaBun server: restart it to enable this.',
|
|
44
|
+
otherAccounts: 'Other accounts…',
|
|
45
|
+
uses: 'Uses',
|
|
46
|
+
usesGroup: 'What {label} uses',
|
|
47
|
+
credSubscription: '{service} subscription',
|
|
48
|
+
credApiKey: 'API key',
|
|
49
|
+
inUse: 'in use',
|
|
50
|
+
signedIn: 'Signed in',
|
|
51
|
+
notSignedIn: 'Not signed in',
|
|
52
|
+
notChecked: 'Not checked yet',
|
|
53
|
+
noKey: 'None',
|
|
54
|
+
savedKey: 'Saved',
|
|
55
|
+
keyUnreadableLong: 'Saved key cannot be read: save it again',
|
|
56
|
+
keyKeptBy: '{hint}, kept by {cli}',
|
|
57
|
+
signIn: 'Sign in with {service}',
|
|
58
|
+
useApiKey: 'Use an API key',
|
|
59
|
+
signOut: 'Sign out',
|
|
60
|
+
removeKey: 'Remove key',
|
|
61
|
+
rename: 'Rename',
|
|
62
|
+
remove: 'Remove account',
|
|
63
|
+
save: 'Save',
|
|
64
|
+
cancel: 'Cancel',
|
|
65
|
+
keyPlaceholder: 'Paste API key',
|
|
66
|
+
keyLabel: 'API key for {label}',
|
|
67
|
+
nameLabel: 'Account name',
|
|
68
|
+
freshPrompt: 'Sign {label} in: with {service} (a terminal opens) or with an API key.',
|
|
69
|
+
signInPending: 'Finish signing in in the terminal. This menu updates when {cli} confirms it.',
|
|
70
|
+
checkingKey: 'Checking the key with {vendor}…',
|
|
71
|
+
keySavedNote: '{label} now uses its API key.',
|
|
72
|
+
modeSetApiKey: '{label} now uses its API key, from the next message.',
|
|
73
|
+
modeSetSubscription: '{label} now uses its {service} account, from the next message.',
|
|
74
|
+
signedOutNote: '{label} is signed out of {service}.',
|
|
75
|
+
keyRemovedNote: 'The API key of {label} was removed.',
|
|
76
|
+
confirmSignOut: 'Sign {label} out of {service}? {cli} removes the subscription login from this account.',
|
|
77
|
+
confirmRemoveKey: 'Remove the API key saved for {label}?',
|
|
78
|
+
confirmRemove: 'Remove {label}? Its folder, its sign-in and its saved key are deleted.',
|
|
79
|
+
busyTurn: 'Finish or stop the current turn first.',
|
|
80
|
+
failed: 'That did not work. Try again.',
|
|
81
|
+
errInvalidKey: "That doesn't look like an {vendor} API key.",
|
|
82
|
+
errOauthToken: "That's a Claude sign-in token. Use Sign in with Claude.",
|
|
83
|
+
errKeyRejected: '{vendor} rejected that key.',
|
|
84
|
+
errPermission: 'Saving keys requires the owner’s SynaBun window. Reload and try again.',
|
|
85
|
+
errAccountUnavailable: 'This account is no longer available. Select an account again.',
|
|
86
|
+
errAccountBusy: 'Finish this account’s work, then try again.',
|
|
87
|
+
errUnreachable: "Couldn't reach {vendor} to check the key. Try again.",
|
|
88
|
+
errUnavailable: "{vendor} couldn't check the key. Try again shortly.",
|
|
89
|
+
errServer: "Couldn't reach SynaBun. Check the connection and try again.",
|
|
90
|
+
errStorage: "Couldn't save the key for this account.",
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// The names each provider's sentences use.
|
|
94
|
+
const PROVIDER_WORDS = Object.freeze({
|
|
95
|
+
claude: Object.freeze({ provider: 'Claude', service: 'Claude', cli: 'Claude Code', vendor: 'Anthropic' }),
|
|
96
|
+
codex: Object.freeze({ provider: 'Codex', service: 'ChatGPT', cli: 'Codex', vendor: 'OpenAI' }),
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
let _translate = null;
|
|
100
|
+
/** A page's translator: (key, params) => the `accounts.<key>` sentence, or null/undefined/the key itself when it has none. */
|
|
101
|
+
export function setAccountTranslator(fn) { _translate = typeof fn === 'function' ? fn : null; }
|
|
102
|
+
|
|
103
|
+
const fill = (text, params = {}) => String(text).replace(/\{(\w+)\}/g, (whole, key) => (params[key] != null ? params[key] : whole));
|
|
104
|
+
|
|
105
|
+
/** The provider of a row ('claude' when it does not say: Claude rows came first). */
|
|
106
|
+
export function rowProvider(row, provider = null) {
|
|
107
|
+
const value = provider || row?.provider;
|
|
108
|
+
return value === 'codex' ? 'codex' : 'claude';
|
|
109
|
+
}
|
|
110
|
+
/** The names a provider's sentences use: { provider, service, cli, vendor }. */
|
|
111
|
+
export function providerWords(provider) {
|
|
112
|
+
return PROVIDER_WORDS[provider === 'codex' ? 'codex' : 'claude'];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** One ACCOUNT_COPY sentence in the page's language, with the provider's names and `params` filled in. */
|
|
116
|
+
export function accountText(key, params = {}, provider = 'claude') {
|
|
117
|
+
const values = { ...providerWords(provider), ...params };
|
|
118
|
+
if (_translate) {
|
|
119
|
+
try {
|
|
120
|
+
const translated = _translate(key, values);
|
|
121
|
+
if (typeof translated === 'string' && translated && translated !== key && translated !== `accounts.${key}`) return fill(translated, values);
|
|
122
|
+
} catch { /* the English below */ }
|
|
123
|
+
}
|
|
124
|
+
return fill(Object.hasOwn(ACCOUNT_COPY, key) ? ACCOUNT_COPY[key] : key, values);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** The id a Claude tab stores for an account ('' is Default, as Claude tabs have always stored it). */
|
|
128
|
+
export function tabAccountId(id) {
|
|
129
|
+
return !id || id === 'default' ? '' : String(id);
|
|
130
|
+
}
|
|
131
|
+
/** The id the server names an account by ('default' for Default). */
|
|
132
|
+
export function serverAccountId(id) {
|
|
133
|
+
return id ? String(id) : 'default';
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** What an account runs on now, as a short badge: { text, tone: ok | warn | muted, mode }. */
|
|
137
|
+
export function accountBadge(row, provider = null) {
|
|
138
|
+
const p = rowProvider(row, provider);
|
|
139
|
+
if (!row) return { text: accountText('signedOut', {}, p), tone: 'warn', mode: null };
|
|
140
|
+
if (row.signedIn === false) {
|
|
141
|
+
return { text: accountText(row.apiKey?.error ? 'keyUnreadable' : 'signedOut', {}, p), tone: 'warn', mode: null };
|
|
142
|
+
}
|
|
143
|
+
if (row.mode === 'apiKey') return { text: accountText('apiKeyBadge', {}, p), tone: 'ok', mode: 'apiKey' };
|
|
144
|
+
if (row.mode === 'subscription' && row.signedIn === true) return { text: accountText('subscriptionBadge', {}, p), tone: 'ok', mode: 'subscription' };
|
|
145
|
+
return { text: accountText('checking', {}, p), tone: 'muted', mode: row.mode || null };
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** A subscription plan as its name ("max" → "Max"); '' for none. */
|
|
149
|
+
export function planName(plan) {
|
|
150
|
+
const value = String(plan || '').trim();
|
|
151
|
+
return value ? value.charAt(0).toUpperCase() + value.slice(1) : '';
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/** Who the account is: an email (with its plan), a masked key ("…abcd"), or ''. Never a key. */
|
|
155
|
+
export function accountIdentity(row) {
|
|
156
|
+
if (!row || row.signedIn === false) return '';
|
|
157
|
+
if (row.mode === 'apiKey') return row.apiKey?.hint || row.identity || '';
|
|
158
|
+
const email = row.subscription?.email || row.identity || '';
|
|
159
|
+
const plan = row.subscription?.plan ? planName(row.subscription.plan) : '';
|
|
160
|
+
return [email, plan].filter(Boolean).join(' · ');
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** The account's name: the one it was given, Default's in the page's language. */
|
|
164
|
+
export function accountName(row, provider = null) {
|
|
165
|
+
if (!row) return '';
|
|
166
|
+
if (row.isDefault || row.id === 'default') return accountText('defaultName', {}, rowProvider(row, provider));
|
|
167
|
+
return row.label || row.id;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/** One line for a menu or a tooltip: "Work · API key · …abcd". */
|
|
171
|
+
export function accountSummary(row, provider = null) {
|
|
172
|
+
if (!row) return '';
|
|
173
|
+
return [accountName(row, provider), accountBadge(row, provider).text, accountIdentity(row)].filter(Boolean).join(' · ');
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/** A compact credential label where the full account summary is available in a tooltip. */
|
|
177
|
+
export function accountCompactMode(row, provider = null) {
|
|
178
|
+
const p = rowProvider(row, provider);
|
|
179
|
+
if (row?.signedIn !== false && row?.mode === 'apiKey') return accountText('apiShort', {}, p);
|
|
180
|
+
if (row?.signedIn === true && row?.mode === 'subscription') return providerWords(p).service;
|
|
181
|
+
return accountBadge(row, p).text;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** Whether a session can be started under the account now (false only when it is known that it cannot). */
|
|
185
|
+
export function accountUsable(row) {
|
|
186
|
+
return !!row && row.signedIn !== false;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** The two modes of an account that holds both credentials, for a switch; [] otherwise. */
|
|
190
|
+
export function modeChoices(row, provider = null) {
|
|
191
|
+
if (!row?.switchable) return [];
|
|
192
|
+
const p = rowProvider(row, provider);
|
|
193
|
+
return [
|
|
194
|
+
{ mode: 'subscription', label: accountText('subscriptionBadge', {}, p), detail: row.subscription?.email || '', current: row.mode === 'subscription' },
|
|
195
|
+
{ mode: 'apiKey', label: accountText('apiKeyBadge', {}, p), detail: row.apiKey?.hint || '', current: row.mode === 'apiKey' },
|
|
196
|
+
];
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* The credentials of an account, each with what can be done about it:
|
|
201
|
+
* [{ kind: 'subscription' | 'apiKey', name, present, text, action: 'signIn' | 'signOut' | 'addKey' | 'removeKey', actionText, inUse }].
|
|
202
|
+
*/
|
|
203
|
+
export function credentialRows(row, provider = null) {
|
|
204
|
+
if (!row) return [];
|
|
205
|
+
const p = rowProvider(row, provider);
|
|
206
|
+
const sub = row.subscription || {};
|
|
207
|
+
const key = row.apiKey || {};
|
|
208
|
+
const subText = sub.signedIn === true
|
|
209
|
+
? [sub.email || accountText('signedIn', {}, p), sub.plan ? planName(sub.plan) : ''].filter(Boolean).join(' · ')
|
|
210
|
+
: accountText(sub.signedIn === false ? 'notSignedIn' : 'notChecked', {}, p);
|
|
211
|
+
let keyText = key.present ? (key.hint || accountText('savedKey', {}, p)) : key.error ? accountText('keyUnreadableLong', {}, p) : accountText('noKey', {}, p);
|
|
212
|
+
// A key Codex itself holds (an older `codex login --with-api-key`): said, so its sign-out is understood.
|
|
213
|
+
if (key.present && key.source === 'codex') keyText = accountText('keyKeptBy', { hint: key.hint || accountText('savedKey', {}, p) }, p);
|
|
214
|
+
const subAction = sub.signedIn === true ? 'signOut' : 'signIn';
|
|
215
|
+
const keyAction = key.present || key.error ? 'removeKey' : 'addKey';
|
|
216
|
+
const actionText = { signIn: accountText('signIn', {}, p), signOut: accountText('signOut', {}, p), addKey: accountText('useApiKey', {}, p), removeKey: accountText('removeKey', {}, p) };
|
|
217
|
+
return [
|
|
218
|
+
{ kind: 'subscription', name: accountText('credSubscription', {}, p), present: sub.signedIn === true, text: subText, action: subAction, actionText: actionText[subAction], inUse: row.mode === 'subscription' && row.signedIn === true },
|
|
219
|
+
{ kind: 'apiKey', name: accountText('credApiKey', {}, p), present: !!key.present, text: keyText, action: keyAction, actionText: actionText[keyAction], inUse: row.mode === 'apiKey' },
|
|
220
|
+
];
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* What picking an account in a tab does. A conversation belongs to the account
|
|
225
|
+
* it started under (its transcript lives in that account's folder), so a tab
|
|
226
|
+
* that has one opens the new account in a new chat.
|
|
227
|
+
* → { effect: 'same' | 'now' | 'next-chat' | 'missing', message }
|
|
228
|
+
*/
|
|
229
|
+
export function accountSwitchPlan({ rows = [], currentId = '', targetId = '', hasConversation = false, provider = null } = {}) {
|
|
230
|
+
const current = rows.find((row) => row.id === serverAccountId(currentId));
|
|
231
|
+
const target = rows.find((row) => row.id === serverAccountId(targetId));
|
|
232
|
+
const p = rowProvider(target || current || rows[0], provider);
|
|
233
|
+
if (!target) return { effect: 'missing', message: accountText('missingNote', {}, p) };
|
|
234
|
+
const label = accountName(target, p);
|
|
235
|
+
if (serverAccountId(currentId) === target.id) return { effect: 'same', message: accountText('sameNote', { label }, p) };
|
|
236
|
+
if (hasConversation) return { effect: 'next-chat', message: accountText('nextNote', { label, current: current ? accountName(current, p) : accountText('defaultName', {}, p) }, p) };
|
|
237
|
+
return { effect: 'now', message: accountText('nowNote', { label }, p) };
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/** The account menu's rows: every account, the current one marked, a signed-out one still choosable (it shows its sign-in). */
|
|
241
|
+
export function accountMenuRows(rows = [], currentId = '', nextId = null, provider = null) {
|
|
242
|
+
return rows.map((row) => {
|
|
243
|
+
const badge = accountBadge(row, provider);
|
|
244
|
+
return {
|
|
245
|
+
id: row.id,
|
|
246
|
+
label: accountName(row, provider),
|
|
247
|
+
badge: badge.text,
|
|
248
|
+
tone: badge.tone,
|
|
249
|
+
identity: accountIdentity(row),
|
|
250
|
+
current: row.id === serverAccountId(currentId),
|
|
251
|
+
next: nextId !== null && row.id === serverAccountId(nextId) && row.id !== serverAccountId(currentId),
|
|
252
|
+
usable: accountUsable(row),
|
|
253
|
+
isDefault: !!row.isDefault || row.id === 'default',
|
|
254
|
+
};
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/** The menu's trigger: the tab's account and what it runs on. A pending next-chat account is shown after an arrow. */
|
|
259
|
+
export function accountChip(rows = [], currentId = '', nextId = null, provider = null) {
|
|
260
|
+
const current = rows.find((row) => row.id === serverAccountId(currentId));
|
|
261
|
+
const next = nextId !== null ? rows.find((row) => row.id === serverAccountId(nextId)) : null;
|
|
262
|
+
const p = rowProvider(current || rows[0], provider);
|
|
263
|
+
const name = current ? accountName(current, p) : (serverAccountId(currentId) === 'default' ? accountText('defaultName', {}, p) : serverAccountId(currentId));
|
|
264
|
+
const badge = current ? accountBadge(current, p) : { text: '', tone: 'muted' };
|
|
265
|
+
const text = next && next.id !== current?.id ? `${name} → ${accountName(next, p)}` : name;
|
|
266
|
+
return { text, badge: badge.text, tone: badge.tone, tooltip: [current ? accountSummary(current, p) : name, next && next.id !== current?.id ? accountText('nextNote', { label: accountName(next, p), current: name }, p) : ''].filter(Boolean).join('\n') };
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* The header account menu, as one model both panels render (account-menu.js):
|
|
271
|
+
* { title, trigger: { name, badge, tone, label }, note, rows }. `hasConversation`:
|
|
272
|
+
* the tab has a conversation, so another account opens in a new chat.
|
|
273
|
+
*/
|
|
274
|
+
export function accountMenuModel({ provider = 'claude', rows = [], currentId = '', hasConversation = false } = {}) {
|
|
275
|
+
const p = provider === 'codex' ? 'codex' : 'claude';
|
|
276
|
+
const chip = accountChip(rows, currentId, null, p);
|
|
277
|
+
const current = rows.find((row) => row.id === serverAccountId(currentId));
|
|
278
|
+
const summary = current ? accountSummary(current, p) : chip.text;
|
|
279
|
+
// The header has little room: the trigger's badge is the short form (the service's name for a
|
|
280
|
+
// subscription); the full words are its label and tooltip.
|
|
281
|
+
const short = current?.mode === 'subscription' && current.signedIn === true ? providerWords(p).service : chip.badge;
|
|
282
|
+
return {
|
|
283
|
+
title: accountText('menuTitle', {}, p),
|
|
284
|
+
trigger: { name: chip.text, badge: chip.badge, short, tone: chip.tone, label: accountText('triggerLabel', { summary }, p) },
|
|
285
|
+
note: hasConversation ? accountText('menuNoteChat', { label: chip.text }, p) : accountText('menuNoteNow', {}, p),
|
|
286
|
+
rows: accountMenuRows(rows, currentId, null, p),
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* One account's management view: its name, what it runs on, the mode switch
|
|
292
|
+
* (both credentials only), each credential with its action, rename and remove
|
|
293
|
+
* (never for Default).
|
|
294
|
+
*/
|
|
295
|
+
export function accountManageModel(row, provider = null) {
|
|
296
|
+
if (!row) return null;
|
|
297
|
+
const p = rowProvider(row, provider);
|
|
298
|
+
const badge = accountBadge(row, p);
|
|
299
|
+
return {
|
|
300
|
+
id: row.id,
|
|
301
|
+
title: accountName(row, p),
|
|
302
|
+
badge: badge.text,
|
|
303
|
+
tone: badge.tone,
|
|
304
|
+
identity: accountIdentity(row),
|
|
305
|
+
usesLabel: accountText('usesGroup', { label: accountName(row, p) }, p),
|
|
306
|
+
modes: modeChoices(row, p),
|
|
307
|
+
credentials: credentialRows(row, p),
|
|
308
|
+
canRename: !(row.isDefault || row.id === 'default'),
|
|
309
|
+
canRemove: !(row.isDefault || row.id === 'default'),
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
const API_KEY_ERROR_KEYS = Object.freeze({
|
|
314
|
+
invalid_key: 'errInvalidKey', oauth_token: 'errOauthToken', key_rejected: 'errKeyRejected', permission_denied: 'errPermission',
|
|
315
|
+
account_unavailable: 'errAccountUnavailable', account_busy: 'errAccountBusy', verification_unreachable: 'errUnreachable',
|
|
316
|
+
verification_unavailable: 'errUnavailable', server_unreachable: 'errServer', storage_failed: 'errStorage',
|
|
317
|
+
});
|
|
318
|
+
/** The sentence for an API-key save error code: only local, allowlisted words, never a provider's error text. */
|
|
319
|
+
export function apiKeyErrorText(provider, code) {
|
|
320
|
+
// An untrusted code never selects an inherited property ("constructor", "__proto__").
|
|
321
|
+
const key = typeof code === 'string' && Object.hasOwn(API_KEY_ERROR_KEYS, code) ? API_KEY_ERROR_KEYS[code] : 'errStorage';
|
|
322
|
+
return accountText(key, {}, provider === 'codex' ? 'codex' : 'claude');
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// The Claude-only names the first callers imported (claude-account-view.js re-exports them).
|
|
326
|
+
export const CLAUDE_ACCOUNT_COPY = Object.freeze({
|
|
327
|
+
subscription: 'Claude account',
|
|
328
|
+
apiKey: ACCOUNT_COPY.apiKeyBadge,
|
|
329
|
+
signedOut: ACCOUNT_COPY.signedOut,
|
|
330
|
+
checking: ACCOUNT_COPY.checking,
|
|
331
|
+
keyUnreadable: ACCOUNT_COPY.keyUnreadable,
|
|
332
|
+
defaultName: ACCOUNT_COPY.defaultName,
|
|
333
|
+
current: ACCOUNT_COPY.current,
|
|
334
|
+
signInClaude: 'Sign in with Claude',
|
|
335
|
+
useApiKey: ACCOUNT_COPY.useApiKey,
|
|
336
|
+
});
|
|
@@ -301,21 +301,27 @@ export async function fetchCodexModels(force = false, accountId = 'default') {
|
|
|
301
301
|
|
|
302
302
|
let _codexAccountsCache = null;
|
|
303
303
|
let _codexAccountsLoading = null;
|
|
304
|
+
let _codexWorkerAccountId = null;
|
|
305
|
+
const CODEX_DEFAULT_ACCOUNT = { id: 'default', label: 'Default', isDefault: true, provider: 'codex' };
|
|
304
306
|
|
|
305
|
-
//
|
|
306
|
-
//
|
|
307
|
+
// Codex accounts (per-account CODEX_HOME) for the brain picker, the accounts
|
|
308
|
+
// manager and the launch-account selectors. Each row carries its state
|
|
309
|
+
// (lib/codex-accounts.js describe(): mode, signedIn, identity); the assistant's
|
|
310
|
+
// answer also names the account Codex workers use. 'default' is the ambient ~/.codex.
|
|
307
311
|
export async function fetchCodexAccounts(force = false) {
|
|
308
312
|
if (!force && _codexAccountsCache && _codexAccountsCache.length) return _codexAccountsCache;
|
|
309
313
|
if (_codexAccountsLoading) return _codexAccountsLoading;
|
|
310
314
|
_codexAccountsLoading = (async () => {
|
|
311
315
|
try {
|
|
312
|
-
const resp = await fetch('/api/codex/accounts');
|
|
316
|
+
const resp = await fetch('/api/assistant/codex/accounts', { cache: 'no-store' }).then((r) => (r.ok ? r : fetch('/api/codex/accounts', { cache: 'no-store' })));
|
|
313
317
|
const data = await resp.json().catch(() => ({}));
|
|
314
318
|
const accounts = Array.isArray(data?.accounts) ? data.accounts : [];
|
|
315
|
-
|
|
319
|
+
_codexWorkerAccountId = typeof data?.workerAccountId === 'string' && data.workerAccountId ? data.workerAccountId : null;
|
|
320
|
+
const withDefault = accounts.some((a) => a?.id === 'default') ? accounts : [CODEX_DEFAULT_ACCOUNT, ...accounts];
|
|
321
|
+
_codexAccountsCache = withDefault.map((a) => (a.id === 'default' ? { ...CODEX_DEFAULT_ACCOUNT, ...a, isDefault: true } : a));
|
|
316
322
|
return _codexAccountsCache;
|
|
317
323
|
} catch {
|
|
318
|
-
_codexAccountsCache = [
|
|
324
|
+
_codexAccountsCache = [CODEX_DEFAULT_ACCOUNT];
|
|
319
325
|
return _codexAccountsCache;
|
|
320
326
|
} finally {
|
|
321
327
|
_codexAccountsLoading = null;
|
|
@@ -325,23 +331,32 @@ export async function fetchCodexAccounts(force = false) {
|
|
|
325
331
|
}
|
|
326
332
|
|
|
327
333
|
export function getCachedCodexAccounts() {
|
|
328
|
-
return _codexAccountsCache || [
|
|
334
|
+
return _codexAccountsCache || [CODEX_DEFAULT_ACCOUNT];
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/** The Codex account dispatched Codex workers use when a dispatch names none ('default' when unset). */
|
|
338
|
+
export function getCodexWorkerAccountId() {
|
|
339
|
+
return _codexWorkerAccountId || 'default';
|
|
329
340
|
}
|
|
330
341
|
|
|
331
342
|
const CLAUDE_DEFAULT_ACCOUNT = { id: 'default', label: 'Default', isDefault: true };
|
|
332
343
|
let _claudeAccountsCache = null;
|
|
333
344
|
let _claudeAccountsLoading = null;
|
|
345
|
+
let _claudeWorkerAccountId = null;
|
|
334
346
|
|
|
335
347
|
// Claude account profiles (per-account CLAUDE_CONFIG_DIR) — served by the
|
|
336
|
-
// assistant API. 'default' is the ambient ~/.claude and always exists.
|
|
348
|
+
// assistant API. 'default' is the ambient ~/.claude and always exists. Each
|
|
349
|
+
// row carries its state (lib/claude-accounts.js describe(): mode, signedIn,
|
|
350
|
+
// identity); the answer also names the account Claude Code workers use.
|
|
337
351
|
export async function fetchClaudeAccounts(force = false) {
|
|
338
352
|
if (!force && _claudeAccountsCache && _claudeAccountsCache.length) return _claudeAccountsCache;
|
|
339
353
|
if (_claudeAccountsLoading) return _claudeAccountsLoading;
|
|
340
354
|
_claudeAccountsLoading = (async () => {
|
|
341
355
|
try {
|
|
342
|
-
const resp = await fetch('/api/assistant/claude/accounts');
|
|
356
|
+
const resp = await fetch('/api/assistant/claude/accounts', { cache: 'no-store' });
|
|
343
357
|
const data = await resp.json().catch(() => ({}));
|
|
344
358
|
const accounts = Array.isArray(data?.accounts) ? data.accounts : [];
|
|
359
|
+
_claudeWorkerAccountId = typeof data?.workerAccountId === 'string' && data.workerAccountId ? data.workerAccountId : null;
|
|
345
360
|
const withDefault = accounts.some(a => a?.id === 'default') ? accounts : [CLAUDE_DEFAULT_ACCOUNT, ...accounts];
|
|
346
361
|
_claudeAccountsCache = withDefault.map(a => (a.id === 'default' ? { ...CLAUDE_DEFAULT_ACCOUNT, ...a, isDefault: true } : a));
|
|
347
362
|
return _claudeAccountsCache;
|
|
@@ -359,6 +374,11 @@ export function getCachedClaudeAccounts() {
|
|
|
359
374
|
return _claudeAccountsCache || [CLAUDE_DEFAULT_ACCOUNT];
|
|
360
375
|
}
|
|
361
376
|
|
|
377
|
+
/** The Claude account dispatched Claude Code workers use when a dispatch names none ('default' when unset). */
|
|
378
|
+
export function getClaudeWorkerAccountId() {
|
|
379
|
+
return _claudeWorkerAccountId || 'default';
|
|
380
|
+
}
|
|
381
|
+
|
|
362
382
|
let _opencodeAgentsCache = null;
|
|
363
383
|
let _opencodeAgentsLoading = null;
|
|
364
384
|
|