@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.
Files changed (536) hide show
  1. package/README.md +22 -3
  2. package/dist/adapters/crypto/slack-install-seals.d.ts +3 -0
  3. package/dist/adapters/crypto/slack-install-seals.js +15 -0
  4. package/dist/adapters/crypto/slack-install-seals.js.map +1 -0
  5. package/dist/adapters/crypto/slack-link-seals.d.ts +3 -0
  6. package/dist/adapters/crypto/slack-link-seals.js +15 -0
  7. package/dist/adapters/crypto/slack-link-seals.js.map +1 -0
  8. package/dist/adapters/crypto/slack-signatures.d.ts +3 -0
  9. package/dist/adapters/crypto/slack-signatures.js +14 -0
  10. package/dist/adapters/crypto/slack-signatures.js.map +1 -0
  11. package/dist/adapters/fleet/slack-ships.d.ts +15 -0
  12. package/dist/adapters/fleet/slack-ships.js +32 -0
  13. package/dist/adapters/fleet/slack-ships.js.map +1 -0
  14. package/dist/adapters/http/mcp-endpoint.js +1 -1
  15. package/dist/adapters/http/mcp-endpoint.js.map +1 -1
  16. package/dist/adapters/http/oauth-routes.d.ts +4 -1
  17. package/dist/adapters/http/oauth-routes.js +21 -9
  18. package/dist/adapters/http/oauth-routes.js.map +1 -1
  19. package/dist/adapters/http/openai-apps-challenge.d.ts +10 -0
  20. package/dist/adapters/http/openai-apps-challenge.js +9 -0
  21. package/dist/adapters/http/openai-apps-challenge.js.map +1 -0
  22. package/dist/adapters/http/person-tools.d.ts +24 -1
  23. package/dist/adapters/http/person-tools.js +43 -11
  24. package/dist/adapters/http/person-tools.js.map +1 -1
  25. package/dist/adapters/http/slack-routes.d.ts +28 -0
  26. package/dist/adapters/http/slack-routes.js +173 -0
  27. package/dist/adapters/http/slack-routes.js.map +1 -0
  28. package/dist/adapters/prisma/fleet-forgetter.d.ts +1 -1
  29. package/dist/adapters/prisma/fleet-forgetter.js +2 -2
  30. package/dist/adapters/prisma/fleet-forgetter.js.map +1 -1
  31. package/dist/adapters/prisma/generated/browser.d.ts +25 -0
  32. package/dist/adapters/prisma/generated/client.d.ts +25 -0
  33. package/dist/adapters/prisma/generated/internal/class.d.ts +55 -0
  34. package/dist/adapters/prisma/generated/internal/class.js +4 -4
  35. package/dist/adapters/prisma/generated/internal/class.js.map +1 -1
  36. package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +452 -1
  37. package/dist/adapters/prisma/generated/internal/prismaNamespace.js +72 -1
  38. package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
  39. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +76 -0
  40. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +72 -1
  41. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  42. package/dist/adapters/prisma/generated/models/SlackApp.d.ts +1229 -0
  43. package/dist/adapters/prisma/generated/models/SlackApp.js +2 -0
  44. package/dist/adapters/prisma/generated/models/SlackApp.js.map +1 -0
  45. package/dist/adapters/prisma/generated/models/SlackEvent.d.ts +1229 -0
  46. package/dist/adapters/prisma/generated/models/SlackEvent.js +2 -0
  47. package/dist/adapters/prisma/generated/models/SlackEvent.js.map +1 -0
  48. package/dist/adapters/prisma/generated/models/SlackLink.d.ts +1126 -0
  49. package/dist/adapters/prisma/generated/models/SlackLink.js +2 -0
  50. package/dist/adapters/prisma/generated/models/SlackLink.js.map +1 -0
  51. package/dist/adapters/prisma/generated/models/SlackPost.d.ts +1174 -0
  52. package/dist/adapters/prisma/generated/models/SlackPost.js +2 -0
  53. package/dist/adapters/prisma/generated/models/SlackPost.js.map +1 -0
  54. package/dist/adapters/prisma/generated/models/SlackWorkspace.d.ts +1143 -0
  55. package/dist/adapters/prisma/generated/models/SlackWorkspace.js +2 -0
  56. package/dist/adapters/prisma/generated/models/SlackWorkspace.js.map +1 -0
  57. package/dist/adapters/prisma/generated/models.d.ts +5 -0
  58. package/dist/adapters/prisma/slack-events.d.ts +8 -0
  59. package/dist/adapters/prisma/slack-events.js +55 -0
  60. package/dist/adapters/prisma/slack-events.js.map +1 -0
  61. package/dist/adapters/prisma/slack-links.d.ts +8 -0
  62. package/dist/adapters/prisma/slack-links.js +49 -0
  63. package/dist/adapters/prisma/slack-links.js.map +1 -0
  64. package/dist/adapters/prisma/slack-posts.d.ts +4 -0
  65. package/dist/adapters/prisma/slack-posts.js +42 -0
  66. package/dist/adapters/prisma/slack-posts.js.map +1 -0
  67. package/dist/adapters/prisma/slack-stores.d.ts +6 -0
  68. package/dist/adapters/prisma/slack-stores.js +115 -0
  69. package/dist/adapters/prisma/slack-stores.js.map +1 -0
  70. package/dist/adapters/slack/slack-call.d.ts +15 -0
  71. package/dist/adapters/slack/slack-call.js +41 -0
  72. package/dist/adapters/slack/slack-call.js.map +1 -0
  73. package/dist/adapters/slack/slack-messages.d.ts +4 -0
  74. package/dist/adapters/slack/slack-messages.js +53 -0
  75. package/dist/adapters/slack/slack-messages.js.map +1 -0
  76. package/dist/adapters/slack/slack-sign-in.d.ts +4 -0
  77. package/dist/adapters/slack/slack-sign-in.js +33 -0
  78. package/dist/adapters/slack/slack-sign-in.js.map +1 -0
  79. package/dist/adapters/slack/slack-tooling.d.ts +6 -0
  80. package/dist/adapters/slack/slack-tooling.js +68 -0
  81. package/dist/adapters/slack/slack-tooling.js.map +1 -0
  82. package/dist/adapters/trpc/router.d.ts +149 -1
  83. package/dist/adapters/trpc/router.js +117 -6
  84. package/dist/adapters/trpc/router.js.map +1 -1
  85. package/dist/app.d.ts +4 -0
  86. package/dist/app.js +143 -15
  87. package/dist/app.js.map +1 -1
  88. package/dist/bin/aeolus-gateway.js +2 -0
  89. package/dist/bin/aeolus-gateway.js.map +1 -1
  90. package/dist/config.d.ts +8 -0
  91. package/dist/config.js +4 -0
  92. package/dist/config.js.map +1 -1
  93. package/dist/core/connection/connect.d.ts +12 -0
  94. package/dist/core/connection/connect.js +11 -4
  95. package/dist/core/connection/connect.js.map +1 -1
  96. package/dist/core/connection/declare-gateway-scopes.d.ts +15 -0
  97. package/dist/core/connection/declare-gateway-scopes.js +23 -0
  98. package/dist/core/connection/declare-gateway-scopes.js.map +1 -0
  99. package/dist/core/oauth/exchange-token.d.ts +1 -0
  100. package/dist/core/oauth/exchange-token.js +4 -3
  101. package/dist/core/oauth/exchange-token.js.map +1 -1
  102. package/dist/core/oauth/read-authorization.d.ts +3 -3
  103. package/dist/core/oauth/read-authorization.js +6 -5
  104. package/dist/core/oauth/read-authorization.js.map +1 -1
  105. package/dist/core/people/ports.d.ts +23 -2
  106. package/dist/core/people/wake-person.d.ts +9 -2
  107. package/dist/core/people/wake-person.js +33 -9
  108. package/dist/core/people/wake-person.js.map +1 -1
  109. package/dist/core/shared/errors.d.ts +1 -1
  110. package/dist/core/shared/errors.js.map +1 -1
  111. package/dist/core/sign-in/start-sign-in.d.ts +4 -1
  112. package/dist/core/sign-in/start-sign-in.js +8 -2
  113. package/dist/core/sign-in/start-sign-in.js.map +1 -1
  114. package/dist/core/slack/answer-in-slack.d.ts +36 -0
  115. package/dist/core/slack/answer-in-slack.js +51 -0
  116. package/dist/core/slack/answer-in-slack.js.map +1 -0
  117. package/dist/core/slack/complete-install.d.ts +27 -0
  118. package/dist/core/slack/complete-install.js +36 -0
  119. package/dist/core/slack/complete-install.js.map +1 -0
  120. package/dist/core/slack/complete-link.d.ts +41 -0
  121. package/dist/core/slack/complete-link.js +64 -0
  122. package/dist/core/slack/complete-link.js.map +1 -0
  123. package/dist/core/slack/connect-slack.d.ts +34 -0
  124. package/dist/core/slack/connect-slack.js +54 -0
  125. package/dist/core/slack/connect-slack.js.map +1 -0
  126. package/dist/core/slack/disconnect-slack.d.ts +21 -0
  127. package/dist/core/slack/disconnect-slack.js +31 -0
  128. package/dist/core/slack/disconnect-slack.js.map +1 -0
  129. package/dist/core/slack/expose-ship.d.ts +35 -0
  130. package/dist/core/slack/expose-ship.js +59 -0
  131. package/dist/core/slack/expose-ship.js.map +1 -0
  132. package/dist/core/slack/follow-exposed-ships.d.ts +20 -0
  133. package/dist/core/slack/follow-exposed-ships.js +43 -0
  134. package/dist/core/slack/follow-exposed-ships.js.map +1 -0
  135. package/dist/core/slack/gateway-bot.d.ts +20 -0
  136. package/dist/core/slack/gateway-bot.js +22 -0
  137. package/dist/core/slack/gateway-bot.js.map +1 -0
  138. package/dist/core/slack/kept-slack-event.d.ts +30 -0
  139. package/dist/core/slack/kept-slack-event.js +5 -0
  140. package/dist/core/slack/kept-slack-event.js.map +1 -0
  141. package/dist/core/slack/list-exposable.d.ts +25 -0
  142. package/dist/core/slack/list-exposable.js +32 -0
  143. package/dist/core/slack/list-exposable.js.map +1 -0
  144. package/dist/core/slack/ports.d.ts +288 -0
  145. package/dist/core/slack/ports.js +2 -0
  146. package/dist/core/slack/ports.js.map +1 -0
  147. package/dist/core/slack/read-slack-link.d.ts +23 -0
  148. package/dist/core/slack/read-slack-link.js +20 -0
  149. package/dist/core/slack/read-slack-link.js.map +1 -0
  150. package/dist/core/slack/read-slack.d.ts +42 -0
  151. package/dist/core/slack/read-slack.js +35 -0
  152. package/dist/core/slack/read-slack.js.map +1 -0
  153. package/dist/core/slack/remove-bot.d.ts +24 -0
  154. package/dist/core/slack/remove-bot.js +33 -0
  155. package/dist/core/slack/remove-bot.js.map +1 -0
  156. package/dist/core/slack/rotate-configuration-tokens.d.ts +13 -0
  157. package/dist/core/slack/rotate-configuration-tokens.js +14 -0
  158. package/dist/core/slack/rotate-configuration-tokens.js.map +1 -0
  159. package/dist/core/slack/send-slack-events.d.ts +29 -0
  160. package/dist/core/slack/send-slack-events.js +78 -0
  161. package/dist/core/slack/send-slack-events.js.map +1 -0
  162. package/dist/core/slack/ship-bot.d.ts +23 -0
  163. package/dist/core/slack/ship-bot.js +25 -0
  164. package/dist/core/slack/ship-bot.js.map +1 -0
  165. package/dist/core/slack/show-all-in-slack.d.ts +16 -0
  166. package/dist/core/slack/show-all-in-slack.js +18 -0
  167. package/dist/core/slack/show-all-in-slack.js.map +1 -0
  168. package/dist/core/slack/show-in-slack.d.ts +38 -0
  169. package/dist/core/slack/show-in-slack.js +154 -0
  170. package/dist/core/slack/show-in-slack.js.map +1 -0
  171. package/dist/core/slack/slack-app.d.ts +77 -0
  172. package/dist/core/slack/slack-app.js +53 -0
  173. package/dist/core/slack/slack-app.js.map +1 -0
  174. package/dist/core/slack/slack-event.d.ts +51 -0
  175. package/dist/core/slack/slack-event.js +18 -0
  176. package/dist/core/slack/slack-event.js.map +1 -0
  177. package/dist/core/slack/slack-link.d.ts +20 -0
  178. package/dist/core/slack/slack-link.js +2 -0
  179. package/dist/core/slack/slack-link.js.map +1 -0
  180. package/dist/core/slack/slack-markdown.d.ts +13 -0
  181. package/dist/core/slack/slack-markdown.js +27 -0
  182. package/dist/core/slack/slack-markdown.js.map +1 -0
  183. package/dist/core/slack/slack-post-of.d.ts +27 -0
  184. package/dist/core/slack/slack-post-of.js +71 -0
  185. package/dist/core/slack/slack-post-of.js.map +1 -0
  186. package/dist/core/slack/slack-post.d.ts +31 -0
  187. package/dist/core/slack/slack-post.js +5 -0
  188. package/dist/core/slack/slack-post.js.map +1 -0
  189. package/dist/core/slack/slack-request.d.ts +17 -0
  190. package/dist/core/slack/slack-request.js +10 -0
  191. package/dist/core/slack/slack-request.js.map +1 -0
  192. package/dist/core/slack/slack-workspace.d.ts +36 -0
  193. package/dist/core/slack/slack-workspace.js +7 -0
  194. package/dist/core/slack/slack-workspace.js.map +1 -0
  195. package/dist/core/slack/start-install.d.ts +43 -0
  196. package/dist/core/slack/start-install.js +57 -0
  197. package/dist/core/slack/start-install.js.map +1 -0
  198. package/dist/core/slack/start-link.d.ts +32 -0
  199. package/dist/core/slack/start-link.js +46 -0
  200. package/dist/core/slack/start-link.js.map +1 -0
  201. package/dist/core/slack/stop-slack-link.d.ts +16 -0
  202. package/dist/core/slack/stop-slack-link.js +9 -0
  203. package/dist/core/slack/stop-slack-link.js.map +1 -0
  204. package/dist/core/slack/take-access-token.d.ts +25 -0
  205. package/dist/core/slack/take-access-token.js +45 -0
  206. package/dist/core/slack/take-access-token.js.map +1 -0
  207. package/dist/core/slack/take-slack-event.d.ts +47 -0
  208. package/dist/core/slack/take-slack-event.js +75 -0
  209. package/dist/core/slack/take-slack-event.js.map +1 -0
  210. package/dist/core/slack/unlink-slack.d.ts +9 -0
  211. package/dist/core/slack/unlink-slack.js +9 -0
  212. package/dist/core/slack/unlink-slack.js.map +1 -0
  213. package/dist/slack-event-worker.d.ts +21 -0
  214. package/dist/slack-event-worker.js +38 -0
  215. package/dist/slack-event-worker.js.map +1 -0
  216. package/dist/slack-token-worker.d.ts +19 -0
  217. package/dist/slack-token-worker.js +24 -0
  218. package/dist/slack-token-worker.js.map +1 -0
  219. package/package.json +3 -2
  220. package/src/adapters/prisma/migrations/20261027090000_slack_workspaces/migration.sql +30 -0
  221. package/src/adapters/prisma/migrations/20261027150000_slack_bots/migration.sql +6 -0
  222. package/src/adapters/prisma/migrations/20261027200000_slack_links/migration.sql +15 -0
  223. package/src/adapters/prisma/migrations/20261028090000_slack_events/migration.sql +18 -0
  224. package/src/adapters/prisma/migrations/20261028150000_slack_posts/migration.sql +25 -0
  225. package/src/adapters/prisma/schema.prisma +103 -0
  226. package/web/.next/BUILD_ID +1 -1
  227. package/web/.next/app-path-routes-manifest.json +5 -0
  228. package/web/.next/build-manifest.json +51 -3
  229. package/web/.next/diagnostics/route-bundle-stats.json +143 -70
  230. package/web/.next/fallback-build-manifest.json +3 -3
  231. package/web/.next/prerender-manifest.json +3 -3
  232. package/web/.next/routes-manifest.json +30 -0
  233. package/web/.next/server/app/(console)/gateway-off/page/server-reference-manifest.json +1 -1
  234. package/web/.next/server/app/(console)/gateway-off/page.js.nft.json +1 -1
  235. package/web/.next/server/app/(console)/gateway-off/page_client-reference-manifest.js +1 -1
  236. package/web/.next/server/app/(console)/meetings/[meetingId]/page/server-reference-manifest.json +3 -3
  237. package/web/.next/server/app/(console)/meetings/[meetingId]/page.js.nft.json +1 -1
  238. package/web/.next/server/app/(console)/meetings/[meetingId]/page_client-reference-manifest.js +1 -1
  239. package/web/.next/server/app/(console)/outside-parties/[name]/change/page/server-reference-manifest.json +11 -11
  240. package/web/.next/server/app/(console)/outside-parties/[name]/change/page.js +2 -2
  241. package/web/.next/server/app/(console)/outside-parties/[name]/change/page.js.nft.json +1 -1
  242. package/web/.next/server/app/(console)/outside-parties/[name]/change/page_client-reference-manifest.js +1 -1
  243. package/web/.next/server/app/(console)/outside-parties/[name]/page/server-reference-manifest.json +4 -4
  244. package/web/.next/server/app/(console)/outside-parties/[name]/page.js +2 -2
  245. package/web/.next/server/app/(console)/outside-parties/[name]/page.js.nft.json +1 -1
  246. package/web/.next/server/app/(console)/outside-parties/[name]/page_client-reference-manifest.js +1 -1
  247. package/web/.next/server/app/(console)/outside-parties/[name]/retire/page/server-reference-manifest.json +11 -11
  248. package/web/.next/server/app/(console)/outside-parties/[name]/retire/page.js +3 -3
  249. package/web/.next/server/app/(console)/outside-parties/[name]/retire/page.js.nft.json +1 -1
  250. package/web/.next/server/app/(console)/outside-parties/[name]/retire/page_client-reference-manifest.js +1 -1
  251. package/web/.next/server/app/(console)/outside-parties/add/page/server-reference-manifest.json +6 -6
  252. package/web/.next/server/app/(console)/outside-parties/add/page.js +2 -2
  253. package/web/.next/server/app/(console)/outside-parties/add/page.js.nft.json +1 -1
  254. package/web/.next/server/app/(console)/outside-parties/add/page_client-reference-manifest.js +1 -1
  255. package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page/server-reference-manifest.json +2 -2
  256. package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page.js +1 -1
  257. package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page.js.nft.json +1 -1
  258. package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page_client-reference-manifest.js +1 -1
  259. package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page/server-reference-manifest.json +2 -2
  260. package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page.js +1 -1
  261. package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page.js.nft.json +1 -1
  262. package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page_client-reference-manifest.js +1 -1
  263. package/web/.next/server/app/(console)/outside-parties/page/server-reference-manifest.json +2 -2
  264. package/web/.next/server/app/(console)/outside-parties/page.js +3 -3
  265. package/web/.next/server/app/(console)/outside-parties/page.js.nft.json +1 -1
  266. package/web/.next/server/app/(console)/outside-parties/page_client-reference-manifest.js +1 -1
  267. package/web/.next/server/app/(console)/overview/changes/route.js +2 -2
  268. package/web/.next/server/app/(console)/overview/changes/route.js.nft.json +1 -1
  269. package/web/.next/server/app/(console)/overview/focus/route.js +2 -2
  270. package/web/.next/server/app/(console)/overview/focus/route.js.nft.json +1 -1
  271. package/web/.next/server/app/(console)/overview/page/server-reference-manifest.json +27 -7
  272. package/web/.next/server/app/(console)/overview/page.js +2 -2
  273. package/web/.next/server/app/(console)/overview/page.js.nft.json +1 -1
  274. package/web/.next/server/app/(console)/overview/page_client-reference-manifest.js +1 -1
  275. package/web/.next/server/app/(console)/overview/requests/[requestId]/page/server-reference-manifest.json +2 -2
  276. package/web/.next/server/app/(console)/overview/requests/[requestId]/page.js +1 -1
  277. package/web/.next/server/app/(console)/overview/requests/[requestId]/page.js.nft.json +1 -1
  278. package/web/.next/server/app/(console)/overview/requests/[requestId]/page_client-reference-manifest.js +1 -1
  279. package/web/.next/server/app/(console)/parties/page/server-reference-manifest.json +8 -8
  280. package/web/.next/server/app/(console)/parties/page.js +3 -3
  281. package/web/.next/server/app/(console)/parties/page.js.nft.json +1 -1
  282. package/web/.next/server/app/(console)/parties/page_client-reference-manifest.js +1 -1
  283. package/web/.next/server/app/(console)/sign-in/failed/page/server-reference-manifest.json +1 -1
  284. package/web/.next/server/app/(console)/sign-in/failed/page.js.nft.json +1 -1
  285. package/web/.next/server/app/(console)/sign-in/failed/page_client-reference-manifest.js +1 -1
  286. package/web/.next/server/app/(console)/slack/disconnect/page/app-paths-manifest.json +3 -0
  287. package/web/.next/server/app/(console)/slack/disconnect/page/build-manifest.json +23 -0
  288. package/web/.next/server/app/(console)/slack/disconnect/page/next-font-manifest.json +11 -0
  289. package/web/.next/server/app/(console)/slack/disconnect/page/react-loadable-manifest.json +1 -0
  290. package/web/.next/server/app/(console)/slack/disconnect/page/server-reference-manifest.json +65 -0
  291. package/web/.next/server/app/(console)/slack/disconnect/page.js +22 -0
  292. package/web/.next/server/app/(console)/slack/disconnect/page.js.map +5 -0
  293. package/web/.next/server/app/(console)/slack/disconnect/page.js.nft.json +1 -0
  294. package/web/.next/server/app/(console)/slack/disconnect/page_client-reference-manifest.js +3 -0
  295. package/web/.next/server/app/(console)/slack/expose/page/app-paths-manifest.json +3 -0
  296. package/web/.next/server/app/(console)/slack/expose/page/build-manifest.json +23 -0
  297. package/web/.next/server/app/(console)/slack/expose/page/next-font-manifest.json +11 -0
  298. package/web/.next/server/app/(console)/slack/expose/page/react-loadable-manifest.json +1 -0
  299. package/web/.next/server/app/(console)/slack/expose/page/server-reference-manifest.json +65 -0
  300. package/web/.next/server/app/(console)/slack/expose/page.js +22 -0
  301. package/web/.next/server/app/(console)/slack/expose/page.js.map +5 -0
  302. package/web/.next/server/app/(console)/slack/expose/page.js.nft.json +1 -0
  303. package/web/.next/server/app/(console)/slack/expose/page_client-reference-manifest.js +3 -0
  304. package/web/.next/server/app/(console)/slack/link/route/app-paths-manifest.json +3 -0
  305. package/web/.next/server/app/(console)/slack/link/route/build-manifest.json +12 -0
  306. package/web/.next/server/app/(console)/slack/link/route/server-reference-manifest.json +4 -0
  307. package/web/.next/server/app/(console)/slack/link/route.js +7 -0
  308. package/web/.next/server/app/(console)/slack/link/route.js.map +5 -0
  309. package/web/.next/server/app/(console)/slack/link/route.js.nft.json +1 -0
  310. package/web/.next/server/app/(console)/slack/link/route_client-reference-manifest.js +3 -0
  311. package/web/.next/server/app/(console)/slack/page/app-paths-manifest.json +3 -0
  312. package/web/.next/server/app/(console)/slack/page/build-manifest.json +23 -0
  313. package/web/.next/server/app/(console)/slack/page/next-font-manifest.json +11 -0
  314. package/web/.next/server/app/(console)/slack/page/react-loadable-manifest.json +1 -0
  315. package/web/.next/server/app/(console)/slack/page/server-reference-manifest.json +65 -0
  316. package/web/.next/server/app/(console)/slack/page.js +22 -0
  317. package/web/.next/server/app/(console)/slack/page.js.map +5 -0
  318. package/web/.next/server/app/(console)/slack/page.js.nft.json +1 -0
  319. package/web/.next/server/app/(console)/slack/page_client-reference-manifest.js +3 -0
  320. package/web/.next/server/app/(console)/slack/remove/page/app-paths-manifest.json +3 -0
  321. package/web/.next/server/app/(console)/slack/remove/page/build-manifest.json +23 -0
  322. package/web/.next/server/app/(console)/slack/remove/page/next-font-manifest.json +11 -0
  323. package/web/.next/server/app/(console)/slack/remove/page/react-loadable-manifest.json +1 -0
  324. package/web/.next/server/app/(console)/slack/remove/page/server-reference-manifest.json +65 -0
  325. package/web/.next/server/app/(console)/slack/remove/page.js +22 -0
  326. package/web/.next/server/app/(console)/slack/remove/page.js.map +5 -0
  327. package/web/.next/server/app/(console)/slack/remove/page.js.nft.json +1 -0
  328. package/web/.next/server/app/(console)/slack/remove/page_client-reference-manifest.js +3 -0
  329. package/web/.next/server/app/_global-error/page.js +1 -1
  330. package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  331. package/web/.next/server/app/_global-error.html +1 -1
  332. package/web/.next/server/app/_global-error.rsc +1 -1
  333. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  334. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  335. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  336. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  337. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  338. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  339. package/web/.next/server/app/authorize/failed/page/server-reference-manifest.json +1 -1
  340. package/web/.next/server/app/authorize/failed/page.js.nft.json +1 -1
  341. package/web/.next/server/app/authorize/failed/page_client-reference-manifest.js +1 -1
  342. package/web/.next/server/app/authorize/pick/page/server-reference-manifest.json +1 -1
  343. package/web/.next/server/app/authorize/pick/page.js.nft.json +1 -1
  344. package/web/.next/server/app/authorize/pick/page_client-reference-manifest.js +1 -1
  345. package/web/.next/server/app/authorize/waiting/approval/page/server-reference-manifest.json +1 -1
  346. package/web/.next/server/app/authorize/waiting/approval/page.js.nft.json +1 -1
  347. package/web/.next/server/app/authorize/waiting/approval/page_client-reference-manifest.js +1 -1
  348. package/web/.next/server/app-paths-manifest.json +5 -0
  349. package/web/.next/server/chunks/[root-of-the-server]__01ghdzznyfucm._.js +369 -0
  350. package/web/.next/server/chunks/[root-of-the-server]__01ghdzznyfucm._.js.map +1 -0
  351. package/web/.next/server/chunks/[root-of-the-server]__0mbwomk4pjrl7._.js +369 -0
  352. package/web/.next/server/chunks/[root-of-the-server]__0mbwomk4pjrl7._.js.map +1 -0
  353. package/web/.next/server/chunks/[root-of-the-server]__1tfyrijwfgqlk._.js +3 -0
  354. package/web/.next/server/chunks/[root-of-the-server]__1tfyrijwfgqlk._.js.map +1 -0
  355. package/web/.next/server/chunks/_20ne4s-e_jzxp._.js +3 -0
  356. package/web/.next/server/chunks/_20ne4s-e_jzxp._.js.map +1 -0
  357. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_change_page_actions_04td11fxohsfm.js +1 -1
  358. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_change_page_actions_04td11fxohsfm.js.map +1 -1
  359. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_page_actions_0u-45itza1ls7.js +1 -1
  360. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_page_actions_0u-45itza1ls7.js.map +1 -1
  361. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_retire_page_actions_0s7ps6i0ts7v5.js +1 -1
  362. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_retire_page_actions_0s7ps6i0ts7v5.js.map +1 -1
  363. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_add-a2a-client_page_actions_0d_wgiu94c32e.js +1 -1
  364. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_add-a2a-client_page_actions_0d_wgiu94c32e.js.map +1 -1
  365. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_add_page_actions_0yfz_dfn-8uo7.js +1 -1
  366. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_add_page_actions_0yfz_dfn-8uo7.js.map +1 -1
  367. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_overview_requests_[requestId]_page_actions_0uki9j3mtuz9e.js +1 -1
  368. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_overview_requests_[requestId]_page_actions_0uki9j3mtuz9e.js.map +1 -1
  369. package/web/.next/server/chunks/ssr/[root-of-the-server]__001xx3sm5ur-e._.js +4 -0
  370. package/web/.next/server/chunks/ssr/[root-of-the-server]__001xx3sm5ur-e._.js.map +1 -0
  371. package/web/.next/server/chunks/ssr/[root-of-the-server]__04e53giy2-2tm._.js +3 -0
  372. package/web/.next/server/chunks/ssr/[root-of-the-server]__04e53giy2-2tm._.js.map +1 -0
  373. package/web/.next/server/chunks/ssr/{[root-of-the-server]__0-og0bl8lr2xq._.js → [root-of-the-server]__0a8db18tyk__5._.js} +2 -2
  374. package/web/.next/server/chunks/ssr/{[root-of-the-server]__0-og0bl8lr2xq._.js.map → [root-of-the-server]__0a8db18tyk__5._.js.map} +1 -1
  375. package/web/.next/server/chunks/ssr/[root-of-the-server]__0e59elwbtqr-6._.js +3 -0
  376. package/web/.next/server/chunks/ssr/{[root-of-the-server]__10y66e1xx8xiq._.js.map → [root-of-the-server]__0e59elwbtqr-6._.js.map} +1 -1
  377. package/web/.next/server/chunks/ssr/[root-of-the-server]__0icm7kndx480o._.js +4 -0
  378. package/web/.next/server/chunks/ssr/[root-of-the-server]__0icm7kndx480o._.js.map +1 -0
  379. package/web/.next/server/chunks/ssr/[root-of-the-server]__0k3g0p3t9t0c-._.js +1 -1
  380. package/web/.next/server/chunks/ssr/[root-of-the-server]__0k3g0p3t9t0c-._.js.map +1 -1
  381. package/web/.next/server/chunks/ssr/{[root-of-the-server]__1-c9wugbbwsp3._.js → [root-of-the-server]__0kb1gl5t8kz4l._.js} +2 -2
  382. package/web/.next/server/chunks/ssr/[root-of-the-server]__0n2us07jk-78w._.js +1 -1
  383. package/web/.next/server/chunks/ssr/{[root-of-the-server]__1gb-3dttuacyz._.js → [root-of-the-server]__0y0jwufd7xjsv._.js} +1 -1
  384. package/web/.next/server/chunks/ssr/[root-of-the-server]__10s9e8g5x-ws8._.js +4 -0
  385. package/web/.next/server/chunks/ssr/[root-of-the-server]__10s9e8g5x-ws8._.js.map +1 -0
  386. package/web/.next/server/chunks/ssr/[root-of-the-server]__13yoncr_nx3jc._.js +4 -0
  387. package/web/.next/server/chunks/ssr/[root-of-the-server]__13yoncr_nx3jc._.js.map +1 -0
  388. package/web/.next/server/chunks/ssr/[root-of-the-server]__18-8taiduk1jn._.js +1 -1
  389. package/web/.next/server/chunks/ssr/[root-of-the-server]__18-8taiduk1jn._.js.map +1 -1
  390. package/web/.next/server/chunks/ssr/{[root-of-the-server]__1m9atpy0vkbmj._.js → [root-of-the-server]__19ecatcacd6t9._.js} +1 -1
  391. package/web/.next/server/chunks/ssr/[root-of-the-server]__1hfashtn1ee82._.js +3 -0
  392. package/web/.next/server/chunks/ssr/[root-of-the-server]__1hfashtn1ee82._.js.map +1 -0
  393. package/web/.next/server/chunks/ssr/[root-of-the-server]__1qpow96uit9t8._.js +4 -0
  394. package/web/.next/server/chunks/ssr/[root-of-the-server]__1qpow96uit9t8._.js.map +1 -0
  395. package/web/.next/server/chunks/ssr/_00hfzlqn1og18._.js +1 -1
  396. package/web/.next/server/chunks/ssr/_00hfzlqn1og18._.js.map +1 -1
  397. package/web/.next/server/chunks/ssr/_0_kakdt7lb6z-._.js +1 -1
  398. package/web/.next/server/chunks/ssr/_0_kakdt7lb6z-._.js.map +1 -1
  399. package/web/.next/server/chunks/ssr/_0ka_9elusb800._.js +1 -1
  400. package/web/.next/server/chunks/ssr/_0ka_9elusb800._.js.map +1 -1
  401. package/web/.next/server/chunks/ssr/_0pyd1_y7w8ngp._.js +1 -1
  402. package/web/.next/server/chunks/ssr/_0pyd1_y7w8ngp._.js.map +1 -1
  403. package/web/.next/server/chunks/ssr/{_0w2ptjht34s6t._.js → _0wukvn3-ht3ps._.js} +1 -1
  404. package/web/.next/server/chunks/ssr/_0xickgbbju_9-._.js +1 -1
  405. package/web/.next/server/chunks/ssr/_0xickgbbju_9-._.js.map +1 -1
  406. package/web/.next/server/chunks/ssr/_1_wav28san6dm._.js +1 -1
  407. package/web/.next/server/chunks/ssr/{_0bhvvyz0q_0ja._.js → _1e2o809f0ekry._.js} +2 -2
  408. package/web/.next/server/chunks/ssr/_1pjtire7rqla0._.js +1 -1
  409. package/web/.next/server/chunks/ssr/_1pjtire7rqla0._.js.map +1 -1
  410. package/web/.next/server/chunks/ssr/_1qbsmlji34yph._.js +1 -1
  411. package/web/.next/server/chunks/ssr/_1qbsmlji34yph._.js.map +1 -1
  412. package/web/.next/server/chunks/ssr/_1y1ovmdhl9_ml._.js +1 -1
  413. package/web/.next/server/chunks/ssr/_1y1ovmdhl9_ml._.js.map +1 -1
  414. package/web/.next/server/chunks/ssr/node_modules_0ettht2so2tkh._.js +3 -0
  415. package/web/.next/server/chunks/ssr/node_modules_0ettht2so2tkh._.js.map +1 -0
  416. package/web/.next/server/chunks/ssr/node_modules_0keape0zsobyj._.js +3 -0
  417. package/web/.next/server/chunks/ssr/node_modules_0keape0zsobyj._.js.map +1 -0
  418. package/web/.next/server/chunks/ssr/node_modules_@base-ui_0jlwmxa9rk8p_._.js +3 -0
  419. package/web/.next/server/chunks/ssr/node_modules_@base-ui_0jlwmxa9rk8p_._.js.map +1 -0
  420. package/web/.next/server/chunks/ssr/node_modules_@base-ui_19e_nxxf4a88q._.js +3 -0
  421. package/web/.next/server/chunks/ssr/node_modules_@base-ui_19e_nxxf4a88q._.js.map +1 -0
  422. package/web/.next/server/chunks/ssr/node_modules_@base-ui_react_1lbvjrzg8s2ox._.js +3 -0
  423. package/web/.next/server/chunks/ssr/node_modules_@base-ui_react_1lbvjrzg8s2ox._.js.map +1 -0
  424. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0t6vd5zwkqjs1.js +3 -0
  425. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0t6vd5zwkqjs1.js.map +1 -0
  426. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1cwvrsosahx6q.js +3 -0
  427. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1cwvrsosahx6q.js.map +1 -0
  428. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1jbr52uzx5cc7.js +3 -0
  429. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1jbr52uzx5cc7.js.map +1 -0
  430. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1xhjyaxgorqkx.js +3 -0
  431. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1xhjyaxgorqkx.js.map +1 -0
  432. package/web/.next/server/chunks/ssr/web_00e7-_y92losl._.js +3 -0
  433. package/web/.next/server/chunks/ssr/web_00e7-_y92losl._.js.map +1 -0
  434. package/web/.next/server/chunks/ssr/web_09rcfto3dw4wd._.js +3 -0
  435. package/web/.next/server/chunks/ssr/web_09rcfto3dw4wd._.js.map +1 -0
  436. package/web/.next/server/chunks/ssr/web_0plvx3c_1cozb._.js +3 -0
  437. package/web/.next/server/chunks/ssr/web_0plvx3c_1cozb._.js.map +1 -0
  438. package/web/.next/server/chunks/ssr/web_0qgev3ti257yj._.js +3 -0
  439. package/web/.next/server/chunks/ssr/{web_0_jk9eione6lx._.js.map → web_0qgev3ti257yj._.js.map} +1 -1
  440. package/web/.next/server/chunks/ssr/web_0wys4l6za8umr._.js +1 -1
  441. package/web/.next/server/chunks/ssr/web_0wys4l6za8umr._.js.map +1 -1
  442. package/web/.next/server/chunks/ssr/web_15vnjj3s0z3fa._.js +3 -0
  443. package/web/.next/server/chunks/ssr/{web_1wcpaty_bz55q._.js.map → web_15vnjj3s0z3fa._.js.map} +1 -1
  444. package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_overview_page_actions_18on1ziyg1nzy.js +1 -1
  445. package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_overview_page_actions_18on1ziyg1nzy.js.map +1 -1
  446. package/web/.next/server/chunks/ssr/web_app_(console)_slack_page_tsx_0ts7fo7pqicq6._.js +3 -0
  447. package/web/.next/server/chunks/ssr/web_app_(console)_slack_page_tsx_0ts7fo7pqicq6._.js.map +1 -0
  448. package/web/.next/server/chunks/ssr/web_app_(console)_slack_remove_page_tsx_15q4ril_on0ed._.js +3 -0
  449. package/web/.next/server/chunks/ssr/web_app_(console)_slack_remove_page_tsx_15q4ril_on0ed._.js.map +1 -0
  450. package/web/.next/server/chunks/ssr/web_features_0rd6357w-eo50._.js +3 -0
  451. package/web/.next/server/chunks/ssr/{web_features_10xz3ojtvfi7h._.js.map → web_features_0rd6357w-eo50._.js.map} +1 -1
  452. package/web/.next/server/chunks/ssr/web_features_1m5g9a6mwrsd-._.js +3 -0
  453. package/web/.next/server/chunks/ssr/{web_features_085cv0gogrxxf._.js.map → web_features_1m5g9a6mwrsd-._.js.map} +1 -1
  454. package/web/.next/server/chunks/ssr/web_features_1rwkgka1xffb1._.js +3 -0
  455. package/web/.next/server/chunks/ssr/web_features_1rwkgka1xffb1._.js.map +1 -0
  456. package/web/.next/server/chunks/ssr/web_features_add-a2a-agent_ui_a2a-agent-form_tsx_0z8t1aalwzyl7._.js +1 -1
  457. package/web/.next/server/chunks/ssr/web_features_add-a2a-agent_ui_a2a-agent-form_tsx_0z8t1aalwzyl7._.js.map +1 -1
  458. package/web/.next/server/chunks/ssr/web_features_add-a2a-client_ui_a2a-client-form_tsx_1anv88g385nwe._.js +1 -1
  459. package/web/.next/server/chunks/ssr/web_features_add-a2a-client_ui_a2a-client-form_tsx_1anv88g385nwe._.js.map +1 -1
  460. package/web/.next/server/chunks/ssr/web_features_add-server_ui_add-server_tsx_1jnmar5xju49k._.js +1 -1
  461. package/web/.next/server/chunks/ssr/web_features_add-server_ui_add-server_tsx_1jnmar5xju49k._.js.map +1 -1
  462. package/web/.next/server/chunks/ssr/web_features_frame_ui_gateway-header_tsx_0e9tekx4jf7ng._.js +1 -1
  463. package/web/.next/server/chunks/ssr/web_features_frame_ui_gateway-header_tsx_0e9tekx4jf7ng._.js.map +1 -1
  464. package/web/.next/server/chunks/ssr/web_features_meeting_state_meeting-controls_tsx_12g4kzk2mbvvz._.js +1 -1
  465. package/web/.next/server/chunks/ssr/web_features_meeting_state_meeting-controls_tsx_12g4kzk2mbvvz._.js.map +1 -1
  466. package/web/.next/server/chunks/ssr/web_features_outside-parties_ui_switch-card_tsx_1_xnu9bm4tc-_._.js +1 -1
  467. package/web/.next/server/chunks/ssr/web_features_outside-parties_ui_switch-card_tsx_1_xnu9bm4tc-_._.js.map +1 -1
  468. package/web/.next/server/chunks/ssr/web_features_outside-party_actions_ts_102ar5pdowf8s._.js +1 -1
  469. package/web/.next/server/chunks/ssr/web_features_overview_hooks_overview-actions_ts_0-wrat07d1y5g._.js +1 -1
  470. package/web/.next/server/chunks/ssr/web_features_overview_hooks_overview-actions_ts_0-wrat07d1y5g._.js.map +1 -1
  471. package/web/.next/server/chunks/ssr/web_features_overview_state_00l0wkgvv9y6j._.js +3 -0
  472. package/web/.next/server/chunks/ssr/web_features_overview_state_00l0wkgvv9y6j._.js.map +1 -0
  473. package/web/.next/server/chunks/ssr/web_features_overview_state_decision-panel_tsx_0kpd26ggtr6h_._.js +1 -1
  474. package/web/.next/server/chunks/ssr/web_features_overview_state_decision-panel_tsx_0kpd26ggtr6h_._.js.map +1 -1
  475. package/web/.next/server/chunks/ssr/web_features_parties_actions_ts_0r-tbfsig2ty-._.js +1 -1
  476. package/web/.next/server/chunks/ssr/web_features_slack_actions_ts_1l3yg9vl20_vu._.js +3 -0
  477. package/web/.next/server/chunks/ssr/web_features_slack_actions_ts_1l3yg9vl20_vu._.js.map +1 -0
  478. package/web/.next/server/chunks/web__next-internal_server_app_(console)_slack_link_route_actions_16zgisics858w.js +3 -0
  479. package/web/.next/server/chunks/web__next-internal_server_app_(console)_slack_link_route_actions_16zgisics858w.js.map +1 -0
  480. package/web/.next/server/middleware-build-manifest.js +51 -3
  481. package/web/.next/server/next-font-manifest.js +1 -1
  482. package/web/.next/server/next-font-manifest.json +16 -0
  483. package/web/.next/server/pages/500.html +1 -1
  484. package/web/.next/server/preview-props.json +3 -3
  485. package/web/.next/server/server-reference-manifest.js +1 -1
  486. package/web/.next/server/server-reference-manifest.json +174 -28
  487. package/web/.next/static/chunks/0nhopjmnw_dqt.js +1 -0
  488. package/web/.next/static/chunks/0zbcy0_3jemrv.js +1 -0
  489. package/web/.next/static/chunks/{0ke_2_la1glwa.js → 1-suv9wttlxqo.js} +1 -1
  490. package/web/.next/static/chunks/19kfx4qlur25a.js +1 -0
  491. package/web/.next/static/chunks/1a2-hkn-7471k.js +1 -0
  492. package/web/.next/static/chunks/{1tgs1j0j-1qlh.js → 1msggkwsn7vyq.js} +1 -1
  493. package/web/.next/static/chunks/{2hj3-kl1ggnu_.js → 2-kh9nbonee6w.js} +1 -1
  494. package/web/.next/static/chunks/2l92bozm8dcmo.js +1 -0
  495. package/web/.next/static/chunks/{2d283cu3en9cy.js → 310mio1zd_mw7.js} +1 -1
  496. package/web/.next/static/chunks/{07j7jnfe13wx6.js → 3d_sjtxh_vkr6.js} +1 -1
  497. package/web/.next/static/chunks/{0p_kl57bddsiy.js → 3dhy3jady0w6a.js} +1 -1
  498. package/web/.next/static/chunks/3efghx8whwnok.js +1 -0
  499. package/web/.next/static/chunks/3hvo3apdq-ckk.js +1 -0
  500. package/web/.next/static/chunks/3rbzp0tdc1te-.js +1 -0
  501. package/web/.next/static/chunks/{2n4bf_2r9lysd.js → 455eobei0t6t9.js} +1 -1
  502. package/web/.next/trace +1 -1
  503. package/web/.next/trace-build +1 -1
  504. package/web/.next/types/routes.d.ts +7 -2
  505. package/web/.next/types/validator.ts +78 -0
  506. package/web/.next/server/chunks/[root-of-the-server]__0ykc8bq_c06a1._.js +0 -369
  507. package/web/.next/server/chunks/[root-of-the-server]__0ykc8bq_c06a1._.js.map +0 -1
  508. package/web/.next/server/chunks/ssr/[root-of-the-server]__10y66e1xx8xiq._.js +0 -3
  509. package/web/.next/server/chunks/ssr/[root-of-the-server]__1dtyycvqa6uht._.js +0 -4
  510. package/web/.next/server/chunks/ssr/[root-of-the-server]__1dtyycvqa6uht._.js.map +0 -1
  511. package/web/.next/server/chunks/ssr/node_modules_07sxnbglqc5q9._.js +0 -3
  512. package/web/.next/server/chunks/ssr/node_modules_07sxnbglqc5q9._.js.map +0 -1
  513. package/web/.next/server/chunks/ssr/node_modules_0qlo87g8tugr4._.js +0 -3
  514. package/web/.next/server/chunks/ssr/node_modules_0qlo87g8tugr4._.js.map +0 -1
  515. package/web/.next/server/chunks/ssr/web_0-ufi2al5ubig._.js +0 -3
  516. package/web/.next/server/chunks/ssr/web_0-ufi2al5ubig._.js.map +0 -1
  517. package/web/.next/server/chunks/ssr/web_0_jk9eione6lx._.js +0 -3
  518. package/web/.next/server/chunks/ssr/web_1wcpaty_bz55q._.js +0 -3
  519. package/web/.next/server/chunks/ssr/web_features_085cv0gogrxxf._.js +0 -3
  520. package/web/.next/server/chunks/ssr/web_features_10xz3ojtvfi7h._.js +0 -3
  521. package/web/.next/server/chunks/ssr/web_features_overview_state_1wuk95dw2_whp._.js +0 -3
  522. package/web/.next/server/chunks/ssr/web_features_overview_state_1wuk95dw2_whp._.js.map +0 -1
  523. package/web/.next/static/chunks/0ul9rtulfiph6.js +0 -1
  524. package/web/.next/static/chunks/19wvmglfgof0u.js +0 -1
  525. package/web/.next/static/chunks/2i3ydqqupow_x.js +0 -1
  526. package/web/.next/static/chunks/2ngyis59r3qta.js +0 -1
  527. package/web/.next/static/chunks/3bl-e3zhidrrz.js +0 -1
  528. package/web/.next/static/chunks/3x_8doukmdfpu.js +0 -1
  529. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__1-c9wugbbwsp3._.js.map → [root-of-the-server]__0kb1gl5t8kz4l._.js.map} +0 -0
  530. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__1gb-3dttuacyz._.js.map → [root-of-the-server]__0y0jwufd7xjsv._.js.map} +0 -0
  531. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__1m9atpy0vkbmj._.js.map → [root-of-the-server]__19ecatcacd6t9._.js.map} +0 -0
  532. /package/web/.next/server/chunks/ssr/{_0w2ptjht34s6t._.js.map → _0wukvn3-ht3ps._.js.map} +0 -0
  533. /package/web/.next/server/chunks/ssr/{_0bhvvyz0q_0ja._.js.map → _1e2o809f0ekry._.js.map} +0 -0
  534. /package/web/.next/static/{tQFXrUWi6vEZq4Cp-U5tk → 87vMFs_KGRcFD40WWRkFR}/_buildManifest.js +0 -0
  535. /package/web/.next/static/{tQFXrUWi6vEZq4Cp-U5tk → 87vMFs_KGRcFD40WWRkFR}/_clientMiddlewareManifest.js +0 -0
  536. /package/web/.next/static/{tQFXrUWi6vEZq4Cp-U5tk → 87vMFs_KGRcFD40WWRkFR}/_ssgManifest.js +0 -0
