@aitne/dashboard 0.1.0 → 0.1.3
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/build-manifest.json +3 -3
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/diagnostics/route-bundle-stats.json +210 -247
- package/.next/fallback-build-manifest.json +3 -3
- 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 +14 -14
- package/.next/server/app/_not-found.segments/_full.segment.rsc +14 -14
- package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/server/app/_not-found.segments/_index.segment.rsc +9 -9
- 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 +1 -1
- 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 +27 -26
- package/.next/server/app/activity.segments/_full.segment.rsc +27 -26
- package/.next/server/app/activity.segments/_head.segment.rsc +4 -4
- package/.next/server/app/activity.segments/_index.segment.rsc +9 -9
- package/.next/server/app/activity.segments/_tree.segment.rsc +1 -1
- 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 +22 -23
- package/.next/server/app/analytics.segments/_full.segment.rsc +22 -23
- package/.next/server/app/analytics.segments/_head.segment.rsc +4 -4
- package/.next/server/app/analytics.segments/_index.segment.rsc +9 -9
- package/.next/server/app/analytics.segments/_tree.segment.rsc +1 -1
- 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 +16 -16
- package/.next/server/app/chat.segments/_full.segment.rsc +16 -16
- package/.next/server/app/chat.segments/_head.segment.rsc +4 -4
- package/.next/server/app/chat.segments/_index.segment.rsc +9 -9
- package/.next/server/app/chat.segments/_tree.segment.rsc +1 -1
- 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 +17 -17
- package/.next/server/app/connections/calendar.segments/_full.segment.rsc +17 -17
- package/.next/server/app/connections/calendar.segments/_head.segment.rsc +4 -4
- package/.next/server/app/connections/calendar.segments/_index.segment.rsc +9 -9
- package/.next/server/app/connections/calendar.segments/_tree.segment.rsc +1 -1
- 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 +15 -15
- package/.next/server/app/connections/journal.segments/_full.segment.rsc +15 -15
- package/.next/server/app/connections/journal.segments/_head.segment.rsc +4 -4
- package/.next/server/app/connections/journal.segments/_index.segment.rsc +9 -9
- package/.next/server/app/connections/journal.segments/_tree.segment.rsc +1 -1
- 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 +17 -17
- package/.next/server/app/connections/knowledge.segments/_full.segment.rsc +17 -17
- package/.next/server/app/connections/knowledge.segments/_head.segment.rsc +4 -4
- package/.next/server/app/connections/knowledge.segments/_index.segment.rsc +9 -9
- package/.next/server/app/connections/knowledge.segments/_tree.segment.rsc +1 -1
- 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 +17 -17
- package/.next/server/app/connections/mail.segments/_full.segment.rsc +17 -17
- package/.next/server/app/connections/mail.segments/_head.segment.rsc +4 -4
- package/.next/server/app/connections/mail.segments/_index.segment.rsc +9 -9
- package/.next/server/app/connections/mail.segments/_tree.segment.rsc +1 -1
- 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 +17 -17
- package/.next/server/app/connections/mcp.segments/_full.segment.rsc +17 -17
- package/.next/server/app/connections/mcp.segments/_head.segment.rsc +4 -4
- package/.next/server/app/connections/mcp.segments/_index.segment.rsc +9 -9
- package/.next/server/app/connections/mcp.segments/_tree.segment.rsc +1 -1
- 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 +17 -17
- package/.next/server/app/connections/messaging.segments/_full.segment.rsc +17 -17
- package/.next/server/app/connections/messaging.segments/_head.segment.rsc +4 -4
- package/.next/server/app/connections/messaging.segments/_index.segment.rsc +9 -9
- package/.next/server/app/connections/messaging.segments/_tree.segment.rsc +1 -1
- 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 +17 -17
- package/.next/server/app/connections/repositories.segments/_full.segment.rsc +17 -17
- package/.next/server/app/connections/repositories.segments/_head.segment.rsc +4 -4
- package/.next/server/app/connections/repositories.segments/_index.segment.rsc +9 -9
- package/.next/server/app/connections/repositories.segments/_tree.segment.rsc +1 -1
- 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 +15 -15
- package/.next/server/app/connections/routines.segments/_full.segment.rsc +15 -15
- package/.next/server/app/connections/routines.segments/_head.segment.rsc +4 -4
- package/.next/server/app/connections/routines.segments/_index.segment.rsc +9 -9
- package/.next/server/app/connections/routines.segments/_tree.segment.rsc +1 -1
- 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 +15 -15
- package/.next/server/app/connections.segments/_full.segment.rsc +15 -15
- package/.next/server/app/connections.segments/_head.segment.rsc +4 -4
- package/.next/server/app/connections.segments/_index.segment.rsc +9 -9
- package/.next/server/app/connections.segments/_tree.segment.rsc +1 -1
- 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 +14 -14
- package/.next/server/app/conversations.segments/_full.segment.rsc +14 -14
- package/.next/server/app/conversations.segments/_head.segment.rsc +4 -4
- package/.next/server/app/conversations.segments/_index.segment.rsc +9 -9
- package/.next/server/app/conversations.segments/_tree.segment.rsc +1 -1
- 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 +16 -16
- package/.next/server/app/finance.segments/_full.segment.rsc +16 -16
- package/.next/server/app/finance.segments/_head.segment.rsc +4 -4
- package/.next/server/app/finance.segments/_index.segment.rsc +9 -9
- package/.next/server/app/finance.segments/_tree.segment.rsc +1 -1
- 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 +16 -16
- package/.next/server/app/git.segments/_full.segment.rsc +16 -16
- package/.next/server/app/git.segments/_head.segment.rsc +4 -4
- package/.next/server/app/git.segments/_index.segment.rsc +9 -9
- package/.next/server/app/git.segments/_tree.segment.rsc +1 -1
- 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 +16 -16
- package/.next/server/app/health.segments/_full.segment.rsc +16 -16
- package/.next/server/app/health.segments/_head.segment.rsc +4 -4
- package/.next/server/app/health.segments/_index.segment.rsc +9 -9
- package/.next/server/app/health.segments/_tree.segment.rsc +1 -1
- 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 +16 -16
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/index.segments/_full.segment.rsc +16 -16
- package/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/server/app/index.segments/_index.segment.rsc +9 -9
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- 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 +17 -17
- package/.next/server/app/knowledge.segments/_full.segment.rsc +17 -17
- package/.next/server/app/knowledge.segments/_head.segment.rsc +4 -4
- package/.next/server/app/knowledge.segments/_index.segment.rsc +9 -9
- package/.next/server/app/knowledge.segments/_tree.segment.rsc +1 -1
- 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 +16 -16
- package/.next/server/app/reading.segments/_full.segment.rsc +16 -16
- package/.next/server/app/reading.segments/_head.segment.rsc +4 -4
- package/.next/server/app/reading.segments/_index.segment.rsc +9 -9
- package/.next/server/app/reading.segments/_tree.segment.rsc +1 -1
- 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 +16 -16
- package/.next/server/app/schedule.segments/_full.segment.rsc +16 -16
- package/.next/server/app/schedule.segments/_head.segment.rsc +4 -4
- package/.next/server/app/schedule.segments/_index.segment.rsc +9 -9
- package/.next/server/app/schedule.segments/_tree.segment.rsc +1 -1
- 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 +17 -17
- package/.next/server/app/settings/advanced.segments/_full.segment.rsc +17 -17
- package/.next/server/app/settings/advanced.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/advanced.segments/_index.segment.rsc +9 -9
- package/.next/server/app/settings/advanced.segments/_tree.segment.rsc +1 -1
- 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 +15 -15
- package/.next/server/app/settings/backends.segments/_full.segment.rsc +15 -15
- package/.next/server/app/settings/backends.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/backends.segments/_index.segment.rsc +9 -9
- package/.next/server/app/settings/backends.segments/_tree.segment.rsc +1 -1
- 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 +17 -17
- package/.next/server/app/settings/commands.segments/_full.segment.rsc +17 -17
- package/.next/server/app/settings/commands.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/commands.segments/_index.segment.rsc +9 -9
- package/.next/server/app/settings/commands.segments/_tree.segment.rsc +1 -1
- 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 +15 -15
- package/.next/server/app/settings/connections.segments/_full.segment.rsc +15 -15
- package/.next/server/app/settings/connections.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/connections.segments/_index.segment.rsc +9 -9
- package/.next/server/app/settings/connections.segments/_tree.segment.rsc +1 -1
- 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 +17 -17
- package/.next/server/app/settings/journal.segments/_full.segment.rsc +17 -17
- package/.next/server/app/settings/journal.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/journal.segments/_index.segment.rsc +9 -9
- package/.next/server/app/settings/journal.segments/_tree.segment.rsc +1 -1
- 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 +17 -17
- package/.next/server/app/settings/management.segments/_full.segment.rsc +17 -17
- package/.next/server/app/settings/management.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/management.segments/_index.segment.rsc +9 -9
- package/.next/server/app/settings/management.segments/_tree.segment.rsc +1 -1
- 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 +15 -15
- package/.next/server/app/settings/messaging.segments/_full.segment.rsc +15 -15
- package/.next/server/app/settings/messaging.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/messaging.segments/_index.segment.rsc +9 -9
- package/.next/server/app/settings/messaging.segments/_tree.segment.rsc +1 -1
- 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 +17 -17
- package/.next/server/app/settings/models.segments/_full.segment.rsc +17 -17
- package/.next/server/app/settings/models.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/models.segments/_index.segment.rsc +9 -9
- package/.next/server/app/settings/models.segments/_tree.segment.rsc +1 -1
- 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 +15 -15
- package/.next/server/app/settings/processes.segments/_full.segment.rsc +15 -15
- package/.next/server/app/settings/processes.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/processes.segments/_index.segment.rsc +9 -9
- package/.next/server/app/settings/processes.segments/_tree.segment.rsc +1 -1
- 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 +17 -17
- package/.next/server/app/settings/routines.segments/_full.segment.rsc +17 -17
- package/.next/server/app/settings/routines.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/routines.segments/_index.segment.rsc +9 -9
- package/.next/server/app/settings/routines.segments/_tree.segment.rsc +1 -1
- 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 +17 -17
- package/.next/server/app/settings/schedule.segments/_full.segment.rsc +17 -17
- package/.next/server/app/settings/schedule.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/schedule.segments/_index.segment.rsc +9 -9
- package/.next/server/app/settings/schedule.segments/_tree.segment.rsc +1 -1
- 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 +17 -17
- package/.next/server/app/settings/self-learning.segments/_full.segment.rsc +17 -17
- package/.next/server/app/settings/self-learning.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/self-learning.segments/_index.segment.rsc +9 -9
- package/.next/server/app/settings/self-learning.segments/_tree.segment.rsc +1 -1
- 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.html +1 -1
- package/.next/server/app/settings.rsc +17 -17
- package/.next/server/app/settings.segments/_full.segment.rsc +17 -17
- package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings.segments/_index.segment.rsc +9 -9
- package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- 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 +16 -16
- package/.next/server/app/setup.segments/_full.segment.rsc +16 -16
- package/.next/server/app/setup.segments/_head.segment.rsc +4 -4
- package/.next/server/app/setup.segments/_index.segment.rsc +9 -9
- package/.next/server/app/setup.segments/_tree.segment.rsc +1 -1
- 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 +16 -16
- package/.next/server/app/trip.segments/_full.segment.rsc +16 -16
- package/.next/server/app/trip.segments/_head.segment.rsc +4 -4
- package/.next/server/app/trip.segments/_index.segment.rsc +9 -9
- package/.next/server/app/trip.segments/_tree.segment.rsc +1 -1
- 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/chunks/05w9_next_dist_esm_build_templates_app-route_0~eezk6.js +3 -3
- package/.next/server/chunks/05w9_next_dist_esm_build_templates_app-route_0~eezk6.js.map +1 -1
- package/.next/server/chunks/{[root-of-the-server]__0j~awob._.js → [root-of-the-server]__0dwxuh7._.js} +1 -1
- package/.next/server/chunks/{[root-of-the-server]__04-hp3j._.js → [root-of-the-server]__0k7lkv6._.js} +2 -2
- package/.next/server/chunks/ssr/{[root-of-the-server]__0t26ngg._.js → [root-of-the-server]__0ngitfo._.js} +2 -2
- package/.next/server/chunks/ssr/{[root-of-the-server]__0t26ngg._.js.map → [root-of-the-server]__0ngitfo._.js.map} +1 -1
- package/.next/server/chunks/ssr/{_0pvc7ao._.js → _0370l.6._.js} +2 -2
- package/.next/server/chunks/ssr/{_0pvc7ao._.js.map → _0370l.6._.js.map} +1 -1
- package/.next/server/chunks/ssr/_04kt9.8._.js +3 -0
- package/.next/server/chunks/ssr/_04kt9.8._.js.map +1 -0
- package/.next/server/chunks/ssr/_060itkv._.js +3 -0
- package/.next/server/chunks/ssr/_060itkv._.js.map +1 -0
- package/.next/server/chunks/ssr/{_0pydxc8._.js → _083cqy.._.js} +2 -2
- package/.next/server/chunks/ssr/_083cqy.._.js.map +1 -0
- package/.next/server/chunks/ssr/{_0lm8td~._.js → _08mbdt1._.js} +2 -2
- package/.next/server/chunks/ssr/_08mbdt1._.js.map +1 -0
- package/.next/server/chunks/ssr/_0938p.1._.js +3 -0
- package/.next/server/chunks/ssr/_0938p.1._.js.map +1 -0
- package/.next/server/chunks/ssr/_0ff5qav._.js +3 -0
- package/.next/server/chunks/ssr/_0ff5qav._.js.map +1 -0
- package/.next/server/chunks/ssr/_0g2e834._.js +3 -0
- package/.next/server/chunks/ssr/_0g2e834._.js.map +1 -0
- package/.next/server/chunks/ssr/_0gp8d.p._.js +3 -0
- package/.next/server/chunks/ssr/_0gp8d.p._.js.map +1 -0
- package/.next/server/chunks/ssr/_0k2j6-t._.js +3 -0
- package/.next/server/chunks/ssr/_0k2j6-t._.js.map +1 -0
- package/.next/server/chunks/ssr/_0kq5x2k._.js +3 -0
- package/.next/server/chunks/ssr/_0kq5x2k._.js.map +1 -0
- package/.next/server/chunks/ssr/_0mk7dqt._.js +3 -0
- package/.next/server/chunks/ssr/_0mk7dqt._.js.map +1 -0
- package/.next/server/chunks/ssr/_0qgn2wv._.js +3 -0
- package/.next/server/chunks/ssr/_0qgn2wv._.js.map +1 -0
- package/.next/server/chunks/ssr/_0t-2u_i._.js +3 -0
- package/.next/server/chunks/ssr/_0t-2u_i._.js.map +1 -0
- package/.next/server/chunks/ssr/_0vn5_62._.js +5 -0
- package/.next/server/chunks/ssr/_0vn5_62._.js.map +1 -0
- package/.next/server/chunks/ssr/{_01aim8_._.js → _0z1gdb3._.js} +2 -2
- package/.next/server/chunks/ssr/{_01aim8_._.js.map → _0z1gdb3._.js.map} +1 -1
- package/.next/server/chunks/ssr/_0~4ta0s._.js +3 -0
- package/.next/server/chunks/ssr/_0~4ta0s._.js.map +1 -0
- package/.next/server/chunks/ssr/_0~5r_8s._.js +3 -0
- package/.next/server/chunks/ssr/_0~5r_8s._.js.map +1 -0
- package/.next/server/chunks/ssr/_13mk_9n._.js.map +1 -1
- 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_settings_advanced_page_tsx_0o~_885._.js +1 -1
- package/.next/server/chunks/ssr/packages_dashboard_src_app_settings_advanced_page_tsx_0o~_885._.js.map +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_shared_dist_index_0kuvow-.js +2 -2
- 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/0_yam4jvco3~t.js +1 -0
- package/.next/static/chunks/0jf-dsa9~fdxb.js +1 -0
- package/.next/static/chunks/{107sryfaib58g.js → 0kjwfju1fsjkk.js} +1 -1
- package/.next/static/chunks/0yt4prt55bas4.js +11 -0
- package/.next/static/chunks/{0v2k5twh.h_g2.js → 10_4_2h602xzk.js} +3 -3
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/package.json +2 -2
- package/.next/server/chunks/ssr/_0-v4eqm._.js +0 -3
- package/.next/server/chunks/ssr/_0-v4eqm._.js.map +0 -1
- package/.next/server/chunks/ssr/_03ay~a6._.js +0 -3
- package/.next/server/chunks/ssr/_03ay~a6._.js.map +0 -1
- package/.next/server/chunks/ssr/_05ul8c5._.js +0 -3
- package/.next/server/chunks/ssr/_05ul8c5._.js.map +0 -1
- package/.next/server/chunks/ssr/_0_1u-~q._.js +0 -3
- package/.next/server/chunks/ssr/_0_1u-~q._.js.map +0 -1
- package/.next/server/chunks/ssr/_0ax_-cr._.js +0 -3
- package/.next/server/chunks/ssr/_0ax_-cr._.js.map +0 -1
- package/.next/server/chunks/ssr/_0czapf~._.js +0 -3
- package/.next/server/chunks/ssr/_0czapf~._.js.map +0 -1
- package/.next/server/chunks/ssr/_0dlwb-j._.js +0 -3
- package/.next/server/chunks/ssr/_0dlwb-j._.js.map +0 -1
- package/.next/server/chunks/ssr/_0dvtdxd._.js +0 -3
- package/.next/server/chunks/ssr/_0dvtdxd._.js.map +0 -1
- package/.next/server/chunks/ssr/_0h-sc1p._.js +0 -3
- package/.next/server/chunks/ssr/_0h-sc1p._.js.map +0 -1
- package/.next/server/chunks/ssr/_0k_zx~4._.js +0 -3
- package/.next/server/chunks/ssr/_0k_zx~4._.js.map +0 -1
- package/.next/server/chunks/ssr/_0kqlqn5._.js +0 -5
- package/.next/server/chunks/ssr/_0kqlqn5._.js.map +0 -1
- package/.next/server/chunks/ssr/_0lm8td~._.js.map +0 -1
- package/.next/server/chunks/ssr/_0pydxc8._.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/static/chunks/07k3fjq54671q.js +0 -1
- package/.next/static/chunks/0o6q9amhembht.js +0 -1
- package/.next/static/chunks/0pbah5-djvzuh.js +0 -11
- package/.next/static/chunks/0sz8178y9b-~6.js +0 -1
- /package/.next/server/chunks/{[root-of-the-server]__0j~awob._.js.map → [root-of-the-server]__0dwxuh7._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__04-hp3j._.js.map → [root-of-the-server]__0k7lkv6._.js.map} +0 -0
- /package/.next/static/{BS7xnS8j09zEzTFQ8HuEd → Ahfdsxk-LdjAGL9ZEF982}/_buildManifest.js +0 -0
- /package/.next/static/{BS7xnS8j09zEzTFQ8HuEd → Ahfdsxk-LdjAGL9ZEF982}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{BS7xnS8j09zEzTFQ8HuEd → Ahfdsxk-LdjAGL9ZEF982}/_ssgManifest.js +0 -0
|
@@ -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 (delegated mode)</CardTitle>\n </CardHeader>\n <div className=\"p-4 text-sm text-muted-foreground\">\n No integrations are in delegated mode, so background cadences are\n inactive. Move an integration (Calendar / Gmail / Notion) to\n delegated mode in <code>/connections</code> to enable opt-in\n 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 (delegated mode)</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 Delegated-mode cadences poll Calendar / Gmail / Notion through the\n AI subprocess so the hourly check sees fresh observations. Every\n poll spends tokens — by default they are off. Enable just the\n cadences you actually want, and they will respect the shared\n 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 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 items-center gap-2\">\n <p className=\"text-sm font-medium text-foreground\">\n {row.displayName}\n </p>\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":"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"}
|
|
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 (delegated mode)</CardTitle>\n </CardHeader>\n <div className=\"p-4 text-sm text-muted-foreground\">\n No integrations are in delegated mode, so background cadences are\n inactive. Move an integration (Calendar / Gmail / Notion) to\n delegated mode in <code>/connections</code> to enable opt-in\n 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 (delegated mode)</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 Delegated-mode cadences poll Calendar / Gmail / Notion through the\n AI subprocess so the hourly check sees fresh observations. Every\n poll spends tokens — by default they are off. Enable just the\n cadences you actually want, and they will respect the shared\n 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 items-center gap-2\">\n <p className=\"text-sm font-medium text-foreground\">\n {row.displayName}\n </p>\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":"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"}
|