@sleep2agi/agent-network-dashboard 0.6.3-preview.55 → 0.6.3-preview.57
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_COMMIT +1 -1
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +9 -0
- package/.next/build-manifest.json +3 -3
- package/.next/diagnostics/route-bundle-stats.json +151 -101
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +75 -19
- package/.next/required-server-files.js +4 -4
- package/.next/required-server-files.json +4 -4
- package/.next/routes-manifest.json +63 -0
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_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 +2 -2
- 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/_not-found/__PAGE__.segment.rsc +13 -13
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -3
- package/.next/server/app/admin/page.js.nft.json +1 -1
- package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/server/app/admin.html +2 -2
- package/.next/server/app/admin.rsc +16 -16
- package/.next/server/app/admin.segments/_full.segment.rsc +16 -16
- package/.next/server/app/admin.segments/_tree.segment.rsc +3 -3
- package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +15 -15
- package/.next/server/app/api/anet/host-supervisors/route.js.nft.json +1 -1
- package/.next/server/app/api/anet/node-config/route.js +1 -1
- package/.next/server/app/api/anet/node-config/route.js.nft.json +1 -1
- package/.next/server/app/api/hub/people/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/hub/people/route/build-manifest.json +12 -0
- package/.next/server/app/api/hub/people/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/hub/people/route.js +7 -0
- package/.next/server/app/api/hub/people/route.js.map +5 -0
- package/.next/server/app/api/hub/people/route.js.nft.json +1 -0
- package/.next/server/app/api/hub/people/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/hub/requirements/[id]/checklist/[itemId]/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/hub/requirements/[id]/checklist/[itemId]/route/build-manifest.json +12 -0
- package/.next/server/app/api/hub/requirements/[id]/checklist/[itemId]/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/hub/requirements/[id]/checklist/[itemId]/route.js +7 -0
- package/.next/server/app/api/hub/requirements/[id]/checklist/[itemId]/route.js.map +5 -0
- package/.next/server/app/api/hub/requirements/[id]/checklist/[itemId]/route.js.nft.json +1 -0
- package/.next/server/app/api/hub/requirements/[id]/checklist/[itemId]/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/hub/requirements/[id]/comments/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/hub/requirements/[id]/comments/route/build-manifest.json +12 -0
- package/.next/server/app/api/hub/requirements/[id]/comments/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/hub/requirements/[id]/comments/route.js +7 -0
- package/.next/server/app/api/hub/requirements/[id]/comments/route.js.map +5 -0
- package/.next/server/app/api/hub/requirements/[id]/comments/route.js.nft.json +1 -0
- package/.next/server/app/api/hub/requirements/[id]/comments/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/hub/requirements/[id]/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/hub/requirements/[id]/route/build-manifest.json +12 -0
- package/.next/server/app/api/hub/requirements/[id]/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/hub/requirements/[id]/route.js +7 -0
- package/.next/server/app/api/hub/requirements/[id]/route.js.map +5 -0
- package/.next/server/app/api/hub/requirements/[id]/route.js.nft.json +1 -0
- package/.next/server/app/api/hub/requirements/[id]/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/hub/requirements/events/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/hub/requirements/events/route/build-manifest.json +12 -0
- package/.next/server/app/api/hub/requirements/events/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/hub/requirements/events/route.js +7 -0
- package/.next/server/app/api/hub/requirements/events/route.js.map +5 -0
- package/.next/server/app/api/hub/requirements/events/route.js.nft.json +1 -0
- package/.next/server/app/api/hub/requirements/events/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/hub/requirements/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/hub/requirements/route/build-manifest.json +12 -0
- package/.next/server/app/api/hub/requirements/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/hub/requirements/route.js +7 -0
- package/.next/server/app/api/hub/requirements/route.js.map +5 -0
- package/.next/server/app/api/hub/requirements/route.js.nft.json +1 -0
- package/.next/server/app/api/hub/requirements/route_client-reference-manifest.js +3 -0
- package/.next/server/app/index.html +2 -2
- package/.next/server/app/index.rsc +16 -16
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +15 -15
- package/.next/server/app/index.segments/_full.segment.rsc +16 -16
- package/.next/server/app/index.segments/_tree.segment.rsc +3 -3
- package/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +2 -2
- package/.next/server/app/login.rsc +16 -16
- package/.next/server/app/login.segments/_full.segment.rsc +16 -16
- package/.next/server/app/login.segments/_tree.segment.rsc +3 -3
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +15 -15
- package/.next/server/app/logs/page.js.nft.json +1 -1
- package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/logs.html +2 -2
- package/.next/server/app/logs.rsc +16 -16
- package/.next/server/app/logs.segments/_full.segment.rsc +16 -16
- package/.next/server/app/logs.segments/_tree.segment.rsc +3 -3
- package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +15 -15
- package/.next/server/app/messages/page.js.nft.json +1 -1
- package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
- package/.next/server/app/messages.html +2 -2
- package/.next/server/app/messages.rsc +16 -16
- package/.next/server/app/messages.segments/_full.segment.rsc +16 -16
- package/.next/server/app/messages.segments/_tree.segment.rsc +3 -3
- package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +15 -15
- package/.next/server/app/node/page.js.nft.json +1 -1
- package/.next/server/app/node/page_client-reference-manifest.js +1 -1
- package/.next/server/app/node.html +2 -2
- package/.next/server/app/node.rsc +16 -16
- package/.next/server/app/node.segments/_full.segment.rsc +16 -16
- package/.next/server/app/node.segments/_tree.segment.rsc +3 -3
- package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +15 -15
- package/.next/server/app/nodes/[alias]/page.js.nft.json +1 -1
- package/.next/server/app/nodes/[alias]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/nodes/page.js.nft.json +1 -1
- package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/nodes.html +2 -2
- package/.next/server/app/nodes.rsc +16 -16
- package/.next/server/app/nodes.segments/_full.segment.rsc +16 -16
- package/.next/server/app/nodes.segments/_tree.segment.rsc +3 -3
- package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +15 -15
- package/.next/server/app/org/page/app-paths-manifest.json +3 -0
- package/.next/server/app/org/page/build-manifest.json +20 -0
- package/.next/server/app/org/page/next-font-manifest.json +11 -0
- package/.next/server/app/org/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/org/page/server-reference-manifest.json +4 -0
- package/.next/server/app/org/page.js +13 -0
- package/.next/server/app/org/page.js.map +5 -0
- package/.next/server/app/org/page.js.nft.json +1 -0
- package/.next/server/app/org/page_client-reference-manifest.js +3 -0
- package/.next/server/app/org.html +12 -0
- package/.next/server/app/org.meta +26 -0
- package/.next/server/app/org.rsc +27 -0
- package/.next/server/app/org.segments/_full.segment.rsc +27 -0
- package/.next/server/app/org.segments/_tree.segment.rsc +5 -0
- package/.next/server/app/org.segments/org/__PAGE__.segment.rsc +32 -0
- 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/providers/page.js.nft.json +1 -1
- package/.next/server/app/providers/page_client-reference-manifest.js +1 -1
- package/.next/server/app/providers.html +2 -2
- package/.next/server/app/providers.rsc +16 -16
- package/.next/server/app/providers.segments/_full.segment.rsc +16 -16
- package/.next/server/app/providers.segments/_tree.segment.rsc +3 -3
- package/.next/server/app/providers.segments/providers/__PAGE__.segment.rsc +15 -15
- package/.next/server/app/requirements/[id]/page/app-paths-manifest.json +3 -0
- package/.next/server/app/requirements/[id]/page/build-manifest.json +20 -0
- package/.next/server/app/requirements/[id]/page/next-font-manifest.json +11 -0
- package/.next/server/app/requirements/[id]/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/requirements/[id]/page/server-reference-manifest.json +4 -0
- package/.next/server/app/requirements/[id]/page.js +13 -0
- package/.next/server/app/requirements/[id]/page.js.map +5 -0
- package/.next/server/app/requirements/[id]/page.js.nft.json +1 -0
- package/.next/server/app/requirements/[id]/page_client-reference-manifest.js +3 -0
- package/.next/server/app/requirements/page/app-paths-manifest.json +3 -0
- package/.next/server/app/requirements/page/build-manifest.json +20 -0
- package/.next/server/app/requirements/page/next-font-manifest.json +11 -0
- package/.next/server/app/requirements/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/requirements/page/server-reference-manifest.json +4 -0
- package/.next/server/app/requirements/page.js +13 -0
- package/.next/server/app/requirements/page.js.map +5 -0
- package/.next/server/app/requirements/page.js.nft.json +1 -0
- package/.next/server/app/requirements/page_client-reference-manifest.js +3 -0
- package/.next/server/app/requirements.html +12 -0
- package/.next/server/app/requirements.meta +26 -0
- package/.next/server/app/requirements.rsc +27 -0
- package/.next/server/app/requirements.segments/_full.segment.rsc +27 -0
- package/.next/server/app/requirements.segments/_tree.segment.rsc +5 -0
- package/.next/server/app/requirements.segments/requirements/__PAGE__.segment.rsc +32 -0
- package/.next/server/app/scheduled-tasks/page.js.nft.json +1 -1
- package/.next/server/app/scheduled-tasks/page_client-reference-manifest.js +1 -1
- package/.next/server/app/scheduled-tasks.html +2 -2
- package/.next/server/app/scheduled-tasks.rsc +16 -16
- package/.next/server/app/scheduled-tasks.segments/_full.segment.rsc +16 -16
- package/.next/server/app/scheduled-tasks.segments/_tree.segment.rsc +3 -3
- package/.next/server/app/scheduled-tasks.segments/scheduled-tasks/__PAGE__.segment.rsc +15 -15
- package/.next/server/app/server-logs/page.js.nft.json +1 -1
- package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/server-logs.html +2 -2
- package/.next/server/app/server-logs.rsc +16 -16
- package/.next/server/app/server-logs.segments/_full.segment.rsc +16 -16
- package/.next/server/app/server-logs.segments/_tree.segment.rsc +3 -3
- package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +15 -15
- package/.next/server/app/servers/page.js.nft.json +1 -1
- package/.next/server/app/servers/page_client-reference-manifest.js +1 -1
- package/.next/server/app/servers.html +2 -2
- package/.next/server/app/servers.rsc +16 -16
- package/.next/server/app/servers.segments/_full.segment.rsc +16 -16
- package/.next/server/app/servers.segments/_tree.segment.rsc +3 -3
- package/.next/server/app/servers.segments/servers/__PAGE__.segment.rsc +15 -15
- package/.next/server/app/settings/networks/page.js.nft.json +1 -1
- package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/networks.html +2 -2
- package/.next/server/app/settings/networks.rsc +16 -16
- package/.next/server/app/settings/networks.segments/_full.segment.rsc +16 -16
- package/.next/server/app/settings/networks.segments/_tree.segment.rsc +3 -3
- package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +15 -15
- 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/tokens/page.js.nft.json +1 -1
- package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/tokens.html +2 -2
- package/.next/server/app/settings/tokens.rsc +16 -16
- package/.next/server/app/settings/tokens.segments/_full.segment.rsc +16 -16
- package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +3 -3
- package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +15 -15
- package/.next/server/app/settings.html +2 -2
- package/.next/server/app/settings.rsc +16 -16
- package/.next/server/app/settings.segments/_full.segment.rsc +16 -16
- package/.next/server/app/settings.segments/_tree.segment.rsc +3 -3
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +15 -15
- package/.next/server/app/skillhub/page.js.nft.json +1 -1
- package/.next/server/app/skillhub/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skillhub.html +2 -2
- package/.next/server/app/skillhub.rsc +16 -16
- package/.next/server/app/skillhub.segments/_full.segment.rsc +16 -16
- package/.next/server/app/skillhub.segments/_tree.segment.rsc +3 -3
- package/.next/server/app/skillhub.segments/skillhub/__PAGE__.segment.rsc +15 -15
- package/.next/server/app/tasks/[id]/page.js.nft.json +1 -1
- package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tasks/page.js.nft.json +1 -1
- package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tasks.html +2 -2
- package/.next/server/app/tasks.rsc +16 -16
- package/.next/server/app/tasks.segments/_full.segment.rsc +16 -16
- package/.next/server/app/tasks.segments/_tree.segment.rsc +3 -3
- package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +15 -15
- package/.next/server/app-paths-manifest.json +9 -0
- package/.next/server/chunks/1oeh_server_app_api_hub_requirements_[id]_checklist_[itemId]_route_actions_05mpe5a.js +3 -0
- package/.next/server/chunks/1oeh_server_app_api_hub_requirements_[id]_checklist_[itemId]_route_actions_05mpe5a.js.map +1 -0
- package/.next/server/chunks/1oeh_server_app_api_hub_requirements_[id]_comments_route_actions_1lv4qr1.js +3 -0
- package/.next/server/chunks/1oeh_server_app_api_hub_requirements_[id]_comments_route_actions_1lv4qr1.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0-wvy_a._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0-wvy_a._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__053z4wp._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__053z4wp._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0if0bw1._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0if0bw1._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0liwkmx._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0liwkmx._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0q9xwca._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0q9xwca._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1941b2h._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1941b2h._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1_rzyvn._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1_rzyvn._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1vua9gf._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1vua9gf._.js.map +1 -0
- package/.next/server/chunks/_05lpz54._.js +1 -1
- package/.next/server/chunks/_05lpz54._.js.map +1 -1
- package/.next/server/chunks/_next-internal_server_app_api_hub_people_route_actions_01pw78e.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_hub_people_route_actions_01pw78e.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_hub_requirements_[id]_route_actions_1jkq5c6.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_hub_requirements_[id]_route_actions_1jkq5c6.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_hub_requirements_events_route_actions_1ypnpu5.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_hub_requirements_events_route_actions_1ypnpu5.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_hub_requirements_route_actions_1lyeno6.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_hub_requirements_route_actions_1lyeno6.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0-94ipy._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0-94ipy._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__09n7eih._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__09n7eih._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0ol09h3._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0ol09h3._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__14k36ti._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__14k36ti._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1bn1jjm._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1bn1jjm._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1ovdbox._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1ovdbox._.js.map +1 -1
- package/.next/server/chunks/ssr/_0q4m25o._.js +0 -0
- package/.next/server/chunks/ssr/_0q4m25o._.js.map +1 -1
- package/.next/server/chunks/ssr/_1z1o6o3._.js +0 -0
- package/.next/server/chunks/ssr/_1z1o6o3._.js.map +1 -1
- package/.next/server/chunks/ssr/_next-internal_server_app_org_page_actions_0hbcef1.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_org_page_actions_0hbcef1.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_requirements_[id]_page_actions_1wjoy4l.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_requirements_[id]_page_actions_1wjoy4l.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_requirements_page_actions_0x9m0gy.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_requirements_page_actions_0x9m0gy.js.map +1 -0
- package/.next/server/chunks/ssr/app_05mfyco._.js +3 -0
- package/.next/server/chunks/ssr/app_05mfyco._.js.map +1 -0
- package/.next/server/chunks/ssr/{app_0_s8u96._.js → app_07bzc6w._.js} +1 -1
- package/.next/server/chunks/ssr/app_099f0wg._.js +3 -0
- package/.next/server/chunks/ssr/app_099f0wg._.js.map +1 -0
- package/.next/server/chunks/ssr/{app_1oxcq68._.js → app_0g7oz9w._.js} +1 -1
- package/.next/server/chunks/ssr/app_0iz553k._.js +1 -1
- package/.next/server/chunks/ssr/app_0iz553k._.js.map +1 -1
- package/.next/server/chunks/ssr/app_0los-eu._.js +1 -1
- package/.next/server/chunks/ssr/app_0los-eu._.js.map +1 -1
- package/.next/server/chunks/ssr/{app_0x7s72b._.js → app_0tt2ueo._.js} +2 -2
- package/.next/server/chunks/ssr/app_0tt2ueo._.js.map +1 -0
- package/.next/server/chunks/ssr/{app_081zy6c._.js → app_0ugqkd7._.js} +2 -2
- package/.next/server/chunks/ssr/app_0ugqkd7._.js.map +1 -0
- package/.next/server/chunks/ssr/app_1auk3il._.js +11 -0
- package/.next/server/chunks/ssr/app_1auk3il._.js.map +1 -0
- package/.next/server/chunks/ssr/{app_0o4bxq0._.js → app_1e91uc-._.js} +1 -1
- package/.next/server/chunks/ssr/{app_1psh956._.js → app_1f96aq_._.js} +1 -1
- package/.next/server/chunks/ssr/app_1rma_8a._.js +11 -0
- package/.next/server/chunks/ssr/app_1rma_8a._.js.map +1 -0
- package/.next/server/chunks/ssr/{app_0_dhiwi._.js → app_1ua57bx._.js} +1 -1
- package/.next/server/chunks/ssr/app_components_04a31va._.js +1 -1
- package/.next/server/chunks/ssr/app_components_04a31va._.js.map +1 -1
- package/.next/server/chunks/ssr/{app_lib_10o69j_._.js → app_lib_20-pe_0._.js} +2 -2
- package/.next/server/chunks/ssr/{app_lib_10o69j_._.js.map → app_lib_20-pe_0._.js.map} +1 -1
- package/.next/server/chunks/ssr/app_nodes_NodesView_tsx_1w6_d8p._.js +2 -2
- package/.next/server/chunks/ssr/app_nodes_NodesView_tsx_1w6_d8p._.js.map +1 -1
- package/.next/server/chunks/ssr/app_page_tsx_0pxmutw._.js +1 -1
- package/.next/server/chunks/ssr/app_page_tsx_0pxmutw._.js.map +1 -1
- package/.next/server/chunks/ssr/app_providers_page_tsx_0w7qdkp._.js +1 -1
- package/.next/server/chunks/ssr/app_providers_page_tsx_0w7qdkp._.js.map +1 -1
- package/.next/server/chunks/ssr/app_scheduled-tasks_page_tsx_0xs70_6._.js +1 -1
- package/.next/server/chunks/ssr/app_scheduled-tasks_page_tsx_0xs70_6._.js.map +1 -1
- package/.next/server/chunks/ssr/app_tasks_TasksView_tsx_068vqml._.js +1 -1
- package/.next/server/chunks/ssr/app_tasks_TasksView_tsx_068vqml._.js.map +1 -1
- package/.next/server/functions-config-manifest.json +4 -0
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/middleware.js.nft.json +1 -1
- package/.next/server/next-font-manifest.js +1 -1
- package/.next/server/next-font-manifest.json +12 -0
- package/.next/server/pages/404.html +2 -2
- package/.next/server/pages/500.html +1 -1
- package/.next/server/prefetch-hints.json +28 -0
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/{w9hvPuZKgr_FWvwa8gcX8 → _HZB6K84VKNaxf1K7dqqj}/_clientMiddlewareManifest.js +4 -0
- package/.next/static/chunks/{27b9kqyo7bmdr.js → 08-obrj2goweb.js} +2 -2
- package/.next/static/chunks/{3jjgc6skrbwx_.js → 0cuzbmf4k1kgl.js} +1 -1
- package/.next/static/chunks/0fih4pzed1syn.js +9 -0
- package/.next/static/chunks/0iiu4-g5k8jcq.js +1 -0
- package/.next/static/chunks/{37booeyruo9_l.js → 0iz44n632kw4w.js} +1 -1
- package/.next/static/chunks/0jt-1caejz1jv.js +1 -0
- package/.next/static/chunks/0k-4980o5t7_r.css +1 -0
- package/.next/static/chunks/{2vcrtfhj6hc_2.js → 0nqbg3txyq72t.js} +1 -1
- package/.next/static/chunks/114pblaedlrqs.js +1 -0
- package/.next/static/chunks/1tcaw8g6u6o-4.js +1 -0
- package/.next/static/chunks/1v5-qgib9884o.js +0 -0
- package/.next/static/chunks/{02303d1rbqx74.js → 2-x9r-1t3c1mn.js} +1 -1
- package/.next/static/chunks/{3_ixl_eog1g4p.js → 21djd6ixldlx0.js} +1 -1
- package/.next/static/chunks/2anlzel60my8y.js +2 -0
- package/.next/static/chunks/{0me1-941ysjh6.js → 2aymmcz4h9k0-.js} +1 -1
- package/.next/static/chunks/{326h2ihhnae5a.js → 2gsbf8zv54tds.js} +1 -1
- package/.next/static/chunks/{2501pshuqx52y.js → 2juzvtg9ne4yt.js} +1 -1
- package/.next/static/chunks/3cb3_kcec7bms.js +1 -0
- package/.next/static/chunks/{233p45nuh4m5b.css → 3d-1vk5hzu5rq.css} +2 -2
- package/.next/static/chunks/3shtxab8cmux9.js +1 -0
- package/.next/static/chunks/3u059pjgl4gcw.js +1 -0
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/.next/types/routes.d.ts +11 -2
- package/.next/types/validator.ts +81 -0
- package/.vercel/.env.development.local +2 -0
- package/.vercel/.env.production.local +25 -0
- package/.vercel/README.txt +11 -0
- package/.vercel/output/builds.json +23 -0
- package/.vercel/output/config.json +489 -0
- package/.vercel/output/diagnostics/build-diagnostics.json +6 -0
- package/.vercel/output/diagnostics/cli_traces.json +1 -0
- package/.vercel/output/diagnostics/framework.json +1 -0
- package/.vercel/output/diagnostics/route-bundle-stats.json +245 -0
- package/.vercel/output/diagnostics/trace +2 -0
- package/.vercel/output/diagnostics/trace-build +1 -0
- package/.vercel/output/diagnostics/turbopack +0 -0
- package/.vercel/output/functions/_global-error.prerender-config.json +38 -0
- package/.vercel/output/functions/_global-error.prerender-fallback.html +1 -0
- package/.vercel/output/functions/_global-error.rsc.func/.next/routes-manifest.json +1 -0
- package/.vercel/output/functions/_global-error.rsc.func/.next/server/app-paths-manifest.json +1 -0
- package/.vercel/output/functions/_global-error.rsc.func/.next/server/pages-manifest.json +1 -0
- package/.vercel/output/functions/_global-error.rsc.func/.vc-config.json +807 -0
- package/.vercel/output/functions/_global-error.rsc.func/___next_launcher.cjs +68 -0
- package/.vercel/output/functions/_global-error.rsc.prerender-config.json +38 -0
- package/.vercel/output/functions/_global-error.rsc.prerender-fallback.rsc +15 -0
- package/.vercel/output/functions/_global-error.segments/__PAGE__.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/_global-error.segments/__PAGE__.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/_global-error.segments/_full.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/_global-error.segments/_full.segment.rsc.prerender-fallback.rsc +15 -0
- package/.vercel/output/functions/_global-error.segments/_head.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/_global-error.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
- package/.vercel/output/functions/_global-error.segments/_index.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/_global-error.segments/_index.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/_global-error.segments/_tree.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/_global-error.segments/_tree.segment.rsc.prerender-fallback.rsc +1 -0
- package/.vercel/output/functions/_middleware.func/.vc-config.json +107 -0
- package/.vercel/output/functions/_middleware.func/___next_launcher.cjs +135 -0
- package/.vercel/output/functions/_not-found.prerender-config.json +38 -0
- package/.vercel/output/functions/_not-found.prerender-fallback.html +12 -0
- package/.vercel/output/functions/_not-found.rsc.prerender-config.json +38 -0
- package/.vercel/output/functions/_not-found.rsc.prerender-fallback.rsc +21 -0
- package/.vercel/output/functions/_not-found.segments/_full.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/_not-found.segments/_full.segment.rsc.prerender-fallback.rsc +21 -0
- package/.vercel/output/functions/_not-found.segments/_head.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/_not-found.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
- package/.vercel/output/functions/_not-found.segments/_index.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/_not-found.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
- package/.vercel/output/functions/_not-found.segments/_not-found/__PAGE__.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/_not-found.segments/_not-found/__PAGE__.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/_not-found.segments/_not-found.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/_not-found.segments/_not-found.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/_not-found.segments/_tree.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/_not-found.segments/_tree.segment.rsc.prerender-fallback.rsc +3 -0
- package/.vercel/output/functions/admin.prerender-config.json +37 -0
- package/.vercel/output/functions/admin.prerender-fallback.html +12 -0
- package/.vercel/output/functions/admin.rsc.prerender-config.json +38 -0
- package/.vercel/output/functions/admin.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/admin.segments/_full.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/admin.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/admin.segments/_head.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/admin.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
- package/.vercel/output/functions/admin.segments/_index.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/admin.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
- package/.vercel/output/functions/admin.segments/_tree.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/admin.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/admin.segments/admin/__PAGE__.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/admin.segments/admin/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
- package/.vercel/output/functions/admin.segments/admin.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/admin.segments/admin.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/api/anet/config.func/.next/routes-manifest.json +1 -0
- package/.vercel/output/functions/api/anet/config.func/.next/server/app-paths-manifest.json +1 -0
- package/.vercel/output/functions/api/anet/config.func/.next/server/pages-manifest.json +1 -0
- package/.vercel/output/functions/api/anet/config.func/.vc-config.json +818 -0
- package/.vercel/output/functions/api/anet/config.func/___next_launcher.cjs +68 -0
- package/.vercel/output/functions/index.prerender-config.json +38 -0
- package/.vercel/output/functions/index.prerender-fallback.html +12 -0
- package/.vercel/output/functions/index.rsc.prerender-config.json +38 -0
- package/.vercel/output/functions/index.rsc.prerender-fallback.rsc +25 -0
- package/.vercel/output/functions/index.segments/__PAGE__.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/index.segments/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
- package/.vercel/output/functions/index.segments/_full.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/index.segments/_full.segment.rsc.prerender-fallback.rsc +25 -0
- package/.vercel/output/functions/index.segments/_head.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/index.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
- package/.vercel/output/functions/index.segments/_index.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/index.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
- package/.vercel/output/functions/index.segments/_tree.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/index.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/login.prerender-config.json +37 -0
- package/.vercel/output/functions/login.prerender-fallback.html +6 -0
- package/.vercel/output/functions/login.rsc.prerender-config.json +38 -0
- package/.vercel/output/functions/login.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/login.segments/_full.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/login.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/login.segments/_head.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/login.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
- package/.vercel/output/functions/login.segments/_index.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/login.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
- package/.vercel/output/functions/login.segments/_tree.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/login.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/login.segments/login/__PAGE__.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/login.segments/login/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
- package/.vercel/output/functions/login.segments/login.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/login.segments/login.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/logs.prerender-config.json +37 -0
- package/.vercel/output/functions/logs.prerender-fallback.html +12 -0
- package/.vercel/output/functions/logs.rsc.prerender-config.json +38 -0
- package/.vercel/output/functions/logs.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/logs.segments/_full.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/logs.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/logs.segments/_head.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/logs.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
- package/.vercel/output/functions/logs.segments/_index.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/logs.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
- package/.vercel/output/functions/logs.segments/_tree.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/logs.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/logs.segments/logs/__PAGE__.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/logs.segments/logs/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
- package/.vercel/output/functions/logs.segments/logs.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/logs.segments/logs.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/manifest.webmanifest.func/.next/routes-manifest.json +1 -0
- package/.vercel/output/functions/manifest.webmanifest.func/.next/server/app-paths-manifest.json +1 -0
- package/.vercel/output/functions/manifest.webmanifest.func/.next/server/pages-manifest.json +1 -0
- package/.vercel/output/functions/manifest.webmanifest.func/.vc-config.json +715 -0
- package/.vercel/output/functions/manifest.webmanifest.func/___next_launcher.cjs +68 -0
- package/.vercel/output/functions/manifest.webmanifest.prerender-config.json +38 -0
- package/.vercel/output/functions/manifest.webmanifest.prerender-fallback.body +1 -0
- package/.vercel/output/functions/messages.prerender-config.json +37 -0
- package/.vercel/output/functions/messages.prerender-fallback.html +12 -0
- package/.vercel/output/functions/messages.rsc.prerender-config.json +38 -0
- package/.vercel/output/functions/messages.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/messages.segments/_full.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/messages.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/messages.segments/_head.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/messages.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
- package/.vercel/output/functions/messages.segments/_index.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/messages.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
- package/.vercel/output/functions/messages.segments/_tree.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/messages.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/messages.segments/messages/__PAGE__.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/messages.segments/messages/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
- package/.vercel/output/functions/messages.segments/messages.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/messages.segments/messages.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/node.prerender-config.json +37 -0
- package/.vercel/output/functions/node.prerender-fallback.html +12 -0
- package/.vercel/output/functions/node.rsc.prerender-config.json +38 -0
- package/.vercel/output/functions/node.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/node.segments/_full.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/node.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/node.segments/_head.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/node.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
- package/.vercel/output/functions/node.segments/_index.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/node.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
- package/.vercel/output/functions/node.segments/_tree.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/node.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/node.segments/node/__PAGE__.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/node.segments/node/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
- package/.vercel/output/functions/node.segments/node.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/node.segments/node.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/nodes.prerender-config.json +37 -0
- package/.vercel/output/functions/nodes.prerender-fallback.html +12 -0
- package/.vercel/output/functions/nodes.rsc.prerender-config.json +38 -0
- package/.vercel/output/functions/nodes.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/nodes.segments/_full.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/nodes.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/nodes.segments/_head.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/nodes.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
- package/.vercel/output/functions/nodes.segments/_index.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/nodes.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
- package/.vercel/output/functions/nodes.segments/_tree.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/nodes.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/nodes.segments/nodes/__PAGE__.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/nodes.segments/nodes/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
- package/.vercel/output/functions/nodes.segments/nodes.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/nodes.segments/nodes.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/server-logs.prerender-config.json +37 -0
- package/.vercel/output/functions/server-logs.prerender-fallback.html +12 -0
- package/.vercel/output/functions/server-logs.rsc.prerender-config.json +38 -0
- package/.vercel/output/functions/server-logs.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/server-logs.segments/_full.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/server-logs.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/server-logs.segments/_head.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/server-logs.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
- package/.vercel/output/functions/server-logs.segments/_index.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/server-logs.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
- package/.vercel/output/functions/server-logs.segments/_tree.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/server-logs.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/server-logs.segments/server-logs/__PAGE__.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/server-logs.segments/server-logs/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
- package/.vercel/output/functions/server-logs.segments/server-logs.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/server-logs.segments/server-logs.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/servers.prerender-config.json +37 -0
- package/.vercel/output/functions/servers.prerender-fallback.html +12 -0
- package/.vercel/output/functions/servers.rsc.prerender-config.json +38 -0
- package/.vercel/output/functions/servers.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/servers.segments/_full.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/servers.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/servers.segments/_head.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/servers.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
- package/.vercel/output/functions/servers.segments/_index.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/servers.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
- package/.vercel/output/functions/servers.segments/_tree.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/servers.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/servers.segments/servers/__PAGE__.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/servers.segments/servers/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
- package/.vercel/output/functions/servers.segments/servers.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/servers.segments/servers.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/settings/networks.prerender-config.json +37 -0
- package/.vercel/output/functions/settings/networks.prerender-fallback.html +12 -0
- package/.vercel/output/functions/settings/networks.rsc.prerender-config.json +38 -0
- package/.vercel/output/functions/settings/networks.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/settings/networks.segments/_full.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/settings/networks.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/settings/networks.segments/_head.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/settings/networks.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
- package/.vercel/output/functions/settings/networks.segments/_index.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/settings/networks.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
- package/.vercel/output/functions/settings/networks.segments/_tree.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/settings/networks.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/settings/networks.segments/settings/networks/__PAGE__.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/settings/networks.segments/settings/networks/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
- package/.vercel/output/functions/settings/networks.segments/settings/networks.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/settings/networks.segments/settings/networks.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/settings/networks.segments/settings.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/settings/networks.segments/settings.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/settings/tokens.prerender-config.json +37 -0
- package/.vercel/output/functions/settings/tokens.prerender-fallback.html +12 -0
- package/.vercel/output/functions/settings/tokens.rsc.prerender-config.json +38 -0
- package/.vercel/output/functions/settings/tokens.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/settings/tokens.segments/_full.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/settings/tokens.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/settings/tokens.segments/_head.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/settings/tokens.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
- package/.vercel/output/functions/settings/tokens.segments/_index.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/settings/tokens.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
- package/.vercel/output/functions/settings/tokens.segments/_tree.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/settings/tokens.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
- package/.vercel/output/functions/settings/tokens.segments/settings/tokens.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/settings/tokens.segments/settings/tokens.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/settings/tokens.segments/settings.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/settings/tokens.segments/settings.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/settings.prerender-config.json +37 -0
- package/.vercel/output/functions/settings.prerender-fallback.html +12 -0
- package/.vercel/output/functions/settings.rsc.prerender-config.json +38 -0
- package/.vercel/output/functions/settings.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/settings.segments/_full.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/settings.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/settings.segments/_head.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/settings.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
- package/.vercel/output/functions/settings.segments/_index.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/settings.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
- package/.vercel/output/functions/settings.segments/_tree.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/settings.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/settings.segments/settings/__PAGE__.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/settings.segments/settings/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
- package/.vercel/output/functions/settings.segments/settings.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/settings.segments/settings.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/tasks/[id].func/.next/routes-manifest.json +1 -0
- package/.vercel/output/functions/tasks/[id].func/.next/server/app-paths-manifest.json +1 -0
- package/.vercel/output/functions/tasks/[id].func/.next/server/pages-manifest.json +1 -0
- package/.vercel/output/functions/tasks/[id].func/.vc-config.json +713 -0
- package/.vercel/output/functions/tasks/[id].func/___next_launcher.cjs +68 -0
- package/.vercel/output/functions/tasks.prerender-config.json +37 -0
- package/.vercel/output/functions/tasks.prerender-fallback.html +12 -0
- package/.vercel/output/functions/tasks.rsc.prerender-config.json +38 -0
- package/.vercel/output/functions/tasks.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/tasks.segments/_full.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/tasks.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
- package/.vercel/output/functions/tasks.segments/_head.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/tasks.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
- package/.vercel/output/functions/tasks.segments/_index.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/tasks.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
- package/.vercel/output/functions/tasks.segments/_tree.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/tasks.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/functions/tasks.segments/tasks/__PAGE__.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/tasks.segments/tasks/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
- package/.vercel/output/functions/tasks.segments/tasks.segment.rsc.prerender-config.json +28 -0
- package/.vercel/output/functions/tasks.segments/tasks.segment.rsc.prerender-fallback.rsc +5 -0
- package/.vercel/output/static/404.html +12 -0
- package/.vercel/output/static/404.rsc.json +1 -0
- package/.vercel/output/static/404.segments/_tree.segment.rsc.json +1 -0
- package/.vercel/output/static/500.html +1 -0
- package/.vercel/output/static/500.rsc.json +1 -0
- package/.vercel/output/static/500.segments/_tree.segment.rsc.json +1 -0
- package/.vercel/output/static/_next/__private/trace +2 -0
- package/.vercel/output/static/_next/static/TakLsJFW-DjjhsqoZu3Ok/_buildManifest.js +11 -0
- package/.vercel/output/static/_next/static/TakLsJFW-DjjhsqoZu3Ok/_clientMiddlewareManifest.js +42 -0
- package/.vercel/output/static/_next/static/TakLsJFW-DjjhsqoZu3Ok/_ssgManifest.js +1 -0
- package/.vercel/output/static/_next/static/chunks/00~h525bo.q7f.js +1 -0
- package/.vercel/output/static/_next/static/chunks/01xlw8hd842-c.js +1 -0
- package/.vercel/output/static/_next/static/chunks/0257pdz1-imal.js +2 -0
- package/.vercel/output/static/_next/static/chunks/03~yq9q893hmn.js +1 -0
- package/.vercel/output/static/_next/static/chunks/04uju~n5s9g7..css +1 -0
- package/.vercel/output/static/_next/static/chunks/066jf0nk75nic.css +2 -0
- package/.vercel/output/static/_next/static/chunks/085gdrlppedvd.js +1 -0
- package/.vercel/output/static/_next/static/chunks/0a5rikwbpt8_7.js +4 -0
- package/.vercel/output/static/_next/static/chunks/0b9r.-87w.lvh.js +1 -0
- package/.vercel/output/static/_next/static/chunks/0ced2tacwy8v7.js +1 -0
- package/.vercel/output/static/_next/static/chunks/0e-.zgw81gela.js +31 -0
- package/.vercel/output/static/_next/static/chunks/0gu130fpple04.js +1 -0
- package/.vercel/output/static/_next/static/chunks/0jmypv56.iwft.js +1 -0
- package/.vercel/output/static/_next/static/chunks/0krr-nvdwqdj1.js +1 -0
- package/.vercel/output/static/_next/static/chunks/0mqs00d_9jvzx.js +1 -0
- package/.vercel/output/static/_next/static/chunks/0ore4vqiwv2nx.js +1 -0
- package/.vercel/output/static/_next/static/chunks/0pqt~8bl3ukh4.js +4 -0
- package/.vercel/output/static/_next/static/chunks/0q.t7da_-e4yl.js +4 -0
- package/.vercel/output/static/_next/static/chunks/0q3rj30g1oodv.js +7 -0
- package/.vercel/output/static/_next/static/chunks/0qp3_l.t4nzzq.js +1 -0
- package/.vercel/output/static/_next/static/chunks/0qy1ci2dqfaqg.js +1 -0
- package/.vercel/output/static/_next/static/chunks/0u359llqm1_01.js +1 -0
- package/.vercel/output/static/_next/static/chunks/0u7ftv8celiqa.js +1 -0
- package/.vercel/output/static/_next/static/chunks/0~ijg-d65glam.js +1 -0
- package/.vercel/output/static/_next/static/chunks/14bsg3_-taiw4.js +1 -0
- package/.vercel/output/static/_next/static/chunks/168q2d2bi7swr.js +7 -0
- package/.vercel/output/static/_next/static/chunks/16aqsgrwba4zk.js +1 -0
- package/.vercel/output/static/_next/static/chunks/16tw8s4cce9_x.js +1 -0
- package/.vercel/output/static/_next/static/chunks/turbopack-01f1xs~cq_~si.js +1 -0
- package/.vercel/output/static/_next/static/media/4fa387ec64143e14-s.0wkzw~je483f-.woff2 +0 -0
- package/.vercel/output/static/_next/static/media/53b9e256198e5412-s.0-wfv7uh4i7h9.woff2 +0 -0
- package/.vercel/output/static/_next/static/media/5ce348bf30bf5439-s.0zgw-jeven.3w.woff2 +0 -0
- package/.vercel/output/static/_next/static/media/6306c77e7c8268e4-s.0rhz0arwfsn~5.woff2 +0 -0
- package/.vercel/output/static/_next/static/media/7178b3e590c64307-s.0nx0ww8fni_q3.woff2 +0 -0
- package/.vercel/output/static/_next/static/media/797e433ab948586e-s.p.08e28id.o-okb.woff2 +0 -0
- package/.vercel/output/static/_next/static/media/7d817b4c03b0c5f1-s.0l76wvqk9d84w.woff2 +0 -0
- package/.vercel/output/static/_next/static/media/8a480f0b521d4e75-s.0jzbimsg8vl84.woff2 +0 -0
- package/.vercel/output/static/_next/static/media/bbc41e54d2fcbd21-s.0k4k9394f2q-k.woff2 +0 -0
- package/.vercel/output/static/_next/static/media/caa3a2e1cccd8315-s.p.09~u27dqhyhd6.woff2 +0 -0
- package/.vercel/output/static/_next/static/media/favicon.0x3dzn~oxb6tn.ico +0 -0
- package/.vercel/output/static/_next/static/media/fef07dbb0973bf53-s.12tyk43_3sh9u.woff2 +0 -0
- package/.vercel/output/static/_next/static/not-found.txt +1 -0
- package/.vercel/project.json +16 -0
- package/AGENTS.md +9 -0
- package/CLAUDE.md +1 -0
- package/README.md +1 -0
- package/app/api/anet/host-supervisors/route.ts +63 -2
- package/app/api/anet/node-config/route.ts +145 -168
- package/app/api/hub/people/route.ts +48 -0
- package/app/api/hub/requirements/[id]/checklist/[itemId]/route.ts +54 -0
- package/app/api/hub/requirements/[id]/comments/route.ts +51 -0
- package/app/api/hub/requirements/[id]/route.ts +89 -0
- package/app/api/hub/requirements/events/route.ts +45 -0
- package/app/api/hub/requirements/route.ts +53 -0
- package/app/components/CreateNodeWizard.tsx +7 -2
- package/app/components/HostSupervisorPicker.tsx +76 -29
- package/app/components/NodeLifecycleMenu.tsx +6 -1
- package/app/components/NodeSettingsPanel.tsx +28 -25
- package/app/components/Sidebar.tsx +4 -0
- package/app/components/TaskChatPanel.tsx +6 -6
- package/app/components/TaskDetail.tsx +8 -7
- package/app/components/TaskList.tsx +6 -7
- package/app/components/TopoGraph.tsx +3 -2
- package/app/lib/time.ts +23 -0
- package/app/org/page.tsx +222 -0
- package/app/providers/page.tsx +23 -4
- package/app/requirements/[id]/page.tsx +361 -0
- package/app/requirements/page.tsx +279 -0
- package/app/scheduled-tasks/page.tsx +98 -13
- package/app/settings/networks/page.tsx +9 -1
- package/app/settings/tokens/page.tsx +21 -1
- package/apps/desktop/icon.png +0 -0
- package/bun.lock +1688 -0
- package/electron-builder.json +5 -1
- package/package.json +4 -2
- package/proxy.ts +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0dwa10z._.js +0 -11
- package/.next/server/chunks/ssr/[root-of-the-server]__0dwa10z._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__202xetf._.js +0 -11
- package/.next/server/chunks/ssr/[root-of-the-server]__202xetf._.js.map +0 -1
- package/.next/server/chunks/ssr/app_081zy6c._.js.map +0 -1
- package/.next/server/chunks/ssr/app_0x7s72b._.js.map +0 -1
- package/.next/static/chunks/0pton-t_-fqyu.css +0 -1
- package/.next/static/chunks/0z8vfpga444t1.js +0 -1
- package/.next/static/chunks/2kp8-5cyc-jbg.js +0 -1
- package/.next/static/chunks/2mlxk28w-tx84.js +0 -0
- package/.next/static/chunks/3a53_ky07bdhz.js +0 -9
- package/.next/static/chunks/3im40-b21df3u.js +0 -2
- package/.next/static/chunks/3tnbxlq42_jjv.js +0 -1
- /package/.next/server/chunks/ssr/{app_0_s8u96._.js.map → app_07bzc6w._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{app_0o4bxq0._.js.map → app_0g7oz9w._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{app_1oxcq68._.js.map → app_1e91uc-._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{app_1psh956._.js.map → app_1f96aq_._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{app_0_dhiwi._.js.map → app_1ua57bx._.js.map} +0 -0
- /package/.next/static/{w9hvPuZKgr_FWvwa8gcX8 → _HZB6K84VKNaxf1K7dqqj}/_buildManifest.js +0 -0
- /package/.next/static/{w9hvPuZKgr_FWvwa8gcX8 → _HZB6K84VKNaxf1K7dqqj}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../app/scheduled-tasks/page.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useNetworkId } from '../lib/network-context';\nimport { pinyinMatch, usePinyinReady } from '../lib/pinyin-match';\n\ntype NodeRow = { node_id: string; alias?: string | null; node_name?: string | null; lifecycle_state?: string | null };\n\nconst nodeLabel = (n: NodeRow) => `${n.alias} · ${n.node_id.slice(0, 12)}`;\n\n/** The fleet has ~200 nodes, so the native <select> this replaces meant\n * scrolling a 200-row popup to find one. Type to filter instead — by alias\n * (pinyin and initials work, same helper the node list uses) or by node id,\n * which is the half you can actually paste from a task or a log line. */\nfunction NodePicker({ nodes, value, onChange }: {\n nodes: NodeRow[];\n value: string;\n onChange: (id: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const boxRef = useRef<HTMLDivElement | null>(null);\n const pinyinReady = usePinyinReady();\n\n const selected = nodes.find(n => n.node_id === value);\n const matches = useMemo(() => {\n const q = query.trim();\n if (!q) return nodes;\n return nodes.filter(n =>\n n.node_id.toLowerCase().includes(q.toLowerCase()) ||\n pinyinMatch(n.alias || '', q));\n // pinyinReady is not read here on purpose: it is a re-render trigger for\n // when the dict finishes loading mid-typing, so a query typed before the\n // lazy load lands still re-filters once it does.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [nodes, query, pinyinReady]);\n\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n if (boxRef.current && !boxRef.current.contains(e.target as Node)) setOpen(false);\n };\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') setOpen(false); };\n document.addEventListener('mousedown', onDown);\n document.addEventListener('keydown', onKey);\n return () => {\n document.removeEventListener('mousedown', onDown);\n document.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n return (\n <div className=\"relative mt-1\" ref={boxRef}>\n <input\n data-testid=\"schedule-node-picker-input\"\n value={open ? query : (selected ? nodeLabel(selected) : '')}\n onChange={e => { setQuery(e.target.value); setOpen(true); }}\n onFocus={() => { setQuery(''); setOpen(true); }}\n placeholder=\"搜索节点(别名/拼音/node_id)\"\n className=\"w-full rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\"\n />\n {open && (\n <div\n role=\"listbox\"\n data-testid=\"schedule-node-picker-panel\"\n className=\"absolute z-30 mt-1 max-h-72 w-full overflow-y-auto rounded-lg border border-[var(--border)] bg-[var(--col-inset)] py-1 shadow-lg\"\n >\n {matches.length === 0 ? (\n <div className=\"px-3 py-2 text-sm text-[var(--fg-dim)]\">无匹配节点</div>\n ) : matches.map(n => (\n <button\n key={n.node_id}\n type=\"button\"\n role=\"option\"\n aria-selected={n.node_id === value}\n data-testid=\"schedule-node-option\"\n onClick={() => { onChange(n.node_id); setQuery(''); setOpen(false); }}\n className={`block w-full px-3 py-2 text-left text-sm ${\n n.node_id === value ? 'text-[var(--hl)]' : 'text-[var(--fg)]'\n } hover:bg-[var(--hover-tint)]`}\n >\n {nodeLabel(n)}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\ntype ScheduleSpec =\n | { type: 'once'; run_at: string }\n | { type: 'interval'; every_seconds: number }\n | { type: 'daily'; time: string }\n | { type: 'weekly'; time: string; weekdays: number[] };\ntype ScheduleRow = {\n schedule_id: string;\n name: string;\n target_node_id: string;\n target_alias: string;\n task_content: string;\n priority: string;\n schedule: ScheduleSpec;\n timezone: string;\n misfire_policy?: 'catch_up_once' | 'skip';\n status: 'active' | 'paused' | 'completed' | 'cancelled';\n next_run_at?: string | null;\n last_run_at?: string | null;\n revision: number;\n};\ntype RunRow = { run_id: string; scheduled_for: string; task_id?: string | null; status: string; error_code?: string | null; created_at: string };\ntype IntervalUnit = 'seconds' | 'minutes' | 'hours' | 'days';\n\nconst WEEKDAYS = ['日', '一', '二', '三', '四', '五', '六'];\n\nfunction formatTime(value?: string | null) {\n if (!value) return '—';\n const d = new Date(value);\n return Number.isFinite(d.getTime()) ? d.toLocaleString() : value;\n}\n\nfunction describeSchedule(spec: ScheduleSpec, timezone: string) {\n if (spec.type === 'once') return `单次 · ${formatTime(spec.run_at)}`;\n if (spec.type === 'interval') {\n if (spec.every_seconds % 86400 === 0) return `每 ${spec.every_seconds / 86400} 天`;\n if (spec.every_seconds % 3600 === 0) return `每 ${spec.every_seconds / 3600} 小时`;\n return `每 ${spec.every_seconds / 60} 分钟`;\n }\n if (spec.type === 'daily') return `每天 ${spec.time} · ${timezone}`;\n return `每周 ${spec.weekdays.map(d => WEEKDAYS[d]).join('、')} ${spec.time} · ${timezone}`;\n}\n\nfunction describeMisfire(policy?: ScheduleRow['misfire_policy']) {\n return policy === 'skip' ? '错过后跳过' : '错过后补跑一次';\n}\n\nfunction toLocalDateTimeInput(value: string) {\n const date = new Date(value);\n if (!Number.isFinite(date.getTime())) return '';\n const pad = (part: number) => String(part).padStart(2, '0');\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}`;\n}\n\nfunction intervalFormValue(seconds: number): { every: string; unit: IntervalUnit } {\n if (seconds % 86400 === 0) return { every: String(seconds / 86400), unit: 'days' };\n if (seconds % 3600 === 0) return { every: String(seconds / 3600), unit: 'hours' };\n if (seconds % 60 === 0) return { every: String(seconds / 60), unit: 'minutes' };\n return { every: String(seconds), unit: 'seconds' };\n}\n\nexport default function ScheduledTasksPage() {\n const { networkId } = useNetworkId();\n const [schedules, setSchedules] = useState<ScheduleRow[]>([]);\n const [nodes, setNodes] = useState<NodeRow[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n const [showForm, setShowForm] = useState(false);\n const [editing, setEditing] = useState<ScheduleRow | null>(null);\n const [busy, setBusy] = useState(false);\n const [historyFor, setHistoryFor] = useState<string | null>(null);\n const [runs, setRuns] = useState<RunRow[]>([]);\n\n const [name, setName] = useState('');\n const [targetNodeId, setTargetNodeId] = useState('');\n const [task, setTask] = useState('');\n const [priority, setPriority] = useState('normal');\n const [kind, setKind] = useState<ScheduleSpec['type']>('once');\n const [onceAt, setOnceAt] = useState('');\n const [every, setEvery] = useState('1');\n const [unit, setUnit] = useState<IntervalUnit>('hours');\n const [clock, setClock] = useState('09:00');\n const [weekdays, setWeekdays] = useState<number[]>([1]);\n const [misfirePolicy, setMisfirePolicy] = useState<'catch_up_once' | 'skip'>('catch_up_once');\n const detectedTimezone = useMemo(() => Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC', []);\n const [timezone, setTimezone] = useState(detectedTimezone);\n\n const query = networkId ? `?network_id=${encodeURIComponent(networkId)}` : '';\n const load = useCallback(async () => {\n if (!networkId) {\n setSchedules([]); setNodes([]); setLoading(false); setError('请先在左侧选择一个网络');\n return;\n }\n try {\n const [scheduleRes, nodeRes] = await Promise.all([\n fetch(`/api/hub/scheduled-tasks${query}`, { cache: 'no-store' }),\n fetch(`/api/hub/nodes${query}`, { cache: 'no-store' }),\n ]);\n const scheduleData = await scheduleRes.json();\n const nodeData = await nodeRes.json();\n if (!scheduleRes.ok) throw new Error(scheduleData.message || scheduleData.error || `HTTP ${scheduleRes.status}`);\n if (!nodeRes.ok) throw new Error(nodeData.message || nodeData.error || `HTTP ${nodeRes.status}`);\n setSchedules(scheduleData.schedules || []);\n setNodes((nodeData.nodes || []).filter((n: NodeRow) => n.node_id && n.alias));\n setError('');\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setLoading(false);\n }\n }, [networkId, query]);\n\n useEffect(() => {\n void load();\n const timer = setInterval(load, 10_000);\n return () => clearInterval(timer);\n }, [load]);\n\n const makeSchedule = (): ScheduleSpec => {\n if (kind === 'once') return { type: 'once', run_at: new Date(onceAt).toISOString() };\n if (kind === 'interval') {\n const multiplier = unit === 'seconds' ? 1 : unit === 'minutes' ? 60 : unit === 'hours' ? 3600 : 86400;\n return { type: 'interval', every_seconds: Number(every) * multiplier };\n }\n if (kind === 'daily') return { type: 'daily', time: clock };\n return { type: 'weekly', time: clock, weekdays };\n };\n\n const resetForm = () => {\n setEditing(null); setName(''); setTargetNodeId(''); setTask(''); setPriority('normal');\n setKind('once'); setOnceAt(''); setEvery('1'); setUnit('hours'); setClock('09:00');\n setWeekdays([1]); setMisfirePolicy('catch_up_once'); setTimezone(detectedTimezone);\n };\n\n const openCreate = () => {\n if (showForm && !editing) { setShowForm(false); resetForm(); return; }\n resetForm(); setShowForm(true); setError('');\n };\n\n const openEdit = (row: ScheduleRow) => {\n setEditing(row); setName(row.name); setTargetNodeId(row.target_node_id); setTask(row.task_content);\n setPriority(row.priority); setKind(row.schedule.type); setTimezone(row.timezone);\n setMisfirePolicy(row.misfire_policy || 'catch_up_once');\n if (row.schedule.type === 'once') setOnceAt(toLocalDateTimeInput(row.schedule.run_at));\n if (row.schedule.type === 'interval') {\n const value = intervalFormValue(row.schedule.every_seconds);\n setEvery(value.every); setUnit(value.unit);\n }\n if (row.schedule.type === 'daily') setClock(row.schedule.time);\n if (row.schedule.type === 'weekly') { setClock(row.schedule.time); setWeekdays(row.schedule.weekdays); }\n setShowForm(true); setError('');\n window.scrollTo({ top: 0, behavior: 'smooth' });\n };\n\n const saveSchedule = async () => {\n setBusy(true); setError('');\n try {\n const path = editing\n ? `/api/hub/scheduled-tasks/${encodeURIComponent(editing.schedule_id)}${query}`\n : '/api/hub/scheduled-tasks';\n const res = await fetch(path, {\n method: editing ? 'PATCH' : 'POST', headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n ...(editing ? { revision: editing.revision } : { network_id: networkId }),\n name, target_node_id: targetNodeId, task, priority, timezone,\n misfire_policy: misfirePolicy, schedule: makeSchedule(),\n }),\n });\n const data = await res.json();\n if (res.status === 409 && data.error === 'revision_conflict') {\n setShowForm(false); resetForm(); await load();\n setError('计划已在其他设备更新,已刷新最新内容,请重新编辑。');\n return;\n }\n if (!res.ok) throw new Error(data.message || data.error || `HTTP ${res.status}`);\n setShowForm(false); resetForm();\n await load();\n } catch (e) { setError(e instanceof Error ? e.message : String(e)); }\n finally { setBusy(false); }\n };\n\n const mutate = async (row: ScheduleRow, action: 'toggle' | 'run' | 'cancel') => {\n setBusy(true); setError('');\n try {\n let path = `/api/hub/scheduled-tasks/${encodeURIComponent(row.schedule_id)}${query}`;\n let init: RequestInit;\n if (action === 'run') {\n path = `/api/hub/scheduled-tasks/${encodeURIComponent(row.schedule_id)}/run-now${query}`;\n init = { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{}' };\n } else if (action === 'cancel') init = { method: 'DELETE' };\n else init = { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ revision: row.revision, status: row.status === 'active' ? 'paused' : 'active' }) };\n const res = await fetch(path, init);\n const data = await res.json();\n if (res.status === 409 && data.error === 'revision_conflict') {\n await load(); setError('计划已在其他设备更新,已刷新最新内容,请重试。'); return;\n }\n if (!res.ok) throw new Error(data.message || data.error || `HTTP ${res.status}`);\n await load();\n } catch (e) { setError(e instanceof Error ? e.message : String(e)); }\n finally { setBusy(false); }\n };\n\n const openHistory = async (row: ScheduleRow) => {\n if (historyFor === row.schedule_id) { setHistoryFor(null); return; }\n setHistoryFor(row.schedule_id); setRuns([]);\n const join = query ? `${query}&limit=50` : '?limit=50';\n const res = await fetch(`/api/hub/scheduled-tasks/${encodeURIComponent(row.schedule_id)}/runs${join}`);\n const data = await res.json().catch(() => ({}));\n if (res.ok) setRuns(data.runs || []); else setError(data.error || `HTTP ${res.status}`);\n };\n\n const saveDisabled = busy || !networkId || !name.trim() || !targetNodeId || !task.trim() || !timezone.trim() ||\n (kind === 'once' && !onceAt) || (kind === 'interval' && (!Number.isInteger(Number(every)) || Number(every) < (unit === 'seconds' ? 60 : 1))) ||\n (kind === 'weekly' && weekdays.length === 0);\n\n return (\n <main className=\"mx-auto max-w-6xl px-4 py-8 pb-24 lg:px-8\">\n <div className=\"mb-8 flex items-start justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl font-bold text-[var(--fg)] lg:ml-0 ml-10\">定时任务</h1>\n <p className=\"mt-1 text-sm text-[var(--fg-dim)]\">由 Hub 统一调度;节点只接收普通任务,离线时自动排队。</p>\n </div>\n <button onClick={openCreate} className=\"rounded-lg bg-[var(--hl)] px-4 py-2 text-sm font-semibold text-[var(--bg)] hover:opacity-90\">\n {showForm && !editing ? '收起' : '新建计划'}\n </button>\n </div>\n\n {error && <div className=\"mb-5 rounded-lg border border-[var(--danger)] bg-[var(--hover-tint)] px-4 py-3 text-sm text-[var(--danger)]\">{error}</div>}\n\n {showForm && (\n <section className=\"mb-8 rounded-xl border border-[var(--border)] bg-[var(--bg-secondary)] p-5\">\n <div className=\"mb-4 flex items-center justify-between\"><h2 className=\"font-semibold text-[var(--fg)]\">{editing ? '编辑计划' : '新建计划'}</h2>{editing && <button type=\"button\" onClick={() => { setShowForm(false); resetForm(); }} className=\"text-sm text-[var(--fg-dim)]\">取消编辑</button>}</div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <label className=\"text-sm text-[var(--fg-muted)]\">名称<input value={name} onChange={e => setName(e.target.value)} maxLength={120} className=\"mt-1 w-full rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\" placeholder=\"例如:每日发布巡检\" /></label>\n <div className=\"text-sm text-[var(--fg-muted)]\">执行节点<NodePicker nodes={nodes} value={targetNodeId} onChange={setTargetNodeId} /></div>\n <label className=\"text-sm text-[var(--fg-muted)] md:col-span-2\">任务内容<textarea value={task} onChange={e => setTask(e.target.value)} maxLength={10000} rows={4} className=\"mt-1 w-full rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\" placeholder=\"节点收到的具体任务\" /></label>\n <label className=\"text-sm text-[var(--fg-muted)]\">计划类型<select value={kind} onChange={e => setKind(e.target.value as ScheduleSpec['type'])} className=\"mt-1 w-full rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\"><option value=\"once\">单次</option><option value=\"interval\">固定间隔</option><option value=\"daily\">每天</option><option value=\"weekly\">每周</option></select></label>\n <label className=\"text-sm text-[var(--fg-muted)]\">优先级<select value={priority} onChange={e => setPriority(e.target.value)} className=\"mt-1 w-full rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\"><option value=\"normal\">普通</option><option value=\"high\">高</option><option value=\"low\">低</option></select></label>\n <label className=\"text-sm text-[var(--fg-muted)]\">错过执行<select value={misfirePolicy} onChange={e => setMisfirePolicy(e.target.value as typeof misfirePolicy)} className=\"mt-1 w-full rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\"><option value=\"catch_up_once\">恢复后补跑一次(适合新闻抓取)</option><option value=\"skip\">跳过本次,等待下一周期</option></select><span className=\"mt-1 block text-xs text-[var(--fg-dim)]\">Hub 延迟超过 60 秒才视为错过;补跑最多一次,不会集中重放。</span></label>\n <label className=\"text-sm text-[var(--fg-muted)]\">时区<input value={timezone} onChange={e => setTimezone(e.target.value)} className=\"mt-1 w-full rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\" placeholder=\"Asia/Shanghai\" /><span className=\"mt-1 block text-xs text-[var(--fg-dim)]\">使用 IANA 时区名称,编辑时保留原计划时区。</span></label>\n {kind === 'once' && <label className=\"text-sm text-[var(--fg-muted)]\">执行时间<input type=\"datetime-local\" value={onceAt} onChange={e => setOnceAt(e.target.value)} className=\"mt-1 w-full rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\" /></label>}\n {kind === 'interval' && <div className=\"flex gap-2\"><label className=\"flex-1 text-sm text-[var(--fg-muted)]\">间隔<input type=\"number\" min={unit === 'seconds' ? 60 : 1} value={every} onChange={e => setEvery(e.target.value)} className=\"mt-1 w-full rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\" /></label><label className=\"text-sm text-[var(--fg-muted)]\">单位<select value={unit} onChange={e => setUnit(e.target.value as typeof unit)} className=\"mt-1 rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\"><option value=\"seconds\">秒</option><option value=\"minutes\">分钟</option><option value=\"hours\">小时</option><option value=\"days\">天</option></select></label></div>}\n {(kind === 'daily' || kind === 'weekly') && <label className=\"text-sm text-[var(--fg-muted)]\">时间<input type=\"time\" value={clock} onChange={e => setClock(e.target.value)} className=\"mt-1 w-full rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\" /></label>}\n {kind === 'weekly' && <div className=\"flex flex-wrap items-end gap-2\">{WEEKDAYS.map((day, index) => <button key={day} type=\"button\" onClick={() => setWeekdays(v => v.includes(index) ? v.filter(x => x !== index) : [...v, index].sort())} className={`h-9 w-9 rounded-full text-sm ${weekdays.includes(index) ? 'bg-[var(--hl)] text-[var(--bg)]' : 'bg-[var(--hover-tint)] text-[var(--fg-muted)]'}`}>{day}</button>)}</div>}\n </div>\n <div className=\"mt-5 flex justify-end\"><button disabled={saveDisabled} onClick={saveSchedule} className=\"rounded-lg bg-[var(--hl)] px-5 py-2 text-sm font-semibold text-[var(--bg)] disabled:cursor-not-allowed disabled:opacity-40\">{busy ? '保存中…' : editing ? '保存修改' : '创建'}</button></div>\n </section>\n )}\n\n {loading ? <div className=\"py-20 text-center text-[var(--fg-dim)]\">加载中…</div> : schedules.length === 0 ? (\n <div className=\"rounded-xl border border-dashed border-[var(--border)] py-20 text-center text-[var(--fg-dim)]\">还没有 Hub 定时任务</div>\n ) : <div className=\"space-y-3\">{schedules.map(row => (\n <section key={row.schedule_id} className=\"rounded-xl border border-[var(--border)] bg-[var(--bg-secondary)] p-5\">\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\n <div className=\"min-w-0 flex-1\"><div className=\"flex items-center gap-2\"><h2 className=\"font-semibold text-[var(--fg)]\">{row.name}</h2><span className={`rounded-full bg-[var(--hover-tint)] px-2 py-0.5 text-xs ${row.status === 'active' ? 'text-[var(--success)]' : row.status === 'paused' ? 'text-[var(--warning)]' : 'text-[var(--fg-dim)]'}`}>{row.status}</span></div><p className=\"mt-1 text-sm text-[var(--hl)]\">{row.target_alias}</p><p className=\"mt-2 line-clamp-2 text-sm text-[var(--fg-muted)]\">{row.task_content}</p><p className=\"mt-3 text-xs text-[var(--fg-dim)]\">{describeSchedule(row.schedule, row.timezone)} · {describeMisfire(row.misfire_policy)} · 下次 {formatTime(row.next_run_at)} · 上次 {formatTime(row.last_run_at)}</p></div>\n <div className=\"flex flex-wrap gap-2\"><button disabled={busy || !['active','paused'].includes(row.status)} onClick={() => openEdit(row)} className=\"rounded-md border border-[var(--border)] px-3 py-1.5 text-xs text-[var(--fg-muted)]\">编辑</button><button disabled={busy || !['active','paused'].includes(row.status)} onClick={() => mutate(row, 'toggle')} className=\"rounded-md border border-[var(--border)] px-3 py-1.5 text-xs text-[var(--fg-muted)]\">{row.status === 'active' ? '暂停' : '恢复'}</button><button disabled={busy || row.status === 'cancelled'} onClick={() => mutate(row, 'run')} className=\"rounded-md border border-[var(--hl)] px-3 py-1.5 text-xs text-[var(--hl)]\">立即执行</button><button onClick={() => openHistory(row)} className=\"rounded-md border border-[var(--border)] px-3 py-1.5 text-xs text-[var(--fg-muted)]\">记录</button><button disabled={busy || row.status === 'cancelled'} onClick={() => mutate(row, 'cancel')} className=\"rounded-md border border-[var(--danger)] px-3 py-1.5 text-xs text-[var(--danger)]\">取消</button></div>\n </div>\n {historyFor === row.schedule_id && <div className=\"mt-4 overflow-x-auto border-t border-[var(--border)] pt-4\"><table className=\"w-full text-left text-xs\"><thead className=\"text-[var(--fg-dim)]\"><tr><th className=\"pb-2\">计划时间</th><th>状态</th><th>Task ID</th><th>错误</th></tr></thead><tbody>{runs.map(run => <tr key={run.run_id} className=\"border-t border-[var(--col-hairline)] text-[var(--fg-muted)]\"><td className=\"py-2\">{formatTime(run.scheduled_for)}</td><td>{run.status}</td><td className=\"font-mono\">{run.task_id?.slice(0, 12) || '—'}</td><td className=\"text-[var(--danger)]\">{run.error_code || '—'}</td></tr>)}</tbody></table>{runs.length === 0 && <p className=\"text-[var(--fg-dim)]\">暂无执行记录</p>}</div>}\n </section>\n ))}</div>}\n </main>\n );\n}\n"],"names":["nodeLabel","n","alias","node_id","slice","NodePicker","nodes","value","onChange","open","setOpen","query","setQuery","boxRef","pinyinReady","selected","find","matches","q","trim","filter","toLowerCase","includes","onDown","e","current","contains","target","onKey","key","document","addEventListener","removeEventListener","className","ref","onFocus","placeholder","role","length","map","type","onClick","WEEKDAYS","formatTime","d","Date","Number","isFinite","getTime","toLocaleString","describeSchedule","spec","timezone","run_at","every_seconds","time","weekdays","join","describeMisfire","policy","toLocalDateTimeInput","date","pad","part","String","padStart","getFullYear","getMonth","getDate","getHours","getMinutes","intervalFormValue","seconds","every","unit","ScheduledTasksPage","networkId","schedules","setSchedules","setNodes","loading","setLoading","error","setError","showForm","setShowForm","editing","setEditing","busy","setBusy","historyFor","setHistoryFor","runs","setRuns","name","setName","targetNodeId","setTargetNodeId","task","setTask","priority","setPriority","kind","setKind","onceAt","setOnceAt","setEvery","setUnit","clock","setClock","setWeekdays","misfirePolicy","setMisfirePolicy","detectedTimezone","Intl","DateTimeFormat","resolvedOptions","timeZone","setTimezone","encodeURIComponent","load","scheduleRes","nodeRes","Promise","all","fetch","cache","scheduleData","json","nodeData","ok","Error","message","status","timer","setInterval","clearInterval","makeSchedule","toISOString","multiplier","resetForm","openCreate","openEdit","row","target_node_id","task_content","schedule","misfire_policy","window","scrollTo","top","behavior","saveSchedule","path","schedule_id","res","method","headers","body","JSON","stringify","revision","network_id","data","mutate","action","init","openHistory","catch","saveDisabled","isInteger","maxLength","rows","min","day","index","v","x","sort","disabled","target_alias","next_run_at","last_run_at","run","scheduled_for","task_id","error_code","run_id"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../app/scheduled-tasks/page.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useNetworkId } from '../lib/network-context';\nimport { pinyinMatch, usePinyinReady } from '../lib/pinyin-match';\nimport { isHubTimeStale, relativeAgo } from '../lib/time';\n\ntype NodeRow = { node_id: string; alias?: string | null; node_name?: string | null; lifecycle_state?: string | null; updated_at?: string | null };\n\nconst nodeLabel = (n: NodeRow) => `${n.alias} · ${n.node_id.slice(0, 12)}`;\n\n/** The fleet has ~200 nodes, so the native <select> this replaces meant\n * scrolling a 200-row popup to find one. Type to filter instead — by alias\n * (pinyin and initials work, same helper the node list uses) or by node id,\n * which is the half you can actually paste from a task or a log line. */\nfunction NodePicker({ nodes, value, onChange }: {\n nodes: NodeRow[];\n value: string;\n onChange: (id: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const boxRef = useRef<HTMLDivElement | null>(null);\n const pinyinReady = usePinyinReady();\n\n const selected = nodes.find(n => n.node_id === value);\n const matches = useMemo(() => {\n const q = query.trim();\n if (!q) return nodes;\n return nodes.filter(n =>\n n.node_id.toLowerCase().includes(q.toLowerCase()) ||\n pinyinMatch(n.alias || '', q));\n // pinyinReady is not read here on purpose: it is a re-render trigger for\n // when the dict finishes loading mid-typing, so a query typed before the\n // lazy load lands still re-filters once it does.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [nodes, query, pinyinReady]);\n\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n if (boxRef.current && !boxRef.current.contains(e.target as Node)) setOpen(false);\n };\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') setOpen(false); };\n document.addEventListener('mousedown', onDown);\n document.addEventListener('keydown', onKey);\n return () => {\n document.removeEventListener('mousedown', onDown);\n document.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n // 陈旧的排到后面。原因见 app/lib/time.ts 的 NODE_STALE_MS 注释:\n // 生产上约三分之二的条目是几个月前的死会话,而 lifecycle_state 全是 \"active\",\n // 所以不排序的话,一屏里最先看到的往往都是幽灵。\n // 只降权不隐藏 —— 给一个临时掉线的节点排任务是合法操作,藏起来会让人以为节点没了。\n const ordered = useMemo(() => {\n const stale = (n: NodeRow) => (isHubTimeStale(n.updated_at) ? 1 : 0);\n return [...matches].sort((a, b) => stale(a) - stale(b));\n }, [matches]);\n\n return (\n <div className=\"relative mt-1\" ref={boxRef}>\n <input\n data-testid=\"schedule-node-picker-input\"\n value={open ? query : (selected ? nodeLabel(selected) : '')}\n onChange={e => { setQuery(e.target.value); setOpen(true); }}\n onFocus={() => { setQuery(''); setOpen(true); }}\n placeholder=\"搜索节点(别名/拼音/node_id)\"\n className=\"w-full rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\"\n />\n {open && (\n <div\n role=\"listbox\"\n data-testid=\"schedule-node-picker-panel\"\n className=\"absolute z-30 mt-1 max-h-72 w-full overflow-y-auto rounded-lg border border-[var(--border)] bg-[var(--col-inset)] py-1 shadow-lg\"\n >\n {matches.length === 0 ? (\n <div className=\"px-3 py-2 text-sm text-[var(--fg-dim)]\">无匹配节点</div>\n ) : ordered.map(n => (\n <button\n key={n.node_id}\n type=\"button\"\n role=\"option\"\n aria-selected={n.node_id === value}\n data-testid=\"schedule-node-option\"\n onClick={() => { onChange(n.node_id); setQuery(''); setOpen(false); }}\n className={`block w-full px-3 py-2 text-left text-sm ${\n n.node_id === value ? 'text-[var(--hl)]' : 'text-[var(--fg)]'\n } hover:bg-[var(--hover-tint)]`}\n >\n <span className=\"flex items-baseline justify-between gap-3\">\n <span className={isHubTimeStale(n.updated_at) ? 'text-[var(--fg-dim)]' : ''}>\n {nodeLabel(n)}\n </span>\n {/* 最后活动时间。这是 /api/nodes 里唯一能分辨死活的字段 ——\n lifecycle_state 对三个月没动的节点同样返回 \"active\"(#751)。 */}\n {relativeAgo(n.updated_at) && (\n <span\n data-testid=\"schedule-node-option-lastseen\"\n className={`shrink-0 text-xs tabular-nums ${\n isHubTimeStale(n.updated_at) ? 'text-[var(--fg-dim)]' : 'text-[var(--fg)]'\n }`}\n >\n {relativeAgo(n.updated_at)}\n </span>\n )}\n </span>\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\ntype ScheduleSpec =\n | { type: 'once'; run_at: string }\n | { type: 'interval'; every_seconds: number }\n | { type: 'daily'; time: string }\n | { type: 'weekly'; time: string; weekdays: number[] };\ntype ScheduleRow = {\n schedule_id: string;\n name: string;\n target_node_id: string;\n target_alias: string;\n task_content: string;\n priority: string;\n schedule: ScheduleSpec;\n timezone: string;\n misfire_policy?: 'catch_up_once' | 'skip';\n status: 'active' | 'paused' | 'completed' | 'cancelled';\n next_run_at?: string | null;\n last_run_at?: string | null;\n revision: number;\n};\ntype RunRow = { run_id: string; scheduled_for: string; task_id?: string | null; status: string; error_code?: string | null; created_at: string };\ntype IntervalUnit = 'seconds' | 'minutes' | 'hours' | 'days';\n\nconst WEEKDAYS = ['日', '一', '二', '三', '四', '五', '六'];\n\nfunction formatTime(value?: string | null) {\n if (!value) return '—';\n const d = new Date(value);\n return Number.isFinite(d.getTime()) ? d.toLocaleString() : value;\n}\n\nfunction describeSchedule(spec: ScheduleSpec, timezone: string) {\n if (spec.type === 'once') return `单次 · ${formatTime(spec.run_at)}`;\n if (spec.type === 'interval') {\n if (spec.every_seconds % 86400 === 0) return `每 ${spec.every_seconds / 86400} 天`;\n if (spec.every_seconds % 3600 === 0) return `每 ${spec.every_seconds / 3600} 小时`;\n return `每 ${spec.every_seconds / 60} 分钟`;\n }\n if (spec.type === 'daily') return `每天 ${spec.time} · ${timezone}`;\n return `每周 ${spec.weekdays.map(d => WEEKDAYS[d]).join('、')} ${spec.time} · ${timezone}`;\n}\n\nfunction describeMisfire(policy?: ScheduleRow['misfire_policy']) {\n return policy === 'skip' ? '错过后跳过' : '错过后补跑一次';\n}\n\nfunction toLocalDateTimeInput(value: string) {\n const date = new Date(value);\n if (!Number.isFinite(date.getTime())) return '';\n const pad = (part: number) => String(part).padStart(2, '0');\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}`;\n}\n\nfunction intervalFormValue(seconds: number): { every: string; unit: IntervalUnit } {\n if (seconds % 86400 === 0) return { every: String(seconds / 86400), unit: 'days' };\n if (seconds % 3600 === 0) return { every: String(seconds / 3600), unit: 'hours' };\n if (seconds % 60 === 0) return { every: String(seconds / 60), unit: 'minutes' };\n return { every: String(seconds), unit: 'seconds' };\n}\n\nexport default function ScheduledTasksPage() {\n const { networkId } = useNetworkId();\n const [schedules, setSchedules] = useState<ScheduleRow[]>([]);\n const [nodes, setNodes] = useState<NodeRow[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n const [showForm, setShowForm] = useState(false);\n const [editing, setEditing] = useState<ScheduleRow | null>(null);\n const [busy, setBusy] = useState(false);\n const [historyFor, setHistoryFor] = useState<string | null>(null);\n const [runs, setRuns] = useState<RunRow[]>([]);\n\n const [name, setName] = useState('');\n const [targetNodeId, setTargetNodeId] = useState('');\n const [task, setTask] = useState('');\n const [priority, setPriority] = useState('normal');\n const [kind, setKind] = useState<ScheduleSpec['type']>('once');\n const [onceAt, setOnceAt] = useState('');\n const [every, setEvery] = useState('1');\n const [unit, setUnit] = useState<IntervalUnit>('hours');\n const [clock, setClock] = useState('09:00');\n const [weekdays, setWeekdays] = useState<number[]>([1]);\n const [misfirePolicy, setMisfirePolicy] = useState<'catch_up_once' | 'skip'>('catch_up_once');\n const detectedTimezone = useMemo(() => Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC', []);\n const [timezone, setTimezone] = useState(detectedTimezone);\n\n const query = networkId ? `?network_id=${encodeURIComponent(networkId)}` : '';\n const load = useCallback(async () => {\n if (!networkId) {\n setSchedules([]); setNodes([]); setLoading(false); setError('请先在左侧选择一个网络');\n return;\n }\n try {\n const [scheduleRes, nodeRes] = await Promise.all([\n fetch(`/api/hub/scheduled-tasks${query}`, { cache: 'no-store' }),\n fetch(`/api/hub/nodes${query}`, { cache: 'no-store' }),\n ]);\n const scheduleData = await scheduleRes.json();\n const nodeData = await nodeRes.json();\n if (!scheduleRes.ok) throw new Error(scheduleData.message || scheduleData.error || `HTTP ${scheduleRes.status}`);\n if (!nodeRes.ok) throw new Error(nodeData.message || nodeData.error || `HTTP ${nodeRes.status}`);\n setSchedules(scheduleData.schedules || []);\n setNodes((nodeData.nodes || []).filter((n: NodeRow) => n.node_id && n.alias));\n setError('');\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setLoading(false);\n }\n }, [networkId, query]);\n\n useEffect(() => {\n void load();\n const timer = setInterval(load, 10_000);\n return () => clearInterval(timer);\n }, [load]);\n\n const makeSchedule = (): ScheduleSpec => {\n if (kind === 'once') return { type: 'once', run_at: new Date(onceAt).toISOString() };\n if (kind === 'interval') {\n const multiplier = unit === 'seconds' ? 1 : unit === 'minutes' ? 60 : unit === 'hours' ? 3600 : 86400;\n return { type: 'interval', every_seconds: Number(every) * multiplier };\n }\n if (kind === 'daily') return { type: 'daily', time: clock };\n return { type: 'weekly', time: clock, weekdays };\n };\n\n const resetForm = () => {\n setEditing(null); setName(''); setTargetNodeId(''); setTask(''); setPriority('normal');\n setKind('once'); setOnceAt(''); setEvery('1'); setUnit('hours'); setClock('09:00');\n setWeekdays([1]); setMisfirePolicy('catch_up_once'); setTimezone(detectedTimezone);\n };\n\n const openCreate = () => {\n if (showForm && !editing) { setShowForm(false); resetForm(); return; }\n resetForm(); setShowForm(true); setError('');\n };\n\n const openEdit = (row: ScheduleRow) => {\n setEditing(row); setName(row.name); setTargetNodeId(row.target_node_id); setTask(row.task_content);\n setPriority(row.priority); setKind(row.schedule.type); setTimezone(row.timezone);\n setMisfirePolicy(row.misfire_policy || 'catch_up_once');\n if (row.schedule.type === 'once') setOnceAt(toLocalDateTimeInput(row.schedule.run_at));\n if (row.schedule.type === 'interval') {\n const value = intervalFormValue(row.schedule.every_seconds);\n setEvery(value.every); setUnit(value.unit);\n }\n if (row.schedule.type === 'daily') setClock(row.schedule.time);\n if (row.schedule.type === 'weekly') { setClock(row.schedule.time); setWeekdays(row.schedule.weekdays); }\n setShowForm(true); setError('');\n window.scrollTo({ top: 0, behavior: 'smooth' });\n };\n\n const saveSchedule = async () => {\n setBusy(true); setError('');\n try {\n const path = editing\n ? `/api/hub/scheduled-tasks/${encodeURIComponent(editing.schedule_id)}${query}`\n : '/api/hub/scheduled-tasks';\n const res = await fetch(path, {\n method: editing ? 'PATCH' : 'POST', headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n ...(editing ? { revision: editing.revision } : { network_id: networkId }),\n name, target_node_id: targetNodeId, task, priority, timezone,\n misfire_policy: misfirePolicy, schedule: makeSchedule(),\n }),\n });\n const data = await res.json();\n if (res.status === 409 && data.error === 'revision_conflict') {\n setShowForm(false); resetForm(); await load();\n setError('计划已在其他设备更新,已刷新最新内容,请重新编辑。');\n return;\n }\n if (!res.ok) throw new Error(data.message || data.error || `HTTP ${res.status}`);\n setShowForm(false); resetForm();\n await load();\n } catch (e) { setError(e instanceof Error ? e.message : String(e)); }\n finally { setBusy(false); }\n };\n\n const mutate = async (row: ScheduleRow, action: 'toggle' | 'run' | 'cancel') => {\n // Cancel goes through POST /cancel, not DELETE. Some reverse proxies\n // strip or 405 DELETE, which surfaces as HTML from the proxy layer — and\n // that HTML then blew up `await res.json()` with \"Unexpected token <\",\n // hiding the actual failure from the user. See dispatch task 08342434.\n if (action === 'cancel' && typeof window !== 'undefined' && !window.confirm('确定取消这个定时计划?取消后不能恢复。')) return;\n setBusy(true); setError('');\n try {\n let path = `/api/hub/scheduled-tasks/${encodeURIComponent(row.schedule_id)}${query}`;\n let init: RequestInit;\n if (action === 'run') {\n path = `/api/hub/scheduled-tasks/${encodeURIComponent(row.schedule_id)}/run-now${query}`;\n init = { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{}' };\n } else if (action === 'cancel') {\n path = `/api/hub/scheduled-tasks/${encodeURIComponent(row.schedule_id)}/cancel${query}`;\n init = { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{}' };\n } else init = { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ revision: row.revision, status: row.status === 'active' ? 'paused' : 'active' }) };\n // Parse as text first so an empty body or an HTML error page (from a\n // misbehaving proxy) doesn't throw \"Unexpected token <\" before we ever\n // look at the status code. Empty body ⇒ {}; JSON parse errors surface\n // with the status + first chunk of the body so we know which layer\n // returned the non-JSON.\n type MutateResponse = { error?: string; message?: string; ok?: boolean };\n // 🔴 变量名保持 `res` / `raw`。tests/scheduled-tasks-module.test.mjs:30 那条\n // 契约检查断言的是源码里出现 `await res.text()` 和 `JSON.parse(raw)` ——\n // 我第一版把它们改名成 r / body,行为完全一样,但那条检查当场转红。\n // 正确的处理是改回名字,不是去放宽那条检查:它断言的东西是对的,\n // 我改的只是无关的命名。\n const send = async (p: string, i: RequestInit) => {\n const res = await fetch(p, i);\n const raw = await res.text();\n let parsed: MutateResponse = {};\n if (raw.trim().length > 0) {\n try { parsed = JSON.parse(raw) as MutateResponse; }\n catch {\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${raw.slice(0, 120)}`);\n }\n }\n return { res, data: parsed };\n };\n\n let { res, data } = await send(path, init);\n\n // 🔴 老 hub 上没有 POST /cancel,回落到 DELETE。\n //\n // 服务端那条 POST 路由是 2026-08-18 才进 main 的(commit 40872732\n // \"accept POST /cancel alongside DELETE, both idempotent\")。而当天\n // 已发布的两个通道都早于它:\n // commhub-server@latest = 0.8.8 发布 2026-06-24\n // commhub-server@preview = 0.9.0-preview.29 发布 2026-08-12\n // (核过已发布产物:里面的 `/cancel` 全是注释和标识符里的子串,没有路由。)\n //\n // 所以只发 POST 不留兜底,会让\"取消\"在**今天所有已部署的 hub 上**直接坏掉。\n // 回落只认 404/405(路由不存在 / 方法不允许),不认 5xx —— 5xx 说明路由在、\n // 但服务端出错了,那时重试 DELETE 只会掩盖真正的失败。\n //\n // 两条路径都是幂等的(见上面那个 commit 的标题),所以即使 POST 其实已经\n // 生效、只是因为别的原因返回了 404,再发一次 DELETE 也不会造成二次伤害。\n if (action === 'cancel' && (res.status === 404 || res.status === 405)) {\n const legacyPath = `/api/hub/scheduled-tasks/${encodeURIComponent(row.schedule_id)}${query}`;\n ({ res, data } = await send(legacyPath, { method: 'DELETE' }));\n }\n if (res.status === 409 && data.error === 'revision_conflict') {\n await load(); setError('计划已在其他设备更新,已刷新最新内容,请重试。'); return;\n }\n if (!res.ok) throw new Error(data.message || data.error || `HTTP ${res.status}`);\n await load();\n } catch (e) { setError(e instanceof Error ? e.message : String(e)); }\n finally { setBusy(false); }\n };\n\n const openHistory = async (row: ScheduleRow) => {\n if (historyFor === row.schedule_id) { setHistoryFor(null); return; }\n setHistoryFor(row.schedule_id); setRuns([]);\n const join = query ? `${query}&limit=50` : '?limit=50';\n const res = await fetch(`/api/hub/scheduled-tasks/${encodeURIComponent(row.schedule_id)}/runs${join}`);\n const data = await res.json().catch(() => ({}));\n if (res.ok) setRuns(data.runs || []); else setError(data.error || `HTTP ${res.status}`);\n };\n\n const saveDisabled = busy || !networkId || !name.trim() || !targetNodeId || !task.trim() || !timezone.trim() ||\n (kind === 'once' && !onceAt) || (kind === 'interval' && (!Number.isInteger(Number(every)) || Number(every) < (unit === 'seconds' ? 60 : 1))) ||\n (kind === 'weekly' && weekdays.length === 0);\n\n return (\n <main className=\"mx-auto max-w-6xl px-4 py-8 pb-24 lg:px-8\">\n <div className=\"mb-8 flex items-start justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl font-bold text-[var(--fg)] lg:ml-0 ml-10\">定时任务</h1>\n <p className=\"mt-1 text-sm text-[var(--fg-dim)]\">由 Hub 统一调度;节点只接收普通任务,离线时自动排队。</p>\n </div>\n <button type=\"button\" onClick={openCreate} className=\"rounded-lg bg-[var(--hl)] px-4 py-2 text-sm font-semibold text-[var(--bg)] hover:opacity-90\">\n {showForm && !editing ? '收起' : '新建计划'}\n </button>\n </div>\n\n {error && <div className=\"mb-5 rounded-lg border border-[var(--danger)] bg-[var(--hover-tint)] px-4 py-3 text-sm text-[var(--danger)]\">{error}</div>}\n\n {showForm && (\n <section className=\"mb-8 rounded-xl border border-[var(--border)] bg-[var(--bg-secondary)] p-5\">\n <div className=\"mb-4 flex items-center justify-between\"><h2 className=\"font-semibold text-[var(--fg)]\">{editing ? '编辑计划' : '新建计划'}</h2>{editing && <button type=\"button\" onClick={() => { setShowForm(false); resetForm(); }} className=\"text-sm text-[var(--fg-dim)]\">取消编辑</button>}</div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <label className=\"text-sm text-[var(--fg-muted)]\">名称<input value={name} onChange={e => setName(e.target.value)} maxLength={120} className=\"mt-1 w-full rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\" placeholder=\"例如:每日发布巡检\" /></label>\n <div className=\"text-sm text-[var(--fg-muted)]\">执行节点<NodePicker nodes={nodes} value={targetNodeId} onChange={setTargetNodeId} /></div>\n <label className=\"text-sm text-[var(--fg-muted)] md:col-span-2\">任务内容<textarea value={task} onChange={e => setTask(e.target.value)} maxLength={10000} rows={4} className=\"mt-1 w-full rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\" placeholder=\"节点收到的具体任务\" /></label>\n <label className=\"text-sm text-[var(--fg-muted)]\">计划类型<select value={kind} onChange={e => setKind(e.target.value as ScheduleSpec['type'])} className=\"mt-1 w-full rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\"><option value=\"once\">单次</option><option value=\"interval\">固定间隔</option><option value=\"daily\">每天</option><option value=\"weekly\">每周</option></select></label>\n <label className=\"text-sm text-[var(--fg-muted)]\">优先级<select value={priority} onChange={e => setPriority(e.target.value)} className=\"mt-1 w-full rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\"><option value=\"normal\">普通</option><option value=\"high\">高</option><option value=\"low\">低</option></select></label>\n <label className=\"text-sm text-[var(--fg-muted)]\">错过执行<select value={misfirePolicy} onChange={e => setMisfirePolicy(e.target.value as typeof misfirePolicy)} className=\"mt-1 w-full rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\"><option value=\"catch_up_once\">恢复后补跑一次(适合新闻抓取)</option><option value=\"skip\">跳过本次,等待下一周期</option></select><span className=\"mt-1 block text-xs text-[var(--fg-dim)]\">Hub 延迟超过 60 秒才视为错过;补跑最多一次,不会集中重放。</span></label>\n <label className=\"text-sm text-[var(--fg-muted)]\">时区<input value={timezone} onChange={e => setTimezone(e.target.value)} className=\"mt-1 w-full rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\" placeholder=\"Asia/Shanghai\" /><span className=\"mt-1 block text-xs text-[var(--fg-dim)]\">使用 IANA 时区名称,编辑时保留原计划时区。</span></label>\n {kind === 'once' && <label className=\"text-sm text-[var(--fg-muted)]\">执行时间<input type=\"datetime-local\" value={onceAt} onChange={e => setOnceAt(e.target.value)} className=\"mt-1 w-full rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\" /></label>}\n {kind === 'interval' && <div className=\"flex gap-2\"><label className=\"flex-1 text-sm text-[var(--fg-muted)]\">间隔<input type=\"number\" min={unit === 'seconds' ? 60 : 1} value={every} onChange={e => setEvery(e.target.value)} className=\"mt-1 w-full rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\" /></label><label className=\"text-sm text-[var(--fg-muted)]\">单位<select value={unit} onChange={e => setUnit(e.target.value as typeof unit)} className=\"mt-1 rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\"><option value=\"seconds\">秒</option><option value=\"minutes\">分钟</option><option value=\"hours\">小时</option><option value=\"days\">天</option></select></label></div>}\n {(kind === 'daily' || kind === 'weekly') && <label className=\"text-sm text-[var(--fg-muted)]\">时间<input type=\"time\" value={clock} onChange={e => setClock(e.target.value)} className=\"mt-1 w-full rounded-lg border border-[var(--border)] bg-[var(--col-inset)] px-3 py-2 text-[var(--fg)]\" /></label>}\n {kind === 'weekly' && <div className=\"flex flex-wrap items-end gap-2\">{WEEKDAYS.map((day, index) => <button key={day} type=\"button\" onClick={() => setWeekdays(v => v.includes(index) ? v.filter(x => x !== index) : [...v, index].sort())} className={`h-9 w-9 rounded-full text-sm ${weekdays.includes(index) ? 'bg-[var(--hl)] text-[var(--bg)]' : 'bg-[var(--hover-tint)] text-[var(--fg-muted)]'}`}>{day}</button>)}</div>}\n </div>\n <div className=\"mt-5 flex justify-end\"><button disabled={saveDisabled} onClick={saveSchedule} className=\"rounded-lg bg-[var(--hl)] px-5 py-2 text-sm font-semibold text-[var(--bg)] disabled:cursor-not-allowed disabled:opacity-40\">{busy ? '保存中…' : editing ? '保存修改' : '创建'}</button></div>\n </section>\n )}\n\n {loading ? <div className=\"py-20 text-center text-[var(--fg-dim)]\">加载中…</div> : (() => {\n // Cancelled schedules are terminal — hide them from the default view.\n // Server still stores history for the audit trail, but the list is\n // meant for \"what's on the calendar going forward\", not \"what ever\n // existed\". Users who need the paper trail can consult run history\n // per schedule (record button); a dedicated show-cancelled toggle\n // was out of scope for this fix.\n const visible = schedules.filter(row => row.status !== 'cancelled');\n return visible.length === 0 ? (\n <div className=\"rounded-xl border border-dashed border-[var(--border)] py-20 text-center text-[var(--fg-dim)]\">还没有 Hub 定时任务</div>\n ) : <div className=\"space-y-3\">{visible.map(row => (\n <section key={row.schedule_id} className=\"rounded-xl border border-[var(--border)] bg-[var(--bg-secondary)] p-5\">\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\n <div className=\"min-w-0 flex-1\"><div className=\"flex items-center gap-2\"><h2 className=\"font-semibold text-[var(--fg)]\">{row.name}</h2><span className={`rounded-full bg-[var(--hover-tint)] px-2 py-0.5 text-xs ${row.status === 'active' ? 'text-[var(--success)]' : row.status === 'paused' ? 'text-[var(--warning)]' : 'text-[var(--fg-dim)]'}`}>{row.status}</span></div><p className=\"mt-1 text-sm text-[var(--hl)]\">{row.target_alias}</p><p className=\"mt-2 line-clamp-2 text-sm text-[var(--fg-muted)]\">{row.task_content}</p><p className=\"mt-3 text-xs text-[var(--fg-dim)]\">{describeSchedule(row.schedule, row.timezone)} · {describeMisfire(row.misfire_policy)} · 下次 {formatTime(row.next_run_at)} · 上次 {formatTime(row.last_run_at)}</p></div>\n <div className=\"flex flex-wrap gap-2\"><button type=\"button\" disabled={busy || !['active','paused'].includes(row.status)} onClick={() => openEdit(row)} className=\"rounded-md border border-[var(--border)] px-3 py-1.5 text-xs text-[var(--fg-muted)]\">编辑</button><button type=\"button\" disabled={busy || !['active','paused'].includes(row.status)} onClick={() => mutate(row, 'toggle')} className=\"rounded-md border border-[var(--border)] px-3 py-1.5 text-xs text-[var(--fg-muted)]\">{row.status === 'active' ? '暂停' : '恢复'}</button><button type=\"button\" disabled={busy || row.status === 'cancelled'} onClick={() => mutate(row, 'run')} className=\"rounded-md border border-[var(--hl)] px-3 py-1.5 text-xs text-[var(--hl)]\">立即执行</button><button type=\"button\" onClick={() => openHistory(row)} className=\"rounded-md border border-[var(--border)] px-3 py-1.5 text-xs text-[var(--fg-muted)]\">记录</button><button type=\"button\" disabled={busy || row.status === 'cancelled'} onClick={() => mutate(row, 'cancel')} className=\"rounded-md border border-[var(--danger)] px-3 py-1.5 text-xs text-[var(--danger)]\">取消</button></div>\n </div>\n {historyFor === row.schedule_id && <div className=\"mt-4 overflow-x-auto border-t border-[var(--border)] pt-4\"><table className=\"w-full text-left text-xs\"><thead className=\"text-[var(--fg-dim)]\"><tr><th className=\"pb-2\">计划时间</th><th>状态</th><th>Task ID</th><th>错误</th></tr></thead><tbody>{runs.map(run => <tr key={run.run_id} className=\"border-t border-[var(--col-hairline)] text-[var(--fg-muted)]\"><td className=\"py-2\">{formatTime(run.scheduled_for)}</td><td>{run.status}</td><td className=\"font-mono\">{run.task_id?.slice(0, 12) || '—'}</td><td className=\"text-[var(--danger)]\">{run.error_code || '—'}</td></tr>)}</tbody></table>{runs.length === 0 && <p className=\"text-[var(--fg-dim)]\">暂无执行记录</p>}</div>}\n </section>\n ))}</div>;\n })()}\n </main>\n );\n}\n"],"names":["nodeLabel","n","alias","node_id","slice","NodePicker","nodes","value","onChange","open","setOpen","query","setQuery","boxRef","pinyinReady","selected","find","matches","q","trim","filter","toLowerCase","includes","onDown","e","current","contains","target","onKey","key","document","addEventListener","removeEventListener","ordered","stale","updated_at","sort","a","b","className","ref","onFocus","placeholder","role","length","map","type","onClick","WEEKDAYS","formatTime","d","Date","Number","isFinite","getTime","toLocaleString","describeSchedule","spec","timezone","run_at","every_seconds","time","weekdays","join","describeMisfire","policy","toLocalDateTimeInput","date","pad","part","String","padStart","getFullYear","getMonth","getDate","getHours","getMinutes","intervalFormValue","seconds","every","unit","ScheduledTasksPage","networkId","schedules","setSchedules","setNodes","loading","setLoading","error","setError","showForm","setShowForm","editing","setEditing","busy","setBusy","historyFor","setHistoryFor","runs","setRuns","name","setName","targetNodeId","setTargetNodeId","task","setTask","priority","setPriority","kind","setKind","onceAt","setOnceAt","setEvery","setUnit","clock","setClock","setWeekdays","misfirePolicy","setMisfirePolicy","detectedTimezone","Intl","DateTimeFormat","resolvedOptions","timeZone","setTimezone","encodeURIComponent","load","scheduleRes","nodeRes","Promise","all","fetch","cache","scheduleData","json","nodeData","ok","Error","message","status","timer","setInterval","clearInterval","makeSchedule","toISOString","multiplier","resetForm","openCreate","openEdit","row","target_node_id","task_content","schedule","misfire_policy","window","scrollTo","top","behavior","saveSchedule","path","schedule_id","res","method","headers","body","JSON","stringify","revision","network_id","data","mutate","action","confirm","init","send","p","i","raw","text","parsed","parse","legacyPath","openHistory","catch","saveDisabled","isInteger","maxLength","rows","min","day","index","v","x","disabled","visible","target_alias","next_run_at","last_run_at","run","scheduled_for","task_id","error_code","run_id"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[16177,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(50944),e=a.i(22397),f=a.i(53142),g=a.i(1720),h=a.i(43515),i=a.i(114);function j({tasks:a,selectedId:c,onSelect:d}){return(0,b.jsx)("div",{"data-testid":"task-list-rail",className:"flex flex-col h-full max-h-screen overflow-y-auto",children:0===a.length?(0,b.jsx)("div",{className:"px-4 py-6 text-xs text-gray-600 text-center",children:"没有匹配的任务"}):(0,b.jsx)("ul",{className:"flex flex-col divide-y divide-[#1c1c1f]",children:a.map(a=>{let e=a.task_id===c;return(0,b.jsx)("li",{children:(0,b.jsxs)("button",{type:"button","data-task-row":!0,"data-task-id":a.task_id,"data-selected":e?"true":"false",onClick:()=>d(a.task_id),className:`w-full text-left px-3 py-2.5 transition-colors ${e?"bg-cyan-500/10 border-l-2 border-cyan-500":"border-l-2 border-transparent hover:bg-[#1c1c1f]/40"}`,children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 mb-1",children:[(0,b.jsx)("span",{"aria-hidden":!0,className:"inline-block w-1.5 h-1.5 rounded-full shrink-0",style:{backgroundColor:i.STATUS_DOT_HEX[a.status]||"#6b7280"}}),(0,b.jsx)("span",{className:`text-[10px] px-1.5 py-0.5 rounded border ${i.STATUS_CHIP_CLASS[a.status]||"bg-gray-500/10 text-gray-400 border-gray-500/20"}`,children:a.status}),"high"===a.priority&&(0,b.jsx)("span",{className:"text-[10px] text-red-400 shrink-0",children:"HIGH"}),(0,b.jsx)("span",{className:"ml-auto text-[10px] text-gray-600 tabular-nums shrink-0",children:function(a){if(!a)return"--";let b=Math.floor((Date.now()-new Date(a.replace(" ","T")+"Z").getTime())/1e3);return b<60?`${b}s`:b<3600?`${Math.floor(b/60)}m`:b<86400?`${Math.floor(b/3600)}h`:`${Math.floor(b/86400)}d`}(a.created_at)})]}),(0,b.jsxs)("div",{className:"flex items-center gap-1 text-xs text-gray-300 min-w-0 mb-1",children:[a.from_name&&(0,b.jsx)(g.AliasAvatar,{alias:a.from_name,size:14}),(0,b.jsx)("span",{className:"truncate max-w-[35%]",children:a.from_name||"--"}),(0,b.jsx)("span",{className:"text-gray-600 shrink-0",children:"→"}),a.to_name&&(0,b.jsx)(g.AliasAvatar,{alias:a.to_name,size:14}),(0,b.jsx)("span",{className:"truncate max-w-[35%]",children:a.to_name||"--"})]}),(0,b.jsx)("div",{className:"text-[11px] text-gray-500 line-clamp-2 leading-snug",title:a.content,children:(0,h.previewContent)(a.content)||(0,b.jsx)("span",{className:"italic",children:"(no content)"})})]})},a.task_id)})})})}var k=a.i(72596);function l(a){if(!a)return"--";let b=Math.floor((Date.now()-new Date(a.replace(" ","T")+"Z").getTime())/1e3);return b<60?`${b}s ago`:b<3600?`${Math.floor(b/60)}m ago`:b<86400?`${Math.floor(b/3600)}h ago`:`${Math.floor(b/86400)}d ago`}let m=async a=>{let b=await fetch(a);if(401===b.status)throw window.location.assign("/login"),Error("unauthorized");return b.json()};function n({taskId:a,onClose:d,onRetried:e}){var f;let{data:h,isLoading:j,error:o,mutate:p}=(0,k.default)(`/api/hub/tasks?task_id=${encodeURIComponent(a)}`,m,{refreshInterval:5e3}),{data:q}=(0,k.default)(`/api/hub/task-events?task_id=${encodeURIComponent(a)}&limit=50`,m,{refreshInterval:1e4}),[r,s]=(0,c.useState)(!1),t=h?.tasks?.[0],u=q?.events||[],v=async()=>{if(t){s(!0);try{await fetch("/api/hub/send",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({alias:t.to_name,task:t.content,priority:t.priority,...t.network_id?{network_id:t.network_id}:{}})}),p(),e?.()}finally{s(!1)}}},w=t?[{label:"Created",time:t.created_at,color:"text-gray-400"},{label:"Delivered",time:t.delivered_at,color:"text-blue-400"},{label:"Started",time:t.started_at,color:"text-green-400"},{label:"Completed",time:t.completed_at,color:"text-purple-400"}]:[];return(0,b.jsxs)("div",{"data-testid":"task-detail-pane","data-task-id":a,"data-poll-task-ms":String(5e3),"data-poll-events-ms":String(1e4),className:"flex flex-col h-full max-h-screen overflow-hidden",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between px-4 py-3 border-b border-[#1c1c1f]",children:[(0,b.jsxs)("div",{className:"min-w-0 flex-1 flex items-center gap-2",children:[(0,b.jsxs)("div",{className:"text-xs text-gray-500 truncate",title:a,children:[(0,b.jsx)("span",{className:"text-gray-600",children:"Task ID:"})," ",(0,b.jsxs)("span",{className:"font-mono",children:[a.slice(0,12),"…"]})]}),t&&(0,b.jsx)("span",{"data-testid":"task-detail-status",className:`text-xs px-2 py-0.5 rounded-md border ${i.STATUS_CHIP_CLASS[t.status]||"bg-gray-500/10 text-gray-400 border-gray-500/20"}`,children:t.status})]}),d&&(0,b.jsx)("button",{type:"button",onClick:d,"aria-label":"Close detail (返回 tasks 列表)","data-testid":"task-detail-close",className:"shrink-0 rounded-md border border-[#26262b] px-2 py-1 text-xs text-gray-400 hover:text-white hover:border-[#3a3a41]",children:"←"})]}),(0,b.jsxs)("div",{className:"flex-1 overflow-y-auto px-4 py-4 space-y-4",children:[j&&!t&&(0,b.jsxs)("div",{className:"animate-pulse space-y-3",children:[(0,b.jsx)("div",{className:"h-6 w-1/3 bg-gray-800/40 rounded"}),(0,b.jsx)("div",{className:"h-24 bg-gray-800/40 rounded"}),(0,b.jsx)("div",{className:"h-24 bg-gray-800/40 rounded"})]}),o&&(0,b.jsx)("div",{className:"bg-red-900/20 border border-red-800/40 text-red-300 px-3 py-2 rounded text-sm",children:o instanceof Error?o.message:"fetch failed"}),!j&&!o&&!t&&(0,b.jsx)("div",{className:"text-gray-400 text-sm",children:"Task not found"}),t&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("section",{"data-testid":"task-detail-timeline","data-block":"timeline",className:"bg-[#161618] border border-[#26262b] rounded-xl p-4",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Timeline"}),(0,b.jsx)("div",{className:"relative",children:w.map((a,c)=>{let d=!!a.time,e=c===w.length-1;return(0,b.jsxs)("div",{"data-testid":`timeline-step-${a.label.toLowerCase()}`,"data-timeline-step":a.label.toLowerCase(),"data-timeline-done":d?"true":"false",className:"flex gap-3 pb-4 last:pb-0",children:[(0,b.jsxs)("div",{className:"flex flex-col items-center",children:[(0,b.jsx)("div",{className:`w-3 h-3 rounded-full border-2 shrink-0 ${d?`${a.color} border-current`:"border-gray-700 bg-transparent"}`}),!e&&(0,b.jsx)("div",{className:`w-0.5 flex-1 mt-1 ${d&&w[c+1]?.time?"bg-cyan-500/40":"bg-gray-800"}`})]}),(0,b.jsxs)("div",{className:"min-w-0 -mt-0.5",children:[(0,b.jsx)("div",{className:`text-sm font-medium ${d?"text-gray-200":"text-gray-600"}`,children:a.label}),(0,b.jsx)("div",{className:"text-xs text-gray-500",title:a.time||void 0,children:a.time?`${l(a.time)} — ${a.time}`:"Pending"})]})]},a.label)})})]}),(0,b.jsxs)("section",{"data-testid":"task-detail-info","data-block":"info",className:"bg-[#161618] border border-[#26262b] rounded-xl p-4",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-3",children:"Info"}),(0,b.jsx)("div",{className:"space-y-2 text-xs",children:[["Task ID",t.task_id],["From",t.from_name],["To",t.to_name],["Priority",t.priority],["Status",t.status],["Expires",t.expires_at]].map(([a,c])=>(0,b.jsxs)("div",{className:"flex justify-between gap-4",children:[(0,b.jsx)("span",{className:"text-gray-500 shrink-0",children:a}),(0,b.jsx)("span",{"data-info-field":String(a).toLowerCase().replace(/\s+/g,"-"),className:"text-gray-300 truncate max-w-[240px] text-right",title:String(c||""),children:String(c||"--")})]},a))}),(0,b.jsxs)("div",{className:"mt-4 pt-3 border-t border-[#1c1c1f] flex items-center gap-2 text-sm text-gray-300","data-testid":"task-detail-participants",children:[t.from_name&&(0,b.jsx)(g.AliasAvatar,{alias:t.from_name,size:20}),(0,b.jsx)("span",{className:"truncate",children:t.from_name||"--"}),(0,b.jsx)("span",{className:"text-gray-600 shrink-0",children:"→"}),t.to_name&&(0,b.jsx)(g.AliasAvatar,{alias:t.to_name,size:20}),(0,b.jsx)("span",{className:"truncate",children:t.to_name||"--"})]}),(0,b.jsx)("div",{className:"mt-2 text-[10px]",children:(0,b.jsxs)("span",{className:"high"===(f=t.priority)?"text-red-400":"low"===f?"text-gray-600":"text-gray-400","data-testid":"task-detail-priority",children:["Priority: ",t.priority||"normal"]})})]}),(0,b.jsxs)("section",{"data-testid":"task-detail-content","data-block":"content",className:"bg-[#161618] border border-[#26262b] rounded-xl p-4",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-2",children:"Content"}),(0,b.jsx)("pre",{"data-testid":"task-detail-content-body",className:"text-xs text-gray-200 whitespace-pre-wrap break-words bg-[#0e0e10] rounded-lg px-3 py-2 border border-[#1c1c1f] max-h-64 overflow-y-auto font-sans",children:t.content||"--"})]}),t.result&&(0,b.jsxs)("section",{"data-testid":"task-detail-result","data-block":"result",className:"bg-[#161618] border border-[#26262b] rounded-xl p-4",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-2",children:"Result"}),(0,b.jsx)("pre",{"data-testid":"task-detail-result-body",className:"text-xs text-gray-200 whitespace-pre-wrap break-words bg-[#0e0e10] rounded-lg px-3 py-2 border border-[#1c1c1f] max-h-64 overflow-y-auto font-sans",children:t.result})]}),(0,b.jsxs)("section",{"data-testid":"task-detail-events","data-block":"events","data-events-count":u.length,className:"bg-[#161618] border border-[#26262b] rounded-xl p-4",children:[(0,b.jsxs)("h2",{className:"text-sm font-semibold text-gray-300 mb-3",children:["Events ",u.length>0&&(0,b.jsxs)("span",{className:"text-gray-500",children:["(",u.length,")"]})]}),0===u.length?(0,b.jsx)("div",{className:"text-xs text-gray-600 italic",children:"No events yet."}):(0,b.jsx)("div",{className:"space-y-2 max-h-64 overflow-y-auto",children:u.map((a,c)=>(0,b.jsxs)("div",{"data-testid":"task-detail-event-row",className:"flex items-start gap-2 text-xs",children:[(0,b.jsx)("span",{"aria-hidden":!0,className:`mt-1.5 w-1.5 h-1.5 rounded-full shrink-0 ${"running"===a.to_status?"bg-green-400":"replied"===a.to_status?"bg-purple-400":"failed"===a.to_status?"bg-red-400":"bg-blue-400"}`}),(0,b.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 min-w-0",children:[(0,b.jsx)("span",{"data-testid":"task-event-label",className:"text-gray-300 font-medium truncate",children:a.event_type?.trim()||a.to_status?.trim()||"event"}),a.from_status&&(0,b.jsxs)("span",{className:"text-gray-600 shrink-0",children:[a.from_status," → ",a.to_status]}),a.actor&&(0,b.jsxs)("span",{"data-testid":"task-event-actor",className:"text-gray-500 truncate",children:["by ",a.actor]})]}),a.detail&&(0,b.jsx)("div",{"data-testid":"task-event-detail",className:"mt-0.5 text-[11px] text-gray-500 break-words",children:a.detail}),(a.event_type?.startsWith("task.stale.")??!1)&&(0,b.jsx)("div",{"data-testid":"task-event-stale-context",className:"mt-0.5 text-[10px] text-amber-500/80 break-words",children:"Informational delivery observation; tasks that do not require a reply may also appear here."})]}),(0,b.jsx)("span",{className:"text-gray-600 ml-auto shrink-0",title:a.created_at,children:l(a.created_at)})]},a.id??c))})]}),("failed"===t.status||"expired"===t.status)&&(0,b.jsx)("div",{children:(0,b.jsx)("button",{onClick:v,disabled:r,"data-testid":"task-detail-retry",className:"text-xs text-orange-400 hover:text-orange-300 px-3 py-1.5 rounded-md border border-orange-500/30 hover:bg-orange-500/10 disabled:opacity-50 disabled:cursor-wait",children:r?"Retrying…":"Retry task"})})]})]})]})}let o="(min-width: 768px)";function p(a){let b=window.matchMedia(o);return b.addEventListener("change",a),()=>b.removeEventListener("change",a)}function q(a){try{return decodeURIComponent(a)}catch{return a}}function r({initialSelectedId:a=null}){let g=(0,d.useSearchParams)(),{networkId:h}=(0,e.useNetworkId)(),[k,l]=(0,c.useState)([]),[m,s]=(0,c.useState)(0),[t,u]=(0,c.useState)(!0),[v,w]=(0,c.useState)(""),[x,y]=(0,c.useState)(g.get("status")||""),[z,A]=(0,c.useState)(g.get("from_name")||""),[B,C]=(0,c.useState)(g.get("to_name")||""),[D,E]=(0,c.useState)(a),F=(0,c.useSyncExternalStore)(p,()=>window.matchMedia(o).matches,()=>!0),G=()=>{E(null);try{window.history.pushState({},"","/tasks")}catch{}};(0,c.useEffect)(()=>{let a=()=>{let a=window.location.pathname.match(/^\/tasks\/([^/]+)\/?$/);E(a?q(a[1]):null)};return window.addEventListener("popstate",a),()=>window.removeEventListener("popstate",a)},[]);let H=(0,c.useCallback)(async()=>{try{let a=new URLSearchParams;h&&a.set("network_id",h),x&&a.set("status",x),z&&a.set("from_name",z),B&&a.set("to_name",B),a.set("limit","100");let b=await fetch(`/api/hub/tasks?${a.toString()}`);if(401===b.status)return void window.location.assign("/login");let c=await b.json();l(c.tasks||[]),s(c.count??(c.tasks?.length||0)),w("")}catch(a){w(a instanceof Error?a.message:"fetch failed")}finally{u(!1)}},[x,z,B,h]);(0,c.useEffect)(()=>{u(!0),H();let a=setInterval(H,5e3);return()=>clearInterval(a)},[H]);let I={};k.forEach(a=>{I[a.status]=(I[a.status]||0)+1});let J=k.length||1,K=i.TASK_STATUSES.map(a=>({key:a,color:i.STATUS_BAR_CLASS[a]})).filter(a=>I[a.key]);return(0,b.jsxs)("div",{"data-testid":"tasks-layout","data-selected-id":D??"",className:"min-h-screen max-w-full overflow-x-hidden bg-[#0b0b0d] text-gray-100 flex",children:[(0,b.jsxs)("aside",{"data-testid":"task-list-column",className:`flex flex-col w-full sm:w-[380px] shrink-0 min-h-screen sticky top-0 border-r border-[#1c1c1f] ${D&&!F?"hidden":"flex"}`,children:[(0,b.jsxs)("div",{className:"px-4 py-3 border-b border-[#1c1c1f]",children:[(0,b.jsxs)("div",{className:"flex items-center gap-3 mb-3",children:[(0,b.jsx)("h1",{className:"text-xl font-bold text-white lg:ml-0 ml-10",children:"Tasks"}),k.length<m&&(0,b.jsxs)("span",{className:"text-xs bg-blue-900/30 text-blue-400 px-2 py-0.5 rounded-full border border-blue-800/30 tabular-nums",title:`Showing ${k.length} of ${m} tasks`,children:[k.length," / ",m]})]}),k.length>0&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("div",{className:"anet-tabstrip-wrap mb-2",children:(0,b.jsx)("div",{className:"anet-tabstrip flex flex-wrap gap-1 bg-[#161618] rounded-lg border border-[#26262b] p-1 overflow-x-auto scrollbar-thin",children:["",...i.TASK_STATUSES].map(a=>{let c=""===a?k.length:I[a]||0,d=x===a;return(0,b.jsxs)("button",{onClick:()=>y(a),disabled:0===c&&""!==a&&!d,className:`px-2.5 py-1 rounded-md text-xs transition-colors flex items-center gap-1 shrink-0 whitespace-nowrap disabled:opacity-30 disabled:cursor-not-allowed ${d?`${i.STATUS_CHIP_CLASS[a]||"bg-cyan-500/10 text-cyan-300 border-cyan-500/20"} border`:"text-gray-500 hover:text-gray-300 hover:bg-[#1c1c1f]/40"}`,children:[a&&(0,b.jsx)("span",{"aria-hidden":!0,className:"inline-block w-1.5 h-1.5 rounded-full shrink-0",style:{backgroundColor:i.STATUS_DOT_HEX[a]||"#6b7280"}}),(0,b.jsx)("span",{children:a||"All"}),(0,b.jsx)("span",{className:`text-[10px] tabular-nums ${d?"opacity-80":"text-gray-600"}`,children:c})]},a||"all")})})}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5 mb-2",children:[(0,b.jsxs)("div",{className:"flex items-center gap-1 rounded border border-[#26262b] bg-[#161618] px-2 py-1 focus-within:border-blue-500/40",children:[(0,b.jsx)("span",{className:"text-[9px] uppercase tracking-wide text-gray-600",children:"From"}),(0,b.jsx)("input",{type:"text",value:z,onChange:a=>A(a.target.value),placeholder:"any","data-testid":"tasks-filter-from",className:"w-16 bg-transparent text-xs text-white placeholder-gray-700 focus:outline-none"})]}),(0,b.jsxs)("div",{className:"flex items-center gap-1 rounded border border-[#26262b] bg-[#161618] px-2 py-1 focus-within:border-blue-500/40",children:[(0,b.jsx)("span",{className:"text-[9px] uppercase tracking-wide text-gray-600",children:"To"}),(0,b.jsx)("input",{type:"text",value:B,onChange:a=>C(a.target.value),placeholder:"any","data-testid":"tasks-filter-to",className:"w-16 bg-transparent text-xs text-white placeholder-gray-700 focus:outline-none"})]}),(x||z||B)&&(0,b.jsx)("button",{type:"button",onClick:()=>{y(""),A(""),C("")},className:"rounded border border-gray-700 px-2 py-0.5 text-[10px] text-gray-500 hover:text-gray-200 hover:border-gray-600",children:"Clear"})]}),!x&&K.length>0&&(0,b.jsx)("div",{className:"flex h-1 rounded-full overflow-hidden bg-gray-800",children:K.map(a=>(0,b.jsx)("div",{className:a.color,style:{width:`${I[a.key]/J*100}%`},title:`${a.key}: ${I[a.key]}`},a.key))})]}),v&&(0,b.jsx)("div",{className:"bg-red-900/20 border border-red-800/40 text-red-300 px-3 py-1.5 rounded mt-2 text-xs",children:v})]}),(0,b.jsx)("div",{className:"flex-1 min-h-0 overflow-y-auto",children:t?(0,b.jsx)("div",{className:"animate-pulse space-y-1 px-3 py-2",children:[1,2,3,4,5,6,7,8].map(a=>(0,b.jsx)("div",{className:"h-14 bg-gray-800/40 rounded"},a))}):0===k.length?(0,b.jsx)("div",{className:"px-3 py-6",children:(0,b.jsx)(f.EmptyState,{variant:"tasks",sub:x||z||B?"No tasks match the current filters. Try clearing them.":"Tasks will appear here when agents send them via CommHub."})}):(0,b.jsx)(j,{tasks:k,selectedId:D,onSelect:a=>{E(a);try{window.history.pushState({},"",`/tasks/${encodeURIComponent(a)}`)}catch{}}})})]}),D&&F&&(0,b.jsx)("section",{"data-testid":"task-detail-column",className:"flex-1 min-w-0 min-h-screen",children:(0,b.jsx)(n,{taskId:D,onClose:G,onRetried:H})}),D&&!F&&(0,b.jsx)("section",{"data-testid":"task-detail-mobile",className:"fixed inset-0 z-40 bg-[#0b0b0d]",children:(0,b.jsx)(n,{taskId:D,onClose:G,onRetried:H})}),!D&&F&&(0,b.jsx)("section",{"data-testid":"task-detail-empty",className:"flex-1 min-w-0 min-h-screen flex items-center justify-center text-sm text-gray-600",children:"请从左侧列表选择一条任务查看详情"})]})}a.s(["TasksView",0,function({initialSelectedId:a=null}){return(0,b.jsx)(c.Suspense,{fallback:(0,b.jsx)("div",{className:"min-h-screen bg-[#0b0b0d] text-gray-100 p-4 sm:p-6",children:(0,b.jsx)("div",{className:"lg:ml-0 ml-10 text-gray-500 text-sm",children:"Loading tasks…"})}),children:(0,b.jsx)(r,{initialSelectedId:a})})},"decodeIdSegment",0,q],16177)}];
|
|
1
|
+
module.exports=[16177,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(50944),e=a.i(22397),f=a.i(53142),g=a.i(1720),h=a.i(89706),i=a.i(43515),j=a.i(114);function k({tasks:a,selectedId:c,onSelect:d}){return(0,b.jsx)("div",{"data-testid":"task-list-rail",className:"flex flex-col h-full max-h-screen overflow-y-auto",children:0===a.length?(0,b.jsx)("div",{className:"px-4 py-6 text-xs text-gray-600 text-center",children:"没有匹配的任务"}):(0,b.jsx)("ul",{className:"flex flex-col divide-y divide-[#1c1c1f]",children:a.map(a=>{var e;let f,k=a.task_id===c;return(0,b.jsx)("li",{children:(0,b.jsxs)("button",{type:"button","data-task-row":!0,"data-task-id":a.task_id,"data-selected":k?"true":"false",onClick:()=>d(a.task_id),className:`w-full text-left px-3 py-2.5 transition-colors ${k?"bg-cyan-500/10 border-l-2 border-cyan-500":"border-l-2 border-transparent hover:bg-[#1c1c1f]/40"}`,children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 mb-1",children:[(0,b.jsx)("span",{"aria-hidden":!0,className:"inline-block w-1.5 h-1.5 rounded-full shrink-0",style:{backgroundColor:j.STATUS_DOT_HEX[a.status]||"#6b7280"}}),(0,b.jsx)("span",{className:`text-[10px] px-1.5 py-0.5 rounded border ${j.STATUS_CHIP_CLASS[a.status]||"bg-gray-500/10 text-gray-400 border-gray-500/20"}`,children:a.status}),"high"===a.priority&&(0,b.jsx)("span",{className:"text-[10px] text-red-400 shrink-0",children:"HIGH"}),(0,b.jsx)("span",{className:"ml-auto text-[10px] text-gray-600 tabular-nums shrink-0",children:(e=a.created_at,null===(f=(0,h.relativeAgo)(e))?"--":f.replace(/ ago$/,""))})]}),(0,b.jsxs)("div",{className:"flex items-center gap-1 text-xs text-gray-300 min-w-0 mb-1",children:[a.from_name&&(0,b.jsx)(g.AliasAvatar,{alias:a.from_name,size:14}),(0,b.jsx)("span",{className:"truncate max-w-[35%]",children:a.from_name||"--"}),(0,b.jsx)("span",{className:"text-gray-600 shrink-0",children:"→"}),a.to_name&&(0,b.jsx)(g.AliasAvatar,{alias:a.to_name,size:14}),(0,b.jsx)("span",{className:"truncate max-w-[35%]",children:a.to_name||"--"})]}),(0,b.jsx)("div",{className:"text-[11px] text-gray-500 line-clamp-2 leading-snug",title:a.content,children:(0,i.previewContent)(a.content)||(0,b.jsx)("span",{className:"italic",children:"(no content)"})})]})},a.task_id)})})})}var l=a.i(72596);function m(a){return(0,h.relativeAgo)(a)??"--"}let n=async a=>{let b=await fetch(a);if(401===b.status)throw window.location.assign("/login"),Error("unauthorized");return b.json()};function o({taskId:a,onClose:d,onRetried:e}){var f;let{data:h,isLoading:i,error:k,mutate:p}=(0,l.default)(`/api/hub/tasks?task_id=${encodeURIComponent(a)}`,n,{refreshInterval:5e3}),{data:q}=(0,l.default)(`/api/hub/task-events?task_id=${encodeURIComponent(a)}&limit=50`,n,{refreshInterval:1e4}),[r,s]=(0,c.useState)(!1),t=h?.tasks?.[0],u=q?.events||[],v=async()=>{if(t){s(!0);try{await fetch("/api/hub/send",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({alias:t.to_name,task:t.content,priority:t.priority,...t.network_id?{network_id:t.network_id}:{}})}),p(),e?.()}finally{s(!1)}}},w=t?[{label:"Created",time:t.created_at,color:"text-gray-400"},{label:"Delivered",time:t.delivered_at,color:"text-blue-400"},{label:"Started",time:t.started_at,color:"text-green-400"},{label:"Completed",time:t.completed_at,color:"text-purple-400"}]:[];return(0,b.jsxs)("div",{"data-testid":"task-detail-pane","data-task-id":a,"data-poll-task-ms":String(5e3),"data-poll-events-ms":String(1e4),className:"flex flex-col h-full max-h-screen overflow-hidden",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between px-4 py-3 border-b border-[#1c1c1f]",children:[(0,b.jsxs)("div",{className:"min-w-0 flex-1 flex items-center gap-2",children:[(0,b.jsxs)("div",{className:"text-xs text-gray-500 truncate",title:a,children:[(0,b.jsx)("span",{className:"text-gray-600",children:"Task ID:"})," ",(0,b.jsxs)("span",{className:"font-mono",children:[a.slice(0,12),"…"]})]}),t&&(0,b.jsx)("span",{"data-testid":"task-detail-status",className:`text-xs px-2 py-0.5 rounded-md border ${j.STATUS_CHIP_CLASS[t.status]||"bg-gray-500/10 text-gray-400 border-gray-500/20"}`,children:t.status})]}),d&&(0,b.jsx)("button",{type:"button",onClick:d,"aria-label":"Close detail (返回 tasks 列表)","data-testid":"task-detail-close",className:"shrink-0 rounded-md border border-[#26262b] px-2 py-1 text-xs text-gray-400 hover:text-white hover:border-[#3a3a41]",children:"←"})]}),(0,b.jsxs)("div",{className:"flex-1 overflow-y-auto px-4 py-4 space-y-4",children:[i&&!t&&(0,b.jsxs)("div",{className:"animate-pulse space-y-3",children:[(0,b.jsx)("div",{className:"h-6 w-1/3 bg-gray-800/40 rounded"}),(0,b.jsx)("div",{className:"h-24 bg-gray-800/40 rounded"}),(0,b.jsx)("div",{className:"h-24 bg-gray-800/40 rounded"})]}),k&&(0,b.jsx)("div",{className:"bg-red-900/20 border border-red-800/40 text-red-300 px-3 py-2 rounded text-sm",children:k instanceof Error?k.message:"fetch failed"}),!i&&!k&&!t&&(0,b.jsx)("div",{className:"text-gray-400 text-sm",children:"Task not found"}),t&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("section",{"data-testid":"task-detail-timeline","data-block":"timeline",className:"bg-[#161618] border border-[#26262b] rounded-xl p-4",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Timeline"}),(0,b.jsx)("div",{className:"relative",children:w.map((a,c)=>{let d=!!a.time,e=c===w.length-1;return(0,b.jsxs)("div",{"data-testid":`timeline-step-${a.label.toLowerCase()}`,"data-timeline-step":a.label.toLowerCase(),"data-timeline-done":d?"true":"false",className:"flex gap-3 pb-4 last:pb-0",children:[(0,b.jsxs)("div",{className:"flex flex-col items-center",children:[(0,b.jsx)("div",{className:`w-3 h-3 rounded-full border-2 shrink-0 ${d?`${a.color} border-current`:"border-gray-700 bg-transparent"}`}),!e&&(0,b.jsx)("div",{className:`w-0.5 flex-1 mt-1 ${d&&w[c+1]?.time?"bg-cyan-500/40":"bg-gray-800"}`})]}),(0,b.jsxs)("div",{className:"min-w-0 -mt-0.5",children:[(0,b.jsx)("div",{className:`text-sm font-medium ${d?"text-gray-200":"text-gray-600"}`,children:a.label}),(0,b.jsx)("div",{className:"text-xs text-gray-500",title:a.time||void 0,children:a.time?`${m(a.time)} — ${a.time}`:"Pending"})]})]},a.label)})})]}),(0,b.jsxs)("section",{"data-testid":"task-detail-info","data-block":"info",className:"bg-[#161618] border border-[#26262b] rounded-xl p-4",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-3",children:"Info"}),(0,b.jsx)("div",{className:"space-y-2 text-xs",children:[["Task ID",t.task_id],["From",t.from_name],["To",t.to_name],["Priority",t.priority],["Status",t.status],["Expires",t.expires_at]].map(([a,c])=>(0,b.jsxs)("div",{className:"flex justify-between gap-4",children:[(0,b.jsx)("span",{className:"text-gray-500 shrink-0",children:a}),(0,b.jsx)("span",{"data-info-field":String(a).toLowerCase().replace(/\s+/g,"-"),className:"text-gray-300 truncate max-w-[240px] text-right",title:String(c||""),children:String(c||"--")})]},a))}),(0,b.jsxs)("div",{className:"mt-4 pt-3 border-t border-[#1c1c1f] flex items-center gap-2 text-sm text-gray-300","data-testid":"task-detail-participants",children:[t.from_name&&(0,b.jsx)(g.AliasAvatar,{alias:t.from_name,size:20}),(0,b.jsx)("span",{className:"truncate",children:t.from_name||"--"}),(0,b.jsx)("span",{className:"text-gray-600 shrink-0",children:"→"}),t.to_name&&(0,b.jsx)(g.AliasAvatar,{alias:t.to_name,size:20}),(0,b.jsx)("span",{className:"truncate",children:t.to_name||"--"})]}),(0,b.jsx)("div",{className:"mt-2 text-[10px]",children:(0,b.jsxs)("span",{className:"high"===(f=t.priority)?"text-red-400":"low"===f?"text-gray-600":"text-gray-400","data-testid":"task-detail-priority",children:["Priority: ",t.priority||"normal"]})})]}),(0,b.jsxs)("section",{"data-testid":"task-detail-content","data-block":"content",className:"bg-[#161618] border border-[#26262b] rounded-xl p-4",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-2",children:"Content"}),(0,b.jsx)("pre",{"data-testid":"task-detail-content-body",className:"text-xs text-gray-200 whitespace-pre-wrap break-words bg-[#0e0e10] rounded-lg px-3 py-2 border border-[#1c1c1f] max-h-64 overflow-y-auto font-sans",children:t.content||"--"})]}),t.result&&(0,b.jsxs)("section",{"data-testid":"task-detail-result","data-block":"result",className:"bg-[#161618] border border-[#26262b] rounded-xl p-4",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-2",children:"Result"}),(0,b.jsx)("pre",{"data-testid":"task-detail-result-body",className:"text-xs text-gray-200 whitespace-pre-wrap break-words bg-[#0e0e10] rounded-lg px-3 py-2 border border-[#1c1c1f] max-h-64 overflow-y-auto font-sans",children:t.result})]}),(0,b.jsxs)("section",{"data-testid":"task-detail-events","data-block":"events","data-events-count":u.length,className:"bg-[#161618] border border-[#26262b] rounded-xl p-4",children:[(0,b.jsxs)("h2",{className:"text-sm font-semibold text-gray-300 mb-3",children:["Events ",u.length>0&&(0,b.jsxs)("span",{className:"text-gray-500",children:["(",u.length,")"]})]}),0===u.length?(0,b.jsx)("div",{className:"text-xs text-gray-600 italic",children:"No events yet."}):(0,b.jsx)("div",{className:"space-y-2 max-h-64 overflow-y-auto",children:u.map((a,c)=>(0,b.jsxs)("div",{"data-testid":"task-detail-event-row",className:"flex items-start gap-2 text-xs",children:[(0,b.jsx)("span",{"aria-hidden":!0,className:`mt-1.5 w-1.5 h-1.5 rounded-full shrink-0 ${"running"===a.to_status?"bg-green-400":"replied"===a.to_status?"bg-purple-400":"failed"===a.to_status?"bg-red-400":"bg-blue-400"}`}),(0,b.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 min-w-0",children:[(0,b.jsx)("span",{"data-testid":"task-event-label",className:"text-gray-300 font-medium truncate",children:a.event_type?.trim()||a.to_status?.trim()||"event"}),a.from_status&&(0,b.jsxs)("span",{className:"text-gray-600 shrink-0",children:[a.from_status," → ",a.to_status]}),a.actor&&(0,b.jsxs)("span",{"data-testid":"task-event-actor",className:"text-gray-500 truncate",children:["by ",a.actor]})]}),a.detail&&(0,b.jsx)("div",{"data-testid":"task-event-detail",className:"mt-0.5 text-[11px] text-gray-500 break-words",children:a.detail}),(a.event_type?.startsWith("task.stale.")??!1)&&(0,b.jsx)("div",{"data-testid":"task-event-stale-context",className:"mt-0.5 text-[10px] text-amber-500/80 break-words",children:"Informational delivery observation; tasks that do not require a reply may also appear here."})]}),(0,b.jsx)("span",{className:"text-gray-600 ml-auto shrink-0",title:a.created_at,children:m(a.created_at)})]},a.id??c))})]}),("failed"===t.status||"expired"===t.status)&&(0,b.jsx)("div",{children:(0,b.jsx)("button",{onClick:v,disabled:r,"data-testid":"task-detail-retry",className:"text-xs text-orange-400 hover:text-orange-300 px-3 py-1.5 rounded-md border border-orange-500/30 hover:bg-orange-500/10 disabled:opacity-50 disabled:cursor-wait",children:r?"Retrying…":"Retry task"})})]})]})]})}let p="(min-width: 768px)";function q(a){let b=window.matchMedia(p);return b.addEventListener("change",a),()=>b.removeEventListener("change",a)}function r(a){try{return decodeURIComponent(a)}catch{return a}}function s({initialSelectedId:a=null}){let g=(0,d.useSearchParams)(),{networkId:h}=(0,e.useNetworkId)(),[i,l]=(0,c.useState)([]),[m,n]=(0,c.useState)(0),[t,u]=(0,c.useState)(!0),[v,w]=(0,c.useState)(""),[x,y]=(0,c.useState)(g.get("status")||""),[z,A]=(0,c.useState)(g.get("from_name")||""),[B,C]=(0,c.useState)(g.get("to_name")||""),[D,E]=(0,c.useState)(a),F=(0,c.useSyncExternalStore)(q,()=>window.matchMedia(p).matches,()=>!0),G=()=>{E(null);try{window.history.pushState({},"","/tasks")}catch{}};(0,c.useEffect)(()=>{let a=()=>{let a=window.location.pathname.match(/^\/tasks\/([^/]+)\/?$/);E(a?r(a[1]):null)};return window.addEventListener("popstate",a),()=>window.removeEventListener("popstate",a)},[]);let H=(0,c.useCallback)(async()=>{try{let a=new URLSearchParams;h&&a.set("network_id",h),x&&a.set("status",x),z&&a.set("from_name",z),B&&a.set("to_name",B),a.set("limit","100");let b=await fetch(`/api/hub/tasks?${a.toString()}`);if(401===b.status)return void window.location.assign("/login");let c=await b.json();l(c.tasks||[]),n(c.count??(c.tasks?.length||0)),w("")}catch(a){w(a instanceof Error?a.message:"fetch failed")}finally{u(!1)}},[x,z,B,h]);(0,c.useEffect)(()=>{u(!0),H();let a=setInterval(H,5e3);return()=>clearInterval(a)},[H]);let I={};i.forEach(a=>{I[a.status]=(I[a.status]||0)+1});let J=i.length||1,K=j.TASK_STATUSES.map(a=>({key:a,color:j.STATUS_BAR_CLASS[a]})).filter(a=>I[a.key]);return(0,b.jsxs)("div",{"data-testid":"tasks-layout","data-selected-id":D??"",className:"min-h-screen max-w-full overflow-x-hidden bg-[#0b0b0d] text-gray-100 flex",children:[(0,b.jsxs)("aside",{"data-testid":"task-list-column",className:`flex flex-col w-full sm:w-[380px] shrink-0 min-h-screen sticky top-0 border-r border-[#1c1c1f] ${D&&!F?"hidden":"flex"}`,children:[(0,b.jsxs)("div",{className:"px-4 py-3 border-b border-[#1c1c1f]",children:[(0,b.jsxs)("div",{className:"flex items-center gap-3 mb-3",children:[(0,b.jsx)("h1",{className:"text-xl font-bold text-white lg:ml-0 ml-10",children:"Tasks"}),i.length<m&&(0,b.jsxs)("span",{className:"text-xs bg-blue-900/30 text-blue-400 px-2 py-0.5 rounded-full border border-blue-800/30 tabular-nums",title:`Showing ${i.length} of ${m} tasks`,children:[i.length," / ",m]})]}),i.length>0&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("div",{className:"anet-tabstrip-wrap mb-2",children:(0,b.jsx)("div",{className:"anet-tabstrip flex flex-wrap gap-1 bg-[#161618] rounded-lg border border-[#26262b] p-1 overflow-x-auto scrollbar-thin",children:["",...j.TASK_STATUSES].map(a=>{let c=""===a?i.length:I[a]||0,d=x===a;return(0,b.jsxs)("button",{onClick:()=>y(a),disabled:0===c&&""!==a&&!d,className:`px-2.5 py-1 rounded-md text-xs transition-colors flex items-center gap-1 shrink-0 whitespace-nowrap disabled:opacity-30 disabled:cursor-not-allowed ${d?`${j.STATUS_CHIP_CLASS[a]||"bg-cyan-500/10 text-cyan-300 border-cyan-500/20"} border`:"text-gray-500 hover:text-gray-300 hover:bg-[#1c1c1f]/40"}`,children:[a&&(0,b.jsx)("span",{"aria-hidden":!0,className:"inline-block w-1.5 h-1.5 rounded-full shrink-0",style:{backgroundColor:j.STATUS_DOT_HEX[a]||"#6b7280"}}),(0,b.jsx)("span",{children:a||"All"}),(0,b.jsx)("span",{className:`text-[10px] tabular-nums ${d?"opacity-80":"text-gray-600"}`,children:c})]},a||"all")})})}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5 mb-2",children:[(0,b.jsxs)("div",{className:"flex items-center gap-1 rounded border border-[#26262b] bg-[#161618] px-2 py-1 focus-within:border-blue-500/40",children:[(0,b.jsx)("span",{className:"text-[9px] uppercase tracking-wide text-gray-600",children:"From"}),(0,b.jsx)("input",{type:"text",value:z,onChange:a=>A(a.target.value),placeholder:"any","data-testid":"tasks-filter-from",className:"w-16 bg-transparent text-xs text-white placeholder-gray-700 focus:outline-none"})]}),(0,b.jsxs)("div",{className:"flex items-center gap-1 rounded border border-[#26262b] bg-[#161618] px-2 py-1 focus-within:border-blue-500/40",children:[(0,b.jsx)("span",{className:"text-[9px] uppercase tracking-wide text-gray-600",children:"To"}),(0,b.jsx)("input",{type:"text",value:B,onChange:a=>C(a.target.value),placeholder:"any","data-testid":"tasks-filter-to",className:"w-16 bg-transparent text-xs text-white placeholder-gray-700 focus:outline-none"})]}),(x||z||B)&&(0,b.jsx)("button",{type:"button",onClick:()=>{y(""),A(""),C("")},className:"rounded border border-gray-700 px-2 py-0.5 text-[10px] text-gray-500 hover:text-gray-200 hover:border-gray-600",children:"Clear"})]}),!x&&K.length>0&&(0,b.jsx)("div",{className:"flex h-1 rounded-full overflow-hidden bg-gray-800",children:K.map(a=>(0,b.jsx)("div",{className:a.color,style:{width:`${I[a.key]/J*100}%`},title:`${a.key}: ${I[a.key]}`},a.key))})]}),v&&(0,b.jsx)("div",{className:"bg-red-900/20 border border-red-800/40 text-red-300 px-3 py-1.5 rounded mt-2 text-xs",children:v})]}),(0,b.jsx)("div",{className:"flex-1 min-h-0 overflow-y-auto",children:t?(0,b.jsx)("div",{className:"animate-pulse space-y-1 px-3 py-2",children:[1,2,3,4,5,6,7,8].map(a=>(0,b.jsx)("div",{className:"h-14 bg-gray-800/40 rounded"},a))}):0===i.length?(0,b.jsx)("div",{className:"px-3 py-6",children:(0,b.jsx)(f.EmptyState,{variant:"tasks",sub:x||z||B?"No tasks match the current filters. Try clearing them.":"Tasks will appear here when agents send them via CommHub."})}):(0,b.jsx)(k,{tasks:i,selectedId:D,onSelect:a=>{E(a);try{window.history.pushState({},"",`/tasks/${encodeURIComponent(a)}`)}catch{}}})})]}),D&&F&&(0,b.jsx)("section",{"data-testid":"task-detail-column",className:"flex-1 min-w-0 min-h-screen",children:(0,b.jsx)(o,{taskId:D,onClose:G,onRetried:H})}),D&&!F&&(0,b.jsx)("section",{"data-testid":"task-detail-mobile",className:"fixed inset-0 z-40 bg-[#0b0b0d]",children:(0,b.jsx)(o,{taskId:D,onClose:G,onRetried:H})}),!D&&F&&(0,b.jsx)("section",{"data-testid":"task-detail-empty",className:"flex-1 min-w-0 min-h-screen flex items-center justify-center text-sm text-gray-600",children:"请从左侧列表选择一条任务查看详情"})]})}a.s(["TasksView",0,function({initialSelectedId:a=null}){return(0,b.jsx)(c.Suspense,{fallback:(0,b.jsx)("div",{className:"min-h-screen bg-[#0b0b0d] text-gray-100 p-4 sm:p-6",children:(0,b.jsx)("div",{className:"lg:ml-0 ml-10 text-gray-500 text-sm",children:"Loading tasks…"})}),children:(0,b.jsx)(s,{initialSelectedId:a})})},"decodeIdSegment",0,r],16177)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=app_tasks_TasksView_tsx_068vqml._.js.map
|