@aeolus-fleet/gateway 0.36.0 → 0.36.2
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/dist/adapters/fleet/active-ships.d.ts +8 -0
- package/dist/adapters/fleet/active-ships.js +22 -0
- package/dist/adapters/fleet/active-ships.js.map +1 -0
- package/dist/adapters/fleet/every-listed-ship.d.ts +21 -0
- package/dist/adapters/fleet/every-listed-ship.js +28 -0
- package/dist/adapters/fleet/every-listed-ship.js.map +1 -0
- package/dist/adapters/fleet/fleet-ships.d.ts +1 -3
- package/dist/adapters/fleet/fleet-ships.js +5 -22
- package/dist/adapters/fleet/fleet-ships.js.map +1 -1
- package/dist/adapters/fleet/rest-fleet-door.js +40 -6
- package/dist/adapters/fleet/rest-fleet-door.js.map +1 -1
- package/dist/adapters/http/party-sign-in-routes.d.ts +7 -0
- package/dist/adapters/http/party-sign-in-routes.js +18 -0
- package/dist/adapters/http/party-sign-in-routes.js.map +1 -1
- package/dist/adapters/http/person-tools.js +3 -2
- package/dist/adapters/http/person-tools.js.map +1 -1
- package/dist/adapters/http/slack-routes.d.ts +2 -0
- package/dist/adapters/http/slack-routes.js +12 -4
- package/dist/adapters/http/slack-routes.js.map +1 -1
- package/dist/adapters/mcp/mcp-servers.d.ts +8 -2
- package/dist/adapters/mcp/mcp-servers.js +8 -4
- package/dist/adapters/mcp/mcp-servers.js.map +1 -1
- package/dist/adapters/prisma/basket-entries.js +4 -2
- package/dist/adapters/prisma/basket-entries.js.map +1 -1
- package/dist/adapters/prisma/connected-chats.d.ts +4 -0
- package/dist/adapters/prisma/connected-chats.js +21 -0
- package/dist/adapters/prisma/connected-chats.js.map +1 -0
- package/dist/adapters/prisma/fleet-forgetter.js +1 -1
- package/dist/adapters/prisma/fleet-forgetter.js.map +1 -1
- package/dist/adapters/prisma/generated/browser.d.ts +6 -1
- package/dist/adapters/prisma/generated/client.d.ts +6 -1
- package/dist/adapters/prisma/generated/internal/class.d.ts +11 -0
- package/dist/adapters/prisma/generated/internal/class.js +4 -4
- package/dist/adapters/prisma/generated/internal/class.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +95 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js +19 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +19 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +19 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
- package/dist/adapters/prisma/generated/models/BasketEntry.d.ts +114 -18
- package/dist/adapters/prisma/generated/models/ItemOutcome.d.ts +91 -1
- package/dist/adapters/prisma/generated/models/OpenedDelivery.d.ts +95 -2
- package/dist/adapters/prisma/generated/models/Party.d.ts +32 -1
- package/dist/adapters/prisma/generated/models/SlackLinkStep.d.ts +1005 -0
- package/dist/adapters/prisma/generated/models/SlackLinkStep.js +2 -0
- package/dist/adapters/prisma/generated/models/SlackLinkStep.js.map +1 -0
- package/dist/adapters/prisma/generated/models.d.ts +1 -0
- package/dist/adapters/prisma/item-outcomes.d.ts +6 -1
- package/dist/adapters/prisma/item-outcomes.js +19 -3
- package/dist/adapters/prisma/item-outcomes.js.map +1 -1
- package/dist/adapters/prisma/opened-deliveries.js +5 -0
- package/dist/adapters/prisma/opened-deliveries.js.map +1 -1
- package/dist/adapters/prisma/party-store.js +4 -1
- package/dist/adapters/prisma/party-store.js.map +1 -1
- package/dist/adapters/prisma/slack-link-steps.d.ts +8 -0
- package/dist/adapters/prisma/slack-link-steps.js +28 -0
- package/dist/adapters/prisma/slack-link-steps.js.map +1 -0
- package/dist/adapters/prisma/slack-posts.js +4 -3
- package/dist/adapters/prisma/slack-posts.js.map +1 -1
- package/dist/adapters/slack/slack-messages.d.ts +2 -0
- package/dist/adapters/slack/slack-messages.js +124 -18
- package/dist/adapters/slack/slack-messages.js.map +1 -1
- package/dist/adapters/trpc/router.d.ts +54 -2
- package/dist/adapters/trpc/router.js +25 -1
- package/dist/adapters/trpc/router.js.map +1 -1
- package/dist/app.js +39 -13
- package/dist/app.js.map +1 -1
- package/dist/core/mcp-out/grant-calls.js +1 -1
- package/dist/core/mcp-out/grant-calls.js.map +1 -1
- package/dist/core/mcp-out/hand-call.js +1 -1
- package/dist/core/mcp-out/hand-call.js.map +1 -1
- package/dist/core/mcp-out/keep-server-title.d.ts +13 -0
- package/dist/core/mcp-out/keep-server-title.js +14 -0
- package/dist/core/mcp-out/keep-server-title.js.map +1 -0
- package/dist/core/mcp-out/ports.d.ts +10 -0
- package/dist/core/parties/approve-party.js +1 -1
- package/dist/core/parties/approve-party.js.map +1 -1
- package/dist/core/parties/party.d.ts +2 -0
- package/dist/core/parties/party.js.map +1 -1
- package/dist/core/parties/ports.d.ts +5 -0
- package/dist/core/party-grants/listing-connection.js +2 -2
- package/dist/core/party-grants/listing-connection.js.map +1 -1
- package/dist/core/party-grants/tell-sign-in-needed.d.ts +2 -0
- package/dist/core/party-grants/tell-sign-in-needed.js +16 -4
- package/dist/core/party-grants/tell-sign-in-needed.js.map +1 -1
- package/dist/core/people/act-in-place.d.ts +42 -0
- package/dist/core/people/act-in-place.js +26 -0
- package/dist/core/people/act-in-place.js.map +1 -0
- package/dist/core/people/answer-delivery.js +13 -1
- package/dist/core/people/answer-delivery.js.map +1 -1
- package/dist/core/people/basket.d.ts +32 -10
- package/dist/core/people/basket.js +24 -6
- package/dist/core/people/basket.js.map +1 -1
- package/dist/core/people/count-basket.d.ts +4 -3
- package/dist/core/people/count-basket.js +9 -3
- package/dist/core/people/count-basket.js.map +1 -1
- package/dist/core/people/done-delivery.js +1 -1
- package/dist/core/people/done-delivery.js.map +1 -1
- package/dist/core/people/finish-own-step.js +2 -2
- package/dist/core/people/finish-own-step.js.map +1 -1
- package/dist/core/people/inbox-entry.d.ts +17 -1
- package/dist/core/people/inbox-entry.js +28 -1
- package/dist/core/people/inbox-entry.js.map +1 -1
- package/dist/core/people/item-job.d.ts +3 -1
- package/dist/core/people/item-job.js +5 -1
- package/dist/core/people/item-job.js.map +1 -1
- package/dist/core/people/item-outcome.d.ts +21 -2
- package/dist/core/people/item-outcome.js.map +1 -1
- package/dist/core/people/item-places.d.ts +26 -0
- package/dist/core/people/item-places.js +12 -0
- package/dist/core/people/item-places.js.map +1 -0
- package/dist/core/people/open-delivery.d.ts +6 -6
- package/dist/core/people/open-delivery.js +13 -10
- package/dist/core/people/open-delivery.js.map +1 -1
- package/dist/core/people/opened-of.d.ts +5 -1
- package/dist/core/people/opened-of.js +5 -1
- package/dist/core/people/opened-of.js.map +1 -1
- package/dist/core/people/ports.d.ts +40 -3
- package/dist/core/people/put-in-basket.d.ts +8 -6
- package/dist/core/people/put-in-basket.js +16 -5
- package/dist/core/people/put-in-basket.js.map +1 -1
- package/dist/core/people/read-basket.d.ts +8 -3
- package/dist/core/people/read-basket.js +8 -10
- package/dist/core/people/read-basket.js.map +1 -1
- package/dist/core/people/read-bridge-home.d.ts +39 -11
- package/dist/core/people/read-bridge-home.js +74 -12
- package/dist/core/people/read-bridge-home.js.map +1 -1
- package/dist/core/people/read-chats.d.ts +21 -0
- package/dist/core/people/read-chats.js +20 -0
- package/dist/core/people/read-chats.js.map +1 -0
- package/dist/core/people/read-inbox.d.ts +19 -9
- package/dist/core/people/read-inbox.js +57 -15
- package/dist/core/people/read-inbox.js.map +1 -1
- package/dist/core/people/read-record.d.ts +37 -11
- package/dist/core/people/read-record.js +44 -12
- package/dist/core/people/read-record.js.map +1 -1
- package/dist/core/people/read-send-to.d.ts +23 -0
- package/dist/core/people/read-send-to.js +37 -0
- package/dist/core/people/read-send-to.js.map +1 -0
- package/dist/core/people/read-your-fleet.d.ts +19 -0
- package/dist/core/people/read-your-fleet.js +22 -0
- package/dist/core/people/read-your-fleet.js.map +1 -0
- package/dist/core/people/remove-from-basket.d.ts +2 -1
- package/dist/core/people/remove-from-basket.js +4 -1
- package/dist/core/people/remove-from-basket.js.map +1 -1
- package/dist/core/people/routing.d.ts +13 -4
- package/dist/core/people/routing.js +14 -0
- package/dist/core/people/routing.js.map +1 -1
- package/dist/core/people/send-basket.d.ts +11 -7
- package/dist/core/people/send-basket.js +68 -11
- package/dist/core/people/send-basket.js.map +1 -1
- package/dist/core/people/send-message.d.ts +3 -1
- package/dist/core/people/send-message.js +9 -2
- package/dist/core/people/send-message.js.map +1 -1
- package/dist/core/people/send-stored-answers.d.ts +4 -3
- package/dist/core/people/send-stored-answers.js +62 -12
- package/dist/core/people/send-stored-answers.js.map +1 -1
- package/dist/core/people/stale-item.d.ts +40 -0
- package/dist/core/people/stale-item.js +36 -0
- package/dist/core/people/stale-item.js.map +1 -0
- package/dist/core/people/wake-person.d.ts +3 -1
- package/dist/core/people/wake-person.js +4 -2
- package/dist/core/people/wake-person.js.map +1 -1
- package/dist/core/people/your-fleet.d.ts +44 -0
- package/dist/core/people/your-fleet.js +64 -0
- package/dist/core/people/your-fleet.js.map +1 -0
- package/dist/core/slack/answer-in-slack.d.ts +15 -9
- package/dist/core/slack/answer-in-slack.js +43 -18
- package/dist/core/slack/answer-in-slack.js.map +1 -1
- package/dist/core/slack/ask-to-link-slack.d.ts +28 -0
- package/dist/core/slack/ask-to-link-slack.js +31 -0
- package/dist/core/slack/ask-to-link-slack.js.map +1 -0
- package/dist/core/slack/complete-link.d.ts +6 -1
- package/dist/core/slack/complete-link.js +6 -0
- package/dist/core/slack/complete-link.js.map +1 -1
- package/dist/core/slack/done-in-slack.d.ts +36 -0
- package/dist/core/slack/done-in-slack.js +63 -0
- package/dist/core/slack/done-in-slack.js.map +1 -0
- package/dist/core/slack/edit-slack-posts.d.ts +7 -5
- package/dist/core/slack/edit-slack-posts.js +13 -10
- package/dist/core/slack/edit-slack-posts.js.map +1 -1
- package/dist/core/slack/edited-post-of.d.ts +19 -0
- package/dist/core/slack/edited-post-of.js +77 -0
- package/dist/core/slack/edited-post-of.js.map +1 -0
- package/dist/core/slack/ports.d.ts +68 -10
- package/dist/core/slack/pressed-post-of.d.ts +9 -0
- package/dist/core/slack/pressed-post-of.js +18 -0
- package/dist/core/slack/pressed-post-of.js.map +1 -0
- package/dist/core/slack/read-slack-dropped-out.d.ts +23 -0
- package/dist/core/slack/read-slack-dropped-out.js +24 -0
- package/dist/core/slack/read-slack-dropped-out.js.map +1 -0
- package/dist/core/slack/read-slack-link.d.ts +4 -0
- package/dist/core/slack/read-slack-link.js +5 -0
- package/dist/core/slack/read-slack-link.js.map +1 -1
- package/dist/core/slack/show-in-slack.js +8 -7
- package/dist/core/slack/show-in-slack.js.map +1 -1
- package/dist/core/slack/slack-post-of.d.ts +24 -12
- package/dist/core/slack/slack-post-of.js +118 -37
- package/dist/core/slack/slack-post-of.js.map +1 -1
- package/dist/core/slack/slack-post.d.ts +13 -1
- package/dist/core/slack/slack-post.js +16 -1
- package/dist/core/slack/slack-post.js.map +1 -1
- package/dist/core/slack/slack-press.d.ts +1 -1
- package/dist/core/slack/slack-press.js +2 -1
- package/dist/core/slack/slack-press.js.map +1 -1
- package/dist/person-waiters.js +3 -1
- package/dist/person-waiters.js.map +1 -1
- package/package.json +2 -1
- package/src/adapters/prisma/migrations/20261104090000_basket_entries_note_alone/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261105090000_slack_link_steps/migration.sql +10 -0
- package/src/adapters/prisma/migrations/20261106090000_opened_deliveries_withdrawn_steps/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261107090000_opened_deliveries_step_link/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261107100000_opened_deliveries_opened_in/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261108090000_item_outcomes_note_and_seen/migration.sql +4 -0
- package/src/adapters/prisma/migrations/20261108090000_parties_display_name/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261109090000_basket_entries_option_label/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261109100000_basket_entries_sent/migration.sql +3 -0
- package/src/adapters/prisma/migrations/20261110090000_connected_chats_indexes/migration.sql +5 -0
- package/src/adapters/prisma/schema.prisma +41 -6
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/app-path-routes-manifest.json +10 -8
- package/web/.next/build-manifest.json +114 -90
- package/web/.next/diagnostics/route-bundle-stats.json +264 -206
- package/web/.next/fallback-build-manifest.json +3 -3
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/routes-manifest.json +12 -0
- package/web/.next/server/app/(bridge)/bridge/basket/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/{(console) → (bridge)}/bridge/basket/page/build-manifest.json +4 -4
- package/web/.next/server/app/{(console) → (bridge)}/bridge/basket/page/next-font-manifest.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/basket/page/server-reference-manifest.json +105 -0
- package/web/.next/server/app/{(console)/bridge/settings/requests/[requestId] → (bridge)/bridge/basket}/page.js +14 -13
- package/web/.next/server/app/(bridge)/bridge/basket/page.js.nft.json +1 -0
- package/web/.next/server/app/(bridge)/bridge/basket/page_client-reference-manifest.js +3 -0
- package/web/.next/server/app/(bridge)/bridge/changes/route/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(bridge)/bridge/changes/route.js +8 -0
- package/web/.next/server/app/{(console) → (bridge)}/bridge/changes/route.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/changes/route_client-reference-manifest.js +3 -0
- package/web/.next/server/app/(bridge)/bridge/done/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/{(console) → (bridge)}/bridge/done/page/build-manifest.json +4 -4
- package/web/.next/server/app/{(console) → (bridge)}/bridge/done/page/next-font-manifest.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/done/page/server-reference-manifest.json +25 -0
- package/web/.next/server/app/{(console) → (bridge)}/bridge/done/page.js +15 -14
- package/web/.next/server/app/{(console) → (bridge)}/bridge/done/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/done/page_client-reference-manifest.js +3 -0
- package/web/.next/server/app/(bridge)/bridge/fleet/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/{(console)/bridge/settings → (bridge)/bridge/fleet}/page/build-manifest.json +4 -4
- package/web/.next/server/app/{(console)/bridge/settings → (bridge)/bridge/fleet}/page/next-font-manifest.json +1 -1
- package/web/.next/server/app/{(console)/bridge/settings → (bridge)/bridge/fleet}/page/server-reference-manifest.json +3 -3
- package/web/.next/server/app/(bridge)/bridge/fleet/page.js +24 -0
- package/web/.next/server/app/{(console)/bridge/basket → (bridge)/bridge/fleet}/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/fleet/page_client-reference-manifest.js +3 -0
- package/web/.next/server/app/(bridge)/bridge/focus/route/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(bridge)/bridge/focus/route.js +8 -0
- package/web/.next/server/app/{(console) → (bridge)}/bridge/focus/route.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/focus/route_client-reference-manifest.js +3 -0
- package/web/.next/server/app/(bridge)/bridge/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/{(console) → (bridge)}/bridge/page/build-manifest.json +4 -4
- package/web/.next/server/app/{(console) → (bridge)}/bridge/page/next-font-manifest.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/page/server-reference-manifest.json +95 -0
- package/web/.next/server/app/{(console) → (bridge)}/bridge/page.js +16 -14
- package/web/.next/server/app/{(console) → (bridge)}/bridge/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/page_client-reference-manifest.js +3 -0
- package/web/.next/server/app/(bridge)/bridge/settings/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(bridge)/bridge/settings/page/build-manifest.json +23 -0
- package/web/.next/server/app/(bridge)/bridge/settings/page/next-font-manifest.json +11 -0
- package/web/.next/server/app/(bridge)/bridge/settings/page/server-reference-manifest.json +15 -0
- package/web/.next/server/app/{(console) → (bridge)}/bridge/settings/page.js +13 -12
- package/web/.next/server/app/{(console) → (bridge)}/bridge/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/settings/page_client-reference-manifest.js +3 -0
- package/web/.next/server/app/(bridge)/bridge/settings/requests/[requestId]/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(bridge)/bridge/settings/requests/[requestId]/page/build-manifest.json +23 -0
- package/web/.next/server/app/(bridge)/bridge/settings/requests/[requestId]/page/next-font-manifest.json +11 -0
- package/web/.next/server/app/{(console) → (bridge)}/bridge/settings/requests/[requestId]/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/(bridge)/bridge/settings/requests/[requestId]/page.js +26 -0
- package/web/.next/server/app/{(console) → (bridge)}/bridge/settings/requests/[requestId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/settings/requests/[requestId]/page_client-reference-manifest.js +3 -0
- package/web/.next/server/app/(bridge)/bridge/settings/routing/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(bridge)/bridge/settings/routing/page/build-manifest.json +23 -0
- package/web/.next/server/app/(bridge)/bridge/settings/routing/page/next-font-manifest.json +11 -0
- package/web/.next/server/app/(bridge)/bridge/settings/routing/page/react-loadable-manifest.json +1 -0
- package/web/.next/server/app/{(console) → (bridge)}/bridge/settings/routing/page/server-reference-manifest.json +15 -15
- package/web/.next/server/app/{(console) → (bridge)}/bridge/settings/routing/page.js +15 -14
- package/web/.next/server/app/(bridge)/bridge/settings/routing/page.js.map +5 -0
- package/web/.next/server/app/{(console) → (bridge)}/bridge/settings/routing/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/settings/routing/page_client-reference-manifest.js +3 -0
- package/web/.next/server/app/(bridge)/bridge/stay-aware/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(bridge)/bridge/stay-aware/page/build-manifest.json +23 -0
- package/web/.next/server/app/(bridge)/bridge/stay-aware/page/next-font-manifest.json +11 -0
- package/web/.next/server/app/(bridge)/bridge/stay-aware/page/react-loadable-manifest.json +1 -0
- package/web/.next/server/app/(bridge)/bridge/stay-aware/page/server-reference-manifest.json +95 -0
- package/web/.next/server/app/{(console)/bridge/basket → (bridge)/bridge/stay-aware}/page.js +15 -14
- package/web/.next/server/app/(bridge)/bridge/stay-aware/page.js.map +5 -0
- package/web/.next/server/app/(bridge)/bridge/stay-aware/page.js.nft.json +1 -0
- package/web/.next/server/app/(bridge)/bridge/stay-aware/page_client-reference-manifest.js +3 -0
- package/web/.next/server/app/(console)/gateway-off/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/gateway-off/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/(console)/gateway-off/page.js +2 -2
- package/web/.next/server/app/(console)/gateway-off/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/gateway-off/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/meetings/[meetingId]/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/meetings/[meetingId]/page/server-reference-manifest.json +3 -3
- package/web/.next/server/app/(console)/meetings/[meetingId]/page.js +2 -2
- package/web/.next/server/app/(console)/meetings/[meetingId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/meetings/[meetingId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/[name]/change/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/outside-parties/[name]/change/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(console)/outside-parties/[name]/change/page.js +2 -2
- package/web/.next/server/app/(console)/outside-parties/[name]/change/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/outside-parties/[name]/change/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/[name]/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/outside-parties/[name]/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/(console)/outside-parties/[name]/page.js +2 -2
- package/web/.next/server/app/(console)/outside-parties/[name]/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/outside-parties/[name]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/[name]/retire/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/outside-parties/[name]/retire/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(console)/outside-parties/[name]/retire/page.js +2 -2
- package/web/.next/server/app/(console)/outside-parties/[name]/retire/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/outside-parties/[name]/retire/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/add/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/outside-parties/add/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/(console)/outside-parties/add/page.js +2 -2
- package/web/.next/server/app/(console)/outside-parties/add/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/outside-parties/add/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page/server-reference-manifest.json +2 -2
- package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page.js +2 -2
- package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page/server-reference-manifest.json +2 -2
- package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page.js +2 -2
- package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/outside-parties/page/server-reference-manifest.json +2 -2
- package/web/.next/server/app/(console)/outside-parties/page.js +2 -2
- package/web/.next/server/app/(console)/outside-parties/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/outside-parties/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/parties/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/parties/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/(console)/parties/page.js +2 -2
- package/web/.next/server/app/(console)/parties/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/parties/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/sign-in/failed/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/sign-in/failed/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/(console)/sign-in/failed/page.js +2 -2
- package/web/.next/server/app/(console)/sign-in/failed/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/sign-in/failed/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/slack/disconnect/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/slack/disconnect/page/server-reference-manifest.json +9 -9
- package/web/.next/server/app/(console)/slack/disconnect/page.js +2 -2
- package/web/.next/server/app/(console)/slack/disconnect/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/slack/disconnect/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/slack/expose/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/slack/expose/page/server-reference-manifest.json +9 -9
- package/web/.next/server/app/(console)/slack/expose/page.js +2 -2
- package/web/.next/server/app/(console)/slack/expose/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/slack/expose/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/slack/link/route.js.nft.json +1 -1
- package/web/.next/server/app/(console)/slack/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/slack/page/server-reference-manifest.json +9 -9
- package/web/.next/server/app/(console)/slack/page.js +2 -2
- package/web/.next/server/app/(console)/slack/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/slack/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/slack/remove/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/slack/remove/page/server-reference-manifest.json +9 -9
- package/web/.next/server/app/(console)/slack/remove/page.js +4 -4
- package/web/.next/server/app/(console)/slack/remove/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/slack/remove/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error/page/build-manifest.json +4 -4
- package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +1 -1
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/build-manifest.json +4 -4
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page.js +2 -2
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/apple-icon.png/route.js.nft.json +1 -1
- package/web/.next/server/app/authorize/failed/page/build-manifest.json +4 -4
- package/web/.next/server/app/authorize/failed/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/authorize/failed/page.js +3 -2
- package/web/.next/server/app/authorize/failed/page.js.nft.json +1 -1
- package/web/.next/server/app/authorize/failed/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/authorize/pick/page/build-manifest.json +4 -4
- package/web/.next/server/app/authorize/pick/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/authorize/pick/page.js +7 -5
- package/web/.next/server/app/authorize/pick/page.js.nft.json +1 -1
- package/web/.next/server/app/authorize/pick/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/authorize/waiting/approval/page/build-manifest.json +4 -4
- package/web/.next/server/app/authorize/waiting/approval/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/authorize/waiting/approval/page.js +3 -2
- package/web/.next/server/app/authorize/waiting/approval/page.js.nft.json +1 -1
- package/web/.next/server/app/authorize/waiting/approval/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/icon.svg/route.js.nft.json +1 -1
- package/web/.next/server/app-paths-manifest.json +10 -8
- package/web/.next/server/chunks/0b9d__next-internal_server_app_(bridge)_bridge_changes_route_actions_0wd1c_8tnx6-f.js +3 -0
- package/web/.next/server/chunks/[root-of-the-server]__1j0sdz18lzulo._.js +2 -2
- package/web/.next/server/chunks/[root-of-the-server]__1o2xxi_001xql._.js +2 -2
- package/web/.next/server/chunks/_0up_7s_05-7vm._.js +3 -0
- package/web/.next/server/chunks/_0up_7s_05-7vm._.js.map +1 -0
- package/web/.next/server/chunks/_0xw0b7avhvg75._.js +1 -1
- package/web/.next/server/chunks/_1w2t6c0hpdsrn._.js +1 -1
- package/web/.next/server/chunks/_1xaed_q500ez6._.js +3 -0
- package/web/.next/server/chunks/_1xaed_q500ez6._.js.map +1 -0
- package/web/.next/server/chunks/_20ne4s-e_jzxp._.js +1 -1
- package/web/.next/server/chunks/_20ne4s-e_jzxp._.js.map +1 -1
- package/web/.next/server/chunks/ssr/01fr_app_(bridge)_bridge_settings_requests_[requestId]_page_actions_0o8g7_xshtmem.js +3 -0
- package/web/.next/server/chunks/ssr/01fr_app_(bridge)_bridge_settings_requests_[requestId]_page_actions_0o8g7_xshtmem.js.map +1 -0
- package/web/.next/server/chunks/ssr/0b9d__next-internal_server_app_(bridge)_bridge_stay-aware_page_actions_1u0xo0v3y9c34.js +3 -0
- package/web/.next/server/chunks/ssr/0b9d__next-internal_server_app_(bridge)_bridge_stay-aware_page_actions_1u0xo0v3y9c34.js.map +1 -0
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_bridge_settings_routing_page_actions_06_j7s24dy5ee.js +3 -0
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_bridge_settings_routing_page_actions_06_j7s24dy5ee.js.map +1 -0
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_change_page_actions_04td11fxohsfm.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_change_page_actions_04td11fxohsfm.js.map +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_page_actions_0u-45itza1ls7.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_page_actions_0u-45itza1ls7.js.map +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_retire_page_actions_0s7ps6i0ts7v5.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_retire_page_actions_0s7ps6i0ts7v5.js.map +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_add-a2a-client_page_actions_0d_wgiu94c32e.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_add-a2a-client_page_actions_0d_wgiu94c32e.js.map +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_add_page_actions_0yfz_dfn-8uo7.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_add_page_actions_0yfz_dfn-8uo7.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__001xx3sm5ur-e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__001xx3sm5ur-e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__1yyaeeylnezpi._.js → [root-of-the-server]__04_bc8g0oe4jt._.js} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0a6a1yc_ac-qt._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0a8db18tyk__5._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0a8db18tyk__5._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0e4l5gt01o04p._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0e4l5gt01o04p._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0gptrhg3mj4hs._.js +57 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0gptrhg3mj4hs._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0k3g0p3t9t0c-._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0k3g0p3t9t0c-._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0kjcooo3pi4_k._.js +57 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0kjcooo3pi4_k._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0rmg7huc074bf._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0rmg7huc074bf._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__10s9e8g5x-ws8._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__10s9e8g5x-ws8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__13v3maun347sn._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__13v3maun347sn._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__13yoncr_nx3jc._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__13yoncr_nx3jc._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__0gnfxe62edx95._.js → [root-of-the-server]__179upda-y7uap._.js} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__18-8taiduk1jn._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__18-8taiduk1jn._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1hgu6f5hpnykv._.js +57 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1hgu6f5hpnykv._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1j6n8jj7-5t6v._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1j6n8jj7-5t6v._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1qpow96uit9t8._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1qpow96uit9t8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1qtzvez4cn5be._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1qtzvez4cn5be._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1ul9rrs2g66lm._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1ul9rrs2g66lm._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__20gvfqy33wcds._.js +57 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__20gvfqy33wcds._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_00hfzlqn1og18._.js +1 -1
- package/web/.next/server/chunks/ssr/_00hfzlqn1og18._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_03lk54yp-yhw3._.js +2 -2
- package/web/.next/server/chunks/ssr/_03lk54yp-yhw3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0cnpz5jm2_9xf._.js +3 -0
- package/web/.next/server/chunks/ssr/_0cnpz5jm2_9xf._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_0f7ucdt7bfmun._.js +3 -0
- package/web/.next/server/chunks/ssr/_0f7ucdt7bfmun._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_0ka_9elusb800._.js +1 -1
- package/web/.next/server/chunks/ssr/_0ka_9elusb800._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0kk7op86em7z2._.js +3 -0
- package/web/.next/server/chunks/ssr/_0kk7op86em7z2._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_0oekmfmigr0qv._.js +3 -0
- package/web/.next/server/chunks/ssr/_0oekmfmigr0qv._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_0pirspvjp3ggl._.js +3 -0
- package/web/.next/server/chunks/ssr/_0pirspvjp3ggl._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_0pyd1_y7w8ngp._.js +1 -1
- package/web/.next/server/chunks/ssr/_0pyd1_y7w8ngp._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0v_x6k3ztfvx0._.js +3 -0
- package/web/.next/server/chunks/ssr/_0v_x6k3ztfvx0._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_0vid8-myyy-_4._.js +3 -0
- package/web/.next/server/chunks/ssr/_0vid8-myyy-_4._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_0xickgbbju_9-._.js +1 -1
- package/web/.next/server/chunks/ssr/_0xickgbbju_9-._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0y5eahpucp8g_._.js +3 -0
- package/web/.next/server/chunks/ssr/_0y5eahpucp8g_._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_13fbnlwrl24s3._.js +3 -0
- package/web/.next/server/chunks/ssr/_13fbnlwrl24s3._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_14k1oldo5chf8._.js +3 -0
- package/web/.next/server/chunks/ssr/_14k1oldo5chf8._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_15whg3fd67b9x._.js +3 -0
- package/web/.next/server/chunks/ssr/_15whg3fd67b9x._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_17zzluh48wsdb._.js +3 -0
- package/web/.next/server/chunks/ssr/_17zzluh48wsdb._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_18xv7kh7i655_._.js +3 -0
- package/web/.next/server/chunks/ssr/_18xv7kh7i655_._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_1_wav28san6dm._.js +1 -1
- package/web/.next/server/chunks/ssr/_1_ym4hwge_4r0._.js +3 -0
- package/web/.next/server/chunks/ssr/_1_ym4hwge_4r0._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_1a9wrl8uw7x-y._.js +3 -0
- package/web/.next/server/chunks/ssr/_1a9wrl8uw7x-y._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_1hmjvjuxx92vo._.js → _1airu8wwf7z1b._.js} +2 -2
- package/web/.next/server/chunks/ssr/_1airu8wwf7z1b._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_1e2o809f0ekry._.js +1 -1
- package/web/.next/server/chunks/ssr/{_0a_nsm-ye2r6v._.js → _1gbkqq8ra1nei._.js} +2 -2
- package/web/.next/server/chunks/ssr/_1gbkqq8ra1nei._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_1i5zdy3tp2ykh._.js +3 -0
- package/web/.next/server/chunks/ssr/_1i5zdy3tp2ykh._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_1i8ofnr1a5yle._.js +3 -0
- package/web/.next/server/chunks/ssr/_1i8ofnr1a5yle._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_1iorutn_o9hja._.js +3 -0
- package/web/.next/server/chunks/ssr/_1iorutn_o9hja._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_1kdx8a0j5cxyl._.js +3 -0
- package/web/.next/server/chunks/ssr/_1kdx8a0j5cxyl._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_1mg5oon0wpocg._.js +3 -0
- package/web/.next/server/chunks/ssr/_1mg5oon0wpocg._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_1pjtire7rqla0._.js +1 -1
- package/web/.next/server/chunks/ssr/_1pjtire7rqla0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1pp0z5srqqqyl._.js +3 -0
- package/web/.next/server/chunks/ssr/_1pp0z5srqqqyl._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_1qbsmlji34yph._.js +1 -1
- package/web/.next/server/chunks/ssr/_1qbsmlji34yph._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1rfpx4ze-3l8z._.js +3 -0
- package/web/.next/server/chunks/ssr/{web_features_0mi9a9pdzkdji._.js.map → _1rfpx4ze-3l8z._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_1t74yvog5g6g2._.js +3 -0
- package/web/.next/server/chunks/ssr/_1t74yvog5g6g2._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_1ve-ao6odintc._.js +3 -0
- package/web/.next/server/chunks/ssr/_1ve-ao6odintc._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_1xuikhitica6p._.js +3 -0
- package/web/.next/server/chunks/ssr/_1xuikhitica6p._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_1zmd3armaxhyu._.js +4 -0
- package/web/.next/server/chunks/ssr/_1zmd3armaxhyu._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_0489ke-80obwd._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_0489ke-80obwd._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_0gpbs01t1c_a4._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_0gpbs01t1c_a4._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_0ue_35q2cegwf._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_0ue_35q2cegwf._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_0zgrzr0ui3gi8._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_0zgrzr0ui3gi8._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_174jf4d4t_bo_._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_174jf4d4t_bo_._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_1qxtjrbc2-6xd._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_1qxtjrbc2-6xd._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_common_dist_header_0t_cmi-llaq7g._.js +1 -1
- package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_common_dist_header_0t_cmi-llaq7g._.js.map +1 -1
- package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_common_dist_header_app-switcher_08qq5-uxv7jii.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_common_dist_header_app-switcher_08qq5-uxv7jii.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_common_dist_header_class-names_1h5pbm2ucssiq.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_common_dist_header_class-names_1h5pbm2ucssiq.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_@base-ui_0jlwmxa9rk8p_._.js +1 -1
- package/web/.next/server/chunks/ssr/node_modules_@base-ui_0jlwmxa9rk8p_._.js.map +1 -1
- package/web/.next/server/chunks/ssr/node_modules_@base-ui_19e_nxxf4a88q._.js +1 -1
- package/web/.next/server/chunks/ssr/node_modules_@base-ui_19e_nxxf4a88q._.js.map +1 -1
- package/web/.next/server/chunks/ssr/node_modules_@base-ui_react_1cvjxnw-b3pnv._.js +3 -0
- package/web/.next/server/chunks/ssr/{node_modules_@base-ui_react_1lbvjrzg8s2ox._.js.map → node_modules_@base-ui_react_1cvjxnw-b3pnv._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/node_modules_@base-ui_react_toast_index_parts_mjs_20gwon7142aop._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_@base-ui_react_toast_index_parts_mjs_20gwon7142aop._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_bell_mjs_1sxms6d0wfxa2._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_bell_mjs_1sxms6d0wfxa2._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_search_mjs_047mxu6_po4kl._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_search_mjs_047mxu6_po4kl._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_next_08hq6z46rczo0._.js +2 -2
- package/web/.next/server/chunks/ssr/node_modules_next_dist_0janj0i6dqko7._.js +2 -2
- package/web/.next/server/chunks/ssr/node_modules_next_dist_0janj0i6dqko7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0g15rgn4n-oiz.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0g15rgn4n-oiz.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0hzwtyh-646p2.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0hzwtyh-646p2.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0mm8dt8tws1fz.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0mm8dt8tws1fz.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0tcy7phl8a4gj.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0tcy7phl8a4gj.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0ynno0usi0bwx.js +1 -1
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_11x159_oszki3.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_11x159_oszki3.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_128zox167vtjm.js +1 -1
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_128zox167vtjm.js.map +1 -1
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1dltrn6ii5dd6.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1dltrn6ii5dd6.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1hm1iu016c1fy.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1hm1iu016c1fy.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1zaoeyy4_vir_.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1zaoeyy4_vir_.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_0_peudz6-o69m._.js +3 -0
- package/web/.next/server/chunks/ssr/web_0_peudz6-o69m._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_0cxcy088wnfmw._.js +3 -0
- package/web/.next/server/chunks/ssr/web_0cxcy088wnfmw._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_0oz8bypfxh82g._.js +3 -0
- package/web/.next/server/chunks/ssr/web_0oz8bypfxh82g._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_0pk41f5m34jvi._.js +3 -0
- package/web/.next/server/chunks/ssr/web_0pk41f5m34jvi._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_0wys4l6za8umr._.js +1 -1
- package/web/.next/server/chunks/ssr/web_0wys4l6za8umr._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_1fi1x3y7rg7mf._.js +3 -0
- package/web/.next/server/chunks/ssr/web_1fi1x3y7rg7mf._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_1irsulms62lzf._.js +3 -0
- package/web/.next/server/chunks/ssr/web_1irsulms62lzf._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_1k2rrq-kr6f9k._.js +3 -0
- package/web/.next/server/chunks/ssr/web_1k2rrq-kr6f9k._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_1qvxzqmq4aw94._.js +3 -0
- package/web/.next/server/chunks/ssr/web_1qvxzqmq4aw94._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_basket_page_actions_0g7q_rc5nma1e.js +3 -0
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_basket_page_actions_0g7q_rc5nma1e.js.map +1 -0
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_done_page_actions_0kjm34arntdzv.js +3 -0
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_done_page_actions_0kjm34arntdzv.js.map +1 -0
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_page_actions_1ok64rg3edm_u.js +3 -0
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_page_actions_1ok64rg3edm_u.js.map +1 -0
- package/web/.next/server/chunks/ssr/{web_app_(console)_bridge_error_tsx_10gkrn3ey8162._.js → web_app_(bridge)_bridge_error_tsx_0-142o0iqsh3j._.js} +2 -2
- package/web/.next/server/chunks/ssr/web_app_(bridge)_bridge_error_tsx_0-142o0iqsh3j._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_app_(bridge)_bridge_error_tsx_1m86qyp1bl9pi._.js +3 -0
- package/web/.next/server/chunks/ssr/web_app_(bridge)_bridge_error_tsx_1m86qyp1bl9pi._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_app_(bridge)_bridge_fleet_page_tsx_0uvtx8hiy8g0n._.js +3 -0
- package/web/.next/server/chunks/ssr/web_app_(bridge)_bridge_fleet_page_tsx_0uvtx8hiy8g0n._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_app_(bridge)_bridge_settings_page_tsx_1z5yr8ss25q7n._.js +3 -0
- package/web/.next/server/chunks/ssr/web_app_(bridge)_bridge_settings_page_tsx_1z5yr8ss25q7n._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{web_features_0f6r-m-dq36vf._.js → web_features_025l9l6m2zkya._.js} +2 -2
- package/web/.next/server/chunks/ssr/{web_features_0f6r-m-dq36vf._.js.map → web_features_025l9l6m2zkya._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/web_features_05aos-xwnl3m_._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_05aos-xwnl3m_._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_0bwqcs9wjf4y8._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_0bwqcs9wjf4y8._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{web_features_0d48z2epb6oie._.js → web_features_0f2pobf_t4wjt._.js} +2 -2
- package/web/.next/server/chunks/ssr/{web_features_0d48z2epb6oie._.js.map → web_features_0f2pobf_t4wjt._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-a2a-agent_ui_a2a-agent-form_tsx_0z8t1aalwzyl7._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-a2a-agent_ui_a2a-agent-form_tsx_0z8t1aalwzyl7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-a2a-client_ui_a2a-client-form_tsx_1anv88g385nwe._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-a2a-client_ui_a2a-client-form_tsx_1anv88g385nwe._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-server_ui_add-server_tsx_1jnmar5xju49k._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-server_ui_add-server_tsx_1jnmar5xju49k._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_0w95y19yk5w14._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_0w95y19yk5w14._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_1mi9qlb-z5iwt._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_1mi9qlb-z5iwt._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_fleet_ui_fleet-numbers_tsx_0_afv4j248_w-._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_fleet_ui_fleet-numbers_tsx_0_afv4j248_w-._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_hooks_bridge-actions_ts_0h-_xm2rcb-ij._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_hooks_bridge-actions_ts_0h-_xm2rcb-ij._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_basket-panel_tsx_1qi_kzld0rfgs._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_basket-panel_tsx_1qi_kzld0rfgs._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_decision-panel_tsx_1mzsixgc8zuxc._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_decision-panel_tsx_1mzsixgc8zuxc._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_done-panel_tsx_1m844-qb1z9p_._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_done-panel_tsx_1m844-qb1z9p_._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_home-panel_tsx_1cc5zdhxogl_2._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_home-panel_tsx_1cc5zdhxogl_2._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_ui_1y4g3fe75nqn5._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_ui_1y4g3fe75nqn5._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_ui_item-row_tsx_0c_a8wjzwsr7j._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_ui_item-row_tsx_0c_a8wjzwsr7j._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_frame_0pe8cwpxe1egb._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_frame_0pe8cwpxe1egb._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_frame_ui_gateway-header_tsx_0e9tekx4jf7ng._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_frame_ui_gateway-header_tsx_0e9tekx4jf7ng._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_meeting_state_meeting-controls_tsx_12g4kzk2mbvvz._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_meeting_state_meeting-controls_tsx_12g4kzk2mbvvz._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_outside-parties_paths_ts_0vbj9elyqekpp._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_outside-parties_paths_ts_0vbj9elyqekpp._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_outside-parties_ui_switch-card_tsx_1_xnu9bm4tc-_._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_outside-parties_ui_switch-card_tsx_1_xnu9bm4tc-_._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_outside-party_actions_ts_102ar5pdowf8s._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_parties_actions_ts_0r-tbfsig2ty-._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_slack_actions_ts_1l3yg9vl20_vu._.js +1 -1
- package/web/.next/server/chunks/web__next-internal_server_app_(bridge)_bridge_focus_route_actions_0fx2vmqfq23mq.js +3 -0
- package/web/.next/server/middleware-build-manifest.js +114 -90
- package/web/.next/server/next-font-manifest.js +1 -1
- package/web/.next/server/next-font-manifest.json +14 -6
- package/web/.next/server/pages/500.html +1 -1
- package/web/.next/server/preview-props.json +3 -3
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +163 -101
- package/web/.next/static/chunks/{40j58bya72xh1.js → 0k33n07zesv12.js} +1 -1
- package/web/.next/static/chunks/0ozz8jadgfdrx.js +1 -0
- package/web/.next/static/chunks/{1166rxt6h6ilq.js → 1c8q9h-van9r6.js} +1 -1
- package/web/.next/static/chunks/1nzfw6ajt5nf9.js +55 -0
- package/web/.next/static/chunks/1uhmdmkn5gsk2.js +1 -0
- package/web/.next/static/chunks/1v36iovy1f5cj.js +1 -0
- package/web/.next/static/chunks/1vhvy8bx4fxur.js +1 -0
- package/web/.next/static/chunks/1vhx_nu9nxo1v.js +1 -0
- package/web/.next/static/chunks/{3hvw5n04pbwg8.js → 23vvtbj-zoa_f.js} +1 -1
- package/web/.next/static/chunks/24vn5i6ojvl8l.js +1 -0
- package/web/.next/static/chunks/2dgbb29jkr_tu.js +1 -0
- package/web/.next/static/chunks/2ewacyhp73due.js +1 -0
- package/web/.next/static/chunks/2fimf0wcjnmpj.js +1 -0
- package/web/.next/static/chunks/2fk9ydkphmyna.js +1 -0
- package/web/.next/static/chunks/2l6hafvocw-rd.js +1 -0
- package/web/.next/static/chunks/2ld8_nap7g_uy.js +1 -0
- package/web/.next/static/chunks/2mpwg-t6pat39.js +1 -0
- package/web/.next/static/chunks/2pvcbql986wln.js +1 -0
- package/web/.next/static/chunks/2s1efgj6gxjgl.js +1 -0
- package/web/.next/static/chunks/2zlx-c_0x38uo.css +3 -0
- package/web/.next/static/chunks/34u_331hqync_.js +1 -0
- package/web/.next/static/chunks/39tst46ewpx_k.js +1 -0
- package/web/.next/static/chunks/{322fzslly9wpf.js → 3_bb0g4jkqn8q.js} +1 -1
- package/web/.next/static/chunks/3d5z1i-6yksxd.js +1 -0
- package/web/.next/static/chunks/3jq9vu8tr29j2.js +1 -0
- package/web/.next/static/chunks/3kenmp9pjwgf2.js +1 -0
- package/web/.next/static/chunks/3knqujtrdi225.js +1 -0
- package/web/.next/static/chunks/{0lzisjsmhlhjf.js → 3zhaqdsq15d1e.js} +1 -1
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/types/routes.d.ts +3 -1
- package/web/.next/types/validator.ts +50 -16
- package/dist/core/people/stale-question.d.ts +0 -28
- package/dist/core/people/stale-question.js +0 -26
- package/dist/core/people/stale-question.js.map +0 -1
- package/web/.next/server/app/(console)/bridge/basket/page/app-paths-manifest.json +0 -3
- package/web/.next/server/app/(console)/bridge/basket/page/server-reference-manifest.json +0 -75
- package/web/.next/server/app/(console)/bridge/basket/page_client-reference-manifest.js +0 -3
- package/web/.next/server/app/(console)/bridge/changes/route/app-paths-manifest.json +0 -3
- package/web/.next/server/app/(console)/bridge/changes/route.js +0 -8
- package/web/.next/server/app/(console)/bridge/changes/route_client-reference-manifest.js +0 -3
- package/web/.next/server/app/(console)/bridge/done/page/app-paths-manifest.json +0 -3
- package/web/.next/server/app/(console)/bridge/done/page/server-reference-manifest.json +0 -75
- package/web/.next/server/app/(console)/bridge/done/page_client-reference-manifest.js +0 -3
- package/web/.next/server/app/(console)/bridge/focus/route/app-paths-manifest.json +0 -3
- package/web/.next/server/app/(console)/bridge/focus/route.js +0 -8
- package/web/.next/server/app/(console)/bridge/focus/route_client-reference-manifest.js +0 -3
- package/web/.next/server/app/(console)/bridge/page/app-paths-manifest.json +0 -3
- package/web/.next/server/app/(console)/bridge/page/server-reference-manifest.json +0 -65
- package/web/.next/server/app/(console)/bridge/page_client-reference-manifest.js +0 -3
- package/web/.next/server/app/(console)/bridge/settings/page/app-paths-manifest.json +0 -3
- package/web/.next/server/app/(console)/bridge/settings/page_client-reference-manifest.js +0 -3
- package/web/.next/server/app/(console)/bridge/settings/requests/[requestId]/page/app-paths-manifest.json +0 -3
- package/web/.next/server/app/(console)/bridge/settings/requests/[requestId]/page/build-manifest.json +0 -23
- package/web/.next/server/app/(console)/bridge/settings/requests/[requestId]/page/next-font-manifest.json +0 -11
- package/web/.next/server/app/(console)/bridge/settings/requests/[requestId]/page_client-reference-manifest.js +0 -3
- package/web/.next/server/app/(console)/bridge/settings/routing/page/app-paths-manifest.json +0 -3
- package/web/.next/server/app/(console)/bridge/settings/routing/page/build-manifest.json +0 -23
- package/web/.next/server/app/(console)/bridge/settings/routing/page/next-font-manifest.json +0 -11
- package/web/.next/server/app/(console)/bridge/settings/routing/page_client-reference-manifest.js +0 -3
- package/web/.next/server/chunks/0b9d__next-internal_server_app_(console)_bridge_changes_route_actions_0hj8aqohz6bu6.js +0 -3
- package/web/.next/server/chunks/_05qgg3__4kdbm._.js +0 -3
- package/web/.next/server/chunks/_05qgg3__4kdbm._.js.map +0 -1
- package/web/.next/server/chunks/_1uap5tql2vvsb._.js +0 -3
- package/web/.next/server/chunks/_1uap5tql2vvsb._.js.map +0 -1
- package/web/.next/server/chunks/ssr/01fr_app_(console)_bridge_settings_requests_[requestId]_page_actions_1au-p5lgnv5e-.js +0 -3
- package/web/.next/server/chunks/ssr/01fr_app_(console)_bridge_settings_requests_[requestId]_page_actions_1au-p5lgnv5e-.js.map +0 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_bridge_settings_routing_page_actions_136lm_jip4d_x.js +0 -3
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_bridge_settings_routing_page_actions_136lm_jip4d_x.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__00jy4lqrcvxvc._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__00jy4lqrcvxvc._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0k-5_al3xk509._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0k-5_al3xk509._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__18v7b5ga58a9n._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__18v7b5ga58a9n._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1nxy_j9eswr3i._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1nxy_j9eswr3i._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1rf344o33bmi4._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1rf344o33bmi4._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0a_nsm-ye2r6v._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0h-ua-y4p4u1p._.js +0 -3
- package/web/.next/server/chunks/ssr/_0h-ua-y4p4u1p._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0swrejvekuzfx._.js +0 -3
- package/web/.next/server/chunks/ssr/_0swrejvekuzfx._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_12fsn_33ga-n0._.js +0 -3
- package/web/.next/server/chunks/ssr/_12fsn_33ga-n0._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_1hmjvjuxx92vo._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_1jx41z6kmxtt0._.js +0 -3
- package/web/.next/server/chunks/ssr/_1jx41z6kmxtt0._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_1q2s-hb67yjfb._.js +0 -3
- package/web/.next/server/chunks/ssr/_1q2s-hb67yjfb._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_1qdpkpsskm5wj._.js +0 -3
- package/web/.next/server/chunks/ssr/_1qdpkpsskm5wj._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_1yi3j4a16uet-._.js +0 -3
- package/web/.next/server/chunks/ssr/_1yi3j4a16uet-._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_01oyodz1bs245._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_01oyodz1bs245._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_16d4um5s513wz._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_16d4um5s513wz._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_@base-ui_react_1lbvjrzg8s2ox._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_next_dist_0hkpfqt9ne626._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_next_dist_0hkpfqt9ne626._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_031g89sb4kgzn.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_031g89sb4kgzn.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_09rviehv6rh0n.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_09rviehv6rh0n.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0ka8v6_fxug8r.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0ka8v6_fxug8r.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1c8zekuy1gkch.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1c8zekuy1gkch.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1dhzng2nnu0m7.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1dhzng2nnu0m7.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1rya2ag3z4vug.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1rya2ag3z4vug.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_0i_1uraygw2ld._.js +0 -3
- package/web/.next/server/chunks/ssr/web_0i_1uraygw2ld._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_0wz4onhfbq359._.js +0 -3
- package/web/.next/server/chunks/ssr/web_0wz4onhfbq359._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_1-hlf1xzemd3-._.js +0 -3
- package/web/.next/server/chunks/ssr/web_1-hlf1xzemd3-._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_107a79_nx4jdd._.js +0 -3
- package/web/.next/server/chunks/ssr/web_107a79_nx4jdd._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_127_b93avkwaq._.js +0 -3
- package/web/.next/server/chunks/ssr/web_127_b93avkwaq._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_bridge_basket_page_actions_102xk3g8eko_q.js +0 -3
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_bridge_basket_page_actions_102xk3g8eko_q.js.map +0 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_bridge_done_page_actions_0mm90xd2feta2.js +0 -3
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_bridge_done_page_actions_0mm90xd2feta2.js.map +0 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_bridge_page_actions_082880qz6xa5k.js +0 -3
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_bridge_page_actions_082880qz6xa5k.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_app_(console)_bridge_error_tsx_0ty_yk1robyaj._.js +0 -3
- package/web/.next/server/chunks/ssr/web_app_(console)_bridge_error_tsx_0ty_yk1robyaj._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_app_(console)_bridge_error_tsx_10gkrn3ey8162._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_app_(console)_bridge_settings_page_tsx_0xzphp7k9ge1u._.js +0 -3
- package/web/.next/server/chunks/ssr/web_app_(console)_bridge_settings_page_tsx_0xzphp7k9ge1u._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_0mi9a9pdzkdji._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_0s8erick0xk77._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_0s8erick0xk77._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_0wuo5bgp5tabn._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_0wuo5bgp5tabn._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_1je122n6carea._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_1je122n6carea._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_1n1hy3nwha2vi._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_1n1hy3nwha2vi._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_1nrnskep6p8ci._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_1nrnskep6p8ci._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_0-mhu0jaig2u3._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_bridge_0-mhu0jaig2u3._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_0219fbfmsi68-._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_bridge_0219fbfmsi68-._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_11jndonu4o8fq._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_bridge_11jndonu4o8fq._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_0354e3wb0dzx1._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_bridge_state_0354e3wb0dzx1._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_live-refresh_tsx_1c1xk-oe0kllv._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_bridge_state_live-refresh_tsx_1c1xk-oe0kllv._.js.map +0 -1
- package/web/.next/server/chunks/web__next-internal_server_app_(console)_bridge_focus_route_actions_0syd_u8mgzdmi.js +0 -3
- package/web/.next/static/chunks/0c1tqlbsvq1dj.js +0 -1
- package/web/.next/static/chunks/0fh11dkddwf_2.js +0 -1
- package/web/.next/static/chunks/0fu7je2vzzzh7.js +0 -1
- package/web/.next/static/chunks/0zbcy0_3jemrv.js +0 -1
- package/web/.next/static/chunks/180aowme095ds.js +0 -1
- package/web/.next/static/chunks/1ehmzxr697ifa.js +0 -1
- package/web/.next/static/chunks/1lyv8ukt_q3ph.js +0 -1
- package/web/.next/static/chunks/1ymfhxs-xqiy6.js +0 -1
- package/web/.next/static/chunks/2799kv0y5g2va.js +0 -1
- package/web/.next/static/chunks/2gghdkr64z9f9.js +0 -1
- package/web/.next/static/chunks/2hoi73vy1wqpo.js +0 -1
- package/web/.next/static/chunks/2jr8r6g9kk42a.js +0 -1
- package/web/.next/static/chunks/2mtfca4qk_s34.js +0 -1
- package/web/.next/static/chunks/36fnm0ezsx1eh.js +0 -1
- package/web/.next/static/chunks/3f2trjz7_wrzh.js +0 -1
- package/web/.next/static/chunks/3ow9h8hreko-p.css +0 -3
- package/web/.next/static/chunks/3pd8pele5x1o9.js +0 -1
- package/web/.next/static/chunks/3rt603msircrl.js +0 -1
- package/web/.next/static/chunks/3srfjz42u14tx.js +0 -1
- /package/web/.next/server/app/{(console) → (bridge)}/bridge/basket/page/react-loadable-manifest.json +0 -0
- /package/web/.next/server/app/{(console) → (bridge)}/bridge/basket/page.js.map +0 -0
- /package/web/.next/server/app/{(console) → (bridge)}/bridge/changes/route/build-manifest.json +0 -0
- /package/web/.next/server/app/{(console) → (bridge)}/bridge/changes/route/server-reference-manifest.json +0 -0
- /package/web/.next/server/app/{(console) → (bridge)}/bridge/changes/route.js.map +0 -0
- /package/web/.next/server/app/{(console) → (bridge)}/bridge/done/page/react-loadable-manifest.json +0 -0
- /package/web/.next/server/app/{(console) → (bridge)}/bridge/done/page.js.map +0 -0
- /package/web/.next/server/app/{(console)/bridge → (bridge)/bridge/fleet}/page/react-loadable-manifest.json +0 -0
- /package/web/.next/server/app/{(console)/bridge → (bridge)/bridge/fleet}/page.js.map +0 -0
- /package/web/.next/server/app/{(console) → (bridge)}/bridge/focus/route/build-manifest.json +0 -0
- /package/web/.next/server/app/{(console) → (bridge)}/bridge/focus/route/server-reference-manifest.json +0 -0
- /package/web/.next/server/app/{(console) → (bridge)}/bridge/focus/route.js.map +0 -0
- /package/web/.next/server/app/{(console)/bridge/settings → (bridge)/bridge}/page/react-loadable-manifest.json +0 -0
- /package/web/.next/server/app/{(console)/bridge/settings → (bridge)/bridge}/page.js.map +0 -0
- /package/web/.next/server/app/{(console)/bridge/settings/requests/[requestId] → (bridge)/bridge/settings}/page/react-loadable-manifest.json +0 -0
- /package/web/.next/server/app/{(console)/bridge/settings/requests/[requestId] → (bridge)/bridge/settings}/page.js.map +0 -0
- /package/web/.next/server/app/{(console)/bridge/settings/routing → (bridge)/bridge/settings/requests/[requestId]}/page/react-loadable-manifest.json +0 -0
- /package/web/.next/server/app/{(console)/bridge/settings/routing → (bridge)/bridge/settings/requests/[requestId]}/page.js.map +0 -0
- /package/web/.next/server/chunks/{0b9d__next-internal_server_app_(console)_bridge_changes_route_actions_0hj8aqohz6bu6.js.map → 0b9d__next-internal_server_app_(bridge)_bridge_changes_route_actions_0wd1c_8tnx6-f.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__1yyaeeylnezpi._.js.map → [root-of-the-server]__04_bc8g0oe4jt._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__0gnfxe62edx95._.js.map → [root-of-the-server]__179upda-y7uap._.js.map} +0 -0
- /package/web/.next/server/chunks/{web__next-internal_server_app_(console)_bridge_focus_route_actions_0syd_u8mgzdmi.js.map → web__next-internal_server_app_(bridge)_bridge_focus_route_actions_0fx2vmqfq23mq.js.map} +0 -0
- /package/web/.next/static/{IMWKx2sJwt7EwwpStr8tb → 2O8_FQX7YN47L5_OxojXH}/_buildManifest.js +0 -0
- /package/web/.next/static/{IMWKx2sJwt7EwwpStr8tb → 2O8_FQX7YN47L5_OxojXH}/_clientMiddlewareManifest.js +0 -0
- /package/web/.next/static/{IMWKx2sJwt7EwwpStr8tb → 2O8_FQX7YN47L5_OxojXH}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../web/features/bridge/state/basket-panel.tsx","../../../../../web/features/bridge/hooks/data%3Ae1b3b3%20%3Ctext/javascript%3E","../../../../../web/features/bridge/services/basket.ts"],"sourcesContent":["'use client';\n\nimport { useState, useTransition } from 'react';\n\nimport { removeFromBasket, sendBasket } from '../hooks/bridge-actions';\nimport { sendLabelOf, sentTextOf, standingTextOf, type BasketItem, type BasketView } from '../services/basket';\nimport { ActionButton } from '../ui/action-button';\nimport { Notice } from '../ui/notice';\nimport { ItemFocus, type ItemOpening } from './item-focus';\n\n/** When a question was asked, in UTC, to the minute. */\nfunction askedAtOf(sentAt: string): string {\n return `${new Date(sentAt).toISOString().slice(0, 16).replace('T', ' ')} UTC`;\n}\n\n/** What the person is doing in the basket: removing one entry, or sending it. */\ntype Working = { kind: 'remove'; questionId: string } | { kind: 'send' };\n\n/** One entry: the question, its asker and when it asked, the option and the note, what it stands as, and what can be done with it. */\nfunction BasketEntryRow({ entry, opening, working, onRemove }: { entry: BasketItem; opening: ItemOpening; working: Working | undefined; onRemove: (questionId: string) => void }) {\n const { standing } = entry;\n const said = standingTextOf(entry);\n const isWorking = working !== undefined || opening.openingId !== undefined;\n const replacementId = standing.kind === 'replaced' ? standing.replacementId : null;\n return (\n <li data-testid=\"bridge-basket-entry\" data-standing={standing.kind} className={`grid min-w-0 gap-2 rounded-md border border-border bg-card p-3 ${standing.kind === 'withdrawn' || standing.kind === 'replaced' || standing.kind === 'dealtElsewhere' ? 'opacity-60' : ''}`}>\n <span className=\"font-medium\">{entry.title}</span>\n <span className=\"text-caption text-muted-foreground\">\n to {entry.from} · asked at <time dateTime={entry.sentAt}>{askedAtOf(entry.sentAt)}</time>\n </span>\n <span>Option {entry.option}</span>\n {entry.note === null ? null : <span className=\"text-caption\">“{entry.note}”</span>}\n {said === undefined ? null : <span data-testid=\"bridge-basket-standing\" className=\"text-caption\">{said}</span>}\n {opening.failure?.deliveryId === entry.deliveryId ? <Notice message={opening.failure.message} isFailure /> : null}\n <div className=\"flex flex-wrap gap-2\">\n {standing.kind === 'waiting' ? (\n <ActionButton data-testid=\"bridge-basket-change\" isPending={opening.openingId === entry.deliveryId} pendingLabel=\"Opening...\" disabled={isWorking} onClick={() => { opening.open({ deliveryId: entry.deliveryId, job: 'decide', inBasket: { option: entry.option, note: entry.note } }); }}>\n Change\n </ActionButton>\n ) : null}\n {replacementId === null ? null : (\n <ActionButton data-testid=\"bridge-replacement\" isPending={opening.openingId === replacementId} pendingLabel=\"Opening...\" disabled={isWorking} onClick={() => { opening.open({ deliveryId: replacementId, job: 'decide' }); }}>\n Answer the new question\n </ActionButton>\n )}\n {standing.kind === 'sending' ? null : (\n <ActionButton data-testid=\"bridge-basket-remove\" isPending={working?.kind === 'remove' && working.questionId === entry.questionId} pendingLabel=\"Removing...\" disabled={isWorking} onClick={() => { onRemove(entry.questionId); }}>\n {standing.kind === 'refused' ? 'Remove and mark done' : 'Remove'}\n </ActionButton>\n )}\n </div>\n </li>\n );\n}\n\n/**\n * The basket open (docs/design/bridge, section 9): the answers the person\n * picked in Bridge and has not sent, in the order added. Change opens the\n * question with that option picked; Remove takes the entry out, and the\n * question still waits; one the fleet refused is removed and its question\n * marked done. Send N answers stores each as sending and the gateway sends\n * them, each on its own; a withdrawn, replaced or answered-elsewhere entry is\n * skipped and taken out, and Send says so.\n */\nexport function BasketPanel({ fleetId, basket }: { fleetId: string; basket: BasketView }) {\n const [working, setWorking] = useState<Working | undefined>();\n const [said, setSaid] = useState<{ message: string; isFailure: boolean } | undefined>();\n const [, startTransition] = useTransition();\n const { entries, toSend } = basket;\n\n const remove = (questionId: string) => {\n setWorking({ kind: 'remove', questionId });\n setSaid(undefined);\n startTransition(async () => {\n const outcome = await removeFromBasket(fleetId, questionId);\n setWorking(undefined);\n setSaid(outcome.isOk ? undefined : { message: outcome.message, isFailure: true });\n });\n };\n\n const send = () => {\n setWorking({ kind: 'send' });\n setSaid(undefined);\n startTransition(async () => {\n const outcome = await sendBasket(fleetId);\n setWorking(undefined);\n setSaid(outcome.isOk ? { message: sentTextOf(outcome.value), isFailure: false } : { message: outcome.message, isFailure: true });\n });\n };\n\n return (\n <ItemFocus fleetId={fleetId}>\n {(opening) => (\n <section className=\"grid gap-3\" aria-labelledby=\"bridge-basket-heading\">\n <div>\n <h1 id=\"bridge-basket-heading\" className=\"text-heading font-semibold\">\n Basket <span data-testid=\"bridge-basket-count\">{entries.length}</span>\n </h1>\n <p className=\"text-muted-foreground\">Answers you picked in Bridge, not sent yet. Nothing goes until you press Send.</p>\n </div>\n {said === undefined ? null : <Notice message={said.message} isFailure={said.isFailure} />}\n {entries.length === 0 ? (\n <div data-testid=\"bridge-basket-empty\" className=\"grid justify-items-center gap-1 rounded-lg border border-border bg-card p-6 text-center\">\n <span className=\"font-semibold\">The basket is empty</span>\n <span className=\"text-muted-foreground\">Open a question in Waiting on you and put your answer in the basket.</span>\n </div>\n ) : (\n <ul className=\"grid gap-2\">\n {entries.map((entry) => (\n <BasketEntryRow key={entry.questionId} entry={entry} opening={opening} working={working} onRemove={remove} />\n ))}\n </ul>\n )}\n {toSend === 0 ? null : (\n <div className=\"grid gap-1\">\n <p className=\"text-caption text-muted-foreground\">Each asker receives its own answer, as you, as if sent one by one.</p>\n <ActionButton data-testid=\"bridge-basket-send\" variant=\"primary\" className=\"justify-self-start\" isPending={working?.kind === 'send'} pendingLabel=\"Sending...\" disabled={working !== undefined || opening.openingId !== undefined} onClick={send}>\n {sendLabelOf(toSend)}\n </ActionButton>\n </div>\n )}\n </section>\n )}\n </ItemFocus>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40b44086e3707ca8b788d4ad4b3ef6615138ffe27a\":{\"name\":\"sendBasket\"}},\"web/features/bridge/hooks/bridge-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_5=/*#__PURE__*/createServerReference(\"40b44086e3707ca8b788d4ad4b3ef6615138ffe27a\",callServer,void 0,findSourceMapURL,\"sendBasket\");export{$$RSC_SERVER_ACTION_5 as sendBasket};","/**\n * The basket as Bridge shows it (docs/design/bridge, section 9): what each\n * entry stands as, what Send sends, and what it did, in words. Pure view\n * logic, no React and no API client.\n */\nimport type { inferRouterOutputs } from '@trpc/server';\n\nimport type { GatewayRouter } from '../../../../src/adapters/trpc/router.js';\n\ntype PeopleOutputs = inferRouterOutputs<GatewayRouter>['people'];\n\n/** The basket as the API answers it: its entries in the order added, and how many answers Send sends. */\nexport type BasketView = PeopleOutputs['basket'];\n\n/** An entry of the basket, with what it stands as. */\nexport type BasketItem = BasketView['entries'][number];\n\n/** What Send did, as the API answers it. */\nexport type BasketSent = PeopleOutputs['sendBasket'];\n\nconst PLACES: Record<Extract<BasketItem['standing'], { kind: 'dealtElsewhere' }>['place'], string> = {\n bridge: 'in Bridge',\n chat: 'in a chat',\n slack: 'in Slack',\n gateway: 'by the gateway',\n};\n\nconst SKIPPED: Record<BasketSent['skipped'][number]['kind'], string> = {\n withdrawn: 'withdrawn',\n replaced: 'replaced',\n dealtElsewhere: 'answered elsewhere',\n};\n\nfunction answersOf(count: number): string {\n return count === 1 ? '1 answer' : `${String(count)} answers`;\n}\n\n/** The Send button, naming how many answers it sends. */\nexport function sendLabelOf(toSend: number): string {\n return `Send ${answersOf(toSend)}`;\n}\n\n/** What an entry stands as, in words; nothing for one waiting for Send. */\nexport function standingTextOf(item: BasketItem): string | undefined {\n const { standing } = item;\n switch (standing.kind) {\n case 'waiting':\n return undefined;\n case 'sending':\n return 'Sending... The gateway keeps sending what is stored as sending, with the same key, until it is stored; you can close Bridge.';\n case 'refused':\n return `Not sent: ${standing.reason}. The others were sent.`;\n case 'withdrawn':\n return `Withdrawn by ${item.from}. Not sent; Send skips it.`;\n case 'replaced':\n return `Replaced by ${item.from}. Not sent: its options may differ, so answer the new question.`;\n case 'dealtElsewhere':\n return standing.option === null ? `Done ${PLACES[standing.place]}. Nothing is sent from it.` : `Answered ${PLACES[standing.place]}: option ${String(standing.option)}. Nothing is sent from it.`;\n }\n}\n\n/** What Send did: how many answers are being sent, and each entry it skipped and took out. */\nexport function sentTextOf(sent: BasketSent): string {\n const sending = sent.sending === 0 ? 'Nothing to send.' : sent.sending === 1 ? '1 answer is being sent.' : `${answersOf(sent.sending)} are being sent, each on its own, in the order you added them.`;\n if (sent.skipped.length === 0) {\n return sending;\n }\n return `${sending} Not sent: ${sent.skipped.map(({ title, kind }) => `“${title}”, ${SKIPPED[kind]}`).join('; ')}.`;\n}\n"],"names":["$$RSC_SERVER_ACTION_5"],"mappings":"wDAEA,EAAA,EAAA,CAAA,CAAA,OAEA,EAAA,EAAA,CAAA,CAAA,OCJwM,EAAA,EAAA,CAAA,CAAA,MAAsG,IAAMA,EAAmC,CAAA,EAAA,EAAA,iBAAb,IAAa,AAAqB,EAAC,KAAxB,wCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,cCoBvb,EAA+F,CACnG,OAAQ,YACR,KAAM,YACN,MAAO,WACP,QAAS,gBACX,EAEM,EAAiE,CACrE,UAAW,YACX,SAAU,WACV,eAAgB,oBAClB,EAEA,SAAS,EAAU,CAAa,EAC9B,OAAiB,AAAV,MAAc,WAAa,CAAA,EAAG,OAAO,GAAO,QAAQ,CAAC,AAC9D,CF7BA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAWA,SAAS,EAAe,OAAE,CAAK,SAAE,CAAO,SAAE,CAAO,UAAE,CAAQ,CAAqH,MAR7J,EASjB,GAAM,CATyB,SASvB,CAAQ,CAAE,CAAG,EACf,EAAO,AEsBR,SAAS,AAAe,CAAgB,EAC7C,GAAM,UAAE,CAAQ,CAAE,CAAG,EACrB,OAAQ,EAAS,IAAI,EACnB,IAAK,UACH,MACF,CADS,IACJ,UACH,MAAO,8HACT,KAAK,UACH,MAAO,CAAC,UAAU,EAAE,EAAS,MAAM,CAAC,uBAAuB,CAC7D,AAD8D,KACzD,YACH,MAAO,CAAC,aAAa,EAAE,EAAK,IAAI,CAAC,0BAA0B,CAAC,AAC9D,KAAK,WACH,MAAO,CAAC,YAAY,EAAE,EAAK,IAAI,CAAC,+DAA+D,CAAC,AAClG,KAAK,iBACH,OAA2B,OAApB,EAAS,MAAM,CAAY,CAAC,KAAK,EAAE,CAAM,CAAC,EAAS,KAAK,CAAC,CAAC,0BAA0B,CAAC,CAAG,CAAC,SAAS,EAAE,CAAM,CAAC,EAAS,KAAK,CAAC,CAAC,SAAS,EAAE,OAAO,EAAS,MAAM,EAAE,0BAA0B,CAAC,AACpM,CACF,EFtC8B,GACtB,OAAwB,IAAZ,QAA+C,IAAtB,EAAQ,SAAS,CACtD,EAAkC,aAAlB,EAAS,IAAI,CAAkB,EAAS,aAAa,CAAG,KAC9E,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,cAAY,sBAAsB,gBAAe,EAAS,IAAI,CAAE,UAAW,CAAC,+DAA+D,EAAoB,cAAlB,EAAS,IAAI,EAAsC,aAAlB,EAAS,IAAI,EAAmB,AAAkB,qBAAT,IAAI,CAAwB,aAAe,GAAA,CAAI,WACxQ,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uBAAe,EAAM,KAAK,GAC1C,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,+CAAqC,MAC/C,EAAM,IAAI,CAAC,eAAY,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,SAAU,EAAM,MAAM,WAAG,EAAU,EAAM,MAAM,CAhB/E,CAAA,EAAG,IAAI,KAAK,GAAQ,WAAW,GAAG,KAAK,CAAC,EAAG,IAAI,OAAO,CAAC,IAAK,KAAK,IAAI,CAAC,OAkBzE,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,WAAK,UAAQ,EAAM,MAAM,IACzB,AAAe,SAAT,IAAI,CAAY,KAAO,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,yBAAe,IAAE,EAAM,IAAI,CAAC,YAChE,IAAT,EAAqB,KAAO,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,cAAY,yBAAyB,UAAU,wBAAgB,IACjG,EAAQ,OAAO,EAAE,aAAe,EAAM,UAAU,CAAG,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAM,CAAA,CAAC,QAAS,EAAQ,OAAO,CAAC,OAAO,CAAE,SAAS,CAAA,CAAA,IAAM,KAC7G,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iCACZ,AAAkB,cAAT,IAAI,CACZ,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,CAAA,CAAC,cAAY,uBAAuB,UAAW,EAAQ,SAAS,GAAK,EAAM,UAAU,CAAE,aAAa,aAAa,SAAU,EAAW,QAAS,KAAQ,EAAQ,IAAI,CAAC,CAAE,WAAY,EAAM,UAAU,CAAE,IAAK,SAAU,SAAU,CAAE,OAAQ,EAAM,MAAM,CAAE,KAAM,EAAM,IAAI,AAAC,CAAE,EAAI,WAAG,WAG1R,KACe,OAAlB,EAAyB,KACxB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,CAAA,CAAC,cAAY,qBAAqB,UAAW,EAAQ,SAAS,GAAK,EAAe,aAAa,aAAa,SAAU,EAAW,QAAS,KAAQ,EAAQ,IAAI,CAAC,CAAE,WAAY,EAAe,IAAK,QAAS,EAAI,WAAG,4BAI/N,AAAkB,cAAT,IAAI,CAAiB,KAC7B,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,CAAA,CAAC,cAAY,uBAAuB,UAAW,GAAS,OAAS,UAAY,EAAQ,UAAU,GAAK,EAAM,UAAU,CAAE,aAAa,cAAc,SAAU,EAAW,QAAS,KAAQ,EAAS,EAAM,UAAU,CAAG,WAC7N,AAAkB,cAAT,IAAI,CAAiB,uBAAyB,gBAMpE,sBAWO,SAAS,AAAY,SAAE,CAAO,QAAE,CAAM,CAA2C,EACtF,GAAM,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,IAChC,CAAC,EAAM,EAAQ,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,IAC1B,EAAG,EAAgB,CAAG,CAAA,EAAA,EAAA,aAAA,AAAa,IACnC,SAAE,CAAO,QAAE,CAAM,CAAE,CAAG,EAEtB,EAAS,AAAC,IACd,EAAW,CAAE,KAAM,oBAAU,CAAW,GACxC,OAAQ,GACR,EAAgB,UACd,IAAM,EAAU,MAAM,CAAA,EAAA,EAAA,CAAA,AAAgB,EAAC,EAAS,GAChD,EAAW,QACX,EAAQ,EAAQ,IAAI,CAAG,OAAY,CAAE,QAAS,EAAQ,OAAO,CAAE,WAAW,CAAK,EACjF,EACF,EAEM,EAAO,KACX,EAAW,CAAE,KAAM,MAAO,GAC1B,OAAQ,GACR,EAAgB,cErBO,EFsBrB,EEtBqC,IFsB/B,EAAU,MAAM,EAAW,GACjC,OAAW,GACX,EAAQ,EAAQ,IAAI,CAAG,CAAE,OAAA,EEvBvB,AFuBgC,EEvBL,IAAjB,GFuBiC,EAAQ,KAAK,EEvBzC,OAAO,CAAS,mBAAsC,IAAjB,EAAK,OAAO,CAAS,0BAA4B,CAAA,EAAG,EAAU,EAAK,OAAO,EAAE,8DAA8D,CAAC,CACzK,AAA5B,AAAI,GAA2B,GAAtB,OAAO,CAAC,MAAM,CACd,EAEF,CAAA,EAAG,EAAQ,WAAW,EAAE,EAAK,OAAO,CAAC,GAAG,CAAC,CAAC,OAAE,CAAK,CAAE,MAAI,CAAE,GAAK,CAAC,CAAC,EAAE,EAAM,GAAG,EAAE,CAAO,CAAC,EAAK,CAAA,CAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EFmBjD,UAAW,EAAM,EAAI,CAAE,QAAS,EAAQ,OAAO,CAAE,WAAW,CAAK,EAChI,EACF,EAEA,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAS,CAAA,CAAC,QAAS,WACjB,AAAC,GACA,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,aAAa,kBAAgB,kCAC9C,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,GAAG,wBAAwB,UAAU,uCAA6B,UAC7D,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,cAAY,+BAAuB,EAAQ,MAAM,MAEhE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,iCAAwB,2FAE7B,IAAT,EAAqB,KAAO,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAM,CAAA,CAAC,QAAS,EAAK,OAAO,CAAE,UAAW,EAAK,SAAS,GACjE,IAAnB,EAAQ,MAAM,CACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,cAAY,sBAAsB,UAAU,oGAC/C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,yBAAgB,wBAChC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,iCAAwB,4EAG1C,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,sBACX,EAAQ,GAAG,CAAC,AAAC,GACZ,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAsC,MAAO,EAAO,QAAS,EAAS,QAAS,EAAS,SAAU,GAA9E,EAAM,UAAU,KAI/B,IAAX,EAAe,KACd,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uBACb,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8CAAqC,uEAClD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,CAAA,CAAC,cAAY,qBAAqB,QAAQ,UAAU,UAAU,qBAAqB,UAAW,GAAS,OAAS,OAAQ,aAAa,aAAa,SAAU,KAAY,YAAmC,IAAtB,EAAQ,SAAS,CAAgB,QAAS,WE7EjP,CAAC,AF8EO,KE9EF,EAAE,EF8EY,GE9EF,CAAS,IAAT,MFsF3B"}
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/bridge/hooks/data%3Af34fe9%20%3Ctext/javascript%3E","../../../../../web/features/bridge/state/basket-panel.tsx","../../../../../web/features/bridge/services/clock-time.ts","../../../../../node_modules/lucide-react/src/icons/arrow-right.ts","../../../../../node_modules/lucide-react/src/icons/clock.ts","../../../../../node_modules/lucide-react/src/icons/pencil.ts","../../../../../web/features/bridge/services/basket.ts"],"sourcesContent":["/* __next_internal_action_entry_do_not_use__ [{\"400320361887ac212b3589baccdc71146b3f431261\":{\"name\":\"sendBasket\"}},\"web/features/bridge/hooks/bridge-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_6=/*#__PURE__*/createServerReference(\"400320361887ac212b3589baccdc71146b3f431261\",callServer,void 0,findSourceMapURL,\"sendBasket\");export{$$RSC_SERVER_ACTION_6 as sendBasket};","'use client';\n\nimport { ArrowRight, Ban, Check, CircleAlert, CircleCheck, CircleQuestionMark, Clock, LoaderCircle, Pencil, Replace, Send, ShoppingBasket, X } from 'lucide-react';\nimport { useState, useTransition } from 'react';\n\nimport { removeFromBasket, sendBasket } from '../hooks/bridge-actions';\nimport { answerTextOf, entryLinesOf, footOf, isStruckOut, sentSummaryOf, type BasketFoot, type BasketItem, type BasketView, type EntryLine, type Words } from '../services/basket';\nimport { clockTimeOf } from '../services/clock-time';\nimport { ActionButton } from '../ui/action-button';\nimport { Notice } from '../ui/notice';\nimport { ItemFocus, type ItemOpening } from './item-focus';\n\n/** What the person is doing in the basket: removing one entry, or sending it. */\ntype Working = { kind: 'remove'; questionId: string } | { kind: 'send' };\n\nconst LINE_ICONS = {\n sent: CircleCheck,\n sending: LoaderCircle,\n next: Clock,\n unanswered: LoaderCircle,\n refused: CircleAlert,\n withdrawn: Ban,\n replaced: Replace,\n elsewhere: Check,\n} as const;\n\nconst LINE_TONES = {\n ok: 'text-tone-ok-fg',\n waiting: 'text-tone-waiting-fg',\n attention: 'text-tone-attention-fg',\n off: 'text-muted-foreground',\n} as const;\n\n/** Words as the desktop says them, and shorter on a phone. */\nfunction Said({ words }: { words: Words }) {\n if (words.desktop === words.phone) {\n return <span>{words.desktop}</span>;\n }\n return (\n <>\n <span className=\"hidden sm:inline\">{words.desktop}</span>\n <span className=\"sm:hidden\">{words.phone}</span>\n </>\n );\n}\n\n/** The line under an entry, behind its icon in its tone. */\nfunction EntryLineSaid({ line }: { line: EntryLine }) {\n const Icon = LINE_ICONS[line.icon];\n return (\n <p data-testid=\"bridge-basket-standing\" className=\"col-span-2 col-start-2 flex items-start gap-1.5 text-meta\">\n <Icon aria-hidden className={`mt-0.5 size-3.5 shrink-0 ${LINE_TONES[line.tone]}`} />\n <span>\n <Said words={line.words} />\n </span>\n </p>\n );\n}\n\n/** One entry: the question, its asker and when it asked, its answer and note, the line saying how it stands, and what can be done with it. */\nfunction BasketEntryRow({ entry, line, opening, working, onRemove }: { entry: BasketItem; line: EntryLine | undefined; opening: ItemOpening; working: Working | undefined; onRemove: (questionId: string) => void }) {\n const { standing } = entry;\n const isStruck = isStruckOut(standing);\n const isWorking = working !== undefined || opening.openingId !== undefined;\n const isRemoving = working?.kind === 'remove' && working.questionId === entry.questionId;\n const replacementId = standing.kind === 'replaced' ? standing.replacementId : null;\n const struck = isStruck ? 'line-through decoration-muted-foreground' : '';\n return (\n <li data-testid=\"bridge-basket-entry\" data-standing={standing.kind} className={`grid grid-cols-[18px_1fr_auto] items-start gap-x-2.5 gap-y-1.5 border-t border-border p-3 first:border-t-0 sm:px-3.5 ${isStruck ? 'bg-muted' : ''}`}>\n <CircleQuestionMark aria-hidden className=\"mt-0.5 size-4 text-tone-active-fg\" />\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <span className={`font-medium ${struck}`}>{entry.title}</span>\n <span className=\"flex flex-wrap items-center gap-1.5 text-caption text-muted-foreground\">\n <span>\n to <b className=\"font-medium text-foreground\">{entry.from}</b>\n </span>\n <span aria-hidden className=\"hidden text-border sm:inline\">\n ·\n </span>\n <span className=\"hidden sm:inline\">\n asked at <time dateTime={entry.sentAt}>{clockTimeOf(entry.sentAt)}</time>\n </span>\n </span>\n <span className={`${isStruck ? 'hidden sm:flex' : 'flex'} items-center gap-1.5 text-meta ${struck}`}>\n <ArrowRight aria-hidden className=\"size-3.5 shrink-0 text-primary\" />\n {answerTextOf(entry)}\n </span>\n {entry.note === null ? null : <span className=\"text-caption italic text-muted-foreground\">"{entry.note}"</span>}\n </div>\n {standing.kind === 'waiting' ? (\n <div className=\"flex items-center gap-1.5\">\n <ActionButton data-testid=\"bridge-basket-change\" size=\"small\" aria-label=\"Change\" isPending={opening.openingId === entry.deliveryId} pendingLabel=\"Opening...\" disabled={isWorking} onClick={() => { opening.open({ deliveryId: entry.deliveryId, job: 'decide', inBasket: { option: entry.option, note: entry.note } }); }}>\n <Pencil aria-hidden className=\"size-3.5\" />\n <span className=\"hidden sm:inline\">Change</span>\n </ActionButton>\n <ActionButton data-testid=\"bridge-basket-remove\" size=\"small\" variant=\"ghost\" aria-label=\"Remove\" isPending={isRemoving} pendingLabel=\"Removing...\" disabled={isWorking} onClick={() => { onRemove(entry.questionId); }}>\n <X aria-hidden className=\"size-4 sm:hidden\" />\n <span className=\"hidden sm:inline\">Remove</span>\n </ActionButton>\n </div>\n ) : (\n <span />\n )}\n {line === undefined ? null : <EntryLineSaid line={line} />}\n {opening.failure?.deliveryId === entry.deliveryId ? (\n <div className=\"col-span-2 col-start-2\">\n <Notice message={opening.failure.message} isFailure />\n </div>\n ) : null}\n {standing.kind === 'withdrawn' || standing.kind === 'replaced' || standing.kind === 'dealtElsewhere' || standing.kind === 'refused' ? (\n <div className=\"col-span-2 col-start-2 flex flex-wrap items-center gap-1.5\">\n {replacementId === null ? null : (\n <ActionButton data-testid=\"bridge-replacement\" size=\"small\" isPending={opening.openingId === replacementId} pendingLabel=\"Opening...\" disabled={isWorking} onClick={() => { opening.open({ deliveryId: replacementId, job: 'decide' }); }}>\n <ArrowRight aria-hidden className=\"size-3.5\" />\n Answer the new question\n </ActionButton>\n )}\n <ActionButton data-testid=\"bridge-basket-remove\" size=\"small\" variant={standing.kind === 'replaced' ? 'ghost' : 'secondary'} isPending={isRemoving} pendingLabel=\"Removing...\" disabled={isWorking} onClick={() => { onRemove(entry.questionId); }}>\n {standing.kind === 'refused' ? 'Remove and mark done' : 'Remove'}\n </ActionButton>\n </div>\n ) : null}\n </li>\n );\n}\n\n/** The foot of the basket: Send naming the ships, the send going on, or what came of it. */\nfunction BasketFootBar({ foot, isSending, isWorking, onSend }: { foot: BasketFoot; isSending: boolean; isWorking: boolean; onSend: () => void }) {\n if (foot.kind === 'none') {\n return null;\n }\n return (\n <div data-testid=\"bridge-basket-foot\" className=\"flex flex-col items-stretch gap-2 border-t border-border bg-card p-3 sm:flex-row sm:items-center sm:gap-3 sm:px-3.5\">\n <p className=\"flex-1 text-caption text-muted-foreground\">\n <Said words={foot.words} />\n </p>\n {foot.kind === 'send' ? (\n <ActionButton data-testid=\"bridge-basket-send\" variant=\"primary\" className=\"justify-center\" isPending={isSending} pendingLabel=\"Sending...\" disabled={isWorking} onClick={onSend}>\n <Send aria-hidden className=\"size-4\" />\n {foot.label}\n </ActionButton>\n ) : null}\n {foot.kind === 'sending' ? (\n <button type=\"button\" data-testid=\"bridge-basket-sending\" disabled aria-busy=\"true\" className=\"inline-flex h-9 items-center justify-center gap-2 rounded-md border border-border bg-card px-4 font-medium text-card-foreground\">\n <LoaderCircle aria-hidden className=\"size-4 animate-spin\" />\n {foot.progress}\n </button>\n ) : null}\n </div>\n );\n}\n\n/** What was sent, over the empty basket, once every entry left was sent. */\nfunction SentSummary({ summary }: { summary: { title: string; description: string } }) {\n return (\n <div data-testid=\"bridge-basket-sent\" role=\"status\" className=\"flex max-w-[620px] items-start gap-3 rounded-lg border border-border bg-popover p-4 text-popover-foreground shadow-lg\">\n <CircleCheck aria-hidden className=\"mt-0.5 size-4 shrink-0 text-tone-ok-fg\" />\n <span className=\"grid gap-1\">\n <span className=\"font-medium\">{summary.title}</span>\n <span className=\"text-caption text-muted-foreground\">{summary.description}</span>\n </span>\n </div>\n );\n}\n\n/** The empty basket, with what goes into it. */\nfunction EmptyBasket() {\n return (\n <div data-testid=\"bridge-basket-empty\" className=\"grid max-w-[820px] justify-items-center gap-3 rounded-lg border border-dashed border-border bg-card px-6 py-10 text-center\">\n <span className=\"inline-flex size-11 items-center justify-center rounded-lg bg-secondary text-muted-foreground\">\n <ShoppingBasket aria-hidden className=\"size-5\" />\n </span>\n <span className=\"text-heading font-semibold\">The basket is empty</span>\n <span className=\"max-w-[360px] text-muted-foreground\">Pick an option on a question and put it in the basket; it waits here until you send it.</span>\n </div>\n );\n}\n\n/**\n * The basket open (docs/design/bridge, section 9; basket.html, basket-3 to\n * basket-7): its count of what is or will be sent, and the answers the\n * person picked in Bridge, in the order added, each with its answer by\n * number and label. Change opens the question with that option picked;\n * Remove takes the entry out, and the question still waits; one the fleet\n * refused is removed and its question marked done. A withdrawn, replaced or\n * answered-elsewhere entry is struck out and not sent. Send N answers stores\n * each as sending and the gateway sends them, each on its own: each entry\n * then says how it goes, and the foot Sending N of M, or what came of the\n * send once one was not answered or refused. Once every entry left was\n * sent, what was sent stands over the empty basket.\n */\nexport function BasketPanel({ fleetId, basket }: { fleetId: string; basket: BasketView }) {\n const [working, setWorking] = useState<Working | undefined>();\n const [failure, setFailure] = useState<string | undefined>();\n const [, startTransition] = useTransition();\n const lines = entryLinesOf(basket);\n const summary = sentSummaryOf(basket);\n\n const remove = (questionId: string) => {\n setWorking({ kind: 'remove', questionId });\n setFailure(undefined);\n startTransition(async () => {\n const outcome = await removeFromBasket(fleetId, questionId);\n setWorking(undefined);\n setFailure(outcome.isOk ? undefined : outcome.message);\n });\n };\n\n const send = () => {\n setWorking({ kind: 'send' });\n setFailure(undefined);\n startTransition(async () => {\n const outcome = await sendBasket(fleetId);\n setWorking(undefined);\n setFailure(outcome.isOk ? undefined : outcome.message);\n });\n };\n\n return (\n <ItemFocus fleetId={fleetId}>\n {(opening) => (\n <section className=\"grid gap-4\" aria-labelledby=\"bridge-basket-heading\">\n <div className=\"hidden sm:block\">\n <h1 id=\"bridge-basket-heading\" className=\"text-heading font-semibold\">\n Basket <span data-testid=\"bridge-basket-count\" className=\"text-primary\">{basket.count}</span>\n </h1>\n <p className=\"text-caption text-muted-foreground\">Answers you picked in Bridge, not sent yet. Nothing goes until you press Send.</p>\n </div>\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n {summary === undefined ? null : <SentSummary summary={summary} />}\n {basket.entries.length === 0 || summary !== undefined ? (\n <EmptyBasket />\n ) : (\n <div className=\"max-w-[820px] overflow-hidden rounded-lg border border-border bg-card\">\n <ul>\n {basket.entries.map((entry, index) => (\n <BasketEntryRow key={entry.questionId} entry={entry} line={lines[index]} opening={opening} working={working} onRemove={remove} />\n ))}\n </ul>\n <BasketFootBar foot={footOf(basket)} isSending={working?.kind === 'send'} isWorking={working !== undefined || opening.openingId !== undefined} onSend={send} />\n </div>\n )}\n </section>\n )}\n </ItemFocus>\n );\n}\n","/** The time of day of an instant (ISO 8601), in UTC to the minute, as Bridge says when something happened: 20:16 UTC. */\nexport function clockTimeOf(at: string): string {\n return `${new Date(at).toISOString().slice(11, 16)} UTC`;\n}\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'arrow-right',\n size: 24,\n node: [\n ['path', { d: 'M5 12h14', key: '1ays0h' }],\n ['path', { d: 'm12 5 7 7-7 7', key: 'xquz4c' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name ArrowRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/arrow-right\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ArrowRight = createLucideIcon(__iconData);\n\nexport default ArrowRight;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'clock',\n size: 24,\n node: [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'M12 6v6l4 2', key: 'mmk7yg' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Clock\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/clock\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Clock = createLucideIcon(__iconData);\n\nexport default Clock;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'pencil',\n size: 24,\n node: [\n [\n 'path',\n {\n d: 'M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z',\n key: '1a8usu',\n },\n ],\n ['path', { d: 'm15 5 4 4', key: '1mk7zo' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Pencil\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/pencil\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Pencil = createLucideIcon(__iconData);\n\nexport default Pencil;\n","/**\n * The basket as Bridge shows it (docs/design/bridge, section 9; basket.html,\n * basket-3 to basket-7): each entry's answer, the line under it as it\n * stands, the foot naming the ships or saying how the send goes, and what\n * was sent, in words, each with its desktop and its shorter phone words.\n * Pure view logic, no React and no API client.\n */\nimport type { inferRouterOutputs } from '@trpc/server';\n\nimport type { GatewayRouter } from '../../../../src/adapters/trpc/router.js';\nimport { clockTimeOf } from './clock-time';\n\ntype PeopleOutputs = inferRouterOutputs<GatewayRouter>['people'];\n\n/** The basket as the API answers it: its entries in the order added, its count, and how many answers Send sends. */\nexport type BasketView = PeopleOutputs['basket'];\n\n/** An entry of the basket, with what it stands as. */\nexport type BasketItem = BasketView['entries'][number];\n\ntype Standing = BasketItem['standing'];\n\n/** What Send did, as the API answers it. */\nexport type BasketSent = PeopleOutputs['sendBasket'];\n\n/** Words as a desktop says them, and as a phone says them, shorter. */\nexport interface Words {\n readonly desktop: string;\n readonly phone: string;\n}\n\n/** The line under an entry: its icon, the tone of the icon, and its words. */\nexport interface EntryLine {\n readonly icon: 'sent' | 'sending' | 'next' | 'unanswered' | 'refused' | 'withdrawn' | 'replaced' | 'elsewhere';\n readonly tone: 'ok' | 'waiting' | 'attention' | 'off';\n readonly words: Words;\n}\n\n/** The basket's foot: Send naming the ships, the send going on, what came of it, or none. */\nexport type BasketFoot = { readonly kind: 'send'; readonly words: Words; readonly label: string } | { readonly kind: 'sending'; readonly words: Words; readonly progress: string } | { readonly kind: 'summary'; readonly words: Words } | { readonly kind: 'none' };\n\nconst PLACES: Record<Extract<Standing, { kind: 'dealtElsewhere' }>['place'], string> = {\n bridge: 'in Bridge',\n chat: 'in a chat',\n slack: 'in Slack',\n gateway: 'by the gateway',\n};\n\nfunction same(words: string): Words {\n return { desktop: words, phone: words };\n}\n\nfunction answersOf(count: number): string {\n return count === 1 ? '1 answer' : `${String(count)} answers`;\n}\n\n/** Names in a sentence: a, b and c. */\nfunction listOf(names: readonly string[]): string {\n return names.length <= 1 ? names.join('') : `${names.slice(0, -1).join(', ')} and ${names.at(-1) ?? ''}`;\n}\n\n/** Each asker once, in the order added. */\nfunction askersOf(entries: readonly BasketItem[]): string[] {\n return [...new Set(entries.map(({ from }) => from))];\n}\n\n/** The Send button, naming how many answers it sends. */\nexport function sendLabelOf(toSend: number): string {\n return `Send ${answersOf(toSend)}`;\n}\n\n/** The answer an entry gives, by its number and label (2. Harbour first, on today's look); a note alone as such. */\nexport function answerTextOf(item: Pick<BasketItem, 'option' | 'optionLabel'>): string {\n if (item.option === null) {\n return 'Note alone';\n }\n return item.optionLabel === null ? `Option ${String(item.option)}` : `${String(item.option)}. ${item.optionLabel}`;\n}\n\n/** Whether an entry is not sent, as its asker withdrew or replaced it or it was answered elsewhere first: struck out. */\nexport function isStruckOut(standing: Standing): boolean {\n return standing.kind === 'withdrawn' || standing.kind === 'replaced' || standing.kind === 'dealtElsewhere';\n}\n\n/** The line under one entry, given whether another entry was sent and whether this is the one being sent now. */\nfunction lineOf(item: BasketItem, context: { isAnySent: boolean; isSendingNow: boolean }): EntryLine | undefined {\n const { standing, from } = item;\n switch (standing.kind) {\n case 'waiting':\n return undefined;\n case 'sent': {\n const at = clockTimeOf(standing.at);\n return { icon: 'sent', tone: 'ok', words: { desktop: `Sent at ${at} and stored. Done.`, phone: `Sent at ${at}. Done.` } };\n }\n case 'sending':\n if (standing.isUnanswered) {\n return { icon: 'unanswered', tone: 'waiting', words: { desktop: 'The fleet did not answer. Sending again with the same key until it is stored; it arrives once.', phone: 'No answer from the fleet. Sending again, same key.' } };\n }\n return context.isSendingNow ? { icon: 'sending', tone: 'waiting', words: same('Sending...') } : { icon: 'next', tone: 'waiting', words: { desktop: 'Next, in the order you added it', phone: 'Next' } };\n case 'refused': {\n const said = `Not sent: ${standing.reason}.`;\n // The phone says the reason without its consequence, as basket-7 draws it: Not sent: commercial was retired.\n const [cause = standing.reason] = standing.reason.split(', so ');\n return { icon: 'refused', tone: 'attention', words: { desktop: context.isAnySent ? `${said} The others were sent.` : said, phone: `Not sent: ${cause}.` } };\n }\n case 'withdrawn':\n return { icon: 'withdrawn', tone: 'off', words: { desktop: `Withdrawn by ${from} at ${clockTimeOf(standing.at)}. Not sent; Send skips it.`, phone: `Withdrawn by ${from}. Not sent.` } };\n case 'replaced': {\n const withTitle = standing.replacementTitle === null ? '.' : ` with \"${standing.replacementTitle}\"`;\n return { icon: 'replaced', tone: 'off', words: { desktop: `Replaced by ${from} at ${clockTimeOf(standing.at)}${withTitle} Not sent: its options differ, so answer the new one.`, phone: `Replaced by ${from}. Not sent.` } };\n }\n case 'dealtElsewhere':\n return { icon: 'elsewhere', tone: 'off', words: same(standing.option === null ? `Done ${PLACES[standing.place]}. Nothing is sent from it.` : `Answered ${PLACES[standing.place]}: option ${String(standing.option)}. Nothing is sent from it.`) };\n }\n}\n\n/** The line under each entry, in the order added: the first sending one the fleet has not left unanswered is the one being sent now, the others next. */\nexport function entryLinesOf(view: BasketView): (EntryLine | undefined)[] {\n const isAnySent = view.entries.some(({ standing }) => standing.kind === 'sent');\n const now = view.entries.find(({ standing }) => standing.kind === 'sending' && !standing.isUnanswered);\n return view.entries.map((item) => lineOf(item, { isAnySent, isSendingNow: item === now }));\n}\n\n/** The entries not sent, by kind, as the foot says them: The withdrawn and the replaced one are not sent. */\nfunction notSentOf(entries: readonly BasketItem[]): string | undefined {\n const counted = (kind: Standing['kind']) => entries.filter(({ standing }) => standing.kind === kind).length;\n const stale = (['withdrawn', 'replaced'] as const).map((kind) => ({ kind, count: counted(kind) })).filter(({ count }) => count > 0);\n const named = stale.map(({ kind, count }, index) => (count > 1 ? `the ${String(count)} ${kind}` : index === stale.length - 1 ? `the ${kind} one` : `the ${kind}`));\n const elsewhere = counted('dealtElsewhere');\n const all = elsewhere === 0 ? named : [...named, elsewhere === 1 ? 'the one answered elsewhere' : `the ${String(elsewhere)} answered elsewhere`];\n if (all.length === 0) {\n return undefined;\n }\n const sentence = listOf(all);\n const isOne = stale.reduce((sum, { count }) => sum + count, elsewhere) === 1;\n return `${sentence.charAt(0).toUpperCase()}${sentence.slice(1)} ${isOne ? 'is' : 'are'} not sent.`;\n}\n\n/** The foot while the basket waits for Send: the ships each receiving their own answer, or how many go and which are not sent. */\nfunction sendFootOf(view: BasketView): BasketFoot {\n const notSent = notSentOf(view.entries);\n const label = sendLabelOf(view.toSend);\n if (notSent !== undefined) {\n return { kind: 'send', words: { desktop: `${String(view.toSend)} to send. ${notSent}`, phone: notSent }, label };\n }\n const waiting = view.entries.filter(({ standing }) => standing.kind === 'waiting');\n const askers = askersOf(waiting);\n const receive = askers.length > 1 ? 'each receive their own answer' : waiting.length > 1 ? 'receives its own answer to each' : 'receives its own answer';\n return { kind: 'send', words: { desktop: `${listOf(askers)} ${receive}, as you, as if sent one by one.`, phone: 'Each asker receives its own answer.' }, label };\n}\n\n/** The basket's foot: Send while answers wait for it; Sending N of M while the send goes well; what came of it once one was not answered or refused. */\nexport function footOf(view: BasketView): BasketFoot {\n if (view.toSend > 0) {\n return sendFootOf(view);\n }\n const kinds = view.entries.map(({ standing }) => standing);\n const sent = kinds.filter(({ kind }) => kind === 'sent').length;\n const sending = kinds.filter(({ kind }) => kind === 'sending').length;\n const refused = kinds.filter(({ kind }) => kind === 'refused').length;\n const isAnyUnanswered = kinds.some((standing) => standing.kind === 'sending' && standing.isUnanswered);\n if (sending > 0 && refused === 0 && !isAnyUnanswered) {\n return { kind: 'sending', words: { desktop: 'You can close Bridge: the gateway keeps sending what is stored as sending.', phone: 'You can close Bridge; the gateway keeps sending.' }, progress: `Sending ${String(sent + 1)} of ${String(sent + sending)}` };\n }\n if (sending === 0 && refused === 0) {\n return { kind: 'none' };\n }\n const part = (count: number, words: string) => (count === 0 ? [] : [`${String(count)} ${words}`]);\n return {\n kind: 'summary',\n words: {\n desktop: `${[...part(sent, 'sent'), ...part(sending, 'still sending'), ...part(refused, 'not sent')].join(', ')}.`,\n phone: `${[...part(sent, 'sent'), ...part(sending, 'sending'), ...part(refused, 'not sent')].join(', ')}.`,\n },\n };\n}\n\n/** What was sent, once every entry left in the basket was sent: how many answers, to which ships. */\nexport function sentSummaryOf(view: BasketView): { title: string; description: string } | undefined {\n const { entries } = view;\n if (entries.length === 0 || entries.some(({ standing }) => standing.kind !== 'sent')) {\n return undefined;\n }\n const to = `To ${listOf(askersOf(entries))}, as you;`;\n return { title: `${answersOf(entries.length)} sent`, description: entries.length === 1 ? `${to} stored, and in Done.` : `${to} each stored, each in Done.` };\n}\n"],"names":["ArrowRight"],"mappings":"qEGGO,CAAA,AEAA,ADAA,CCAA,AFAA,ACAA,CDAA,AEAA,ADAA,CCAA,AFAA,ACAA,ACAA,CDAA,ACAA,AFAA,CEAA,6CFIW,CAAA,ACAD,CDAC,ACAD,SDAa,IAAA,UAAe,GCAC,CAAA,wBDCX,CCAF,ADAE,CCAF,ADAE,EAAK,CCAF,ADAE,CCAF,ADAE,CAAA,ACAF,CDAE,ACAF,CAAA,ADAE,CAAA,IAAU,mBAoB/B,CAAA,ACAL,CAAA,ADAK,CCAL,ADAK,CAAA,ACAL,CDAK,ACAL,ADAK,CCAL,ADAK,CCAL,ADAK,CF1BnB,AE0BmB,ACAL,CAAA,ADAK,CCAL,ADAK,EF1BnB,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,YGC0C,MAClC,CAAA,ADAA,AEAA,CFAA,AEAA,ADAA,CCAA,AFAA,ACAA,CDAA,ACAA,ACAA,CAAA,AFAA,ACAA,CAAA,ADAA,AEAA,CFAA,ACAA,ACAA,CAAA,AFAA,CAAA,CAAA,CAAA,CAAA,CAAA,QCEA,YACS,GAAI,CDAH,ACAG,CDAH,ACAG,CDAH,ACAG,CDAH,ACAG,CDAH,ACAS,CAAA,ADAT,CAAA,ACAS,CAAI,CDAD,CAAA,CAAA,ECAO,CDAF,ACAE,CAAG,ADAL,CAAA,ACAK,CDAL,ACAK,CAAA,MAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,wCACb,wBAoBjB,CDAZ,ACAY,CAAA,ADAZ,CF1BnB,AE0BmB,ACAY,IH1B/B,EAAA,EAAA,CAAA,CAAA,kDIOM,CACE,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,4HACH,CDIoC,ADAA,CCAA,ADAA,EEJ/B,CDI0C,ACJ1C,AFI0C,OEJ1C,CDiBP,ADAA,CEfF,CACA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,EAAQ,CAAA,AAAE,EAAG,CAAA,CAAA,CAAA,SAAa,CAAA,CAAA,CAAA,CAAA,AAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,AAE9C,CAAA,CAK4C,CAAA,CAAW,CAAA,GAAA,KAajD,CAAA,CAAA,CAAA,CAAA,CAAA,AAAS,CAAA,AAAT,CAAS,AAAT,CAAS,AAAT,CAAS,CAAA,AAAiB,CAAjB,AAAiB,CAAjB,AAAiB,CAAjB,AAAiB,AJhChC,CIgCe,AAAiB,CAAjB,AAAiB,CAAjB,AAAiB,CAAjB,AJhCf,AIgCgC,CAAA,AAAjB,CAAiB,AAAjB,AJhCf,CIgC0C,AAA3B,CAA2B,AJhC1C,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAEA,EAAA,EAAA,CAAA,CAAA,ODLwM,EAAA,EAAA,CAAA,CAAA,MAAsG,IAAM,EAAmC,CAAA,EAAA,EAAA,iBAAb,IAAkC,AAArB,EAAsB,KAAxB,wCAAqE,EAAA,UAAU,CAAC,KAAKA,EAAE,EAAA,gBAAgB,CAAC,cECtb,SAAS,EAAY,CAAU,EACpC,MAAO,CAAA,EAAG,IAAI,KAAK,GAAI,WAAW,GAAG,KAAK,CAAC,GAAI,IAAI,IAAI,CAAC,AAC1D,CIsCA,IAAM,EAAiF,CACrF,OAAQ,YACR,KAAM,YACN,MAAO,WACP,QAAS,gBACX,EAEA,SAAS,EAAK,CAAa,EACzB,MAAO,CAAE,QAAS,EAAO,MAAO,CAAM,CACxC,CAEA,SAAS,EAAU,CAAa,EAC9B,OAAiB,IAAV,EAAc,WAAa,CAAA,EAAG,OAAO,GAAO,QAAQ,CAAC,AAC9D,CAGA,SAAS,EAAO,CAAwB,EACtC,OAAO,EAAM,MAAM,EAAI,EAAI,EAAM,IAAI,CAAC,IAAM,CAAA,EAAG,EAAM,KAAK,CAAC,EAAG,CAAC,GAAG,IAAI,CAAC,MAAM,KAAK,EAAE,EAAM,EAAE,CAAC,CAAC,IAAM,GAAA,CAAI,AAC1G,CAGA,SAAS,EAAS,CAA8B,EAC9C,MAAO,IAAI,IAAI,IAAI,EAAQ,GAAG,CAAC,CAAC,MAAE,CAAI,CAAE,GAAK,IAAO,AACtD,CLxDA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAKA,IAAM,EAAa,CACjB,KAAM,EAAA,CAAW,CACjB,QAAS,EAAA,CAAY,CACrB,KAAM,EACN,WAAY,EAAA,CAAY,CACxB,QAAS,EAAA,CAAW,CACpB,UAAW,EAAA,CAAG,CACd,SAAU,EAAA,CAAO,CACjB,UAAW,EAAA,CAAK,AAClB,EAEM,EAAa,CACjB,GAAI,kBACJ,QAAS,uBACT,UAAW,yBACX,IAAK,uBACP,EAGA,SAAS,EAAK,OAAE,CAAK,CAAoB,SACvC,AAAI,EAAM,OAAO,GAAK,EAAM,KAAK,CACxB,CAD0B,AAC1B,EAAA,EAAA,GAAA,EAAC,OAAA,UAAM,EAAM,OAAO,GAG3B,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,4BAAoB,EAAM,OAAO,GACjD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,EAAM,KAAK,KAG9C,CAGA,SAAS,EAAc,MAAE,CAAI,CAAuB,EAClD,IAAM,EAAO,CAAU,CAAC,EAAK,IAAI,CAAC,CAClC,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAE,cAAY,yBAAyB,UAAU,sEAChD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAK,aAAW,CAAA,CAAA,EAAC,UAAW,CAAC,yBAAyB,EAAE,CAAU,CAAC,EAAK,IAAI,CAAC,CAAA,CAAE,GAChF,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAK,MAAO,EAAK,KAAK,OAI/B,CAGA,SAAS,EAAe,OAAE,CAAK,MAAE,CAAI,SAAE,CAAO,CAAE,SAAO,UAAE,CAAQ,CAAkJ,EACjN,GAAM,UAAE,CAAQ,CAAE,CAAG,EACf,EKmBmB,SLnBR,KAAY,AKmBtB,EAAS,IAAI,EAAoB,AAAkB,eAAT,IAAI,EAAqC,mBAAlB,EAAS,IAAI,CLlB/E,OAAwB,IAAZ,QAA+C,IAAtB,EAAQ,SAAS,CACtD,EAAa,GAAS,OAAS,UAAY,EAAQ,UAAU,GAAK,EAAM,UAAU,CAClF,EAAkC,aAAlB,EAAS,IAAI,CAAkB,EAAS,aAAa,CAAG,KACxE,EAAS,EAAW,2CAA6C,GACvE,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,cAAY,sBAAsB,gBAAe,EAAS,IAAI,CAAE,UAAW,CAAC,qHAAqH,EAAE,EAAW,WAAa,GAAA,CAAI,WACjO,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAkB,CAAA,CAAC,aAAW,CAAA,CAAA,EAAC,UAAU,sCAC1C,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,0CACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAW,CAAC,YAAY,EAAE,EAAA,CAAQ,UAAG,EAAM,KAAK,GACtD,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,mFACd,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,WAAK,MACD,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,uCAA+B,EAAM,IAAI,MAE3D,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,aAAW,CAAA,CAAA,EAAC,UAAU,wCAA+B,MAG3D,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,6BAAmB,YACxB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,SAAU,EAAM,MAAM,UAAG,EAAY,EAAM,MAAM,UAGpE,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAW,CAAA,EAAG,EAAW,iBAAmB,OAAO,gCAAgC,EAAE,EAAA,CAAQ,WACjG,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAW,aAAW,CAAA,CAAA,EAAC,UAAU,mCKXtB,AAApB,MAA0B,CAAtB,EAAK,MAAM,CACN,aAEmB,OAArB,EAAK,WAAW,CAAY,CAAC,OAAO,EAAE,OAAO,EAAK,MAAM,EAAA,CAAG,CAAG,CAAA,EAAG,OAAO,EAAK,MAAM,EAAE,EAAE,EAAE,ALS1E,EKT+E,WAAW,CAAA,CAAE,ILW5F,OAAf,EAAM,IAAI,CAAY,KAAO,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,sDAA4C,IAAO,EAAM,IAAI,CAAC,UAE3F,YAAlB,EAAS,IAAI,CACZ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sCACb,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,CAAY,CAAA,CAAC,cAAY,uBAAuB,KAAK,QAAQ,aAAW,SAAS,UAAW,EAAQ,SAAS,GAAK,EAAM,UAAU,CAAE,aAAa,aAAa,SAAU,EAAW,QAAS,KAAQ,EAAQ,IAAI,CAAC,CAAE,WAAY,EAAM,UAAU,CAAE,IAAK,SAAU,SAAU,CAAE,OAAQ,EAAM,MAAM,CAAE,KAAM,EAAM,IAAI,AAAC,CAAE,EAAI,YACxT,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAO,aAAW,CAAA,CAAA,EAAC,UAAU,aAC9B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,4BAAmB,cAErC,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,CAAY,CAAA,CAAC,cAAY,uBAAuB,KAAK,QAAQ,QAAQ,QAAQ,aAAW,SAAS,UAAW,EAAY,aAAa,cAAc,SAAU,EAAW,QAAS,KAAQ,EAAS,EAAM,UAAU,CAAG,YACpN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAC,CAAA,CAAC,aAAW,CAAA,CAAA,EAAC,UAAU,qBACzB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,4BAAmB,iBAIvC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAA,QAEO,IAAT,EAAqB,KAAO,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAc,KAAM,IACjD,EAAQ,OAAO,EAAE,aAAe,EAAM,UAAU,CAC/C,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,kCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAM,CAAA,CAAC,QAAS,EAAQ,OAAO,CAAC,OAAO,CAAE,SAAS,CAAA,CAAA,MAEnD,KACe,cAAlB,EAAS,IAAI,EAAoB,AAAkB,eAAT,IAAI,EAAqC,mBAAlB,EAAS,IAAI,EAAyB,AAAkB,cAAT,IAAI,CACnH,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uEACM,OAAlB,EAAyB,KACxB,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,CAAY,CAAA,CAAC,cAAY,qBAAqB,KAAK,QAAQ,UAAW,EAAQ,SAAS,GAAK,EAAe,aAAa,aAAa,SAAU,EAAW,QAAS,KAAQ,EAAQ,IAAI,CAAC,CAAE,WAAY,EAAe,IAAK,QAAS,EAAI,YACtO,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAW,aAAW,CAAA,CAAA,EAAC,UAAU,aAAa,6BAInD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,CAAA,CAAC,cAAY,uBAAuB,KAAK,QAAQ,QAA2B,aAAlB,EAAS,IAAI,CAAkB,QAAU,YAAa,UAAW,EAAY,aAAa,cAAc,SAAU,EAAW,QAAS,KAAQ,EAAS,EAAM,UAAU,CAAG,WAC5N,YAAlB,EAAS,IAAI,CAAiB,uBAAyB,cAG1D,OAGV,CAGA,SAAS,EAAc,MAAE,CAAI,WAAE,CAAS,WAAE,CAAS,CAAE,QAAM,CAAoF,QAC7I,AAAkB,QAAQ,CAAtB,EAAK,IAAI,CACJ,KAGP,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,cAAY,qBAAqB,UAAU,gIAC9C,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,qDACX,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAK,MAAO,EAAK,KAAK,KAEV,SAAd,EAAK,IAAI,CACR,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,CAAY,CAAA,CAAC,cAAY,qBAAqB,QAAQ,UAAU,UAAU,iBAAiB,UAAW,EAAW,aAAa,aAAa,SAAU,EAAW,QAAS,YACxK,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAI,CAAA,CAAC,aAAW,CAAA,CAAA,EAAC,UAAU,WAC3B,EAAK,KAAK,IAEX,KACW,YAAd,EAAK,IAAI,CACR,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,KAAK,SAAS,cAAY,wBAAwB,QAAQ,CAAA,CAAA,EAAC,YAAU,OAAO,UAAU,4IAC5F,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,CAAA,CAAC,aAAW,CAAA,CAAA,EAAC,UAAU,wBACnC,EAAK,QAAQ,IAEd,OAGV,CAGA,SAAS,EAAY,SAAE,CAAO,CAAuD,EACnF,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,cAAY,qBAAqB,KAAK,SAAS,UAAU,kIAC5D,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAW,CAAA,CAAC,aAAW,CAAA,CAAA,EAAC,UAAU,2CACnC,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,uBACd,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uBAAe,EAAQ,KAAK,GAC5C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,8CAAsC,EAAQ,WAAW,QAIjF,CAGA,SAAS,IACP,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,cAAY,sBAAsB,UAAU,uIAC/C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,yGACd,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAc,CAAA,CAAC,aAAW,CAAA,CAAA,EAAC,UAAU,aAExC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,sCAA6B,wBAC7C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,+CAAsC,8FAG5D,sBAeO,SAAS,AAAY,SAAE,CAAO,QAAE,CAAM,CAA2C,EACtF,MKzEM,ELyEA,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,IAChC,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,IAChC,EAAG,EAAgB,CAAG,CAAA,EAAA,EAAA,aAAA,AAAa,IACnC,GK7EA,EL6EqB,AK7ET,EAAK,CL6ET,MK7EgB,CAAC,IAAI,CAAC,CAAC,UAAE,CAAQ,CAAE,GAAuB,SAAlB,EAAS,IAAI,IACvD,EAAK,OAAO,CAAC,IAAI,CAAC,CAAC,UAAE,CAAQ,CAAE,GAAuB,YAAlB,EAAS,IAAI,EAAkB,CAAC,EAAS,YAAY,EAC9F,EAAK,OAAO,CAAC,GAAG,CAAC,AAAC,GAAS,CAnCpC,SAAS,AAAO,CAAgB,CAAE,CAAsD,EACtF,GAAM,UAAE,CAAQ,MAAE,CAAI,CAAE,CAAG,EAC3B,OAAQ,EAAS,IAAI,EACnB,IAAK,UACH,MACF,CADS,IACJ,OAAQ,CACX,IAAM,EAAK,EAAY,EAAS,EAAE,EAClC,MAAO,CAAE,KAAM,OAAQ,KAAM,KAAM,MAAO,CAAE,QAAS,CAAC,QAAQ,EAAE,EAAG,kBAAkB,CAAC,CAAE,MAAO,CAAC,QAAQ,EAAE,EAAG,OAAO,CAAC,AAAC,CAAE,CAC1H,CACA,IAAK,UACH,GAAI,EAAS,YAAY,CACvB,CADyB,KAClB,CAAE,KAAM,aAAc,KAAM,UAAW,MAAO,CAAE,QAAS,iGAAkG,MAAO,oDAAqD,CAAE,EAElO,OAAO,EAAQ,YAAY,CAAG,CAAE,KAAM,UAAW,KAAM,UAAW,MAAO,EAAK,aAAc,EAAI,CAAE,KAAM,OAAQ,KAAM,UAAW,MAAO,CAAE,QAAS,kCAAmC,MAAO,MAAO,CAAE,CACxM,KAAK,UAAW,CACd,IAAM,EAAO,CAAC,UAAU,EAAE,EAAS,MAAM,CAAC,CAAC,CAAC,CAEtC,CAAC,EAAQ,EAAS,MAAM,CAAC,CAAG,EAAS,MAAM,CAAC,KAAK,CAAC,SACxD,MAAO,CAAE,KAAM,UAAW,KAAM,YAAa,MAAO,CAAE,QAAS,EAAQ,SAAS,CAAG,CAAA,EAAG,EAAK,sBAAsB,CAAC,CAAG,EAAM,MAAO,CAAC,UAAU,EAAE,EAAM,CAAC,CAAC,AAAC,CAAE,CAC5J,CACA,IAAK,YACH,MAAO,CAAE,KAAM,YAAa,KAAM,MAAO,MAAO,CAAE,QAAS,CAAC,aAAa,EAAE,EAAK,IAAI,EAAE,EAAY,EAAS,EAAE,EAAE,0BAA0B,CAAC,CAAE,MAAO,CAAC,aAAa,EAAE,EAAK,WAAW,CAAC,AAAC,CAAE,CACzL,KAAK,WAAY,CACf,IAAM,EAAY,AAA8B,SAArB,gBAAgB,CAAY,IAAM,CAAC,OAAO,EAAE,EAAS,gBAAgB,CAAC,CAAC,CAAC,CACnG,MAAO,CAAE,KAAM,WAAY,KAAM,MAAO,MAAO,CAAE,QAAS,CAAC,YAAY,EAAE,EAAK,IAAI,EAAE,EAAY,EAAS,EAAE,EAAA,EAAI,EAAU,qDAAqD,CAAC,CAAE,MAAO,CAAC,YAAY,EAAE,EAAK,WAAW,CAAC,AAAC,CAAE,CAC7N,CACA,IAAK,iBACH,MAAO,CAAE,KAAM,YAAa,KAAM,MAAO,MAAO,EAAyB,OAApB,EAAS,MAAM,CAAY,CAAC,KAAK,EAAE,CAAM,CAAC,EAAS,KAAK,CAAC,CAAC,0BAA0B,CAAC,CAAG,CAAC,SAAS,EAAE,CAAM,CAAC,EAAS,KAAK,CAAC,CAAC,SAAS,EAAE,OAAO,EAAS,MAAM,EAAE,0BAA0B,CAAC,CAAE,CACpP,EACF,EAM2C,EAAM,CAAE,YAAW,aAAc,IAAS,CAAI,KL4EjF,EKlBD,ALkBW,SKlBY,AAAd,CAA8B,EAC5C,GAAM,SAAE,CAAO,CAAE,CAAG,EACpB,GAAuB,IAAnB,EAAQ,MAAM,EAAU,EAAQ,IAAI,CAAC,CAAC,UAAE,CAAQ,CAAE,GAAuB,SAAlB,AAA2B,EAAlB,IAAI,EACtE,OAAO,AAET,IAAM,EAAK,CAAC,GAAG,EAAE,EAAO,EAAS,IAAU,SAAS,CAAC,CACrD,MAAO,CAAE,MAAO,CAAA,EAAG,EAAU,EAAQ,MAAM,EAAE,KAAK,CAAC,CAAE,YAAa,AAAmB,MAAX,MAAM,CAAS,CAAA,EAAG,EAAG,qBAAqB,CAAC,CAAG,CAAA,EAAG,EAAG,2BAA2B,CAAC,AAAC,CAC7J,ELWgC,GAExB,EAAS,AAAC,IACd,EAAW,CAAE,KAAM,oBAAU,CAAW,GACxC,OAAW,GACX,EAAgB,UACd,IAAM,EAAU,MAAM,CAAA,EAAA,EAAA,CAAA,AAAgB,EAAC,EAAS,GAChD,OAAW,GACX,EAAW,EAAQ,IAAI,MAAG,EAAY,EAAQ,OAAO,CACvD,EACF,EAEM,EAAO,KACX,EAAW,CAAE,KAAM,MAAO,GAC1B,OAAW,GACX,EAAgB,UACd,IAAM,EAAU,MAAM,EAAW,GACjC,OAAW,GACX,EAAW,EAAQ,IAAI,MAAG,EAAY,EAAQ,OAAO,CACvD,EACF,EAEA,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAS,CAAA,CAAC,QAAS,WACjB,AAAC,GACA,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,aAAa,kBAAgB,kCAC9C,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4BACb,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,GAAG,wBAAwB,UAAU,uCAA6B,UAC7D,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,cAAY,sBAAsB,UAAU,wBAAgB,EAAO,KAAK,MAEvF,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8CAAqC,2FAEvC,IAAZ,EAAwB,KAAO,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAM,CAAA,CAAC,QAAS,EAAS,SAAS,CAAA,CAAA,SACtD,IAAZ,EAAwB,KAAO,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,QAAS,IAC3B,IAA1B,EAAO,OAAO,CAAC,MAAM,OAAsB,IAAZ,EAC9B,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAA,GAED,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kFACb,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,UACE,EAAO,OAAO,CAAC,GAAG,CAAC,CAAC,EAAO,IAC1B,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAsC,MAAO,EAAO,KAAM,CAAK,CAAC,EAAM,CAAE,QAAS,EAAS,QAAS,EAAS,SAAU,GAAlG,EAAM,UAAU,KAGzC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAc,KKvFtB,ALuF4B,SKvFnB,AAAO,CAAgB,EACrC,GAAI,EAAK,MAAM,CAAG,EAChB,CADmB,MAdvB,AAeW,SAfF,AAAW,CAAgB,QAClC,IAAM,EAAU,AAhBlB,SAAS,AAAU,CAA8B,EAC/C,IAAM,EAAU,AAAC,GAA2B,EAAQ,MAAM,CAAC,CAAC,UAAE,CAAQ,CAAE,GAAK,EAAS,IAAI,GAAK,GAAM,MAAM,CACrG,EAAS,CAAC,YAAa,WAAW,CAAW,GAAG,CAAC,AAAC,IAAU,GAAD,GAAG,EAAM,MAAO,EAAQ,GAAM,CAAC,EAAG,MAAM,CAAC,CAAC,OAAE,CAAK,CAAE,GAAK,EAAQ,GAC3H,EAAQ,EAAM,GAAG,CAAC,CAAC,MAAE,CAAI,OAAE,CAAK,CAAE,CAAE,IAAW,EAAQ,EAAI,CAAC,IAAI,EAAE,OAAO,GAAO,CAAC,EAAE,EAAA,CAAM,CAAG,IAAU,EAAM,MAAM,CAAG,EAAI,CAAC,IAAI,EAAE,EAAK,IAAI,CAAC,CAAG,CAAC,IAAI,EAAE,EAAA,CAAM,EAC1J,EAAY,EAAQ,kBACpB,EAAoB,IAAd,EAAkB,EAAQ,IAAI,EAAqB,IAAd,EAAkB,6BAA+B,CAAC,IAAI,EAAE,OAAO,GAAW,mBAAmB,CAAC,CAAC,CAChJ,GAAmB,GAAG,CAAlB,EAAI,MAAM,CACZ,OAEF,AAFS,IAEH,EAAW,EAAO,GAClB,EAAqE,IAA7D,EAAM,MAAM,CAAC,CAAC,EAAK,OAAE,CAAK,CAAE,GAAK,EAAM,EAAO,GAC5D,MAAO,CAAA,EAAG,EAAS,MAAM,CAAC,GAAG,WAAW,GAAA,EAAK,EAAS,KAAK,CAAC,GAAG,CAAC,EAAE,EAAQ,KAAO,MAAM,UAAU,CAAC,AACpG,EAI4B,EAAK,OAAO,EAChC,GA1EoB,EA0EA,EAAK,CAAjB,CA1E0B,IA0EH,CAzE9B,CAAC,KAAK,EAAE,EAAU,GAAA,CAAS,EA0ElC,QAAgB,IAAZ,EACF,KADyB,CAClB,CAAE,KAAM,OAAQ,MAAO,CAAE,QAAS,CAAA,EAAG,OAAO,EAAK,MAAM,EAAE,UAAU,EAAE,EAAA,CAAS,CAAE,MAAO,CAAQ,QAAG,CAAM,EAEjH,IAAM,EAAU,EAAK,OAAO,CAAC,MAAM,CAAC,CAAC,UAAE,CAAQ,CAAE,GAAuB,YAAlB,EAAS,IAAI,EAC7D,EAAS,EAAS,GAClB,EAAU,EAAO,MAAM,CAAG,EAAI,gCAAkC,EAAQ,MAAM,CAAG,EAAI,kCAAoC,0BAC/H,MAAO,CAAE,KAAM,OAAQ,MAAO,CAAE,QAAS,CAAA,EAAG,EAAO,GAAQ,CAAC,EAAE,EAAQ,gCAAgC,CAAC,CAAE,MAAO,qCAAsC,QAAG,CAAM,CACjK,EAKsB,GAEpB,IAAM,EAAQ,EAAK,OAAO,CAAC,GAAG,CAAC,CAAC,UAAE,CAAQ,CAAE,GAAK,GAC3C,EAAO,EAAM,MAAM,CAAC,CAAC,MAAE,CAAI,CAAE,GAAK,AAAS,YAAQ,MAAM,CACzD,EAAU,EAAM,MAAM,CAAC,CAAC,MAAE,CAAI,CAAE,GAAc,YAAT,GAAoB,MAAM,CAC/D,EAAU,EAAM,MAAM,CAAC,CAAC,MAAE,CAAI,CAAE,GAAc,YAAT,GAAoB,MAAM,CAC/D,EAAkB,EAAM,IAAI,CAAC,AAAC,GAA+B,YAAlB,EAAS,IAAI,EAAkB,EAAS,YAAY,EACrG,GAAI,EAAU,GAAiB,IAAZ,GAAiB,CAAC,EACnC,MAAO,CAAE,KAAM,GADqC,OAC1B,MAAO,CAAE,QAAS,6EAA8E,MAAO,kDAAmD,EAAG,SAAU,CAAC,QAAQ,EAAE,OAAO,EAAO,GAAG,IAAI,EAAE,OAAO,EAAO,GAAA,CAAU,AAAC,EAE9P,GAAgB,IAAZ,GAA6B,GAAG,CAAf,EACnB,MAAO,CAAE,KAAM,MAAO,EAExB,IAAM,EAAO,CAAC,EAAe,IAA6B,IAAV,EAAc,EAAE,CAAG,CAAC,CAAA,EAAG,OAAO,GAAO,CAAC,EAAE,EAAA,CAAO,CAAC,CAChG,MAAO,CACL,KAAM,UACN,MAAO,CACL,QAAS,CAAA,EAAG,IAAI,EAAK,EAAM,WAAY,EAAK,EAAS,oBAAqB,EAAK,EAAS,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAClH,MAAO,CAAA,EAAG,IAAI,EAAK,EAAM,WAAY,EAAK,EAAS,cAAe,EAAK,EAAS,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,AAC5G,CACF,CACF,ELgE0C,GAAS,UAAW,GAAS,OAAS,OAAQ,eAAuB,IAAZ,QAA+C,IAAtB,EAAQ,SAAS,CAAgB,OAAQ,WAOrK","ignoreList":[3,4,5]}
|
package/web/.next/server/chunks/ssr/web_features_bridge_state_decision-panel_tsx_1mzsixgc8zuxc._.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[20298,a=>{"use strict";var b=a.i(87924),c=a.i(50944),d=a.i(72131),e=a.i(5050);let f=(0,e.createServerReference)("
|
|
1
|
+
module.exports=[20298,a=>{"use strict";var b=a.i(87924),c=a.i(50944),d=a.i(72131),e=a.i(5050);let f=(0,e.createServerReference)("407ec5a94e3e5f5383c309c1ce9ea498eafeded2c3",e.callServer,void 0,e.findSourceMapURL,"decideRequest");var g=a.i(16550),h=a.i(51636),i=a.i(35149);let j=["messages:send","messages:receive"],k={"messages:send":"Send","messages:receive":"Receive","fleet:read":"Read the fleet"};var l=a.i(32043),m=a.i(10039);let n="rounded-md border border-input bg-background px-2 py-1.5";function o({scope:a,isLocked:c}){return(0,b.jsxs)("label",{className:"flex items-center gap-2",children:[c?(0,b.jsx)("input",{type:"checkbox",checked:!0,disabled:!0,"aria-label":k[a]??a}):(0,b.jsx)("input",{type:"checkbox",name:"scope",value:a,"aria-label":k[a]??a}),(0,b.jsx)("span",{children:k[a]??a}),(0,b.jsx)("span",{className:"font-mono text-caption text-muted-foreground",children:a}),c?(0,b.jsx)("span",{className:"text-caption text-muted-foreground",children:"(always)"}):null]})}function p(a,b){let c=a.get(b);return"string"==typeof c?c:""}function q({request:a,heldScopes:c,owners:e,working:f,failure:g,onDecide:k}){let[r,s]=(0,d.useState)("bearer"),t=function(a){switch(a.subject.kind){case"client":return a.subject.clientName;case"server":return URL.canParse(a.subject.url)?new URL(a.subject.url).host:a.subject.url}}(a),u="server"===a.subject.kind;return(0,b.jsxs)("section",{className:"grid gap-3 rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm",children:[(0,b.jsxs)("h2",{className:"text-heading font-semibold",children:["Approve ",t]}),(0,b.jsxs)("form",{onSubmit:a=>{a.preventDefault();let b=new FormData(a.currentTarget),c=b.getAll("scope").filter(a=>"string"==typeof a);k({kind:"approve",name:p(b,"name"),ownerShipId:p(b,"ownerShipId"),scopes:c,server:u?{credentialKind:(0,h.C)(p(b,"credentialKind")),token:p(b,"token"),clientId:p(b,"clientId"),clientSecret:p(b,"clientSecret"),issuer:p(b,"issuer"),scope:p(b,"scope-requested"),concurrencyLimit:Number(p(b,"concurrencyLimit"))}:void 0})},className:"grid gap-3",children:[(0,b.jsxs)("label",{className:"grid gap-1",children:[(0,b.jsx)("span",{children:"Proxy ship's name"}),(0,b.jsx)("input",{name:"name",defaultValue:t.toLowerCase().replaceAll(/[^a-z0-9]+/g,"-").replaceAll(/^-+|-+$/g,""),required:!0,className:n})]}),(0,b.jsx)(i.f,{choices:e.isOk?e.value:[],current:null,help:"A person ship or argo. It answers for this party.",refusal:e.isOk?void 0:e.refusal}),(0,b.jsxs)("fieldset",{className:"grid gap-1",children:[(0,b.jsx)("legend",{children:"Scopes"}),j.map(a=>(0,b.jsx)(o,{scope:a,isLocked:!0},a)),c.filter(a=>!j.includes(a)).map(a=>(0,b.jsx)(o,{scope:a,isLocked:!1},a))]}),u?(0,b.jsxs)("fieldset",{className:"grid gap-2",children:[(0,b.jsx)("legend",{children:"The server's credential"}),(0,b.jsxs)("label",{className:"grid gap-1",children:[(0,b.jsx)("span",{children:"Credential"}),(0,b.jsx)("select",{name:"credentialKind",value:r,onChange:a=>{s((0,h.C)(a.target.value))},className:n,children:h.x.map(({kind:a,label:c})=>(0,b.jsx)("option",{value:a,children:c},a))})]}),"none"===r?null:"bearer"===r?(0,b.jsxs)("label",{className:"grid gap-1",children:[(0,b.jsx)("span",{children:"Bearer token"}),(0,b.jsx)("input",{type:"password",name:"token",className:n})]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("label",{className:"grid gap-1",children:[(0,b.jsx)("span",{children:"Client id"}),(0,b.jsx)("input",{name:"clientId",className:n})]}),(0,b.jsxs)("label",{className:"grid gap-1",children:[(0,b.jsx)("span",{children:"Client secret"}),(0,b.jsx)("input",{type:"password",name:"clientSecret",className:n})]}),(0,b.jsxs)("label",{className:"grid gap-1",children:[(0,b.jsx)("span",{children:"Issuer"}),(0,b.jsx)("input",{type:"url",name:"issuer",className:n})]}),(0,b.jsxs)("label",{className:"grid gap-1",children:[(0,b.jsx)("span",{children:"Scope"}),(0,b.jsx)("input",{name:"scope-requested",className:n})]})]}),(0,b.jsxs)("label",{className:"grid gap-1",children:[(0,b.jsx)("span",{children:"Calls at once"}),(0,b.jsx)("input",{type:"number",name:"concurrencyLimit",min:1,max:10,defaultValue:4,className:n})]})]}):null,void 0===g?null:(0,b.jsx)(m.f,{message:g,isFailure:!0}),(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsx)(l.i,{type:"submit",variant:"primary","data-testid":"bridge-approve",isPending:"approve"===f,pendingLabel:"Approving...",disabled:void 0!==f,children:"Approve"}),(0,b.jsx)(l.i,{type:"button","data-testid":"bridge-deny",isPending:"deny"===f,pendingLabel:"Denying...",disabled:void 0!==f,onClick:()=>{k({kind:"deny"})},children:"Deny"})]})]})]})}a.s(["DecisionPanel",0,function({fleetId:a,request:e,heldScopes:h,owners:i}){let j=(0,c.useRouter)(),[k,l]=(0,d.useState)(),[m,n]=(0,d.useState)(),[,o]=(0,d.useTransition)();return(0,b.jsx)(q,{request:e,heldScopes:h,owners:i,working:k,failure:m,onDecide:b=>{l(b.kind),n(void 0),o(async()=>{let c=await f({fleet:a,requestId:e.requestId,input:b});c.isOk?j.push(`${g.T}?${new URLSearchParams({fleet:a,decided:b.kind}).toString()}`):(l(void 0),n(c.message))})}})}],20298)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=web_features_bridge_state_decision-panel_tsx_1mzsixgc8zuxc._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../web/features/bridge/state/decision-panel.tsx","../../../../../web/features/bridge/hooks/data%3A64ed68%20%3Ctext/javascript%3E","../../../../../web/features/bridge/ui/decision-form.tsx","../../../../../web/features/bridge/services/requests.ts"],"sourcesContent":["'use client';\n\nimport { useRouter } from 'next/navigation';\nimport { useState, useTransition } from 'react';\n\nimport type { OwnerChoices } from '../../forms/ui/owner-field';\nimport { decideRequest } from '../hooks/bridge-actions';\nimport { BRIDGE_SETTINGS_PATH } from '../paths';\nimport type { DecisionInput, ShownRequest } from '../services/requests';\nimport { DecisionForm } from '../ui/decision-form';\n\n/** Decides one request as the signed-in approver, then goes back to Bridge's settings, which say nothing more waits here. */\nexport function DecisionPanel({ fleetId, request, heldScopes, owners }: { fleetId: string; request: ShownRequest; heldScopes: readonly string[]; owners: OwnerChoices }) {\n const router = useRouter();\n const [working, setWorking] = useState<DecisionInput['kind'] | undefined>();\n const [failure, setFailure] = useState<string | undefined>();\n const [, startTransition] = useTransition();\n const decide = (decision: DecisionInput) => {\n setWorking(decision.kind);\n setFailure(undefined);\n startTransition(async () => {\n const outcome = await decideRequest({ fleet: fleetId, requestId: request.requestId, input: decision });\n if (outcome.isOk) {\n router.push(`${BRIDGE_SETTINGS_PATH}?${new URLSearchParams({ fleet: fleetId, decided: decision.kind }).toString()}`);\n return;\n }\n setWorking(undefined);\n setFailure(outcome.message);\n });\n };\n return <DecisionForm request={request} heldScopes={heldScopes} owners={owners} working={working} failure={failure} onDecide={decide} />;\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"4080e6f6510c124a1b0598c7303e7858de44a8b40b\":{\"name\":\"decideRequest\"}},\"web/features/bridge/hooks/bridge-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_11=/*#__PURE__*/createServerReference(\"4080e6f6510c124a1b0598c7303e7858de44a8b40b\",callServer,void 0,findSourceMapURL,\"decideRequest\");export{$$RSC_SERVER_ACTION_11 as decideRequest};","'use client';\n\nimport { useState, type SyntheticEvent } from 'react';\n\nimport { CREDENTIAL_KINDS, credentialKindOf } from '../../forms/server-credential';\nimport { OwnerField, type OwnerChoices } from '../../forms/ui/owner-field';\nimport { EVERY_APP_SHIP_SCOPES, scopeLabel, subjectName, suggestedName, type DecisionInput, type ServerCredentialInput, type ShownRequest } from '../services/requests';\nimport { ActionButton } from './action-button';\nimport { Notice } from './notice';\n\nconst CONCURRENCY_LIMIT_DEFAULT = 4;\n\nconst FIELD = 'rounded-md border border-input bg-background px-2 py-1.5';\n\nfunction ScopeRow({ scope, isLocked }: { scope: string; isLocked: boolean }) {\n return (\n <label className=\"flex items-center gap-2\">\n {isLocked ? <input type=\"checkbox\" checked disabled aria-label={scopeLabel(scope)} /> : <input type=\"checkbox\" name=\"scope\" value={scope} aria-label={scopeLabel(scope)} />}\n <span>{scopeLabel(scope)}</span>\n <span className=\"font-mono text-caption text-muted-foreground\">{scope}</span>\n {isLocked ? <span className=\"text-caption text-muted-foreground\">(always)</span> : null}\n </label>\n );\n}\n\nfunction text(form: FormData, name: string): string {\n const value = form.get(name);\n return typeof value === 'string' ? value : '';\n}\n\nfunction serverOf(form: FormData): ServerCredentialInput {\n return {\n credentialKind: credentialKindOf(text(form, 'credentialKind')),\n token: text(form, 'token'),\n clientId: text(form, 'clientId'),\n clientSecret: text(form, 'clientSecret'),\n issuer: text(form, 'issuer'),\n scope: text(form, 'scope-requested'),\n concurrencyLimit: Number(text(form, 'concurrencyLimit')),\n };\n}\n\n/**\n * The decision on a request: approving names the proxy ship and its owner,\n * and offers as scope rows only the scopes the approver holds, messages:send\n * and messages:receive locked on (0046, 0053); a server's credential too.\n * What was typed stays when the API refuses.\n */\nexport function DecisionForm({\n request,\n heldScopes,\n owners,\n working,\n failure,\n onDecide,\n}: {\n request: ShownRequest;\n heldScopes: readonly string[];\n owners: OwnerChoices;\n working: DecisionInput['kind'] | undefined;\n failure: string | undefined;\n onDecide: (decision: DecisionInput) => void;\n}) {\n const [credentialKind, setCredentialKind] = useState<ServerCredentialInput['credentialKind']>('bearer');\n const name = subjectName(request);\n const isServer = request.subject.kind === 'server';\n const approve = (event: SyntheticEvent<HTMLFormElement>) => {\n event.preventDefault();\n const form = new FormData(event.currentTarget);\n const scopes = form.getAll('scope').filter((scope) => typeof scope === 'string');\n onDecide({ kind: 'approve', name: text(form, 'name'), ownerShipId: text(form, 'ownerShipId'), scopes, server: isServer ? serverOf(form) : undefined });\n };\n return (\n <section className=\"grid gap-3 rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm\">\n <h2 className=\"text-heading font-semibold\">Approve {name}</h2>\n <form onSubmit={approve} className=\"grid gap-3\">\n <label className=\"grid gap-1\">\n <span>Proxy ship's name</span>\n <input name=\"name\" defaultValue={suggestedName(name)} required className={FIELD} />\n </label>\n <OwnerField choices={owners.isOk ? owners.value : []} current={null} help=\"A person ship or argo. It answers for this party.\" refusal={owners.isOk ? undefined : owners.refusal} />\n <fieldset className=\"grid gap-1\">\n <legend>Scopes</legend>\n {EVERY_APP_SHIP_SCOPES.map((scope) => (\n <ScopeRow key={scope} scope={scope} isLocked />\n ))}\n {heldScopes\n .filter((scope) => !EVERY_APP_SHIP_SCOPES.includes(scope))\n .map((scope) => (\n <ScopeRow key={scope} scope={scope} isLocked={false} />\n ))}\n </fieldset>\n {isServer ? (\n <fieldset className=\"grid gap-2\">\n <legend>The server's credential</legend>\n <label className=\"grid gap-1\">\n <span>Credential</span>\n <select name=\"credentialKind\" value={credentialKind} onChange={(event) => { setCredentialKind(credentialKindOf(event.target.value)); }} className={FIELD}>\n {CREDENTIAL_KINDS.map(({ kind, label }) => (\n <option key={kind} value={kind}>\n {label}\n </option>\n ))}\n </select>\n </label>\n {credentialKind === 'none' ? null : credentialKind === 'bearer' ? (\n <label className=\"grid gap-1\">\n <span>Bearer token</span>\n <input type=\"password\" name=\"token\" className={FIELD} />\n </label>\n ) : (\n <>\n <label className=\"grid gap-1\">\n <span>Client id</span>\n <input name=\"clientId\" className={FIELD} />\n </label>\n <label className=\"grid gap-1\">\n <span>Client secret</span>\n <input type=\"password\" name=\"clientSecret\" className={FIELD} />\n </label>\n <label className=\"grid gap-1\">\n <span>Issuer</span>\n <input type=\"url\" name=\"issuer\" className={FIELD} />\n </label>\n <label className=\"grid gap-1\">\n <span>Scope</span>\n <input name=\"scope-requested\" className={FIELD} />\n </label>\n </>\n )}\n <label className=\"grid gap-1\">\n <span>Calls at once</span>\n <input type=\"number\" name=\"concurrencyLimit\" min={1} max={10} defaultValue={CONCURRENCY_LIMIT_DEFAULT} className={FIELD} />\n </label>\n </fieldset>\n ) : null}\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n <div className=\"flex gap-2\">\n <ActionButton type=\"submit\" variant=\"primary\" data-testid=\"bridge-approve\" isPending={working === 'approve'} pendingLabel=\"Approving...\" disabled={working !== undefined}>\n Approve\n </ActionButton>\n <ActionButton type=\"button\" data-testid=\"bridge-deny\" isPending={working === 'deny'} pendingLabel=\"Denying...\" disabled={working !== undefined} onClick={() => { onDecide({ kind: 'deny' }); }}>\n Deny\n </ActionButton>\n </div>\n </form>\n </section>\n );\n}\n","/**\n * How Bridge's settings name and states a request for an outside party (design\n * B, Signal): pure view logic, no React and no API client.\n */\nimport type { inferRouterOutputs } from '@trpc/server';\n\nimport type { GatewayRouter } from '../../../../src/adapters/trpc/router.js';\nimport type { CredentialKind } from '../../forms/server-credential';\n\n/** A request as the API shows it. */\nexport type ShownRequest = inferRouterOutputs<GatewayRouter>['requests']['toDecide'][number];\n\n/** The tones a status shows, from the design tokens; a status always has its words too. */\nexport type Tone = 'waiting' | 'active' | 'ok' | 'attention' | 'ended';\n\nexport interface Status {\n readonly tone: Tone;\n readonly label: string;\n}\n\nconst DAY_MS = 86_400_000;\n\n/** How an outside party is named before it has a proxy ship: a client by its name, a server by its host. */\nexport function subjectName(request: ShownRequest): string {\n switch (request.subject.kind) {\n case 'client':\n return request.subject.clientName;\n case 'server':\n return URL.canParse(request.subject.url) ? new URL(request.subject.url).host : request.subject.url;\n }\n}\n\nexport function subjectKind(request: ShownRequest): string {\n switch (request.subject.kind) {\n case 'client':\n return 'MCP client';\n case 'server':\n return 'MCP server';\n }\n}\n\n/** Days left of the 7 a request is kept, counted up, so its last day reads as such, in the attention tone. */\nexport function daysLeft(request: ShownRequest, now: Date): Status {\n const days = Math.ceil((Date.parse(request.expiresAt) - now.getTime()) / DAY_MS);\n return days <= 1 ? { tone: 'attention', label: 'Last day' } : { tone: 'waiting', label: `${String(days)} d left` };\n}\n\n/** A request's state as the console shows a status; one still pending shows its days left. */\nexport function requestStatus(request: ShownRequest, now: Date): Status {\n switch (request.state) {\n case 'pending':\n return daysLeft(request, now);\n case 'approving':\n return { tone: 'active', label: 'Approving' };\n case 'approved':\n return { tone: 'ok', label: 'Approved' };\n case 'denied':\n return { tone: 'ended', label: 'Denied' };\n case 'expired':\n return { tone: 'ended', label: 'Expired' };\n }\n}\n\n/** A proxy ship's name offered from the party's own: lower case letters, digits and dashes. */\nexport function suggestedName(name: string): string {\n return name\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/g, '-')\n .replaceAll(/^-+|-+$/g, '');\n}\n\n/** The scopes every app ship gets (0046): shown locked on, and always sent. */\nexport const EVERY_APP_SHIP_SCOPES: readonly string[] = ['messages:send', 'messages:receive'];\n\nconst SCOPE_LABELS: Record<string, string> = {\n 'messages:send': 'Send',\n 'messages:receive': 'Receive',\n 'fleet:read': 'Read the fleet',\n};\n\n/** A scope's plain label, shown beside the scope itself. */\nexport function scopeLabel(scope: string): string {\n return SCOPE_LABELS[scope] ?? scope;\n}\n\n/** The server's credential as the decision form takes it. */\nexport interface ServerCredentialInput {\n readonly credentialKind: CredentialKind;\n readonly token: string;\n readonly clientId: string;\n readonly clientSecret: string;\n readonly issuer: string;\n readonly scope: string;\n readonly concurrencyLimit: number;\n}\n\nexport type DecisionInput = { readonly kind: 'deny' } | { readonly kind: 'approve'; readonly name: string; readonly ownerShipId: string; readonly scopes: readonly string[]; readonly server: ServerCredentialInput | undefined };\n"],"names":["$$RSC_SERVER_ACTION_11"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/bridge/state/decision-panel.tsx","../../../../../web/features/bridge/hooks/data%3Ab11fb2%20%3Ctext/javascript%3E","../../../../../web/features/bridge/ui/decision-form.tsx","../../../../../web/features/bridge/services/requests.ts"],"sourcesContent":["'use client';\n\nimport { useRouter } from 'next/navigation';\nimport { useState, useTransition } from 'react';\n\nimport type { OwnerChoices } from '../../forms/ui/owner-field';\nimport { decideRequest } from '../hooks/bridge-actions';\nimport { BRIDGE_SETTINGS_PATH } from '../paths';\nimport type { DecisionInput, ShownRequest } from '../services/requests';\nimport { DecisionForm } from '../ui/decision-form';\n\n/** Decides one request as the signed-in approver, then goes back to Bridge's settings, which say nothing more waits here. */\nexport function DecisionPanel({ fleetId, request, heldScopes, owners }: { fleetId: string; request: ShownRequest; heldScopes: readonly string[]; owners: OwnerChoices }) {\n const router = useRouter();\n const [working, setWorking] = useState<DecisionInput['kind'] | undefined>();\n const [failure, setFailure] = useState<string | undefined>();\n const [, startTransition] = useTransition();\n const decide = (decision: DecisionInput) => {\n setWorking(decision.kind);\n setFailure(undefined);\n startTransition(async () => {\n const outcome = await decideRequest({ fleet: fleetId, requestId: request.requestId, input: decision });\n if (outcome.isOk) {\n router.push(`${BRIDGE_SETTINGS_PATH}?${new URLSearchParams({ fleet: fleetId, decided: decision.kind }).toString()}`);\n return;\n }\n setWorking(undefined);\n setFailure(outcome.message);\n });\n };\n return <DecisionForm request={request} heldScopes={heldScopes} owners={owners} working={working} failure={failure} onDecide={decide} />;\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"407ec5a94e3e5f5383c309c1ce9ea498eafeded2c3\":{\"name\":\"decideRequest\"}},\"web/features/bridge/hooks/bridge-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_14=/*#__PURE__*/createServerReference(\"407ec5a94e3e5f5383c309c1ce9ea498eafeded2c3\",callServer,void 0,findSourceMapURL,\"decideRequest\");export{$$RSC_SERVER_ACTION_14 as decideRequest};","'use client';\n\nimport { useState, type SyntheticEvent } from 'react';\n\nimport { CREDENTIAL_KINDS, credentialKindOf } from '../../forms/server-credential';\nimport { OwnerField, type OwnerChoices } from '../../forms/ui/owner-field';\nimport { EVERY_APP_SHIP_SCOPES, scopeLabel, subjectName, suggestedName, type DecisionInput, type ServerCredentialInput, type ShownRequest } from '../services/requests';\nimport { ActionButton } from './action-button';\nimport { Notice } from './notice';\n\nconst CONCURRENCY_LIMIT_DEFAULT = 4;\n\nconst FIELD = 'rounded-md border border-input bg-background px-2 py-1.5';\n\nfunction ScopeRow({ scope, isLocked }: { scope: string; isLocked: boolean }) {\n return (\n <label className=\"flex items-center gap-2\">\n {isLocked ? <input type=\"checkbox\" checked disabled aria-label={scopeLabel(scope)} /> : <input type=\"checkbox\" name=\"scope\" value={scope} aria-label={scopeLabel(scope)} />}\n <span>{scopeLabel(scope)}</span>\n <span className=\"font-mono text-caption text-muted-foreground\">{scope}</span>\n {isLocked ? <span className=\"text-caption text-muted-foreground\">(always)</span> : null}\n </label>\n );\n}\n\nfunction text(form: FormData, name: string): string {\n const value = form.get(name);\n return typeof value === 'string' ? value : '';\n}\n\nfunction serverOf(form: FormData): ServerCredentialInput {\n return {\n credentialKind: credentialKindOf(text(form, 'credentialKind')),\n token: text(form, 'token'),\n clientId: text(form, 'clientId'),\n clientSecret: text(form, 'clientSecret'),\n issuer: text(form, 'issuer'),\n scope: text(form, 'scope-requested'),\n concurrencyLimit: Number(text(form, 'concurrencyLimit')),\n };\n}\n\n/**\n * The decision on a request: approving names the proxy ship and its owner,\n * and offers as scope rows only the scopes the approver holds, messages:send\n * and messages:receive locked on (0046, 0053); a server's credential too.\n * What was typed stays when the API refuses.\n */\nexport function DecisionForm({\n request,\n heldScopes,\n owners,\n working,\n failure,\n onDecide,\n}: {\n request: ShownRequest;\n heldScopes: readonly string[];\n owners: OwnerChoices;\n working: DecisionInput['kind'] | undefined;\n failure: string | undefined;\n onDecide: (decision: DecisionInput) => void;\n}) {\n const [credentialKind, setCredentialKind] = useState<ServerCredentialInput['credentialKind']>('bearer');\n const name = subjectName(request);\n const isServer = request.subject.kind === 'server';\n const approve = (event: SyntheticEvent<HTMLFormElement>) => {\n event.preventDefault();\n const form = new FormData(event.currentTarget);\n const scopes = form.getAll('scope').filter((scope) => typeof scope === 'string');\n onDecide({ kind: 'approve', name: text(form, 'name'), ownerShipId: text(form, 'ownerShipId'), scopes, server: isServer ? serverOf(form) : undefined });\n };\n return (\n <section className=\"grid gap-3 rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm\">\n <h2 className=\"text-heading font-semibold\">Approve {name}</h2>\n <form onSubmit={approve} className=\"grid gap-3\">\n <label className=\"grid gap-1\">\n <span>Proxy ship's name</span>\n <input name=\"name\" defaultValue={suggestedName(name)} required className={FIELD} />\n </label>\n <OwnerField choices={owners.isOk ? owners.value : []} current={null} help=\"A person ship or argo. It answers for this party.\" refusal={owners.isOk ? undefined : owners.refusal} />\n <fieldset className=\"grid gap-1\">\n <legend>Scopes</legend>\n {EVERY_APP_SHIP_SCOPES.map((scope) => (\n <ScopeRow key={scope} scope={scope} isLocked />\n ))}\n {heldScopes\n .filter((scope) => !EVERY_APP_SHIP_SCOPES.includes(scope))\n .map((scope) => (\n <ScopeRow key={scope} scope={scope} isLocked={false} />\n ))}\n </fieldset>\n {isServer ? (\n <fieldset className=\"grid gap-2\">\n <legend>The server's credential</legend>\n <label className=\"grid gap-1\">\n <span>Credential</span>\n <select name=\"credentialKind\" value={credentialKind} onChange={(event) => { setCredentialKind(credentialKindOf(event.target.value)); }} className={FIELD}>\n {CREDENTIAL_KINDS.map(({ kind, label }) => (\n <option key={kind} value={kind}>\n {label}\n </option>\n ))}\n </select>\n </label>\n {credentialKind === 'none' ? null : credentialKind === 'bearer' ? (\n <label className=\"grid gap-1\">\n <span>Bearer token</span>\n <input type=\"password\" name=\"token\" className={FIELD} />\n </label>\n ) : (\n <>\n <label className=\"grid gap-1\">\n <span>Client id</span>\n <input name=\"clientId\" className={FIELD} />\n </label>\n <label className=\"grid gap-1\">\n <span>Client secret</span>\n <input type=\"password\" name=\"clientSecret\" className={FIELD} />\n </label>\n <label className=\"grid gap-1\">\n <span>Issuer</span>\n <input type=\"url\" name=\"issuer\" className={FIELD} />\n </label>\n <label className=\"grid gap-1\">\n <span>Scope</span>\n <input name=\"scope-requested\" className={FIELD} />\n </label>\n </>\n )}\n <label className=\"grid gap-1\">\n <span>Calls at once</span>\n <input type=\"number\" name=\"concurrencyLimit\" min={1} max={10} defaultValue={CONCURRENCY_LIMIT_DEFAULT} className={FIELD} />\n </label>\n </fieldset>\n ) : null}\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n <div className=\"flex gap-2\">\n <ActionButton type=\"submit\" variant=\"primary\" data-testid=\"bridge-approve\" isPending={working === 'approve'} pendingLabel=\"Approving...\" disabled={working !== undefined}>\n Approve\n </ActionButton>\n <ActionButton type=\"button\" data-testid=\"bridge-deny\" isPending={working === 'deny'} pendingLabel=\"Denying...\" disabled={working !== undefined} onClick={() => { onDecide({ kind: 'deny' }); }}>\n Deny\n </ActionButton>\n </div>\n </form>\n </section>\n );\n}\n","/**\n * How Bridge's settings name and states a request for an outside party (design\n * B, Signal): pure view logic, no React and no API client.\n */\nimport type { inferRouterOutputs } from '@trpc/server';\n\nimport type { GatewayRouter } from '../../../../src/adapters/trpc/router.js';\nimport type { CredentialKind } from '../../forms/server-credential';\n\n/** A request as the API shows it. */\nexport type ShownRequest = inferRouterOutputs<GatewayRouter>['requests']['toDecide'][number];\n\n/** The tones a status shows, from the design tokens; a status always has its words too. */\nexport type Tone = 'waiting' | 'active' | 'ok' | 'attention' | 'ended';\n\nexport interface Status {\n readonly tone: Tone;\n readonly label: string;\n}\n\nconst DAY_MS = 86_400_000;\n\n/** How an outside party is named before it has a proxy ship: a client by its name, a server by its host. */\nexport function subjectName(request: ShownRequest): string {\n switch (request.subject.kind) {\n case 'client':\n return request.subject.clientName;\n case 'server':\n return URL.canParse(request.subject.url) ? new URL(request.subject.url).host : request.subject.url;\n }\n}\n\nexport function subjectKind(request: ShownRequest): string {\n switch (request.subject.kind) {\n case 'client':\n return 'MCP client';\n case 'server':\n return 'MCP server';\n }\n}\n\n/** Days left of the 7 a request is kept, counted up, so its last day reads as such, in the attention tone. */\nexport function daysLeft(request: ShownRequest, now: Date): Status {\n const days = Math.ceil((Date.parse(request.expiresAt) - now.getTime()) / DAY_MS);\n return days <= 1 ? { tone: 'attention', label: 'Last day' } : { tone: 'waiting', label: `${String(days)} d left` };\n}\n\n/** A request's state as the console shows a status; one still pending shows its days left. */\nexport function requestStatus(request: ShownRequest, now: Date): Status {\n switch (request.state) {\n case 'pending':\n return daysLeft(request, now);\n case 'approving':\n return { tone: 'active', label: 'Approving' };\n case 'approved':\n return { tone: 'ok', label: 'Approved' };\n case 'denied':\n return { tone: 'ended', label: 'Denied' };\n case 'expired':\n return { tone: 'ended', label: 'Expired' };\n }\n}\n\n/** A proxy ship's name offered from the party's own: lower case letters, digits and dashes. */\nexport function suggestedName(name: string): string {\n return name\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/g, '-')\n .replaceAll(/^-+|-+$/g, '');\n}\n\n/** The scopes every app ship gets (0046): shown locked on, and always sent. */\nexport const EVERY_APP_SHIP_SCOPES: readonly string[] = ['messages:send', 'messages:receive'];\n\nconst SCOPE_LABELS: Record<string, string> = {\n 'messages:send': 'Send',\n 'messages:receive': 'Receive',\n 'fleet:read': 'Read the fleet',\n};\n\n/** A scope's plain label, shown beside the scope itself. */\nexport function scopeLabel(scope: string): string {\n return SCOPE_LABELS[scope] ?? scope;\n}\n\n/** The server's credential as the decision form takes it. */\nexport interface ServerCredentialInput {\n readonly credentialKind: CredentialKind;\n readonly token: string;\n readonly clientId: string;\n readonly clientSecret: string;\n readonly issuer: string;\n readonly scope: string;\n readonly concurrencyLimit: number;\n}\n\nexport type DecisionInput = { readonly kind: 'deny' } | { readonly kind: 'approve'; readonly name: string; readonly ownerShipId: string; readonly scopes: readonly string[]; readonly server: ServerCredentialInput | undefined };\n"],"names":["$$RSC_SERVER_ACTION_14"],"mappings":"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"}
|
package/web/.next/server/chunks/ssr/web_features_bridge_state_done-panel_tsx_1m844-qb1z9p_._.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[16563,a=>{"use strict";var b=a.i(87924),c=a.i(
|
|
1
|
+
module.exports=[16563,a=>{"use strict";var b=a.i(87924),c=a.i(97024),d=a.i(73370),e=a.i(72131),f=a.i(5050);let g=(0,f.createServerReference)("6003997bc9e9bf872ec8448b9ff9e01847ee173bf1",f.callServer,void 0,f.findSourceMapURL,"readMoreRecord");var h=a.i(12110),i=a.i(32043),j=a.i(99838),k=a.i(11725),l=a.i(42369);function m({question:a,answered:c}){return(0,b.jsx)("ul",{className:"grid gap-2","aria-label":"Options",children:a.options.map(d=>{let e=d.key===c;return(0,b.jsxs)("li",{"data-answered":e,className:`flex items-start gap-3 rounded-md border p-3 ${e?"border-ring ring-1 ring-ring":"border-border text-muted-foreground"}`,children:[(0,b.jsx)("span",{"data-testid":"bridge-done-radio","data-filled":e,"aria-hidden":"true",className:`mt-1 grid size-4 shrink-0 place-items-center rounded-full border ${e?"border-primary":"border-border"}`,children:e?(0,b.jsx)("span",{className:"size-2 rounded-full bg-primary"}):null}),(0,b.jsxs)("span",{className:"grid flex-1 gap-0.5",children:[(0,b.jsxs)("span",{className:"font-medium",children:[d.key,". ",d.label]}),""===d.detail?null:(0,b.jsx)("span",{className:"text-caption text-muted-foreground max-md:hidden",children:d.detail})]}),d.key===a.pick.option?(0,b.jsx)("span",{className:"rounded-sm border border-border px-1.5 text-caption",children:"Their pick"}):null]},d.key)})})}function n({ended:a}){let e=a.isOk?c.f:d.f;return(0,b.jsxs)("div",{"data-testid":"bridge-done-ended",role:"status",className:`flex items-start gap-3 rounded-md border p-3 ${a.isOk?"border-tone-ok-border bg-tone-ok-bg":"border-tone-ended-border bg-tone-ended-bg"}`,children:[(0,b.jsx)(e,{"aria-hidden":!0,className:`mt-0.5 size-4 shrink-0 ${a.isOk?"text-tone-ok-fg":"text-tone-ended-fg"}`}),(0,b.jsxs)("span",{className:"grid gap-0.5",children:[(0,b.jsx)("span",{className:"font-medium",children:a.text}),void 0===a.sent?null:(0,b.jsx)("span",{className:"text-caption text-muted-foreground",children:a.sent})]})]})}function o({item:a,timeZone:c}){return(0,b.jsx)("ol",{"data-testid":"bridge-done-history",className:"grid gap-1.5 text-caption max-md:hidden",children:(0,h.L)(a,c).map(a=>(0,b.jsxs)("li",{className:"grid grid-cols-[3rem_0.5rem_minmax(0,1fr)] items-center gap-2",children:[(0,b.jsx)("span",{className:"text-muted-foreground tabular-nums",children:a.at}),(0,b.jsx)("i",{"aria-hidden":"true",className:`size-1.5 rounded-full ${a.isEnd?"bg-tone-ok-fg":"bg-border"}`}),(0,b.jsxs)("span",{children:[a.text,void 0===a.detail?null:(0,b.jsxs)("span",{className:"text-muted-foreground",children:[" · ",a.detail]})]})]},`${a.at} ${a.text}`))})}function p({item:a,timeZone:c,bridgeHost:d,onBack:e}){let f=(0,j.N)(a),g=(0,j.R)(a,d),i=(0,h.d)(a,c),q={job:a.job,isAlert:a.isAlert,wasNew:!1};return(0,b.jsxs)("section",{"data-testid":"bridge-done-item",className:"grid min-w-0 content-start gap-3 text-card-foreground md:p-5",children:[(0,b.jsx)(k.g,{opened:q,title:(0,h.c)(a),isWorking:!1,onBack:e}),(0,b.jsx)(k.$,{delivery:a,opened:q,timeZone:c}),(0,b.jsx)("h2",{className:"text-heading font-semibold",children:f?.title??a.title}),void 0!==g?(0,b.jsx)(k.l,{step:g,isStale:!1,isFinished:!0}):void 0===f?(0,b.jsx)(l.f,{text:(0,j.Y)(a)}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("div",{className:k.R,children:(0,b.jsx)(l.f,{text:f.context})}),(0,b.jsx)(m,{question:f,answered:a.outcome?.option??null})]}),void 0===i?null:(0,b.jsx)(n,{ended:i}),(0,b.jsx)(o,{item:a,timeZone:c})]})}var q=a.i(52560),r=a.i(74352),s=a.i(10039);function t(){return()=>void 0}function u(a){return a.outcome?.at??a.sentAt}function v({item:a}){let e=(0,h.o)(a),f=e.isOk?c.f:d.f;return(0,b.jsxs)("span",{"data-testid":"bridge-done-outcome",className:"flex items-start gap-1.5 text-caption",children:[(0,b.jsx)(f,{"aria-hidden":"true",className:`mt-0.5 size-3.5 shrink-0 ${e.isOk?"text-tone-ok-fg":"text-muted-foreground"}`}),e.text]})}a.s(["DonePanel",0,function({fleetId:a,first:c,now:d}){let f=new Date(d),j=(0,e.useSyncExternalStore)(t,()=>Intl.DateTimeFormat().resolvedOptions().timeZone,()=>"UTC"),[k,l]=(0,e.useState)(c.items),[m,n]=(0,e.useState)(c.nextCursor),[o,w]=(0,e.useState)(),[x,y]=(0,e.useState)(),[z,A]=(0,e.useTransition)(),B=k.find(({deliveryId:a})=>a===x);return(0,b.jsx)(r.f,{list:(0,b.jsxs)("section",{className:"grid gap-3","aria-labelledby":"bridge-done-heading",children:[(0,b.jsxs)("div",{className:void 0===B?"":"md:px-3 md:pt-3",children:[(0,b.jsx)("h1",{id:"bridge-done-heading",className:"text-heading font-semibold",children:"Done"}),(0,b.jsx)("p",{className:"text-muted-foreground",children:"Everything that reached you, with what came of it and where. Opening one reads it back whole."})]}),0===k.length?(0,b.jsx)("p",{"data-testid":"bridge-record-empty",className:"rounded-md border border-border bg-card p-3 text-muted-foreground",children:"Nothing is done yet."}):(function(a,b){let c=[];for(let d of a){let a=(0,h.Y)(u(d),b),e=c.at(-1);e?.day===a?e.items.push(d):c.push({day:a,items:[d]})}return c})(k,{now:f,timeZone:j}).map(({day:a,items:c})=>(0,b.jsxs)("div",{className:"grid gap-1.5",children:[(0,b.jsx)("h2",{className:`text-caption text-muted-foreground ${void 0===B?"":"md:px-3"}`,children:a}),(0,b.jsx)("ul",{className:"overflow-hidden rounded-lg border border-border bg-card",children:c.map(a=>(0,b.jsx)(q.f,{item:a,now:f,isNew:!1,isOpen:a.deliveryId===x,outcome:void 0,failure:void 0,time:{at:u(a),said:(0,h.Z)(u(a),j)},detail:(0,b.jsx)(v,{item:a}),onOpen:()=>{y(a.deliveryId)}},a.deliveryId))})]},a)),void 0===o?null:(0,b.jsx)(s.f,{message:o,isFailure:!0}),null===m?null:(0,b.jsx)(i.i,{"data-testid":"bridge-more",className:"justify-self-start",isPending:z,pendingLabel:"Reading...",onClick:()=>{w(void 0),A(async()=>{let b=await g(a,m);b.isOk?(l(a=>[...a,...b.value.items]),n(b.value.nextCursor)):w(b.message)})},children:"Show older"})]}),item:void 0===B?void 0:(0,b.jsx)(p,{item:B,timeZone:j,bridgeHost:window.location.host,onBack:()=>{y(void 0)}})})}],16563)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=web_features_bridge_state_done-panel_tsx_1m844-qb1z9p_._.js.map
|
package/web/.next/server/chunks/ssr/web_features_bridge_state_done-panel_tsx_1m844-qb1z9p_._.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../web/features/bridge/state/done-panel.tsx","../../../../../web/features/bridge/hooks/data%3A367a91%20%3Ctext/javascript%3E"],"sourcesContent":["'use client';\n\nimport { useState, useTransition } from 'react';\n\nimport { readMoreRecord } from '../hooks/bridge-actions';\nimport { outcomeTextOf, type RecordPage } from '../services/items';\nimport { ActionButton } from '../ui/action-button';\nimport { ItemRow } from '../ui/item-row';\nimport { Notice } from '../ui/notice';\nimport { ItemFocus } from './item-focus';\n\n/**\n * Done (Bridge, CC4): everything that reached the person, newest first, with\n * what came of it and where. The next page is read only when they ask for\n * it. One not done yet opens here, to answer or be done with.\n */\nexport function DonePanel({ fleetId, first }: { fleetId: string; first: RecordPage }) {\n const [items, setItems] = useState(first.items);\n const [nextCursor, setNextCursor] = useState(first.nextCursor);\n const [failure, setFailure] = useState<string | undefined>();\n const [isReading, startTransition] = useTransition();\n\n const readMore = (cursor: string) => {\n setFailure(undefined);\n startTransition(async () => {\n const more = await readMoreRecord(fleetId, cursor);\n if (more.isOk) {\n setItems((shown) => [...shown, ...more.value.items]);\n setNextCursor(more.value.nextCursor);\n } else {\n setFailure(more.message);\n }\n });\n };\n\n return (\n <ItemFocus fleetId={fleetId}>\n {(opening) => (\n <section className=\"grid gap-3\" aria-labelledby=\"bridge-done-heading\">\n <div>\n <h1 id=\"bridge-done-heading\" className=\"text-heading font-semibold\">\n Done\n </h1>\n <p className=\"text-muted-foreground\">Everything that reached you, with what came of it and where.</p>\n </div>\n {items.length === 0 ? (\n <p data-testid=\"bridge-record-empty\" className=\"rounded-md border border-border bg-card p-3 text-muted-foreground\">\n Nothing has reached you yet.\n </p>\n ) : (\n <ul className=\"grid gap-2\">\n {items.map((item) => (\n <ItemRow key={item.deliveryId} item={item} isNew={item.state === 'new'} outcome={outcomeTextOf(item)} failure={opening.failure?.deliveryId === item.deliveryId ? opening.failure.message : undefined}>\n {item.state === 'done' ? null : (\n <ActionButton data-testid=\"bridge-open\" isPending={opening.openingId === item.deliveryId} pendingLabel=\"Opening...\" disabled={opening.openingId !== undefined} onClick={() => { opening.open(item); }}>\n Open\n </ActionButton>\n )}\n </ItemRow>\n ))}\n </ul>\n )}\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n {nextCursor === null ? null : (\n <ActionButton data-testid=\"bridge-more\" className=\"justify-self-start\" isPending={isReading} pendingLabel=\"Reading...\" onClick={() => { readMore(nextCursor); }}>\n Show older\n </ActionButton>\n )}\n </section>\n )}\n </ItemFocus>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"603b4af3b6ef322d88de132c92a8286173f7a791b6\":{\"name\":\"readMoreRecord\"}},\"web/features/bridge/hooks/bridge-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"603b4af3b6ef322d88de132c92a8286173f7a791b6\",callServer,void 0,findSourceMapURL,\"readMoreRecord\");export{$$RSC_SERVER_ACTION_0 as readMoreRecord};"],"names":["$$RSC_SERVER_ACTION_0"],"mappings":"wDAEA,EAAA,EAAA,CAAA,CAAA,OCF4M,EAAA,EAAA,CAAA,CAAA,MAAsG,IAAMA,EAAmC,CAAA,EAAA,EAAA,iBAAb,IAAa,AAAqB,EAAC,KAAxB,wCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,kBDKjc,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,0BAOO,SAAS,AAAU,SAAE,CAAO,OAAE,CAAK,CAA0C,EAClF,GAAM,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAS,EAAM,KAAK,EACxC,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,EAAM,UAAU,EACvD,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,IAChC,CAAC,EAAW,EAAgB,CAAG,CAAA,EAAA,EAAA,aAAA,AAAa,IAelD,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAS,CAAA,CAAC,QAAS,WACjB,AAAC,GACA,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,aAAa,kBAAgB,gCAC9C,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,GAAG,sBAAsB,UAAU,sCAA6B,SAGpE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,iCAAwB,oEAEtC,AAAiB,MAAX,MAAM,CACX,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,cAAY,sBAAsB,UAAU,6EAAoE,iCAInH,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,sBACX,EAAM,GAAG,CAAC,AAAC,GACV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAO,CAAA,CAAuB,KAAM,EAAM,MAAsB,QAAf,EAAK,KAAK,CAAY,QAAS,CAAA,EAAA,EAAA,CAAA,AAAa,EAAC,GAAO,QAAS,EAAQ,OAAO,EAAE,aAAe,EAAK,UAAU,CAAG,EAAQ,OAAO,CAAC,OAAO,MAAG,WACxL,AAAe,WAAV,KAAK,CAAc,KACvB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,CAAA,CAAC,cAAY,cAAc,UAAW,EAAQ,SAAS,GAAK,EAAK,UAAU,CAAE,aAAa,aAAa,cAAgC,IAAtB,EAAQ,SAAS,CAAgB,QAAS,KAAQ,EAAQ,IAAI,CAAC,EAAO,WAAG,UAF7L,EAAK,UAAU,UAUtB,IAAZ,EAAwB,KAAO,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAM,CAAA,CAAC,QAAS,EAAS,SAAS,CAAA,CAAA,IAClE,AAAe,SAAO,KACrB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,CAAA,CAAC,cAAY,cAAc,UAAU,qBAAqB,UAAW,EAAW,aAAa,aAAa,QAAS,KAzCxI,OAAW,GACX,EAAgB,UACd,IAAM,EAAO,MAAM,EAAe,EAuCqH,GAtCnJ,EAAK,EADkC,EAC9B,EAAE,AACb,EAAS,AAAC,GAAU,IAAI,KAAU,EAAK,KAAK,CAAC,KAAK,CAAC,EACnD,EAAc,EAAK,KAAK,CAAC,UAAU,GAEnC,EAAW,EAAK,OAAO,CAE3B,EAgCsK,WAAG,mBAQ7K"}
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/bridge/state/done-panel.tsx","../../../../../web/features/bridge/hooks/data%3Ae44172%20%3Ctext/javascript%3E","../../../../../web/features/bridge/ui/done-card.tsx"],"sourcesContent":["'use client';\n\nimport { CircleCheck, CircleX } from 'lucide-react';\nimport { useState, useSyncExternalStore, useTransition } from 'react';\n\nimport { readMoreRecord } from '../hooks/bridge-actions';\nimport { clockTimeOf, dayOf, doneOutcomeOf, type RecordItem, type RecordPage } from '../services/items';\nimport { ActionButton } from '../ui/action-button';\nimport { DoneCard } from '../ui/done-card';\nimport { ItemRow } from '../ui/item-row';\nimport { ItemSplit } from '../ui/item-split';\nimport { Notice } from '../ui/notice';\n\n/** The time zone a page is read in on the server, before the browser says its own. */\nconst SERVER_TIME_ZONE = 'UTC';\n\nfunction unchanging(): () => void {\n return () => undefined;\n}\n\n/** The person's own time zone, the browser's; the server's until the page runs there, so the first render matches it. */\nfunction useTimeZone(): string {\n return useSyncExternalStore(unchanging, () => Intl.DateTimeFormat().resolvedOptions().timeZone, () => SERVER_TIME_ZONE);\n}\n\n/** When an item was done: when what came of it was kept, or when it arrived for one the fleet ended with none kept. */\nfunction doneAtOf(item: RecordItem): string {\n return item.outcome?.at ?? item.sentAt;\n}\n\n/** The items in their order, a run per day they were done on. */\nfunction byDay(items: readonly RecordItem[], of: { now: Date; timeZone: string }): { day: string; items: RecordItem[] }[] {\n const days: { day: string; items: RecordItem[] }[] = [];\n for (const item of items) {\n const day = dayOf(doneAtOf(item), of);\n const last = days.at(-1);\n if (last?.day === day) {\n last.items.push(item);\n } else {\n days.push({ day, items: [item] });\n }\n }\n return days;\n}\n\n/** What came of an item on its row, on a line of its own, its icon saying whether it ended well (done.html). */\nfunction DoneOutcome({ item }: { item: RecordItem }) {\n const outcome = doneOutcomeOf(item);\n const Icon = outcome.isOk ? CircleCheck : CircleX;\n return (\n <span data-testid=\"bridge-done-outcome\" className=\"flex items-start gap-1.5 text-caption\">\n <Icon aria-hidden=\"true\" className={`mt-0.5 size-3.5 shrink-0 ${outcome.isOk ? 'text-tone-ok-fg' : 'text-muted-foreground'}`} />\n {outcome.text}\n </span>\n );\n}\n\n/**\n * Done (Bridge, CC4; done.html): everything done that reached the person,\n * newest first, under the day it was done, each with the time of day, the\n * places that showed it and what came of it and where. Its title opens it,\n * read back whole beside the list, with nothing acknowledged. The next page\n * is read only when they ask for it.\n */\nexport function DonePanel({ fleetId, first, now }: { fleetId: string; first: RecordPage; now: string }) {\n const readAt = new Date(now);\n const timeZone = useTimeZone();\n const [items, setItems] = useState(first.items);\n const [nextCursor, setNextCursor] = useState(first.nextCursor);\n const [failure, setFailure] = useState<string | undefined>();\n const [openId, setOpenId] = useState<string | undefined>();\n const [isReading, startTransition] = useTransition();\n\n const readMore = (cursor: string) => {\n setFailure(undefined);\n startTransition(async () => {\n const more = await readMoreRecord(fleetId, cursor);\n if (more.isOk) {\n setItems((shown) => [...shown, ...more.value.items]);\n setNextCursor(more.value.nextCursor);\n } else {\n setFailure(more.message);\n }\n });\n };\n\n const open = items.find(({ deliveryId }) => deliveryId === openId);\n return (\n <ItemSplit\n list={\n <section className=\"grid gap-3\" aria-labelledby=\"bridge-done-heading\">\n <div className={open === undefined ? '' : 'md:px-3 md:pt-3'}>\n <h1 id=\"bridge-done-heading\" className=\"text-heading font-semibold\">\n Done\n </h1>\n <p className=\"text-muted-foreground\">Everything that reached you, with what came of it and where. Opening one reads it back whole.</p>\n </div>\n {items.length === 0 ? (\n <p data-testid=\"bridge-record-empty\" className=\"rounded-md border border-border bg-card p-3 text-muted-foreground\">\n Nothing is done yet.\n </p>\n ) : (\n byDay(items, { now: readAt, timeZone }).map(({ day, items: ofDay }) => (\n <div key={day} className=\"grid gap-1.5\">\n <h2 className={`text-caption text-muted-foreground ${open === undefined ? '' : 'md:px-3'}`}>{day}</h2>\n <ul className=\"overflow-hidden rounded-lg border border-border bg-card\">\n {ofDay.map((item) => (\n <ItemRow\n key={item.deliveryId}\n item={item}\n now={readAt}\n isNew={false}\n isOpen={item.deliveryId === openId}\n outcome={undefined}\n failure={undefined}\n time={{ at: doneAtOf(item), said: clockTimeOf(doneAtOf(item), timeZone) }}\n detail={<DoneOutcome item={item} />}\n onOpen={() => { setOpenId(item.deliveryId); }}\n />\n ))}\n </ul>\n </div>\n ))\n )}\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n {nextCursor === null ? null : (\n <ActionButton data-testid=\"bridge-more\" className=\"justify-self-start\" isPending={isReading} pendingLabel=\"Reading...\" onClick={() => { readMore(nextCursor); }}>\n Show older\n </ActionButton>\n )}\n </section>\n }\n item={open === undefined ? undefined : <DoneCard item={open} timeZone={timeZone} bridgeHost={window.location.host} onBack={() => { setOpenId(undefined); }} />}\n />\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"6003997bc9e9bf872ec8448b9ff9e01847ee173bf1\":{\"name\":\"readMoreRecord\"}},\"web/features/bridge/hooks/bridge-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"6003997bc9e9bf872ec8448b9ff9e01847ee173bf1\",callServer,void 0,findSourceMapURL,\"readMoreRecord\");export{$$RSC_SERVER_ACTION_0 as readMoreRecord};","import { CircleCheck, CircleX } from 'lucide-react';\n\nimport type { Question } from '@aeolus-fleet/common';\n\nimport { bodyOf, questionOf, stepOf } from '../services/deliveries';\nimport { endedOf, endedTitleOf, historyOf, type RecordItem } from '../services/items';\nimport { ItemHeading, PROSE, ScreenBar, StepAsked } from './delivery-card';\nimport { Markdown } from './markdown';\n\n/** A done question's options as they stood: each with its radio, filled on the one answered, framed by the ring; the asker's pick named; none to choose. */\nfunction AnsweredOptions({ question, answered }: { question: Question; answered: number | null }) {\n return (\n <ul className=\"grid gap-2\" aria-label=\"Options\">\n {question.options.map((option) => {\n const isAnswered = option.key === answered;\n return (\n <li key={option.key} data-answered={isAnswered} className={`flex items-start gap-3 rounded-md border p-3 ${isAnswered ? 'border-ring ring-1 ring-ring' : 'border-border text-muted-foreground'}`}>\n <span data-testid=\"bridge-done-radio\" data-filled={isAnswered} aria-hidden=\"true\" className={`mt-1 grid size-4 shrink-0 place-items-center rounded-full border ${isAnswered ? 'border-primary' : 'border-border'}`}>\n {isAnswered ? <span className=\"size-2 rounded-full bg-primary\" /> : null}\n </span>\n <span className=\"grid flex-1 gap-0.5\">\n <span className=\"font-medium\">\n {option.key}. {option.label}\n </span>\n {option.detail === '' ? null : <span className=\"text-caption text-muted-foreground max-md:hidden\">{option.detail}</span>}\n </span>\n {option.key === question.pick.option ? <span className=\"rounded-sm border border-border px-1.5 text-caption\">Their pick</span> : null}\n </li>\n );\n })}\n </ul>\n );\n}\n\n/** What came of it, where and when, in the ok tone when it ended well and the ended tone otherwise, and what was sent as the person (decide.html, do.html). */\nfunction EndedNotice({ ended }: { ended: NonNullable<ReturnType<typeof endedOf>> }) {\n const Icon = ended.isOk ? CircleCheck : CircleX;\n return (\n <div data-testid=\"bridge-done-ended\" role=\"status\" className={`flex items-start gap-3 rounded-md border p-3 ${ended.isOk ? 'border-tone-ok-border bg-tone-ok-bg' : 'border-tone-ended-border bg-tone-ended-bg'}`}>\n <Icon aria-hidden className={`mt-0.5 size-4 shrink-0 ${ended.isOk ? 'text-tone-ok-fg' : 'text-tone-ended-fg'}`} />\n <span className=\"grid gap-0.5\">\n <span className=\"font-medium\">{ended.text}</span>\n {ended.sent === undefined ? null : <span className=\"text-caption text-muted-foreground\">{ended.sent}</span>}\n </span>\n </div>\n );\n}\n\n/** Its history, a line per moment: when it arrived and where it showed, where it was seen, and what came of it (decide.html). */\nfunction History({ item, timeZone }: { item: RecordItem; timeZone: string | undefined }) {\n return (\n <ol data-testid=\"bridge-done-history\" className=\"grid gap-1.5 text-caption max-md:hidden\">\n {historyOf(item, timeZone).map((line) => (\n <li key={`${line.at} ${line.text}`} className=\"grid grid-cols-[3rem_0.5rem_minmax(0,1fr)] items-center gap-2\">\n <span className=\"text-muted-foreground tabular-nums\">{line.at}</span>\n <i aria-hidden=\"true\" className={`size-1.5 rounded-full ${line.isEnd ? 'bg-tone-ok-fg' : 'bg-border'}`} />\n <span>\n {line.text}\n {line.detail === undefined ? null : <span className=\"text-muted-foreground\"> · {line.detail}</span>}\n </span>\n </li>\n ))}\n </ol>\n );\n}\n\n/**\n * A done item opened from Done (decide.html, answered in Slack): read back\n * whole from the record, nothing acknowledged and nothing to send. A\n * question shows its options with the one answered marked, a step why and\n * where it was done, anything else what it says; then what came of it and\n * its history. A phone shows it on its own screen, titled by what came of\n * it, without its history, as drawn.\n */\nexport function DoneCard({ item, timeZone, bridgeHost, onBack }: { item: RecordItem; timeZone: string | undefined; bridgeHost: string; onBack: () => void }) {\n const question = questionOf(item);\n const step = stepOf(item, bridgeHost);\n const ended = endedOf(item, timeZone);\n const opened = { job: item.job, isAlert: item.isAlert, wasNew: false };\n return (\n <section data-testid=\"bridge-done-item\" className=\"grid min-w-0 content-start gap-3 text-card-foreground md:p-5\">\n <ScreenBar opened={opened} title={endedTitleOf(item)} isWorking={false} onBack={onBack} />\n <ItemHeading delivery={item} opened={opened} timeZone={timeZone} />\n <h2 className=\"text-heading font-semibold\">{question?.title ?? item.title}</h2>\n {step !== undefined ? (\n <StepAsked step={step} isStale={false} isFinished />\n ) : question === undefined ? (\n <Markdown text={bodyOf(item)} />\n ) : (\n <>\n <div className={PROSE}>\n <Markdown text={question.context} />\n </div>\n <AnsweredOptions question={question} answered={item.outcome?.option ?? null} />\n </>\n )}\n {ended === undefined ? null : <EndedNotice ended={ended} />}\n <History item={item} timeZone={timeZone} />\n </section>\n );\n}\n"],"names":["$$RSC_SERVER_ACTION_0"],"mappings":"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"}
|
package/web/.next/server/chunks/ssr/web_features_bridge_state_home-panel_tsx_1cc5zdhxogl_2._.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[36885,a=>{"use strict";var b=a.i(87924),c=a.i(
|
|
1
|
+
module.exports=[36885,a=>{"use strict";var b=a.i(87924),c=a.i(74746),d=a.i(55596),e=a.i(99838),f=a.i(12110),g=a.i(56672),h=a.i(32043),i=a.i(52560),j=a.i(68370);function k({href:a,isOutside:c,children:d,...e}){return(0,b.jsxs)("a",{...e,href:a,...c?{target:"_blank",rel:"noopener noreferrer"}:{},className:`inline-flex items-center rounded-md border border-border bg-card text-card-foreground hover:bg-accent ${h.o.row}`,children:[(0,b.jsx)(j.f,{"aria-hidden":"true",className:"size-3.5"}),d]})}var l=a.i(91777),m=a.i(5759),n=a.i(34129);function o(a){let{stale:b,inBasket:c}=a;if(null===b&&null!==c)return null===c.option?"In the basket: the note alone":`In the basket: option ${String(c.option)}`;if(null===b)return"seen"===a.state?(0,f.M)(a.seenIn):void 0;let d=(0,e.f)(b,{from:a.from});return"withdrawn"===b.kind?`${d}: open it to clear it`:d}function p({item:a,opening:c}){let d=a.stale?.replacementId??null;return null===d?null:(0,b.jsx)(h.i,{"data-testid":"bridge-replacement",size:"row",isPending:c.openingId===d,pendingLabel:"Opening...",disabled:void 0!==c.openingId,onClick:()=>{c.open({deliveryId:d,job:a.job})},children:"do"===a.job?"Open the new step":"Open the new question"})}function q({item:a,opening:c}){return(0,b.jsx)(h.i,{"data-testid":"bridge-open",size:"row",isPending:c.openingId===a.deliveryId,pendingLabel:"Opening...",disabled:void 0!==c.openingId,onClick:()=>{c.open(a)},children:"Open"})}function r(){let a=(0,n.P)();return void 0===a?null:(0,b.jsxs)("button",{type:"button","data-testid":"bridge-send-message","aria-label":"Send a ship a message",onClick:()=>{a()},className:"inline-flex size-9 shrink-0 items-center justify-center gap-2 rounded-md border border-border bg-card font-semibold hover:bg-accent sm:w-auto sm:px-4",children:[(0,b.jsx)(c.f,{"aria-hidden":"true",className:"size-4"}),(0,b.jsx)("span",{className:"hidden sm:inline",children:"Send a ship a message"})]})}function s({item:a,opening:c}){let e=a.actInPlace;return e?.kind==="ownStep"?(0,b.jsx)(k,{"data-testid":"bridge-own-step",href:e.href,isOutside:!1,children:e.label}):(0,b.jsxs)(b.Fragment,{children:[e?.kind==="putPick"?(0,b.jsxs)(h.i,{"data-testid":"bridge-put-pick",variant:"primary",size:"row",isPending:c.puttingId===a.deliveryId,pendingLabel:"Putting...",disabled:void 0!==c.openingId||void 0!==c.puttingId,onClick:()=>{c.putPick(a,e.option)},children:[(0,b.jsx)(d.f,{"aria-hidden":"true",className:"size-3.5"}),"Put option ",e.option," in the basket"]}):null,e?.kind==="openLink"?(0,b.jsxs)(k,{"data-testid":"bridge-step-link",href:e.href,isOutside:!0,children:["Open ",e.host]}):null,(0,b.jsx)(p,{item:a,opening:c}),(0,b.jsx)(q,{item:a,opening:c})]})}function t(a,b){return void 0===b.openingId?()=>{b.open(a)}:void 0}function u({items:a,readAt:c,opening:d}){let e=void 0!==d.opened;return(0,b.jsx)("ul",{className:e?"border-t border-border":"overflow-hidden rounded-lg border border-border bg-card",children:a.map(a=>(0,b.jsx)(i.f,{item:a,now:c,isNew:"new"===a.state,isOpen:d.opened?.deliveryId===a.deliveryId,staleKind:a.stale?.kind,outcome:o(a),failure:d.failure?.deliveryId===a.deliveryId?d.failure.message:void 0,onOpen:t(a,d),actions:e?void 0:(0,b.jsx)(s,{item:a,opening:d})},a.deliveryId))})}function v({items:a,readAt:c,opening:d}){return(0,b.jsx)("ul",{className:void 0===d.opened?"overflow-hidden rounded-lg border border-border bg-card":"border-t border-border",children:a.map(a=>(0,b.jsx)(i.f,{item:a,now:c,isNew:"new"===a.state,isOpen:d.opened?.deliveryId===a.deliveryId,outcome:void 0,failure:d.failure?.deliveryId===a.deliveryId?d.failure.message:void 0,onOpen:t(a,d)},a.deliveryId))})}function w({home:a,readAt:c,opening:d,isStayAware:e}){let{waiting:f,stayAware:g}=a;return e?(0,b.jsxs)("section",{"aria-labelledby":"bridge-stay-aware-heading",children:[(0,b.jsxs)("div",{className:"flex items-baseline justify-between gap-3 px-3 py-2.5",children:[(0,b.jsx)("h2",{id:"bridge-stay-aware-heading",className:"font-semibold",children:"Stay aware"}),(0,b.jsxs)("span",{className:"text-caption text-muted-foreground",children:[g.filter(({state:a})=>"new"===a).length," unseen"]})]}),(0,b.jsx)(v,{items:g,readAt:c,opening:d})]}):(0,b.jsxs)("section",{"aria-labelledby":"bridge-waiting-heading",children:[(0,b.jsxs)("h1",{id:"bridge-waiting-heading",className:"px-3 py-2.5 font-semibold",children:["Waiting on you ",(0,b.jsx)("span",{"data-testid":"bridge-count",className:"text-tone-waiting-fg",children:f.count})]}),(0,b.jsx)(u,{items:f.items,readAt:c,opening:d})]})}function x({home:a,now:c,opening:d}){let e,f,g,{waiting:h,stayAware:i}=a,j=new Date(c);return void 0!==d.opened?(0,b.jsx)(w,{home:a,readAt:j,opening:d,isStayAware:"stay-aware"===d.opened.job}):(0,b.jsxs)("div",{className:"grid gap-8",children:[(0,b.jsxs)("section",{className:"grid gap-3","aria-labelledby":"bridge-waiting-heading",children:[(0,b.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsxs)("h1",{id:"bridge-waiting-heading",className:"text-heading font-semibold",children:["Waiting on you ",(0,b.jsx)("span",{"data-testid":"bridge-count",className:"text-tone-waiting-fg",children:h.count})]}),(0,b.jsx)("p",{className:"text-muted-foreground",children:0===h.count?"Nothing waits on you.":(f=(e=h.items.filter(({stale:a})=>null===a)).filter(({job:a})=>"decide"===a).length,g=e.filter(({job:a})=>"do"===a).length,`${String(f)} to decide, ${String(g)} to do. Newest on top; nothing else is in this count.`)})]}),(0,b.jsx)(r,{})]}),0===h.items.length?(0,b.jsxs)("div",{"data-testid":"bridge-nothing-waits",className:"grid justify-items-center gap-1 rounded-lg border border-border bg-card p-6 text-center",children:[(0,b.jsx)("span",{className:"font-semibold",children:"Nothing waits on you"}),(0,b.jsx)("span",{className:"text-muted-foreground",children:"Your ships have what they need from you. A question or a step shows here the moment one arrives."})]}):(0,b.jsx)(u,{items:h.items,readAt:j,opening:d})]}),(0,b.jsxs)("section",{className:"grid gap-3","aria-labelledby":"bridge-stay-aware-heading",children:[(0,b.jsxs)("div",{className:"flex items-baseline justify-between gap-3",children:[(0,b.jsx)("h2",{id:"bridge-stay-aware-heading",className:"text-section font-semibold",children:"Stay aware"}),(0,b.jsxs)("span",{className:"text-caption text-muted-foreground",children:[i.filter(({state:a})=>"new"===a).length," unseen, outside the count"]})]}),0===i.length?(0,b.jsx)("p",{"data-testid":"bridge-nothing-new",className:"rounded-md border border-border bg-card p-3 text-muted-foreground",children:"Nothing new. What you saw is in Done."}):(0,b.jsx)(v,{items:i,readAt:j,opening:d})]})]})}function y({items:a,lastReadAt:c}){let d=new Date(c);return(0,b.jsxs)("section",{className:"grid gap-3","aria-label":"Waiting on you, as last read",children:[0===a.length?null:(0,b.jsx)("ul",{inert:!0,className:"overflow-hidden rounded-lg border border-border bg-card opacity-60",children:a.map(a=>(0,b.jsx)(i.f,{item:a,now:d,isNew:"new"===a.state,isOpen:!1,staleKind:a.stale?.kind,outcome:o(a),failure:void 0,onOpen:void 0},a.deliveryId))}),(0,b.jsx)("p",{className:"text-caption text-muted-foreground",children:`Shown as last read, at ${(0,g.C)(c)}.`})]})}a.s(["HomePanel",0,function({fleetId:a,home:c,now:d,decidePlaces:e}){let f=(0,m.useLastReadAt)();return void 0!==f?(0,b.jsx)(y,{items:c.waiting.items,lastReadAt:f}):(0,b.jsx)(l.f,{fleetId:a,decidePlaces:e,children:a=>(0,b.jsx)(x,{home:c,now:d,opening:a})})},"StayAwareRows",0,v],36885)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=web_features_bridge_state_home-panel_tsx_1cc5zdhxogl_2._.js.map
|
package/web/.next/server/chunks/ssr/web_features_bridge_state_home-panel_tsx_1cc5zdhxogl_2._.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../web/features/bridge/state/home-panel.tsx"],"sourcesContent":["'use client';\n\nimport type { BridgeHome, HomeItem } from '../services/items';\nimport { ActionButton } from '../ui/action-button';\nimport { ItemRow } from '../ui/item-row';\nimport { ItemFocus, type ItemOpening } from './item-focus';\n\nfunction countsOf(items: readonly HomeItem[]): string {\n const counted = items.filter(({ stale }) => stale === null);\n const toDecide = counted.filter(({ job }) => job === 'decide').length;\n const toDo = counted.filter(({ job }) => job === 'do').length;\n return `${String(toDecide)} to decide, ${String(toDo)} to do. Newest on top; nothing else is in this count.`;\n}\n\n/** What a row says of its item: stale, in the basket, seen and not done, or nothing while new. */\nfunction rowOutcomeOf(item: HomeItem, items: readonly HomeItem[]): string | undefined {\n const { stale, inBasket } = item;\n if (stale === null && inBasket !== null) {\n return `In the basket: option ${String(inBasket.option)}`;\n }\n if (stale === null) {\n return item.state === 'seen' ? 'Seen, not done yet' : undefined;\n }\n if (stale.kind === 'withdrawn') {\n return `Withdrawn by ${item.from}: open it to clear it`;\n }\n const replacement = items.find(({ deliveryId }) => deliveryId === stale.replacementId);\n return replacement === undefined ? `Replaced by ${item.from}` : `Replaced by ${item.from} with “${replacement.title}”`;\n}\n\n/** Opens a replaced question's replacement, the new item. */\nfunction ReplacementButton({ item, opening }: { item: HomeItem; opening: ItemOpening }) {\n const replacementId = item.stale?.replacementId ?? null;\n if (replacementId === null) {\n return null;\n }\n return (\n <ActionButton data-testid=\"bridge-replacement\" isPending={opening.openingId === replacementId} pendingLabel=\"Opening...\" disabled={opening.openingId !== undefined} onClick={() => { opening.open({ deliveryId: replacementId, job: 'decide' }); }}>\n Open the new question\n </ActionButton>\n );\n}\n\nfunction OpenButton({ item, opening }: { item: HomeItem; opening: ItemOpening }) {\n return (\n <ActionButton data-testid=\"bridge-open\" isPending={opening.openingId === item.deliveryId} pendingLabel=\"Opening...\" disabled={opening.openingId !== undefined} onClick={() => { opening.open(item); }}>\n Open\n </ActionButton>\n );\n}\n\n/**\n * Bridge home's lists (CC18): what waits on the person, decide and do, with\n * one count, a dot on what is new, a question its asker withdrew or replaced\n * faded and outside the count, a replaced one leading to its replacement; and the stay-aware feed beside it, the\n * alerts and notices they have not seen, outside the count. Opening one of\n * the feed is all it asks (CC16).\n */\nexport function HomePanel({ fleetId, home }: { fleetId: string; home: BridgeHome }) {\n const { waiting, stayAware } = home;\n return (\n <ItemFocus fleetId={fleetId}>\n {(opening) => (\n <div className=\"grid gap-8\">\n <section className=\"grid gap-3\" aria-labelledby=\"bridge-waiting-heading\">\n <div>\n <h1 id=\"bridge-waiting-heading\" className=\"text-heading font-semibold\">\n Waiting on you <span data-testid=\"bridge-count\" className=\"text-tone-waiting-fg\">{waiting.count}</span>\n </h1>\n <p className=\"text-muted-foreground\">{waiting.count === 0 ? 'Nothing waits on you.' : countsOf(waiting.items)}</p>\n </div>\n {waiting.items.length === 0 ? (\n <div data-testid=\"bridge-nothing-waits\" className=\"grid justify-items-center gap-1 rounded-lg border border-border bg-card p-6 text-center\">\n <span className=\"font-semibold\">Nothing waits on you</span>\n <span className=\"text-muted-foreground\">Your ships have what they need from you. A question or a step shows here the moment one arrives.</span>\n </div>\n ) : (\n <ul className=\"grid gap-2\">\n {waiting.items.map((item) => (\n <ItemRow key={item.deliveryId} item={item} isNew={item.state === 'new'} isStale={item.stale !== null} outcome={rowOutcomeOf(item, waiting.items)} failure={opening.failure?.deliveryId === item.deliveryId ? opening.failure.message : undefined}>\n <ReplacementButton item={item} opening={opening} />\n <OpenButton item={item} opening={opening} />\n </ItemRow>\n ))}\n </ul>\n )}\n </section>\n <section className=\"grid gap-3\" aria-labelledby=\"bridge-stay-aware-heading\">\n <div className=\"flex items-baseline justify-between gap-3\">\n <h2 id=\"bridge-stay-aware-heading\" className=\"text-section font-semibold\">\n Stay aware\n </h2>\n <span className=\"text-caption text-muted-foreground\">{stayAware.length} unseen, outside the count</span>\n </div>\n {stayAware.length === 0 ? (\n <p data-testid=\"bridge-nothing-new\" className=\"rounded-md border border-border bg-card p-3 text-muted-foreground\">\n Nothing new. What you saw is in Done.\n </p>\n ) : (\n <ul className=\"grid gap-2\">\n {stayAware.map((item) => (\n <ItemRow key={item.deliveryId} item={item} isNew outcome={undefined} failure={opening.failure?.deliveryId === item.deliveryId ? opening.failure.message : undefined}>\n <OpenButton item={item} opening={opening} />\n </ItemRow>\n ))}\n </ul>\n )}\n </section>\n </div>\n )}\n </ItemFocus>\n );\n}\n"],"names":["countsOf","items","counted","filter","stale","toDecide","job","length","toDo","String","rowOutcomeOf","item","inBasket","option","state","undefined","kind","from","replacement","find","deliveryId","replacementId","title","ReplacementButton","opening","isPending","openingId","pendingLabel","disabled","onClick","open","OpenButton","HomePanel","fleetId","home","waiting","stayAware","className","id","count","map","isNew","isStale","outcome","failure","message"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/bridge/state/home-panel.tsx","../../../../../web/features/bridge/ui/row-link.tsx"],"sourcesContent":["'use client';\n\nimport { Send, ShoppingBasket } from 'lucide-react';\n\nimport { staleSaidOf } from '../services/deliveries';\nimport { seenTextOf, type BridgeHome, type HomeItem } from '../services/items';\nimport { lastReadTimeOf } from '../services/last-read';\nimport type { RoutedPlace } from '../services/routing';\nimport { ActionButton } from '../ui/action-button';\nimport { ItemRow } from '../ui/item-row';\nimport { RowLink } from '../ui/row-link';\nimport { ItemFocus, type ItemOpening } from './item-focus';\nimport { useLastReadAt } from './kept-read';\nimport { useSendMessage } from './send-message';\n\nfunction countsOf(items: readonly HomeItem[]): string {\n const counted = items.filter(({ stale }) => stale === null);\n const toDecide = counted.filter(({ job }) => job === 'decide').length;\n const toDo = counted.filter(({ job }) => job === 'do').length;\n return `${String(toDecide)} to decide, ${String(toDo)} to do. Newest on top; nothing else is in this count.`;\n}\n\n/** What a row says of its item: stale, in the basket, seen, or nothing while new. */\nfunction rowOutcomeOf(item: HomeItem): string | undefined {\n const { stale, inBasket } = item;\n if (stale === null && inBasket !== null) {\n return inBasket.option === null ? 'In the basket: the note alone' : `In the basket: option ${String(inBasket.option)}`;\n }\n if (stale === null) {\n return item.state === 'seen' ? seenTextOf(item.seenIn) : undefined;\n }\n const said = staleSaidOf(stale, { from: item.from });\n return stale.kind === 'withdrawn' ? `${said}: open it to clear it` : said;\n}\n\n/** Opens a replaced question's or step's replacement, the new item, of the same job. */\nfunction ReplacementButton({ item, opening }: { item: HomeItem; opening: ItemOpening }) {\n const replacementId = item.stale?.replacementId ?? null;\n if (replacementId === null) {\n return null;\n }\n return (\n <ActionButton data-testid=\"bridge-replacement\" size=\"row\" isPending={opening.openingId === replacementId} pendingLabel=\"Opening...\" disabled={opening.openingId !== undefined} onClick={() => { opening.open({ deliveryId: replacementId, job: item.job }); }}>\n {item.job === 'do' ? 'Open the new step' : 'Open the new question'}\n </ActionButton>\n );\n}\n\nfunction OpenButton({ item, opening }: { item: HomeItem; opening: ItemOpening }) {\n return (\n <ActionButton data-testid=\"bridge-open\" size=\"row\" isPending={opening.openingId === item.deliveryId} pendingLabel=\"Opening...\" disabled={opening.openingId !== undefined} onClick={() => { opening.open(item); }}>\n Open\n </ActionButton>\n );\n}\n\n/** Opens the form to send any ship a message (aeolus-fleet #1547): its words on the desktop, its icon alone on the phone. */\nfunction SendMessageButton() {\n const sendMessage = useSendMessage();\n if (sendMessage === undefined) {\n return null;\n }\n return (\n <button type=\"button\" data-testid=\"bridge-send-message\" aria-label=\"Send a ship a message\" onClick={() => { sendMessage(); }} className=\"inline-flex size-9 shrink-0 items-center justify-center gap-2 rounded-md border border-border bg-card font-semibold hover:bg-accent sm:w-auto sm:px-4\">\n <Send aria-hidden=\"true\" className=\"size-4\" />\n <span className=\"hidden sm:inline\">Send a ship a message</span>\n </button>\n );\n}\n\n/**\n * What a row does in place (aeolus-fleet#1535): the asker's pick into the\n * basket, or a step's link by its host, each beside Open; the gateway's own\n * step is its own action alone, where the gateway finishes it.\n */\nfunction WaitingActions({ item, opening }: { item: HomeItem; opening: ItemOpening }) {\n const act = item.actInPlace;\n if (act?.kind === 'ownStep') {\n return (\n <RowLink data-testid=\"bridge-own-step\" href={act.href} isOutside={false}>\n {act.label}\n </RowLink>\n );\n }\n return (\n <>\n {act?.kind === 'putPick' ? (\n <ActionButton data-testid=\"bridge-put-pick\" variant=\"primary\" size=\"row\" isPending={opening.puttingId === item.deliveryId} pendingLabel=\"Putting...\" disabled={opening.openingId !== undefined || opening.puttingId !== undefined} onClick={() => { opening.putPick(item, act.option); }}>\n <ShoppingBasket aria-hidden=\"true\" className=\"size-3.5\" />\n Put option {act.option} in the basket\n </ActionButton>\n ) : null}\n {act?.kind === 'openLink' ? (\n <RowLink data-testid=\"bridge-step-link\" href={act.href} isOutside>\n Open {act.host}\n </RowLink>\n ) : null}\n <ReplacementButton item={item} opening={opening} />\n <OpenButton item={item} opening={opening} />\n </>\n );\n}\n\n/** Opens an item from its title, unless one is opening now. */\nfunction openerOf(item: HomeItem, opening: ItemOpening): (() => void) | undefined {\n return opening.openingId === undefined ? () => { opening.open(item); } : undefined;\n}\n\n/** The rows of what waits: each with its actions while the list is shown alone, without them beside an open item, the open one marked. */\nfunction WaitingRows({ items, readAt, opening }: { items: readonly HomeItem[]; readAt: Date; opening: ItemOpening }) {\n const isBeside = opening.opened !== undefined;\n return (\n <ul className={isBeside ? 'border-t border-border' : 'overflow-hidden rounded-lg border border-border bg-card'}>\n {items.map((item) => (\n <ItemRow\n key={item.deliveryId}\n item={item}\n now={readAt}\n isNew={item.state === 'new'}\n isOpen={opening.opened?.deliveryId === item.deliveryId}\n staleKind={item.stale?.kind}\n outcome={rowOutcomeOf(item)}\n failure={opening.failure?.deliveryId === item.deliveryId ? opening.failure.message : undefined}\n onOpen={openerOf(item, opening)}\n actions={isBeside ? undefined : <WaitingActions item={item} opening={opening} />}\n />\n ))}\n </ul>\n );\n}\n\n/** The stay-aware feed's rows, a dot on those not seen; home and the Stay aware page share them. */\nexport function StayAwareRows({ items, readAt, opening }: { items: readonly HomeItem[]; readAt: Date; opening: ItemOpening }) {\n return (\n <ul className={opening.opened === undefined ? 'overflow-hidden rounded-lg border border-border bg-card' : 'border-t border-border'}>\n {items.map((item) => (\n <ItemRow key={item.deliveryId} item={item} now={readAt} isNew={item.state === 'new'} isOpen={opening.opened?.deliveryId === item.deliveryId} outcome={undefined} failure={opening.failure?.deliveryId === item.deliveryId ? opening.failure.message : undefined} onOpen={openerOf(item, opening)} />\n ))}\n </ul>\n );\n}\n\n/**\n * The list beside an open item (decide.html, stay-aware.html): the one it\n * was opened from, headed with its count, its rows without their buttons;\n * pressing a title opens that item in its place.\n */\nfunction ListBeside({ home, readAt, opening, isStayAware }: { home: BridgeHome; readAt: Date; opening: ItemOpening; isStayAware: boolean }) {\n const { waiting, stayAware } = home;\n return isStayAware ? (\n <section aria-labelledby=\"bridge-stay-aware-heading\">\n <div className=\"flex items-baseline justify-between gap-3 px-3 py-2.5\">\n <h2 id=\"bridge-stay-aware-heading\" className=\"font-semibold\">\n Stay aware\n </h2>\n <span className=\"text-caption text-muted-foreground\">{stayAware.filter(({ state }) => state === 'new').length} unseen</span>\n </div>\n <StayAwareRows items={stayAware} readAt={readAt} opening={opening} />\n </section>\n ) : (\n <section aria-labelledby=\"bridge-waiting-heading\">\n <h1 id=\"bridge-waiting-heading\" className=\"px-3 py-2.5 font-semibold\">\n Waiting on you <span data-testid=\"bridge-count\" className=\"text-tone-waiting-fg\">{waiting.count}</span>\n </h1>\n <WaitingRows items={waiting.items} readAt={readAt} opening={opening} />\n </section>\n );\n}\n\n/**\n * Bridge home's lists (CC18): what waits on the person, decide and do, with\n * one count, a dot on what is new, a question or step its asker withdrew or replaced\n * struck through and outside the count, a replaced one leading to its replacement; and the stay-aware feed beside it, the\n * alerts and notices, a dot on those not seen, which alone it counts, outside the count. Opening one of\n * the feed is all it asks (CC16): it stays in the feed, seen. Beside the count, the person sends any\n * ship a message. Beside an open item, only the list it was opened from (aeolus-fleet#1538).\n */\nexport function HomeLists({ home, now, opening }: { home: BridgeHome; now: string; opening: ItemOpening }) {\n const { waiting, stayAware } = home;\n const readAt = new Date(now);\n if (opening.opened !== undefined) {\n return <ListBeside home={home} readAt={readAt} opening={opening} isStayAware={opening.opened.job === 'stay-aware'} />;\n }\n return (\n <div className=\"grid gap-8\">\n <section className=\"grid gap-3\" aria-labelledby=\"bridge-waiting-heading\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <h1 id=\"bridge-waiting-heading\" className=\"text-heading font-semibold\">\n Waiting on you <span data-testid=\"bridge-count\" className=\"text-tone-waiting-fg\">{waiting.count}</span>\n </h1>\n <p className=\"text-muted-foreground\">{waiting.count === 0 ? 'Nothing waits on you.' : countsOf(waiting.items)}</p>\n </div>\n <SendMessageButton />\n </div>\n {waiting.items.length === 0 ? (\n <div data-testid=\"bridge-nothing-waits\" className=\"grid justify-items-center gap-1 rounded-lg border border-border bg-card p-6 text-center\">\n <span className=\"font-semibold\">Nothing waits on you</span>\n <span className=\"text-muted-foreground\">Your ships have what they need from you. A question or a step shows here the moment one arrives.</span>\n </div>\n ) : (\n <WaitingRows items={waiting.items} readAt={readAt} opening={opening} />\n )}\n </section>\n <section className=\"grid gap-3\" aria-labelledby=\"bridge-stay-aware-heading\">\n <div className=\"flex items-baseline justify-between gap-3\">\n <h2 id=\"bridge-stay-aware-heading\" className=\"text-section font-semibold\">\n Stay aware\n </h2>\n <span className=\"text-caption text-muted-foreground\">{stayAware.filter(({ state }) => state === 'new').length} unseen, outside the count</span>\n </div>\n {stayAware.length === 0 ? (\n <p data-testid=\"bridge-nothing-new\" className=\"rounded-md border border-border bg-card p-3 text-muted-foreground\">\n Nothing new. What you saw is in Done.\n </p>\n ) : (\n <StayAwareRows items={stayAware} readAt={readAt} opening={opening} />\n )}\n </section>\n </div>\n );\n}\n\n/**\n * What waited when Bridge home was last read, while the record cannot be\n * read (states.html): the rows faded and not to be opened, since opening\n * one acknowledges it through the fleet, and that they show as last read.\n * The stay-aware feed and sending a message wait for the fleet.\n */\nfunction WaitingAsLastRead({ items, lastReadAt }: { items: readonly HomeItem[]; lastReadAt: string }) {\n const readAt = new Date(lastReadAt);\n return (\n <section className=\"grid gap-3\" aria-label=\"Waiting on you, as last read\">\n {items.length === 0 ? null : (\n <ul inert className=\"overflow-hidden rounded-lg border border-border bg-card opacity-60\">\n {items.map((item) => (\n <ItemRow key={item.deliveryId} item={item} now={readAt} isNew={item.state === 'new'} isOpen={false} staleKind={item.stale?.kind} outcome={rowOutcomeOf(item)} failure={undefined} onOpen={undefined} />\n ))}\n </ul>\n )}\n <p className=\"text-caption text-muted-foreground\">{`Shown as last read, at ${lastReadTimeOf(lastReadAt)}.`}</p>\n </section>\n );\n}\n\n/** Bridge home: its lists, with one item in focus at a time; as last read, what waited then. */\nexport function HomePanel({ fleetId, home, now, decidePlaces }: { fleetId: string; home: BridgeHome; now: string; decidePlaces?: readonly RoutedPlace[] }) {\n const lastReadAt = useLastReadAt();\n if (lastReadAt !== undefined) {\n return <WaitingAsLastRead items={home.waiting.items} lastReadAt={lastReadAt} />;\n }\n return (\n <ItemFocus fleetId={fleetId} decidePlaces={decidePlaces}>\n {(opening) => <HomeLists home={home} now={now} opening={opening} />}\n </ItemFocus>\n );\n}\n","import { ExternalLink } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport { SIZES } from './action-button';\n\n/**\n * A link on an item's row that looks as its buttons do: where a step is\n * done. One that leads outside the gateway opens in a tab of its own, and\n * only by the person's own press (Bridge, section 9).\n */\nexport function RowLink({ href, isOutside, children, ...link }: { href: string; isOutside: boolean; children: ReactNode; 'data-testid'?: string }) {\n return (\n <a\n {...link}\n href={href}\n {...(isOutside ? { target: '_blank', rel: 'noopener noreferrer' } : {})}\n className={`inline-flex items-center rounded-md border border-border bg-card text-card-foreground hover:bg-accent ${SIZES.row}`}\n >\n <ExternalLink aria-hidden=\"true\" className=\"size-3.5\" />\n {children}\n </a>\n );\n}\n"],"names":["RowLink","href","isOutside","children","link","target","rel","className","row"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
(()=>{"use strict";module.exports=[32043,a=>{var b=a.i(87924);let c={primary:"bg-primary text-primary-foreground hover:bg-primary-hover",secondary:"border border-border bg-card text-card-foreground hover:bg-accent"};a.s(["
|
|
1
|
+
(()=>{"use strict";module.exports=[32043,a=>{var b=a.i(87924);let c={primary:"bg-primary text-primary-foreground hover:bg-primary-hover",secondary:"border border-border bg-card text-card-foreground hover:bg-accent",ghost:"text-foreground hover:bg-accent"},d={regular:"h-9 gap-2 px-4",row:"h-9 gap-2 px-4 text-body sm:h-6 sm:gap-1.5 sm:px-2.5 sm:text-meta",small:"h-8 gap-2 px-3 text-meta",xs:"h-7 gap-1.5 px-2.5 text-caption font-medium"};a.s(["i",0,function({isPending:a,pendingLabel:e,variant:f="secondary",size:g="regular",children:h,className:i="",disabled:j,...k}){return(0,b.jsx)("button",{...k,disabled:!0===j||a,"aria-busy":a,className:`inline-flex items-center rounded-md disabled:cursor-not-allowed disabled:opacity-70 ${d[g]} ${c[f]} ${i}`,children:a?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{"aria-hidden":"true",className:"size-3.5 animate-spin rounded-full border-2 border-current border-t-transparent"}),e]}):h})},"o",0,d])},10039,a=>{var b=a.i(87924);a.s(["f",0,function({message:a,isFailure:c}){return c?(0,b.jsx)("p",{role:"alert","data-testid":"bridge-failure",className:"rounded-md border border-tone-attention-border bg-tone-attention-bg px-3 py-2 text-tone-attention-fg",children:a}):(0,b.jsx)("p",{role:"status","data-testid":"bridge-success",className:"rounded-md border border-tone-ok-border bg-tone-ok-bg px-3 py-2 text-tone-ok-fg",children:a})}])}]})();
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=web_features_bridge_ui_1y4g3fe75nqn5._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../web/features/bridge/ui/action-button.tsx","../../../../../web/features/bridge/ui/notice.tsx"],"sourcesContent":["import type { ButtonHTMLAttributes, ReactNode } from 'react';\n\nconst VARIANTS = {\n primary: 'bg-primary text-primary-foreground hover:bg-primary-hover',\n secondary: 'border border-border bg-card text-card-foreground hover:bg-accent',\n} as const;\n\n/**\n * A button for an action: the moment it is pressed and until the answer\n * comes, it shows a spinner and its working label, and cannot run twice.\n */\nexport function ActionButton({\n isPending,\n pendingLabel,\n variant = 'secondary',\n children,\n className = '',\n disabled,\n ...button\n}: ButtonHTMLAttributes<HTMLButtonElement> & { isPending: boolean; pendingLabel: string; variant?: keyof typeof VARIANTS; children: ReactNode }) {\n return (\n <button\n {...button}\n disabled={disabled === true || isPending}\n aria-busy={isPending}\n className={`inline-flex
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/bridge/ui/action-button.tsx","../../../../../web/features/bridge/ui/notice.tsx"],"sourcesContent":["import type { ButtonHTMLAttributes, ReactNode } from 'react';\n\nconst VARIANTS = {\n primary: 'bg-primary text-primary-foreground hover:bg-primary-hover',\n secondary: 'border border-border bg-card text-card-foreground hover:bg-accent',\n ghost: 'text-foreground hover:bg-accent',\n} as const;\n\n/** A row's buttons are small on a desktop, and a thumb's size on a phone (Bridge mockups, home). */\nexport const SIZES = {\n regular: 'h-9 gap-2 px-4',\n row: 'h-9 gap-2 px-4 text-body sm:h-6 sm:gap-1.5 sm:px-2.5 sm:text-meta',\n /** A basket entry's buttons (basket.html). */\n small: 'h-8 gap-2 px-3 text-meta',\n /** A place card's one action (routing.html). */\n xs: 'h-7 gap-1.5 px-2.5 text-caption font-medium',\n} as const;\n\n/**\n * A button for an action: the moment it is pressed and until the answer\n * comes, it shows a spinner and its working label, and cannot run twice.\n */\nexport function ActionButton({\n isPending,\n pendingLabel,\n variant = 'secondary',\n size = 'regular',\n children,\n className = '',\n disabled,\n ...button\n}: ButtonHTMLAttributes<HTMLButtonElement> & { isPending: boolean; pendingLabel: string; variant?: keyof typeof VARIANTS; size?: keyof typeof SIZES; children: ReactNode }) {\n return (\n <button\n {...button}\n disabled={disabled === true || isPending}\n aria-busy={isPending}\n className={`inline-flex items-center rounded-md disabled:cursor-not-allowed disabled:opacity-70 ${SIZES[size]} ${VARIANTS[variant]} ${className}`}\n >\n {isPending ? (\n <>\n <span aria-hidden=\"true\" className=\"size-3.5 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n {pendingLabel}\n </>\n ) : (\n children\n )}\n </button>\n );\n}\n","/** What an action came to, said in place: a success as a status, a failure as an alert by the control. */\nexport function Notice({ message, isFailure }: { message: string; isFailure: boolean }) {\n return isFailure ? (\n <p role=\"alert\" data-testid=\"bridge-failure\" className=\"rounded-md border border-tone-attention-border bg-tone-attention-bg px-3 py-2 text-tone-attention-fg\">\n {message}\n </p>\n ) : (\n <p role=\"status\" data-testid=\"bridge-success\" className=\"rounded-md border border-tone-ok-border bg-tone-ok-bg px-3 py-2 text-tone-ok-fg\">\n {message}\n </p>\n );\n}\n"],"names":["VARIANTS","primary","secondary","ghost","SIZES","regular","row","small","xs","ActionButton","isPending","pendingLabel","variant","size","children","className","disabled","button","Notice","message","isFailure","role"],"mappings":"8DAEA,IAAMA,EAAW,CACfC,QAAS,4DACTC,UAAW,oEACXC,MAAO,iCACT,EAGaC,EAAQ,CACnBC,QAAS,iBACTC,IAAK,oEAELC,MAAO,2BAEPC,GAAI,6CACN,aAMO,SAASC,AAAa,WAC3BC,CAAS,cACTC,CAAY,SACZC,EAAU,WAAW,MACrBC,EAAO,SAAS,UAChBC,CAAQ,WACRC,EAAY,EAAE,UACdC,CAAQ,CACR,GAAGC,EACqK,EACxK,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACE,GAAGA,CAAM,CACVD,UAAuB,IAAbA,GAAqBN,EAC/B,YAAWA,EACXK,UAAW,CAAC,oFAAoF,EAAEX,CAAK,CAACS,EAAK,CAAC,CAAC,EAAEb,CAAQ,CAACY,EAAQ,CAAC,CAAC,EAAEG,EAAAA,CAAW,UAEhJL,EACC,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,cAAY,OAAOK,UAAU,oFAClCJ,KAGHG,GAIR,uBCjDwG,IAAA,EAAA,EAAA,CAAA,CAAA,kBACjG,SAASI,AAAO,SAAEC,CAAO,WAAEC,CAAS,CAA2C,EACpF,OAAOA,EACL,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAEC,KAAK,QAAQ,cAAY,iBAAiBN,UAAU,gHACpDI,IAGH,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAEE,KAAK,SAAS,cAAY,iBAAiBN,UAAU,2FACrDI,GAGP"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports=[52560,a=>{"use strict";var b=a.i(87924),c=a.i(83900),d=a.i(37149),e=a.i(62591),f=a.i(98238),g=a.i(86708),h=a.i(12110),i=a.i(53398),j=a.i(10039),k=a.i(42462);let l={bridge:{icon:f.f,name:"Bridge"},slack:{icon:d.f,name:"Slack"},chat:{icon:g.f,name:"a chat"},"web-push":{icon:c.f,name:"web push"},email:{icon:e.f,name:"email"}};function m(){return(0,b.jsx)("span",{"aria-hidden":"true",className:"text-border",children:"·"})}function n({places:a}){var c;let d,e=["bridge",...a].map(a=>l[a]);return(0,b.jsx)("span",{role:"img","aria-label":`Shows in ${(d=(c=e.map(({name:a})=>a)).at(-1)??"",c.length<2?d:`${c.slice(0,-1).join(", ")} and ${d}`)}`,className:"inline-flex items-center gap-0.5",children:e.map(({icon:a,name:c})=>(0,b.jsx)(a,{"aria-hidden":"true",className:"size-3"},c))})}a.s(["f",0,function({item:a,now:c,isNew:d,isOpen:e=!1,staleKind:f,outcome:g,failure:l,onOpen:o,time:p,detail:q,actions:r}){var s;let t=a.isAlert??!1,u=(0,i.f)({job:a.job,isAlert:t}),v=u.icon,w="min-w-0 break-words text-left text-body-touch font-medium sm:truncate sm:text-body",x=void 0===f?a.title:(0,b.jsx)("s",{className:"decoration-muted-foreground",children:a.title});return(0,b.jsxs)("li",{"data-testid":"bridge-item","data-stale":void 0!==f,"aria-current":!!e||void 0,className:`grid min-w-0 grid-cols-[1rem_minmax(0,1fr)_auto] items-start gap-x-2.5 gap-y-1.5 border-t border-border px-3 py-2.5 first:border-t-0 ${function({isOpen:a,isStale:b}){return a?"bg-highlight shadow-[inset_2px_0_0_var(--primary)]":b?"bg-muted":""}({isOpen:e,isStale:void 0!==f})}`,children:[(0,b.jsx)(v,{"aria-hidden":"true",className:`mt-0.5 size-4 ${u.tone}`}),(0,b.jsxs)("span",{className:"flex min-w-0 flex-col gap-0.5",children:[(0,b.jsxs)("span",{className:"flex min-w-0 items-baseline sm:items-center",children:[d?(0,b.jsx)("span",{"aria-label":"New",className:"mr-1.5 size-[7px] shrink-0 -translate-y-px rounded-full bg-primary"}):null,void 0===o?(0,b.jsx)("span",{"data-testid":"bridge-item-title",className:w,children:x}):(0,b.jsx)("button",{type:"button","data-testid":"bridge-item-title",onClick:o,className:`${w} hover:underline`,children:x})]}),(0,b.jsxs)("span",{className:"flex flex-wrap items-center gap-1.5 text-caption text-muted-foreground",children:[(0,b.jsx)("span",{className:`font-medium ${u.tone}`,children:(0,h.z)({job:a.job,isAlert:t})}),(0,b.jsx)(m,{}),(0,b.jsx)("span",{children:a.from}),void 0===g?null:(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(m,{}),(0,b.jsxs)("span",{"data-testid":"bridge-outcome",className:"inline-flex items-center gap-1.5",children:[void 0===f?null:(0,b.jsx)(k.f,{kind:f}),g]})]}),void 0===a.places?null:(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(m,{}),(0,b.jsx)(n,{places:a.places})]})]})]}),(0,b.jsx)("time",{dateTime:p?.at??a.sentAt,title:(s=p?.at??a.sentAt,`${new Date(s).toISOString().slice(0,16).replace("T"," ")} UTC`),className:"whitespace-nowrap text-right text-caption text-muted-foreground",children:p?.said??(0,h.V)(a.sentAt,c)}),void 0===q?null:(0,b.jsx)("div",{className:"col-span-2 col-start-2",children:q}),null==r?null:(0,b.jsx)("div",{className:"col-span-2 col-start-2 flex flex-wrap items-center gap-1.5",children:r}),void 0===l?null:(0,b.jsx)("div",{className:"col-span-2 col-start-2",children:(0,b.jsx)(j.f,{message:l,isFailure:!0})})]})}])}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=web_features_bridge_ui_item-row_tsx_0c_a8wjzwsr7j._.js.map
|