@@ -0,0 +1,36 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ import { ok } from '../shared/result.js';
3
+ import { slackUnavailableMessage } from './take-access-token.js';
4
+ /**
5
+ * Use case: Slack's install screen sends the person back with a code and
6
+ * the state the gateway sealed (gateway scopes 9.1). Within its ten minutes,
7
+ * the code is turned into the app's bot token, kept in the vault, and the
8
+ * workspace's name kept as Slack says it. An install into another workspace
9
+ * than the fleet's keeps nothing.
10
+ */
11
+ export function createCompleteInstall(deps) {
12
+ return async ({ code, state }) => {
13
+ const opened = deps.states.open(state);
14
+ const app = opened !== undefined && opened.expiresAt > deps.clock.now() ? await deps.apps.find(opened.fleetId, opened.appId) : undefined;
15
+ if (opened === undefined || app === undefined) {
16
+ return refuse('INSTALL_REFUSED', 'This install did not start at the gateway, or took longer than ten minutes: press Install again');
17
+ }
18
+ const workspace = await deps.workspaces.find(opened.fleetId);
19
+ if (workspace === undefined) {
20
+ return refuse('SLACK_NOT_CONNECTED', 'The fleet is connected to no Slack workspace');
21
+ }
22
+ const installed = await deps.slack.completeInstall({ clientId: app.clientId, clientSecret: app.clientSecret, code, redirectUrl: deps.installRedirectUrl });
23
+ if (!installed.isOk) {
24
+ return installed.error.kind === 'refused' ? refuse('INSTALL_REFUSED', `Slack refused the install (${installed.error.error}): press Install again`) : refuse('SLACK_UNAVAILABLE', slackUnavailableMessage(installed.error));
25
+ }
26
+ const { teamId, teamName, botToken, botUserId } = installed.value;
27
+ if (teamId !== workspace.teamId) {
28
+ return refuse('OTHER_WORKSPACE', `The fleet is connected to ${workspace.teamName ?? workspace.teamId}: install into that workspace`);
29
+ }
30
+ await deps.apps.save({ ...app, bot: { token: botToken, userId: botUserId }, installStartedAt: null, removedInSlackAt: null });
31
+ // Held, so a configuration token rotated meanwhile is kept.
32
+ await deps.workspaces.change(opened.fleetId, (current) => Promise.resolve({ ...current, teamName }));
33
+ return ok({ fleetId: opened.fleetId });
34
+ };
35
+ }
36
+ //# sourceMappingURL=complete-install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complete-install.js","sourceRoot":"","sources":["../../../src/core/slack/complete-install.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAMjE;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAOrC;IACC,OAAO,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACzI,IAAI,MAAM,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC9C,OAAO,MAAM,CAAC,iBAAiB,EAAE,iGAAiG,CAAC,CAAC;QACtI,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,MAAM,CAAC,qBAAqB,EAAE,8CAA8C,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAC3J,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,EAAE,8BAA8B,SAAS,CAAC,KAAK,CAAC,KAAK,wBAAwB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,EAAE,uBAAuB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7N,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC;QAClE,IAAI,MAAM,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;YAChC,OAAO,MAAM,CAAC,iBAAiB,EAAE,6BAA6B,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,MAAM,+BAA+B,CAAC,CAAC;QACvI,CAAC;QACD,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9H,4DAA4D;QAC5D,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QACrG,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { FleetId } from '@aeolus-fleet/common';
2
+ import type { AccountOfSignIn } from '../account-sign-in/account-of-sign-in.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, ShipNames, SlackApps, SlackLinks, SlackSignIn, SlackWorkspaces } from './ports.js';
7
+ /** Why no link was kept; a link refused for one kept already names the fleet, and the first link's account or Slack name. */
8
+ export type CompleteLinkRefusal = DomainError<'LINK_REFUSED' | 'SLACK_NOT_CONNECTED' | 'NO_SUCH_BOT' | 'OTHER_WORKSPACE' | 'SLACK_UNAVAILABLE'> | (DomainError<'SLACK_USER_LINKED' | 'ACCOUNT_LINKED'> & {
9
+ readonly fleetId: FleetId;
10
+ readonly name: string;
11
+ });
12
+ export type CompleteLink = (input: {
13
+ code: string;
14
+ state: string;
15
+ signIn: string | undefined;
16
+ }) => Promise<Result<{
17
+ fleetId: FleetId;
18
+ }, CompleteLinkRefusal>>;
19
+ /**
20
+ * Use case: Sign in with Slack sends the person back with a code and the
21
+ * link's state the gateway sealed (gateway scopes 9.3). Within its ten
22
+ * minutes, the code names the Slack workspace and user, and the link is kept
23
+ * by fleet, workspace and user, and person ship. One Slack user links to one
24
+ * account per fleet: a second link is refused, naming the first. An account
25
+ * keeps one link, so linking another Slack user waits until it is unlinked.
26
+ * The same user linking the same account again links it anew, as after a
27
+ * disabled account's link stopped. The link completes only in a browser
28
+ * whose shared sign-in names the account that started it, so a followed
29
+ * link never attaches the follower's Slack user to the starter's account.
30
+ */
31
+ export declare function createCompleteLink(deps: {
32
+ workspaces: Pick<SlackWorkspaces, 'find'>;
33
+ apps: Pick<SlackApps, 'gatewayBot'>;
34
+ links: SlackLinks;
35
+ signIn: Pick<SlackSignIn, 'complete'>;
36
+ states: LinkStates;
37
+ accountOf: (asked: Parameters<AccountOfSignIn>[0]) => ReturnType<AccountOfSignIn>;
38
+ shipNames: ShipNames;
39
+ clock: Clock;
40
+ linkRedirectUrl: string;
41
+ }): CompleteLink;
@@ -0,0 +1,64 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ import { err, ok } from '../shared/result.js';
3
+ import { slackUnavailableMessage } from './take-access-token.js';
4
+ /**
5
+ * Use case: Sign in with Slack sends the person back with a code and the
6
+ * link's state the gateway sealed (gateway scopes 9.3). Within its ten
7
+ * minutes, the code names the Slack workspace and user, and the link is kept
8
+ * by fleet, workspace and user, and person ship. One Slack user links to one
9
+ * account per fleet: a second link is refused, naming the first. An account
10
+ * keeps one link, so linking another Slack user waits until it is unlinked.
11
+ * The same user linking the same account again links it anew, as after a
12
+ * disabled account's link stopped. The link completes only in a browser
13
+ * whose shared sign-in names the account that started it, so a followed
14
+ * link never attaches the follower's Slack user to the starter's account.
15
+ */
16
+ export function createCompleteLink(deps) {
17
+ return async ({ code, state, signIn }) => {
18
+ const now = deps.clock.now();
19
+ const opened = deps.states.open(state);
20
+ if (opened === undefined || opened.expiresAt <= now) {
21
+ return refuse('LINK_REFUSED', 'This link did not start at the gateway, or took longer than ten minutes: press Link Slack again');
22
+ }
23
+ const { fleetId, accountId, personShipId } = opened;
24
+ const signedIn = signIn === undefined ? undefined : await deps.accountOf({ signIn, fleetId });
25
+ if (signedIn === undefined || !signedIn.isOk || signedIn.value.accountId !== accountId) {
26
+ return refuse('LINK_REFUSED', 'This link was started by another account or browser: sign in and press Link Slack again');
27
+ }
28
+ const workspace = await deps.workspaces.find(fleetId);
29
+ if (workspace === undefined) {
30
+ return refuse('SLACK_NOT_CONNECTED', 'The fleet is connected to no Slack workspace');
31
+ }
32
+ const bot = await deps.apps.gatewayBot(fleetId);
33
+ if (bot === undefined) {
34
+ return refuse('NO_SUCH_BOT', "The fleet's own Slack bot is not made");
35
+ }
36
+ const slackSignIn = await deps.signIn.complete({ clientId: bot.clientId, clientSecret: bot.clientSecret, code, redirectUrl: deps.linkRedirectUrl });
37
+ if (!slackSignIn.isOk) {
38
+ return slackSignIn.error.kind === 'refused' ? refuse('LINK_REFUSED', `Slack refused the sign-in (${slackSignIn.error.error}): press Link Slack again`) : refuse('SLACK_UNAVAILABLE', slackUnavailableMessage(slackSignIn.error));
39
+ }
40
+ const { teamId, userId, name } = slackSignIn.value;
41
+ if (teamId !== workspace.teamId) {
42
+ return refuse('OTHER_WORKSPACE', `The fleet is connected to ${workspace.teamName ?? workspace.teamId}: sign in with Slack there`);
43
+ }
44
+ const first = await deps.links.find(fleetId, { teamId, userId });
45
+ if (first !== undefined && first.accountId !== accountId) {
46
+ const firstName = (await deps.shipNames.nameOf(fleetId, first.personShipId)) ?? 'another account';
47
+ return err({ kind: 'SLACK_USER_LINKED', message: `This Slack account is linked to ${firstName} in this fleet already`, fleetId, name: firstName });
48
+ }
49
+ const own = await deps.links.ofAccount(fleetId, accountId);
50
+ if (own !== undefined && own.slackUserId !== userId) {
51
+ return err({ kind: 'ACCOUNT_LINKED', message: `Your account is linked to Slack as @${own.slackName} already: unlink it on the Overview first`, fleetId, name: own.slackName });
52
+ }
53
+ if (own !== undefined) {
54
+ await deps.links.remove(fleetId, accountId);
55
+ }
56
+ const added = await deps.links.add({ fleetId, teamId, slackUserId: userId, slackName: name, accountId, personShipId, linkedAt: now, stoppedAt: null, isShowingAll: false });
57
+ if (added === 'taken') {
58
+ // Another link of the Slack user or the account was kept meanwhile.
59
+ return refuse('LINK_REFUSED', 'This Slack account or your account was linked meanwhile: reload the Overview');
60
+ }
61
+ return ok({ fleetId });
62
+ };
63
+ }
64
+ //# sourceMappingURL=complete-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complete-link.js","sourceRoot":"","sources":["../../../src/core/slack/complete-link.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { Actor } from '../actors/authenticate-actor.js';
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 { ShipNames, SlackApps, SlackTooling, SlackWorkspaces } from './ports.js';
6
+ import type { SlackAddresses } from './slack-app.js';
7
+ /** The scope that connects Slack and exposes ships as bots (gateway scopes B6). */
8
+ export declare const SLACK_SCOPE = "gateway:slack";
9
+ export type ConnectSlackRefusal = DomainError<'SLACK_SCOPE_NOT_HELD' | 'NOT_AN_ACCOUNT' | 'ALREADY_CONNECTED' | 'SLACK_TOKEN_REFUSED' | 'SLACK_UNAVAILABLE' | 'OTHER_WORKSPACE'>;
10
+ export type ConnectSlack = (input: {
11
+ actor: Actor;
12
+ refreshToken: string;
13
+ fleetName: string;
14
+ }) => Promise<Result<{
15
+ isGatewayBotMade: boolean;
16
+ }, ConnectSlackRefusal>>;
17
+ /**
18
+ * Use case: an actor holding gateway:slack connects the fleet to one Slack
19
+ * workspace by pasting an app configuration refresh token (gateway scopes
20
+ * 9.1), signed in with their account: the token is a Slack user's own.
21
+ * The token is rotated at once, which proves it and names the workspace,
22
+ * and the new pair kept. Then the gateway makes its own bot (B5); when Slack
23
+ * does not make it now, the fleet stays connected and Install makes it.
24
+ * After Slack refused the kept token, a new token of the same workspace
25
+ * connects again, keeping every app made.
26
+ */
27
+ export declare function createConnectSlack(deps: {
28
+ slack: Pick<SlackTooling, 'rotateConfigurationToken' | 'makeApp'>;
29
+ workspaces: Pick<SlackWorkspaces, 'find' | 'save'>;
30
+ apps: Pick<SlackApps, 'gatewayBot' | 'save'>;
31
+ shipNames: ShipNames;
32
+ clock: Clock;
33
+ addresses: SlackAddresses;
34
+ }): ConnectSlack;
@@ -0,0 +1,54 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ import { ok } from '../shared/result.js';
3
+ import { gatewayBotOf } from './gateway-bot.js';
4
+ import { slackUnavailableMessage } from './take-access-token.js';
5
+ /** The scope that connects Slack and exposes ships as bots (gateway scopes B6). */
6
+ export const SLACK_SCOPE = 'gateway:slack';
7
+ /**
8
+ * Use case: an actor holding gateway:slack connects the fleet to one Slack
9
+ * workspace by pasting an app configuration refresh token (gateway scopes
10
+ * 9.1), signed in with their account: the token is a Slack user's own.
11
+ * The token is rotated at once, which proves it and names the workspace,
12
+ * and the new pair kept. Then the gateway makes its own bot (B5); when Slack
13
+ * does not make it now, the fleet stays connected and Install makes it.
14
+ * After Slack refused the kept token, a new token of the same workspace
15
+ * connects again, keeping every app made.
16
+ */
17
+ export function createConnectSlack(deps) {
18
+ return async ({ actor, refreshToken, fleetName }) => {
19
+ if (!actor.scopes.includes(SLACK_SCOPE)) {
20
+ return refuse('SLACK_SCOPE_NOT_HELD', `Connecting Slack needs ${SLACK_SCOPE}`);
21
+ }
22
+ if (actor.kind !== 'account' || actor.personShipId === null) {
23
+ return refuse('NOT_AN_ACCOUNT', "Connect Slack on the gateway's pages, signed in with your account: a configuration token is a Slack user's own");
24
+ }
25
+ const kept = await deps.workspaces.find(actor.fleetId);
26
+ if (kept !== undefined && !kept.isTokenRefused) {
27
+ return refuse('ALREADY_CONNECTED', 'The fleet is connected to a Slack workspace already');
28
+ }
29
+ const rotated = await deps.slack.rotateConfigurationToken(refreshToken);
30
+ if (!rotated.isOk) {
31
+ return rotated.error.kind === 'refused'
32
+ ? refuse('SLACK_TOKEN_REFUSED', `Slack refused the configuration token (${rotated.error.error}): copy a new one from your Slack app management page`)
33
+ : refuse('SLACK_UNAVAILABLE', slackUnavailableMessage(rotated.error));
34
+ }
35
+ const { token, teamId } = rotated.value;
36
+ if (kept !== undefined && kept.teamId !== teamId) {
37
+ return refuse('OTHER_WORKSPACE', `The fleet is connected to ${kept.teamName ?? kept.teamId}: connect with a configuration token of that workspace`);
38
+ }
39
+ const now = deps.clock.now();
40
+ const name = (await deps.shipNames.nameOf(actor.fleetId, actor.personShipId)) ?? actor.personShipId;
41
+ await deps.workspaces.save({
42
+ fleetId: actor.fleetId,
43
+ teamId,
44
+ teamName: kept?.teamName ?? null,
45
+ connectedBy: { shipId: actor.personShipId, name },
46
+ connectedAt: now,
47
+ token,
48
+ isTokenRefused: false,
49
+ });
50
+ const bot = await gatewayBotOf(deps, { fleetId: actor.fleetId, fleetName, accessToken: token.accessToken });
51
+ return ok({ isGatewayBotMade: bot.isOk });
52
+ };
53
+ }
54
+ //# sourceMappingURL=connect-slack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-slack.js","sourceRoot":"","sources":["../../../src/core/slack/connect-slack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
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 { SlackApps, SlackTooling, SlackWorkspaces } from './ports.js';
5
+ import { type TakeAccessToken } from './take-access-token.js';
6
+ export type DisconnectSlack = (input: {
7
+ actor: Actor;
8
+ }) => Promise<Result<undefined, DomainError<'SLACK_SCOPE_NOT_HELD' | 'SLACK_NOT_CONNECTED' | 'SLACK_TOKEN_REFUSED' | 'SLACK_UNAVAILABLE'>>>;
9
+ /**
10
+ * Use case: an actor holding gateway:slack disconnects the fleet's
11
+ * workspace (gateway scopes 9.1, after the page's confirm): every bot the
12
+ * gateway made is removed in Slack, then the workspace and its apps are
13
+ * forgotten. An app Slack refuses to remove is one it no longer knows. When
14
+ * Slack does not answer, everything is kept, to disconnect again.
15
+ */
16
+ export declare function createDisconnectSlack(deps: {
17
+ slack: Pick<SlackTooling, 'removeApp'>;
18
+ workspaces: Pick<SlackWorkspaces, 'remove'>;
19
+ apps: Pick<SlackApps, 'all'>;
20
+ takeAccessToken: TakeAccessToken;
21
+ }): DisconnectSlack;
@@ -0,0 +1,31 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ import { ok } from '../shared/result.js';
3
+ import { SLACK_SCOPE } from './connect-slack.js';
4
+ import { slackUnavailableMessage } from './take-access-token.js';
5
+ /**
6
+ * Use case: an actor holding gateway:slack disconnects the fleet's
7
+ * workspace (gateway scopes 9.1, after the page's confirm): every bot the
8
+ * gateway made is removed in Slack, then the workspace and its apps are
9
+ * forgotten. An app Slack refuses to remove is one it no longer knows. When
10
+ * Slack does not answer, everything is kept, to disconnect again.
11
+ */
12
+ export function createDisconnectSlack(deps) {
13
+ return async ({ actor }) => {
14
+ if (!actor.scopes.includes(SLACK_SCOPE)) {
15
+ return refuse('SLACK_SCOPE_NOT_HELD', `Disconnecting Slack needs ${SLACK_SCOPE}`);
16
+ }
17
+ const accessToken = await deps.takeAccessToken(actor.fleetId);
18
+ if (!accessToken.isOk) {
19
+ return accessToken;
20
+ }
21
+ for (const app of await deps.apps.all(actor.fleetId)) {
22
+ const removed = await deps.slack.removeApp(accessToken.value, app.appId);
23
+ if (!removed.isOk && removed.error.kind !== 'refused') {
24
+ return refuse('SLACK_UNAVAILABLE', slackUnavailableMessage(removed.error));
25
+ }
26
+ }
27
+ await deps.workspaces.remove(actor.fleetId);
28
+ return ok(undefined);
29
+ };
30
+ }
31
+ //# sourceMappingURL=disconnect-slack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disconnect-slack.js","sourceRoot":"","sources":["../../../src/core/slack/disconnect-slack.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,uBAAuB,EAAwB,MAAM,wBAAwB,CAAC;AAIvF;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAA6J;IACjM,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACxC,OAAO,MAAM,CAAC,sBAAsB,EAAE,6BAA6B,WAAW,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9D,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YACtB,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACrD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;YACzE,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACtD,OAAO,MAAM,CAAC,mBAAmB,EAAE,uBAAuB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QACD,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { ShipId } from '@aeolus-fleet/common';
2
+ import type { Actor } from '../actors/authenticate-actor.js';
3
+ import type { ActorCredential, CredentialOf } from '../actors/credential-of.js';
4
+ import type { Clock } from '../shared/clock.js';
5
+ import { type DomainError } from '../shared/errors.js';
6
+ import { type Result } from '../shared/result.js';
7
+ import type { ProxyShipKinds, SlackApps, SlackShips, SlackTooling } from './ports.js';
8
+ import { type SlackAddresses } from './slack-app.js';
9
+ import { type TakeAccessToken } from './take-access-token.js';
10
+ export type ExposeShipRefusal = DomainError<'SLACK_SCOPE_NOT_HELD' | 'SLACK_NOT_CONNECTED' | 'SLACK_TOKEN_REFUSED' | 'SLACK_UNAVAILABLE' | 'CONFLICT' | 'NOT_EXPOSABLE' | 'NOT_REACHABLE' | 'FLEET_UNAVAILABLE'>;
11
+ export type ExposeShip = (input: {
12
+ actor: Actor;
13
+ as: ActorCredential;
14
+ shipId: ShipId;
15
+ }) => Promise<Result<{
16
+ appId: string;
17
+ }, ExposeShipRefusal>>;
18
+ /**
19
+ * Use case: an actor holding gateway:slack, within manage reach of the ship
20
+ * (B6), exposes it as a Slack bot (gateway scopes 9.2): an agent ship or an
21
+ * outside A2A agent's proxy ship, which take a message and answer (P-B3).
22
+ * The gateway makes the ship's app from a manifest, named after the ship,
23
+ * its statement's summary as the description, and keeps it by the ship's
24
+ * id, never its name (L20). Install follows.
25
+ */
26
+ export declare function createExposeShip(deps: {
27
+ slack: Pick<SlackTooling, 'makeApp'>;
28
+ apps: Pick<SlackApps, 'ofShip' | 'save'>;
29
+ ships: SlackShips;
30
+ proxyShips: ProxyShipKinds;
31
+ takeAccessToken: TakeAccessToken;
32
+ credentialOf: CredentialOf;
33
+ clock: Clock;
34
+ addresses: SlackAddresses;
35
+ }): ExposeShip;
@@ -0,0 +1,59 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ import { ok } from '../shared/result.js';
3
+ import { SLACK_SCOPE } from './connect-slack.js';
4
+ import { shipBotDescription } from './slack-app.js';
5
+ import { slackUnavailableMessage } from './take-access-token.js';
6
+ /**
7
+ * Use case: an actor holding gateway:slack, within manage reach of the ship
8
+ * (B6), exposes it as a Slack bot (gateway scopes 9.2): an agent ship or an
9
+ * outside A2A agent's proxy ship, which take a message and answer (P-B3).
10
+ * The gateway makes the ship's app from a manifest, named after the ship,
11
+ * its statement's summary as the description, and keeps it by the ship's
12
+ * id, never its name (L20). Install follows.
13
+ */
14
+ export function createExposeShip(deps) {
15
+ return async ({ actor, as, shipId }) => {
16
+ if (!actor.scopes.includes(SLACK_SCOPE)) {
17
+ return refuse('SLACK_SCOPE_NOT_HELD', `Exposing a ship as a Slack bot needs ${SLACK_SCOPE}`);
18
+ }
19
+ const { fleetId } = actor;
20
+ const ship = await deps.ships.read(fleetId, shipId);
21
+ if (!ship.isOk) {
22
+ return ship.error.code === 'UNAVAILABLE' ? refuse('FLEET_UNAVAILABLE', `The fleet did not answer: ${ship.error.message}`) : refuse('NOT_EXPOSABLE', `The fleet has no ship ${shipId}`);
23
+ }
24
+ const { name } = ship.value;
25
+ if ((await deps.apps.ofShip(fleetId, shipId)) !== undefined) {
26
+ return refuse('CONFLICT', `${name} is a Slack bot already`);
27
+ }
28
+ if (ship.value.status === 'retired') {
29
+ return refuse('NOT_EXPOSABLE', `${name} was retired`);
30
+ }
31
+ const proxyKind = await deps.proxyShips.kindOf(fleetId, shipId);
32
+ if (proxyKind === 'mcpServer') {
33
+ return refuse('NOT_EXPOSABLE', `${name} is an outside MCP server's proxy ship: it takes tool calls, not a person's words. Expose an agent ship that uses its tools`);
34
+ }
35
+ if (ship.value.kind !== 'agent' && proxyKind !== 'a2aAgent') {
36
+ return refuse('NOT_EXPOSABLE', `${name} is no agent ship nor an outside A2A agent's proxy ship`);
37
+ }
38
+ const credential = await deps.credentialOf(actor, as);
39
+ if (!credential.isOk) {
40
+ return credential;
41
+ }
42
+ const managed = await deps.ships.checkManage(credential.value, shipId);
43
+ if (!managed.isOk) {
44
+ return managed.error.code === 'UNAVAILABLE' ? refuse('FLEET_UNAVAILABLE', `The fleet did not say whether you manage ${name}: ${managed.error.message}`) : refuse('NOT_REACHABLE', managed.error.message);
45
+ }
46
+ const accessToken = await deps.takeAccessToken(fleetId);
47
+ if (!accessToken.isOk) {
48
+ return accessToken;
49
+ }
50
+ const description = shipBotDescription(ship.value, deps.addresses);
51
+ const made = await deps.slack.makeApp(accessToken.value, description);
52
+ if (!made.isOk) {
53
+ return refuse('SLACK_UNAVAILABLE', made.error.kind === 'refused' ? `Slack did not make ${name}'s bot (${made.error.error})` : slackUnavailableMessage(made.error));
54
+ }
55
+ await deps.apps.save({ fleetId, shipId, ...made.value, name: description.name, madeAt: deps.clock.now(), installStartedAt: null, bot: null, removedInSlackAt: null });
56
+ return ok({ appId: made.value.appId });
57
+ };
58
+ }
59
+ //# sourceMappingURL=expose-ship.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expose-ship.js","sourceRoot":"","sources":["../../../src/core/slack/expose-ship.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { SlackApps, SlackShips, SlackTooling, SlackWorkspaces } from './ports.js';
2
+ import { type SlackAddresses } from './slack-app.js';
3
+ import type { TakeAccessToken } from './take-access-token.js';
4
+ export type FollowExposedShips = () => Promise<void>;
5
+ /**
6
+ * Use case: one pass of the gateway reading each exposed ship by its id
7
+ * (gateway scopes 9.2, L20), in every fleet whose configuration token Slack
8
+ * has not refused. A renamed ship's bot is given its whole manifest anew,
9
+ * the new name kept once Slack took it; a retired ship's bot is deleted in
10
+ * Slack and forgotten. What the fleet or Slack does not answer now is
11
+ * followed at the next pass.
12
+ */
13
+ export declare function createFollowExposedShips(deps: {
14
+ workspaces: Pick<SlackWorkspaces, 'rotatable'>;
15
+ apps: Pick<SlackApps, 'all' | 'save' | 'remove'>;
16
+ ships: Pick<SlackShips, 'read'>;
17
+ slack: Pick<SlackTooling, 'renameApp' | 'removeApp'>;
18
+ takeAccessToken: TakeAccessToken;
19
+ addresses: SlackAddresses;
20
+ }): FollowExposedShips;
@@ -0,0 +1,43 @@
1
+ import { shipBotDescription } from './slack-app.js';
2
+ /**
3
+ * Use case: one pass of the gateway reading each exposed ship by its id
4
+ * (gateway scopes 9.2, L20), in every fleet whose configuration token Slack
5
+ * has not refused. A renamed ship's bot is given its whole manifest anew,
6
+ * the new name kept once Slack took it; a retired ship's bot is deleted in
7
+ * Slack and forgotten. What the fleet or Slack does not answer now is
8
+ * followed at the next pass.
9
+ */
10
+ export function createFollowExposedShips(deps) {
11
+ return async () => {
12
+ for (const fleetId of await deps.workspaces.rotatable()) {
13
+ for (const app of await deps.apps.all(fleetId)) {
14
+ if (app.shipId === null) {
15
+ continue;
16
+ }
17
+ const ship = await deps.ships.read(fleetId, app.shipId);
18
+ if (!ship.isOk) {
19
+ continue;
20
+ }
21
+ const description = shipBotDescription(ship.value, deps.addresses);
22
+ const isRetired = ship.value.status === 'retired';
23
+ if (!isRetired && description.name === app.name) {
24
+ continue;
25
+ }
26
+ const accessToken = await deps.takeAccessToken(fleetId);
27
+ if (!accessToken.isOk) {
28
+ break;
29
+ }
30
+ if (isRetired) {
31
+ const removed = await deps.slack.removeApp(accessToken.value, app.appId);
32
+ if (removed.isOk || removed.error.kind === 'refused') {
33
+ await deps.apps.remove(fleetId, app.appId);
34
+ }
35
+ }
36
+ else if ((await deps.slack.renameApp(accessToken.value, { appId: app.appId, description })).isOk) {
37
+ await deps.apps.save({ ...app, name: description.name });
38
+ }
39
+ }
40
+ }
41
+ };
42
+ }
43
+ //# sourceMappingURL=follow-exposed-ships.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow-exposed-ships.js","sourceRoot":"","sources":["../../../src/core/slack/follow-exposed-ships.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAuB,MAAM,gBAAgB,CAAC;AAKzE;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAOxC;IACC,OAAO,KAAK,IAAI,EAAE;QAChB,KAAK,MAAM,OAAO,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC;YACxD,KAAK,MAAM,GAAG,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/C,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;oBACxB,SAAS;gBACX,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;gBACxD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACf,SAAS;gBACX,CAAC;gBACD,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;gBACnE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC;gBAClD,IAAI,CAAC,SAAS,IAAI,WAAW,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC;oBAChD,SAAS;gBACX,CAAC;gBACD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;gBACxD,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;oBACtB,MAAM;gBACR,CAAC;gBACD,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;oBACzE,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;wBACrD,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;oBAC7C,CAAC;gBACH,CAAC;qBAAM,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACnG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { FleetId } from '@aeolus-fleet/common';
2
+ import type { Clock } from '../shared/clock.js';
3
+ import { type Result } from '../shared/result.js';
4
+ import type { SlackApps, SlackRefusal, SlackTooling } from './ports.js';
5
+ import { type SlackAddresses, type SlackApp } from './slack-app.js';
6
+ /**
7
+ * The fleet's own bot (B5): the one kept, or made now from its manifest and
8
+ * kept, with the configuration access token given. Slack's refusal is
9
+ * answered as is, and nothing is kept.
10
+ */
11
+ export declare function gatewayBotOf(deps: {
12
+ slack: Pick<SlackTooling, 'makeApp'>;
13
+ apps: Pick<SlackApps, 'gatewayBot' | 'save'>;
14
+ clock: Clock;
15
+ addresses: SlackAddresses;
16
+ }, made: {
17
+ fleetId: FleetId;
18
+ fleetName: string;
19
+ accessToken: string;
20
+ }): Promise<Result<SlackApp, SlackRefusal>>;
@@ -0,0 +1,22 @@
1
+ import { err, ok } from '../shared/result.js';
2
+ import { gatewayBotDescription } from './slack-app.js';
3
+ /**
4
+ * The fleet's own bot (B5): the one kept, or made now from its manifest and
5
+ * kept, with the configuration access token given. Slack's refusal is
6
+ * answered as is, and nothing is kept.
7
+ */
8
+ export async function gatewayBotOf(deps, made) {
9
+ const kept = await deps.apps.gatewayBot(made.fleetId);
10
+ if (kept !== undefined) {
11
+ return ok(kept);
12
+ }
13
+ const description = gatewayBotDescription(made.fleetName, deps.addresses);
14
+ const app = await deps.slack.makeApp(made.accessToken, description);
15
+ if (!app.isOk) {
16
+ return err(app.error);
17
+ }
18
+ const bot = { fleetId: made.fleetId, shipId: null, ...app.value, name: description.name, madeAt: deps.clock.now(), installStartedAt: null, bot: null, removedInSlackAt: null };
19
+ await deps.apps.save(bot);
20
+ return ok(bot);
21
+ }
22
+ //# sourceMappingURL=gateway-bot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-bot.js","sourceRoot":"","sources":["../../../src/core/slack/gateway-bot.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAE,qBAAqB,EAAsC,MAAM,gBAAgB,CAAC;AAE3F;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAqI,EACrI,IAAkE;IAElE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,WAAW,GAAG,qBAAqB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1E,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACpE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,MAAM,GAAG,GAAa,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;IACzL,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;AACjB,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { DeliveryId, FleetId, MessageId, ShipId } from '@aeolus-fleet/common';
2
+ /**
3
+ * A linked person's message from Slack, kept by Slack's event id until core
4
+ * stored or refused it (gateway scopes 9.4 step 3, P-B2): the bot's app,
5
+ * the ship it goes to, the person ship it is sent as, where it was written
6
+ * in Slack, and the Markdown it is sent as. An answer in the thread under a
7
+ * posted delivery goes to its sender in reply to its message, and hands the
8
+ * delivery (9.5 step 4). Once core took it, only its event id stays,
9
+ * for an hour, to answer Slack's retries.
10
+ */
11
+ export interface KeptSlackEvent {
12
+ readonly fleetId: FleetId;
13
+ readonly eventId: string;
14
+ readonly appId: string;
15
+ readonly shipId: ShipId;
16
+ readonly personShipId: ShipId;
17
+ readonly channel: string;
18
+ readonly ts: string;
19
+ readonly threadTs: string | null;
20
+ readonly markdown: string;
21
+ readonly inReplyTo: MessageId | null;
22
+ /** The delivery the message answers, handled once core stored it. */
23
+ readonly deliveryId: DeliveryId | null;
24
+ readonly receivedAt: Date;
25
+ readonly takenAt: Date | null;
26
+ }
27
+ /** How long a taken event's id stays, to answer Slack's retries (at most 3, within about 5 minutes). */
28
+ export declare const TAKEN_KEPT_MS: number;
29
+ /** How long an event core has not taken stays before it is deleted and the person told. */
30
+ export declare const UNTAKEN_KEPT_MS: number;
@@ -0,0 +1,5 @@
1
+ /** How long a taken event's id stays, to answer Slack's retries (at most 3, within about 5 minutes). */
2
+ export const TAKEN_KEPT_MS = 60 * 60 * 1000;
3
+ /** How long an event core has not taken stays before it is deleted and the person told. */
4
+ export const UNTAKEN_KEPT_MS = 24 * 60 * 60 * 1000;
5
+ //# sourceMappingURL=kept-slack-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kept-slack-event.js","sourceRoot":"","sources":["../../../src/core/slack/kept-slack-event.ts"],"names":[],"mappings":"AA4BA,wGAAwG;AACxG,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE5C,2FAA2F;AAC3F,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { ShipId } from '@aeolus-fleet/common';
2
+ import type { Actor } from '../actors/authenticate-actor.js';
3
+ import type { ActorCredential, CredentialOf } from '../actors/credential-of.js';
4
+ import { type DomainError } from '../shared/errors.js';
5
+ import { type Result } from '../shared/result.js';
6
+ import type { ProxyShipKinds, SlackApps, SlackShips } from './ports.js';
7
+ export type ListExposable = (input: {
8
+ actor: Actor;
9
+ as: ActorCredential;
10
+ }) => Promise<Result<{
11
+ shipId: ShipId;
12
+ name: string;
13
+ }[], DomainError<'FLEET_UNAVAILABLE'>>>;
14
+ /**
15
+ * Use case: the ships Expose a ship… offers (gateway scopes 9.2, P-B3): the
16
+ * agent ships and outside A2A agents' proxy ships the actor reads, not
17
+ * retired and not yet bots, by name. Whether the actor manages one is the
18
+ * fleet's to answer as it is exposed.
19
+ */
20
+ export declare function createListExposable(deps: {
21
+ ships: Pick<SlackShips, 'list'>;
22
+ apps: Pick<SlackApps, 'all'>;
23
+ proxyShips: ProxyShipKinds;
24
+ credentialOf: CredentialOf;
25
+ }): ListExposable;