@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_schedule_page_tsx_0b8zr2l._.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[21532,a=>{"use strict";var b=a.i(39752),c=a.i(34542),d=a.i(54150),e=a.i(40410),f=a.i(92379),g=a.i(56295),h=a.i(91340);function i(a){return a%24/24*Math.PI*2-Math.PI/2}function j(a,b){return{x:120+b*Math.cos(a),y:120+b*Math.sin(a)}}function k(a,b,c){let d=b-a;d<=0&&(d+=2*Math.PI),d>2*Math.PI-.001&&(d=2*Math.PI-.001);let e=+(d>Math.PI),f=j(a,c),g=j(a+d,c);return`M ${f.x} ${f.y} A ${c} ${c} 0 ${e} 1 ${g.x} ${g.y}`}function l(a){let[b,c]=a.split(":").map(Number);return(b??0)+(c??0)/60}function m(a){let b=Math.floor((a%24+24)%24),c=Math.round((a-Math.floor(a))*60)%60;return`${String(b).padStart(2,"0")}:${String(c).padStart(2,"0")}`}function n(a){return Math.round(4*a)/4}function o(a){return Math.round(a)%24}let p="var(--color-destructive)",q="var(--color-success)",r="var(--color-primary)";function s({values:a,onChange:d}){let e,f,g,h=(0,c.useRef)(null),[u,v]=(0,c.useState)(null),[w,x]=(0,c.useState)(null),y=l(a.quietHoursStart),z=l(a.quietHoursEnd),A=a.activeStartHour,B=a.activeEndHour%24,C=i(y),D=i(z),E=i(A),F=i(B),G=i(a.dayBoundaryHour),H=()=>{v(null)};return(0,b.jsx)("div",{className:"flex items-center justify-center",children:(0,b.jsxs)("svg",{ref:h,viewBox:"0 0 240 240",className:"w-full max-w-[280px] select-none touch-none",onPointerMove:b=>{if(!u)return;let c=(a=>{let b,c=h.current;if(!c)return 0;let d=c.getBoundingClientRect(),e=240/d.width,f=240/d.height,g=(a.clientX-d.left)*e-120;return(b=(Math.atan2((a.clientY-d.top)*f-120,g)+Math.PI/2)/(2*Math.PI)*24)<0&&(b+=24),b%24})(b),e={...a};switch(u){case"quietStart":e.quietHoursStart=m(n(c));break;case"quietEnd":e.quietHoursEnd=m(n(c));break;case"activeStart":e.activeStartHour=o(c);break;case"activeEnd":{let a=o(c);e.activeEndHour=0===a?24:a}}d(e)},onPointerUp:H,onPointerLeave:H,children:[(0,b.jsx)("circle",{cx:120,cy:120,r:100,fill:"none",stroke:"currentColor",strokeWidth:1,className:"text-border"}),Array.from({length:24},(a,c)=>{let d=i(c),e=c%3==0,f=j(d,e?95:97),g=j(d,100);return(0,b.jsx)("line",{x1:f.x,y1:f.y,x2:g.x,y2:g.y,stroke:"currentColor",strokeWidth:e?1.5:.5,className:"text-muted-foreground"},c)}),[0,3,6,9,12,15,18,21].map(a=>{let c=j(i(a),108);return(0,b.jsx)("text",{x:c.x,y:c.y,textAnchor:"middle",dominantBaseline:"central",className:"fill-muted-foreground text-[9px]",children:a},a)}),(0,b.jsx)("path",{d:k(C,D,90),fill:"none",stroke:p,strokeWidth:8,strokeLinecap:"round",opacity:.6}),(0,b.jsx)("path",{d:k(E,F,75),fill:"none",stroke:q,strokeWidth:8,strokeLinecap:"round",opacity:.6}),(e=j(G,60),f=j(G,100),(0,b.jsx)("line",{x1:e.x,y1:e.y,x2:f.x,y2:f.y,stroke:r,strokeWidth:2,strokeDasharray:"4 2"})),(g=j(G,53),(0,b.jsx)("text",{x:g.x,y:g.y,textAnchor:"middle",dominantBaseline:"central",className:"fill-primary text-[8px] font-medium",children:"day"})),function({dragging:a,hovered:c,setHovered:d,handlePointerDown:e,quietStartA:f,quietEndA:g,activeStartA:h,activeEndA:i,QUIET_R:j,ACTIVE_R:k,values:l}){let m=a??c,n=[{target:"quietStart",angle:f,r:j,color:p,label:l.quietHoursStart},{target:"quietEnd",angle:g,r:j,color:p,label:l.quietHoursEnd},{target:"activeStart",angle:h,r:k,color:q,label:`${l.activeStartHour}:00`},{target:"activeEnd",angle:i,r:k,color:q,label:`${l.activeEndHour}:00`}].sort((a,b)=>(a.target===m)-(b.target===m));return(0,b.jsx)(b.Fragment,{children:n.map(a=>(0,b.jsx)(t,{angle:a.angle,r:a.r,color:a.color,label:a.label,active:a.target===m,onPointerDown:e(a.target),onPointerEnter:()=>d(a.target),onPointerLeave:()=>d(null)},a.target))})}({dragging:u,hovered:w,setDragging:v,setHovered:x,handlePointerDown:a=>b=>{b.preventDefault(),b.target.setPointerCapture(b.pointerId),v(a)},quietStartA:C,quietEndA:D,activeStartA:E,activeEndA:F,QUIET_R:90,ACTIVE_R:75,values:a}),(0,b.jsxs)("text",{x:120,y:112,textAnchor:"middle",className:"fill-muted-foreground text-[8px]",children:[(0,b.jsx)("tspan",{style:{fill:p},children:"●"})," quiet hours"]}),(0,b.jsxs)("text",{x:120,y:124,textAnchor:"middle",className:"fill-muted-foreground text-[8px]",children:[(0,b.jsx)("tspan",{style:{fill:q},children:"●"})," active window"]}),(0,b.jsxs)("text",{x:120,y:136,textAnchor:"middle",className:"fill-muted-foreground text-[8px]",children:[(0,b.jsx)("tspan",{style:{fill:r},children:"---"})," day boundary"]})]})})}function t({angle:a,r:c,color:d,label:e,active:f,onPointerDown:g,onPointerEnter:h,onPointerLeave:i}){let k=j(a,c),{lx:l,ly:m}={lx:Math.max(12,Math.min(228,k.x)),ly:Math.max(12,Math.min(228,k.y-12))};return(0,b.jsxs)("g",{onPointerDown:g,onPointerEnter:h,onPointerLeave:i,className:"cursor-grab active:cursor-grabbing",children:[(0,b.jsx)("circle",{cx:k.x,cy:k.y,r:12,fill:"transparent"}),(0,b.jsx)("circle",{cx:k.x,cy:k.y,r:f?7:5,fill:d,stroke:"var(--color-background)",strokeWidth:2}),f&&(0,b.jsx)("text",{x:l,y:m,textAnchor:"middle",className:"fill-foreground text-[9px] font-medium pointer-events-none",children:e})]})}var u=a.i(92241),v=a.i(87759),w=a.i(70297),x=a.i(21218),y=a.i(8212),z=a.i(30400),A=a.i(7384),B=a.i(8753),C=a.i(62588),D=a.i(81130),E=a.i(59974);let F=["delegated-sync"];function G(){let{data:a,isLoading:c}=(0,C.useQuery)({queryKey:F,queryFn:()=>E.api.get("/delegated-sync"),staleTime:5e3,refetchInterval:15e3});if(c||!a)return null;let d=Object.entries(a.cadences).map(([a,b])=>({id:a,...b}));if(!a.workerRunning&&0===d.length)return null;if(!a.workerRunning)return(0,b.jsxs)(z.Card,{children:[(0,b.jsx)(z.CardHeader,{children:(0,b.jsx)(z.CardTitle,{children:"Background Sync"})}),(0,b.jsxs)("div",{className:"p-4 text-sm text-muted-foreground",children:["No integrations are in delegated or native mode, so background cadences are inactive. Move an integration (Calendar / Gmail / Notion) to delegated or native mode in ",(0,b.jsx)("code",{children:"/connections"}),"to enable opt-in cadences here."]})]});let e=d.some(a=>a.enabled);return(0,b.jsxs)(z.Card,{children:[(0,b.jsx)(z.CardHeader,{children:(0,b.jsxs)(z.CardTitle,{className:"flex items-center gap-2",children:[(0,b.jsx)("span",{children:"Background Sync"}),a.withinActiveHours?(0,b.jsx)(A.Badge,{variant:"green",children:"active"}):(0,b.jsx)(A.Badge,{variant:"gray",children:"outside active hours"})]})}),(0,b.jsxs)("div",{className:"space-y-1 p-4 pt-0",children:[(0,b.jsx)("p",{className:"pb-2 text-xs text-muted-foreground",children:"Background cadences poll Calendar / Gmail / Notion through the backend's MCP subprocess so the hourly check sees fresh observations. Each row uses either the delegated backend (when the integration is in delegated mode) or the main backend (when native). Every poll spends tokens — by default they are off. Enable just the cadences you want, and they will respect the shared active-hours window below."}),(0,b.jsx)("div",{className:"space-y-2",children:d.map(a=>(0,b.jsx)(H,{row:a},a.id))}),e&&(0,b.jsx)(J,{startHour:a.activeHours.startHour,endHour:a.activeHours.endHour})]})]})}function H({row:a}){let d,e,f=(d=(0,D.useQueryClient)(),(0,B.useMutation)({mutationFn:({cadenceId:a,body:b})=>E.api.patch(`/delegated-sync/cadences/${encodeURIComponent(a)}`,b),onSuccess:()=>{d.invalidateQueries({queryKey:F})}})),g=(e=(0,D.useQueryClient)(),(0,B.useMutation)({mutationFn:({cadenceId:a})=>E.api.post(`/delegated-sync/cadences/${encodeURIComponent(a)}/run`,{}),onSuccess:()=>{e.invalidateQueries({queryKey:F})}})),[h,i]=(0,c.useState)(String(Math.round(a.intervalSeconds/60))),[j,k]=(0,c.useState)(null),[l,m]=(0,c.useState)(null);(0,c.useEffect)(()=>{i(String(Math.round(a.intervalSeconds/60)))},[a.intervalSeconds]);let n=Math.ceil(a.softFloorSeconds/60),o=Math.round(a.defaultIntervalSeconds/60),p=async()=>{m(null);try{await g.mutateAsync({cadenceId:a.id})}catch(a){m(a instanceof Error?a.message:"Run Now failed")}},q=f.isPending,r=g.isPending,s=a.intervalSeconds===a.defaultIntervalSeconds;return(0,b.jsxs)("div",{className:"rounded border border-border/50 p-3",children:[(0,b.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,b.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,b.jsx)("p",{className:"text-sm font-medium text-foreground",children:a.displayName}),"native"===a.mode&&(0,b.jsxs)(A.Badge,{variant:"green",children:["native",a.backend?` \xb7 ${a.backend}`:""]}),"delegated"===a.mode&&(0,b.jsxs)(A.Badge,{variant:"blue",children:["delegated",a.backend?` \xb7 ${a.backend}`:""]}),"tripped"===a.circuitState&&(0,b.jsx)(A.Badge,{variant:"red",children:"circuit tripped"}),a.failureCount>0&&"ok"===a.circuitState&&(0,b.jsxs)(A.Badge,{variant:"amber",children:[a.failureCount," recent failure",1===a.failureCount?"":"s"]})]}),(0,b.jsx)("p",{className:"mt-0.5 text-xs text-muted-foreground",children:a.description}),(0,b.jsx)(I,{row:a})]}),(0,b.jsxs)("div",{className:"flex shrink-0 items-center gap-2",children:[(0,b.jsx)(x.Button,{variant:a.enabled?"default":"outline",size:"sm",onClick:()=>{f.mutate({cadenceId:a.id,body:{enabled:!a.enabled}})},disabled:q,children:q?(0,b.jsx)(u.Loader2,{className:"h-3.5 w-3.5 animate-spin"}):a.enabled?"Enabled":"Disabled"}),(0,b.jsxs)(x.Button,{variant:"outline",size:"sm",onClick:p,disabled:r,title:"Run this cadence once, regardless of schedule",children:[r?(0,b.jsx)(u.Loader2,{className:"h-3.5 w-3.5 animate-spin"}):(0,b.jsx)(v.Play,{className:"h-3.5 w-3.5"}),(0,b.jsx)("span",{className:"ml-1",children:"Run now"})]})]})]}),(0,b.jsxs)("div",{className:"mt-2 flex items-center gap-2 text-xs text-muted-foreground",children:[(0,b.jsxs)("label",{className:"flex items-center gap-1",children:[(0,b.jsx)("span",{children:"Interval:"}),(0,b.jsx)(y.Input,{type:"number",min:n,max:1440,value:h,onChange:a=>i(a.target.value),onBlur:()=>{k(null);let b=Number(h);!Number.isInteger(b)||b<=0?k("Whole positive number required"):b<n?k(`Minimum ${n} min`):b>1440?k("Maximum 1440 min (24 h)"):60*b!==a.intervalSeconds&&f.mutate({cadenceId:a.id,body:{intervalSeconds:60*b}},{onError:a=>k(a.message)})},onKeyDown:a=>{"Enter"===a.key&&(a.preventDefault(),a.target.blur())},className:"h-7 w-20 px-2 text-xs"}),(0,b.jsx)("span",{children:"min"})]}),(0,b.jsxs)("span",{className:"text-muted-foreground/70",children:["(",n,"–",1440,"; default ",o,")"]}),!s&&(0,b.jsxs)("button",{type:"button",onClick:()=>{i(String(o)),f.mutate({cadenceId:a.id,body:{intervalSeconds:60*o}})},className:"inline-flex items-center gap-0.5 text-[10px] text-muted-foreground hover:text-foreground",children:[(0,b.jsx)(w.RotateCcw,{className:"h-2.5 w-2.5"}),"reset"]}),j&&(0,b.jsx)("span",{className:"text-destructive",children:j})]}),l&&(0,b.jsxs)("p",{className:"mt-1 text-xs text-destructive",children:["Run Now: ",l]})]})}function I({row:a}){var d;let e=(0,c.useMemo)(()=>K(a.lastSuccessAt),[a.lastSuccessAt]),f=(0,c.useMemo)(()=>K(a.nextRunAt),[a.nextRunAt]);return a.lastAttemptAt||a.nextRunAt?(0,b.jsxs)("p",{className:"mt-1 text-xs text-muted-foreground/70",children:[a.lastSuccessAt?`Last success ${e}.`:"No successful run yet.",a.enabled&&a.nextRunAt&&` Next run ${f}.`,a.lastError&&` Last error: ${(d=a.lastError).length<=80?d:`${d.slice(0,79)}…`}`]}):(0,b.jsx)("p",{className:"mt-1 text-xs text-muted-foreground/70",children:"Has not run yet."})}function J({startHour:a,endHour:d}){let e,f=(e=(0,D.useQueryClient)(),(0,B.useMutation)({mutationFn:a=>E.api.patch("/delegated-sync/active-hours",a),onSuccess:()=>{e.invalidateQueries({queryKey:F})}})),[g,h]=(0,c.useState)(String(a)),[i,j]=(0,c.useState)(String(d)),[k,l]=(0,c.useState)(null);(0,c.useEffect)(()=>{h(String(a))},[a]),(0,c.useEffect)(()=>{j(String(d))},[d]);let m=()=>{l(null);let b=Number(g),c=Number(i);!Number.isInteger(b)||b<0||b>23?l("Start must be an integer 0–23"):!Number.isInteger(c)||c<1||c>24?l("End must be an integer 1–24"):b>=c?l("Start must be earlier than end"):(b!==a||c!==d)&&f.mutate({startHour:b,endHour:c},{onError:a=>l(a.message)})};return(0,b.jsxs)("div",{className:"mt-3 rounded border border-border/50 bg-muted/30 p-3",children:[(0,b.jsx)("p",{className:"text-sm font-medium text-foreground",children:"Active hours"}),(0,b.jsx)("p",{className:"mt-0.5 text-xs text-muted-foreground",children:'Shared by every enabled cadence. Outside this window, no cadence runs (Run Now still works). Interpreted in the configured timezone. End hour is exclusive — set 24 for "through 23:59".'}),(0,b.jsxs)("div",{className:"mt-2 flex flex-wrap items-center gap-3 text-xs",children:[(0,b.jsxs)("label",{className:"flex items-center gap-1",children:[(0,b.jsx)("span",{children:"Start:"}),(0,b.jsx)(y.Input,{type:"number",min:0,max:23,value:g,onChange:a=>h(a.target.value),onBlur:m,onKeyDown:a=>{"Enter"===a.key&&(a.preventDefault(),a.target.blur())},className:"h-7 w-16 px-2 text-xs"}),(0,b.jsx)("span",{children:":00"})]}),(0,b.jsxs)("label",{className:"flex items-center gap-1",children:[(0,b.jsx)("span",{children:"End:"}),(0,b.jsx)(y.Input,{type:"number",min:1,max:24,value:i,onChange:a=>j(a.target.value),onBlur:m,onKeyDown:a=>{"Enter"===a.key&&(a.preventDefault(),a.target.blur())},className:"h-7 w-16 px-2 text-xs"}),(0,b.jsx)("span",{children:":00"})]}),f.isPending&&(0,b.jsx)(u.Loader2,{className:"h-3.5 w-3.5 animate-spin text-muted-foreground"}),k&&(0,b.jsx)("span",{className:"text-destructive",children:k})]})]})}function K(a){var b,c;if(!a)return"—";let d=Date.parse(a);if(!Number.isFinite(d))return"—";let e=Math.round((d-Date.now())/1e3);return e>=0?(b=e)<60?`in ${b}s`:b<3600?`in ${Math.round(b/60)}m`:b<86400?`in ${Math.round(b/3600)}h`:`in ${Math.round(b/86400)}d`:(c=-e)<60?`${c}s ago`:c<3600?`${Math.round(c/60)}m ago`:c<86400?`${Math.round(c/3600)}h ago`:`${Math.round(c/86400)}d ago`}a.s(["default",0,function(){let{data:a}=(0,d.useConfig)(),{df:i}=(0,d.useConfigDefaults)(),{data:j}=(0,e.useHealth)(),{deferSaveFor:k,dv:l,dirtyFields:m,setDirty:n}=(0,f.useDirtyFields)(),o=(0,c.useCallback)(b=>{a&&(n("quietHoursStart",b.quietHoursStart,a.quietHoursStart),n("quietHoursEnd",b.quietHoursEnd,a.quietHoursEnd),n("hourlyCheckActiveStartHour",b.activeStartHour,a.hourlyCheckActiveStartHour),n("hourlyCheckActiveEndHour",b.activeEndHour,a.hourlyCheckActiveEndHour))},[a,n]);if(!a)return(0,b.jsx)("div",{className:"text-muted-foreground",children:"Loading..."});let p=k(a),q={quietHoursStart:l("quietHoursStart",a.quietHoursStart),quietHoursEnd:l("quietHoursEnd",a.quietHoursEnd),activeStartHour:l("hourlyCheckActiveStartHour",a.hourlyCheckActiveStartHour),activeEndHour:l("hourlyCheckActiveEndHour",a.hourlyCheckActiveEndHour),dayBoundaryHour:l("dayBoundaryHour",a.dayBoundaryHour)};return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-2xl font-semibold text-foreground",children:"Schedule & Notifications"}),(0,b.jsx)("p",{className:"mt-1 max-w-3xl text-sm text-muted-foreground",children:"When the agent runs in the background and how often it can interrupt you. All times are interpreted in the configured timezone."})]}),(0,b.jsxs)(g.ConfigSection,{title:"Time axis",helpDocId:"concepts/agent-day",children:[(0,b.jsx)("p",{className:"pb-2 text-xs text-muted-foreground",children:"Drag the handles to adjust quiet hours (red) and the hourly-check active window (green). The dashed blue line marks the day boundary. Changes are staged — save with the bar below."}),(0,b.jsx)(s,{values:q,onChange:o})]}),(0,b.jsxs)(g.ConfigSection,{title:"Day shape",helpDocId:"concepts/agent-day",children:[(0,b.jsx)(g.EditableField,{label:"Timezone",value:l("timezone",a.timezone),configKey:"timezone",modified:m.has("timezone"),defaultValue:i("timezone"),description:"IANA timezone name (e.g. America/New_York, America/Los_Angeles). All schedules, quiet hours, and daily boundaries are interpreted in this zone.",onSave:p}),(0,b.jsx)(g.EditableField,{label:"Day Boundary Hour",value:l("dayBoundaryHour",a.dayBoundaryHour),configKey:"dayBoundaryHour",type:"number",min:0,max:9,modified:m.has("dayBoundaryHour"),defaultValue:i("dayBoundaryHour"),description:"Hour (0–9, local time) at which a new agent day begins. At this hour the previous today.md is archived, a new one is generated, and daily retention and summary routines run. Pick a time you're reliably asleep — 04:00 is the default.",onSave:p})]}),(0,b.jsxs)(g.ConfigSection,{title:"Hourly Check",helpDocId:"features/routines/hourly-check",children:[(0,b.jsxs)("p",{className:"pb-2 text-xs text-muted-foreground",children:["The hourly check is the agent’s passive review loop. At each interval it queries pending observations (file edits, calendar updates, git commits, Notion changes), folds anything actionable into your context files (",(0,b.jsx)("code",{children:"today.md"}),", ",(0,b.jsx)("code",{children:"roadmap.md"}),", project notes), and stays silent otherwise. Most runs produce no output — that is by design."]}),(0,b.jsx)(g.EditableBooleanField,{label:"Hourly Check Enabled",value:l("hourlyCheckEnabled",a.hourlyCheckEnabled),configKey:"hourlyCheckEnabled",modified:m.has("hourlyCheckEnabled"),defaultValue:i("hourlyCheckEnabled"),description:"Master switch for the polling routine. When off, the agent only runs on direct messages, schedule.approaching events, and explicitly scheduled tasks.",onSave:p}),(0,b.jsx)(g.EditableField,{label:"Check Interval",value:l("hourlyCheckIntervalMinutes",a.hourlyCheckIntervalMinutes),configKey:"hourlyCheckIntervalMinutes",type:"number",suffix:"min",min:1,max:1440,modified:m.has("hourlyCheckIntervalMinutes"),defaultValue:i("hourlyCheckIntervalMinutes"),description:"How often the check runs during the active window. Any positive integer in minutes (1–1440, i.e. up to 24 hours). Despite the “hourly” name, you can dial this lower for higher-frequency checks or higher to cut quota burn. The cadence is anchored to the active-window start, so the first fire of each agent-day lands at the start of the window.",onSave:p}),(0,b.jsx)(g.EditableField,{label:"Active Start Hour",value:l("hourlyCheckActiveStartHour",a.hourlyCheckActiveStartHour),configKey:"hourlyCheckActiveStartHour",type:"number",min:0,max:23,modified:m.has("hourlyCheckActiveStartHour"),defaultValue:i("hourlyCheckActiveStartHour"),description:"Hour (0–23, local time) when the hourly check window opens. Runs before this hour are skipped entirely.",onSave:p}),(0,b.jsx)(g.EditableField,{label:"Active End Hour",value:l("hourlyCheckActiveEndHour",a.hourlyCheckActiveEndHour),configKey:"hourlyCheckActiveEndHour",type:"number",min:1,max:24,modified:m.has("hourlyCheckActiveEndHour"),defaultValue:i("hourlyCheckActiveEndHour"),description:"Hour (1–24, local time) when the window closes. Exclusive — e.g. set 24 to run through 23:59. Prevents the check from firing while you sleep.",onSave:p}),(0,b.jsx)(g.EditableField,{label:"Min Observations",value:l("hourlyCheckMinObservations",a.hourlyCheckMinObservations),configKey:"hourlyCheckMinObservations",type:"number",min:0,max:1e3,modified:m.has("hourlyCheckMinObservations"),defaultValue:i("hourlyCheckMinObservations"),description:"Minimum number of pending user-actor observations required for the check to actually launch an agent run. If fewer are queued, the tick is skipped with no cost. Set higher (e.g. 3–5) if you see too many no-op runs.",onSave:p}),(0,b.jsx)("p",{className:"pt-2 text-xs text-muted-foreground",children:"Trigger one immediately from the CLI:"}),(0,b.jsx)("pre",{className:"overflow-x-auto rounded bg-muted p-2 font-mono text-[11px] text-muted-foreground",children:'curl -X POST http://localhost:8321/api/agent/run-now -H "Authorization: Bearer <daemon-api-token>" -H "Content-Type: application/json" -d \'{"reason":"manual"}\''})]}),(0,b.jsx)(G,{}),(0,b.jsxs)(g.ConfigSection,{title:"Notifications",helpDocId:"features/operations/quiet-hours",children:[(0,b.jsx)("p",{className:"pb-2 text-xs text-muted-foreground",children:"Rate limits, quiet hours, and delivery destinations for outbound notifications the agent sends to you. “Notification” = a proactive message (reminder, alert, summary) — it does not include replies to messages you initiated."}),(0,b.jsx)(g.EditableField,{label:"Max Per Hour",value:l("maxNotificationsPerHour",a.maxNotificationsPerHour),configKey:"maxNotificationsPerHour",type:"number",modified:m.has("maxNotificationsPerHour"),defaultValue:i("maxNotificationsPerHour"),description:"Hard cap on outbound notifications in any rolling 60-minute window. Notifications above the cap are suppressed (not delivered, but still logged to Activity → Notifications so you can see what was dropped). Protects you from runaway notification loops.",onSave:p}),(0,b.jsx)(g.EditableField,{label:"Max Per Day",value:l("maxNotificationsPerDay",a.maxNotificationsPerDay),configKey:"maxNotificationsPerDay",type:"number",modified:m.has("maxNotificationsPerDay"),defaultValue:i("maxNotificationsPerDay"),description:"Hard cap per calendar day (resets at the Day Boundary Hour). A safety net on top of the per-hour cap. Suppressed notifications are still logged.",onSave:p}),(0,b.jsx)(g.EditableField,{label:"Quiet Hours Start",value:l("quietHoursStart",a.quietHoursStart),configKey:"quietHoursStart",modified:m.has("quietHoursStart"),defaultValue:i("quietHoursStart"),description:"24-hour time (HH:MM, e.g. 22:00) when quiet hours begin in the configured timezone. During quiet hours, regular notifications are held back. Safety-category notifications (deadline, error, security, critical) still go through.",onSave:p}),(0,b.jsx)(g.EditableField,{label:"Quiet Hours End",value:l("quietHoursEnd",a.quietHoursEnd),configKey:"quietHoursEnd",modified:m.has("quietHoursEnd"),defaultValue:i("quietHoursEnd"),description:"24-hour time (HH:MM, e.g. 08:00) when quiet hours end. If end is earlier than start, the window wraps over midnight.",onSave:p}),(0,b.jsx)(g.EditableField,{label:"Batch Interval",value:l("batchIntervalMinutes",a.batchIntervalMinutes),configKey:"batchIntervalMinutes",type:"number",suffix:"min",modified:m.has("batchIntervalMinutes"),defaultValue:i("batchIntervalMinutes"),description:"Minimum minutes between notification deliveries from the same routine. Multiple notifications queued within this window are combined into a single message so you don’t get spammed.",onSave:p}),(0,b.jsxs)("div",{className:"py-2 border-b text-sm text-muted-foreground",children:["Default reminder destinations are managed in"," ",(0,b.jsx)("a",{href:"/connections/messaging",className:"text-foreground underline underline-offset-2 hover:no-underline",children:"Connections → Messaging → Default Reminder Destinations"}),"."]}),(0,b.jsx)(h.PrimaryPlatformField,{health:j,value:l("primaryPlatform",a.primaryPlatform),defaultValue:i("primaryPlatform"),modified:m.has("primaryPlatform"),onSave:p})]})]})}],21532)}];
|
|
1
|
+
module.exports=[21532,a=>{"use strict";var b=a.i(39752),c=a.i(34542),d=a.i(54150),e=a.i(40410),f=a.i(92379),g=a.i(56295),h=a.i(91340);function i(a){return a%24/24*Math.PI*2-Math.PI/2}function j(a,b){return{x:120+b*Math.cos(a),y:120+b*Math.sin(a)}}function k(a,b,c){let d=b-a;d<=0&&(d+=2*Math.PI),d>2*Math.PI-.001&&(d=2*Math.PI-.001);let e=+(d>Math.PI),f=j(a,c),g=j(a+d,c);return`M ${f.x} ${f.y} A ${c} ${c} 0 ${e} 1 ${g.x} ${g.y}`}function l(a){let[b,c]=a.split(":").map(Number);return(b??0)+(c??0)/60}function m(a){let b=Math.floor((a%24+24)%24),c=Math.round((a-Math.floor(a))*60)%60;return`${String(b).padStart(2,"0")}:${String(c).padStart(2,"0")}`}function n(a){return Math.round(4*a)/4}function o(a){return Math.round(a)%24}let p="var(--color-destructive)",q="var(--color-success)",r="var(--color-primary)";function s({values:a,onChange:d}){let e,f,g,h=(0,c.useRef)(null),[u,v]=(0,c.useState)(null),[w,x]=(0,c.useState)(null),y=l(a.quietHoursStart),z=l(a.quietHoursEnd),A=a.activeStartHour,B=a.activeEndHour%24,C=i(y),D=i(z),E=i(A),F=i(B),G=i(a.dayBoundaryHour),H=()=>{v(null)};return(0,b.jsx)("div",{className:"flex items-center justify-center",children:(0,b.jsxs)("svg",{ref:h,viewBox:"0 0 240 240",className:"w-full max-w-[280px] select-none touch-none",onPointerMove:b=>{if(!u)return;let c=(a=>{let b,c=h.current;if(!c)return 0;let d=c.getBoundingClientRect(),e=240/d.width,f=240/d.height,g=(a.clientX-d.left)*e-120;return(b=(Math.atan2((a.clientY-d.top)*f-120,g)+Math.PI/2)/(2*Math.PI)*24)<0&&(b+=24),b%24})(b),e={...a};switch(u){case"quietStart":e.quietHoursStart=m(n(c));break;case"quietEnd":e.quietHoursEnd=m(n(c));break;case"activeStart":e.activeStartHour=o(c);break;case"activeEnd":{let a=o(c);e.activeEndHour=0===a?24:a}}d(e)},onPointerUp:H,onPointerLeave:H,children:[(0,b.jsx)("circle",{cx:120,cy:120,r:100,fill:"none",stroke:"currentColor",strokeWidth:1,className:"text-border"}),Array.from({length:24},(a,c)=>{let d=i(c),e=c%3==0,f=j(d,e?95:97),g=j(d,100);return(0,b.jsx)("line",{x1:f.x,y1:f.y,x2:g.x,y2:g.y,stroke:"currentColor",strokeWidth:e?1.5:.5,className:"text-muted-foreground"},c)}),[0,3,6,9,12,15,18,21].map(a=>{let c=j(i(a),108);return(0,b.jsx)("text",{x:c.x,y:c.y,textAnchor:"middle",dominantBaseline:"central",className:"fill-muted-foreground text-[9px]",children:a},a)}),(0,b.jsx)("path",{d:k(C,D,90),fill:"none",stroke:p,strokeWidth:8,strokeLinecap:"round",opacity:.6}),(0,b.jsx)("path",{d:k(E,F,75),fill:"none",stroke:q,strokeWidth:8,strokeLinecap:"round",opacity:.6}),(e=j(G,60),f=j(G,100),(0,b.jsx)("line",{x1:e.x,y1:e.y,x2:f.x,y2:f.y,stroke:r,strokeWidth:2,strokeDasharray:"4 2"})),(g=j(G,53),(0,b.jsx)("text",{x:g.x,y:g.y,textAnchor:"middle",dominantBaseline:"central",className:"fill-primary text-[8px] font-medium",children:"day"})),function({dragging:a,hovered:c,setHovered:d,handlePointerDown:e,quietStartA:f,quietEndA:g,activeStartA:h,activeEndA:i,QUIET_R:j,ACTIVE_R:k,values:l}){let m=a??c,n=[{target:"quietStart",angle:f,r:j,color:p,label:l.quietHoursStart},{target:"quietEnd",angle:g,r:j,color:p,label:l.quietHoursEnd},{target:"activeStart",angle:h,r:k,color:q,label:`${l.activeStartHour}:00`},{target:"activeEnd",angle:i,r:k,color:q,label:`${l.activeEndHour}:00`}].sort((a,b)=>(a.target===m)-(b.target===m));return(0,b.jsx)(b.Fragment,{children:n.map(a=>(0,b.jsx)(t,{angle:a.angle,r:a.r,color:a.color,label:a.label,active:a.target===m,onPointerDown:e(a.target),onPointerEnter:()=>d(a.target),onPointerLeave:()=>d(null)},a.target))})}({dragging:u,hovered:w,setDragging:v,setHovered:x,handlePointerDown:a=>b=>{b.preventDefault(),b.target.setPointerCapture(b.pointerId),v(a)},quietStartA:C,quietEndA:D,activeStartA:E,activeEndA:F,QUIET_R:90,ACTIVE_R:75,values:a}),(0,b.jsxs)("text",{x:120,y:112,textAnchor:"middle",className:"fill-muted-foreground text-[8px]",children:[(0,b.jsx)("tspan",{style:{fill:p},children:"●"})," quiet hours"]}),(0,b.jsxs)("text",{x:120,y:124,textAnchor:"middle",className:"fill-muted-foreground text-[8px]",children:[(0,b.jsx)("tspan",{style:{fill:q},children:"●"})," active window"]}),(0,b.jsxs)("text",{x:120,y:136,textAnchor:"middle",className:"fill-muted-foreground text-[8px]",children:[(0,b.jsx)("tspan",{style:{fill:r},children:"---"})," day boundary"]})]})})}function t({angle:a,r:c,color:d,label:e,active:f,onPointerDown:g,onPointerEnter:h,onPointerLeave:i}){let k=j(a,c),{lx:l,ly:m}={lx:Math.max(12,Math.min(228,k.x)),ly:Math.max(12,Math.min(228,k.y-12))};return(0,b.jsxs)("g",{onPointerDown:g,onPointerEnter:h,onPointerLeave:i,className:"cursor-grab active:cursor-grabbing",children:[(0,b.jsx)("circle",{cx:k.x,cy:k.y,r:12,fill:"transparent"}),(0,b.jsx)("circle",{cx:k.x,cy:k.y,r:f?7:5,fill:d,stroke:"var(--color-background)",strokeWidth:2}),f&&(0,b.jsx)("text",{x:l,y:m,textAnchor:"middle",className:"fill-foreground text-[9px] font-medium pointer-events-none",children:e})]})}var u=a.i(92241),v=a.i(87759),w=a.i(70297),x=a.i(21218),y=a.i(8212),z=a.i(30400),A=a.i(7384),B=a.i(8753),C=a.i(62588),D=a.i(81130),E=a.i(59974);let F=["delegated-sync"];function G(){let{data:a,isLoading:c}=(0,C.useQuery)({queryKey:F,queryFn:()=>E.api.get("/delegated-sync"),staleTime:5e3,refetchInterval:15e3});if(c||!a)return null;let d=Object.entries(a.cadences).map(([a,b])=>({id:a,...b}));if(!a.workerRunning&&0===d.length)return null;if(!a.workerRunning)return(0,b.jsxs)(z.Card,{children:[(0,b.jsx)(z.CardHeader,{children:(0,b.jsx)(z.CardTitle,{children:"Background Sync"})}),(0,b.jsxs)("div",{className:"p-4 text-sm text-muted-foreground",children:["No integrations are in delegated mode, so background cadences are inactive. Move an integration (Calendar / Gmail / Notion) to delegated mode in ",(0,b.jsx)("code",{children:"/connections"})," to enable opt-in cadences here. Native-mode integrations fetch their observations directly during the hourly check turn and do not use this worker."]})]});let e=d.some(a=>a.enabled);return(0,b.jsxs)(z.Card,{children:[(0,b.jsx)(z.CardHeader,{children:(0,b.jsxs)(z.CardTitle,{className:"flex items-center gap-2",children:[(0,b.jsx)("span",{children:"Background Sync"}),a.withinActiveHours?(0,b.jsx)(A.Badge,{variant:"green",children:"active"}):(0,b.jsx)(A.Badge,{variant:"gray",children:"outside active hours"})]})}),(0,b.jsxs)("div",{className:"space-y-1 p-4 pt-0",children:[(0,b.jsx)("p",{className:"pb-2 text-xs text-muted-foreground",children:"Background cadences poll Calendar / Gmail / Notion through the backend's MCP subprocess so the hourly check sees fresh observations. Each row uses either the delegated backend (when the integration is in delegated mode) or the main backend (when native). Every poll spends tokens — by default they are off. Enable just the cadences you want, and they will respect the shared active-hours window below."}),(0,b.jsx)("div",{className:"space-y-2",children:d.map(a=>(0,b.jsx)(H,{row:a},a.id))}),e&&(0,b.jsx)(J,{startHour:a.activeHours.startHour,endHour:a.activeHours.endHour})]})]})}function H({row:a}){let d,e,f=(d=(0,D.useQueryClient)(),(0,B.useMutation)({mutationFn:({cadenceId:a,body:b})=>E.api.patch(`/delegated-sync/cadences/${encodeURIComponent(a)}`,b),onSuccess:()=>{d.invalidateQueries({queryKey:F})}})),g=(e=(0,D.useQueryClient)(),(0,B.useMutation)({mutationFn:({cadenceId:a})=>E.api.post(`/delegated-sync/cadences/${encodeURIComponent(a)}/run`,{}),onSuccess:()=>{e.invalidateQueries({queryKey:F})}})),[h,i]=(0,c.useState)(String(Math.round(a.intervalSeconds/60))),[j,k]=(0,c.useState)(null),[l,m]=(0,c.useState)(null);(0,c.useEffect)(()=>{i(String(Math.round(a.intervalSeconds/60)))},[a.intervalSeconds]);let n=Math.ceil(a.softFloorSeconds/60),o=Math.round(a.defaultIntervalSeconds/60),p=async()=>{m(null);try{await g.mutateAsync({cadenceId:a.id})}catch(a){m(a instanceof Error?a.message:"Run Now failed")}},q=f.isPending,r=g.isPending,s=a.intervalSeconds===a.defaultIntervalSeconds,t="native"===a.mode;return(0,b.jsxs)("div",{className:"rounded border border-border/50 p-3",children:[(0,b.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,b.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,b.jsx)("p",{className:"text-sm font-medium text-foreground",children:a.displayName}),"native"===a.mode&&(0,b.jsx)(A.Badge,{variant:"green",children:"native"}),"delegated"===a.mode&&(0,b.jsxs)(A.Badge,{variant:"blue",children:["delegated",a.backend?` \xb7 ${a.backend}`:""]}),!t&&"tripped"===a.circuitState&&(0,b.jsx)(A.Badge,{variant:"red",children:"circuit tripped"}),!t&&a.failureCount>0&&"ok"===a.circuitState&&(0,b.jsxs)(A.Badge,{variant:"amber",children:[a.failureCount," recent failure",1===a.failureCount?"":"s"]})]}),(0,b.jsx)("p",{className:"mt-0.5 text-xs text-muted-foreground",children:a.description}),!t&&(0,b.jsx)(I,{row:a})]}),!t&&(0,b.jsxs)("div",{className:"flex shrink-0 items-center gap-2",children:[(0,b.jsx)(x.Button,{variant:a.enabled?"default":"outline",size:"sm",onClick:()=>{f.mutate({cadenceId:a.id,body:{enabled:!a.enabled}})},disabled:q,children:q?(0,b.jsx)(u.Loader2,{className:"h-3.5 w-3.5 animate-spin"}):a.enabled?"Enabled":"Disabled"}),(0,b.jsxs)(x.Button,{variant:"outline",size:"sm",onClick:p,disabled:r,title:"Run this cadence once, regardless of schedule",children:[r?(0,b.jsx)(u.Loader2,{className:"h-3.5 w-3.5 animate-spin"}):(0,b.jsx)(v.Play,{className:"h-3.5 w-3.5"}),(0,b.jsx)("span",{className:"ml-1",children:"Run now"})]})]})]}),t?(0,b.jsx)("p",{className:"mt-2 text-xs text-muted-foreground",children:"Observations land via the in-turn fetch during the hourly check turn — no background cadence runs for this row."}):(0,b.jsxs)("div",{className:"mt-2 flex items-center gap-2 text-xs text-muted-foreground",children:[(0,b.jsxs)("label",{className:"flex items-center gap-1",children:[(0,b.jsx)("span",{children:"Interval:"}),(0,b.jsx)(y.Input,{type:"number",min:n,max:1440,value:h,onChange:a=>i(a.target.value),onBlur:()=>{k(null);let b=Number(h);!Number.isInteger(b)||b<=0?k("Whole positive number required"):b<n?k(`Minimum ${n} min`):b>1440?k("Maximum 1440 min (24 h)"):60*b!==a.intervalSeconds&&f.mutate({cadenceId:a.id,body:{intervalSeconds:60*b}},{onError:a=>k(a.message)})},onKeyDown:a=>{"Enter"===a.key&&(a.preventDefault(),a.target.blur())},className:"h-7 w-20 px-2 text-xs"}),(0,b.jsx)("span",{children:"min"})]}),(0,b.jsxs)("span",{className:"text-muted-foreground/70",children:["(",n,"–",1440,"; default ",o,")"]}),!s&&(0,b.jsxs)("button",{type:"button",onClick:()=>{i(String(o)),f.mutate({cadenceId:a.id,body:{intervalSeconds:60*o}})},className:"inline-flex items-center gap-0.5 text-[10px] text-muted-foreground hover:text-foreground",children:[(0,b.jsx)(w.RotateCcw,{className:"h-2.5 w-2.5"}),"reset"]}),j&&(0,b.jsx)("span",{className:"text-destructive",children:j})]}),l&&(0,b.jsxs)("p",{className:"mt-1 text-xs text-destructive",children:["Run Now: ",l]})]})}function I({row:a}){var d;let e=(0,c.useMemo)(()=>K(a.lastSuccessAt),[a.lastSuccessAt]),f=(0,c.useMemo)(()=>K(a.nextRunAt),[a.nextRunAt]);return a.lastAttemptAt||a.nextRunAt?(0,b.jsxs)("p",{className:"mt-1 text-xs text-muted-foreground/70",children:[a.lastSuccessAt?`Last success ${e}.`:"No successful run yet.",a.enabled&&a.nextRunAt&&` Next run ${f}.`,a.lastError&&` Last error: ${(d=a.lastError).length<=80?d:`${d.slice(0,79)}…`}`]}):(0,b.jsx)("p",{className:"mt-1 text-xs text-muted-foreground/70",children:"Has not run yet."})}function J({startHour:a,endHour:d}){let e,f=(e=(0,D.useQueryClient)(),(0,B.useMutation)({mutationFn:a=>E.api.patch("/delegated-sync/active-hours",a),onSuccess:()=>{e.invalidateQueries({queryKey:F})}})),[g,h]=(0,c.useState)(String(a)),[i,j]=(0,c.useState)(String(d)),[k,l]=(0,c.useState)(null);(0,c.useEffect)(()=>{h(String(a))},[a]),(0,c.useEffect)(()=>{j(String(d))},[d]);let m=()=>{l(null);let b=Number(g),c=Number(i);!Number.isInteger(b)||b<0||b>23?l("Start must be an integer 0–23"):!Number.isInteger(c)||c<1||c>24?l("End must be an integer 1–24"):b>=c?l("Start must be earlier than end"):(b!==a||c!==d)&&f.mutate({startHour:b,endHour:c},{onError:a=>l(a.message)})};return(0,b.jsxs)("div",{className:"mt-3 rounded border border-border/50 bg-muted/30 p-3",children:[(0,b.jsx)("p",{className:"text-sm font-medium text-foreground",children:"Active hours"}),(0,b.jsx)("p",{className:"mt-0.5 text-xs text-muted-foreground",children:'Shared by every enabled cadence. Outside this window, no cadence runs (Run Now still works). Interpreted in the configured timezone. End hour is exclusive — set 24 for "through 23:59".'}),(0,b.jsxs)("div",{className:"mt-2 flex flex-wrap items-center gap-3 text-xs",children:[(0,b.jsxs)("label",{className:"flex items-center gap-1",children:[(0,b.jsx)("span",{children:"Start:"}),(0,b.jsx)(y.Input,{type:"number",min:0,max:23,value:g,onChange:a=>h(a.target.value),onBlur:m,onKeyDown:a=>{"Enter"===a.key&&(a.preventDefault(),a.target.blur())},className:"h-7 w-16 px-2 text-xs"}),(0,b.jsx)("span",{children:":00"})]}),(0,b.jsxs)("label",{className:"flex items-center gap-1",children:[(0,b.jsx)("span",{children:"End:"}),(0,b.jsx)(y.Input,{type:"number",min:1,max:24,value:i,onChange:a=>j(a.target.value),onBlur:m,onKeyDown:a=>{"Enter"===a.key&&(a.preventDefault(),a.target.blur())},className:"h-7 w-16 px-2 text-xs"}),(0,b.jsx)("span",{children:":00"})]}),f.isPending&&(0,b.jsx)(u.Loader2,{className:"h-3.5 w-3.5 animate-spin text-muted-foreground"}),k&&(0,b.jsx)("span",{className:"text-destructive",children:k})]})]})}function K(a){var b,c;if(!a)return"—";let d=Date.parse(a);if(!Number.isFinite(d))return"—";let e=Math.round((d-Date.now())/1e3);return e>=0?(b=e)<60?`in ${b}s`:b<3600?`in ${Math.round(b/60)}m`:b<86400?`in ${Math.round(b/3600)}h`:`in ${Math.round(b/86400)}d`:(c=-e)<60?`${c}s ago`:c<3600?`${Math.round(c/60)}m ago`:c<86400?`${Math.round(c/3600)}h ago`:`${Math.round(c/86400)}d ago`}a.s(["default",0,function(){let{data:a}=(0,d.useConfig)(),{df:i}=(0,d.useConfigDefaults)(),{data:j}=(0,e.useHealth)(),{deferSaveFor:k,dv:l,dirtyFields:m,setDirty:n}=(0,f.useDirtyFields)(),o=(0,c.useCallback)(b=>{a&&(n("quietHoursStart",b.quietHoursStart,a.quietHoursStart),n("quietHoursEnd",b.quietHoursEnd,a.quietHoursEnd),n("hourlyCheckActiveStartHour",b.activeStartHour,a.hourlyCheckActiveStartHour),n("hourlyCheckActiveEndHour",b.activeEndHour,a.hourlyCheckActiveEndHour))},[a,n]);if(!a)return(0,b.jsx)("div",{className:"text-muted-foreground",children:"Loading..."});let p=k(a),q={quietHoursStart:l("quietHoursStart",a.quietHoursStart),quietHoursEnd:l("quietHoursEnd",a.quietHoursEnd),activeStartHour:l("hourlyCheckActiveStartHour",a.hourlyCheckActiveStartHour),activeEndHour:l("hourlyCheckActiveEndHour",a.hourlyCheckActiveEndHour),dayBoundaryHour:l("dayBoundaryHour",a.dayBoundaryHour)};return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-2xl font-semibold text-foreground",children:"Schedule & Notifications"}),(0,b.jsx)("p",{className:"mt-1 max-w-3xl text-sm text-muted-foreground",children:"When the agent runs in the background and how often it can interrupt you. All times are interpreted in the configured timezone."})]}),(0,b.jsxs)(g.ConfigSection,{title:"Time axis",helpDocId:"concepts/agent-day",children:[(0,b.jsx)("p",{className:"pb-2 text-xs text-muted-foreground",children:"Drag the handles to adjust quiet hours (red) and the hourly-check active window (green). The dashed blue line marks the day boundary. Changes are staged — save with the bar below."}),(0,b.jsx)(s,{values:q,onChange:o})]}),(0,b.jsxs)(g.ConfigSection,{title:"Day shape",helpDocId:"concepts/agent-day",children:[(0,b.jsx)(g.EditableField,{label:"Timezone",value:l("timezone",a.timezone),configKey:"timezone",modified:m.has("timezone"),defaultValue:i("timezone"),description:"IANA timezone name (e.g. America/New_York, America/Los_Angeles). All schedules, quiet hours, and daily boundaries are interpreted in this zone.",onSave:p}),(0,b.jsx)(g.EditableField,{label:"Day Boundary Hour",value:l("dayBoundaryHour",a.dayBoundaryHour),configKey:"dayBoundaryHour",type:"number",min:0,max:9,modified:m.has("dayBoundaryHour"),defaultValue:i("dayBoundaryHour"),description:"Hour (0–9, local time) at which a new agent day begins. At this hour the previous today.md is archived, a new one is generated, and daily retention and summary routines run. Pick a time you're reliably asleep — 04:00 is the default.",onSave:p})]}),(0,b.jsxs)(g.ConfigSection,{title:"Hourly Check",helpDocId:"features/routines/hourly-check",children:[(0,b.jsxs)("p",{className:"pb-2 text-xs text-muted-foreground",children:["The hourly check is the agent’s passive review loop. At each interval it queries pending observations (file edits, calendar updates, git commits, Notion changes), folds anything actionable into your context files (",(0,b.jsx)("code",{children:"today.md"}),", ",(0,b.jsx)("code",{children:"roadmap.md"}),", project notes), and stays silent otherwise. Most runs produce no output — that is by design."]}),(0,b.jsx)(g.EditableBooleanField,{label:"Hourly Check Enabled",value:l("hourlyCheckEnabled",a.hourlyCheckEnabled),configKey:"hourlyCheckEnabled",modified:m.has("hourlyCheckEnabled"),defaultValue:i("hourlyCheckEnabled"),description:"Master switch for the polling routine. When off, the agent only runs on direct messages, schedule.approaching events, and explicitly scheduled tasks.",onSave:p}),(0,b.jsx)(g.EditableField,{label:"Check Interval",value:l("hourlyCheckIntervalMinutes",a.hourlyCheckIntervalMinutes),configKey:"hourlyCheckIntervalMinutes",type:"number",suffix:"min",min:1,max:1440,modified:m.has("hourlyCheckIntervalMinutes"),defaultValue:i("hourlyCheckIntervalMinutes"),description:"How often the check runs during the active window. Any positive integer in minutes (1–1440, i.e. up to 24 hours). Despite the “hourly” name, you can dial this lower for higher-frequency checks or higher to cut quota burn. The cadence is anchored to the active-window start, so the first fire of each agent-day lands at the start of the window.",onSave:p}),(0,b.jsx)(g.EditableField,{label:"Active Start Hour",value:l("hourlyCheckActiveStartHour",a.hourlyCheckActiveStartHour),configKey:"hourlyCheckActiveStartHour",type:"number",min:0,max:23,modified:m.has("hourlyCheckActiveStartHour"),defaultValue:i("hourlyCheckActiveStartHour"),description:"Hour (0–23, local time) when the hourly check window opens. Runs before this hour are skipped entirely.",onSave:p}),(0,b.jsx)(g.EditableField,{label:"Active End Hour",value:l("hourlyCheckActiveEndHour",a.hourlyCheckActiveEndHour),configKey:"hourlyCheckActiveEndHour",type:"number",min:1,max:24,modified:m.has("hourlyCheckActiveEndHour"),defaultValue:i("hourlyCheckActiveEndHour"),description:"Hour (1–24, local time) when the window closes. Exclusive — e.g. set 24 to run through 23:59. Prevents the check from firing while you sleep.",onSave:p}),(0,b.jsx)(g.EditableField,{label:"Min Observations",value:l("hourlyCheckMinObservations",a.hourlyCheckMinObservations),configKey:"hourlyCheckMinObservations",type:"number",min:0,max:1e3,modified:m.has("hourlyCheckMinObservations"),defaultValue:i("hourlyCheckMinObservations"),description:"Minimum number of pending user-actor observations required for the check to actually launch an agent run. If fewer are queued, the tick is skipped with no cost. Set higher (e.g. 3–5) if you see too many no-op runs.",onSave:p}),(0,b.jsx)("p",{className:"pt-2 text-xs text-muted-foreground",children:"Trigger one immediately from the CLI:"}),(0,b.jsx)("pre",{className:"overflow-x-auto rounded bg-muted p-2 font-mono text-[11px] text-muted-foreground",children:'curl -X POST http://localhost:8321/api/agent/run-now -H "Authorization: Bearer <daemon-api-token>" -H "Content-Type: application/json" -d \'{"reason":"manual"}\''})]}),(0,b.jsx)(G,{}),(0,b.jsxs)(g.ConfigSection,{title:"Notifications",helpDocId:"features/operations/quiet-hours",children:[(0,b.jsx)("p",{className:"pb-2 text-xs text-muted-foreground",children:"Rate limits, quiet hours, and delivery destinations for outbound notifications the agent sends to you. “Notification” = a proactive message (reminder, alert, summary) — it does not include replies to messages you initiated."}),(0,b.jsx)(g.EditableField,{label:"Max Per Hour",value:l("maxNotificationsPerHour",a.maxNotificationsPerHour),configKey:"maxNotificationsPerHour",type:"number",modified:m.has("maxNotificationsPerHour"),defaultValue:i("maxNotificationsPerHour"),description:"Hard cap on outbound notifications in any rolling 60-minute window. Notifications above the cap are suppressed (not delivered, but still logged to Activity → Notifications so you can see what was dropped). Protects you from runaway notification loops.",onSave:p}),(0,b.jsx)(g.EditableField,{label:"Max Per Day",value:l("maxNotificationsPerDay",a.maxNotificationsPerDay),configKey:"maxNotificationsPerDay",type:"number",modified:m.has("maxNotificationsPerDay"),defaultValue:i("maxNotificationsPerDay"),description:"Hard cap per calendar day (resets at the Day Boundary Hour). A safety net on top of the per-hour cap. Suppressed notifications are still logged.",onSave:p}),(0,b.jsx)(g.EditableField,{label:"Quiet Hours Start",value:l("quietHoursStart",a.quietHoursStart),configKey:"quietHoursStart",modified:m.has("quietHoursStart"),defaultValue:i("quietHoursStart"),description:"24-hour time (HH:MM, e.g. 22:00) when quiet hours begin in the configured timezone. During quiet hours, regular notifications are held back. Safety-category notifications (deadline, error, security, critical) still go through.",onSave:p}),(0,b.jsx)(g.EditableField,{label:"Quiet Hours End",value:l("quietHoursEnd",a.quietHoursEnd),configKey:"quietHoursEnd",modified:m.has("quietHoursEnd"),defaultValue:i("quietHoursEnd"),description:"24-hour time (HH:MM, e.g. 08:00) when quiet hours end. If end is earlier than start, the window wraps over midnight.",onSave:p}),(0,b.jsx)(g.EditableField,{label:"Batch Interval",value:l("batchIntervalMinutes",a.batchIntervalMinutes),configKey:"batchIntervalMinutes",type:"number",suffix:"min",modified:m.has("batchIntervalMinutes"),defaultValue:i("batchIntervalMinutes"),description:"Minimum minutes between notification deliveries from the same routine. Multiple notifications queued within this window are combined into a single message so you don’t get spammed.",onSave:p}),(0,b.jsxs)("div",{className:"py-2 border-b text-sm text-muted-foreground",children:["Default reminder destinations are managed in"," ",(0,b.jsx)("a",{href:"/connections/messaging",className:"text-foreground underline underline-offset-2 hover:no-underline",children:"Connections → Messaging → Default Reminder Destinations"}),"."]}),(0,b.jsx)(h.PrimaryPlatformField,{health:j,value:l("primaryPlatform",a.primaryPlatform),defaultValue:i("primaryPlatform"),modified:m.has("primaryPlatform"),onSave:p})]})]})}],21532)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=packages_dashboard_src_app_settings_schedule_page_tsx_0b8zr2l._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/dashboard/src/app/settings/schedule/page.tsx","../../../../../../packages/dashboard/src/components/settings/time-range-ring.tsx","../../../../../../packages/dashboard/src/components/settings/delegated-sync-section.tsx","../../../../../../packages/dashboard/src/lib/hooks/use-delegated-sync.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useConfig, useConfigDefaults } from \"@/lib/hooks/use-config\";\nimport { useHealth } from \"@/lib/hooks/use-health\";\nimport { useDirtyFields } from \"@/lib/hooks/use-dirty-fields\";\nimport {\n ConfigSection,\n EditableBooleanField,\n EditableField,\n} from \"@/components/settings/editors\";\nimport { PrimaryPlatformField } from \"@/components/settings/composite-fields\";\nimport {\n TimeRangeRing,\n type TimeRangeRingValues,\n} from \"@/components/settings/time-range-ring\";\nimport { DelegatedSyncSection } from \"@/components/settings/delegated-sync-section\";\n\nconst RUN_NOW_EXAMPLE = `curl -X POST http://localhost:8321/api/agent/run-now -H \"Authorization: Bearer <daemon-api-token>\" -H \"Content-Type: application/json\" -d '{\"reason\":\"manual\"}'`;\n\nexport default function ScheduleSettingsPage() {\n const { data: config } = useConfig();\n const { df } = useConfigDefaults();\n const { data: health } = useHealth();\n const { deferSaveFor, dv, dirtyFields, setDirty } = useDirtyFields();\n\n // Calls setDirty with toggle-back detection — equivalent to deferSaveFor(config),\n // but placed before the early return to satisfy React hooks ordering rules.\n const handleRingChange = useCallback(\n (next: TimeRangeRingValues) => {\n if (!config) return;\n setDirty(\"quietHoursStart\", next.quietHoursStart, config.quietHoursStart);\n setDirty(\"quietHoursEnd\", next.quietHoursEnd, config.quietHoursEnd);\n setDirty(\"hourlyCheckActiveStartHour\", next.activeStartHour, config.hourlyCheckActiveStartHour);\n setDirty(\"hourlyCheckActiveEndHour\", next.activeEndHour, config.hourlyCheckActiveEndHour);\n },\n [config, setDirty],\n );\n\n if (!config) {\n return <div className=\"text-muted-foreground\">Loading...</div>;\n }\n\n const deferSave = deferSaveFor(config);\n\n // Gather ring values from dirty or server state\n const ringValues: TimeRangeRingValues = {\n quietHoursStart: dv(\"quietHoursStart\", config.quietHoursStart),\n quietHoursEnd: dv(\"quietHoursEnd\", config.quietHoursEnd),\n activeStartHour: dv(\"hourlyCheckActiveStartHour\", config.hourlyCheckActiveStartHour),\n activeEndHour: dv(\"hourlyCheckActiveEndHour\", config.hourlyCheckActiveEndHour),\n dayBoundaryHour: dv(\"dayBoundaryHour\", config.dayBoundaryHour),\n };\n\n return (\n <>\n <div>\n <h1 className=\"text-2xl font-semibold text-foreground\">\n Schedule & Notifications\n </h1>\n <p className=\"mt-1 max-w-3xl text-sm text-muted-foreground\">\n When the agent runs in the background and how often it can interrupt you.\n All times are interpreted in the configured timezone.\n </p>\n </div>\n\n {/* Visual time-axis overview */}\n <ConfigSection\n title=\"Time axis\"\n helpDocId=\"concepts/agent-day\"\n >\n <p className=\"pb-2 text-xs text-muted-foreground\">\n Drag the handles to adjust quiet hours (red) and the hourly-check active\n window (green). The dashed blue line marks the day boundary. Changes are\n staged — save with the bar below.\n </p>\n <TimeRangeRing values={ringValues} onChange={handleRingChange} />\n </ConfigSection>\n\n <ConfigSection title=\"Day shape\" helpDocId=\"concepts/agent-day\">\n <EditableField\n label=\"Timezone\"\n value={dv(\"timezone\", config.timezone)}\n configKey=\"timezone\"\n modified={dirtyFields.has(\"timezone\")}\n defaultValue={df(\"timezone\")}\n description=\"IANA timezone name (e.g. America/New_York, America/Los_Angeles). All schedules, quiet hours, and daily boundaries are interpreted in this zone.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Day Boundary Hour\"\n value={dv(\"dayBoundaryHour\", config.dayBoundaryHour)}\n configKey=\"dayBoundaryHour\"\n type=\"number\"\n min={0}\n max={9}\n modified={dirtyFields.has(\"dayBoundaryHour\")}\n defaultValue={df(\"dayBoundaryHour\")}\n description=\"Hour (0–9, local time) at which a new agent day begins. At this hour the previous today.md is archived, a new one is generated, and daily retention and summary routines run. Pick a time you're reliably asleep — 04:00 is the default.\"\n onSave={deferSave}\n />\n </ConfigSection>\n\n <ConfigSection\n title=\"Hourly Check\"\n helpDocId=\"features/routines/hourly-check\"\n >\n <p className=\"pb-2 text-xs text-muted-foreground\">\n The hourly check is the agent’s passive review loop. At each interval\n it queries pending observations (file edits, calendar updates, git commits,\n Notion changes), folds anything actionable into your context files (\n <code>today.md</code>, <code>roadmap.md</code>, project notes), and stays\n silent otherwise. Most runs produce no output — that is by design.\n </p>\n <EditableBooleanField\n label=\"Hourly Check Enabled\"\n value={dv(\"hourlyCheckEnabled\", config.hourlyCheckEnabled)}\n configKey=\"hourlyCheckEnabled\"\n modified={dirtyFields.has(\"hourlyCheckEnabled\")}\n defaultValue={df(\"hourlyCheckEnabled\")}\n description=\"Master switch for the polling routine. When off, the agent only runs on direct messages, schedule.approaching events, and explicitly scheduled tasks.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Check Interval\"\n value={dv(\"hourlyCheckIntervalMinutes\", config.hourlyCheckIntervalMinutes)}\n configKey=\"hourlyCheckIntervalMinutes\"\n type=\"number\"\n suffix=\"min\"\n min={1}\n max={1440}\n modified={dirtyFields.has(\"hourlyCheckIntervalMinutes\")}\n defaultValue={df(\"hourlyCheckIntervalMinutes\")}\n description=\"How often the check runs during the active window. Any positive integer in minutes (1–1440, i.e. up to 24 hours). Despite the “hourly” name, you can dial this lower for higher-frequency checks or higher to cut quota burn. The cadence is anchored to the active-window start, so the first fire of each agent-day lands at the start of the window.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Active Start Hour\"\n value={dv(\"hourlyCheckActiveStartHour\", config.hourlyCheckActiveStartHour)}\n configKey=\"hourlyCheckActiveStartHour\"\n type=\"number\"\n min={0}\n max={23}\n modified={dirtyFields.has(\"hourlyCheckActiveStartHour\")}\n defaultValue={df(\"hourlyCheckActiveStartHour\")}\n description=\"Hour (0–23, local time) when the hourly check window opens. Runs before this hour are skipped entirely.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Active End Hour\"\n value={dv(\"hourlyCheckActiveEndHour\", config.hourlyCheckActiveEndHour)}\n configKey=\"hourlyCheckActiveEndHour\"\n type=\"number\"\n min={1}\n max={24}\n modified={dirtyFields.has(\"hourlyCheckActiveEndHour\")}\n defaultValue={df(\"hourlyCheckActiveEndHour\")}\n description=\"Hour (1–24, local time) when the window closes. Exclusive — e.g. set 24 to run through 23:59. Prevents the check from firing while you sleep.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Min Observations\"\n value={dv(\"hourlyCheckMinObservations\", config.hourlyCheckMinObservations)}\n configKey=\"hourlyCheckMinObservations\"\n type=\"number\"\n min={0}\n max={1000}\n modified={dirtyFields.has(\"hourlyCheckMinObservations\")}\n defaultValue={df(\"hourlyCheckMinObservations\")}\n description=\"Minimum number of pending user-actor observations required for the check to actually launch an agent run. If fewer are queued, the tick is skipped with no cost. Set higher (e.g. 3–5) if you see too many no-op runs.\"\n onSave={deferSave}\n />\n <p className=\"pt-2 text-xs text-muted-foreground\">\n Trigger one immediately from the CLI:\n </p>\n <pre className=\"overflow-x-auto rounded bg-muted p-2 font-mono text-[11px] text-muted-foreground\">\n {RUN_NOW_EXAMPLE}\n </pre>\n </ConfigSection>\n\n <DelegatedSyncSection />\n\n <ConfigSection\n title=\"Notifications\"\n helpDocId=\"features/operations/quiet-hours\"\n >\n <p className=\"pb-2 text-xs text-muted-foreground\">\n Rate limits, quiet hours, and delivery destinations for outbound\n notifications the agent sends to you. “Notification” = a\n proactive message (reminder, alert, summary) — it does not include replies\n to messages you initiated.\n </p>\n <EditableField\n label=\"Max Per Hour\"\n value={dv(\"maxNotificationsPerHour\", config.maxNotificationsPerHour)}\n configKey=\"maxNotificationsPerHour\"\n type=\"number\"\n modified={dirtyFields.has(\"maxNotificationsPerHour\")}\n defaultValue={df(\"maxNotificationsPerHour\")}\n description=\"Hard cap on outbound notifications in any rolling 60-minute window. Notifications above the cap are suppressed (not delivered, but still logged to Activity → Notifications so you can see what was dropped). Protects you from runaway notification loops.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Max Per Day\"\n value={dv(\"maxNotificationsPerDay\", config.maxNotificationsPerDay)}\n configKey=\"maxNotificationsPerDay\"\n type=\"number\"\n modified={dirtyFields.has(\"maxNotificationsPerDay\")}\n defaultValue={df(\"maxNotificationsPerDay\")}\n description=\"Hard cap per calendar day (resets at the Day Boundary Hour). A safety net on top of the per-hour cap. Suppressed notifications are still logged.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Quiet Hours Start\"\n value={dv(\"quietHoursStart\", config.quietHoursStart)}\n configKey=\"quietHoursStart\"\n modified={dirtyFields.has(\"quietHoursStart\")}\n defaultValue={df(\"quietHoursStart\")}\n description=\"24-hour time (HH:MM, e.g. 22:00) when quiet hours begin in the configured timezone. During quiet hours, regular notifications are held back. Safety-category notifications (deadline, error, security, critical) still go through.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Quiet Hours End\"\n value={dv(\"quietHoursEnd\", config.quietHoursEnd)}\n configKey=\"quietHoursEnd\"\n modified={dirtyFields.has(\"quietHoursEnd\")}\n defaultValue={df(\"quietHoursEnd\")}\n description=\"24-hour time (HH:MM, e.g. 08:00) when quiet hours end. If end is earlier than start, the window wraps over midnight.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Batch Interval\"\n value={dv(\"batchIntervalMinutes\", config.batchIntervalMinutes)}\n configKey=\"batchIntervalMinutes\"\n type=\"number\"\n suffix=\"min\"\n modified={dirtyFields.has(\"batchIntervalMinutes\")}\n defaultValue={df(\"batchIntervalMinutes\")}\n description=\"Minimum minutes between notification deliveries from the same routine. Multiple notifications queued within this window are combined into a single message so you don’t get spammed.\"\n onSave={deferSave}\n />\n <div className=\"py-2 border-b text-sm text-muted-foreground\">\n Default reminder destinations are managed in{\" \"}\n <a\n href=\"/connections/messaging\"\n className=\"text-foreground underline underline-offset-2 hover:no-underline\"\n >\n Connections → Messaging → Default Reminder Destinations\n </a>\n .\n </div>\n <PrimaryPlatformField\n health={health}\n value={dv(\"primaryPlatform\", config.primaryPlatform)}\n defaultValue={df(\"primaryPlatform\")}\n modified={dirtyFields.has(\"primaryPlatform\")}\n onSave={deferSave}\n />\n </ConfigSection>\n </>\n );\n}\n","\"use client\";\n\nimport { useRef, useState } from \"react\";\n\n// ── Geometry helpers ──\n\nconst CX = 120;\nconst CY = 120;\nconst SIZE = 240;\n\n/** Convert an hour (0–24, fractional) to an angle in radians (0:00 = top, CW). */\nexport function hourToAngle(hour: number): number {\n return ((hour % 24) / 24) * Math.PI * 2 - Math.PI / 2;\n}\n\n/** Convert a radians angle back to an hour (0–24). */\nexport function angleToHour(angle: number): number {\n let h = ((angle + Math.PI / 2) / (Math.PI * 2)) * 24;\n if (h < 0) h += 24;\n return h % 24;\n}\n\n/** Point on the circle at the given angle and radius. */\nfunction polarPoint(angle: number, r: number): { x: number; y: number } {\n return { x: CX + r * Math.cos(angle), y: CY + r * Math.sin(angle) };\n}\n\n/** SVG arc path from startAngle to endAngle at radius r (always clockwise). */\nexport function arcPath(startAngle: number, endAngle: number, r: number): string {\n let sweep = endAngle - startAngle;\n if (sweep <= 0) sweep += Math.PI * 2;\n if (sweep > Math.PI * 2 - 0.001) sweep = Math.PI * 2 - 0.001;\n const largeArc = sweep > Math.PI ? 1 : 0;\n const s = polarPoint(startAngle, r);\n const e = polarPoint(startAngle + sweep, r);\n return `M ${s.x} ${s.y} A ${r} ${r} 0 ${largeArc} 1 ${e.x} ${e.y}`;\n}\n\n// ── Parse/format helpers ──\n\n/** Parse \"HH:MM\" → fractional hours (e.g. \"23:30\" → 23.5). */\nexport function parseHHMM(s: string): number {\n const [h, m] = s.split(\":\").map(Number);\n return (h ?? 0) + (m ?? 0) / 60;\n}\n\n/** Format fractional hours → \"HH:MM\". */\nexport function formatHHMM(h: number): string {\n const hh = Math.floor(((h % 24) + 24) % 24);\n const mm = Math.round((h - Math.floor(h)) * 60) % 60;\n return `${String(hh).padStart(2, \"0\")}:${String(mm).padStart(2, \"0\")}`;\n}\n\n/** Snap fractional hours to the nearest 15 minutes. */\nexport function snap15(h: number): number {\n return Math.round(h * 4) / 4;\n}\n\n/** Snap fractional hours to the nearest whole hour. */\nexport function snapHour(h: number): number {\n return Math.round(h) % 24;\n}\n\n// ── Types ──\n\nexport interface TimeRangeRingValues {\n quietHoursStart: string; // \"HH:MM\"\n quietHoursEnd: string; // \"HH:MM\"\n activeStartHour: number; // 0–23\n activeEndHour: number; // 1–24\n dayBoundaryHour: number; // 0–9\n}\n\ntype DragTarget =\n | \"quietStart\"\n | \"quietEnd\"\n | \"activeStart\"\n | \"activeEnd\"\n | null;\n\n// ── Theme-aware colors (CSS variables) ──\n\nconst COLOR_QUIET = \"var(--color-destructive)\";\nconst COLOR_ACTIVE = \"var(--color-success)\";\nconst COLOR_DAY_BOUNDARY = \"var(--color-primary)\";\n\n// ── Component ──\n\nexport function TimeRangeRing({\n values,\n onChange,\n}: {\n values: TimeRangeRingValues;\n onChange: (next: TimeRangeRingValues) => void;\n}) {\n const svgRef = useRef<SVGSVGElement>(null);\n const [dragging, setDragging] = useState<DragTarget>(null);\n const [hovered, setHovered] = useState<DragTarget>(null);\n\n const quietStartH = parseHHMM(values.quietHoursStart);\n const quietEndH = parseHHMM(values.quietHoursEnd);\n const activeStartH = values.activeStartHour;\n const activeEndH = values.activeEndHour % 24;\n\n const quietStartA = hourToAngle(quietStartH);\n const quietEndA = hourToAngle(quietEndH);\n const activeStartA = hourToAngle(activeStartH);\n const activeEndA = hourToAngle(activeEndH);\n const dayBoundaryA = hourToAngle(values.dayBoundaryHour);\n\n const QUIET_R = 90;\n const ACTIVE_R = 75;\n\n // Pointer event helpers — work with both mouse and touch.\n const getHourFromPointer = (e: React.PointerEvent | PointerEvent) => {\n const svg = svgRef.current;\n if (!svg) return 0;\n const rect = svg.getBoundingClientRect();\n const scaleX = SIZE / rect.width;\n const scaleY = SIZE / rect.height;\n const x = (e.clientX - rect.left) * scaleX - CX;\n const y = (e.clientY - rect.top) * scaleY - CY;\n return angleToHour(Math.atan2(y, x));\n };\n\n const handlePointerDown = (target: DragTarget) => (e: React.PointerEvent) => {\n e.preventDefault();\n (e.target as Element).setPointerCapture(e.pointerId);\n setDragging(target);\n };\n\n const handlePointerMove = (e: React.PointerEvent) => {\n if (!dragging) return;\n const hour = getHourFromPointer(e);\n const next = { ...values };\n switch (dragging) {\n case \"quietStart\":\n next.quietHoursStart = formatHHMM(snap15(hour));\n break;\n case \"quietEnd\":\n next.quietHoursEnd = formatHHMM(snap15(hour));\n break;\n case \"activeStart\":\n next.activeStartHour = snapHour(hour);\n break;\n case \"activeEnd\": {\n const snapped = snapHour(hour);\n next.activeEndHour = snapped === 0 ? 24 : snapped;\n break;\n }\n }\n onChange(next);\n };\n\n const handlePointerUp = () => {\n setDragging(null);\n };\n\n const hourLabels = [0, 3, 6, 9, 12, 15, 18, 21];\n\n return (\n <div className=\"flex items-center justify-center\">\n <svg\n ref={svgRef}\n viewBox={`0 0 ${SIZE} ${SIZE}`}\n className=\"w-full max-w-[280px] select-none touch-none\"\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerLeave={handlePointerUp}\n >\n {/* Background circle */}\n <circle\n cx={CX}\n cy={CY}\n r={100}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1}\n className=\"text-border\"\n />\n\n {/* Hour tick marks */}\n {Array.from({ length: 24 }, (_, i) => {\n const a = hourToAngle(i);\n const isMajor = i % 3 === 0;\n const inner = polarPoint(a, isMajor ? 95 : 97);\n const outer = polarPoint(a, 100);\n return (\n <line\n key={i}\n x1={inner.x}\n y1={inner.y}\n x2={outer.x}\n y2={outer.y}\n stroke=\"currentColor\"\n strokeWidth={isMajor ? 1.5 : 0.5}\n className=\"text-muted-foreground\"\n />\n );\n })}\n\n {/* Hour labels */}\n {hourLabels.map((h) => {\n const a = hourToAngle(h);\n const p = polarPoint(a, 108);\n return (\n <text\n key={h}\n x={p.x}\n y={p.y}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n className=\"fill-muted-foreground text-[9px]\"\n >\n {h}\n </text>\n );\n })}\n\n {/* Quiet hours arc (destructive/red) */}\n <path\n d={arcPath(quietStartA, quietEndA, QUIET_R)}\n fill=\"none\"\n stroke={COLOR_QUIET}\n strokeWidth={8}\n strokeLinecap=\"round\"\n opacity={0.6}\n />\n\n {/* Active hours arc (success/green) */}\n <path\n d={arcPath(activeStartA, activeEndA, ACTIVE_R)}\n fill=\"none\"\n stroke={COLOR_ACTIVE}\n strokeWidth={8}\n strokeLinecap=\"round\"\n opacity={0.6}\n />\n\n {/* Day boundary marker (primary/blue dashed line) */}\n {(() => {\n const inner = polarPoint(dayBoundaryA, 60);\n const outer = polarPoint(dayBoundaryA, 100);\n return (\n <line\n x1={inner.x}\n y1={inner.y}\n x2={outer.x}\n y2={outer.y}\n stroke={COLOR_DAY_BOUNDARY}\n strokeWidth={2}\n strokeDasharray=\"4 2\"\n />\n );\n })()}\n\n {/* Day boundary label */}\n {(() => {\n const p = polarPoint(dayBoundaryA, 53);\n return (\n <text\n x={p.x}\n y={p.y}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n className=\"fill-primary text-[8px] font-medium\"\n >\n day\n </text>\n );\n })()}\n\n {/* Drag handles — render active/dragging handle last for z-order */}\n {renderHandles({\n dragging,\n hovered,\n setDragging,\n setHovered,\n handlePointerDown,\n quietStartA,\n quietEndA,\n activeStartA,\n activeEndA,\n QUIET_R,\n ACTIVE_R,\n values,\n })}\n\n {/* Center legend */}\n <text\n x={CX}\n y={CX - 8}\n textAnchor=\"middle\"\n className=\"fill-muted-foreground text-[8px]\"\n >\n <tspan style={{ fill: COLOR_QUIET }}>●</tspan> quiet hours\n </text>\n <text\n x={CX}\n y={CX + 4}\n textAnchor=\"middle\"\n className=\"fill-muted-foreground text-[8px]\"\n >\n <tspan style={{ fill: COLOR_ACTIVE }}>●</tspan> active window\n </text>\n <text\n x={CX}\n y={CX + 16}\n textAnchor=\"middle\"\n className=\"fill-muted-foreground text-[8px]\"\n >\n <tspan style={{ fill: COLOR_DAY_BOUNDARY }}>---</tspan> day boundary\n </text>\n </svg>\n </div>\n );\n}\n\n/**\n * Renders all 4 drag handles, with the currently active (dragging or hovered)\n * handle rendered last so it appears on top in SVG z-order.\n */\nfunction renderHandles({\n dragging,\n hovered,\n setHovered,\n handlePointerDown,\n quietStartA,\n quietEndA,\n activeStartA,\n activeEndA,\n QUIET_R,\n ACTIVE_R,\n values,\n}: {\n dragging: DragTarget;\n hovered: DragTarget;\n setDragging: (t: DragTarget) => void;\n setHovered: (t: DragTarget) => void;\n handlePointerDown: (target: DragTarget) => (e: React.PointerEvent) => void;\n quietStartA: number;\n quietEndA: number;\n activeStartA: number;\n activeEndA: number;\n QUIET_R: number;\n ACTIVE_R: number;\n values: TimeRangeRingValues;\n}) {\n const activeTarget = dragging ?? hovered;\n const handles: { target: DragTarget; angle: number; r: number; color: string; label: string }[] = [\n { target: \"quietStart\", angle: quietStartA, r: QUIET_R, color: COLOR_QUIET, label: values.quietHoursStart },\n { target: \"quietEnd\", angle: quietEndA, r: QUIET_R, color: COLOR_QUIET, label: values.quietHoursEnd },\n { target: \"activeStart\", angle: activeStartA, r: ACTIVE_R, color: COLOR_ACTIVE, label: `${values.activeStartHour}:00` },\n { target: \"activeEnd\", angle: activeEndA, r: ACTIVE_R, color: COLOR_ACTIVE, label: `${values.activeEndHour}:00` },\n ];\n\n // Sort so the active handle renders last (on top in SVG).\n const sorted = handles.sort((a, b) => {\n const aActive = a.target === activeTarget ? 1 : 0;\n const bActive = b.target === activeTarget ? 1 : 0;\n return aActive - bActive;\n });\n\n return (\n <>\n {sorted.map((h) => (\n <Handle\n key={h.target}\n angle={h.angle}\n r={h.r}\n color={h.color}\n label={h.label}\n active={h.target === activeTarget}\n onPointerDown={handlePointerDown(h.target)}\n onPointerEnter={() => setHovered(h.target)}\n onPointerLeave={() => setHovered(null)}\n />\n ))}\n </>\n );\n}\n\n/** Clamp label position within the viewBox so text isn't clipped. */\nfunction clampLabelPos(x: number, y: number): { lx: number; ly: number } {\n const PAD = 12;\n return {\n lx: Math.max(PAD, Math.min(SIZE - PAD, x)),\n ly: Math.max(PAD, Math.min(SIZE - PAD, y - 12)),\n };\n}\n\nfunction Handle({\n angle,\n r,\n color,\n label,\n active,\n onPointerDown,\n onPointerEnter,\n onPointerLeave,\n}: {\n angle: number;\n r: number;\n color: string;\n label: string;\n active: boolean;\n onPointerDown: (e: React.PointerEvent) => void;\n onPointerEnter: () => void;\n onPointerLeave: () => void;\n}) {\n const p = polarPoint(angle, r);\n const handleR = active ? 7 : 5;\n const { lx, ly } = clampLabelPos(p.x, p.y);\n return (\n <g\n onPointerDown={onPointerDown}\n onPointerEnter={onPointerEnter}\n onPointerLeave={onPointerLeave}\n className=\"cursor-grab active:cursor-grabbing\"\n >\n {/* Invisible larger hit area */}\n <circle cx={p.x} cy={p.y} r={12} fill=\"transparent\" />\n {/* Visible handle */}\n <circle\n cx={p.x}\n cy={p.y}\n r={handleR}\n fill={color}\n stroke=\"var(--color-background)\"\n strokeWidth={2}\n />\n {/* Label (only on hover / drag) */}\n {active && (\n <text\n x={lx}\n y={ly}\n textAnchor=\"middle\"\n className=\"fill-foreground text-[9px] font-medium pointer-events-none\"\n >\n {label}\n </text>\n )}\n </g>\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { Loader2, Play, RotateCcw } from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Card, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n useDelegatedSync,\n usePatchDelegatedSyncCadence,\n usePatchDelegatedSyncActiveHours,\n useRunDelegatedSyncCadence,\n} from \"@/lib/hooks/use-delegated-sync\";\nimport type { DelegatedSyncCadenceRow } from \"@/lib/api-types\";\n\n/**\n * Delegated-sync settings section\n * (docs/design/appendices/delegated-sync-opt-in.md).\n *\n * Lives on /settings/schedule between the Hourly Check and Notifications\n * cards. Renders only when the worker reports at least one delegated\n * integration; otherwise it returns null so the page doesn't show an\n * empty stub.\n *\n * UX:\n * - Each cadence row has its own enable toggle + interval editor + Run\n * Now button. Toggling persists immediately; the interval persists on\n * blur / Enter so a user typing intermediate digits doesn't fire 3 PATCHes.\n * - The active-hours subsection appears only when at least one cadence is\n * enabled (matches Q2 / \"pause all cadences at once\"). It mirrors the Hourly Check\n * fields' look but writes to /api/delegated-sync/active-hours rather\n * than the runtime-settings PATCH path.\n */\nexport function DelegatedSyncSection() {\n const { data, isLoading } = useDelegatedSync();\n\n if (isLoading || !data) return null;\n\n const cadenceRows = Object.entries(data.cadences).map(([id, row]) => ({\n id,\n ...row,\n }));\n\n // The route always returns the four production cadences in the catalog,\n // even when no integration is delegated — that's how the dashboard\n // discovers them. To decide whether to render this section we lean on\n // `workerRunning`: the worker is only registered when at least one\n // integration is in delegated mode.\n if (!data.workerRunning && cadenceRows.length === 0) return null;\n if (!data.workerRunning) {\n // Worker absent — render a hint instead of the cadence list, so the\n // user understands why toggles wouldn't have effect right now.\n return (\n <Card>\n <CardHeader>\n <CardTitle>Background Sync</CardTitle>\n </CardHeader>\n <div className=\"p-4 text-sm text-muted-foreground\">\n No integrations are in delegated or native mode, so background\n cadences are inactive. Move an integration (Calendar / Gmail /\n Notion) to delegated or native mode in <code>/connections</code>\n to enable opt-in cadences here.\n </div>\n </Card>\n );\n }\n\n const anyEnabled = cadenceRows.some((row) => row.enabled);\n\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <span>Background Sync</span>\n {data.withinActiveHours ? (\n <Badge variant=\"green\">active</Badge>\n ) : (\n <Badge variant=\"gray\">outside active hours</Badge>\n )}\n </CardTitle>\n </CardHeader>\n <div className=\"space-y-1 p-4 pt-0\">\n <p className=\"pb-2 text-xs text-muted-foreground\">\n Background cadences poll Calendar / Gmail / Notion through the\n backend's MCP subprocess so the hourly check sees fresh\n observations. Each row uses either the delegated backend (when\n the integration is in delegated mode) or the main backend (when\n native). Every poll spends tokens — by default they are off.\n Enable just the cadences you want, and they will respect the\n shared active-hours window below.\n </p>\n <div className=\"space-y-2\">\n {cadenceRows.map((row) => (\n <CadenceRow key={row.id} row={row} />\n ))}\n </div>\n {anyEnabled && (\n <ActiveHoursEditor\n startHour={data.activeHours.startHour}\n endHour={data.activeHours.endHour}\n />\n )}\n </div>\n </Card>\n );\n}\n\nfunction CadenceRow({ row }: { row: DelegatedSyncCadenceRow & { id: string } }) {\n const patch = usePatchDelegatedSyncCadence();\n const run = useRunDelegatedSyncCadence();\n\n const [draftMinutes, setDraftMinutes] = useState<string>(\n String(Math.round(row.intervalSeconds / 60)),\n );\n const [intervalError, setIntervalError] = useState<string | null>(null);\n const [runError, setRunError] = useState<string | null>(null);\n\n // Sync draft when the underlying intervalSeconds changes (e.g. another\n // tab edited it). Don't blow away in-progress edits — only re-sync when\n // the local draft matches the previously-persisted value.\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setDraftMinutes(String(Math.round(row.intervalSeconds / 60)));\n }, [row.intervalSeconds]);\n\n const minMinutes = Math.ceil(row.softFloorSeconds / 60);\n const maxMinutes = 24 * 60;\n const defaultMinutes = Math.round(row.defaultIntervalSeconds / 60);\n\n const handleToggle = () => {\n patch.mutate({ cadenceId: row.id, body: { enabled: !row.enabled } });\n };\n\n const commitInterval = () => {\n setIntervalError(null);\n const parsed = Number(draftMinutes);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n setIntervalError(\"Whole positive number required\");\n return;\n }\n if (parsed < minMinutes) {\n setIntervalError(`Minimum ${minMinutes} min`);\n return;\n }\n if (parsed > maxMinutes) {\n setIntervalError(`Maximum ${maxMinutes} min (24 h)`);\n return;\n }\n if (parsed * 60 === row.intervalSeconds) return;\n patch.mutate(\n {\n cadenceId: row.id,\n body: { intervalSeconds: parsed * 60 },\n },\n {\n onError: (err) => setIntervalError(err.message),\n },\n );\n };\n\n const handleResetInterval = () => {\n setDraftMinutes(String(defaultMinutes));\n patch.mutate({\n cadenceId: row.id,\n body: { intervalSeconds: defaultMinutes * 60 },\n });\n };\n\n const handleRunNow = async () => {\n setRunError(null);\n try {\n await run.mutateAsync({ cadenceId: row.id });\n } catch (err) {\n setRunError(err instanceof Error ? err.message : \"Run Now failed\");\n }\n };\n\n const isPatching = patch.isPending;\n const isRunning = run.isPending;\n const isDefaultInterval = row.intervalSeconds === row.defaultIntervalSeconds;\n\n return (\n <div className=\"rounded border border-border/50 p-3\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"text-sm font-medium text-foreground\">\n {row.displayName}\n </p>\n {row.mode === \"native\" && (\n <Badge variant=\"green\">\n native{row.backend ? ` · ${row.backend}` : \"\"}\n </Badge>\n )}\n {row.mode === \"delegated\" && (\n <Badge variant=\"blue\">\n delegated{row.backend ? ` · ${row.backend}` : \"\"}\n </Badge>\n )}\n {row.circuitState === \"tripped\" && (\n <Badge variant=\"red\">circuit tripped</Badge>\n )}\n {row.failureCount > 0 && row.circuitState === \"ok\" && (\n <Badge variant=\"amber\">\n {row.failureCount} recent failure{row.failureCount === 1 ? \"\" : \"s\"}\n </Badge>\n )}\n </div>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {row.description}\n </p>\n <CadenceStatusFooter row={row} />\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <Button\n variant={row.enabled ? \"default\" : \"outline\"}\n size=\"sm\"\n onClick={handleToggle}\n disabled={isPatching}\n >\n {isPatching ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : row.enabled ? (\n \"Enabled\"\n ) : (\n \"Disabled\"\n )}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleRunNow}\n disabled={isRunning}\n title=\"Run this cadence once, regardless of schedule\"\n >\n {isRunning ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <Play className=\"h-3.5 w-3.5\" />\n )}\n <span className=\"ml-1\">Run now</span>\n </Button>\n </div>\n </div>\n <div className=\"mt-2 flex items-center gap-2 text-xs text-muted-foreground\">\n <label className=\"flex items-center gap-1\">\n <span>Interval:</span>\n <Input\n type=\"number\"\n min={minMinutes}\n max={maxMinutes}\n value={draftMinutes}\n onChange={(e) => setDraftMinutes(e.target.value)}\n onBlur={commitInterval}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n }\n }}\n className=\"h-7 w-20 px-2 text-xs\"\n />\n <span>min</span>\n </label>\n <span className=\"text-muted-foreground/70\">\n ({minMinutes}–{maxMinutes}; default {defaultMinutes})\n </span>\n {!isDefaultInterval && (\n <button\n type=\"button\"\n onClick={handleResetInterval}\n className=\"inline-flex items-center gap-0.5 text-[10px] text-muted-foreground hover:text-foreground\"\n >\n <RotateCcw className=\"h-2.5 w-2.5\" />\n reset\n </button>\n )}\n {intervalError && (\n <span className=\"text-destructive\">{intervalError}</span>\n )}\n </div>\n {runError && (\n <p className=\"mt-1 text-xs text-destructive\">Run Now: {runError}</p>\n )}\n </div>\n );\n}\n\nfunction CadenceStatusFooter({ row }: { row: DelegatedSyncCadenceRow }) {\n const lastRun = useMemo(() => formatRelative(row.lastSuccessAt), [row.lastSuccessAt]);\n const nextRun = useMemo(() => formatRelative(row.nextRunAt), [row.nextRunAt]);\n if (!row.lastAttemptAt && !row.nextRunAt) {\n return (\n <p className=\"mt-1 text-xs text-muted-foreground/70\">\n Has not run yet.\n </p>\n );\n }\n return (\n <p className=\"mt-1 text-xs text-muted-foreground/70\">\n {row.lastSuccessAt ? `Last success ${lastRun}.` : \"No successful run yet.\"}\n {row.enabled && row.nextRunAt && ` Next run ${nextRun}.`}\n {row.lastError && ` Last error: ${truncate(row.lastError, 80)}`}\n </p>\n );\n}\n\nfunction ActiveHoursEditor({\n startHour,\n endHour,\n}: {\n startHour: number;\n endHour: number;\n}) {\n const patch = usePatchDelegatedSyncActiveHours();\n const [start, setStart] = useState(String(startHour));\n const [end, setEnd] = useState(String(endHour));\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n setStart(String(startHour));\n }, [startHour]);\n useEffect(() => {\n setEnd(String(endHour));\n }, [endHour]);\n\n const commit = () => {\n setError(null);\n const s = Number(start);\n const e = Number(end);\n if (!Number.isInteger(s) || s < 0 || s > 23) {\n setError(\"Start must be an integer 0–23\");\n return;\n }\n if (!Number.isInteger(e) || e < 1 || e > 24) {\n setError(\"End must be an integer 1–24\");\n return;\n }\n if (s >= e) {\n setError(\"Start must be earlier than end\");\n return;\n }\n if (s === startHour && e === endHour) return;\n patch.mutate(\n { startHour: s, endHour: e },\n { onError: (err) => setError(err.message) },\n );\n };\n\n return (\n <div className=\"mt-3 rounded border border-border/50 bg-muted/30 p-3\">\n <p className=\"text-sm font-medium text-foreground\">Active hours</p>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n Shared by every enabled cadence. Outside this window, no cadence\n runs (Run Now still works). Interpreted in the configured timezone.\n End hour is exclusive — set 24 for "through 23:59".\n </p>\n <div className=\"mt-2 flex flex-wrap items-center gap-3 text-xs\">\n <label className=\"flex items-center gap-1\">\n <span>Start:</span>\n <Input\n type=\"number\"\n min={0}\n max={23}\n value={start}\n onChange={(e) => setStart(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n }\n }}\n className=\"h-7 w-16 px-2 text-xs\"\n />\n <span>:00</span>\n </label>\n <label className=\"flex items-center gap-1\">\n <span>End:</span>\n <Input\n type=\"number\"\n min={1}\n max={24}\n value={end}\n onChange={(e) => setEnd(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n }\n }}\n className=\"h-7 w-16 px-2 text-xs\"\n />\n <span>:00</span>\n </label>\n {patch.isPending && (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin text-muted-foreground\" />\n )}\n {error && <span className=\"text-destructive\">{error}</span>}\n </div>\n </div>\n );\n}\n\nfunction formatRelative(iso: string | null): string {\n if (!iso) return \"—\";\n const ms = Date.parse(iso);\n if (!Number.isFinite(ms)) return \"—\";\n const deltaSec = Math.round((ms - Date.now()) / 1000);\n if (deltaSec >= 0) return inFutureWords(deltaSec);\n return inPastWords(-deltaSec);\n}\n\nfunction inFutureWords(deltaSec: number): string {\n if (deltaSec < 60) return `in ${deltaSec}s`;\n if (deltaSec < 60 * 60) return `in ${Math.round(deltaSec / 60)}m`;\n if (deltaSec < 24 * 60 * 60) return `in ${Math.round(deltaSec / 3600)}h`;\n return `in ${Math.round(deltaSec / 86400)}d`;\n}\n\nfunction inPastWords(deltaSec: number): string {\n if (deltaSec < 60) return `${deltaSec}s ago`;\n if (deltaSec < 60 * 60) return `${Math.round(deltaSec / 60)}m ago`;\n if (deltaSec < 24 * 60 * 60) return `${Math.round(deltaSec / 3600)}h ago`;\n return `${Math.round(deltaSec / 86400)}d ago`;\n}\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text;\n return `${text.slice(0, max - 1)}…`;\n}\n","\"use client\";\n\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { api } from \"@/lib/api-client\";\nimport type {\n DelegatedSyncActiveHoursPatch,\n DelegatedSyncCadencePatch,\n DelegatedSyncStatusResponse,\n} from \"@/lib/api-types\";\n\n/**\n * Delegated-sync opt-in dashboard hooks\n * (docs/design/appendices/delegated-sync-opt-in.md).\n *\n * The status query is cheap (read-only worker snapshot) and the dashboard\n * surfaces lastRun / nextRun / circuit state which the user expects to\n * update without a manual refresh — so the staleTime is short and the\n * mutations all invalidate `[\"delegated-sync\"]` to keep the UI synced.\n */\n\nconst QUERY_KEY = [\"delegated-sync\"] as const;\n\nexport function useDelegatedSync() {\n return useQuery({\n queryKey: QUERY_KEY,\n queryFn: () => api.get<DelegatedSyncStatusResponse>(\"/delegated-sync\"),\n staleTime: 5_000,\n refetchInterval: 15_000,\n });\n}\n\nexport function usePatchDelegatedSyncCadence() {\n const qc = useQueryClient();\n return useMutation<\n DelegatedSyncStatusResponse,\n Error,\n { cadenceId: string; body: DelegatedSyncCadencePatch }\n >({\n mutationFn: ({ cadenceId, body }) =>\n api.patch<DelegatedSyncStatusResponse>(\n `/delegated-sync/cadences/${encodeURIComponent(cadenceId)}`,\n body,\n ),\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: QUERY_KEY });\n },\n });\n}\n\nexport function usePatchDelegatedSyncActiveHours() {\n const qc = useQueryClient();\n return useMutation<\n DelegatedSyncStatusResponse,\n Error,\n DelegatedSyncActiveHoursPatch\n >({\n mutationFn: (body) =>\n api.patch<DelegatedSyncStatusResponse>(\"/delegated-sync/active-hours\", body),\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: QUERY_KEY });\n },\n });\n}\n\nexport function useRunDelegatedSyncCadence() {\n const qc = useQueryClient();\n return useMutation<{ ok: true }, Error, { cadenceId: string }>({\n mutationFn: ({ cadenceId }) =>\n api.post<{ ok: true }>(\n `/delegated-sync/cadences/${encodeURIComponent(cadenceId)}/run`,\n {},\n ),\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: QUERY_KEY });\n },\n });\n}\n"],"names":["CX","CY","SIZE","hourToAngle","hour","Math","PI","angleToHour","angle","h","polarPoint","r","x","cos","y","sin","arcPath","startAngle","endAngle","sweep","largeArc","s","e","parseHHMM","m","split","map","Number","formatHHMM","hh","floor","mm","round","String","padStart","snap15","snapHour","COLOR_QUIET","COLOR_ACTIVE","COLOR_DAY_BOUNDARY","TimeRangeRing","values","onChange","svgRef","dragging","setDragging","hovered","setHovered","quietStartH","quietHoursStart","quietEndH","quietHoursEnd","activeStartH","activeStartHour","activeEndH","activeEndHour","quietStartA","quietEndA","activeStartA","activeEndA","dayBoundaryA","dayBoundaryHour","QUIET_R","ACTIVE_R","getHourFromPointer","svg","current","rect","getBoundingClientRect","scaleX","width","scaleY","height","clientX","left","clientY","top","atan2","handlePointerDown","target","preventDefault","setPointerCapture","pointerId","handlePointerMove","next","snapped","handlePointerUp","hourLabels","className","ref","viewBox","onPointerMove","onPointerUp","onPointerLeave","cx","cy","fill","stroke","strokeWidth","Array","from","length","_","i","a","isMajor","inner","outer","x1","y1","x2","y2","p","textAnchor","dominantBaseline","d","strokeLinecap","opacity","strokeDasharray","renderHandles","style","activeTarget","handles","color","label","sorted","sort","b","aActive","bActive","Handle","active","onPointerDown","onPointerEnter","clampLabelPos","PAD","lx","max","min","ly","handleR"],"mappings":"wDAEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAKA,EAAA,EAAA,CAAA,CAAA,OCAO,SAASG,EAAYC,CAAY,EACtC,OAASA,EAAO,GAAM,GAAMC,KAAKC,EAAE,CAAG,EAAID,KAAKC,EAAE,CAAG,CACtD,CAUA,SAASI,EAAWF,CAAa,CAAEG,CAAS,EAC1C,MAAO,CAAEC,EAAGZ,IAAKW,EAAIN,KAAKQ,GAAG,CAACL,GAAQM,EAAGb,AAjBhC,IAiBqCU,EAAIN,KAAKU,GAAG,CAACP,EAAO,CACpE,CAGO,SAASQ,EAAQC,CAAkB,CAAEC,CAAgB,CAAEP,CAAS,EACrE,IAAIQ,EAAQD,EAAWD,EACnBE,GAAS,GAAGA,MAASd,KAAKC,EAAE,AAAG,EAC/Ba,EAAkB,EAAVd,KAAKC,EAAE,CAAO,OAAOa,EAAkB,EAAVd,KAAKC,EAAE,CAAO,IAAA,EACvD,IAAMc,IAAWD,EAAQd,KAAKC,EAAAA,AAAE,EAC1Be,CAD6B,CACzBX,EAAWO,CADkB,CACNN,GAC3BW,EAAIZ,EAAWO,EAAaE,EAAOR,GACzC,MAAO,CAAC,EAAE,EAAEU,EAAET,CAAC,CAAC,CAAC,EAAES,EAAEP,CAAC,CAAC,GAAG,EAAEH,EAAE,CAAC,EAAEA,EAAE,GAAG,EAAES,EAAS,GAAG,EAAEE,EAAEV,CAAC,CAAC,CAAC,EAAEU,EAAER,CAAC,CAAA,CAAE,AACpE,CAKO,SAASS,EAAUF,CAAS,EACjC,GAAM,CAACZ,EAAGe,EAAE,CAAGH,EAAEI,KAAK,CAAC,KAAKC,GAAG,CAACC,QAChC,MAAO,CAAClB,IAAK,CAAC,CAAI,AAACe,KAAK,CAAC,CAAI,EAC/B,CAGO,SAASI,EAAWnB,CAAS,EAClC,IAAMoB,EAAKxB,KAAKyB,KAAK,CAAGrB,AAAF,GAAM,GAAM,EAAA,CAAE,CAAI,IAClCsB,EAAK1B,KAAK2B,KAAK,CAAC,CAACvB,EAAIJ,KAAKyB,KAAK,CAACrB,EAAAA,CAAE,CAAI,IAAM,GAClD,MAAO,CAAA,EAAGwB,OAAOJ,GAAIK,QAAQ,CAAC,EAAG,KAAK,CAAC,EAAED,OAAOF,GAAIG,QAAQ,CAAC,EAAG,KAAA,CAClE,AADwE,CAIjE,SAASC,EAAO1B,CAAS,EAC9B,OAAOJ,KAAK2B,KAAK,CAAK,EAAJvB,GAAS,CAC7B,CAGO,SAAS2B,EAAS3B,CAAS,EAChC,OAAOJ,KAAK2B,KAAK,CAACvB,GAAK,EACzB,CAqBA,IAAM4B,EAAc,2BACdC,EAAe,uBACfC,EAAqB,uBAIpB,SAASC,EAAc,QAC5BC,CAAM,UACNC,CAAQ,CAIT,EACC,UAAMC,EAAS,CAAA,EAAA,EAAA,MAAA,AAAM,EAAgB,MAC/B,CAACC,EAAUC,EAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAa,MAC/C,CAACC,EAASC,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAa,MAE7CC,EAAczB,EAAUkB,EAAOQ,eAAe,EAC9CC,EAAY3B,EAAUkB,EAAOU,aAAa,EAC1CC,EAAeX,EAAOY,eAAe,CACrCC,EAAab,EAAOc,aAAa,CAAG,GAEpCC,EAAcrD,EAAY6C,GAC1BS,EAAYtD,EAAY+C,GACxBQ,EAAevD,EAAYiD,GAC3BO,EAAaxD,EAAYmD,GACzBM,EAAezD,EAAYsC,EAAOoB,eAAe,EA8CjDyB,EAAkB,KACtBzC,EAAY,KACd,EAIA,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI2C,UAAU,4CACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CACCC,IAAK9C,EACL+C,QAAS,CAAC,IAAI,EAAExF,KAAK,CAAC,CACtBsF,CADwBtF,MAAM,GACpB,8CACVyF,cAnCoB,AAACrE,CAmCN6D,GAlCnB,GAAI,CAACvC,EAAU,OACf,IAAMxC,EAAO4D,CAnBY,AAAC1C,IAC1B,MAAM2C,EAAMtB,EAAOuB,OAAO,CAC1B,GAAI,CAACD,EAAK,OAAO,EACjB,IAAME,EAAOF,EAAIG,qBAAqB,GAChCC,EAASnE,IAAOiE,EAAKG,KAAK,CAC1BC,EA/GG,AA+GMrE,IAAOiE,EAAKK,MAAM,CAC3B5D,EAAI,CAACU,EAAEmD,OAAO,CAAGN,EAAKO,IAAAA,AAAI,EAAIL,MAEpC,GAF6CrE,GAtG3CS,CADAA,AAyGKF,EAzGA,CAACC,AAyGWH,KAAKwE,KAAK,CAAC/D,AADpB,CAACQ,EAAEqD,OAAO,CAAGR,EAAKS,GAAAA,AAAG,EAAIL,MACF3D,GAzGjBP,AAwG4BJ,KAxGvBK,EAAE,EAAG,CAAC,IAAI,AAACD,KAAKC,EAAE,AAAG,CAAC,CAAK,IAC1C,IAAGG,GAAK,EAAA,EACTA,EAAI,GAwGX,EAUkCa,GAC1B8D,EAAO,CAAE,GAAG3C,CAAM,AAAC,EACzB,OAAQG,GACN,IAAK,aACHwC,EAAKnC,eAAe,CAAGrB,EAAWO,EAAO/B,IACzC,KACF,KAAK,WACHgF,EAAKjC,aAAa,CAAGvB,EAAWO,EAAO/B,IACvC,KACF,KAAK,cACHgF,EAAK/B,eAAe,CAAGjB,EAAShC,GAChC,KACF,KAAK,YAAa,CAChB,IAAMiF,EAAUjD,EAAShC,GACzBgF,EAAK7B,aAAa,CAAe,IAAZ8B,EAAgB,GAAKA,CAE5C,CACF,CACA3C,EAAS0C,EACX,EAeMQ,YAAaN,EACbO,eAAgBP,YAGhB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACCQ,GAtKC,CAsKG9F,GACJ+F,IAAI9F,GACJU,EAAG,IACHqF,KAAK,OACLC,OAAO,eACPC,YAAa,EACbV,UAAU,gBAIXW,MAAMC,IAAI,CAAC,CAAEC,OAAQ,EAAG,EAAG,CAACC,EAAGC,KAC9B,IAAMC,EAAIrG,EAAYoG,GAChBE,EAAUF,EAAI,GAAM,EACpBG,EAAQhG,EAAW8F,EAAGC,EAAU,GAAK,IACrCE,EAAQjG,EAAW8F,EAAG,KAC5B,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAECI,GAAIF,EAAM9F,CAAC,CACXiG,GAAIH,EAAM5F,CAAC,CACXgG,GAAIH,EAAM/F,CAAC,CACXmG,GAAIJ,EAAM7F,CAAC,CACXmF,OAAO,eACPC,YAAaO,EAAU,IAAM,GAC7BjB,UAAU,yBAPLe,EAUX,GAGChB,AA5CY,CAAC,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAG,CA4C7B7D,GAAG,CAAC,AAACjB,IAEf,IAAMuG,EAAItG,EADAP,EAAYM,GACE,IAAH+F,CACrB,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAEC5F,EAAGoG,EAAEpG,CAAC,CACNE,EAAGkG,EAAElG,CAAC,CACNmG,WAAW,SACXC,iBAAiB,UACjB1B,UAAU,4CAET/E,GAPIA,EAUX,GAGA,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CACC0G,EAAGnG,EAAQwC,EAAaC,EA/GhB,IAgHRuC,KADmClC,AAC9B,OACLmC,OAAQ5D,EACR6D,YAAa,EACbkB,cAAc,QACdC,QAAS,KAIX,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CACCF,EAAGnG,EAAQ0C,EAAcC,EAxHhB,IAyHTqC,KAAK,CADgCjC,MAErCkC,OAAQ3D,EACR4D,YAAa,EACbkB,cAAc,QACdC,QAAS,MAKHX,EAAQhG,EAAWkD,EAAc,IACjC+C,EAAQjG,EAAWkD,EAAc,KAErC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CACCgD,GAAIF,EAAM9F,CAAC,CACXiG,GAAIH,EAAM5F,CAAC,CACXgG,GAAIH,EAAM/F,CAAC,CACXmG,GAAIJ,EAAM7F,CAAC,CACXmF,OAAQ1D,EACR2D,YAAa,EACboB,gBAAgB,UAOdN,EAAItG,EAAWkD,EAAc,IAEjC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CACChD,EAAGoG,EAAEpG,CAAC,CACNE,EAAGkG,EAAElG,CAAC,CACNmG,WAAW,SACXC,iBAAiB,UACjB1B,UAAU,+CACX,SAOJ+B,AAiDT,SAASA,AAAc,UACrB3E,CAAQ,CACRE,SAAO,YACPC,CAAU,mBACV+B,CAAiB,aACjBtB,CAAW,WACXC,CAAS,cACTC,CAAY,CACZC,YAAU,SACVG,CAAO,UACPC,CAAQ,QACRtB,CAAM,CAcP,EACC,IAAMgF,EAAe7E,GAAYE,EAS3B+E,EAR4F,AAQnFH,CAPb,CAAE3C,OAAQ,aAAcvE,MAAOgD,EAAa7C,EAAGmD,EAAS6D,MAAOtF,EAAauF,MAAOnF,EAAOQ,eAAgB,AAAD,EACzG,CAAE8B,OAAQ,WAAYvE,MAAOiD,EAAW9C,EAAGmD,EAAS6D,MAAOtF,EAAauF,MAAOnF,EAAOU,aAAa,AAAC,EACpG,CAAE4B,OAAQ,cAAevE,MAAOkD,EAAc/C,EAAGoD,EAAU4D,MAAOrF,EAAcsF,MAAO,CAAA,EAAGnF,EAAOY,eAAe,CAAC,GAAG,CAAC,AAAC,EACtH,CAAE0B,OAAQ,YAAavE,MAAOmD,EAAYhD,EAAGoD,EAAU4D,MAAOrF,EAAcsF,MAAO,CAAA,EAAGnF,EAAOc,aAAa,CAAC,GAAG,CAAC,AAAC,EACjH,CAGsBuE,IAAI,CAAC,CAACtB,EAAGuB,IAGvBC,CAFSxB,EAAEzB,MAAM,CAEPkD,EAFYR,CAAAA,GACbM,CAD4B,CAC1BhD,GAD8B,GACxB,GAAK0C,CAAAA,GAI/B,CAJ8C,IAAI,CAKhD,CAAA,EAAA,EAAA,GAAA,EAAA,EAAA,QAAA,CAAA,UACGI,EAAOnG,GAAG,CAAC,AAACjB,GACX,CAAA,EAAA,EAAA,GAAA,EAACyH,EAAAA,CAEC1H,MAAOC,EAAED,KAAK,CACdG,EAAGF,EAAEE,CAAC,CACNgH,MAAOlH,EAAEkH,KAAK,CACdC,MAAOnH,EAAEmH,KAAK,CACdO,OAAQ1H,EAAEsE,MAAM,GAAK0C,EACrBW,cAAetD,EAAkBrE,EAAEsE,MAAM,EACzCsD,eAAgB,IAAMtF,EAAWtC,EAAEsE,MAAM,EACzCc,eAAgB,IAAM9C,EAAW,OAR5BtC,EAAEsE,MAAM,IAavB,EA3GuB,UACbnC,UACAE,EACAD,yBACAE,EACA+B,kBAzJkB,AAACC,GAAwBzD,AAAD,IAChDA,EAAE0D,cAAc,GACf1D,EAAEyD,MAAM,CAAaE,iBAAiB,CAAC3D,EAAE4D,SAAS,EACnDrC,EAAYkC,EACd,cAsJQvB,YACAC,eACAC,aACAC,EACAG,WACAC,mBACAtB,CACF,GAGA,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CACC7B,GAAGZ,GACHc,EAAGd,IACHiH,CADQ,UACG,SACXzB,UAAU,6CAEV,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAMgC,MAAO,CAAExB,KAAM3D,CAAY,WAAG,MAAe,kBAEtD,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CACCzB,GAAGZ,GACHc,EAAGd,IACHiH,CADQ,UACG,SACXzB,UAAU,6CAEV,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAMgC,MAAO,CAAExB,KAAM1D,CAAa,WAAG,MAAe,oBAEvD,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CACC1B,GAAGZ,GACHc,EAAGd,IACHiH,CADQ,UACG,SACXzB,UAAU,6CAEV,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAMgC,MAAO,CAAExB,KAAMzD,CAAmB,WAAG,QAAW,uBAKjE,CA2EA,SAAS2F,EAAO,OACd1H,CAAK,GACLG,CAAC,OACDgH,CAAK,OACLC,CAAK,QACLO,CAAM,eACNC,CAAa,gBACbC,CAAc,CACdxC,gBAAc,CAUf,EACC,IAAMmB,EAAItG,EAAWF,EAAOG,GAEtB,IAAE6H,CAAE,IAAEG,CAAE,CAAE,EA1BdH,CA0BiBF,EA1BbjI,KAAKoI,GAAG,CAACF,AAFH,GAEQlI,KAAKqI,GAAG,CAACxI,IA0BI8G,EAAEpG,CA1BC2H,AA0BA,GAzBlCI,EADuC/H,CACnCP,KAAKoI,GAAG,CAACF,GAAKlI,KAAKqI,GAAG,CAACxI,IAyBS8G,AAzBGlG,EAyBDA,CAAC,AAzBLyH,CAAS,MA0B7C,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CACCH,cAAeA,EACfC,eAAgBA,EAChBxC,eAAgBA,EAChBL,UAAU,+CAGV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAOM,GAAIkB,EAAEpG,CAAC,CAAEmF,GAAIiB,EAAElG,CAAC,CAAEH,EAAG,GAAIqF,KAAK,gBAEtC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACCF,GAAIkB,EAAEpG,CAAC,CACPmF,GAAIiB,EAAElG,CAAC,CACPH,EAfUwH,CAePS,CAfgB,EAAI,EAgBvB5C,KAAM2B,EACN1B,OAAO,0BACPC,YAAa,IAGdiC,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CACCvH,EAAG4H,EACH1H,EAAG6H,EACH1B,WAAW,SACXzB,UAAU,sEAEToC,MAKX,CCzbA,IAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,MACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,MCLA,EAAA,EAAA,CAAA,CAAA,MAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAiBA,IAAM,EAAY,CAAC,iBAAiB,CDc7B,SAASvG,IACd,GAAM,MAAE,CAAI,WAAE,CAAS,CAAE,CCZlB,CAAA,CDYqB,CCZrB,EAAA,QAAA,AAAQ,EAAC,CACd,SAAU,EACV,QAAS,IAAM,EAAA,GAAG,CAAC,GAAG,CAA8B,mBACpD,UAAW,IACX,gBAAiB,IACnB,GDSA,GAAI,GAAa,CAAC,EAAM,OAAO,KAE/B,IAAMO,EAAc,OAAO,OAAO,CAAC,EAAK,QAAQ,EAAE,GAAG,CAAC,CAAC,CAACE,EAAI,EAAIrB,GAAK,CAAC,IACpE,EACA,GAAG,CAAG,CACR,CAAC,EAOD,GAAI,CAAC,EAAK,aAAa,EAA2B,IAAvB,EAAY,MAAM,CAAQ,OAAO,KAC5D,GAAI,CAAC,EAAK,aAAa,CAGrB,CAHuB,KAIrB,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,IAAI,CAAA,WACH,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,CAAA,UACT,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,UAAC,sBAEb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8CAAoC,wKAGV,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,iBAAmB,wCAOxE,IAAM,EAAa,EAAY,IAAI,CAAC,AAAC,GAAQ,EAAI,OAAO,EAExD,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,IAAI,CAAA,WACH,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,CAAA,UACT,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,SAAS,CAAA,CAAC,UAAU,oCACnB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,oBACL,EAAK,iBAAiB,CACrB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAKc,CAAAA,CAAC,QAAQ,iBAAQ0B,WAEvB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,gBAAO,8BAI5B,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+BACb,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8CAAqC,sZASlD,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qBACZ,EAAY,GAAGkB,CAAE,AAAD,GACf,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAwB,IAAK,GAAb7C,EAAI,EAAE,KAG1B,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,UAAW,EAAK,WAAW,CAAC,SAAS,CACrC,QAAS,EAAK,WAAW,CAAC,OAAO,QAM7C,CAEA,SAAS,EAAW,KAAE,CAAG,CAAqD,EAC5E,QAAM,GC7EA,EAAK,CAAA,EAAA,AD6EG,EC7EH,cAAA,AAAcjB,IAClB,CAAA,EAAA,EAAA,WAAW,AAAX,EAIL,CACA,WAAY,CAAC,WAAE,CAAS,MAAE,CAAIc,CAAE,GAC9B,EAAA,GAAG,CAAC,KAAK,CACP,CAAC,yBAAyB,EAAE,mBAAmB,GAAA,CAAY,CAC3D,GAEJ,UAAW,KACT,EAAG,iBAAiB,CAAC,CAAE,SAAU,CAAU,EAC7C,CACF,IDgEM,GC7CA,EAAK,CAAA,AD6CC,EC7CD,EAAA,cAAA,AAAc,IAClB,CAAA,EAAA,EAAA,WAAA,AAAW,EAA6C,CAC7D,WAAY,CAAC,WAAE,CAAS,CAAE,GACxB,EAAA,GAAG,CAAC,IAAI,CACNV,CAAC,yBAAyB,EAAE,mBAAmB,GAAW,IAAI,CAAC,CAC/D,CAAC,GAEL,UAAW,KACT,EAAG,iBAAiB,CAAC,CAAE,SAAU,CAAU,EAC7C,CACF,IDqCM,CAAC,EAAc,EAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAC9C,OAAO,KAAK,KAAKmB,CAAC,EAAI,eAAe,CAAG,MAEpC,CAAC,EAAe,EAAiB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAC5D,CAAC,EAAU,EAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAKxDwD,CAAAA,EAAAA,EAAAA,SAAAA,AAAS,EAAC,KAER,EAAgB,OAAO,KAAK,KAAK,CAAC,EAAI,eAAe,CAAG,KAC1D,EAAG,CAAC,EAAI,eAAe,CAAC,EAExB,IAAM,EAAa,KAAK,IAAI,CAAC,EAAI,gBAAgB,CAAG,IAE9C,EAAiB,KAAK,KAAK,CAAC,EAAI,sBAAsB,CAAG,IAyCzD,EAAe,UACnB,EAAY,MACZ,GAAI,CACF,MAAM,EAAI,WAAW,CAAC,CAAE,UAAW,EAAI,EAAE,AAAC,EAC5C,CAAE,MAAO,EAAK,CACZ,EAAY,aAAe,MAAQ,EAAI,OAAO,CAAG,iBACnD,CACF,EAEM,EAAa,EAAM,SAAS,CAC5B,EAAY,EAAI,SAAS,CACzB,EAAoB,EAAI,eAAe,GAAK,EAAI,sBAAsB,CAE5E,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,2BACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8CACb,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,+CACV,EAAI,WAAW,GAEJ,WAAb,EAAI,IAAI,EACP,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,kBAAQ,SACd,EAAI,OAAO,CAAG,CAAC,MAAG,EAAE,EAAI,OAAO,CAAA,CAAE,CAAG,MAGjC,cAAb,EAAI,IAAI,EACP,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,iBAAO,YACV,EAAI,OAAO,CAAG,CAAC,MAAG,EAAE,EAAI,OAAO,CAAA,CAAE,CAAG,MAGjD,AAAqB,cAAjB,YAAY,EACf,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,eAAM,oBAEtB,EAAI,YAAY,CAAG,GAA0B,OAArB,EAAI,YAAY,EACvC,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,kBACZ,EAAI,YAAY,CAAC,kBAAqC,IAArB,EAAI,YAAY,CAAS,GAAK,UAItE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,gDACV,EAAI,WAAW,GAElB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAoB,IAAK,OAE5B,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6CACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CACL,QAAS,EAAI,OAAO,CAAG,UAAY,UACnC,KAAK,KACL,QAxFW,CAwFF,IAvFjB,EAAMQ,MAAM,CAAC,CAAE,UAAW,EAAI,EAAE,CAAE,KAAM,CAAE,QAAS,CAAC,EAAI,OAAO,AAAC,CAAE,EACpE,EAuFU,SAAU,WAET,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAO,CAAA,CAAC,UAAU,6BACjB,EAAI,OAAO,CACb,UAEA,aAGJ,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,MAAM,CAAA,CACL,QAAQ,UACR,KAAK,KACL,QAAS,EACT,SAAU,EACV,MAAMhF,0DAEL,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAO,CAAA,CAAC,UAAU,6BAEnB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,IAAI,CAAA,CAAC,UAAU,gBAElB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAUZ,gBAAO,qBAI7B,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uEACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,oCACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAKY,cACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CACJ,KAAK,SACL,IAAK,EACL,KAAK,IACL,MAAO,EACP,SAAW,AAAD,GAAO,EAAgB,EAAE,MAAM,CAAC,KAAK,EAC/C,OAxHa,CAwHL,IAvHhB,EAAiB,MACjB,IAAM,EAAS,OAAOmF,EACtB,AAAI,EAAC,OAAO,SAAS,CAAC,IAAW,GAAU,EACzC,CAD4C,CAC3BG,kCAGf,EAAS,EACX,EAAiBE,CAAC,OADK,CACG,EAAE,EAAWE,IAAI,CAAC,EAG1C,OACF,EADW,AACM,CAAC,QAAQ,EAAE,CADL,UACgB,KAG5B,GAAT,GAHgD,CAAC,AAGjC,EAAI,eAAe,EAAE,AACzC,EAAM,MAAM,CACV,CACE,UAAW,EAAI,EAAE,CACjB,KAAM,CAAEM,gBAA0B,GAAT,CAAY,CACvC,EACA,CACE,QAAU,AAAD,GAAS,EAAiB,EAAI,OAAO,CAChD,EAEJ,EAgGU,UAAY,AAAD,IACK,SAAS,CAAnB,EAAE,GAAG,GACP,EAAE,cAAc,GACf,EAAE,MAAM,CAAsB,IAAI,GAEvC,EACA,UAAU,0BAEZ,CAAA,EAAA,EAAA,GAAA,EAAClD,OAAAA,UAAK,WAERK,CAAAA,EAAAA,EAAAA,IAAAA,EAAC,OAAA,CAAK,UAAU,qCAA2B,IACvC,EAAW,IA3IF,KA2Ie,AA3IV,aA2IqB,EAAe,OAErD,CAAC,GACA,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,KAAK,SACL,QA9GkB,CA8GT,IA7GjB,EAAgB,OAAO,IACvB,EAAM,MAAM,CAAC,CACX,UAAW,EAAI,EAAE,CACjB,KAAM,CAAE,gBAAkC,GAAjB,CAAoB,CAC/C,EACF,EAyGU,UAAU,qGAEV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CAAC,UAAU,gBAAgB,WAIxC,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,4BAAoB,OAGvC,GACC,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAE,UAAU,0CAAgC,YAAU,OAI/D,CAEA,SAAS,EAAoB,CAAE,KAAG,CAAoC,MA4IpD,EA3IhB,EA2I4B,EA3ItB,AA2IwB,EA3Id,CAAA,AA2IyB,EA3IzB,EAAA,OAAA,AAAO,EAAC,IAAM,EAAe,EAAI,aAAa,EAAG,CAAC,EAAIV,aAAa,CAAC,EAC9E,EAAU,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IAAM,EAAe,EAAI,SAAS,EAAG,CAAC,EAAI,SAAS,CAAC,SAC5E,AAAIuE,AAAC,EAAI,aAAa,EAAK,EAAD,AAAK,SAAS,CAQtC,CARwC,AAQxC,EAAA,EAAA,IAAA,EAAC,IAAA,CAAE,UAAU,kDACVH,EAAI,aAAa,CAAG,CAAC,aAAa,EAAE,EAAQ,CAAC,CAAC,CAAG,yBACjD,EAAI,OAAO,EAAI,EAAI,SAAS,EAAI,CAAC,UAAU,EAAE,EAAQhH,CAAC,CAACsE,CACvD,EAAI,SAAS,EAAI,CAACvE,aAAa,EAAE,AA+HtC,AAAI,GA/H2C,EAAI,SAAS,EA+HnD,MAAM,EA/H+C,EA+H3C,CAAY,EACxB,CAAA,CADiB,CACd,EAAK,KAAK,CAAC,EAAG,IAAS,CAAC,CAAC,AAAL,CAhIgC,CAAKmH,IAT/D,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,iDAAwC,oBAY3D,CAEA,SAAS,EAAkB,WACzB,CAAS,SACT,CAAO,CAIR,EACC,ICzQM,EDyQA,KCzQK,CAAA,EAAA,ADyQG,ECzQH,cAAA,AAAc,IAClB,CAAA,EAAA,EAAA,WAAA,AAAW,EAIhB,CACA,WAAY,AAAC,GACX,EAAA,GAAG,CAAC,KAAK,CAA8B,+BAAgC,GACzE,UAAW,KACT,EAAG,iBAAiB,CAAC,CAAE,SAAU,CAAU,EAC7C,CACF,ID+PM,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,OAAO5E,IACpC,CAAC,EAAK,EAAO,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,OAAO,IAChC,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAElD,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACRnC,EAAS,OAAO,GAClB,EAAG,CAAC,EAAU,EACd,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC2H,KACR,EAAO,OAAO,GAChB,EAAG,CAAClI,EAAQ,EAEZ,IAAM,EAAS,KACb,EAAS,MACT,IAAM,EAAI,OAAO,GACX6H,EAAI,OAAO1H,EACjB,AAAImH,EAAC,OAAO,SAAS,CAACQ,IAAM,EAAIC,GAAK,EAAI,GACvC,CAD2C,CAClC,iCAGP,CAAC,OAAO,SAAS,CAAC,IAAM,EAAI,GAAK,EAAI,GACvC,CAD2C,CAClC,+BAGP,GAAK,EACP,CADU,CACD,mCAGP,IAAM,GAAa,IAAM,CAAA,GAASO,AACtC,EAAM,MAAM,CACV,CAAE,UAAW,EAAG,QAAS,CAAE,EAC3B,CAAE,QAAS,AAAC,GAAQ,EAAS,EAAI,OAAON,CAAE,EAE9C,EAEA,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIxC,UAAU,iEACb,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,+CAAsC,iBACnD,CAAA,EAAA,EAAA,GAAA,EAAClF,IAAAA,CAAE,UAAU,gDAAuC,6LAKpD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,2DACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,oCACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CACJ,KAAK,SACL,IAAK,EACL,IAAK,GACL,MAAO,EACP,SAAW,AAAD,GAAO,EAAS,EAAE,MAAM,CAAC,KAAK,EACxC,OAAQ,EACR,UAAW,AAAC,IACI,SAAS,CAAnB,EAAE,GAAG,GACP,EAAE,cAAc,GACf,EAAE,MAAM,CAAsB,IAAI,GAEvC,EACA,UAAU,0BAEZ,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,WAER,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,oCACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,SACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CACJ,KAAK,SACL,IAAK,EACL,IAAK,GACL,MAAO,EACP,SAAU,AAAC,GAAM,EAAO,EAAE,MAAM,CAAC,KAAK,EACtC,OAAQ,EACR,UAAW,AAAC,IACI,SAAS,CAAnB,EAAE,GAAG,GACP,EAAE,cAAc,GACf,EAAE,MAAM,CAAsB,IAAI,GAEvC,EACA,UAAU,0BAEZ,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,WAEP,EAAM,SAAS,EACd,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAO,CAAA,CAAC,UAAU,mDAEpB,GAAS,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,4BAAoB,SAItD,CAEA,SAAS,EAAe,CAAkB,MASnB,EAOF,EAfnB,GAAI,CAAC,AAQgC,EAR3B,AAeyB,MAflB,IACjB,IAAM,EAAK,KAAK,KAAK,CAAC,GACtB,GAAI,CAAC,OAAO,QAAQ,CAAC,GAAK,MAAO,IACjC,IAAM,EAAW,KAAK,KAAK,CAAC,CAAC,EAAK,KAAK,GAAG,EAAA,CAAE,CAAI,YAChD,AAAI,GAAY,EAKhB,AAAI,CALe,EAAqB,GAKzB,EALW,CAKA,CAAP,AAAQ,GAAG,EAAE,EAAS,CAAC,CAAC,CACvC,EAAW,KAAK,AAAW,CAAC,GAAR,AAAW,EAAE,KAAK,KAAK,CAAC,EAAW,IAAI,CAAC,CAAC,CAC7D,EAAW,KAAK,CAAgB,CAAC,GAAZ,AAAe,EAAE,EAAb,GAAkB,KAAK,CAAC,EAAW,MAAM,CAAC,CAAC,CACjE,CAAC,GAAG,EAAE,KAAK,KAAK,CAAC,EAAW,OAAO,CAAC,CAAC,CAI5C,AAAI,GAXe,CAAC,GAWL,GAAW,CAAA,AAAP,EAAU,EAAS,KAAK,CAAC,CACxC,EAAW,KAAK,AAAW,CAAA,EAAG,CAAV,IAAe,KAAK,CAAC,EAAW,IAAI,KAAK,CAAC,CAC9D,EAAW,KAAK,CAAgB,CAAA,EAAG,CAAd,IAAI,AAAe,KAAK,CAAC,EAAW,MAAM,KAAK,CAAC,CAClE,CAAA,EAAG,KAAK,KAAK,CAAC,EAAW,OAAO,KAAK,CAAC,AAb/C,kBFzYe,SAAS,EACtBK,GAAM,CAAEC,KAAM,CAAM,CAAE,CAAG,CAAA,EAAA,EAAA,SAAS,AAAT,IACnBN,IAAE,CAAE,CAAE,CAAG,CAAA,EAAA,EAAA,iBAAA,AAAiB,IAC1B,CAAE,KAAMM,CAAM,CAAE,CAAG,CAAA,EAAA,EAAA,SAAA,AAAS,IAC5B,cAAE,CAAY,IAAE,CAAE,aAAE,CAAW,UAAE,CAAQ,CAAE,CAAG,CAAA,EAAA,EAAA,cAAA,AAAc,IAI5D,EAAmB,CAAA,EAAA,EAAA,WAAW,AAAX,EACtB,AAAD,IACO,IACL,EAAS,EADI,gBACe,EAAK,eAAe,CAAE,EAAO,eAAe,EACxE,EAAS,gBAAiB,EAAK,aAAa,CAAE,EAAO,aAAa,EAClE,EAAS,6BAA8B,EAAK,eAAe,CAAE,EAAO,0BAA0B,EAC9F,EAAS,2BAA4B,EAAK,aAAa,CAAE,EAAO,wBAAwB,EAC1F,EACA,CAAC,EAAQ,EAAS,EAGpB,GAAI,CAACY,EACH,MADW,AACJ,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,iCAAwB,eAGhD,IAAM,EAAY,EAAa,GAGzB,EAAkC,CACtC,gBAAiB,EAAG,kBAAmB,EAAO,eAAe,EAC7D,cAAe,EAAG,gBAAiB,EAAO,aAAa,EACvD,gBAAiB,EAAG,6BAA8B,EAAO,0BAA0B,EACnF,cAAe,EAAG,2BAA4B,EAAO,wBAAwB,EAC7E,gBAAiB,EAAG,kBAAmB,EAAO,eAAe,CAC/D,EAEA,MACE,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,kDAAyC,6BAGvD,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,wDAA+C,uIAO9D,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,aAAa,CAAA,CACZ,MAAM,YACN,UAAU,+BAEV,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8CAAqC,wLAKlD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAc,OAAQ,EAAY1B,SAAU,OAG/C,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,aAAa,CAAA,CAAC,MAAM,YAAY,UAAU,+BACzC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,aAAa,CAAA,CACZ,MAAM,WACN,MAAO,EAAG,WAAY0D,EAAO,QAAQ,EACrC,UAAU,WACV,SAAU,EAAY,GAAG,CAAC,YAC1B,aAAc,EAAG,YACjB,YAAY,kJACZ,OAAQ,IAEV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,aAAa,CAAA,CACZ,MAAM,oBACN,MAAO,EAAG,kBAAmB,EAAO,eAAe,EACnD,UAAU,kBACV,KAAKjD,SACLkE,IAAK,EACL,IAAK,EACL,SAAU,EAAY,GAAG,CAAC,mBAC1B,aAAc,EAAG,mBACjB,YAAY,2OACZ,OAAQ,OAIZ,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,aAAa,CAAA,CACZ,MAAM,eACN,UAAU,2CAEV,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAE,UAAU,+CAAqC,yNAIhD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,aAAe,KAAE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,eAAiB,oGAGhD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,oBAAoB,CAAA,CACnB,MAAM,uBACN,MAAO,EAAG,qBAAsB,EAAO,kBAAkB,EACzD,UAAU,qBACV,SAAU,EAAY,GAAG,CAAC,sBAC1B,aAAc,EAAG,sBACjBiB,YAAY,wJACZ,OAAQ,IAEV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,aAAa,CAAA,CACZ,MAAM,iBACN,MAAO,EAAG,6BAA8B,EAAO,0BAA0B,EACzE,UAAU,6BACV,KAAK,SACL,OAAO,MACP,IAAK,EACL,IAAK,KACL,SAAU,EAAYW,GAAG,CAAC,8BAC1B,aAAc,EAAG,8BACjB,YAAY,0VACZ,OAAQ,IAEV,CAAA,EAAA,EAAA,GAAA,EAACQ,EAAAA,aAAa,CAAA,CACZ,MAAM,oBACN,MAAO,EAAG,6BAA8B,EAAO,0BAA0B,EACzE,UAAU,6BACV,KAAK,SACL,IAAK,EACL,IAAK,GACL,SAAU,EAAY,GAAG,CAAC,8BAC1B7E,aAAc,EAAG,8BACjB,YAAY,0GACZ,OAAQ,IAEV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,aAAa,CAAA,CACZ,MAAM,kBACN,MAAO6D,EAAG,2BAA4B,EAAO,wBAAwB,EACrE,UAAU,2BACV,KAAK,SACL,IAAK,EACL,IAAK,GACL,SAAU,EAAY,GAAG,CAAC,4BAC1B,aAAc,EAAG,4BACjB,YAAY,gJACZ,OAAQ,IAEV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,aAAa,CAAA,CACZ,MAAM,mBACN,MAAO,EAAG,6BAA8B,EAAO,0BAA0B,EACzE,UAAU,6BACV,KAAK,SACL,IAAK,EACLc,IAAK,IACL,SAAU,EAAY,GAAG,CAAC,8BAC1B,aAAc,EAAG,8BACjB,YAAY,yNACZ,OAAQ,IAEV,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8CAAqC,0CAGlD,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,4FA7JC,CA8Jb,AA9Jc,+JAA+J,CAAC,QAkKnL,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAA,GAED,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,aAAa,CAAA,CACZ,MAAM,gBACN,UAAU,4CAEV,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8CAAqChH,oOAMlD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,aAAa,CAAA,CACZ,MAAM,eACN,MAAO,EAAG,0BAA2B,EAAO,uBAAuB,EACnE,UAAU,0BACV,KAAK,SACL,SAAU,EAAY,GAAG,CAAC,2BAC1B,aAAc,EAAG,2BACjB,YAAY,8PACZ,OAAQ,IAEV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,aAAa,CAAA,CACZ,MAAM,cACN,MAAO,EAAG,yBAA0B,EAAO,sBAAsB,EACjE,UAAU,yBACV,KAAK,SACL,SAAU,EAAY,GAAG,CAAC,0BAC1B,aAAc0H,EAAG,0BACjB,YAAY,mJACZ,OAAQ,IAEV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,aAAa,CAAA,CACZ,MAAM,oBACN,MAAO,EAAG,kBAAmB,EAAO,eAAe,EACnD,UAAU,kBACV,SAAU,EAAY,GAAG,CAAC,mBAC1BlH,aAAc,EAAG,mBACjB,YAAY,qOACZ,OAAQ,IAEV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,aAAa,CAAA,CACZ,MAAM,kBACN,MAAO0H,EAAG,gBAAiB,EAAO,aAAa,EAC/C,UAAU,gBACV,SAAU,EAAY,GAAG,CAAC,iBAC1B,aAAc,EAAG,iBACjB,YAAY,uHACZ,OAAQ,IAEV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,aAAa,CAAA,CACZ,MAAM,iBACN,MAAO,EAAG,uBAAwB,EAAO,oBAAoB,EAC7D,UAAU,uBACV,KAAK,SACL,OAAOhI,MACP,SAAU,EAAY,GAAG,CAAC,wBAC1B,aAAc,EAAG,wBACjB,YAAY,uLACZ,OAAQ,IAEV,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wDAA8C,+CACd,IAC7C,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CACC,KAAK,yBACL,UAAU,2EACX,4DAEG,OAGN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,oBAAoB,CAAA,CACnB,OAAQ,EACR,MAAO,EAAG,kBAAmB,EAAO,eAAe0I,EACnD,aAAc,EAAG,mBACjB,SAAU,EAAY,GAAG,CAAC,mBAC1B,OAAQ,SAKlB"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../packages/dashboard/src/app/settings/schedule/page.tsx","../../../../../../packages/dashboard/src/components/settings/time-range-ring.tsx","../../../../../../packages/dashboard/src/components/settings/delegated-sync-section.tsx","../../../../../../packages/dashboard/src/lib/hooks/use-delegated-sync.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useConfig, useConfigDefaults } from \"@/lib/hooks/use-config\";\nimport { useHealth } from \"@/lib/hooks/use-health\";\nimport { useDirtyFields } from \"@/lib/hooks/use-dirty-fields\";\nimport {\n ConfigSection,\n EditableBooleanField,\n EditableField,\n} from \"@/components/settings/editors\";\nimport { PrimaryPlatformField } from \"@/components/settings/composite-fields\";\nimport {\n TimeRangeRing,\n type TimeRangeRingValues,\n} from \"@/components/settings/time-range-ring\";\nimport { DelegatedSyncSection } from \"@/components/settings/delegated-sync-section\";\n\nconst RUN_NOW_EXAMPLE = `curl -X POST http://localhost:8321/api/agent/run-now -H \"Authorization: Bearer <daemon-api-token>\" -H \"Content-Type: application/json\" -d '{\"reason\":\"manual\"}'`;\n\nexport default function ScheduleSettingsPage() {\n const { data: config } = useConfig();\n const { df } = useConfigDefaults();\n const { data: health } = useHealth();\n const { deferSaveFor, dv, dirtyFields, setDirty } = useDirtyFields();\n\n // Calls setDirty with toggle-back detection — equivalent to deferSaveFor(config),\n // but placed before the early return to satisfy React hooks ordering rules.\n const handleRingChange = useCallback(\n (next: TimeRangeRingValues) => {\n if (!config) return;\n setDirty(\"quietHoursStart\", next.quietHoursStart, config.quietHoursStart);\n setDirty(\"quietHoursEnd\", next.quietHoursEnd, config.quietHoursEnd);\n setDirty(\"hourlyCheckActiveStartHour\", next.activeStartHour, config.hourlyCheckActiveStartHour);\n setDirty(\"hourlyCheckActiveEndHour\", next.activeEndHour, config.hourlyCheckActiveEndHour);\n },\n [config, setDirty],\n );\n\n if (!config) {\n return <div className=\"text-muted-foreground\">Loading...</div>;\n }\n\n const deferSave = deferSaveFor(config);\n\n // Gather ring values from dirty or server state\n const ringValues: TimeRangeRingValues = {\n quietHoursStart: dv(\"quietHoursStart\", config.quietHoursStart),\n quietHoursEnd: dv(\"quietHoursEnd\", config.quietHoursEnd),\n activeStartHour: dv(\"hourlyCheckActiveStartHour\", config.hourlyCheckActiveStartHour),\n activeEndHour: dv(\"hourlyCheckActiveEndHour\", config.hourlyCheckActiveEndHour),\n dayBoundaryHour: dv(\"dayBoundaryHour\", config.dayBoundaryHour),\n };\n\n return (\n <>\n <div>\n <h1 className=\"text-2xl font-semibold text-foreground\">\n Schedule & Notifications\n </h1>\n <p className=\"mt-1 max-w-3xl text-sm text-muted-foreground\">\n When the agent runs in the background and how often it can interrupt you.\n All times are interpreted in the configured timezone.\n </p>\n </div>\n\n {/* Visual time-axis overview */}\n <ConfigSection\n title=\"Time axis\"\n helpDocId=\"concepts/agent-day\"\n >\n <p className=\"pb-2 text-xs text-muted-foreground\">\n Drag the handles to adjust quiet hours (red) and the hourly-check active\n window (green). The dashed blue line marks the day boundary. Changes are\n staged — save with the bar below.\n </p>\n <TimeRangeRing values={ringValues} onChange={handleRingChange} />\n </ConfigSection>\n\n <ConfigSection title=\"Day shape\" helpDocId=\"concepts/agent-day\">\n <EditableField\n label=\"Timezone\"\n value={dv(\"timezone\", config.timezone)}\n configKey=\"timezone\"\n modified={dirtyFields.has(\"timezone\")}\n defaultValue={df(\"timezone\")}\n description=\"IANA timezone name (e.g. America/New_York, America/Los_Angeles). All schedules, quiet hours, and daily boundaries are interpreted in this zone.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Day Boundary Hour\"\n value={dv(\"dayBoundaryHour\", config.dayBoundaryHour)}\n configKey=\"dayBoundaryHour\"\n type=\"number\"\n min={0}\n max={9}\n modified={dirtyFields.has(\"dayBoundaryHour\")}\n defaultValue={df(\"dayBoundaryHour\")}\n description=\"Hour (0–9, local time) at which a new agent day begins. At this hour the previous today.md is archived, a new one is generated, and daily retention and summary routines run. Pick a time you're reliably asleep — 04:00 is the default.\"\n onSave={deferSave}\n />\n </ConfigSection>\n\n <ConfigSection\n title=\"Hourly Check\"\n helpDocId=\"features/routines/hourly-check\"\n >\n <p className=\"pb-2 text-xs text-muted-foreground\">\n The hourly check is the agent’s passive review loop. At each interval\n it queries pending observations (file edits, calendar updates, git commits,\n Notion changes), folds anything actionable into your context files (\n <code>today.md</code>, <code>roadmap.md</code>, project notes), and stays\n silent otherwise. Most runs produce no output — that is by design.\n </p>\n <EditableBooleanField\n label=\"Hourly Check Enabled\"\n value={dv(\"hourlyCheckEnabled\", config.hourlyCheckEnabled)}\n configKey=\"hourlyCheckEnabled\"\n modified={dirtyFields.has(\"hourlyCheckEnabled\")}\n defaultValue={df(\"hourlyCheckEnabled\")}\n description=\"Master switch for the polling routine. When off, the agent only runs on direct messages, schedule.approaching events, and explicitly scheduled tasks.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Check Interval\"\n value={dv(\"hourlyCheckIntervalMinutes\", config.hourlyCheckIntervalMinutes)}\n configKey=\"hourlyCheckIntervalMinutes\"\n type=\"number\"\n suffix=\"min\"\n min={1}\n max={1440}\n modified={dirtyFields.has(\"hourlyCheckIntervalMinutes\")}\n defaultValue={df(\"hourlyCheckIntervalMinutes\")}\n description=\"How often the check runs during the active window. Any positive integer in minutes (1–1440, i.e. up to 24 hours). Despite the “hourly” name, you can dial this lower for higher-frequency checks or higher to cut quota burn. The cadence is anchored to the active-window start, so the first fire of each agent-day lands at the start of the window.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Active Start Hour\"\n value={dv(\"hourlyCheckActiveStartHour\", config.hourlyCheckActiveStartHour)}\n configKey=\"hourlyCheckActiveStartHour\"\n type=\"number\"\n min={0}\n max={23}\n modified={dirtyFields.has(\"hourlyCheckActiveStartHour\")}\n defaultValue={df(\"hourlyCheckActiveStartHour\")}\n description=\"Hour (0–23, local time) when the hourly check window opens. Runs before this hour are skipped entirely.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Active End Hour\"\n value={dv(\"hourlyCheckActiveEndHour\", config.hourlyCheckActiveEndHour)}\n configKey=\"hourlyCheckActiveEndHour\"\n type=\"number\"\n min={1}\n max={24}\n modified={dirtyFields.has(\"hourlyCheckActiveEndHour\")}\n defaultValue={df(\"hourlyCheckActiveEndHour\")}\n description=\"Hour (1–24, local time) when the window closes. Exclusive — e.g. set 24 to run through 23:59. Prevents the check from firing while you sleep.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Min Observations\"\n value={dv(\"hourlyCheckMinObservations\", config.hourlyCheckMinObservations)}\n configKey=\"hourlyCheckMinObservations\"\n type=\"number\"\n min={0}\n max={1000}\n modified={dirtyFields.has(\"hourlyCheckMinObservations\")}\n defaultValue={df(\"hourlyCheckMinObservations\")}\n description=\"Minimum number of pending user-actor observations required for the check to actually launch an agent run. If fewer are queued, the tick is skipped with no cost. Set higher (e.g. 3–5) if you see too many no-op runs.\"\n onSave={deferSave}\n />\n <p className=\"pt-2 text-xs text-muted-foreground\">\n Trigger one immediately from the CLI:\n </p>\n <pre className=\"overflow-x-auto rounded bg-muted p-2 font-mono text-[11px] text-muted-foreground\">\n {RUN_NOW_EXAMPLE}\n </pre>\n </ConfigSection>\n\n <DelegatedSyncSection />\n\n <ConfigSection\n title=\"Notifications\"\n helpDocId=\"features/operations/quiet-hours\"\n >\n <p className=\"pb-2 text-xs text-muted-foreground\">\n Rate limits, quiet hours, and delivery destinations for outbound\n notifications the agent sends to you. “Notification” = a\n proactive message (reminder, alert, summary) — it does not include replies\n to messages you initiated.\n </p>\n <EditableField\n label=\"Max Per Hour\"\n value={dv(\"maxNotificationsPerHour\", config.maxNotificationsPerHour)}\n configKey=\"maxNotificationsPerHour\"\n type=\"number\"\n modified={dirtyFields.has(\"maxNotificationsPerHour\")}\n defaultValue={df(\"maxNotificationsPerHour\")}\n description=\"Hard cap on outbound notifications in any rolling 60-minute window. Notifications above the cap are suppressed (not delivered, but still logged to Activity → Notifications so you can see what was dropped). Protects you from runaway notification loops.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Max Per Day\"\n value={dv(\"maxNotificationsPerDay\", config.maxNotificationsPerDay)}\n configKey=\"maxNotificationsPerDay\"\n type=\"number\"\n modified={dirtyFields.has(\"maxNotificationsPerDay\")}\n defaultValue={df(\"maxNotificationsPerDay\")}\n description=\"Hard cap per calendar day (resets at the Day Boundary Hour). A safety net on top of the per-hour cap. Suppressed notifications are still logged.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Quiet Hours Start\"\n value={dv(\"quietHoursStart\", config.quietHoursStart)}\n configKey=\"quietHoursStart\"\n modified={dirtyFields.has(\"quietHoursStart\")}\n defaultValue={df(\"quietHoursStart\")}\n description=\"24-hour time (HH:MM, e.g. 22:00) when quiet hours begin in the configured timezone. During quiet hours, regular notifications are held back. Safety-category notifications (deadline, error, security, critical) still go through.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Quiet Hours End\"\n value={dv(\"quietHoursEnd\", config.quietHoursEnd)}\n configKey=\"quietHoursEnd\"\n modified={dirtyFields.has(\"quietHoursEnd\")}\n defaultValue={df(\"quietHoursEnd\")}\n description=\"24-hour time (HH:MM, e.g. 08:00) when quiet hours end. If end is earlier than start, the window wraps over midnight.\"\n onSave={deferSave}\n />\n <EditableField\n label=\"Batch Interval\"\n value={dv(\"batchIntervalMinutes\", config.batchIntervalMinutes)}\n configKey=\"batchIntervalMinutes\"\n type=\"number\"\n suffix=\"min\"\n modified={dirtyFields.has(\"batchIntervalMinutes\")}\n defaultValue={df(\"batchIntervalMinutes\")}\n description=\"Minimum minutes between notification deliveries from the same routine. Multiple notifications queued within this window are combined into a single message so you don’t get spammed.\"\n onSave={deferSave}\n />\n <div className=\"py-2 border-b text-sm text-muted-foreground\">\n Default reminder destinations are managed in{\" \"}\n <a\n href=\"/connections/messaging\"\n className=\"text-foreground underline underline-offset-2 hover:no-underline\"\n >\n Connections → Messaging → Default Reminder Destinations\n </a>\n .\n </div>\n <PrimaryPlatformField\n health={health}\n value={dv(\"primaryPlatform\", config.primaryPlatform)}\n defaultValue={df(\"primaryPlatform\")}\n modified={dirtyFields.has(\"primaryPlatform\")}\n onSave={deferSave}\n />\n </ConfigSection>\n </>\n );\n}\n","\"use client\";\n\nimport { useRef, useState } from \"react\";\n\n// ── Geometry helpers ──\n\nconst CX = 120;\nconst CY = 120;\nconst SIZE = 240;\n\n/** Convert an hour (0–24, fractional) to an angle in radians (0:00 = top, CW). */\nexport function hourToAngle(hour: number): number {\n return ((hour % 24) / 24) * Math.PI * 2 - Math.PI / 2;\n}\n\n/** Convert a radians angle back to an hour (0–24). */\nexport function angleToHour(angle: number): number {\n let h = ((angle + Math.PI / 2) / (Math.PI * 2)) * 24;\n if (h < 0) h += 24;\n return h % 24;\n}\n\n/** Point on the circle at the given angle and radius. */\nfunction polarPoint(angle: number, r: number): { x: number; y: number } {\n return { x: CX + r * Math.cos(angle), y: CY + r * Math.sin(angle) };\n}\n\n/** SVG arc path from startAngle to endAngle at radius r (always clockwise). */\nexport function arcPath(startAngle: number, endAngle: number, r: number): string {\n let sweep = endAngle - startAngle;\n if (sweep <= 0) sweep += Math.PI * 2;\n if (sweep > Math.PI * 2 - 0.001) sweep = Math.PI * 2 - 0.001;\n const largeArc = sweep > Math.PI ? 1 : 0;\n const s = polarPoint(startAngle, r);\n const e = polarPoint(startAngle + sweep, r);\n return `M ${s.x} ${s.y} A ${r} ${r} 0 ${largeArc} 1 ${e.x} ${e.y}`;\n}\n\n// ── Parse/format helpers ──\n\n/** Parse \"HH:MM\" → fractional hours (e.g. \"23:30\" → 23.5). */\nexport function parseHHMM(s: string): number {\n const [h, m] = s.split(\":\").map(Number);\n return (h ?? 0) + (m ?? 0) / 60;\n}\n\n/** Format fractional hours → \"HH:MM\". */\nexport function formatHHMM(h: number): string {\n const hh = Math.floor(((h % 24) + 24) % 24);\n const mm = Math.round((h - Math.floor(h)) * 60) % 60;\n return `${String(hh).padStart(2, \"0\")}:${String(mm).padStart(2, \"0\")}`;\n}\n\n/** Snap fractional hours to the nearest 15 minutes. */\nexport function snap15(h: number): number {\n return Math.round(h * 4) / 4;\n}\n\n/** Snap fractional hours to the nearest whole hour. */\nexport function snapHour(h: number): number {\n return Math.round(h) % 24;\n}\n\n// ── Types ──\n\nexport interface TimeRangeRingValues {\n quietHoursStart: string; // \"HH:MM\"\n quietHoursEnd: string; // \"HH:MM\"\n activeStartHour: number; // 0–23\n activeEndHour: number; // 1–24\n dayBoundaryHour: number; // 0–9\n}\n\ntype DragTarget =\n | \"quietStart\"\n | \"quietEnd\"\n | \"activeStart\"\n | \"activeEnd\"\n | null;\n\n// ── Theme-aware colors (CSS variables) ──\n\nconst COLOR_QUIET = \"var(--color-destructive)\";\nconst COLOR_ACTIVE = \"var(--color-success)\";\nconst COLOR_DAY_BOUNDARY = \"var(--color-primary)\";\n\n// ── Component ──\n\nexport function TimeRangeRing({\n values,\n onChange,\n}: {\n values: TimeRangeRingValues;\n onChange: (next: TimeRangeRingValues) => void;\n}) {\n const svgRef = useRef<SVGSVGElement>(null);\n const [dragging, setDragging] = useState<DragTarget>(null);\n const [hovered, setHovered] = useState<DragTarget>(null);\n\n const quietStartH = parseHHMM(values.quietHoursStart);\n const quietEndH = parseHHMM(values.quietHoursEnd);\n const activeStartH = values.activeStartHour;\n const activeEndH = values.activeEndHour % 24;\n\n const quietStartA = hourToAngle(quietStartH);\n const quietEndA = hourToAngle(quietEndH);\n const activeStartA = hourToAngle(activeStartH);\n const activeEndA = hourToAngle(activeEndH);\n const dayBoundaryA = hourToAngle(values.dayBoundaryHour);\n\n const QUIET_R = 90;\n const ACTIVE_R = 75;\n\n // Pointer event helpers — work with both mouse and touch.\n const getHourFromPointer = (e: React.PointerEvent | PointerEvent) => {\n const svg = svgRef.current;\n if (!svg) return 0;\n const rect = svg.getBoundingClientRect();\n const scaleX = SIZE / rect.width;\n const scaleY = SIZE / rect.height;\n const x = (e.clientX - rect.left) * scaleX - CX;\n const y = (e.clientY - rect.top) * scaleY - CY;\n return angleToHour(Math.atan2(y, x));\n };\n\n const handlePointerDown = (target: DragTarget) => (e: React.PointerEvent) => {\n e.preventDefault();\n (e.target as Element).setPointerCapture(e.pointerId);\n setDragging(target);\n };\n\n const handlePointerMove = (e: React.PointerEvent) => {\n if (!dragging) return;\n const hour = getHourFromPointer(e);\n const next = { ...values };\n switch (dragging) {\n case \"quietStart\":\n next.quietHoursStart = formatHHMM(snap15(hour));\n break;\n case \"quietEnd\":\n next.quietHoursEnd = formatHHMM(snap15(hour));\n break;\n case \"activeStart\":\n next.activeStartHour = snapHour(hour);\n break;\n case \"activeEnd\": {\n const snapped = snapHour(hour);\n next.activeEndHour = snapped === 0 ? 24 : snapped;\n break;\n }\n }\n onChange(next);\n };\n\n const handlePointerUp = () => {\n setDragging(null);\n };\n\n const hourLabels = [0, 3, 6, 9, 12, 15, 18, 21];\n\n return (\n <div className=\"flex items-center justify-center\">\n <svg\n ref={svgRef}\n viewBox={`0 0 ${SIZE} ${SIZE}`}\n className=\"w-full max-w-[280px] select-none touch-none\"\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerLeave={handlePointerUp}\n >\n {/* Background circle */}\n <circle\n cx={CX}\n cy={CY}\n r={100}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1}\n className=\"text-border\"\n />\n\n {/* Hour tick marks */}\n {Array.from({ length: 24 }, (_, i) => {\n const a = hourToAngle(i);\n const isMajor = i % 3 === 0;\n const inner = polarPoint(a, isMajor ? 95 : 97);\n const outer = polarPoint(a, 100);\n return (\n <line\n key={i}\n x1={inner.x}\n y1={inner.y}\n x2={outer.x}\n y2={outer.y}\n stroke=\"currentColor\"\n strokeWidth={isMajor ? 1.5 : 0.5}\n className=\"text-muted-foreground\"\n />\n );\n })}\n\n {/* Hour labels */}\n {hourLabels.map((h) => {\n const a = hourToAngle(h);\n const p = polarPoint(a, 108);\n return (\n <text\n key={h}\n x={p.x}\n y={p.y}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n className=\"fill-muted-foreground text-[9px]\"\n >\n {h}\n </text>\n );\n })}\n\n {/* Quiet hours arc (destructive/red) */}\n <path\n d={arcPath(quietStartA, quietEndA, QUIET_R)}\n fill=\"none\"\n stroke={COLOR_QUIET}\n strokeWidth={8}\n strokeLinecap=\"round\"\n opacity={0.6}\n />\n\n {/* Active hours arc (success/green) */}\n <path\n d={arcPath(activeStartA, activeEndA, ACTIVE_R)}\n fill=\"none\"\n stroke={COLOR_ACTIVE}\n strokeWidth={8}\n strokeLinecap=\"round\"\n opacity={0.6}\n />\n\n {/* Day boundary marker (primary/blue dashed line) */}\n {(() => {\n const inner = polarPoint(dayBoundaryA, 60);\n const outer = polarPoint(dayBoundaryA, 100);\n return (\n <line\n x1={inner.x}\n y1={inner.y}\n x2={outer.x}\n y2={outer.y}\n stroke={COLOR_DAY_BOUNDARY}\n strokeWidth={2}\n strokeDasharray=\"4 2\"\n />\n );\n })()}\n\n {/* Day boundary label */}\n {(() => {\n const p = polarPoint(dayBoundaryA, 53);\n return (\n <text\n x={p.x}\n y={p.y}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n className=\"fill-primary text-[8px] font-medium\"\n >\n day\n </text>\n );\n })()}\n\n {/* Drag handles — render active/dragging handle last for z-order */}\n {renderHandles({\n dragging,\n hovered,\n setDragging,\n setHovered,\n handlePointerDown,\n quietStartA,\n quietEndA,\n activeStartA,\n activeEndA,\n QUIET_R,\n ACTIVE_R,\n values,\n })}\n\n {/* Center legend */}\n <text\n x={CX}\n y={CX - 8}\n textAnchor=\"middle\"\n className=\"fill-muted-foreground text-[8px]\"\n >\n <tspan style={{ fill: COLOR_QUIET }}>●</tspan> quiet hours\n </text>\n <text\n x={CX}\n y={CX + 4}\n textAnchor=\"middle\"\n className=\"fill-muted-foreground text-[8px]\"\n >\n <tspan style={{ fill: COLOR_ACTIVE }}>●</tspan> active window\n </text>\n <text\n x={CX}\n y={CX + 16}\n textAnchor=\"middle\"\n className=\"fill-muted-foreground text-[8px]\"\n >\n <tspan style={{ fill: COLOR_DAY_BOUNDARY }}>---</tspan> day boundary\n </text>\n </svg>\n </div>\n );\n}\n\n/**\n * Renders all 4 drag handles, with the currently active (dragging or hovered)\n * handle rendered last so it appears on top in SVG z-order.\n */\nfunction renderHandles({\n dragging,\n hovered,\n setHovered,\n handlePointerDown,\n quietStartA,\n quietEndA,\n activeStartA,\n activeEndA,\n QUIET_R,\n ACTIVE_R,\n values,\n}: {\n dragging: DragTarget;\n hovered: DragTarget;\n setDragging: (t: DragTarget) => void;\n setHovered: (t: DragTarget) => void;\n handlePointerDown: (target: DragTarget) => (e: React.PointerEvent) => void;\n quietStartA: number;\n quietEndA: number;\n activeStartA: number;\n activeEndA: number;\n QUIET_R: number;\n ACTIVE_R: number;\n values: TimeRangeRingValues;\n}) {\n const activeTarget = dragging ?? hovered;\n const handles: { target: DragTarget; angle: number; r: number; color: string; label: string }[] = [\n { target: \"quietStart\", angle: quietStartA, r: QUIET_R, color: COLOR_QUIET, label: values.quietHoursStart },\n { target: \"quietEnd\", angle: quietEndA, r: QUIET_R, color: COLOR_QUIET, label: values.quietHoursEnd },\n { target: \"activeStart\", angle: activeStartA, r: ACTIVE_R, color: COLOR_ACTIVE, label: `${values.activeStartHour}:00` },\n { target: \"activeEnd\", angle: activeEndA, r: ACTIVE_R, color: COLOR_ACTIVE, label: `${values.activeEndHour}:00` },\n ];\n\n // Sort so the active handle renders last (on top in SVG).\n const sorted = handles.sort((a, b) => {\n const aActive = a.target === activeTarget ? 1 : 0;\n const bActive = b.target === activeTarget ? 1 : 0;\n return aActive - bActive;\n });\n\n return (\n <>\n {sorted.map((h) => (\n <Handle\n key={h.target}\n angle={h.angle}\n r={h.r}\n color={h.color}\n label={h.label}\n active={h.target === activeTarget}\n onPointerDown={handlePointerDown(h.target)}\n onPointerEnter={() => setHovered(h.target)}\n onPointerLeave={() => setHovered(null)}\n />\n ))}\n </>\n );\n}\n\n/** Clamp label position within the viewBox so text isn't clipped. */\nfunction clampLabelPos(x: number, y: number): { lx: number; ly: number } {\n const PAD = 12;\n return {\n lx: Math.max(PAD, Math.min(SIZE - PAD, x)),\n ly: Math.max(PAD, Math.min(SIZE - PAD, y - 12)),\n };\n}\n\nfunction Handle({\n angle,\n r,\n color,\n label,\n active,\n onPointerDown,\n onPointerEnter,\n onPointerLeave,\n}: {\n angle: number;\n r: number;\n color: string;\n label: string;\n active: boolean;\n onPointerDown: (e: React.PointerEvent) => void;\n onPointerEnter: () => void;\n onPointerLeave: () => void;\n}) {\n const p = polarPoint(angle, r);\n const handleR = active ? 7 : 5;\n const { lx, ly } = clampLabelPos(p.x, p.y);\n return (\n <g\n onPointerDown={onPointerDown}\n onPointerEnter={onPointerEnter}\n onPointerLeave={onPointerLeave}\n className=\"cursor-grab active:cursor-grabbing\"\n >\n {/* Invisible larger hit area */}\n <circle cx={p.x} cy={p.y} r={12} fill=\"transparent\" />\n {/* Visible handle */}\n <circle\n cx={p.x}\n cy={p.y}\n r={handleR}\n fill={color}\n stroke=\"var(--color-background)\"\n strokeWidth={2}\n />\n {/* Label (only on hover / drag) */}\n {active && (\n <text\n x={lx}\n y={ly}\n textAnchor=\"middle\"\n className=\"fill-foreground text-[9px] font-medium pointer-events-none\"\n >\n {label}\n </text>\n )}\n </g>\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { Loader2, Play, RotateCcw } from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Card, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n useDelegatedSync,\n usePatchDelegatedSyncCadence,\n usePatchDelegatedSyncActiveHours,\n useRunDelegatedSyncCadence,\n} from \"@/lib/hooks/use-delegated-sync\";\nimport type { DelegatedSyncCadenceRow } from \"@/lib/api-types\";\n\n/**\n * Delegated-sync settings section\n * (docs/design/appendices/delegated-sync-opt-in.md).\n *\n * Lives on /settings/schedule between the Hourly Check and Notifications\n * cards. Renders only when the worker reports at least one delegated\n * integration; otherwise it returns null so the page doesn't show an\n * empty stub.\n *\n * UX:\n * - Each cadence row has its own enable toggle + interval editor + Run\n * Now button. Toggling persists immediately; the interval persists on\n * blur / Enter so a user typing intermediate digits doesn't fire 3 PATCHes.\n * - The active-hours subsection appears only when at least one cadence is\n * enabled (matches Q2 / \"pause all cadences at once\"). It mirrors the Hourly Check\n * fields' look but writes to /api/delegated-sync/active-hours rather\n * than the runtime-settings PATCH path.\n */\nexport function DelegatedSyncSection() {\n const { data, isLoading } = useDelegatedSync();\n\n if (isLoading || !data) return null;\n\n const cadenceRows = Object.entries(data.cadences).map(([id, row]) => ({\n id,\n ...row,\n }));\n\n // The route always returns the four production cadences in the catalog,\n // even when no integration is delegated — that's how the dashboard\n // discovers them. To decide whether to render this section we lean on\n // `workerRunning`: the worker is only registered when at least one\n // integration is in delegated mode.\n if (!data.workerRunning && cadenceRows.length === 0) return null;\n if (!data.workerRunning) {\n // Worker absent — render a hint instead of the cadence list, so the\n // user understands why toggles wouldn't have effect right now.\n // Native mode does not run the cadence worker; its observations\n // come from the in-turn routine.fetch_window pre-pass instead.\n return (\n <Card>\n <CardHeader>\n <CardTitle>Background Sync</CardTitle>\n </CardHeader>\n <div className=\"p-4 text-sm text-muted-foreground\">\n No integrations are in delegated mode, so background cadences\n are inactive. Move an integration (Calendar / Gmail / Notion)\n to delegated mode in <code>/connections</code> to enable\n opt-in cadences here. Native-mode integrations fetch their\n observations directly during the hourly check turn and do not\n use this worker.\n </div>\n </Card>\n );\n }\n\n const anyEnabled = cadenceRows.some((row) => row.enabled);\n\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <span>Background Sync</span>\n {data.withinActiveHours ? (\n <Badge variant=\"green\">active</Badge>\n ) : (\n <Badge variant=\"gray\">outside active hours</Badge>\n )}\n </CardTitle>\n </CardHeader>\n <div className=\"space-y-1 p-4 pt-0\">\n <p className=\"pb-2 text-xs text-muted-foreground\">\n Background cadences poll Calendar / Gmail / Notion through the\n backend's MCP subprocess so the hourly check sees fresh\n observations. Each row uses either the delegated backend (when\n the integration is in delegated mode) or the main backend (when\n native). Every poll spends tokens — by default they are off.\n Enable just the cadences you want, and they will respect the\n shared active-hours window below.\n </p>\n <div className=\"space-y-2\">\n {cadenceRows.map((row) => (\n <CadenceRow key={row.id} row={row} />\n ))}\n </div>\n {anyEnabled && (\n <ActiveHoursEditor\n startHour={data.activeHours.startHour}\n endHour={data.activeHours.endHour}\n />\n )}\n </div>\n </Card>\n );\n}\n\nfunction CadenceRow({ row }: { row: DelegatedSyncCadenceRow & { id: string } }) {\n const patch = usePatchDelegatedSyncCadence();\n const run = useRunDelegatedSyncCadence();\n\n const [draftMinutes, setDraftMinutes] = useState<string>(\n String(Math.round(row.intervalSeconds / 60)),\n );\n const [intervalError, setIntervalError] = useState<string | null>(null);\n const [runError, setRunError] = useState<string | null>(null);\n\n // Sync draft when the underlying intervalSeconds changes (e.g. another\n // tab edited it). Don't blow away in-progress edits — only re-sync when\n // the local draft matches the previously-persisted value.\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setDraftMinutes(String(Math.round(row.intervalSeconds / 60)));\n }, [row.intervalSeconds]);\n\n const minMinutes = Math.ceil(row.softFloorSeconds / 60);\n const maxMinutes = 24 * 60;\n const defaultMinutes = Math.round(row.defaultIntervalSeconds / 60);\n\n const handleToggle = () => {\n patch.mutate({ cadenceId: row.id, body: { enabled: !row.enabled } });\n };\n\n const commitInterval = () => {\n setIntervalError(null);\n const parsed = Number(draftMinutes);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n setIntervalError(\"Whole positive number required\");\n return;\n }\n if (parsed < minMinutes) {\n setIntervalError(`Minimum ${minMinutes} min`);\n return;\n }\n if (parsed > maxMinutes) {\n setIntervalError(`Maximum ${maxMinutes} min (24 h)`);\n return;\n }\n if (parsed * 60 === row.intervalSeconds) return;\n patch.mutate(\n {\n cadenceId: row.id,\n body: { intervalSeconds: parsed * 60 },\n },\n {\n onError: (err) => setIntervalError(err.message),\n },\n );\n };\n\n const handleResetInterval = () => {\n setDraftMinutes(String(defaultMinutes));\n patch.mutate({\n cadenceId: row.id,\n body: { intervalSeconds: defaultMinutes * 60 },\n });\n };\n\n const handleRunNow = async () => {\n setRunError(null);\n try {\n await run.mutateAsync({ cadenceId: row.id });\n } catch (err) {\n setRunError(err instanceof Error ? err.message : \"Run Now failed\");\n }\n };\n\n const isPatching = patch.isPending;\n const isRunning = run.isPending;\n const isDefaultInterval = row.intervalSeconds === row.defaultIntervalSeconds;\n // Native rows surface on the catalog for visibility but the worker\n // does not invoke for them — toggling enabled / changing interval /\n // Run Now would all be inert. Render a passive footer instead so the\n // operator isn't tricked into setting values that have no effect.\n const isNative = row.mode === \"native\";\n\n return (\n <div className=\"rounded border border-border/50 p-3\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"text-sm font-medium text-foreground\">\n {row.displayName}\n </p>\n {row.mode === \"native\" && (\n <Badge variant=\"green\">native</Badge>\n )}\n {row.mode === \"delegated\" && (\n <Badge variant=\"blue\">\n delegated{row.backend ? ` · ${row.backend}` : \"\"}\n </Badge>\n )}\n {!isNative && row.circuitState === \"tripped\" && (\n <Badge variant=\"red\">circuit tripped</Badge>\n )}\n {!isNative && row.failureCount > 0 && row.circuitState === \"ok\" && (\n <Badge variant=\"amber\">\n {row.failureCount} recent failure{row.failureCount === 1 ? \"\" : \"s\"}\n </Badge>\n )}\n </div>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {row.description}\n </p>\n {!isNative && <CadenceStatusFooter row={row} />}\n </div>\n {!isNative && (\n <div className=\"flex shrink-0 items-center gap-2\">\n <Button\n variant={row.enabled ? \"default\" : \"outline\"}\n size=\"sm\"\n onClick={handleToggle}\n disabled={isPatching}\n >\n {isPatching ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : row.enabled ? (\n \"Enabled\"\n ) : (\n \"Disabled\"\n )}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleRunNow}\n disabled={isRunning}\n title=\"Run this cadence once, regardless of schedule\"\n >\n {isRunning ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <Play className=\"h-3.5 w-3.5\" />\n )}\n <span className=\"ml-1\">Run now</span>\n </Button>\n </div>\n )}\n </div>\n {isNative ? (\n <p className=\"mt-2 text-xs text-muted-foreground\">\n Observations land via the in-turn fetch during the hourly\n check turn — no background cadence runs for this row.\n </p>\n ) : (\n <div className=\"mt-2 flex items-center gap-2 text-xs text-muted-foreground\">\n <label className=\"flex items-center gap-1\">\n <span>Interval:</span>\n <Input\n type=\"number\"\n min={minMinutes}\n max={maxMinutes}\n value={draftMinutes}\n onChange={(e) => setDraftMinutes(e.target.value)}\n onBlur={commitInterval}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n }\n }}\n className=\"h-7 w-20 px-2 text-xs\"\n />\n <span>min</span>\n </label>\n <span className=\"text-muted-foreground/70\">\n ({minMinutes}–{maxMinutes}; default {defaultMinutes})\n </span>\n {!isDefaultInterval && (\n <button\n type=\"button\"\n onClick={handleResetInterval}\n className=\"inline-flex items-center gap-0.5 text-[10px] text-muted-foreground hover:text-foreground\"\n >\n <RotateCcw className=\"h-2.5 w-2.5\" />\n reset\n </button>\n )}\n {intervalError && (\n <span className=\"text-destructive\">{intervalError}</span>\n )}\n </div>\n )}\n {runError && (\n <p className=\"mt-1 text-xs text-destructive\">Run Now: {runError}</p>\n )}\n </div>\n );\n}\n\nfunction CadenceStatusFooter({ row }: { row: DelegatedSyncCadenceRow }) {\n const lastRun = useMemo(() => formatRelative(row.lastSuccessAt), [row.lastSuccessAt]);\n const nextRun = useMemo(() => formatRelative(row.nextRunAt), [row.nextRunAt]);\n if (!row.lastAttemptAt && !row.nextRunAt) {\n return (\n <p className=\"mt-1 text-xs text-muted-foreground/70\">\n Has not run yet.\n </p>\n );\n }\n return (\n <p className=\"mt-1 text-xs text-muted-foreground/70\">\n {row.lastSuccessAt ? `Last success ${lastRun}.` : \"No successful run yet.\"}\n {row.enabled && row.nextRunAt && ` Next run ${nextRun}.`}\n {row.lastError && ` Last error: ${truncate(row.lastError, 80)}`}\n </p>\n );\n}\n\nfunction ActiveHoursEditor({\n startHour,\n endHour,\n}: {\n startHour: number;\n endHour: number;\n}) {\n const patch = usePatchDelegatedSyncActiveHours();\n const [start, setStart] = useState(String(startHour));\n const [end, setEnd] = useState(String(endHour));\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n setStart(String(startHour));\n }, [startHour]);\n useEffect(() => {\n setEnd(String(endHour));\n }, [endHour]);\n\n const commit = () => {\n setError(null);\n const s = Number(start);\n const e = Number(end);\n if (!Number.isInteger(s) || s < 0 || s > 23) {\n setError(\"Start must be an integer 0–23\");\n return;\n }\n if (!Number.isInteger(e) || e < 1 || e > 24) {\n setError(\"End must be an integer 1–24\");\n return;\n }\n if (s >= e) {\n setError(\"Start must be earlier than end\");\n return;\n }\n if (s === startHour && e === endHour) return;\n patch.mutate(\n { startHour: s, endHour: e },\n { onError: (err) => setError(err.message) },\n );\n };\n\n return (\n <div className=\"mt-3 rounded border border-border/50 bg-muted/30 p-3\">\n <p className=\"text-sm font-medium text-foreground\">Active hours</p>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n Shared by every enabled cadence. Outside this window, no cadence\n runs (Run Now still works). Interpreted in the configured timezone.\n End hour is exclusive — set 24 for "through 23:59".\n </p>\n <div className=\"mt-2 flex flex-wrap items-center gap-3 text-xs\">\n <label className=\"flex items-center gap-1\">\n <span>Start:</span>\n <Input\n type=\"number\"\n min={0}\n max={23}\n value={start}\n onChange={(e) => setStart(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n }\n }}\n className=\"h-7 w-16 px-2 text-xs\"\n />\n <span>:00</span>\n </label>\n <label className=\"flex items-center gap-1\">\n <span>End:</span>\n <Input\n type=\"number\"\n min={1}\n max={24}\n value={end}\n onChange={(e) => setEnd(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n }\n }}\n className=\"h-7 w-16 px-2 text-xs\"\n />\n <span>:00</span>\n </label>\n {patch.isPending && (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin text-muted-foreground\" />\n )}\n {error && <span className=\"text-destructive\">{error}</span>}\n </div>\n </div>\n );\n}\n\nfunction formatRelative(iso: string | null): string {\n if (!iso) return \"—\";\n const ms = Date.parse(iso);\n if (!Number.isFinite(ms)) return \"—\";\n const deltaSec = Math.round((ms - Date.now()) / 1000);\n if (deltaSec >= 0) return inFutureWords(deltaSec);\n return inPastWords(-deltaSec);\n}\n\nfunction inFutureWords(deltaSec: number): string {\n if (deltaSec < 60) return `in ${deltaSec}s`;\n if (deltaSec < 60 * 60) return `in ${Math.round(deltaSec / 60)}m`;\n if (deltaSec < 24 * 60 * 60) return `in ${Math.round(deltaSec / 3600)}h`;\n return `in ${Math.round(deltaSec / 86400)}d`;\n}\n\nfunction inPastWords(deltaSec: number): string {\n if (deltaSec < 60) return `${deltaSec}s ago`;\n if (deltaSec < 60 * 60) return `${Math.round(deltaSec / 60)}m ago`;\n if (deltaSec < 24 * 60 * 60) return `${Math.round(deltaSec / 3600)}h ago`;\n return `${Math.round(deltaSec / 86400)}d ago`;\n}\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text;\n return `${text.slice(0, max - 1)}…`;\n}\n","\"use client\";\n\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { api } from \"@/lib/api-client\";\nimport type {\n DelegatedSyncActiveHoursPatch,\n DelegatedSyncCadencePatch,\n DelegatedSyncStatusResponse,\n} from \"@/lib/api-types\";\n\n/**\n * Delegated-sync opt-in dashboard hooks\n * (docs/design/appendices/delegated-sync-opt-in.md).\n *\n * The status query is cheap (read-only worker snapshot) and the dashboard\n * surfaces lastRun / nextRun / circuit state which the user expects to\n * update without a manual refresh — so the staleTime is short and the\n * mutations all invalidate `[\"delegated-sync\"]` to keep the UI synced.\n */\n\nconst QUERY_KEY = [\"delegated-sync\"] as const;\n\nexport function useDelegatedSync() {\n return useQuery({\n queryKey: QUERY_KEY,\n queryFn: () => api.get<DelegatedSyncStatusResponse>(\"/delegated-sync\"),\n staleTime: 5_000,\n refetchInterval: 15_000,\n });\n}\n\nexport function usePatchDelegatedSyncCadence() {\n const qc = useQueryClient();\n return useMutation<\n DelegatedSyncStatusResponse,\n Error,\n { cadenceId: string; body: DelegatedSyncCadencePatch }\n >({\n mutationFn: ({ cadenceId, body }) =>\n api.patch<DelegatedSyncStatusResponse>(\n `/delegated-sync/cadences/${encodeURIComponent(cadenceId)}`,\n body,\n ),\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: QUERY_KEY });\n },\n });\n}\n\nexport function usePatchDelegatedSyncActiveHours() {\n const qc = useQueryClient();\n return useMutation<\n DelegatedSyncStatusResponse,\n Error,\n DelegatedSyncActiveHoursPatch\n >({\n mutationFn: (body) =>\n api.patch<DelegatedSyncStatusResponse>(\"/delegated-sync/active-hours\", body),\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: QUERY_KEY });\n },\n });\n}\n\nexport function useRunDelegatedSyncCadence() {\n const qc = useQueryClient();\n return useMutation<{ ok: true }, Error, { cadenceId: string }>({\n mutationFn: ({ cadenceId }) =>\n api.post<{ ok: true }>(\n `/delegated-sync/cadences/${encodeURIComponent(cadenceId)}/run`,\n {},\n ),\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: QUERY_KEY });\n },\n });\n}\n"],"names":["CX","CY","SIZE","hourToAngle","hour","Math","PI","angleToHour","angle","h","polarPoint","r","x","cos","y","sin","arcPath","startAngle","endAngle","sweep","largeArc","s","e","parseHHMM","m","split","map","Number","formatHHMM","hh","floor","mm","round","String","padStart","snap15","snapHour","COLOR_QUIET","COLOR_ACTIVE","COLOR_DAY_BOUNDARY","TimeRangeRing","values","onChange","svgRef","dragging","setDragging","hovered","setHovered","quietStartH","quietHoursStart","quietEndH","quietHoursEnd","activeStartH","activeStartHour","activeEndH","activeEndHour","quietStartA","quietEndA","activeStartA","activeEndA","dayBoundaryA","dayBoundaryHour","QUIET_R","ACTIVE_R","getHourFromPointer","svg","current","rect","getBoundingClientRect","scaleX","width","scaleY","height","clientX","left","clientY","top","atan2","handlePointerDown","target","preventDefault","setPointerCapture","pointerId","handlePointerMove","next","snapped","handlePointerUp","hourLabels","className","ref","viewBox","onPointerMove","onPointerUp","onPointerLeave","cx","cy","fill","stroke","strokeWidth","Array","from","length","_","i","a","isMajor","inner","outer","x1","y1","x2","y2","p","textAnchor","dominantBaseline","d","strokeLinecap","opacity","strokeDasharray","renderHandles","style","activeTarget","handles","color","label","sorted","sort","b","aActive","bActive","Handle","active","onPointerDown","onPointerEnter","clampLabelPos","PAD","lx","max","min","ly","handleR"],"mappings":"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"}
|
package/.next/server/chunks/ssr/packages_dashboard_src_app_settings_wiki_page_tsx_0..1tkb._.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports=[80970,a=>{"use strict";var b=a.i(39752),c=a.i(34542),d=a.i(62988),e=a.i(8753),f=a.i(62588),g=a.i(81130),h=a.i(32307),i=a.i(5423);let j=(0,i.default)("ArchiveRestore",[["rect",{width:"20",height:"5",x:"2",y:"3",rx:"1",key:"1wp1u1"}],["path",{d:"M4 8v11a2 2 0 0 0 2 2h2",key:"tvwodi"}],["path",{d:"M20 8v11a2 2 0 0 1-2 2h-2",key:"1gkqxj"}],["path",{d:"m9 15 3-3 3 3",key:"1pd0qc"}],["path",{d:"M12 12v9",key:"192myk"}]]);var k=a.i(45787),l=a.i(78019);let m=(0,i.default)("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]),n=(0,i.default)("Database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]);var o=a.i(11307),p=a.i(60133),q=a.i(92241),r=a.i(70297),s=a.i(95024),t=a.i(96336),u=a.i(59974),v=a.i(70054),w=a.i(74345),x=a.i(91534),y=a.i(29629);function z({value:a,onChange:d,onValidatedChange:e,defaultPath:g,disabled:h,id:i}){let j=a.trim(),k=(0,f.useQuery)({queryKey:["fs-probe",j],enabled:j.length>0,staleTime:3e4,retry:!1,queryFn:()=>u.api.get("/fs/probe",{params:{path:j}})}),l=(0,c.useMemo)(()=>{if(k.data)return k.data;if(k.error){let a="object"==typeof k.error.body&&null!==k.error.body?k.error.body:null;return{ok:!1,path:j,exists:!1,isDir:!1,writable:!1,collision:null,collisionMessage:null,hasObsidianStructure:!1,existingWiki:null,error:"string"==typeof a?.error?a.error:"request_failed",message:"string"==typeof a?.message?a.message:k.error.message}}return null},[k.data,k.error,j]),m=(0,c.useMemo)(()=>(function(a){if(!a)return{canConfirm:!1,lines:["Pick a directory to validate."],severity:null};if(!a.ok)return{canConfirm:!1,lines:[a.message??"Path is invalid."],severity:"error"};let b=[],c=null;if(a.collision){let d=function(a,b){if(null===a)return null;switch(a){case"primary_vault":return{severity:"error",text:"This path overlaps your primary memory vault. Pick a different directory."};case"external_obsidian":return{severity:"error",text:"This path overlaps your external Obsidian vault. Pick a different directory."};case"data_dir":return{severity:"error",text:"This path overlaps the daemon's data directory. Pick a different directory."};case"other_wiki":return{severity:"error",text:"Another wiki workspace already lives here. Pick a different directory."};case"system_path":return{severity:"error",text:"This path is under a system-managed location. Pick a directory inside your home folder."};case"not_writable":return{severity:"warning",text:"This directory is not writable from the daemon. Aitne will fall back to the Obsidian CLI when it is running."};default:return{severity:"error",text:b??"This path failed validation."}}}(a.collision,a.collisionMessage);d&&(b.push(d.text),c=d.severity??c)}return a.exists?a.isDir?a.writable||(b.push("Directory is not writable from the daemon (Obsidian CLI fallback applies)."),c=c??"warning"):(b.push("Path exists but is not a directory."),c="error"):(b.push("Directory will be created on save."),c=c??"info"),a.hasObsidianStructure&&(b.push("Detected an existing Obsidian vault (.obsidian directory present)."),c=c??"info"),a.existingWiki&&(b.push(`Detected an existing LLM-Wiki layout (${a.existingWiki.layers.join(", ")}). You will be prompted to Adopt or Migrate after saving.`),c=c??"info"),0===b.length&&(b.push("Directory is empty and writable. Ready to enable."),c="info"),{canConfirm:"error"!==c&&(!a.exists||a.isDir),lines:b,severity:c}})(l),[l]),n=(0,c.useRef)(e);(0,c.useEffect)(()=>{n.current=e}),(0,c.useEffect)(()=>{let a=n.current;!a||(0===j.length?a("",m):(k.isFetched||k.isError)&&a(j,m))},[j,m,k.isFetched,k.isError]);let o=j.length>0&&(k.isFetched||k.isError);return(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsx)(x.DirectoryPickerField,{id:i,value:a,onChange:d,title:"Choose external wiki vault",placeholder:"/Users/you/Obsidian/Wiki",defaultPath:g,disabled:h}),k.isFetching&&(0,b.jsxs)("p",{className:"flex items-center gap-1 text-xs text-muted-foreground",role:"status","aria-live":"polite",children:[(0,b.jsx)(q.Loader2,{className:"h-3 w-3 animate-spin","aria-hidden":"true"}),"Validating path…"]}),o&&m.severity&&(0,b.jsx)(y.Alert,{variant:{error:"error",warning:"warning",info:"info"}[m.severity],children:(0,b.jsx)("ul",{className:"list-disc pl-4 space-y-0.5",children:m.lines.map(a=>(0,b.jsx)("li",{children:a},a))})})]})}var A=a.i(7384),B=a.i(21218),C=a.i(30400),D=a.i(57216),E=a.i(8212),F=a.i(47696),G=a.i(78933),H=a.i(48558);let I=["wiki.ingest_url","wiki.compile","wiki.ask","wiki.lint","wiki.trace","wiki.connect"],J=[{tag:"en",label:"English"},{tag:"ja",label:"Japanese"},{tag:"zh",label:"Chinese"},{tag:"es",label:"Español (Spanish)"},{tag:"fr",label:"Français (French)"},{tag:"de",label:"Deutsch (German)"},{tag:"pt",label:"Português (Portuguese)"},{tag:"ko",label:"한국어 (Korean)"},{tag:"__custom__",label:"Other (BCP-47 tag…)"}],K=/^[a-z]{2,3}(?:-[A-Za-z0-9]{2,8})?$/;function L(a){return{language:a.language,dispatchMode:a.dispatchMode,concurrencyCap:a.concurrencyCap,dmAgentWriteEnabled:a.dmAgentWriteEnabled,bridgeEnabled:a.bridgeEnabled,bridgeMeasurementOnly:a.bridgeMeasurementOnly,bridgeMinConfidence:a.bridgeMinConfidence,fullCompileApprovalThresholdUsd:a.fullCompileApprovalThresholdUsd,writeStrategy:a.writeStrategy,gitPreCompileEnabled:a.gitPreCompileEnabled}}function M(a){return a instanceof u.ApiError||a instanceof Error?a.message:"Request failed"}function N(a){if(!a)return"—";try{let b=new Date(a);if(Number.isNaN(b.getTime()))return a;return b.toLocaleString()}catch{return a}}function O({value:a,onChange:d}){let e=J.some(b=>b.tag===a&&"__custom__"!==b.tag),[f,g]=(0,c.useState)(null),h=f??(e?a:"__custom__"),i="__custom__"===h&&a.trim().length>0&&!K.test(a.trim());return(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsxs)(F.Select,{value:h,onValueChange:a=>{"__custom__"===a?g("__custom__"):(g(null),d(a))},children:[(0,b.jsx)(F.SelectTrigger,{children:(0,b.jsx)(F.SelectValue,{})}),(0,b.jsx)(F.SelectContent,{children:J.map(a=>(0,b.jsx)(F.SelectItem,{value:a.tag,children:a.label},a.tag))})]}),"__custom__"===h&&(0,b.jsxs)("div",{className:"space-y-1",children:[(0,b.jsx)(E.Input,{value:a,onChange:a=>d(a.target.value),placeholder:"e.g. zh-Hans or pt-BR"}),i&&(0,b.jsxs)("p",{className:"text-xs text-red-500",children:["Use a BCP-47 tag like ",(0,b.jsx)("code",{children:"en-US"})," or ",(0,b.jsx)("code",{children:"zh-Hans"}),"."]})]})]})}function P({text:a}){let[d,e]=(0,c.useState)(!1);return(0,b.jsxs)(B.Button,{variant:"ghost",size:"sm",className:"h-7 px-2 text-xs",onClick:async()=>{try{await navigator.clipboard.writeText(a),e(!0),setTimeout(()=>e(!1),1200)}catch{}},children:[(0,b.jsx)(m,{className:"h-3 w-3"}),d?"Copied":"Copy"]})}function Q(){return(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-2xl font-semibold text-foreground",children:"Wiki"}),(0,b.jsxs)("p",{className:"mt-1 max-w-3xl text-sm text-muted-foreground",children:["Long-form personal knowledge base. ",(0,b.jsx)("code",{children:"!ingest"})," captures sources, ",(0,b.jsx)("code",{children:"!compile"})," turns them into wiki pages, and"," ",(0,b.jsx)("code",{children:"!ask"})," / ",(0,b.jsx)("code",{children:"!trace"})," / ",(0,b.jsx)("code",{children:"!connect"})," produce answers and timelines."]})]})}function R({defaultInternalRoot:a,externalPath:c,setExternalPath:d,probeSummary:e,onProbeChange:f,enableInternalPending:g,enableExternalPending:h,onEnableInternal:i,onEnableExternal:j}){return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(C.Card,{children:[(0,b.jsx)(C.CardHeader,{className:"items-start",children:(0,b.jsxs)("div",{children:[(0,b.jsx)(C.CardTitle,{children:"Set up your wiki"}),(0,b.jsx)("p",{className:"mt-1 max-w-3xl text-sm text-muted-foreground",children:"Pick where the wiki lives. You can switch later by archiving and re-enabling."})]})}),(0,b.jsxs)("div",{className:"grid gap-3 md:grid-cols-2",children:[(0,b.jsxs)("div",{className:"flex flex-col gap-3 rounded-lg border border-border bg-card p-4",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(n,{className:"h-5 w-5 text-foreground"}),(0,b.jsx)("h3",{className:"text-base font-semibold",children:"Internal"}),(0,b.jsx)(A.Badge,{variant:"blue",children:"Recommended"})]}),(0,b.jsx)("p",{className:"text-sm text-muted-foreground",children:"Managed by Aitne in its data directory. Nothing to set up."}),(0,b.jsxs)("ul",{className:"space-y-1 text-xs text-muted-foreground",children:[(0,b.jsxs)("li",{children:["• Path: ",(0,b.jsx)("code",{className:"break-all",children:a??"~/.personal-agent/wiki"})]}),(0,b.jsx)("li",{children:"• Schema is seeded automatically"}),(0,b.jsx)("li",{children:"• Best for: starting fresh, no Obsidian vault yet"})]}),(0,b.jsxs)(B.Button,{className:"mt-auto",onClick:i,disabled:g,children:[g?(0,b.jsx)(q.Loader2,{className:"h-4 w-4 animate-spin"}):(0,b.jsx)(k.ArrowRight,{className:"h-4 w-4"}),"Enable internal wiki"]})]}),(0,b.jsxs)("div",{className:"flex flex-col gap-3 rounded-lg border border-border bg-card p-4",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(o.FolderOpen,{className:"h-5 w-5 text-foreground"}),(0,b.jsx)("h3",{className:"text-base font-semibold",children:"Existing Obsidian vault"}),(0,b.jsx)(A.Badge,{variant:"purple",children:"External"})]}),(0,b.jsx)("p",{className:"text-sm text-muted-foreground",children:"Point Aitne at a folder you already own. The wiki layout is detected and migrated on demand."}),(0,b.jsxs)("ul",{className:"space-y-1 text-xs text-muted-foreground",children:[(0,b.jsx)("li",{children:"• Path must exist and be writable"}),(0,b.jsx)("li",{children:"• Cannot overlap your primary vault or Aitne’s data dir"}),(0,b.jsx)("li",{children:"• Best for: continuing an existing Obsidian knowledge base"})]}),(0,b.jsx)(z,{value:c,onChange:d,onValidatedChange:f,defaultPath:a}),(0,b.jsxs)(B.Button,{className:"mt-auto",variant:"secondary",onClick:j,disabled:!c||h||e?.canConfirm===!1,children:[h?(0,b.jsx)(q.Loader2,{className:"h-4 w-4 animate-spin"}):(0,b.jsx)(k.ArrowRight,{className:"h-4 w-4"}),"Use this folder"]})]})]})]}),(0,b.jsx)(D.Collapsible,{children:(0,b.jsxs)(C.Card,{children:[(0,b.jsxs)(D.CollapsibleTrigger,{className:"flex w-full items-center justify-between text-left",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)(C.CardTitle,{className:"text-base",children:"What changes when wiki is on?"}),(0,b.jsxs)("p",{className:"mt-1 text-sm text-muted-foreground",children:["A small per-turn permission widening so ",(0,b.jsx)("code",{children:"!ingest"})," can reach the internet."]})]}),(0,b.jsx)(l.ChevronDown,{className:"h-4 w-4 text-muted-foreground"})]}),(0,b.jsx)(D.CollapsibleContent,{className:"mt-3",children:(0,b.jsx)(Z,{})})]})})]})}function S({workspace:a,reactivatePending:c,deletePending:d,onReactivate:e,onDelete:f}){return(0,b.jsxs)(C.Card,{children:[(0,b.jsx)(C.CardHeader,{className:"items-start",children:(0,b.jsxs)("div",{className:"flex items-start gap-3",children:[(0,b.jsx)("div",{className:"rounded-full bg-amber-100 p-2 dark:bg-amber-950/60",children:(0,b.jsx)(h.AlertTriangle,{className:"h-5 w-5 text-amber-600 dark:text-amber-500"})}),(0,b.jsxs)("div",{children:[(0,b.jsx)(C.CardTitle,{children:"This wiki is archived"}),(0,b.jsxs)("p",{className:"mt-1 max-w-3xl text-sm text-muted-foreground",children:["The workspace ",(0,b.jsx)("code",{children:a.name})," still exists on disk but wiki commands (",(0,b.jsx)("code",{children:"!ingest"}),", ",(0,b.jsx)("code",{children:"!compile"}),","," ",(0,b.jsx)("code",{children:"!ask"}),") won’t run until you re-activate it."]})]})]})}),(0,b.jsxs)("dl",{className:"grid gap-3 rounded-lg border border-border bg-muted/40 p-3 text-sm sm:grid-cols-2",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("dt",{className:"text-xs font-medium uppercase tracking-wide text-muted-foreground",children:"Mode"}),(0,b.jsx)("dd",{className:"text-foreground",children:(0,b.jsx)(A.Badge,{variant:"external"===a.kind?"purple":"blue",children:"external"===a.kind?"External":"Internal"})})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("dt",{className:"text-xs font-medium uppercase tracking-wide text-muted-foreground",children:"Root path"}),(0,b.jsx)("dd",{className:"break-all font-mono text-xs text-foreground",children:a.rootPath})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("dt",{className:"text-xs font-medium uppercase tracking-wide text-muted-foreground",children:"Wiki pages"}),(0,b.jsx)("dd",{className:"text-foreground",children:a.stats.wikiCount})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("dt",{className:"text-xs font-medium uppercase tracking-wide text-muted-foreground",children:"Last activity"}),(0,b.jsx)("dd",{className:"text-foreground",children:N(a.lastCompileAt??a.lastIngestAt)})]})]}),(0,b.jsxs)("div",{className:"mt-4 flex flex-wrap gap-2",children:[(0,b.jsxs)(B.Button,{onClick:e,disabled:c,children:[c?(0,b.jsx)(q.Loader2,{className:"h-4 w-4 animate-spin"}):(0,b.jsx)(j,{className:"h-4 w-4"}),"Re-activate wiki"]}),(0,b.jsxs)(B.Button,{variant:"outline",onClick:f,disabled:d,className:"text-red-600 hover:bg-red-50 hover:text-red-700 dark:hover:bg-red-950/40",children:[(0,b.jsx)(t.Trash2,{className:"h-4 w-4"}),"Remove registration"]})]}),(0,b.jsx)("p",{className:"mt-3 text-xs text-muted-foreground",children:"Removing the registration is non-destructive — the folder on disk is preserved."})]})}function T({workspace:a,sevenDayCost:c}){let e="external"===a.kind;return(0,b.jsxs)(C.Card,{children:[(0,b.jsx)(C.CardHeader,{className:"items-start",children:(0,b.jsxs)("div",{className:"flex w-full flex-col gap-3 lg:flex-row lg:items-start lg:justify-between",children:[(0,b.jsxs)("div",{className:"space-y-1",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,b.jsx)(C.CardTitle,{children:a.name}),(0,b.jsx)(A.Badge,{variant:e?"purple":"blue",children:e?"External":"Internal"}),(0,b.jsx)(A.Badge,{variant:"gray",children:a.language})]}),(0,b.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,b.jsx)("code",{className:"break-all text-xs text-muted-foreground",children:a.rootPath}),(0,b.jsx)(P,{text:a.rootPath})]})]}),(0,b.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,b.jsx)(B.Button,{asChild:!0,variant:"outline",size:"sm",children:(0,b.jsx)(d.default,{href:"/wiki",children:"Browse wiki"})}),(0,b.jsx)(B.Button,{asChild:!0,variant:"outline",size:"sm",children:(0,b.jsxs)(d.default,{href:"/wiki/timeline",children:[(0,b.jsx)(p.History,{className:"h-4 w-4"}),"Timeline & health"]})})]})]})}),(0,b.jsxs)("dl",{className:"grid gap-3 border-t border-border pt-3 text-sm sm:grid-cols-4",children:[(0,b.jsx)(U,{label:"Raw notes",value:a.stats.rawCount}),(0,b.jsx)(U,{label:"Wiki pages",value:a.stats.wikiCount}),(0,b.jsx)(U,{label:"Outputs",value:a.stats.outputCount}),(0,b.jsx)(U,{label:"7-day cost",value:(0,H.formatCurrency)(c)})]})]})}function U({label:a,value:c}){return(0,b.jsxs)("div",{children:[(0,b.jsx)("dt",{className:"text-xs font-medium uppercase tracking-wide text-muted-foreground",children:a}),(0,b.jsx)("dd",{className:"mt-0.5 text-base font-semibold text-foreground",children:c})]})}function V({data:a}){return(0,b.jsxs)(y.Alert,{variant:a.exceedsThreshold?"error":"info",children:[(0,b.jsxs)("p",{className:"text-sm",children:[(0,b.jsxs)("strong",{children:[(0,b.jsx)("code",{children:"!compile full"})," cost estimate:"]})," ","$",a.optimisticUsd.toFixed(2),"–$",a.pessimisticUsd.toFixed(2)," ","(expected $",a.expectedUsd.toFixed(2),") from ",a.rawCount," ","raw note",1===a.rawCount?"":"s","."," ",a.exceedsThreshold?(0,b.jsxs)(b.Fragment,{children:["Above the $",a.thresholdUsd.toFixed(2)," threshold — will require dashboard approval."]}):(0,b.jsx)(b.Fragment,{children:"Under the per-workspace threshold; will run autonomously."})]}),"per-file-chars"===a.method&&a.perFile&&a.perFile.length>0&&(0,b.jsxs)("details",{className:"mt-2 text-xs text-muted-foreground",children:[(0,b.jsxs)("summary",{className:"cursor-pointer",children:["Top ",a.perFile.length," raw notes by estimated cost"]}),(0,b.jsx)("ul",{className:"mt-1 space-y-0.5 font-mono",children:a.perFile.map(a=>(0,b.jsxs)("li",{children:[a.path," — ",a.estimatedTokens.toLocaleString()," tokens"," ","(",a.charCount.toLocaleString()," chars)"]},a.path))})]})]})}function W({draft:a,setDraft:c}){return(0,b.jsxs)(C.Card,{children:[(0,b.jsx)(C.CardHeader,{className:"items-start",children:(0,b.jsxs)("div",{children:[(0,b.jsx)(C.CardTitle,{children:"General"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"Language new pages are written in, and how multi-URL ingests are dispatched."})]})}),(0,b.jsxs)("div",{className:"grid gap-4 md:grid-cols-2",children:[(0,b.jsx)(aa,{label:"Writing language",hint:"Independent of your profile language. Existing pages are not rewritten.",children:(0,b.jsx)(O,{value:a.language,onChange:b=>c({...a,language:b})})}),(0,b.jsx)(aa,{label:"Dispatch mode",hint:"Parallel ingests multiple URLs concurrently. Serial runs one at a time.",children:(0,b.jsxs)(F.Select,{value:a.dispatchMode,onValueChange:b=>c({...a,dispatchMode:b}),children:[(0,b.jsx)(F.SelectTrigger,{children:(0,b.jsx)(F.SelectValue,{})}),(0,b.jsxs)(F.SelectContent,{children:[(0,b.jsx)(F.SelectItem,{value:"parallel",children:"Parallel"}),(0,b.jsx)(F.SelectItem,{value:"serial",children:"Serial"})]})]})}),(0,b.jsxs)(aa,{label:(0,b.jsxs)("span",{className:"flex items-center gap-2",children:["Concurrency cap",(0,b.jsx)("span",{className:"inline-flex min-w-[2rem] justify-center rounded-md border border-border bg-muted px-1.5 py-0.5 text-xs font-medium text-foreground",children:a.concurrencyCap})]}),hint:"serial"===a.dispatchMode?"Disabled — set Dispatch mode to Parallel to use this.":"Maximum simultaneous !ingest sessions.",children:[(0,b.jsx)("input",{type:"range",min:1,max:10,step:1,value:a.concurrencyCap,onChange:b=>c({...a,concurrencyCap:Math.max(1,Math.min(10,Number(b.target.value)||1))}),"aria-label":"Per-URL concurrency cap",className:"h-2 w-full cursor-pointer appearance-none rounded-lg bg-muted accent-foreground disabled:cursor-not-allowed disabled:opacity-50",disabled:"serial"===a.dispatchMode}),(0,b.jsxs)("div",{className:"mt-1 flex justify-between text-xs text-muted-foreground",children:[(0,b.jsx)("span",{children:"1"}),(0,b.jsx)("span",{children:"5"}),(0,b.jsx)("span",{children:"10"})]})]})]})]})}function X({draft:a,setDraft:c,bridgeStats:d}){let e=a.bridgeEnabled&&a.dmAgentWriteEnabled;return(0,b.jsxs)(C.Card,{children:[(0,b.jsx)(C.CardHeader,{className:"items-start",children:(0,b.jsxs)("div",{className:"flex w-full items-start justify-between gap-2",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)(C.CardTitle,{children:"Capture insights from chat"}),(0,b.jsxs)("p",{className:"mt-1 max-w-3xl text-sm text-muted-foreground",children:["When you and Aitne hit something worth keeping in a DM, the agent can drop a draft into ",(0,b.jsx)("code",{children:"10_raw/bridge-*.md"})," for you to refine later. Two switches must both be on for anything to be written."]})]}),(0,b.jsx)(A.Badge,{variant:e&&!a.bridgeMeasurementOnly?"blue":"gray",children:a.bridgeEnabled&&a.dmAgentWriteEnabled?a.bridgeMeasurementOnly?"Observing":"Writing":"Off"})]})}),(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsx)(ab,{checked:a.bridgeEnabled,onChange:b=>c({...a,bridgeEnabled:b}),label:"Detect bridge candidates",hint:"The agent watches DM turns for ideas that look wiki-worthy."}),(0,b.jsx)(ab,{checked:a.dmAgentWriteEnabled,onChange:b=>c({...a,dmAgentWriteEnabled:b}),label:"Let the agent write drafts",hint:"Required for any file to actually land. Without this, candidates are only logged.",disabled:!a.bridgeEnabled}),(0,b.jsx)(ab,{checked:a.bridgeMeasurementOnly,onChange:b=>c({...a,bridgeMeasurementOnly:b}),label:"Observation mode (don't write yet)",hint:"Recommended for the first 1-2 weeks: log candidates only so you can review precision before opening the write gate.",disabled:!a.bridgeEnabled}),(0,b.jsx)(aa,{label:"Minimum confidence",hint:"The agent's own confidence threshold (0–1). Lower = more drafts, more noise. Higher = fewer drafts, higher signal.",children:(0,b.jsx)(E.Input,{type:"number",min:0,max:1,step:"0.05",value:a.bridgeMinConfidence,onChange:b=>c({...a,bridgeMinConfidence:Math.min(1,Math.max(0,Number(b.target.value)||0))}),className:"max-w-[8rem]",disabled:!a.bridgeEnabled})}),d&&(0,b.jsxs)("div",{className:"rounded-lg border border-border bg-muted/40 p-3 text-xs text-muted-foreground",children:[(0,b.jsxs)("div",{className:"grid gap-2 sm:grid-cols-3",children:[(0,b.jsxs)("span",{children:[d.written," files written"]}),(0,b.jsxs)("span",{children:[d.candidates," candidates logged"]}),(0,b.jsxs)("span",{children:[d.deduplicated," dedup hits"]})]}),d.lastDetectedAt&&(0,b.jsxs)("p",{className:"mt-1.5",children:["Last activity: ",N(d.lastDetectedAt)]})]})]})]})}function Y({draft:a,setDraft:c,isExternal:d,showGitToggle:e}){return(0,b.jsxs)(C.Card,{children:[(0,b.jsx)(C.CardHeader,{className:"items-start",children:(0,b.jsxs)("div",{children:[(0,b.jsx)(C.CardTitle,{children:"Compilation & writes"}),(0,b.jsxs)("p",{className:"mt-1 text-sm text-muted-foreground",children:["How ",(0,b.jsx)("code",{children:"!compile"})," handles large jobs and writes back to disk."]})]})}),(0,b.jsxs)("div",{className:"grid gap-4 md:grid-cols-2",children:[(0,b.jsx)(aa,{label:"Approval threshold for !compile full",hint:"If the estimated cost exceeds this, !compile full asks for dashboard approval instead of running autonomously.",children:(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("span",{className:"text-sm text-muted-foreground",children:"$"}),(0,b.jsx)(E.Input,{type:"number",min:0,step:"0.01",value:a.fullCompileApprovalThresholdUsd,onChange:b=>c({...a,fullCompileApprovalThresholdUsd:Number(b.target.value)||0})})]})}),d&&(0,b.jsx)(aa,{label:"Write strategy",hint:"iCloud-backed vaults need the Obsidian CLI to sync correctly. Auto probes on the first write.",children:(0,b.jsxs)(F.Select,{value:a.writeStrategy,onValueChange:b=>c({...a,writeStrategy:b}),children:[(0,b.jsx)(F.SelectTrigger,{children:(0,b.jsx)(F.SelectValue,{})}),(0,b.jsxs)(F.SelectContent,{children:[(0,b.jsx)(F.SelectItem,{value:"auto",children:"Auto (probe on first write)"}),(0,b.jsx)(F.SelectItem,{value:"fs",children:"Direct filesystem"}),(0,b.jsx)(F.SelectItem,{value:"cli",children:"Obsidian CLI (for iCloud vaults)"})]})]})}),e&&(0,b.jsx)("div",{className:"md:col-span-2",children:(0,b.jsx)(ab,{checked:a.gitPreCompileEnabled,onChange:b=>c({...a,gitPreCompileEnabled:b}),label:"Auto-commit before !compile full",hint:"Stages and commits any pending changes so a full compile starts from a clean tree. Skipped if the tree is dirty in unexpected ways."})})]})]})}function Z(){return(0,b.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,b.jsxs)("p",{className:"text-muted-foreground",children:["Only ",(0,b.jsx)("code",{children:"wiki.ingest_url"})," sessions (one per URL passed to"," ",(0,b.jsx)("code",{children:"!ingest"}),") are allowed to reach the internet."," ",(0,b.jsx)("code",{children:"wiki.compile"})," and ",(0,b.jsx)("code",{children:"wiki.ask"})," read locally through the daemon and never touch external hosts."]}),(0,b.jsxs)("details",{className:"rounded-lg border border-border bg-muted/40 p-3 text-xs",children:[(0,b.jsx)("summary",{className:"cursor-pointer font-medium text-foreground",children:"Per-backend details"}),(0,b.jsxs)("ul",{className:"mt-2 ml-4 list-disc space-y-1.5 text-muted-foreground",children:[(0,b.jsxs)("li",{children:[(0,b.jsx)("strong",{className:"text-foreground",children:"Claude"})," — adds"," ",(0,b.jsx)("code",{children:"WebFetch"})," to the per-turn allowed tools. The deny list and dontAsk permission mode still apply. If you customised"," ",(0,b.jsx)("code",{children:"allowedToolsOverride"}),", include ",(0,b.jsx)("code",{children:"WebFetch"})," ","yourself."]}),(0,b.jsxs)("li",{children:[(0,b.jsx)("strong",{className:"text-foreground",children:"Codex"})," — no change needed. The workspace-write sandbox already reaches the network."]}),(0,b.jsxs)("li",{children:[(0,b.jsx)("strong",{className:"text-foreground",children:"Gemini"})," — the strict admin policy flips just ",(0,b.jsx)("code",{children:"web_fetch"})," to allow for this turn. Container sandbox + context-dir chokepoint stay intact."]}),(0,b.jsxs)("li",{children:["If a backend is globally in ",(0,b.jsx)("code",{children:"allow"})," execution mode, the widening is a no-op."]})]})]})]})}function $({workspaceName:a,archivePending:c,deletePending:d,onArchive:e,onDelete:f}){return(0,b.jsxs)(C.Card,{className:"border-red-200 dark:border-red-900/50",children:[(0,b.jsx)(C.CardHeader,{className:"items-start",children:(0,b.jsxs)("div",{children:[(0,b.jsx)(C.CardTitle,{className:"text-red-700 dark:text-red-400",children:"Danger zone"}),(0,b.jsxs)("p",{className:"mt-1 text-sm text-muted-foreground",children:["Stop or remove the ",(0,b.jsx)("code",{children:a})," wiki. Files on disk are kept in both cases."]})]})}),(0,b.jsxs)("div",{className:"grid gap-3 md:grid-cols-2",children:[(0,b.jsxs)("div",{className:"rounded-lg border border-border p-3",children:[(0,b.jsx)("h4",{className:"text-sm font-semibold text-foreground",children:"Archive"}),(0,b.jsx)("p",{className:"mt-1 text-xs text-muted-foreground",children:"Pauses wiki commands. You can re-activate later from this page."}),(0,b.jsxs)(B.Button,{variant:"outline",size:"sm",className:"mt-3",onClick:e,disabled:c,children:[c?(0,b.jsx)(q.Loader2,{className:"h-4 w-4 animate-spin"}):null,"Archive workspace"]})]}),(0,b.jsxs)("div",{className:"rounded-lg border border-red-200 p-3 dark:border-red-900/50",children:[(0,b.jsx)("h4",{className:"text-sm font-semibold text-red-700 dark:text-red-400",children:"Remove registration"}),(0,b.jsx)("p",{className:"mt-1 text-xs text-muted-foreground",children:"Deletes the daemon’s record only. The folder on disk is preserved — re-add it later if you change your mind."}),(0,b.jsxs)(B.Button,{variant:"outline",size:"sm",className:"mt-3 text-red-600 hover:bg-red-50 hover:text-red-700 dark:hover:bg-red-950/40",onClick:f,disabled:d,children:[d?(0,b.jsx)(q.Loader2,{className:"h-4 w-4 animate-spin"}):(0,b.jsx)(t.Trash2,{className:"h-4 w-4"}),"Remove"]})]})]})]})}function _({saving:a,onSave:c,onDiscard:d}){return(0,b.jsxs)("div",{className:"sticky bottom-4 z-10 mt-4 flex items-center justify-between gap-3 rounded-lg border border-border bg-background/95 px-4 py-3 shadow-lg backdrop-blur",children:[(0,b.jsx)("p",{className:"text-sm text-foreground",children:"You have unsaved changes."}),(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsxs)(B.Button,{variant:"outline",size:"sm",onClick:d,disabled:a,children:[(0,b.jsx)(r.RotateCcw,{className:"h-4 w-4"}),"Discard"]}),(0,b.jsxs)(B.Button,{size:"sm",onClick:c,disabled:a,children:[a?(0,b.jsx)(q.Loader2,{className:"h-4 w-4 animate-spin"}):(0,b.jsx)(s.Save,{className:"h-4 w-4"}),"Save changes"]})]})]})}function aa({label:a,hint:c,children:d}){return(0,b.jsxs)("div",{className:"space-y-1.5",children:[(0,b.jsx)("p",{className:"text-sm font-medium text-foreground",children:a}),d,c&&(0,b.jsx)("p",{className:"text-xs text-muted-foreground",children:c})]})}function ab({checked:a,onChange:c,label:d,hint:e,disabled:f}){return(0,b.jsxs)("label",{className:`flex items-start gap-3 rounded-lg border border-border p-3 text-sm ${f?"opacity-50":"cursor-pointer hover:bg-muted/40"}`,children:[(0,b.jsx)("input",{type:"checkbox",className:"mt-0.5",checked:a,onChange:a=>c(a.target.checked),disabled:f}),(0,b.jsxs)("div",{className:"space-y-0.5",children:[(0,b.jsx)("p",{className:"font-medium text-foreground",children:d}),e&&(0,b.jsx)("p",{className:"text-xs text-muted-foreground",children:e})]})]})}a.s(["default",0,function(){let a=(0,g.useQueryClient)(),{toast:d,showToast:h}=(0,G.useSaveConfig)(),{data:i,isLoading:j,error:k}=(0,f.useQuery)({queryKey:["wiki-workspaces"],queryFn:()=>u.api.get("/wiki/workspaces")}),m=i?.workspaces.find(a=>a.active)??null,n=m?null:i?.workspaces.find(a=>!a.active)??null,o=m??n,[p,r]=(0,c.useState)(null),[s,t]=(0,c.useState)(""),[x,z]=(0,c.useState)(null),[A,B]=(0,c.useState)(!1);(0,c.useEffect)(()=>{o&&r(L(o))},[o?.id]);let E=(0,c.useMemo)(()=>o?L(o):null,[o]),F=!!(p&&E&&(p.language!==E.language||p.dispatchMode!==E.dispatchMode||p.concurrencyCap!==E.concurrencyCap||p.dmAgentWriteEnabled!==E.dmAgentWriteEnabled||p.bridgeEnabled!==E.bridgeEnabled||p.bridgeMeasurementOnly!==E.bridgeMeasurementOnly||p.bridgeMinConfidence!==E.bridgeMinConfidence||p.fullCompileApprovalThresholdUsd!==E.fullCompileApprovalThresholdUsd||p.writeStrategy!==E.writeStrategy||p.gitPreCompileEnabled!==E.gitPreCompileEnabled)),H=(0,f.useQuery)({queryKey:["wiki-estimate",m?.name],enabled:!!m,queryFn:()=>u.api.get(`/wiki/${m.name}/estimate`,{headers:{"x-process-key":"wiki.compile"}})}),J=(0,e.useMutation)({mutationFn:async()=>o&&p?u.api.patch(`/wiki/workspaces/${o.name}`,p):null,onSuccess:async()=>{await a.invalidateQueries({queryKey:["wiki-workspaces"]}),h("success","Wiki settings saved")},onError:a=>h("error",M(a))}),K=(0,e.useMutation)({mutationFn:()=>u.api.post("/wiki/workspaces",{kind:"internal"}),onSuccess:async()=>{await a.invalidateQueries({queryKey:["wiki-workspaces"]}),h("success","Internal wiki enabled")},onError:a=>h("error",M(a))}),N=(0,e.useMutation)({mutationFn:async()=>{let a=await u.api.post("/wiki/workspaces/probe",{rootPath:s});if(!a.ok)throw new u.ApiError(400,{message:a.message??"External path failed validation."});return u.api.post("/wiki/workspaces",{kind:"external",rootPath:a.validation.resolvedPath??s})},onSuccess:async()=>{await a.invalidateQueries({queryKey:["wiki-workspaces"]}),h("success","External wiki created")},onError:a=>h("error",M(a))}),O=(0,e.useMutation)({mutationFn:()=>{if(!o)throw Error("No workspace to re-activate");return u.api.patch(`/wiki/workspaces/${o.name}`,{active:!0})},onSuccess:async()=>{await a.invalidateQueries({queryKey:["wiki-workspaces"]}),h("success","Wiki re-activated")},onError:a=>h("error",M(a))}),P=(0,e.useMutation)({mutationFn:()=>u.api.post(`/wiki/workspaces/${o?.name}/archive`),onSuccess:async()=>{await a.invalidateQueries({queryKey:["wiki-workspaces"]}),h("success","Wiki archived")},onError:a=>h("error",M(a))}),U=(0,e.useMutation)({mutationFn:()=>u.api.delete(`/wiki/workspaces/${o?.name}`),onSuccess:async()=>{await a.invalidateQueries({queryKey:["wiki-workspaces"]}),h("success","Wiki workspace removed (files preserved on disk)")},onError:a=>h("error",M(a))});if(j)return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(Q,{}),(0,b.jsx)(C.Card,{children:(0,b.jsxs)("div",{className:"flex items-center gap-2 p-4 text-sm text-muted-foreground",children:[(0,b.jsx)(q.Loader2,{className:"h-4 w-4 animate-spin"})," Loading wiki…"]})})]});if(k)return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(Q,{}),(0,b.jsx)(y.Alert,{variant:"error",children:k instanceof Error?k.message:"Failed to load wiki settings."})]});if(!o)return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(Q,{}),(0,b.jsx)(w.SettingsToast,{toast:d}),(0,b.jsx)(R,{defaultInternalRoot:i?.defaultInternalRoot,externalPath:s,setExternalPath:t,probeSummary:x,onProbeChange:(a,b)=>z(b),enableInternalPending:K.isPending,enableExternalPending:N.isPending,onEnableInternal:()=>K.mutate(),onEnableExternal:()=>N.mutate()})]});if(!o.active)return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(Q,{}),(0,b.jsx)(w.SettingsToast,{toast:d}),(0,b.jsx)(S,{workspace:o,reactivatePending:O.isPending,deletePending:U.isPending,onReactivate:()=>O.mutate(),onDelete:()=>{window.confirm("Delete this wiki workspace registration?\n\nThe folder on disk is preserved — only the daemon's record is removed.")&&U.mutate()}})]});if(!p)return null;let aa="external"===o.kind,ab=aa&&!0===o.isGitRepo,ac=o.recentCosts.reduce((a,b)=>a+Number(b.totalCostUsd??0),0);return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(Q,{}),(0,b.jsx)(w.SettingsToast,{toast:d}),(0,b.jsx)(T,{workspace:o,sevenDayCost:ac}),H.data?.estimate&&H.data.estimate.rawCount>0&&(0,b.jsx)(V,{data:H.data.estimate}),(0,b.jsx)(W,{draft:p,setDraft:r}),(0,b.jsx)(X,{draft:p,setDraft:r,bridgeStats:o.bridgeStats}),(0,b.jsx)(Y,{draft:p,setDraft:r,isExternal:aa,showGitToggle:ab}),(0,b.jsx)(v.BackendSettingsSection,{onToast:h,sections:["processes"],processKeys:I,title:"Commands & models",description:"Pick the backend, model, turn limit, and per-run budget for each wiki command."}),(0,b.jsx)(D.Collapsible,{open:A,onOpenChange:B,children:(0,b.jsxs)(C.Card,{children:[(0,b.jsxs)(D.CollapsibleTrigger,{className:"flex w-full items-center justify-between text-left",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)(C.CardTitle,{children:"Advanced"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"External URL fetch policy, backend-specific notes."})]}),(0,b.jsx)(l.ChevronDown,{className:`h-5 w-5 text-muted-foreground transition-transform ${A?"rotate-180":""}`})]}),(0,b.jsx)(D.CollapsibleContent,{className:"mt-4",children:(0,b.jsx)(Z,{})})]})}),(0,b.jsx)($,{workspaceName:o.name,archivePending:P.isPending,deletePending:U.isPending,onArchive:()=>{window.confirm("Archive this wiki workspace?\n\nWiki commands will stop working until you re-activate it. Files on disk are kept.")&&P.mutate()},onDelete:()=>{window.confirm("Permanently remove this workspace registration?\n\nThe folder on disk is preserved — only the daemon's record is deleted.")&&U.mutate()}}),F&&(0,b.jsx)(_,{saving:J.isPending,onSave:()=>J.mutate(),onDiscard:()=>r(E)})]})}],80970)}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=packages_dashboard_src_app_settings_wiki_page_tsx_0..1tkb._.js.map
|