@aeolus-fleet/gateway 0.32.2 → 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 +11 -11
- 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 +11 -11
- 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 +8 -8
- 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/_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 +174 -28
- 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/{0ke_2_la1glwa.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/{1tgs1j0j-1qlh.js → 1msggkwsn7vyq.js} +1 -1
- package/web/.next/static/chunks/{2hj3-kl1ggnu_.js → 2-kh9nbonee6w.js} +1 -1
- package/web/.next/static/chunks/2l92bozm8dcmo.js +1 -0
- package/web/.next/static/chunks/{2d283cu3en9cy.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/{2n4bf_2r9lysd.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/0ul9rtulfiph6.js +0 -1
- package/web/.next/static/chunks/19wvmglfgof0u.js +0 -1
- package/web/.next/static/chunks/2i3ydqqupow_x.js +0 -1
- package/web/.next/static/chunks/2ngyis59r3qta.js +0 -1
- package/web/.next/static/chunks/3bl-e3zhidrrz.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/{tQFXrUWi6vEZq4Cp-U5tk → 87vMFs_KGRcFD40WWRkFR}/_buildManifest.js +0 -0
- /package/web/.next/static/{tQFXrUWi6vEZq4Cp-U5tk → 87vMFs_KGRcFD40WWRkFR}/_clientMiddlewareManifest.js +0 -0
- /package/web/.next/static/{tQFXrUWi6vEZq4Cp-U5tk → 87vMFs_KGRcFD40WWRkFR}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { TAKEN_KEPT_MS, UNTAKEN_KEPT_MS } from './kept-slack-event.js';
|
|
2
|
+
/** How many kept events a round sends at most. */
|
|
3
|
+
const ROUND_LIMIT = 50;
|
|
4
|
+
/** The reaction that tells the person their message reached the fleet. */
|
|
5
|
+
export const STORED_REACTION = 'white_check_mark';
|
|
6
|
+
/** The fleet's codes for a send it did not answer, or could not start: nothing was stored, so the same send goes again. */
|
|
7
|
+
const NOT_ANSWERED = new Set(['UNAVAILABLE', 'SERVICE_UNAVAILABLE', 'INTERNAL_SERVER_ERROR', 'TIMEOUT']);
|
|
8
|
+
/** The fleet's codes for a crew token that no longer works: the person ship is crewed again at their next visit, and the send goes then. */
|
|
9
|
+
const ENDED_CREW = new Set(['LEASE_ENDED', 'UNAUTHORIZED']);
|
|
10
|
+
export const NOT_REACHED_TEXT = 'This message did not reach the fleet; send it again';
|
|
11
|
+
/** What the person reads in the thread when core refused their message, plainly. */
|
|
12
|
+
function refusalText(ship, refusal) {
|
|
13
|
+
switch (refusal.code) {
|
|
14
|
+
case 'NOT_REACHABLE':
|
|
15
|
+
return `You may not message ${ship}`;
|
|
16
|
+
case 'UNRESOLVABLE_SELECTOR':
|
|
17
|
+
return `${ship} was retired`;
|
|
18
|
+
default:
|
|
19
|
+
return `${ship} did not take your message: ${refusal.message}`;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Use case: a round of the gateway's sends from Slack into the fleet
|
|
24
|
+
* (gateway scopes 9.4 steps 5 to 7, P-B2). Each kept event goes as the
|
|
25
|
+
* person ship, which the gateway crews, to the bot's ship by its id, as
|
|
26
|
+
* Markdown, keyed by Slack's event id so a send tried again is the same
|
|
27
|
+
* send. Core stored it: the gateway reacts to the person's Slack message.
|
|
28
|
+
* Core refused it: the reason goes in its thread. Core did not answer: it
|
|
29
|
+
* goes again next round. Nothing builds up: a taken event's id goes an
|
|
30
|
+
* hour after core took it, and an event core has not taken in 24 hours
|
|
31
|
+
* goes, the person told in its thread.
|
|
32
|
+
*/
|
|
33
|
+
export function createSendSlackEvents(deps) {
|
|
34
|
+
const send = async (event) => {
|
|
35
|
+
const app = await deps.apps.findByAppId(event.appId);
|
|
36
|
+
const crew = await deps.crews.find(event.fleetId, event.personShipId);
|
|
37
|
+
if (app === undefined || app.bot === null || crew === undefined) {
|
|
38
|
+
// No bot to answer with, or no crew to send as: the event waits, and goes after 24 hours told as not reached.
|
|
39
|
+
return 'later';
|
|
40
|
+
}
|
|
41
|
+
const where = { channel: event.channel, threadTs: event.threadTs ?? event.ts };
|
|
42
|
+
const message = { to: event.shipId, contentType: 'text/markdown', payload: event.markdown, idempotencyKey: `slack:${event.eventId}` };
|
|
43
|
+
const sent = await deps.sender.send(crew.crewToken, event.inReplyTo === null ? message : { ...message, inReplyTo: event.inReplyTo });
|
|
44
|
+
if (sent.isOk) {
|
|
45
|
+
const { fleetId, personShipId, appId, channel, ts, threadTs } = event;
|
|
46
|
+
await deps.posts.save({ fleetId, personShipId, messageId: sent.value.messageId, deliveryId: null, senderShipId: null, appId, channel, ts, threadTs, isLinkOnly: false, ackedAt: null });
|
|
47
|
+
if (event.deliveryId !== null) {
|
|
48
|
+
// A refusal leaves the delivery acknowledged, as an answer on the gateway's page does when handled is refused.
|
|
49
|
+
await deps.door.handled(crew.crewToken, event.deliveryId);
|
|
50
|
+
}
|
|
51
|
+
// Without the reaction the person sees no sign and sends again: the event goes again, the same send by its key.
|
|
52
|
+
const reacted = await deps.slack.react(app.bot.token, { channel, ts, name: STORED_REACTION });
|
|
53
|
+
return reacted.isOk ? 'taken' : 'later';
|
|
54
|
+
}
|
|
55
|
+
if (NOT_ANSWERED.has(sent.error.code) || ENDED_CREW.has(sent.error.code)) {
|
|
56
|
+
return 'later';
|
|
57
|
+
}
|
|
58
|
+
// A refusal is dropped only once the person was told it.
|
|
59
|
+
const told = await deps.slack.postInThread(app.bot.token, { ...where, text: refusalText(app.name, sent.error) });
|
|
60
|
+
return told.isOk ? 'taken' : 'later';
|
|
61
|
+
};
|
|
62
|
+
const tellNotReached = async (event) => {
|
|
63
|
+
const app = await deps.apps.findByAppId(event.appId);
|
|
64
|
+
if (app !== undefined && app.bot !== null) {
|
|
65
|
+
await deps.slack.postInThread(app.bot.token, { channel: event.channel, threadTs: event.threadTs ?? event.ts, text: NOT_REACHED_TEXT });
|
|
66
|
+
}
|
|
67
|
+
await deps.events.remove(event.fleetId, event.eventId);
|
|
68
|
+
};
|
|
69
|
+
return async () => {
|
|
70
|
+
const now = deps.clock.now();
|
|
71
|
+
await deps.events.forgetTaken(new Date(now.getTime() - TAKEN_KEPT_MS));
|
|
72
|
+
for (const event of await deps.events.untakenSince(new Date(now.getTime() - UNTAKEN_KEPT_MS))) {
|
|
73
|
+
await tellNotReached(event);
|
|
74
|
+
}
|
|
75
|
+
await deps.events.sendDue(send, { limit: ROUND_LIMIT, at: now });
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=send-slack-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-slack-events.js","sourceRoot":"","sources":["../../../src/core/slack/send-slack-events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Actor } from '../actors/authenticate-actor.js';
|
|
2
|
+
import type { ActorCredential, CredentialOf } from '../actors/credential-of.js';
|
|
3
|
+
import { type DomainError } from '../shared/errors.js';
|
|
4
|
+
import { type Result } from '../shared/result.js';
|
|
5
|
+
import type { SlackApps, SlackShips } from './ports.js';
|
|
6
|
+
import type { SlackApp } from './slack-app.js';
|
|
7
|
+
export type ShipBotRefusal = DomainError<'NO_SUCH_BOT' | 'NOT_REACHABLE' | 'FLEET_UNAVAILABLE'>;
|
|
8
|
+
/**
|
|
9
|
+
* A ship's bot in the actor's fleet, once the fleet, asked as the actor,
|
|
10
|
+
* answers that the actor manages the ship (B6). The gateway's own bot is no
|
|
11
|
+
* ship's.
|
|
12
|
+
*/
|
|
13
|
+
export declare function managedShipBot(deps: {
|
|
14
|
+
apps: Pick<SlackApps, 'find'>;
|
|
15
|
+
ships: Pick<SlackShips, 'read' | 'checkManage'>;
|
|
16
|
+
credentialOf: CredentialOf;
|
|
17
|
+
}, asked: {
|
|
18
|
+
actor: Actor;
|
|
19
|
+
as: ActorCredential;
|
|
20
|
+
appId: string;
|
|
21
|
+
}): Promise<Result<SlackApp & {
|
|
22
|
+
shipName: string;
|
|
23
|
+
}, ShipBotRefusal>>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
/**
|
|
4
|
+
* A ship's bot in the actor's fleet, once the fleet, asked as the actor,
|
|
5
|
+
* answers that the actor manages the ship (B6). The gateway's own bot is no
|
|
6
|
+
* ship's.
|
|
7
|
+
*/
|
|
8
|
+
export async function managedShipBot(deps, asked) {
|
|
9
|
+
const app = await deps.apps.find(asked.actor.fleetId, asked.appId);
|
|
10
|
+
if (app?.shipId === undefined || app.shipId === null) {
|
|
11
|
+
return refuse('NO_SUCH_BOT', `The gateway made no ship's bot ${asked.appId} in this fleet`);
|
|
12
|
+
}
|
|
13
|
+
const ship = await deps.ships.read(app.fleetId, app.shipId);
|
|
14
|
+
const shipName = ship.isOk ? ship.value.name : app.name;
|
|
15
|
+
const credential = await deps.credentialOf(asked.actor, asked.as);
|
|
16
|
+
if (!credential.isOk) {
|
|
17
|
+
return credential;
|
|
18
|
+
}
|
|
19
|
+
const managed = await deps.ships.checkManage(credential.value, app.shipId);
|
|
20
|
+
if (!managed.isOk) {
|
|
21
|
+
return managed.error.code === 'UNAVAILABLE' ? refuse('FLEET_UNAVAILABLE', `The fleet did not say whether you manage ${shipName}: ${managed.error.message}`) : refuse('NOT_REACHABLE', managed.error.message);
|
|
22
|
+
}
|
|
23
|
+
return ok({ ...app, shipName });
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=ship-bot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship-bot.js","sourceRoot":"","sources":["../../../src/core/slack/ship-bot.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAMtD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAoH,EACpH,KAA2D;IAE3D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACnE,IAAI,GAAG,EAAE,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACrD,OAAO,MAAM,CAAC,aAAa,EAAE,kCAAkC,KAAK,CAAC,KAAK,gBAAgB,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IACxD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAClE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACrB,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3E,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,EAAE,4CAA4C,QAAQ,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/M,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Actor } from '../actors/authenticate-actor.js';
|
|
2
|
+
import { type DomainError } from '../shared/errors.js';
|
|
3
|
+
import { type Result } from '../shared/result.js';
|
|
4
|
+
import type { SlackLinks } from './ports.js';
|
|
5
|
+
export type ShowAllInSlack = (input: {
|
|
6
|
+
actor: Actor;
|
|
7
|
+
isOn: boolean;
|
|
8
|
+
}) => Promise<Result<undefined, DomainError<'NOT_LINKED'>>>;
|
|
9
|
+
/**
|
|
10
|
+
* Use case: the person turns Show everything that waits in Slack on or off
|
|
11
|
+
* (gateway scopes 9.6, B5): with it on, messages from ships that are not
|
|
12
|
+
* bots show through the gateway's own bot too. Off until turned on (W8).
|
|
13
|
+
*/
|
|
14
|
+
export declare function createShowAllInSlack(deps: {
|
|
15
|
+
links: Pick<SlackLinks, 'ofAccount' | 'showAll'>;
|
|
16
|
+
}): ShowAllInSlack;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
/**
|
|
4
|
+
* Use case: the person turns Show everything that waits in Slack on or off
|
|
5
|
+
* (gateway scopes 9.6, B5): with it on, messages from ships that are not
|
|
6
|
+
* bots show through the gateway's own bot too. Off until turned on (W8).
|
|
7
|
+
*/
|
|
8
|
+
export function createShowAllInSlack(deps) {
|
|
9
|
+
return async ({ actor, isOn }) => {
|
|
10
|
+
const link = actor.kind === 'account' ? await deps.links.ofAccount(actor.fleetId, actor.accountId) : undefined;
|
|
11
|
+
if (link === undefined) {
|
|
12
|
+
return refuse('NOT_LINKED', 'Link your Slack account first');
|
|
13
|
+
}
|
|
14
|
+
await deps.links.showAll(link.fleetId, { accountId: link.accountId, isOn });
|
|
15
|
+
return ok(undefined);
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=show-all-in-slack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show-all-in-slack.js","sourceRoot":"","sources":["../../../src/core/slack/show-all-in-slack.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAKtD;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAA0D;IAC7F,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;QAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/G,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC,YAAY,EAAE,+BAA+B,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5E,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { FleetRefusal } from '../connection/ports.js';
|
|
3
|
+
import type { Sleep } from '../mcp-out/run-party.js';
|
|
4
|
+
import type { PersonShip, PersonShipDoor, PushedPersonDelivery, ShownThere } from '../people/ports.js';
|
|
5
|
+
import type { Clock } from '../shared/clock.js';
|
|
6
|
+
import { type Result } from '../shared/result.js';
|
|
7
|
+
import type { SlackApps, SlackLinks, SlackMessages, SlackPosts } from './ports.js';
|
|
8
|
+
export type ShowInSlack = (ship: PersonShip, wake: {
|
|
9
|
+
crewToken: string;
|
|
10
|
+
fresh: readonly PushedPersonDelivery[];
|
|
11
|
+
}) => Promise<Result<ShownThere, FleetRefusal>>;
|
|
12
|
+
/**
|
|
13
|
+
* Use case: shows what waits for a linked person's person ship in Slack
|
|
14
|
+
* (gateway scopes 9.5), as the gateway wakes them. A reply to a message
|
|
15
|
+
* from Slack goes into that conversation or thread; a bot ship's message
|
|
16
|
+
* into that bot's direct messages with the person (P-B1); anything else
|
|
17
|
+
* through the gateway's own bot, headed by the sender, once the person
|
|
18
|
+
* turned Slack on (B5). A bot removed in Slack falls back to the gateway's
|
|
19
|
+
* bot, with Slack on. Each delivery is kept as a post, handed with channel
|
|
20
|
+
* slack, posted, given its Slack message, then acknowledged (B4); a link for
|
|
21
|
+
* what Slack does not show in full is handed only, as a wake. Slack rate
|
|
22
|
+
* limited: the post waits Retry-After and goes again with the same hand-over.
|
|
23
|
+
* Slack refused the post: nothing is kept, and web push and email wake as
|
|
24
|
+
* before. A post the gateway did not finish (it stopped, or core refused
|
|
25
|
+
* the acknowledgement) is finished first, at every wake, never posted twice
|
|
26
|
+
* once in Slack. It answers the deliveries Slack showed, which no other
|
|
27
|
+
* channel wakes for, and whether a post is left unfinished.
|
|
28
|
+
*/
|
|
29
|
+
export declare function createShowInSlack(deps: {
|
|
30
|
+
links: Pick<SlackLinks, 'ofPersonShip'>;
|
|
31
|
+
apps: Pick<SlackApps, 'find' | 'ofShip' | 'gatewayBot'>;
|
|
32
|
+
posts: SlackPosts;
|
|
33
|
+
slack: Pick<SlackMessages, 'post'>;
|
|
34
|
+
door: Pick<PersonShipDoor, 'pushReceive' | 'handed' | 'ack'>;
|
|
35
|
+
sleep: Sleep;
|
|
36
|
+
clock: Clock;
|
|
37
|
+
overviewUrlOf: (fleetId: FleetId) => string;
|
|
38
|
+
}): ShowInSlack;
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { ok } from '../shared/result.js';
|
|
2
|
+
import { slackPostOf } from './slack-post-of.js';
|
|
3
|
+
/** How often a post Slack rate limits is asked again within one wake. */
|
|
4
|
+
const RATE_LIMITED_TRIES = 3;
|
|
5
|
+
const SECOND_MS = 1000;
|
|
6
|
+
/** The number a delivery is handed with: the first hand-over, made again with the same number counts nothing (0040). */
|
|
7
|
+
const FIRST_HAND_OVER = 1;
|
|
8
|
+
function isInSlack(app) {
|
|
9
|
+
return app !== undefined && app.bot !== null && app.removedInSlackAt === null;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Use case: shows what waits for a linked person's person ship in Slack
|
|
13
|
+
* (gateway scopes 9.5), as the gateway wakes them. A reply to a message
|
|
14
|
+
* from Slack goes into that conversation or thread; a bot ship's message
|
|
15
|
+
* into that bot's direct messages with the person (P-B1); anything else
|
|
16
|
+
* through the gateway's own bot, headed by the sender, once the person
|
|
17
|
+
* turned Slack on (B5). A bot removed in Slack falls back to the gateway's
|
|
18
|
+
* bot, with Slack on. Each delivery is kept as a post, handed with channel
|
|
19
|
+
* slack, posted, given its Slack message, then acknowledged (B4); a link for
|
|
20
|
+
* what Slack does not show in full is handed only, as a wake. Slack rate
|
|
21
|
+
* limited: the post waits Retry-After and goes again with the same hand-over.
|
|
22
|
+
* Slack refused the post: nothing is kept, and web push and email wake as
|
|
23
|
+
* before. A post the gateway did not finish (it stopped, or core refused
|
|
24
|
+
* the acknowledgement) is finished first, at every wake, never posted twice
|
|
25
|
+
* once in Slack. It answers the deliveries Slack showed, which no other
|
|
26
|
+
* channel wakes for, and whether a post is left unfinished.
|
|
27
|
+
*/
|
|
28
|
+
export function createShowInSlack(deps) {
|
|
29
|
+
const whereOf = async (link, delivery) => {
|
|
30
|
+
const { fleetId, personShipId, slackUserId, isShowingAll } = link;
|
|
31
|
+
const repliedTo = delivery.inReplyTo === null ? undefined : await deps.posts.ofMessage(fleetId, { personShipId, messageId: delivery.inReplyTo });
|
|
32
|
+
if (repliedTo !== undefined) {
|
|
33
|
+
const app = await deps.apps.find(fleetId, repliedTo.appId);
|
|
34
|
+
if (isInSlack(app)) {
|
|
35
|
+
return { app, channel: repliedTo.channel, threadTs: repliedTo.threadTs ?? repliedTo.ts };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const bot = await deps.apps.ofShip(fleetId, delivery.senderShipId);
|
|
39
|
+
if (isInSlack(bot)) {
|
|
40
|
+
return { app: bot, channel: slackUserId, threadTs: null };
|
|
41
|
+
}
|
|
42
|
+
const gatewayBot = isShowingAll ? await deps.apps.gatewayBot(fleetId) : undefined;
|
|
43
|
+
return isInSlack(gatewayBot) ? { app: gatewayBot, channel: slackUserId, threadTs: null } : undefined;
|
|
44
|
+
};
|
|
45
|
+
/** Posts it, waiting out Slack's rate limits: the Slack message, or none when Slack refused it. */
|
|
46
|
+
const posted = async (where, shown) => {
|
|
47
|
+
for (let tried = 1;; tried += 1) {
|
|
48
|
+
const answered = await deps.slack.post(where.app.bot.token, { channel: where.channel, threadTs: where.threadTs, text: shown.text, buttons: shown.buttons });
|
|
49
|
+
if (answered.isOk) {
|
|
50
|
+
return answered.value.ts;
|
|
51
|
+
}
|
|
52
|
+
if (answered.error.kind !== 'rateLimited' || tried >= RATE_LIMITED_TRIES) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
await deps.sleep(answered.error.retryAfterSeconds * SECOND_MS, new AbortController().signal);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Posts a kept post not yet in Slack, then acknowledges it unless a link.
|
|
60
|
+
* A post not yet in Slack whose delivery the read did not hold is handed
|
|
61
|
+
* again with the same number, which counts nothing: still handed, it
|
|
62
|
+
* waits for a later read; acknowledged meanwhile, or undeliverable, it is
|
|
63
|
+
* forgotten. A post in Slack is acknowledged by core's ack alone, which
|
|
64
|
+
* takes a delivery acknowledged meanwhile as OK.
|
|
65
|
+
*/
|
|
66
|
+
const finish = async ({ crewToken, post, delivery }) => {
|
|
67
|
+
let current = post;
|
|
68
|
+
if (current.ts === null) {
|
|
69
|
+
if (delivery === undefined) {
|
|
70
|
+
const handed = await deps.door.handed(crewToken, { deliveryId: post.deliveryId, handOverNumber: FIRST_HAND_OVER, channel: 'slack' });
|
|
71
|
+
if (!handed.isOk || handed.value === 'handed') {
|
|
72
|
+
return 'waiting';
|
|
73
|
+
}
|
|
74
|
+
await deps.posts.remove(post.fleetId, post);
|
|
75
|
+
return 'notShown';
|
|
76
|
+
}
|
|
77
|
+
const app = await deps.apps.find(post.fleetId, post.appId);
|
|
78
|
+
const shown = slackPostOf(delivery, { overviewUrl: deps.overviewUrlOf(post.fleetId), isHeadedBySender: app?.shipId === null });
|
|
79
|
+
const ts = isInSlack(app) ? await posted({ app, channel: post.channel, threadTs: post.threadTs }, shown.kind === 'shown' ? shown : { text: shown.text, buttons: [] }) : undefined;
|
|
80
|
+
if (ts === undefined) {
|
|
81
|
+
await deps.posts.remove(post.fleetId, post);
|
|
82
|
+
return 'notShown';
|
|
83
|
+
}
|
|
84
|
+
current = { ...current, ts };
|
|
85
|
+
await deps.posts.save(current);
|
|
86
|
+
}
|
|
87
|
+
if (current.isLinkOnly || current.ackedAt !== null) {
|
|
88
|
+
return 'shown';
|
|
89
|
+
}
|
|
90
|
+
const acked = await deps.door.ack(crewToken, post.deliveryId);
|
|
91
|
+
if (!acked.isOk) {
|
|
92
|
+
return 'unacknowledged';
|
|
93
|
+
}
|
|
94
|
+
await deps.posts.save({ ...current, ackedAt: deps.clock.now() });
|
|
95
|
+
return 'shown';
|
|
96
|
+
};
|
|
97
|
+
return async (ship, { crewToken, fresh }) => {
|
|
98
|
+
const link = await deps.links.ofPersonShip(ship.fleetId, ship.shipId);
|
|
99
|
+
const shownIds = new Set();
|
|
100
|
+
let isAnyUnfinished = false;
|
|
101
|
+
if (link?.stoppedAt !== null) {
|
|
102
|
+
return ok({ shown: shownIds, isAnyUnfinished });
|
|
103
|
+
}
|
|
104
|
+
const unfinished = await deps.posts.unfinished(ship.fleetId, ship.shipId);
|
|
105
|
+
if (unfinished.length > 0) {
|
|
106
|
+
// A post not yet in Slack needs its delivery, handed already: read with the held ones again.
|
|
107
|
+
const held = await deps.door.pushReceive(crewToken, { max: unfinished.length + fresh.length });
|
|
108
|
+
if (!held.isOk) {
|
|
109
|
+
return held;
|
|
110
|
+
}
|
|
111
|
+
for (const post of unfinished) {
|
|
112
|
+
const { deliveryId } = post;
|
|
113
|
+
if (deliveryId !== null) {
|
|
114
|
+
const finished = await finish({ crewToken, post: { ...post, deliveryId }, delivery: held.value.find((each) => each.deliveryId === deliveryId) });
|
|
115
|
+
isAnyUnfinished ||= finished === 'unacknowledged' || finished === 'waiting';
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
for (const delivery of fresh) {
|
|
120
|
+
const where = await whereOf(link, delivery);
|
|
121
|
+
if (where === undefined) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const shown = slackPostOf(delivery, { overviewUrl: deps.overviewUrlOf(ship.fleetId), isHeadedBySender: where.app.shipId === null });
|
|
125
|
+
const post = {
|
|
126
|
+
fleetId: ship.fleetId,
|
|
127
|
+
personShipId: ship.shipId,
|
|
128
|
+
messageId: delivery.messageId,
|
|
129
|
+
deliveryId: delivery.deliveryId,
|
|
130
|
+
senderShipId: delivery.senderShipId,
|
|
131
|
+
appId: where.app.appId,
|
|
132
|
+
channel: where.channel,
|
|
133
|
+
ts: null,
|
|
134
|
+
threadTs: where.threadTs,
|
|
135
|
+
isLinkOnly: shown.kind === 'link',
|
|
136
|
+
ackedAt: null,
|
|
137
|
+
};
|
|
138
|
+
// Kept before it is handed: a gateway that stops in between finishes it at the next wake.
|
|
139
|
+
await deps.posts.save(post);
|
|
140
|
+
const handed = await deps.door.handed(crewToken, { deliveryId: delivery.deliveryId, handOverNumber: FIRST_HAND_OVER, channel: 'slack' });
|
|
141
|
+
if (!handed.isOk || handed.value !== 'handed') {
|
|
142
|
+
await deps.posts.remove(ship.fleetId, post);
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const finished = await finish({ crewToken, post: { ...post, deliveryId: delivery.deliveryId }, delivery });
|
|
146
|
+
if (finished === 'shown' || finished === 'unacknowledged') {
|
|
147
|
+
shownIds.add(delivery.deliveryId);
|
|
148
|
+
}
|
|
149
|
+
isAnyUnfinished ||= finished === 'unacknowledged';
|
|
150
|
+
}
|
|
151
|
+
return ok({ shown: shownIds, isAnyUnfinished });
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=show-in-slack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show-in-slack.js","sourceRoot":"","sources":["../../../src/core/slack/show-in-slack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { FleetId, ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
/**
|
|
3
|
+
* A Slack app the gateway made from a manifest in a fleet's workspace, kept
|
|
4
|
+
* with what Slack gave for it: its client credentials and signing secret
|
|
5
|
+
* when made, its bot token once installed. The gateway's own bot is the
|
|
6
|
+
* fleet's first (B5).
|
|
7
|
+
*/
|
|
8
|
+
export interface SlackApp {
|
|
9
|
+
readonly fleetId: FleetId;
|
|
10
|
+
readonly appId: string;
|
|
11
|
+
/** The ship the app is the bot of; null for the gateway's own bot. */
|
|
12
|
+
readonly shipId: ShipId | null;
|
|
13
|
+
readonly clientId: string;
|
|
14
|
+
readonly clientSecret: string;
|
|
15
|
+
readonly signingSecret: string;
|
|
16
|
+
/** Slack's install screen for the app. */
|
|
17
|
+
readonly installUrl: string;
|
|
18
|
+
/** The bot's name in Slack, as the gateway last made or renamed it: the ship's name then, or the fleet's for its own bot. */
|
|
19
|
+
readonly name: string;
|
|
20
|
+
readonly madeAt: Date;
|
|
21
|
+
/** When someone last opened Slack's install screen for it from the gateway, while no install came back. */
|
|
22
|
+
readonly installStartedAt: Date | null;
|
|
23
|
+
readonly bot: {
|
|
24
|
+
readonly token: string;
|
|
25
|
+
readonly userId: string;
|
|
26
|
+
} | null;
|
|
27
|
+
/** When Slack said the app was uninstalled or its tokens revoked (app_uninstalled, tokens_revoked). */
|
|
28
|
+
readonly removedInSlackAt: Date | null;
|
|
29
|
+
}
|
|
30
|
+
/** A bot's state on the Slack page (gateway scopes 9.2). */
|
|
31
|
+
export type BotState = 'made' | 'waitingForInstall' | 'inSlack' | 'removedInSlack';
|
|
32
|
+
export declare function botStateOf(app: SlackApp): BotState;
|
|
33
|
+
/** What the gateway asks Slack to make: the app's name and description, its bot's scopes, the user scopes Sign in with Slack asks, where Slack sends an install or a sign-in back, the events it sends the gateway and where, and where a press of a button goes. */
|
|
34
|
+
export interface SlackAppDescription {
|
|
35
|
+
readonly name: string;
|
|
36
|
+
readonly description: string;
|
|
37
|
+
readonly botScopes: readonly string[];
|
|
38
|
+
readonly userScopes: readonly string[];
|
|
39
|
+
/** Where Slack sends an install back first, then any other address Slack may send the person back to. */
|
|
40
|
+
readonly redirectUrls: readonly string[];
|
|
41
|
+
readonly events: {
|
|
42
|
+
readonly url: string;
|
|
43
|
+
readonly botEvents: readonly string[];
|
|
44
|
+
};
|
|
45
|
+
readonly actionsUrl: string;
|
|
46
|
+
}
|
|
47
|
+
/** The gateway's addresses Slack calls: where an install comes back, where events and presses of buttons go, and where Sign in with Slack comes back to link. */
|
|
48
|
+
export interface SlackAddresses {
|
|
49
|
+
readonly installRedirectUrl: string;
|
|
50
|
+
readonly eventsUrl: string;
|
|
51
|
+
readonly actionsUrl: string;
|
|
52
|
+
readonly linkRedirectUrl: string;
|
|
53
|
+
}
|
|
54
|
+
/** Sign in with Slack's user scopes (OpenID Connect): who signed in, in which workspace, and their name. */
|
|
55
|
+
export declare const SIGN_IN_SCOPES: string[];
|
|
56
|
+
/** Slack's longest app name. */
|
|
57
|
+
export declare const APP_NAME_MAX_LENGTH = 35;
|
|
58
|
+
/** Slack's longest app description. */
|
|
59
|
+
export declare const APP_DESCRIPTION_MAX_LENGTH = 140;
|
|
60
|
+
/**
|
|
61
|
+
* The gateway's own bot (B5), named after the fleet: it shows a person what
|
|
62
|
+
* waits for their person ship, in a direct message, where they answer in
|
|
63
|
+
* its thread or by a button (9.5). A person links their Slack account
|
|
64
|
+
* through its Sign in with Slack (gateway scopes 9.3).
|
|
65
|
+
*/
|
|
66
|
+
export declare function gatewayBotDescription(fleetName: string, addresses: SlackAddresses): SlackAppDescription;
|
|
67
|
+
/**
|
|
68
|
+
* A ship's own bot (gateway scopes 9.2): the ship's name, its statement's
|
|
69
|
+
* summary as the description (0047), a direct messages tab, the events of a
|
|
70
|
+
* direct message and a mention, and the bot scopes to read them, post and
|
|
71
|
+
* react. Slack sends its uninstall and revoked tokens too, and a press of a
|
|
72
|
+
* button under a question it posted (9.5).
|
|
73
|
+
*/
|
|
74
|
+
export declare function shipBotDescription(ship: {
|
|
75
|
+
name: string;
|
|
76
|
+
summary: string | null;
|
|
77
|
+
}, addresses: SlackAddresses): SlackAppDescription;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export function botStateOf(app) {
|
|
2
|
+
if (app.removedInSlackAt !== null) {
|
|
3
|
+
return 'removedInSlack';
|
|
4
|
+
}
|
|
5
|
+
if (app.bot !== null) {
|
|
6
|
+
return 'inSlack';
|
|
7
|
+
}
|
|
8
|
+
return app.installStartedAt === null ? 'made' : 'waitingForInstall';
|
|
9
|
+
}
|
|
10
|
+
/** The events every bot sends the gateway: its uninstall and revoked tokens (gateway scopes 9.2). */
|
|
11
|
+
const REMOVAL_EVENTS = ['app_uninstalled', 'tokens_revoked'];
|
|
12
|
+
/** Sign in with Slack's user scopes (OpenID Connect): who signed in, in which workspace, and their name. */
|
|
13
|
+
export const SIGN_IN_SCOPES = ['openid', 'profile'];
|
|
14
|
+
/** Slack's longest app name. */
|
|
15
|
+
export const APP_NAME_MAX_LENGTH = 35;
|
|
16
|
+
/** Slack's longest app description. */
|
|
17
|
+
export const APP_DESCRIPTION_MAX_LENGTH = 140;
|
|
18
|
+
/**
|
|
19
|
+
* The gateway's own bot (B5), named after the fleet: it shows a person what
|
|
20
|
+
* waits for their person ship, in a direct message, where they answer in
|
|
21
|
+
* its thread or by a button (9.5). A person links their Slack account
|
|
22
|
+
* through its Sign in with Slack (gateway scopes 9.3).
|
|
23
|
+
*/
|
|
24
|
+
export function gatewayBotDescription(fleetName, addresses) {
|
|
25
|
+
return {
|
|
26
|
+
name: fleetName.slice(0, APP_NAME_MAX_LENGTH),
|
|
27
|
+
description: `What waits for you in the ${fleetName} fleet of Aeolus`.slice(0, APP_DESCRIPTION_MAX_LENGTH),
|
|
28
|
+
botScopes: ['chat:write', 'im:history', 'im:write'],
|
|
29
|
+
userScopes: SIGN_IN_SCOPES,
|
|
30
|
+
redirectUrls: [addresses.installRedirectUrl, addresses.linkRedirectUrl],
|
|
31
|
+
events: { url: addresses.eventsUrl, botEvents: ['message.im', ...REMOVAL_EVENTS] },
|
|
32
|
+
actionsUrl: addresses.actionsUrl,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A ship's own bot (gateway scopes 9.2): the ship's name, its statement's
|
|
37
|
+
* summary as the description (0047), a direct messages tab, the events of a
|
|
38
|
+
* direct message and a mention, and the bot scopes to read them, post and
|
|
39
|
+
* react. Slack sends its uninstall and revoked tokens too, and a press of a
|
|
40
|
+
* button under a question it posted (9.5).
|
|
41
|
+
*/
|
|
42
|
+
export function shipBotDescription(ship, addresses) {
|
|
43
|
+
return {
|
|
44
|
+
name: ship.name.slice(0, APP_NAME_MAX_LENGTH),
|
|
45
|
+
description: (ship.summary ?? `The ${ship.name} ship of Aeolus`).slice(0, APP_DESCRIPTION_MAX_LENGTH),
|
|
46
|
+
botScopes: ['chat:write', 'im:history', 'app_mentions:read', 'reactions:write'],
|
|
47
|
+
userScopes: [],
|
|
48
|
+
redirectUrls: [addresses.installRedirectUrl],
|
|
49
|
+
events: { url: addresses.eventsUrl, botEvents: ['message.im', 'app_mention', ...REMOVAL_EVENTS] },
|
|
50
|
+
actionsUrl: addresses.actionsUrl,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=slack-app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-app.js","sourceRoot":"","sources":["../../../src/core/slack/slack-app.ts"],"names":[],"mappings":"AA+BA,MAAM,UAAU,UAAU,CAAC,GAAa;IACtC,IAAI,GAAG,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;QAClC,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC;AACtE,CAAC;AAsBD,qGAAqG;AACrG,MAAM,cAAc,GAAG,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;AAE7D,4GAA4G;AAC5G,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAEpD,gCAAgC;AAChC,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAEtC,uCAAuC;AACvC,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAE9C;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAiB,EAAE,SAAyB;IAChF,OAAO;QACL,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC;QAC7C,WAAW,EAAE,6BAA6B,SAAS,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,0BAA0B,CAAC;QAC1G,SAAS,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC;QACnD,UAAU,EAAE,cAAc;QAC1B,YAAY,EAAE,CAAC,SAAS,CAAC,kBAAkB,EAAE,SAAS,CAAC,eAAe,CAAC;QACvE,MAAM,EAAE,EAAE,GAAG,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,YAAY,EAAE,GAAG,cAAc,CAAC,EAAE;QAClF,UAAU,EAAE,SAAS,CAAC,UAAU;KACjC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAA8C,EAAE,SAAyB;IAC1G,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC;QAC7C,WAAW,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,IAAI,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,0BAA0B,CAAC;QACrG,SAAS,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,CAAC;QAC/E,UAAU,EAAE,EAAE;QACd,YAAY,EAAE,CAAC,SAAS,CAAC,kBAAkB,CAAC;QAC5C,MAAM,EAAE,EAAE,GAAG,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,GAAG,cAAc,CAAC,EAAE;QACjG,UAAU,EAAE,SAAS,CAAC,UAAU;KACjC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An event Slack sends for one of the gateway's apps, as its door reads it:
|
|
3
|
+
* the event's type and the fields the gateway acts on, null where Slack
|
|
4
|
+
* sent none.
|
|
5
|
+
*/
|
|
6
|
+
export interface SlackEventFields {
|
|
7
|
+
/** Slack's id of the event, the same on each of its retries. */
|
|
8
|
+
readonly eventId: string;
|
|
9
|
+
readonly type: string;
|
|
10
|
+
/** The workspace the event is in. */
|
|
11
|
+
readonly teamId: string;
|
|
12
|
+
readonly userId: string | null;
|
|
13
|
+
readonly channel: string | null;
|
|
14
|
+
/** im for a direct message with the bot. */
|
|
15
|
+
readonly channelType: string | null;
|
|
16
|
+
/** Set on an edit, a deletion, a join and the like; file_share on a new message with files. */
|
|
17
|
+
readonly subtype: string | null;
|
|
18
|
+
/** Set on a bot's own message. */
|
|
19
|
+
readonly botId: string | null;
|
|
20
|
+
/** The message's text in Slack's markup. */
|
|
21
|
+
readonly text: string;
|
|
22
|
+
/** The message's own timestamp, its id in the conversation. */
|
|
23
|
+
readonly ts: string | null;
|
|
24
|
+
/** The thread's first message, when the message is in a thread. */
|
|
25
|
+
readonly threadTs: string | null;
|
|
26
|
+
/** The files shared with it, each by its name and its link in Slack. */
|
|
27
|
+
readonly files: readonly SlackFile[];
|
|
28
|
+
}
|
|
29
|
+
export interface SlackFile {
|
|
30
|
+
readonly name: string;
|
|
31
|
+
readonly permalink: string;
|
|
32
|
+
}
|
|
33
|
+
/** A person's new message to a bot: who wrote it, in which workspace, where, and what. */
|
|
34
|
+
export interface PersonMessage {
|
|
35
|
+
readonly eventId: string;
|
|
36
|
+
readonly teamId: string;
|
|
37
|
+
readonly userId: string;
|
|
38
|
+
readonly channel: string;
|
|
39
|
+
readonly ts: string;
|
|
40
|
+
readonly threadTs: string | null;
|
|
41
|
+
readonly text: string;
|
|
42
|
+
readonly files: readonly SlackFile[];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* The person's new message an event carries (gateway scopes 9.4 step 2): a
|
|
46
|
+
* direct message to the bot, or a mention of it in a channel. A bot's
|
|
47
|
+
* message (L21), an edit, a deletion or a join is none.
|
|
48
|
+
*/
|
|
49
|
+
export declare function personMessageOf(event: SlackEventFields): PersonMessage | undefined;
|
|
50
|
+
/** Whether the event says the app is no longer in Slack (gateway scopes 9.2). */
|
|
51
|
+
export declare function isRemovedEvent(event: SlackEventFields): boolean;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** The subtype of a new message with files; any other subtype is no new message. */
|
|
2
|
+
const FILE_SHARE = 'file_share';
|
|
3
|
+
/**
|
|
4
|
+
* The person's new message an event carries (gateway scopes 9.4 step 2): a
|
|
5
|
+
* direct message to the bot, or a mention of it in a channel. A bot's
|
|
6
|
+
* message (L21), an edit, a deletion or a join is none.
|
|
7
|
+
*/
|
|
8
|
+
export function personMessageOf(event) {
|
|
9
|
+
const { eventId, type, teamId, userId, channel, channelType, subtype, botId, text, ts, threadTs, files } = event;
|
|
10
|
+
const isNew = (subtype === null || subtype === FILE_SHARE) && botId === null;
|
|
11
|
+
const isToBot = type === 'app_mention' || (type === 'message' && channelType === 'im');
|
|
12
|
+
return isNew && isToBot && userId !== null && channel !== null && ts !== null ? { eventId, teamId, userId, channel, ts, threadTs, text, files } : undefined;
|
|
13
|
+
}
|
|
14
|
+
/** Whether the event says the app is no longer in Slack (gateway scopes 9.2). */
|
|
15
|
+
export function isRemovedEvent(event) {
|
|
16
|
+
return event.type === 'app_uninstalled' || event.type === 'tokens_revoked';
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=slack-event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-event.js","sourceRoot":"","sources":["../../../src/core/slack/slack-event.ts"],"names":[],"mappings":"AA8CA,oFAAoF;AACpF,MAAM,UAAU,GAAG,YAAY,CAAC;AAEhC;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,KAAuB;IACrD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IACjH,MAAM,KAAK,GAAG,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,UAAU,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC;IAC7E,MAAM,OAAO,GAAG,IAAI,KAAK,aAAa,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,WAAW,KAAK,IAAI,CAAC,CAAC;IACvF,OAAO,KAAK,IAAI,OAAO,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9J,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,cAAc,CAAC,KAAuB;IACpD,OAAO,KAAK,CAAC,IAAI,KAAK,iBAAiB,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC;AAC7E,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { FleetId, ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
/**
|
|
3
|
+
* A person's Slack account linked to their account in a fleet (gateway
|
|
4
|
+
* scopes 9.3), kept by the fleet, the Slack workspace and user, and the
|
|
5
|
+
* person ship their messages are: one Slack user to one account per fleet,
|
|
6
|
+
* one Slack user per account. A disabled account's link stops (0055).
|
|
7
|
+
*/
|
|
8
|
+
export interface SlackLink {
|
|
9
|
+
readonly fleetId: FleetId;
|
|
10
|
+
readonly teamId: string;
|
|
11
|
+
readonly slackUserId: string;
|
|
12
|
+
/** The person's name in Slack as Sign in with Slack gave it. */
|
|
13
|
+
readonly slackName: string;
|
|
14
|
+
readonly accountId: string;
|
|
15
|
+
readonly personShipId: ShipId;
|
|
16
|
+
readonly linkedAt: Date;
|
|
17
|
+
readonly stoppedAt: Date | null;
|
|
18
|
+
/** Show everything that waits in Slack (B5): messages from ships that are not bots too, off until turned on (W8). */
|
|
19
|
+
readonly isShowingAll: boolean;
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-link.js","sourceRoot":"","sources":["../../../src/core/slack/slack-link.ts"],"names":[],"mappings":""}
|