@aeolus-fleet/gateway 0.35.0 → 0.36.1
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 +12 -9
- package/dist/adapters/fleet/core-version.d.ts +1 -1
- package/dist/adapters/fleet/core-version.js +1 -1
- package/dist/adapters/fleet/rest-fleet-door.js +51 -7
- package/dist/adapters/fleet/rest-fleet-door.js.map +1 -1
- package/dist/adapters/http/front-door.d.ts +1 -1
- package/dist/adapters/http/front-door.js +5 -3
- package/dist/adapters/http/front-door.js.map +1 -1
- package/dist/adapters/http/person-tools.js +27 -9
- package/dist/adapters/http/person-tools.js.map +1 -1
- package/dist/adapters/http/slack-routes.d.ts +2 -0
- package/dist/adapters/http/slack-routes.js +11 -10
- package/dist/adapters/http/slack-routes.js.map +1 -1
- package/dist/adapters/pagasae/email-channel.d.ts +1 -2
- package/dist/adapters/pagasae/email-channel.js +3 -3
- package/dist/adapters/pagasae/email-channel.js.map +1 -1
- package/dist/adapters/prisma/basket-entries.d.ts +4 -0
- package/dist/adapters/prisma/basket-entries.js +53 -0
- package/dist/adapters/prisma/basket-entries.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 +15 -4
- package/dist/adapters/prisma/generated/client.d.ts +15 -4
- package/dist/adapters/prisma/generated/internal/class.d.ts +26 -4
- 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 +228 -43
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js +42 -9
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +42 -7
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +42 -9
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
- package/dist/adapters/prisma/generated/models/BasketEntry.d.ts +1303 -0
- package/dist/adapters/prisma/generated/models/BasketEntry.js +2 -0
- package/dist/adapters/prisma/generated/models/BasketEntry.js.map +1 -0
- package/dist/adapters/prisma/generated/models/ItemOutcome.d.ts +1106 -0
- package/dist/adapters/prisma/generated/models/ItemOutcome.js +2 -0
- package/dist/adapters/prisma/generated/models/ItemOutcome.js.map +1 -0
- package/dist/adapters/prisma/generated/models/OpenedDelivery.d.ts +125 -1
- package/dist/adapters/prisma/generated/models/PartySignInNotice.d.ts +32 -1
- package/dist/adapters/prisma/generated/models/Route.d.ts +1038 -0
- package/dist/adapters/prisma/generated/models/Route.js +2 -0
- package/dist/adapters/prisma/generated/models/Route.js.map +1 -0
- package/dist/adapters/prisma/generated/models/SlackLink.d.ts +1 -32
- package/dist/adapters/prisma/generated/models/SlackPost.d.ts +33 -58
- package/dist/adapters/prisma/generated/models.d.ts +3 -1
- package/dist/adapters/prisma/item-outcomes.d.ts +4 -0
- package/dist/adapters/prisma/item-outcomes.js +28 -0
- package/dist/adapters/prisma/item-outcomes.js.map +1 -0
- package/dist/adapters/prisma/opened-deliveries.js +4 -0
- package/dist/adapters/prisma/opened-deliveries.js.map +1 -1
- package/dist/adapters/prisma/routes.d.ts +4 -0
- package/dist/adapters/prisma/routes.js +19 -0
- package/dist/adapters/prisma/routes.js.map +1 -0
- package/dist/adapters/prisma/sign-in-notices.js +11 -5
- package/dist/adapters/prisma/sign-in-notices.js.map +1 -1
- package/dist/adapters/prisma/slack-links.js +0 -4
- package/dist/adapters/prisma/slack-links.js.map +1 -1
- package/dist/adapters/prisma/slack-posts.js +37 -3
- package/dist/adapters/prisma/slack-posts.js.map +1 -1
- package/dist/adapters/slack/slack-messages.d.ts +2 -0
- package/dist/adapters/slack/slack-messages.js +29 -3
- package/dist/adapters/slack/slack-messages.js.map +1 -1
- package/dist/adapters/trpc/router.d.ts +88 -20
- package/dist/adapters/trpc/router.js +47 -18
- 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.d.ts +7 -0
- package/dist/app.js +88 -22
- package/dist/app.js.map +1 -1
- package/dist/bin/aeolus-gateway.js +1 -0
- package/dist/bin/aeolus-gateway.js.map +1 -1
- package/dist/config.d.ts +8 -1
- package/dist/config.js +21 -0
- package/dist/config.js.map +1 -1
- package/dist/core/account-sign-in/start-account-sign-in.d.ts +1 -1
- package/dist/core/account-sign-in/start-account-sign-in.js +1 -1
- package/dist/core/account-sign-in/start-account-sign-in.js.map +1 -1
- package/dist/core/mcp-in/collect-replies.d.ts +2 -0
- package/dist/core/mcp-in/collect-replies.js +11 -3
- package/dist/core/mcp-in/collect-replies.js.map +1 -1
- package/dist/core/mcp-in/ports.d.ts +2 -1
- package/dist/core/mcp-out/run-party.d.ts +3 -1
- package/dist/core/mcp-out/run-party.js +9 -2
- package/dist/core/mcp-out/run-party.js.map +1 -1
- package/dist/core/party-grants/complete-party-sign-in.d.ts +5 -3
- package/dist/core/party-grants/complete-party-sign-in.js +7 -3
- package/dist/core/party-grants/complete-party-sign-in.js.map +1 -1
- package/dist/core/party-grants/ports.d.ts +17 -3
- package/dist/core/party-grants/tell-sign-in-needed.d.ts +9 -6
- package/dist/core/party-grants/tell-sign-in-needed.js +28 -12
- package/dist/core/party-grants/tell-sign-in-needed.js.map +1 -1
- package/dist/core/people/answer-delivery.d.ts +9 -13
- package/dist/core/people/answer-delivery.js +23 -6
- package/dist/core/people/answer-delivery.js.map +1 -1
- package/dist/core/people/basket.d.ts +104 -0
- package/dist/core/people/basket.js +42 -0
- package/dist/core/people/basket.js.map +1 -0
- package/dist/core/people/count-basket.d.ts +16 -0
- package/dist/core/people/count-basket.js +14 -0
- package/dist/core/people/count-basket.js.map +1 -0
- package/dist/core/people/done-delivery.d.ts +21 -13
- package/dist/core/people/done-delivery.js +34 -4
- package/dist/core/people/done-delivery.js.map +1 -1
- package/dist/core/people/finish-own-step.d.ts +27 -0
- package/dist/core/people/finish-own-step.js +67 -0
- package/dist/core/people/finish-own-step.js.map +1 -0
- package/dist/core/people/inbox-entry.js +1 -1
- package/dist/core/people/inbox-entry.js.map +1 -1
- package/dist/core/people/item-job.d.ts +9 -0
- package/dist/core/people/item-job.js +38 -0
- package/dist/core/people/item-job.js.map +1 -0
- package/dist/core/people/item-outcome.d.ts +37 -0
- package/dist/core/people/item-outcome.js +21 -0
- package/dist/core/people/item-outcome.js.map +1 -0
- package/dist/core/people/item-state.d.ts +10 -0
- package/dist/core/people/item-state.js +17 -0
- package/dist/core/people/item-state.js.map +1 -0
- package/dist/core/people/open-delivery.d.ts +29 -14
- package/dist/core/people/open-delivery.js +108 -19
- package/dist/core/people/open-delivery.js.map +1 -1
- package/dist/core/people/opened-of.d.ts +30 -9
- package/dist/core/people/opened-of.js +25 -4
- package/dist/core/people/opened-of.js.map +1 -1
- package/dist/core/people/person-crew.d.ts +5 -1
- package/dist/core/people/person-crew.js +7 -0
- package/dist/core/people/person-crew.js.map +1 -1
- package/dist/core/people/ports.d.ts +42 -19
- package/dist/core/people/put-in-basket.d.ts +39 -0
- package/dist/core/people/put-in-basket.js +57 -0
- package/dist/core/people/put-in-basket.js.map +1 -0
- package/dist/core/people/read-basket.d.ts +54 -0
- package/dist/core/people/read-basket.js +57 -0
- package/dist/core/people/read-basket.js.map +1 -0
- package/dist/core/people/read-bridge-home.d.ts +47 -0
- package/dist/core/people/read-bridge-home.js +53 -0
- package/dist/core/people/read-bridge-home.js.map +1 -0
- package/dist/core/people/read-inbox.d.ts +11 -6
- package/dist/core/people/read-inbox.js +17 -10
- package/dist/core/people/read-inbox.js.map +1 -1
- package/dist/core/people/read-record.d.ts +48 -0
- package/dist/core/people/read-record.js +44 -0
- package/dist/core/people/read-record.js.map +1 -0
- package/dist/core/people/read-routing.d.ts +26 -0
- package/dist/core/people/read-routing.js +22 -0
- package/dist/core/people/read-routing.js.map +1 -0
- package/dist/core/people/read-wake-channels.d.ts +7 -8
- package/dist/core/people/read-wake-channels.js +4 -4
- package/dist/core/people/read-wake-channels.js.map +1 -1
- package/dist/core/people/remove-from-basket.d.ts +20 -0
- package/dist/core/people/remove-from-basket.js +52 -0
- package/dist/core/people/remove-from-basket.js.map +1 -0
- package/dist/core/people/routing.d.ts +50 -0
- package/dist/core/people/routing.js +35 -0
- package/dist/core/people/routing.js.map +1 -0
- package/dist/core/people/send-basket.d.ts +40 -0
- package/dist/core/people/send-basket.js +60 -0
- package/dist/core/people/send-basket.js.map +1 -0
- package/dist/core/people/send-stored-answers.d.ts +33 -0
- package/dist/core/people/send-stored-answers.js +96 -0
- package/dist/core/people/send-stored-answers.js.map +1 -0
- package/dist/core/people/stale-question.d.ts +28 -0
- package/dist/core/people/stale-question.js +26 -0
- package/dist/core/people/stale-question.js.map +1 -0
- package/dist/core/people/step-outcome.d.ts +18 -0
- package/dist/core/people/step-outcome.js +18 -0
- package/dist/core/people/step-outcome.js.map +1 -0
- package/dist/core/people/turn-route.d.ts +34 -0
- package/dist/core/people/turn-route.js +42 -0
- package/dist/core/people/turn-route.js.map +1 -0
- package/dist/core/people/wake-person.d.ts +15 -7
- package/dist/core/people/wake-person.js +54 -28
- package/dist/core/people/wake-person.js.map +1 -1
- package/dist/core/people/web-push-channel.d.ts +2 -2
- package/dist/core/people/web-push-channel.js +3 -3
- package/dist/core/people/web-push-channel.js.map +1 -1
- package/dist/core/requests/ask-owners.d.ts +1 -1
- package/dist/core/requests/ask-owners.js +4 -4
- package/dist/core/requests/ask-owners.js.map +1 -1
- package/dist/core/requests/list-mine.d.ts +1 -1
- package/dist/core/requests/list-mine.js +1 -1
- package/dist/core/requests/list-to-decide.d.ts +1 -1
- package/dist/core/requests/list-to-decide.js +1 -1
- package/dist/core/requests/list-to-decide.js.map +1 -1
- package/dist/core/shared/errors.d.ts +1 -1
- package/dist/core/shared/errors.js.map +1 -1
- package/dist/core/slack/answer-in-slack.d.ts +18 -15
- package/dist/core/slack/answer-in-slack.js +39 -20
- package/dist/core/slack/answer-in-slack.js.map +1 -1
- package/dist/core/slack/complete-link.js +3 -3
- package/dist/core/slack/complete-link.js.map +1 -1
- package/dist/core/slack/edit-slack-posts.d.ts +23 -0
- package/dist/core/slack/edit-slack-posts.js +49 -0
- package/dist/core/slack/edit-slack-posts.js.map +1 -0
- package/dist/core/slack/ports.d.ts +28 -9
- package/dist/core/slack/read-slack-link.d.ts +2 -3
- package/dist/core/slack/read-slack-link.js +2 -2
- package/dist/core/slack/read-slack-link.js.map +1 -1
- package/dist/core/slack/see-in-slack.d.ts +34 -0
- package/dist/core/slack/see-in-slack.js +48 -0
- package/dist/core/slack/see-in-slack.js.map +1 -0
- package/dist/core/slack/send-slack-events.js +1 -1
- package/dist/core/slack/send-slack-events.js.map +1 -1
- package/dist/core/slack/show-in-slack.d.ts +20 -15
- package/dist/core/slack/show-in-slack.js +36 -45
- package/dist/core/slack/show-in-slack.js.map +1 -1
- package/dist/core/slack/slack-link.d.ts +0 -2
- package/dist/core/slack/slack-post-of.d.ts +9 -9
- package/dist/core/slack/slack-post-of.js +12 -3
- package/dist/core/slack/slack-post-of.js.map +1 -1
- package/dist/core/slack/slack-post.d.ts +13 -7
- package/dist/core/slack/slack-post.js +2 -2
- package/dist/core/slack/slack-post.js.map +1 -1
- package/dist/core/slack/slack-press.d.ts +45 -0
- package/dist/core/slack/slack-press.js +26 -0
- package/dist/core/slack/slack-press.js.map +1 -0
- package/dist/core/slack/start-link.d.ts +1 -1
- package/dist/core/slack/start-link.js +1 -1
- package/dist/core/slack/unlink-slack.d.ts +1 -1
- package/dist/core/slack/unlink-slack.js +1 -1
- package/dist/core/slack/unlink-slack.js.map +1 -1
- package/dist/person-waiters.js +3 -1
- package/dist/person-waiters.js.map +1 -1
- package/dist/round-worker.d.ts +23 -0
- package/dist/round-worker.js +38 -0
- package/dist/round-worker.js.map +1 -0
- package/package.json +3 -3
- package/src/adapters/prisma/migrations/20261101090000_item_outcomes/migration.sql +12 -0
- package/src/adapters/prisma/migrations/20261101091000_opened_deliveries_content_type/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261101120000_opened_deliveries_questions/migration.sql +3 -0
- package/src/adapters/prisma/migrations/20261101150000_basket_entries/migration.sql +25 -0
- package/src/adapters/prisma/migrations/20261101180000_opened_deliveries_steps/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261101181000_party_sign_in_notices_steps/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261102090000_routes/migration.sql +11 -0
- package/src/adapters/prisma/migrations/20261102091000_slack_posts_unacknowledged/migration.sql +3 -0
- package/src/adapters/prisma/migrations/20261102092000_slack_links_routed/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261102093000_email_channels_routed/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261103090000_slack_posts_edited/migration.sql +5 -0
- package/src/adapters/prisma/schema.prisma +71 -15
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/app-path-routes-manifest.json +8 -4
- package/web/.next/build-manifest.json +127 -79
- package/web/.next/diagnostics/route-bundle-stats.json +215 -143
- package/web/.next/fallback-build-manifest.json +3 -3
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/routes-manifest.json +50 -26
- package/web/.next/server/app/(console)/bridge/basket/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(console)/{overview/requests/[requestId] → bridge/basket}/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/{overview/requests/[requestId] → bridge/basket}/page/next-font-manifest.json +1 -1
- package/web/.next/server/app/(console)/bridge/basket/page/server-reference-manifest.json +75 -0
- package/web/.next/server/app/(console)/bridge/basket/page.js +25 -0
- package/web/.next/server/app/(console)/bridge/basket/page.js.nft.json +1 -0
- package/web/.next/server/app/(console)/bridge/basket/page_client-reference-manifest.js +3 -0
- package/web/.next/server/app/(console)/bridge/changes/route/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(console)/bridge/changes/route.js +8 -0
- package/web/.next/server/app/(console)/{overview/focus → bridge/changes}/route.js.nft.json +1 -1
- package/web/.next/server/app/(console)/{overview/focus → bridge/changes}/route_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/bridge/done/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(console)/bridge/done/page/build-manifest.json +23 -0
- package/web/.next/server/app/(console)/bridge/done/page/next-font-manifest.json +11 -0
- package/web/.next/server/app/(console)/bridge/done/page/server-reference-manifest.json +75 -0
- package/web/.next/server/app/(console)/bridge/done/page.js +25 -0
- package/web/.next/server/app/(console)/bridge/done/page.js.nft.json +1 -0
- package/web/.next/server/app/(console)/bridge/done/page_client-reference-manifest.js +3 -0
- package/web/.next/server/app/(console)/bridge/focus/route/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(console)/bridge/focus/route.js +8 -0
- package/web/.next/server/app/(console)/{overview/changes → bridge/focus}/route.js.nft.json +1 -1
- package/web/.next/server/app/(console)/bridge/focus/route_client-reference-manifest.js +3 -0
- package/web/.next/server/app/(console)/bridge/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(console)/{overview → bridge}/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/{overview → bridge}/page/next-font-manifest.json +1 -1
- package/web/.next/server/app/(console)/bridge/page/react-loadable-manifest.json +1 -0
- package/web/.next/server/app/(console)/bridge/page/server-reference-manifest.json +65 -0
- package/web/.next/server/app/(console)/{overview → bridge}/page.js +11 -11
- package/web/.next/server/app/(console)/bridge/page.js.map +5 -0
- package/web/.next/server/app/(console)/{overview → bridge}/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/bridge/page_client-reference-manifest.js +3 -0
- package/web/.next/server/app/(console)/bridge/settings/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(console)/bridge/settings/page/build-manifest.json +23 -0
- package/web/.next/server/app/(console)/bridge/settings/page/next-font-manifest.json +11 -0
- package/web/.next/server/app/(console)/bridge/settings/page/react-loadable-manifest.json +1 -0
- package/web/.next/server/app/(console)/bridge/settings/page/server-reference-manifest.json +15 -0
- package/web/.next/server/app/(console)/bridge/settings/page.js +23 -0
- package/web/.next/server/app/(console)/bridge/settings/page.js.map +5 -0
- package/web/.next/server/app/(console)/bridge/settings/page.js.nft.json +1 -0
- package/web/.next/server/app/(console)/bridge/settings/page_client-reference-manifest.js +3 -0
- package/web/.next/server/app/(console)/bridge/settings/requests/[requestId]/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(console)/bridge/settings/requests/[requestId]/page/build-manifest.json +23 -0
- package/web/.next/server/app/(console)/bridge/settings/requests/[requestId]/page/next-font-manifest.json +11 -0
- package/web/.next/server/app/(console)/bridge/settings/requests/[requestId]/page/react-loadable-manifest.json +1 -0
- package/web/.next/server/app/(console)/bridge/settings/requests/[requestId]/page/server-reference-manifest.json +25 -0
- package/web/.next/server/app/(console)/bridge/settings/requests/[requestId]/page.js +25 -0
- package/web/.next/server/app/(console)/bridge/settings/requests/[requestId]/page.js.map +5 -0
- package/web/.next/server/app/(console)/bridge/settings/requests/[requestId]/page.js.nft.json +1 -0
- package/web/.next/server/app/(console)/bridge/settings/requests/[requestId]/page_client-reference-manifest.js +3 -0
- package/web/.next/server/app/(console)/bridge/settings/routing/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(console)/bridge/settings/routing/page/build-manifest.json +23 -0
- package/web/.next/server/app/(console)/bridge/settings/routing/page/next-font-manifest.json +11 -0
- package/web/.next/server/app/(console)/bridge/settings/routing/page/react-loadable-manifest.json +1 -0
- package/web/.next/server/app/(console)/bridge/settings/routing/page/server-reference-manifest.json +55 -0
- package/web/.next/server/app/(console)/{overview/requests/[requestId] → bridge/settings/routing}/page.js +12 -12
- package/web/.next/server/app/(console)/bridge/settings/routing/page.js.map +5 -0
- package/web/.next/server/app/(console)/{overview/requests/[requestId] → bridge/settings/routing}/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/bridge/settings/routing/page_client-reference-manifest.js +3 -0
- package/web/.next/server/app/(console)/gateway-off/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/gateway-off/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/(console)/gateway-off/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/gateway-off/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/meetings/[meetingId]/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/meetings/[meetingId]/page/server-reference-manifest.json +3 -3
- package/web/.next/server/app/(console)/meetings/[meetingId]/page.js +1 -1
- package/web/.next/server/app/(console)/meetings/[meetingId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/meetings/[meetingId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/[name]/change/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/outside-parties/[name]/change/page/server-reference-manifest.json +16 -16
- package/web/.next/server/app/(console)/outside-parties/[name]/change/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/outside-parties/[name]/change/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/[name]/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/outside-parties/[name]/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/(console)/outside-parties/[name]/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/outside-parties/[name]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/[name]/retire/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/outside-parties/[name]/retire/page/server-reference-manifest.json +16 -16
- package/web/.next/server/app/(console)/outside-parties/[name]/retire/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/outside-parties/[name]/retire/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/add/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/outside-parties/add/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/(console)/outside-parties/add/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/outside-parties/add/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page/server-reference-manifest.json +2 -2
- package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page/server-reference-manifest.json +2 -2
- package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/outside-parties/page/server-reference-manifest.json +2 -2
- package/web/.next/server/app/(console)/outside-parties/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/outside-parties/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/parties/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/parties/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/(console)/parties/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/parties/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/sign-in/failed/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/sign-in/failed/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/(console)/sign-in/failed/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/sign-in/failed/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/slack/disconnect/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/slack/disconnect/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/(console)/slack/disconnect/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/slack/disconnect/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/slack/expose/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/slack/expose/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/(console)/slack/expose/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/slack/expose/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/slack/link/route.js.nft.json +1 -1
- package/web/.next/server/app/(console)/slack/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/slack/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/(console)/slack/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/slack/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/slack/remove/page/build-manifest.json +4 -4
- package/web/.next/server/app/(console)/slack/remove/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/(console)/slack/remove/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/slack/remove/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error/page/build-manifest.json +4 -4
- package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +1 -1
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/build-manifest.json +4 -4
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page.js.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/build-manifest.json +4 -4
- package/web/.next/server/app/authorize/failed/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/authorize/failed/page.js +1 -1
- package/web/.next/server/app/authorize/failed/page.js.nft.json +1 -1
- package/web/.next/server/app/authorize/failed/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/authorize/pick/page/build-manifest.json +4 -4
- package/web/.next/server/app/authorize/pick/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/authorize/pick/page.js +1 -1
- package/web/.next/server/app/authorize/pick/page.js.nft.json +1 -1
- package/web/.next/server/app/authorize/pick/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/authorize/waiting/approval/page/build-manifest.json +4 -4
- package/web/.next/server/app/authorize/waiting/approval/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/authorize/waiting/approval/page.js +1 -1
- package/web/.next/server/app/authorize/waiting/approval/page.js.nft.json +1 -1
- package/web/.next/server/app/authorize/waiting/approval/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app-paths-manifest.json +8 -4
- package/web/.next/server/chunks/0b9d__next-internal_server_app_(console)_bridge_changes_route_actions_0hj8aqohz6bu6.js +3 -0
- package/web/.next/server/chunks/{[root-of-the-server]__1tfyrijwfgqlk._.js → [root-of-the-server]__13mh3krxil59c._.js} +2 -2
- package/web/.next/server/chunks/[root-of-the-server]__13mh3krxil59c._.js.map +1 -0
- package/web/.next/server/chunks/_05qgg3__4kdbm._.js +3 -0
- package/web/.next/server/chunks/_05qgg3__4kdbm._.js.map +1 -0
- package/web/.next/server/chunks/_0_um96p6psnqx._.js +4 -4
- package/web/.next/server/chunks/_0_um96p6psnqx._.js.map +1 -1
- package/web/.next/server/chunks/_1uap5tql2vvsb._.js +3 -0
- package/web/.next/server/chunks/{_04is-uopj3op9._.js.map → _1uap5tql2vvsb._.js.map} +1 -1
- package/web/.next/server/chunks/_1xf83h9norhws._.js +4 -4
- package/web/.next/server/chunks/_1xf83h9norhws._.js.map +1 -1
- package/web/.next/server/chunks/_20ne4s-e_jzxp._.js +1 -1
- package/web/.next/server/chunks/_20ne4s-e_jzxp._.js.map +1 -1
- package/web/.next/server/chunks/ssr/01fr_app_(console)_bridge_settings_requests_[requestId]_page_actions_1au-p5lgnv5e-.js +3 -0
- package/web/.next/server/chunks/ssr/01fr_app_(console)_bridge_settings_requests_[requestId]_page_actions_1au-p5lgnv5e-.js.map +1 -0
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_bridge_settings_routing_page_actions_136lm_jip4d_x.js +3 -0
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_bridge_settings_routing_page_actions_136lm_jip4d_x.js.map +1 -0
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_change_page_actions_04td11fxohsfm.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_change_page_actions_04td11fxohsfm.js.map +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_page_actions_0u-45itza1ls7.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_page_actions_0u-45itza1ls7.js.map +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_retire_page_actions_0s7ps6i0ts7v5.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_retire_page_actions_0s7ps6i0ts7v5.js.map +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_add-a2a-client_page_actions_0d_wgiu94c32e.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_add-a2a-client_page_actions_0d_wgiu94c32e.js.map +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_add_page_actions_0yfz_dfn-8uo7.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_add_page_actions_0yfz_dfn-8uo7.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__001xx3sm5ur-e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__001xx3sm5ur-e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__00jy4lqrcvxvc._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__00jy4lqrcvxvc._.js.map +1 -0
- 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]__179upda-y7uap._.js → [root-of-the-server]__0gnfxe62edx95._.js} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0k-5_al3xk509._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0k-5_al3xk509._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0k3g0p3t9t0c-._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0k3g0p3t9t0c-._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__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]__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]__18v7b5ga58a9n._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__18v7b5ga58a9n._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1iqxg48po42ig._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1iqxg48po42ig._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1qpow96uit9t8._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1qpow96uit9t8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1rf344o33bmi4._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1rf344o33bmi4._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__04_bc8g0oe4jt._.js → [root-of-the-server]__1yyaeeylnezpi._.js} +1 -1
- package/web/.next/server/chunks/ssr/_00hfzlqn1og18._.js +1 -1
- package/web/.next/server/chunks/ssr/_00hfzlqn1og18._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_03lk54yp-yhw3._.js +4 -4
- package/web/.next/server/chunks/ssr/_03lk54yp-yhw3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0a_nsm-ye2r6v._.js +4 -0
- package/web/.next/server/chunks/ssr/_0a_nsm-ye2r6v._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_0h-ua-y4p4u1p._.js +3 -0
- package/web/.next/server/chunks/ssr/_0h-ua-y4p4u1p._.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/_0xickgbbju_9-._.js +1 -1
- package/web/.next/server/chunks/ssr/_0xickgbbju_9-._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_1oy13966tft2_._.js → _10-gn6g9yc63s._.js} +2 -2
- package/web/.next/server/chunks/ssr/_10-gn6g9yc63s._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_1pf8x2exvfl1z._.js → _177fdczus39s7._.js} +2 -2
- package/web/.next/server/chunks/ssr/_177fdczus39s7._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_1_wav28san6dm._.js +1 -1
- package/web/.next/server/chunks/ssr/_1e2o809f0ekry._.js +1 -1
- package/web/.next/server/chunks/ssr/_1hmjvjuxx92vo._.js +1 -1
- package/web/.next/server/chunks/ssr/_1hmjvjuxx92vo._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1jx41z6kmxtt0._.js +3 -0
- package/web/.next/server/chunks/ssr/_1jx41z6kmxtt0._.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/_1q2s-hb67yjfb._.js +3 -0
- package/web/.next/server/chunks/ssr/_1q2s-hb67yjfb._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_1qbsmlji34yph._.js +1 -1
- package/web/.next/server/chunks/ssr/_1qbsmlji34yph._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1yi3j4a16uet-._.js +3 -0
- package/web/.next/server/chunks/ssr/_1yi3j4a16uet-._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_01oyodz1bs245._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_01oyodz1bs245._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_16d4um5s513wz._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_16d4um5s513wz._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{node_modules_@aeolus-fleet_common_dist_header_1id6g-6m2hh0l._.js → node_modules_@aeolus-fleet_common_dist_header_0t_cmi-llaq7g._.js} +2 -2
- package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_common_dist_header_0t_cmi-llaq7g._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{node_modules_@aeolus-fleet_common_dist_header_1jvz31plyg2f-._.js → node_modules_@aeolus-fleet_common_dist_header_1x3s5abk_uj9j._.js} +2 -2
- package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_common_dist_header_1x3s5abk_uj9j._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_0hkpfqt9ne626._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_0hkpfqt9ne626._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_031g89sb4kgzn.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_031g89sb4kgzn.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_09rviehv6rh0n.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_09rviehv6rh0n.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0ka8v6_fxug8r.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0ka8v6_fxug8r.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1c8zekuy1gkch.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1c8zekuy1gkch.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1dhzng2nnu0m7.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1dhzng2nnu0m7.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1rya2ag3z4vug.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1rya2ag3z4vug.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_09zipglxee7tv._.js +1 -1
- package/web/.next/server/chunks/ssr/web_09zipglxee7tv._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_0i_1uraygw2ld._.js +3 -0
- package/web/.next/server/chunks/ssr/web_0i_1uraygw2ld._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_0wys4l6za8umr._.js +1 -1
- package/web/.next/server/chunks/ssr/web_0wys4l6za8umr._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_0wz4onhfbq359._.js +3 -0
- package/web/.next/server/chunks/ssr/web_0wz4onhfbq359._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_1-hlf1xzemd3-._.js +3 -0
- package/web/.next/server/chunks/ssr/web_1-hlf1xzemd3-._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_107a79_nx4jdd._.js +3 -0
- package/web/.next/server/chunks/ssr/web_107a79_nx4jdd._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_127_b93avkwaq._.js +3 -0
- package/web/.next/server/chunks/ssr/web_127_b93avkwaq._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_bridge_basket_page_actions_102xk3g8eko_q.js +3 -0
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_bridge_basket_page_actions_102xk3g8eko_q.js.map +1 -0
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_bridge_done_page_actions_0mm90xd2feta2.js +3 -0
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_bridge_done_page_actions_0mm90xd2feta2.js.map +1 -0
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_bridge_page_actions_082880qz6xa5k.js +3 -0
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_bridge_page_actions_082880qz6xa5k.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_app_(console)_bridge_error_tsx_0ty_yk1robyaj._.js +3 -0
- package/web/.next/server/chunks/ssr/web_app_(console)_bridge_error_tsx_0ty_yk1robyaj._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_app_(console)_bridge_error_tsx_10gkrn3ey8162._.js +3 -0
- package/web/.next/server/chunks/ssr/web_app_(console)_bridge_error_tsx_10gkrn3ey8162._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_app_(console)_bridge_settings_page_tsx_0xzphp7k9ge1u._.js +3 -0
- package/web/.next/server/chunks/ssr/web_app_(console)_bridge_settings_page_tsx_0xzphp7k9ge1u._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_app_(console)_outside-parties_[name]_change_page_tsx_00bpg0s2eypj9._.js +1 -1
- package/web/.next/server/chunks/ssr/web_app_(console)_outside-parties_[name]_retire_page_tsx_1zxy74pr5_2kn._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_0s8erick0xk77._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_0s8erick0xk77._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_0wuo5bgp5tabn._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_0wuo5bgp5tabn._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_16cy3vmcijydk._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_16cy3vmcijydk._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_1iiqi6dhrst33._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_1iiqi6dhrst33._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_1n1hy3nwha2vi._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_1n1hy3nwha2vi._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_add-a2a-agent_ui_a2a-agent-form_tsx_0z8t1aalwzyl7._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-a2a-agent_ui_a2a-agent-form_tsx_0z8t1aalwzyl7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-a2a-client_ui_a2a-client-form_tsx_1anv88g385nwe._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-a2a-client_ui_a2a-client-form_tsx_1anv88g385nwe._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-server_ui_add-server_tsx_1jnmar5xju49k._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-server_ui_add-server_tsx_1jnmar5xju49k._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_0-mhu0jaig2u3._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_0-mhu0jaig2u3._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_0219fbfmsi68-._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_0219fbfmsi68-._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_11jndonu4o8fq._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_11jndonu4o8fq._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_1mi9qlb-z5iwt._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_1mi9qlb-z5iwt._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_hooks_bridge-actions_ts_0h-_xm2rcb-ij._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_hooks_bridge-actions_ts_0h-_xm2rcb-ij._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_state_0354e3wb0dzx1._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_state_0354e3wb0dzx1._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_state_basket-panel_tsx_1qi_kzld0rfgs._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_state_basket-panel_tsx_1qi_kzld0rfgs._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_state_decision-panel_tsx_1mzsixgc8zuxc._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_state_decision-panel_tsx_1mzsixgc8zuxc._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_state_done-panel_tsx_1m844-qb1z9p_._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_state_done-panel_tsx_1m844-qb1z9p_._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_state_home-panel_tsx_1cc5zdhxogl_2._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_state_home-panel_tsx_1cc5zdhxogl_2._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_state_live-refresh_tsx_1c1xk-oe0kllv._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_state_live-refresh_tsx_1c1xk-oe0kllv._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_ui_1y4g3fe75nqn5._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_bridge_ui_1y4g3fe75nqn5._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_frame_0pe8cwpxe1egb._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_frame_0pe8cwpxe1egb._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_frame_ui_gateway-header_tsx_0e9tekx4jf7ng._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_frame_ui_gateway-header_tsx_0e9tekx4jf7ng._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_meeting_state_meeting-controls_tsx_12g4kzk2mbvvz._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_meeting_state_meeting-controls_tsx_12g4kzk2mbvvz._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_outside-parties_ui_switch-card_tsx_1_xnu9bm4tc-_._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_outside-parties_ui_switch-card_tsx_1_xnu9bm4tc-_._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_outside-party_actions_ts_102ar5pdowf8s._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_parties_actions_ts_0r-tbfsig2ty-._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_slack_actions_ts_1l3yg9vl20_vu._.js +1 -1
- package/web/.next/server/chunks/web__next-internal_server_app_(console)_bridge_focus_route_actions_0syd_u8mgzdmi.js +3 -0
- package/web/.next/server/middleware-build-manifest.js +127 -79
- package/web/.next/server/next-font-manifest.js +1 -1
- package/web/.next/server/next-font-manifest.json +24 -8
- 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 +218 -132
- package/web/.next/static/chunks/0az9upwm-8_q9.js +1 -0
- package/web/.next/static/chunks/0c1tqlbsvq1dj.js +1 -0
- package/web/.next/static/chunks/0fh11dkddwf_2.js +1 -0
- package/web/.next/static/chunks/0gbozvd_yh421.js +1 -0
- package/web/.next/static/chunks/0l9_oie6xi0kd.js +1 -0
- package/web/.next/static/chunks/0m512dxdcrv-b.js +1 -0
- package/web/.next/static/chunks/1166rxt6h6ilq.js +1 -0
- package/web/.next/static/chunks/1485slb5zus5p.js +1 -0
- package/web/.next/static/chunks/180aowme095ds.js +1 -0
- package/web/.next/static/chunks/{03239gtej3tj0.js → 24olc0btcvn7q.js} +1 -1
- package/web/.next/static/chunks/296w-74ry5lzk.js +1 -0
- package/web/.next/static/chunks/2hoi73vy1wqpo.js +1 -0
- package/web/.next/static/chunks/2mtfca4qk_s34.js +1 -0
- package/web/.next/static/chunks/{3ceatffqhpgpu.js → 2z2auwx1s2mgl.js} +1 -1
- package/web/.next/static/chunks/397zvdr6xr5pq.js +1 -0
- package/web/.next/static/chunks/{2_e-puldye2do.js → 3db90zxmny2y-.js} +1 -1
- package/web/.next/static/chunks/3ow9h8hreko-p.css +3 -0
- package/web/.next/static/chunks/3pd8pele5x1o9.js +1 -0
- package/web/.next/static/chunks/3srfjz42u14tx.js +1 -0
- package/web/.next/static/chunks/{0tmvd_zw45u96.js → 3x0p-z3zdrk_b.js} +1 -1
- package/web/.next/static/chunks/3yq9jt4p_0uid.js +1 -0
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/types/routes.d.ts +10 -6
- package/web/.next/types/validator.ts +108 -40
- package/web/public/wake-worker.js +4 -4
- package/dist/adapters/prisma/email-channels.d.ts +0 -4
- package/dist/adapters/prisma/email-channels.js +0 -14
- package/dist/adapters/prisma/email-channels.js.map +0 -1
- package/dist/adapters/prisma/generated/models/EmailChannel.d.ts +0 -946
- package/dist/adapters/prisma/generated/models/EmailChannel.js +0 -2
- package/dist/adapters/prisma/generated/models/EmailChannel.js.map +0 -1
- package/dist/core/people/turn-email-channel.d.ts +0 -21
- package/dist/core/people/turn-email-channel.js +0 -22
- package/dist/core/people/turn-email-channel.js.map +0 -1
- package/dist/core/slack/show-all-in-slack.d.ts +0 -16
- package/dist/core/slack/show-all-in-slack.js +0 -18
- package/dist/core/slack/show-all-in-slack.js.map +0 -1
- package/web/.next/server/app/(console)/overview/changes/route/app-paths-manifest.json +0 -3
- package/web/.next/server/app/(console)/overview/changes/route.js +0 -8
- package/web/.next/server/app/(console)/overview/changes/route_client-reference-manifest.js +0 -3
- package/web/.next/server/app/(console)/overview/focus/route/app-paths-manifest.json +0 -3
- package/web/.next/server/app/(console)/overview/focus/route.js +0 -8
- package/web/.next/server/app/(console)/overview/page/app-paths-manifest.json +0 -3
- package/web/.next/server/app/(console)/overview/page/server-reference-manifest.json +0 -95
- package/web/.next/server/app/(console)/overview/page_client-reference-manifest.js +0 -3
- package/web/.next/server/app/(console)/overview/requests/[requestId]/page/app-paths-manifest.json +0 -3
- package/web/.next/server/app/(console)/overview/requests/[requestId]/page/server-reference-manifest.json +0 -25
- package/web/.next/server/app/(console)/overview/requests/[requestId]/page_client-reference-manifest.js +0 -3
- package/web/.next/server/chunks/0b9d__next-internal_server_app_(console)_overview_focus_route_actions_10hgyjvv-6fus.js +0 -3
- package/web/.next/server/chunks/1mb5_next-internal_server_app_(console)_overview_changes_route_actions_0zbq7lqsf5nng.js +0 -3
- package/web/.next/server/chunks/[root-of-the-server]__1tfyrijwfgqlk._.js.map +0 -1
- package/web/.next/server/chunks/_04is-uopj3op9._.js +0 -3
- package/web/.next/server/chunks/_1-fw4-pwzazl4._.js +0 -3
- package/web/.next/server/chunks/_1-fw4-pwzazl4._.js.map +0 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_overview_requests_[requestId]_page_actions_0uki9j3mtuz9e.js +0 -3
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_overview_requests_[requestId]_page_actions_0uki9j3mtuz9e.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0icm7kndx480o._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0icm7kndx480o._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1zlq3zji9v53h._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1zlq3zji9v53h._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0-boiqan2j4tr._.js +0 -3
- package/web/.next/server/chunks/ssr/_0-boiqan2j4tr._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0-lfpqqlgfhzj._.js +0 -3
- package/web/.next/server/chunks/ssr/_0-lfpqqlgfhzj._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0bizyb21i2sl8._.js +0 -3
- package/web/.next/server/chunks/ssr/_0bizyb21i2sl8._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_1oy13966tft2_._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_1pf8x2exvfl1z._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_1yqu7dcxs2-so._.js +0 -3
- package/web/.next/server/chunks/ssr/_1yqu7dcxs2-so._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_0_cxkn6vujxay._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_0_cxkn6vujxay._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_0ue_35q2cegwf._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_0ue_35q2cegwf._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_15ceu3jhtifcw._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_15ceu3jhtifcw._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_common_dist_header_1id6g-6m2hh0l._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_common_dist_header_1jvz31plyg2f-._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_00i8qu9x65r6w.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_00i8qu9x65r6w.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0a3qpq0qt_bi4.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0a3qpq0qt_bi4.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_0plvx3c_1cozb._.js +0 -3
- package/web/.next/server/chunks/ssr/web_0plvx3c_1cozb._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_1loiet18xbddu._.js +0 -3
- package/web/.next/server/chunks/ssr/web_1loiet18xbddu._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_overview_page_actions_18on1ziyg1nzy.js +0 -3
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_overview_page_actions_18on1ziyg1nzy.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_app_(console)_overview_error_tsx_087e7ba8loavc._.js +0 -3
- package/web/.next/server/chunks/ssr/web_app_(console)_overview_error_tsx_087e7ba8loavc._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_app_(console)_overview_error_tsx_1nn1jz5nh77af._.js +0 -3
- package/web/.next/server/chunks/ssr/web_app_(console)_overview_error_tsx_1nn1jz5nh77af._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_0fxkmm4vqke5q._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_0fxkmm4vqke5q._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_1k6q2m0sl54-8._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_1k6q2m0sl54-8._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_1utnezwv0xr-l._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_1utnezwv0xr-l._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_overview_0udx5lm8igils._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_overview_0udx5lm8igils._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_overview_144fx4a-r9_wn._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_overview_144fx4a-r9_wn._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_overview_hooks_overview-actions_ts_0-wrat07d1y5g._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_overview_hooks_overview-actions_ts_0-wrat07d1y5g._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_overview_state_00l0wkgvv9y6j._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_overview_state_00l0wkgvv9y6j._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_overview_state_decision-panel_tsx_0kpd26ggtr6h_._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_overview_state_decision-panel_tsx_0kpd26ggtr6h_._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_overview_ui_10mb24kjiffea._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_overview_ui_10mb24kjiffea._.js.map +0 -1
- package/web/.next/static/chunks/0nhopjmnw_dqt.js +0 -1
- package/web/.next/static/chunks/0vlawcs6_kjs1.js +0 -1
- package/web/.next/static/chunks/1se0j0htjyep6.js +0 -1
- package/web/.next/static/chunks/26vlpatu47xtw.css +0 -3
- package/web/.next/static/chunks/287ofedoj_6xl.js +0 -1
- package/web/.next/static/chunks/2cd4e71s711ad.js +0 -1
- package/web/.next/static/chunks/2ewacyhp73due.js +0 -1
- package/web/.next/static/chunks/34kulpk3a-cka.js +0 -1
- package/web/.next/static/chunks/3fd167c0-ot3u.js +0 -1
- package/web/.next/static/chunks/3knqujtrdi225.js +0 -1
- package/web/.next/static/chunks/3l5jtag3-fukc.js +0 -1
- package/web/.next/static/chunks/3rxg2mdhxd6yt.js +0 -1
- package/web/.next/static/chunks/3v6tr952p9dba.js +0 -1
- /package/web/.next/server/app/(console)/{overview → bridge/basket}/page/react-loadable-manifest.json +0 -0
- /package/web/.next/server/app/(console)/{overview → bridge/basket}/page.js.map +0 -0
- /package/web/.next/server/app/(console)/{overview → bridge}/changes/route/build-manifest.json +0 -0
- /package/web/.next/server/app/(console)/{overview → bridge}/changes/route/server-reference-manifest.json +0 -0
- /package/web/.next/server/app/(console)/{overview → bridge}/changes/route.js.map +0 -0
- /package/web/.next/server/app/(console)/{overview/requests/[requestId] → bridge/done}/page/react-loadable-manifest.json +0 -0
- /package/web/.next/server/app/(console)/{overview/requests/[requestId] → bridge/done}/page.js.map +0 -0
- /package/web/.next/server/app/(console)/{overview → bridge}/focus/route/build-manifest.json +0 -0
- /package/web/.next/server/app/(console)/{overview → bridge}/focus/route/server-reference-manifest.json +0 -0
- /package/web/.next/server/app/(console)/{overview → bridge}/focus/route.js.map +0 -0
- /package/web/.next/server/chunks/{0b9d__next-internal_server_app_(console)_overview_focus_route_actions_10hgyjvv-6fus.js.map → 0b9d__next-internal_server_app_(console)_bridge_changes_route_actions_0hj8aqohz6bu6.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__179upda-y7uap._.js.map → [root-of-the-server]__0gnfxe62edx95._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__04_bc8g0oe4jt._.js.map → [root-of-the-server]__1yyaeeylnezpi._.js.map} +0 -0
- /package/web/.next/server/chunks/{1mb5_next-internal_server_app_(console)_overview_changes_route_actions_0zbq7lqsf5nng.js.map → web__next-internal_server_app_(console)_bridge_focus_route_actions_0syd_u8mgzdmi.js.map} +0 -0
- /package/web/.next/static/{R_nPUtDcDp1BPV3QHhaMZ → CMppMkysNciqc8k4TWwia}/_buildManifest.js +0 -0
- /package/web/.next/static/{R_nPUtDcDp1BPV3QHhaMZ → CMppMkysNciqc8k4TWwia}/_clientMiddlewareManifest.js +0 -0
- /package/web/.next/static/{R_nPUtDcDp1BPV3QHhaMZ → CMppMkysNciqc8k4TWwia}/_ssgManifest.js +0 -0
package/web/.next/server/chunks/ssr/web_features_add-server_ui_add-server_tsx_1jnmar5xju49k._.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../web/features/add-server/ui/add-server.tsx","../../../../../web/features/add-server/data%3Ab9a31b%20%3Ctext/javascript%3E","../../../../../web/features/add-server/data%3A042dd3%20%3Ctext/javascript%3E","../../../../../web/features/add-server/ui/address-step.tsx","../../../../../web/features/add-server/steps.ts","../../../../../web/features/add-server/ui/refused.tsx","../../../../../web/features/add-server/ui/steps.tsx","../../../../../web/features/add-server/ui/owner-step.tsx","../../../../../web/features/add-server/suggested-name.ts","../../../../../web/features/add-server/ui/tools-section.tsx","../../../../../web/features/add-server/tool-choice.ts","../../../../../web/features/outside-parties/ui/tool-row.tsx","../../../../../web/features/add-server/ui/sign-in-step.tsx"],"sourcesContent":["'use client';\n\nimport { useActionState, useState } from 'react';\n\nimport { approveServer, checkServer } from '../actions';\nimport { AddressStep } from './address-step';\nimport { OwnerStep } from './owner-step';\nimport { SignInStep } from './sign-in-step';\n\n/**\n * Adding an outside MCP server in three steps: its address and credential,\n * the gateway's check of the tools it answers with, then its owner. A server\n * where each person signs in is added unchecked, then the approver signs in\n * to it for themselves (M1, decision 0067). Each button says at once that its\n * step is on its way.\n */\nexport function AddServer({ fleetId, canSwitchTools }: { fleetId: string; canSwitchTools: boolean }) {\n const [checked, check] = useActionState(checkServer, { step: 'address', fields: {} });\n const [approved, approve] = useActionState(approveServer, { kind: 'idle' });\n // Going back shows the address step again, with what was sent, until the next check answers.\n const [backFrom, setBackFrom] = useState<string | undefined>(undefined);\n const owner = checked.step === 'owner' && backFrom !== checked.requestId ? checked : undefined;\n return (\n <div className=\"grid gap-4\">\n <h1 className=\"text-title font-semibold\">Add MCP server</h1>\n {approved.kind === 'added' ? (\n <SignInStep fleetId={fleetId} name={approved.name} />\n ) : owner === undefined ? (\n <AddressStep state={checked} action={check} fleetId={fleetId} />\n ) : (\n <OwnerStep state={owner} refused={approved} action={approve} onBack={() => { setBackFrom(owner.requestId); }} fleetId={fleetId} canSwitchTools={canSwitchTools} />\n )}\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"60677bc3f550873a6ee6a663c347d21258f73956e9\":{\"name\":\"approveServer\"}},\"web/features/add-server/actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_1=/*#__PURE__*/createServerReference(\"60677bc3f550873a6ee6a663c347d21258f73956e9\",callServer,void 0,findSourceMapURL,\"approveServer\");export{$$RSC_SERVER_ACTION_1 as approveServer};","/* __next_internal_action_entry_do_not_use__ [{\"602aff8b5de3a8c13f117e6954eceef8b610d28ed1\":{\"name\":\"checkServer\"}},\"web/features/add-server/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(\"602aff8b5de3a8c13f117e6954eceef8b610d28ed1\",callServer,void 0,findSourceMapURL,\"checkServer\");export{$$RSC_SERVER_ACTION_0 as checkServer};","'use client';\n\nimport { useState } from 'react';\n\nimport { FLEET_FIELD } from '../../forms/form-state';\nimport { addedCredentialKindOf, SIGN_IN_CREDENTIAL } from '../../forms/server-credential';\nimport { CredentialFields } from '../../forms/ui/credential-fields';\nimport { CARD, INPUT, LABEL } from '../../forms/ui/look';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport { stepsOf } from '../steps';\nimport { Refused } from './refused';\nimport { Steps } from './steps';\n\n/**\n * The first step: the server's address and its credential, with the check's\n * refusal where it was refused. A server where each person signs in goes on\n * to its owner with Next, unchecked; any other is checked first.\n */\nexport function AddressStep({ state, action, fleetId }: { state: { fields: Readonly<Record<string, string>>; refusal?: string | undefined }; action: (form: FormData) => void; fleetId: string }) {\n const [kind, setKind] = useState(addedCredentialKindOf(state.fields.credentialKind ?? ''));\n const isSignIn = kind === SIGN_IN_CREDENTIAL.kind;\n return (\n <>\n <Steps names={stepsOf(kind)} at={0} />\n <form action={action} className={`${CARD} grid gap-3`} data-testid=\"add-server-address\">\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <Refused refusal={state.refusal} />\n <label className={LABEL}>\n <span>Streamable HTTP address</span>\n <input className={INPUT} type=\"url\" name=\"url\" defaultValue={state.fields.url ?? ''} placeholder=\"https://mcp.example.com/mcp\" required />\n </label>\n <CredentialFields legend=\"The server's credential\" fields={state.fields} noneHelp=\"The gateway sends no credential: for a server reached only on a private network.\" canEachPersonSignIn onKindChange={setKind} />\n <div>\n <SubmitButton pending={isSignIn ? 'Next…' : 'Checking the server…'} testId=\"add-server-check\">\n {isSignIn ? 'Next' : 'Check the server'}\n </SubmitButton>\n </div>\n </form>\n </>\n );\n}\n","/**\n * The steps of adding a server, as M1 numbers them. A server where each\n * person signs in has no tools to check before someone signs in, so the\n * gateway checks its sign-in when it is added, and the approver's own sign-in\n * comes last (decision 0067, Q15).\n */\nimport { SIGN_IN_CREDENTIAL, type AddedCredentialKind } from '../forms/server-credential';\n\nexport const CHECKED_STEPS = ['Address', 'Check', 'Owner'] as const;\n\nexport const SIGN_IN_STEPS = ['Address', 'Owner', 'Sign in'] as const;\n\n/** The steps for a server with this credential. */\nexport function stepsOf(kind: AddedCredentialKind): typeof CHECKED_STEPS | typeof SIGN_IN_STEPS {\n return kind === SIGN_IN_CREDENTIAL.kind ? SIGN_IN_STEPS : CHECKED_STEPS;\n}\n","import { Outcome } from '../../forms/ui/outcome';\n\n/** Why the API refused a step, said on that step; nothing while it was not refused. */\nexport function Refused({ refusal }: { refusal: string | undefined }) {\n return refusal === undefined ? null : <Outcome state={{ kind: 'refused', message: refusal }} />;\n}\n","/** The steps of adding a server, as the design numbers them, the one at marked current. */\nexport function Steps({ names, at }: { names: readonly string[]; at: number }) {\n return (\n <ol className=\"flex gap-4\">\n {names.map((step, index) => (\n <li key={step} aria-current={index === at ? 'step' : undefined} className={index <= at ? 'font-medium' : 'text-muted-foreground'}>\n {index + 1} {step}\n </li>\n ))}\n </ol>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\n\nimport { FLEET_FIELD } from '../../forms/form-state';\nimport { BUTTONS, CARD, INPUT, LABEL } from '../../forms/ui/look';\nimport { OwnerField } from '../../forms/ui/owner-field';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport type { AddServerState, ApproveState } from '../actions';\nimport { CHECKED_STEPS, SIGN_IN_STEPS } from '../steps';\nimport { addButtonLabel, suggestedName } from '../suggested-name';\nimport { Refused } from './refused';\nimport { Steps } from './steps';\nimport { ToolsSection } from './tools-section';\n\nconst CONCURRENCY_LIMIT_DEFAULT = '4';\n\n/** The credential fields, carried on from the address step to the owner step. */\nconst CARRIED_FIELDS = ['url', 'credentialKind', 'token', 'clientId', 'clientSecret', 'issuer', 'scope'] as const;\n\n/**\n * The step that names the server's proxy ship and its owner, below the tools\n * the check answered. A server where each person signs in has no tools to\n * show yet: Add checks its sign-in, and says a refusal in place.\n */\nexport function OwnerStep({ state, refused, action, onBack, fleetId, canSwitchTools }: { state: Extract<AddServerState, { step: 'owner' }>; refused: ApproveState; action: (form: FormData) => void; onBack: () => void; fleetId: string; canSwitchTools: boolean }) {\n // A refused approval of this check shows what the browser sent, and why.\n const isRefused = refused.kind === 'refused' && refused.requestId === state.requestId;\n const fields = isRefused ? refused.fields : state.fields;\n const url = fields.url ?? '';\n const [name, setName] = useState(fields.name ?? suggestedName(url));\n const tools = state.tools;\n return (\n <>\n {tools === null ? <Steps names={SIGN_IN_STEPS} at={1} /> : <Steps names={CHECKED_STEPS} at={2} />}\n <form action={action} className={`${CARD} grid gap-3`} data-testid=\"add-server-owner\">\n {tools === null ? null : <ToolsSection tools={tools} canSwitch={canSwitchTools} />}\n <h2 className=\"text-section font-semibold\">Its owner</h2>\n <Refused refusal={isRefused ? refused.message : undefined} />\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <input type=\"hidden\" name=\"requestId\" value={state.requestId} />\n {CARRIED_FIELDS.map((field) => (\n <input key={field} type=\"hidden\" name={field} value={fields[field] ?? ''} />\n ))}\n <p className=\"font-mono text-muted-foreground\">{url}</p>\n <label className={LABEL}>\n <span>Proxy ship's name</span>\n <input className={INPUT} type=\"text\" name=\"name\" value={name} onChange={(event) => { setName(event.target.value); }} required />\n </label>\n <OwnerField choices={state.owners} current={state.owners.find((owner) => owner.shipId === fields.ownerShipId) ?? null} help=\"A person ship or argo. It answers for this server.\" />\n <label className={LABEL}>\n <span>Calls at once</span>\n <input className={INPUT} type=\"number\" name=\"concurrencyLimit\" min={1} max={10} defaultValue={fields.concurrencyLimit ?? CONCURRENCY_LIMIT_DEFAULT} />\n </label>\n {tools === null ? <p className=\"text-muted-foreground\">Its tools show once someone signs in.</p> : null}\n <div className=\"flex gap-2\">\n <SubmitButton pending={tools === null ? 'Checking the sign-in…' : 'Adding…'} testId=\"add-server-approve\">\n {addButtonLabel(name)}\n </SubmitButton>\n <button type=\"button\" className={BUTTONS.secondary} onClick={onBack}>\n Back to the address\n </button>\n </div>\n </form>\n </>\n );\n}\n","/** The most characters of the proxy ship's name the add button shows. */\nconst BUTTON_NAME_MAX_LENGTH = 20;\n\n/** A proxy ship's name offered from a server's address: its host's first name that says whose it is; none for an IP address, whose numbers say nothing of it. */\nexport function suggestedName(url: string): string {\n if (!URL.canParse(url)) {\n return '';\n }\n const { hostname } = new URL(url);\n // URL writes every IPv4 host as four numbers, and keeps an IPv6 host in its brackets; the browser runs this too, so no node:net.\n if (/^\\d+(\\.\\d+){3}$/.test(hostname) || hostname.startsWith('[')) {\n return '';\n }\n const labels = hostname.split('.').filter((label) => label !== 'mcp' && label !== 'www');\n return (labels[0] ?? '').toLowerCase().replaceAll(/[^a-z0-9]+/g, '-').replaceAll(/^-+|-+$/g, '');\n}\n\n/** The add button's words: the proxy ship's name as typed, cut at 20 characters, or the plain words while none is typed. */\nexport function addButtonLabel(name: string): string {\n const typed = name.trim();\n if (typed === '') {\n return 'Add as outside party';\n }\n return typed.length > BUTTON_NAME_MAX_LENGTH ? `Add ${typed.slice(0, BUTTON_NAME_MAX_LENGTH)}…` : `Add ${typed}`;\n}\n","'use client';\n\nimport { useState } from 'react';\n\nimport { Switch } from '../../forms/ui/switch';\nimport { ToolRow } from '../../outside-parties/ui/tool-row';\nimport type { CheckedTool } from '../actions';\nimport { TOOL_ON_FIELD, TOOL_SHOWN_FIELD } from '../tool-choice';\n\n/**\n * The tools the check answered, one row each. An approver switches each on\n * or off, all on to start; the fleet may call only those on (aeolus-fleet#1151).\n * Without gateway:approve they show without switches, and every tool starts on.\n */\nexport function ToolsSection({ tools, canSwitch }: { tools: CheckedTool[]; canSwitch: boolean }) {\n const [off, setOff] = useState<ReadonlySet<string>>(new Set());\n const onCount = tools.length - off.size;\n const flip = (name: string) => {\n setOff((current) => {\n const next = new Set(current);\n if (!next.delete(name)) {\n next.add(name);\n }\n return next;\n });\n };\n return (\n <section className=\"grid gap-2\" data-testid=\"add-server-tools\">\n <h2 className=\"flex flex-wrap justify-between gap-2 text-section font-semibold\">\n <span>\n The server answers: {tools.length} {tools.length === 1 ? 'tool' : 'tools'}\n </span>\n {canSwitch ? (\n <span role=\"status\" className=\"font-normal text-muted-foreground\" data-testid=\"add-server-tools-on\">\n {onCount} of {tools.length} on\n </span>\n ) : null}\n </h2>\n <p className=\"text-muted-foreground\">{canSwitch ? 'The fleet may call only the tools switched on. A tool the server adds later starts off.' : 'Switching tools needs gateway:approve: every tool starts on, and an approver switches them on its page.'}</p>\n <ul className=\"grid\">\n {tools.map((tool) => {\n const isOn = !off.has(tool.name);\n return (\n <ToolRow\n key={tool.name}\n tool={tool}\n testId=\"add-server-tool\"\n control={\n canSwitch ? (\n <>\n <input type=\"hidden\" name={TOOL_SHOWN_FIELD} value={tool.name} />\n {isOn ? <input type=\"hidden\" name={TOOL_ON_FIELD} value={tool.name} /> : null}\n <Switch isOn={isOn} label={tool.name} onClick={() => { flip(tool.name); }} />\n </>\n ) : null\n }\n />\n );\n })}\n </ul>\n </section>\n );\n}\n","/**\n * The tools an approver switched when adding a server (aeolus-fleet#1151):\n * each tool the check answered is sent as shown, and the ticked ones as on.\n */\n\n/** The field naming each tool whose switch the form showed. */\nexport const TOOL_SHOWN_FIELD = 'toolShown';\n\n/** The field naming each tool ticked on. */\nexport const TOOL_ON_FIELD = 'toolOn';\n\nfunction namesIn(form: FormData, field: string): string[] {\n return form.getAll(field).filter((value) => typeof value === 'string');\n}\n\n/** Each tool shown, on or off; none when the form showed no switch, so the server keeps every tool on. */\nexport function toolChoiceOf(form: FormData): { name: string; isOn: boolean }[] | undefined {\n const shown = namesIn(form, TOOL_SHOWN_FIELD);\n if (shown.length === 0) {\n return undefined;\n }\n const on = new Set(namesIn(form, TOOL_ON_FIELD));\n return shown.map((name) => ({ name, isOn: on.has(name) }));\n}\n\n/** A description's first line with words, as a tool's row shows it before it is opened. */\nexport function firstLineOf(description: string): string {\n return description.split('\\n').map((line) => line.trim()).find((line) => line !== '') ?? '';\n}\n","import type { ReactNode } from 'react';\n\nimport { firstLineOf } from '../../add-server/tool-choice';\nimport { StatusBadge, Tag } from './status-badge';\n\n/** A tool of an outside MCP server, as its row shows it. */\nexport interface ShownTool {\n name: string;\n description?: string | undefined;\n isReadOnly: boolean;\n isNew?: boolean;\n}\n\n/**\n * One tool in a list an approver scans (aeolus-fleet#1151): its switch, its\n * name, whether the server says it reads only, whether it is new, and its\n * description's first line, the whole description folded open on a click.\n */\nexport function ToolRow({ tool, control, testId }: { tool: ShownTool; control: ReactNode; testId?: string }) {\n const { name, description, isReadOnly, isNew = false } = tool;\n const firstLine = description === undefined ? '' : firstLineOf(description);\n const isFolded = description !== undefined && description.trim() !== firstLine;\n return (\n <li className=\"grid gap-1 border-b border-border py-2 last:border-b-0\" data-testid={testId}>\n <div className=\"flex flex-wrap items-center gap-2\">\n {control}\n <span className=\"font-mono\">{name}</span>\n {isReadOnly ? <Tag>reads only</Tag> : null}\n {isNew ? <StatusBadge tone=\"attention\" label=\"New\" /> : null}\n </div>\n {firstLine === '' ? null : isFolded ? (\n <details className=\"text-muted-foreground\">\n <summary className=\"cursor-pointer\">{firstLine}</summary>\n <p className=\"mt-1 whitespace-pre-line\">{description}</p>\n </details>\n ) : (\n <p className=\"text-muted-foreground\">{firstLine}</p>\n )}\n </li>\n );\n}\n","'use client';\n\nimport { useActionState } from 'react';\n\nimport { FLEET_FIELD, IDLE } from '../../forms/form-state';\nimport { BUTTONS, CARD } from '../../forms/ui/look';\nimport { Outcome } from '../../forms/ui/outcome';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport { inFleet } from '../../../lib/gateway-api/page-account';\nimport { partyPath } from '../../outside-parties/paths';\nimport { signInToParty } from '../../outside-party/actions';\nimport { SIGN_IN_STEPS } from '../steps';\nimport { Steps } from './steps';\n\n/**\n * The last step of adding a server where each person signs in: the\n * approver signs in to it for themselves, and their sign-in reads its tools\n * (Q15). Later goes to its page, where they sign in when they choose.\n */\nexport function SignInStep({ fleetId, name }: { fleetId: string; name: string }) {\n const [refused, signIn] = useActionState(signInToParty, IDLE);\n return (\n <>\n <Steps names={SIGN_IN_STEPS} at={2} />\n <form action={signIn} className={`${CARD} grid gap-3`} data-testid=\"add-server-sign-in\">\n <Outcome state={{ kind: 'done', message: `${name} is added.` }} />\n <Outcome state={refused} />\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <input type=\"hidden\" name=\"name\" value={name} />\n <p>Sign in to {name} for yourself. Its tools show after the first sign-in.</p>\n <div className=\"flex gap-2\">\n <SubmitButton pending={`Opening ${name}…`} testId=\"add-server-sign-in-start\">\n Sign in to {name}\n </SubmitButton>\n <a href={inFleet(partyPath(name), fleetId)} className={BUTTONS.secondary}>\n Later\n </a>\n </div>\n </form>\n </>\n );\n}\n"],"names":["$$RSC_SERVER_ACTION_1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/add-server/ui/add-server.tsx","../../../../../web/features/add-server/data%3Af67749%20%3Ctext/javascript%3E","../../../../../web/features/add-server/data%3A2a803c%20%3Ctext/javascript%3E","../../../../../web/features/add-server/ui/address-step.tsx","../../../../../web/features/add-server/steps.ts","../../../../../web/features/add-server/ui/refused.tsx","../../../../../web/features/add-server/ui/steps.tsx","../../../../../web/features/add-server/ui/owner-step.tsx","../../../../../web/features/add-server/suggested-name.ts","../../../../../web/features/add-server/ui/tools-section.tsx","../../../../../web/features/add-server/tool-choice.ts","../../../../../web/features/outside-parties/ui/tool-row.tsx","../../../../../web/features/add-server/ui/sign-in-step.tsx"],"sourcesContent":["'use client';\n\nimport { useActionState, useState } from 'react';\n\nimport { approveServer, checkServer } from '../actions';\nimport { AddressStep } from './address-step';\nimport { OwnerStep } from './owner-step';\nimport { SignInStep } from './sign-in-step';\n\n/**\n * Adding an outside MCP server in three steps: its address and credential,\n * the gateway's check of the tools it answers with, then its owner. A server\n * where each person signs in is added unchecked, then the approver signs in\n * to it for themselves (M1, decision 0067). Each button says at once that its\n * step is on its way.\n */\nexport function AddServer({ fleetId, canSwitchTools }: { fleetId: string; canSwitchTools: boolean }) {\n const [checked, check] = useActionState(checkServer, { step: 'address', fields: {} });\n const [approved, approve] = useActionState(approveServer, { kind: 'idle' });\n // Going back shows the address step again, with what was sent, until the next check answers.\n const [backFrom, setBackFrom] = useState<string | undefined>(undefined);\n const owner = checked.step === 'owner' && backFrom !== checked.requestId ? checked : undefined;\n return (\n <div className=\"grid gap-4\">\n <h1 className=\"text-title font-semibold\">Add MCP server</h1>\n {approved.kind === 'added' ? (\n <SignInStep fleetId={fleetId} name={approved.name} />\n ) : owner === undefined ? (\n <AddressStep state={checked} action={check} fleetId={fleetId} />\n ) : (\n <OwnerStep state={owner} refused={approved} action={approve} onBack={() => { setBackFrom(owner.requestId); }} fleetId={fleetId} canSwitchTools={canSwitchTools} />\n )}\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"603c1c8bc58d771628bd6e97e00ea17b677893c09e\":{\"name\":\"approveServer\"}},\"web/features/add-server/actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_1=/*#__PURE__*/createServerReference(\"603c1c8bc58d771628bd6e97e00ea17b677893c09e\",callServer,void 0,findSourceMapURL,\"approveServer\");export{$$RSC_SERVER_ACTION_1 as approveServer};","/* __next_internal_action_entry_do_not_use__ [{\"60d88dd4308d5d5dab2e7b91e11e99a312ec2cffe2\":{\"name\":\"checkServer\"}},\"web/features/add-server/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(\"60d88dd4308d5d5dab2e7b91e11e99a312ec2cffe2\",callServer,void 0,findSourceMapURL,\"checkServer\");export{$$RSC_SERVER_ACTION_0 as checkServer};","'use client';\n\nimport { useState } from 'react';\n\nimport { FLEET_FIELD } from '../../forms/form-state';\nimport { addedCredentialKindOf, SIGN_IN_CREDENTIAL } from '../../forms/server-credential';\nimport { CredentialFields } from '../../forms/ui/credential-fields';\nimport { CARD, INPUT, LABEL } from '../../forms/ui/look';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport { stepsOf } from '../steps';\nimport { Refused } from './refused';\nimport { Steps } from './steps';\n\n/**\n * The first step: the server's address and its credential, with the check's\n * refusal where it was refused. A server where each person signs in goes on\n * to its owner with Next, unchecked; any other is checked first.\n */\nexport function AddressStep({ state, action, fleetId }: { state: { fields: Readonly<Record<string, string>>; refusal?: string | undefined }; action: (form: FormData) => void; fleetId: string }) {\n const [kind, setKind] = useState(addedCredentialKindOf(state.fields.credentialKind ?? ''));\n const isSignIn = kind === SIGN_IN_CREDENTIAL.kind;\n return (\n <>\n <Steps names={stepsOf(kind)} at={0} />\n <form action={action} className={`${CARD} grid gap-3`} data-testid=\"add-server-address\">\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <Refused refusal={state.refusal} />\n <label className={LABEL}>\n <span>Streamable HTTP address</span>\n <input className={INPUT} type=\"url\" name=\"url\" defaultValue={state.fields.url ?? ''} placeholder=\"https://mcp.example.com/mcp\" required />\n </label>\n <CredentialFields legend=\"The server's credential\" fields={state.fields} noneHelp=\"The gateway sends no credential: for a server reached only on a private network.\" canEachPersonSignIn onKindChange={setKind} />\n <div>\n <SubmitButton pending={isSignIn ? 'Next…' : 'Checking the server…'} testId=\"add-server-check\">\n {isSignIn ? 'Next' : 'Check the server'}\n </SubmitButton>\n </div>\n </form>\n </>\n );\n}\n","/**\n * The steps of adding a server, as M1 numbers them. A server where each\n * person signs in has no tools to check before someone signs in, so the\n * gateway checks its sign-in when it is added, and the approver's own sign-in\n * comes last (decision 0067, Q15).\n */\nimport { SIGN_IN_CREDENTIAL, type AddedCredentialKind } from '../forms/server-credential';\n\nexport const CHECKED_STEPS = ['Address', 'Check', 'Owner'] as const;\n\nexport const SIGN_IN_STEPS = ['Address', 'Owner', 'Sign in'] as const;\n\n/** The steps for a server with this credential. */\nexport function stepsOf(kind: AddedCredentialKind): typeof CHECKED_STEPS | typeof SIGN_IN_STEPS {\n return kind === SIGN_IN_CREDENTIAL.kind ? SIGN_IN_STEPS : CHECKED_STEPS;\n}\n","import { Outcome } from '../../forms/ui/outcome';\n\n/** Why the API refused a step, said on that step; nothing while it was not refused. */\nexport function Refused({ refusal }: { refusal: string | undefined }) {\n return refusal === undefined ? null : <Outcome state={{ kind: 'refused', message: refusal }} />;\n}\n","/** The steps of adding a server, as the design numbers them, the one at marked current. */\nexport function Steps({ names, at }: { names: readonly string[]; at: number }) {\n return (\n <ol className=\"flex gap-4\">\n {names.map((step, index) => (\n <li key={step} aria-current={index === at ? 'step' : undefined} className={index <= at ? 'font-medium' : 'text-muted-foreground'}>\n {index + 1} {step}\n </li>\n ))}\n </ol>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\n\nimport { FLEET_FIELD } from '../../forms/form-state';\nimport { BUTTONS, CARD, INPUT, LABEL } from '../../forms/ui/look';\nimport { OwnerField } from '../../forms/ui/owner-field';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport type { AddServerState, ApproveState } from '../actions';\nimport { CHECKED_STEPS, SIGN_IN_STEPS } from '../steps';\nimport { addButtonLabel, suggestedName } from '../suggested-name';\nimport { Refused } from './refused';\nimport { Steps } from './steps';\nimport { ToolsSection } from './tools-section';\n\nconst CONCURRENCY_LIMIT_DEFAULT = '4';\n\n/** The credential fields, carried on from the address step to the owner step. */\nconst CARRIED_FIELDS = ['url', 'credentialKind', 'token', 'clientId', 'clientSecret', 'issuer', 'scope'] as const;\n\n/**\n * The step that names the server's proxy ship and its owner, below the tools\n * the check answered. A server where each person signs in has no tools to\n * show yet: Add checks its sign-in, and says a refusal in place.\n */\nexport function OwnerStep({ state, refused, action, onBack, fleetId, canSwitchTools }: { state: Extract<AddServerState, { step: 'owner' }>; refused: ApproveState; action: (form: FormData) => void; onBack: () => void; fleetId: string; canSwitchTools: boolean }) {\n // A refused approval of this check shows what the browser sent, and why.\n const isRefused = refused.kind === 'refused' && refused.requestId === state.requestId;\n const fields = isRefused ? refused.fields : state.fields;\n const url = fields.url ?? '';\n const [name, setName] = useState(fields.name ?? suggestedName(url));\n const tools = state.tools;\n return (\n <>\n {tools === null ? <Steps names={SIGN_IN_STEPS} at={1} /> : <Steps names={CHECKED_STEPS} at={2} />}\n <form action={action} className={`${CARD} grid gap-3`} data-testid=\"add-server-owner\">\n {tools === null ? null : <ToolsSection tools={tools} canSwitch={canSwitchTools} />}\n <h2 className=\"text-section font-semibold\">Its owner</h2>\n <Refused refusal={isRefused ? refused.message : undefined} />\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <input type=\"hidden\" name=\"requestId\" value={state.requestId} />\n {CARRIED_FIELDS.map((field) => (\n <input key={field} type=\"hidden\" name={field} value={fields[field] ?? ''} />\n ))}\n <p className=\"font-mono text-muted-foreground\">{url}</p>\n <label className={LABEL}>\n <span>Proxy ship's name</span>\n <input className={INPUT} type=\"text\" name=\"name\" value={name} onChange={(event) => { setName(event.target.value); }} required />\n </label>\n <OwnerField choices={state.owners} current={state.owners.find((owner) => owner.shipId === fields.ownerShipId) ?? null} help=\"A person ship or argo. It answers for this server.\" />\n <label className={LABEL}>\n <span>Calls at once</span>\n <input className={INPUT} type=\"number\" name=\"concurrencyLimit\" min={1} max={10} defaultValue={fields.concurrencyLimit ?? CONCURRENCY_LIMIT_DEFAULT} />\n </label>\n {tools === null ? <p className=\"text-muted-foreground\">Its tools show once someone signs in.</p> : null}\n <div className=\"flex gap-2\">\n <SubmitButton pending={tools === null ? 'Checking the sign-in…' : 'Adding…'} testId=\"add-server-approve\">\n {addButtonLabel(name)}\n </SubmitButton>\n <button type=\"button\" className={BUTTONS.secondary} onClick={onBack}>\n Back to the address\n </button>\n </div>\n </form>\n </>\n );\n}\n","/** The most characters of the proxy ship's name the add button shows. */\nconst BUTTON_NAME_MAX_LENGTH = 20;\n\n/** A proxy ship's name offered from a server's address: its host's first name that says whose it is; none for an IP address, whose numbers say nothing of it. */\nexport function suggestedName(url: string): string {\n if (!URL.canParse(url)) {\n return '';\n }\n const { hostname } = new URL(url);\n // URL writes every IPv4 host as four numbers, and keeps an IPv6 host in its brackets; the browser runs this too, so no node:net.\n if (/^\\d+(\\.\\d+){3}$/.test(hostname) || hostname.startsWith('[')) {\n return '';\n }\n const labels = hostname.split('.').filter((label) => label !== 'mcp' && label !== 'www');\n return (labels[0] ?? '').toLowerCase().replaceAll(/[^a-z0-9]+/g, '-').replaceAll(/^-+|-+$/g, '');\n}\n\n/** The add button's words: the proxy ship's name as typed, cut at 20 characters, or the plain words while none is typed. */\nexport function addButtonLabel(name: string): string {\n const typed = name.trim();\n if (typed === '') {\n return 'Add as outside party';\n }\n return typed.length > BUTTON_NAME_MAX_LENGTH ? `Add ${typed.slice(0, BUTTON_NAME_MAX_LENGTH)}…` : `Add ${typed}`;\n}\n","'use client';\n\nimport { useState } from 'react';\n\nimport { Switch } from '../../forms/ui/switch';\nimport { ToolRow } from '../../outside-parties/ui/tool-row';\nimport type { CheckedTool } from '../actions';\nimport { TOOL_ON_FIELD, TOOL_SHOWN_FIELD } from '../tool-choice';\n\n/**\n * The tools the check answered, one row each. An approver switches each on\n * or off, all on to start; the fleet may call only those on (aeolus-fleet#1151).\n * Without gateway:approve they show without switches, and every tool starts on.\n */\nexport function ToolsSection({ tools, canSwitch }: { tools: CheckedTool[]; canSwitch: boolean }) {\n const [off, setOff] = useState<ReadonlySet<string>>(new Set());\n const onCount = tools.length - off.size;\n const flip = (name: string) => {\n setOff((current) => {\n const next = new Set(current);\n if (!next.delete(name)) {\n next.add(name);\n }\n return next;\n });\n };\n return (\n <section className=\"grid gap-2\" data-testid=\"add-server-tools\">\n <h2 className=\"flex flex-wrap justify-between gap-2 text-section font-semibold\">\n <span>\n The server answers: {tools.length} {tools.length === 1 ? 'tool' : 'tools'}\n </span>\n {canSwitch ? (\n <span role=\"status\" className=\"font-normal text-muted-foreground\" data-testid=\"add-server-tools-on\">\n {onCount} of {tools.length} on\n </span>\n ) : null}\n </h2>\n <p className=\"text-muted-foreground\">{canSwitch ? 'The fleet may call only the tools switched on. A tool the server adds later starts off.' : 'Switching tools needs gateway:approve: every tool starts on, and an approver switches them on its page.'}</p>\n <ul className=\"grid\">\n {tools.map((tool) => {\n const isOn = !off.has(tool.name);\n return (\n <ToolRow\n key={tool.name}\n tool={tool}\n testId=\"add-server-tool\"\n control={\n canSwitch ? (\n <>\n <input type=\"hidden\" name={TOOL_SHOWN_FIELD} value={tool.name} />\n {isOn ? <input type=\"hidden\" name={TOOL_ON_FIELD} value={tool.name} /> : null}\n <Switch isOn={isOn} label={tool.name} onClick={() => { flip(tool.name); }} />\n </>\n ) : null\n }\n />\n );\n })}\n </ul>\n </section>\n );\n}\n","/**\n * The tools an approver switched when adding a server (aeolus-fleet#1151):\n * each tool the check answered is sent as shown, and the ticked ones as on.\n */\n\n/** The field naming each tool whose switch the form showed. */\nexport const TOOL_SHOWN_FIELD = 'toolShown';\n\n/** The field naming each tool ticked on. */\nexport const TOOL_ON_FIELD = 'toolOn';\n\nfunction namesIn(form: FormData, field: string): string[] {\n return form.getAll(field).filter((value) => typeof value === 'string');\n}\n\n/** Each tool shown, on or off; none when the form showed no switch, so the server keeps every tool on. */\nexport function toolChoiceOf(form: FormData): { name: string; isOn: boolean }[] | undefined {\n const shown = namesIn(form, TOOL_SHOWN_FIELD);\n if (shown.length === 0) {\n return undefined;\n }\n const on = new Set(namesIn(form, TOOL_ON_FIELD));\n return shown.map((name) => ({ name, isOn: on.has(name) }));\n}\n\n/** A description's first line with words, as a tool's row shows it before it is opened. */\nexport function firstLineOf(description: string): string {\n return description.split('\\n').map((line) => line.trim()).find((line) => line !== '') ?? '';\n}\n","import type { ReactNode } from 'react';\n\nimport { firstLineOf } from '../../add-server/tool-choice';\nimport { StatusBadge, Tag } from './status-badge';\n\n/** A tool of an outside MCP server, as its row shows it. */\nexport interface ShownTool {\n name: string;\n description?: string | undefined;\n isReadOnly: boolean;\n isNew?: boolean;\n}\n\n/**\n * One tool in a list an approver scans (aeolus-fleet#1151): its switch, its\n * name, whether the server says it reads only, whether it is new, and its\n * description's first line, the whole description folded open on a click.\n */\nexport function ToolRow({ tool, control, testId }: { tool: ShownTool; control: ReactNode; testId?: string }) {\n const { name, description, isReadOnly, isNew = false } = tool;\n const firstLine = description === undefined ? '' : firstLineOf(description);\n const isFolded = description !== undefined && description.trim() !== firstLine;\n return (\n <li className=\"grid gap-1 border-b border-border py-2 last:border-b-0\" data-testid={testId}>\n <div className=\"flex flex-wrap items-center gap-2\">\n {control}\n <span className=\"font-mono\">{name}</span>\n {isReadOnly ? <Tag>reads only</Tag> : null}\n {isNew ? <StatusBadge tone=\"attention\" label=\"New\" /> : null}\n </div>\n {firstLine === '' ? null : isFolded ? (\n <details className=\"text-muted-foreground\">\n <summary className=\"cursor-pointer\">{firstLine}</summary>\n <p className=\"mt-1 whitespace-pre-line\">{description}</p>\n </details>\n ) : (\n <p className=\"text-muted-foreground\">{firstLine}</p>\n )}\n </li>\n );\n}\n","'use client';\n\nimport { useActionState } from 'react';\n\nimport { FLEET_FIELD, IDLE } from '../../forms/form-state';\nimport { BUTTONS, CARD } from '../../forms/ui/look';\nimport { Outcome } from '../../forms/ui/outcome';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport { inFleet } from '../../../lib/gateway-api/page-account';\nimport { partyPath } from '../../outside-parties/paths';\nimport { signInToParty } from '../../outside-party/actions';\nimport { SIGN_IN_STEPS } from '../steps';\nimport { Steps } from './steps';\n\n/**\n * The last step of adding a server where each person signs in: the\n * approver signs in to it for themselves, and their sign-in reads its tools\n * (Q15). Later goes to its page, where they sign in when they choose.\n */\nexport function SignInStep({ fleetId, name }: { fleetId: string; name: string }) {\n const [refused, signIn] = useActionState(signInToParty, IDLE);\n return (\n <>\n <Steps names={SIGN_IN_STEPS} at={2} />\n <form action={signIn} className={`${CARD} grid gap-3`} data-testid=\"add-server-sign-in\">\n <Outcome state={{ kind: 'done', message: `${name} is added.` }} />\n <Outcome state={refused} />\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <input type=\"hidden\" name=\"name\" value={name} />\n <p>Sign in to {name} for yourself. Its tools show after the first sign-in.</p>\n <div className=\"flex gap-2\">\n <SubmitButton pending={`Opening ${name}…`} testId=\"add-server-sign-in-start\">\n Sign in to {name}\n </SubmitButton>\n <a href={inFleet(partyPath(name), fleetId)} className={BUTTONS.secondary}>\n Later\n </a>\n </div>\n </form>\n </>\n );\n}\n"],"names":["$$RSC_SERVER_ACTION_1"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
(()=>{"use strict";module.exports=[16550,a=>{a.s(["H",0,"/bridge/basket","T",0,"/bridge/settings"])},3656,a=>{var b=a.i(72131),c=a.i(50944);a.s(["LiveRefresh",0,function({fleetId:a}){let d;return d=(0,c.useRouter)(),(0,b.useEffect)(()=>{let b=new EventSource(`/bridge/changes?fleet=${encodeURIComponent(a)}`);return b.onmessage=()=>{d.refresh()},()=>{b.close()}},[a,d]),(0,b.useEffect)(()=>{let b,c=()=>{let c="visible"===document.visibilityState&&document.hasFocus();c&&void 0===b?b=new EventSource(`/bridge/focus?fleet=${encodeURIComponent(a)}`):c||void 0===b||(b.close(),b=void 0)};return c(),window.addEventListener("focus",c),window.addEventListener("blur",c),document.addEventListener("visibilitychange",c),()=>{window.removeEventListener("focus",c),window.removeEventListener("blur",c),document.removeEventListener("visibilitychange",c),b?.close()}},[a]),null}],3656)},32043,a=>{var b=a.i(87924);let c={primary:"bg-primary text-primary-foreground hover:bg-primary-hover",secondary:"border border-border bg-card text-card-foreground hover:bg-accent"};a.s(["f",0,function({isPending:a,pendingLabel:d,variant:e="secondary",children:f,className:g="",disabled:h,...i}){return(0,b.jsx)("button",{...i,disabled:!0===h||a,"aria-busy":a,className:`inline-flex h-9 items-center gap-2 rounded-md px-4 disabled:cursor-not-allowed disabled:opacity-70 ${c[e]} ${g}`,children:a?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{"aria-hidden":"true",className:"size-3.5 animate-spin rounded-full border-2 border-current border-t-transparent"}),d]}):f})}])},10039,a=>{var b=a.i(87924);a.s(["f",0,function({message:a,isFailure:c}){return c?(0,b.jsx)("p",{role:"alert","data-testid":"bridge-failure",className:"rounded-md border border-tone-attention-border bg-tone-attention-bg px-3 py-2 text-tone-attention-fg",children:a}):(0,b.jsx)("p",{role:"status","data-testid":"bridge-success",className:"rounded-md border border-tone-ok-border bg-tone-ok-bg px-3 py-2 text-tone-ok-fg",children:a})}])}]})();
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=web_features_bridge_0-mhu0jaig2u3._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/bridge/paths.ts","../../../../../web/features/bridge/hooks/use-focus-report.ts","../../../../../web/features/bridge/hooks/use-live-refresh.ts","../../../../../web/features/bridge/state/live-refresh.tsx","../../../../../web/features/bridge/ui/action-button.tsx","../../../../../web/features/bridge/ui/notice.tsx"],"sourcesContent":["/** Bridge's pages (docs/design/bridge): home, the basket, Done, Bridge's settings and where things show; a module of their own, so a page in the browser names them too. */\nexport const BRIDGE_PATH = '/bridge';\nexport const BRIDGE_BASKET_PATH = '/bridge/basket';\nexport const BRIDGE_DONE_PATH = '/bridge/done';\nexport const BRIDGE_SETTINGS_PATH = '/bridge/settings';\nexport const BRIDGE_ROUTING_PATH = '/bridge/settings/routing';\n","'use client';\n\nimport { useEffect } from 'react';\n\n/** The stream the page holds while in focus, which the web app's server follows on the gateway's API for the browser. */\nexport const FOCUS_PATH = '/bridge/focus';\n\n/**\n * Tells the gateway while the page is in focus (wake a person, W6): it holds\n * the focus stream open while the window has focus and the page shows, and\n * closes it when either ends. While a page of the person is in focus, what\n * arrives is shown there and no wake goes out; an open page not in focus\n * changes nothing. A lost connection no longer counts as in focus.\n */\nexport function useFocusReport(fleetId: string): void {\n useEffect(() => {\n let focus: EventSource | undefined;\n const report = () => {\n const isInFocus = document.visibilityState === 'visible' && document.hasFocus();\n if (isInFocus && focus === undefined) {\n focus = new EventSource(`${FOCUS_PATH}?fleet=${encodeURIComponent(fleetId)}`);\n } else if (!isInFocus && focus !== undefined) {\n focus.close();\n focus = undefined;\n }\n };\n report();\n window.addEventListener('focus', report);\n window.addEventListener('blur', report);\n document.addEventListener('visibilitychange', report);\n return () => {\n window.removeEventListener('focus', report);\n window.removeEventListener('blur', report);\n document.removeEventListener('visibilitychange', report);\n focus?.close();\n };\n }, [fleetId]);\n}\n","'use client';\n\nimport { useRouter } from 'next/navigation';\nimport { useEffect } from 'react';\n\n/** The page's live updates, which the web app's server follows on the gateway's API for the browser. */\nexport const CHANGES_PATH = '/bridge/changes';\n\n/**\n * Keeps the page in step with its fleet's requests: whenever one changes,\n * the page reads itself again on the server, as its own caller. The browser\n * opens the stream again by itself when it drops.\n */\nexport function useLiveRefresh(fleetId: string): void {\n const router = useRouter();\n useEffect(() => {\n const changes = new EventSource(`${CHANGES_PATH}?fleet=${encodeURIComponent(fleetId)}`);\n changes.onmessage = () => {\n router.refresh();\n };\n return () => {\n changes.close();\n };\n }, [fleetId, router]);\n}\n","'use client';\n\nimport { useFocusReport } from '../hooks/use-focus-report';\nimport { useLiveRefresh } from '../hooks/use-live-refresh';\n\n/** Keeps the page it sits in live, and tells the gateway while it is in focus (wake a person, W6): it shows nothing itself. */\nexport function LiveRefresh({ fleetId }: { fleetId: string }) {\n useLiveRefresh(fleetId);\n useFocusReport(fleetId);\n return null;\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\n\nconst VARIANTS = {\n primary: 'bg-primary text-primary-foreground hover:bg-primary-hover',\n secondary: 'border border-border bg-card text-card-foreground hover:bg-accent',\n} as const;\n\n/**\n * A button for an action: the moment it is pressed and until the answer\n * comes, it shows a spinner and its working label, and cannot run twice.\n */\nexport function ActionButton({\n isPending,\n pendingLabel,\n variant = 'secondary',\n children,\n className = '',\n disabled,\n ...button\n}: ButtonHTMLAttributes<HTMLButtonElement> & { isPending: boolean; pendingLabel: string; variant?: keyof typeof VARIANTS; children: ReactNode }) {\n return (\n <button\n {...button}\n disabled={disabled === true || isPending}\n aria-busy={isPending}\n className={`inline-flex h-9 items-center gap-2 rounded-md px-4 disabled:cursor-not-allowed disabled:opacity-70 ${VARIANTS[variant]} ${className}`}\n >\n {isPending ? (\n <>\n <span aria-hidden=\"true\" className=\"size-3.5 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n {pendingLabel}\n </>\n ) : (\n children\n )}\n </button>\n );\n}\n","/** What an action came to, said in place: a success as a status, a failure as an alert by the control. */\nexport function Notice({ message, isFailure }: { message: string; isFailure: boolean }) {\n return isFailure ? (\n <p role=\"alert\" data-testid=\"bridge-failure\" className=\"rounded-md border border-tone-attention-border bg-tone-attention-bg px-3 py-2 text-tone-attention-fg\">\n {message}\n </p>\n ) : (\n <p role=\"status\" data-testid=\"bridge-success\" className=\"rounded-md border border-tone-ok-border bg-tone-ok-bg px-3 py-2 text-tone-ok-fg\">\n {message}\n </p>\n );\n}\n"],"names":["BRIDGE_PATH","BRIDGE_BASKET_PATH","BRIDGE_DONE_PATH","BRIDGE_SETTINGS_PATH","BRIDGE_ROUTING_PATH","FOCUS_PATH","useFocusReport","fleetId","focus","report","isInFocus","document","visibilityState","hasFocus","undefined","EventSource","encodeURIComponent","close","window","addEventListener","removeEventListener","VARIANTS","primary","secondary","ActionButton","isPending","pendingLabel","variant","children","className","disabled","button","Notice","message","isFailure","role"],"mappings":"wDAEkC,uBAEE,+BCFpC,IAAA,EAAA,EAAA,CAAA,CAAA,OCAA,EAAA,EAAA,CAAA,CAAA,4BCIO,SAAS,AAAY,CAAE,SAAO,CAAuB,QAG1D,ODKM,EAAS,CAAA,EAAA,EAAA,SAAA,AAAS,IACxB,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,IAAM,EAAU,IAAI,YAAY,GAAG,aAAa,OAAO,EAAE,mBAAmB,IAAU,EAItF,OAHA,EAAQ,SAAS,CAAG,KAClB,EAAO,OAAO,EAChB,EACO,KACL,EAAQ,KAAK,EACf,CACFY,EAAG,CChBY,EDgBF,EAAO,EDRpB,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KAER,IADIJ,EACEC,EAAS,KACb,IAAMC,EAAyC,YAA7BC,SAASC,eAAe,EAAkBD,SAASE,QAAQ,GACzEH,QAAuBI,IAAVN,EACfA,EAAQ,GAD4B,CACxBO,YAAY,GAAGV,WAAW,OAAO,EAAEW,mBAAmBT,IAAU,EAClEG,QAAuBI,IAAVN,IACvBA,EAAMS,CADsC,IACjC,GACXT,OAAQM,EAEZ,EAKA,OAJAL,IACAS,OAAOC,gBAAgB,CAAC,QAASV,GACjCS,OAAOC,gBAAgB,CAAC,OAAQV,GAChCE,SAASQ,gBAAgB,CAAC,mBAAoBV,GACvC,KACLS,OAAOE,mBAAmB,CAAC,QAASX,GACpCS,OAAOE,mBAAmB,CAAC,OAAQX,GACnCE,SAASS,mBAAmB,CAAC,mBAAoBX,GACjDD,GAAOS,OACT,CACF,EAAG,CE5BY,EF4BH,EE3BL,IACT,qCCRA,IAAMI,EAAW,CACfC,QAAS,4DACTC,UAAW,mEACb,aAMO,SAAsB,AAAbC,WACdC,CAAS,cACTC,CAAY,CACZC,UAAU,WAAW,UACrBC,CAAQ,WACRC,EAAY,EAAE,UACdC,CAAQ,CACR,GAAGC,EAC0I,EAC7I,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACE,GAAGA,CAAM,CACVD,UAAuB,IAAbA,GAAqBL,EAC/B,YAAWA,EACXI,UAAW,CAAC,mGAAmG,EAAER,CAAQ,CAACM,EAAQ,CAAC,CAAC,EAAEE,EAAAA,CAAW,UAEhJJ,EACC,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,cAAY,OAAOI,UAAU,oFAClCH,KAGHE,GAIR,eCrCwG,IAAA,EAAA,EAAA,CAAA,CAAA,kBACjG,SAASI,AAAO,SAAEC,CAAO,WAAEC,CAAS,CAA2C,EACpF,OAAOA,EACL,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAEC,KAAK,QAAQ,cAAY,iBAAiBN,UAAU,gHACpDI,IAGH,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAEE,KAAK,SAAS,cAAY,iBAAiBN,UAAU,2FACrDI,GAGP"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
(()=>{"use strict";module.exports=[16550,a=>{a.s(["H",0,"/bridge/basket","T",0,"/bridge/settings"])},3656,a=>{var b=a.i(72131),c=a.i(50944);a.s(["LiveRefresh",0,function({fleetId:a}){let d;return d=(0,c.useRouter)(),(0,b.useEffect)(()=>{let b=new EventSource(`/bridge/changes?fleet=${encodeURIComponent(a)}`);return b.onmessage=()=>{d.refresh()},()=>{b.close()}},[a,d]),(0,b.useEffect)(()=>{let b,c=()=>{let c="visible"===document.visibilityState&&document.hasFocus();c&&void 0===b?b=new EventSource(`/bridge/focus?fleet=${encodeURIComponent(a)}`):c||void 0===b||(b.close(),b=void 0)};return c(),window.addEventListener("focus",c),window.addEventListener("blur",c),document.addEventListener("visibilitychange",c),()=>{window.removeEventListener("focus",c),window.removeEventListener("blur",c),document.removeEventListener("visibilitychange",c),b?.close()}},[a]),null}],3656)},32043,a=>{var b=a.i(87924);let c={primary:"bg-primary text-primary-foreground hover:bg-primary-hover",secondary:"border border-border bg-card text-card-foreground hover:bg-accent"};a.s(["f",0,function({isPending:a,pendingLabel:d,variant:e="secondary",children:f,className:g="",disabled:h,...i}){return(0,b.jsx)("button",{...i,disabled:!0===h||a,"aria-busy":a,className:`inline-flex h-9 items-center gap-2 rounded-md px-4 disabled:cursor-not-allowed disabled:opacity-70 ${c[e]} ${g}`,children:a?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{"aria-hidden":"true",className:"size-3.5 animate-spin rounded-full border-2 border-current border-t-transparent"}),d]}):f})}])},52560,12110,a=>{var b=a.i(87924);let c={decide:"Decide",do:"Do","stay-aware":"Stay aware","everything-else":"Message"},d={bridge:"in Bridge",chat:"in a chat",slack:"in Slack",gateway:"by the gateway"},e={seen:"Seen",answered:"Answered",done:"Done",cannot:"Marked cannot",withdrawn:"Withdrawn by its asker, seen",replaced:"Replaced by its asker, seen",notSent:"Not sent, removed"};function f(a){return c[a]}a.s(["y",0,f,"s",0,function(a){switch(a.state){case"new":return"New";case"seen":return"Seen, not done yet";case"done":{let{outcome:b}=a;if(null===b)return"Done";let c=`${e[b.kind]} ${d[b.place]}`;return null===b.option?c:`${c}: option ${String(b.option)}`}}}],12110);var g=a.i(10039);a.s(["f",0,function({item:a,isNew:c,isStale:d=!1,outcome:e,failure:h,children:i}){var j;return(0,b.jsxs)("li",{"data-testid":"bridge-item","data-stale":d,className:`grid min-w-0 gap-2 rounded-md border border-border bg-card p-3 ${d?"opacity-60":""}`,children:[(0,b.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,b.jsxs)("span",{className:"flex min-w-0 flex-1 flex-col text-left",children:[(0,b.jsxs)("span",{className:"flex min-w-0 items-center gap-2",children:[c?(0,b.jsx)("span",{"aria-label":"New",className:"size-2 shrink-0 rounded-full bg-primary"}):null,(0,b.jsx)("span",{className:"truncate font-medium",children:a.title})]}),(0,b.jsxs)("span",{className:"text-caption text-muted-foreground",children:[f(a.job)," · ",a.from," · ",(0,b.jsx)("time",{dateTime:a.sentAt,children:(j=a.sentAt,`${new Date(j).toISOString().slice(0,16).replace("T"," ")} UTC`)})]}),void 0===e?null:(0,b.jsx)("span",{"data-testid":"bridge-outcome",className:"text-caption",children:e})]}),i]}),void 0===h?null:(0,b.jsx)(g.f,{message:h,isFailure:!0})]})}],52560)},10039,a=>{var b=a.i(87924);a.s(["f",0,function({message:a,isFailure:c}){return c?(0,b.jsx)("p",{role:"alert","data-testid":"bridge-failure",className:"rounded-md border border-tone-attention-border bg-tone-attention-bg px-3 py-2 text-tone-attention-fg",children:a}):(0,b.jsx)("p",{role:"status","data-testid":"bridge-success",className:"rounded-md border border-tone-ok-border bg-tone-ok-bg px-3 py-2 text-tone-ok-fg",children:a})}])}]})();
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=web_features_bridge_0219fbfmsi68-._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/bridge/paths.ts","../../../../../web/features/bridge/hooks/use-focus-report.ts","../../../../../web/features/bridge/hooks/use-live-refresh.ts","../../../../../web/features/bridge/state/live-refresh.tsx","../../../../../web/features/bridge/ui/action-button.tsx","../../../../../web/features/bridge/services/items.ts","../../../../../web/features/bridge/ui/item-row.tsx","../../../../../web/features/bridge/ui/notice.tsx"],"sourcesContent":["/** Bridge's pages (docs/design/bridge): home, the basket, Done, Bridge's settings and where things show; a module of their own, so a page in the browser names them too. */\nexport const BRIDGE_PATH = '/bridge';\nexport const BRIDGE_BASKET_PATH = '/bridge/basket';\nexport const BRIDGE_DONE_PATH = '/bridge/done';\nexport const BRIDGE_SETTINGS_PATH = '/bridge/settings';\nexport const BRIDGE_ROUTING_PATH = '/bridge/settings/routing';\n","'use client';\n\nimport { useEffect } from 'react';\n\n/** The stream the page holds while in focus, which the web app's server follows on the gateway's API for the browser. */\nexport const FOCUS_PATH = '/bridge/focus';\n\n/**\n * Tells the gateway while the page is in focus (wake a person, W6): it holds\n * the focus stream open while the window has focus and the page shows, and\n * closes it when either ends. While a page of the person is in focus, what\n * arrives is shown there and no wake goes out; an open page not in focus\n * changes nothing. A lost connection no longer counts as in focus.\n */\nexport function useFocusReport(fleetId: string): void {\n useEffect(() => {\n let focus: EventSource | undefined;\n const report = () => {\n const isInFocus = document.visibilityState === 'visible' && document.hasFocus();\n if (isInFocus && focus === undefined) {\n focus = new EventSource(`${FOCUS_PATH}?fleet=${encodeURIComponent(fleetId)}`);\n } else if (!isInFocus && focus !== undefined) {\n focus.close();\n focus = undefined;\n }\n };\n report();\n window.addEventListener('focus', report);\n window.addEventListener('blur', report);\n document.addEventListener('visibilitychange', report);\n return () => {\n window.removeEventListener('focus', report);\n window.removeEventListener('blur', report);\n document.removeEventListener('visibilitychange', report);\n focus?.close();\n };\n }, [fleetId]);\n}\n","'use client';\n\nimport { useRouter } from 'next/navigation';\nimport { useEffect } from 'react';\n\n/** The page's live updates, which the web app's server follows on the gateway's API for the browser. */\nexport const CHANGES_PATH = '/bridge/changes';\n\n/**\n * Keeps the page in step with its fleet's requests: whenever one changes,\n * the page reads itself again on the server, as its own caller. The browser\n * opens the stream again by itself when it drops.\n */\nexport function useLiveRefresh(fleetId: string): void {\n const router = useRouter();\n useEffect(() => {\n const changes = new EventSource(`${CHANGES_PATH}?fleet=${encodeURIComponent(fleetId)}`);\n changes.onmessage = () => {\n router.refresh();\n };\n return () => {\n changes.close();\n };\n }, [fleetId, router]);\n}\n","'use client';\n\nimport { useFocusReport } from '../hooks/use-focus-report';\nimport { useLiveRefresh } from '../hooks/use-live-refresh';\n\n/** Keeps the page it sits in live, and tells the gateway while it is in focus (wake a person, W6): it shows nothing itself. */\nexport function LiveRefresh({ fleetId }: { fleetId: string }) {\n useLiveRefresh(fleetId);\n useFocusReport(fleetId);\n return null;\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\n\nconst VARIANTS = {\n primary: 'bg-primary text-primary-foreground hover:bg-primary-hover',\n secondary: 'border border-border bg-card text-card-foreground hover:bg-accent',\n} as const;\n\n/**\n * A button for an action: the moment it is pressed and until the answer\n * comes, it shows a spinner and its working label, and cannot run twice.\n */\nexport function ActionButton({\n isPending,\n pendingLabel,\n variant = 'secondary',\n children,\n className = '',\n disabled,\n ...button\n}: ButtonHTMLAttributes<HTMLButtonElement> & { isPending: boolean; pendingLabel: string; variant?: keyof typeof VARIANTS; children: ReactNode }) {\n return (\n <button\n {...button}\n disabled={disabled === true || isPending}\n aria-busy={isPending}\n className={`inline-flex h-9 items-center gap-2 rounded-md px-4 disabled:cursor-not-allowed disabled:opacity-70 ${VARIANTS[variant]} ${className}`}\n >\n {isPending ? (\n <>\n <span aria-hidden=\"true\" className=\"size-3.5 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n {pendingLabel}\n </>\n ) : (\n children\n )}\n </button>\n );\n}\n","/**\n * Bridge's items as its pages show them (docs/design/bridge, section 6):\n * each job's label, and what came of an item and where, in words. Pure view\n * logic, no React and no API client.\n */\nimport type { inferRouterOutputs } from '@trpc/server';\n\nimport type { GatewayRouter } from '../../../../src/adapters/trpc/router.js';\n\n/** Bridge home as the API answers it: what waits with its count, and the stay-aware feed. */\nexport type BridgeHome = inferRouterOutputs<GatewayRouter>['people']['home'];\n\n/** An item on Bridge home: by its title, with its job, new or seen. */\nexport type HomeItem = BridgeHome['waiting']['items'][number];\n\n/** A page of the person ship's record, as the API answers it. */\nexport type RecordPage = inferRouterOutputs<GatewayRouter>['people']['record'];\n\n/** An item of the record, with its state and its outcome once kept. */\nexport type RecordItem = RecordPage['items'][number];\n\ntype Job = RecordItem['job'];\ntype Outcome = NonNullable<RecordItem['outcome']>;\n\nconst JOB_LABELS: Record<Job, string> = {\n decide: 'Decide',\n do: 'Do',\n 'stay-aware': 'Stay aware',\n 'everything-else': 'Message',\n};\n\nconst PLACES: Record<Outcome['place'], string> = {\n bridge: 'in Bridge',\n chat: 'in a chat',\n slack: 'in Slack',\n gateway: 'by the gateway',\n};\n\nconst KINDS: Record<Outcome['kind'], string> = {\n seen: 'Seen',\n answered: 'Answered',\n done: 'Done',\n cannot: 'Marked cannot',\n withdrawn: 'Withdrawn by its asker, seen',\n replaced: 'Replaced by its asker, seen',\n notSent: 'Not sent, removed',\n};\n\nexport function jobLabelOf(job: Job): string {\n return JOB_LABELS[job];\n}\n\n/** What came of an item and where, such as Answered in Slack: option 2; Done alone when no outcome was kept. */\nexport function outcomeTextOf(item: Pick<RecordItem, 'state' | 'outcome'>): string {\n switch (item.state) {\n case 'new':\n return 'New';\n case 'seen':\n return 'Seen, not done yet';\n case 'done': {\n const { outcome } = item;\n if (outcome === null) {\n return 'Done';\n }\n const said = `${KINDS[outcome.kind]} ${PLACES[outcome.place]}`;\n return outcome.option === null ? said : `${said}: option ${String(outcome.option)}`;\n }\n }\n}\n","import type { ReactNode } from 'react';\n\nimport { jobLabelOf, type HomeItem } from '../services/items';\nimport { Notice } from './notice';\n\n/** When an item was sent, in UTC, to the minute. */\nfunction sentAtOf(sentAt: string): string {\n return `${new Date(sentAt).toISOString().slice(0, 16).replace('T', ' ')} UTC`;\n}\n\n/**\n * One item in a Bridge list: a dot while new, its title, its job and who\n * sent it, when, what came of it once said, and its action; faded when stale. The row and its\n * title shrink to a phone's width (aeolus-fleet#1238).\n */\nexport function ItemRow({\n item,\n isNew,\n isStale = false,\n outcome,\n failure,\n children,\n}: {\n item: Pick<HomeItem, 'deliveryId' | 'from' | 'title' | 'sentAt' | 'job'>;\n isNew: boolean;\n /** Whether it is a question its asker withdrew or replaced: shown faded, outside the count. */\n isStale?: boolean;\n outcome: string | undefined;\n failure: string | undefined;\n children: ReactNode;\n}) {\n return (\n <li data-testid=\"bridge-item\" data-stale={isStale} className={`grid min-w-0 gap-2 rounded-md border border-border bg-card p-3 ${isStale ? 'opacity-60' : ''}`}>\n <div className=\"flex min-w-0 items-center gap-3\">\n <span className=\"flex min-w-0 flex-1 flex-col text-left\">\n <span className=\"flex min-w-0 items-center gap-2\">\n {isNew ? <span aria-label=\"New\" className=\"size-2 shrink-0 rounded-full bg-primary\" /> : null}\n <span className=\"truncate font-medium\">{item.title}</span>\n </span>\n <span className=\"text-caption text-muted-foreground\">\n {jobLabelOf(item.job)} · {item.from} · <time dateTime={item.sentAt}>{sentAtOf(item.sentAt)}</time>\n </span>\n {outcome === undefined ? null : <span data-testid=\"bridge-outcome\" className=\"text-caption\">{outcome}</span>}\n </span>\n {children}\n </div>\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n </li>\n );\n}\n","/** What an action came to, said in place: a success as a status, a failure as an alert by the control. */\nexport function Notice({ message, isFailure }: { message: string; isFailure: boolean }) {\n return isFailure ? (\n <p role=\"alert\" data-testid=\"bridge-failure\" className=\"rounded-md border border-tone-attention-border bg-tone-attention-bg px-3 py-2 text-tone-attention-fg\">\n {message}\n </p>\n ) : (\n <p role=\"status\" data-testid=\"bridge-success\" className=\"rounded-md border border-tone-ok-border bg-tone-ok-bg px-3 py-2 text-tone-ok-fg\">\n {message}\n </p>\n );\n}\n"],"names":["BRIDGE_PATH","BRIDGE_BASKET_PATH","BRIDGE_DONE_PATH","BRIDGE_SETTINGS_PATH","BRIDGE_ROUTING_PATH","FOCUS_PATH","useFocusReport","fleetId","focus","report","isInFocus","document","visibilityState","hasFocus","undefined","EventSource","encodeURIComponent","close","window","addEventListener","removeEventListener","VARIANTS","primary","secondary","ActionButton","isPending","pendingLabel","variant","children","className","disabled","button","JOB_LABELS","decide","do","PLACES","bridge","chat","slack","gateway","KINDS","seen","answered","done","cannot","withdrawn","replaced","notSent","jobLabelOf","job","outcomeTextOf","item","state","outcome","said","kind","place","option","String","Notice","message","isFailure","role"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
(()=>{"use strict";module.exports=[3656,a=>{var b=a.i(72131),c=a.i(50944);a.s(["LiveRefresh",0,function({fleetId:a}){let d;return d=(0,c.useRouter)(),(0,b.useEffect)(()=>{let b=new EventSource(`/bridge/changes?fleet=${encodeURIComponent(a)}`);return b.onmessage=()=>{d.refresh()},()=>{b.close()}},[a,d]),(0,b.useEffect)(()=>{let b,c=()=>{let c="visible"===document.visibilityState&&document.hasFocus();c&&void 0===b?b=new EventSource(`/bridge/focus?fleet=${encodeURIComponent(a)}`):c||void 0===b||(b.close(),b=void 0)};return c(),window.addEventListener("focus",c),window.addEventListener("blur",c),document.addEventListener("visibilitychange",c),()=>{window.removeEventListener("focus",c),window.removeEventListener("blur",c),document.removeEventListener("visibilitychange",c),b?.close()}},[a]),null}],3656)},32043,a=>{var b=a.i(87924);let c={primary:"bg-primary text-primary-foreground hover:bg-primary-hover",secondary:"border border-border bg-card text-card-foreground hover:bg-accent"};a.s(["f",0,function({isPending:a,pendingLabel:d,variant:e="secondary",children:f,className:g="",disabled:h,...i}){return(0,b.jsx)("button",{...i,disabled:!0===h||a,"aria-busy":a,className:`inline-flex h-9 items-center gap-2 rounded-md px-4 disabled:cursor-not-allowed disabled:opacity-70 ${c[e]} ${g}`,children:a?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{"aria-hidden":"true",className:"size-3.5 animate-spin rounded-full border-2 border-current border-t-transparent"}),d]}):f})}])},10039,a=>{var b=a.i(87924);a.s(["f",0,function({message:a,isFailure:c}){return c?(0,b.jsx)("p",{role:"alert","data-testid":"bridge-failure",className:"rounded-md border border-tone-attention-border bg-tone-attention-bg px-3 py-2 text-tone-attention-fg",children:a}):(0,b.jsx)("p",{role:"status","data-testid":"bridge-success",className:"rounded-md border border-tone-ok-border bg-tone-ok-bg px-3 py-2 text-tone-ok-fg",children:a})}])}]})();
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=web_features_bridge_11jndonu4o8fq._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/bridge/hooks/use-focus-report.ts","../../../../../web/features/bridge/hooks/use-live-refresh.ts","../../../../../web/features/bridge/state/live-refresh.tsx","../../../../../web/features/bridge/ui/action-button.tsx","../../../../../web/features/bridge/ui/notice.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect } from 'react';\n\n/** The stream the page holds while in focus, which the web app's server follows on the gateway's API for the browser. */\nexport const FOCUS_PATH = '/bridge/focus';\n\n/**\n * Tells the gateway while the page is in focus (wake a person, W6): it holds\n * the focus stream open while the window has focus and the page shows, and\n * closes it when either ends. While a page of the person is in focus, what\n * arrives is shown there and no wake goes out; an open page not in focus\n * changes nothing. A lost connection no longer counts as in focus.\n */\nexport function useFocusReport(fleetId: string): void {\n useEffect(() => {\n let focus: EventSource | undefined;\n const report = () => {\n const isInFocus = document.visibilityState === 'visible' && document.hasFocus();\n if (isInFocus && focus === undefined) {\n focus = new EventSource(`${FOCUS_PATH}?fleet=${encodeURIComponent(fleetId)}`);\n } else if (!isInFocus && focus !== undefined) {\n focus.close();\n focus = undefined;\n }\n };\n report();\n window.addEventListener('focus', report);\n window.addEventListener('blur', report);\n document.addEventListener('visibilitychange', report);\n return () => {\n window.removeEventListener('focus', report);\n window.removeEventListener('blur', report);\n document.removeEventListener('visibilitychange', report);\n focus?.close();\n };\n }, [fleetId]);\n}\n","'use client';\n\nimport { useRouter } from 'next/navigation';\nimport { useEffect } from 'react';\n\n/** The page's live updates, which the web app's server follows on the gateway's API for the browser. */\nexport const CHANGES_PATH = '/bridge/changes';\n\n/**\n * Keeps the page in step with its fleet's requests: whenever one changes,\n * the page reads itself again on the server, as its own caller. The browser\n * opens the stream again by itself when it drops.\n */\nexport function useLiveRefresh(fleetId: string): void {\n const router = useRouter();\n useEffect(() => {\n const changes = new EventSource(`${CHANGES_PATH}?fleet=${encodeURIComponent(fleetId)}`);\n changes.onmessage = () => {\n router.refresh();\n };\n return () => {\n changes.close();\n };\n }, [fleetId, router]);\n}\n","'use client';\n\nimport { useFocusReport } from '../hooks/use-focus-report';\nimport { useLiveRefresh } from '../hooks/use-live-refresh';\n\n/** Keeps the page it sits in live, and tells the gateway while it is in focus (wake a person, W6): it shows nothing itself. */\nexport function LiveRefresh({ fleetId }: { fleetId: string }) {\n useLiveRefresh(fleetId);\n useFocusReport(fleetId);\n return null;\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\n\nconst VARIANTS = {\n primary: 'bg-primary text-primary-foreground hover:bg-primary-hover',\n secondary: 'border border-border bg-card text-card-foreground hover:bg-accent',\n} as const;\n\n/**\n * A button for an action: the moment it is pressed and until the answer\n * comes, it shows a spinner and its working label, and cannot run twice.\n */\nexport function ActionButton({\n isPending,\n pendingLabel,\n variant = 'secondary',\n children,\n className = '',\n disabled,\n ...button\n}: ButtonHTMLAttributes<HTMLButtonElement> & { isPending: boolean; pendingLabel: string; variant?: keyof typeof VARIANTS; children: ReactNode }) {\n return (\n <button\n {...button}\n disabled={disabled === true || isPending}\n aria-busy={isPending}\n className={`inline-flex h-9 items-center gap-2 rounded-md px-4 disabled:cursor-not-allowed disabled:opacity-70 ${VARIANTS[variant]} ${className}`}\n >\n {isPending ? (\n <>\n <span aria-hidden=\"true\" className=\"size-3.5 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n {pendingLabel}\n </>\n ) : (\n children\n )}\n </button>\n );\n}\n","/** What an action came to, said in place: a success as a status, a failure as an alert by the control. */\nexport function Notice({ message, isFailure }: { message: string; isFailure: boolean }) {\n return isFailure ? (\n <p role=\"alert\" data-testid=\"bridge-failure\" className=\"rounded-md border border-tone-attention-border bg-tone-attention-bg px-3 py-2 text-tone-attention-fg\">\n {message}\n </p>\n ) : (\n <p role=\"status\" data-testid=\"bridge-success\" className=\"rounded-md border border-tone-ok-border bg-tone-ok-bg px-3 py-2 text-tone-ok-fg\">\n {message}\n </p>\n );\n}\n"],"names":["FOCUS_PATH","useFocusReport","fleetId","focus","report","isInFocus","document","visibilityState","hasFocus","undefined","EventSource","encodeURIComponent","close","window","addEventListener","removeEventListener","VARIANTS","primary","secondary","ActionButton","isPending","pendingLabel","variant","children","className","disabled","button","Notice","message","isFailure","role"],"mappings":"4CAEA,IAAA,EAAA,EAAA,CAAA,CAAA,OCAA,EAAA,EAAA,CAAA,CAAA,4BCIO,SAAS,AAAY,SAAE,CAAO,CAAuB,QAG1D,ODKM,EAAS,CAAA,EAAA,EAAA,SAAA,AAAS,IACxB,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,IAAM,EAAU,IAAI,YAAY,GAAG,aAAa,OAAO,EAAE,mBAAmB,ACT/D,IDSyE,EAItF,OAHA,EAAQ,SAAS,CAAG,KAClB,EAAO,OAAO,EAChB,EACO,KACL,EAAQ,KAAK,EACf,CACFO,EAAG,GAAU,EAAO,EDRpB,CAAA,EAAA,EAAA,SAAS,AAAT,EAAU,KAER,IADIJ,EACEC,EAAS,KACb,IAAMC,EAAyC,YAA7BC,SAASC,eAAe,EAAkBD,SAASE,QAAQ,EACzEH,SAAuBI,IAAVN,EACfA,EAAQ,GAD4B,CACxBO,YAAY,GAAGV,WAAW,OAAO,EAAEW,mBAAmBT,IAAU,EAClEG,QAAuBI,IAAVN,IACvBA,EAAMS,CADsC,IACjC,GACXT,OAAQM,EAEZ,EAKA,OAJAL,IACAS,OAAOC,gBAAgB,CAAC,QAASV,GACjCS,OAAOC,gBAAgB,CAAC,OAAQV,GAChCE,SAASQ,gBAAgB,CAAC,mBAAoBV,GACvC,KACLS,OAAOE,mBAAmB,CAAC,QAASX,GACpCS,OAAOE,mBAAmB,CAAC,OAAQX,GACnCE,SAASS,mBAAmB,CAAC,mBAAoBX,GACjDD,GAAOS,OACT,CACF,EAAG,CE5BY,EF4BH,EE3BL,IACT,qCCRA,IAAMI,EAAW,CACfC,QAAS,4DACTC,UAAW,mEACb,aAMO,SAASC,AAAa,CAC3BC,WAAS,cACTC,CAAY,SACZC,EAAU,WAAW,UACrBC,CAAQ,WACRC,EAAY,EAAE,UACdC,CAAQ,CACR,GAAGC,EAC0I,EAC7I,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACE,GAAGA,CAAM,CACVD,UAAuB,IAAbA,GAAqBL,EAC/B,YAAWA,EACXI,UAAW,CAAC,mGAAmG,EAAER,CAAQ,CAACM,EAAQ,CAAC,CAAC,EAAEE,EAAAA,CAAW,UAEhJJ,EACC,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,cAAY,OAAOI,UAAU,oFAClCH,KAGHE,GAIR,eCrCwG,IAAA,EAAA,EAAA,CAAA,CAAA,kBACjG,SAASI,AAAO,SAAEC,CAAO,WAAEC,CAAS,CAA2C,EACpF,OAAOA,EACL,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAEC,KAAK,QAAQ,cAAY,iBAAiBN,UAAU,gHACpDI,IAGH,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAEE,KAAK,SAAS,cAAY,iBAAiBN,UAAU,2FACrDI,GAGP"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
(()=>{"use strict";module.exports=[29660,a=>{a.s(["H",0,"/bridge/basket","a",0,"/bridge/done","P",0,"/bridge","i",0,"/bridge/settings/routing","T",0,"/bridge/settings"])},94705,a=>{a.s(["_",0,["messages:send","messages:receive"],"T",0,function(a,b){switch(a.state){case"pending":let c;return(c=Math.ceil((Date.parse(a.expiresAt)-b.getTime())/864e5))<=1?{tone:"attention",label:"Last day"}:{tone:"waiting",label:`${String(c)} d left`};case"approving":return{tone:"active",label:"Approving"};case"approved":return{tone:"ok",label:"Approved"};case"denied":return{tone:"ended",label:"Denied"};case"expired":return{tone:"ended",label:"Expired"}}},"E",0,function(a){switch(a.subject.kind){case"client":return"MCP client";case"server":return"MCP server"}},"M",0,function(a){switch(a.subject.kind){case"client":return a.subject.clientName;case"server":return URL.canParse(a.subject.url)?new URL(a.subject.url).host:a.subject.url}}])},18734,a=>{var b=a.i(7997),c=a.i(94705);let d={waiting:"border-tone-waiting-border bg-tone-waiting-bg text-tone-waiting-fg",active:"border-tone-active-border bg-tone-active-bg text-tone-active-fg",ok:"border-tone-ok-border bg-tone-ok-bg text-tone-ok-fg",attention:"border-tone-attention-border bg-tone-attention-bg text-tone-attention-fg",ended:"border-tone-ended-border bg-tone-ended-bg text-tone-ended-fg"};function e({status:a}){return(0,b.jsx)("span",{className:`inline-flex shrink-0 items-center rounded-full border px-2 py-0.5 text-caption ${d[a.tone]}`,children:a.label})}function f({name:a}){return(0,b.jsx)("span",{"aria-hidden":"true",className:"inline-flex size-8 shrink-0 items-center justify-center rounded-md bg-secondary font-semibold text-secondary-foreground",children:a.slice(0,1).toUpperCase()})}function g({request:a,now:d}){let h=(0,c.M)(a);return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(f,{name:h}),(0,b.jsxs)("span",{className:"flex min-w-0 flex-1 flex-col",children:[(0,b.jsx)("span",{className:"truncate",children:h}),(0,b.jsx)("span",{className:"text-caption text-muted-foreground",children:(0,c.E)(a)})]}),(0,b.jsx)(e,{status:(0,c.T)(a,d)})]})}a.s(["f",0,function({title:a,requests:c,now:d,hrefOf:e,currentId:f}){return(0,b.jsxs)("section",{className:"grid gap-2",children:[(0,b.jsxs)("h2",{className:"text-section font-semibold",children:[a," · ",c.length]}),c.map(a=>void 0===e?(0,b.jsx)("div",{className:"flex items-center gap-3 rounded-md border border-border bg-card p-3",children:(0,b.jsx)(g,{request:a,now:d})},a.requestId):(0,b.jsx)("a",{href:e(a),"aria-current":a.requestId===f?"true":void 0,"data-testid":"bridge-request",className:"flex items-center gap-3 rounded-md border border-border bg-card p-3 hover:bg-accent aria-[current=true]:border-ring",children:(0,b.jsx)(g,{request:a,now:d})},a.requestId))]})}],18734)}]})();
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=web_features_bridge_1mi9qlb-z5iwt._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/bridge/paths.ts","../../../../../web/features/bridge/services/requests.ts","../../../../../web/features/bridge/ui/requests-list.tsx","../../../../../web/features/bridge/ui/status-badge.tsx"],"sourcesContent":["/** Bridge's pages (docs/design/bridge): home, the basket, Done, Bridge's settings and where things show; a module of their own, so a page in the browser names them too. */\nexport const BRIDGE_PATH = '/bridge';\nexport const BRIDGE_BASKET_PATH = '/bridge/basket';\nexport const BRIDGE_DONE_PATH = '/bridge/done';\nexport const BRIDGE_SETTINGS_PATH = '/bridge/settings';\nexport const BRIDGE_ROUTING_PATH = '/bridge/settings/routing';\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","import { requestStatus, subjectKind, subjectName, type ShownRequest } from '../services/requests';\nimport { StatusBadge } from './status-badge';\n\nfunction PartyMark({ name }: { name: string }) {\n return (\n <span aria-hidden=\"true\" className=\"inline-flex size-8 shrink-0 items-center justify-center rounded-md bg-secondary font-semibold text-secondary-foreground\">\n {name.slice(0, 1).toUpperCase()}\n </span>\n );\n}\n\nfunction RequestRow({ request, now }: { request: ShownRequest; now: Date }) {\n const name = subjectName(request);\n return (\n <>\n <PartyMark name={name} />\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate\">{name}</span>\n <span className=\"text-caption text-muted-foreground\">{subjectKind(request)}</span>\n </span>\n <StatusBadge status={requestStatus(request, now)} />\n </>\n );\n}\n\n/** Requests in a list: each a link to decide it, or, for the person's own, its state alone. */\nexport function RequestsList({ title, requests, now, hrefOf, currentId }: { title: string; requests: readonly ShownRequest[]; now: Date; hrefOf?: (request: ShownRequest) => string; currentId?: string }) {\n return (\n <section className=\"grid gap-2\">\n <h2 className=\"text-section font-semibold\">\n {title} · {requests.length}\n </h2>\n {requests.map((request) =>\n hrefOf === undefined ? (\n <div key={request.requestId} className=\"flex items-center gap-3 rounded-md border border-border bg-card p-3\">\n <RequestRow request={request} now={now} />\n </div>\n ) : (\n <a\n key={request.requestId}\n href={hrefOf(request)}\n aria-current={request.requestId === currentId ? 'true' : undefined}\n data-testid=\"bridge-request\"\n className=\"flex items-center gap-3 rounded-md border border-border bg-card p-3 hover:bg-accent aria-[current=true]:border-ring\"\n >\n <RequestRow request={request} now={now} />\n </a>\n ),\n )}\n </section>\n );\n}\n","import type { Status, Tone } from '../services/requests';\n\nconst TONES: Record<Tone, string> = {\n waiting: 'border-tone-waiting-border bg-tone-waiting-bg text-tone-waiting-fg',\n active: 'border-tone-active-border bg-tone-active-bg text-tone-active-fg',\n ok: 'border-tone-ok-border bg-tone-ok-bg text-tone-ok-fg',\n attention: 'border-tone-attention-border bg-tone-attention-bg text-tone-attention-fg',\n ended: 'border-tone-ended-border bg-tone-ended-bg text-tone-ended-fg',\n};\n\n/** A status in its tone, always with its words, so it never rests on colour alone. */\nexport function StatusBadge({ status }: { status: Status }) {\n return <span className={`inline-flex shrink-0 items-center rounded-full border px-2 py-0.5 text-caption ${TONES[status.tone]}`}>{status.label}</span>;\n}\n"],"names":["BRIDGE_PATH","BRIDGE_BASKET_PATH","BRIDGE_DONE_PATH","BRIDGE_SETTINGS_PATH","BRIDGE_ROUTING_PATH","DAY_MS","subjectName","request","subject","kind","clientName","URL","canParse","url","host","subjectKind","daysLeft","now","days","Math","ceil","Date","parse","expiresAt","getTime","tone","label","String","requestStatus","state","suggestedName","name","toLowerCase","replaceAll","EVERY_APP_SHIP_SCOPES","SCOPE_LABELS","scopeLabel","scope","TONES","waiting","active","ok","attention","ended","StatusBadge","status","className"],"mappings":"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"}
|
package/web/.next/server/chunks/ssr/web_features_bridge_hooks_bridge-actions_ts_0h-_xm2rcb-ij._.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports=[43889,a=>{"use strict";var b,c,d=a.i(37936),e=a.i(29517),f=a.i(18558);a.i(70396);var g=a.i(73727),h=a.i(55476),i=a.i(66283),j=a.i(29493),k=a.i(49310),l=a.i(54757),l=l,m=l,n=l,o=a.i(27221),p=a.i(83931),q=a.i(26972),r=l,s=l,t=l,u=l,v=a.i(30174);let w=new TextEncoder;function x(a){return w.encode(a).byteLength}var m=l,y=a.i(89963),z=l,A=l,B=a.i(11365),n=l,l=l,m=l;let C=k.z.enum(["working","blocked","idle"]),D=`A note is one line of at most ${String(200)} characters`;new TextEncoder;let E=z.record(o.z.string(),A.json()),F=q.z.object({kind:o.z.string()}).catchall(A.json()),G=q.z.object({at:B.z.number(),of:B.z.number()});q.z.object({state:C,note:o.z.string().trim().max(200,D).refine(function(a){return!/[\r\n]/.test(a)},D).optional(),details:E.nullable().optional(),detailsPatch:E.nullable().optional(),task:F.nullable().optional(),step:G.nullable().optional()}).refine(a=>void 0===a.details||void 0===a.detailsPatch,{message:"Give details or detailsPatch, not both",path:["detailsPatch"]}),n.strictObject({});let H=q.z.object({state:C,note:o.z.string().nullable(),task:F.nullable(),taskView:q.z.object({canOpen:p.z.boolean(),fleetName:o.z.string().nullable()}).optional(),step:G.nullable(),reportedAt:l.iso.datetime(),reportChangedAt:l.iso.datetime(),detailsVersion:m.int().min(0)}).extend({details:E.nullable()});q.z.object({report:H.nullable(),previousCrew:H.nullable()});let I=k.z.enum(["crew-request-unassigned","delivery-unacknowledged","delivery-overdue","ping-unanswered","report-unchanged","task-not-done"]),J=l.iso.datetime({offset:!0}),K=m.int().min(1),L=n.strictObject({settingsVersion:m.int().min(1),minutes:K,reason:o.z.string().nullable()}),M=n.strictObject({deliveryId:(0,e.f)("delivery"),messageId:(0,e.f)("message"),state:k.z.enum(["pending","received","handed"]),awaitingCrew:p.z.boolean(),minutes:K}),N=n.strictObject({deliveryId:(0,e.f)("delivery"),messageId:(0,e.f)("message"),overdueEventId:(0,e.f)("event")}),O=n.strictObject({deliveryId:(0,e.f)("delivery"),messageId:(0,e.f)("message"),minutes:K}),P=n.strictObject({reportChangedAt:J,state:k.z.enum(["working","blocked"]),minutes:K,setBy:(0,e.f)("ship")}),Q=n.strictObject({task:F,doneBy:J,setBy:(0,e.f)("ship")}),R=[q.z.object({signal:r.literal("crew-request-unassigned"),facts:L}),q.z.object({signal:r.literal("delivery-unacknowledged"),facts:M}),q.z.object({signal:r.literal("delivery-overdue"),facts:N}),q.z.object({signal:r.literal("ping-unanswered"),facts:O}),q.z.object({signal:r.literal("report-unchanged"),facts:P}),q.z.object({signal:r.literal("task-not-done"),facts:Q})],S=s.discriminatedUnion("signal",R);t.intersection(q.z.object({alertId:(0,e.f)("alert"),headline:o.z.string().min(1).max(80),body:o.z.string().refine(a=>2048>=x(a),`A body is at most ${String(2048)} bytes`),ship:q.z.object({id:(0,e.f)("ship"),name:o.z.string()}),fleetId:(0,e.f)("fleet"),toldAs:k.z.enum(["owner","setter"]),since:J,raisedAt:J}),S).refine(a=>8192>=x(JSON.stringify(a)),`An alert message is at most ${String(8192)} bytes`),q.z.object({shipId:(0,e.f)("ship"),signal:I,facts:u.union([L,M,N,O,P,Q]),occurrenceKey:o.z.string().min(1).max(200),since:J}).transform(({shipId:a,signal:b,facts:c,occurrenceKey:d,since:e},f)=>{let g=S.safeParse({signal:b,facts:c});return g.success?{shipId:a,occurrenceKey:d,since:e,...g.data}:(f.addIssue({code:"custom",message:"The facts are not the signal's",path:["facts"]}),v.z.NEVER)}),q.z.object({alertId:(0,e.f)("alert")});let T=k.z.enum(["cleared","retired"]),U=t.intersection(q.z.object({id:(0,e.f)("alert"),ship:q.z.object({id:(0,e.f)("ship"),name:o.z.string()}),occurrenceKey:o.z.string(),ownerShipId:(0,e.f)("ship").nullable(),since:l.iso.datetime(),raisedAt:l.iso.datetime(),cleared:q.z.object({at:l.iso.datetime(),why:T}).nullable()}),S);(b=(0,e.f)("alert"),q.z.object({cursor:b.optional(),limit:m.int().min(1).max(500).optional()})).optional(),c=(0,e.f)("alert"),q.z.object({items:y.z.array(U),nextCursor:c.nullable()});var m=l,V=l,u=l,l=l;function W(a){let[b=""]=a.split(";");return b.trim().toLowerCase()}let X=m.int().min(1),Y=o.z.string().min(1),Z=q.z.object({key:X,label:Y,detail:o.z.string().default("")}),$=q.z.object({id:V.uuid(),title:Y,context:o.z.string(),options:y.z.array(Z).min(1),pick:q.z.object({option:X,why:Y})}).refine(({options:a})=>new Set(a.map(({key:a})=>a)).size===a.length,{message:"Every option has its own number",path:["options"]}).refine(({options:a,pick:b})=>a.some(({key:a})=>a===b.option),{message:"The pick names one of the options",path:["pick","option"]}),_=q.z.object({questionId:V.uuid()}),aa=q.z.object({questionId:V.uuid(),question:$}).refine(({questionId:a,question:b})=>b.id!==a,{message:"The new question has a uuid of its own",path:["question","id"]});u.union([q.z.object({option:X,note:Y.optional()}),q.z.object({note:Y})]);let ab=u.union([q.z.object({questionId:V.uuid(),option:X,note:Y.optional()}),q.z.object({questionId:V.uuid(),note:Y})]),ac=q.z.object({messageId:(0,e.f)("message"),sentAt:l.iso.datetime(),option:X.nullable(),note:o.z.string().nullable()});function ad(a){try{return JSON.parse(a)}catch{return}}q.z.object({id:V.uuid(),title:o.z.string(),context:o.z.string(),options:y.z.array(Z),pick:q.z.object({option:X,why:o.z.string()}),answer:ac.nullable()});var ae=l;let af=q.z.object({title:o.z.string().min(1),why:o.z.string(),link:ae.url({protocol:/^https?$/}).optional()}),ag=new Set(["application/vnd.aeolus.alert+json","application/vnd.aeolus.notice+json"]),ah=q.z.object({body:o.z.string()});var ai=a.i(94705),aj=a.i(29660);async function ak(a,b){let c;try{c={isOk:!0,value:await b(await (0,i.z)(a))}}catch(c){let b=(0,i.U)(c);if("UNAUTHORIZED"===b)return(0,g.redirect)(`/sign-in/start?${new URLSearchParams({return_to:`${aj.P}?${new URLSearchParams({[h.n]:a}).toString()}`}).toString()}`);return{isOk:!1,message:void 0===b?"The gateway did not answer: try again in a moment":(0,i.s)(c)}}return(0,f.revalidatePath)(aj.P,"layout"),c}async function al(a,b){return ak(a,a=>a.people.record.query({cursor:b}))}async function am(a,b){return ak(a,async a=>{let{contentType:c,payload:d,meetingId:e,...f}=await a.people.open.mutate({deliveryId:b});return{...f,payload:d,body:function(a){let[b=""]=a.contentType.split(";");if(!ag.has(b.trim().toLowerCase()))return a.payload;try{return ah.safeParse(JSON.parse(a.payload)).data?.body??a.payload}catch{return a.payload}}({contentType:c,payload:d}),question:function(a){if("application/vnd.aeolus.question+json"!==W(a.contentType))return function({contentType:a,payload:b}){if("application/vnd.aeolus.question-withdrawal+json"===W(a)){let a=_.safeParse(ad(b));return a.success?{questionId:a.data.questionId,replacement:null}:null}if("application/vnd.aeolus.question-replacement+json"===W(a)){let a=aa.safeParse(ad(b));return a.success?{questionId:a.data.questionId,replacement:a.data.question}:null}return null}(a)?.replacement??void 0;try{let b=$.safeParse(JSON.parse(a.payload));return b.success?b.data:void 0}catch{return}}({contentType:c,payload:d}),step:function(a){let[b=""]=a.contentType.split(";");if("application/vnd.aeolus.step+json"===b.trim().toLowerCase())try{let b=af.safeParse(JSON.parse(a.payload));if(!b.success)return;let{title:c,why:d,link:e}=b.data;return{title:c,why:d,link:void 0===e?void 0:{href:e,host:new URL(e).host}}}catch{return}}({contentType:c,payload:d}),meetingId:e??void 0}})}async function an({fleet:a,deliveryId:b,input:c}){let d=function(a){let b=a.note.trim();if(void 0===a.questionId)return""===b?{isOk:!1,message:"Write your answer first"}:{isOk:!0,value:{contentType:"text/plain",payload:b}};let c=ab.safeParse({questionId:a.questionId,...void 0===a.option?{}:{option:a.option},...""===b?{}:{note:b}});return c.success?{isOk:!0,value:{contentType:"application/vnd.aeolus.answer+json",payload:JSON.stringify(c.data)}}:{isOk:!1,message:"Tap an option, or write a note"}}(c);return d.isOk?ak(a,async a=>{await a.people.answer.mutate({deliveryId:b,...d.value})}):d}async function ao({fleet:a,deliveryId:b,option:c,note:d}){return ak(a,async a=>{await a.people.putInBasket.mutate({deliveryId:b,option:c,note:d})})}async function ap(a,b){return ak(a,async a=>{await a.people.removeFromBasket.mutate({questionId:b})})}async function aq(a){return ak(a,a=>a.people.sendBasket.mutate())}async function ar({fleet:a,deliveryId:b,step:c}){return ak(a,async a=>{await a.people.done.mutate(void 0===c?{deliveryId:b}:{deliveryId:b,...c})})}async function as({fleet:a,job:b,place:c,isOn:d}){return ak(a,async a=>{await a.people.turnRoute.mutate({job:b,place:c,isOn:d})})}async function at(a,b){return ak(a,async a=>{await a.people.turnOnWebPush.mutate({endpoint:b.endpoint,keys:{p256dh:b.keys.p256dh,auth:b.keys.auth},browser:b.browser})})}async function au(a,b){return ak(a,async a=>{await a.people.turnOffWebPush.mutate({endpoint:b})})}async function av(a){return ak(a,async a=>{await a.slack.unlink.mutate()})}async function aw({fleet:a,requestId:b,input:c}){if("deny"===c.kind)return ak(a,async a=>{await a.requests.decide.mutate({requestId:b,decision:{kind:"deny"}})});let d=(0,e.f)("ship").safeParse(c.ownerShipId.trim());if(!d.success)return{isOk:!1,message:"The owner's ship id is not a ship id (shp_...)"};let f={name:c.name,ownerShipId:d.data,scopes:[...new Set([...ai._,...c.scopes])]},{server:g}=c,h=void 0===g?void 0:(0,j.y)(g);return ak(a,async a=>{await a.requests.decide.mutate({requestId:b,decision:{kind:"approve",party:f,...void 0===g||void 0===h?{}:{server:{credential:h,concurrencyLimit:g.concurrencyLimit}}}})})}(0,a.i(13095).ensureServerEntryExports)([al,am,an,ao,ap,aq,ar,as,at,au,av,aw]),(0,d.registerServerReference)(al,"601621f5cf585bae9e540db5aa6e2c5d2a6bbcd72c",null),(0,d.registerServerReference)(am,"60c205c99f267754b5cb7b09118fdaf91f419555a5",null),(0,d.registerServerReference)(an,"40312d708ed123f3bff12a0e5d5ab7bdd456131901",null),(0,d.registerServerReference)(ao,"40c05f98915a7c9661aa8f801d392296ba8350eeba",null),(0,d.registerServerReference)(ap,"60cb932106ab7fdcbd18e33041be499ed83080592f",null),(0,d.registerServerReference)(aq,"407bae59090ef46e76fb8d952969288e5bb4583e21",null),(0,d.registerServerReference)(ar,"407cf7e8bf1a43e93e600808ccd1631dfd13c9b490",null),(0,d.registerServerReference)(as,"40d55047d0fa263dfb22afcf17c36e422f88773b7f",null),(0,d.registerServerReference)(at,"606869fb42c6cf9c02d918ac32cc0df0df992ce8e8",null),(0,d.registerServerReference)(au,"601545266cbcd00188699907a363d2d01cacdd7590",null),(0,d.registerServerReference)(av,"4068e0a012962959eed53cdc1898b8acfd21d81a71",null),(0,d.registerServerReference)(aw,"4013cfcec33d2651e37d34a8c0cd6f4b7e2f79d5b8",null),a.s(["q",0,an,"Q",0,aw,"G",0,ar,"v",0,am,"y",0,ao,"F",0,al,"D",0,ap,"K",0,aq,"W",0,au,"z",0,at,"e",0,as,"Z",0,av],43889)}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=web_features_bridge_hooks_bridge-actions_ts_0h-_xm2rcb-ij._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/bridge/hooks/bridge-actions.ts","../../../../../node_modules/%40aeolus-fleet/common/src/rules/page-size.ts","../../../../../node_modules/%40aeolus-fleet/common/src/schemas/alert.ts","../../../../../node_modules/%40aeolus-fleet/common/src/schemas/question.ts","../../../../../node_modules/%40aeolus-fleet/common/src/schemas/page.ts","../../../../../node_modules/%40aeolus-fleet/common/src/schemas/report.ts","../../../../../node_modules/%40aeolus-fleet/common/src/rules/payload.ts","../../../../../web/features/bridge/services/deliveries.ts"],"sourcesContent":["'use server';\n/**\n * Bridge's actions, each one call of the gateway's API as the signed-in\n * account, on the server (0033): opening, answering and being done with an\n * item, putting an answer in the basket, removing it and sending the basket,\n * reading the next page of the record, and in Bridge's settings where\n * each job shows, web push, the Slack link and deciding a request. The API checks everything; a\n * refusal comes back in its own words for the page to say by the control. A\n * sign-in that ended sends the person to sign in again.\n */\nimport { idSchema } from '@aeolus-fleet/common';\nimport { revalidatePath } from 'next/cache';\nimport { redirect } from 'next/navigation';\n\nimport type { GatewayApi } from '../../../lib/gateway-api/gateway-api';\nimport { FLEET_PARAMETER } from '../../../lib/gateway-api/page-account';\nimport { refusalCodeOf, refusalMessageOf, requestApi } from '../../../lib/gateway-api/page-api';\nimport { serverCredentialOf } from '../../forms/server-credential';\nimport { answerOf, bodyOf, questionOf, stepOf, type AnswerInput, type FocusedDelivery } from '../services/deliveries';\nimport type { SubscriptionInput } from '../services/web-push';\nimport { EVERY_APP_SHIP_SCOPES, type DecisionInput } from '../services/requests';\nimport type { BasketSent } from '../services/basket';\nimport type { RecordPage } from '../services/items';\nimport type { RoutedJob, RoutedPlace } from '../services/routing';\nimport { BRIDGE_PATH } from '../paths';\n\n/** What an action says when the gateway gave no answer of its own. */\nconst NO_ANSWER = 'The gateway did not answer: try again in a moment';\n\nexport type ActionOutcome<T> = { readonly isOk: true; readonly value: T } | { readonly isOk: false; readonly message: string };\n\nasync function attempt<T>(fleet: string, run: (api: GatewayApi) => Promise<T>): Promise<ActionOutcome<T>> {\n let outcome: ActionOutcome<T>;\n try {\n outcome = { isOk: true, value: await run(await requestApi(fleet)) };\n } catch (error) {\n const code = refusalCodeOf(error);\n if (code === 'UNAUTHORIZED') {\n return redirect(`/sign-in/start?${new URLSearchParams({ return_to: `${BRIDGE_PATH}?${new URLSearchParams({ [FLEET_PARAMETER]: fleet }).toString()}` }).toString()}`);\n }\n return { isOk: false, message: code === undefined ? NO_ANSWER : refusalMessageOf(error) };\n }\n revalidatePath(BRIDGE_PATH, 'layout');\n return outcome;\n}\n\n/** The next page of the person ship's record, after the cursor the last one answered (Done). */\nexport async function readMoreRecord(fleet: string, cursor: string): Promise<ActionOutcome<RecordPage>> {\n return attempt(fleet, (api) => api.people.record.query({ cursor }));\n}\n\n/** Opens an item: the gateway acknowledges it for the person, and it is shown whole, once; an alert or a notice seen is done (CC16). */\nexport async function openDelivery(fleet: string, deliveryId: string): Promise<ActionOutcome<FocusedDelivery>> {\n return attempt(fleet, async (api) => {\n const opened = await api.people.open.mutate({ deliveryId });\n const { contentType, payload, meetingId, ...entry } = opened;\n return { ...entry, payload, body: bodyOf({ contentType, payload }), question: questionOf({ contentType, payload }), step: stepOf({ contentType, payload }), meetingId: meetingId ?? undefined };\n });\n}\n\nexport async function answerDelivery({ fleet, deliveryId, input }: { fleet: string; deliveryId: string; input: AnswerInput }): Promise<ActionOutcome<undefined>> {\n const answer = answerOf(input);\n if (!answer.isOk) {\n return answer;\n }\n return attempt(fleet, async (api) => {\n await api.people.answer.mutate({ deliveryId, ...answer.value });\n return undefined;\n });\n}\n\n/** Puts the person's answer to a question in the basket, or changes it there: nothing is sent (Bridge, section 9). */\nexport async function putInBasket({ fleet, deliveryId, option, note }: { fleet: string; deliveryId: string; option: number; note: string }): Promise<ActionOutcome<undefined>> {\n return attempt(fleet, async (api) => {\n await api.people.putInBasket.mutate({ deliveryId, option, note });\n return undefined;\n });\n}\n\n/** Takes an answer out of the basket; one the fleet refused marks its question done, not sent. */\nexport async function removeFromBasket(fleet: string, questionId: string): Promise<ActionOutcome<undefined>> {\n return attempt(fleet, async (api) => {\n await api.people.removeFromBasket.mutate({ questionId });\n return undefined;\n });\n}\n\n/** Send N answers: each entry stored as sending, then sent on its own by the gateway. */\nexport async function sendBasket(fleet: string): Promise<ActionOutcome<BasketSent>> {\n return attempt(fleet, (api) => api.people.sendBasket.mutate());\n}\n\n/** Is done with an item; a step done or cannot, with the person's note if they wrote one, its outcome sent at once (CC14, CC23). */\nexport async function doneDelivery({ fleet, deliveryId, step }: { fleet: string; deliveryId: string; step?: { outcome: 'done' | 'cannot'; note: string } }): Promise<ActionOutcome<undefined>> {\n return attempt(fleet, async (api) => {\n await api.people.done.mutate(step === undefined ? { deliveryId } : { deliveryId, ...step });\n return undefined;\n });\n}\n\n/** Turns a place on or off for a job: it applies at once (Bridge, section 8). */\nexport async function turnRoute({ fleet, job, place, isOn }: { fleet: string; job: RoutedJob; place: RoutedPlace; isOn: boolean }): Promise<ActionOutcome<undefined>> {\n return attempt(fleet, async (api) => {\n await api.people.turnRoute.mutate({ job, place, isOn });\n return undefined;\n });\n}\n\n/** Turns web push on for the browser that subscribed (wake a person, W8). */\nexport async function turnOnWebPush(fleet: string, subscription: SubscriptionInput): Promise<ActionOutcome<undefined>> {\n return attempt(fleet, async (api) => {\n await api.people.turnOnWebPush.mutate({ endpoint: subscription.endpoint, keys: { p256dh: subscription.keys.p256dh, auth: subscription.keys.auth }, browser: subscription.browser });\n return undefined;\n });\n}\n\n/** Removes a browser the person turned web push on in. */\nexport async function turnOffWebPush(fleet: string, endpoint: string): Promise<ActionOutcome<undefined>> {\n return attempt(fleet, async (api) => {\n await api.people.turnOffWebPush.mutate({ endpoint });\n return undefined;\n });\n}\n\n/** Unlinks the person's Slack account (gateway scopes 9.3). */\nexport async function unlinkSlack(fleet: string): Promise<ActionOutcome<undefined>> {\n return attempt(fleet, async (api) => {\n await api.slack.unlink.mutate();\n return undefined;\n });\n}\n\n/** Decides a request; approving names the proxy ship, its owner and its scopes, messages:send and messages:receive always among them. */\nexport async function decideRequest({ fleet, requestId, input }: { fleet: string; requestId: string; input: DecisionInput }): Promise<ActionOutcome<undefined>> {\n if (input.kind === 'deny') {\n return attempt(fleet, async (api) => {\n await api.requests.decide.mutate({ requestId, decision: { kind: 'deny' } });\n return undefined;\n });\n }\n const ownerShipId = idSchema('ship').safeParse(input.ownerShipId.trim());\n if (!ownerShipId.success) {\n return { isOk: false, message: \"The owner's ship id is not a ship id (shp_...)\" };\n }\n const party = { name: input.name, ownerShipId: ownerShipId.data, scopes: [...new Set([...EVERY_APP_SHIP_SCOPES, ...input.scopes])] };\n const { server } = input;\n const credential = server === undefined ? undefined : serverCredentialOf(server);\n return attempt(fleet, async (api) => {\n await api.requests.decide.mutate({ requestId, decision: { kind: 'approve', party, ...(server === undefined || credential === undefined ? {} : { server: { credential, concurrencyLimit: server.concurrencyLimit } }) } });\n return undefined;\n });\n}\n","unable to read source [project]/node_modules/@aeolus-fleet/common/src/rules/page-size.ts","unable to read source [project]/node_modules/@aeolus-fleet/common/src/schemas/alert.ts","unable to read source [project]/node_modules/@aeolus-fleet/common/src/schemas/question.ts","unable to read source [project]/node_modules/@aeolus-fleet/common/src/schemas/page.ts","unable to read source [project]/node_modules/@aeolus-fleet/common/src/schemas/report.ts","unable to read source [project]/node_modules/@aeolus-fleet/common/src/rules/payload.ts","/**\n * An item that reached a person, as Bridge shows it once opened, and the\n * answer its form sends: pure view logic, no React and no API client.\n */\nimport { ALERT_CONTENT_TYPE, ANSWER_CONTENT_TYPE, answerSchema, isQuestionContentType, questionSchema, withdrawalOf, type Question } from '@aeolus-fleet/common';\nimport { z } from 'zod';\nimport type { inferRouterOutputs } from '@trpc/server';\n\nimport type { GatewayRouter } from '../../../../src/adapters/trpc/router.js';\n\n/** The channels that wake a person when something waits for their person ship, as the API shows them (wake a person, W8). */\nexport type WakeChannels = inferRouterOutputs<GatewayRouter>['people']['wakeChannels'];\n\n/**\n * A delivery in focus: whole, as the person opened it or opened it again,\n * with its question when it is one.\n */\nexport interface FocusedDelivery {\n readonly deliveryId: string;\n readonly from: string;\n readonly title: string;\n readonly sentAt: string;\n readonly payload: string;\n /** What it shows of its payload: an alert's or a notice's body, any other payload as it came. */\n readonly body: string;\n readonly question: Question | undefined;\n /** The step it asks (CC14), when it is one. */\n readonly step: StepView | undefined;\n /** The meeting it was contributed to or tells of, when it belongs to one. */\n readonly meetingId: string | undefined;\n /** Whether its asker withdrew or replaced the question it asks, with the replacement, a new item. */\n readonly stale: Stale | null;\n}\n\n/** A question its asker withdrew or replaced (decision 0038), as the API says it. */\nexport interface Stale {\n readonly kind: 'withdrawn' | 'replaced';\n readonly replacementId: string | null;\n}\n\n/** The question a delivery asks (decision 0038): a question's own, or the new question a replacement asks. */\nexport function questionOf(opened: { contentType: string; payload: string }): Question | undefined {\n if (!isQuestionContentType(opened.contentType)) {\n return withdrawalOf(opened)?.replacement ?? undefined;\n }\n try {\n const question = questionSchema.safeParse(JSON.parse(opened.payload));\n return question.success ? question.data : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** A step as Bridge shows it (CC14): its title, why, and its link with the host it leads to, when it has one. */\nexport interface StepView {\n readonly title: string;\n readonly why: string;\n readonly link: { readonly href: string; readonly host: string } | undefined;\n}\n\n/** The step content type (CC14), as common names it from its release after 0.35.0; it moves to common's constant then. */\nconst STEP_CONTENT_TYPE = 'application/vnd.aeolus.step+json';\n\n/** What Bridge reads of a step, as common's stepSchema words it from its release after 0.35.0 (Bridge B2); it moves to common's then. */\nconst stepSchema = z.object({ title: z.string().min(1), why: z.string(), link: z.url({ protocol: /^https?$/ }).optional() });\n\n/** The step a delivery asks; none for any other message, or one whose payload does not read. */\nexport function stepOf(opened: { contentType: string; payload: string }): StepView | undefined {\n const [essence = ''] = opened.contentType.split(';');\n if (essence.trim().toLowerCase() !== STEP_CONTENT_TYPE) {\n return undefined;\n }\n try {\n const step = stepSchema.safeParse(JSON.parse(opened.payload));\n if (!step.success) {\n return undefined;\n }\n const { title, why, link } = step.data;\n return { title, why, link: link === undefined ? undefined : { href: link, host: new URL(link).host } };\n } catch {\n return undefined;\n }\n}\n\n/** The notice content type (CC15), as common names it from its release after 0.35.0; it moves to common's constant then. */\nconst NOTICE_CONTENT_TYPE = 'application/vnd.aeolus.notice+json';\n\nconst BODIED = new Set([ALERT_CONTENT_TYPE, NOTICE_CONTENT_TYPE]);\n\nconst bodiedSchema = z.object({ body: z.string() });\n\n/** An alert's or a notice's body; any other payload, or one that does not read, as it came. */\nexport function bodyOf(opened: { contentType: string; payload: string }): string {\n const [essence = ''] = opened.contentType.split(';');\n if (!BODIED.has(essence.trim().toLowerCase())) {\n return opened.payload;\n }\n try {\n return bodiedSchema.safeParse(JSON.parse(opened.payload)).data?.body ?? opened.payload;\n } catch {\n return opened.payload;\n }\n}\n\n/** What the person sends: an option they tapped and a note, or a note alone. */\nexport interface AnswerInput {\n readonly questionId: string | undefined;\n readonly option: number | undefined;\n readonly note: string;\n}\n\n/** The answer a form sends: an option and a note, or a note alone, for a question; a note as plain text otherwise. */\nexport function answerOf(input: AnswerInput): { isOk: true; value: { contentType: string; payload: string } } | { isOk: false; message: string } {\n const note = input.note.trim();\n if (input.questionId === undefined) {\n return note === '' ? { isOk: false, message: 'Write your answer first' } : { isOk: true, value: { contentType: 'text/plain', payload: note } };\n }\n const answer = answerSchema.safeParse({ questionId: input.questionId, ...(input.option === undefined ? {} : { option: input.option }), ...(note === '' ? {} : { note }) });\n return answer.success ? { isOk: true, value: { contentType: ANSWER_CONTENT_TYPE, payload: JSON.stringify(answer.data) } } : { isOk: false, message: 'Tap an option, or write a note' };\n}\n"],"names":[],"mappings":"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","ignoreList":[1,2,3,4,5,6]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
(()=>{"use strict";module.exports=[87952,a=>{var b=a.i(87924),c=a.i(72131),d=a.i(5050);let e=(0,d.createServerReference)("40d55047d0fa263dfb22afcf17c36e422f88773b7f",d.callServer,void 0,d.findSourceMapURL,"turnRoute"),f=["slack","chat","web-push","email"],g={decide:{name:"Decide",holds:"Questions from your ships",item:"question",items:"questions"},do:{name:"Do what only you can",holds:"Steps: sign in, create, approve",item:"step",items:"steps"},"stay-aware":{name:"Stay aware",holds:"Alerts and notices",item:"alert or notice",items:"alerts and notices"},"everything-else":{name:"Everything else",holds:"Replies and other messages",item:"message",items:"messages"}},h={slack:"Slack",chat:"A chat","web-push":"Web push",email:"Email"},i="Bridge keeps every item.";var j=a.i(10039);a.s(["RoutingPanel",0,function({fleetId:a,routing:d,isSlackLinked:k}){let[l,m]=(0,c.useTransition)(),[n,o]=(0,c.useState)(),[p,q]=(0,c.useState)();return(0,b.jsxs)("section",{className:"grid gap-2","aria-labelledby":"bridge-routing-heading",children:[(0,b.jsx)("h2",{id:"bridge-routing-heading",className:"text-section font-semibold",children:"Per job"}),(0,b.jsx)("div",{className:"overflow-x-auto rounded-md border border-border bg-card",children:(0,b.jsxs)("table",{className:"w-full text-left",children:[(0,b.jsx)("thead",{children:(0,b.jsxs)("tr",{className:"border-b border-border text-caption text-muted-foreground",children:[(0,b.jsx)("th",{scope:"col",className:"p-3 font-medium",children:"Job"}),(0,b.jsx)("th",{scope:"col",className:"p-3 font-medium",children:"Bridge"}),f.map(a=>(0,b.jsx)("th",{scope:"col",className:"p-3 font-medium",children:h[a]},a))]})}),(0,b.jsx)("tbody",{children:d.jobs.map(({job:c,places:j})=>(0,b.jsxs)("tr",{"data-testid":"bridge-routing-job",className:"border-b border-border last:border-b-0",children:[(0,b.jsx)("th",{scope:"row",className:"p-3 font-normal",children:(0,b.jsxs)("span",{className:"flex flex-col",children:[(0,b.jsx)("span",{children:g[c].name}),(0,b.jsx)("span",{className:"text-caption text-muted-foreground",children:g[c].holds})]})}),(0,b.jsx)("td",{className:"p-3 text-caption text-muted-foreground",children:"Always"}),f.map(f=>{let p=j[f],r=`${c}-${f}`;return(0,b.jsx)("td",{className:"p-3",children:(0,b.jsx)("button",{type:"button","data-testid":`bridge-routing-${r}`,"aria-pressed":p,"aria-label":`${h[f]} for ${g[c].name}`,"aria-busy":l&&n===r,disabled:l||!p&&(!d.offered[f]||"slack"===f&&!k),onClick:()=>{var b;b={job:c,place:f,isOn:!p},q(void 0),o(`${b.job}-${b.place}`),m(async()=>{let c=await e({fleet:a,...b});q(c.isOk?{message:function({job:a,place:b,isOn:c}){let{name:d,item:e,items:f}=g[a],j=`${h[b]} is ${c?"on":"off"} for ${d}`;return c?"chat"===b?`${j}: it lists every ${e} not done when you ask it.`:`${j}: it shows ${f} that arrive from now on. Those already waiting stay in Bridge.`:"everything-else"===a&&"slack"===b?`${j}: only a bot ship's messages and replies to Slack show there. ${i}`:`${j}. ${i}`}(b),isFailure:!1}:{message:c.message,isFailure:!0})})},className:`inline-flex h-7 min-w-12 items-center justify-center rounded-full px-3 text-caption disabled:cursor-not-allowed disabled:opacity-50 ${p?"bg-primary text-primary-foreground":"border border-border bg-card text-muted-foreground hover:bg-accent"}`,children:p?"On":"Off"})},f)})]},c))})]})}),void 0===p?null:(0,b.jsx)(j.f,{message:p.message,isFailure:p.isFailure}),(0,b.jsx)("p",{className:"text-caption text-muted-foreground",children:"While a Bridge page is open in focus, web push and email do not wake you. Slack still posts: you turned it on, and Bridge keeps every item."})]})}],87952)},15970,a=>{var b=a.i(87924),c=a.i(72131),d=a.i(5050);let e=(0,d.createServerReference)("4068e0a012962959eed53cdc1898b8acfd21d81a71",d.callServer,void 0,d.findSourceMapURL,"unlinkSlack");var f=a.i(32043),g=a.i(10039);a.s(["SlackLinkPanel",0,function({fleetId:a,slackLink:d}){let[h,i]=(0,c.useTransition)(),[j,k]=(0,c.useState)(),{workspaceName:l,link:m}=d;return(0,b.jsxs)("section",{className:"grid gap-2","aria-labelledby":"bridge-slack-heading",children:[(0,b.jsx)("h2",{id:"bridge-slack-heading",className:"text-section font-semibold",children:"Slack"}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-3 rounded-md border border-border bg-card p-3",children:[(0,b.jsx)("span",{"data-testid":"bridge-slack-state",className:"min-w-0 flex-1",children:null===m?`Not linked in ${l}`:`Slack linked as @${m.slackName} in ${l}`}),null===m?(0,b.jsx)("a",{href:`/slack/link?${new URLSearchParams({fleet:a}).toString()}`,"data-testid":"bridge-slack-link",className:"inline-flex h-9 items-center rounded-md bg-primary px-4 text-primary-foreground hover:bg-primary-hover",children:"Link Slack"}):(0,b.jsx)(f.f,{"data-testid":"bridge-slack-unlink",isPending:h,pendingLabel:"Unlinking...",onClick:()=>{k(void 0),i(async()=>{let b=await e(a);b.isOk||k(b.message)})},children:"Unlink"})]}),void 0===j?null:(0,b.jsx)(g.f,{message:j,isFailure:!0})]})}],15970)},62887,a=>{var b=a.i(87924),c=a.i(72131),d=a.i(5050);let e=(0,d.createServerReference)("601545266cbcd00188699907a363d2d01cacdd7590",d.callServer,void 0,d.findSourceMapURL,"turnOffWebPush"),f=(0,d.createServerReference)("606869fb42c6cf9c02d918ac32cc0df0df992ce8e8",d.callServer,void 0,d.findSourceMapURL,"turnOnWebPush"),g=[[/Edg\//,"Edge"],[/Firefox\//,"Firefox"],[/Chrome\//,"Chrome"],[/Safari\//,"Safari"]],h=[[/iPhone|iPad/,"iOS"],[/Android/,"Android"],[/Mac OS X/,"macOS"],[/Windows/,"Windows"],[/Linux/,"Linux"]],i=(a,b)=>b.find(([b])=>b.test(a))?.[1];var j=a.i(32043),k=a.i(10039);let l="/wake-worker.js";async function m(){let a=await navigator.serviceWorker.getRegistration(l);return await a?.pushManager.getSubscription()??null}async function n(a){let b;if(await Notification.requestPermission()!=="granted")return{isOk:!1,message:"Your browser did not allow notifications from this site: allow them, then turn web push on again"};let c=await navigator.serviceWorker.register(l);return await navigator.serviceWorker.ready,{isOk:!0,value:await c.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:(b=atob(a.replaceAll("-","+").replaceAll("_","/")),Uint8Array.from(b,a=>a.charCodeAt(0)))})}}a.s(["WebPushPanel",0,function({fleetId:a,webPushKey:d,browsers:l}){let[o,p]=(0,c.useState)(!0),[q,r]=(0,c.useState)(),[s,t]=(0,c.useState)(),[u,v]=(0,c.useState)(),[,w]=(0,c.useTransition)();(0,c.useEffect)(()=>{"serviceWorker"in navigator&&"PushManager"in window&&"Notification"in window?m().then(a=>{r(a?.endpoint)}):p(!1)},[]);let x=void 0!==q&&l.some(({endpoint:a,isGone:b})=>a===q&&!b);return(0,b.jsxs)("div",{className:"grid gap-2","data-testid":"bridge-wake-web-push",children:[l.map(({endpoint:c,browser:d,addedAt:f,isGone:g})=>(0,b.jsxs)("div",{className:"flex items-center gap-3 rounded-md border border-border bg-card p-3",children:[(0,b.jsxs)("span",{className:"flex min-w-0 flex-1 flex-col",children:[(0,b.jsxs)("span",{className:"truncate",children:["Web push in ",d,c===q?" · this browser":""]}),(0,b.jsx)("span",{className:"text-caption text-muted-foreground",children:g?"No longer takes wakes: its push service ended them. Turn web push on again in that browser, or remove it.":`On since ${new Date(f).toLocaleDateString()}: it tells you when something waits in this fleet, with a link here. Never what waits.`})]}),(0,b.jsx)(j.f,{"data-testid":"bridge-web-push-remove",isPending:s===c,pendingLabel:"Removing...",disabled:void 0!==s,onClick:()=>{t(c),v(void 0),w(async()=>{c===q&&(await (await m())?.unsubscribe(),r(void 0));let b=await e(a,c);t(void 0),b.isOk||v(b.message)})},children:"Remove"})]},c)),o?x?null:(0,b.jsx)("div",{children:(0,b.jsx)(j.f,{"data-testid":"bridge-web-push-on",variant:"primary",isPending:"on"===s,pendingLabel:"Turning on...",disabled:void 0!==s,onClick:()=>{t("on"),v(void 0),w(async()=>{try{var b;let c,e,j=await n(d);if(!j.isOk)return void v(j.message);let k=function(a,b){let{endpoint:c,keys:d}=a,e=d?.p256dh,f=d?.auth;return void 0===c||void 0===e||void 0===f?void 0:{endpoint:c,keys:{p256dh:e,auth:f},browser:b}}(j.value.toJSON(),(b=navigator.userAgent,c=i(b,g),e=i(b,h),void 0===c?"A browser":void 0===e?c:`${c} on ${e}`));if(void 0===k)return void v("Your browser gave no push subscription: try again");let l=await f(a,k);l.isOk?r(k.endpoint):v(l.message)}catch{v("Your browser could not turn web push on: try again")}finally{t(void 0)}})},children:"Turn on web push in this browser"})}):(0,b.jsx)("p",{className:"text-caption text-muted-foreground",children:"This browser takes no web push."}),void 0===u?null:(0,b.jsx)(k.f,{message:u,isFailure:!0})]})}],62887)}]})();
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=web_features_bridge_state_0354e3wb0dzx1._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/bridge/state/routing-panel.tsx","../../../../../web/features/bridge/hooks/data%3A50db25%20%3Ctext/javascript%3E","../../../../../web/features/bridge/services/routing.ts","../../../../../web/features/bridge/state/slack-link-panel.tsx","../../../../../web/features/bridge/hooks/data%3Ab85c88%20%3Ctext/javascript%3E","../../../../../web/features/bridge/hooks/slack-link-path.ts","../../../../../web/features/bridge/state/web-push-panel.tsx","../../../../../web/features/bridge/hooks/data%3A2e8654%20%3Ctext/javascript%3E","../../../../../web/features/bridge/hooks/data%3A60870e%20%3Ctext/javascript%3E","../../../../../web/features/bridge/services/web-push.ts"],"sourcesContent":["'use client';\n\nimport { useState, useTransition } from 'react';\n\nimport { turnRoute } from '../hooks/bridge-actions';\nimport { JOB_NAMES, PLACE_NAMES, ROUTED_PLACES, turnedMessageOf, type RoutedJob, type RoutedPlace, type RoutingView } from '../services/routing';\nimport { Notice } from '../ui/notice';\n\n/** What a change came to, said by the grid. */\ninterface Said {\n readonly message: string;\n readonly isFailure: boolean;\n}\n\n/**\n * Routing per job (Bridge, section 8; the routing mockup): per job, the\n * places that show it besides Bridge, which always does. A switch turns a\n * place on or off at once; what it then shows is said beside the grid\n * (CC20). A place the gateway does not offer, or Slack before it is linked,\n * cannot be turned on; one on can always be turned off.\n */\nexport function RoutingPanel({ fleetId, routing, isSlackLinked }: { fleetId: string; routing: RoutingView; isSlackLinked: boolean }) {\n const [isTurning, startTransition] = useTransition();\n const [turning, setTurning] = useState<string | undefined>();\n const [said, setSaid] = useState<Said | undefined>();\n const isUsable = (place: RoutedPlace): boolean => routing.offered[place] && (place !== 'slack' || isSlackLinked);\n\n const turn = (change: { job: RoutedJob; place: RoutedPlace; isOn: boolean }) => {\n setSaid(undefined);\n setTurning(`${change.job}-${change.place}`);\n startTransition(async () => {\n const outcome = await turnRoute({ fleet: fleetId, ...change });\n setSaid(outcome.isOk ? { message: turnedMessageOf(change), isFailure: false } : { message: outcome.message, isFailure: true });\n });\n };\n\n return (\n <section className=\"grid gap-2\" aria-labelledby=\"bridge-routing-heading\">\n <h2 id=\"bridge-routing-heading\" className=\"text-section font-semibold\">\n Per job\n </h2>\n <div className=\"overflow-x-auto rounded-md border border-border bg-card\">\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-border text-caption text-muted-foreground\">\n <th scope=\"col\" className=\"p-3 font-medium\">\n Job\n </th>\n <th scope=\"col\" className=\"p-3 font-medium\">\n Bridge\n </th>\n {ROUTED_PLACES.map((place) => (\n <th key={place} scope=\"col\" className=\"p-3 font-medium\">\n {PLACE_NAMES[place]}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {routing.jobs.map(({ job, places }) => (\n <tr key={job} data-testid=\"bridge-routing-job\" className=\"border-b border-border last:border-b-0\">\n <th scope=\"row\" className=\"p-3 font-normal\">\n <span className=\"flex flex-col\">\n <span>{JOB_NAMES[job].name}</span>\n <span className=\"text-caption text-muted-foreground\">{JOB_NAMES[job].holds}</span>\n </span>\n </th>\n <td className=\"p-3 text-caption text-muted-foreground\">Always</td>\n {ROUTED_PLACES.map((place) => {\n const isOn = places[place];\n const key = `${job}-${place}`;\n return (\n <td key={place} className=\"p-3\">\n <button\n type=\"button\"\n data-testid={`bridge-routing-${key}`}\n aria-pressed={isOn}\n aria-label={`${PLACE_NAMES[place]} for ${JOB_NAMES[job].name}`}\n aria-busy={isTurning && turning === key}\n disabled={isTurning || (!isOn && !isUsable(place))}\n onClick={() => {\n turn({ job, place, isOn: !isOn });\n }}\n className={`inline-flex h-7 min-w-12 items-center justify-center rounded-full px-3 text-caption disabled:cursor-not-allowed disabled:opacity-50 ${isOn ? 'bg-primary text-primary-foreground' : 'border border-border bg-card text-muted-foreground hover:bg-accent'}`}\n >\n {isOn ? 'On' : 'Off'}\n </button>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {said === undefined ? null : <Notice message={said.message} isFailure={said.isFailure} />}\n <p className=\"text-caption text-muted-foreground\">While a Bridge page is open in focus, web push and email do not wake you. Slack still posts: you turned it on, and Bridge keeps every item.</p>\n </section>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40d55047d0fa263dfb22afcf17c36e422f88773b7f\":{\"name\":\"turnRoute\"}},\"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_7=/*#__PURE__*/createServerReference(\"40d55047d0fa263dfb22afcf17c36e422f88773b7f\",callServer,void 0,findSourceMapURL,\"turnRoute\");export{$$RSC_SERVER_ACTION_7 as turnRoute};","/**\n * Routing per job as Bridge's routing page shows it (Bridge, section 8):\n * the jobs and places by the names the person reads, and what a change\n * says it does (CC20).\n */\nimport type { inferRouterOutputs } from '@trpc/server';\n\nimport type { GatewayRouter } from '../../../../src/adapters/trpc/router.js';\n\n/** Where each job shows besides Bridge, per place, as the API answers it. */\nexport type RoutingView = inferRouterOutputs<GatewayRouter>['people']['routing'];\nexport type RoutedJob = RoutingView['jobs'][number]['job'];\nexport type RoutedPlace = keyof RoutingView['offered'];\n\nexport const ROUTED_PLACES: readonly RoutedPlace[] = ['slack', 'chat', 'web-push', 'email'];\n\nexport const JOB_NAMES: Readonly<Record<RoutedJob, { readonly name: string; readonly holds: string; readonly item: string; readonly items: string }>> = {\n decide: { name: 'Decide', holds: 'Questions from your ships', item: 'question', items: 'questions' },\n do: { name: 'Do what only you can', holds: 'Steps: sign in, create, approve', item: 'step', items: 'steps' },\n 'stay-aware': { name: 'Stay aware', holds: 'Alerts and notices', item: 'alert or notice', items: 'alerts and notices' },\n 'everything-else': { name: 'Everything else', holds: 'Replies and other messages', item: 'message', items: 'messages' },\n};\n\nexport const PLACE_NAMES: Readonly<Record<RoutedPlace, string>> = { slack: 'Slack', chat: 'A chat', 'web-push': 'Web push', email: 'Email' };\n\nconst KEEPS_EVERY_ITEM = 'Bridge keeps every item.';\n\n/** What turning a place on or off for a job does: a chat lists what is not done, a place that pushes only what arrives after. */\nexport function turnedMessageOf({ job, place, isOn }: { job: RoutedJob; place: RoutedPlace; isOn: boolean }): string {\n const { name, item, items } = JOB_NAMES[job];\n const turned = `${PLACE_NAMES[place]} is ${isOn ? 'on' : 'off'} for ${name}`;\n if (!isOn) {\n return job === 'everything-else' && place === 'slack' ? `${turned}: only a bot ship's messages and replies to Slack show there. ${KEEPS_EVERY_ITEM}` : `${turned}. ${KEEPS_EVERY_ITEM}`;\n }\n if (place === 'chat') {\n return `${turned}: it lists every ${item} not done when you ask it.`;\n }\n return `${turned}: it shows ${items} that arrive from now on. Those already waiting stay in Bridge.`;\n}\n","'use client';\n\nimport { useState, useTransition } from 'react';\n\nimport { unlinkSlack } from '../hooks/bridge-actions';\nimport type { SlackLink } from '../hooks/read-bridge';\nimport { SLACK_LINK_PATH } from '../hooks/slack-link-path';\nimport { ActionButton } from '../ui/action-button';\nimport { Notice } from '../ui/notice';\n\n/**\n * The person's Slack link (gateway scopes 9.3, 9.6): \"Slack linked as\n * @mathilde in Acme\" with Unlink, or Link Slack, which signs in with Slack.\n * Linked, the person talks to the fleet's bots in Slack; what else shows\n * there is routed per job, beside it (Bridge, section 8).\n */\nexport function SlackLinkPanel({ fleetId, slackLink }: { fleetId: string; slackLink: SlackLink }) {\n const [isUnlinking, startTransition] = useTransition();\n const [failure, setFailure] = useState<string | undefined>();\n const { workspaceName, link } = slackLink;\n\n const unlink = () => {\n setFailure(undefined);\n startTransition(async () => {\n const outcome = await unlinkSlack(fleetId);\n if (!outcome.isOk) {\n setFailure(outcome.message);\n }\n });\n };\n\n return (\n <section className=\"grid gap-2\" aria-labelledby=\"bridge-slack-heading\">\n <h2 id=\"bridge-slack-heading\" className=\"text-section font-semibold\">\n Slack\n </h2>\n <div className=\"flex flex-wrap items-center gap-3 rounded-md border border-border bg-card p-3\">\n <span data-testid=\"bridge-slack-state\" className=\"min-w-0 flex-1\">\n {link === null ? `Not linked in ${workspaceName}` : `Slack linked as @${link.slackName} in ${workspaceName}`}\n </span>\n {link === null ? (\n <a\n href={`${SLACK_LINK_PATH}?${new URLSearchParams({ fleet: fleetId }).toString()}`}\n data-testid=\"bridge-slack-link\"\n className=\"inline-flex h-9 items-center rounded-md bg-primary px-4 text-primary-foreground hover:bg-primary-hover\"\n >\n Link Slack\n </a>\n ) : (\n <ActionButton data-testid=\"bridge-slack-unlink\" isPending={isUnlinking} pendingLabel=\"Unlinking...\" onClick={unlink}>\n Unlink\n </ActionButton>\n )}\n </div>\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n </section>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"4068e0a012962959eed53cdc1898b8acfd21d81a71\":{\"name\":\"unlinkSlack\"}},\"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_10=/*#__PURE__*/createServerReference(\"4068e0a012962959eed53cdc1898b8acfd21d81a71\",callServer,void 0,findSourceMapURL,\"unlinkSlack\");export{$$RSC_SERVER_ACTION_10 as unlinkSlack};","/** Where Link Slack starts (gateway scopes 9.3): the button in Bridge's settings and the button in a bot's answer in Slack (src/core/slack/take-slack-event.ts). */\nexport const SLACK_LINK_PATH = '/slack/link';\n","'use client';\n\nimport { useEffect, useState, useTransition } from 'react';\n\nimport { turnOffWebPush, turnOnWebPush } from '../hooks/bridge-actions';\nimport type { WakeChannels } from '../services/deliveries';\nimport { applicationServerKeyOf, browserNameOf, subscriptionInputOf } from '../services/web-push';\nimport { ActionButton } from '../ui/action-button';\nimport { Notice } from '../ui/notice';\n\n/** The service worker that shows a wake and opens Bridge when it is pressed. */\nconst WORKER_PATH = '/wake-worker.js';\n\n/** Whether this browser takes web push at all. */\nfunction isPushTaken(): boolean {\n return 'serviceWorker' in navigator && 'PushManager' in window && 'Notification' in window;\n}\n\n/** This browser's own push subscription with the gateway's worker, if it has one. */\nasync function ownSubscription(): Promise<PushSubscription | null> {\n const registration = await navigator.serviceWorker.getRegistration(WORKER_PATH);\n return (await registration?.pushManager.getSubscription()) ?? null;\n}\n\n/** Asks the browser's permission, then subscribes it with the gateway's key: the subscription to send, or why there is none. */\nasync function subscribed(webPushKey: string): Promise<{ readonly isOk: true; readonly value: PushSubscription } | { readonly isOk: false; readonly message: string }> {\n if ((await Notification.requestPermission()) !== 'granted') {\n return { isOk: false, message: 'Your browser did not allow notifications from this site: allow them, then turn web push on again' };\n }\n const registration = await navigator.serviceWorker.register(WORKER_PATH);\n await navigator.serviceWorker.ready;\n return { isOk: true, value: await registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: applicationServerKeyOf(webPushKey) }) };\n}\n\n/**\n * Web push in the section of wakes of Bridge's settings (wake a person, W8): the\n * person turns it on for this browser, which asks the browser's permission\n * first, sees the browsers they turned it on in, and removes one. Nothing is\n * on until they turn it on. A browser whose push service ended its\n * subscription is said to be gone.\n */\nexport function WebPushPanel({ fleetId, webPushKey, browsers }: { fleetId: string; webPushKey: string; browsers: WakeChannels['webPush']['browsers'] }) {\n const [isTaken, setIsTaken] = useState(true);\n const [ownEndpoint, setOwnEndpoint] = useState<string | undefined>();\n const [working, setWorking] = useState<string | undefined>();\n const [failure, setFailure] = useState<string | undefined>();\n const [, startTransition] = useTransition();\n\n useEffect(() => {\n if (!isPushTaken()) {\n setIsTaken(false);\n return;\n }\n void ownSubscription().then((own) => {\n setOwnEndpoint(own?.endpoint);\n });\n }, []);\n\n const turnOn = () => {\n setWorking('on');\n setFailure(undefined);\n startTransition(async () => {\n try {\n const subscription = await subscribed(webPushKey);\n if (!subscription.isOk) {\n setFailure(subscription.message);\n return;\n }\n const input = subscriptionInputOf(subscription.value.toJSON(), browserNameOf(navigator.userAgent));\n if (input === undefined) {\n setFailure('Your browser gave no push subscription: try again');\n return;\n }\n const outcome = await turnOnWebPush(fleetId, input);\n if (outcome.isOk) {\n setOwnEndpoint(input.endpoint);\n } else {\n setFailure(outcome.message);\n }\n } catch {\n setFailure('Your browser could not turn web push on: try again');\n } finally {\n setWorking(undefined);\n }\n });\n };\n\n const remove = (endpoint: string) => {\n setWorking(endpoint);\n setFailure(undefined);\n startTransition(async () => {\n if (endpoint === ownEndpoint) {\n await (await ownSubscription())?.unsubscribe();\n setOwnEndpoint(undefined);\n }\n const outcome = await turnOffWebPush(fleetId, endpoint);\n setWorking(undefined);\n if (!outcome.isOk) {\n setFailure(outcome.message);\n }\n });\n };\n\n const isOwnOn = ownEndpoint !== undefined && browsers.some(({ endpoint, isGone }) => endpoint === ownEndpoint && !isGone);\n return (\n <div className=\"grid gap-2\" data-testid=\"bridge-wake-web-push\">\n {browsers.map(({ endpoint, browser, addedAt, isGone }) => (\n <div key={endpoint} className=\"flex items-center gap-3 rounded-md border border-border bg-card p-3\">\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate\">\n Web push in {browser}\n {endpoint === ownEndpoint ? ' · this browser' : ''}\n </span>\n <span className=\"text-caption text-muted-foreground\">\n {isGone ? 'No longer takes wakes: its push service ended them. Turn web push on again in that browser, or remove it.' : `On since ${new Date(addedAt).toLocaleDateString()}: it tells you when something waits in this fleet, with a link here. Never what waits.`}\n </span>\n </span>\n <ActionButton data-testid=\"bridge-web-push-remove\" isPending={working === endpoint} pendingLabel=\"Removing...\" disabled={working !== undefined} onClick={() => { remove(endpoint); }}>\n Remove\n </ActionButton>\n </div>\n ))}\n {!isTaken ? (\n <p className=\"text-caption text-muted-foreground\">This browser takes no web push.</p>\n ) : isOwnOn ? null : (\n <div>\n <ActionButton data-testid=\"bridge-web-push-on\" variant=\"primary\" isPending={working === 'on'} pendingLabel=\"Turning on...\" disabled={working !== undefined} onClick={turnOn}>\n Turn on web push in this browser\n </ActionButton>\n </div>\n )}\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"601545266cbcd00188699907a363d2d01cacdd7590\":{\"name\":\"turnOffWebPush\"}},\"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_9=/*#__PURE__*/createServerReference(\"601545266cbcd00188699907a363d2d01cacdd7590\",callServer,void 0,findSourceMapURL,\"turnOffWebPush\");export{$$RSC_SERVER_ACTION_9 as turnOffWebPush};","/* __next_internal_action_entry_do_not_use__ [{\"606869fb42c6cf9c02d918ac32cc0df0df992ce8e8\":{\"name\":\"turnOnWebPush\"}},\"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_8=/*#__PURE__*/createServerReference(\"606869fb42c6cf9c02d918ac32cc0df0df992ce8e8\",callServer,void 0,findSourceMapURL,\"turnOnWebPush\");export{$$RSC_SERVER_ACTION_8 as turnOnWebPush};","/**\n * What the section of wakes of Bridge's settings works out in the browser (wake a\n * person, W8): the name a browser it turns web push on in is listed by, the\n * gateway's push key as the browser's push manager takes it, and the\n * subscription the browser sends the gateway.\n */\n\n/** A browser's push subscription as the gateway takes it, with the browser's name. */\nexport interface SubscriptionInput {\n readonly endpoint: string;\n readonly keys: { readonly p256dh: string; readonly auth: string };\n readonly browser: string;\n}\n\n/** The browsers and systems a name is made of, the first that matches counting: Edge and Chrome also say Safari, and Chrome says Chrome. */\nconst BROWSERS: readonly (readonly [RegExp, string])[] = [\n [/Edg\\//, 'Edge'],\n [/Firefox\\//, 'Firefox'],\n [/Chrome\\//, 'Chrome'],\n [/Safari\\//, 'Safari'],\n];\nconst SYSTEMS: readonly (readonly [RegExp, string])[] = [\n [/iPhone|iPad/, 'iOS'],\n [/Android/, 'Android'],\n [/Mac OS X/, 'macOS'],\n [/Windows/, 'Windows'],\n [/Linux/, 'Linux'],\n];\n\nconst firstOf = (userAgent: string, names: readonly (readonly [RegExp, string])[]): string | undefined => names.find(([pattern]) => pattern.test(userAgent))?.[1];\n\n/** The name a browser is listed by, such as Firefox on Linux, from its user agent. */\nexport function browserNameOf(userAgent: string): string {\n const browser = firstOf(userAgent, BROWSERS);\n const system = firstOf(userAgent, SYSTEMS);\n if (browser === undefined) {\n return 'A browser';\n }\n return system === undefined ? browser : `${browser} on ${system}`;\n}\n\n/** The bytes a base64url key stands for, as the browser's push manager takes the gateway's key. */\nexport function applicationServerKeyOf(key: string): Uint8Array<ArrayBuffer> {\n const binary = atob(key.replaceAll('-', '+').replaceAll('_', '/'));\n return Uint8Array.from(binary, (character) => character.charCodeAt(0));\n}\n\n/** The subscription to send, from the push manager's own, or none when it gave no endpoint or keys. */\nexport function subscriptionInputOf(subscription: { endpoint?: string; keys?: Record<string, string> }, browser: string): SubscriptionInput | undefined {\n const { endpoint, keys } = subscription;\n const p256dh = keys?.p256dh;\n const auth = keys?.auth;\n return endpoint === undefined || p256dh === undefined || auth === undefined ? undefined : { endpoint, keys: { p256dh, auth }, browser };\n}\n"],"names":["$$RSC_SERVER_ACTION_7","$$RSC_SERVER_ACTION_10","$$RSC_SERVER_ACTION_9"],"mappings":"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"}
|
package/web/.next/server/chunks/ssr/web_features_bridge_state_basket-panel_tsx_1qi_kzld0rfgs._.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports=[80198,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(2305),e=a.i(5050);let f=(0,e.createServerReference)("407bae59090ef46e76fb8d952969288e5bb4583e21",e.callServer,void 0,e.findSourceMapURL,"sendBasket"),g={bridge:"in Bridge",chat:"in a chat",slack:"in Slack",gateway:"by the gateway"},h={withdrawn:"withdrawn",replaced:"replaced",dealtElsewhere:"answered elsewhere"};function i(a){return 1===a?"1 answer":`${String(a)} answers`}var j=a.i(32043),k=a.i(10039),l=a.i(91777);function m({entry:a,opening:c,working:d,onRemove:e}){var f;let{standing:h}=a,i=function(a){let{standing:b}=a;switch(b.kind){case"waiting":return;case"sending":return"Sending... The gateway keeps sending what is stored as sending, with the same key, until it is stored; you can close Bridge.";case"refused":return`Not sent: ${b.reason}. The others were sent.`;case"withdrawn":return`Withdrawn by ${a.from}. Not sent; Send skips it.`;case"replaced":return`Replaced by ${a.from}. Not sent: its options may differ, so answer the new question.`;case"dealtElsewhere":return null===b.option?`Done ${g[b.place]}. Nothing is sent from it.`:`Answered ${g[b.place]}: option ${String(b.option)}. Nothing is sent from it.`}}(a),l=void 0!==d||void 0!==c.openingId,n="replaced"===h.kind?h.replacementId:null;return(0,b.jsxs)("li",{"data-testid":"bridge-basket-entry","data-standing":h.kind,className:`grid min-w-0 gap-2 rounded-md border border-border bg-card p-3 ${"withdrawn"===h.kind||"replaced"===h.kind||"dealtElsewhere"===h.kind?"opacity-60":""}`,children:[(0,b.jsx)("span",{className:"font-medium",children:a.title}),(0,b.jsxs)("span",{className:"text-caption text-muted-foreground",children:["to ",a.from," · asked at ",(0,b.jsx)("time",{dateTime:a.sentAt,children:(f=a.sentAt,`${new Date(f).toISOString().slice(0,16).replace("T"," ")} UTC`)})]}),(0,b.jsxs)("span",{children:["Option ",a.option]}),null===a.note?null:(0,b.jsxs)("span",{className:"text-caption",children:["“",a.note,"”"]}),void 0===i?null:(0,b.jsx)("span",{"data-testid":"bridge-basket-standing",className:"text-caption",children:i}),c.failure?.deliveryId===a.deliveryId?(0,b.jsx)(k.f,{message:c.failure.message,isFailure:!0}):null,(0,b.jsxs)("div",{className:"flex flex-wrap gap-2",children:["waiting"===h.kind?(0,b.jsx)(j.f,{"data-testid":"bridge-basket-change",isPending:c.openingId===a.deliveryId,pendingLabel:"Opening...",disabled:l,onClick:()=>{c.open({deliveryId:a.deliveryId,job:"decide",inBasket:{option:a.option,note:a.note}})},children:"Change"}):null,null===n?null:(0,b.jsx)(j.f,{"data-testid":"bridge-replacement",isPending:c.openingId===n,pendingLabel:"Opening...",disabled:l,onClick:()=>{c.open({deliveryId:n,job:"decide"})},children:"Answer the new question"}),"sending"===h.kind?null:(0,b.jsx)(j.f,{"data-testid":"bridge-basket-remove",isPending:d?.kind==="remove"&&d.questionId===a.questionId,pendingLabel:"Removing...",disabled:l,onClick:()=>{e(a.questionId)},children:"refused"===h.kind?"Remove and mark done":"Remove"})]})]})}a.s(["BasketPanel",0,function({fleetId:a,basket:e}){let[g,n]=(0,c.useState)(),[o,p]=(0,c.useState)(),[,q]=(0,c.useTransition)(),{entries:r,toSend:s}=e,t=b=>{n({kind:"remove",questionId:b}),p(void 0),q(async()=>{let c=await (0,d.f)(a,b);n(void 0),p(c.isOk?void 0:{message:c.message,isFailure:!0})})},u=()=>{n({kind:"send"}),p(void 0),q(async()=>{var b;let c,d=await f(a);n(void 0),p(d.isOk?{message:(c=0===(b=d.value).sending?"Nothing to send.":1===b.sending?"1 answer is being sent.":`${i(b.sending)} are being sent, each on its own, in the order you added them.`,0===b.skipped.length?c:`${c} Not sent: ${b.skipped.map(({title:a,kind:b})=>`“${a}”, ${h[b]}`).join("; ")}.`),isFailure:!1}:{message:d.message,isFailure:!0})})};return(0,b.jsx)(l.f,{fleetId:a,children:a=>(0,b.jsxs)("section",{className:"grid gap-3","aria-labelledby":"bridge-basket-heading",children:[(0,b.jsxs)("div",{children:[(0,b.jsxs)("h1",{id:"bridge-basket-heading",className:"text-heading font-semibold",children:["Basket ",(0,b.jsx)("span",{"data-testid":"bridge-basket-count",children:r.length})]}),(0,b.jsx)("p",{className:"text-muted-foreground",children:"Answers you picked in Bridge, not sent yet. Nothing goes until you press Send."})]}),void 0===o?null:(0,b.jsx)(k.f,{message:o.message,isFailure:o.isFailure}),0===r.length?(0,b.jsxs)("div",{"data-testid":"bridge-basket-empty",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:"The basket is empty"}),(0,b.jsx)("span",{className:"text-muted-foreground",children:"Open a question in Waiting on you and put your answer in the basket."})]}):(0,b.jsx)("ul",{className:"grid gap-2",children:r.map(c=>(0,b.jsx)(m,{entry:c,opening:a,working:g,onRemove:t},c.questionId))}),0===s?null:(0,b.jsxs)("div",{className:"grid gap-1",children:[(0,b.jsx)("p",{className:"text-caption text-muted-foreground",children:"Each asker receives its own answer, as you, as if sent one by one."}),(0,b.jsx)(j.f,{"data-testid":"bridge-basket-send",variant:"primary",className:"justify-self-start",isPending:g?.kind==="send",pendingLabel:"Sending...",disabled:void 0!==g||void 0!==a.openingId,onClick:u,children:`Send ${i(s)}`})]})]})})}],80198)}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=web_features_bridge_state_basket-panel_tsx_1qi_kzld0rfgs._.js.map
|