@aeolus-fleet/gateway 0.36.2 → 0.36.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/adapters/fleet/actor-door.d.ts +8 -1
- package/dist/adapters/fleet/actor-door.js +12 -5
- package/dist/adapters/fleet/actor-door.js.map +1 -1
- package/dist/adapters/fleet/argo-inbox-door.d.ts +4 -0
- package/dist/adapters/fleet/argo-inbox-door.js +81 -0
- package/dist/adapters/fleet/argo-inbox-door.js.map +1 -0
- package/dist/adapters/fleet/rest-fleet-door.d.ts +14 -0
- package/dist/adapters/fleet/rest-fleet-door.js +11 -1
- package/dist/adapters/fleet/rest-fleet-door.js.map +1 -1
- package/dist/adapters/http/front-door.js +3 -1
- package/dist/adapters/http/front-door.js.map +1 -1
- package/dist/adapters/http/live.d.ts +10 -1
- package/dist/adapters/http/live.js +10 -1
- package/dist/adapters/http/live.js.map +1 -1
- package/dist/adapters/pagasae/email-channel.js +5 -3
- package/dist/adapters/pagasae/email-channel.js.map +1 -1
- package/dist/adapters/pagasae/pagasae-client.js +1 -0
- package/dist/adapters/pagasae/pagasae-client.js.map +1 -1
- package/dist/adapters/pagasae/shared-sign-in.js +2 -2
- package/dist/adapters/pagasae/shared-sign-in.js.map +1 -1
- package/dist/adapters/prisma/argo-accounts.d.ts +4 -0
- package/dist/adapters/prisma/argo-accounts.js +17 -0
- package/dist/adapters/prisma/argo-accounts.js.map +1 -0
- package/dist/adapters/prisma/argo-slack-posts.d.ts +4 -0
- package/dist/adapters/prisma/argo-slack-posts.js +30 -0
- package/dist/adapters/prisma/argo-slack-posts.js.map +1 -0
- package/dist/adapters/prisma/argo-wakes.d.ts +4 -0
- package/dist/adapters/prisma/argo-wakes.js +54 -0
- package/dist/adapters/prisma/argo-wakes.js.map +1 -0
- package/dist/adapters/prisma/fleet-forgetter.d.ts +1 -1
- package/dist/adapters/prisma/fleet-forgetter.js +2 -2
- package/dist/adapters/prisma/fleet-forgetter.js.map +1 -1
- package/dist/adapters/prisma/generated/browser.d.ts +20 -0
- package/dist/adapters/prisma/generated/client.d.ts +20 -0
- package/dist/adapters/prisma/generated/internal/class.d.ts +44 -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 +334 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js +30 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +33 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +30 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
- package/dist/adapters/prisma/generated/models/ArgoAccount.d.ts +946 -0
- package/dist/adapters/prisma/generated/models/ArgoAccount.js +2 -0
- package/dist/adapters/prisma/generated/models/ArgoAccount.js.map +1 -0
- package/dist/adapters/prisma/generated/models/ArgoMessageCovered.d.ts +947 -0
- package/dist/adapters/prisma/generated/models/ArgoMessageCovered.js +2 -0
- package/dist/adapters/prisma/generated/models/ArgoMessageCovered.js.map +1 -0
- package/dist/adapters/prisma/generated/models/ArgoSlackPost.d.ts +1065 -0
- package/dist/adapters/prisma/generated/models/ArgoSlackPost.js +2 -0
- package/dist/adapters/prisma/generated/models/ArgoSlackPost.js.map +1 -0
- package/dist/adapters/prisma/generated/models/ArgoWakeSent.d.ts +975 -0
- package/dist/adapters/prisma/generated/models/ArgoWakeSent.js +2 -0
- package/dist/adapters/prisma/generated/models/ArgoWakeSent.js.map +1 -0
- package/dist/adapters/prisma/generated/models.d.ts +4 -0
- package/dist/adapters/slack/slack-messages.js +5 -4
- package/dist/adapters/slack/slack-messages.js.map +1 -1
- package/dist/adapters/trpc/router.d.ts +24 -0
- package/dist/adapters/trpc/router.js +11 -0
- package/dist/adapters/trpc/router.js.map +1 -1
- package/dist/adapters/web-push/web-push.js +1 -1
- package/dist/adapters/web-push/web-push.js.map +1 -1
- package/dist/app.js +89 -2
- package/dist/app.js.map +1 -1
- package/dist/core/account-sign-in/account-of-sign-in.d.ts +7 -2
- package/dist/core/account-sign-in/account-of-sign-in.js +9 -3
- package/dist/core/account-sign-in/account-of-sign-in.js.map +1 -1
- package/dist/core/account-sign-in/ports.d.ts +2 -0
- package/dist/core/argo-inbox/argo-inbox.d.ts +31 -0
- package/dist/core/argo-inbox/argo-inbox.js +23 -0
- package/dist/core/argo-inbox/argo-inbox.js.map +1 -0
- package/dist/core/argo-inbox/argo-slack-message.d.ts +17 -0
- package/dist/core/argo-inbox/argo-slack-message.js +40 -0
- package/dist/core/argo-inbox/argo-slack-message.js.map +1 -0
- package/dist/core/argo-inbox/argo-slack-post.d.ts +21 -0
- package/dist/core/argo-inbox/argo-slack-post.js +2 -0
- package/dist/core/argo-inbox/argo-slack-post.js.map +1 -0
- package/dist/core/argo-inbox/follow-argo-inbox.d.ts +33 -0
- package/dist/core/argo-inbox/follow-argo-inbox.js +133 -0
- package/dist/core/argo-inbox/follow-argo-inbox.js.map +1 -0
- package/dist/core/argo-inbox/note-argo-account.d.ts +19 -0
- package/dist/core/argo-inbox/note-argo-account.js +18 -0
- package/dist/core/argo-inbox/note-argo-account.js.map +1 -0
- package/dist/core/argo-inbox/ports.d.ts +123 -0
- package/dist/core/argo-inbox/ports.js +2 -0
- package/dist/core/argo-inbox/ports.js.map +1 -0
- package/dist/core/argo-inbox/read-argo-inbox-notice.d.ts +34 -0
- package/dist/core/argo-inbox/read-argo-inbox-notice.js +20 -0
- package/dist/core/argo-inbox/read-argo-inbox-notice.js.map +1 -0
- package/dist/core/argo-inbox/read-argo-section.d.ts +54 -0
- package/dist/core/argo-inbox/read-argo-section.js +67 -0
- package/dist/core/argo-inbox/read-argo-section.js.map +1 -0
- package/dist/core/argo-inbox/show-argo-inbox-in-slack.d.ts +36 -0
- package/dist/core/argo-inbox/show-argo-inbox-in-slack.js +125 -0
- package/dist/core/argo-inbox/show-argo-inbox-in-slack.js.map +1 -0
- package/dist/core/argo-inbox/wake-for-argo.d.ts +37 -0
- package/dist/core/argo-inbox/wake-for-argo.js +139 -0
- package/dist/core/argo-inbox/wake-for-argo.js.map +1 -0
- package/dist/core/oauth/exchange-id-jag.d.ts +4 -1
- package/dist/core/oauth/exchange-id-jag.js +5 -2
- package/dist/core/oauth/exchange-id-jag.js.map +1 -1
- package/dist/core/people/person-wakes.d.ts +49 -0
- package/dist/core/people/person-wakes.js +27 -0
- package/dist/core/people/person-wakes.js.map +1 -0
- package/dist/core/people/ports.d.ts +6 -2
- package/dist/core/people/wake-person.js +1 -1
- package/dist/core/people/wake-person.js.map +1 -1
- package/dist/core/people/web-push-channel.js +2 -2
- package/dist/core/people/web-push-channel.js.map +1 -1
- package/dist/core/sign-in/account-token.d.ts +5 -1
- package/dist/core/sign-in/account-token.js +8 -2
- package/dist/core/sign-in/account-token.js.map +1 -1
- package/dist/core/sign-in/complete-sign-in.d.ts +4 -1
- package/dist/core/sign-in/complete-sign-in.js +5 -2
- package/dist/core/sign-in/complete-sign-in.js.map +1 -1
- package/dist/core/sign-in/ports.d.ts +2 -0
- package/dist/core/slack/edited-post-of.d.ts +2 -0
- package/dist/core/slack/edited-post-of.js +1 -1
- package/dist/core/slack/edited-post-of.js.map +1 -1
- package/dist/core/slack/ports.d.ts +6 -4
- package/package.json +3 -2
- package/src/adapters/prisma/migrations/20261109090000_argo_accounts/migration.sql +8 -0
- package/src/adapters/prisma/migrations/20261110090000_argo_slack_posts/migration.sql +12 -0
- package/src/adapters/prisma/migrations/20261110100000_argo_wakes/migration.sql +18 -0
- package/src/adapters/prisma/schema.prisma +47 -0
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +3 -3
- package/web/.next/diagnostics/route-bundle-stats.json +130 -128
- package/web/.next/fallback-build-manifest.json +3 -3
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/server/app/(bridge)/bridge/basket/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/(bridge)/bridge/basket/page.js +6 -6
- package/web/.next/server/app/(bridge)/bridge/basket/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/basket/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/bridge/done/page/server-reference-manifest.json +2 -2
- package/web/.next/server/app/(bridge)/bridge/done/page.js +6 -6
- package/web/.next/server/app/(bridge)/bridge/done/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/done/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/bridge/fleet/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/fleet/page.js +6 -6
- package/web/.next/server/app/(bridge)/bridge/fleet/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/fleet/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/bridge/page/server-reference-manifest.json +9 -9
- package/web/.next/server/app/(bridge)/bridge/page.js +6 -6
- package/web/.next/server/app/(bridge)/bridge/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/bridge/settings/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/settings/page.js +7 -7
- package/web/.next/server/app/(bridge)/bridge/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/bridge/settings/requests/[requestId]/page/server-reference-manifest.json +2 -2
- package/web/.next/server/app/(bridge)/bridge/settings/requests/[requestId]/page.js +6 -6
- package/web/.next/server/app/(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 +1 -1
- package/web/.next/server/app/(bridge)/bridge/settings/routing/page/server-reference-manifest.json +5 -5
- package/web/.next/server/app/(bridge)/bridge/settings/routing/page.js +4 -4
- package/web/.next/server/app/(bridge)/bridge/settings/routing/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/settings/routing/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/bridge/stay-aware/page/server-reference-manifest.json +9 -9
- package/web/.next/server/app/(bridge)/bridge/stay-aware/page.js +5 -5
- package/web/.next/server/app/(bridge)/bridge/stay-aware/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/stay-aware/page_client-reference-manifest.js +1 -1
- 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/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/server-reference-manifest.json +15 -15
- 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/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/server-reference-manifest.json +15 -15
- 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/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/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/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/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/server-reference-manifest.json +7 -7
- 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/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/server-reference-manifest.json +11 -11
- 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/server-reference-manifest.json +11 -11
- 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/page/server-reference-manifest.json +11 -11
- 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/server-reference-manifest.json +11 -11
- package/web/.next/server/app/(console)/slack/remove/page.js +2 -2
- 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.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/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/authorize/failed/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/authorize/failed/page.js +3 -4
- 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/server-reference-manifest.json +1 -1
- package/web/.next/server/app/authorize/pick/page.js +3 -4
- 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/server-reference-manifest.json +1 -1
- package/web/.next/server/app/authorize/waiting/approval/page.js +3 -4
- 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/chunks/ssr/01fr_app_(bridge)_bridge_settings_requests_[requestId]_page_actions_0o8g7_xshtmem.js +1 -1
- package/web/.next/server/chunks/ssr/01fr_app_(bridge)_bridge_settings_requests_[requestId]_page_actions_0o8g7_xshtmem.js.map +1 -1
- package/web/.next/server/chunks/ssr/0b9d__next-internal_server_app_(bridge)_bridge_stay-aware_page_actions_1u0xo0v3y9c34.js +1 -1
- package/web/.next/server/chunks/ssr/0b9d__next-internal_server_app_(bridge)_bridge_stay-aware_page_actions_1u0xo0v3y9c34.js.map +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_bridge_settings_routing_page_actions_06_j7s24dy5ee.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_bridge_settings_routing_page_actions_06_j7s24dy5ee.js.map +1 -1
- 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]__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 +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0fz0817_b9ljl._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0gptrhg3mj4hs._.js.map +1 -1
- 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.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0rmg7huc074bf._.js +1 -1
- 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 +1 -1
- 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]__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]__1qtzvez4cn5be._.js → [root-of-the-server]__1ektgsnjg4btl._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1hgu6f5hpnykv._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__1j6n8jj7-5t6v._.js → [root-of-the-server]__1nfpyr3ynmwks._.js} +1 -1
- 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]__1ul9rrs2g66lm._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__20gvfqy33wcds._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_00fvst5icgei4._.js +3 -0
- package/web/.next/server/chunks/ssr/_00fvst5icgei4._.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/_02mwdj1oj1zgm._.js +3 -0
- package/web/.next/server/chunks/ssr/_02mwdj1oj1zgm._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_0fqd23gyia_8g._.js +3 -0
- package/web/.next/server/chunks/ssr/_0fqd23gyia_8g._.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/_0pyd1_y7w8ngp._.js +1 -1
- package/web/.next/server/chunks/ssr/_0pyd1_y7w8ngp._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0u0u0owpxx_37._.js +3 -0
- package/web/.next/server/chunks/ssr/_0u0u0owpxx_37._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_0v_x6k3ztfvx0._.js +1 -1
- package/web/.next/server/chunks/ssr/_0v_x6k3ztfvx0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0x5-_917zcaj9._.js +3 -0
- package/web/.next/server/chunks/ssr/_0x5-_917zcaj9._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_0cnpz5jm2_9xf._.js → _0xajzaside0sw._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_0cnpz5jm2_9xf._.js.map → _0xajzaside0sw._.js.map} +1 -1
- 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/_0yhvyj-yts7qi._.js +3 -0
- package/web/.next/server/chunks/ssr/_0yhvyj-yts7qi._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_104ilzyn58zw_._.js +3 -0
- package/web/.next/server/chunks/ssr/_104ilzyn58zw_._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_1a9wrl8uw7x-y._.js → _13_ady-a4058y._.js} +1 -1
- package/web/.next/server/chunks/ssr/_14k1oldo5chf8._.js +1 -1
- package/web/.next/server/chunks/ssr/_14k1oldo5chf8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1_wav28san6dm._.js +1 -1
- package/web/.next/server/chunks/ssr/{_1iorutn_o9hja._.js → _1cc4ie_s4tycq._.js} +1 -1
- package/web/.next/server/chunks/ssr/_1e2o809f0ekry._.js +1 -1
- package/web/.next/server/chunks/ssr/_1gbkqq8ra1nei._.js +1 -1
- package/web/.next/server/chunks/ssr/_1gbkqq8ra1nei._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_1kdx8a0j5cxyl._.js → _1gnk2vqna6c6u._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_1kdx8a0j5cxyl._.js.map → _1gnk2vqna6c6u._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_1k2b80m058vgx._.js +3 -0
- package/web/.next/server/chunks/ssr/_1k2b80m058vgx._.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/_1qbsmlji34yph._.js +1 -1
- package/web/.next/server/chunks/ssr/_1qbsmlji34yph._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1t74yvog5g6g2._.js +1 -1
- package/web/.next/server/chunks/ssr/_1t74yvog5g6g2._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_1i5zdy3tp2ykh._.js → _1xgivp19ts9hn._.js} +1 -1
- package/web/.next/server/chunks/ssr/_1zmd3armaxhyu._.js +1 -1
- package/web/.next/server/chunks/ssr/_1zmd3armaxhyu._.js.map +1 -1
- package/web/.next/server/chunks/ssr/node_modules_05ni_zu0e0w44._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_05ni_zu0e0w44._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_07vtvfyfo0a6i._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_07vtvfyfo0a6i._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_0ettht2so2tkh._.js +1 -1
- package/web/.next/server/chunks/ssr/node_modules_0keape0zsobyj._.js +1 -1
- package/web/.next/server/chunks/ssr/node_modules_12euo0ncdx1pn._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_12euo0ncdx1pn._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_1722-epjft-rn._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_1722-epjft-rn._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{node_modules_@aeolus-fleet_common_dist_header_1x3s5abk_uj9j._.js → node_modules_@aeolus-fleet_ui_dist_11tn8gozt2_c3._.js} +2 -2
- package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_ui_dist_11tn8gozt2_c3._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_ui_dist_16j49enf275ln._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_ui_dist_16j49enf275ln._.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_19e_nxxf4a88q._.js +1 -1
- package/web/.next/server/chunks/ssr/web_0_peudz6-o69m._.js +1 -1
- package/web/.next/server/chunks/ssr/web_0_peudz6-o69m._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_0cxcy088wnfmw._.js +1 -1
- package/web/.next/server/chunks/ssr/web_0oz8bypfxh82g._.js +1 -1
- package/web/.next/server/chunks/ssr/web_0oz8bypfxh82g._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_0qgev3ti257yj._.js +1 -1
- 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 +1 -1
- package/web/.next/server/chunks/ssr/web_1ga4pbv72m0ad._.js +1 -1
- package/web/.next/server/chunks/ssr/web_1irsulms62lzf._.js +1 -1
- package/web/.next/server/chunks/ssr/web_1k2rrq-kr6f9k._.js +1 -1
- package/web/.next/server/chunks/ssr/web_1k2rrq-kr6f9k._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_1qvxzqmq4aw94._.js +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_basket_page_actions_0g7q_rc5nma1e.js +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_basket_page_actions_0g7q_rc5nma1e.js.map +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_done_page_actions_0kjm34arntdzv.js +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_done_page_actions_0kjm34arntdzv.js.map +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_page_actions_1ok64rg3edm_u.js +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_page_actions_1ok64rg3edm_u.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_app_(bridge)_bridge_fleet_page_tsx_0uvtx8hiy8g0n._.js +1 -1
- package/web/.next/server/chunks/ssr/web_app_(bridge)_bridge_settings_page_tsx_1z5yr8ss25q7n._.js +1 -1
- package/web/.next/server/chunks/ssr/web_app_(console)_parties_page_tsx_0pp63ghly3eyp._.js +1 -1
- package/web/.next/server/chunks/ssr/web_app_authorize_layout_tsx_0gs61_7wzx68y._.js +1 -1
- package/web/.next/server/chunks/ssr/web_app_authorize_layout_tsx_0gs61_7wzx68y._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{web_features_0bwqcs9wjf4y8._.js → web_features_06f9kfi0c4nf8._.js} +2 -2
- package/web/.next/server/chunks/ssr/{web_features_05aos-xwnl3m_._.js.map → web_features_06f9kfi0c4nf8._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/web_features_0rd6357w-eo50._.js +1 -1
- package/web/.next/server/chunks/ssr/{web_features_05aos-xwnl3m_._.js → web_features_12b-75qfhurxi._.js} +2 -2
- package/web/.next/server/chunks/ssr/{web_features_0bwqcs9wjf4y8._.js.map → web_features_12b-75qfhurxi._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/web_features_19r68thirqv1n._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_1m5g9a6mwrsd-._.js +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_authorize_137wk0n1nu3cn._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_authorize_137wk0n1nu3cn._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{web_features_bridge_0w95y19yk5w14._.js → web_features_bridge_0msm42qwm0-jq._.js} +2 -2
- package/web/.next/server/chunks/ssr/{web_features_bridge_0w95y19yk5w14._.js.map → web_features_bridge_0msm42qwm0-jq._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_fleet_ui_fleet-numbers_tsx_0_afv4j248_w-._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_fleet_ui_fleet-numbers_tsx_0_afv4j248_w-._.js.map +1 -1
- 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_025l9l6m2zkya._.js → web_features_forms_1u0akr22eh_x_._.js} +2 -2
- package/web/.next/server/chunks/ssr/web_features_forms_1u0akr22eh_x_._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_frame_01uyck6q56an2._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_frame_01uyck6q56an2._.js.map +1 -0
- 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_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_1-lre9nfakki7._.js +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/middleware-build-manifest.js +3 -3
- 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 +49 -49
- package/web/.next/static/chunks/030kay14jcn_y.js +1 -0
- package/web/.next/static/chunks/0ben53l12lrh1.js +1 -0
- package/web/.next/static/chunks/0d1u4n5okodee.css +3 -0
- package/web/.next/static/chunks/0dg4cy4rae-3o.js +1 -0
- package/web/.next/static/chunks/0jwils_670syn.js +1 -0
- package/web/.next/static/chunks/0lnew3mjkd54b.js +1 -0
- package/web/.next/static/chunks/0m95j-t2qmnd_.js +1 -0
- package/web/.next/static/chunks/0r5ujkp-5utsu.js +1 -0
- package/web/.next/static/chunks/{23vvtbj-zoa_f.js → 1jyiwl5szsvgn.js} +1 -1
- package/web/.next/static/chunks/{0k33n07zesv12.js → 1lkcm-iwggfae.js} +1 -1
- package/web/.next/static/chunks/1ml6wx1ya9wwo.js +1 -0
- package/web/.next/static/chunks/22wtc73dzqm8f.js +1 -0
- package/web/.next/static/chunks/2drwxc7-hry0u.js +1 -0
- package/web/.next/static/chunks/{07j7jnfe13wx6.js → 2ich96rzec753.js} +1 -1
- package/web/.next/static/chunks/{3d5z1i-6yksxd.js → 2khjzepn4_2a-.js} +1 -1
- package/web/.next/static/chunks/{1uhmdmkn5gsk2.js → 2ui6n5-n032a3.js} +1 -1
- package/web/.next/static/chunks/2wvdu6-tx1h0l.js +1 -0
- package/web/.next/static/chunks/33qpc2y76i927.js +1 -0
- package/web/.next/static/chunks/3h8spyc73a438.js +1 -0
- package/web/.next/static/chunks/{2dgbb29jkr_tu.js → 3v8s571padqcz.js} +1 -1
- package/web/.next/static/chunks/3wg9zn3lyhf-b.js +1 -0
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/public/argo-wake-icon.svg +1 -0
- package/web/public/wake-worker.js +8 -2
- package/web/public/wake-worker.test.ts +52 -0
- package/web/.next/server/chunks/ssr/_0oekmfmigr0qv._.js +0 -3
- package/web/.next/server/chunks/ssr/_0oekmfmigr0qv._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0vid8-myyy-_4._.js +0 -3
- package/web/.next/server/chunks/ssr/_0y5eahpucp8g_._.js +0 -3
- package/web/.next/server/chunks/ssr/_0y5eahpucp8g_._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_13fbnlwrl24s3._.js +0 -3
- package/web/.next/server/chunks/ssr/_13fbnlwrl24s3._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_1airu8wwf7z1b._.js +0 -3
- package/web/.next/server/chunks/ssr/_1airu8wwf7z1b._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_1i5zdy3tp2ykh._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_1pp0z5srqqqyl._.js +0 -3
- package/web/.next/server/chunks/ssr/_1pp0z5srqqqyl._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_1xuikhitica6p._.js +0 -3
- package/web/.next/server/chunks/ssr/_1xuikhitica6p._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_0gpbs01t1c_a4._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_0gpbs01t1c_a4._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_0zgrzr0ui3gi8._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_0zgrzr0ui3gi8._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_174jf4d4t_bo_._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_174jf4d4t_bo_._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_1qxtjrbc2-6xd._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_1qxtjrbc2-6xd._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_common_dist_header_0t_cmi-llaq7g._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_common_dist_header_0t_cmi-llaq7g._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_common_dist_header_1x3s5abk_uj9j._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_common_dist_header_app-switcher_08qq5-uxv7jii.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_common_dist_header_app-switcher_08qq5-uxv7jii.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_common_dist_header_class-names_1h5pbm2ucssiq.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_common_dist_header_class-names_1h5pbm2ucssiq.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_025l9l6m2zkya._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_frame_0pe8cwpxe1egb._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_frame_0pe8cwpxe1egb._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_outside-parties_paths_ts_0vbj9elyqekpp._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_outside-parties_paths_ts_0vbj9elyqekpp._.js.map +0 -1
- package/web/.next/static/chunks/0ozz8jadgfdrx.js +0 -1
- package/web/.next/static/chunks/1v36iovy1f5cj.js +0 -1
- package/web/.next/static/chunks/1vhvy8bx4fxur.js +0 -1
- package/web/.next/static/chunks/1vhx_nu9nxo1v.js +0 -1
- package/web/.next/static/chunks/24vn5i6ojvl8l.js +0 -1
- package/web/.next/static/chunks/2l6hafvocw-rd.js +0 -1
- package/web/.next/static/chunks/2ld8_nap7g_uy.js +0 -1
- package/web/.next/static/chunks/2pvcbql986wln.js +0 -1
- package/web/.next/static/chunks/2s1efgj6gxjgl.js +0 -1
- package/web/.next/static/chunks/2zlx-c_0x38uo.css +0 -3
- package/web/.next/static/chunks/34u_331hqync_.js +0 -1
- package/web/.next/static/chunks/3_bb0g4jkqn8q.js +0 -1
- package/web/.next/static/chunks/3jq9vu8tr29j2.js +0 -1
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__1qtzvez4cn5be._.js.map → [root-of-the-server]__1ektgsnjg4btl._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__1j6n8jj7-5t6v._.js.map → [root-of-the-server]__1nfpyr3ynmwks._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{_1a9wrl8uw7x-y._.js.map → _13_ady-a4058y._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{_1iorutn_o9hja._.js.map → _1cc4ie_s4tycq._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{_0vid8-myyy-_4._.js.map → _1xgivp19ts9hn._.js.map} +0 -0
- /package/web/.next/static/{2O8_FQX7YN47L5_OxojXH → 79SqN0pBIJ0D-DK1jZmK6}/_buildManifest.js +0 -0
- /package/web/.next/static/{2O8_FQX7YN47L5_OxojXH → 79SqN0pBIJ0D-DK1jZmK6}/_clientMiddlewareManifest.js +0 -0
- /package/web/.next/static/{2O8_FQX7YN47L5_OxojXH → 79SqN0pBIJ0D-DK1jZmK6}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/bridge/state/decision-panel.tsx","../../../../../web/features/bridge/hooks/data%3A55e9d9%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__ [{\"400f35eac74c153e6bb2ce4504da9237c9f8088cf0\":{\"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(\"400f35eac74c153e6bb2ce4504da9237c9f8088cf0\",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(97024),d=a.i(73370),e=a.i(72131),f=a.i(5050);let g=(0,f.createServerReference)("
|
|
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)("609a5ac69aa505e32ba8526374707f2533926942f8",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%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":"wDAEA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OCH4M,EAAA,EAAA,CAAA,CAAA,MAAsG,IAAMA,EAAmC,CAAA,EAAA,EAAA,iBAAb,IAAa,AAAqB,EAAC,KAAxB,wCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,kBDMjc,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OEHA,EAAA,EAAA,CAAA,CAAA,OAEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAGA,SAAS,EAAgB,UAAE,CAAQ,UAAE,CAAQ,CAAmD,EAC9F,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,aAAa,aAAW,mBACnC,EAAS,OAAO,CAAC,GAAG,CAAC,AAAC,IACrB,IAAM,EAAa,EAAO,GAAG,GAAK,EAClC,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAoB,gBAAe,EAAY,UAAW,CAAC,6CAA6C,EAAE,EAAa,+BAAiC,sCAAA,CAAuC,WAC9L,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,cAAY,oBAAoB,cAAa,EAAY,cAAY,OAAO,UAAW,CAAC,iEAAiE,EAAE,EAAa,iBAAmB,gBAAA,CAAiB,UAC/M,EAAa,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mCAAsC,OAEtE,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,gCACd,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,wBACb,EAAO,GAAG,CAAC,KAAG,EAAO,KAAK,IAEV,KAAlB,EAAO,MAAM,CAAU,KAAO,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,4DAAoD,EAAO,MAAM,MAEjH,EAAO,GAAG,GAAK,EAAS,IAAI,CAAC,MAAM,CAAG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,+DAAsD,eAAoB,OAV1H,EAAO,GAAG,CAavB,IAGN,CAGA,SAAS,EAAY,CAAE,OAAK,CAAsD,EAChF,IAAM,EAAO,EAAM,IAAI,CAAG,EAAA,CAAW,CAAG,EAAA,CAAO,CAC/C,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,cAAY,oBAAoB,KAAK,SAAS,UAAW,CAAC,6CAA6C,EAAE,EAAM,IAAI,CAAG,sCAAwC,4CAAA,CAA6C,WAC9M,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAK,aAAW,CAAA,CAAA,EAAC,UAAW,CAAC,uBAAuB,EAAE,EAAM,IAAI,CAAG,kBAAoB,qBAAA,CAAsB,GAC9G,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,yBACd,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uBAAe,EAAM,IAAI,GACxC,KAAe,MAAT,IAAI,CAAiB,KAAO,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,8CAAsC,EAAM,IAAI,QAI3G,CAGA,SAAS,EAAQ,MAAE,CAAI,UAAE,CAAQ,CAAsD,EACrF,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,cAAY,sBAAsB,UAAU,mDAC7C,CAAA,EAAA,EAAA,CAAA,AAAS,EAAC,EAAM,GAAU,GAAG,CAAC,AAAC,GAC9B,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAmC,UAAU,0EAC5C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,8CAAsC,EAAK,EAAE,GAC7D,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,cAAY,OAAO,UAAW,CAAC,sBAAsB,EAAE,EAAK,KAAK,CAAG,gBAAkB,YAAA,CAAa,GACtG,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,WACE,EAAK,IAAI,MACO,IAAhB,EAAK,MAAM,CAAiB,KAAO,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,kCAAwB,MAAI,EAAK,MAAM,SALtF,CAAA,EAAG,EAAK,EAAE,CAAC,CAAC,EAAE,EAAK,IAAI,CAAA,CAAE,IAW1C,CAUO,SAAS,EAAS,MAAE,CAAI,UAAE,CAAQ,YAAE,CAAU,QAAE,CAAM,CAA8F,EACzJ,IAAM,EAAW,CAAA,EAAA,EAAA,CAAA,AAAU,EAAC,GACtB,EAAO,CAAA,EAAA,EAAA,CAAM,AAAN,EAAO,EAAM,GACpB,EAAQ,CAAA,EAAA,EAAA,CAAA,AAAO,EAAC,EAAM,GACtB,EAAS,CAAE,IAAK,EAAK,GAAG,CAAE,QAAS,EAAK,OAAO,CAAE,QAAQ,CAAM,EACrE,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,cAAY,mBAAmB,UAAU,yEAChD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAS,CAAA,CAAC,OAAQ,EAAQ,MAAO,CAAA,EAAA,EAAA,CAAA,AAAY,EAAC,GAAO,UAAW,GAAO,OAAQ,IAChF,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAW,CAAA,CAAC,SAAU,EAAM,OAAQ,EAAQ,SAAU,IACvD,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,sCAA8B,GAAU,OAAS,EAAK,KAAK,GACxE,AAAS,WACR,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAS,CAAA,CAAC,KAAM,EAAM,SAAS,EAAO,UAAU,CAAA,CAAA,SAClC,IAAb,EACF,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAQ,CAAA,CAAC,KAAM,CAAA,EAAA,EAAA,CAAA,AAAM,EAAC,KAEvB,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAW,EAAA,CAAK,UACnB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAQ,CAAA,CAAC,KAAM,EAAS,OAAO,KAElC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAgB,SAAU,EAAU,SAAU,EAAK,OAAO,EAAE,QAAU,eAGhE,IAAV,EAAsB,KAAO,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,MAAO,IAClD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAQ,KAAM,EAAM,SAAU,MAGrC,CF3FA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAKA,SAAS,IACP,MAAO,SAAM,CACf,CAQA,SAAS,EAAS,CAAgB,EAChC,OAAO,EAAK,OAAO,EAAE,IAAM,EAAK,MAAM,AACxC,CAkBA,SAAS,EAAY,MAAE,CAAI,CAAwB,EACjD,IAAM,EAAU,CAAA,EAAA,EAAA,CAAA,AAAa,EAAC,GACxB,EAAO,EAAQ,IAAI,CAAG,EAAA,CAAW,CAAG,EAAA,CAAO,CACjD,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,cAAY,sBAAsB,UAAU,kDAChD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAK,cAAY,OAAO,UAAW,CAAC,yBAAyB,EAAE,EAAQ,IAAI,CAAG,kBAAoB,wBAAA,CAAyB,GAC3H,EAAQ,IAAI,GAGnB,oBASO,SAAS,AAAU,CAAE,SAAO,OAAE,CAAK,KAAE,CAAG,CAAuD,EACpG,IAAM,EAAS,IAAI,KAAK,GAClB,EA5CC,CAAA,EAAA,EAAA,IA4CU,gBA5CU,AAApB,EAAqB,EAAY,IAAM,KAAK,cAAc,GAAG,eAAe,GAAG,QAAQ,CAAE,IARzE,AAQ+E,OA6ChG,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,EAAQ,EAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,IAC9B,CAAC,EAAW,EAAgB,CAAG,CAAA,EAAA,EAAA,aAAA,AAAa,IAe5C,EAAO,EAAM,IAAI,CAAC,CAAC,YAAE,CAAU,CAAE,GAAK,IAAe,GAC3D,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAS,CAAA,CACR,KACE,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,aAAa,kBAAgB,gCAC9C,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,eAAoB,IAAT,EAAqB,GAAK,4BACxC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,GAAG,sBAAsB,UAAU,sCAA6B,SAGpE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,iCAAwB,qGAErB,IAAjB,EAAM,MAAM,CACX,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,cAAY,sBAAsB,UAAU,6EAAoE,yBAInH,CAvEZ,SAAe,AAAN,CAAkC,CAAE,CAAmC,EAC9E,IAAM,EAA+C,EAAE,CACvD,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAM,CAAA,EAAA,EAAA,CAAA,AAAK,EAAC,EAAS,GAAO,GAC5B,EAAO,EAAK,EAAE,CAAC,CAAC,GAClB,GAAM,MAAQ,EAChB,EAAK,CADgB,IACX,CAAC,IAAI,CAAC,GAEhB,EAAK,IAAI,CAAC,KAAE,EAAK,MAAO,CAAC,EAAK,AAAC,EAEnC,CACA,OAAO,EACT,EA2DkB,EAAO,CAAE,IAAK,WAAQ,CAAS,GAAG,GAAG,CAAC,CAAC,KAAE,CAAG,CAAE,MAAO,CAAK,CAAE,GAChE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAc,UAAU,yBACvB,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAW,CAAC,mCAAmC,OAAW,IAAT,EAAqB,GAAK,UAAA,CAAW,UAAG,IAC7F,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,mEACX,EAAM,GAAG,CAAC,AAAC,GACV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAO,CAAA,CAEN,KAAM,EACN,IAAK,EACL,OAAO,EACP,OAAQ,EAAK,UAAU,GAAK,EAC5B,aAAS,EACT,QAAS,OACT,KAAM,CAAE,GAAI,EAAS,GAAO,KAAM,CAAA,EAAA,EAAA,CAAA,AAAW,EAAC,EAAS,GAAO,EAAU,EACxE,OAAQ,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,KAAM,IAC3B,OAAQ,KAAQ,EAAU,EAAK,UAAU,CAAG,GATvC,EAAK,UAAU,OALlB,IAqBb,AAAY,WAAY,KAAO,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAM,CAAA,CAAC,QAAS,EAAS,SAAS,CAAA,CAAA,IACnD,OAAf,EAAsB,KACrB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,CAAA,CAAC,cAAY,cAAc,UAAU,qBAAqB,UAAW,EAAW,aAAa,aAAa,QAAS,KApDxI,OAAW,GACX,EAAgB,UACd,IAAM,EAAO,MAAM,EAAe,EAkDqH,GAjDnJ,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,EA2CsK,WAAG,kBAMvK,UAAe,IAAT,EAAqB,OAAY,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAS,KAAM,EAAM,SAAU,EAAU,WAAY,OAAO,QAAQ,CAAC,IAAI,CAAE,OAAQ,KAAQ,OAAU,EAAY,KAG/J"}
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/bridge/state/done-panel.tsx","../../../../../web/features/bridge/hooks/data%3A523036%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__ [{\"609a5ac69aa505e32ba8526374707f2533926942f8\":{\"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(\"609a5ac69aa505e32ba8526374707f2533926942f8\",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(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
|
|
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,argo:e}){let f,g,h,{waiting:i,stayAware:j}=a,k=new Date(c);return void 0!==d.opened?(0,b.jsx)(w,{home:a,readAt:k,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:i.count})]}),(0,b.jsx)("p",{className:"text-muted-foreground",children:0===i.count?"Nothing waits on you.":(g=(f=i.items.filter(({stale:a})=>null===a)).filter(({job:a})=>"decide"===a).length,h=f.filter(({job:a})=>"do"===a).length,`${String(g)} to decide, ${String(h)} to do. Newest on top; nothing else is in this count.`)})]}),(0,b.jsx)(r,{})]}),0===i.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:i.items,readAt:k,opening:d})]}),e,(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:[j.filter(({state:a})=>"new"===a).length," unseen, outside the count"]})]}),0===j.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:j,readAt:k,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,argo:f}){let g=(0,m.useLastReadAt)();return void 0!==g?(0,b.jsx)(y,{items:c.waiting.items,lastReadAt:g}):(0,b.jsx)(l.f,{fleetId:a,decidePlaces:e,children:a=>(0,b.jsx)(x,{home:c,now:d,opening:a,argo:f})})},"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","../../../../../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
|
+
{"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';\nimport type { ReactNode } from '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, argo }: { home: BridgeHome; now: string; opening: ItemOpening; argo?: ReactNode }) {\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 {argo}\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, and argo's section below what waits on the person, for an account allowed as argo; as last read, what waited then. */\nexport function HomePanel({ fleetId, home, now, decidePlaces, argo }: { fleetId: string; home: BridgeHome; now: string; decidePlaces?: readonly RoutedPlace[]; argo?: ReactNode }) {\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} argo={argo} />}\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=[51636,a=>{let b=[{kind:"none",label:"No credential"},{kind:"bearer",label:"Bearer token"},{kind:"clientCredentials",label:"OAuth client credentials"}],c={kind:"personSignIn",label:"Each person signs in"},d=[...b,c];a.s(["a",0,d,"x",0,b,"m",0,c,"G",0,function(a){return d.find(({kind:b})=>b===a)?.kind??"bearer"},"C",0,function(a){return b.find(({kind:b})=>b===a)?.kind??"bearer"}])},35149,a=>{var b=a.i(87924),c=a.i(88412);a.s(["f",0,function({choices:a,current:d,help:e,refusal:f}){let g=null===d||a.some(a=>a.shipId===d.shipId)?a:[d,...a];return(0,b.jsxs)("label",{className:c.z,children:[(0,b.jsx)("span",{children:"Owner"}),(0,b.jsxs)("select",{className:c.w,name:"ownerShipId",defaultValue:d?.shipId??"",required:!0,"data-testid":"owner-field",children:[null===d?(0,b.jsx)("option",{value:"",disabled:!0,children:"Pick its owner"}):null,g.map(a=>(0,b.jsx)("option",{value:a.shipId,children:a.name},a.shipId))]}),(0,b.jsx)("span",{className:"text-muted-foreground",children:f??e})]})}])}
|
|
1
|
+
(()=>{"use strict";module.exports=[51636,a=>{let b=[{kind:"none",label:"No credential"},{kind:"bearer",label:"Bearer token"},{kind:"clientCredentials",label:"OAuth client credentials"}],c={kind:"personSignIn",label:"Each person signs in"},d=[...b,c];a.s(["a",0,d,"x",0,b,"m",0,c,"G",0,function(a){return d.find(({kind:b})=>b===a)?.kind??"bearer"},"C",0,function(a){return b.find(({kind:b})=>b===a)?.kind??"bearer"}])},35149,a=>{var b=a.i(87924),c=a.i(88412);a.s(["f",0,function({choices:a,current:d,help:e,refusal:f}){let g=null===d||a.some(a=>a.shipId===d.shipId)?a:[d,...a];return(0,b.jsxs)("label",{className:c.z,children:[(0,b.jsx)("span",{children:"Owner"}),(0,b.jsxs)("select",{className:c.w,name:"ownerShipId",defaultValue:d?.shipId??"",required:!0,"data-testid":"owner-field",children:[null===d?(0,b.jsx)("option",{value:"",disabled:!0,children:"Pick its owner"}):null,g.map(a=>(0,b.jsx)("option",{value:a.shipId,children:a.name},a.shipId))]}),(0,b.jsx)("span",{className:"text-muted-foreground",children:f??e})]})}])}]})();
|
|
2
2
|
|
|
3
|
-
//# sourceMappingURL=
|
|
3
|
+
//# sourceMappingURL=web_features_forms_1u0akr22eh_x_._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/forms/server-credential.ts","../../../../../web/features/forms/ui/owner-field.tsx"],"sourcesContent":["/**\n * An outside MCP server's credential, as the add, Parties and decision forms\n * take it: none for a server reached only on a private network, a static\n * bearer, or OAuth client credentials. A server being added may instead\n * have each person sign in to it for themselves (decision 0067).\n */\n\n/** The credential kinds a form offers, with the words it shows. */\nexport const CREDENTIAL_KINDS = [\n { kind: 'none', label: 'No credential' },\n { kind: 'bearer', label: 'Bearer token' },\n { kind: 'clientCredentials', label: 'OAuth client credentials' },\n] as const;\n\nexport type CredentialKind = (typeof CREDENTIAL_KINDS)[number]['kind'];\n\nexport type ServerCredential =\n | { kind: 'none' }\n | { kind: 'bearer'; token: string }\n | { kind: 'clientCredentials'; clientId: string; clientSecret: string; issuer: string; scope?: string };\n\n/** The kind only adding a server offers: the gateway registers the party's client, and each person signs in (decision 0067). */\nexport const SIGN_IN_CREDENTIAL = { kind: 'personSignIn', label: 'Each person signs in' } as const;\n\n/** The credential kinds the add page offers, with the words it shows. */\nexport const ADDED_CREDENTIAL_KINDS = [...CREDENTIAL_KINDS, SIGN_IN_CREDENTIAL] as const;\n\nexport type AddedCredentialKind = (typeof ADDED_CREDENTIAL_KINDS)[number]['kind'];\n\nexport type AddedServerCredential = ServerCredential | { kind: typeof SIGN_IN_CREDENTIAL.kind };\n\n/** The kind a form sent, a bearer when it sent none it knows. */\nexport function credentialKindOf(sent: string): CredentialKind {\n return CREDENTIAL_KINDS.find(({ kind }) => kind === sent)?.kind ?? 'bearer';\n}\n\n/** The credential the fields name: only the fields of its kind are read. */\nexport function serverCredentialOf(fields: { credentialKind: string; token: string; clientId: string; clientSecret: string; issuer: string; scope: string }): ServerCredential {\n const kind = credentialKindOf(fields.credentialKind);\n switch (kind) {\n case 'none':\n return { kind };\n case 'bearer':\n return { kind, token: fields.token };\n case 'clientCredentials':\n return { kind, clientId: fields.clientId, clientSecret: fields.clientSecret, issuer: fields.issuer, ...(fields.scope === '' ? {} : { scope: fields.scope }) };\n }\n}\n\n/** The kind the add page sent, a bearer when it sent none it knows. */\nexport function addedCredentialKindOf(sent: string): AddedCredentialKind {\n return ADDED_CREDENTIAL_KINDS.find(({ kind }) => kind === sent)?.kind ?? 'bearer';\n}\n\n/** The credential the add page's fields name: each person signing in takes no field. */\nexport function addedServerCredentialOf(fields: Parameters<typeof serverCredentialOf>[0]): AddedServerCredential {\n return addedCredentialKindOf(fields.credentialKind) === SIGN_IN_CREDENTIAL.kind ? { kind: SIGN_IN_CREDENTIAL.kind } : serverCredentialOf(fields);\n}\n","import { INPUT, LABEL } from './look';\n\n/** A ship a party's owner may be picked from, by its name. */\nexport interface OwnerChoice {\n shipId: string;\n name: string;\n}\n\n/** The owner choices as a page read them, or why they could not be read. */\nexport type OwnerChoices = { isOk: true; value: OwnerChoice[] } | { isOk: false; refusal: string };\n\n/**\n * The owner of a party, picked by name from the ships the fleet takes as an\n * owner. The owner it has now stays a choice, though the fleet no longer\n * lists it, so saving leaves it as it is. Where the choices could not be\n * read, it says why, with nothing to pick.\n */\nexport function OwnerField({ choices, current, help, refusal }: { choices: readonly OwnerChoice[]; current: OwnerChoice | null; help: string; refusal?: string | undefined }) {\n const shown = current === null || choices.some((choice) => choice.shipId === current.shipId) ? choices : [current, ...choices];\n return (\n <label className={LABEL}>\n <span>Owner</span>\n <select className={INPUT} name=\"ownerShipId\" defaultValue={current?.shipId ?? ''} required data-testid=\"owner-field\">\n {current === null ? (\n <option value=\"\" disabled>\n Pick its owner\n </option>\n ) : null}\n {shown.map((choice) => (\n <option key={choice.shipId} value={choice.shipId}>\n {choice.name}\n </option>\n ))}\n </select>\n <span className=\"text-muted-foreground\">{refusal ?? help}</span>\n </label>\n );\n}\n"],"names":["CREDENTIAL_KINDS","kind","label","SIGN_IN_CREDENTIAL","ADDED_CREDENTIAL_KINDS","credentialKindOf","sent","find","serverCredentialOf","fields","credentialKind","token","clientId","clientSecret","issuer","scope","addedCredentialKindOf","addedServerCredentialOf","OwnerField","choices","current","help","refusal","shown","some","choice","shipId","className","name","defaultValue","required","value","disabled","map"],"mappings":"6CAQO,IAAMA,EAAmB,CAC9B,CAAEC,KAAM,OAAQC,MAAO,eAAgB,EACvC,CAAED,KAAM,SAAUC,MAAO,cAAe,EACxC,CAAED,KAAM,oBAAqBC,MAAO,0BAA2B,EAChE,CAUYC,EAAqB,CAAEF,KAAM,eAAgBC,MAAO,sBAAuB,EAG3EE,EAAyB,IAAIJ,EAAkBG,EAAmB,oCAyBxE,SAASa,AAAsBV,CAAY,EAChD,OAAOF,EAAuBG,IAAI,CAAC,CAAC,MAAEN,CAAI,CAAE,GAAKA,IAASK,IAAOL,MAAQ,QAC3E,QApBO,SAASI,AAAiBC,CAAY,EAC3C,OAAON,EAAiBO,IAAI,CAAC,CAAC,MAAEN,CAAI,CAAE,GAAKA,IAASK,IAAOL,MAAQ,QACrE,gCClCA,EAAA,EAAA,CAAA,CAAA,kBAiBO,SAASiB,AAAW,SAAEC,CAAO,SAAEC,CAAO,MAAEC,CAAI,SAAEC,CAAO,CAAgH,EAC1K,IAAMC,EAAoB,OAAZH,GAAoBD,EAAQK,IAAI,CAAC,AAACC,GAAWA,EAAOC,MAAM,GAAKN,EAAQM,MAAM,EAAIP,EAAU,CAACC,KAAYD,EAAQ,CAC9H,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAMQ,UAAW,EAAA,CAAK,WACrB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,UACN,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAOA,UAAW,EAAA,CAAK,CAAEC,KAAK,cAAcC,aAAcT,GAASM,QAAU,GAAII,QAAQ,CAAA,CAAA,EAAC,cAAY,wBACxF,OAAZV,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAOW,MAAM,GAAGC,QAAQ,CAAA,CAAA,WAAC,mBAGxB,KACHT,EAAMU,GAAG,CAAC,AAACR,GACV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAA2BM,MAAON,EAAOC,MAAM,UAC7CD,EAAOG,IAAI,EADDH,EAAOC,MAAM,MAK9B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKC,UAAU,iCAAyBL,GAAWD,MAG1D"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
(()=>{"use strict";module.exports=[16421,38735,a=>{var b=a.i(717),c=a.i(66283);let d=(0,b.cache)(async()=>{try{return await (await (0,c.z)(void 0)).account.apps.query()}catch(a){if(void 0!==(0,c.U)(a))return;throw a}});a.s(["f",0,d],16421);var e=a.i(75416),f=a.i(49310),g=a.i(26972),h=a.i(54757),h=h,i=a.i(27221),j=a.i(1081),k=a.i(83931),l=a.i(29517);let m=f.z.enum(["console","gateway","account","admin"]),n=g.z.object({app:m,url:h.httpUrl()});g.z.object({account:g.z.object({id:e.s,email:i.z.string()}),apps:j.z.array(n),fleets:j.z.array(g.z.object({id:(0,l.f)("fleet"),name:i.z.string(),argo:k.z.boolean(),apps:j.z.array(n)}))});let o={console:"Console",gateway:"Gateway",account:"Account",admin:"Admin"};function p(a,b){let c=new URL(a);return c.searchParams.set("fleet",b),c.toString()}let q=(0,l.f)("fleet");function r(a){return a.flatMap(({app:a,url:b})=>{let c=m.safeParse(a);return c.success?[{app:c.data,url:b}]:[]})}a.s(["f",0,function(a){let b=e.s.safeParse(a.account.id),c=a.fleets.map(a=>q.safeParse(a.id));if(!b.success||c.some(a=>!a.success))return[];let d={account:{id:b.data,email:a.account.email},apps:r(a.apps),fleets:a.fleets.flatMap((a,b)=>{let d=c[b];return d?.success===!0?[{id:d.data,name:a.name,argo:!1,apps:r(a.apps)}]:[]})};return d.fleets.map(({id:a,name:b})=>(function(a){let{list:b,fleet:c,app:d}=a,e=o[d];if(void 0===b)return{fleet:c,appLabel:e,fleets:[{...c,url:"",isCurrent:!0}],apps:[{app:d,label:e,url:"",isCurrent:!0}],canSwitch:!1};let f=b.apps.find(a=>"account"===a.app)?.url,g=b.fleets.flatMap(a=>{let b=a.apps.find(a=>a.app===d)??a.apps[0],e=void 0===b?f:p(b.url,a.id);return void 0===e?[]:[{id:a.id,name:a.name,url:e,isCurrent:a.id===c.id}]}),h=[...(b.fleets.find(a=>a.id===c.id)?.apps??[]).map(a=>({...a,url:p(a.url,c.id)})),...b.apps].map(a=>({app:a.app,label:o[a.app],url:a.url,isCurrent:a.app===d}));return{fleet:c,appLabel:e,fleets:g,apps:h,canSwitch:g.length>1||h.length>1}})({list:d,fleet:{id:a,name:b},app:"gateway"}))}],38735)},69979,a=>{var b=a.i(7997);a.s(["f",0,function({header:a,children:c}){return(0,b.jsxs)("div",{className:"flex min-h-dvh flex-col",children:[(0,b.jsx)("div",{"data-testid":"frame-header",className:"contents",children:a}),(0,b.jsx)("main",{className:"mx-auto w-full max-w-5xl flex-1 px-4 py-6",children:c})]})}])},7421,a=>{var b=a.i(7997);a.s(["f",0,function(){return(0,b.jsx)("header",{"data-testid":"plain-header",className:"flex h-14 items-center border-b border-border px-4",children:(0,b.jsx)("a",{href:"/bridge",className:"text-section font-semibold",children:"Aeolus"})})}])}]})();
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=web_features_frame_01uyck6q56an2._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/frame/services/header-switchers.ts","../../../../../web/features/frame/hooks/read-header.ts","../../../../../node_modules/%40aeolus-fleet/common/src/schemas/apps-list.ts","../../../../../node_modules/%40aeolus-fleet/common/src/rules/app-switcher.ts","../../../../../web/features/frame/ui/frame.tsx","../../../../../web/features/frame/ui/plain-header.tsx"],"sourcesContent":["/*\n * The switcher in the title of the header the gateway's pages show\n * (aeolus-fleet, header design H1, H9), from the apps and fleets the account\n * may open as the gateway's API answers them. The fleet in view is the one\n * the page's address names; a layout cannot read the address, so the server\n * offers one switcher per listed fleet and the header picks by the address.\n */\nimport { accountIdSchema, headerAppSchema, idSchema, type AppLink, type AppsList } from '@aeolus-fleet/common';\nimport { appSwitcherOf, type AppSwitcherModel } from '@aeolus-fleet/common/rules';\n\n/** The apps and fleets the account may open, as the API's account.apps answers them. */\nexport interface AccountApps {\n account: { id: string; email: string };\n apps: readonly { app: string; url: string }[];\n fleets: readonly { id: string; name: string; apps: readonly { app: string; url: string }[] }[];\n}\n\nconst fleetIdSchema = idSchema('fleet');\n\n/** The apps the header knows (H12), the others left out; the addresses as the API answers them. */\nfunction headerAppsOf(apps: AccountApps['apps']): AppLink[] {\n return apps.flatMap(({ app, url }) => {\n const known = headerAppSchema.safeParse(app);\n return known.success ? [{ app: known.data, url }] : [];\n });\n}\n\n/** The switchers for the gateway, one per listed fleet with it in view; none for an answer with a malformed id. */\nexport function headerSwitchersOf(answer: AccountApps): AppSwitcherModel[] {\n const accountId = accountIdSchema.safeParse(answer.account.id);\n const fleetIds = answer.fleets.map((fleet) => fleetIdSchema.safeParse(fleet.id));\n if (!accountId.success || fleetIds.some((fleetId) => !fleetId.success)) {\n return [];\n }\n const list: AppsList = {\n account: { id: accountId.data, email: answer.account.email },\n apps: headerAppsOf(answer.apps),\n // Whether the account may sign in as argo is the console's alone: the gateway's header never shows it.\n fleets: answer.fleets.flatMap((fleet, index) => {\n const fleetId = fleetIds[index];\n return fleetId?.success === true ? [{ id: fleetId.data, name: fleet.name, argo: false, apps: headerAppsOf(fleet.apps) }] : [];\n }),\n };\n return list.fleets.map(({ id, name }) => appSwitcherOf({ list, fleet: { id, name }, app: 'gateway' }));\n}\n","/**\n * What the header shows, read through the gateway's API by the browser's\n * shared sign-in (header design H1): the account and the apps and fleets it\n * may open. A browser signed in to no account, a gateway that signs no one\n * in to its pages, or pagasae not answering, shows the plain bar: the page\n * itself says what to do.\n */\nimport { cache } from 'react';\n\nimport { refusalCodeOf, requestApi } from '../../../lib/gateway-api/page-api';\nimport type { AccountApps } from '../services/header-switchers';\n\n/** Read once per page: the header and a page that needs a fleet's app, such as Stay aware's console, share the read. */\nexport const readHeader = cache(async (): Promise<AccountApps | undefined> => {\n try {\n return await (await requestApi(undefined)).account.apps.query();\n } catch (error) {\n if (refusalCodeOf(error) !== undefined) {\n return undefined;\n }\n throw error;\n }\n});\n","unable to read source [project]/node_modules/@aeolus-fleet/common/src/schemas/apps-list.ts","unable to read source [project]/node_modules/@aeolus-fleet/common/src/rules/app-switcher.ts","import type { ReactNode } from 'react';\n\n/**\n * Every page of the gateway's web app: the header on top, the page below.\n * The header is the one every Aeolus app shows (@aeolus-fleet/ui,\n * header design H2) for an account signed in, else a plain bar.\n */\nexport function Frame({ header, children }: { header: ReactNode; children: ReactNode }) {\n return (\n <div className=\"flex min-h-dvh flex-col\">\n <div data-testid=\"frame-header\" className=\"contents\">\n {header}\n </div>\n <main className=\"mx-auto w-full max-w-5xl flex-1 px-4 py-6\">{children}</main>\n </div>\n );\n}\n","/** The bar of a page shown to no account signed in: the sign-in pages, and a gateway that signs no one in to its pages. */\nexport function PlainHeader() {\n return (\n <header data-testid=\"plain-header\" className=\"flex h-14 items-center border-b border-border px-4\">\n <a href=\"/bridge\" className=\"text-section font-semibold\">\n Aeolus\n </a>\n </header>\n );\n}\n"],"names":["readHeader","undefined","account","apps","query","error","Frame","header","children","className","PlainHeader","href"],"mappings":"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","ignoreList":[2,3]}
|
package/web/.next/server/chunks/ssr/web_features_frame_ui_gateway-header_tsx_0e9tekx4jf7ng._.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[45648,a=>{"use strict";var b=a.i(87924),c=a.i(33540),d=a.i(
|
|
1
|
+
module.exports=[45648,a=>{"use strict";var b=a.i(87924),c=a.i(33540),d=a.i(28086),e=a.i(40628),f=a.i(1287),g=a.i(83230),h=a.i(69454);function i({switcher:a,account:j,onSearch:k,searchLabel:l="Search or jump to",children:m,actions:n,className:o}){return(0,b.jsxs)("header",{"data-slot":"app-header",className:(0,h.f)("sticky top-0 z-30 flex h-(--size-header) shrink-0 items-center justify-between gap-4 border-b border-border bg-background px-6",o),children:[(0,b.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[void 0===a?(0,b.jsx)("span",{"data-testid":"app-switcher-loading","aria-hidden":!0,className:"h-4 w-36 shrink-0 animate-pulse rounded bg-muted motion-reduce:animate-none"}):(0,b.jsx)(d.AppSwitcher,{switcher:a,layout:"full",className:"shrink-0"}),m]}),(0,b.jsxs)("div",{className:"flex shrink-0 items-center gap-3",children:[n,k?(0,b.jsxs)(e.f,{size:"sm",icon:(0,b.jsx)(c.f,{"aria-hidden":!0}),"data-testid":"header-search",className:"w-60 justify-start font-normal text-muted-foreground max-lg:w-auto",onClick:k,children:[(0,b.jsx)("span",{className:"grow text-left max-lg:sr-only",children:l}),(0,b.jsx)(f.f,{children:"⌘K"})]}):null,(0,b.jsx)(g.AvatarMenu,{...j})]})]})}var j=a.i(50944),k=a.i(919),l=a.i(25959);let m=[{key:"bridge",label:"Bridge",path:"/bridge"},{key:"outside-parties",label:"Outside parties",path:"/outside-parties"},{key:"parties",label:"Parties",path:"/parties"},{key:"slack",label:"Slack",path:"/slack"}];function n({fleetId:a}){let c=(0,j.usePathname)();return(0,b.jsx)("nav",{"aria-label":"Gateway",className:"flex min-w-0 items-center gap-1 overflow-x-auto",children:m.map(({key:d,label:e,path:f})=>{let g=c===f||c.startsWith(`${f}/`);return(0,b.jsx)("a",{href:(0,l.f)(f,a),"data-testid":`frame-tab-${d}`,"aria-current":g?"page":void 0,className:`whitespace-nowrap rounded-md px-2 py-1 text-sm ${g?"bg-accent font-semibold":"text-muted-foreground hover:bg-accent"}`,children:e},d)})})}a.s(["GatewayHeader",0,function({switchers:a,email:c,accountUrl:e,theme:f}){let h=(0,j.useSearchParams)().get("fleet"),l=a.find(({fleet:a})=>a.id===h)??a[0],{account:m,signOutForm:o}=(0,k.f)({email:c,accountUrl:e,theme:f});return(0,b.jsxs)(b.Fragment,{children:[o,(0,b.jsx)(i,{switcher:l,account:m,className:"max-sm:hidden",children:void 0===l?null:(0,b.jsx)(n,{fleetId:l.fleet.id})}),(0,b.jsxs)("header",{className:"sticky top-0 z-30 flex h-14 shrink-0 items-center gap-3 border-b border-border bg-background px-4 sm:hidden",children:[void 0===l?null:(0,b.jsx)(d.AppSwitcher,{switcher:l,layout:"compact",className:"min-w-0"}),void 0===l?null:(0,b.jsx)(n,{fleetId:l.fleet.id}),(0,b.jsx)("span",{className:"grow"}),(0,b.jsx)(g.AvatarMenuSheet,{...m})]})]})}],45648)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=web_features_frame_ui_gateway-header_tsx_0e9tekx4jf7ng._.js.map
|
package/web/.next/server/chunks/ssr/web_features_frame_ui_gateway-header_tsx_0e9tekx4jf7ng._.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../web/features/frame/ui/gateway-tabs.tsx","../../../../../web/features/frame/ui/gateway-header.tsx","../../../../../node_modules/%40aeolus-fleet/
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/frame/ui/gateway-tabs.tsx","../../../../../web/features/frame/ui/gateway-header.tsx","../../../../../node_modules/%40aeolus-fleet/ui/src/organisms/app-header.tsx"],"sourcesContent":["'use client';\n\nimport { usePathname } from 'next/navigation';\n\nimport { inFleet } from '../../../lib/gateway-api/page-account';\n\n/** The gateway's pages a person goes between. */\nconst TABS = [\n { key: 'bridge', label: 'Bridge', path: '/bridge' },\n { key: 'outside-parties', label: 'Outside parties', path: '/outside-parties' },\n { key: 'parties', label: 'Parties', path: '/parties' },\n { key: 'slack', label: 'Slack', path: '/slack' },\n] as const;\n\n/** Whether the page at this path is the tab's page or one of its own. */\nfunction isTabOf(pathname: string, path: string): boolean {\n return pathname === path || pathname.startsWith(`${path}/`);\n}\n\n/** The header's tabs: Bridge, the outside parties, the parties and Slack of the fleet in view, the page shown current; on a phone they scroll within the bar rather than widen the page. */\nexport function GatewayTabs({ fleetId }: { fleetId: string }) {\n const pathname = usePathname();\n return (\n <nav aria-label=\"Gateway\" className=\"flex min-w-0 items-center gap-1 overflow-x-auto\">\n {TABS.map(({ key, label, path }) => {\n const isCurrent = isTabOf(pathname, path);\n return (\n <a\n key={key}\n href={inFleet(path, fleetId)}\n data-testid={`frame-tab-${key}`}\n aria-current={isCurrent ? 'page' : undefined}\n className={`whitespace-nowrap rounded-md px-2 py-1 text-sm ${isCurrent ? 'bg-accent font-semibold' : 'text-muted-foreground hover:bg-accent'}`}\n >\n {label}\n </a>\n );\n })}\n </nav>\n );\n}\n","'use client';\n\nimport type { Theme } from '@aeolus-fleet/common';\nimport type { AppSwitcherModel } from '@aeolus-fleet/common/rules';\nimport { AppHeader, AppSwitcher, AvatarMenuSheet } from '@aeolus-fleet/ui';\nimport { useSearchParams } from 'next/navigation';\n\nimport { useAccountMenu } from '../hooks/use-account-menu';\nimport { GatewayTabs } from './gateway-tabs';\n\ninterface GatewayHeaderProps {\n /** One per fleet the account may open, with it in view; the address picks one. */\n switchers: readonly AppSwitcherModel[];\n email: string;\n /** Account's address, for the avatar menu's Your account, Your rights and Email updates. */\n accountUrl: string | undefined;\n theme: Theme;\n}\n\n/**\n * The header every Aeolus app shows (aeolus-fleet, header design), on the\n * gateway's pages: from 640 px the shared AppHeader, with the switcher in\n * the title and the avatar menu; on phone a bar with the switcher compact\n * and the avatar's bottom Sheet (H6). After the title, the tabs to the\n * Bridge, the outside parties and the parties. The fleet in view is the one the\n * address names, else the account's first. Sign out ends the shared\n * sign-in in every app and shows \"Signing out\" until the page leaves.\n */\nexport function GatewayHeader({ switchers, email, accountUrl, theme }: GatewayHeaderProps) {\n const requested = useSearchParams().get('fleet');\n const switcher = switchers.find(({ fleet }) => fleet.id === requested) ?? switchers[0];\n const { account, signOutForm } = useAccountMenu({ email, accountUrl, theme });\n return (\n <>\n {signOutForm}\n <AppHeader switcher={switcher} account={account} className=\"max-sm:hidden\">\n {switcher === undefined ? null : <GatewayTabs fleetId={switcher.fleet.id} />}\n </AppHeader>\n <header className=\"sticky top-0 z-30 flex h-14 shrink-0 items-center gap-3 border-b border-border bg-background px-4 sm:hidden\">\n {switcher === undefined ? null : <AppSwitcher switcher={switcher} layout=\"compact\" className=\"min-w-0\" />}\n {switcher === undefined ? null : <GatewayTabs fleetId={switcher.fleet.id} />}\n <span className=\"grow\" />\n <AvatarMenuSheet {...account} />\n </header>\n </>\n );\n}\n","unable to read source [project]/node_modules/@aeolus-fleet/ui/src/organisms/app-header.tsx"],"names":["className","children","actions","onSearch"],"mappings":"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","ignoreList":[2]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[3045,a=>{"use strict";var b=a.i(87924),c=a.i(50944),d=a.i(72131),e=a.i(32043),f=a.i(10039),g=a.i(5050);let h=(0,g.createServerReference)("
|
|
1
|
+
module.exports=[3045,a=>{"use strict";var b=a.i(87924),c=a.i(50944),d=a.i(72131),e=a.i(32043),f=a.i(10039),g=a.i(5050);let h=(0,g.createServerReference)("40f54ede5f834c93e1fb08c20214e0690984d82514",g.callServer,void 0,g.findSourceMapURL,"changeMic"),i=(0,g.createServerReference)("4073d4e476b850dd74bd8512a25ce56e16e93cf31a",g.callServer,void 0,g.findSourceMapURL,"contribute"),j={request:{label:"Request the mic",pending:"Requesting..."},withdraw:{label:"Withdraw my request",pending:"Withdrawing..."},release:{label:"Release the mic",pending:"Releasing..."}};a.s(["MeetingControls",0,function({fleetId:a,meetingId:g,controls:k}){let l=(0,c.useRouter)(),[m,n]=(0,d.useState)(""),[o,p]=(0,d.useState)(()=>crypto.randomUUID()),[q,r]=(0,d.useState)(),[s,t]=(0,d.useState)(),[,u]=(0,d.useTransition)(),v=({control:a,action:b,onDone:c})=>{r(a),t(void 0),u(async()=>{let a=await b();r(void 0),a.isOk?(c?.(),l.refresh()):t(a.message)})},w=void 0!==q,x=k.filter(a=>"contribute"!==a);return(0,b.jsxs)("div",{className:"grid gap-3",children:[k.includes("contribute")?(0,b.jsxs)("div",{className:"grid gap-2",children:[(0,b.jsxs)("label",{className:"grid gap-1",children:[(0,b.jsx)("span",{children:"Your contribution"}),(0,b.jsx)("textarea",{"data-testid":"meeting-text",rows:4,value:m,onChange:a=>{n(a.target.value)},className:"rounded-md border border-input bg-background p-2"})]}),(0,b.jsx)(e.i,{"data-testid":"meeting-contribute",variant:"primary",className:"justify-self-start",isPending:"contribute"===q,pendingLabel:"Sending...",disabled:w,onClick:()=>{v({control:"contribute",action:()=>i({fleet:a,meetingId:g,text:m,idempotencyKey:o}),onDone:()=>{n(""),p(crypto.randomUUID())}})},children:"Contribute"})]}):null,0===x.length?null:(0,b.jsx)("div",{className:"flex flex-wrap gap-2",children:x.map(c=>(0,b.jsx)(e.i,{"data-testid":`meeting-${c}`,variant:"request"===c?"primary":"secondary",isPending:q===c,pendingLabel:j[c].pending,disabled:w,onClick:()=>{v({control:c,action:()=>h({fleet:a,meetingId:g,change:c})})},children:j[c].label},c))}),void 0===s?null:(0,b.jsx)(f.f,{message:s,isFailure:!0})]})}],3045)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=web_features_meeting_state_meeting-controls_tsx_12g4kzk2mbvvz._.js.map
|