@aeolus-fleet/gateway 0.32.1 → 0.33.0
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 +22 -3
- package/dist/adapters/crypto/slack-install-seals.d.ts +3 -0
- package/dist/adapters/crypto/slack-install-seals.js +15 -0
- package/dist/adapters/crypto/slack-install-seals.js.map +1 -0
- package/dist/adapters/crypto/slack-link-seals.d.ts +3 -0
- package/dist/adapters/crypto/slack-link-seals.js +15 -0
- package/dist/adapters/crypto/slack-link-seals.js.map +1 -0
- package/dist/adapters/crypto/slack-signatures.d.ts +3 -0
- package/dist/adapters/crypto/slack-signatures.js +14 -0
- package/dist/adapters/crypto/slack-signatures.js.map +1 -0
- package/dist/adapters/fleet/slack-ships.d.ts +15 -0
- package/dist/adapters/fleet/slack-ships.js +32 -0
- package/dist/adapters/fleet/slack-ships.js.map +1 -0
- package/dist/adapters/http/mcp-endpoint.js +1 -1
- package/dist/adapters/http/mcp-endpoint.js.map +1 -1
- package/dist/adapters/http/oauth-routes.d.ts +4 -1
- package/dist/adapters/http/oauth-routes.js +21 -9
- package/dist/adapters/http/oauth-routes.js.map +1 -1
- package/dist/adapters/http/openai-apps-challenge.d.ts +10 -0
- package/dist/adapters/http/openai-apps-challenge.js +9 -0
- package/dist/adapters/http/openai-apps-challenge.js.map +1 -0
- package/dist/adapters/http/person-tools.d.ts +24 -1
- package/dist/adapters/http/person-tools.js +43 -11
- package/dist/adapters/http/person-tools.js.map +1 -1
- package/dist/adapters/http/slack-routes.d.ts +28 -0
- package/dist/adapters/http/slack-routes.js +173 -0
- package/dist/adapters/http/slack-routes.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 +25 -0
- package/dist/adapters/prisma/generated/client.d.ts +25 -0
- package/dist/adapters/prisma/generated/internal/class.d.ts +55 -0
- package/dist/adapters/prisma/generated/internal/class.js +4 -4
- package/dist/adapters/prisma/generated/internal/class.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +452 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js +72 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +76 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +72 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
- package/dist/adapters/prisma/generated/models/SlackApp.d.ts +1229 -0
- package/dist/adapters/prisma/generated/models/SlackApp.js +2 -0
- package/dist/adapters/prisma/generated/models/SlackApp.js.map +1 -0
- package/dist/adapters/prisma/generated/models/SlackEvent.d.ts +1229 -0
- package/dist/adapters/prisma/generated/models/SlackEvent.js +2 -0
- package/dist/adapters/prisma/generated/models/SlackEvent.js.map +1 -0
- package/dist/adapters/prisma/generated/models/SlackLink.d.ts +1126 -0
- package/dist/adapters/prisma/generated/models/SlackLink.js +2 -0
- package/dist/adapters/prisma/generated/models/SlackLink.js.map +1 -0
- package/dist/adapters/prisma/generated/models/SlackPost.d.ts +1174 -0
- package/dist/adapters/prisma/generated/models/SlackPost.js +2 -0
- package/dist/adapters/prisma/generated/models/SlackPost.js.map +1 -0
- package/dist/adapters/prisma/generated/models/SlackWorkspace.d.ts +1143 -0
- package/dist/adapters/prisma/generated/models/SlackWorkspace.js +2 -0
- package/dist/adapters/prisma/generated/models/SlackWorkspace.js.map +1 -0
- package/dist/adapters/prisma/generated/models.d.ts +5 -0
- package/dist/adapters/prisma/slack-events.d.ts +8 -0
- package/dist/adapters/prisma/slack-events.js +55 -0
- package/dist/adapters/prisma/slack-events.js.map +1 -0
- package/dist/adapters/prisma/slack-links.d.ts +8 -0
- package/dist/adapters/prisma/slack-links.js +49 -0
- package/dist/adapters/prisma/slack-links.js.map +1 -0
- package/dist/adapters/prisma/slack-posts.d.ts +4 -0
- package/dist/adapters/prisma/slack-posts.js +42 -0
- package/dist/adapters/prisma/slack-posts.js.map +1 -0
- package/dist/adapters/prisma/slack-stores.d.ts +6 -0
- package/dist/adapters/prisma/slack-stores.js +115 -0
- package/dist/adapters/prisma/slack-stores.js.map +1 -0
- package/dist/adapters/slack/slack-call.d.ts +15 -0
- package/dist/adapters/slack/slack-call.js +41 -0
- package/dist/adapters/slack/slack-call.js.map +1 -0
- package/dist/adapters/slack/slack-messages.d.ts +4 -0
- package/dist/adapters/slack/slack-messages.js +53 -0
- package/dist/adapters/slack/slack-messages.js.map +1 -0
- package/dist/adapters/slack/slack-sign-in.d.ts +4 -0
- package/dist/adapters/slack/slack-sign-in.js +33 -0
- package/dist/adapters/slack/slack-sign-in.js.map +1 -0
- package/dist/adapters/slack/slack-tooling.d.ts +6 -0
- package/dist/adapters/slack/slack-tooling.js +68 -0
- package/dist/adapters/slack/slack-tooling.js.map +1 -0
- package/dist/adapters/trpc/router.d.ts +149 -1
- package/dist/adapters/trpc/router.js +117 -6
- package/dist/adapters/trpc/router.js.map +1 -1
- package/dist/app.d.ts +4 -0
- package/dist/app.js +143 -15
- package/dist/app.js.map +1 -1
- package/dist/bin/aeolus-gateway.js +2 -0
- package/dist/bin/aeolus-gateway.js.map +1 -1
- package/dist/config.d.ts +8 -0
- package/dist/config.js +4 -0
- package/dist/config.js.map +1 -1
- package/dist/core/connection/connect.d.ts +12 -0
- package/dist/core/connection/connect.js +11 -4
- package/dist/core/connection/connect.js.map +1 -1
- package/dist/core/connection/declare-gateway-scopes.d.ts +15 -0
- package/dist/core/connection/declare-gateway-scopes.js +23 -0
- package/dist/core/connection/declare-gateway-scopes.js.map +1 -0
- package/dist/core/oauth/exchange-token.d.ts +1 -0
- package/dist/core/oauth/exchange-token.js +4 -3
- package/dist/core/oauth/exchange-token.js.map +1 -1
- package/dist/core/oauth/read-authorization.d.ts +3 -3
- package/dist/core/oauth/read-authorization.js +6 -5
- package/dist/core/oauth/read-authorization.js.map +1 -1
- package/dist/core/people/ports.d.ts +23 -2
- package/dist/core/people/wake-person.d.ts +9 -2
- package/dist/core/people/wake-person.js +33 -9
- package/dist/core/people/wake-person.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/sign-in/start-sign-in.d.ts +4 -1
- package/dist/core/sign-in/start-sign-in.js +8 -2
- package/dist/core/sign-in/start-sign-in.js.map +1 -1
- package/dist/core/slack/answer-in-slack.d.ts +36 -0
- package/dist/core/slack/answer-in-slack.js +51 -0
- package/dist/core/slack/answer-in-slack.js.map +1 -0
- package/dist/core/slack/complete-install.d.ts +27 -0
- package/dist/core/slack/complete-install.js +36 -0
- package/dist/core/slack/complete-install.js.map +1 -0
- package/dist/core/slack/complete-link.d.ts +41 -0
- package/dist/core/slack/complete-link.js +64 -0
- package/dist/core/slack/complete-link.js.map +1 -0
- package/dist/core/slack/connect-slack.d.ts +34 -0
- package/dist/core/slack/connect-slack.js +54 -0
- package/dist/core/slack/connect-slack.js.map +1 -0
- package/dist/core/slack/disconnect-slack.d.ts +21 -0
- package/dist/core/slack/disconnect-slack.js +31 -0
- package/dist/core/slack/disconnect-slack.js.map +1 -0
- package/dist/core/slack/expose-ship.d.ts +35 -0
- package/dist/core/slack/expose-ship.js +59 -0
- package/dist/core/slack/expose-ship.js.map +1 -0
- package/dist/core/slack/follow-exposed-ships.d.ts +20 -0
- package/dist/core/slack/follow-exposed-ships.js +43 -0
- package/dist/core/slack/follow-exposed-ships.js.map +1 -0
- package/dist/core/slack/gateway-bot.d.ts +20 -0
- package/dist/core/slack/gateway-bot.js +22 -0
- package/dist/core/slack/gateway-bot.js.map +1 -0
- package/dist/core/slack/kept-slack-event.d.ts +30 -0
- package/dist/core/slack/kept-slack-event.js +5 -0
- package/dist/core/slack/kept-slack-event.js.map +1 -0
- package/dist/core/slack/list-exposable.d.ts +25 -0
- package/dist/core/slack/list-exposable.js +32 -0
- package/dist/core/slack/list-exposable.js.map +1 -0
- package/dist/core/slack/ports.d.ts +288 -0
- package/dist/core/slack/ports.js +2 -0
- package/dist/core/slack/ports.js.map +1 -0
- package/dist/core/slack/read-slack-link.d.ts +23 -0
- package/dist/core/slack/read-slack-link.js +20 -0
- package/dist/core/slack/read-slack-link.js.map +1 -0
- package/dist/core/slack/read-slack.d.ts +42 -0
- package/dist/core/slack/read-slack.js +35 -0
- package/dist/core/slack/read-slack.js.map +1 -0
- package/dist/core/slack/remove-bot.d.ts +24 -0
- package/dist/core/slack/remove-bot.js +33 -0
- package/dist/core/slack/remove-bot.js.map +1 -0
- package/dist/core/slack/rotate-configuration-tokens.d.ts +13 -0
- package/dist/core/slack/rotate-configuration-tokens.js +14 -0
- package/dist/core/slack/rotate-configuration-tokens.js.map +1 -0
- package/dist/core/slack/send-slack-events.d.ts +29 -0
- package/dist/core/slack/send-slack-events.js +78 -0
- package/dist/core/slack/send-slack-events.js.map +1 -0
- package/dist/core/slack/ship-bot.d.ts +23 -0
- package/dist/core/slack/ship-bot.js +25 -0
- package/dist/core/slack/ship-bot.js.map +1 -0
- package/dist/core/slack/show-all-in-slack.d.ts +16 -0
- package/dist/core/slack/show-all-in-slack.js +18 -0
- package/dist/core/slack/show-all-in-slack.js.map +1 -0
- package/dist/core/slack/show-in-slack.d.ts +38 -0
- package/dist/core/slack/show-in-slack.js +154 -0
- package/dist/core/slack/show-in-slack.js.map +1 -0
- package/dist/core/slack/slack-app.d.ts +77 -0
- package/dist/core/slack/slack-app.js +53 -0
- package/dist/core/slack/slack-app.js.map +1 -0
- package/dist/core/slack/slack-event.d.ts +51 -0
- package/dist/core/slack/slack-event.js +18 -0
- package/dist/core/slack/slack-event.js.map +1 -0
- package/dist/core/slack/slack-link.d.ts +20 -0
- package/dist/core/slack/slack-link.js +2 -0
- package/dist/core/slack/slack-link.js.map +1 -0
- package/dist/core/slack/slack-markdown.d.ts +13 -0
- package/dist/core/slack/slack-markdown.js +27 -0
- package/dist/core/slack/slack-markdown.js.map +1 -0
- package/dist/core/slack/slack-post-of.d.ts +27 -0
- package/dist/core/slack/slack-post-of.js +71 -0
- package/dist/core/slack/slack-post-of.js.map +1 -0
- package/dist/core/slack/slack-post.d.ts +31 -0
- package/dist/core/slack/slack-post.js +5 -0
- package/dist/core/slack/slack-post.js.map +1 -0
- package/dist/core/slack/slack-request.d.ts +17 -0
- package/dist/core/slack/slack-request.js +10 -0
- package/dist/core/slack/slack-request.js.map +1 -0
- package/dist/core/slack/slack-workspace.d.ts +36 -0
- package/dist/core/slack/slack-workspace.js +7 -0
- package/dist/core/slack/slack-workspace.js.map +1 -0
- package/dist/core/slack/start-install.d.ts +43 -0
- package/dist/core/slack/start-install.js +57 -0
- package/dist/core/slack/start-install.js.map +1 -0
- package/dist/core/slack/start-link.d.ts +32 -0
- package/dist/core/slack/start-link.js +46 -0
- package/dist/core/slack/start-link.js.map +1 -0
- package/dist/core/slack/stop-slack-link.d.ts +16 -0
- package/dist/core/slack/stop-slack-link.js +9 -0
- package/dist/core/slack/stop-slack-link.js.map +1 -0
- package/dist/core/slack/take-access-token.d.ts +25 -0
- package/dist/core/slack/take-access-token.js +45 -0
- package/dist/core/slack/take-access-token.js.map +1 -0
- package/dist/core/slack/take-slack-event.d.ts +47 -0
- package/dist/core/slack/take-slack-event.js +75 -0
- package/dist/core/slack/take-slack-event.js.map +1 -0
- package/dist/core/slack/unlink-slack.d.ts +9 -0
- package/dist/core/slack/unlink-slack.js +9 -0
- package/dist/core/slack/unlink-slack.js.map +1 -0
- package/dist/slack-event-worker.d.ts +21 -0
- package/dist/slack-event-worker.js +38 -0
- package/dist/slack-event-worker.js.map +1 -0
- package/dist/slack-token-worker.d.ts +19 -0
- package/dist/slack-token-worker.js +24 -0
- package/dist/slack-token-worker.js.map +1 -0
- package/package.json +3 -2
- package/src/adapters/prisma/migrations/20261027090000_slack_workspaces/migration.sql +30 -0
- package/src/adapters/prisma/migrations/20261027150000_slack_bots/migration.sql +6 -0
- package/src/adapters/prisma/migrations/20261027200000_slack_links/migration.sql +15 -0
- package/src/adapters/prisma/migrations/20261028090000_slack_events/migration.sql +18 -0
- package/src/adapters/prisma/migrations/20261028150000_slack_posts/migration.sql +25 -0
- package/src/adapters/prisma/schema.prisma +103 -0
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/app-path-routes-manifest.json +5 -0
- package/web/.next/build-manifest.json +51 -3
- package/web/.next/diagnostics/route-bundle-stats.json +143 -70
- package/web/.next/fallback-build-manifest.json +3 -3
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/routes-manifest.json +30 -0
- 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/server-reference-manifest.json +3 -3
- package/web/.next/server/app/(console)/meetings/[meetingId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/meetings/[meetingId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/[name]/change/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/(console)/outside-parties/[name]/change/page.js +2 -2
- package/web/.next/server/app/(console)/outside-parties/[name]/change/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/outside-parties/[name]/change/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/[name]/page/server-reference-manifest.json +4 -4
- package/web/.next/server/app/(console)/outside-parties/[name]/page.js +2 -2
- package/web/.next/server/app/(console)/outside-parties/[name]/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/outside-parties/[name]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/[name]/retire/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/(console)/outside-parties/[name]/retire/page.js +3 -3
- package/web/.next/server/app/(console)/outside-parties/[name]/retire/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/outside-parties/[name]/retire/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/add/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/(console)/outside-parties/add/page.js +2 -2
- package/web/.next/server/app/(console)/outside-parties/add/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/outside-parties/add/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page/server-reference-manifest.json +2 -2
- package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page/server-reference-manifest.json +2 -2
- package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/outside-parties/page/server-reference-manifest.json +2 -2
- package/web/.next/server/app/(console)/outside-parties/page.js +3 -3
- 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)/overview/changes/route.js +2 -2
- package/web/.next/server/app/(console)/overview/changes/route.js.nft.json +1 -1
- package/web/.next/server/app/(console)/overview/focus/route.js +2 -2
- package/web/.next/server/app/(console)/overview/focus/route.js.nft.json +1 -1
- package/web/.next/server/app/(console)/overview/page/server-reference-manifest.json +27 -7
- package/web/.next/server/app/(console)/overview/page.js +2 -2
- package/web/.next/server/app/(console)/overview/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/overview/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/overview/requests/[requestId]/page/server-reference-manifest.json +2 -2
- package/web/.next/server/app/(console)/overview/requests/[requestId]/page.js +1 -1
- package/web/.next/server/app/(console)/overview/requests/[requestId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/overview/requests/[requestId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/parties/page/server-reference-manifest.json +7 -7
- package/web/.next/server/app/(console)/parties/page.js +3 -3
- package/web/.next/server/app/(console)/parties/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/parties/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/sign-in/failed/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/(console)/sign-in/failed/page.js.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/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(console)/slack/disconnect/page/build-manifest.json +23 -0
- package/web/.next/server/app/(console)/slack/disconnect/page/next-font-manifest.json +11 -0
- package/web/.next/server/app/(console)/slack/disconnect/page/react-loadable-manifest.json +1 -0
- package/web/.next/server/app/(console)/slack/disconnect/page/server-reference-manifest.json +65 -0
- package/web/.next/server/app/(console)/slack/disconnect/page.js +22 -0
- package/web/.next/server/app/(console)/slack/disconnect/page.js.map +5 -0
- package/web/.next/server/app/(console)/slack/disconnect/page.js.nft.json +1 -0
- package/web/.next/server/app/(console)/slack/disconnect/page_client-reference-manifest.js +3 -0
- package/web/.next/server/app/(console)/slack/expose/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(console)/slack/expose/page/build-manifest.json +23 -0
- package/web/.next/server/app/(console)/slack/expose/page/next-font-manifest.json +11 -0
- package/web/.next/server/app/(console)/slack/expose/page/react-loadable-manifest.json +1 -0
- package/web/.next/server/app/(console)/slack/expose/page/server-reference-manifest.json +65 -0
- package/web/.next/server/app/(console)/slack/expose/page.js +22 -0
- package/web/.next/server/app/(console)/slack/expose/page.js.map +5 -0
- package/web/.next/server/app/(console)/slack/expose/page.js.nft.json +1 -0
- package/web/.next/server/app/(console)/slack/expose/page_client-reference-manifest.js +3 -0
- package/web/.next/server/app/(console)/slack/link/route/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(console)/slack/link/route/build-manifest.json +12 -0
- package/web/.next/server/app/(console)/slack/link/route/server-reference-manifest.json +4 -0
- package/web/.next/server/app/(console)/slack/link/route.js +7 -0
- package/web/.next/server/app/(console)/slack/link/route.js.map +5 -0
- package/web/.next/server/app/(console)/slack/link/route.js.nft.json +1 -0
- package/web/.next/server/app/(console)/slack/link/route_client-reference-manifest.js +3 -0
- package/web/.next/server/app/(console)/slack/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(console)/slack/page/build-manifest.json +23 -0
- package/web/.next/server/app/(console)/slack/page/next-font-manifest.json +11 -0
- package/web/.next/server/app/(console)/slack/page/react-loadable-manifest.json +1 -0
- package/web/.next/server/app/(console)/slack/page/server-reference-manifest.json +65 -0
- package/web/.next/server/app/(console)/slack/page.js +22 -0
- package/web/.next/server/app/(console)/slack/page.js.map +5 -0
- package/web/.next/server/app/(console)/slack/page.js.nft.json +1 -0
- package/web/.next/server/app/(console)/slack/page_client-reference-manifest.js +3 -0
- package/web/.next/server/app/(console)/slack/remove/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(console)/slack/remove/page/build-manifest.json +23 -0
- package/web/.next/server/app/(console)/slack/remove/page/next-font-manifest.json +11 -0
- package/web/.next/server/app/(console)/slack/remove/page/react-loadable-manifest.json +1 -0
- package/web/.next/server/app/(console)/slack/remove/page/server-reference-manifest.json +65 -0
- package/web/.next/server/app/(console)/slack/remove/page.js +22 -0
- package/web/.next/server/app/(console)/slack/remove/page.js.map +5 -0
- package/web/.next/server/app/(console)/slack/remove/page.js.nft.json +1 -0
- package/web/.next/server/app/(console)/slack/remove/page_client-reference-manifest.js +3 -0
- package/web/.next/server/app/_global-error/page.js +1 -1
- package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/web/.next/server/app/_global-error.html +1 -1
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/authorize/failed/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/authorize/failed/page.js.nft.json +1 -1
- package/web/.next/server/app/authorize/failed/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/authorize/pick/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/authorize/pick/page.js.nft.json +1 -1
- package/web/.next/server/app/authorize/pick/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/authorize/waiting/approval/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/authorize/waiting/approval/page.js.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 +5 -0
- package/web/.next/server/chunks/[root-of-the-server]__01ghdzznyfucm._.js +369 -0
- package/web/.next/server/chunks/[root-of-the-server]__01ghdzznyfucm._.js.map +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__0mbwomk4pjrl7._.js +369 -0
- package/web/.next/server/chunks/[root-of-the-server]__0mbwomk4pjrl7._.js.map +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__1tfyrijwfgqlk._.js +3 -0
- package/web/.next/server/chunks/[root-of-the-server]__1tfyrijwfgqlk._.js.map +1 -0
- package/web/.next/server/chunks/_20ne4s-e_jzxp._.js +3 -0
- package/web/.next/server/chunks/_20ne4s-e_jzxp._.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/0vkm_server_app_(console)_overview_requests_[requestId]_page_actions_0uki9j3mtuz9e.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_overview_requests_[requestId]_page_actions_0uki9j3mtuz9e.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__001xx3sm5ur-e._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__001xx3sm5ur-e._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__04e53giy2-2tm._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__04e53giy2-2tm._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__0-og0bl8lr2xq._.js → [root-of-the-server]__0a8db18tyk__5._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__0-og0bl8lr2xq._.js.map → [root-of-the-server]__0a8db18tyk__5._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0e59elwbtqr-6._.js +3 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__10y66e1xx8xiq._.js.map → [root-of-the-server]__0e59elwbtqr-6._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0icm7kndx480o._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0icm7kndx480o._.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]__1-c9wugbbwsp3._.js → [root-of-the-server]__0kb1gl5t8kz4l._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0n2us07jk-78w._.js +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__1gb-3dttuacyz._.js → [root-of-the-server]__0y0jwufd7xjsv._.js} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__10s9e8g5x-ws8._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__10s9e8g5x-ws8._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__13yoncr_nx3jc._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__13yoncr_nx3jc._.js.map +1 -0
- 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]__1m9atpy0vkbmj._.js → [root-of-the-server]__19ecatcacd6t9._.js} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1hfashtn1ee82._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1hfashtn1ee82._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1qpow96uit9t8._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1qpow96uit9t8._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_00hfzlqn1og18._.js +1 -1
- package/web/.next/server/chunks/ssr/_00hfzlqn1og18._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0_kakdt7lb6z-._.js +1 -1
- package/web/.next/server/chunks/ssr/_0_kakdt7lb6z-._.js.map +1 -1
- 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/{_0w2ptjht34s6t._.js → _0wukvn3-ht3ps._.js} +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/_12fsn_33ga-n0._.js +1 -1
- package/web/.next/server/chunks/ssr/_1_wav28san6dm._.js +1 -1
- package/web/.next/server/chunks/ssr/{_0bhvvyz0q_0ja._.js → _1e2o809f0ekry._.js} +2 -2
- package/web/.next/server/chunks/ssr/_1pjtire7rqla0._.js +1 -1
- package/web/.next/server/chunks/ssr/_1pjtire7rqla0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1qbsmlji34yph._.js +1 -1
- package/web/.next/server/chunks/ssr/_1qbsmlji34yph._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1y1ovmdhl9_ml._.js +1 -1
- package/web/.next/server/chunks/ssr/_1y1ovmdhl9_ml._.js.map +1 -1
- package/web/.next/server/chunks/ssr/node_modules_0ettht2so2tkh._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_0ettht2so2tkh._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_0keape0zsobyj._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_0keape0zsobyj._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_@base-ui_0jlwmxa9rk8p_._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_@base-ui_0jlwmxa9rk8p_._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_@base-ui_19e_nxxf4a88q._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_@base-ui_19e_nxxf4a88q._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_@base-ui_react_1lbvjrzg8s2ox._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_@base-ui_react_1lbvjrzg8s2ox._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0t6vd5zwkqjs1.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0t6vd5zwkqjs1.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1cwvrsosahx6q.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1cwvrsosahx6q.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1jbr52uzx5cc7.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1jbr52uzx5cc7.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1xhjyaxgorqkx.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1xhjyaxgorqkx.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_00e7-_y92losl._.js +3 -0
- package/web/.next/server/chunks/ssr/web_00e7-_y92losl._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_09rcfto3dw4wd._.js +3 -0
- package/web/.next/server/chunks/ssr/web_09rcfto3dw4wd._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_0plvx3c_1cozb._.js +3 -0
- package/web/.next/server/chunks/ssr/web_0plvx3c_1cozb._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_0qgev3ti257yj._.js +3 -0
- package/web/.next/server/chunks/ssr/{web_0_jk9eione6lx._.js.map → web_0qgev3ti257yj._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/web_0wys4l6za8umr._.js +1 -1
- package/web/.next/server/chunks/ssr/web_0wys4l6za8umr._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_15vnjj3s0z3fa._.js +3 -0
- package/web/.next/server/chunks/ssr/{web_1wcpaty_bz55q._.js.map → web_15vnjj3s0z3fa._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_overview_page_actions_18on1ziyg1nzy.js +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_overview_page_actions_18on1ziyg1nzy.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_app_(console)_slack_page_tsx_0ts7fo7pqicq6._.js +3 -0
- package/web/.next/server/chunks/ssr/web_app_(console)_slack_page_tsx_0ts7fo7pqicq6._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_app_(console)_slack_remove_page_tsx_15q4ril_on0ed._.js +3 -0
- package/web/.next/server/chunks/ssr/web_app_(console)_slack_remove_page_tsx_15q4ril_on0ed._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_0rd6357w-eo50._.js +3 -0
- package/web/.next/server/chunks/ssr/{web_features_10xz3ojtvfi7h._.js.map → web_features_0rd6357w-eo50._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/web_features_1m5g9a6mwrsd-._.js +3 -0
- package/web/.next/server/chunks/ssr/{web_features_085cv0gogrxxf._.js.map → web_features_1m5g9a6mwrsd-._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/web_features_1rwkgka1xffb1._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_1rwkgka1xffb1._.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_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_overview_hooks_overview-actions_ts_0-wrat07d1y5g._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_overview_hooks_overview-actions_ts_0-wrat07d1y5g._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_overview_state_00l0wkgvv9y6j._.js +3 -0
- package/web/.next/server/chunks/ssr/web_features_overview_state_00l0wkgvv9y6j._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_features_overview_state_decision-panel_tsx_0kpd26ggtr6h_._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_overview_state_decision-panel_tsx_0kpd26ggtr6h_._.js.map +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 +3 -0
- package/web/.next/server/chunks/ssr/web_features_slack_actions_ts_1l3yg9vl20_vu._.js.map +1 -0
- package/web/.next/server/chunks/web__next-internal_server_app_(console)_slack_link_route_actions_16zgisics858w.js +3 -0
- package/web/.next/server/chunks/web__next-internal_server_app_(console)_slack_link_route_actions_16zgisics858w.js.map +1 -0
- package/web/.next/server/middleware-build-manifest.js +51 -3
- package/web/.next/server/next-font-manifest.js +1 -1
- package/web/.next/server/next-font-manifest.json +16 -0
- 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 +173 -27
- package/web/.next/static/chunks/0nhopjmnw_dqt.js +1 -0
- package/web/.next/static/chunks/0zbcy0_3jemrv.js +1 -0
- package/web/.next/static/chunks/{0coxy5zad812a.js → 1-suv9wttlxqo.js} +1 -1
- package/web/.next/static/chunks/19kfx4qlur25a.js +1 -0
- package/web/.next/static/chunks/1a2-hkn-7471k.js +1 -0
- package/web/.next/static/chunks/{0u_4xjk1j74g3.js → 1msggkwsn7vyq.js} +1 -1
- package/web/.next/static/chunks/1yj875esaesyh.css +3 -0
- package/web/.next/static/chunks/{2ew9kpu2kohk4.js → 2-kh9nbonee6w.js} +1 -1
- package/web/.next/static/chunks/2l92bozm8dcmo.js +1 -0
- package/web/.next/static/chunks/{20n2z_lok8v0f.js → 310mio1zd_mw7.js} +1 -1
- package/web/.next/static/chunks/{07j7jnfe13wx6.js → 3d_sjtxh_vkr6.js} +1 -1
- package/web/.next/static/chunks/{0p_kl57bddsiy.js → 3dhy3jady0w6a.js} +1 -1
- package/web/.next/static/chunks/3efghx8whwnok.js +1 -0
- package/web/.next/static/chunks/3hvo3apdq-ckk.js +1 -0
- package/web/.next/static/chunks/3rbzp0tdc1te-.js +1 -0
- package/web/.next/static/chunks/{1xrn7oqwd48vi.js → 455eobei0t6t9.js} +1 -1
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/types/routes.d.ts +7 -2
- package/web/.next/types/validator.ts +78 -0
- package/web/.next/server/chunks/[root-of-the-server]__0ykc8bq_c06a1._.js +0 -369
- package/web/.next/server/chunks/[root-of-the-server]__0ykc8bq_c06a1._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__10y66e1xx8xiq._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1dtyycvqa6uht._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1dtyycvqa6uht._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_07sxnbglqc5q9._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_07sxnbglqc5q9._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules_0qlo87g8tugr4._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules_0qlo87g8tugr4._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_0-ufi2al5ubig._.js +0 -3
- package/web/.next/server/chunks/ssr/web_0-ufi2al5ubig._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_0_jk9eione6lx._.js +0 -3
- package/web/.next/server/chunks/ssr/web_1wcpaty_bz55q._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_085cv0gogrxxf._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_10xz3ojtvfi7h._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_overview_state_1wuk95dw2_whp._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_overview_state_1wuk95dw2_whp._.js.map +0 -1
- package/web/.next/static/chunks/0v9r_hyyubykq.js +0 -1
- package/web/.next/static/chunks/0zesq1ng-v3s6.js +0 -1
- package/web/.next/static/chunks/10wzmy096av_5.css +0 -3
- package/web/.next/static/chunks/12c3qjvto3m0f.js +0 -1
- package/web/.next/static/chunks/1ahn4kx4ld-rc.js +0 -1
- package/web/.next/static/chunks/2i3ydqqupow_x.js +0 -1
- package/web/.next/static/chunks/3x_8doukmdfpu.js +0 -1
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__1-c9wugbbwsp3._.js.map → [root-of-the-server]__0kb1gl5t8kz4l._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__1gb-3dttuacyz._.js.map → [root-of-the-server]__0y0jwufd7xjsv._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__1m9atpy0vkbmj._.js.map → [root-of-the-server]__19ecatcacd6t9._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{_0w2ptjht34s6t._.js.map → _0wukvn3-ht3ps._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{_0bhvvyz0q_0ja._.js.map → _1e2o809f0ekry._.js.map} +0 -0
- /package/web/.next/static/{wnr2MrrQvcto8MOm16D8r → 87vMFs_KGRcFD40WWRkFR}/_buildManifest.js +0 -0
- /package/web/.next/static/{wnr2MrrQvcto8MOm16D8r → 87vMFs_KGRcFD40WWRkFR}/_clientMiddlewareManifest.js +0 -0
- /package/web/.next/static/{wnr2MrrQvcto8MOm16D8r → 87vMFs_KGRcFD40WWRkFR}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SlackFile } from './slack-event.js';
|
|
2
|
+
/**
|
|
3
|
+
* A person's Slack message as the Markdown the gateway sends to the fleet
|
|
4
|
+
* (gateway scopes 9.4 step 5): the mention of the bot removed, Slack's bold
|
|
5
|
+
* and strike, links, people and channels turned into Markdown, Slack's
|
|
6
|
+
* escapes undone, and each shared file added as its Slack link. Italics and
|
|
7
|
+
* code read the same in both.
|
|
8
|
+
*/
|
|
9
|
+
export declare function markdownOf(message: {
|
|
10
|
+
text: string;
|
|
11
|
+
botUserId: string;
|
|
12
|
+
files: readonly SlackFile[];
|
|
13
|
+
}): string;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** Slack's escapes in a message's text, and what each stands for. */
|
|
2
|
+
const ESCAPES = [['<', '<'], ['>', '>'], ['&', '&']];
|
|
3
|
+
/**
|
|
4
|
+
* A person's Slack message as the Markdown the gateway sends to the fleet
|
|
5
|
+
* (gateway scopes 9.4 step 5): the mention of the bot removed, Slack's bold
|
|
6
|
+
* and strike, links, people and channels turned into Markdown, Slack's
|
|
7
|
+
* escapes undone, and each shared file added as its Slack link. Italics and
|
|
8
|
+
* code read the same in both.
|
|
9
|
+
*/
|
|
10
|
+
export function markdownOf(message) {
|
|
11
|
+
const { text, botUserId, files } = message;
|
|
12
|
+
let markdown = text
|
|
13
|
+
.replaceAll(new RegExp(`<@${botUserId}(\\|[^>]*)?>`, 'g'), '')
|
|
14
|
+
.replaceAll(/<@[A-Z0-9]+\|([^>]+)>/g, '@$1')
|
|
15
|
+
.replaceAll(/<@([A-Z0-9]+)>/g, '@$1')
|
|
16
|
+
.replaceAll(/<#[A-Z0-9]+\|([^>]+)>/g, '#$1')
|
|
17
|
+
.replaceAll(/<(https?:[^|>]+)\|([^>]+)>/g, '[$2]($1)')
|
|
18
|
+
.replaceAll(/<(https?:[^>]+)>/g, '$1')
|
|
19
|
+
.replaceAll(/(^|[\s(])\*([^*\n]+)\*(?=$|[\s).,!?:;])/g, '$1**$2**')
|
|
20
|
+
.replaceAll(/(^|[\s(])~([^~\n]+)~(?=$|[\s).,!?:;])/g, '$1~~$2~~');
|
|
21
|
+
for (const [escape, character] of ESCAPES) {
|
|
22
|
+
markdown = markdown.replaceAll(escape, character);
|
|
23
|
+
}
|
|
24
|
+
const links = files.map(({ name, permalink }) => `[${name}](${permalink})`);
|
|
25
|
+
return [markdown.trim(), ...links].filter((part) => part !== '').join('\n\n');
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=slack-markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-markdown.js","sourceRoot":"","sources":["../../../src/core/slack/slack-markdown.ts"],"names":[],"mappings":"AAEA,qEAAqE;AACrE,MAAM,OAAO,GAA2C,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;AAEvG;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,OAAyE;IAClG,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC3C,IAAI,QAAQ,GAAG,IAAI;SAChB,UAAU,CAAC,IAAI,MAAM,CAAC,KAAK,SAAS,cAAc,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;SAC7D,UAAU,CAAC,wBAAwB,EAAE,KAAK,CAAC;SAC3C,UAAU,CAAC,iBAAiB,EAAE,KAAK,CAAC;SACpC,UAAU,CAAC,wBAAwB,EAAE,KAAK,CAAC;SAC3C,UAAU,CAAC,6BAA6B,EAAE,UAAU,CAAC;SACrD,UAAU,CAAC,mBAAmB,EAAE,IAAI,CAAC;SACrC,UAAU,CAAC,0CAA0C,EAAE,UAAU,CAAC;SAClE,UAAU,CAAC,wCAAwC,EAAE,UAAU,CAAC,CAAC;IACpE,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,OAAO,EAAE,CAAC;QAC1C,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,IAAI,IAAI,KAAK,SAAS,GAAG,CAAC,CAAC;IAC5E,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { PersonDelivery } from '../people/ports.js';
|
|
2
|
+
import type { SlackButton } from './ports.js';
|
|
3
|
+
/** The most a Slack message shows in full. */
|
|
4
|
+
export declare const MESSAGE_MAX_LENGTH = 40000;
|
|
5
|
+
/** The most one block of a Slack message shows. */
|
|
6
|
+
export declare const BLOCK_MAX_LENGTH = 3000;
|
|
7
|
+
/** What a delivery shows as in Slack: its text in Slack's markup and a button per option, or a link to the gateway for what Slack does not show in full. */
|
|
8
|
+
export type SlackShown = {
|
|
9
|
+
readonly kind: 'shown';
|
|
10
|
+
readonly text: string;
|
|
11
|
+
readonly buttons: readonly SlackButton[];
|
|
12
|
+
} | {
|
|
13
|
+
readonly kind: 'link';
|
|
14
|
+
readonly text: string;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* What a delivery shows as in Slack (gateway scopes 9.5 step 2): text and
|
|
18
|
+
* Markdown as text, Markdown in Slack's markup; a question as its title and
|
|
19
|
+
* context, one button per option; JSON as a code block. Another content
|
|
20
|
+
* type, or more than Slack shows in full (40,000 characters, a block 3,000),
|
|
21
|
+
* goes as a link to the gateway's pages. The gateway's own bot heads it
|
|
22
|
+
* with the sender's name.
|
|
23
|
+
*/
|
|
24
|
+
export declare function slackPostOf(delivery: PersonDelivery, shown: {
|
|
25
|
+
overviewUrl: string;
|
|
26
|
+
isHeadedBySender: boolean;
|
|
27
|
+
}): SlackShown;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { QUESTION_CONTENT_TYPE, questionSchema } from '@aeolus-fleet/common';
|
|
2
|
+
/** The most a Slack message shows in full. */
|
|
3
|
+
export const MESSAGE_MAX_LENGTH = 40_000;
|
|
4
|
+
/** The most one block of a Slack message shows. */
|
|
5
|
+
export const BLOCK_MAX_LENGTH = 3_000;
|
|
6
|
+
/** The content type's essence, its parameters gone. */
|
|
7
|
+
function essenceOf(contentType) {
|
|
8
|
+
return (contentType.split(';')[0] ?? '').trim().toLowerCase();
|
|
9
|
+
}
|
|
10
|
+
/** Text as Slack shows it as it is: its control characters escaped. */
|
|
11
|
+
function escaped(text) {
|
|
12
|
+
return text.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>');
|
|
13
|
+
}
|
|
14
|
+
/** Markdown in Slack's markup: bold, strike, links and headings; italics, code and lists read the same. */
|
|
15
|
+
function slackMarkupOf(markdown) {
|
|
16
|
+
return escaped(markdown)
|
|
17
|
+
.replaceAll(/\[([^\]]+)\]\((https?:[^)\s]+)\)/g, '<$2|$1>')
|
|
18
|
+
.replaceAll(/\*\*([^*\n]+)\*\*/g, '*$1*')
|
|
19
|
+
.replaceAll(/__([^_\n]+)__/g, '*$1*')
|
|
20
|
+
.replaceAll(/~~([^~\n]+)~~/g, '~$1~')
|
|
21
|
+
.replaceAll(/^#{1,6} +(.+)$/gm, '*$1*');
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* What a delivery shows as in Slack (gateway scopes 9.5 step 2): text and
|
|
25
|
+
* Markdown as text, Markdown in Slack's markup; a question as its title and
|
|
26
|
+
* context, one button per option; JSON as a code block. Another content
|
|
27
|
+
* type, or more than Slack shows in full (40,000 characters, a block 3,000),
|
|
28
|
+
* goes as a link to the gateway's pages. The gateway's own bot heads it
|
|
29
|
+
* with the sender's name.
|
|
30
|
+
*/
|
|
31
|
+
export function slackPostOf(delivery, shown) {
|
|
32
|
+
const { senderName, contentType, payload } = delivery;
|
|
33
|
+
const link = { kind: 'link', text: `${escaped(senderName)} sent you a message Slack does not show in full: <${shown.overviewUrl}|open it in the gateway>` };
|
|
34
|
+
const headed = (text) => (shown.isHeadedBySender ? `*${escaped(senderName)}*\n${text}` : text);
|
|
35
|
+
const essence = essenceOf(contentType);
|
|
36
|
+
let text;
|
|
37
|
+
let buttons = [];
|
|
38
|
+
if (essence === 'text/plain') {
|
|
39
|
+
text = escaped(payload);
|
|
40
|
+
}
|
|
41
|
+
else if (essence === 'text/markdown') {
|
|
42
|
+
text = slackMarkupOf(payload);
|
|
43
|
+
}
|
|
44
|
+
else if (essence === 'application/json') {
|
|
45
|
+
text = `\`\`\`${payload}\`\`\``;
|
|
46
|
+
}
|
|
47
|
+
else if (essence === QUESTION_CONTENT_TYPE) {
|
|
48
|
+
let parsed;
|
|
49
|
+
try {
|
|
50
|
+
parsed = JSON.parse(payload);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return link;
|
|
54
|
+
}
|
|
55
|
+
const question = questionSchema.safeParse(parsed);
|
|
56
|
+
if (!question.success) {
|
|
57
|
+
return link;
|
|
58
|
+
}
|
|
59
|
+
text = `*${escaped(question.data.title)}*\n${escaped(question.data.context)}`;
|
|
60
|
+
buttons = question.data.options.map(({ key, label }) => ({ text: label, option: key }));
|
|
61
|
+
if (headed(text).length > BLOCK_MAX_LENGTH) {
|
|
62
|
+
return link;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
return link;
|
|
67
|
+
}
|
|
68
|
+
const full = headed(text);
|
|
69
|
+
return full.length > MESSAGE_MAX_LENGTH ? link : { kind: 'shown', text: full, buttons };
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=slack-post-of.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-post-of.js","sourceRoot":"","sources":["../../../src/core/slack/slack-post-of.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAK7E,8CAA8C;AAC9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAEzC,mDAAmD;AACnD,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAKtC,uDAAuD;AACvD,SAAS,SAAS,CAAC,WAAmB;IACpC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAChE,CAAC;AAED,uEAAuE;AACvE,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACvF,CAAC;AAED,2GAA2G;AAC3G,SAAS,aAAa,CAAC,QAAgB;IACrC,OAAO,OAAO,CAAC,QAAQ,CAAC;SACrB,UAAU,CAAC,mCAAmC,EAAE,SAAS,CAAC;SAC1D,UAAU,CAAC,oBAAoB,EAAE,MAAM,CAAC;SACxC,UAAU,CAAC,gBAAgB,EAAE,MAAM,CAAC;SACpC,UAAU,CAAC,gBAAgB,EAAE,MAAM,CAAC;SACpC,UAAU,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,QAAwB,EAAE,KAAyD;IAC7G,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;IACtD,MAAM,IAAI,GAAe,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,qDAAqD,KAAK,CAAC,WAAW,0BAA0B,EAAE,CAAC;IACxK,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACvG,MAAM,OAAO,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;IACvC,IAAI,IAAY,CAAC;IACjB,IAAI,OAAO,GAAkB,EAAE,CAAC;IAChC,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;SAAM,IAAI,OAAO,KAAK,eAAe,EAAE,CAAC;QACvC,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;SAAM,IAAI,OAAO,KAAK,kBAAkB,EAAE,CAAC;QAC1C,IAAI,GAAG,SAAS,OAAO,QAAQ,CAAC;IAClC,CAAC;SAAM,IAAI,OAAO,KAAK,qBAAqB,EAAE,CAAC;QAC7C,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9E,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACxF,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,IAAI,CAAC,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC1F,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { DeliveryId, FleetId, MessageId, ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
/**
|
|
3
|
+
* A fleet message as it is in Slack, for a person ship (gateway scopes
|
|
4
|
+
* 9.5): a delivery the gateway posts there, or the person's own message
|
|
5
|
+
* sent from there. It keeps where it is, by the bot's app, the conversation
|
|
6
|
+
* and its Slack message, so a reply goes into that conversation or thread
|
|
7
|
+
* and an answer in a thread replies to it. A delivery's post is kept before
|
|
8
|
+
* it is handed, then given its Slack message once Slack accepted it, then
|
|
9
|
+
* acknowledged: a post the gateway did not finish is finished at the next
|
|
10
|
+
* wake.
|
|
11
|
+
*/
|
|
12
|
+
export interface SlackPost {
|
|
13
|
+
readonly fleetId: FleetId;
|
|
14
|
+
readonly personShipId: ShipId;
|
|
15
|
+
readonly messageId: MessageId;
|
|
16
|
+
/** The delivery posted; none for the person's own message. */
|
|
17
|
+
readonly deliveryId: DeliveryId | null;
|
|
18
|
+
/** The ship that sent the delivery; none for the person's own message. */
|
|
19
|
+
readonly senderShipId: ShipId | null;
|
|
20
|
+
readonly appId: string;
|
|
21
|
+
readonly channel: string;
|
|
22
|
+
/** The Slack message, once Slack accepted the post. */
|
|
23
|
+
readonly ts: string | null;
|
|
24
|
+
/** The thread it is in, if any. */
|
|
25
|
+
readonly threadTs: string | null;
|
|
26
|
+
/** A link posted for what Slack does not show in full: handed only, as a wake (B4). */
|
|
27
|
+
readonly isLinkOnly: boolean;
|
|
28
|
+
readonly ackedAt: Date | null;
|
|
29
|
+
}
|
|
30
|
+
/** Whether the post is a delivery the gateway did not finish: not yet in Slack, or not yet acknowledged. */
|
|
31
|
+
export declare function isUnfinished(post: SlackPost): boolean;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Whether the post is a delivery the gateway did not finish: not yet in Slack, or not yet acknowledged. */
|
|
2
|
+
export function isUnfinished(post) {
|
|
3
|
+
return post.deliveryId !== null && (post.ts === null || (!post.isLinkOnly && post.ackedAt === null));
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=slack-post.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-post.js","sourceRoot":"","sources":["../../../src/core/slack/slack-post.ts"],"names":[],"mappings":"AA+BA,4GAA4G;AAC5G,MAAM,UAAU,YAAY,CAAC,IAAe;IAC1C,OAAO,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC;AACvG,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Clock } from '../shared/clock.js';
|
|
2
|
+
import type { SlackSignatures } from './ports.js';
|
|
3
|
+
import type { SlackApp } from './slack-app.js';
|
|
4
|
+
/** How far a request's timestamp may be from now (gateway scopes 9.4 step 1). */
|
|
5
|
+
export declare const EVENT_SKEW_MS: number;
|
|
6
|
+
/** A request Slack sends for one of the gateway's apps: its raw body as signed, its timestamp and its signature. */
|
|
7
|
+
export interface SignedRequest {
|
|
8
|
+
readonly body: string;
|
|
9
|
+
readonly timestamp: string;
|
|
10
|
+
readonly signature: string;
|
|
11
|
+
}
|
|
12
|
+
/** Whether Slack signed the request with the app's signing secret, its timestamp within 5 minutes of now: an event, or a press of a button. */
|
|
13
|
+
export declare function isSignedBy(app: SlackApp | undefined, signed: {
|
|
14
|
+
request: SignedRequest;
|
|
15
|
+
signatures: SlackSignatures;
|
|
16
|
+
clock: Clock;
|
|
17
|
+
}): app is SlackApp;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** How far a request's timestamp may be from now (gateway scopes 9.4 step 1). */
|
|
2
|
+
export const EVENT_SKEW_MS = 5 * 60 * 1000;
|
|
3
|
+
const SECOND_MS = 1000;
|
|
4
|
+
/** Whether Slack signed the request with the app's signing secret, its timestamp within 5 minutes of now: an event, or a press of a button. */
|
|
5
|
+
export function isSignedBy(app, signed) {
|
|
6
|
+
const { request } = signed;
|
|
7
|
+
const sentAt = Number(request.timestamp) * SECOND_MS;
|
|
8
|
+
return app !== undefined && Number.isFinite(sentAt) && Math.abs(signed.clock.now().getTime() - sentAt) <= EVENT_SKEW_MS && signed.signatures.isSigned({ secret: app.signingSecret, ...request });
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=slack-request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-request.js","sourceRoot":"","sources":["../../../src/core/slack/slack-request.ts"],"names":[],"mappings":"AAIA,iFAAiF;AACjF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAE3C,MAAM,SAAS,GAAG,IAAI,CAAC;AASvB,+IAA+I;AAC/I,MAAM,UAAU,UAAU,CAAC,GAAyB,EAAE,MAA6E;IACjI,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IACrD,OAAO,GAAG,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,IAAI,aAAa,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AACnM,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { FleetId, ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
/**
|
|
3
|
+
* Slack's app configuration token (gateway scopes 9.1): an access token that
|
|
4
|
+
* makes and removes apps, for 12 hours, and a single-use refresh token that
|
|
5
|
+
* turns into the next pair. It belongs to the Slack user who issued it, and
|
|
6
|
+
* changes only the apps it made.
|
|
7
|
+
*/
|
|
8
|
+
export interface ConfigurationToken {
|
|
9
|
+
readonly accessToken: string;
|
|
10
|
+
readonly refreshToken: string;
|
|
11
|
+
readonly expiresAt: Date;
|
|
12
|
+
}
|
|
13
|
+
/** How long before its access token ends the gateway rotates a configuration token, so a pass that runs late still finds it fresh. */
|
|
14
|
+
export declare const ROTATION_MARGIN_MS: number;
|
|
15
|
+
/** Whether the access token works for at least the rotation margin from now; else the gateway rotates it first. */
|
|
16
|
+
export declare function isFresh(token: ConfigurationToken, now: Date): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* A fleet's Slack workspace, connected by an actor holding gateway:slack
|
|
19
|
+
* (one workspace per fleet; a workspace may serve several fleets, P-B4).
|
|
20
|
+
* Its name is known once Slack named it, at the gateway's bot's install.
|
|
21
|
+
* A refused configuration token stays refused until someone connects again:
|
|
22
|
+
* bots already installed keep working on their own bot tokens.
|
|
23
|
+
*/
|
|
24
|
+
export interface SlackWorkspace {
|
|
25
|
+
readonly fleetId: FleetId;
|
|
26
|
+
readonly teamId: string;
|
|
27
|
+
readonly teamName: string | null;
|
|
28
|
+
/** The person ship of the account that connected it, by its name then. */
|
|
29
|
+
readonly connectedBy: {
|
|
30
|
+
readonly shipId: ShipId;
|
|
31
|
+
readonly name: string;
|
|
32
|
+
};
|
|
33
|
+
readonly connectedAt: Date;
|
|
34
|
+
readonly token: ConfigurationToken;
|
|
35
|
+
readonly isTokenRefused: boolean;
|
|
36
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** How long before its access token ends the gateway rotates a configuration token, so a pass that runs late still finds it fresh. */
|
|
2
|
+
export const ROTATION_MARGIN_MS = 60 * 60 * 1000;
|
|
3
|
+
/** Whether the access token works for at least the rotation margin from now; else the gateway rotates it first. */
|
|
4
|
+
export function isFresh(token, now) {
|
|
5
|
+
return token.expiresAt.getTime() - now.getTime() > ROTATION_MARGIN_MS;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=slack-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-workspace.js","sourceRoot":"","sources":["../../../src/core/slack/slack-workspace.ts"],"names":[],"mappings":"AAcA,sIAAsI;AACtI,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEjD,mHAAmH;AACnH,MAAM,UAAU,OAAO,CAAC,KAAyB,EAAE,GAAS;IAC1D,OAAO,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,kBAAkB,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Actor } from '../actors/authenticate-actor.js';
|
|
2
|
+
import type { ActorCredential, CredentialOf } from '../actors/credential-of.js';
|
|
3
|
+
import type { Clock } from '../shared/clock.js';
|
|
4
|
+
import { type DomainError } from '../shared/errors.js';
|
|
5
|
+
import { type Result } from '../shared/result.js';
|
|
6
|
+
import type { InstallStates, SlackApps, SlackShips, SlackTooling, SlackWorkspaces } from './ports.js';
|
|
7
|
+
import type { SlackAddresses } from './slack-app.js';
|
|
8
|
+
import { type TakeAccessToken } from './take-access-token.js';
|
|
9
|
+
/** How long an install the gateway started may take to come back. */
|
|
10
|
+
export declare const INSTALL_MS: number;
|
|
11
|
+
export type StartInstallRefusal = DomainError<'SLACK_SCOPE_NOT_HELD' | 'SLACK_NOT_CONNECTED' | 'SLACK_TOKEN_REFUSED' | 'SLACK_UNAVAILABLE' | 'NO_SUCH_BOT' | 'NOT_REACHABLE' | 'FLEET_UNAVAILABLE'>;
|
|
12
|
+
/** Install for the gateway's own bot, named after the fleet if it is made now, or for a ship's bot by its app id. */
|
|
13
|
+
export type StartInstall = (input: {
|
|
14
|
+
actor: Actor;
|
|
15
|
+
as: ActorCredential;
|
|
16
|
+
bot: {
|
|
17
|
+
kind: 'gateway';
|
|
18
|
+
fleetName: string;
|
|
19
|
+
} | {
|
|
20
|
+
kind: 'ship';
|
|
21
|
+
appId: string;
|
|
22
|
+
};
|
|
23
|
+
}) => Promise<Result<{
|
|
24
|
+
url: string;
|
|
25
|
+
}, StartInstallRefusal>>;
|
|
26
|
+
/**
|
|
27
|
+
* Use case: an actor holding gateway:slack presses Install (gateway scopes
|
|
28
|
+
* 9.1, 9.2): Slack's install screen for the bot, with the install's state
|
|
29
|
+
* sealed for ten minutes, and the bot waits for its install. For the
|
|
30
|
+
* gateway's bot, one Slack did not make at connect is made first; a ship's
|
|
31
|
+
* bot needs the actor within manage reach of the ship.
|
|
32
|
+
*/
|
|
33
|
+
export declare function createStartInstall(deps: {
|
|
34
|
+
slack: Pick<SlackTooling, 'makeApp'>;
|
|
35
|
+
apps: Pick<SlackApps, 'gatewayBot' | 'find' | 'save'>;
|
|
36
|
+
workspaces: Pick<SlackWorkspaces, 'find'>;
|
|
37
|
+
takeAccessToken: TakeAccessToken;
|
|
38
|
+
states: InstallStates;
|
|
39
|
+
ships: Pick<SlackShips, 'read' | 'checkManage'>;
|
|
40
|
+
credentialOf: CredentialOf;
|
|
41
|
+
clock: Clock;
|
|
42
|
+
addresses: SlackAddresses;
|
|
43
|
+
}): StartInstall;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
import { SLACK_SCOPE } from './connect-slack.js';
|
|
4
|
+
import { gatewayBotOf } from './gateway-bot.js';
|
|
5
|
+
import { managedShipBot } from './ship-bot.js';
|
|
6
|
+
import { slackUnavailableMessage } from './take-access-token.js';
|
|
7
|
+
/** How long an install the gateway started may take to come back. */
|
|
8
|
+
export const INSTALL_MS = 10 * 60 * 1000;
|
|
9
|
+
/**
|
|
10
|
+
* Use case: an actor holding gateway:slack presses Install (gateway scopes
|
|
11
|
+
* 9.1, 9.2): Slack's install screen for the bot, with the install's state
|
|
12
|
+
* sealed for ten minutes, and the bot waits for its install. For the
|
|
13
|
+
* gateway's bot, one Slack did not make at connect is made first; a ship's
|
|
14
|
+
* bot needs the actor within manage reach of the ship.
|
|
15
|
+
*/
|
|
16
|
+
export function createStartInstall(deps) {
|
|
17
|
+
return async ({ actor, as, bot: asked }) => {
|
|
18
|
+
if (!actor.scopes.includes(SLACK_SCOPE)) {
|
|
19
|
+
return refuse('SLACK_SCOPE_NOT_HELD', `Installing a Slack bot needs ${SLACK_SCOPE}`);
|
|
20
|
+
}
|
|
21
|
+
const { fleetId } = actor;
|
|
22
|
+
if ((await deps.workspaces.find(fleetId)) === undefined) {
|
|
23
|
+
return refuse('SLACK_NOT_CONNECTED', 'The fleet is connected to no Slack workspace');
|
|
24
|
+
}
|
|
25
|
+
let bot;
|
|
26
|
+
if (asked.kind === 'ship') {
|
|
27
|
+
const shipBot = await managedShipBot(deps, { actor, as, appId: asked.appId });
|
|
28
|
+
if (!shipBot.isOk) {
|
|
29
|
+
return shipBot;
|
|
30
|
+
}
|
|
31
|
+
bot = shipBot.value;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
bot = await deps.apps.gatewayBot(fleetId);
|
|
35
|
+
}
|
|
36
|
+
if (bot === undefined && asked.kind === 'gateway') {
|
|
37
|
+
const accessToken = await deps.takeAccessToken(fleetId);
|
|
38
|
+
if (!accessToken.isOk) {
|
|
39
|
+
return accessToken;
|
|
40
|
+
}
|
|
41
|
+
const made = await gatewayBotOf(deps, { fleetId, fleetName: asked.fleetName, accessToken: accessToken.value });
|
|
42
|
+
if (!made.isOk) {
|
|
43
|
+
return refuse('SLACK_UNAVAILABLE', made.error.kind === 'refused' ? `Slack did not make the gateway's bot (${made.error.error})` : slackUnavailableMessage(made.error));
|
|
44
|
+
}
|
|
45
|
+
bot = made.value;
|
|
46
|
+
}
|
|
47
|
+
if (bot === undefined) {
|
|
48
|
+
return refuse('NO_SUCH_BOT', "The gateway's bot is not made");
|
|
49
|
+
}
|
|
50
|
+
const now = deps.clock.now();
|
|
51
|
+
await deps.apps.save({ ...bot, installStartedAt: now });
|
|
52
|
+
const url = new URL(bot.installUrl);
|
|
53
|
+
url.searchParams.set('state', deps.states.seal({ fleetId, appId: bot.appId, expiresAt: new Date(now.getTime() + INSTALL_MS) }));
|
|
54
|
+
return ok({ url: url.toString() });
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=start-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-install.js","sourceRoot":"","sources":["../../../src/core/slack/start-install.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAE,uBAAuB,EAAwB,MAAM,wBAAwB,CAAC;AAEvF,qEAAqE;AACrE,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAOzC;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAUlC;IACC,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;QACzC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACxC,OAAO,MAAM,CAAC,sBAAsB,EAAE,gCAAgC,WAAW,EAAE,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YACxD,OAAO,MAAM,CAAC,qBAAqB,EAAE,8CAA8C,CAAC,CAAC;QACvF,CAAC;QACD,IAAI,GAAyB,CAAC;QAC9B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9E,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAClB,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAClD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACxD,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;gBACtB,OAAO,WAAW,CAAC;YACrB,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/G,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,MAAM,CAAC,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,yCAAyC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACzK,CAAC;YACD,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;QACnB,CAAC;QACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,MAAM,CAAC,aAAa,EAAE,+BAA+B,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACpC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAChI,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Actor } from '../actors/authenticate-actor.js';
|
|
2
|
+
import type { CrewPersonShip } from '../people/crew-person-ship.js';
|
|
3
|
+
import type { Clock } from '../shared/clock.js';
|
|
4
|
+
import { type DomainError } from '../shared/errors.js';
|
|
5
|
+
import { type Result } from '../shared/result.js';
|
|
6
|
+
import type { LinkStates, SlackApps, SlackSignIn, SlackWorkspaces } from './ports.js';
|
|
7
|
+
/** How long a link the gateway started may take to come back from Slack. */
|
|
8
|
+
export declare const LINK_MS: number;
|
|
9
|
+
export type StartLinkRefusal = DomainError<'NOT_A_PERSON' | 'SLACK_NOT_CONNECTED' | 'NO_SUCH_BOT' | 'FLEET_UNAVAILABLE'>;
|
|
10
|
+
export type StartLink = (input: {
|
|
11
|
+
actor: Actor;
|
|
12
|
+
}) => Promise<Result<{
|
|
13
|
+
url: string;
|
|
14
|
+
}, StartLinkRefusal>>;
|
|
15
|
+
/**
|
|
16
|
+
* Use case: a person presses Link Slack, on the Overview or in the answer a
|
|
17
|
+
* bot gave them in Slack (gateway scopes 9.3): Sign in with Slack through
|
|
18
|
+
* the fleet's own bot's app, for the fleet's workspace, with the link's
|
|
19
|
+
* state sealed for ten minutes. Only an account with a person ship in the
|
|
20
|
+
* fleet links. The gateway crews that ship now, with the account's token it
|
|
21
|
+
* holds only while the person is here, so their messages from Slack can be
|
|
22
|
+
* sent as it later.
|
|
23
|
+
*/
|
|
24
|
+
export declare function createStartLink(deps: {
|
|
25
|
+
workspaces: Pick<SlackWorkspaces, 'find'>;
|
|
26
|
+
apps: Pick<SlackApps, 'gatewayBot'>;
|
|
27
|
+
signIn: Pick<SlackSignIn, 'authorizeUrl'>;
|
|
28
|
+
states: LinkStates;
|
|
29
|
+
crewPersonShip: CrewPersonShip;
|
|
30
|
+
clock: Clock;
|
|
31
|
+
linkRedirectUrl: string;
|
|
32
|
+
}): StartLink;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
/** How long a link the gateway started may take to come back from Slack. */
|
|
4
|
+
export const LINK_MS = 10 * 60 * 1000;
|
|
5
|
+
const NO_PERSON_SHIP = 'Your account has no person ship in this fleet';
|
|
6
|
+
/**
|
|
7
|
+
* Use case: a person presses Link Slack, on the Overview or in the answer a
|
|
8
|
+
* bot gave them in Slack (gateway scopes 9.3): Sign in with Slack through
|
|
9
|
+
* the fleet's own bot's app, for the fleet's workspace, with the link's
|
|
10
|
+
* state sealed for ten minutes. Only an account with a person ship in the
|
|
11
|
+
* fleet links. The gateway crews that ship now, with the account's token it
|
|
12
|
+
* holds only while the person is here, so their messages from Slack can be
|
|
13
|
+
* sent as it later.
|
|
14
|
+
*/
|
|
15
|
+
export function createStartLink(deps) {
|
|
16
|
+
return async ({ actor }) => {
|
|
17
|
+
if (actor.kind !== 'account' || actor.personShipId === null || actor.accountToken === null) {
|
|
18
|
+
return refuse('NOT_A_PERSON', NO_PERSON_SHIP);
|
|
19
|
+
}
|
|
20
|
+
const { fleetId, accountId, personShipId, accountToken } = actor;
|
|
21
|
+
const workspace = await deps.workspaces.find(fleetId);
|
|
22
|
+
if (workspace === undefined) {
|
|
23
|
+
return refuse('SLACK_NOT_CONNECTED', 'The fleet is connected to no Slack workspace');
|
|
24
|
+
}
|
|
25
|
+
const bot = await deps.apps.gatewayBot(fleetId);
|
|
26
|
+
if (bot === undefined) {
|
|
27
|
+
return refuse('NO_SUCH_BOT', "The fleet's own Slack bot is not made");
|
|
28
|
+
}
|
|
29
|
+
const crewed = await deps.crewPersonShip({ fleetId, signedIn: { accountToken, personShipId } });
|
|
30
|
+
if (!crewed.isOk) {
|
|
31
|
+
switch (crewed.error.kind) {
|
|
32
|
+
case 'noPersonShip':
|
|
33
|
+
return refuse('NOT_A_PERSON', NO_PERSON_SHIP);
|
|
34
|
+
case 'fleetRefused':
|
|
35
|
+
return refuse('FLEET_UNAVAILABLE', `The fleet did not crew your person ship: ${crewed.error.message}`);
|
|
36
|
+
case 'signedOut':
|
|
37
|
+
case 'pagasaeUnavailable':
|
|
38
|
+
case 'notConnected':
|
|
39
|
+
return refuse('FLEET_UNAVAILABLE', 'The fleet did not crew your person ship: try again in a moment');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const state = deps.states.seal({ fleetId, accountId, personShipId, expiresAt: new Date(deps.clock.now().getTime() + LINK_MS) });
|
|
43
|
+
return ok({ url: deps.signIn.authorizeUrl({ clientId: bot.clientId, redirectUrl: deps.linkRedirectUrl, state, teamId: workspace.teamId }) });
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=start-link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-link.js","sourceRoot":"","sources":["../../../src/core/slack/start-link.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAGtD,4EAA4E;AAC5E,MAAM,CAAC,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEtC,MAAM,cAAc,GAAG,+CAA+C,CAAC;AAMvE;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,IAQ/B;IACC,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QACzB,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;YAC3F,OAAO,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;QACjE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,MAAM,CAAC,qBAAqB,EAAE,8CAA8C,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,MAAM,CAAC,aAAa,EAAE,uCAAuC,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;QAChG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,QAAQ,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC1B,KAAK,cAAc;oBACjB,OAAO,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;gBAChD,KAAK,cAAc;oBACjB,OAAO,MAAM,CAAC,mBAAmB,EAAE,4CAA4C,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACzG,KAAK,WAAW,CAAC;gBACjB,KAAK,oBAAoB,CAAC;gBAC1B,KAAK,cAAc;oBACjB,OAAO,MAAM,CAAC,mBAAmB,EAAE,gEAAgE,CAAC,CAAC;YACzG,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;QAChI,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/I,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { Clock } from '../shared/clock.js';
|
|
3
|
+
import type { SlackLinks } from './ports.js';
|
|
4
|
+
export type StopSlackLink = (account: {
|
|
5
|
+
fleetId: FleetId;
|
|
6
|
+
accountId: string;
|
|
7
|
+
}) => Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Use case: pagasae disabled the account (0055), so its Slack link stops
|
|
10
|
+
* (gateway scopes 9.3). It is kept, stopped from when it first stopped, so
|
|
11
|
+
* its Slack user is answered that the account cannot message the fleet now.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createStopSlackLink(deps: {
|
|
14
|
+
links: Pick<SlackLinks, 'stop'>;
|
|
15
|
+
clock: Clock;
|
|
16
|
+
}): StopSlackLink;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Use case: pagasae disabled the account (0055), so its Slack link stops
|
|
3
|
+
* (gateway scopes 9.3). It is kept, stopped from when it first stopped, so
|
|
4
|
+
* its Slack user is answered that the account cannot message the fleet now.
|
|
5
|
+
*/
|
|
6
|
+
export function createStopSlackLink(deps) {
|
|
7
|
+
return ({ fleetId, accountId }) => deps.links.stop(fleetId, { accountId, at: deps.clock.now() });
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=stop-slack-link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop-slack-link.js","sourceRoot":"","sources":["../../../src/core/slack/stop-slack-link.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAuD;IACzF,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACnG,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { Clock } from '../shared/clock.js';
|
|
3
|
+
import { type DomainError } from '../shared/errors.js';
|
|
4
|
+
import { type Result } from '../shared/result.js';
|
|
5
|
+
import type { SlackRefusal, SlackTooling, SlackWorkspaces } from './ports.js';
|
|
6
|
+
export type TakeAccessTokenRefusal = DomainError<'SLACK_NOT_CONNECTED' | 'SLACK_TOKEN_REFUSED' | 'SLACK_UNAVAILABLE'>;
|
|
7
|
+
export type TakeAccessToken = (fleetId: FleetId) => Promise<Result<string, TakeAccessTokenRefusal>>;
|
|
8
|
+
/** What a page says of a configuration token Slack refused (gateway scopes 9.1). */
|
|
9
|
+
export declare const TOKEN_REFUSED_MESSAGE = "Slack refused the configuration token. Connect again to make or change bots; bots already installed keep working";
|
|
10
|
+
/** What a page says when Slack did not do what was asked for now: rate limited, or no answer. */
|
|
11
|
+
export declare function slackUnavailableMessage(refusal: Exclude<SlackRefusal, {
|
|
12
|
+
kind: 'refused';
|
|
13
|
+
}>): string;
|
|
14
|
+
/**
|
|
15
|
+
* Use case: the fleet's configuration access token, to make or remove an app
|
|
16
|
+
* with. Fresh, it is used as kept; within its last hour it is rotated first,
|
|
17
|
+
* holding the workspace, so its single-use refresh token is spent once.
|
|
18
|
+
* Slack refusing the refresh token marks it refused until someone connects
|
|
19
|
+
* again; Slack not answering keeps the old pair, to rotate again later.
|
|
20
|
+
*/
|
|
21
|
+
export declare function createTakeAccessToken(deps: {
|
|
22
|
+
slack: Pick<SlackTooling, 'rotateConfigurationToken'>;
|
|
23
|
+
workspaces: Pick<SlackWorkspaces, 'change'>;
|
|
24
|
+
clock: Clock;
|
|
25
|
+
}): TakeAccessToken;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
import { isFresh } from './slack-workspace.js';
|
|
4
|
+
/** What a page says of a configuration token Slack refused (gateway scopes 9.1). */
|
|
5
|
+
export const TOKEN_REFUSED_MESSAGE = 'Slack refused the configuration token. Connect again to make or change bots; bots already installed keep working';
|
|
6
|
+
/** What a page says when Slack did not do what was asked for now: rate limited, or no answer. */
|
|
7
|
+
export function slackUnavailableMessage(refusal) {
|
|
8
|
+
return refusal.kind === 'rateLimited' ? `Slack asks to wait ${String(refusal.retryAfterSeconds)} seconds: try again then` : 'Slack did not answer: try again';
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Use case: the fleet's configuration access token, to make or remove an app
|
|
12
|
+
* with. Fresh, it is used as kept; within its last hour it is rotated first,
|
|
13
|
+
* holding the workspace, so its single-use refresh token is spent once.
|
|
14
|
+
* Slack refusing the refresh token marks it refused until someone connects
|
|
15
|
+
* again; Slack not answering keeps the old pair, to rotate again later.
|
|
16
|
+
*/
|
|
17
|
+
export function createTakeAccessToken(deps) {
|
|
18
|
+
return async (fleetId) => {
|
|
19
|
+
let outcome;
|
|
20
|
+
const rotate = async (workspace) => {
|
|
21
|
+
if (workspace.isTokenRefused) {
|
|
22
|
+
outcome = refuse('SLACK_TOKEN_REFUSED', TOKEN_REFUSED_MESSAGE);
|
|
23
|
+
return workspace;
|
|
24
|
+
}
|
|
25
|
+
if (isFresh(workspace.token, deps.clock.now())) {
|
|
26
|
+
outcome = ok(workspace.token.accessToken);
|
|
27
|
+
return workspace;
|
|
28
|
+
}
|
|
29
|
+
const rotated = await deps.slack.rotateConfigurationToken(workspace.token.refreshToken);
|
|
30
|
+
if (rotated.isOk) {
|
|
31
|
+
outcome = ok(rotated.value.token.accessToken);
|
|
32
|
+
return { ...workspace, token: rotated.value.token };
|
|
33
|
+
}
|
|
34
|
+
if (rotated.error.kind === 'refused') {
|
|
35
|
+
outcome = refuse('SLACK_TOKEN_REFUSED', TOKEN_REFUSED_MESSAGE);
|
|
36
|
+
return { ...workspace, isTokenRefused: true };
|
|
37
|
+
}
|
|
38
|
+
outcome = refuse('SLACK_UNAVAILABLE', slackUnavailableMessage(rotated.error));
|
|
39
|
+
return workspace;
|
|
40
|
+
};
|
|
41
|
+
await deps.workspaces.change(fleetId, rotate);
|
|
42
|
+
return outcome ?? refuse('SLACK_NOT_CONNECTED', 'The fleet is connected to no Slack workspace');
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=take-access-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"take-access-token.js","sourceRoot":"","sources":["../../../src/core/slack/take-access-token.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,OAAO,EAAuB,MAAM,sBAAsB,CAAC;AAMpE,oFAAoF;AACpF,MAAM,CAAC,MAAM,qBAAqB,GAAG,kHAAkH,CAAC;AAExJ,iGAAiG;AACjG,MAAM,UAAU,uBAAuB,CAAC,OAAmD;IACzF,OAAO,OAAO,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,sBAAsB,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,0BAA0B,CAAC,CAAC,CAAC,iCAAiC,CAAC;AAChK,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAA0H;IAC9J,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACvB,IAAI,OAA2D,CAAC;QAChE,MAAM,MAAM,GAAG,KAAK,EAAE,SAAyB,EAA2B,EAAE;YAC1E,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;gBAC7B,OAAO,GAAG,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC,CAAC;gBAC/D,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;gBAC/C,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBAC1C,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACxF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBAC9C,OAAO,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACtD,CAAC;YACD,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACrC,OAAO,GAAG,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC,CAAC;gBAC/D,OAAO,EAAE,GAAG,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;YAChD,CAAC;YACD,OAAO,GAAG,MAAM,CAAC,mBAAmB,EAAE,uBAAuB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9E,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC;QACF,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO,OAAO,IAAI,MAAM,CAAC,qBAAqB,EAAE,8CAA8C,CAAC,CAAC;IAClG,CAAC,CAAC;AACJ,CAAC"}
|