@aitne/dashboard 0.1.4 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +5 -1
- package/.next/build-manifest.json +3 -3
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/diagnostics/route-bundle-stats.json +450 -356
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +96 -0
- package/.next/routes-manifest.json +24 -0
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +15 -15
- package/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
- package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/activity/page.js.nft.json +1 -1
- package/.next/server/app/activity/page_client-reference-manifest.js +1 -1
- package/.next/server/app/activity.html +1 -1
- package/.next/server/app/activity.rsc +19 -19
- package/.next/server/app/activity.segments/_full.segment.rsc +19 -19
- package/.next/server/app/activity.segments/_head.segment.rsc +4 -4
- package/.next/server/app/activity.segments/_index.segment.rsc +10 -10
- package/.next/server/app/activity.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/activity.segments/activity/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/activity.segments/activity.segment.rsc +4 -4
- package/.next/server/app/analytics/page.js.nft.json +1 -1
- package/.next/server/app/analytics/page_client-reference-manifest.js +1 -1
- package/.next/server/app/analytics.html +1 -1
- package/.next/server/app/analytics.rsc +19 -19
- package/.next/server/app/analytics.segments/_full.segment.rsc +19 -19
- package/.next/server/app/analytics.segments/_head.segment.rsc +4 -4
- package/.next/server/app/analytics.segments/_index.segment.rsc +10 -10
- package/.next/server/app/analytics.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/analytics.segments/analytics/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/analytics.segments/analytics.segment.rsc +4 -4
- package/.next/server/app/api/[...path]/route.js +1 -1
- package/.next/server/app/api/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/chat/page.js.nft.json +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/chat.html +1 -1
- package/.next/server/app/chat.rsc +17 -17
- package/.next/server/app/chat.segments/_full.segment.rsc +17 -17
- package/.next/server/app/chat.segments/_head.segment.rsc +4 -4
- package/.next/server/app/chat.segments/_index.segment.rsc +10 -10
- package/.next/server/app/chat.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/chat.segments/chat.segment.rsc +3 -3
- package/.next/server/app/connections/calendar/page.js.nft.json +1 -1
- package/.next/server/app/connections/calendar/page_client-reference-manifest.js +1 -1
- package/.next/server/app/connections/calendar.html +1 -1
- package/.next/server/app/connections/calendar.rsc +18 -18
- package/.next/server/app/connections/calendar.segments/_full.segment.rsc +18 -18
- package/.next/server/app/connections/calendar.segments/_head.segment.rsc +4 -4
- package/.next/server/app/connections/calendar.segments/_index.segment.rsc +10 -10
- package/.next/server/app/connections/calendar.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/connections/calendar.segments/connections/calendar/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/connections/calendar.segments/connections/calendar.segment.rsc +3 -3
- package/.next/server/app/connections/calendar.segments/connections.segment.rsc +4 -4
- package/.next/server/app/connections/journal/page.js.nft.json +1 -1
- package/.next/server/app/connections/journal/page_client-reference-manifest.js +1 -1
- package/.next/server/app/connections/journal.html +1 -1
- package/.next/server/app/connections/journal.rsc +16 -16
- package/.next/server/app/connections/journal.segments/_full.segment.rsc +16 -16
- package/.next/server/app/connections/journal.segments/_head.segment.rsc +4 -4
- package/.next/server/app/connections/journal.segments/_index.segment.rsc +10 -10
- package/.next/server/app/connections/journal.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/connections/journal.segments/connections/journal/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/connections/journal.segments/connections/journal.segment.rsc +3 -3
- package/.next/server/app/connections/journal.segments/connections.segment.rsc +4 -4
- package/.next/server/app/connections/knowledge/page.js.nft.json +1 -1
- package/.next/server/app/connections/knowledge/page_client-reference-manifest.js +1 -1
- package/.next/server/app/connections/knowledge.html +1 -1
- package/.next/server/app/connections/knowledge.rsc +18 -18
- package/.next/server/app/connections/knowledge.segments/_full.segment.rsc +18 -18
- package/.next/server/app/connections/knowledge.segments/_head.segment.rsc +4 -4
- package/.next/server/app/connections/knowledge.segments/_index.segment.rsc +10 -10
- package/.next/server/app/connections/knowledge.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/connections/knowledge.segments/connections/knowledge/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/connections/knowledge.segments/connections/knowledge.segment.rsc +3 -3
- package/.next/server/app/connections/knowledge.segments/connections.segment.rsc +4 -4
- package/.next/server/app/connections/mail/page.js.nft.json +1 -1
- package/.next/server/app/connections/mail/page_client-reference-manifest.js +1 -1
- package/.next/server/app/connections/mail.html +1 -1
- package/.next/server/app/connections/mail.rsc +18 -18
- package/.next/server/app/connections/mail.segments/_full.segment.rsc +18 -18
- package/.next/server/app/connections/mail.segments/_head.segment.rsc +4 -4
- package/.next/server/app/connections/mail.segments/_index.segment.rsc +10 -10
- package/.next/server/app/connections/mail.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/connections/mail.segments/connections/mail/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/connections/mail.segments/connections/mail.segment.rsc +3 -3
- package/.next/server/app/connections/mail.segments/connections.segment.rsc +4 -4
- package/.next/server/app/connections/mcp/page.js.nft.json +1 -1
- package/.next/server/app/connections/mcp/page_client-reference-manifest.js +1 -1
- package/.next/server/app/connections/mcp.html +1 -1
- package/.next/server/app/connections/mcp.rsc +18 -18
- package/.next/server/app/connections/mcp.segments/_full.segment.rsc +18 -18
- package/.next/server/app/connections/mcp.segments/_head.segment.rsc +4 -4
- package/.next/server/app/connections/mcp.segments/_index.segment.rsc +10 -10
- package/.next/server/app/connections/mcp.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/connections/mcp.segments/connections/mcp/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/connections/mcp.segments/connections/mcp.segment.rsc +3 -3
- package/.next/server/app/connections/mcp.segments/connections.segment.rsc +4 -4
- package/.next/server/app/connections/messaging/page.js.nft.json +1 -1
- package/.next/server/app/connections/messaging/page_client-reference-manifest.js +1 -1
- package/.next/server/app/connections/messaging.html +1 -1
- package/.next/server/app/connections/messaging.rsc +18 -18
- package/.next/server/app/connections/messaging.segments/_full.segment.rsc +18 -18
- package/.next/server/app/connections/messaging.segments/_head.segment.rsc +4 -4
- package/.next/server/app/connections/messaging.segments/_index.segment.rsc +10 -10
- package/.next/server/app/connections/messaging.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/connections/messaging.segments/connections/messaging/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/connections/messaging.segments/connections/messaging.segment.rsc +3 -3
- package/.next/server/app/connections/messaging.segments/connections.segment.rsc +4 -4
- package/.next/server/app/connections/page.js.nft.json +1 -1
- package/.next/server/app/connections/page_client-reference-manifest.js +1 -1
- package/.next/server/app/connections/repositories/page.js.nft.json +1 -1
- package/.next/server/app/connections/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/connections/repositories.html +1 -1
- package/.next/server/app/connections/repositories.rsc +18 -18
- package/.next/server/app/connections/repositories.segments/_full.segment.rsc +18 -18
- package/.next/server/app/connections/repositories.segments/_head.segment.rsc +4 -4
- package/.next/server/app/connections/repositories.segments/_index.segment.rsc +10 -10
- package/.next/server/app/connections/repositories.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/connections/repositories.segments/connections/repositories/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/connections/repositories.segments/connections/repositories.segment.rsc +3 -3
- package/.next/server/app/connections/repositories.segments/connections.segment.rsc +4 -4
- package/.next/server/app/connections/routines/page.js.nft.json +1 -1
- package/.next/server/app/connections/routines/page_client-reference-manifest.js +1 -1
- package/.next/server/app/connections/routines.html +1 -1
- package/.next/server/app/connections/routines.rsc +16 -16
- package/.next/server/app/connections/routines.segments/_full.segment.rsc +16 -16
- package/.next/server/app/connections/routines.segments/_head.segment.rsc +4 -4
- package/.next/server/app/connections/routines.segments/_index.segment.rsc +10 -10
- package/.next/server/app/connections/routines.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/connections/routines.segments/connections/routines/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/connections/routines.segments/connections/routines.segment.rsc +3 -3
- package/.next/server/app/connections/routines.segments/connections.segment.rsc +4 -4
- package/.next/server/app/connections.html +1 -1
- package/.next/server/app/connections.rsc +16 -16
- package/.next/server/app/connections.segments/_full.segment.rsc +16 -16
- package/.next/server/app/connections.segments/_head.segment.rsc +4 -4
- package/.next/server/app/connections.segments/_index.segment.rsc +10 -10
- package/.next/server/app/connections.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/connections.segments/connections/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/connections.segments/connections.segment.rsc +4 -4
- package/.next/server/app/conversations/[id]/page.js.nft.json +1 -1
- package/.next/server/app/conversations/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/conversations/page.js.nft.json +1 -1
- package/.next/server/app/conversations/page_client-reference-manifest.js +1 -1
- package/.next/server/app/conversations.html +1 -1
- package/.next/server/app/conversations.rsc +15 -15
- package/.next/server/app/conversations.segments/_full.segment.rsc +15 -15
- package/.next/server/app/conversations.segments/_head.segment.rsc +4 -4
- package/.next/server/app/conversations.segments/_index.segment.rsc +10 -10
- package/.next/server/app/conversations.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/conversations.segments/conversations/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/conversations.segments/conversations.segment.rsc +3 -3
- package/.next/server/app/docs/[[...slug]]/page.js.nft.json +1 -1
- package/.next/server/app/docs/[[...slug]]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/finance/page.js.nft.json +1 -1
- package/.next/server/app/finance/page_client-reference-manifest.js +1 -1
- package/.next/server/app/finance.html +1 -1
- package/.next/server/app/finance.rsc +17 -17
- package/.next/server/app/finance.segments/_full.segment.rsc +17 -17
- package/.next/server/app/finance.segments/_head.segment.rsc +4 -4
- package/.next/server/app/finance.segments/_index.segment.rsc +10 -10
- package/.next/server/app/finance.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/finance.segments/finance/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/finance.segments/finance.segment.rsc +3 -3
- package/.next/server/app/git/page.js.nft.json +1 -1
- package/.next/server/app/git/page_client-reference-manifest.js +1 -1
- package/.next/server/app/git.html +1 -1
- package/.next/server/app/git.rsc +17 -17
- package/.next/server/app/git.segments/_full.segment.rsc +17 -17
- package/.next/server/app/git.segments/_head.segment.rsc +4 -4
- package/.next/server/app/git.segments/_index.segment.rsc +10 -10
- package/.next/server/app/git.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/git.segments/git/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/git.segments/git.segment.rsc +3 -3
- package/.next/server/app/health/page.js.nft.json +1 -1
- package/.next/server/app/health/page_client-reference-manifest.js +1 -1
- package/.next/server/app/health.html +1 -1
- package/.next/server/app/health.rsc +17 -17
- package/.next/server/app/health.segments/_full.segment.rsc +17 -17
- package/.next/server/app/health.segments/_head.segment.rsc +4 -4
- package/.next/server/app/health.segments/_index.segment.rsc +10 -10
- package/.next/server/app/health.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/health.segments/health/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/health.segments/health.segment.rsc +3 -3
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +17 -17
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/index.segments/_full.segment.rsc +17 -17
- package/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/server/app/index.segments/_index.segment.rsc +10 -10
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/knowledge/page.js.nft.json +1 -1
- package/.next/server/app/knowledge/page_client-reference-manifest.js +1 -1
- package/.next/server/app/knowledge.html +1 -1
- package/.next/server/app/knowledge.rsc +18 -18
- package/.next/server/app/knowledge.segments/_full.segment.rsc +18 -18
- package/.next/server/app/knowledge.segments/_head.segment.rsc +4 -4
- package/.next/server/app/knowledge.segments/_index.segment.rsc +10 -10
- package/.next/server/app/knowledge.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/knowledge.segments/knowledge/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/knowledge.segments/knowledge.segment.rsc +4 -4
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/reading/page.js.nft.json +1 -1
- package/.next/server/app/reading/page_client-reference-manifest.js +1 -1
- package/.next/server/app/reading.html +1 -1
- package/.next/server/app/reading.rsc +17 -17
- package/.next/server/app/reading.segments/_full.segment.rsc +17 -17
- package/.next/server/app/reading.segments/_head.segment.rsc +4 -4
- package/.next/server/app/reading.segments/_index.segment.rsc +10 -10
- package/.next/server/app/reading.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/reading.segments/reading/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/reading.segments/reading.segment.rsc +3 -3
- package/.next/server/app/schedule/page.js.nft.json +1 -1
- package/.next/server/app/schedule/page_client-reference-manifest.js +1 -1
- package/.next/server/app/schedule.html +1 -1
- package/.next/server/app/schedule.rsc +17 -17
- package/.next/server/app/schedule.segments/_full.segment.rsc +17 -17
- package/.next/server/app/schedule.segments/_head.segment.rsc +4 -4
- package/.next/server/app/schedule.segments/_index.segment.rsc +10 -10
- package/.next/server/app/schedule.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/schedule.segments/schedule/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/schedule.segments/schedule.segment.rsc +3 -3
- package/.next/server/app/settings/advanced/page.js.nft.json +1 -1
- package/.next/server/app/settings/advanced/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/advanced.html +1 -1
- package/.next/server/app/settings/advanced.rsc +18 -18
- package/.next/server/app/settings/advanced.segments/_full.segment.rsc +18 -18
- package/.next/server/app/settings/advanced.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/advanced.segments/_index.segment.rsc +10 -10
- package/.next/server/app/settings/advanced.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/advanced.segments/settings/advanced/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings/advanced.segments/settings/advanced.segment.rsc +3 -3
- package/.next/server/app/settings/advanced.segments/settings.segment.rsc +4 -4
- package/.next/server/app/settings/backends/page.js.nft.json +1 -1
- package/.next/server/app/settings/backends/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/backends.html +1 -1
- package/.next/server/app/settings/backends.rsc +16 -16
- package/.next/server/app/settings/backends.segments/_full.segment.rsc +16 -16
- package/.next/server/app/settings/backends.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/backends.segments/_index.segment.rsc +10 -10
- package/.next/server/app/settings/backends.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/backends.segments/settings/backends/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/settings/backends.segments/settings/backends.segment.rsc +3 -3
- package/.next/server/app/settings/backends.segments/settings.segment.rsc +4 -4
- package/.next/server/app/settings/commands/page.js.nft.json +1 -1
- package/.next/server/app/settings/commands/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/commands.html +1 -1
- package/.next/server/app/settings/commands.rsc +18 -18
- package/.next/server/app/settings/commands.segments/_full.segment.rsc +18 -18
- package/.next/server/app/settings/commands.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/commands.segments/_index.segment.rsc +10 -10
- package/.next/server/app/settings/commands.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/commands.segments/settings/commands/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings/commands.segments/settings/commands.segment.rsc +3 -3
- package/.next/server/app/settings/commands.segments/settings.segment.rsc +4 -4
- package/.next/server/app/settings/connections/page.js.nft.json +1 -1
- package/.next/server/app/settings/connections/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/connections.html +1 -1
- package/.next/server/app/settings/connections.rsc +16 -16
- package/.next/server/app/settings/connections.segments/_full.segment.rsc +16 -16
- package/.next/server/app/settings/connections.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/connections.segments/_index.segment.rsc +10 -10
- package/.next/server/app/settings/connections.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/connections.segments/settings/connections/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/settings/connections.segments/settings/connections.segment.rsc +3 -3
- package/.next/server/app/settings/connections.segments/settings.segment.rsc +4 -4
- package/.next/server/app/settings/journal/page.js.nft.json +1 -1
- package/.next/server/app/settings/journal/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/journal.html +1 -1
- package/.next/server/app/settings/journal.rsc +18 -18
- package/.next/server/app/settings/journal.segments/_full.segment.rsc +18 -18
- package/.next/server/app/settings/journal.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/journal.segments/_index.segment.rsc +10 -10
- package/.next/server/app/settings/journal.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/journal.segments/settings/journal/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings/journal.segments/settings/journal.segment.rsc +3 -3
- package/.next/server/app/settings/journal.segments/settings.segment.rsc +4 -4
- package/.next/server/app/settings/management/page.js.nft.json +1 -1
- package/.next/server/app/settings/management/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/management.html +1 -1
- package/.next/server/app/settings/management.rsc +18 -18
- package/.next/server/app/settings/management.segments/_full.segment.rsc +18 -18
- package/.next/server/app/settings/management.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/management.segments/_index.segment.rsc +10 -10
- package/.next/server/app/settings/management.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/management.segments/settings/management/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings/management.segments/settings/management.segment.rsc +3 -3
- package/.next/server/app/settings/management.segments/settings.segment.rsc +4 -4
- package/.next/server/app/settings/messaging/page.js.nft.json +1 -1
- package/.next/server/app/settings/messaging/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/messaging.html +1 -1
- package/.next/server/app/settings/messaging.rsc +16 -16
- package/.next/server/app/settings/messaging.segments/_full.segment.rsc +16 -16
- package/.next/server/app/settings/messaging.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/messaging.segments/_index.segment.rsc +10 -10
- package/.next/server/app/settings/messaging.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/messaging.segments/settings/messaging/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/settings/messaging.segments/settings/messaging.segment.rsc +3 -3
- package/.next/server/app/settings/messaging.segments/settings.segment.rsc +4 -4
- package/.next/server/app/settings/models/page.js.nft.json +1 -1
- package/.next/server/app/settings/models/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/models.html +1 -1
- package/.next/server/app/settings/models.rsc +18 -18
- package/.next/server/app/settings/models.segments/_full.segment.rsc +18 -18
- package/.next/server/app/settings/models.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/models.segments/_index.segment.rsc +10 -10
- package/.next/server/app/settings/models.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/models.segments/settings/models/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings/models.segments/settings/models.segment.rsc +3 -3
- package/.next/server/app/settings/models.segments/settings.segment.rsc +4 -4
- package/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/processes/page.js.nft.json +1 -1
- package/.next/server/app/settings/processes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/processes.html +1 -1
- package/.next/server/app/settings/processes.rsc +16 -16
- package/.next/server/app/settings/processes.segments/_full.segment.rsc +16 -16
- package/.next/server/app/settings/processes.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/processes.segments/_index.segment.rsc +10 -10
- package/.next/server/app/settings/processes.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/processes.segments/settings/processes/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/settings/processes.segments/settings/processes.segment.rsc +3 -3
- package/.next/server/app/settings/processes.segments/settings.segment.rsc +4 -4
- package/.next/server/app/settings/routines/page.js.nft.json +1 -1
- package/.next/server/app/settings/routines/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/routines.html +1 -1
- package/.next/server/app/settings/routines.rsc +18 -18
- package/.next/server/app/settings/routines.segments/_full.segment.rsc +18 -18
- package/.next/server/app/settings/routines.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/routines.segments/_index.segment.rsc +10 -10
- package/.next/server/app/settings/routines.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/routines.segments/settings/routines/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings/routines.segments/settings/routines.segment.rsc +3 -3
- package/.next/server/app/settings/routines.segments/settings.segment.rsc +4 -4
- package/.next/server/app/settings/schedule/page.js.nft.json +1 -1
- package/.next/server/app/settings/schedule/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/schedule.html +1 -1
- package/.next/server/app/settings/schedule.rsc +18 -18
- package/.next/server/app/settings/schedule.segments/_full.segment.rsc +18 -18
- package/.next/server/app/settings/schedule.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/schedule.segments/_index.segment.rsc +10 -10
- package/.next/server/app/settings/schedule.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/schedule.segments/settings/schedule/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings/schedule.segments/settings/schedule.segment.rsc +3 -3
- package/.next/server/app/settings/schedule.segments/settings.segment.rsc +4 -4
- package/.next/server/app/settings/self-learning/page.js.nft.json +1 -1
- package/.next/server/app/settings/self-learning/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/self-learning.html +1 -1
- package/.next/server/app/settings/self-learning.rsc +18 -18
- package/.next/server/app/settings/self-learning.segments/_full.segment.rsc +18 -18
- package/.next/server/app/settings/self-learning.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/self-learning.segments/_index.segment.rsc +10 -10
- package/.next/server/app/settings/self-learning.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/self-learning.segments/settings/self-learning/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings/self-learning.segments/settings/self-learning.segment.rsc +3 -3
- package/.next/server/app/settings/self-learning.segments/settings.segment.rsc +4 -4
- package/.next/server/app/settings/wiki/page/app-paths-manifest.json +3 -0
- package/.next/server/app/settings/wiki/page/build-manifest.json +18 -0
- package/.next/server/app/settings/wiki/page/next-font-manifest.json +6 -0
- package/.next/server/app/settings/wiki/page/react-loadable-manifest.json +8 -0
- package/.next/server/app/settings/wiki/page/server-reference-manifest.json +4 -0
- package/.next/server/app/settings/wiki/page.js +16 -0
- package/.next/server/app/settings/wiki/page.js.map +5 -0
- package/.next/server/app/settings/wiki/page.js.nft.json +1 -0
- package/.next/server/app/settings/wiki/page_client-reference-manifest.js +3 -0
- package/.next/server/app/settings/wiki/timeline/page/app-paths-manifest.json +3 -0
- package/.next/server/app/settings/wiki/timeline/page/build-manifest.json +18 -0
- package/.next/server/app/settings/wiki/timeline/page/next-font-manifest.json +6 -0
- package/.next/server/app/settings/wiki/timeline/page/react-loadable-manifest.json +8 -0
- package/.next/server/app/settings/wiki/timeline/page/server-reference-manifest.json +4 -0
- package/.next/server/app/settings/wiki/timeline/page.js +17 -0
- package/.next/server/app/settings/wiki/timeline/page.js.map +5 -0
- package/.next/server/app/settings/wiki/timeline/page.js.nft.json +1 -0
- package/.next/server/app/settings/wiki/timeline/page_client-reference-manifest.js +3 -0
- package/.next/server/app/settings/wiki/timeline.html +1 -0
- package/.next/server/app/settings/wiki/timeline.meta +17 -0
- package/.next/server/app/settings/wiki/timeline.rsc +24 -0
- package/.next/server/app/settings/wiki/timeline.segments/_full.segment.rsc +24 -0
- package/.next/server/app/settings/wiki/timeline.segments/_head.segment.rsc +6 -0
- package/.next/server/app/settings/wiki/timeline.segments/_index.segment.rsc +11 -0
- package/.next/server/app/settings/wiki/timeline.segments/_tree.segment.rsc +2 -0
- package/.next/server/app/settings/wiki/timeline.segments/settings/wiki/timeline/__PAGE__.segment.rsc +6 -0
- package/.next/server/app/settings/wiki/timeline.segments/settings/wiki/timeline.segment.rsc +5 -0
- package/.next/server/app/settings/wiki/timeline.segments/settings/wiki.segment.rsc +5 -0
- package/.next/server/app/settings/wiki/timeline.segments/settings.segment.rsc +5 -0
- package/.next/server/app/settings/wiki.html +1 -0
- package/.next/server/app/settings/wiki.meta +16 -0
- package/.next/server/app/settings/wiki.rsc +27 -0
- package/.next/server/app/settings/wiki.segments/_full.segment.rsc +27 -0
- package/.next/server/app/settings/wiki.segments/_head.segment.rsc +6 -0
- package/.next/server/app/settings/wiki.segments/_index.segment.rsc +11 -0
- package/.next/server/app/settings/wiki.segments/_tree.segment.rsc +2 -0
- package/.next/server/app/settings/wiki.segments/settings/wiki/__PAGE__.segment.rsc +9 -0
- package/.next/server/app/settings/wiki.segments/settings/wiki.segment.rsc +5 -0
- package/.next/server/app/settings/wiki.segments/settings.segment.rsc +5 -0
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +18 -18
- package/.next/server/app/settings.segments/_full.segment.rsc +18 -18
- package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings.segments/_index.segment.rsc +10 -10
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings.segments/settings.segment.rsc +4 -4
- package/.next/server/app/setup/page.js.nft.json +1 -1
- package/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/.next/server/app/setup.html +1 -1
- package/.next/server/app/setup.rsc +17 -17
- package/.next/server/app/setup.segments/_full.segment.rsc +17 -17
- package/.next/server/app/setup.segments/_head.segment.rsc +4 -4
- package/.next/server/app/setup.segments/_index.segment.rsc +10 -10
- package/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/setup.segments/setup.segment.rsc +3 -3
- package/.next/server/app/trip/page.js.nft.json +1 -1
- package/.next/server/app/trip/page_client-reference-manifest.js +1 -1
- package/.next/server/app/trip.html +1 -1
- package/.next/server/app/trip.rsc +17 -17
- package/.next/server/app/trip.segments/_full.segment.rsc +17 -17
- package/.next/server/app/trip.segments/_head.segment.rsc +4 -4
- package/.next/server/app/trip.segments/_index.segment.rsc +10 -10
- package/.next/server/app/trip.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/trip.segments/trip/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/trip.segments/trip.segment.rsc +3 -3
- package/.next/server/app/wiki/page/app-paths-manifest.json +3 -0
- package/.next/server/app/wiki/page/build-manifest.json +18 -0
- package/.next/server/app/wiki/page/next-font-manifest.json +6 -0
- package/.next/server/app/wiki/page/react-loadable-manifest.json +8 -0
- package/.next/server/app/wiki/page/server-reference-manifest.json +4 -0
- package/.next/server/app/wiki/page.js +15 -0
- package/.next/server/app/wiki/page.js.map +5 -0
- package/.next/server/app/wiki/page.js.nft.json +1 -0
- package/.next/server/app/wiki/page_client-reference-manifest.js +3 -0
- package/.next/server/app/wiki/timeline/page/app-paths-manifest.json +3 -0
- package/.next/server/app/wiki/timeline/page/build-manifest.json +18 -0
- package/.next/server/app/wiki/timeline/page/next-font-manifest.json +6 -0
- package/.next/server/app/wiki/timeline/page/react-loadable-manifest.json +8 -0
- package/.next/server/app/wiki/timeline/page/server-reference-manifest.json +4 -0
- package/.next/server/app/wiki/timeline/page.js +15 -0
- package/.next/server/app/wiki/timeline/page.js.map +5 -0
- package/.next/server/app/wiki/timeline/page.js.nft.json +1 -0
- package/.next/server/app/wiki/timeline/page_client-reference-manifest.js +3 -0
- package/.next/server/app/wiki/timeline.html +1 -0
- package/.next/server/app/wiki/timeline.meta +16 -0
- package/.next/server/app/wiki/timeline.rsc +26 -0
- package/.next/server/app/wiki/timeline.segments/_full.segment.rsc +26 -0
- package/.next/server/app/wiki/timeline.segments/_head.segment.rsc +6 -0
- package/.next/server/app/wiki/timeline.segments/_index.segment.rsc +11 -0
- package/.next/server/app/wiki/timeline.segments/_tree.segment.rsc +2 -0
- package/.next/server/app/wiki/timeline.segments/wiki/timeline/__PAGE__.segment.rsc +9 -0
- package/.next/server/app/wiki/timeline.segments/wiki/timeline.segment.rsc +5 -0
- package/.next/server/app/wiki/timeline.segments/wiki.segment.rsc +5 -0
- package/.next/server/app/wiki.html +1 -0
- package/.next/server/app/wiki.meta +15 -0
- package/.next/server/app/wiki.rsc +26 -0
- package/.next/server/app/wiki.segments/_full.segment.rsc +26 -0
- package/.next/server/app/wiki.segments/_head.segment.rsc +6 -0
- package/.next/server/app/wiki.segments/_index.segment.rsc +11 -0
- package/.next/server/app/wiki.segments/_tree.segment.rsc +2 -0
- package/.next/server/app/wiki.segments/wiki/__PAGE__.segment.rsc +9 -0
- package/.next/server/app/wiki.segments/wiki.segment.rsc +5 -0
- package/.next/server/app-paths-manifest.json +5 -1
- package/.next/server/chunks/0z~i_next_dist_esm_build_templates_app-route_0o_o_hp.js +1 -1
- package/.next/server/chunks/0z~i_next_dist_esm_build_templates_app-route_0o_o_hp.js.map +1 -1
- package/.next/server/chunks/{[root-of-the-server]__00gp8gz._.js → [root-of-the-server]__01knfi.._.js} +1 -1
- package/.next/server/chunks/{[root-of-the-server]__0-0wgko._.js → [root-of-the-server]__08_s4yo._.js} +2 -2
- package/.next/server/chunks/ssr/0juq_dashboard__next-internal_server_app_settings_wiki_timeline_page_actions_0czqn6z.js +3 -0
- package/.next/server/chunks/ssr/0juq_dashboard__next-internal_server_app_settings_wiki_timeline_page_actions_0czqn6z.js.map +1 -0
- package/.next/server/chunks/ssr/0mzu_lucide-react_dist_esm_icons_zap_115-27i.js +3 -0
- package/.next/server/chunks/ssr/0mzu_lucide-react_dist_esm_icons_zap_115-27i.js.map +1 -0
- package/.next/server/chunks/ssr/0z~i_next_dist_esm_build_templates_app-page_0k3x-na.js +4 -0
- package/.next/server/chunks/ssr/0z~i_next_dist_esm_build_templates_app-page_0k3x-na.js.map +1 -0
- package/.next/server/chunks/ssr/0z~i_next_dist_esm_build_templates_app-page_0km22.v.js +4 -0
- package/.next/server/chunks/ssr/0z~i_next_dist_esm_build_templates_app-page_0km22.v.js.map +1 -0
- package/.next/server/chunks/ssr/0z~i_next_dist_esm_build_templates_app-page_0vui1gx.js +4 -0
- package/.next/server/chunks/ssr/0z~i_next_dist_esm_build_templates_app-page_0vui1gx.js.map +1 -0
- package/.next/server/chunks/ssr/0z~i_next_dist_esm_build_templates_app-page_11h319t.js +4 -0
- package/.next/server/chunks/ssr/0z~i_next_dist_esm_build_templates_app-page_11h319t.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__007ymqm._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__007ymqm._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__00vjce2._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__00vjce2._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__07pkvm3._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__07pkvm3._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0dfuz7_._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0dfuz7_._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__117dw_l._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__117dw_l._.js.map +1 -0
- package/.next/server/chunks/ssr/_0-3uzu1._.js +3 -0
- package/.next/server/chunks/ssr/_0-3uzu1._.js.map +1 -0
- package/.next/server/chunks/ssr/_0-6jgyg._.js +3 -0
- package/.next/server/chunks/ssr/_0-6jgyg._.js.map +1 -0
- package/.next/server/chunks/ssr/_0-fv_sr._.js +1 -1
- package/.next/server/chunks/ssr/_0-fv_sr._.js.map +1 -1
- package/.next/server/chunks/ssr/_0.7pki~._.js +3 -0
- package/.next/server/chunks/ssr/_0.7pki~._.js.map +1 -0
- package/.next/server/chunks/ssr/_02s86rg._.js +3 -0
- package/.next/server/chunks/ssr/_02s86rg._.js.map +1 -0
- package/.next/server/chunks/ssr/_03bq.de._.js +3 -0
- package/.next/server/chunks/ssr/_03bq.de._.js.map +1 -0
- package/.next/server/chunks/ssr/_03u6ja0._.js +3 -0
- package/.next/server/chunks/ssr/_03u6ja0._.js.map +1 -0
- package/.next/server/chunks/ssr/_04-.z69._.js +3 -0
- package/.next/server/chunks/ssr/_04-.z69._.js.map +1 -0
- package/.next/server/chunks/ssr/_05rlac0._.js +3 -0
- package/.next/server/chunks/ssr/_05rlac0._.js.map +1 -0
- package/.next/server/chunks/ssr/_05xysbw._.js +3 -0
- package/.next/server/chunks/ssr/_05xysbw._.js.map +1 -0
- package/.next/server/chunks/ssr/_09e_66m._.js +3 -0
- package/.next/server/chunks/ssr/_09e_66m._.js.map +1 -0
- package/.next/server/chunks/ssr/_0_bnan9._.js +3 -0
- package/.next/server/chunks/ssr/_0_bnan9._.js.map +1 -0
- package/.next/server/chunks/ssr/_0b00io4._.js +3 -0
- package/.next/server/chunks/ssr/_0b00io4._.js.map +1 -0
- package/.next/server/chunks/ssr/_0es_2i2._.js +3 -0
- package/.next/server/chunks/ssr/_0es_2i2._.js.map +1 -0
- package/.next/server/chunks/ssr/_0g7_r5i._.js +3 -0
- package/.next/server/chunks/ssr/_0g7_r5i._.js.map +1 -0
- package/.next/server/chunks/ssr/_0hojxqy._.js +1 -1
- package/.next/server/chunks/ssr/_0hojxqy._.js.map +1 -1
- package/.next/server/chunks/ssr/_0ifb9jm._.js +3 -0
- package/.next/server/chunks/ssr/_0ifb9jm._.js.map +1 -0
- package/.next/server/chunks/ssr/_0jl_-u5._.js +3 -0
- package/.next/server/chunks/ssr/_0jl_-u5._.js.map +1 -0
- package/.next/server/chunks/ssr/_0lfuvjg._.js +3 -0
- package/.next/server/chunks/ssr/_0lfuvjg._.js.map +1 -0
- package/.next/server/chunks/ssr/{_0jm~wn-._.js → _0mp7n5i._.js} +2 -2
- package/.next/server/chunks/ssr/{_0jm~wn-._.js.map → _0mp7n5i._.js.map} +1 -1
- package/.next/server/chunks/ssr/_0powsoh._.js +3 -0
- package/.next/server/chunks/ssr/_0powsoh._.js.map +1 -0
- package/.next/server/chunks/ssr/_0q34y9l._.js +3 -0
- package/.next/server/chunks/ssr/_0q34y9l._.js.map +1 -0
- package/.next/server/chunks/ssr/_0q4rpi-._.js +5 -0
- package/.next/server/chunks/ssr/_0q4rpi-._.js.map +1 -0
- package/.next/server/chunks/ssr/_0rc-7d4._.js +3 -0
- package/.next/server/chunks/ssr/_0rc-7d4._.js.map +1 -0
- package/.next/server/chunks/ssr/_0tjsh16._.js +3 -0
- package/.next/server/chunks/ssr/_0tjsh16._.js.map +1 -0
- package/.next/server/chunks/ssr/_0tl98en._.js +1 -1
- package/.next/server/chunks/ssr/_0tl98en._.js.map +1 -1
- package/.next/server/chunks/ssr/{_0._ysx3._.js → _0v_6ros._.js} +2 -2
- package/.next/server/chunks/ssr/_0v_6ros._.js.map +1 -0
- package/.next/server/chunks/ssr/_0vncjim._.js +3 -0
- package/.next/server/chunks/ssr/_0vncjim._.js.map +1 -0
- package/.next/server/chunks/ssr/_0vx-jgf._.js +3 -0
- package/.next/server/chunks/ssr/_0vx-jgf._.js.map +1 -0
- package/.next/server/chunks/ssr/_0w1ez1p._.js +3 -0
- package/.next/server/chunks/ssr/_0w1ez1p._.js.map +1 -0
- package/.next/server/chunks/ssr/_0yl49yk._.js +3 -0
- package/.next/server/chunks/ssr/_0yl49yk._.js.map +1 -0
- package/.next/server/chunks/ssr/_0z1ah9x._.js +1 -1
- package/.next/server/chunks/ssr/_0z1ah9x._.js.map +1 -1
- package/.next/server/chunks/ssr/_0z9ikwn._.js +3 -0
- package/.next/server/chunks/ssr/_0z9ikwn._.js.map +1 -0
- package/.next/server/chunks/ssr/_0z_cp12._.js +3 -0
- package/.next/server/chunks/ssr/_0z_cp12._.js.map +1 -0
- package/.next/server/chunks/ssr/_10hvwg5._.js +3 -0
- package/.next/server/chunks/ssr/_10hvwg5._.js.map +1 -0
- package/.next/server/chunks/ssr/packages_dashboard__next-internal_server_app_settings_wiki_page_actions_12d~w9l.js +3 -0
- package/.next/server/chunks/ssr/packages_dashboard__next-internal_server_app_settings_wiki_page_actions_12d~w9l.js.map +1 -0
- package/.next/server/chunks/ssr/packages_dashboard__next-internal_server_app_wiki_page_actions_026bi.d.js +3 -0
- package/.next/server/chunks/ssr/packages_dashboard__next-internal_server_app_wiki_page_actions_026bi.d.js.map +1 -0
- package/.next/server/chunks/ssr/packages_dashboard__next-internal_server_app_wiki_timeline_page_actions_06jb4gg.js +3 -0
- package/.next/server/chunks/ssr/packages_dashboard__next-internal_server_app_wiki_timeline_page_actions_06jb4gg.js.map +1 -0
- package/.next/server/chunks/ssr/packages_dashboard_src_0bx940s._.js +3 -0
- package/.next/server/chunks/ssr/packages_dashboard_src_0bx940s._.js.map +1 -0
- package/.next/server/chunks/ssr/packages_dashboard_src_0fo7nqq._.js +3 -0
- package/.next/server/chunks/ssr/packages_dashboard_src_0fo7nqq._.js.map +1 -0
- package/.next/server/chunks/ssr/packages_dashboard_src_0uxs9-.._.js +1 -1
- package/.next/server/chunks/ssr/packages_dashboard_src_0uxs9-.._.js.map +1 -1
- package/.next/server/chunks/ssr/packages_dashboard_src_app_activity_page_tsx_08yep46._.js +1 -1
- package/.next/server/chunks/ssr/packages_dashboard_src_app_activity_page_tsx_08yep46._.js.map +1 -1
- package/.next/server/chunks/ssr/packages_dashboard_src_app_connections_repositories_page_tsx_08y6paq._.js +1 -1
- package/.next/server/chunks/ssr/packages_dashboard_src_app_connections_repositories_page_tsx_08y6paq._.js.map +1 -1
- package/.next/server/chunks/ssr/packages_dashboard_src_app_git_page_tsx_0ah19-6._.js +1 -1
- package/.next/server/chunks/ssr/packages_dashboard_src_app_git_page_tsx_0ah19-6._.js.map +1 -1
- package/.next/server/chunks/ssr/packages_dashboard_src_app_schedule_page_tsx_0znc404._.js +1 -1
- package/.next/server/chunks/ssr/packages_dashboard_src_app_schedule_page_tsx_0znc404._.js.map +1 -1
- package/.next/server/chunks/ssr/packages_dashboard_src_app_settings_models_page_tsx_0djsx88._.js +1 -1
- package/.next/server/chunks/ssr/packages_dashboard_src_app_settings_models_page_tsx_0djsx88._.js.map +1 -1
- package/.next/server/chunks/ssr/packages_dashboard_src_app_settings_schedule_page_tsx_0b8zr2l._.js +1 -1
- package/.next/server/chunks/ssr/packages_dashboard_src_app_settings_schedule_page_tsx_0b8zr2l._.js.map +1 -1
- package/.next/server/chunks/ssr/packages_dashboard_src_app_settings_wiki_page_tsx_0..1tkb._.js +3 -0
- package/.next/server/chunks/ssr/packages_dashboard_src_app_settings_wiki_page_tsx_0..1tkb._.js.map +1 -0
- package/.next/server/chunks/ssr/packages_dashboard_src_app_setup_page_tsx_06k3via._.js +1 -1
- package/.next/server/chunks/ssr/packages_dashboard_src_app_setup_page_tsx_06k3via._.js.map +1 -1
- package/.next/server/chunks/ssr/packages_dashboard_src_components_connections_slack-card_tsx_0mahejj._.js +1 -1
- package/.next/server/chunks/ssr/packages_dashboard_src_components_connections_slack-card_tsx_0mahejj._.js.map +1 -1
- package/.next/server/chunks/ssr/packages_dashboard_src_components_settings_backend-settings_tsx_0i-tp_u._.js +3 -0
- package/.next/server/chunks/ssr/packages_dashboard_src_components_settings_backend-settings_tsx_0i-tp_u._.js.map +1 -0
- package/.next/server/chunks/ssr/packages_shared_dist_index_0kuvow-.js +1 -1
- package/.next/server/chunks/ssr/packages_shared_dist_index_0kuvow-.js.map +1 -1
- package/.next/server/middleware/middleware-manifest.json +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/middleware-manifest.json +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/static/chunks/01yix41q.0970.js +1 -0
- package/.next/static/chunks/02qjylw4yp63l.js +1 -0
- package/.next/static/chunks/06y2ddf5x9x_4.js +1 -0
- package/.next/static/chunks/{0ztl~44vjnpe1.js → 08ie9t4zn6n4-.js} +1 -1
- package/.next/static/chunks/091khs5zza4_4.js +1 -0
- package/.next/static/chunks/{0~_56pt8wsmeo.js → 0abhg-m1-acdb.js} +1 -1
- package/.next/static/chunks/0ae.1upy09t--.js +1 -0
- package/.next/static/chunks/0bvcd~k.vfro8.js +1 -0
- package/.next/static/chunks/{0g6.0r0i-wyeg.js → 0eqm47_oikj36.js} +1 -1
- package/.next/static/chunks/0fqugh~hv4my1.js +1 -0
- package/.next/static/chunks/0has04tc4mrik.js +1 -0
- package/.next/static/chunks/0huynm-qbj26k.js +1 -0
- package/.next/static/chunks/0ibq4zul6305p.js +1 -0
- package/.next/static/chunks/0jm_e6e6n~rdn.js +1 -0
- package/.next/static/chunks/0k0.4cksmybb2.js +1 -0
- package/.next/static/chunks/0l07yrtw3fxp5.js +1 -0
- package/.next/static/chunks/0nhqu-sq045x7.js +1 -0
- package/.next/static/chunks/0op3oc-if6n5-.js +3 -0
- package/.next/static/chunks/0p34n6.st3s~1.js +1 -0
- package/.next/static/chunks/0r8nosw42e2m9.js +1 -0
- package/.next/static/chunks/0shx3_mxukfhr.js +1 -0
- package/.next/static/chunks/0thm~t5g5adz1.js +1 -0
- package/.next/static/chunks/0thyr1cngc-j..css +1 -0
- package/.next/static/chunks/0ttdb_354lh4t.js +1 -0
- package/.next/static/chunks/0v..ut2v38yep.js +1 -0
- package/.next/static/chunks/{17npklzvg8-~3.js → 0vhj0k-zy6jhh.js} +1 -1
- package/.next/static/chunks/0wdx410~0~gmn.js +1 -0
- package/.next/static/chunks/0y3ptqa0bbi-h.js +1 -0
- package/.next/static/chunks/{0zbxi2grjtx.c.js → 0zx_~u_zxg_7e.js} +1 -1
- package/.next/static/chunks/{0f3kjzb~5zhc~.js → 10pq~97vgkzro.js} +1 -1
- package/.next/static/chunks/11hlk6.h1of0y.js +1 -0
- package/.next/static/chunks/13w_6v~nprp8j.js +11 -0
- package/.next/static/chunks/14-kkni6ecqaw.js +1 -0
- package/.next/static/chunks/{148a9fv~bo0gq.js → 1555iv~_t.1lp.js} +1 -1
- package/.next/static/chunks/{04bbme2th8s1_.js → 15ec5~pa1pv_z.js} +1 -1
- package/.next/static/chunks/15vc-857cdedi.js +1 -0
- package/.next/static/chunks/16zgco6hwlr-n.js +1 -0
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/.next/types/routes.d.ts +5 -1
- package/.next/types/validator.ts +36 -0
- package/package.json +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__02idks~._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__02idks~._.js.map +0 -1
- package/.next/server/chunks/ssr/_0-8__9s._.js +0 -3
- package/.next/server/chunks/ssr/_0-8__9s._.js.map +0 -1
- package/.next/server/chunks/ssr/_0._ysx3._.js.map +0 -1
- package/.next/server/chunks/ssr/_0.h-tj4._.js +0 -3
- package/.next/server/chunks/ssr/_0.h-tj4._.js.map +0 -1
- package/.next/server/chunks/ssr/_02g4o18._.js +0 -3
- package/.next/server/chunks/ssr/_02g4o18._.js.map +0 -1
- package/.next/server/chunks/ssr/_0463dg_._.js +0 -3
- package/.next/server/chunks/ssr/_0463dg_._.js.map +0 -1
- package/.next/server/chunks/ssr/_04a42pa._.js +0 -3
- package/.next/server/chunks/ssr/_04a42pa._.js.map +0 -1
- package/.next/server/chunks/ssr/_04kt9.8._.js +0 -3
- package/.next/server/chunks/ssr/_04kt9.8._.js.map +0 -1
- package/.next/server/chunks/ssr/_052zlig._.js +0 -3
- package/.next/server/chunks/ssr/_052zlig._.js.map +0 -1
- package/.next/server/chunks/ssr/_060itkv._.js +0 -3
- package/.next/server/chunks/ssr/_060itkv._.js.map +0 -1
- package/.next/server/chunks/ssr/_07p0n9g._.js +0 -3
- package/.next/server/chunks/ssr/_07p0n9g._.js.map +0 -1
- package/.next/server/chunks/ssr/_08mbdt1._.js +0 -3
- package/.next/server/chunks/ssr/_08mbdt1._.js.map +0 -1
- package/.next/server/chunks/ssr/_08r_qwd._.js +0 -3
- package/.next/server/chunks/ssr/_08r_qwd._.js.map +0 -1
- package/.next/server/chunks/ssr/_08xk3kp._.js +0 -3
- package/.next/server/chunks/ssr/_08xk3kp._.js.map +0 -1
- package/.next/server/chunks/ssr/_0938p.1._.js +0 -3
- package/.next/server/chunks/ssr/_0938p.1._.js.map +0 -1
- package/.next/server/chunks/ssr/_0afdsbz._.js +0 -3
- package/.next/server/chunks/ssr/_0afdsbz._.js.map +0 -1
- package/.next/server/chunks/ssr/_0ff5qav._.js +0 -3
- package/.next/server/chunks/ssr/_0ff5qav._.js.map +0 -1
- package/.next/server/chunks/ssr/_0gp8d.p._.js +0 -3
- package/.next/server/chunks/ssr/_0gp8d.p._.js.map +0 -1
- package/.next/server/chunks/ssr/_0k2j6-t._.js +0 -3
- package/.next/server/chunks/ssr/_0k2j6-t._.js.map +0 -1
- package/.next/server/chunks/ssr/_0mix09j._.js +0 -3
- package/.next/server/chunks/ssr/_0mix09j._.js.map +0 -1
- package/.next/server/chunks/ssr/_0mk7dqt._.js +0 -3
- package/.next/server/chunks/ssr/_0mk7dqt._.js.map +0 -1
- package/.next/server/chunks/ssr/_0n168uk._.js +0 -3
- package/.next/server/chunks/ssr/_0n168uk._.js.map +0 -1
- package/.next/server/chunks/ssr/_0nwg6lo._.js +0 -3
- package/.next/server/chunks/ssr/_0nwg6lo._.js.map +0 -1
- package/.next/server/chunks/ssr/_0pwd-nz._.js +0 -3
- package/.next/server/chunks/ssr/_0pwd-nz._.js.map +0 -1
- package/.next/server/chunks/ssr/_0rspzax._.js +0 -3
- package/.next/server/chunks/ssr/_0rspzax._.js.map +0 -1
- package/.next/server/chunks/ssr/_0t-2u_i._.js +0 -3
- package/.next/server/chunks/ssr/_0t-2u_i._.js.map +0 -1
- package/.next/server/chunks/ssr/_0vn5_62._.js +0 -5
- package/.next/server/chunks/ssr/_0vn5_62._.js.map +0 -1
- package/.next/server/chunks/ssr/_0yiz~s5._.js +0 -3
- package/.next/server/chunks/ssr/_0yiz~s5._.js.map +0 -1
- package/.next/server/chunks/ssr/_0~4ta0s._.js +0 -3
- package/.next/server/chunks/ssr/_0~4ta0s._.js.map +0 -1
- package/.next/server/chunks/ssr/_0~5r_8s._.js +0 -3
- package/.next/server/chunks/ssr/_0~5r_8s._.js.map +0 -1
- package/.next/server/chunks/ssr/_115_o9h._.js +0 -3
- package/.next/server/chunks/ssr/_115_o9h._.js.map +0 -1
- package/.next/server/chunks/ssr/_13mk_9n._.js +0 -3
- package/.next/server/chunks/ssr/_13mk_9n._.js.map +0 -1
- package/.next/server/chunks/ssr/packages_dashboard_src_07.4ogy._.js +0 -3
- package/.next/server/chunks/ssr/packages_dashboard_src_07.4ogy._.js.map +0 -1
- package/.next/static/chunks/00p2fat~wl7uz.js +0 -1
- package/.next/static/chunks/07aksg8x5r0d9.js +0 -1
- package/.next/static/chunks/082cjr-p4ubw7.js +0 -1
- package/.next/static/chunks/09hewwcw-ts34.js +0 -1
- package/.next/static/chunks/09j~fmfefj03i.js +0 -1
- package/.next/static/chunks/0adfy5uyh_8c8.js +0 -1
- package/.next/static/chunks/0agoryx~xvt31.js +0 -1
- package/.next/static/chunks/0aoci_z-c0ele.css +0 -1
- package/.next/static/chunks/0atsym5j2dgzw.js +0 -1
- package/.next/static/chunks/0b3tta7tnnbur.js +0 -1
- package/.next/static/chunks/0d02.lqlwe9a_.js +0 -1
- package/.next/static/chunks/0eqyosc.qae5n.js +0 -1
- package/.next/static/chunks/0kkrrex6qm68-.js +0 -1
- package/.next/static/chunks/0lfxqap3b6sar.js +0 -11
- package/.next/static/chunks/0ord2b6oqi.3g.js +0 -1
- package/.next/static/chunks/0rh-ee9ky1ybq.js +0 -1
- package/.next/static/chunks/0t5v~o90gn66f.js +0 -1
- package/.next/static/chunks/0vaymprggmdwi.js +0 -3
- package/.next/static/chunks/0x2vder5-rzy3.js +0 -1
- package/.next/static/chunks/0yk64vsbmwqd8.js +0 -1
- package/.next/static/chunks/0yvzj34_7s6kb.js +0 -1
- package/.next/static/chunks/104za._t2qmr8.js +0 -1
- package/.next/static/chunks/13pe2-ed6nel..js +0 -1
- package/.next/static/chunks/13zn61okwjlyn.js +0 -1
- package/.next/static/chunks/153hm0-366-at.js +0 -1
- package/.next/static/chunks/16k3_-6f7kx97.js +0 -1
- package/.next/static/chunks/18904zqns5ncn.js +0 -1
- /package/.next/server/chunks/{[root-of-the-server]__00gp8gz._.js.map → [root-of-the-server]__01knfi.._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__0-0wgko._.js.map → [root-of-the-server]__08_s4yo._.js.map} +0 -0
- /package/.next/static/{CDXVH-99b-ZdHz0Rd9pr_ → lsV2FU1YUtwJPmeiim7tk}/_buildManifest.js +0 -0
- /package/.next/static/{CDXVH-99b-ZdHz0Rd9pr_ → lsV2FU1YUtwJPmeiim7tk}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{CDXVH-99b-ZdHz0Rd9pr_ → lsV2FU1YUtwJPmeiim7tk}/_ssgManifest.js +0 -0
package/.next/server/chunks/ssr/packages_dashboard_src_app_settings_models_page_tsx_0djsx88._.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[83679,a=>{"use strict";var b=a.i(39752),c=a.i(34542),d=a.i(42732),e=a.i(54150),f=a.i(78933),g=a.i(92379),h=a.i(81130),i=a.i(92241),j=a.i(7037),k=a.i(95024),l=a.i(7385),m=a.i(30400),n=a.i(29629),o=a.i(7384),p=a.i(21218),q=a.i(8212),r=a.i(47696),s=a.i(59974),t=a.i(74794),u=a.i(95097),v=a.i(40091),w=a.i(48558);let x={"message.dm":"DM response quality may degrade. Sonnet is recommended for important conversations.","message.mention":"Mention response quality may degrade. Sonnet is recommended.","dashboard.chat":"Dashboard chat response quality may degrade. Sonnet is recommended.","routine.morning_routine":"Long-form generation may produce shorter/rougher output with Haiku. Sonnet is recommended.","routine.evening_review":"Long-form generation may produce shorter/rougher output with Haiku. Sonnet is recommended.","routine.weekly_review":"Weekly reviews require reasoning depth. Haiku may produce less coherent output.","routine.monthly_review":"Monthly reviews require reasoning depth. Haiku may produce less coherent output.","agent.task":"Sonnet is recommended for complex task execution. Haiku may make rougher tool-use decisions."};function y(a,b,c){let d,e=(d=a.filter(a=>a.tier===b)).length>0?d:a;return c&&e.some(a=>a.modelId===c)?c:e[0]?.modelId??a[0]?.modelId??""}function z(a,b){return b?a.find(a=>a.modelId===b)?.label??(0,v.formatModelName)(b):"Disabled"}function A({onToast:a,sections:d=["processes"]}){let e=d.includes("processes"),f=(0,h.useQueryClient)(),{data:g,error:B,isLoading:C}=(0,t.useBackends)({enabled:e}),{data:D,error:E,isLoading:F}=(0,u.useProcessConfig)({enabled:e}),[G,H]=(0,c.useState)(null),[I,J]=(0,c.useState)(null),[K,L]=(0,c.useState)(!1),M=(0,c.useCallback)(async()=>{await Promise.all([f.invalidateQueries({queryKey:["backends"]}),f.invalidateQueries({queryKey:["process-config"]}),f.invalidateQueries({queryKey:["cost"]}),f.invalidateQueries({queryKey:["metrics"]})])},[f]),N=e?B??E:null;if(N){let a=N instanceof s.ApiError&&503===N.status;return(0,b.jsxs)(m.Card,{children:[(0,b.jsx)(m.CardHeader,{children:(0,b.jsx)(m.CardTitle,{children:"Process Routing"})}),(0,b.jsx)("p",{className:"max-w-prose text-sm text-muted-foreground",children:a?"Multi-backend tables are not available yet. Run migrations first.":N instanceof Error?N.message:"Failed to load process routing."})]})}if(!e)return null;if(C||!g||F||!D)return(0,b.jsxs)(m.Card,{children:[(0,b.jsx)(m.CardHeader,{children:(0,b.jsx)(m.CardTitle,{children:"Process Routing"})}),(0,b.jsx)("p",{className:"text-sm text-muted-foreground",children:"Loading process routing…"})]});let O=new Map(g.backends.map(a=>[a.id,a])),P=g.backends.filter(a=>a.enabled);async function Q(){if(I){L(!0);try{let b=await s.api.put(`/process-config/${I.processKey}`,{mainBackend:I.mainBackend,mainModel:I.mainModel,fallbackBackend:I.fallbackBackend,fallbackModel:I.fallbackModel,maxTurns:I.maxTurns,maxBudgetUsd:I.maxBudgetUsd});await M(),b.warnings?.length?a("warning",`Saved — ${b.warnings.map(a=>a.message).join("; ")}`):a("success",`${(0,v.getProcessLabel)(I.processKey)} updated`),H(null),J(null)}catch(b){a("error",function(a){if(!(a instanceof s.ApiError))return a instanceof Error?a.message:"Request failed";let b=a.body,c="string"==typeof b?.error?b.error:null,d=Array.isArray(b?.processKeys)?b.processKeys.filter(a=>"string"==typeof a):[];switch(c){case"backend_in_use":return`This backend is still used by: ${d.join(", ")}. Reassign those processes first.`;case"default_backend":return"Reassign the default backend before disabling it.";case"main_backend_disabled":return"The selected main backend is disabled. Enable it first.";case"fallback_backend_disabled":return"The selected fallback backend is disabled. Enable it first.";case"fallback_same_as_main":return"Fallback backend must differ from the main backend.";case"fallback_incomplete":return"Fallback backend and fallback model must either both be set or both be disabled.";case"invalid_main_model":return"The selected main model does not belong to the chosen backend.";case"invalid_fallback_model":return"The selected fallback model does not belong to the chosen fallback backend.";case"multi_backend_unavailable":return"Multi-backend tables are not available yet. Run migrations first.";default:return a.message}}(b))}finally{L(!1)}}}return(0,b.jsxs)(m.Card,{children:[(0,b.jsx)(m.CardHeader,{className:"items-start",children:(0,b.jsxs)("div",{children:[(0,b.jsx)(m.CardTitle,{children:"Process Routing"}),(0,b.jsxs)("p",{className:"mt-1 max-w-3xl text-sm text-muted-foreground",children:["One row per process (event-handling pipeline). Each row shows the resolved main backend + model, the optional fallback that kicks in on ",(0,b.jsx)("em",{children:"decisive"})," main-backend failures (quota exhausted, auth broken, model unavailable, timeout — not ordinary rate limiting), and the per-run limits. Click ",(0,b.jsx)("em",{children:"Edit"}),"to override any of them. “Default” badges mean the value is inherited from the main backend’s preset defaults above."]})]})}),(0,b.jsx)("div",{className:"space-y-3",children:D.configs.map(a=>{var c;let d,e=O.get(a.mainBackend),f=a.fallbackBackend?O.get(a.fallbackBackend):null,h=G===a.processKey&&I,m=h?O.get(I.mainBackend)?.models??[]:[],s=h&&I.fallbackBackend?O.get(I.fallbackBackend)?.models??[]:[];return(0,b.jsxs)("div",{className:"rounded-xl border border-border p-4",children:[(0,b.jsxs)("div",{className:"flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between",children:[(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,b.jsx)("p",{className:"text-base font-medium text-foreground",children:(0,v.getProcessLabel)(a.processKey)}),(0,b.jsxs)(o.Badge,{variant:"high"===a.defaultTier?"purple":"medium"===a.defaultTier?"blue":"default",children:["Default ",a.defaultTier]})]}),(0,b.jsx)("p",{className:"text-xs text-muted-foreground",children:a.processKey}),(d=function(a,b,c){if("routine.morning_routine"===a&&"claude"===b){let a=c.find(a=>"high"===a.tier&&a.available&&!a.deprecated);return a?`Defaults to Sonnet to preserve Claude quota — ${a.label} depletes the 5h window much faster. If you want better instruction-following or more thorough day-plan output, switch Main Model to ${a.label}.`:null}return null}(a.processKey,a.mainBackend,e?.models??[]))?(0,b.jsx)(n.Alert,{variant:"info",className:"mt-2 text-xs",children:d}):null]}),(0,b.jsxs)("div",{className:"grid gap-3 text-sm text-muted-foreground md:grid-cols-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("p",{className:"font-medium text-foreground",children:"Main"}),(0,b.jsx)("p",{children:e?(0,v.getBackendLabel)(e.id):a.mainBackend}),(0,b.jsx)("p",{children:e?z(e.models,a.mainModel):a.mainModel})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("p",{className:"font-medium text-foreground",children:"Fallback"}),f&&a.fallbackModel?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("p",{children:(0,v.getBackendLabel)(f.id)}),(0,b.jsx)("p",{children:z(f.models,a.fallbackModel)})]}):(0,b.jsx)("p",{children:"Disabled"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("p",{className:"font-medium text-foreground",children:"Limits"}),(0,b.jsxs)("p",{children:[a.maxTurns," turns"]}),(0,b.jsxs)("p",{children:[(0,w.formatCurrency)(a.maxBudgetUsd)," soft budget"]})]})]})]}),(0,b.jsxs)(p.Button,{variant:"outline",onClick:()=>{H(a.processKey),J({processKey:a.processKey,defaultTier:a.defaultTier,mainBackend:a.mainBackend,mainModel:a.mainModel,fallbackBackend:a.fallbackBackend,fallbackModel:a.fallbackModel,maxTurns:a.maxTurns,maxBudgetUsd:a.maxBudgetUsd})},children:[(0,b.jsx)(j.Pencil,{className:"h-3.5 w-3.5"}),"Edit"]})]}),h&&I&&(0,b.jsxs)("div",{className:"mt-4 grid gap-4 rounded-xl border border-border/80 bg-muted/30 p-4 md:grid-cols-2",children:[(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsx)("p",{className:"text-sm text-muted-foreground",children:"Main backend"}),(0,b.jsxs)(r.Select,{value:I.mainBackend,onValueChange:a=>(function(a){let b=O.get(a);if(!b||!I)return;let c=I.fallbackBackend===a;J({...I,mainBackend:a,mainModel:y(b.models,I.defaultTier,I.mainModel),fallbackBackend:c?null:I.fallbackBackend,fallbackModel:c?null:I.fallbackModel})})(a),children:[(0,b.jsx)(r.SelectTrigger,{children:(0,b.jsx)(r.SelectValue,{placeholder:"Select backend"})}),(0,b.jsx)(r.SelectContent,{children:g.backends.map(a=>(0,b.jsx)(r.SelectItem,{value:a.id,disabled:!a.enabled,children:(0,v.getBackendLabel)(a.id)},a.id))})]})]}),(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsx)("p",{className:"text-sm text-muted-foreground",children:"Main model"}),(0,b.jsxs)(r.Select,{value:I.mainModel,onValueChange:a=>J(b=>b?{...b,mainModel:a}:b),children:[(0,b.jsx)(r.SelectTrigger,{children:(0,b.jsx)(r.SelectValue,{placeholder:"Select model"})}),(0,b.jsx)(r.SelectContent,{children:m.map(a=>(0,b.jsx)(r.SelectItem,{value:a.modelId,children:a.label},a.modelId))})]}),!!(c=I.mainModel)&&c.toLowerCase().includes("haiku")&&x[I.processKey]&&(0,b.jsx)(n.Alert,{variant:"warning",className:"mt-2 text-xs",children:x[I.processKey]})]}),(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsx)("p",{className:"text-sm text-muted-foreground",children:"Fallback backend"}),(0,b.jsxs)(r.Select,{value:I.fallbackBackend??"__none__",onValueChange:a=>(function(a){if(!I)return;if(!a)return void J({...I,fallbackBackend:null,fallbackModel:null});let b=O.get(a);b&&J({...I,fallbackBackend:a,fallbackModel:y(b.models,I.defaultTier,I.fallbackModel)})})("__none__"===a?null:a),children:[(0,b.jsx)(r.SelectTrigger,{children:(0,b.jsx)(r.SelectValue,{placeholder:"Select backend"})}),(0,b.jsxs)(r.SelectContent,{children:[(0,b.jsx)(r.SelectItem,{value:"__none__",children:"Disabled"}),g.backends.map(a=>(0,b.jsx)(r.SelectItem,{value:a.id,disabled:!a.enabled||a.id===I.mainBackend,children:(0,v.getBackendLabel)(a.id)},a.id))]})]})]}),(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsx)("p",{className:"text-sm text-muted-foreground",children:"Fallback model"}),(0,b.jsxs)(r.Select,{disabled:!I.fallbackBackend,value:I.fallbackModel??"__none__",onValueChange:a=>J(b=>b?{...b,fallbackModel:"__none__"===a?null:a}:b),children:[(0,b.jsx)(r.SelectTrigger,{children:(0,b.jsx)(r.SelectValue,{placeholder:"Select model"})}),(0,b.jsxs)(r.SelectContent,{children:[(0,b.jsx)(r.SelectItem,{value:"__none__",children:"Disabled"}),s.map(a=>(0,b.jsx)(r.SelectItem,{value:a.modelId,children:a.label},a.modelId))]})]})]}),(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsx)("p",{className:"text-sm text-muted-foreground",children:"Max turns"}),(0,b.jsx)(q.Input,{type:"number",min:1,max:1e3,value:I.maxTurns,onChange:a=>J(b=>b?{...b,maxTurns:Number(a.target.value)||1}:b)}),(0,b.jsx)("p",{className:"text-xs text-muted-foreground",children:"Hard cap on agent turns per run for this process. One turn = one model response (possibly with tool calls). When reached, the run stops mid-task — raise this if you see “max turns” aborts."})]}),(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsx)("p",{className:"text-sm text-muted-foreground",children:"Soft budget (USD)"}),(0,b.jsx)(q.Input,{type:"number",min:0,max:1e4,step:"0.01",value:I.maxBudgetUsd,onChange:a=>J(b=>b?{...b,maxBudgetUsd:Number(a.target.value)||0}:b)}),(0,b.jsx)("p",{className:"text-xs text-muted-foreground",children:"Per-run spend target in USD. “Soft” because it’s checked between turns — a long single turn can overshoot slightly. Runs exceeding this are aborted. Set to 0 to disable and rely only on the turn cap."})]}),(0,b.jsxs)("div",{className:"md:col-span-2 flex items-center justify-between gap-3",children:[(0,b.jsxs)("p",{className:"max-w-xl text-xs text-muted-foreground",children:[(0,b.jsx)("strong",{children:"Fallback backend/model"})," is consulted only on decisive failures: quota exhaustion, auth breakage, model refusal, timeout, or unrecoverable provider errors. Transient 5xx and ordinary rate limits are retried on the main backend first."]}),(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsxs)(p.Button,{variant:"outline",onClick:()=>{H(null),J(null)},children:[(0,b.jsx)(l.XCircle,{className:"h-4 w-4"}),"Cancel"]}),(0,b.jsxs)(p.Button,{onClick:Q,disabled:K,children:[K?(0,b.jsx)(i.Loader2,{className:"h-4 w-4 animate-spin"}):(0,b.jsx)(k.Save,{className:"h-4 w-4"}),"Save Process"]})]})]})]})]},a.processKey)})}),P.length<2&&(0,b.jsx)(n.Alert,{variant:"warning",className:"mt-4 rounded-xl px-4 py-3 text-sm",children:"Enable another backend if you want fallback routing to be available for any process."})]})}a.i(70010);var B=a.i(51141),C=a.i(89021),D=a.i(74358),E=a.i(81831);let F=["claude","codex","gemini"];function G({onToast:a}){let{data:d,refetch:f}=(0,t.useBackends)(),{data:g}=(0,e.useConfig)(),j=(0,h.useQueryClient)(),[k,l]=(0,c.useState)(null),[m,n]=(0,c.useState)({claude:{status:"idle"},codex:{status:"idle"},gemini:{status:"idle"}}),[o,q]=(0,c.useState)(null),[u,w]=(0,c.useState)(!1);(0,c.useEffect)(()=>{let a=!1;return(async()=>{try{let b=await s.api.get("/backends/advisor");if(a)return;q({enabled:b.enabled,model:b.model})}catch{a||q({enabled:!1,model:null})}})(),()=>{a=!0}},[]);let x=(0,c.useCallback)(async a=>{n(b=>({...b,[a]:{status:"checking"}}));try{let b=await s.api.post(`/backends/${a}/verify-install`);if(await f(),b.ok)n(c=>({...c,[a]:{status:"ok",version:b.version}}));else{let c=b.cliInstalled?b.timedOut?`${b.cliCommand} --version timed out`:b.stderr.trim()||b.stdout.trim()||"CLI failed to run":`${b.cliCommand} not found on PATH`;n(b=>({...b,[a]:{status:"error",error:c}}))}}catch(b){n(c=>({...c,[a]:{status:"error",error:b instanceof Error?b.message:"Verify install failed"}}))}},[f]),y=(0,c.useCallback)(async b=>{l(b);try{let c=await s.api.put("/backends/main",{backendId:b});await f(),await j.invalidateQueries({queryKey:["backends"]}),await j.invalidateQueries({queryKey:["integrations"]}),await j.invalidateQueries({queryKey:["health"]}),await j.invalidateQueries({queryKey:["agent-actions","native_unbound"]});let d=c?.nativeUnbound??[];if(d.length>0){let c=d.map(a=>a.key).join(", ");a("warning",`Main backend set to ${v.BACKEND_PROVIDER_LABELS[b]}. ${d.length} native integration${1===d.length?"":"s"} disabled (${c}). Re-configure on /connections.`)}else a("success",`Main backend set to ${v.BACKEND_PROVIDER_LABELS[b]}.`)}catch(b){a("error",b instanceof s.ApiError||b instanceof Error?b.message:"Failed to set main backend")}finally{l(null)}},[f,j,a]),z=(0,c.useCallback)(async b=>{let c=d?.backends.find(a=>a.id===b);if(!c)return;let e=!c.enabled;l(b);try{await s.api.post(`/backends/${b}/${e?"enable":"disable"}`),await f(),a("success",`${v.BACKEND_PROVIDER_LABELS[b]} ${e?"enabled":"disabled"}.`)}catch(b){a("error",b instanceof Error?b.message:"Failed to update backend")}finally{l(null)}},[d,f,a]),A=(0,c.useCallback)(async b=>{let c=d?.backends.find(a=>a.id===b);if(!c)return;let e=!c.webSearchEnabled;l(b);try{await s.api.post(`/backends/${b}/web-search`,{enabled:e}),await f()}catch(b){a("error",b instanceof Error?b.message:"Failed to update web search")}finally{l(null)}},[d,f,a]),H=(0,c.useCallback)(async b=>{w(!0);try{await s.api.put("/backends/advisor",{enabled:b.enabled,model:b.model}),q(b),a("success",`Advisor ${b.enabled?"enabled":"disabled"}.`)}catch(b){a("error",b instanceof Error?b.message:"Failed to save advisor")}finally{w(!1)}},[a]),I=d?.defaultBackend??null;return(0,b.jsxs)("section",{className:"space-y-4",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-lg font-semibold text-foreground",children:"Backends"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"Install each backend’s CLI, verify authentication, and pick the main backend. The main backend runs every configurable process by default; per-process overrides live in the “Process configuration” card below."})]}),(0,b.jsx)(E.SubscriptionAuthWarning,{}),(0,b.jsx)("div",{className:"space-y-3",children:F.map(c=>{let e=d?.backends.find(a=>a.id===c),h=I===c,i=g?g[`${c}ExecutionPermissionMode`]:null;return(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsx)(C.BackendCard,{backendId:c,mode:"settings",isMain:h,authStatus:e?.authStatus??"unknown",authStatusDetail:e?.authDetail??null,authFirstExpiredAt:e?.authFirstExpiredAt??null,authLastSuccessAt:e?.authLastSuccessAt??null,authNotificationCount:e?.authNotificationCount??0,cliInstalled:e?.cliInstalled??!0,enabled:e?.enabled??!1,webSearchEnabled:e?.webSearchEnabled??!1,webSearchSupported:e?.webSearchSupported??!1,permissionMode:i,busy:k===c,installCheck:m[c],onCliInstalled:()=>{f()},onVerifyInstall:()=>{x(c)},onToggleEnable:()=>{z(c)},onToggleWebSearch:()=>{A(c)}}),(0,b.jsx)(D.BackendApiKeyPanel,{backendId:c,onToast:a}),!h&&(0,b.jsx)("div",{className:"flex justify-end",children:(0,b.jsxs)(p.Button,{size:"sm",variant:"outline",disabled:null!==k||!e?.cliInstalled,onClick:()=>{y(c)},children:["Set ",v.BACKEND_PROVIDER_SHORT[c]," as main"]})})]},c)})}),o&&(0,b.jsxs)("div",{className:"rounded-xl border border-border bg-card p-4 shadow-sm",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,b.jsxs)("div",{className:"space-y-1",children:[(0,b.jsx)("h3",{className:"text-sm font-semibold text-foreground",children:"Advisor (Claude Agent SDK)"}),(0,b.jsx)("p",{className:"text-xs text-muted-foreground",children:"When enabled, the Claude Agent SDK’s server-side advisor tool can offer the agent a second-opinion model on long turns. Off by default — turn it on only when you want the added cost."})]}),(0,b.jsxs)(p.Button,{size:"sm",variant:o.enabled?"outline":"default",disabled:u,onClick:()=>{H(o.enabled?{enabled:!1,model:null}:{enabled:!0,model:o.model??B.ADVISOR_ALLOWED_MODELS[0]})},children:[u&&(0,b.jsx)(i.Loader2,{className:"mr-2 h-3.5 w-3.5 animate-spin"}),o.enabled?"Disable advisor":"Enable advisor"]})]}),o.enabled&&(0,b.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-2",children:[(0,b.jsx)("span",{className:"text-xs text-muted-foreground",children:"Model:"}),(0,b.jsxs)(r.Select,{value:o.model??B.ADVISOR_ALLOWED_MODELS[0],onValueChange:a=>{(0,B.isAdvisorModel)(a)&&H({enabled:!0,model:a})},disabled:u,children:[(0,b.jsx)(r.SelectTrigger,{className:"h-8 w-auto min-w-[12rem] text-xs",children:(0,b.jsx)(r.SelectValue,{})}),(0,b.jsx)(r.SelectContent,{children:B.ADVISOR_ALLOWED_MODELS.map(a=>(0,b.jsx)(r.SelectItem,{value:a,children:a},a))})]})]})]})]})}var H=a.i(32307),I=a.i(78019),J=a.i(50891),K=a.i(26206),L=a.i(59809),M=a.i(57216),N=a.i(16611);function O(a){let b=(0,N.internalToUi)(a.claudeExecutionPermissionMode),c=(0,N.internalToUi)(a.codexExecutionPermissionMode),d=(0,N.internalToUi)(a.geminiExecutionPermissionMode);return b===c&&c===d?b:null}let P=["claude","codex","gemini"];function Q({onToast:a}){let{data:d}=(0,e.useConfig)(),[f,g]=(0,c.useState)(0);return d?(0,b.jsx)(R,{config:d,onToast:a,onApplied:()=>g(a=>a+1)},f):(0,b.jsx)(m.Card,{children:(0,b.jsxs)("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:[(0,b.jsx)(i.Loader2,{className:"h-4 w-4 animate-spin"})," Loading…"]})})}function R({config:a,onToast:d,onApplied:e}){let f=(0,h.useQueryClient)(),g=(0,c.useState)(()=>{let b;return{topLevel:b=O(a),overrides:null!==O(a)?{...N.EMPTY_OVERRIDES}:{claude:(0,N.internalToUi)(a.claudeExecutionPermissionMode),codex:(0,N.internalToUi)(a.codexExecutionPermissionMode),gemini:(0,N.internalToUi)(a.geminiExecutionPermissionMode)},forceAccordionOpen:null===b}})[0],[j,k]=(0,c.useState)(g.topLevel),[l,n]=(0,c.useState)(g.overrides),[o,q]=(0,c.useState)(g.forceAccordionOpen),[r,t]=(0,c.useState)(!1),u=null===j||(0,N.hasDivergentOverride)(j,l);async function v(){let a=(0,N.buildSetupModePayload)(j,l);if(null!==a){t(!0);try{await s.api.post("/setup/mode",a),await f.invalidateQueries({queryKey:["config"]}),d("success","Execution mode updated"),e()}catch(a){a instanceof s.ApiError||a instanceof Error?d("error",a.message):d("error","Failed to update execution mode")}finally{t(!1)}}}return(0,b.jsxs)(m.Card,{id:"execution-mode",children:[(0,b.jsx)(m.CardHeader,{className:"px-0 pt-0",children:(0,b.jsxs)(m.CardTitle,{className:"flex items-center gap-1.5 text-base",children:[(0,b.jsx)("span",{children:"Execution Mode"}),(0,b.jsx)(L.DocsHelpInline,{docId:"concepts/safety-and-execution",label:"Execution Mode"})]})}),(0,b.jsx)("p",{className:"text-sm text-muted-foreground",children:"Pick how freely the agent may run shell, file, and tool commands on your machine. Dangerous operations — recursive deletes, privilege escalation, and secret-file reads — remain blocked in both modes."}),(0,b.jsxs)("div",{className:"mt-4 space-y-3",children:[(0,b.jsx)(S,{icon:(0,b.jsx)(J.ShieldCheck,{className:"h-5 w-5"}),title:"Safe",badge:"Recommended",selected:"safe"===j,onSelect:()=>k("safe"),children:"Agent runs with strict permission checks and asks for confirmation before side-effectful actions. Best when you want the agent to stay narrow."}),(0,b.jsxs)(S,{icon:(0,b.jsx)(K.Unlock,{className:"h-5 w-5"}),title:"Allow",selected:"allow"===j,onSelect:()=>k("allow"),children:["Agent runs with the skills, plugins, and MCP servers installed in your CLI harness. File-type support depends on your harness; the daemon does not manage it.",(0,b.jsx)(U,{})]}),(0,b.jsxs)(M.Collapsible,{open:o,onOpenChange:q,children:[(0,b.jsx)(M.CollapsibleTrigger,{asChild:!0,children:(0,b.jsxs)("button",{type:"button",className:"flex w-full items-center justify-between rounded-md border border-border bg-muted/20 px-3 py-2 text-left text-xs text-muted-foreground hover:bg-muted/40",children:[(0,b.jsxs)("span",{className:"flex items-center gap-2",children:[(0,b.jsx)(I.ChevronDown,{className:(0,w.cn)("h-3.5 w-3.5 transition-transform",o&&"rotate-180")}),"Advanced — per-backend overrides",u&&(0,b.jsx)("span",{className:"rounded bg-amber-500/15 px-1.5 py-0.5 text-[10px] font-medium text-amber-700 dark:text-amber-300",children:"mixed"})]}),(0,b.jsx)("span",{className:"text-[11px]",children:o?"Hide":"Show"})]})}),(0,b.jsx)(M.CollapsibleContent,{className:"mt-2 space-y-2 rounded-md border border-border bg-background p-3",children:P.map(a=>(0,b.jsx)(T,{backend:a,topLevel:j,override:l[a],onChange:b=>n(c=>({...c,[a]:b}))},a))})]}),(0,b.jsx)("div",{className:"flex justify-end pt-2",children:(0,b.jsx)(p.Button,{onClick:v,disabled:!(0,N.canApply)(j,l)||r,children:r?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(i.Loader2,{className:"mr-2 h-4 w-4 animate-spin"}),"Saving…"]}):"Apply"})})]})]})}function S({icon:a,title:c,badge:d,selected:e,onSelect:f,children:g}){return(0,b.jsxs)("button",{type:"button",onClick:f,className:(0,w.cn)("block w-full rounded-lg border p-3 text-left transition-colors",e?"border-primary bg-primary/5 shadow-sm":"border-border hover:border-foreground/30"),children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 font-semibold text-foreground",children:[a,c,d&&(0,b.jsx)("span",{className:"rounded bg-primary/15 px-1.5 py-0.5 text-[10px] font-medium text-primary",children:d})]}),(0,b.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:g})]})}function T({backend:a,topLevel:c,override:d,onChange:e}){let f=d??c,g=null===f?"pick a top-level mode first":`runs as: ${f}`;return(0,b.jsxs)("div",{className:"rounded-md border border-border/60 px-3 py-2",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsxs)("div",{className:"text-sm",children:[(0,b.jsxs)("div",{className:"font-medium text-foreground",children:[v.BACKEND_PROVIDER_LABELS[a],(0,b.jsxs)("span",{className:"ml-1 text-xs text-muted-foreground",children:["(",v.BACKEND_PROVIDER_SHORT[a],")"]})]}),(0,b.jsx)("div",{className:"text-[11px] text-muted-foreground",children:g})]}),(0,b.jsxs)("div",{className:"flex items-center gap-1 text-xs",children:[(0,b.jsx)(V,{active:null===d,label:"Follow",onClick:()=>e(null)}),(0,b.jsx)(V,{active:"safe"===d,label:"Safe",onClick:()=>e("safe")}),(0,b.jsx)(V,{active:"allow"===d,label:"Allow",onClick:()=>e("allow")})]})]}),"codex"===a&&"allow"===f&&(0,b.jsxs)("p",{className:"mt-2 flex items-start gap-1.5 text-[11px] text-amber-700 dark:text-amber-300",children:[(0,b.jsx)(H.AlertTriangle,{className:"mt-0.5 h-3 w-3 shrink-0"}),(0,b.jsx)("span",{children:"Codex Allow disables the daemon's absolute-block layer (sandbox-off). See the Allow card above."})]})]})}function U(){return(0,b.jsxs)("span",{className:"mt-3 flex items-start gap-2 rounded-md border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-xs text-amber-900 dark:text-amber-200",children:[(0,b.jsx)(H.AlertTriangle,{className:"mt-0.5 h-3.5 w-3.5 shrink-0"}),(0,b.jsxs)("span",{className:"space-y-1",children:[(0,b.jsxs)("span",{className:"block",children:[(0,b.jsx)("span",{className:"font-semibold",children:"Codex caveat."})," Codex CLI runs Allow mode under"," ",(0,b.jsx)("code",{className:"rounded bg-black/10 px-1 font-mono text-[11px] dark:bg-white/10",children:"--dangerously-bypass-approvals-and-sandbox"}),", a binary sandbox-off switch. Codex has no per-command hook layer for the daemon to attach the absolute-block patterns to, so destructive shell commands (",(0,b.jsx)("code",{className:"rounded bg-black/10 px-1 font-mono text-[11px] dark:bg-white/10",children:"rm -rf"}),","," ",(0,b.jsx)("code",{className:"rounded bg-black/10 px-1 font-mono text-[11px] dark:bg-white/10",children:"eval $(curl …)"}),", secret-file reads) are ",(0,b.jsx)("span",{className:"font-semibold",children:"not"})," ","pre-blocked for Codex in Allow mode the way they are for Claude Code and Gemini CLI."]}),(0,b.jsx)("span",{className:"block",children:"Use the Advanced section below to keep Codex on Safe (its workspace-write sandbox still applies) unless you accept this gap."})]})]})}function V({active:a,label:c,onClick:d}){return(0,b.jsx)("button",{type:"button",onClick:d,className:(0,w.cn)("rounded-md border px-2 py-1 transition-colors",a?"border-primary bg-primary/10 text-foreground":"border-border text-muted-foreground hover:border-foreground/30"),children:c})}var W=a.i(56295),X=a.i(74345);function Y({title:a,defaultOpen:e=!1,children:f}){let[g,h]=(0,c.useState)(e);return(0,b.jsxs)(M.Collapsible,{open:g,onOpenChange:h,children:[(0,b.jsx)(M.CollapsibleTrigger,{asChild:!0,children:(0,b.jsxs)("button",{className:"flex w-full items-center gap-2 rounded-lg px-1 py-2 text-xs font-semibold uppercase tracking-wider text-muted-foreground hover:bg-muted/50 hover:text-foreground transition-colors",children:[(0,b.jsx)(d.ChevronRight,{className:(0,w.cn)("h-3.5 w-3.5 shrink-0 transition-transform duration-200",g&&"rotate-90")}),a]})}),(0,b.jsx)(M.CollapsibleContent,{className:"space-y-3 pt-1",children:f})]})}a.s(["default",0,function(){let{data:a}=(0,e.useConfig)(),{df:c}=(0,e.useConfigDefaults)(),{toast:d,showToast:h}=(0,f.useSaveConfig)(),{deferSaveFor:i,dv:j,dirtyFields:k}=(0,g.useDirtyFields)();if(!a)return(0,b.jsx)("div",{className:"text-muted-foreground",children:"Loading..."});let l=i(a);return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-2xl font-semibold text-foreground",children:"Models & Cost"}),(0,b.jsx)("p",{className:"mt-1 max-w-3xl text-sm text-muted-foreground",children:"AI backends, per-task routing, and execution limits. The backend cards are always visible — open the collapsible sections below when you need to tune individual processes or limits."})]}),(0,b.jsx)(X.SettingsToast,{toast:d}),(0,b.jsx)(G,{onToast:h}),(0,b.jsx)(Q,{onToast:h}),(0,b.jsx)(A,{onToast:h,sections:["processes"]}),(0,b.jsx)(Y,{title:"Execution limits",children:(0,b.jsxs)(W.ConfigSection,{title:"Execution limits",children:[(0,b.jsx)("p",{className:"pb-2 text-xs text-muted-foreground",children:"Concurrency and wall-clock limits that apply across every agent run, regardless of backend or tier."}),(0,b.jsx)(W.EditableField,{label:"Max Concurrent Sessions",value:j("maxConcurrentSessions",a.maxConcurrentSessions),configKey:"maxConcurrentSessions",type:"number",modified:k.has("maxConcurrentSessions"),defaultValue:c("maxConcurrentSessions"),description:"Total number of agent sessions allowed to run in parallel across all sources (DMs, routines, schedules). Additional requests are queued until a slot opens.",onSave:l}),(0,b.jsx)(W.EditableField,{label:"Max Reactive Sessions",value:j("maxReactiveSessions",a.maxReactiveSessions),configKey:"maxReactiveSessions",type:"number",modified:k.has("maxReactiveSessions"),defaultValue:c("maxReactiveSessions"),description:"Subset of the concurrent slots reserved for reactive work (incoming DMs and mentions). This guarantees routines never starve out messages you send right now — and vice versa for the remaining slots.",onSave:l}),(0,b.jsx)(W.EditableField,{label:"Execute Timeout",value:j("executeTimeoutMinutes",a.executeTimeoutMinutes),configKey:"executeTimeoutMinutes",type:"number",suffix:"min",min:1,max:1440,modified:k.has("executeTimeoutMinutes"),defaultValue:c("executeTimeoutMinutes"),description:"Maximum wall-clock time for a single agent execution. When exceeded the SDK stream is cancelled so retries don’t double-bill quota. Applies per attempt, not per retry chain.",onSave:l}),(0,b.jsx)(W.EditableField,{label:"Delegated Proxy Concurrency",value:j("delegatedProxyMaxConcurrent",a.delegatedProxyMaxConcurrent),configKey:"delegatedProxyMaxConcurrent",type:"number",min:1,max:64,modified:k.has("delegatedProxyMaxConcurrent"),defaultValue:c("delegatedProxyMaxConcurrent"),description:"Maximum simultaneous delegated-proxy invocations (Gmail/Calendar in delegated mode spawn a one-shot subprocess on the configured backend). Excess requests FIFO-queue with a 60-second wait timeout, then 503 with delegated_proxy_busy.",onSave:l})]})}),(0,b.jsx)(Y,{title:"Session timeouts",children:(0,b.jsxs)(W.ConfigSection,{title:"Session timeouts",children:[(0,b.jsx)("p",{className:"pb-2 text-xs text-muted-foreground",children:"How long an idle conversation keeps its context before the next message starts fresh. Lower values save tokens on long-lived chats; higher values preserve continuity."}),(0,b.jsx)(W.EditableField,{label:"DM Timeout",value:j("sessionTimeoutDmMinutes",a.sessionTimeoutDmMinutes),configKey:"sessionTimeoutDmMinutes",type:"number",suffix:"min",modified:k.has("sessionTimeoutDmMinutes"),defaultValue:c("sessionTimeoutDmMinutes"),description:"Idle minutes before a direct-message session expires. Once expired, the next DM opens a new session without prior conversation history.",onSave:l}),(0,b.jsx)(W.EditableField,{label:"Channel Timeout",value:j("sessionTimeoutChannelMinutes",a.sessionTimeoutChannelMinutes),configKey:"sessionTimeoutChannelMinutes",type:"number",suffix:"min",modified:k.has("sessionTimeoutChannelMinutes"),defaultValue:c("sessionTimeoutChannelMinutes"),description:"Idle minutes before an @mention thread in a public channel expires. Usually shorter than DM timeout since channel context rotates faster.",onSave:l}),(0,b.jsx)(W.EditableField,{label:"Dashboard Timeout",value:j("sessionTimeoutDashboardMinutes",a.sessionTimeoutDashboardMinutes),configKey:"sessionTimeoutDashboardMinutes",type:"number",suffix:"min",modified:k.has("sessionTimeoutDashboardMinutes"),defaultValue:c("sessionTimeoutDashboardMinutes"),description:"Idle minutes before a dashboard Chat session expires. The session sidebar will still show it as a past conversation you can reopen.",onSave:l})]})}),(0,b.jsx)(Y,{title:"Cost guardrails",children:(0,b.jsxs)(W.ConfigSection,{title:"Cost guardrails",children:[(0,b.jsx)("p",{className:"pb-2 text-xs text-muted-foreground",children:"Guardrails and alert thresholds for autonomous routine spend. The daily cap can skip lower-priority routines; the monthly cap only notifies. Reactive work such as DMs and mentions still runs."}),(0,b.jsx)(W.EditableField,{label:"Autonomous Daily Cost Cap",value:j("autonomousDailyCostCapUsd",a.autonomousDailyCostCapUsd),configKey:"autonomousDailyCostCapUsd",type:"number",suffix:"$",nullable:!0,emptyLabel:"Disabled",min:.01,modified:k.has("autonomousDailyCostCapUsd"),defaultValue:c("autonomousDailyCostCapUsd"),description:"Maximum daily USD spend for autonomous sessions before lower-priority routines are skipped. Leave blank to disable the cap.",onSave:l}),(0,b.jsx)(W.EditableField,{label:"Autonomous Monthly Cost Cap (alert only)",value:j("autonomousMonthlyCostCapUsd",a.autonomousMonthlyCostCapUsd),configKey:"autonomousMonthlyCostCapUsd",type:"number",suffix:"$",nullable:!0,emptyLabel:"Disabled",min:.01,modified:k.has("autonomousMonthlyCostCapUsd"),defaultValue:c("autonomousMonthlyCostCapUsd"),description:"Notification threshold for the rolling 30-day spend. Surfaces a warning at 80% and an error at 100% in the Notifications panel. No dispatcher enforcement — pair with the daily cap for hard guardrails.",onSave:l})]})})]})}],83679)}];
|
|
1
|
+
module.exports=[83679,a=>{"use strict";var b=a.i(39752),c=a.i(34542),d=a.i(42732),e=a.i(54150),f=a.i(78933),g=a.i(92379),h=a.i(70054),i=a.i(92241),j=a.i(81130);a.i(70010);var k=a.i(51141),l=a.i(21218),m=a.i(47696),n=a.i(59974),o=a.i(40091),p=a.i(74794),q=a.i(89021),r=a.i(74358),s=a.i(81831);let t=["claude","codex","gemini"];function u({onToast:a}){let{data:d,refetch:f}=(0,p.useBackends)(),{data:g}=(0,e.useConfig)(),h=(0,j.useQueryClient)(),[v,w]=(0,c.useState)(null),[x,y]=(0,c.useState)({claude:{status:"idle"},codex:{status:"idle"},gemini:{status:"idle"}}),[z,A]=(0,c.useState)(null),[B,C]=(0,c.useState)(!1);(0,c.useEffect)(()=>{let a=!1;return(async()=>{try{let b=await n.api.get("/backends/advisor");if(a)return;A({enabled:b.enabled,model:b.model})}catch{a||A({enabled:!1,model:null})}})(),()=>{a=!0}},[]);let D=(0,c.useCallback)(async a=>{y(b=>({...b,[a]:{status:"checking"}}));try{let b=await n.api.post(`/backends/${a}/verify-install`);if(await f(),b.ok)y(c=>({...c,[a]:{status:"ok",version:b.version}}));else{let c=b.cliInstalled?b.timedOut?`${b.cliCommand} --version timed out`:b.stderr.trim()||b.stdout.trim()||"CLI failed to run":`${b.cliCommand} not found on PATH`;y(b=>({...b,[a]:{status:"error",error:c}}))}}catch(b){y(c=>({...c,[a]:{status:"error",error:b instanceof Error?b.message:"Verify install failed"}}))}},[f]),E=(0,c.useCallback)(async b=>{w(b);try{let c=await n.api.put("/backends/main",{backendId:b});await f(),await h.invalidateQueries({queryKey:["backends"]}),await h.invalidateQueries({queryKey:["integrations"]}),await h.invalidateQueries({queryKey:["health"]}),await h.invalidateQueries({queryKey:["agent-actions","native_unbound"]});let d=c?.nativeUnbound??[];if(d.length>0){let c=d.map(a=>a.key).join(", ");a("warning",`Main backend set to ${o.BACKEND_PROVIDER_LABELS[b]}. ${d.length} native integration${1===d.length?"":"s"} disabled (${c}). Re-configure on /connections.`)}else a("success",`Main backend set to ${o.BACKEND_PROVIDER_LABELS[b]}.`)}catch(b){a("error",b instanceof n.ApiError||b instanceof Error?b.message:"Failed to set main backend")}finally{w(null)}},[f,h,a]),F=(0,c.useCallback)(async b=>{let c=d?.backends.find(a=>a.id===b);if(!c)return;let e=!c.enabled;w(b);try{await n.api.post(`/backends/${b}/${e?"enable":"disable"}`),await f(),a("success",`${o.BACKEND_PROVIDER_LABELS[b]} ${e?"enabled":"disabled"}.`)}catch(b){a("error",b instanceof Error?b.message:"Failed to update backend")}finally{w(null)}},[d,f,a]),G=(0,c.useCallback)(async b=>{let c=d?.backends.find(a=>a.id===b);if(!c)return;let e=!c.webSearchEnabled;w(b);try{await n.api.post(`/backends/${b}/web-search`,{enabled:e}),await f()}catch(b){a("error",b instanceof Error?b.message:"Failed to update web search")}finally{w(null)}},[d,f,a]),H=(0,c.useCallback)(async b=>{C(!0);try{await n.api.put("/backends/advisor",{enabled:b.enabled,model:b.model}),A(b),a("success",`Advisor ${b.enabled?"enabled":"disabled"}.`)}catch(b){a("error",b instanceof Error?b.message:"Failed to save advisor")}finally{C(!1)}},[a]),I=d?.defaultBackend??null;return(0,b.jsxs)("section",{className:"space-y-4",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-lg font-semibold text-foreground",children:"Backends"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"Install each backend’s CLI, verify authentication, and pick the main backend. The main backend runs every configurable process by default; per-process overrides live in the “Process configuration” card below."})]}),(0,b.jsx)(s.SubscriptionAuthWarning,{}),(0,b.jsx)("div",{className:"space-y-3",children:t.map(c=>{let e=d?.backends.find(a=>a.id===c),h=I===c,i=g?g[`${c}ExecutionPermissionMode`]:null;return(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsx)(q.BackendCard,{backendId:c,mode:"settings",isMain:h,authStatus:e?.authStatus??"unknown",authStatusDetail:e?.authDetail??null,authFirstExpiredAt:e?.authFirstExpiredAt??null,authLastSuccessAt:e?.authLastSuccessAt??null,authNotificationCount:e?.authNotificationCount??0,cliInstalled:e?.cliInstalled??!0,enabled:e?.enabled??!1,webSearchEnabled:e?.webSearchEnabled??!1,webSearchSupported:e?.webSearchSupported??!1,permissionMode:i,busy:v===c,installCheck:x[c],onCliInstalled:()=>{f()},onVerifyInstall:()=>{D(c)},onToggleEnable:()=>{F(c)},onToggleWebSearch:()=>{G(c)}}),(0,b.jsx)(r.BackendApiKeyPanel,{backendId:c,onToast:a}),!h&&(0,b.jsx)("div",{className:"flex justify-end",children:(0,b.jsxs)(l.Button,{size:"sm",variant:"outline",disabled:null!==v||!e?.cliInstalled,onClick:()=>{E(c)},children:["Set ",o.BACKEND_PROVIDER_SHORT[c]," as main"]})})]},c)})}),z&&(0,b.jsxs)("div",{className:"rounded-xl border border-border bg-card p-4 shadow-sm",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,b.jsxs)("div",{className:"space-y-1",children:[(0,b.jsx)("h3",{className:"text-sm font-semibold text-foreground",children:"Advisor (Claude Agent SDK)"}),(0,b.jsx)("p",{className:"text-xs text-muted-foreground",children:"When enabled, the Claude Agent SDK’s server-side advisor tool can offer the agent a second-opinion model on long turns. Off by default — turn it on only when you want the added cost."})]}),(0,b.jsxs)(l.Button,{size:"sm",variant:z.enabled?"outline":"default",disabled:B,onClick:()=>{H(z.enabled?{enabled:!1,model:null}:{enabled:!0,model:z.model??k.ADVISOR_ALLOWED_MODELS[0]})},children:[B&&(0,b.jsx)(i.Loader2,{className:"mr-2 h-3.5 w-3.5 animate-spin"}),z.enabled?"Disable advisor":"Enable advisor"]})]}),z.enabled&&(0,b.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-2",children:[(0,b.jsx)("span",{className:"text-xs text-muted-foreground",children:"Model:"}),(0,b.jsxs)(m.Select,{value:z.model??k.ADVISOR_ALLOWED_MODELS[0],onValueChange:a=>{(0,k.isAdvisorModel)(a)&&H({enabled:!0,model:a})},disabled:B,children:[(0,b.jsx)(m.SelectTrigger,{className:"h-8 w-auto min-w-[12rem] text-xs",children:(0,b.jsx)(m.SelectValue,{})}),(0,b.jsx)(m.SelectContent,{children:k.ADVISOR_ALLOWED_MODELS.map(a=>(0,b.jsx)(m.SelectItem,{value:a,children:a},a))})]})]})]})]})}var v=a.i(32307),w=a.i(78019),x=a.i(50891),y=a.i(26206),z=a.i(30400),A=a.i(59809),B=a.i(57216),C=a.i(48558),D=a.i(16611);function E(a){let b=(0,D.internalToUi)(a.claudeExecutionPermissionMode),c=(0,D.internalToUi)(a.codexExecutionPermissionMode),d=(0,D.internalToUi)(a.geminiExecutionPermissionMode);return b===c&&c===d?b:null}let F=["claude","codex","gemini"];function G({onToast:a}){let{data:d}=(0,e.useConfig)(),[f,g]=(0,c.useState)(0);return d?(0,b.jsx)(H,{config:d,onToast:a,onApplied:()=>g(a=>a+1)},f):(0,b.jsx)(z.Card,{children:(0,b.jsxs)("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:[(0,b.jsx)(i.Loader2,{className:"h-4 w-4 animate-spin"})," Loading…"]})})}function H({config:a,onToast:d,onApplied:e}){let f=(0,j.useQueryClient)(),g=(0,c.useState)(()=>{let b;return{topLevel:b=E(a),overrides:null!==E(a)?{...D.EMPTY_OVERRIDES}:{claude:(0,D.internalToUi)(a.claudeExecutionPermissionMode),codex:(0,D.internalToUi)(a.codexExecutionPermissionMode),gemini:(0,D.internalToUi)(a.geminiExecutionPermissionMode)},forceAccordionOpen:null===b}})[0],[h,k]=(0,c.useState)(g.topLevel),[m,o]=(0,c.useState)(g.overrides),[p,q]=(0,c.useState)(g.forceAccordionOpen),[r,s]=(0,c.useState)(!1),t=null===h||(0,D.hasDivergentOverride)(h,m);async function u(){let a=(0,D.buildSetupModePayload)(h,m);if(null!==a){s(!0);try{await n.api.post("/setup/mode",a),await f.invalidateQueries({queryKey:["config"]}),d("success","Execution mode updated"),e()}catch(a){a instanceof n.ApiError||a instanceof Error?d("error",a.message):d("error","Failed to update execution mode")}finally{s(!1)}}}return(0,b.jsxs)(z.Card,{id:"execution-mode",children:[(0,b.jsx)(z.CardHeader,{className:"px-0 pt-0",children:(0,b.jsxs)(z.CardTitle,{className:"flex items-center gap-1.5 text-base",children:[(0,b.jsx)("span",{children:"Execution Mode"}),(0,b.jsx)(A.DocsHelpInline,{docId:"concepts/safety-and-execution",label:"Execution Mode"})]})}),(0,b.jsx)("p",{className:"text-sm text-muted-foreground",children:"Pick how freely the agent may run shell, file, and tool commands on your machine. Dangerous operations — recursive deletes, privilege escalation, and secret-file reads — remain blocked in both modes."}),(0,b.jsxs)("div",{className:"mt-4 space-y-3",children:[(0,b.jsx)(I,{icon:(0,b.jsx)(x.ShieldCheck,{className:"h-5 w-5"}),title:"Safe",badge:"Recommended",selected:"safe"===h,onSelect:()=>k("safe"),children:"Agent runs with strict permission checks and asks for confirmation before side-effectful actions. Best when you want the agent to stay narrow."}),(0,b.jsxs)(I,{icon:(0,b.jsx)(y.Unlock,{className:"h-5 w-5"}),title:"Allow",selected:"allow"===h,onSelect:()=>k("allow"),children:["Agent runs with the skills, plugins, and MCP servers installed in your CLI harness. File-type support depends on your harness; the daemon does not manage it.",(0,b.jsx)(K,{})]}),(0,b.jsxs)(B.Collapsible,{open:p,onOpenChange:q,children:[(0,b.jsx)(B.CollapsibleTrigger,{asChild:!0,children:(0,b.jsxs)("button",{type:"button",className:"flex w-full items-center justify-between rounded-md border border-border bg-muted/20 px-3 py-2 text-left text-xs text-muted-foreground hover:bg-muted/40",children:[(0,b.jsxs)("span",{className:"flex items-center gap-2",children:[(0,b.jsx)(w.ChevronDown,{className:(0,C.cn)("h-3.5 w-3.5 transition-transform",p&&"rotate-180")}),"Advanced — per-backend overrides",t&&(0,b.jsx)("span",{className:"rounded bg-amber-500/15 px-1.5 py-0.5 text-[10px] font-medium text-amber-700 dark:text-amber-300",children:"mixed"})]}),(0,b.jsx)("span",{className:"text-[11px]",children:p?"Hide":"Show"})]})}),(0,b.jsx)(B.CollapsibleContent,{className:"mt-2 space-y-2 rounded-md border border-border bg-background p-3",children:F.map(a=>(0,b.jsx)(J,{backend:a,topLevel:h,override:m[a],onChange:b=>o(c=>({...c,[a]:b}))},a))})]}),(0,b.jsx)("div",{className:"flex justify-end pt-2",children:(0,b.jsx)(l.Button,{onClick:u,disabled:!(0,D.canApply)(h,m)||r,children:r?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(i.Loader2,{className:"mr-2 h-4 w-4 animate-spin"}),"Saving…"]}):"Apply"})})]})]})}function I({icon:a,title:c,badge:d,selected:e,onSelect:f,children:g}){return(0,b.jsxs)("button",{type:"button",onClick:f,className:(0,C.cn)("block w-full rounded-lg border p-3 text-left transition-colors",e?"border-primary bg-primary/5 shadow-sm":"border-border hover:border-foreground/30"),children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 font-semibold text-foreground",children:[a,c,d&&(0,b.jsx)("span",{className:"rounded bg-primary/15 px-1.5 py-0.5 text-[10px] font-medium text-primary",children:d})]}),(0,b.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:g})]})}function J({backend:a,topLevel:c,override:d,onChange:e}){let f=d??c,g=null===f?"pick a top-level mode first":`runs as: ${f}`;return(0,b.jsxs)("div",{className:"rounded-md border border-border/60 px-3 py-2",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsxs)("div",{className:"text-sm",children:[(0,b.jsxs)("div",{className:"font-medium text-foreground",children:[o.BACKEND_PROVIDER_LABELS[a],(0,b.jsxs)("span",{className:"ml-1 text-xs text-muted-foreground",children:["(",o.BACKEND_PROVIDER_SHORT[a],")"]})]}),(0,b.jsx)("div",{className:"text-[11px] text-muted-foreground",children:g})]}),(0,b.jsxs)("div",{className:"flex items-center gap-1 text-xs",children:[(0,b.jsx)(L,{active:null===d,label:"Follow",onClick:()=>e(null)}),(0,b.jsx)(L,{active:"safe"===d,label:"Safe",onClick:()=>e("safe")}),(0,b.jsx)(L,{active:"allow"===d,label:"Allow",onClick:()=>e("allow")})]})]}),"codex"===a&&"allow"===f&&(0,b.jsxs)("p",{className:"mt-2 flex items-start gap-1.5 text-[11px] text-amber-700 dark:text-amber-300",children:[(0,b.jsx)(v.AlertTriangle,{className:"mt-0.5 h-3 w-3 shrink-0"}),(0,b.jsx)("span",{children:"Codex Allow disables the daemon's absolute-block layer (sandbox-off). See the Allow card above."})]})]})}function K(){return(0,b.jsxs)("span",{className:"mt-3 flex items-start gap-2 rounded-md border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-xs text-amber-900 dark:text-amber-200",children:[(0,b.jsx)(v.AlertTriangle,{className:"mt-0.5 h-3.5 w-3.5 shrink-0"}),(0,b.jsxs)("span",{className:"space-y-1",children:[(0,b.jsxs)("span",{className:"block",children:[(0,b.jsx)("span",{className:"font-semibold",children:"Codex caveat."})," Codex CLI runs Allow mode under"," ",(0,b.jsx)("code",{className:"rounded bg-black/10 px-1 font-mono text-[11px] dark:bg-white/10",children:"--dangerously-bypass-approvals-and-sandbox"}),", a binary sandbox-off switch. Codex has no per-command hook layer for the daemon to attach the absolute-block patterns to, so destructive shell commands (",(0,b.jsx)("code",{className:"rounded bg-black/10 px-1 font-mono text-[11px] dark:bg-white/10",children:"rm -rf"}),","," ",(0,b.jsx)("code",{className:"rounded bg-black/10 px-1 font-mono text-[11px] dark:bg-white/10",children:"eval $(curl …)"}),", secret-file reads) are ",(0,b.jsx)("span",{className:"font-semibold",children:"not"})," ","pre-blocked for Codex in Allow mode the way they are for Claude Code and Gemini CLI."]}),(0,b.jsx)("span",{className:"block",children:"Use the Advanced section below to keep Codex on Safe (its workspace-write sandbox still applies) unless you accept this gap."})]})]})}function L({active:a,label:c,onClick:d}){return(0,b.jsx)("button",{type:"button",onClick:d,className:(0,C.cn)("rounded-md border px-2 py-1 transition-colors",a?"border-primary bg-primary/10 text-foreground":"border-border text-muted-foreground hover:border-foreground/30"),children:c})}var M=a.i(56295),N=a.i(74345);function O({title:a,defaultOpen:e=!1,children:f}){let[g,h]=(0,c.useState)(e);return(0,b.jsxs)(B.Collapsible,{open:g,onOpenChange:h,children:[(0,b.jsx)(B.CollapsibleTrigger,{asChild:!0,children:(0,b.jsxs)("button",{className:"flex w-full items-center gap-2 rounded-lg px-1 py-2 text-xs font-semibold uppercase tracking-wider text-muted-foreground hover:bg-muted/50 hover:text-foreground transition-colors",children:[(0,b.jsx)(d.ChevronRight,{className:(0,C.cn)("h-3.5 w-3.5 shrink-0 transition-transform duration-200",g&&"rotate-90")}),a]})}),(0,b.jsx)(B.CollapsibleContent,{className:"space-y-3 pt-1",children:f})]})}a.s(["default",0,function(){let{data:a}=(0,e.useConfig)(),{df:c}=(0,e.useConfigDefaults)(),{toast:d,showToast:i}=(0,f.useSaveConfig)(),{deferSaveFor:j,dv:k,dirtyFields:l}=(0,g.useDirtyFields)();if(!a)return(0,b.jsx)("div",{className:"text-muted-foreground",children:"Loading..."});let m=j(a);return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-2xl font-semibold text-foreground",children:"Models & Cost"}),(0,b.jsx)("p",{className:"mt-1 max-w-3xl text-sm text-muted-foreground",children:"AI backends, per-task routing, and execution limits. The backend cards are always visible — open the collapsible sections below when you need to tune individual processes or limits."})]}),(0,b.jsx)(N.SettingsToast,{toast:d}),(0,b.jsx)(u,{onToast:i}),(0,b.jsx)(G,{onToast:i}),(0,b.jsx)(h.BackendSettingsSection,{onToast:i,sections:["processes"]}),(0,b.jsx)(O,{title:"Execution limits",children:(0,b.jsxs)(M.ConfigSection,{title:"Execution limits",children:[(0,b.jsx)("p",{className:"pb-2 text-xs text-muted-foreground",children:"Concurrency and wall-clock limits that apply across every agent run, regardless of backend or tier."}),(0,b.jsx)(M.EditableField,{label:"Max Concurrent Sessions",value:k("maxConcurrentSessions",a.maxConcurrentSessions),configKey:"maxConcurrentSessions",type:"number",modified:l.has("maxConcurrentSessions"),defaultValue:c("maxConcurrentSessions"),description:"Total number of agent sessions allowed to run in parallel across all sources (DMs, routines, schedules). Additional requests are queued until a slot opens.",onSave:m}),(0,b.jsx)(M.EditableField,{label:"Max Reactive Sessions",value:k("maxReactiveSessions",a.maxReactiveSessions),configKey:"maxReactiveSessions",type:"number",modified:l.has("maxReactiveSessions"),defaultValue:c("maxReactiveSessions"),description:"Subset of the concurrent slots reserved for reactive work (incoming DMs and mentions). This guarantees routines never starve out messages you send right now — and vice versa for the remaining slots.",onSave:m}),(0,b.jsx)(M.EditableField,{label:"Execute Timeout",value:k("executeTimeoutMinutes",a.executeTimeoutMinutes),configKey:"executeTimeoutMinutes",type:"number",suffix:"min",min:1,max:1440,modified:l.has("executeTimeoutMinutes"),defaultValue:c("executeTimeoutMinutes"),description:"Maximum wall-clock time for a single agent execution. When exceeded the SDK stream is cancelled so retries don’t double-bill quota. Applies per attempt, not per retry chain.",onSave:m}),(0,b.jsx)(M.EditableField,{label:"Delegated Proxy Concurrency",value:k("delegatedProxyMaxConcurrent",a.delegatedProxyMaxConcurrent),configKey:"delegatedProxyMaxConcurrent",type:"number",min:1,max:64,modified:l.has("delegatedProxyMaxConcurrent"),defaultValue:c("delegatedProxyMaxConcurrent"),description:"Maximum simultaneous delegated-proxy invocations (Gmail/Calendar in delegated mode spawn a one-shot subprocess on the configured backend). Excess requests FIFO-queue with a 60-second wait timeout, then 503 with delegated_proxy_busy.",onSave:m})]})}),(0,b.jsx)(O,{title:"Session timeouts",children:(0,b.jsxs)(M.ConfigSection,{title:"Session timeouts",children:[(0,b.jsx)("p",{className:"pb-2 text-xs text-muted-foreground",children:"How long an idle conversation keeps its context before the next message starts fresh. Lower values save tokens on long-lived chats; higher values preserve continuity."}),(0,b.jsx)(M.EditableField,{label:"DM Timeout",value:k("sessionTimeoutDmMinutes",a.sessionTimeoutDmMinutes),configKey:"sessionTimeoutDmMinutes",type:"number",suffix:"min",modified:l.has("sessionTimeoutDmMinutes"),defaultValue:c("sessionTimeoutDmMinutes"),description:"Idle minutes before a direct-message session expires. Once expired, the next DM opens a new session without prior conversation history.",onSave:m}),(0,b.jsx)(M.EditableField,{label:"Channel Timeout",value:k("sessionTimeoutChannelMinutes",a.sessionTimeoutChannelMinutes),configKey:"sessionTimeoutChannelMinutes",type:"number",suffix:"min",modified:l.has("sessionTimeoutChannelMinutes"),defaultValue:c("sessionTimeoutChannelMinutes"),description:"Idle minutes before an @mention thread in a public channel expires. Usually shorter than DM timeout since channel context rotates faster.",onSave:m}),(0,b.jsx)(M.EditableField,{label:"Dashboard Timeout",value:k("sessionTimeoutDashboardMinutes",a.sessionTimeoutDashboardMinutes),configKey:"sessionTimeoutDashboardMinutes",type:"number",suffix:"min",modified:l.has("sessionTimeoutDashboardMinutes"),defaultValue:c("sessionTimeoutDashboardMinutes"),description:"Idle minutes before a dashboard Chat session expires. The session sidebar will still show it as a past conversation you can reopen.",onSave:m})]})}),(0,b.jsx)(O,{title:"Cost guardrails",children:(0,b.jsxs)(M.ConfigSection,{title:"Cost guardrails",children:[(0,b.jsx)("p",{className:"pb-2 text-xs text-muted-foreground",children:"Guardrails and alert thresholds for autonomous routine spend. The daily cap can skip lower-priority routines; the monthly cap only notifies. Reactive work such as DMs and mentions still runs."}),(0,b.jsx)(M.EditableField,{label:"Autonomous Daily Cost Cap",value:k("autonomousDailyCostCapUsd",a.autonomousDailyCostCapUsd),configKey:"autonomousDailyCostCapUsd",type:"number",suffix:"$",nullable:!0,emptyLabel:"Disabled",min:.01,modified:l.has("autonomousDailyCostCapUsd"),defaultValue:c("autonomousDailyCostCapUsd"),description:"Maximum daily USD spend for autonomous sessions before lower-priority routines are skipped. Leave blank to disable the cap.",onSave:m}),(0,b.jsx)(M.EditableField,{label:"Autonomous Monthly Cost Cap (alert only)",value:k("autonomousMonthlyCostCapUsd",a.autonomousMonthlyCostCapUsd),configKey:"autonomousMonthlyCostCapUsd",type:"number",suffix:"$",nullable:!0,emptyLabel:"Disabled",min:.01,modified:l.has("autonomousMonthlyCostCapUsd"),defaultValue:c("autonomousMonthlyCostCapUsd"),description:"Notification threshold for the rolling 30-day spend. Surfaces a warning at 80% and an error at 100% in the Notifications panel. No dispatcher enforcement — pair with the daily cap for hard guardrails.",onSave:m})]})})]})}],83679)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=packages_dashboard_src_app_settings_models_page_tsx_0djsx88._.js.map
|
package/.next/server/chunks/ssr/packages_dashboard_src_app_settings_models_page_tsx_0djsx88._.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/dashboard/src/app/settings/models/page.tsx","../../../../../../packages/dashboard/src/components/settings/backend-settings.tsx","../../../../../../packages/dashboard/src/components/settings/backends-section.tsx","../../../../../../packages/dashboard/src/components/settings/execution-mode-settings.tsx","../../../../../../packages/dashboard/src/components/settings/execution-mode-settings.logic.ts"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { ChevronRight } from \"lucide-react\";\nimport { useConfig, useConfigDefaults } from \"@/lib/hooks/use-config\";\nimport { useSaveConfig } from \"@/lib/hooks/use-save-config\";\nimport { useDirtyFields } from \"@/lib/hooks/use-dirty-fields\";\nimport { BackendSettingsSection } from \"@/components/settings/backend-settings\";\nimport { BackendsSection } from \"@/components/settings/backends-section\";\nimport { ExecutionModeSettings } from \"@/components/settings/execution-mode-settings\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport {\n ConfigSection,\n EditableField,\n} from \"@/components/settings/editors\";\nimport { SettingsToast } from \"@/components/settings/settings-navigation\";\nimport { cn } from \"@/lib/utils\";\n\nfunction CollapsibleSection({\n title,\n defaultOpen = false,\n children,\n}: {\n title: string;\n defaultOpen?: boolean;\n children: React.ReactNode;\n}) {\n const [open, setOpen] = useState(defaultOpen);\n return (\n <Collapsible open={open} onOpenChange={setOpen}>\n <CollapsibleTrigger asChild>\n <button className=\"flex w-full items-center gap-2 rounded-lg px-1 py-2 text-xs font-semibold uppercase tracking-wider text-muted-foreground hover:bg-muted/50 hover:text-foreground transition-colors\">\n <ChevronRight\n className={cn(\n \"h-3.5 w-3.5 shrink-0 transition-transform duration-200\",\n open && \"rotate-90\",\n )}\n />\n {title}\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"space-y-3 pt-1\">\n {children}\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\nexport default function ModelsSettingsPage() {\n const { data: config } = useConfig();\n const { df } = useConfigDefaults();\n // toast + showToast stay for BackendSettingsSection / BackendsSection (own save flows)\n const { toast, showToast } = useSaveConfig();\n // deferSave / dv for the EditableField components in collapsible sections\n const { deferSaveFor, dv, dirtyFields } = useDirtyFields();\n\n if (!config) {\n return <div className=\"text-muted-foreground\">Loading...</div>;\n }\n\n const deferSave = deferSaveFor(config);\n\n return (\n <>\n <div>\n <h1 className=\"text-2xl font-semibold text-foreground\">\n Models & Cost\n </h1>\n <p className=\"mt-1 max-w-3xl text-sm text-muted-foreground\">\n AI backends, per-task routing, and execution limits. The backend\n cards are always visible — open the collapsible sections below\n when you need to tune individual processes or limits.\n </p>\n </div>\n\n {/* Toast for BackendsSection / BackendSettingsSection immediate saves */}\n <SettingsToast toast={toast} />\n\n {/* ── Always visible: Backends (own save flow) ── */}\n <BackendsSection onToast={showToast} />\n\n <ExecutionModeSettings onToast={showToast} />\n\n <BackendSettingsSection onToast={showToast} sections={[\"processes\"]} />\n\n {/* ── Collapsed by default — deferred save ── */}\n\n <CollapsibleSection title=\"Execution limits\">\n <ConfigSection title=\"Execution limits\">\n <p className=\"pb-2 text-xs text-muted-foreground\">\n Concurrency and wall-clock limits that apply across every agent run,\n regardless of backend or tier.\n </p>\n <EditableField\n label=\"Max Concurrent Sessions\"\n value={dv(\"maxConcurrentSessions\", config.maxConcurrentSessions)}\n configKey=\"maxConcurrentSessions\"\n type=\"number\"\n modified={dirtyFields.has(\"maxConcurrentSessions\")}\n defaultValue={df(\"maxConcurrentSessions\")}\n description=\"Total number of agent sessions allowed to run in parallel across all sources (DMs, routines, schedules). Additional requests are queued until a slot opens.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Max Reactive Sessions\"\n value={dv(\"maxReactiveSessions\", config.maxReactiveSessions)}\n configKey=\"maxReactiveSessions\"\n type=\"number\"\n modified={dirtyFields.has(\"maxReactiveSessions\")}\n defaultValue={df(\"maxReactiveSessions\")}\n description=\"Subset of the concurrent slots reserved for reactive work (incoming DMs and mentions). This guarantees routines never starve out messages you send right now — and vice versa for the remaining slots.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Execute Timeout\"\n value={dv(\"executeTimeoutMinutes\", config.executeTimeoutMinutes)}\n configKey=\"executeTimeoutMinutes\"\n type=\"number\"\n suffix=\"min\"\n min={1}\n max={1440}\n modified={dirtyFields.has(\"executeTimeoutMinutes\")}\n defaultValue={df(\"executeTimeoutMinutes\")}\n description=\"Maximum wall-clock time for a single agent execution. When exceeded the SDK stream is cancelled so retries don’t double-bill quota. Applies per attempt, not per retry chain.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Delegated Proxy Concurrency\"\n value={dv(\"delegatedProxyMaxConcurrent\", config.delegatedProxyMaxConcurrent)}\n configKey=\"delegatedProxyMaxConcurrent\"\n type=\"number\"\n min={1}\n max={64}\n modified={dirtyFields.has(\"delegatedProxyMaxConcurrent\")}\n defaultValue={df(\"delegatedProxyMaxConcurrent\")}\n description=\"Maximum simultaneous delegated-proxy invocations (Gmail/Calendar in delegated mode spawn a one-shot subprocess on the configured backend). Excess requests FIFO-queue with a 60-second wait timeout, then 503 with delegated_proxy_busy.\"\n onSave={deferSave}\n />\n </ConfigSection>\n </CollapsibleSection>\n\n <CollapsibleSection title=\"Session timeouts\">\n <ConfigSection title=\"Session timeouts\">\n <p className=\"pb-2 text-xs text-muted-foreground\">\n How long an idle conversation keeps its context before the next message\n starts fresh. Lower values save tokens on long-lived chats; higher values\n preserve continuity.\n </p>\n <EditableField\n label=\"DM Timeout\"\n value={dv(\"sessionTimeoutDmMinutes\", config.sessionTimeoutDmMinutes)}\n configKey=\"sessionTimeoutDmMinutes\"\n type=\"number\"\n suffix=\"min\"\n modified={dirtyFields.has(\"sessionTimeoutDmMinutes\")}\n defaultValue={df(\"sessionTimeoutDmMinutes\")}\n description=\"Idle minutes before a direct-message session expires. Once expired, the next DM opens a new session without prior conversation history.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Channel Timeout\"\n value={dv(\"sessionTimeoutChannelMinutes\", config.sessionTimeoutChannelMinutes)}\n configKey=\"sessionTimeoutChannelMinutes\"\n type=\"number\"\n suffix=\"min\"\n modified={dirtyFields.has(\"sessionTimeoutChannelMinutes\")}\n defaultValue={df(\"sessionTimeoutChannelMinutes\")}\n description=\"Idle minutes before an @mention thread in a public channel expires. Usually shorter than DM timeout since channel context rotates faster.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Dashboard Timeout\"\n value={dv(\"sessionTimeoutDashboardMinutes\", config.sessionTimeoutDashboardMinutes)}\n configKey=\"sessionTimeoutDashboardMinutes\"\n type=\"number\"\n suffix=\"min\"\n modified={dirtyFields.has(\"sessionTimeoutDashboardMinutes\")}\n defaultValue={df(\"sessionTimeoutDashboardMinutes\")}\n description=\"Idle minutes before a dashboard Chat session expires. The session sidebar will still show it as a past conversation you can reopen.\"\n onSave={deferSave}\n />\n </ConfigSection>\n </CollapsibleSection>\n\n <CollapsibleSection title=\"Cost guardrails\">\n <ConfigSection title=\"Cost guardrails\">\n <p className=\"pb-2 text-xs text-muted-foreground\">\n Guardrails and alert thresholds for autonomous routine spend. The\n daily cap can skip lower-priority routines; the monthly cap only\n notifies. Reactive work such as DMs and mentions still runs.\n </p>\n <EditableField\n label=\"Autonomous Daily Cost Cap\"\n value={dv(\"autonomousDailyCostCapUsd\", config.autonomousDailyCostCapUsd)}\n configKey=\"autonomousDailyCostCapUsd\"\n type=\"number\"\n suffix=\"$\"\n nullable\n emptyLabel=\"Disabled\"\n min={0.01}\n modified={dirtyFields.has(\"autonomousDailyCostCapUsd\")}\n defaultValue={df(\"autonomousDailyCostCapUsd\")}\n description=\"Maximum daily USD spend for autonomous sessions before lower-priority routines are skipped. Leave blank to disable the cap.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Autonomous Monthly Cost Cap (alert only)\"\n value={dv(\"autonomousMonthlyCostCapUsd\", config.autonomousMonthlyCostCapUsd)}\n configKey=\"autonomousMonthlyCostCapUsd\"\n type=\"number\"\n suffix=\"$\"\n nullable\n emptyLabel=\"Disabled\"\n min={0.01}\n modified={dirtyFields.has(\"autonomousMonthlyCostCapUsd\")}\n defaultValue={df(\"autonomousMonthlyCostCapUsd\")}\n description=\"Notification threshold for the rolling 30-day spend. Surfaces a warning at 80% and an error at 100% in the Notifications panel. No dispatcher enforcement — pair with the daily cap for hard guardrails.\"\n onSave={deferSave}\n />\n </ConfigSection>\n </CollapsibleSection>\n </>\n );\n}\n","\"use client\";\n\nimport type {\n BackendId,\n BackendModel,\n} from \"@aitne/shared\";\nimport { useCallback, useState } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport {\n Loader2,\n Pencil,\n Save,\n XCircle,\n} from \"lucide-react\";\nimport { Card, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { Alert } from \"@/components/ui/alert\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { ApiError, api } from \"@/lib/api-client\";\nimport { useBackends } from \"@/lib/hooks/use-backends\";\nimport { useProcessConfig } from \"@/lib/hooks/use-process-config\";\nimport type {\n BackendWarning,\n ProcessBackendConfigRow,\n} from \"@/lib/api-types\";\nimport {\n formatModelName,\n getBackendLabel,\n getProcessLabel,\n} from \"@/lib/backend-ui\";\nimport { formatCurrency } from \"@/lib/utils\";\n\ntype ToastType = \"success\" | \"error\" | \"warning\";\n\n/**\n * After the SETUP-UI-CONSOLIDATION-DESIGN.md refactor this component\n * only owns the Process Routing table. The former `defaults` and\n * `backends` sections moved into `BackendsAndPlansSection`, and the\n * `sections` prop narrowed to its single remaining value. The prop is\n * retained so future consumers can re-introduce other sections without\n * a call-site rewrite — today only `\"processes\"` is accepted.\n */\ninterface BackendSettingsSectionProps {\n onToast: (type: ToastType, message: string) => void;\n sections?: Array<\"processes\">;\n}\n\ninterface ProcessDraft {\n processKey: string;\n defaultTier: \"lite\" | \"medium\" | \"high\";\n mainBackend: BackendId;\n mainModel: string;\n fallbackBackend: BackendId | null;\n fallbackModel: string | null;\n maxTurns: number;\n maxBudgetUsd: number;\n}\n\nfunction getModelsForTier(\n models: BackendModel[],\n tier: \"lite\" | \"medium\" | \"high\",\n): BackendModel[] {\n const tierModels = models.filter((model) => model.tier === tier);\n return tierModels.length > 0 ? tierModels : models;\n}\n\n/**\n * Haiku detection by model-id substring — same predicate shape as\n * `HaikuAdvisorWarning.isAdvisorCompatibleBase()`, inverted. We match on\n * substring (not a hardcoded model id) so new Haiku releases get caught\n * without editing this file.\n */\nfunction isHaikuModel(modelId: string | null | undefined): boolean {\n if (!modelId) return false;\n return modelId.toLowerCase().includes(\"haiku\");\n}\n\n/**\n * Per-process guidance shown above the row's controls. Persistent (not\n * tied to the model picker) so users can read the trade-off before\n * editing. Backend-specific because the advice references models that\n * only exist on a particular backend (Opus → Claude).\n *\n * The heavy-tier model label is resolved from the backend's registry\n * (`BackendModel.label`) instead of hardcoded — a future Opus rename\n * picks up automatically.\n */\nfunction getProcessGuidance(\n processKey: string,\n mainBackend: BackendId | undefined,\n mainBackendModels: BackendModel[],\n): string | null {\n if (processKey === \"routine.morning_routine\" && mainBackend === \"claude\") {\n const heavyModel = mainBackendModels.find(\n (model) =>\n model.tier === \"high\" && model.available && !model.deprecated,\n );\n if (!heavyModel) return null;\n return `Defaults to Sonnet to preserve Claude quota — ${heavyModel.label} depletes the 5h window much faster. If you want better instruction-following or more thorough day-plan output, switch Main Model to ${heavyModel.label}.`;\n }\n return null;\n}\n\n/**\n * Process keys where pinning to Haiku typically degrades output quality.\n * Warning is non-blocking — the save button still works.\n */\nconst HAIKU_WARNING_BY_PROCESS: Record<string, string> = {\n \"message.dm\": \"DM response quality may degrade. Sonnet is recommended for important conversations.\",\n \"message.mention\": \"Mention response quality may degrade. Sonnet is recommended.\",\n \"dashboard.chat\": \"Dashboard chat response quality may degrade. Sonnet is recommended.\",\n \"routine.morning_routine\": \"Long-form generation may produce shorter/rougher output with Haiku. Sonnet is recommended.\",\n \"routine.evening_review\": \"Long-form generation may produce shorter/rougher output with Haiku. Sonnet is recommended.\",\n \"routine.weekly_review\": \"Weekly reviews require reasoning depth. Haiku may produce less coherent output.\",\n \"routine.monthly_review\": \"Monthly reviews require reasoning depth. Haiku may produce less coherent output.\",\n \"agent.task\": \"Sonnet is recommended for complex task execution. Haiku may make rougher tool-use decisions.\",\n};\n\nfunction pickModelForTier(\n models: BackendModel[],\n tier: \"lite\" | \"medium\" | \"high\",\n preferredModelId?: string | null,\n): string {\n const tierModels = getModelsForTier(models, tier);\n if (\n preferredModelId &&\n tierModels.some((model) => model.modelId === preferredModelId)\n ) {\n return preferredModelId;\n }\n return tierModels[0]?.modelId ?? models[0]?.modelId ?? \"\";\n}\n\nfunction modelLabel(models: BackendModel[], modelId: string | null): string {\n if (!modelId) return \"Disabled\";\n return (\n models.find((model) => model.modelId === modelId)?.label ??\n formatModelName(modelId)\n );\n}\n\nfunction formatBackendApiError(error: unknown): string {\n if (!(error instanceof ApiError)) {\n return error instanceof Error ? error.message : \"Request failed\";\n }\n\n const body = error.body as Record<string, unknown> | null;\n const code = typeof body?.error === \"string\" ? body.error : null;\n const processKeys = Array.isArray(body?.processKeys)\n ? body.processKeys.filter((value): value is string => typeof value === \"string\")\n : [];\n\n switch (code) {\n case \"backend_in_use\":\n return `This backend is still used by: ${processKeys.join(\", \")}. Reassign those processes first.`;\n case \"default_backend\":\n return \"Reassign the default backend before disabling it.\";\n case \"main_backend_disabled\":\n return \"The selected main backend is disabled. Enable it first.\";\n case \"fallback_backend_disabled\":\n return \"The selected fallback backend is disabled. Enable it first.\";\n case \"fallback_same_as_main\":\n return \"Fallback backend must differ from the main backend.\";\n case \"fallback_incomplete\":\n return \"Fallback backend and fallback model must either both be set or both be disabled.\";\n case \"invalid_main_model\":\n return \"The selected main model does not belong to the chosen backend.\";\n case \"invalid_fallback_model\":\n return \"The selected fallback model does not belong to the chosen fallback backend.\";\n case \"multi_backend_unavailable\":\n return \"Multi-backend tables are not available yet. Run migrations first.\";\n default:\n return error.message;\n }\n}\n\nexport function BackendSettingsSection({\n onToast,\n sections = [\"processes\"],\n}: BackendSettingsSectionProps) {\n const showProcesses = sections.includes(\"processes\");\n const queryClient = useQueryClient();\n const {\n data: backendsData,\n error: backendsError,\n isLoading: backendsLoading,\n } = useBackends({ enabled: showProcesses });\n const {\n data: processConfigData,\n error: processError,\n isLoading: processLoading,\n } = useProcessConfig({ enabled: showProcesses });\n const [editingProcessKey, setEditingProcessKey] = useState<string | null>(null);\n const [processDraft, setProcessDraft] = useState<ProcessDraft | null>(null);\n const [savingProcess, setSavingProcess] = useState(false);\n\n const refreshQueries = useCallback(async (): Promise<void> => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"backends\"] }),\n queryClient.invalidateQueries({ queryKey: [\"process-config\"] }),\n queryClient.invalidateQueries({ queryKey: [\"cost\"] }),\n queryClient.invalidateQueries({ queryKey: [\"metrics\"] }),\n ]);\n }, [queryClient]);\n\n const combinedError = showProcesses ? backendsError ?? processError : null;\n if (combinedError) {\n const unavailable =\n combinedError instanceof ApiError && combinedError.status === 503;\n return (\n <Card>\n <CardHeader>\n <CardTitle>Process Routing</CardTitle>\n </CardHeader>\n <p className=\"max-w-prose text-sm text-muted-foreground\">\n {unavailable\n ? \"Multi-backend tables are not available yet. Run migrations first.\"\n : combinedError instanceof Error\n ? combinedError.message\n : \"Failed to load process routing.\"}\n </p>\n </Card>\n );\n }\n\n if (!showProcesses) return null;\n\n const loading =\n backendsLoading || !backendsData || processLoading || !processConfigData;\n if (loading) {\n return (\n <Card>\n <CardHeader>\n <CardTitle>Process Routing</CardTitle>\n </CardHeader>\n <p className=\"text-sm text-muted-foreground\">\n Loading process routing…\n </p>\n </Card>\n );\n }\n\n const backendMap = new Map(\n backendsData.backends.map((backend) => [backend.id, backend]),\n );\n const enabledBackends = backendsData.backends.filter(\n (backend) => backend.enabled,\n );\n\n function beginProcessEdit(config: ProcessBackendConfigRow): void {\n setEditingProcessKey(config.processKey);\n setProcessDraft({\n processKey: config.processKey,\n defaultTier: config.defaultTier,\n mainBackend: config.mainBackend,\n mainModel: config.mainModel,\n fallbackBackend: config.fallbackBackend,\n fallbackModel: config.fallbackModel,\n maxTurns: config.maxTurns,\n maxBudgetUsd: config.maxBudgetUsd,\n });\n }\n\n function updateProcessMainBackend(nextBackendId: BackendId): void {\n const backend = backendMap.get(nextBackendId);\n if (!backend || !processDraft) return;\n\n const fallbackNeedsReset = processDraft.fallbackBackend === nextBackendId;\n setProcessDraft({\n ...processDraft,\n mainBackend: nextBackendId,\n mainModel: pickModelForTier(\n backend.models,\n processDraft.defaultTier,\n processDraft.mainModel,\n ),\n fallbackBackend: fallbackNeedsReset ? null : processDraft.fallbackBackend,\n fallbackModel: fallbackNeedsReset ? null : processDraft.fallbackModel,\n });\n }\n\n function updateProcessFallbackBackend(nextBackendId: BackendId | null): void {\n if (!processDraft) return;\n if (!nextBackendId) {\n setProcessDraft({\n ...processDraft,\n fallbackBackend: null,\n fallbackModel: null,\n });\n return;\n }\n\n const backend = backendMap.get(nextBackendId);\n if (!backend) return;\n setProcessDraft({\n ...processDraft,\n fallbackBackend: nextBackendId,\n fallbackModel: pickModelForTier(\n backend.models,\n processDraft.defaultTier,\n processDraft.fallbackModel,\n ),\n });\n }\n\n async function saveProcessConfig(): Promise<void> {\n if (!processDraft) return;\n\n setSavingProcess(true);\n try {\n const result = await api.put<{ warnings?: BackendWarning[] }>(\n `/process-config/${processDraft.processKey}`,\n {\n mainBackend: processDraft.mainBackend,\n mainModel: processDraft.mainModel,\n fallbackBackend: processDraft.fallbackBackend,\n fallbackModel: processDraft.fallbackModel,\n maxTurns: processDraft.maxTurns,\n maxBudgetUsd: processDraft.maxBudgetUsd,\n },\n );\n await refreshQueries();\n if (result.warnings?.length) {\n onToast(\n \"warning\",\n `Saved — ${result.warnings.map((w) => w.message).join(\"; \")}`,\n );\n } else {\n onToast(\n \"success\",\n `${getProcessLabel(processDraft.processKey)} updated`,\n );\n }\n setEditingProcessKey(null);\n setProcessDraft(null);\n } catch (error) {\n onToast(\"error\", formatBackendApiError(error));\n } finally {\n setSavingProcess(false);\n }\n }\n\n return (\n <Card>\n <CardHeader className=\"items-start\">\n <div>\n <CardTitle>Process Routing</CardTitle>\n <p className=\"mt-1 max-w-3xl text-sm text-muted-foreground\">\n One row per process (event-handling pipeline). Each row shows the\n resolved main backend + model, the optional fallback that kicks in\n on <em>decisive</em> main-backend failures (quota exhausted, auth\n broken, model unavailable, timeout — not ordinary rate limiting),\n and the per-run limits. Click <em>Edit</em> to override any of\n them. “Default” badges mean the value is inherited from\n the main backend’s preset defaults above.\n </p>\n </div>\n </CardHeader>\n <div className=\"space-y-3\">\n {processConfigData.configs.map((config) => {\n const mainBackend = backendMap.get(config.mainBackend);\n const fallbackBackend = config.fallbackBackend\n ? backendMap.get(config.fallbackBackend)\n : null;\n const isEditing =\n editingProcessKey === config.processKey && processDraft;\n const draftMainModels = isEditing\n ? backendMap.get(processDraft.mainBackend)?.models ?? []\n : [];\n const draftFallbackModels =\n isEditing && processDraft.fallbackBackend\n ? backendMap.get(processDraft.fallbackBackend)?.models ?? []\n : [];\n\n return (\n <div\n key={config.processKey}\n className=\"rounded-xl border border-border p-4\"\n >\n <div className=\"flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between\">\n <div className=\"space-y-3\">\n <div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"text-base font-medium text-foreground\">\n {getProcessLabel(config.processKey)}\n </p>\n <Badge\n variant={\n config.defaultTier === \"high\"\n ? \"purple\"\n : config.defaultTier === \"medium\"\n ? \"blue\"\n : \"default\"\n }\n >\n Default {config.defaultTier}\n </Badge>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {config.processKey}\n </p>\n {(() => {\n const guidance = getProcessGuidance(\n config.processKey,\n config.mainBackend,\n mainBackend?.models ?? [],\n );\n return guidance ? (\n <Alert variant=\"info\" className=\"mt-2 text-xs\">\n {guidance}\n </Alert>\n ) : null;\n })()}\n </div>\n\n <div className=\"grid gap-3 text-sm text-muted-foreground md:grid-cols-3\">\n <div>\n <p className=\"font-medium text-foreground\">Main</p>\n <p>\n {mainBackend\n ? getBackendLabel(mainBackend.id)\n : config.mainBackend}\n </p>\n <p>\n {mainBackend\n ? modelLabel(mainBackend.models, config.mainModel)\n : config.mainModel}\n </p>\n </div>\n <div>\n <p className=\"font-medium text-foreground\">Fallback</p>\n {fallbackBackend && config.fallbackModel ? (\n <>\n <p>{getBackendLabel(fallbackBackend.id)}</p>\n <p>\n {modelLabel(\n fallbackBackend.models,\n config.fallbackModel,\n )}\n </p>\n </>\n ) : (\n <p>Disabled</p>\n )}\n </div>\n <div>\n <p className=\"font-medium text-foreground\">Limits</p>\n <p>{config.maxTurns} turns</p>\n <p>{formatCurrency(config.maxBudgetUsd)} soft budget</p>\n </div>\n </div>\n </div>\n\n <Button\n variant=\"outline\"\n onClick={() => beginProcessEdit(config)}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n Edit\n </Button>\n </div>\n\n {isEditing && processDraft && (\n <div className=\"mt-4 grid gap-4 rounded-xl border border-border/80 bg-muted/30 p-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <p className=\"text-sm text-muted-foreground\">\n Main backend\n </p>\n <Select\n value={processDraft.mainBackend}\n onValueChange={(value) =>\n updateProcessMainBackend(value as BackendId)\n }\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Select backend\" />\n </SelectTrigger>\n <SelectContent>\n {backendsData.backends.map((backend) => (\n <SelectItem\n key={backend.id}\n value={backend.id}\n disabled={!backend.enabled}\n >\n {getBackendLabel(backend.id)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-2\">\n <p className=\"text-sm text-muted-foreground\">Main model</p>\n <Select\n value={processDraft.mainModel}\n onValueChange={(value) =>\n setProcessDraft((current) =>\n current ? { ...current, mainModel: value } : current,\n )\n }\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Select model\" />\n </SelectTrigger>\n <SelectContent>\n {draftMainModels.map((model) => (\n <SelectItem key={model.modelId} value={model.modelId}>\n {model.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {isHaikuModel(processDraft.mainModel) &&\n HAIKU_WARNING_BY_PROCESS[processDraft.processKey] && (\n <Alert variant=\"warning\" className=\"mt-2 text-xs\">\n {HAIKU_WARNING_BY_PROCESS[processDraft.processKey]}\n </Alert>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <p className=\"text-sm text-muted-foreground\">\n Fallback backend\n </p>\n <Select\n value={processDraft.fallbackBackend ?? \"__none__\"}\n onValueChange={(value) =>\n updateProcessFallbackBackend(\n value === \"__none__\" ? null : (value as BackendId),\n )\n }\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Select backend\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__none__\">Disabled</SelectItem>\n {backendsData.backends.map((backend) => (\n <SelectItem\n key={backend.id}\n value={backend.id}\n disabled={\n !backend.enabled ||\n backend.id === processDraft.mainBackend\n }\n >\n {getBackendLabel(backend.id)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-2\">\n <p className=\"text-sm text-muted-foreground\">\n Fallback model\n </p>\n <Select\n disabled={!processDraft.fallbackBackend}\n value={processDraft.fallbackModel ?? \"__none__\"}\n onValueChange={(value) =>\n setProcessDraft((current) =>\n current\n ? {\n ...current,\n fallbackModel: value === \"__none__\" ? null : value,\n }\n : current,\n )\n }\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Select model\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__none__\">Disabled</SelectItem>\n {draftFallbackModels.map((model) => (\n <SelectItem key={model.modelId} value={model.modelId}>\n {model.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-2\">\n <p className=\"text-sm text-muted-foreground\">Max turns</p>\n <Input\n type=\"number\"\n min={1}\n max={1000}\n value={processDraft.maxTurns}\n onChange={(event) =>\n setProcessDraft((current) =>\n current\n ? {\n ...current,\n maxTurns: Number(event.target.value) || 1,\n }\n : current,\n )\n }\n />\n <p className=\"text-xs text-muted-foreground\">\n Hard cap on agent turns per run for this process. One turn\n = one model response (possibly with tool calls). When\n reached, the run stops mid-task — raise this if you see\n “max turns” aborts.\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <p className=\"text-sm text-muted-foreground\">\n Soft budget (USD)\n </p>\n <Input\n type=\"number\"\n min={0}\n max={10000}\n step=\"0.01\"\n value={processDraft.maxBudgetUsd}\n onChange={(event) =>\n setProcessDraft((current) =>\n current\n ? {\n ...current,\n maxBudgetUsd: Number(event.target.value) || 0,\n }\n : current,\n )\n }\n />\n <p className=\"text-xs text-muted-foreground\">\n Per-run spend target in USD. “Soft” because\n it’s checked between turns — a long single turn can\n overshoot slightly. Runs exceeding this are aborted. Set\n to 0 to disable and rely only on the turn cap.\n </p>\n </div>\n\n <div className=\"md:col-span-2 flex items-center justify-between gap-3\">\n <p className=\"max-w-xl text-xs text-muted-foreground\">\n <strong>Fallback backend/model</strong> is consulted only\n on decisive failures: quota exhaustion, auth breakage,\n model refusal, timeout, or unrecoverable provider errors.\n Transient 5xx and ordinary rate limits are retried on the\n main backend first.\n </p>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n onClick={() => {\n setEditingProcessKey(null);\n setProcessDraft(null);\n }}\n >\n <XCircle className=\"h-4 w-4\" />\n Cancel\n </Button>\n <Button\n onClick={saveProcessConfig}\n disabled={savingProcess}\n >\n {savingProcess ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"h-4 w-4\" />\n )}\n Save Process\n </Button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n })}\n </div>\n\n {enabledBackends.length < 2 && (\n <Alert variant=\"warning\" className=\"mt-4 rounded-xl px-4 py-3 text-sm\">\n Enable another backend if you want fallback routing to be available\n for any process.\n </Alert>\n )}\n </Card>\n );\n}\n","\"use client\";\n\nimport { Loader2 } from \"lucide-react\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport type { BackendId } from \"@aitne/shared\";\nimport { ADVISOR_ALLOWED_MODELS, isAdvisorModel } from \"@aitne/shared\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { api, ApiError } from \"@/lib/api-client\";\nimport { BACKEND_PROVIDER_LABELS, BACKEND_PROVIDER_SHORT } from \"@/lib/backend-ui\";\nimport { useBackends } from \"@/lib/hooks/use-backends\";\nimport { useConfig } from \"@/lib/hooks/use-config\";\nimport type { SettingsToastState } from \"./settings-navigation\";\nimport { BackendCard } from \"./backend-card\";\nimport { BackendApiKeyPanel } from \"./backend-api-key-panel\";\nimport { SubscriptionAuthWarning } from \"./subscription-auth-warning\";\n\nconst BACKENDS: readonly BackendId[] = [\"claude\", \"codex\", \"gemini\"];\n\ninterface BackendsSectionProps {\n onToast: (type: SettingsToastState[\"type\"], message: string) => void;\n}\n\ninterface InstallCheckEntry {\n status: \"idle\" | \"checking\" | \"ok\" | \"error\";\n error?: string | null;\n version?: string | null;\n}\n\ninterface AdvisorState {\n enabled: boolean;\n model: string | null;\n}\n\n/**\n * /settings/models top section. Replaces the legacy\n * `BackendsAndPlansSection` which embedded the (now removed) plan\n * picker. Surface area:\n *\n * - One `BackendCard` per backend (CLI install, auth verify, enable\n * toggle, web-search toggle).\n * - \"Set as main\" button on non-main cards.\n * - Advisor toggle (off by default; when on, picks from\n * `ADVISOR_ALLOWED_MODELS`).\n */\nexport function BackendsSection({ onToast }: BackendsSectionProps) {\n const { data: backendsData, refetch: refetchBackends } = useBackends();\n const { data: config } = useConfig();\n const queryClient = useQueryClient();\n\n const [busyBackend, setBusyBackend] = useState<BackendId | null>(null);\n const [installCheck, setInstallCheck] = useState<\n Record<BackendId, InstallCheckEntry>\n >({\n claude: { status: \"idle\" },\n codex: { status: \"idle\" },\n gemini: { status: \"idle\" },\n });\n const [advisor, setAdvisor] = useState<AdvisorState | null>(null);\n const [advisorSaving, setAdvisorSaving] = useState(false);\n\n // Hydrate the advisor toggle from the backend on mount. Server is the\n // source of truth — the dashboard only reflects what the daemon says.\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const res = await api.get<{ enabled: boolean; model: string | null }>(\n \"/backends/advisor\",\n );\n if (cancelled) return;\n setAdvisor({ enabled: res.enabled, model: res.model });\n } catch {\n // Silently fall back to \"off, no model\" — the user can toggle it\n // and the next save will land the actual state.\n if (!cancelled) setAdvisor({ enabled: false, model: null });\n }\n })();\n return () => {\n cancelled = true;\n };\n }, []);\n\n const verifyInstall = useCallback(\n async (backendId: BackendId) => {\n setInstallCheck((prev) => ({\n ...prev,\n [backendId]: { status: \"checking\" },\n }));\n try {\n const res = await api.post<{\n ok: boolean;\n cliInstalled: boolean;\n cliCommand: string;\n exitCode: number | null;\n version: string | null;\n stdout: string;\n stderr: string;\n timedOut: boolean;\n }>(`/backends/${backendId}/verify-install`);\n await refetchBackends();\n if (res.ok) {\n setInstallCheck((prev) => ({\n ...prev,\n [backendId]: { status: \"ok\", version: res.version },\n }));\n } else {\n const reason = !res.cliInstalled\n ? `${res.cliCommand} not found on PATH`\n : res.timedOut\n ? `${res.cliCommand} --version timed out`\n : (res.stderr.trim() || res.stdout.trim() || \"CLI failed to run\");\n setInstallCheck((prev) => ({\n ...prev,\n [backendId]: { status: \"error\", error: reason },\n }));\n }\n } catch (err) {\n setInstallCheck((prev) => ({\n ...prev,\n [backendId]: {\n status: \"error\",\n error: err instanceof Error ? err.message : \"Verify install failed\",\n },\n }));\n }\n },\n [refetchBackends],\n );\n\n const setMain = useCallback(\n async (backendId: BackendId) => {\n setBusyBackend(backendId);\n try {\n // INTEGRATION_NATIVE_MODE_DESIGN.md §11.4 — the response body\n // carries `nativeUnbound` (one row per native integration the\n // switch cascaded to `disabled`). We surface that inline as part\n // of the toast so the user sees the consequence immediately,\n // rather than discovering silent disabled rows on the\n // /connections page later.\n const res = await api.put<{\n status?: string;\n nativeUnbound?: Array<{ key: string; priorNativeBackend: string }>;\n }>(\"/backends/main\", { backendId });\n await refetchBackends();\n await queryClient.invalidateQueries({ queryKey: [\"backends\"] });\n // Surface the §11.4 cascade and the §11.5 banner immediately.\n await queryClient.invalidateQueries({ queryKey: [\"integrations\"] });\n await queryClient.invalidateQueries({ queryKey: [\"health\"] });\n await queryClient.invalidateQueries({\n queryKey: [\"agent-actions\", \"native_unbound\"],\n });\n const unbound = res?.nativeUnbound ?? [];\n if (unbound.length > 0) {\n const keys = unbound.map((u) => u.key).join(\", \");\n onToast(\n \"warning\",\n `Main backend set to ${BACKEND_PROVIDER_LABELS[backendId]}. ${unbound.length} native integration${unbound.length === 1 ? \"\" : \"s\"} disabled (${keys}). Re-configure on /connections.`,\n );\n } else {\n onToast(\n \"success\",\n `Main backend set to ${BACKEND_PROVIDER_LABELS[backendId]}.`,\n );\n }\n } catch (err) {\n const message =\n err instanceof ApiError\n ? err.message\n : err instanceof Error\n ? err.message\n : \"Failed to set main backend\";\n onToast(\"error\", message);\n } finally {\n setBusyBackend(null);\n }\n },\n [refetchBackends, queryClient, onToast],\n );\n\n const toggleEnable = useCallback(\n async (backendId: BackendId) => {\n const current = backendsData?.backends.find((b) => b.id === backendId);\n if (!current) return;\n const next = !current.enabled;\n setBusyBackend(backendId);\n try {\n await api.post(`/backends/${backendId}/${next ? \"enable\" : \"disable\"}`);\n await refetchBackends();\n onToast(\n \"success\",\n `${BACKEND_PROVIDER_LABELS[backendId]} ${next ? \"enabled\" : \"disabled\"}.`,\n );\n } catch (err) {\n onToast(\n \"error\",\n err instanceof Error ? err.message : \"Failed to update backend\",\n );\n } finally {\n setBusyBackend(null);\n }\n },\n [backendsData, refetchBackends, onToast],\n );\n\n const toggleWebSearch = useCallback(\n async (backendId: BackendId) => {\n const current = backendsData?.backends.find((b) => b.id === backendId);\n if (!current) return;\n const next = !current.webSearchEnabled;\n setBusyBackend(backendId);\n try {\n await api.post(`/backends/${backendId}/web-search`, { enabled: next });\n await refetchBackends();\n } catch (err) {\n onToast(\n \"error\",\n err instanceof Error ? err.message : \"Failed to update web search\",\n );\n } finally {\n setBusyBackend(null);\n }\n },\n [backendsData, refetchBackends, onToast],\n );\n\n const saveAdvisor = useCallback(\n async (next: AdvisorState) => {\n setAdvisorSaving(true);\n try {\n await api.put(\"/backends/advisor\", {\n enabled: next.enabled,\n model: next.model,\n });\n setAdvisor(next);\n onToast(\n \"success\",\n `Advisor ${next.enabled ? \"enabled\" : \"disabled\"}.`,\n );\n } catch (err) {\n onToast(\n \"error\",\n err instanceof Error ? err.message : \"Failed to save advisor\",\n );\n } finally {\n setAdvisorSaving(false);\n }\n },\n [onToast],\n );\n\n const mainBackend = backendsData?.defaultBackend ?? null;\n\n return (\n <section className=\"space-y-4\">\n <div>\n <h2 className=\"text-lg font-semibold text-foreground\">Backends</h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Install each backend’s CLI, verify authentication, and pick the\n main backend. The main backend runs every configurable process by\n default; per-process overrides live in the “Process\n configuration” card below.\n </p>\n </div>\n\n <SubscriptionAuthWarning />\n\n <div className=\"space-y-3\">\n {BACKENDS.map((backendId) => {\n const row = backendsData?.backends.find((b) => b.id === backendId);\n const isMain = mainBackend === backendId;\n const permissionMode = config\n ? (config[\n `${backendId}ExecutionPermissionMode` as keyof typeof config\n ] as string | null | undefined)\n : null;\n return (\n <div key={backendId} className=\"space-y-2\">\n <BackendCard\n backendId={backendId}\n mode=\"settings\"\n isMain={isMain}\n authStatus={row?.authStatus ?? \"unknown\"}\n authStatusDetail={row?.authDetail ?? null}\n authFirstExpiredAt={row?.authFirstExpiredAt ?? null}\n authLastSuccessAt={row?.authLastSuccessAt ?? null}\n authNotificationCount={row?.authNotificationCount ?? 0}\n cliInstalled={row?.cliInstalled ?? true}\n enabled={row?.enabled ?? false}\n webSearchEnabled={row?.webSearchEnabled ?? false}\n webSearchSupported={row?.webSearchSupported ?? false}\n permissionMode={permissionMode}\n busy={busyBackend === backendId}\n installCheck={installCheck[backendId]}\n onCliInstalled={() => {\n void refetchBackends();\n }}\n onVerifyInstall={() => {\n void verifyInstall(backendId);\n }}\n onToggleEnable={() => {\n void toggleEnable(backendId);\n }}\n onToggleWebSearch={() => {\n void toggleWebSearch(backendId);\n }}\n />\n <BackendApiKeyPanel\n backendId={backendId}\n onToast={onToast}\n />\n {!isMain && (\n <div className=\"flex justify-end\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={\n busyBackend !== null || !(row?.cliInstalled ?? false)\n }\n onClick={() => {\n void setMain(backendId);\n }}\n >\n Set {BACKEND_PROVIDER_SHORT[backendId]} as main\n </Button>\n </div>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Advisor — opt-in toggle, default disabled. */}\n {advisor && (\n <div className=\"rounded-xl border border-border bg-card p-4 shadow-sm\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"space-y-1\">\n <h3 className=\"text-sm font-semibold text-foreground\">\n Advisor (Claude Agent SDK)\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n When enabled, the Claude Agent SDK’s server-side advisor\n tool can offer the agent a second-opinion model on long\n turns. Off by default — turn it on only when you want the\n added cost.\n </p>\n </div>\n <Button\n size=\"sm\"\n variant={advisor.enabled ? \"outline\" : \"default\"}\n disabled={advisorSaving}\n onClick={() => {\n const next: AdvisorState = advisor.enabled\n ? { enabled: false, model: null }\n : {\n enabled: true,\n model: advisor.model ?? ADVISOR_ALLOWED_MODELS[0],\n };\n void saveAdvisor(next);\n }}\n >\n {advisorSaving && (\n <Loader2 className=\"mr-2 h-3.5 w-3.5 animate-spin\" />\n )}\n {advisor.enabled ? \"Disable advisor\" : \"Enable advisor\"}\n </Button>\n </div>\n {advisor.enabled && (\n <div className=\"mt-3 flex flex-wrap items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">Model:</span>\n <Select\n value={advisor.model ?? ADVISOR_ALLOWED_MODELS[0]}\n onValueChange={(next) => {\n if (!isAdvisorModel(next)) return;\n void saveAdvisor({ enabled: true, model: next });\n }}\n disabled={advisorSaving}\n >\n <SelectTrigger className=\"h-8 w-auto min-w-[12rem] text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {ADVISOR_ALLOWED_MODELS.map((m) => (\n <SelectItem key={m} value={m}>\n {m}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n </div>\n )}\n </section>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport {\n AlertTriangle,\n ChevronDown,\n Loader2,\n ShieldCheck,\n Unlock,\n} from \"lucide-react\";\nimport type { BackendId } from \"@aitne/shared\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { DocsHelpInline } from \"@/components/docs/docs-help-inline\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { api, ApiError } from \"@/lib/api-client\";\nimport {\n BACKEND_PROVIDER_LABELS,\n BACKEND_PROVIDER_SHORT,\n} from \"@/lib/backend-ui\";\nimport { useConfig } from \"@/lib/hooks/use-config\";\nimport { cn } from \"@/lib/utils\";\nimport type { SettingsToastState } from \"./settings-navigation\";\nimport {\n buildSetupModePayload,\n canApply,\n hasDivergentOverride,\n type ExecutionModeUi,\n type PerBackendOverrides,\n} from \"@/components/settings/execution-mode.logic\";\nimport {\n seedStateFromConfig,\n type ConfigModeSlice,\n} from \"./execution-mode-settings.logic\";\n\n/**\n * Settings-page counterpart to the setup wizard's Execution Mode step\n * (EXECUTION-MODE-DESIGN.md §5.2). Same copy as the wizard step so users\n * see one consistent explanation. Writes through `POST /api/setup/mode`,\n * which also records one `agent_actions` row per backend whose value\n * moved (§6.3).\n *\n * Unlike the setup step, this surface seeds the top-level pick from the\n * currently-persisted backend modes: if all three agree, that value is\n * highlighted; if they disagree, the accordion is force-opened so the\n * user sees the divergence before re-collapsing it.\n */\n\ninterface Props {\n onToast: (type: SettingsToastState[\"type\"], message: string) => void;\n}\n\nconst BACKENDS: readonly BackendId[] = [\"claude\", \"codex\", \"gemini\"] as const;\n\nexport function ExecutionModeSettings({ onToast }: Props) {\n const { data: config } = useConfig();\n // Generation counter — bump on successful apply so the inner card\n // remounts with a fresh seed from the refetched config. Without this\n // the local draft keeps showing the user's just-submitted deltas even\n // after the server is unified, so the \"mixed\" badge would stick.\n const [generation, setGeneration] = useState(0);\n\n if (!config) {\n return (\n <Card>\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" /> Loading…\n </div>\n </Card>\n );\n }\n\n return (\n <ExecutionModeSettingsCard\n key={generation}\n config={config}\n onToast={onToast}\n onApplied={() => setGeneration((g) => g + 1)}\n />\n );\n}\n\nexport interface ExecutionModeSettingsCardProps {\n config: ConfigModeSlice;\n onToast: (type: SettingsToastState[\"type\"], message: string) => void;\n onApplied: () => void;\n}\n\n/**\n * Seed-bearing inner card. Exported for render tests so the seed path\n * can be exercised directly without the `useConfig()` / loading wrapper.\n * The outer `ExecutionModeSettings` is the production entry point.\n */\nexport function ExecutionModeSettingsCard({\n config,\n onToast,\n onApplied,\n}: ExecutionModeSettingsCardProps) {\n const queryClient = useQueryClient();\n\n // Lazy useState initializer — seeds synchronously from the config snapshot\n // captured at mount. Remount-on-apply (via the outer `key`) is how the\n // card picks up a newly-persisted server state; user edits after mount\n // persist until the next successful apply.\n const initial = useState(() => seedStateFromConfig(config))[0];\n\n const [topLevel, setTopLevel] = useState<ExecutionModeUi | null>(\n initial.topLevel,\n );\n const [overrides, setOverrides] = useState<PerBackendOverrides>(\n initial.overrides,\n );\n const [advancedOpen, setAdvancedOpen] = useState(initial.forceAccordionOpen);\n const [saving, setSaving] = useState(false);\n\n // \"mixed\" indicator fires whenever the effective per-backend config is\n // not uniform — either the seed itself was divergent (topLevel === null)\n // or the user has set an override that differs from the top-level pick.\n const divergent =\n topLevel === null || hasDivergentOverride(topLevel, overrides);\n\n async function applyChange() {\n const payload = buildSetupModePayload(topLevel, overrides);\n if (payload === null) return;\n setSaving(true);\n try {\n await api.post(\"/setup/mode\", payload);\n await queryClient.invalidateQueries({ queryKey: [\"config\"] });\n onToast(\"success\", \"Execution mode updated\");\n // Bump the generation counter so the parent remounts this card\n // with a fresh seed from the just-refetched config.\n onApplied();\n } catch (err) {\n if (err instanceof ApiError) onToast(\"error\", err.message);\n else if (err instanceof Error) onToast(\"error\", err.message);\n else onToast(\"error\", \"Failed to update execution mode\");\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <Card id=\"execution-mode\">\n <CardHeader className=\"px-0 pt-0\">\n <CardTitle className=\"flex items-center gap-1.5 text-base\">\n <span>Execution Mode</span>\n <DocsHelpInline\n docId=\"concepts/safety-and-execution\"\n label=\"Execution Mode\"\n />\n </CardTitle>\n </CardHeader>\n <p className=\"text-sm text-muted-foreground\">\n Pick how freely the agent may run shell, file, and tool commands on\n your machine. Dangerous operations — recursive deletes, privilege\n escalation, and secret-file reads — remain blocked in both modes.\n </p>\n\n <div className=\"mt-4 space-y-3\">\n <ModeCard\n icon={<ShieldCheck className=\"h-5 w-5\" />}\n title=\"Safe\"\n badge=\"Recommended\"\n selected={topLevel === \"safe\"}\n onSelect={() => setTopLevel(\"safe\")}\n >\n Agent runs with strict permission checks and asks for confirmation\n before side-effectful actions. Best when you want the agent to stay\n narrow.\n </ModeCard>\n <ModeCard\n icon={<Unlock className=\"h-5 w-5\" />}\n title=\"Allow\"\n selected={topLevel === \"allow\"}\n onSelect={() => setTopLevel(\"allow\")}\n >\n Agent runs with the skills, plugins, and MCP servers installed in\n your CLI harness. File-type support depends on your harness; the\n daemon does not manage it.\n <CodexAllowCaveat />\n </ModeCard>\n\n <Collapsible open={advancedOpen} onOpenChange={setAdvancedOpen}>\n <CollapsibleTrigger asChild>\n <button\n type=\"button\"\n className=\"flex w-full items-center justify-between rounded-md border border-border bg-muted/20 px-3 py-2 text-left text-xs text-muted-foreground hover:bg-muted/40\"\n >\n <span className=\"flex items-center gap-2\">\n <ChevronDown\n className={cn(\n \"h-3.5 w-3.5 transition-transform\",\n advancedOpen && \"rotate-180\",\n )}\n />\n Advanced — per-backend overrides\n {divergent && (\n <span className=\"rounded bg-amber-500/15 px-1.5 py-0.5 text-[10px] font-medium text-amber-700 dark:text-amber-300\">\n mixed\n </span>\n )}\n </span>\n <span className=\"text-[11px]\">\n {advancedOpen ? \"Hide\" : \"Show\"}\n </span>\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"mt-2 space-y-2 rounded-md border border-border bg-background p-3\">\n {BACKENDS.map((backend) => (\n <BackendOverrideRow\n key={backend}\n backend={backend}\n topLevel={topLevel}\n override={overrides[backend]}\n onChange={(next) =>\n setOverrides((prev) => ({ ...prev, [backend]: next }))\n }\n />\n ))}\n </CollapsibleContent>\n </Collapsible>\n\n <div className=\"flex justify-end pt-2\">\n <Button\n onClick={applyChange}\n disabled={!canApply(topLevel, overrides) || saving}\n >\n {saving ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Saving…\n </>\n ) : (\n \"Apply\"\n )}\n </Button>\n </div>\n </div>\n </Card>\n );\n}\n\ninterface ModeCardProps {\n icon: React.ReactNode;\n title: string;\n badge?: string;\n selected: boolean;\n onSelect: () => void;\n children: React.ReactNode;\n}\n\nfunction ModeCard({\n icon,\n title,\n badge,\n selected,\n onSelect,\n children,\n}: ModeCardProps) {\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={cn(\n \"block w-full rounded-lg border p-3 text-left transition-colors\",\n selected\n ? \"border-primary bg-primary/5 shadow-sm\"\n : \"border-border hover:border-foreground/30\",\n )}\n >\n <div className=\"flex items-center gap-2 font-semibold text-foreground\">\n {icon}\n {title}\n {badge && (\n <span className=\"rounded bg-primary/15 px-1.5 py-0.5 text-[10px] font-medium text-primary\">\n {badge}\n </span>\n )}\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground\">{children}</p>\n </button>\n );\n}\n\ninterface BackendOverrideRowProps {\n backend: BackendId;\n topLevel: ExecutionModeUi | null;\n override: ExecutionModeUi | null;\n onChange: (next: ExecutionModeUi | null) => void;\n}\n\nfunction BackendOverrideRow({\n backend,\n topLevel,\n override,\n onChange,\n}: BackendOverrideRowProps) {\n const effective: ExecutionModeUi | null = override ?? topLevel;\n const effectiveLabel =\n effective === null ? \"pick a top-level mode first\" : `runs as: ${effective}`;\n const showCodexAllowWarning = backend === \"codex\" && effective === \"allow\";\n return (\n <div className=\"rounded-md border border-border/60 px-3 py-2\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm\">\n <div className=\"font-medium text-foreground\">\n {BACKEND_PROVIDER_LABELS[backend]}\n <span className=\"ml-1 text-xs text-muted-foreground\">\n ({BACKEND_PROVIDER_SHORT[backend]})\n </span>\n </div>\n <div className=\"text-[11px] text-muted-foreground\">\n {effectiveLabel}\n </div>\n </div>\n <div className=\"flex items-center gap-1 text-xs\">\n <OverrideChip\n active={override === null}\n label=\"Follow\"\n onClick={() => onChange(null)}\n />\n <OverrideChip\n active={override === \"safe\"}\n label=\"Safe\"\n onClick={() => onChange(\"safe\")}\n />\n <OverrideChip\n active={override === \"allow\"}\n label=\"Allow\"\n onClick={() => onChange(\"allow\")}\n />\n </div>\n </div>\n {showCodexAllowWarning && (\n <p className=\"mt-2 flex items-start gap-1.5 text-[11px] text-amber-700 dark:text-amber-300\">\n <AlertTriangle className=\"mt-0.5 h-3 w-3 shrink-0\" />\n <span>\n Codex Allow disables the daemon's absolute-block layer\n (sandbox-off). See the Allow card above.\n </span>\n </p>\n )}\n </div>\n );\n}\n\n/**\n * Inline caveat shown inside the Allow mode card.\n *\n * The setup wizard no longer hosts an Execution Mode step\n * (SETUP-FLOW-REDESIGN-PLAN §4) — Settings → Backends is now the only\n * surface where this posture can be flipped, so this card body is the\n * single source of truth for the Codex Allow-mode caveat.\n *\n * The card-level \"Dangerous operations are still blocked\" reassurance is\n * accurate for Claude Code and Gemini CLI — both backends expose a\n * pre-tool hook / admin policy surface the daemon attaches the\n * absolute-block layer to. Codex CLI does not. Codex Allow runs under\n * `--dangerously-bypass-approvals-and-sandbox`, a binary sandbox-off\n * switch with no per-command hook layer, so the absolute-block patterns\n * (`rm -rf`, `eval $(curl …)`, secret-file reads, …) are not pre-blocked\n * for Codex in Allow mode.\n */\nfunction CodexAllowCaveat() {\n return (\n <span className=\"mt-3 flex items-start gap-2 rounded-md border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-xs text-amber-900 dark:text-amber-200\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <span className=\"space-y-1\">\n <span className=\"block\">\n <span className=\"font-semibold\">Codex caveat.</span> Codex CLI\n runs Allow mode under{\" \"}\n <code className=\"rounded bg-black/10 px-1 font-mono text-[11px] dark:bg-white/10\">\n --dangerously-bypass-approvals-and-sandbox\n </code>\n , a binary sandbox-off switch. Codex has no per-command hook\n layer for the daemon to attach the absolute-block patterns to,\n so destructive shell commands (\n <code className=\"rounded bg-black/10 px-1 font-mono text-[11px] dark:bg-white/10\">\n rm -rf\n </code>\n ,{\" \"}\n <code className=\"rounded bg-black/10 px-1 font-mono text-[11px] dark:bg-white/10\">\n eval $(curl …)\n </code>\n , secret-file reads) are <span className=\"font-semibold\">not</span>{\" \"}\n pre-blocked for Codex in Allow mode the way they are for Claude\n Code and Gemini CLI.\n </span>\n <span className=\"block\">\n Use the Advanced section below to keep Codex on Safe (its\n workspace-write sandbox still applies) unless you accept this\n gap.\n </span>\n </span>\n </span>\n );\n}\n\nfunction OverrideChip({\n active,\n label,\n onClick,\n}: {\n active: boolean;\n label: string;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"rounded-md border px-2 py-1 transition-colors\",\n active\n ? \"border-primary bg-primary/10 text-foreground\"\n : \"border-border text-muted-foreground hover:border-foreground/30\",\n )}\n >\n {label}\n </button>\n );\n}\n","import type { ExecutionPermissionMode } from \"@aitne/shared\";\nimport {\n EMPTY_OVERRIDES,\n internalToUi,\n type ExecutionModeUi,\n type PerBackendOverrides,\n} from \"@/components/settings/execution-mode.logic\";\n\n/**\n * Pure helpers for `ExecutionModeSettings`\n * (EXECUTION-MODE-DESIGN.md §5.2). Extracted from the component so the\n * \"seed from config\" branches — especially the divergent-mixed-state\n * seed the accordion relies on — are unit-testable.\n */\n\nexport interface ConfigModeSlice {\n claudeExecutionPermissionMode: ExecutionPermissionMode;\n codexExecutionPermissionMode: ExecutionPermissionMode;\n geminiExecutionPermissionMode: ExecutionPermissionMode;\n}\n\n/**\n * Return the top-level pick for the Safe / Allow card. `null` means\n * \"the three backends disagree in the persisted config, so there is no\n * unified top-level value to highlight.\" Caller should force-open the\n * advanced accordion in that case so the user sees the divergence.\n */\nexport function deriveTopFromConfig(\n config: ConfigModeSlice,\n): ExecutionModeUi | null {\n const claudeUi = internalToUi(config.claudeExecutionPermissionMode);\n const codexUi = internalToUi(config.codexExecutionPermissionMode);\n const geminiUi = internalToUi(config.geminiExecutionPermissionMode);\n if (claudeUi === codexUi && codexUi === geminiUi) return claudeUi;\n return null;\n}\n\n/**\n * Return the per-backend overrides to seed when the user opens the card.\n * On a unified config (deriveTopFromConfig returns non-null) no overrides\n * are needed — every row follows the top-level pick. On a mixed config\n * every row is surfaced as an explicit override so the user can edit\n * each backend directly.\n */\nexport function deriveOverridesFromConfig(\n config: ConfigModeSlice,\n): PerBackendOverrides {\n const top = deriveTopFromConfig(config);\n if (top !== null) return { ...EMPTY_OVERRIDES };\n return {\n claude: internalToUi(config.claudeExecutionPermissionMode),\n codex: internalToUi(config.codexExecutionPermissionMode),\n gemini: internalToUi(config.geminiExecutionPermissionMode),\n };\n}\n\n/**\n * Combined seed helper: returns the tuple the component puts into its\n * three useState slots on first hydration, plus a hint for whether the\n * advanced accordion should be force-opened.\n */\nexport function seedStateFromConfig(config: ConfigModeSlice): {\n topLevel: ExecutionModeUi | null;\n overrides: PerBackendOverrides;\n forceAccordionOpen: boolean;\n} {\n const topLevel = deriveTopFromConfig(config);\n const overrides = deriveOverridesFromConfig(config);\n return {\n topLevel,\n overrides,\n forceAccordionOpen: topLevel === null,\n };\n}\n"],"names":["getModelsForTier","models","tier","tierModels","filter","model","length","isHaikuModel","modelId","toLowerCase","includes","getProcessGuidance","processKey","mainBackend","mainBackendModels","heavyModel","find","available","deprecated","label","HAIKU_WARNING_BY_PROCESS","pickModelForTier","preferredModelId","some","modelLabel","formatBackendApiError","error","Error","message","body","code","processKeys","Array","isArray","value","join","BackendSettingsSection","onToast","sections","showProcesses","queryClient","data","backendsData","backendsError","isLoading","backendsLoading","enabled","processConfigData","processError","processLoading","editingProcessKey","setEditingProcessKey","processDraft","setProcessDraft","savingProcess","setSavingProcess","refreshQueries","Promise","all","invalidateQueries","queryKey","combinedError","unavailable","status","className","loading","backendMap","Map","backends","map","backend","id","enabledBackends","beginProcessEdit","config","defaultTier","mainModel","fallbackBackend","fallbackModel","maxTurns","maxBudgetUsd","updateProcessMainBackend","nextBackendId","get","fallbackNeedsReset","updateProcessFallbackBackend","saveProcessConfig","result","put","warnings","w","configs","isEditing","draftMainModels","draftFallbackModels","variant","guidance","onClick","onValueChange","placeholder","disabled","current","type","min","max","onChange","event","Number","target","step"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../packages/dashboard/src/app/settings/models/page.tsx","../../../../../../packages/dashboard/src/components/settings/backends-section.tsx","../../../../../../packages/dashboard/src/components/settings/execution-mode-settings.tsx","../../../../../../packages/dashboard/src/components/settings/execution-mode-settings.logic.ts"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { ChevronRight } from \"lucide-react\";\nimport { useConfig, useConfigDefaults } from \"@/lib/hooks/use-config\";\nimport { useSaveConfig } from \"@/lib/hooks/use-save-config\";\nimport { useDirtyFields } from \"@/lib/hooks/use-dirty-fields\";\nimport { BackendSettingsSection } from \"@/components/settings/backend-settings\";\nimport { BackendsSection } from \"@/components/settings/backends-section\";\nimport { ExecutionModeSettings } from \"@/components/settings/execution-mode-settings\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport {\n ConfigSection,\n EditableField,\n} from \"@/components/settings/editors\";\nimport { SettingsToast } from \"@/components/settings/settings-navigation\";\nimport { cn } from \"@/lib/utils\";\n\nfunction CollapsibleSection({\n title,\n defaultOpen = false,\n children,\n}: {\n title: string;\n defaultOpen?: boolean;\n children: React.ReactNode;\n}) {\n const [open, setOpen] = useState(defaultOpen);\n return (\n <Collapsible open={open} onOpenChange={setOpen}>\n <CollapsibleTrigger asChild>\n <button className=\"flex w-full items-center gap-2 rounded-lg px-1 py-2 text-xs font-semibold uppercase tracking-wider text-muted-foreground hover:bg-muted/50 hover:text-foreground transition-colors\">\n <ChevronRight\n className={cn(\n \"h-3.5 w-3.5 shrink-0 transition-transform duration-200\",\n open && \"rotate-90\",\n )}\n />\n {title}\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"space-y-3 pt-1\">\n {children}\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\nexport default function ModelsSettingsPage() {\n const { data: config } = useConfig();\n const { df } = useConfigDefaults();\n // toast + showToast stay for BackendSettingsSection / BackendsSection (own save flows)\n const { toast, showToast } = useSaveConfig();\n // deferSave / dv for the EditableField components in collapsible sections\n const { deferSaveFor, dv, dirtyFields } = useDirtyFields();\n\n if (!config) {\n return <div className=\"text-muted-foreground\">Loading...</div>;\n }\n\n const deferSave = deferSaveFor(config);\n\n return (\n <>\n <div>\n <h1 className=\"text-2xl font-semibold text-foreground\">\n Models & Cost\n </h1>\n <p className=\"mt-1 max-w-3xl text-sm text-muted-foreground\">\n AI backends, per-task routing, and execution limits. The backend\n cards are always visible — open the collapsible sections below\n when you need to tune individual processes or limits.\n </p>\n </div>\n\n {/* Toast for BackendsSection / BackendSettingsSection immediate saves */}\n <SettingsToast toast={toast} />\n\n {/* ── Always visible: Backends (own save flow) ── */}\n <BackendsSection onToast={showToast} />\n\n <ExecutionModeSettings onToast={showToast} />\n\n <BackendSettingsSection onToast={showToast} sections={[\"processes\"]} />\n\n {/* ── Collapsed by default — deferred save ── */}\n\n <CollapsibleSection title=\"Execution limits\">\n <ConfigSection title=\"Execution limits\">\n <p className=\"pb-2 text-xs text-muted-foreground\">\n Concurrency and wall-clock limits that apply across every agent run,\n regardless of backend or tier.\n </p>\n <EditableField\n label=\"Max Concurrent Sessions\"\n value={dv(\"maxConcurrentSessions\", config.maxConcurrentSessions)}\n configKey=\"maxConcurrentSessions\"\n type=\"number\"\n modified={dirtyFields.has(\"maxConcurrentSessions\")}\n defaultValue={df(\"maxConcurrentSessions\")}\n description=\"Total number of agent sessions allowed to run in parallel across all sources (DMs, routines, schedules). Additional requests are queued until a slot opens.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Max Reactive Sessions\"\n value={dv(\"maxReactiveSessions\", config.maxReactiveSessions)}\n configKey=\"maxReactiveSessions\"\n type=\"number\"\n modified={dirtyFields.has(\"maxReactiveSessions\")}\n defaultValue={df(\"maxReactiveSessions\")}\n description=\"Subset of the concurrent slots reserved for reactive work (incoming DMs and mentions). This guarantees routines never starve out messages you send right now — and vice versa for the remaining slots.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Execute Timeout\"\n value={dv(\"executeTimeoutMinutes\", config.executeTimeoutMinutes)}\n configKey=\"executeTimeoutMinutes\"\n type=\"number\"\n suffix=\"min\"\n min={1}\n max={1440}\n modified={dirtyFields.has(\"executeTimeoutMinutes\")}\n defaultValue={df(\"executeTimeoutMinutes\")}\n description=\"Maximum wall-clock time for a single agent execution. When exceeded the SDK stream is cancelled so retries don’t double-bill quota. Applies per attempt, not per retry chain.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Delegated Proxy Concurrency\"\n value={dv(\"delegatedProxyMaxConcurrent\", config.delegatedProxyMaxConcurrent)}\n configKey=\"delegatedProxyMaxConcurrent\"\n type=\"number\"\n min={1}\n max={64}\n modified={dirtyFields.has(\"delegatedProxyMaxConcurrent\")}\n defaultValue={df(\"delegatedProxyMaxConcurrent\")}\n description=\"Maximum simultaneous delegated-proxy invocations (Gmail/Calendar in delegated mode spawn a one-shot subprocess on the configured backend). Excess requests FIFO-queue with a 60-second wait timeout, then 503 with delegated_proxy_busy.\"\n onSave={deferSave}\n />\n </ConfigSection>\n </CollapsibleSection>\n\n <CollapsibleSection title=\"Session timeouts\">\n <ConfigSection title=\"Session timeouts\">\n <p className=\"pb-2 text-xs text-muted-foreground\">\n How long an idle conversation keeps its context before the next message\n starts fresh. Lower values save tokens on long-lived chats; higher values\n preserve continuity.\n </p>\n <EditableField\n label=\"DM Timeout\"\n value={dv(\"sessionTimeoutDmMinutes\", config.sessionTimeoutDmMinutes)}\n configKey=\"sessionTimeoutDmMinutes\"\n type=\"number\"\n suffix=\"min\"\n modified={dirtyFields.has(\"sessionTimeoutDmMinutes\")}\n defaultValue={df(\"sessionTimeoutDmMinutes\")}\n description=\"Idle minutes before a direct-message session expires. Once expired, the next DM opens a new session without prior conversation history.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Channel Timeout\"\n value={dv(\"sessionTimeoutChannelMinutes\", config.sessionTimeoutChannelMinutes)}\n configKey=\"sessionTimeoutChannelMinutes\"\n type=\"number\"\n suffix=\"min\"\n modified={dirtyFields.has(\"sessionTimeoutChannelMinutes\")}\n defaultValue={df(\"sessionTimeoutChannelMinutes\")}\n description=\"Idle minutes before an @mention thread in a public channel expires. Usually shorter than DM timeout since channel context rotates faster.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Dashboard Timeout\"\n value={dv(\"sessionTimeoutDashboardMinutes\", config.sessionTimeoutDashboardMinutes)}\n configKey=\"sessionTimeoutDashboardMinutes\"\n type=\"number\"\n suffix=\"min\"\n modified={dirtyFields.has(\"sessionTimeoutDashboardMinutes\")}\n defaultValue={df(\"sessionTimeoutDashboardMinutes\")}\n description=\"Idle minutes before a dashboard Chat session expires. The session sidebar will still show it as a past conversation you can reopen.\"\n onSave={deferSave}\n />\n </ConfigSection>\n </CollapsibleSection>\n\n <CollapsibleSection title=\"Cost guardrails\">\n <ConfigSection title=\"Cost guardrails\">\n <p className=\"pb-2 text-xs text-muted-foreground\">\n Guardrails and alert thresholds for autonomous routine spend. The\n daily cap can skip lower-priority routines; the monthly cap only\n notifies. Reactive work such as DMs and mentions still runs.\n </p>\n <EditableField\n label=\"Autonomous Daily Cost Cap\"\n value={dv(\"autonomousDailyCostCapUsd\", config.autonomousDailyCostCapUsd)}\n configKey=\"autonomousDailyCostCapUsd\"\n type=\"number\"\n suffix=\"$\"\n nullable\n emptyLabel=\"Disabled\"\n min={0.01}\n modified={dirtyFields.has(\"autonomousDailyCostCapUsd\")}\n defaultValue={df(\"autonomousDailyCostCapUsd\")}\n description=\"Maximum daily USD spend for autonomous sessions before lower-priority routines are skipped. Leave blank to disable the cap.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Autonomous Monthly Cost Cap (alert only)\"\n value={dv(\"autonomousMonthlyCostCapUsd\", config.autonomousMonthlyCostCapUsd)}\n configKey=\"autonomousMonthlyCostCapUsd\"\n type=\"number\"\n suffix=\"$\"\n nullable\n emptyLabel=\"Disabled\"\n min={0.01}\n modified={dirtyFields.has(\"autonomousMonthlyCostCapUsd\")}\n defaultValue={df(\"autonomousMonthlyCostCapUsd\")}\n description=\"Notification threshold for the rolling 30-day spend. Surfaces a warning at 80% and an error at 100% in the Notifications panel. No dispatcher enforcement — pair with the daily cap for hard guardrails.\"\n onSave={deferSave}\n />\n </ConfigSection>\n </CollapsibleSection>\n </>\n );\n}\n","\"use client\";\n\nimport { Loader2 } from \"lucide-react\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport type { BackendId } from \"@aitne/shared\";\nimport { ADVISOR_ALLOWED_MODELS, isAdvisorModel } from \"@aitne/shared\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { api, ApiError } from \"@/lib/api-client\";\nimport { BACKEND_PROVIDER_LABELS, BACKEND_PROVIDER_SHORT } from \"@/lib/backend-ui\";\nimport { useBackends } from \"@/lib/hooks/use-backends\";\nimport { useConfig } from \"@/lib/hooks/use-config\";\nimport type { SettingsToastState } from \"./settings-navigation\";\nimport { BackendCard } from \"./backend-card\";\nimport { BackendApiKeyPanel } from \"./backend-api-key-panel\";\nimport { SubscriptionAuthWarning } from \"./subscription-auth-warning\";\n\nconst BACKENDS: readonly BackendId[] = [\"claude\", \"codex\", \"gemini\"];\n\ninterface BackendsSectionProps {\n onToast: (type: SettingsToastState[\"type\"], message: string) => void;\n}\n\ninterface InstallCheckEntry {\n status: \"idle\" | \"checking\" | \"ok\" | \"error\";\n error?: string | null;\n version?: string | null;\n}\n\ninterface AdvisorState {\n enabled: boolean;\n model: string | null;\n}\n\n/**\n * /settings/models top section. Replaces the legacy\n * `BackendsAndPlansSection` which embedded the (now removed) plan\n * picker. Surface area:\n *\n * - One `BackendCard` per backend (CLI install, auth verify, enable\n * toggle, web-search toggle).\n * - \"Set as main\" button on non-main cards.\n * - Advisor toggle (off by default; when on, picks from\n * `ADVISOR_ALLOWED_MODELS`).\n */\nexport function BackendsSection({ onToast }: BackendsSectionProps) {\n const { data: backendsData, refetch: refetchBackends } = useBackends();\n const { data: config } = useConfig();\n const queryClient = useQueryClient();\n\n const [busyBackend, setBusyBackend] = useState<BackendId | null>(null);\n const [installCheck, setInstallCheck] = useState<\n Record<BackendId, InstallCheckEntry>\n >({\n claude: { status: \"idle\" },\n codex: { status: \"idle\" },\n gemini: { status: \"idle\" },\n });\n const [advisor, setAdvisor] = useState<AdvisorState | null>(null);\n const [advisorSaving, setAdvisorSaving] = useState(false);\n\n // Hydrate the advisor toggle from the backend on mount. Server is the\n // source of truth — the dashboard only reflects what the daemon says.\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const res = await api.get<{ enabled: boolean; model: string | null }>(\n \"/backends/advisor\",\n );\n if (cancelled) return;\n setAdvisor({ enabled: res.enabled, model: res.model });\n } catch {\n // Silently fall back to \"off, no model\" — the user can toggle it\n // and the next save will land the actual state.\n if (!cancelled) setAdvisor({ enabled: false, model: null });\n }\n })();\n return () => {\n cancelled = true;\n };\n }, []);\n\n const verifyInstall = useCallback(\n async (backendId: BackendId) => {\n setInstallCheck((prev) => ({\n ...prev,\n [backendId]: { status: \"checking\" },\n }));\n try {\n const res = await api.post<{\n ok: boolean;\n cliInstalled: boolean;\n cliCommand: string;\n exitCode: number | null;\n version: string | null;\n stdout: string;\n stderr: string;\n timedOut: boolean;\n }>(`/backends/${backendId}/verify-install`);\n await refetchBackends();\n if (res.ok) {\n setInstallCheck((prev) => ({\n ...prev,\n [backendId]: { status: \"ok\", version: res.version },\n }));\n } else {\n const reason = !res.cliInstalled\n ? `${res.cliCommand} not found on PATH`\n : res.timedOut\n ? `${res.cliCommand} --version timed out`\n : (res.stderr.trim() || res.stdout.trim() || \"CLI failed to run\");\n setInstallCheck((prev) => ({\n ...prev,\n [backendId]: { status: \"error\", error: reason },\n }));\n }\n } catch (err) {\n setInstallCheck((prev) => ({\n ...prev,\n [backendId]: {\n status: \"error\",\n error: err instanceof Error ? err.message : \"Verify install failed\",\n },\n }));\n }\n },\n [refetchBackends],\n );\n\n const setMain = useCallback(\n async (backendId: BackendId) => {\n setBusyBackend(backendId);\n try {\n // INTEGRATION_NATIVE_MODE_DESIGN.md §11.4 — the response body\n // carries `nativeUnbound` (one row per native integration the\n // switch cascaded to `disabled`). We surface that inline as part\n // of the toast so the user sees the consequence immediately,\n // rather than discovering silent disabled rows on the\n // /connections page later.\n const res = await api.put<{\n status?: string;\n nativeUnbound?: Array<{ key: string; priorNativeBackend: string }>;\n }>(\"/backends/main\", { backendId });\n await refetchBackends();\n await queryClient.invalidateQueries({ queryKey: [\"backends\"] });\n // Surface the §11.4 cascade and the §11.5 banner immediately.\n await queryClient.invalidateQueries({ queryKey: [\"integrations\"] });\n await queryClient.invalidateQueries({ queryKey: [\"health\"] });\n await queryClient.invalidateQueries({\n queryKey: [\"agent-actions\", \"native_unbound\"],\n });\n const unbound = res?.nativeUnbound ?? [];\n if (unbound.length > 0) {\n const keys = unbound.map((u) => u.key).join(\", \");\n onToast(\n \"warning\",\n `Main backend set to ${BACKEND_PROVIDER_LABELS[backendId]}. ${unbound.length} native integration${unbound.length === 1 ? \"\" : \"s\"} disabled (${keys}). Re-configure on /connections.`,\n );\n } else {\n onToast(\n \"success\",\n `Main backend set to ${BACKEND_PROVIDER_LABELS[backendId]}.`,\n );\n }\n } catch (err) {\n const message =\n err instanceof ApiError\n ? err.message\n : err instanceof Error\n ? err.message\n : \"Failed to set main backend\";\n onToast(\"error\", message);\n } finally {\n setBusyBackend(null);\n }\n },\n [refetchBackends, queryClient, onToast],\n );\n\n const toggleEnable = useCallback(\n async (backendId: BackendId) => {\n const current = backendsData?.backends.find((b) => b.id === backendId);\n if (!current) return;\n const next = !current.enabled;\n setBusyBackend(backendId);\n try {\n await api.post(`/backends/${backendId}/${next ? \"enable\" : \"disable\"}`);\n await refetchBackends();\n onToast(\n \"success\",\n `${BACKEND_PROVIDER_LABELS[backendId]} ${next ? \"enabled\" : \"disabled\"}.`,\n );\n } catch (err) {\n onToast(\n \"error\",\n err instanceof Error ? err.message : \"Failed to update backend\",\n );\n } finally {\n setBusyBackend(null);\n }\n },\n [backendsData, refetchBackends, onToast],\n );\n\n const toggleWebSearch = useCallback(\n async (backendId: BackendId) => {\n const current = backendsData?.backends.find((b) => b.id === backendId);\n if (!current) return;\n const next = !current.webSearchEnabled;\n setBusyBackend(backendId);\n try {\n await api.post(`/backends/${backendId}/web-search`, { enabled: next });\n await refetchBackends();\n } catch (err) {\n onToast(\n \"error\",\n err instanceof Error ? err.message : \"Failed to update web search\",\n );\n } finally {\n setBusyBackend(null);\n }\n },\n [backendsData, refetchBackends, onToast],\n );\n\n const saveAdvisor = useCallback(\n async (next: AdvisorState) => {\n setAdvisorSaving(true);\n try {\n await api.put(\"/backends/advisor\", {\n enabled: next.enabled,\n model: next.model,\n });\n setAdvisor(next);\n onToast(\n \"success\",\n `Advisor ${next.enabled ? \"enabled\" : \"disabled\"}.`,\n );\n } catch (err) {\n onToast(\n \"error\",\n err instanceof Error ? err.message : \"Failed to save advisor\",\n );\n } finally {\n setAdvisorSaving(false);\n }\n },\n [onToast],\n );\n\n const mainBackend = backendsData?.defaultBackend ?? null;\n\n return (\n <section className=\"space-y-4\">\n <div>\n <h2 className=\"text-lg font-semibold text-foreground\">Backends</h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Install each backend’s CLI, verify authentication, and pick the\n main backend. The main backend runs every configurable process by\n default; per-process overrides live in the “Process\n configuration” card below.\n </p>\n </div>\n\n <SubscriptionAuthWarning />\n\n <div className=\"space-y-3\">\n {BACKENDS.map((backendId) => {\n const row = backendsData?.backends.find((b) => b.id === backendId);\n const isMain = mainBackend === backendId;\n const permissionMode = config\n ? (config[\n `${backendId}ExecutionPermissionMode` as keyof typeof config\n ] as string | null | undefined)\n : null;\n return (\n <div key={backendId} className=\"space-y-2\">\n <BackendCard\n backendId={backendId}\n mode=\"settings\"\n isMain={isMain}\n authStatus={row?.authStatus ?? \"unknown\"}\n authStatusDetail={row?.authDetail ?? null}\n authFirstExpiredAt={row?.authFirstExpiredAt ?? null}\n authLastSuccessAt={row?.authLastSuccessAt ?? null}\n authNotificationCount={row?.authNotificationCount ?? 0}\n cliInstalled={row?.cliInstalled ?? true}\n enabled={row?.enabled ?? false}\n webSearchEnabled={row?.webSearchEnabled ?? false}\n webSearchSupported={row?.webSearchSupported ?? false}\n permissionMode={permissionMode}\n busy={busyBackend === backendId}\n installCheck={installCheck[backendId]}\n onCliInstalled={() => {\n void refetchBackends();\n }}\n onVerifyInstall={() => {\n void verifyInstall(backendId);\n }}\n onToggleEnable={() => {\n void toggleEnable(backendId);\n }}\n onToggleWebSearch={() => {\n void toggleWebSearch(backendId);\n }}\n />\n <BackendApiKeyPanel\n backendId={backendId}\n onToast={onToast}\n />\n {!isMain && (\n <div className=\"flex justify-end\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={\n busyBackend !== null || !(row?.cliInstalled ?? false)\n }\n onClick={() => {\n void setMain(backendId);\n }}\n >\n Set {BACKEND_PROVIDER_SHORT[backendId]} as main\n </Button>\n </div>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Advisor — opt-in toggle, default disabled. */}\n {advisor && (\n <div className=\"rounded-xl border border-border bg-card p-4 shadow-sm\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"space-y-1\">\n <h3 className=\"text-sm font-semibold text-foreground\">\n Advisor (Claude Agent SDK)\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n When enabled, the Claude Agent SDK’s server-side advisor\n tool can offer the agent a second-opinion model on long\n turns. Off by default — turn it on only when you want the\n added cost.\n </p>\n </div>\n <Button\n size=\"sm\"\n variant={advisor.enabled ? \"outline\" : \"default\"}\n disabled={advisorSaving}\n onClick={() => {\n const next: AdvisorState = advisor.enabled\n ? { enabled: false, model: null }\n : {\n enabled: true,\n model: advisor.model ?? ADVISOR_ALLOWED_MODELS[0],\n };\n void saveAdvisor(next);\n }}\n >\n {advisorSaving && (\n <Loader2 className=\"mr-2 h-3.5 w-3.5 animate-spin\" />\n )}\n {advisor.enabled ? \"Disable advisor\" : \"Enable advisor\"}\n </Button>\n </div>\n {advisor.enabled && (\n <div className=\"mt-3 flex flex-wrap items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">Model:</span>\n <Select\n value={advisor.model ?? ADVISOR_ALLOWED_MODELS[0]}\n onValueChange={(next) => {\n if (!isAdvisorModel(next)) return;\n void saveAdvisor({ enabled: true, model: next });\n }}\n disabled={advisorSaving}\n >\n <SelectTrigger className=\"h-8 w-auto min-w-[12rem] text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {ADVISOR_ALLOWED_MODELS.map((m) => (\n <SelectItem key={m} value={m}>\n {m}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n </div>\n )}\n </section>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport {\n AlertTriangle,\n ChevronDown,\n Loader2,\n ShieldCheck,\n Unlock,\n} from \"lucide-react\";\nimport type { BackendId } from \"@aitne/shared\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { DocsHelpInline } from \"@/components/docs/docs-help-inline\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { api, ApiError } from \"@/lib/api-client\";\nimport {\n BACKEND_PROVIDER_LABELS,\n BACKEND_PROVIDER_SHORT,\n} from \"@/lib/backend-ui\";\nimport { useConfig } from \"@/lib/hooks/use-config\";\nimport { cn } from \"@/lib/utils\";\nimport type { SettingsToastState } from \"./settings-navigation\";\nimport {\n buildSetupModePayload,\n canApply,\n hasDivergentOverride,\n type ExecutionModeUi,\n type PerBackendOverrides,\n} from \"@/components/settings/execution-mode.logic\";\nimport {\n seedStateFromConfig,\n type ConfigModeSlice,\n} from \"./execution-mode-settings.logic\";\n\n/**\n * Settings-page counterpart to the setup wizard's Execution Mode step\n * (EXECUTION-MODE-DESIGN.md §5.2). Same copy as the wizard step so users\n * see one consistent explanation. Writes through `POST /api/setup/mode`,\n * which also records one `agent_actions` row per backend whose value\n * moved (§6.3).\n *\n * Unlike the setup step, this surface seeds the top-level pick from the\n * currently-persisted backend modes: if all three agree, that value is\n * highlighted; if they disagree, the accordion is force-opened so the\n * user sees the divergence before re-collapsing it.\n */\n\ninterface Props {\n onToast: (type: SettingsToastState[\"type\"], message: string) => void;\n}\n\nconst BACKENDS: readonly BackendId[] = [\"claude\", \"codex\", \"gemini\"] as const;\n\nexport function ExecutionModeSettings({ onToast }: Props) {\n const { data: config } = useConfig();\n // Generation counter — bump on successful apply so the inner card\n // remounts with a fresh seed from the refetched config. Without this\n // the local draft keeps showing the user's just-submitted deltas even\n // after the server is unified, so the \"mixed\" badge would stick.\n const [generation, setGeneration] = useState(0);\n\n if (!config) {\n return (\n <Card>\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" /> Loading…\n </div>\n </Card>\n );\n }\n\n return (\n <ExecutionModeSettingsCard\n key={generation}\n config={config}\n onToast={onToast}\n onApplied={() => setGeneration((g) => g + 1)}\n />\n );\n}\n\nexport interface ExecutionModeSettingsCardProps {\n config: ConfigModeSlice;\n onToast: (type: SettingsToastState[\"type\"], message: string) => void;\n onApplied: () => void;\n}\n\n/**\n * Seed-bearing inner card. Exported for render tests so the seed path\n * can be exercised directly without the `useConfig()` / loading wrapper.\n * The outer `ExecutionModeSettings` is the production entry point.\n */\nexport function ExecutionModeSettingsCard({\n config,\n onToast,\n onApplied,\n}: ExecutionModeSettingsCardProps) {\n const queryClient = useQueryClient();\n\n // Lazy useState initializer — seeds synchronously from the config snapshot\n // captured at mount. Remount-on-apply (via the outer `key`) is how the\n // card picks up a newly-persisted server state; user edits after mount\n // persist until the next successful apply.\n const initial = useState(() => seedStateFromConfig(config))[0];\n\n const [topLevel, setTopLevel] = useState<ExecutionModeUi | null>(\n initial.topLevel,\n );\n const [overrides, setOverrides] = useState<PerBackendOverrides>(\n initial.overrides,\n );\n const [advancedOpen, setAdvancedOpen] = useState(initial.forceAccordionOpen);\n const [saving, setSaving] = useState(false);\n\n // \"mixed\" indicator fires whenever the effective per-backend config is\n // not uniform — either the seed itself was divergent (topLevel === null)\n // or the user has set an override that differs from the top-level pick.\n const divergent =\n topLevel === null || hasDivergentOverride(topLevel, overrides);\n\n async function applyChange() {\n const payload = buildSetupModePayload(topLevel, overrides);\n if (payload === null) return;\n setSaving(true);\n try {\n await api.post(\"/setup/mode\", payload);\n await queryClient.invalidateQueries({ queryKey: [\"config\"] });\n onToast(\"success\", \"Execution mode updated\");\n // Bump the generation counter so the parent remounts this card\n // with a fresh seed from the just-refetched config.\n onApplied();\n } catch (err) {\n if (err instanceof ApiError) onToast(\"error\", err.message);\n else if (err instanceof Error) onToast(\"error\", err.message);\n else onToast(\"error\", \"Failed to update execution mode\");\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <Card id=\"execution-mode\">\n <CardHeader className=\"px-0 pt-0\">\n <CardTitle className=\"flex items-center gap-1.5 text-base\">\n <span>Execution Mode</span>\n <DocsHelpInline\n docId=\"concepts/safety-and-execution\"\n label=\"Execution Mode\"\n />\n </CardTitle>\n </CardHeader>\n <p className=\"text-sm text-muted-foreground\">\n Pick how freely the agent may run shell, file, and tool commands on\n your machine. Dangerous operations — recursive deletes, privilege\n escalation, and secret-file reads — remain blocked in both modes.\n </p>\n\n <div className=\"mt-4 space-y-3\">\n <ModeCard\n icon={<ShieldCheck className=\"h-5 w-5\" />}\n title=\"Safe\"\n badge=\"Recommended\"\n selected={topLevel === \"safe\"}\n onSelect={() => setTopLevel(\"safe\")}\n >\n Agent runs with strict permission checks and asks for confirmation\n before side-effectful actions. Best when you want the agent to stay\n narrow.\n </ModeCard>\n <ModeCard\n icon={<Unlock className=\"h-5 w-5\" />}\n title=\"Allow\"\n selected={topLevel === \"allow\"}\n onSelect={() => setTopLevel(\"allow\")}\n >\n Agent runs with the skills, plugins, and MCP servers installed in\n your CLI harness. File-type support depends on your harness; the\n daemon does not manage it.\n <CodexAllowCaveat />\n </ModeCard>\n\n <Collapsible open={advancedOpen} onOpenChange={setAdvancedOpen}>\n <CollapsibleTrigger asChild>\n <button\n type=\"button\"\n className=\"flex w-full items-center justify-between rounded-md border border-border bg-muted/20 px-3 py-2 text-left text-xs text-muted-foreground hover:bg-muted/40\"\n >\n <span className=\"flex items-center gap-2\">\n <ChevronDown\n className={cn(\n \"h-3.5 w-3.5 transition-transform\",\n advancedOpen && \"rotate-180\",\n )}\n />\n Advanced — per-backend overrides\n {divergent && (\n <span className=\"rounded bg-amber-500/15 px-1.5 py-0.5 text-[10px] font-medium text-amber-700 dark:text-amber-300\">\n mixed\n </span>\n )}\n </span>\n <span className=\"text-[11px]\">\n {advancedOpen ? \"Hide\" : \"Show\"}\n </span>\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"mt-2 space-y-2 rounded-md border border-border bg-background p-3\">\n {BACKENDS.map((backend) => (\n <BackendOverrideRow\n key={backend}\n backend={backend}\n topLevel={topLevel}\n override={overrides[backend]}\n onChange={(next) =>\n setOverrides((prev) => ({ ...prev, [backend]: next }))\n }\n />\n ))}\n </CollapsibleContent>\n </Collapsible>\n\n <div className=\"flex justify-end pt-2\">\n <Button\n onClick={applyChange}\n disabled={!canApply(topLevel, overrides) || saving}\n >\n {saving ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Saving…\n </>\n ) : (\n \"Apply\"\n )}\n </Button>\n </div>\n </div>\n </Card>\n );\n}\n\ninterface ModeCardProps {\n icon: React.ReactNode;\n title: string;\n badge?: string;\n selected: boolean;\n onSelect: () => void;\n children: React.ReactNode;\n}\n\nfunction ModeCard({\n icon,\n title,\n badge,\n selected,\n onSelect,\n children,\n}: ModeCardProps) {\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={cn(\n \"block w-full rounded-lg border p-3 text-left transition-colors\",\n selected\n ? \"border-primary bg-primary/5 shadow-sm\"\n : \"border-border hover:border-foreground/30\",\n )}\n >\n <div className=\"flex items-center gap-2 font-semibold text-foreground\">\n {icon}\n {title}\n {badge && (\n <span className=\"rounded bg-primary/15 px-1.5 py-0.5 text-[10px] font-medium text-primary\">\n {badge}\n </span>\n )}\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground\">{children}</p>\n </button>\n );\n}\n\ninterface BackendOverrideRowProps {\n backend: BackendId;\n topLevel: ExecutionModeUi | null;\n override: ExecutionModeUi | null;\n onChange: (next: ExecutionModeUi | null) => void;\n}\n\nfunction BackendOverrideRow({\n backend,\n topLevel,\n override,\n onChange,\n}: BackendOverrideRowProps) {\n const effective: ExecutionModeUi | null = override ?? topLevel;\n const effectiveLabel =\n effective === null ? \"pick a top-level mode first\" : `runs as: ${effective}`;\n const showCodexAllowWarning = backend === \"codex\" && effective === \"allow\";\n return (\n <div className=\"rounded-md border border-border/60 px-3 py-2\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm\">\n <div className=\"font-medium text-foreground\">\n {BACKEND_PROVIDER_LABELS[backend]}\n <span className=\"ml-1 text-xs text-muted-foreground\">\n ({BACKEND_PROVIDER_SHORT[backend]})\n </span>\n </div>\n <div className=\"text-[11px] text-muted-foreground\">\n {effectiveLabel}\n </div>\n </div>\n <div className=\"flex items-center gap-1 text-xs\">\n <OverrideChip\n active={override === null}\n label=\"Follow\"\n onClick={() => onChange(null)}\n />\n <OverrideChip\n active={override === \"safe\"}\n label=\"Safe\"\n onClick={() => onChange(\"safe\")}\n />\n <OverrideChip\n active={override === \"allow\"}\n label=\"Allow\"\n onClick={() => onChange(\"allow\")}\n />\n </div>\n </div>\n {showCodexAllowWarning && (\n <p className=\"mt-2 flex items-start gap-1.5 text-[11px] text-amber-700 dark:text-amber-300\">\n <AlertTriangle className=\"mt-0.5 h-3 w-3 shrink-0\" />\n <span>\n Codex Allow disables the daemon's absolute-block layer\n (sandbox-off). See the Allow card above.\n </span>\n </p>\n )}\n </div>\n );\n}\n\n/**\n * Inline caveat shown inside the Allow mode card.\n *\n * The setup wizard no longer hosts an Execution Mode step\n * (SETUP-FLOW-REDESIGN-PLAN §4) — Settings → Backends is now the only\n * surface where this posture can be flipped, so this card body is the\n * single source of truth for the Codex Allow-mode caveat.\n *\n * The card-level \"Dangerous operations are still blocked\" reassurance is\n * accurate for Claude Code and Gemini CLI — both backends expose a\n * pre-tool hook / admin policy surface the daemon attaches the\n * absolute-block layer to. Codex CLI does not. Codex Allow runs under\n * `--dangerously-bypass-approvals-and-sandbox`, a binary sandbox-off\n * switch with no per-command hook layer, so the absolute-block patterns\n * (`rm -rf`, `eval $(curl …)`, secret-file reads, …) are not pre-blocked\n * for Codex in Allow mode.\n */\nfunction CodexAllowCaveat() {\n return (\n <span className=\"mt-3 flex items-start gap-2 rounded-md border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-xs text-amber-900 dark:text-amber-200\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <span className=\"space-y-1\">\n <span className=\"block\">\n <span className=\"font-semibold\">Codex caveat.</span> Codex CLI\n runs Allow mode under{\" \"}\n <code className=\"rounded bg-black/10 px-1 font-mono text-[11px] dark:bg-white/10\">\n --dangerously-bypass-approvals-and-sandbox\n </code>\n , a binary sandbox-off switch. Codex has no per-command hook\n layer for the daemon to attach the absolute-block patterns to,\n so destructive shell commands (\n <code className=\"rounded bg-black/10 px-1 font-mono text-[11px] dark:bg-white/10\">\n rm -rf\n </code>\n ,{\" \"}\n <code className=\"rounded bg-black/10 px-1 font-mono text-[11px] dark:bg-white/10\">\n eval $(curl …)\n </code>\n , secret-file reads) are <span className=\"font-semibold\">not</span>{\" \"}\n pre-blocked for Codex in Allow mode the way they are for Claude\n Code and Gemini CLI.\n </span>\n <span className=\"block\">\n Use the Advanced section below to keep Codex on Safe (its\n workspace-write sandbox still applies) unless you accept this\n gap.\n </span>\n </span>\n </span>\n );\n}\n\nfunction OverrideChip({\n active,\n label,\n onClick,\n}: {\n active: boolean;\n label: string;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"rounded-md border px-2 py-1 transition-colors\",\n active\n ? \"border-primary bg-primary/10 text-foreground\"\n : \"border-border text-muted-foreground hover:border-foreground/30\",\n )}\n >\n {label}\n </button>\n );\n}\n","import type { ExecutionPermissionMode } from \"@aitne/shared\";\nimport {\n EMPTY_OVERRIDES,\n internalToUi,\n type ExecutionModeUi,\n type PerBackendOverrides,\n} from \"@/components/settings/execution-mode.logic\";\n\n/**\n * Pure helpers for `ExecutionModeSettings`\n * (EXECUTION-MODE-DESIGN.md §5.2). Extracted from the component so the\n * \"seed from config\" branches — especially the divergent-mixed-state\n * seed the accordion relies on — are unit-testable.\n */\n\nexport interface ConfigModeSlice {\n claudeExecutionPermissionMode: ExecutionPermissionMode;\n codexExecutionPermissionMode: ExecutionPermissionMode;\n geminiExecutionPermissionMode: ExecutionPermissionMode;\n}\n\n/**\n * Return the top-level pick for the Safe / Allow card. `null` means\n * \"the three backends disagree in the persisted config, so there is no\n * unified top-level value to highlight.\" Caller should force-open the\n * advanced accordion in that case so the user sees the divergence.\n */\nexport function deriveTopFromConfig(\n config: ConfigModeSlice,\n): ExecutionModeUi | null {\n const claudeUi = internalToUi(config.claudeExecutionPermissionMode);\n const codexUi = internalToUi(config.codexExecutionPermissionMode);\n const geminiUi = internalToUi(config.geminiExecutionPermissionMode);\n if (claudeUi === codexUi && codexUi === geminiUi) return claudeUi;\n return null;\n}\n\n/**\n * Return the per-backend overrides to seed when the user opens the card.\n * On a unified config (deriveTopFromConfig returns non-null) no overrides\n * are needed — every row follows the top-level pick. On a mixed config\n * every row is surfaced as an explicit override so the user can edit\n * each backend directly.\n */\nexport function deriveOverridesFromConfig(\n config: ConfigModeSlice,\n): PerBackendOverrides {\n const top = deriveTopFromConfig(config);\n if (top !== null) return { ...EMPTY_OVERRIDES };\n return {\n claude: internalToUi(config.claudeExecutionPermissionMode),\n codex: internalToUi(config.codexExecutionPermissionMode),\n gemini: internalToUi(config.geminiExecutionPermissionMode),\n };\n}\n\n/**\n * Combined seed helper: returns the tuple the component puts into its\n * three useState slots on first hydration, plus a hint for whether the\n * advanced accordion should be force-opened.\n */\nexport function seedStateFromConfig(config: ConfigModeSlice): {\n topLevel: ExecutionModeUi | null;\n overrides: PerBackendOverrides;\n forceAccordionOpen: boolean;\n} {\n const topLevel = deriveTopFromConfig(config);\n const overrides = deriveOverridesFromConfig(config);\n return {\n topLevel,\n overrides,\n forceAccordionOpen: topLevel === null,\n };\n}\n"],"names":["BACKENDS","BackendsSection","onToast","data","backendsData","refetch","refetchBackends","config","queryClient","busyBackend","setBusyBackend","installCheck","setInstallCheck","claude","status","codex","gemini","advisor","setAdvisor","advisorSaving","setAdvisorSaving","cancelled","res","get","enabled","model","verifyInstall","backendId","prev","post","ok","version","reason","cliInstalled","cliCommand","timedOut","stderr","trim","stdout","error","err","Error","message","setMain","put","invalidateQueries","queryKey","unbound","nativeUnbound","length","keys","map","u","key","join","toggleEnable","current","backends","find","b","id","next","toggleWebSearch","webSearchEnabled","saveAdvisor","mainBackend","defaultBackend","className","row","isMain","permissionMode","mode","authStatus","authStatusDetail","authDetail","authFirstExpiredAt","authLastSuccessAt","authNotificationCount","webSearchSupported","busy","onCliInstalled","onVerifyInstall","onToggleEnable","onToggleWebSearch","size","variant","disabled","onClick","value","onValueChange","m"],"mappings":"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"}
|