@aeolus-fleet/gateway 0.32.2 → 0.34.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 (880) hide show
  1. package/README.md +34 -5
  2. package/dist/adapters/crypto/party-sign-in-seals.d.ts +3 -0
  3. package/dist/adapters/crypto/party-sign-in-seals.js +15 -0
  4. package/dist/adapters/crypto/party-sign-in-seals.js.map +1 -0
  5. package/dist/adapters/crypto/slack-install-seals.d.ts +3 -0
  6. package/dist/adapters/crypto/slack-install-seals.js +15 -0
  7. package/dist/adapters/crypto/slack-install-seals.js.map +1 -0
  8. package/dist/adapters/crypto/slack-link-seals.d.ts +3 -0
  9. package/dist/adapters/crypto/slack-link-seals.js +15 -0
  10. package/dist/adapters/crypto/slack-link-seals.js.map +1 -0
  11. package/dist/adapters/crypto/slack-signatures.d.ts +3 -0
  12. package/dist/adapters/crypto/slack-signatures.js +14 -0
  13. package/dist/adapters/crypto/slack-signatures.js.map +1 -0
  14. package/dist/adapters/fleet/rest-fleet-door.js +2 -2
  15. package/dist/adapters/fleet/rest-fleet-door.js.map +1 -1
  16. package/dist/adapters/fleet/ship-names.d.ts +7 -0
  17. package/dist/adapters/fleet/ship-names.js +25 -0
  18. package/dist/adapters/fleet/ship-names.js.map +1 -0
  19. package/dist/adapters/fleet/slack-ships.d.ts +15 -0
  20. package/dist/adapters/fleet/slack-ships.js +32 -0
  21. package/dist/adapters/fleet/slack-ships.js.map +1 -0
  22. package/dist/adapters/http/mcp-endpoint.js +1 -1
  23. package/dist/adapters/http/mcp-endpoint.js.map +1 -1
  24. package/dist/adapters/http/oauth-routes.d.ts +4 -1
  25. package/dist/adapters/http/oauth-routes.js +21 -9
  26. package/dist/adapters/http/oauth-routes.js.map +1 -1
  27. package/dist/adapters/http/openai-apps-challenge.d.ts +10 -0
  28. package/dist/adapters/http/openai-apps-challenge.js +9 -0
  29. package/dist/adapters/http/openai-apps-challenge.js.map +1 -0
  30. package/dist/adapters/http/party-sign-in-routes.d.ts +25 -0
  31. package/dist/adapters/http/party-sign-in-routes.js +45 -0
  32. package/dist/adapters/http/party-sign-in-routes.js.map +1 -0
  33. package/dist/adapters/http/person-tools.d.ts +24 -1
  34. package/dist/adapters/http/person-tools.js +43 -11
  35. package/dist/adapters/http/person-tools.js.map +1 -1
  36. package/dist/adapters/http/slack-routes.d.ts +15 -0
  37. package/dist/adapters/http/slack-routes.js +188 -0
  38. package/dist/adapters/http/slack-routes.js.map +1 -0
  39. package/dist/adapters/mcp/mcp-servers.js +22 -4
  40. package/dist/adapters/mcp/mcp-servers.js.map +1 -1
  41. package/dist/adapters/oauth/authorization-servers.d.ts +2 -0
  42. package/dist/adapters/oauth/authorization-servers.js +127 -0
  43. package/dist/adapters/oauth/authorization-servers.js.map +1 -0
  44. package/dist/adapters/oauth/party-sign-ins.d.ts +2 -0
  45. package/dist/adapters/oauth/party-sign-ins.js +152 -0
  46. package/dist/adapters/oauth/party-sign-ins.js.map +1 -0
  47. package/dist/adapters/prisma/fleet-forgetter.d.ts +1 -1
  48. package/dist/adapters/prisma/fleet-forgetter.js +2 -2
  49. package/dist/adapters/prisma/fleet-forgetter.js.map +1 -1
  50. package/dist/adapters/prisma/generated/browser.d.ts +35 -0
  51. package/dist/adapters/prisma/generated/client.d.ts +35 -0
  52. package/dist/adapters/prisma/generated/internal/class.d.ts +77 -0
  53. package/dist/adapters/prisma/generated/internal/class.js +4 -4
  54. package/dist/adapters/prisma/generated/internal/class.js.map +1 -1
  55. package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +629 -1
  56. package/dist/adapters/prisma/generated/internal/prismaNamespace.js +97 -1
  57. package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
  58. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +103 -0
  59. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +97 -1
  60. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  61. package/dist/adapters/prisma/generated/models/PartyGrant.d.ts +1276 -0
  62. package/dist/adapters/prisma/generated/models/PartyGrant.js +2 -0
  63. package/dist/adapters/prisma/generated/models/PartyGrant.js.map +1 -0
  64. package/dist/adapters/prisma/generated/models/PartySignInNotice.d.ts +1003 -0
  65. package/dist/adapters/prisma/generated/models/PartySignInNotice.js +2 -0
  66. package/dist/adapters/prisma/generated/models/PartySignInNotice.js.map +1 -0
  67. package/dist/adapters/prisma/generated/models/SlackApp.d.ts +1229 -0
  68. package/dist/adapters/prisma/generated/models/SlackApp.js +2 -0
  69. package/dist/adapters/prisma/generated/models/SlackApp.js.map +1 -0
  70. package/dist/adapters/prisma/generated/models/SlackEvent.d.ts +1232 -0
  71. package/dist/adapters/prisma/generated/models/SlackEvent.js +2 -0
  72. package/dist/adapters/prisma/generated/models/SlackEvent.js.map +1 -0
  73. package/dist/adapters/prisma/generated/models/SlackLink.d.ts +1126 -0
  74. package/dist/adapters/prisma/generated/models/SlackLink.js +2 -0
  75. package/dist/adapters/prisma/generated/models/SlackLink.js.map +1 -0
  76. package/dist/adapters/prisma/generated/models/SlackPost.d.ts +1174 -0
  77. package/dist/adapters/prisma/generated/models/SlackPost.js +2 -0
  78. package/dist/adapters/prisma/generated/models/SlackPost.js.map +1 -0
  79. package/dist/adapters/prisma/generated/models/SlackWorkspace.d.ts +1143 -0
  80. package/dist/adapters/prisma/generated/models/SlackWorkspace.js +2 -0
  81. package/dist/adapters/prisma/generated/models/SlackWorkspace.js.map +1 -0
  82. package/dist/adapters/prisma/generated/models.d.ts +7 -0
  83. package/dist/adapters/prisma/party-grants.d.ts +10 -0
  84. package/dist/adapters/prisma/party-grants.js +118 -0
  85. package/dist/adapters/prisma/party-grants.js.map +1 -0
  86. package/dist/adapters/prisma/party-store.js +21 -2
  87. package/dist/adapters/prisma/party-store.js.map +1 -1
  88. package/dist/adapters/prisma/sign-in-notices.d.ts +8 -0
  89. package/dist/adapters/prisma/sign-in-notices.js +22 -0
  90. package/dist/adapters/prisma/sign-in-notices.js.map +1 -0
  91. package/dist/adapters/prisma/slack-events.d.ts +8 -0
  92. package/dist/adapters/prisma/slack-events.js +55 -0
  93. package/dist/adapters/prisma/slack-events.js.map +1 -0
  94. package/dist/adapters/prisma/slack-links.d.ts +8 -0
  95. package/dist/adapters/prisma/slack-links.js +49 -0
  96. package/dist/adapters/prisma/slack-links.js.map +1 -0
  97. package/dist/adapters/prisma/slack-posts.d.ts +4 -0
  98. package/dist/adapters/prisma/slack-posts.js +38 -0
  99. package/dist/adapters/prisma/slack-posts.js.map +1 -0
  100. package/dist/adapters/prisma/slack-stores.d.ts +6 -0
  101. package/dist/adapters/prisma/slack-stores.js +115 -0
  102. package/dist/adapters/prisma/slack-stores.js.map +1 -0
  103. package/dist/adapters/slack/slack-call.d.ts +15 -0
  104. package/dist/adapters/slack/slack-call.js +41 -0
  105. package/dist/adapters/slack/slack-call.js.map +1 -0
  106. package/dist/adapters/slack/slack-messages.d.ts +4 -0
  107. package/dist/adapters/slack/slack-messages.js +53 -0
  108. package/dist/adapters/slack/slack-messages.js.map +1 -0
  109. package/dist/adapters/slack/slack-sign-in.d.ts +4 -0
  110. package/dist/adapters/slack/slack-sign-in.js +33 -0
  111. package/dist/adapters/slack/slack-sign-in.js.map +1 -0
  112. package/dist/adapters/slack/slack-tooling.d.ts +6 -0
  113. package/dist/adapters/slack/slack-tooling.js +68 -0
  114. package/dist/adapters/slack/slack-tooling.js.map +1 -0
  115. package/dist/adapters/trpc/router.d.ts +286 -10
  116. package/dist/adapters/trpc/router.js +263 -11
  117. package/dist/adapters/trpc/router.js.map +1 -1
  118. package/dist/app.d.ts +6 -0
  119. package/dist/app.js +225 -21
  120. package/dist/app.js.map +1 -1
  121. package/dist/bin/aeolus-gateway.js +2 -0
  122. package/dist/bin/aeolus-gateway.js.map +1 -1
  123. package/dist/config.d.ts +8 -0
  124. package/dist/config.js +4 -0
  125. package/dist/config.js.map +1 -1
  126. package/dist/core/connection/connect.d.ts +12 -0
  127. package/dist/core/connection/connect.js +11 -4
  128. package/dist/core/connection/connect.js.map +1 -1
  129. package/dist/core/connection/declare-gateway-scopes.d.ts +15 -0
  130. package/dist/core/connection/declare-gateway-scopes.js +23 -0
  131. package/dist/core/connection/declare-gateway-scopes.js.map +1 -0
  132. package/dist/core/connection/ports.d.ts +5 -0
  133. package/dist/core/mcp-out/grant-calls.d.ts +69 -0
  134. package/dist/core/mcp-out/grant-calls.js +98 -0
  135. package/dist/core/mcp-out/grant-calls.js.map +1 -0
  136. package/dist/core/mcp-out/hand-call.d.ts +6 -1
  137. package/dist/core/mcp-out/hand-call.js +23 -2
  138. package/dist/core/mcp-out/hand-call.js.map +1 -1
  139. package/dist/core/mcp-out/ports.d.ts +6 -2
  140. package/dist/core/mcp-out/state-party.d.ts +5 -2
  141. package/dist/core/mcp-out/state-party.js +7 -2
  142. package/dist/core/mcp-out/state-party.js.map +1 -1
  143. package/dist/core/oauth/exchange-token.d.ts +1 -0
  144. package/dist/core/oauth/exchange-token.js +4 -3
  145. package/dist/core/oauth/exchange-token.js.map +1 -1
  146. package/dist/core/oauth/read-authorization.d.ts +3 -3
  147. package/dist/core/oauth/read-authorization.js +6 -5
  148. package/dist/core/oauth/read-authorization.js.map +1 -1
  149. package/dist/core/parties/add-sign-in-server.d.ts +25 -0
  150. package/dist/core/parties/add-sign-in-server.js +70 -0
  151. package/dist/core/parties/add-sign-in-server.js.map +1 -0
  152. package/dist/core/parties/approve-party.d.ts +2 -2
  153. package/dist/core/parties/check-approving.d.ts +3 -3
  154. package/dist/core/parties/check-approving.js +2 -2
  155. package/dist/core/parties/check-approving.js.map +1 -1
  156. package/dist/core/parties/party.d.ts +3 -2
  157. package/dist/core/parties/party.js +4 -1
  158. package/dist/core/parties/party.js.map +1 -1
  159. package/dist/core/parties/ports.d.ts +49 -0
  160. package/dist/core/parties/read-party-tools.d.ts +5 -2
  161. package/dist/core/parties/read-party-tools.js +7 -2
  162. package/dist/core/parties/read-party-tools.js.map +1 -1
  163. package/dist/core/parties/retire-party.d.ts +5 -1
  164. package/dist/core/parties/retire-party.js +6 -1
  165. package/dist/core/parties/retire-party.js.map +1 -1
  166. package/dist/core/parties/shown-party.d.ts +2 -2
  167. package/dist/core/parties/sign-in-servers.d.ts +4 -0
  168. package/dist/core/parties/sign-in-servers.js +13 -0
  169. package/dist/core/parties/sign-in-servers.js.map +1 -0
  170. package/dist/core/parties/switch-tools.d.ts +3 -1
  171. package/dist/core/parties/switch-tools.js +5 -1
  172. package/dist/core/parties/switch-tools.js.map +1 -1
  173. package/dist/core/party-grants/approved-sign-in-party.d.ts +17 -0
  174. package/dist/core/party-grants/approved-sign-in-party.js +21 -0
  175. package/dist/core/party-grants/approved-sign-in-party.js.map +1 -0
  176. package/dist/core/party-grants/call-grant.d.ts +46 -0
  177. package/dist/core/party-grants/call-grant.js +30 -0
  178. package/dist/core/party-grants/call-grant.js.map +1 -0
  179. package/dist/core/party-grants/complete-party-sign-in.d.ts +52 -0
  180. package/dist/core/party-grants/complete-party-sign-in.js +95 -0
  181. package/dist/core/party-grants/complete-party-sign-in.js.map +1 -0
  182. package/dist/core/party-grants/end-account-grants.d.ts +18 -0
  183. package/dist/core/party-grants/end-account-grants.js +16 -0
  184. package/dist/core/party-grants/end-account-grants.js.map +1 -0
  185. package/dist/core/party-grants/end-grant.d.ts +23 -0
  186. package/dist/core/party-grants/end-grant.js +33 -0
  187. package/dist/core/party-grants/end-grant.js.map +1 -0
  188. package/dist/core/party-grants/end-party-grants.d.ts +19 -0
  189. package/dist/core/party-grants/end-party-grants.js +31 -0
  190. package/dist/core/party-grants/end-party-grants.js.map +1 -0
  191. package/dist/core/party-grants/end-retired-persons-grants.d.ts +19 -0
  192. package/dist/core/party-grants/end-retired-persons-grants.js +30 -0
  193. package/dist/core/party-grants/end-retired-persons-grants.js.map +1 -0
  194. package/dist/core/party-grants/keep-grants-alive.d.ts +18 -0
  195. package/dist/core/party-grants/keep-grants-alive.js +19 -0
  196. package/dist/core/party-grants/keep-grants-alive.js.map +1 -0
  197. package/dist/core/party-grants/list-grants.d.ts +30 -0
  198. package/dist/core/party-grants/list-grants.js +34 -0
  199. package/dist/core/party-grants/list-grants.js.map +1 -0
  200. package/dist/core/party-grants/listing-connection.d.ts +29 -0
  201. package/dist/core/party-grants/listing-connection.js +17 -0
  202. package/dist/core/party-grants/listing-connection.js.map +1 -0
  203. package/dist/core/party-grants/party-grant.d.ts +50 -0
  204. package/dist/core/party-grants/party-grant.js +26 -0
  205. package/dist/core/party-grants/party-grant.js.map +1 -0
  206. package/dist/core/party-grants/ports.d.ts +180 -0
  207. package/dist/core/party-grants/ports.js +2 -0
  208. package/dist/core/party-grants/ports.js.map +1 -0
  209. package/dist/core/party-grants/read-own-grant.d.ts +33 -0
  210. package/dist/core/party-grants/read-own-grant.js +23 -0
  211. package/dist/core/party-grants/read-own-grant.js.map +1 -0
  212. package/dist/core/party-grants/refresh-grant.d.ts +41 -0
  213. package/dist/core/party-grants/refresh-grant.js +58 -0
  214. package/dist/core/party-grants/refresh-grant.js.map +1 -0
  215. package/dist/core/party-grants/remove-grant.d.ts +21 -0
  216. package/dist/core/party-grants/remove-grant.js +25 -0
  217. package/dist/core/party-grants/remove-grant.js.map +1 -0
  218. package/dist/core/party-grants/remove-own-grant.d.ts +17 -0
  219. package/dist/core/party-grants/remove-own-grant.js +21 -0
  220. package/dist/core/party-grants/remove-own-grant.js.map +1 -0
  221. package/dist/core/party-grants/sign-in-party.d.ts +23 -0
  222. package/dist/core/party-grants/sign-in-party.js +22 -0
  223. package/dist/core/party-grants/sign-in-party.js.map +1 -0
  224. package/dist/core/party-grants/start-party-sign-in.d.ts +31 -0
  225. package/dist/core/party-grants/start-party-sign-in.js +31 -0
  226. package/dist/core/party-grants/start-party-sign-in.js.map +1 -0
  227. package/dist/core/party-grants/tell-sign-in-needed.d.ts +29 -0
  228. package/dist/core/party-grants/tell-sign-in-needed.js +27 -0
  229. package/dist/core/party-grants/tell-sign-in-needed.js.map +1 -0
  230. package/dist/core/people/ports.d.ts +23 -2
  231. package/dist/core/people/wake-person.d.ts +9 -2
  232. package/dist/core/people/wake-person.js +33 -9
  233. package/dist/core/people/wake-person.js.map +1 -1
  234. package/dist/core/shared/errors.d.ts +1 -1
  235. package/dist/core/shared/errors.js.map +1 -1
  236. package/dist/core/sign-in/start-sign-in.d.ts +4 -1
  237. package/dist/core/sign-in/start-sign-in.js +8 -2
  238. package/dist/core/sign-in/start-sign-in.js.map +1 -1
  239. package/dist/core/slack/answer-in-slack.d.ts +41 -0
  240. package/dist/core/slack/answer-in-slack.js +59 -0
  241. package/dist/core/slack/answer-in-slack.js.map +1 -0
  242. package/dist/core/slack/complete-install.d.ts +27 -0
  243. package/dist/core/slack/complete-install.js +36 -0
  244. package/dist/core/slack/complete-install.js.map +1 -0
  245. package/dist/core/slack/complete-link.d.ts +41 -0
  246. package/dist/core/slack/complete-link.js +64 -0
  247. package/dist/core/slack/complete-link.js.map +1 -0
  248. package/dist/core/slack/connect-slack.d.ts +34 -0
  249. package/dist/core/slack/connect-slack.js +54 -0
  250. package/dist/core/slack/connect-slack.js.map +1 -0
  251. package/dist/core/slack/disconnect-slack.d.ts +21 -0
  252. package/dist/core/slack/disconnect-slack.js +31 -0
  253. package/dist/core/slack/disconnect-slack.js.map +1 -0
  254. package/dist/core/slack/expose-ship.d.ts +35 -0
  255. package/dist/core/slack/expose-ship.js +59 -0
  256. package/dist/core/slack/expose-ship.js.map +1 -0
  257. package/dist/core/slack/follow-exposed-ships.d.ts +20 -0
  258. package/dist/core/slack/follow-exposed-ships.js +43 -0
  259. package/dist/core/slack/follow-exposed-ships.js.map +1 -0
  260. package/dist/core/slack/gateway-bot.d.ts +20 -0
  261. package/dist/core/slack/gateway-bot.js +22 -0
  262. package/dist/core/slack/gateway-bot.js.map +1 -0
  263. package/dist/core/slack/kept-slack-event.d.ts +32 -0
  264. package/dist/core/slack/kept-slack-event.js +5 -0
  265. package/dist/core/slack/kept-slack-event.js.map +1 -0
  266. package/dist/core/slack/list-exposable.d.ts +25 -0
  267. package/dist/core/slack/list-exposable.js +32 -0
  268. package/dist/core/slack/list-exposable.js.map +1 -0
  269. package/dist/core/slack/ports.d.ts +287 -0
  270. package/dist/core/slack/ports.js +2 -0
  271. package/dist/core/slack/ports.js.map +1 -0
  272. package/dist/core/slack/read-slack-link.d.ts +23 -0
  273. package/dist/core/slack/read-slack-link.js +20 -0
  274. package/dist/core/slack/read-slack-link.js.map +1 -0
  275. package/dist/core/slack/read-slack.d.ts +42 -0
  276. package/dist/core/slack/read-slack.js +35 -0
  277. package/dist/core/slack/read-slack.js.map +1 -0
  278. package/dist/core/slack/remove-bot.d.ts +24 -0
  279. package/dist/core/slack/remove-bot.js +33 -0
  280. package/dist/core/slack/remove-bot.js.map +1 -0
  281. package/dist/core/slack/rotate-configuration-tokens.d.ts +13 -0
  282. package/dist/core/slack/rotate-configuration-tokens.js +14 -0
  283. package/dist/core/slack/rotate-configuration-tokens.js.map +1 -0
  284. package/dist/core/slack/send-slack-events.d.ts +32 -0
  285. package/dist/core/slack/send-slack-events.js +106 -0
  286. package/dist/core/slack/send-slack-events.js.map +1 -0
  287. package/dist/core/slack/ship-bot.d.ts +23 -0
  288. package/dist/core/slack/ship-bot.js +25 -0
  289. package/dist/core/slack/ship-bot.js.map +1 -0
  290. package/dist/core/slack/show-all-in-slack.d.ts +16 -0
  291. package/dist/core/slack/show-all-in-slack.js +18 -0
  292. package/dist/core/slack/show-all-in-slack.js.map +1 -0
  293. package/dist/core/slack/show-in-slack.d.ts +38 -0
  294. package/dist/core/slack/show-in-slack.js +154 -0
  295. package/dist/core/slack/show-in-slack.js.map +1 -0
  296. package/dist/core/slack/slack-app.d.ts +77 -0
  297. package/dist/core/slack/slack-app.js +53 -0
  298. package/dist/core/slack/slack-app.js.map +1 -0
  299. package/dist/core/slack/slack-event.d.ts +51 -0
  300. package/dist/core/slack/slack-event.js +18 -0
  301. package/dist/core/slack/slack-event.js.map +1 -0
  302. package/dist/core/slack/slack-link.d.ts +20 -0
  303. package/dist/core/slack/slack-link.js +2 -0
  304. package/dist/core/slack/slack-link.js.map +1 -0
  305. package/dist/core/slack/slack-markdown.d.ts +13 -0
  306. package/dist/core/slack/slack-markdown.js +27 -0
  307. package/dist/core/slack/slack-markdown.js.map +1 -0
  308. package/dist/core/slack/slack-post-of.d.ts +27 -0
  309. package/dist/core/slack/slack-post-of.js +71 -0
  310. package/dist/core/slack/slack-post-of.js.map +1 -0
  311. package/dist/core/slack/slack-post.d.ts +40 -0
  312. package/dist/core/slack/slack-post.js +13 -0
  313. package/dist/core/slack/slack-post.js.map +1 -0
  314. package/dist/core/slack/slack-request.d.ts +17 -0
  315. package/dist/core/slack/slack-request.js +10 -0
  316. package/dist/core/slack/slack-request.js.map +1 -0
  317. package/dist/core/slack/slack-workspace.d.ts +36 -0
  318. package/dist/core/slack/slack-workspace.js +7 -0
  319. package/dist/core/slack/slack-workspace.js.map +1 -0
  320. package/dist/core/slack/start-install.d.ts +43 -0
  321. package/dist/core/slack/start-install.js +57 -0
  322. package/dist/core/slack/start-install.js.map +1 -0
  323. package/dist/core/slack/start-link.d.ts +32 -0
  324. package/dist/core/slack/start-link.js +46 -0
  325. package/dist/core/slack/start-link.js.map +1 -0
  326. package/dist/core/slack/stop-slack-link.d.ts +16 -0
  327. package/dist/core/slack/stop-slack-link.js +9 -0
  328. package/dist/core/slack/stop-slack-link.js.map +1 -0
  329. package/dist/core/slack/take-access-token.d.ts +25 -0
  330. package/dist/core/slack/take-access-token.js +45 -0
  331. package/dist/core/slack/take-access-token.js.map +1 -0
  332. package/dist/core/slack/take-slack-event.d.ts +49 -0
  333. package/dist/core/slack/take-slack-event.js +81 -0
  334. package/dist/core/slack/take-slack-event.js.map +1 -0
  335. package/dist/core/slack/unlink-slack.d.ts +9 -0
  336. package/dist/core/slack/unlink-slack.js +9 -0
  337. package/dist/core/slack/unlink-slack.js.map +1 -0
  338. package/dist/core/vault/credential.d.ts +34 -0
  339. package/dist/grant-worker.d.ts +20 -0
  340. package/dist/grant-worker.js +24 -0
  341. package/dist/grant-worker.js.map +1 -0
  342. package/dist/slack-event-worker.d.ts +21 -0
  343. package/dist/slack-event-worker.js +38 -0
  344. package/dist/slack-event-worker.js.map +1 -0
  345. package/dist/slack-token-worker.d.ts +19 -0
  346. package/dist/slack-token-worker.js +24 -0
  347. package/dist/slack-token-worker.js.map +1 -0
  348. package/package.json +3 -2
  349. package/src/adapters/prisma/migrations/20261027090000_slack_workspaces/migration.sql +30 -0
  350. package/src/adapters/prisma/migrations/20261027150000_slack_bots/migration.sql +6 -0
  351. package/src/adapters/prisma/migrations/20261027200000_slack_links/migration.sql +15 -0
  352. package/src/adapters/prisma/migrations/20261028090000_slack_events/migration.sql +18 -0
  353. package/src/adapters/prisma/migrations/20261028150000_slack_posts/migration.sql +25 -0
  354. package/src/adapters/prisma/migrations/20261028230000_party_grants/migration.sql +18 -0
  355. package/src/adapters/prisma/migrations/20261029080000_party_sign_in_notices/migration.sql +10 -0
  356. package/src/adapters/prisma/migrations/20261029120000_party_grants_lost/migration.sql +3 -0
  357. package/src/adapters/prisma/migrations/20261029130000_party_grants_refreshed/migration.sql +6 -0
  358. package/src/adapters/prisma/migrations/20261030090000_party_grants_of_account/migration.sql +2 -0
  359. package/src/adapters/prisma/migrations/20261030100000_slack_events_unmatched_answers/migration.sql +2 -0
  360. package/src/adapters/prisma/schema.prisma +148 -0
  361. package/web/.next/BUILD_ID +1 -1
  362. package/web/.next/app-path-routes-manifest.json +8 -1
  363. package/web/.next/build-manifest.json +51 -3
  364. package/web/.next/diagnostics/route-bundle-stats.json +145 -72
  365. package/web/.next/fallback-build-manifest.json +3 -3
  366. package/web/.next/prerender-manifest.json +67 -3
  367. package/web/.next/routes-manifest.json +42 -0
  368. package/web/.next/server/app/(console)/gateway-off/page/server-reference-manifest.json +1 -1
  369. package/web/.next/server/app/(console)/gateway-off/page.js +6 -6
  370. package/web/.next/server/app/(console)/gateway-off/page.js.nft.json +1 -1
  371. package/web/.next/server/app/(console)/gateway-off/page_client-reference-manifest.js +1 -1
  372. package/web/.next/server/app/(console)/meetings/[meetingId]/page/server-reference-manifest.json +3 -3
  373. package/web/.next/server/app/(console)/meetings/[meetingId]/page.js +6 -6
  374. package/web/.next/server/app/(console)/meetings/[meetingId]/page.js.nft.json +1 -1
  375. package/web/.next/server/app/(console)/meetings/[meetingId]/page_client-reference-manifest.js +1 -1
  376. package/web/.next/server/app/(console)/outside-parties/[name]/change/page/server-reference-manifest.json +48 -8
  377. package/web/.next/server/app/(console)/outside-parties/[name]/change/page.js +8 -8
  378. package/web/.next/server/app/(console)/outside-parties/[name]/change/page.js.nft.json +1 -1
  379. package/web/.next/server/app/(console)/outside-parties/[name]/change/page_client-reference-manifest.js +1 -1
  380. package/web/.next/server/app/(console)/outside-parties/[name]/page/server-reference-manifest.json +44 -4
  381. package/web/.next/server/app/(console)/outside-parties/[name]/page.js +8 -8
  382. package/web/.next/server/app/(console)/outside-parties/[name]/page.js.nft.json +1 -1
  383. package/web/.next/server/app/(console)/outside-parties/[name]/page_client-reference-manifest.js +1 -1
  384. package/web/.next/server/app/(console)/outside-parties/[name]/retire/page/server-reference-manifest.json +48 -8
  385. package/web/.next/server/app/(console)/outside-parties/[name]/retire/page.js +8 -8
  386. package/web/.next/server/app/(console)/outside-parties/[name]/retire/page.js.nft.json +1 -1
  387. package/web/.next/server/app/(console)/outside-parties/[name]/retire/page_client-reference-manifest.js +1 -1
  388. package/web/.next/server/app/(console)/outside-parties/add/page/server-reference-manifest.json +46 -6
  389. package/web/.next/server/app/(console)/outside-parties/add/page.js +9 -8
  390. package/web/.next/server/app/(console)/outside-parties/add/page.js.nft.json +1 -1
  391. package/web/.next/server/app/(console)/outside-parties/add/page_client-reference-manifest.js +1 -1
  392. package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page/server-reference-manifest.json +2 -2
  393. package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page.js +7 -7
  394. package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page.js.nft.json +1 -1
  395. package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page_client-reference-manifest.js +1 -1
  396. package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page/server-reference-manifest.json +2 -2
  397. package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page.js +7 -7
  398. package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page.js.nft.json +1 -1
  399. package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page_client-reference-manifest.js +1 -1
  400. package/web/.next/server/app/(console)/outside-parties/page/server-reference-manifest.json +2 -2
  401. package/web/.next/server/app/(console)/outside-parties/page.js +6 -6
  402. package/web/.next/server/app/(console)/outside-parties/page.js.nft.json +1 -1
  403. package/web/.next/server/app/(console)/outside-parties/page_client-reference-manifest.js +1 -1
  404. package/web/.next/server/app/(console)/overview/changes/route.js +3 -2
  405. package/web/.next/server/app/(console)/overview/changes/route.js.nft.json +1 -1
  406. package/web/.next/server/app/(console)/overview/focus/route.js +3 -2
  407. package/web/.next/server/app/(console)/overview/focus/route.js.nft.json +1 -1
  408. package/web/.next/server/app/(console)/overview/page/server-reference-manifest.json +27 -7
  409. package/web/.next/server/app/(console)/overview/page.js +8 -8
  410. package/web/.next/server/app/(console)/overview/page.js.nft.json +1 -1
  411. package/web/.next/server/app/(console)/overview/page_client-reference-manifest.js +1 -1
  412. package/web/.next/server/app/(console)/overview/requests/[requestId]/page/server-reference-manifest.json +2 -2
  413. package/web/.next/server/app/(console)/overview/requests/[requestId]/page.js +6 -6
  414. package/web/.next/server/app/(console)/overview/requests/[requestId]/page.js.nft.json +1 -1
  415. package/web/.next/server/app/(console)/overview/requests/[requestId]/page_client-reference-manifest.js +1 -1
  416. package/web/.next/server/app/(console)/parties/page/server-reference-manifest.json +8 -8
  417. package/web/.next/server/app/(console)/parties/page.js +7 -7
  418. package/web/.next/server/app/(console)/parties/page.js.nft.json +1 -1
  419. package/web/.next/server/app/(console)/parties/page_client-reference-manifest.js +1 -1
  420. package/web/.next/server/app/(console)/sign-in/failed/page/server-reference-manifest.json +1 -1
  421. package/web/.next/server/app/(console)/sign-in/failed/page.js +6 -6
  422. package/web/.next/server/app/(console)/sign-in/failed/page.js.nft.json +1 -1
  423. package/web/.next/server/app/(console)/sign-in/failed/page_client-reference-manifest.js +1 -1
  424. package/web/.next/server/app/(console)/slack/disconnect/page/app-paths-manifest.json +3 -0
  425. package/web/.next/server/app/(console)/slack/disconnect/page/build-manifest.json +23 -0
  426. package/web/.next/server/app/(console)/slack/disconnect/page/next-font-manifest.json +11 -0
  427. package/web/.next/server/app/(console)/slack/disconnect/page/react-loadable-manifest.json +1 -0
  428. package/web/.next/server/app/(console)/slack/disconnect/page/server-reference-manifest.json +65 -0
  429. package/web/.next/server/app/(console)/slack/disconnect/page.js +22 -0
  430. package/web/.next/server/app/(console)/slack/disconnect/page.js.map +5 -0
  431. package/web/.next/server/app/(console)/slack/disconnect/page.js.nft.json +1 -0
  432. package/web/.next/server/app/(console)/slack/disconnect/page_client-reference-manifest.js +3 -0
  433. package/web/.next/server/app/(console)/slack/expose/page/app-paths-manifest.json +3 -0
  434. package/web/.next/server/app/(console)/slack/expose/page/build-manifest.json +23 -0
  435. package/web/.next/server/app/(console)/slack/expose/page/next-font-manifest.json +11 -0
  436. package/web/.next/server/app/(console)/slack/expose/page/react-loadable-manifest.json +1 -0
  437. package/web/.next/server/app/(console)/slack/expose/page/server-reference-manifest.json +65 -0
  438. package/web/.next/server/app/(console)/slack/expose/page.js +22 -0
  439. package/web/.next/server/app/(console)/slack/expose/page.js.map +5 -0
  440. package/web/.next/server/app/(console)/slack/expose/page.js.nft.json +1 -0
  441. package/web/.next/server/app/(console)/slack/expose/page_client-reference-manifest.js +3 -0
  442. package/web/.next/server/app/(console)/slack/link/route/app-paths-manifest.json +3 -0
  443. package/web/.next/server/app/(console)/slack/link/route/build-manifest.json +12 -0
  444. package/web/.next/server/app/(console)/slack/link/route/server-reference-manifest.json +4 -0
  445. package/web/.next/server/app/(console)/slack/link/route.js +8 -0
  446. package/web/.next/server/app/(console)/slack/link/route.js.map +5 -0
  447. package/web/.next/server/app/(console)/slack/link/route.js.nft.json +1 -0
  448. package/web/.next/server/app/(console)/slack/link/route_client-reference-manifest.js +3 -0
  449. package/web/.next/server/app/(console)/slack/page/app-paths-manifest.json +3 -0
  450. package/web/.next/server/app/(console)/slack/page/build-manifest.json +23 -0
  451. package/web/.next/server/app/(console)/slack/page/next-font-manifest.json +11 -0
  452. package/web/.next/server/app/(console)/slack/page/react-loadable-manifest.json +1 -0
  453. package/web/.next/server/app/(console)/slack/page/server-reference-manifest.json +65 -0
  454. package/web/.next/server/app/(console)/slack/page.js +22 -0
  455. package/web/.next/server/app/(console)/slack/page.js.map +5 -0
  456. package/web/.next/server/app/(console)/slack/page.js.nft.json +1 -0
  457. package/web/.next/server/app/(console)/slack/page_client-reference-manifest.js +3 -0
  458. package/web/.next/server/app/(console)/slack/remove/page/app-paths-manifest.json +3 -0
  459. package/web/.next/server/app/(console)/slack/remove/page/build-manifest.json +23 -0
  460. package/web/.next/server/app/(console)/slack/remove/page/next-font-manifest.json +11 -0
  461. package/web/.next/server/app/(console)/slack/remove/page/react-loadable-manifest.json +1 -0
  462. package/web/.next/server/app/(console)/slack/remove/page/server-reference-manifest.json +65 -0
  463. package/web/.next/server/app/(console)/slack/remove/page.js +22 -0
  464. package/web/.next/server/app/(console)/slack/remove/page.js.map +5 -0
  465. package/web/.next/server/app/(console)/slack/remove/page.js.nft.json +1 -0
  466. package/web/.next/server/app/(console)/slack/remove/page_client-reference-manifest.js +3 -0
  467. package/web/.next/server/app/_global-error/page.js +1 -1
  468. package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  469. package/web/.next/server/app/_global-error.html +1 -1
  470. package/web/.next/server/app/_global-error.rsc +1 -1
  471. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  472. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  473. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  474. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  475. package/web/.next/server/app/_not-found/page.js +6 -6
  476. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  477. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  478. package/web/.next/server/app/apple-icon.png/route/app-paths-manifest.json +3 -0
  479. package/web/.next/server/app/apple-icon.png/route/build-manifest.json +12 -0
  480. package/web/.next/server/app/apple-icon.png/route.js +8 -0
  481. package/web/.next/server/app/apple-icon.png/route.js.map +5 -0
  482. package/web/.next/server/app/apple-icon.png/route.js.nft.json +1 -0
  483. package/web/.next/server/app/apple-icon.png.body +0 -0
  484. package/web/.next/server/app/apple-icon.png.meta +1 -0
  485. package/web/.next/server/app/authorize/failed/page/server-reference-manifest.json +1 -1
  486. package/web/.next/server/app/authorize/failed/page.js +5 -5
  487. package/web/.next/server/app/authorize/failed/page.js.nft.json +1 -1
  488. package/web/.next/server/app/authorize/failed/page_client-reference-manifest.js +1 -1
  489. package/web/.next/server/app/authorize/pick/page/server-reference-manifest.json +1 -1
  490. package/web/.next/server/app/authorize/pick/page.js +4 -4
  491. package/web/.next/server/app/authorize/pick/page.js.nft.json +1 -1
  492. package/web/.next/server/app/authorize/pick/page_client-reference-manifest.js +1 -1
  493. package/web/.next/server/app/authorize/waiting/approval/page/server-reference-manifest.json +1 -1
  494. package/web/.next/server/app/authorize/waiting/approval/page.js +6 -6
  495. package/web/.next/server/app/authorize/waiting/approval/page.js.nft.json +1 -1
  496. package/web/.next/server/app/authorize/waiting/approval/page_client-reference-manifest.js +1 -1
  497. package/web/.next/server/app/icon.svg/route/app-paths-manifest.json +3 -0
  498. package/web/.next/server/app/icon.svg/route/build-manifest.json +12 -0
  499. package/web/.next/server/app/icon.svg/route.js +8 -0
  500. package/web/.next/server/app/icon.svg/route.js.map +5 -0
  501. package/web/.next/server/app/icon.svg/route.js.nft.json +1 -0
  502. package/web/.next/server/app/icon.svg.body +19 -0
  503. package/web/.next/server/app/icon.svg.meta +1 -0
  504. package/web/.next/server/app-paths-manifest.json +8 -1
  505. package/web/.next/server/chunks/[root-of-the-server]__1j0sdz18lzulo._.js +315 -0
  506. package/web/.next/server/chunks/[root-of-the-server]__1j0sdz18lzulo._.js.map +1 -0
  507. package/web/.next/server/chunks/[root-of-the-server]__1o2xxi_001xql._.js +315 -0
  508. package/web/.next/server/chunks/[root-of-the-server]__1o2xxi_001xql._.js.map +1 -0
  509. package/web/.next/server/chunks/[root-of-the-server]__1tfyrijwfgqlk._.js +3 -0
  510. package/web/.next/server/chunks/[root-of-the-server]__1tfyrijwfgqlk._.js.map +1 -0
  511. package/web/.next/server/chunks/_0_um96p6psnqx._.js +57 -0
  512. package/web/.next/server/chunks/_0_um96p6psnqx._.js.map +1 -0
  513. package/web/.next/server/chunks/_0xw0b7avhvg75._.js +3 -0
  514. package/web/.next/server/chunks/_0xw0b7avhvg75._.js.map +1 -0
  515. package/web/.next/server/chunks/_1w2t6c0hpdsrn._.js +3 -0
  516. package/web/.next/server/chunks/_1w2t6c0hpdsrn._.js.map +1 -0
  517. package/web/.next/server/chunks/_1xf83h9norhws._.js +57 -0
  518. package/web/.next/server/chunks/_1xf83h9norhws._.js.map +1 -0
  519. package/web/.next/server/chunks/_20ne4s-e_jzxp._.js +3 -0
  520. package/web/.next/server/chunks/_20ne4s-e_jzxp._.js.map +1 -0
  521. package/web/.next/server/chunks/node_modules_next_1zdbrneapig6o._.js +10 -0
  522. package/web/.next/server/chunks/node_modules_next_1zdbrneapig6o._.js.map +1 -0
  523. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_change_page_actions_04td11fxohsfm.js +1 -1
  524. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_change_page_actions_04td11fxohsfm.js.map +1 -1
  525. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_page_actions_0u-45itza1ls7.js +1 -1
  526. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_page_actions_0u-45itza1ls7.js.map +1 -1
  527. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_retire_page_actions_0s7ps6i0ts7v5.js +1 -1
  528. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_retire_page_actions_0s7ps6i0ts7v5.js.map +1 -1
  529. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_add-a2a-client_page_actions_0d_wgiu94c32e.js +1 -1
  530. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_add-a2a-client_page_actions_0d_wgiu94c32e.js.map +1 -1
  531. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_add_page_actions_0yfz_dfn-8uo7.js +1 -1
  532. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_add_page_actions_0yfz_dfn-8uo7.js.map +1 -1
  533. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_overview_requests_[requestId]_page_actions_0uki9j3mtuz9e.js +1 -1
  534. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_overview_requests_[requestId]_page_actions_0uki9j3mtuz9e.js.map +1 -1
  535. package/web/.next/server/chunks/ssr/[root-of-the-server]__001xx3sm5ur-e._.js +4 -0
  536. package/web/.next/server/chunks/ssr/[root-of-the-server]__001xx3sm5ur-e._.js.map +1 -0
  537. package/web/.next/server/chunks/ssr/[root-of-the-server]__03w-pkh4_8jv_._.js +3 -0
  538. package/web/.next/server/chunks/ssr/[root-of-the-server]__03w-pkh4_8jv_._.js.map +1 -0
  539. package/web/.next/server/chunks/ssr/[root-of-the-server]__048-rfvdrnoze._.js +3 -0
  540. package/web/.next/server/chunks/ssr/[root-of-the-server]__048-rfvdrnoze._.js.map +1 -0
  541. package/web/.next/server/chunks/ssr/{[root-of-the-server]__14w0fxvc_of17._.js → [root-of-the-server]__07ba2bfe20c_p._.js} +2 -2
  542. package/web/.next/server/chunks/ssr/[root-of-the-server]__07ba2bfe20c_p._.js.map +1 -0
  543. package/web/.next/server/chunks/ssr/[root-of-the-server]__0a6a1yc_ac-qt._.js +4 -0
  544. package/web/.next/server/chunks/ssr/[root-of-the-server]__0a6a1yc_ac-qt._.js.map +1 -0
  545. package/web/.next/server/chunks/ssr/{[root-of-the-server]__0-og0bl8lr2xq._.js → [root-of-the-server]__0a8db18tyk__5._.js} +2 -2
  546. package/web/.next/server/chunks/ssr/{[root-of-the-server]__0-og0bl8lr2xq._.js.map → [root-of-the-server]__0a8db18tyk__5._.js.map} +1 -1
  547. package/web/.next/server/chunks/ssr/[root-of-the-server]__0f732g7ojc5-a._.js +3 -0
  548. package/web/.next/server/chunks/ssr/[root-of-the-server]__0f732g7ojc5-a._.js.map +1 -0
  549. package/web/.next/server/chunks/ssr/[root-of-the-server]__0fz0817_b9ljl._.js +3 -0
  550. package/web/.next/server/chunks/ssr/[root-of-the-server]__0fz0817_b9ljl._.js.map +1 -0
  551. package/web/.next/server/chunks/ssr/[root-of-the-server]__0i_m5r9lyffk8._.js +3 -0
  552. package/web/.next/server/chunks/ssr/[root-of-the-server]__0i_m5r9lyffk8._.js.map +1 -0
  553. package/web/.next/server/chunks/ssr/[root-of-the-server]__0icm7kndx480o._.js +4 -0
  554. package/web/.next/server/chunks/ssr/[root-of-the-server]__0icm7kndx480o._.js.map +1 -0
  555. package/web/.next/server/chunks/ssr/[root-of-the-server]__0k3g0p3t9t0c-._.js +1 -1
  556. package/web/.next/server/chunks/ssr/[root-of-the-server]__0k3g0p3t9t0c-._.js.map +1 -1
  557. package/web/.next/server/chunks/ssr/[root-of-the-server]__0k6a9o0872_0x._.js +3 -0
  558. package/web/.next/server/chunks/ssr/[root-of-the-server]__0k6a9o0872_0x._.js.map +1 -0
  559. package/web/.next/server/chunks/ssr/[root-of-the-server]__0pj38h6qumggc._.js +3 -0
  560. package/web/.next/server/chunks/ssr/[root-of-the-server]__0pj38h6qumggc._.js.map +1 -0
  561. package/web/.next/server/chunks/ssr/{[root-of-the-server]__1gb-3dttuacyz._.js → [root-of-the-server]__0y0jwufd7xjsv._.js} +1 -1
  562. package/web/.next/server/chunks/ssr/[root-of-the-server]__10s9e8g5x-ws8._.js +4 -0
  563. package/web/.next/server/chunks/ssr/[root-of-the-server]__10s9e8g5x-ws8._.js.map +1 -0
  564. package/web/.next/server/chunks/ssr/[root-of-the-server]__13yoncr_nx3jc._.js +4 -0
  565. package/web/.next/server/chunks/ssr/[root-of-the-server]__13yoncr_nx3jc._.js.map +1 -0
  566. package/web/.next/server/chunks/ssr/[root-of-the-server]__18-8taiduk1jn._.js +1 -1
  567. package/web/.next/server/chunks/ssr/[root-of-the-server]__18-8taiduk1jn._.js.map +1 -1
  568. package/web/.next/server/chunks/ssr/{[root-of-the-server]__1m9atpy0vkbmj._.js → [root-of-the-server]__19ecatcacd6t9._.js} +1 -1
  569. package/web/.next/server/chunks/ssr/[root-of-the-server]__1aojrh3-9jh9r._.js +3 -0
  570. package/web/.next/server/chunks/ssr/[root-of-the-server]__1aojrh3-9jh9r._.js.map +1 -0
  571. package/web/.next/server/chunks/ssr/{[root-of-the-server]__1w5swo8gmjyx6._.js → [root-of-the-server]__1kynqd8xcwg2b._.js} +2 -2
  572. package/web/.next/server/chunks/ssr/[root-of-the-server]__1kynqd8xcwg2b._.js.map +1 -0
  573. package/web/.next/server/chunks/ssr/[root-of-the-server]__1nxy_j9eswr3i._.js +3 -0
  574. package/web/.next/server/chunks/ssr/[root-of-the-server]__1nxy_j9eswr3i._.js.map +1 -0
  575. package/web/.next/server/chunks/ssr/{[root-of-the-server]__160zc0ja_jjnu._.js → [root-of-the-server]__1q14l5_4hp9h3._.js} +2 -2
  576. package/web/.next/server/chunks/ssr/[root-of-the-server]__1q14l5_4hp9h3._.js.map +1 -0
  577. package/web/.next/server/chunks/ssr/[root-of-the-server]__1qnls-4cj-7oh._.js +3 -0
  578. package/web/.next/server/chunks/ssr/[root-of-the-server]__1qnls-4cj-7oh._.js.map +1 -0
  579. package/web/.next/server/chunks/ssr/[root-of-the-server]__1qpow96uit9t8._.js +4 -0
  580. package/web/.next/server/chunks/ssr/[root-of-the-server]__1qpow96uit9t8._.js.map +1 -0
  581. package/web/.next/server/chunks/ssr/[root-of-the-server]__1r1t1q3fzoqey._.js +3 -0
  582. package/web/.next/server/chunks/ssr/[root-of-the-server]__1r1t1q3fzoqey._.js.map +1 -0
  583. package/web/.next/server/chunks/ssr/[root-of-the-server]__1xmvo3lr1_qyo._.js +3 -0
  584. package/web/.next/server/chunks/ssr/[root-of-the-server]__1xmvo3lr1_qyo._.js.map +1 -0
  585. package/web/.next/server/chunks/ssr/[root-of-the-server]__1zlq3zji9v53h._.js +3 -0
  586. package/web/.next/server/chunks/ssr/[root-of-the-server]__1zlq3zji9v53h._.js.map +1 -0
  587. package/web/.next/server/chunks/ssr/_0-boiqan2j4tr._.js +3 -0
  588. package/web/.next/server/chunks/ssr/{_0w2ptjht34s6t._.js.map → _0-boiqan2j4tr._.js.map} +1 -1
  589. package/web/.next/server/chunks/ssr/_00hfzlqn1og18._.js +1 -1
  590. package/web/.next/server/chunks/ssr/_00hfzlqn1og18._.js.map +1 -1
  591. package/web/.next/server/chunks/ssr/_03lk54yp-yhw3._.js +1 -1
  592. package/web/.next/server/chunks/ssr/_03lk54yp-yhw3._.js.map +1 -1
  593. package/web/.next/server/chunks/ssr/_0bizyb21i2sl8._.js +3 -0
  594. package/web/.next/server/chunks/ssr/{_00dg5cvqofspn._.js.map → _0bizyb21i2sl8._.js.map} +1 -1
  595. package/web/.next/server/chunks/ssr/_0eu-76mbv16oa._.js +3 -0
  596. package/web/.next/server/chunks/ssr/_0eu-76mbv16oa._.js.map +1 -0
  597. package/web/.next/server/chunks/ssr/_0ka_9elusb800._.js +1 -1
  598. package/web/.next/server/chunks/ssr/_0ka_9elusb800._.js.map +1 -1
  599. package/web/.next/server/chunks/ssr/_0pyd1_y7w8ngp._.js +1 -1
  600. package/web/.next/server/chunks/ssr/_0pyd1_y7w8ngp._.js.map +1 -1
  601. package/web/.next/server/chunks/ssr/_0xickgbbju_9-._.js +1 -1
  602. package/web/.next/server/chunks/ssr/_0xickgbbju_9-._.js.map +1 -1
  603. package/web/.next/server/chunks/ssr/_1_wav28san6dm._.js +1 -1
  604. package/web/.next/server/chunks/ssr/_1cnvrfjlqx00k._.js +3 -0
  605. package/web/.next/server/chunks/ssr/_1cnvrfjlqx00k._.js.map +1 -0
  606. package/web/.next/server/chunks/ssr/{_0bhvvyz0q_0ja._.js → _1e2o809f0ekry._.js} +2 -2
  607. package/web/.next/server/chunks/ssr/_1pjtire7rqla0._.js +1 -1
  608. package/web/.next/server/chunks/ssr/_1pjtire7rqla0._.js.map +1 -1
  609. package/web/.next/server/chunks/ssr/_1qbsmlji34yph._.js +1 -1
  610. package/web/.next/server/chunks/ssr/_1qbsmlji34yph._.js.map +1 -1
  611. package/web/.next/server/chunks/ssr/_1yqu7dcxs2-so._.js +3 -0
  612. package/web/.next/server/chunks/ssr/_1yqu7dcxs2-so._.js.map +1 -0
  613. package/web/.next/server/chunks/ssr/node_modules_0ettht2so2tkh._.js +3 -0
  614. package/web/.next/server/chunks/ssr/node_modules_0ettht2so2tkh._.js.map +1 -0
  615. package/web/.next/server/chunks/ssr/node_modules_0keape0zsobyj._.js +3 -0
  616. package/web/.next/server/chunks/ssr/node_modules_0keape0zsobyj._.js.map +1 -0
  617. package/web/.next/server/chunks/ssr/node_modules_@base-ui_0jlwmxa9rk8p_._.js +3 -0
  618. package/web/.next/server/chunks/ssr/node_modules_@base-ui_0jlwmxa9rk8p_._.js.map +1 -0
  619. package/web/.next/server/chunks/ssr/node_modules_@base-ui_19e_nxxf4a88q._.js +3 -0
  620. package/web/.next/server/chunks/ssr/node_modules_@base-ui_19e_nxxf4a88q._.js.map +1 -0
  621. package/web/.next/server/chunks/ssr/node_modules_@base-ui_react_1lbvjrzg8s2ox._.js +3 -0
  622. package/web/.next/server/chunks/ssr/node_modules_@base-ui_react_1lbvjrzg8s2ox._.js.map +1 -0
  623. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_00i8qu9x65r6w.js +3 -0
  624. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_00i8qu9x65r6w.js.map +1 -0
  625. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_045k03anc7fhh.js +3 -0
  626. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_045k03anc7fhh.js.map +1 -0
  627. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0a3qpq0qt_bi4.js +3 -0
  628. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0a3qpq0qt_bi4.js.map +1 -0
  629. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0tpm7qi6un9x2.js +3 -0
  630. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0tpm7qi6un9x2.js.map +1 -0
  631. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0uyk6p-2ofqw3.js +3 -0
  632. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0uyk6p-2ofqw3.js.map +1 -0
  633. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0w8e__21f7qvg.js +3 -0
  634. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0w8e__21f7qvg.js.map +1 -0
  635. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0ynno0usi0bwx.js +3 -0
  636. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0ynno0usi0bwx.js.map +1 -0
  637. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0za9__u5ytp2s.js +3 -0
  638. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0za9__u5ytp2s.js.map +1 -0
  639. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0zyzdu1detzlm.js +3 -0
  640. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0zyzdu1detzlm.js.map +1 -0
  641. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_11t1sej48_ec4.js +3 -0
  642. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_11t1sej48_ec4.js.map +1 -0
  643. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_128zox167vtjm.js +3 -0
  644. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_128zox167vtjm.js.map +1 -0
  645. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_18uz1icr303zj.js +3 -0
  646. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_18uz1icr303zj.js.map +1 -0
  647. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_19_qkbe8796m6.js +3 -0
  648. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_19_qkbe8796m6.js.map +1 -0
  649. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_19uoij8es9z19.js +3 -0
  650. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_19uoij8es9z19.js.map +1 -0
  651. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1auju5fur8z6x.js +3 -0
  652. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1auju5fur8z6x.js.map +1 -0
  653. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1c7_m2ii9lash.js +3 -0
  654. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1c7_m2ii9lash.js.map +1 -0
  655. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1chb4qpzj_l1t.js +3 -0
  656. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1chb4qpzj_l1t.js.map +1 -0
  657. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1qa52eylhjmki.js +3 -0
  658. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1qa52eylhjmki.js.map +1 -0
  659. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1qw59-auzd_zx.js +3 -0
  660. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1qw59-auzd_zx.js.map +1 -0
  661. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1xzq9xckazj3u.js +3 -0
  662. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1xzq9xckazj3u.js.map +1 -0
  663. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1yis85alzg6hk.js +3 -0
  664. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1yis85alzg6hk.js.map +1 -0
  665. package/web/.next/server/chunks/ssr/web_00e7-_y92losl._.js +3 -0
  666. package/web/.next/server/chunks/ssr/web_00e7-_y92losl._.js.map +1 -0
  667. package/web/.next/server/chunks/ssr/web_09rcfto3dw4wd._.js +3 -0
  668. package/web/.next/server/chunks/ssr/web_09rcfto3dw4wd._.js.map +1 -0
  669. package/web/.next/server/chunks/ssr/web_0plvx3c_1cozb._.js +3 -0
  670. package/web/.next/server/chunks/ssr/web_0plvx3c_1cozb._.js.map +1 -0
  671. package/web/.next/server/chunks/ssr/web_0qgev3ti257yj._.js +3 -0
  672. package/web/.next/server/chunks/ssr/{web_0_jk9eione6lx._.js.map → web_0qgev3ti257yj._.js.map} +1 -1
  673. package/web/.next/server/chunks/ssr/web_0wys4l6za8umr._.js +1 -1
  674. package/web/.next/server/chunks/ssr/web_0wys4l6za8umr._.js.map +1 -1
  675. package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_overview_page_actions_18on1ziyg1nzy.js +1 -1
  676. package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_overview_page_actions_18on1ziyg1nzy.js.map +1 -1
  677. package/web/.next/server/chunks/ssr/web_app_(console)_slack_page_tsx_0ts7fo7pqicq6._.js +3 -0
  678. package/web/.next/server/chunks/ssr/web_app_(console)_slack_page_tsx_0ts7fo7pqicq6._.js.map +1 -0
  679. package/web/.next/server/chunks/ssr/web_app_(console)_slack_remove_page_tsx_15q4ril_on0ed._.js +3 -0
  680. package/web/.next/server/chunks/ssr/web_app_(console)_slack_remove_page_tsx_15q4ril_on0ed._.js.map +1 -0
  681. package/web/.next/server/chunks/ssr/web_features_077oo3gzcibvf._.js +3 -0
  682. package/web/.next/server/chunks/ssr/web_features_077oo3gzcibvf._.js.map +1 -0
  683. package/web/.next/server/chunks/ssr/web_features_08yw0utky5j17._.js +3 -0
  684. package/web/.next/server/chunks/ssr/{web_features_19v3mlx8c_h1-._.js.map → web_features_08yw0utky5j17._.js.map} +1 -1
  685. package/web/.next/server/chunks/ssr/web_features_0d48z2epb6oie._.js +3 -0
  686. package/web/.next/server/chunks/ssr/web_features_0d48z2epb6oie._.js.map +1 -0
  687. package/web/.next/server/chunks/ssr/web_features_0f6r-m-dq36vf._.js +3 -0
  688. package/web/.next/server/chunks/ssr/web_features_0f6r-m-dq36vf._.js.map +1 -0
  689. package/web/.next/server/chunks/ssr/web_features_0mi9a9pdzkdji._.js +3 -0
  690. package/web/.next/server/chunks/ssr/web_features_0mi9a9pdzkdji._.js.map +1 -0
  691. package/web/.next/server/chunks/ssr/web_features_0rd6357w-eo50._.js +3 -0
  692. package/web/.next/server/chunks/ssr/web_features_0rd6357w-eo50._.js.map +1 -0
  693. package/web/.next/server/chunks/ssr/web_features_19r68thirqv1n._.js +3 -0
  694. package/web/.next/server/chunks/ssr/web_features_19r68thirqv1n._.js.map +1 -0
  695. package/web/.next/server/chunks/ssr/web_features_1m5g9a6mwrsd-._.js +3 -0
  696. package/web/.next/server/chunks/ssr/{web_features_085cv0gogrxxf._.js.map → web_features_1m5g9a6mwrsd-._.js.map} +1 -1
  697. package/web/.next/server/chunks/ssr/web_features_1utnezwv0xr-l._.js +3 -0
  698. package/web/.next/server/chunks/ssr/web_features_1utnezwv0xr-l._.js.map +1 -0
  699. package/web/.next/server/chunks/ssr/web_features_add-a2a-agent_ui_a2a-agent-form_tsx_0z8t1aalwzyl7._.js +1 -1
  700. package/web/.next/server/chunks/ssr/web_features_add-a2a-agent_ui_a2a-agent-form_tsx_0z8t1aalwzyl7._.js.map +1 -1
  701. package/web/.next/server/chunks/ssr/web_features_add-a2a-client_ui_a2a-client-form_tsx_1anv88g385nwe._.js +1 -1
  702. package/web/.next/server/chunks/ssr/web_features_add-a2a-client_ui_a2a-client-form_tsx_1anv88g385nwe._.js.map +1 -1
  703. package/web/.next/server/chunks/ssr/web_features_add-server_ui_add-server_tsx_1jnmar5xju49k._.js +1 -1
  704. package/web/.next/server/chunks/ssr/web_features_add-server_ui_add-server_tsx_1jnmar5xju49k._.js.map +1 -1
  705. package/web/.next/server/chunks/ssr/{web_features_forms_1d1jyea2jni9o._.js → web_features_forms_1muc8tmsxjj_k._.js} +2 -2
  706. package/web/.next/server/chunks/ssr/{web_features_forms_1d1jyea2jni9o._.js.map → web_features_forms_1muc8tmsxjj_k._.js.map} +1 -1
  707. package/web/.next/server/chunks/ssr/web_features_forms_ui_credential-fields_tsx_0l-w19zg-7x4b._.js +1 -1
  708. package/web/.next/server/chunks/ssr/web_features_forms_ui_credential-fields_tsx_0l-w19zg-7x4b._.js.map +1 -1
  709. package/web/.next/server/chunks/ssr/web_features_frame_ui_gateway-header_tsx_0e9tekx4jf7ng._.js +1 -1
  710. package/web/.next/server/chunks/ssr/web_features_frame_ui_gateway-header_tsx_0e9tekx4jf7ng._.js.map +1 -1
  711. package/web/.next/server/chunks/ssr/web_features_meeting_state_meeting-controls_tsx_12g4kzk2mbvvz._.js +1 -1
  712. package/web/.next/server/chunks/ssr/web_features_meeting_state_meeting-controls_tsx_12g4kzk2mbvvz._.js.map +1 -1
  713. package/web/.next/server/chunks/ssr/web_features_outside-parties_ui_switch-card_tsx_1_xnu9bm4tc-_._.js +1 -1
  714. package/web/.next/server/chunks/ssr/web_features_outside-parties_ui_switch-card_tsx_1_xnu9bm4tc-_._.js.map +1 -1
  715. package/web/.next/server/chunks/ssr/web_features_outside-party_1-lre9nfakki7._.js +3 -0
  716. package/web/.next/server/chunks/ssr/web_features_outside-party_1-lre9nfakki7._.js.map +1 -0
  717. package/web/.next/server/chunks/ssr/web_features_outside-party_actions_ts_102ar5pdowf8s._.js +1 -1
  718. package/web/.next/server/chunks/ssr/web_features_outside-party_actions_ts_102ar5pdowf8s._.js.map +1 -1
  719. package/web/.next/server/chunks/ssr/web_features_overview_144fx4a-r9_wn._.js +3 -0
  720. package/web/.next/server/chunks/ssr/web_features_overview_144fx4a-r9_wn._.js.map +1 -0
  721. package/web/.next/server/chunks/ssr/web_features_overview_hooks_overview-actions_ts_0-wrat07d1y5g._.js +1 -1
  722. package/web/.next/server/chunks/ssr/web_features_overview_hooks_overview-actions_ts_0-wrat07d1y5g._.js.map +1 -1
  723. package/web/.next/server/chunks/ssr/web_features_overview_state_00l0wkgvv9y6j._.js +3 -0
  724. package/web/.next/server/chunks/ssr/web_features_overview_state_00l0wkgvv9y6j._.js.map +1 -0
  725. package/web/.next/server/chunks/ssr/web_features_overview_state_decision-panel_tsx_0kpd26ggtr6h_._.js +1 -1
  726. package/web/.next/server/chunks/ssr/web_features_overview_state_decision-panel_tsx_0kpd26ggtr6h_._.js.map +1 -1
  727. package/web/.next/server/chunks/ssr/web_features_parties_actions_ts_0r-tbfsig2ty-._.js +1 -1
  728. package/web/.next/server/chunks/ssr/web_features_slack_actions_ts_1l3yg9vl20_vu._.js +3 -0
  729. package/web/.next/server/chunks/ssr/web_features_slack_actions_ts_1l3yg9vl20_vu._.js.map +1 -0
  730. package/web/.next/server/chunks/web__next-internal_server_app_(console)_slack_link_route_actions_16zgisics858w.js +3 -0
  731. package/web/.next/server/chunks/web__next-internal_server_app_(console)_slack_link_route_actions_16zgisics858w.js.map +1 -0
  732. package/web/.next/server/chunks/web__next-internal_server_app_apple-icon_png_route_actions_1yyo-ix0n2rsy.js +3 -0
  733. package/web/.next/server/chunks/web__next-internal_server_app_apple-icon_png_route_actions_1yyo-ix0n2rsy.js.map +1 -0
  734. package/web/.next/server/chunks/web__next-internal_server_app_icon_svg_route_actions_0xhoz0ftyz5p3.js +3 -0
  735. package/web/.next/server/chunks/web__next-internal_server_app_icon_svg_route_actions_0xhoz0ftyz5p3.js.map +1 -0
  736. package/web/.next/server/middleware-build-manifest.js +51 -3
  737. package/web/.next/server/next-font-manifest.js +1 -1
  738. package/web/.next/server/next-font-manifest.json +16 -0
  739. package/web/.next/server/pages/500.html +1 -1
  740. package/web/.next/server/preview-props.json +3 -3
  741. package/web/.next/server/server-reference-manifest.js +1 -1
  742. package/web/.next/server/server-reference-manifest.json +264 -30
  743. package/web/.next/static/chunks/015ume9uk4hla.js +1 -0
  744. package/web/.next/static/chunks/0ji7rkz0ll9gh.js +1 -0
  745. package/web/.next/static/chunks/0nhopjmnw_dqt.js +1 -0
  746. package/web/.next/static/chunks/0psup8zn8e6k5.js +1 -0
  747. package/web/.next/static/chunks/0vlawcs6_kjs1.js +1 -0
  748. package/web/.next/static/chunks/0zbcy0_3jemrv.js +1 -0
  749. package/web/.next/static/chunks/1s8b8jpg4jai9.js +1 -0
  750. package/web/.next/static/chunks/20t1nmdiq805b.js +1 -0
  751. package/web/.next/static/chunks/26vlpatu47xtw.css +3 -0
  752. package/web/.next/static/chunks/2gghdkr64z9f9.js +1 -0
  753. package/web/.next/static/chunks/2s_dov6h7kus5.js +1 -0
  754. package/web/.next/static/chunks/{1jvae6c-4jwji.js → 2x86i673xcv4t.js} +1 -1
  755. package/web/.next/static/chunks/{1tgs1j0j-1qlh.js → 31-hltzmw_9fi.js} +1 -1
  756. package/web/.next/static/chunks/35bmc8wm29tr6.js +1 -0
  757. package/web/.next/static/chunks/3hvo3apdq-ckk.js +1 -0
  758. package/web/.next/static/chunks/3rxg2mdhxd6yt.js +1 -0
  759. package/web/.next/static/chunks/42cpzi5s1o44m.js +1 -0
  760. package/web/.next/static/media/apple-icon.3jccaq3p5-lh-.png +0 -0
  761. package/web/.next/static/media/icon.0h5hy2etdmq_n.svg +19 -0
  762. package/web/.next/trace +1 -1
  763. package/web/.next/trace-build +1 -1
  764. package/web/.next/types/routes.d.ts +7 -2
  765. package/web/.next/types/validator.ts +78 -0
  766. package/web/.next/server/chunks/[root-of-the-server]__0ykc8bq_c06a1._.js +0 -369
  767. package/web/.next/server/chunks/[root-of-the-server]__0ykc8bq_c06a1._.js.map +0 -1
  768. package/web/.next/server/chunks/ssr/[root-of-the-server]__00erqdm9cmhh7._.js +0 -3
  769. package/web/.next/server/chunks/ssr/[root-of-the-server]__00erqdm9cmhh7._.js.map +0 -1
  770. package/web/.next/server/chunks/ssr/[root-of-the-server]__00q22dte1g2ww._.js +0 -3
  771. package/web/.next/server/chunks/ssr/[root-of-the-server]__00q22dte1g2ww._.js.map +0 -1
  772. package/web/.next/server/chunks/ssr/[root-of-the-server]__07udzu2zwg_74._.js +0 -3
  773. package/web/.next/server/chunks/ssr/[root-of-the-server]__07udzu2zwg_74._.js.map +0 -1
  774. package/web/.next/server/chunks/ssr/[root-of-the-server]__0a68v9ynev4q6._.js +0 -3
  775. package/web/.next/server/chunks/ssr/[root-of-the-server]__0a68v9ynev4q6._.js.map +0 -1
  776. package/web/.next/server/chunks/ssr/[root-of-the-server]__0l2_dk9d4o01n._.js +0 -3
  777. package/web/.next/server/chunks/ssr/[root-of-the-server]__0l2_dk9d4o01n._.js.map +0 -1
  778. package/web/.next/server/chunks/ssr/[root-of-the-server]__0n2us07jk-78w._.js +0 -4
  779. package/web/.next/server/chunks/ssr/[root-of-the-server]__0n2us07jk-78w._.js.map +0 -1
  780. package/web/.next/server/chunks/ssr/[root-of-the-server]__0rr5u24i9tjyc._.js +0 -3
  781. package/web/.next/server/chunks/ssr/[root-of-the-server]__0rr5u24i9tjyc._.js.map +0 -1
  782. package/web/.next/server/chunks/ssr/[root-of-the-server]__1-c9wugbbwsp3._.js +0 -4
  783. package/web/.next/server/chunks/ssr/[root-of-the-server]__1-c9wugbbwsp3._.js.map +0 -1
  784. package/web/.next/server/chunks/ssr/[root-of-the-server]__10y66e1xx8xiq._.js +0 -3
  785. package/web/.next/server/chunks/ssr/[root-of-the-server]__10y66e1xx8xiq._.js.map +0 -1
  786. package/web/.next/server/chunks/ssr/[root-of-the-server]__14w0fxvc_of17._.js.map +0 -1
  787. package/web/.next/server/chunks/ssr/[root-of-the-server]__160zc0ja_jjnu._.js.map +0 -1
  788. package/web/.next/server/chunks/ssr/[root-of-the-server]__1dc6okf5os70a._.js +0 -3
  789. package/web/.next/server/chunks/ssr/[root-of-the-server]__1dc6okf5os70a._.js.map +0 -1
  790. package/web/.next/server/chunks/ssr/[root-of-the-server]__1dtyycvqa6uht._.js +0 -4
  791. package/web/.next/server/chunks/ssr/[root-of-the-server]__1dtyycvqa6uht._.js.map +0 -1
  792. package/web/.next/server/chunks/ssr/[root-of-the-server]__1n_sq_58wdluh._.js +0 -3
  793. package/web/.next/server/chunks/ssr/[root-of-the-server]__1n_sq_58wdluh._.js.map +0 -1
  794. package/web/.next/server/chunks/ssr/[root-of-the-server]__1w5swo8gmjyx6._.js.map +0 -1
  795. package/web/.next/server/chunks/ssr/_00dg5cvqofspn._.js +0 -3
  796. package/web/.next/server/chunks/ssr/_0_kakdt7lb6z-._.js +0 -3
  797. package/web/.next/server/chunks/ssr/_0_kakdt7lb6z-._.js.map +0 -1
  798. package/web/.next/server/chunks/ssr/_0w2ptjht34s6t._.js +0 -3
  799. package/web/.next/server/chunks/ssr/_1uuy6gkkhq6bx._.js +0 -3
  800. package/web/.next/server/chunks/ssr/_1uuy6gkkhq6bx._.js.map +0 -1
  801. package/web/.next/server/chunks/ssr/_1y1ovmdhl9_ml._.js +0 -3
  802. package/web/.next/server/chunks/ssr/_1y1ovmdhl9_ml._.js.map +0 -1
  803. package/web/.next/server/chunks/ssr/node_modules_07sxnbglqc5q9._.js +0 -3
  804. package/web/.next/server/chunks/ssr/node_modules_07sxnbglqc5q9._.js.map +0 -1
  805. package/web/.next/server/chunks/ssr/node_modules_0qlo87g8tugr4._.js +0 -3
  806. package/web/.next/server/chunks/ssr/node_modules_0qlo87g8tugr4._.js.map +0 -1
  807. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_06etuymo2azrg.js +0 -3
  808. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_06etuymo2azrg.js.map +0 -1
  809. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_08lcy-jnk5o43.js +0 -3
  810. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_08lcy-jnk5o43.js.map +0 -1
  811. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0bnypafopxsfl.js +0 -3
  812. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0bnypafopxsfl.js.map +0 -1
  813. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0e8cobt3o_8ur.js +0 -3
  814. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0e8cobt3o_8ur.js.map +0 -1
  815. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0gzed-epom5si.js +0 -3
  816. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0gzed-epom5si.js.map +0 -1
  817. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0k0-b63ptvbl5.js +0 -3
  818. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0k0-b63ptvbl5.js.map +0 -1
  819. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0pik0g65vv-wi.js +0 -3
  820. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0pik0g65vv-wi.js.map +0 -1
  821. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0xccr6d8xcb1p.js +0 -3
  822. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0xccr6d8xcb1p.js.map +0 -1
  823. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_13agc620bnznv.js +0 -3
  824. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_13agc620bnznv.js.map +0 -1
  825. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_184-gj4lz41i-.js +0 -3
  826. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_184-gj4lz41i-.js.map +0 -1
  827. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_18gq8l27vkevg.js +0 -3
  828. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_18gq8l27vkevg.js.map +0 -1
  829. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1bt2ioufqh6fl.js +0 -3
  830. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1bt2ioufqh6fl.js.map +0 -1
  831. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1d613l6zsee_e.js +0 -3
  832. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1d613l6zsee_e.js.map +0 -1
  833. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1o0-ipfysjmro.js +0 -3
  834. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1o0-ipfysjmro.js.map +0 -1
  835. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1s46s8vlfx01v.js +0 -3
  836. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1s46s8vlfx01v.js.map +0 -1
  837. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1x-0vplt44lez.js +0 -3
  838. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1x-0vplt44lez.js.map +0 -1
  839. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_20d8hq6wsqwh_.js +0 -3
  840. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_20d8hq6wsqwh_.js.map +0 -1
  841. package/web/.next/server/chunks/ssr/web_0-ufi2al5ubig._.js +0 -3
  842. package/web/.next/server/chunks/ssr/web_0-ufi2al5ubig._.js.map +0 -1
  843. package/web/.next/server/chunks/ssr/web_0_jk9eione6lx._.js +0 -3
  844. package/web/.next/server/chunks/ssr/web_1wcpaty_bz55q._.js +0 -3
  845. package/web/.next/server/chunks/ssr/web_1wcpaty_bz55q._.js.map +0 -1
  846. package/web/.next/server/chunks/ssr/web_features_085cv0gogrxxf._.js +0 -3
  847. package/web/.next/server/chunks/ssr/web_features_0xbnkk4hfgr9v._.js +0 -3
  848. package/web/.next/server/chunks/ssr/web_features_0xbnkk4hfgr9v._.js.map +0 -1
  849. package/web/.next/server/chunks/ssr/web_features_0xnlgtw8bfqaa._.js +0 -3
  850. package/web/.next/server/chunks/ssr/web_features_0xnlgtw8bfqaa._.js.map +0 -1
  851. package/web/.next/server/chunks/ssr/web_features_10xz3ojtvfi7h._.js +0 -3
  852. package/web/.next/server/chunks/ssr/web_features_10xz3ojtvfi7h._.js.map +0 -1
  853. package/web/.next/server/chunks/ssr/web_features_19v3mlx8c_h1-._.js +0 -3
  854. package/web/.next/server/chunks/ssr/web_features_1_2m6l73qk7qw._.js +0 -3
  855. package/web/.next/server/chunks/ssr/web_features_1_2m6l73qk7qw._.js.map +0 -1
  856. package/web/.next/server/chunks/ssr/web_features_forms_1u0akr22eh_x_._.js +0 -3
  857. package/web/.next/server/chunks/ssr/web_features_forms_1u0akr22eh_x_._.js.map +0 -1
  858. package/web/.next/server/chunks/ssr/web_features_outside-party_0_9c27knfvw7u._.js +0 -3
  859. package/web/.next/server/chunks/ssr/web_features_outside-party_0_9c27knfvw7u._.js.map +0 -1
  860. package/web/.next/server/chunks/ssr/web_features_overview_state_1wuk95dw2_whp._.js +0 -3
  861. package/web/.next/server/chunks/ssr/web_features_overview_state_1wuk95dw2_whp._.js.map +0 -1
  862. package/web/.next/static/chunks/0ke_2_la1glwa.js +0 -1
  863. package/web/.next/static/chunks/0ul9rtulfiph6.js +0 -1
  864. package/web/.next/static/chunks/19wvmglfgof0u.js +0 -1
  865. package/web/.next/static/chunks/1yj875esaesyh.css +0 -3
  866. package/web/.next/static/chunks/2d283cu3en9cy.js +0 -1
  867. package/web/.next/static/chunks/2hj3-kl1ggnu_.js +0 -1
  868. package/web/.next/static/chunks/2i3ydqqupow_x.js +0 -1
  869. package/web/.next/static/chunks/2n4bf_2r9lysd.js +0 -1
  870. package/web/.next/static/chunks/2ngyis59r3qta.js +0 -1
  871. package/web/.next/static/chunks/2riya89_i0je8.js +0 -1
  872. package/web/.next/static/chunks/3_pwm8b3mf4mf.js +0 -1
  873. package/web/.next/static/chunks/3bl-e3zhidrrz.js +0 -1
  874. package/web/.next/static/chunks/3x_8doukmdfpu.js +0 -1
  875. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__1gb-3dttuacyz._.js.map → [root-of-the-server]__0y0jwufd7xjsv._.js.map} +0 -0
  876. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__1m9atpy0vkbmj._.js.map → [root-of-the-server]__19ecatcacd6t9._.js.map} +0 -0
  877. /package/web/.next/server/chunks/ssr/{_0bhvvyz0q_0ja._.js.map → _1e2o809f0ekry._.js.map} +0 -0
  878. /package/web/.next/static/{tQFXrUWi6vEZq4Cp-U5tk → yf1Q3fTAV4eQiroxoYbih}/_buildManifest.js +0 -0
  879. /package/web/.next/static/{tQFXrUWi6vEZq4Cp-U5tk → yf1Q3fTAV4eQiroxoYbih}/_clientMiddlewareManifest.js +0 -0
  880. /package/web/.next/static/{tQFXrUWi6vEZq4Cp-U5tk → yf1Q3fTAV4eQiroxoYbih}/_ssgManifest.js +0 -0
@@ -1,3 +0,0 @@
1
- module.exports=[[4825,a=>{var b=a.i(7997),c=a.i(717),d=a.i(66283),e=a.i(10351),f=a.i(22126),g=a.i(67395);function h({waiting:a,toDecide:c}){if(void 0===a&&void 0===c)return(0,b.jsx)("h1",{className:"text-heading font-semibold",children:"Nothing waits on you"});let d=(a??0)+(c??0),e=[void 0===a?void 0:`${String(a)} for you`,void 0===c?void 0:`${String(c)} to decide`].filter(a=>void 0!==a);return(0,b.jsxs)("div",{className:"flex items-center gap-4",children:[(0,b.jsx)("span",{"data-testid":"overview-total",className:"inline-flex size-12 items-center justify-center rounded-full border-4 border-tone-waiting-border text-section font-semibold",children:d}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-heading font-semibold",children:0===d?"Nothing waits on you":"Waits on you"}),(0,b.jsx)("p",{className:"text-muted-foreground",children:e.join(" · ")})]})]})}function i({width:a}){return(0,b.jsx)("span",{className:`block h-4 animate-pulse rounded bg-muted ${a}`})}function j(){return(0,b.jsxs)("div",{"aria-busy":"true","aria-label":"Loading the Overview",className:"grid gap-6",children:[(0,b.jsxs)("div",{className:"flex items-center gap-4",children:[(0,b.jsx)("span",{className:"size-12 animate-pulse rounded-full bg-muted"}),(0,b.jsxs)("div",{className:"grid flex-1 gap-2",children:[(0,b.jsx)(i,{width:"w-48"}),(0,b.jsx)(i,{width:"w-32"})]})]}),(0,b.jsx)("div",{className:"grid gap-2",children:["a","b","c"].map(a=>(0,b.jsx)("span",{className:"block h-14 animate-pulse rounded-md bg-muted"},a))})]})}var k=a.i(65044),l=a.i(78942),m=a.i(20285),n=a.i(40623);let o={approve:"You approved the request.",deny:"You denied the request."};async function p({api:a,fleetId:c}){let{inbox:d,wakeChannels:f,toDecide:g,mine:i}=await (0,e.m)(a),j=new Date;return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(h,{waiting:d?.waiting,toDecide:g?.length}),void 0===d?null:(0,b.jsx)(l.InboxPanel,{fleetId:c,inbox:d}),void 0===f?null:(0,b.jsx)(n.WakePanel,{fleetId:c,channels:f}),void 0===g?null:0===g.length?(0,b.jsx)("p",{className:"text-muted-foreground",children:"No request waits for a decision."}):(0,b.jsx)(k.f,{title:"To decide",requests:g,now:j,hrefOf:a=>`/overview/requests/${encodeURIComponent(a.requestId)}?fleet=${encodeURIComponent(c)}`}),void 0===i||0===i.length?null:(0,b.jsx)(k.f,{title:"Your requests",requests:i,now:j})]})}async function q({searchParams:a}){let h=await (0,d._)({path:e.K,searchParams:a});if("noSignIn"===h.kind)return(0,b.jsx)(f.f,{});let{decided:i}=a,k="string"==typeof i?o[i]:void 0;return(0,b.jsxs)("div",{className:"grid gap-6",children:[(0,b.jsx)(m.LiveRefresh,{fleetId:h.fleetId}),void 0===k?null:(0,b.jsx)(g.f,{message:k,isFailure:!1}),(0,b.jsx)(c.Suspense,{fallback:(0,b.jsx)(j,{}),children:(0,b.jsx)(p,{api:h.api,fleetId:h.fleetId})})]})}async function r({searchParams:a}){return(0,b.jsx)(q,{searchParams:await a})}a.s(["default",0,r,"metadata",0,{title:"Overview"}],4825)},73315,a=>{let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call InboxPanel() from the server but InboxPanel is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/web/features/overview/state/inbox-panel.tsx","InboxPanel");a.s(["InboxPanel",0,b])},78942,a=>{var b=a.i(73315);a.n(b)},8077,a=>{let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call WakePanel() from the server but WakePanel is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/web/features/overview/state/wake-panel.tsx","WakePanel");a.s(["WakePanel",0,b])},40623,a=>{var b=a.i(8077);a.n(b)}],15360,function(a){a.n(a.i(4825))}];
2
-
3
- //# sourceMappingURL=web_0-ufi2al5ubig._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../web/features/overview/state/overview.tsx","../../../../../web/features/overview/ui/overview-lead.tsx","../../../../../web/features/overview/ui/overview-skeleton.tsx","../../../../../web/app/%28console%29/overview/page.tsx","../../../../../web/features/overview/state/inbox-panel.tsx/__nextjs-internal-proxy.mjs%20%7B%20server%20%3D%3E%20%22%5Bproject%5D/web/features/overview/state/inbox-panel.tsx%22%20%7D","../../../../../web/features/overview/state/wake-panel.tsx/__nextjs-internal-proxy.mjs%20%7B%20server%20%3D%3E%20%22%5Bproject%5D/web/features/overview/state/wake-panel.tsx%22%20%7D"],"sourcesContent":["import { Suspense } from 'react';\n\nimport type { GatewayApi } from '../../../lib/gateway-api/gateway-api';\nimport { signedInPage, type SearchParams } from '../../../lib/gateway-api/page-api';\nimport { OVERVIEW_PATH, readOverview } from '../hooks/read-overview';\nimport { NoSignIn } from '../../sign-in/ui/no-sign-in';\nimport { Notice } from '../ui/notice';\nimport { OverviewLead } from '../ui/overview-lead';\nimport { OverviewSkeleton } from '../ui/overview-skeleton';\nimport { RequestsList } from '../ui/requests-list';\nimport { InboxPanel } from './inbox-panel';\nimport { LiveRefresh } from './live-refresh';\nimport { WakePanel } from './wake-panel';\n\n/** What a decision the person just made came to, said once they are back. */\nconst DECIDED: Record<string, string> = {\n approve: 'You approved the request.',\n deny: 'You denied the request.',\n};\n\nasync function OverviewParts({ api, fleetId }: { api: GatewayApi; fleetId: string }) {\n const { inbox, wakeChannels, toDecide, mine } = await readOverview(api);\n const now = new Date();\n return (\n <>\n <OverviewLead waiting={inbox?.waiting} toDecide={toDecide?.length} />\n {inbox === undefined ? null : <InboxPanel fleetId={fleetId} inbox={inbox} />}\n {wakeChannels === undefined ? null : <WakePanel fleetId={fleetId} channels={wakeChannels} />}\n {toDecide === undefined ? null : toDecide.length === 0 ? (\n <p className=\"text-muted-foreground\">No request waits for a decision.</p>\n ) : (\n <RequestsList title=\"To decide\" requests={toDecide} now={now} hrefOf={(request) => `/overview/requests/${encodeURIComponent(request.requestId)}?fleet=${encodeURIComponent(fleetId)}`} />\n )}\n {mine === undefined || mine.length === 0 ? null : <RequestsList title=\"Your requests\" requests={mine} now={now} />}\n </>\n );\n}\n\n/**\n * The Overview (design B, Signal): what waits on the person, their inbox\n * and the channels that wake them, the requests to decide for an approver,\n * oldest first, and the requests they asked. Signed out, the browser goes to sign in before anything shows;\n * signed in, the shape shows while the parts load. It reads itself again\n * whenever the fleet's requests change.\n */\nexport async function Overview({ searchParams }: { searchParams: SearchParams }) {\n const page = await signedInPage({ path: OVERVIEW_PATH, searchParams });\n if (page.kind === 'noSignIn') {\n return <NoSignIn />;\n }\n const { decided } = searchParams;\n const said = typeof decided === 'string' ? DECIDED[decided] : undefined;\n return (\n <div className=\"grid gap-6\">\n <LiveRefresh fleetId={page.fleetId} />\n {said === undefined ? null : <Notice message={said} isFailure={false} />}\n <Suspense fallback={<OverviewSkeleton />}>\n <OverviewParts api={page.api} fleetId={page.fleetId} />\n </Suspense>\n </div>\n );\n}\n","/**\n * What waits on the person, counted: deliveries for them and requests to\n * decide. A count they have no part in is left out; with neither, nothing\n * waits on them.\n */\nexport function OverviewLead({ waiting, toDecide }: { waiting: number | undefined; toDecide: number | undefined }) {\n if (waiting === undefined && toDecide === undefined) {\n return <h1 className=\"text-heading font-semibold\">Nothing waits on you</h1>;\n }\n const total = (waiting ?? 0) + (toDecide ?? 0);\n const counts = [waiting === undefined ? undefined : `${String(waiting)} for you`, toDecide === undefined ? undefined : `${String(toDecide)} to decide`].filter((count) => count !== undefined);\n return (\n <div className=\"flex items-center gap-4\">\n <span data-testid=\"overview-total\" className=\"inline-flex size-12 items-center justify-center rounded-full border-4 border-tone-waiting-border text-section font-semibold\">\n {total}\n </span>\n <div>\n <h1 className=\"text-heading font-semibold\">{total === 0 ? 'Nothing waits on you' : 'Waits on you'}</h1>\n <p className=\"text-muted-foreground\">{counts.join(' · ')}</p>\n </div>\n </div>\n );\n}\n","function Bar({ width }: { width: string }) {\n return <span className={`block h-4 animate-pulse rounded bg-muted ${width}`} />;\n}\n\n/** The Overview's shape while it loads: the lead, then a list. */\nexport function OverviewSkeleton() {\n return (\n <div aria-busy=\"true\" aria-label=\"Loading the Overview\" className=\"grid gap-6\">\n <div className=\"flex items-center gap-4\">\n <span className=\"size-12 animate-pulse rounded-full bg-muted\" />\n <div className=\"grid flex-1 gap-2\">\n <Bar width=\"w-48\" />\n <Bar width=\"w-32\" />\n </div>\n </div>\n <div className=\"grid gap-2\">\n {['a', 'b', 'c'].map((row) => (\n <span key={row} className=\"block h-14 animate-pulse rounded-md bg-muted\" />\n ))}\n </div>\n </div>\n );\n}\n","import type { Metadata } from 'next';\n\nimport { Overview } from '../../../features/overview/state/overview';\nimport type { SearchParams } from '../../../lib/gateway-api/page-api';\n\nexport const metadata: Metadata = { title: 'Overview' };\n\nexport default async function OverviewPage({ searchParams }: { searchParams: Promise<SearchParams> }) {\n return <Overview searchParams={await searchParams} />;\n}\n","// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport const InboxPanel = registerClientReference(\n function() { throw new Error(\"Attempted to call InboxPanel() from the server but InboxPanel is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/web/features/overview/state/inbox-panel.tsx\",\n \"InboxPanel\",\n);\n","// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport const WakePanel = registerClientReference(\n function() { throw new Error(\"Attempted to call WakePanel() from the server but WakePanel is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/web/features/overview/state/wake-panel.tsx\",\n \"WakePanel\",\n);\n"],"names":["OverviewLead","waiting","toDecide","undefined","className","total","counts","String","filter","count","join","InboxPanel","Error","WakePanel"],"mappings":"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","ignoreList":[4,5]}
@@ -1,3 +0,0 @@
1
- module.exports=[[50761,a=>{var b=a.i(7997),c=a.i(48010),d=a.i(72913),e=a.i(9181),f=a.i(22126),g=a.i(55476),h=a.i(66283);async function i({searchParams:a}){let j=await (0,h._)({path:d.y,searchParams:await a});return"noSignIn"===j.kind?(0,b.jsx)(f.f,{}):(0,b.jsxs)("div",{className:"grid gap-4",children:[(0,b.jsx)("a",{href:(0,g.i)(d.$,j.fleetId),className:"text-muted-foreground hover:text-foreground",children:"← Outside parties"}),(0,b.jsx)(c.AddServer,{fleetId:j.fleetId,canSwitchTools:j.scopes.includes(e.N)})]})}a.s(["default",0,i,"metadata",0,{title:"Add MCP server"}])},63274,a=>{let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call AddServer() from the server but AddServer is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/web/features/add-server/ui/add-server.tsx","AddServer");a.s(["AddServer",0,b])},48010,a=>{var b=a.i(63274);a.n(b)},49144,a=>{let b="inline-flex h-9 items-center justify-center gap-2 rounded-md px-4 font-medium disabled:opacity-60",c={primary:`${b} bg-primary text-primary-foreground hover:bg-primary-hover`,secondary:`${b} border border-border bg-card hover:bg-accent`,destructive:`${b} bg-destructive text-destructive-foreground`};a.s(["x",0,c,"r",0,"rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm","w",0,"h-9 w-full rounded-md border border-input bg-background px-3 font-mono text-code","z",0,"grid gap-1"])},65253,98323,a=>{let b={mcpServer:{protocol:"MCP",side:"server"},mcpClient:{protocol:"MCP",side:"client"},a2aClient:{protocol:"A2A",side:"client"},a2aAgent:{protocol:"A2A",side:"server"}};a.s(["G",0,b,"Y",0,{commissioning:{tone:"active",label:"Commissioning"},awaitingCrew:{tone:"waiting",label:"Awaiting crew"},crewed:{tone:"ok",label:"Crewed"}},"N",0,{server:{one:"server",many:"servers"},client:{one:"client",many:"clients"}},"R",0,function(a){let c=a.map(a=>b[a.kind]),d=[...new Set(c.map(a=>a.protocol))];return{total:a.length,sides:{server:c.filter(a=>"server"===a.side).length,client:c.filter(a=>"client"===a.side).length},protocols:d.map(a=>({protocol:a,count:c.filter(b=>b.protocol===a).length}))}},"M",0,function(a){switch(a.kind){case"mcpServer":return a.url;case"mcpClient":return a.clientId;case"a2aClient":return null;case"a2aAgent":return a.cardUrl}}],65253);var c=a.i(7997);let d={waiting:"border-tone-waiting-border bg-tone-waiting-bg text-tone-waiting-fg",active:"border-tone-active-border bg-tone-active-bg text-tone-active-fg",ok:"border-tone-ok-border bg-tone-ok-bg text-tone-ok-fg",attention:"border-tone-attention-border bg-tone-attention-bg text-tone-attention-fg",ended:"border-tone-ended-border bg-tone-ended-bg text-tone-ended-fg"};a.s(["T",0,function({tone:a,label:b}){return(0,c.jsx)("span",{className:`inline-flex items-center rounded-full border px-2 text-caption ${d[a]}`,children:b})},"E",0,function({children:a,isMono:b=!1}){return(0,c.jsx)("span",{className:`inline-flex items-center rounded-md border border-border px-2 text-caption ${b?"font-mono":""}`,children:a})}],98323)},22126,a=>{var b=a.i(7997),c=a.i(49144);a.s(["f",0,function(){return(0,b.jsxs)("section",{className:c.r,"data-testid":"no-sign-in",children:[(0,b.jsx)("h2",{className:"text-heading font-semibold",children:"Nobody signs in here"}),(0,b.jsx)("p",{className:"mt-2 text-muted-foreground",children:"This gateway signs no one in to its pages: it is no app at pagasae."})]})}])}],20996,function(a){a.n(a.i(50761))}];
2
-
3
- //# sourceMappingURL=web_0_jk9eione6lx._.js.map
@@ -1,3 +0,0 @@
1
- module.exports=[[88707,a=>{var b=a.i(7997),c=a.i(9181),d=a.i(72913),e=a.i(22126),f=a.i(66283);async function g({params:a,searchParams:h}){let{name:i}=await a,j=await (0,f._)({path:(0,d.N)(i),searchParams:await h});return"noSignIn"===j.kind?(0,b.jsx)(e.f,{}):(0,b.jsx)(c.b,{page:j,name:i})}a.s(["default",0,g,"metadata",0,{title:"Outside parties"}])},29493,a=>{let b=[{kind:"none",label:"No credential"},{kind:"bearer",label:"Bearer token"},{kind:"clientCredentials",label:"OAuth client credentials"}];a.s(["x",0,b,"y",0,function(a){var c;let d=(c=a.credentialKind,b.find(({kind:a})=>a===c)?.kind??"bearer");switch(d){case"none":return{kind:d};case"bearer":return{kind:d,token:a.token};case"clientCredentials":return{kind:d,clientId:a.clientId,clientSecret:a.clientSecret,issuer:a.issuer,...""===a.scope?{}:{scope:a.scope}}}}])},49144,a=>{let b="inline-flex h-9 items-center justify-center gap-2 rounded-md px-4 font-medium disabled:opacity-60",c={primary:`${b} bg-primary text-primary-foreground hover:bg-primary-hover`,secondary:`${b} border border-border bg-card hover:bg-accent`,destructive:`${b} bg-destructive text-destructive-foreground`};a.s(["x",0,c,"r",0,"rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm","w",0,"h-9 w-full rounded-md border border-input bg-background px-3 font-mono text-code","z",0,"grid gap-1"])},65253,98323,a=>{let b={mcpServer:{protocol:"MCP",side:"server"},mcpClient:{protocol:"MCP",side:"client"},a2aClient:{protocol:"A2A",side:"client"},a2aAgent:{protocol:"A2A",side:"server"}};a.s(["G",0,b,"Y",0,{commissioning:{tone:"active",label:"Commissioning"},awaitingCrew:{tone:"waiting",label:"Awaiting crew"},crewed:{tone:"ok",label:"Crewed"}},"N",0,{server:{one:"server",many:"servers"},client:{one:"client",many:"clients"}},"R",0,function(a){let c=a.map(a=>b[a.kind]),d=[...new Set(c.map(a=>a.protocol))];return{total:a.length,sides:{server:c.filter(a=>"server"===a.side).length,client:c.filter(a=>"client"===a.side).length},protocols:d.map(a=>({protocol:a,count:c.filter(b=>b.protocol===a).length}))}},"M",0,function(a){switch(a.kind){case"mcpServer":return a.url;case"mcpClient":return a.clientId;case"a2aClient":return null;case"a2aAgent":return a.cardUrl}}],65253);var c=a.i(7997);let d={waiting:"border-tone-waiting-border bg-tone-waiting-bg text-tone-waiting-fg",active:"border-tone-active-border bg-tone-active-bg text-tone-active-fg",ok:"border-tone-ok-border bg-tone-ok-bg text-tone-ok-fg",attention:"border-tone-attention-border bg-tone-attention-bg text-tone-attention-fg",ended:"border-tone-ended-border bg-tone-ended-bg text-tone-ended-fg"};a.s(["T",0,function({tone:a,label:b}){return(0,c.jsx)("span",{className:`inline-flex items-center rounded-full border px-2 text-caption ${d[a]}`,children:b})},"E",0,function({children:a,isMono:b=!1}){return(0,c.jsx)("span",{className:`inline-flex items-center rounded-md border border-border px-2 text-caption ${b?"font-mono":""}`,children:a})}],98323)},22126,a=>{var b=a.i(7997),c=a.i(49144);a.s(["f",0,function(){return(0,b.jsxs)("section",{className:c.r,"data-testid":"no-sign-in",children:[(0,b.jsx)("h2",{className:"text-heading font-semibold",children:"Nobody signs in here"}),(0,b.jsx)("p",{className:"mt-2 text-muted-foreground",children:"This gateway signs no one in to its pages: it is no app at pagasae."})]})}])}],61658,function(a){a.n(a.i(88707))}];
2
-
3
- //# sourceMappingURL=web_1wcpaty_bz55q._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../web/app/%28console%29/outside-parties/%5Bname%5D/page.tsx","../../../../../web/features/forms/server-credential.ts","../../../../../web/features/forms/ui/look.ts","../../../../../web/features/outside-parties/party-kinds.ts","../../../../../web/features/outside-parties/ui/status-badge.tsx","../../../../../web/features/sign-in/ui/no-sign-in.tsx"],"sourcesContent":["import type { Metadata } from 'next';\n\nimport { OutsideParty } from '../../../../features/outside-party/ui/outside-party';\nimport { partyPath } from '../../../../features/outside-parties/paths';\nimport { NoSignIn } from '../../../../features/sign-in/ui/no-sign-in';\nimport { signedInPage, type SearchParams } from '../../../../lib/gateway-api/page-api';\n\nexport const metadata: Metadata = { title: 'Outside parties' };\n\nexport default async function OutsidePartyPage({ params, searchParams }: { params: Promise<{ name: string }>; searchParams: Promise<SearchParams> }) {\n const { name } = await params;\n const page = await signedInPage({ path: partyPath(name), searchParams: await searchParams });\n if (page.kind === 'noSignIn') {\n return <NoSignIn />;\n }\n return <OutsideParty page={page} name={name} />;\n}\n","/**\n * An outside MCP server's credential, as the add, Parties and decision forms\n * take it: none for a server reached only on a private network, a static\n * bearer, or OAuth client credentials.\n */\n\n/** The credential kinds a form offers, with the words it shows. */\nexport const CREDENTIAL_KINDS = [\n { kind: 'none', label: 'No credential' },\n { kind: 'bearer', label: 'Bearer token' },\n { kind: 'clientCredentials', label: 'OAuth client credentials' },\n] as const;\n\nexport type CredentialKind = (typeof CREDENTIAL_KINDS)[number]['kind'];\n\nexport type ServerCredential =\n | { kind: 'none' }\n | { kind: 'bearer'; token: string }\n | { kind: 'clientCredentials'; clientId: string; clientSecret: string; issuer: string; scope?: string };\n\n/** The kind a form sent, a bearer when it sent none it knows. */\nexport function credentialKindOf(sent: string): CredentialKind {\n return CREDENTIAL_KINDS.find(({ kind }) => kind === sent)?.kind ?? 'bearer';\n}\n\n/** The credential the fields name: only the fields of its kind are read. */\nexport function serverCredentialOf(fields: { credentialKind: string; token: string; clientId: string; clientSecret: string; issuer: string; scope: string }): ServerCredential {\n const kind = credentialKindOf(fields.credentialKind);\n switch (kind) {\n case 'none':\n return { kind };\n case 'bearer':\n return { kind, token: fields.token };\n case 'clientCredentials':\n return { kind, clientId: fields.clientId, clientSecret: fields.clientSecret, issuer: fields.issuer, ...(fields.scope === '' ? {} : { scope: fields.scope }) };\n }\n}\n","/** The classes the pages share, on the design tokens: a card and the button kinds. */\nexport const CARD = 'rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm';\n\nconst BUTTON = 'inline-flex h-9 items-center justify-center gap-2 rounded-md px-4 font-medium disabled:opacity-60';\n\nexport const BUTTONS = {\n primary: `${BUTTON} bg-primary text-primary-foreground hover:bg-primary-hover`,\n secondary: `${BUTTON} border border-border bg-card hover:bg-accent`,\n destructive: `${BUTTON} bg-destructive text-destructive-foreground`,\n} as const;\n\nexport type ButtonKind = keyof typeof BUTTONS;\n\nexport const INPUT = 'h-9 w-full rounded-md border border-input bg-background px-3 font-mono text-code';\n\nexport const LABEL = 'grid gap-1';\n","/**\n * An outside party is a party and its protocol (design B, How A2A slots\n * in): the protocol is a tag on every card and the list counts per\n * protocol, so an A2A agent joins as one more kind here.\n */\nimport type { inferRouterOutputs } from '@trpc/server';\n\nimport type { GatewayRouter } from '../../../src/adapters/trpc/router.js';\n\n/** An outside party as the API lists it. */\nexport type ListedParty = inferRouterOutputs<GatewayRouter>['parties']['list'][number];\n\n/** Which side an outside party is on: a server the fleet's ships call, or a client that calls them. */\nexport type Side = 'server' | 'client';\n\nexport const PARTY_KINDS: Record<ListedParty['kind'], { protocol: string; side: Side }> = {\n mcpServer: { protocol: 'MCP', side: 'server' },\n mcpClient: { protocol: 'MCP', side: 'client' },\n a2aClient: { protocol: 'A2A', side: 'client' },\n a2aAgent: { protocol: 'A2A', side: 'server' },\n};\n\n/** Where a party is reached or named outside: an MCP server's URL, an MCP client's id, an A2A agent's card address; an A2A client has none. */\nexport function outsideAddressOf(party: ListedParty): string | null {\n switch (party.kind) {\n case 'mcpServer':\n return party.url;\n case 'mcpClient':\n return party.clientId;\n case 'a2aClient':\n return null;\n case 'a2aAgent':\n return party.cardUrl;\n }\n}\n\nexport const SIDES: Record<Side, { one: string; many: string }> = {\n server: { one: 'server', many: 'servers' },\n client: { one: 'client', many: 'clients' },\n};\n\n/** The tones the design tokens colour a status by. */\nexport type Tone = 'waiting' | 'active' | 'ok' | 'attention' | 'ended';\n\n/** A proxy ship's state as the console shows a status. */\nexport const PARTY_STATES: Record<ListedParty['state'], { tone: Tone; label: string }> = {\n commissioning: { tone: 'active', label: 'Commissioning' },\n awaitingCrew: { tone: 'waiting', label: 'Awaiting crew' },\n crewed: { tone: 'ok', label: 'Crewed' },\n};\n\nexport interface Counts {\n total: number;\n sides: Record<Side, number>;\n protocols: { protocol: string; count: number }[];\n}\n\n/** How many outside parties the fleet has, per side and per protocol. */\nexport function countsOf(parties: readonly Pick<ListedParty, 'kind'>[]): Counts {\n const kinds = parties.map((party) => PARTY_KINDS[party.kind]);\n const protocols = [...new Set(kinds.map((kind) => kind.protocol))];\n return {\n total: parties.length,\n sides: { server: kinds.filter((kind) => kind.side === 'server').length, client: kinds.filter((kind) => kind.side === 'client').length },\n protocols: protocols.map((protocol) => ({ protocol, count: kinds.filter((kind) => kind.protocol === protocol).length })),\n };\n}\n","import type { Tone } from '../party-kinds';\n\nconst TONES: Record<Tone, string> = {\n waiting: 'border-tone-waiting-border bg-tone-waiting-bg text-tone-waiting-fg',\n active: 'border-tone-active-border bg-tone-active-bg text-tone-active-fg',\n ok: 'border-tone-ok-border bg-tone-ok-bg text-tone-ok-fg',\n attention: 'border-tone-attention-border bg-tone-attention-bg text-tone-attention-fg',\n ended: 'border-tone-ended-border bg-tone-ended-bg text-tone-ended-fg',\n};\n\n/** A status in its tone, as the console shows one. */\nexport function StatusBadge({ tone, label }: { tone: Tone; label: string }) {\n return <span className={`inline-flex items-center rounded-full border px-2 text-caption ${TONES[tone]}`}>{label}</span>;\n}\n\n/** A plain tag: a protocol, a side, an id. */\nexport function Tag({ children, isMono = false }: { children: React.ReactNode; isMono?: boolean }) {\n return <span className={`inline-flex items-center rounded-md border border-border px-2 text-caption ${isMono ? 'font-mono' : ''}`}>{children}</span>;\n}\n","import { CARD } from '../../forms/ui/look';\n\n/** A gateway that is no app at pagasae signs no one in to its pages (header design H5). */\nexport function NoSignIn() {\n return (\n <section className={CARD} data-testid=\"no-sign-in\">\n <h2 className=\"text-heading font-semibold\">Nobody signs in here</h2>\n <p className=\"mt-2 text-muted-foreground\">This gateway signs no one in to its pages: it is no app at pagasae.</p>\n </section>\n );\n}\n"],"names":["metadata","title","OutsidePartyPage","params","searchParams","name","page","path","kind","CREDENTIAL_KINDS","label","credentialKindOf","sent","find","serverCredentialOf","fields","credentialKind","token","clientId","clientSecret","issuer","scope","CARD","BUTTON","BUTTONS","primary","secondary","destructive","INPUT","LABEL","PARTY_KINDS","mcpServer","protocol","side","mcpClient","a2aClient","a2aAgent","outsideAddressOf","party","url","cardUrl","SIDES","server","one","many","client","PARTY_STATES","commissioning","tone","awaitingCrew","crewed","countsOf","parties","kinds","map","protocols","Set","total","length","sides","filter","count","NoSignIn","className"],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- (()=>{"use strict";module.exports=[13930,a=>{let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call ActionForm() from the server but ActionForm is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/web/features/forms/ui/action-form.tsx","ActionForm");a.s(["ActionForm",0,b])},69372,a=>{var b=a.i(13930);a.n(b)},49144,a=>{let b="inline-flex h-9 items-center justify-center gap-2 rounded-md px-4 font-medium disabled:opacity-60",c={primary:`${b} bg-primary text-primary-foreground hover:bg-primary-hover`,secondary:`${b} border border-border bg-card hover:bg-accent`,destructive:`${b} bg-destructive text-destructive-foreground`};a.s(["x",0,c,"r",0,"rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm","w",0,"h-9 w-full rounded-md border border-input bg-background px-3 font-mono text-code","z",0,"grid gap-1"])},69912,a=>{var b=a.i(7997),c=a.i(49144);a.s(["f",0,function({choices:a,current:d,help:e,refusal:f}){let g=null===d||a.some(a=>a.shipId===d.shipId)?a:[d,...a];return(0,b.jsxs)("label",{className:c.z,children:[(0,b.jsx)("span",{children:"Owner"}),(0,b.jsxs)("select",{className:c.w,name:"ownerShipId",defaultValue:d?.shipId??"",required:!0,"data-testid":"owner-field",children:[null===d?(0,b.jsx)("option",{value:"",disabled:!0,children:"Pick its owner"}):null,g.map(a=>(0,b.jsx)("option",{value:a.shipId,children:a.name},a.shipId))]}),(0,b.jsx)("span",{className:"text-muted-foreground",children:f??e})]})}])},65253,98323,a=>{let b={mcpServer:{protocol:"MCP",side:"server"},mcpClient:{protocol:"MCP",side:"client"},a2aClient:{protocol:"A2A",side:"client"},a2aAgent:{protocol:"A2A",side:"server"}};a.s(["G",0,b,"Y",0,{commissioning:{tone:"active",label:"Commissioning"},awaitingCrew:{tone:"waiting",label:"Awaiting crew"},crewed:{tone:"ok",label:"Crewed"}},"N",0,{server:{one:"server",many:"servers"},client:{one:"client",many:"clients"}},"R",0,function(a){let c=a.map(a=>b[a.kind]),d=[...new Set(c.map(a=>a.protocol))];return{total:a.length,sides:{server:c.filter(a=>"server"===a.side).length,client:c.filter(a=>"client"===a.side).length},protocols:d.map(a=>({protocol:a,count:c.filter(b=>b.protocol===a).length}))}},"M",0,function(a){switch(a.kind){case"mcpServer":return a.url;case"mcpClient":return a.clientId;case"a2aClient":return null;case"a2aAgent":return a.cardUrl}}],65253);var c=a.i(7997);let d={waiting:"border-tone-waiting-border bg-tone-waiting-bg text-tone-waiting-fg",active:"border-tone-active-border bg-tone-active-bg text-tone-active-fg",ok:"border-tone-ok-border bg-tone-ok-bg text-tone-ok-fg",attention:"border-tone-attention-border bg-tone-attention-bg text-tone-attention-fg",ended:"border-tone-ended-border bg-tone-ended-bg text-tone-ended-fg"};a.s(["T",0,function({tone:a,label:b}){return(0,c.jsx)("span",{className:`inline-flex items-center rounded-full border px-2 text-caption ${d[a]}`,children:b})},"E",0,function({children:a,isMono:b=!1}){return(0,c.jsx)("span",{className:`inline-flex items-center rounded-md border border-border px-2 text-caption ${b?"font-mono":""}`,children:a})}],98323)},22126,a=>{var b=a.i(7997),c=a.i(49144);a.s(["f",0,function(){return(0,b.jsxs)("section",{className:c.r,"data-testid":"no-sign-in",children:[(0,b.jsx)("h2",{className:"text-heading font-semibold",children:"Nobody signs in here"}),(0,b.jsx)("p",{className:"mt-2 text-muted-foreground",children:"This gateway signs no one in to its pages: it is no app at pagasae."})]})}])}]})();
2
-
3
- //# sourceMappingURL=web_features_085cv0gogrxxf._.js.map
@@ -1,3 +0,0 @@
1
- (()=>{"use strict";module.exports=[51636,a=>{let b=[{kind:"none",label:"No credential"},{kind:"bearer",label:"Bearer token"},{kind:"clientCredentials",label:"OAuth client credentials"}];a.s(["x",0,b,"C",0,function(a){return b.find(({kind:b})=>b===a)?.kind??"bearer"}])},88412,a=>{let b="inline-flex h-9 items-center justify-center gap-2 rounded-md px-4 font-medium disabled:opacity-60",c={primary:`${b} bg-primary text-primary-foreground hover:bg-primary-hover`,secondary:`${b} border border-border bg-card hover:bg-accent`,destructive:`${b} bg-destructive text-destructive-foreground`};a.s(["x",0,c,"r",0,"rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm","w",0,"h-9 w-full rounded-md border border-input bg-background px-3 font-mono text-code","z",0,"grid gap-1"])},35149,a=>{var b=a.i(87924),c=a.i(88412);a.s(["f",0,function({choices:a,current:d,help:e,refusal:f}){let g=null===d||a.some(a=>a.shipId===d.shipId)?a:[d,...a];return(0,b.jsxs)("label",{className:c.z,children:[(0,b.jsx)("span",{children:"Owner"}),(0,b.jsxs)("select",{className:c.w,name:"ownerShipId",defaultValue:d?.shipId??"",required:!0,"data-testid":"owner-field",children:[null===d?(0,b.jsx)("option",{value:"",disabled:!0,children:"Pick its owner"}):null,g.map(a=>(0,b.jsx)("option",{value:a.shipId,children:a.name},a.shipId))]}),(0,b.jsx)("span",{className:"text-muted-foreground",children:f??e})]})}])},25964,a=>{var b=a.i(72131),c=a.i(50944);a.s(["LiveRefresh",0,function({fleetId:a}){let d;return d=(0,c.useRouter)(),(0,b.useEffect)(()=>{let b=new EventSource(`/overview/changes?fleet=${encodeURIComponent(a)}`);return b.onmessage=()=>{d.refresh()},()=>{b.close()}},[a,d]),(0,b.useEffect)(()=>{let b,c=()=>{let c="visible"===document.visibilityState&&document.hasFocus();c&&void 0===b?b=new EventSource(`/overview/focus?fleet=${encodeURIComponent(a)}`):c||void 0===b||(b.close(),b=void 0)};return c(),window.addEventListener("focus",c),window.addEventListener("blur",c),document.addEventListener("visibilitychange",c),()=>{window.removeEventListener("focus",c),window.removeEventListener("blur",c),document.removeEventListener("visibilitychange",c),b?.close()}},[a]),null}],25964)},1542,a=>{var b=a.i(87924);let c={primary:"bg-primary text-primary-foreground hover:bg-primary-hover",secondary:"border border-border bg-card text-card-foreground hover:bg-accent"};a.s(["f",0,function({isPending:a,pendingLabel:d,variant:e="secondary",children:f,className:g="",disabled:h,...i}){return(0,b.jsx)("button",{...i,disabled:!0===h||a,"aria-busy":a,className:`inline-flex h-9 items-center gap-2 rounded-md px-4 disabled:cursor-not-allowed disabled:opacity-70 ${c[e]} ${g}`,children:a?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{"aria-hidden":"true",className:"size-3.5 animate-spin rounded-full border-2 border-current border-t-transparent"}),d]}):f})}])},24229,a=>{var b=a.i(87924);a.s(["f",0,function({message:a,isFailure:c}){return c?(0,b.jsx)("p",{role:"alert","data-testid":"overview-failure",className:"rounded-md border border-tone-attention-border bg-tone-attention-bg px-3 py-2 text-tone-attention-fg",children:a}):(0,b.jsx)("p",{role:"status","data-testid":"overview-success",className:"rounded-md border border-tone-ok-border bg-tone-ok-bg px-3 py-2 text-tone-ok-fg",children:a})}])}]})();
2
-
3
- //# sourceMappingURL=web_features_0xbnkk4hfgr9v._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../web/features/forms/server-credential.ts","../../../../../web/features/forms/ui/look.ts","../../../../../web/features/forms/ui/owner-field.tsx","../../../../../web/features/overview/hooks/use-focus-report.ts","../../../../../web/features/overview/hooks/use-live-refresh.ts","../../../../../web/features/overview/state/live-refresh.tsx","../../../../../web/features/overview/ui/action-button.tsx","../../../../../web/features/overview/ui/notice.tsx"],"sourcesContent":["/**\n * An outside MCP server's credential, as the add, Parties and decision forms\n * take it: none for a server reached only on a private network, a static\n * bearer, or OAuth client credentials.\n */\n\n/** The credential kinds a form offers, with the words it shows. */\nexport const CREDENTIAL_KINDS = [\n { kind: 'none', label: 'No credential' },\n { kind: 'bearer', label: 'Bearer token' },\n { kind: 'clientCredentials', label: 'OAuth client credentials' },\n] as const;\n\nexport type CredentialKind = (typeof CREDENTIAL_KINDS)[number]['kind'];\n\nexport type ServerCredential =\n | { kind: 'none' }\n | { kind: 'bearer'; token: string }\n | { kind: 'clientCredentials'; clientId: string; clientSecret: string; issuer: string; scope?: string };\n\n/** The kind a form sent, a bearer when it sent none it knows. */\nexport function credentialKindOf(sent: string): CredentialKind {\n return CREDENTIAL_KINDS.find(({ kind }) => kind === sent)?.kind ?? 'bearer';\n}\n\n/** The credential the fields name: only the fields of its kind are read. */\nexport function serverCredentialOf(fields: { credentialKind: string; token: string; clientId: string; clientSecret: string; issuer: string; scope: string }): ServerCredential {\n const kind = credentialKindOf(fields.credentialKind);\n switch (kind) {\n case 'none':\n return { kind };\n case 'bearer':\n return { kind, token: fields.token };\n case 'clientCredentials':\n return { kind, clientId: fields.clientId, clientSecret: fields.clientSecret, issuer: fields.issuer, ...(fields.scope === '' ? {} : { scope: fields.scope }) };\n }\n}\n","/** The classes the pages share, on the design tokens: a card and the button kinds. */\nexport const CARD = 'rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm';\n\nconst BUTTON = 'inline-flex h-9 items-center justify-center gap-2 rounded-md px-4 font-medium disabled:opacity-60';\n\nexport const BUTTONS = {\n primary: `${BUTTON} bg-primary text-primary-foreground hover:bg-primary-hover`,\n secondary: `${BUTTON} border border-border bg-card hover:bg-accent`,\n destructive: `${BUTTON} bg-destructive text-destructive-foreground`,\n} as const;\n\nexport type ButtonKind = keyof typeof BUTTONS;\n\nexport const INPUT = 'h-9 w-full rounded-md border border-input bg-background px-3 font-mono text-code';\n\nexport const LABEL = 'grid gap-1';\n","import { INPUT, LABEL } from './look';\n\n/** A ship a party's owner may be picked from, by its name. */\nexport interface OwnerChoice {\n shipId: string;\n name: string;\n}\n\n/** The owner choices as a page read them, or why they could not be read. */\nexport type OwnerChoices = { isOk: true; value: OwnerChoice[] } | { isOk: false; refusal: string };\n\n/**\n * The owner of a party, picked by name from the ships the fleet takes as an\n * owner. The owner it has now stays a choice, though the fleet no longer\n * lists it, so saving leaves it as it is. Where the choices could not be\n * read, it says why, with nothing to pick.\n */\nexport function OwnerField({ choices, current, help, refusal }: { choices: readonly OwnerChoice[]; current: OwnerChoice | null; help: string; refusal?: string | undefined }) {\n const shown = current === null || choices.some((choice) => choice.shipId === current.shipId) ? choices : [current, ...choices];\n return (\n <label className={LABEL}>\n <span>Owner</span>\n <select className={INPUT} name=\"ownerShipId\" defaultValue={current?.shipId ?? ''} required data-testid=\"owner-field\">\n {current === null ? (\n <option value=\"\" disabled>\n Pick its owner\n </option>\n ) : null}\n {shown.map((choice) => (\n <option key={choice.shipId} value={choice.shipId}>\n {choice.name}\n </option>\n ))}\n </select>\n <span className=\"text-muted-foreground\">{refusal ?? help}</span>\n </label>\n );\n}\n","'use client';\n\nimport { useEffect } from 'react';\n\n/** The stream the page holds while in focus, which the web app's server follows on the gateway's API for the browser. */\nexport const FOCUS_PATH = '/overview/focus';\n\n/**\n * Tells the gateway while the page is in focus (wake a person, W6): it holds\n * the focus stream open while the window has focus and the page shows, and\n * closes it when either ends. While a page of the person is in focus, what\n * arrives is shown there and no wake goes out; an open page not in focus\n * changes nothing. A lost connection no longer counts as in focus.\n */\nexport function useFocusReport(fleetId: string): void {\n useEffect(() => {\n let focus: EventSource | undefined;\n const report = () => {\n const isInFocus = document.visibilityState === 'visible' && document.hasFocus();\n if (isInFocus && focus === undefined) {\n focus = new EventSource(`${FOCUS_PATH}?fleet=${encodeURIComponent(fleetId)}`);\n } else if (!isInFocus && focus !== undefined) {\n focus.close();\n focus = undefined;\n }\n };\n report();\n window.addEventListener('focus', report);\n window.addEventListener('blur', report);\n document.addEventListener('visibilitychange', report);\n return () => {\n window.removeEventListener('focus', report);\n window.removeEventListener('blur', report);\n document.removeEventListener('visibilitychange', report);\n focus?.close();\n };\n }, [fleetId]);\n}\n","'use client';\n\nimport { useRouter } from 'next/navigation';\nimport { useEffect } from 'react';\n\n/** The page's live updates, which the web app's server follows on the gateway's API for the browser. */\nexport const CHANGES_PATH = '/overview/changes';\n\n/**\n * Keeps the page in step with its fleet's requests: whenever one changes,\n * the page reads itself again on the server, as its own caller. The browser\n * opens the stream again by itself when it drops.\n */\nexport function useLiveRefresh(fleetId: string): void {\n const router = useRouter();\n useEffect(() => {\n const changes = new EventSource(`${CHANGES_PATH}?fleet=${encodeURIComponent(fleetId)}`);\n changes.onmessage = () => {\n router.refresh();\n };\n return () => {\n changes.close();\n };\n }, [fleetId, router]);\n}\n","'use client';\n\nimport { useFocusReport } from '../hooks/use-focus-report';\nimport { useLiveRefresh } from '../hooks/use-live-refresh';\n\n/** Keeps the page it sits in live, and tells the gateway while it is in focus (wake a person, W6): it shows nothing itself. */\nexport function LiveRefresh({ fleetId }: { fleetId: string }) {\n useLiveRefresh(fleetId);\n useFocusReport(fleetId);\n return null;\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\n\nconst VARIANTS = {\n primary: 'bg-primary text-primary-foreground hover:bg-primary-hover',\n secondary: 'border border-border bg-card text-card-foreground hover:bg-accent',\n} as const;\n\n/**\n * A button for an action: the moment it is pressed and until the answer\n * comes, it shows a spinner and its working label, and cannot run twice.\n */\nexport function ActionButton({\n isPending,\n pendingLabel,\n variant = 'secondary',\n children,\n className = '',\n disabled,\n ...button\n}: ButtonHTMLAttributes<HTMLButtonElement> & { isPending: boolean; pendingLabel: string; variant?: keyof typeof VARIANTS; children: ReactNode }) {\n return (\n <button\n {...button}\n disabled={disabled === true || isPending}\n aria-busy={isPending}\n className={`inline-flex h-9 items-center gap-2 rounded-md px-4 disabled:cursor-not-allowed disabled:opacity-70 ${VARIANTS[variant]} ${className}`}\n >\n {isPending ? (\n <>\n <span aria-hidden=\"true\" className=\"size-3.5 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n {pendingLabel}\n </>\n ) : (\n children\n )}\n </button>\n );\n}\n","/** What an action came to, said in place: a success as a status, a failure as an alert by the control. */\nexport function Notice({ message, isFailure }: { message: string; isFailure: boolean }) {\n return isFailure ? (\n <p role=\"alert\" data-testid=\"overview-failure\" className=\"rounded-md border border-tone-attention-border bg-tone-attention-bg px-3 py-2 text-tone-attention-fg\">\n {message}\n </p>\n ) : (\n <p role=\"status\" data-testid=\"overview-success\" className=\"rounded-md border border-tone-ok-border bg-tone-ok-bg px-3 py-2 text-tone-ok-fg\">\n {message}\n </p>\n );\n}\n"],"names":["CREDENTIAL_KINDS","kind","label","credentialKindOf","sent","find","serverCredentialOf","fields","credentialKind","token","clientId","clientSecret","issuer","scope","CARD","BUTTON","BUTTONS","primary","secondary","destructive","INPUT","LABEL","OwnerField","choices","current","help","refusal","shown","some","choice","shipId","className","name","defaultValue","required","value","disabled","map","FOCUS_PATH","useFocusReport","fleetId","focus","report","isInFocus","document","visibilityState","hasFocus","undefined","EventSource","encodeURIComponent","close","window","addEventListener","removeEventListener","VARIANTS","ActionButton","isPending","pendingLabel","variant","children","button","Notice","message","isFailure","role"],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- (()=>{"use strict";module.exports=[30587,a=>{a.s(["H",0,"fleet","Q",0,{kind:"idle"}])},51636,a=>{let b=[{kind:"none",label:"No credential"},{kind:"bearer",label:"Bearer token"},{kind:"clientCredentials",label:"OAuth client credentials"}];a.s(["x",0,b,"C",0,function(a){return b.find(({kind:b})=>b===a)?.kind??"bearer"}])},88412,a=>{let b="inline-flex h-9 items-center justify-center gap-2 rounded-md px-4 font-medium disabled:opacity-60",c={primary:`${b} bg-primary text-primary-foreground hover:bg-primary-hover`,secondary:`${b} border border-border bg-card hover:bg-accent`,destructive:`${b} bg-destructive text-destructive-foreground`};a.s(["x",0,c,"r",0,"rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm","w",0,"h-9 w-full rounded-md border border-input bg-background px-3 font-mono text-code","z",0,"grid gap-1"])},36855,77237,a=>{var b=a.i(87924);a.s(["f",0,function({state:a,testId:c}){switch(a.kind){case"idle":return null;case"done":return(0,b.jsx)("p",{role:"status","data-testid":c,className:"rounded-md border border-tone-ok-border bg-tone-ok-bg px-3 py-2 text-tone-ok-fg",children:a.message});case"refused":case"openNetwork":return(0,b.jsx)("p",{role:"alert","data-testid":c,className:"rounded-md border border-tone-attention-border bg-tone-attention-bg px-3 py-2 text-tone-attention-fg",children:a.message})}}],36855);var c=a.i(35112),d=a.i(88412);a.s(["f",0,function({children:a,pending:e,kind:f="primary",testId:g}){let h=(0,c.useFormStatus)();return(0,b.jsx)("button",{type:"submit",className:d.x[f],disabled:h.pending,"aria-busy":h.pending,"data-testid":g,children:h.pending?e:a})}],77237)},35149,a=>{var b=a.i(87924),c=a.i(88412);a.s(["f",0,function({choices:a,current:d,help:e,refusal:f}){let g=null===d||a.some(a=>a.shipId===d.shipId)?a:[d,...a];return(0,b.jsxs)("label",{className:c.z,children:[(0,b.jsx)("span",{children:"Owner"}),(0,b.jsxs)("select",{className:c.w,name:"ownerShipId",defaultValue:d?.shipId??"",required:!0,"data-testid":"owner-field",children:[null===d?(0,b.jsx)("option",{value:"",disabled:!0,children:"Pick its owner"}):null,g.map(a=>(0,b.jsx)("option",{value:a.shipId,children:a.name},a.shipId))]}),(0,b.jsx)("span",{className:"text-muted-foreground",children:f??e})]})}])},64943,a=>{a.s(["f",0,"scope:"])}]})();
2
-
3
- //# sourceMappingURL=web_features_0xnlgtw8bfqaa._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../web/features/forms/form-state.ts","../../../../../web/features/forms/server-credential.ts","../../../../../web/features/forms/ui/look.ts","../../../../../web/features/forms/ui/outcome.tsx","../../../../../web/features/forms/ui/submit-button.tsx","../../../../../web/features/forms/ui/owner-field.tsx","../../../../../web/features/outside-party/scope-changes.ts"],"sourcesContent":["/**\n * What a page's form (a server action) answers the browser: nothing yet,\n * done with what changed, or refused with why, as the API said it. The\n * open network's warning asks for a confirm (interop I-3).\n */\nexport type FormState =\n | { kind: 'idle' }\n | { kind: 'done'; message: string }\n | { kind: 'refused'; message: string }\n | { kind: 'openNetwork'; message: string };\n\nexport const IDLE: FormState = { kind: 'idle' };\n\n/** A form's text field, empty when it was not sent. */\nexport function fieldOf(form: FormData, name: string): string {\n const value = form.get(name);\n return typeof value === 'string' ? value : '';\n}\n\n/** The form's fields as text, files left out. */\nexport function fieldsOf(form: FormData): Record<string, string> {\n return Object.fromEntries([...form.entries()].flatMap(([name, value]) => (typeof value === 'string' ? [[name, value]] : [])));\n}\n\n/** The fleet a page's form names: the page's own, sent in a hidden field. */\nexport const FLEET_FIELD = 'fleet';\n","/**\n * An outside MCP server's credential, as the add, Parties and decision forms\n * take it: none for a server reached only on a private network, a static\n * bearer, or OAuth client credentials.\n */\n\n/** The credential kinds a form offers, with the words it shows. */\nexport const CREDENTIAL_KINDS = [\n { kind: 'none', label: 'No credential' },\n { kind: 'bearer', label: 'Bearer token' },\n { kind: 'clientCredentials', label: 'OAuth client credentials' },\n] as const;\n\nexport type CredentialKind = (typeof CREDENTIAL_KINDS)[number]['kind'];\n\nexport type ServerCredential =\n | { kind: 'none' }\n | { kind: 'bearer'; token: string }\n | { kind: 'clientCredentials'; clientId: string; clientSecret: string; issuer: string; scope?: string };\n\n/** The kind a form sent, a bearer when it sent none it knows. */\nexport function credentialKindOf(sent: string): CredentialKind {\n return CREDENTIAL_KINDS.find(({ kind }) => kind === sent)?.kind ?? 'bearer';\n}\n\n/** The credential the fields name: only the fields of its kind are read. */\nexport function serverCredentialOf(fields: { credentialKind: string; token: string; clientId: string; clientSecret: string; issuer: string; scope: string }): ServerCredential {\n const kind = credentialKindOf(fields.credentialKind);\n switch (kind) {\n case 'none':\n return { kind };\n case 'bearer':\n return { kind, token: fields.token };\n case 'clientCredentials':\n return { kind, clientId: fields.clientId, clientSecret: fields.clientSecret, issuer: fields.issuer, ...(fields.scope === '' ? {} : { scope: fields.scope }) };\n }\n}\n","/** The classes the pages share, on the design tokens: a card and the button kinds. */\nexport const CARD = 'rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm';\n\nconst BUTTON = 'inline-flex h-9 items-center justify-center gap-2 rounded-md px-4 font-medium disabled:opacity-60';\n\nexport const BUTTONS = {\n primary: `${BUTTON} bg-primary text-primary-foreground hover:bg-primary-hover`,\n secondary: `${BUTTON} border border-border bg-card hover:bg-accent`,\n destructive: `${BUTTON} bg-destructive text-destructive-foreground`,\n} as const;\n\nexport type ButtonKind = keyof typeof BUTTONS;\n\nexport const INPUT = 'h-9 w-full rounded-md border border-input bg-background px-3 font-mono text-code';\n\nexport const LABEL = 'grid gap-1';\n","import type { FormState } from '../form-state';\n\n/** How a form ended: what changed, or why it was refused. Nothing while it has not been sent. */\nexport function Outcome({ state, testId }: { state: FormState; testId?: string }) {\n switch (state.kind) {\n case 'idle':\n return null;\n case 'done':\n return (\n <p role=\"status\" data-testid={testId} className=\"rounded-md border border-tone-ok-border bg-tone-ok-bg px-3 py-2 text-tone-ok-fg\">\n {state.message}\n </p>\n );\n case 'refused':\n case 'openNetwork':\n return (\n <p role=\"alert\" data-testid={testId} className=\"rounded-md border border-tone-attention-border bg-tone-attention-bg px-3 py-2 text-tone-attention-fg\">\n {state.message}\n </p>\n );\n }\n}\n","'use client';\n\nimport type { ReactNode } from 'react';\nimport { useFormStatus } from 'react-dom';\n\nimport { BUTTONS, type ButtonKind } from './look';\n\n/** A form's button: it says the form is on its way at once, and takes no second press meanwhile. */\nexport function SubmitButton({ children, pending, kind = 'primary', testId }: { children: ReactNode; pending: string; kind?: ButtonKind; testId?: string }) {\n const status = useFormStatus();\n return (\n <button type=\"submit\" className={BUTTONS[kind]} disabled={status.pending} aria-busy={status.pending} data-testid={testId}>\n {status.pending ? pending : children}\n </button>\n );\n}\n","import { INPUT, LABEL } from './look';\n\n/** A ship a party's owner may be picked from, by its name. */\nexport interface OwnerChoice {\n shipId: string;\n name: string;\n}\n\n/** The owner choices as a page read them, or why they could not be read. */\nexport type OwnerChoices = { isOk: true; value: OwnerChoice[] } | { isOk: false; refusal: string };\n\n/**\n * The owner of a party, picked by name from the ships the fleet takes as an\n * owner. The owner it has now stays a choice, though the fleet no longer\n * lists it, so saving leaves it as it is. Where the choices could not be\n * read, it says why, with nothing to pick.\n */\nexport function OwnerField({ choices, current, help, refusal }: { choices: readonly OwnerChoice[]; current: OwnerChoice | null; help: string; refusal?: string | undefined }) {\n const shown = current === null || choices.some((choice) => choice.shipId === current.shipId) ? choices : [current, ...choices];\n return (\n <label className={LABEL}>\n <span>Owner</span>\n <select className={INPUT} name=\"ownerShipId\" defaultValue={current?.shipId ?? ''} required data-testid=\"owner-field\">\n {current === null ? (\n <option value=\"\" disabled>\n Pick its owner\n </option>\n ) : null}\n {shown.map((choice) => (\n <option key={choice.shipId} value={choice.shipId}>\n {choice.name}\n </option>\n ))}\n </select>\n <span className=\"text-muted-foreground\">{refusal ?? help}</span>\n </label>\n );\n}\n","/**\n * What a party's change form asks of the API (decision 0056): only what\n * differs from the party as the fleet holds it. Scope rows it did not show\n * revoke nothing; the scopes every app ship gets, and those the actor does\n * not hold, are never changed.\n */\nimport { idSchema } from '@aeolus-fleet/common';\n\n/** The scopes every app ship gets (0046): shown locked on, and never changed. */\nexport const EVERY_APP_SHIP_SCOPES: readonly string[] = ['messages:send', 'messages:receive'];\n\n/** A form field that ticks a scope: `scope:<scope>`, one field per scope. */\nexport const SCOPE_FIELD_PREFIX = 'scope:';\n\n/** The field a change form sends when it shows the scope rows. */\nexport const SCOPES_SHOWN_FIELD = 'scopesShown';\n\nexport type Changes = { kind: 'changes'; ownerShipId?: string; grant: string[]; revoke: string[] } | { kind: 'refused'; message: string };\n\nexport function changesOf(party: { ownerShipId: string | null; scopes: readonly string[] | null }, sent: { form: Readonly<Record<string, string>>; scopes: readonly string[] }): Changes {\n const { form, scopes } = sent;\n const sentOwner = form.ownerShipId?.trim();\n let ownerShipId: string | undefined;\n if (sentOwner !== undefined && sentOwner !== party.ownerShipId) {\n const parsed = idSchema('ship').safeParse(sentOwner);\n if (!parsed.success) {\n return { kind: 'refused', message: \"The owner's ship id is not a ship id (shp_...)\" };\n }\n ownerShipId = parsed.data;\n }\n const owner = ownerShipId === undefined ? {} : { ownerShipId };\n const held = party.scopes;\n if (form[SCOPES_SHOWN_FIELD] !== 'true' || held === null) {\n return { kind: 'changes', ...owner, grant: [], revoke: [] };\n }\n const own = scopes.filter((scope) => !EVERY_APP_SHIP_SCOPES.includes(scope));\n const isTicked = (scope: string) => form[`${SCOPE_FIELD_PREFIX}${scope}`] !== undefined;\n return {\n kind: 'changes',\n ...owner,\n grant: own.filter((scope) => isTicked(scope) && !held.includes(scope)),\n revoke: own.filter((scope) => !isTicked(scope) && held.includes(scope)),\n };\n}\n"],"names":["IDLE","kind","fieldOf","form","name","value","get","fieldsOf","Object","fromEntries","entries","flatMap","FLEET_FIELD","CREDENTIAL_KINDS","label","credentialKindOf","sent","find","serverCredentialOf","fields","credentialKind","token","clientId","clientSecret","issuer","scope","CARD","BUTTON","BUTTONS","primary","secondary","destructive","INPUT","LABEL","Outcome","state","testId","role","className","message","OwnerField","choices","current","help","refusal","shown","some","choice","shipId","defaultValue","required","disabled","map","EVERY_APP_SHIP_SCOPES","SCOPE_FIELD_PREFIX","SCOPES_SHOWN_FIELD","changesOf","party","scopes","sentOwner","ownerShipId","trim","undefined","parsed","idSchema","safeParse","success","data","owner","held","grant","revoke","own","filter","includes","isTicked"],"mappings":"wDAyB2B,cAdI,CAAEC,KAAM,MAAO,eCJvC,IAAMY,EAAmB,CAC9B,CAAEZ,KAAM,OAAQa,MAAO,eAAgB,EACvC,CAAEb,KAAM,SAAUa,MAAO,cAAe,EACxC,CAAEb,KAAM,oBAAqBa,MAAO,0BAA2B,EAChE,oBAUM,SAASC,AAAiBC,CAAY,EAC3C,OAAOH,EAAiBI,IAAI,CAAC,CAAC,MAAEhB,CAAI,CAAE,GAAKA,IAASe,IAAOf,MAAQ,QACrE,eCpBA,IAAM0B,EAAS,oGAEFC,EAAU,CACrBC,QAAS,CAAA,EAAGF,EAAO,0DAA0D,CAAC,CAC9EG,UAAW,CAAA,EAAGH,EAAO,6CAA6C,CAAC,CACnEI,YAAa,CAAA,EAAGJ,EAAO,2CAA2C,CAAC,AACrE,qBARoB,mFAYC,yFAEA,4DCZd,SAASO,AAAQ,OAAEC,CAAK,QAAEC,CAAM,CAAyC,EAC9E,OAAQD,EAAMlC,IAAI,EAChB,IAAK,OACH,OAAO,IACT,KAAK,OACH,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAEoC,KAAK,SAAS,cAAaD,EAAQE,UAAU,2FAC7CH,EAAMI,OAAO,EAGpB,KAAK,UACL,IAAK,cACH,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAEF,KAAK,QAAQ,cAAaD,EAAQE,UAAU,gHAC5CH,EAAMI,OAAO,EAGtB,CACF,UClBA,IAAA,EAAA,EAAA,CAAA,CAAA,OAEA,EAAA,EAAA,CAAA,CAAA,kBAGO,SAAS,AAAa,UAAE,CAAQ,SAAE,CAAO,MAAE,EAAO,SAAS,QAAE,CAAM,CAAgF,EACxJ,IAAM,EAAS,CAAA,EAAA,EAAA,aAAA,AAAa,IAC5B,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,KAAK,SAAS,UAAW,EAAA,CAAO,CAAC,EAAK,CAAE,SAAU,EAAO,OAAO,CAAE,YAAW,EAAO,OAAO,CAAE,cAAa,WAC/G,EAAO,OAAO,CAAGH,EAAU,GAGlC,sCCfA,EAAA,EAAA,CAAA,CAAA,kBAiBO,SAASI,AAAW,SAAEC,CAAO,SAAEC,CAAO,MAAEC,CAAI,SAAEC,CAAO,CAAgH,EAC1K,IAAMC,EAAQH,AAAY,UAAQD,EAAQK,IAAI,CAAC,AAACC,GAAWA,EAAOC,MAAM,GAAKN,EAAQM,MAAM,EAAIP,EAAU,CAACC,KAAYD,EAAQ,CAC9H,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAMH,UAAW,EAAA,CAAK,WACrB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,UACN,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAOA,UAAW,EAAA,CAAK,CAAElC,KAAK,cAAc6C,aAAcP,GAASM,QAAU,GAAIE,QAAQ,CAAA,CAAA,EAAC,cAAY,wBACxF,OAAZR,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAOrC,MAAM,GAAG8C,QAAQ,CAAA,CAAA,WAAC,mBAGxB,KACHN,EAAMO,GAAG,CAAC,AAACL,GACV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAA2B1C,MAAO0C,EAAOC,MAAM,UAC7CD,EAAO3C,IAAI,EADD2C,EAAOC,MAAM,MAK9B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKV,UAAU,iCAAyBM,GAAWD,MAG1D,0BCzBkC"}
@@ -1,3 +0,0 @@
1
- (()=>{"use strict";module.exports=[29493,a=>{let b=[{kind:"none",label:"No credential"},{kind:"bearer",label:"Bearer token"},{kind:"clientCredentials",label:"OAuth client credentials"}];a.s(["x",0,b,"y",0,function(a){var c;let d=(c=a.credentialKind,b.find(({kind:a})=>a===c)?.kind??"bearer");switch(d){case"none":return{kind:d};case"bearer":return{kind:d,token:a.token};case"clientCredentials":return{kind:d,clientId:a.clientId,clientSecret:a.clientSecret,issuer:a.issuer,...""===a.scope?{}:{scope:a.scope}}}}])},13930,a=>{let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call ActionForm() from the server but ActionForm is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/web/features/forms/ui/action-form.tsx","ActionForm");a.s(["ActionForm",0,b])},69372,a=>{var b=a.i(13930);a.n(b)},49144,a=>{let b="inline-flex h-9 items-center justify-center gap-2 rounded-md px-4 font-medium disabled:opacity-60",c={primary:`${b} bg-primary text-primary-foreground hover:bg-primary-hover`,secondary:`${b} border border-border bg-card hover:bg-accent`,destructive:`${b} bg-destructive text-destructive-foreground`};a.s(["x",0,c,"r",0,"rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm","w",0,"h-9 w-full rounded-md border border-input bg-background px-3 font-mono text-code","z",0,"grid gap-1"])},65253,98323,a=>{let b={mcpServer:{protocol:"MCP",side:"server"},mcpClient:{protocol:"MCP",side:"client"},a2aClient:{protocol:"A2A",side:"client"},a2aAgent:{protocol:"A2A",side:"server"}};a.s(["G",0,b,"Y",0,{commissioning:{tone:"active",label:"Commissioning"},awaitingCrew:{tone:"waiting",label:"Awaiting crew"},crewed:{tone:"ok",label:"Crewed"}},"N",0,{server:{one:"server",many:"servers"},client:{one:"client",many:"clients"}},"R",0,function(a){let c=a.map(a=>b[a.kind]),d=[...new Set(c.map(a=>a.protocol))];return{total:a.length,sides:{server:c.filter(a=>"server"===a.side).length,client:c.filter(a=>"client"===a.side).length},protocols:d.map(a=>({protocol:a,count:c.filter(b=>b.protocol===a).length}))}},"M",0,function(a){switch(a.kind){case"mcpServer":return a.url;case"mcpClient":return a.clientId;case"a2aClient":return null;case"a2aAgent":return a.cardUrl}}],65253);var c=a.i(7997);let d={waiting:"border-tone-waiting-border bg-tone-waiting-bg text-tone-waiting-fg",active:"border-tone-active-border bg-tone-active-bg text-tone-active-fg",ok:"border-tone-ok-border bg-tone-ok-bg text-tone-ok-fg",attention:"border-tone-attention-border bg-tone-attention-bg text-tone-attention-fg",ended:"border-tone-ended-border bg-tone-ended-bg text-tone-ended-fg"};a.s(["T",0,function({tone:a,label:b}){return(0,c.jsx)("span",{className:`inline-flex items-center rounded-full border px-2 text-caption ${d[a]}`,children:b})},"E",0,function({children:a,isMono:b=!1}){return(0,c.jsx)("span",{className:`inline-flex items-center rounded-md border border-border px-2 text-caption ${b?"font-mono":""}`,children:a})}],98323)},22126,a=>{var b=a.i(7997),c=a.i(49144);a.s(["f",0,function(){return(0,b.jsxs)("section",{className:c.r,"data-testid":"no-sign-in",children:[(0,b.jsx)("h2",{className:"text-heading font-semibold",children:"Nobody signs in here"}),(0,b.jsx)("p",{className:"mt-2 text-muted-foreground",children:"This gateway signs no one in to its pages: it is no app at pagasae."})]})}])}]})();
2
-
3
- //# sourceMappingURL=web_features_10xz3ojtvfi7h._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../web/features/forms/server-credential.ts","../../../../../web/features/forms/ui/action-form.tsx/__nextjs-internal-proxy.mjs%20%7B%20server%20%3D%3E%20%22%5Bproject%5D/web/features/forms/ui/action-form.tsx%22%20%7D","../../../../../web/features/forms/ui/look.ts","../../../../../web/features/outside-parties/party-kinds.ts","../../../../../web/features/outside-parties/ui/status-badge.tsx","../../../../../web/features/sign-in/ui/no-sign-in.tsx"],"sourcesContent":["/**\n * An outside MCP server's credential, as the add, Parties and decision forms\n * take it: none for a server reached only on a private network, a static\n * bearer, or OAuth client credentials.\n */\n\n/** The credential kinds a form offers, with the words it shows. */\nexport const CREDENTIAL_KINDS = [\n { kind: 'none', label: 'No credential' },\n { kind: 'bearer', label: 'Bearer token' },\n { kind: 'clientCredentials', label: 'OAuth client credentials' },\n] as const;\n\nexport type CredentialKind = (typeof CREDENTIAL_KINDS)[number]['kind'];\n\nexport type ServerCredential =\n | { kind: 'none' }\n | { kind: 'bearer'; token: string }\n | { kind: 'clientCredentials'; clientId: string; clientSecret: string; issuer: string; scope?: string };\n\n/** The kind a form sent, a bearer when it sent none it knows. */\nexport function credentialKindOf(sent: string): CredentialKind {\n return CREDENTIAL_KINDS.find(({ kind }) => kind === sent)?.kind ?? 'bearer';\n}\n\n/** The credential the fields name: only the fields of its kind are read. */\nexport function serverCredentialOf(fields: { credentialKind: string; token: string; clientId: string; clientSecret: string; issuer: string; scope: string }): ServerCredential {\n const kind = credentialKindOf(fields.credentialKind);\n switch (kind) {\n case 'none':\n return { kind };\n case 'bearer':\n return { kind, token: fields.token };\n case 'clientCredentials':\n return { kind, clientId: fields.clientId, clientSecret: fields.clientSecret, issuer: fields.issuer, ...(fields.scope === '' ? {} : { scope: fields.scope }) };\n }\n}\n","// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport const ActionForm = registerClientReference(\n function() { throw new Error(\"Attempted to call ActionForm() from the server but ActionForm is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/web/features/forms/ui/action-form.tsx\",\n \"ActionForm\",\n);\n","/** The classes the pages share, on the design tokens: a card and the button kinds. */\nexport const CARD = 'rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm';\n\nconst BUTTON = 'inline-flex h-9 items-center justify-center gap-2 rounded-md px-4 font-medium disabled:opacity-60';\n\nexport const BUTTONS = {\n primary: `${BUTTON} bg-primary text-primary-foreground hover:bg-primary-hover`,\n secondary: `${BUTTON} border border-border bg-card hover:bg-accent`,\n destructive: `${BUTTON} bg-destructive text-destructive-foreground`,\n} as const;\n\nexport type ButtonKind = keyof typeof BUTTONS;\n\nexport const INPUT = 'h-9 w-full rounded-md border border-input bg-background px-3 font-mono text-code';\n\nexport const LABEL = 'grid gap-1';\n","/**\n * An outside party is a party and its protocol (design B, How A2A slots\n * in): the protocol is a tag on every card and the list counts per\n * protocol, so an A2A agent joins as one more kind here.\n */\nimport type { inferRouterOutputs } from '@trpc/server';\n\nimport type { GatewayRouter } from '../../../src/adapters/trpc/router.js';\n\n/** An outside party as the API lists it. */\nexport type ListedParty = inferRouterOutputs<GatewayRouter>['parties']['list'][number];\n\n/** Which side an outside party is on: a server the fleet's ships call, or a client that calls them. */\nexport type Side = 'server' | 'client';\n\nexport const PARTY_KINDS: Record<ListedParty['kind'], { protocol: string; side: Side }> = {\n mcpServer: { protocol: 'MCP', side: 'server' },\n mcpClient: { protocol: 'MCP', side: 'client' },\n a2aClient: { protocol: 'A2A', side: 'client' },\n a2aAgent: { protocol: 'A2A', side: 'server' },\n};\n\n/** Where a party is reached or named outside: an MCP server's URL, an MCP client's id, an A2A agent's card address; an A2A client has none. */\nexport function outsideAddressOf(party: ListedParty): string | null {\n switch (party.kind) {\n case 'mcpServer':\n return party.url;\n case 'mcpClient':\n return party.clientId;\n case 'a2aClient':\n return null;\n case 'a2aAgent':\n return party.cardUrl;\n }\n}\n\nexport const SIDES: Record<Side, { one: string; many: string }> = {\n server: { one: 'server', many: 'servers' },\n client: { one: 'client', many: 'clients' },\n};\n\n/** The tones the design tokens colour a status by. */\nexport type Tone = 'waiting' | 'active' | 'ok' | 'attention' | 'ended';\n\n/** A proxy ship's state as the console shows a status. */\nexport const PARTY_STATES: Record<ListedParty['state'], { tone: Tone; label: string }> = {\n commissioning: { tone: 'active', label: 'Commissioning' },\n awaitingCrew: { tone: 'waiting', label: 'Awaiting crew' },\n crewed: { tone: 'ok', label: 'Crewed' },\n};\n\nexport interface Counts {\n total: number;\n sides: Record<Side, number>;\n protocols: { protocol: string; count: number }[];\n}\n\n/** How many outside parties the fleet has, per side and per protocol. */\nexport function countsOf(parties: readonly Pick<ListedParty, 'kind'>[]): Counts {\n const kinds = parties.map((party) => PARTY_KINDS[party.kind]);\n const protocols = [...new Set(kinds.map((kind) => kind.protocol))];\n return {\n total: parties.length,\n sides: { server: kinds.filter((kind) => kind.side === 'server').length, client: kinds.filter((kind) => kind.side === 'client').length },\n protocols: protocols.map((protocol) => ({ protocol, count: kinds.filter((kind) => kind.protocol === protocol).length })),\n };\n}\n","import type { Tone } from '../party-kinds';\n\nconst TONES: Record<Tone, string> = {\n waiting: 'border-tone-waiting-border bg-tone-waiting-bg text-tone-waiting-fg',\n active: 'border-tone-active-border bg-tone-active-bg text-tone-active-fg',\n ok: 'border-tone-ok-border bg-tone-ok-bg text-tone-ok-fg',\n attention: 'border-tone-attention-border bg-tone-attention-bg text-tone-attention-fg',\n ended: 'border-tone-ended-border bg-tone-ended-bg text-tone-ended-fg',\n};\n\n/** A status in its tone, as the console shows one. */\nexport function StatusBadge({ tone, label }: { tone: Tone; label: string }) {\n return <span className={`inline-flex items-center rounded-full border px-2 text-caption ${TONES[tone]}`}>{label}</span>;\n}\n\n/** A plain tag: a protocol, a side, an id. */\nexport function Tag({ children, isMono = false }: { children: React.ReactNode; isMono?: boolean }) {\n return <span className={`inline-flex items-center rounded-md border border-border px-2 text-caption ${isMono ? 'font-mono' : ''}`}>{children}</span>;\n}\n","import { CARD } from '../../forms/ui/look';\n\n/** A gateway that is no app at pagasae signs no one in to its pages (header design H5). */\nexport function NoSignIn() {\n return (\n <section className={CARD} data-testid=\"no-sign-in\">\n <h2 className=\"text-heading font-semibold\">Nobody signs in here</h2>\n <p className=\"mt-2 text-muted-foreground\">This gateway signs no one in to its pages: it is no app at pagasae.</p>\n </section>\n );\n}\n"],"names":["CREDENTIAL_KINDS","kind","label","credentialKindOf","sent","find","serverCredentialOf","fields","credentialKind","token","clientId","clientSecret","issuer","scope","ActionForm","Error","CARD","BUTTON","BUTTONS","primary","secondary","destructive","INPUT","LABEL","PARTY_KINDS","mcpServer","protocol","side","mcpClient","a2aClient","a2aAgent","outsideAddressOf","party","url","cardUrl","SIDES","server","one","many","client","PARTY_STATES","commissioning","tone","awaitingCrew","crewed","countsOf","parties","kinds","map","protocols","Set","total","length","sides","filter","count","NoSignIn","className"],"mappings":"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","ignoreList":[1]}
@@ -1,3 +0,0 @@
1
- (()=>{"use strict";module.exports=[30587,a=>{a.s(["H",0,"fleet","Q",0,{kind:"idle"}])},88412,a=>{let b="inline-flex h-9 items-center justify-center gap-2 rounded-md px-4 font-medium disabled:opacity-60",c={primary:`${b} bg-primary text-primary-foreground hover:bg-primary-hover`,secondary:`${b} border border-border bg-card hover:bg-accent`,destructive:`${b} bg-destructive text-destructive-foreground`};a.s(["x",0,c,"r",0,"rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm","w",0,"h-9 w-full rounded-md border border-input bg-background px-3 font-mono text-code","z",0,"grid gap-1"])},36855,77237,a=>{var b=a.i(87924);a.s(["f",0,function({state:a,testId:c}){switch(a.kind){case"idle":return null;case"done":return(0,b.jsx)("p",{role:"status","data-testid":c,className:"rounded-md border border-tone-ok-border bg-tone-ok-bg px-3 py-2 text-tone-ok-fg",children:a.message});case"refused":case"openNetwork":return(0,b.jsx)("p",{role:"alert","data-testid":c,className:"rounded-md border border-tone-attention-border bg-tone-attention-bg px-3 py-2 text-tone-attention-fg",children:a.message})}}],36855);var c=a.i(35112),d=a.i(88412);a.s(["f",0,function({children:a,pending:e,kind:f="primary",testId:g}){let h=(0,c.useFormStatus)();return(0,b.jsx)("button",{type:"submit",className:d.x[f],disabled:h.pending,"aria-busy":h.pending,"data-testid":g,children:h.pending?e:a})}],77237)},47763,a=>{var b=a.i(87924);let c={waiting:"border-tone-waiting-border bg-tone-waiting-bg text-tone-waiting-fg",active:"border-tone-active-border bg-tone-active-bg text-tone-active-fg",ok:"border-tone-ok-border bg-tone-ok-bg text-tone-ok-fg",attention:"border-tone-attention-border bg-tone-attention-bg text-tone-attention-fg",ended:"border-tone-ended-border bg-tone-ended-bg text-tone-ended-fg"};a.s(["T",0,function({tone:a,label:d}){return(0,b.jsx)("span",{className:`inline-flex items-center rounded-full border px-2 text-caption ${c[a]}`,children:d})},"E",0,function({children:a,isMono:c=!1}){return(0,b.jsx)("span",{className:`inline-flex items-center rounded-md border border-border px-2 text-caption ${c?"font-mono":""}`,children:a})}])}]})();
2
-
3
- //# sourceMappingURL=web_features_19v3mlx8c_h1-._.js.map
@@ -1,3 +0,0 @@
1
- (()=>{"use strict";module.exports=[30587,a=>{a.s(["H",0,"fleet","Q",0,{kind:"idle"}])},88412,a=>{let b="inline-flex h-9 items-center justify-center gap-2 rounded-md px-4 font-medium disabled:opacity-60",c={primary:`${b} bg-primary text-primary-foreground hover:bg-primary-hover`,secondary:`${b} border border-border bg-card hover:bg-accent`,destructive:`${b} bg-destructive text-destructive-foreground`};a.s(["x",0,c,"r",0,"rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm","w",0,"h-9 w-full rounded-md border border-input bg-background px-3 font-mono text-code","z",0,"grid gap-1"])},36855,77237,a=>{var b=a.i(87924);a.s(["f",0,function({state:a,testId:c}){switch(a.kind){case"idle":return null;case"done":return(0,b.jsx)("p",{role:"status","data-testid":c,className:"rounded-md border border-tone-ok-border bg-tone-ok-bg px-3 py-2 text-tone-ok-fg",children:a.message});case"refused":case"openNetwork":return(0,b.jsx)("p",{role:"alert","data-testid":c,className:"rounded-md border border-tone-attention-border bg-tone-attention-bg px-3 py-2 text-tone-attention-fg",children:a.message})}}],36855);var c=a.i(35112),d=a.i(88412);a.s(["f",0,function({children:a,pending:e,kind:f="primary",testId:g}){let h=(0,c.useFormStatus)();return(0,b.jsx)("button",{type:"submit",className:d.x[f],disabled:h.pending,"aria-busy":h.pending,"data-testid":g,children:h.pending?e:a})}],77237)},35149,a=>{var b=a.i(87924),c=a.i(88412);a.s(["f",0,function({choices:a,current:d,help:e,refusal:f}){let g=null===d||a.some(a=>a.shipId===d.shipId)?a:[d,...a];return(0,b.jsxs)("label",{className:c.z,children:[(0,b.jsx)("span",{children:"Owner"}),(0,b.jsxs)("select",{className:c.w,name:"ownerShipId",defaultValue:d?.shipId??"",required:!0,"data-testid":"owner-field",children:[null===d?(0,b.jsx)("option",{value:"",disabled:!0,children:"Pick its owner"}):null,g.map(a=>(0,b.jsx)("option",{value:a.shipId,children:a.name},a.shipId))]}),(0,b.jsx)("span",{className:"text-muted-foreground",children:f??e})]})}])},64943,a=>{a.s(["f",0,"scope:"])}]})();
2
-
3
- //# sourceMappingURL=web_features_1_2m6l73qk7qw._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../web/features/forms/form-state.ts","../../../../../web/features/forms/ui/look.ts","../../../../../web/features/forms/ui/outcome.tsx","../../../../../web/features/forms/ui/submit-button.tsx","../../../../../web/features/forms/ui/owner-field.tsx","../../../../../web/features/outside-party/scope-changes.ts"],"sourcesContent":["/**\n * What a page's form (a server action) answers the browser: nothing yet,\n * done with what changed, or refused with why, as the API said it. The\n * open network's warning asks for a confirm (interop I-3).\n */\nexport type FormState =\n | { kind: 'idle' }\n | { kind: 'done'; message: string }\n | { kind: 'refused'; message: string }\n | { kind: 'openNetwork'; message: string };\n\nexport const IDLE: FormState = { kind: 'idle' };\n\n/** A form's text field, empty when it was not sent. */\nexport function fieldOf(form: FormData, name: string): string {\n const value = form.get(name);\n return typeof value === 'string' ? value : '';\n}\n\n/** The form's fields as text, files left out. */\nexport function fieldsOf(form: FormData): Record<string, string> {\n return Object.fromEntries([...form.entries()].flatMap(([name, value]) => (typeof value === 'string' ? [[name, value]] : [])));\n}\n\n/** The fleet a page's form names: the page's own, sent in a hidden field. */\nexport const FLEET_FIELD = 'fleet';\n","/** The classes the pages share, on the design tokens: a card and the button kinds. */\nexport const CARD = 'rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm';\n\nconst BUTTON = 'inline-flex h-9 items-center justify-center gap-2 rounded-md px-4 font-medium disabled:opacity-60';\n\nexport const BUTTONS = {\n primary: `${BUTTON} bg-primary text-primary-foreground hover:bg-primary-hover`,\n secondary: `${BUTTON} border border-border bg-card hover:bg-accent`,\n destructive: `${BUTTON} bg-destructive text-destructive-foreground`,\n} as const;\n\nexport type ButtonKind = keyof typeof BUTTONS;\n\nexport const INPUT = 'h-9 w-full rounded-md border border-input bg-background px-3 font-mono text-code';\n\nexport const LABEL = 'grid gap-1';\n","import type { FormState } from '../form-state';\n\n/** How a form ended: what changed, or why it was refused. Nothing while it has not been sent. */\nexport function Outcome({ state, testId }: { state: FormState; testId?: string }) {\n switch (state.kind) {\n case 'idle':\n return null;\n case 'done':\n return (\n <p role=\"status\" data-testid={testId} className=\"rounded-md border border-tone-ok-border bg-tone-ok-bg px-3 py-2 text-tone-ok-fg\">\n {state.message}\n </p>\n );\n case 'refused':\n case 'openNetwork':\n return (\n <p role=\"alert\" data-testid={testId} className=\"rounded-md border border-tone-attention-border bg-tone-attention-bg px-3 py-2 text-tone-attention-fg\">\n {state.message}\n </p>\n );\n }\n}\n","'use client';\n\nimport type { ReactNode } from 'react';\nimport { useFormStatus } from 'react-dom';\n\nimport { BUTTONS, type ButtonKind } from './look';\n\n/** A form's button: it says the form is on its way at once, and takes no second press meanwhile. */\nexport function SubmitButton({ children, pending, kind = 'primary', testId }: { children: ReactNode; pending: string; kind?: ButtonKind; testId?: string }) {\n const status = useFormStatus();\n return (\n <button type=\"submit\" className={BUTTONS[kind]} disabled={status.pending} aria-busy={status.pending} data-testid={testId}>\n {status.pending ? pending : children}\n </button>\n );\n}\n","import { INPUT, LABEL } from './look';\n\n/** A ship a party's owner may be picked from, by its name. */\nexport interface OwnerChoice {\n shipId: string;\n name: string;\n}\n\n/** The owner choices as a page read them, or why they could not be read. */\nexport type OwnerChoices = { isOk: true; value: OwnerChoice[] } | { isOk: false; refusal: string };\n\n/**\n * The owner of a party, picked by name from the ships the fleet takes as an\n * owner. The owner it has now stays a choice, though the fleet no longer\n * lists it, so saving leaves it as it is. Where the choices could not be\n * read, it says why, with nothing to pick.\n */\nexport function OwnerField({ choices, current, help, refusal }: { choices: readonly OwnerChoice[]; current: OwnerChoice | null; help: string; refusal?: string | undefined }) {\n const shown = current === null || choices.some((choice) => choice.shipId === current.shipId) ? choices : [current, ...choices];\n return (\n <label className={LABEL}>\n <span>Owner</span>\n <select className={INPUT} name=\"ownerShipId\" defaultValue={current?.shipId ?? ''} required data-testid=\"owner-field\">\n {current === null ? (\n <option value=\"\" disabled>\n Pick its owner\n </option>\n ) : null}\n {shown.map((choice) => (\n <option key={choice.shipId} value={choice.shipId}>\n {choice.name}\n </option>\n ))}\n </select>\n <span className=\"text-muted-foreground\">{refusal ?? help}</span>\n </label>\n );\n}\n","/**\n * What a party's change form asks of the API (decision 0056): only what\n * differs from the party as the fleet holds it. Scope rows it did not show\n * revoke nothing; the scopes every app ship gets, and those the actor does\n * not hold, are never changed.\n */\nimport { idSchema } from '@aeolus-fleet/common';\n\n/** The scopes every app ship gets (0046): shown locked on, and never changed. */\nexport const EVERY_APP_SHIP_SCOPES: readonly string[] = ['messages:send', 'messages:receive'];\n\n/** A form field that ticks a scope: `scope:<scope>`, one field per scope. */\nexport const SCOPE_FIELD_PREFIX = 'scope:';\n\n/** The field a change form sends when it shows the scope rows. */\nexport const SCOPES_SHOWN_FIELD = 'scopesShown';\n\nexport type Changes = { kind: 'changes'; ownerShipId?: string; grant: string[]; revoke: string[] } | { kind: 'refused'; message: string };\n\nexport function changesOf(party: { ownerShipId: string | null; scopes: readonly string[] | null }, sent: { form: Readonly<Record<string, string>>; scopes: readonly string[] }): Changes {\n const { form, scopes } = sent;\n const sentOwner = form.ownerShipId?.trim();\n let ownerShipId: string | undefined;\n if (sentOwner !== undefined && sentOwner !== party.ownerShipId) {\n const parsed = idSchema('ship').safeParse(sentOwner);\n if (!parsed.success) {\n return { kind: 'refused', message: \"The owner's ship id is not a ship id (shp_...)\" };\n }\n ownerShipId = parsed.data;\n }\n const owner = ownerShipId === undefined ? {} : { ownerShipId };\n const held = party.scopes;\n if (form[SCOPES_SHOWN_FIELD] !== 'true' || held === null) {\n return { kind: 'changes', ...owner, grant: [], revoke: [] };\n }\n const own = scopes.filter((scope) => !EVERY_APP_SHIP_SCOPES.includes(scope));\n const isTicked = (scope: string) => form[`${SCOPE_FIELD_PREFIX}${scope}`] !== undefined;\n return {\n kind: 'changes',\n ...owner,\n grant: own.filter((scope) => isTicked(scope) && !held.includes(scope)),\n revoke: own.filter((scope) => !isTicked(scope) && held.includes(scope)),\n };\n}\n"],"names":["IDLE","kind","fieldOf","form","name","value","get","fieldsOf","Object","fromEntries","entries","flatMap","FLEET_FIELD","CARD","BUTTON","BUTTONS","primary","secondary","destructive","INPUT","LABEL","Outcome","state","testId","role","className","message","OwnerField","choices","current","help","refusal","shown","some","choice","shipId","defaultValue","required","disabled","map","EVERY_APP_SHIP_SCOPES","SCOPE_FIELD_PREFIX","SCOPES_SHOWN_FIELD","changesOf","party","sent","scopes","sentOwner","ownerShipId","trim","undefined","parsed","idSchema","safeParse","success","data","owner","held","grant","revoke","own","filter","scope","includes","isTicked"],"mappings":"wDAyB2B,cAdI,CAAEC,KAAM,MAAO,eCR9C,IAAMa,EAAS,oGAEFC,EAAU,CACrBC,QAAS,CAAA,EAAGF,EAAO,0DAA0D,CAAC,CAC9EG,UAAW,CAAA,EAAGH,EAAO,6CAA6C,CAAC,CACnEI,YAAa,CAAA,EAAGJ,EAAO,2CAA2C,CAAC,AACrE,qBARoB,mFAYC,yFAEA,4DCZd,SAASO,AAAQ,OAAEC,CAAK,QAAEC,CAAM,CAAyC,EAC9E,OAAQD,EAAMrB,IAAI,EAChB,IAAK,OACH,OAAO,IACT,KAAK,OACH,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAEuB,KAAK,SAAS,cAAaD,EAAQE,UAAU,2FAC7CH,EAAMI,OAAO,EAGpB,KAAK,UACL,IAAK,cACH,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAEF,KAAK,QAAQ,cAAaD,EAAQE,UAAU,gHAC5CH,EAAMI,OAAO,EAGtB,CACF,UClBA,IAAA,EAAA,EAAA,CAAA,CAAA,OAEA,EAAA,EAAA,CAAA,CAAA,kBAGO,SAAS,AAAa,UAAE,CAAQ,SAAE,CAAO,MAAE,EAAO,SAAS,CAAE,QAAM,CAAgF,EACxJ,IAAM,EAAS,CAAA,EAAA,EAAA,aAAA,AAAa,IAC5B,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,KAAK,SAAS,UAAW,EAAA,CAAO,CAAC,EAAK,CAAE,SAAU,EAAO,OAAO,CAAE,YAAW,EAAO,OAAO,CAAE,cAAa,WAC/G,EAAO,OAAO,CAAGH,EAAU,GAGlC,sCCfA,EAAA,EAAA,CAAA,CAAA,kBAiBO,SAAoB,AAAXI,SAAaC,CAAO,SAAEC,CAAO,MAAEC,CAAI,CAAEC,SAAO,CAAgH,EAC1K,IAAMC,EAAoB,OAAZH,GAAoBD,EAAQK,IAAI,CAAC,AAACC,GAAWA,EAAOC,MAAM,GAAKN,EAAQM,MAAM,EAAIP,EAAU,CAACC,KAAYD,EAAQ,CAC9H,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAMH,UAAW,EAAA,CAAK,WACrB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,UACN,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAOA,UAAW,EAAA,CAAK,CAAErB,KAAK,cAAcgC,aAAcP,GAASM,QAAU,GAAIE,QAAQ,CAAA,CAAA,EAAC,cAAY,wBACxF,OAAZR,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAOxB,MAAM,GAAGiC,QAAQ,CAAA,CAAA,WAAC,mBAGxB,KACHN,EAAMO,GAAG,CAAC,AAACL,GACV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAA2B7B,MAAO6B,EAAOC,MAAM,UAC7CD,EAAO9B,IAAI,EADD8B,EAAOC,MAAM,MAK9B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKV,UAAU,iCAAyBM,GAAWD,MAG1D,0BCzBkC"}
@@ -1,3 +0,0 @@
1
- (()=>{"use strict";module.exports=[51636,a=>{let b=[{kind:"none",label:"No credential"},{kind:"bearer",label:"Bearer token"},{kind:"clientCredentials",label:"OAuth client credentials"}];a.s(["x",0,b,"C",0,function(a){return b.find(({kind:b})=>b===a)?.kind??"bearer"}])},35149,a=>{var b=a.i(87924),c=a.i(88412);a.s(["f",0,function({choices:a,current:d,help:e,refusal:f}){let g=null===d||a.some(a=>a.shipId===d.shipId)?a:[d,...a];return(0,b.jsxs)("label",{className:c.z,children:[(0,b.jsx)("span",{children:"Owner"}),(0,b.jsxs)("select",{className:c.w,name:"ownerShipId",defaultValue:d?.shipId??"",required:!0,"data-testid":"owner-field",children:[null===d?(0,b.jsx)("option",{value:"",disabled:!0,children:"Pick its owner"}):null,g.map(a=>(0,b.jsx)("option",{value:a.shipId,children:a.name},a.shipId))]}),(0,b.jsx)("span",{className:"text-muted-foreground",children:f??e})]})}])}]})();
2
-
3
- //# sourceMappingURL=web_features_forms_1u0akr22eh_x_._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../web/features/forms/server-credential.ts","../../../../../web/features/forms/ui/owner-field.tsx"],"sourcesContent":["/**\n * An outside MCP server's credential, as the add, Parties and decision forms\n * take it: none for a server reached only on a private network, a static\n * bearer, or OAuth client credentials.\n */\n\n/** The credential kinds a form offers, with the words it shows. */\nexport const CREDENTIAL_KINDS = [\n { kind: 'none', label: 'No credential' },\n { kind: 'bearer', label: 'Bearer token' },\n { kind: 'clientCredentials', label: 'OAuth client credentials' },\n] as const;\n\nexport type CredentialKind = (typeof CREDENTIAL_KINDS)[number]['kind'];\n\nexport type ServerCredential =\n | { kind: 'none' }\n | { kind: 'bearer'; token: string }\n | { kind: 'clientCredentials'; clientId: string; clientSecret: string; issuer: string; scope?: string };\n\n/** The kind a form sent, a bearer when it sent none it knows. */\nexport function credentialKindOf(sent: string): CredentialKind {\n return CREDENTIAL_KINDS.find(({ kind }) => kind === sent)?.kind ?? 'bearer';\n}\n\n/** The credential the fields name: only the fields of its kind are read. */\nexport function serverCredentialOf(fields: { credentialKind: string; token: string; clientId: string; clientSecret: string; issuer: string; scope: string }): ServerCredential {\n const kind = credentialKindOf(fields.credentialKind);\n switch (kind) {\n case 'none':\n return { kind };\n case 'bearer':\n return { kind, token: fields.token };\n case 'clientCredentials':\n return { kind, clientId: fields.clientId, clientSecret: fields.clientSecret, issuer: fields.issuer, ...(fields.scope === '' ? {} : { scope: fields.scope }) };\n }\n}\n","import { INPUT, LABEL } from './look';\n\n/** A ship a party's owner may be picked from, by its name. */\nexport interface OwnerChoice {\n shipId: string;\n name: string;\n}\n\n/** The owner choices as a page read them, or why they could not be read. */\nexport type OwnerChoices = { isOk: true; value: OwnerChoice[] } | { isOk: false; refusal: string };\n\n/**\n * The owner of a party, picked by name from the ships the fleet takes as an\n * owner. The owner it has now stays a choice, though the fleet no longer\n * lists it, so saving leaves it as it is. Where the choices could not be\n * read, it says why, with nothing to pick.\n */\nexport function OwnerField({ choices, current, help, refusal }: { choices: readonly OwnerChoice[]; current: OwnerChoice | null; help: string; refusal?: string | undefined }) {\n const shown = current === null || choices.some((choice) => choice.shipId === current.shipId) ? choices : [current, ...choices];\n return (\n <label className={LABEL}>\n <span>Owner</span>\n <select className={INPUT} name=\"ownerShipId\" defaultValue={current?.shipId ?? ''} required data-testid=\"owner-field\">\n {current === null ? (\n <option value=\"\" disabled>\n Pick its owner\n </option>\n ) : null}\n {shown.map((choice) => (\n <option key={choice.shipId} value={choice.shipId}>\n {choice.name}\n </option>\n ))}\n </select>\n <span className=\"text-muted-foreground\">{refusal ?? help}</span>\n </label>\n );\n}\n"],"names":["CREDENTIAL_KINDS","kind","label","credentialKindOf","sent","find","serverCredentialOf","fields","credentialKind","token","clientId","clientSecret","issuer","scope","OwnerField","choices","current","help","refusal","shown","some","choice","shipId","className","name","defaultValue","required","value","disabled","map"],"mappings":"6CAOO,IAAMA,EAAmB,CAC9B,CAAEC,KAAM,OAAQC,MAAO,eAAgB,EACvC,CAAED,KAAM,SAAUC,MAAO,cAAe,EACxC,CAAED,KAAM,oBAAqBC,MAAO,0BAA2B,EAChE,oBAUM,SAASC,AAAiBC,CAAY,EAC3C,OAAOJ,EAAiBK,IAAI,CAAC,CAAC,MAAEJ,CAAI,CAAE,GAAKA,IAASG,IAAOH,MAAQ,QACrE,gCCvBA,EAAA,EAAA,CAAA,CAAA,kBAiBO,SAASa,AAAW,SAAEC,CAAO,SAAEC,CAAO,MAAEC,CAAI,SAAEC,CAAO,CAAgH,EAC1K,IAAMC,EAAQH,AAAY,UAAQD,EAAQK,IAAI,CAAC,AAACC,GAAWA,EAAOC,MAAM,GAAKN,EAAQM,MAAM,EAAIP,EAAU,CAACC,KAAYD,EAAQ,CAC9H,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAMQ,UAAW,EAAA,CAAK,WACrB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,UACN,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAOA,UAAW,EAAA,CAAK,CAAEC,KAAK,cAAcC,aAAcT,GAASM,QAAU,GAAII,QAAQ,CAAA,CAAA,EAAC,cAAY,wBACxF,OAAZV,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAOW,MAAM,GAAGC,QAAQ,CAAA,CAAA,WAAC,mBAGxB,KACHT,EAAMU,GAAG,CAAC,AAACR,GACV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAA2BM,MAAON,EAAOC,MAAM,UAC7CD,EAAOG,IAAI,EADDH,EAAOC,MAAM,MAK9B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKC,UAAU,iCAAyBL,GAAWD,MAG1D"}
@@ -1,3 +0,0 @@
1
- (()=>{"use strict";module.exports=[69717,a=>{let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call AgentNeeds() from the server but AgentNeeds is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/web/features/outside-party/tools-table/ui/agent-needs.tsx","AgentNeeds");a.s(["AgentNeeds",0,b])},4741,a=>{var b=a.i(69717);a.n(b)},64256,a=>{let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call ToolsTable() from the server but ToolsTable is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/web/features/outside-party/tools-table/ui/tools-table.tsx","ToolsTable");a.s(["ToolsTable",0,b])},46736,a=>{var b=a.i(64256);a.n(b)},9181,a=>{var b=a.i(7997),c=a.i(717),d=a.i(55476),e=a.i(66283),f=a.i(29493),g=a.i(49144),h=a.i(65253),i=a.i(72913),j=a.i(1130),k=a.i(98323),l=a.i(4741),m=a.i(46736);async function n({api:a,name:b}){let c=await (0,e.F)(a.parties.approving.query({name:b})),d=c.isOk&&c.value.isApproving,f=d?await (0,e.F)(a.parties.listedScopes.query()):void 0;return{canChange:d&&f?.isOk===!0,listed:f?.isOk===!0?f.value.scopes:null,reason:c.isOk?c.value.isApproving?f?.isOk===!1?f.refusal:null:c.value.reason:c.refusal}}async function o({api:a,fleetId:c,name:d,isApprover:f}){let[g,h,i]=await Promise.all([(0,e.F)(a.parties.tools.query({name:d})),(0,e.F)(a.parties.scopeRequirements.query({name:d})),f?n({api:a,name:d}):{canChange:!1,listed:null,reason:null}]);return h.isOk?(0,b.jsxs)("div",{className:"grid gap-3",children:[null===i.reason?null:(0,b.jsxs)("p",{className:"text-muted-foreground","data-testid":"tools-table-read-only-reason",children:["You see these read-only: ",i.reason]}),(0,b.jsx)(m.ToolsTable,{fleetId:c,party:d,tools:function({read:a,requirements:b}){let c=new Map(b.tools.map(({tool:a,scopes:b})=>[a,b]));return a.isOk?a.value.tools.map(a=>({...a,scopes:c.get(a.name)??[]})):b.tools.map(({tool:a,scopes:b})=>({name:a,isOn:null,isNew:!1,scopes:b}))}({read:g,requirements:h.value}),version:h.value.version,partyScopes:h.value.party,listed:i.listed,canChange:i.canChange,serverRefusal:g.isOk?null:g.refusal})]}):(0,b.jsx)("p",{className:"text-muted-foreground",children:h.refusal})}function p({party:a}){return(0,b.jsxs)("div",{"aria-busy":"true","aria-label":`Reading the tools ${a} lists`,className:"grid gap-2","data-testid":"tools-table-skeleton",children:[(0,b.jsx)("span",{className:"block h-9 w-full animate-pulse rounded-md bg-muted"}),Array.from({length:8},(a,c)=>(0,b.jsx)("span",{className:"block h-10 animate-pulse rounded-md bg-muted"},c))]})}var q=a.i(35670);let r="fleet:owner",s="scopes:grant",t="gateway:approve";function u({fleetId:a}){return(0,b.jsx)("a",{href:(0,d.i)(i.$,a),className:"text-muted-foreground hover:text-foreground",children:"← Outside parties"})}function v({children:a}){return(0,b.jsx)("p",{role:"alert",className:"rounded-md border border-tone-attention-border bg-tone-attention-bg px-3 py-2 text-tone-attention-fg",children:a})}let w={mcpServer:"Address",mcpClient:"Client id",a2aClient:"Address",a2aAgent:"Card address"},x=(0,b.jsx)("span",{className:"text-muted-foreground",children:"Not known"});function y({label:a,children:c}){return(0,b.jsxs)("div",{className:"grid gap-1 sm:grid-cols-[10rem_1fr]",children:[(0,b.jsx)("dt",{className:"text-muted-foreground",children:a}),(0,b.jsx)("dd",{className:"flex flex-wrap items-center gap-2",children:c})]})}function z({party:a}){let{protocol:c,side:d}=h.G[a.kind],e=h.Y[a.state];return(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,b.jsx)("h1",{className:"text-title font-semibold",children:a.name}),(0,b.jsx)(k.E,{children:c}),(0,b.jsx)(k.E,{children:h.N[d].one}),(0,b.jsx)(k.T,{tone:e.tone,label:e.label})]})}async function A({page:a,name:m}){let{api:B,fleetId:C,scopes:D}=a,E=await (0,e.F)(B.parties.get.query({name:m}));if(!E.isOk)return(0,b.jsxs)("div",{className:"grid gap-4",children:[(0,b.jsx)(u,{fleetId:C}),(0,b.jsx)(v,{children:E.refusal})]});let F=E.value,G=(0,h.M)(F),H=D.includes(t),[I,J]=await Promise.all(["a2aClient"===F.kind?(0,e.F)(B.parties.cardAddresses.query({name:m})):void 0,"a2aAgent"===F.kind?Promise.all([(0,e.F)(B.parties.scopeRequirements.query({name:m})),H?n({api:B,name:m}):{canChange:!1,listed:null,reason:null}]):void 0]),K=(0,b.jsx)("a",{href:(0,d.i)((0,i.N)(F.name,"change"),C),className:"text-primary hover:underline","data-testid":"outside-party-change",children:"Change"});return(0,b.jsxs)("div",{className:"grid gap-4",children:[(0,b.jsx)(u,{fleetId:C}),(0,b.jsx)(z,{party:F}),(0,b.jsxs)("dl",{className:`${g.r} grid gap-3`,children:[(0,b.jsx)(y,{label:"Proxy ship",children:F.proxyShipName??x}),(0,b.jsxs)(y,{label:"Owner",children:[F.ownerName??x,D.includes(r)?K:null]}),(0,b.jsxs)(y,{label:"Scopes",children:[null===F.scopes?x:F.scopes.map(a=>{let c;return(0,b.jsx)(k.E,{children:(c=j.K.safeParse(a)).success?j.q[c.data]:a},a)}),D.includes(s)?K:null]}),"mcpServer"===F.kind||"a2aAgent"===F.kind?(0,b.jsx)(y,{label:"Credential",children:f.x.find(({kind:a})=>a===F.credentialKind)?.label}):null,null===G?null:(0,b.jsx)(y,{label:w[F.kind],children:(0,b.jsx)("span",{className:"font-mono",children:G})}),"a2aAgent"===F.kind?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(y,{label:"Messages at once",children:F.concurrencyLimit}),(0,b.jsx)(y,{label:"Needs",children:void 0===J?null:J[0].isOk?(0,b.jsx)(l.AgentNeeds,{fleetId:C,party:F.name,version:J[0].value.version,scopes:J[0].value.party,listed:J[1].listed,canChange:J[1].canChange}):(0,b.jsx)("span",{className:"text-muted-foreground",children:J[0].refusal})}),(0,b.jsx)(y,{label:"Repeatable",children:D.includes(t)?(0,b.jsx)(q.RepeatableSwitch,{fleetId:C,party:F.name,isRepeatable:F.isRepeatable}):(0,b.jsx)(k.E,{children:F.isRepeatable?"Repeatable":"Not repeatable"})})]}):null]}),"mcpServer"===F.kind?(0,b.jsxs)("section",{className:`${g.r} grid gap-3`,"data-testid":"outside-party-tools",children:[(0,b.jsx)("h2",{className:"text-section font-semibold",children:"Tools"}),(0,b.jsxs)("p",{className:"text-muted-foreground",children:["The fleet may call only the tools switched on, and a calling ship must hold every scope a tool needs; every ship that may reach ",F.name," reaches the same tools. ",H?null:"Changing them needs gateway:approve."]}),(0,b.jsx)(c.Suspense,{fallback:(0,b.jsx)(p,{party:F.name}),children:(0,b.jsx)(o,{api:B,fleetId:C,name:F.name,isApprover:H})})]}):null,void 0===I?null:(0,b.jsxs)("section",{className:`${g.r} grid gap-2`,"data-testid":"outside-party-cards",children:[(0,b.jsxs)("h2",{className:"flex justify-between text-section font-semibold",children:[(0,b.jsx)("span",{children:"Card addresses"}),I.isOk?(0,b.jsx)("span",{children:I.value.addresses.length}):null]}),(0,b.jsx)("p",{className:"text-muted-foreground",children:"One per ship its proxy ship reaches now. Its owner hands them to the client."}),I.isOk?0===I.value.addresses.length?(0,b.jsx)("p",{className:"text-muted-foreground",children:"It reaches no ship now."}):(0,b.jsx)("ul",{className:"grid gap-1",children:I.value.addresses.map(a=>(0,b.jsx)("li",{className:"break-all font-mono text-code",children:a},a))}):(0,b.jsx)("p",{className:"text-muted-foreground",children:I.refusal})]}),D.includes("fleet:manage")?(0,b.jsx)("div",{children:(0,b.jsxs)("a",{className:g.x.secondary,href:(0,d.i)((0,i.N)(F.name,"retire"),C),"data-testid":"outside-party-retire",children:["Retire ",F.name,"…"]})}):null]})}a.s(["N",0,t,"W",0,u,"p",0,s,"J",0,r,"b",0,A,"y",0,v],9181)},56786,a=>{let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call RepeatableSwitch() from the server but RepeatableSwitch is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/web/features/outside-party/ui/repeatable-switch.tsx","RepeatableSwitch");a.s(["RepeatableSwitch",0,b])},35670,a=>{var b=a.i(56786);a.n(b)}]})();
2
-
3
- //# sourceMappingURL=web_features_outside-party_0_9c27knfvw7u._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../web/features/outside-party/tools-table/ui/agent-needs.tsx/__nextjs-internal-proxy.mjs%20%7B%20server%20%3D%3E%20%22%5Bproject%5D/web/features/outside-party/tools-table/ui/agent-needs.tsx%22%20%7D","../../../../../web/features/outside-party/tools-table/ui/tools-table.tsx/__nextjs-internal-proxy.mjs%20%7B%20server%20%3D%3E%20%22%5Bproject%5D/web/features/outside-party/tools-table/ui/tools-table.tsx%22%20%7D","../../../../../web/features/outside-party/ui/outside-party.tsx","../../../../../web/features/outside-parties/scope-words.ts","../../../../../web/features/outside-party/tools-table/table-tools.ts","../../../../../web/features/outside-party/tools-table/ui/tools-section.tsx","../../../../../web/features/outside-party/tools-table/ui/tools-skeleton.tsx","../../../../../web/features/outside-party/ui/repeatable-switch.tsx/__nextjs-internal-proxy.mjs%20%7B%20server%20%3D%3E%20%22%5Bproject%5D/web/features/outside-party/ui/repeatable-switch.tsx%22%20%7D"],"sourcesContent":["// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport const AgentNeeds = registerClientReference(\n function() { throw new Error(\"Attempted to call AgentNeeds() from the server but AgentNeeds is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/web/features/outside-party/tools-table/ui/agent-needs.tsx\",\n \"AgentNeeds\",\n);\n","// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport const ToolsTable = registerClientReference(\n function() { throw new Error(\"Attempted to call ToolsTable() from the server but ToolsTable is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/web/features/outside-party/tools-table/ui/tools-table.tsx\",\n \"ToolsTable\",\n);\n","import { Suspense, type ReactNode } from 'react';\n\nimport { inFleet } from '../../../lib/gateway-api/page-account';\nimport { readOf, type SignedInPage } from '../../../lib/gateway-api/page-api';\nimport { CREDENTIAL_KINDS } from '../../forms/server-credential';\nimport { BUTTONS, CARD } from '../../forms/ui/look';\nimport { outsideAddressOf, PARTY_KINDS, PARTY_STATES, SIDES, type ListedParty } from '../../outside-parties/party-kinds';\nimport { OUTSIDE_PARTIES_PATH, partyPath } from '../../outside-parties/paths';\nimport { scopeWords } from '../../outside-parties/scope-words';\nimport { StatusBadge, Tag } from '../../outside-parties/ui/status-badge';\nimport { AgentNeeds } from '../tools-table/ui/agent-needs';\nimport { approvalOf, ToolsSection } from '../tools-table/ui/tools-section';\nimport { ToolsSkeleton } from '../tools-table/ui/tools-skeleton';\nimport { RepeatableSwitch } from './repeatable-switch';\n\n/** The scopes that change a party's owner, its scopes, and retire it (0056). */\nexport const OWNING_SCOPE = 'fleet:owner';\nexport const GRANTING_SCOPE = 'scopes:grant';\nexport const RETIRING_SCOPE = 'fleet:manage';\n\n/** The scope that switches a server's tools (aeolus-fleet#1151) and marks an A2A agent (A9). */\nexport const APPROVING_SCOPE = 'gateway:approve';\n\n/** The way back to the list, in the page's fleet. */\nexport function Back({ fleetId }: { fleetId: string }) {\n return (\n <a href={inFleet(OUTSIDE_PARTIES_PATH, fleetId)} className=\"text-muted-foreground hover:text-foreground\">\n ← Outside parties\n </a>\n );\n}\n\n/** Why the API refused: said in place of the page. */\nexport function Refusal({ children }: { children: ReactNode }) {\n return (\n <p role=\"alert\" className=\"rounded-md border border-tone-attention-border bg-tone-attention-bg px-3 py-2 text-tone-attention-fg\">\n {children}\n </p>\n );\n}\n\n/** What a party's outside address is called on its page. */\nconst ADDRESS_LABELS: Record<ListedParty['kind'], string> = { mcpServer: 'Address', mcpClient: 'Client id', a2aClient: 'Address', a2aAgent: 'Card address' };\n\nconst UNKNOWN = <span className=\"text-muted-foreground\">Not known</span>;\n\nfunction Fact({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div className=\"grid gap-1 sm:grid-cols-[10rem_1fr]\">\n <dt className=\"text-muted-foreground\">{label}</dt>\n <dd className=\"flex flex-wrap items-center gap-2\">{children}</dd>\n </div>\n );\n}\n\n/** The party's head: its name, protocol, side and state. */\nexport function PartyHead({ party }: { party: ListedParty }) {\n const { protocol, side } = PARTY_KINDS[party.kind];\n const state = PARTY_STATES[party.state];\n return (\n <div className=\"flex flex-wrap items-center gap-2\">\n <h1 className=\"text-title font-semibold\">{party.name}</h1>\n <Tag>{protocol}</Tag>\n <Tag>{SIDES[side].one}</Tag>\n <StatusBadge tone={state.tone} label={state.label} />\n </div>\n );\n}\n\n/**\n * One outside party (design B, screens 12 and 14): its proxy ship's state,\n * then its facts as the fleet holds them, and for an MCP server the tools\n * it lists now as a table, with the switch and the scopes each needs\n * (aeolus-fleet#1151, gateway scopes 4.3); for an A2A agent the scopes it\n * needs and its repeatable mark, a switch for an approver (A9). Each control shows only to an account holding\n * its scope; the API checks it again.\n */\nexport async function OutsideParty({ page, name }: { page: SignedInPage; name: string }) {\n const { api, fleetId, scopes } = page;\n const read = await readOf(api.parties.get.query({ name }));\n if (!read.isOk) {\n return (\n <div className=\"grid gap-4\">\n <Back fleetId={fleetId} />\n <Refusal>{read.refusal}</Refusal>\n </div>\n );\n }\n const party = read.value;\n const address = outsideAddressOf(party);\n const isApprover = scopes.includes(APPROVING_SCOPE);\n const [cards, agentNeeds] = await Promise.all([\n party.kind === 'a2aClient' ? readOf(api.parties.cardAddresses.query({ name })) : undefined,\n party.kind === 'a2aAgent' ? Promise.all([readOf(api.parties.scopeRequirements.query({ name })), isApprover ? approvalOf({ api, name }) : { canChange: false, listed: null, reason: null }]) : undefined,\n ]);\n const change = (\n <a href={inFleet(partyPath(party.name, 'change'), fleetId)} className=\"text-primary hover:underline\" data-testid=\"outside-party-change\">\n Change\n </a>\n );\n return (\n <div className=\"grid gap-4\">\n <Back fleetId={fleetId} />\n <PartyHead party={party} />\n <dl className={`${CARD} grid gap-3`}>\n <Fact label=\"Proxy ship\">{party.proxyShipName ?? UNKNOWN}</Fact>\n <Fact label=\"Owner\">\n {party.ownerName ?? UNKNOWN}\n {scopes.includes(OWNING_SCOPE) ? change : null}\n </Fact>\n <Fact label=\"Scopes\">\n {party.scopes === null\n ? UNKNOWN\n : party.scopes.map((scope) => <Tag key={scope}>{scopeWords(scope)}</Tag>)}\n {scopes.includes(GRANTING_SCOPE) ? change : null}\n </Fact>\n {party.kind === 'mcpServer' || party.kind === 'a2aAgent' ? <Fact label=\"Credential\">{CREDENTIAL_KINDS.find(({ kind }) => kind === party.credentialKind)?.label}</Fact> : null}\n {address === null ? null : (\n <Fact label={ADDRESS_LABELS[party.kind]}>\n <span className=\"font-mono\">{address}</span>\n </Fact>\n )}\n {party.kind === 'a2aAgent' ? (\n <>\n <Fact label=\"Messages at once\">{party.concurrencyLimit}</Fact>\n <Fact label=\"Needs\">\n {agentNeeds === undefined ? null : agentNeeds[0].isOk ? (\n <AgentNeeds fleetId={fleetId} party={party.name} version={agentNeeds[0].value.version} scopes={agentNeeds[0].value.party} listed={agentNeeds[1].listed} canChange={agentNeeds[1].canChange} />\n ) : (\n <span className=\"text-muted-foreground\">{agentNeeds[0].refusal}</span>\n )}\n </Fact>\n <Fact label=\"Repeatable\">\n {scopes.includes(APPROVING_SCOPE) ? <RepeatableSwitch fleetId={fleetId} party={party.name} isRepeatable={party.isRepeatable} /> : <Tag>{party.isRepeatable ? 'Repeatable' : 'Not repeatable'}</Tag>}\n </Fact>\n </>\n ) : null}\n </dl>\n {party.kind === 'mcpServer' ? (\n <section className={`${CARD} grid gap-3`} data-testid=\"outside-party-tools\">\n <h2 className=\"text-section font-semibold\">Tools</h2>\n <p className=\"text-muted-foreground\">\n The fleet may call only the tools switched on, and a calling ship must hold every scope a tool needs; every ship that may reach {party.name} reaches the same tools. {isApprover ? null : 'Changing them needs gateway:approve.'}\n </p>\n <Suspense fallback={<ToolsSkeleton party={party.name} />}>\n <ToolsSection api={api} fleetId={fleetId} name={party.name} isApprover={isApprover} />\n </Suspense>\n </section>\n ) : null}\n {cards === undefined ? null : (\n <section className={`${CARD} grid gap-2`} data-testid=\"outside-party-cards\">\n <h2 className=\"flex justify-between text-section font-semibold\">\n <span>Card addresses</span>\n {cards.isOk ? <span>{cards.value.addresses.length}</span> : null}\n </h2>\n <p className=\"text-muted-foreground\">One per ship its proxy ship reaches now. Its owner hands them to the client.</p>\n {!cards.isOk ? (\n <p className=\"text-muted-foreground\">{cards.refusal}</p>\n ) : cards.value.addresses.length === 0 ? (\n <p className=\"text-muted-foreground\">It reaches no ship now.</p>\n ) : (\n <ul className=\"grid gap-1\">\n {cards.value.addresses.map((address) => (\n <li key={address} className=\"break-all font-mono text-code\">\n {address}\n </li>\n ))}\n </ul>\n )}\n </section>\n )}\n {scopes.includes(RETIRING_SCOPE) ? (\n <div>\n <a className={BUTTONS.secondary} href={inFleet(partyPath(party.name, 'retire'), fleetId)} data-testid=\"outside-party-retire\">\n Retire {party.name}…\n </a>\n </div>\n ) : null}\n </div>\n );\n}\n","import { CORE_SCOPE_DESCRIPTIONS, scopeSchema } from '@aeolus-fleet/common';\n\n/** A scope in plain words: what a core scope allows, as the fleet words it (decision 0046); a plugin's scope by its name. */\nexport function scopeWords(scope: string): string {\n const core = scopeSchema.safeParse(scope);\n return core.success ? CORE_SCOPE_DESCRIPTIONS[core.data] : scope;\n}\n","/**\n * The rows of an outside MCP server's tools table (gateway scopes 4.3):\n * each tool the server lists now, with its switch, the hints it gives and\n * the scopes it needs of its own; and the filters an approver narrows them by.\n */\nimport type { Read } from '../../../lib/gateway-api/page-api';\n\n/** A tool as the server lists it now, with its switch, as the API answers it. */\nexport interface ListedTool {\n name: string;\n description?: string | undefined;\n isReadOnly?: boolean | undefined;\n isDestructive?: boolean | undefined;\n isOn: boolean;\n isNew: boolean;\n}\n\n/** A party's required scopes as the API answers them. */\nexport interface PartyRequirements {\n version: number;\n party: string[];\n tools: { tool: string; scopes: string[] }[];\n}\n\n/** One row: the tool, its switch (unknown while the server does not answer), and the scopes it needs of its own. */\nexport interface TableTool {\n name: string;\n description?: string | undefined;\n isReadOnly?: boolean | undefined;\n isDestructive?: boolean | undefined;\n isOn: boolean | null;\n isNew: boolean;\n scopes: readonly string[];\n}\n\n/**\n * The rows: every tool the server lists with what it needs; while the server\n * does not answer, the requirements kept per tool name, so they can still be\n * read and changed.\n */\nexport function tableToolsOf({ read, requirements }: { read: Read<{ tools: ListedTool[] }>; requirements: PartyRequirements }): TableTool[] {\n const own = new Map(requirements.tools.map(({ tool, scopes }) => [tool, scopes]));\n if (!read.isOk) {\n return requirements.tools.map(({ tool, scopes }) => ({ name: tool, isOn: null, isNew: false, scopes }));\n }\n return read.value.tools.map((tool) => ({ ...tool, scopes: own.get(tool.name) ?? [] }));\n}\n\n/** The table's state filter. */\nexport const STATE_FILTERS = [\n { state: 'all', label: 'All' },\n { state: 'on', label: 'On' },\n { state: 'off', label: 'Off' },\n { state: 'new', label: 'New' },\n { state: 'needsNothing', label: 'Needs nothing' },\n] as const;\n\nexport type StateFilter = (typeof STATE_FILTERS)[number]['state'];\n\nfunction isInState(tool: TableTool, { state, partyScopes }: { state: StateFilter; partyScopes: readonly string[] }): boolean {\n switch (state) {\n case 'all':\n return true;\n case 'on':\n return tool.isOn === true;\n case 'off':\n return tool.isOn === false;\n case 'new':\n return tool.isNew;\n case 'needsNothing':\n return partyScopes.length === 0 && tool.scopes.length === 0;\n }\n}\n\n/** The tools whose name holds the text, in any case, and that are in the state picked. */\nexport function shownTools(tools: readonly TableTool[], filter: { name: string; state: StateFilter; partyScopes: readonly string[] }): TableTool[] {\n const name = filter.name.trim().toLowerCase();\n return tools.filter((tool) => tool.name.toLowerCase().includes(name) && isInState(tool, filter));\n}\n\n/** What the page kept since it read the rows: each changed tool's own scopes, and each switched tool's switch. */\nexport interface KeptChanges {\n scopes: ReadonlyMap<string, readonly string[]>;\n switches: ReadonlyMap<string, boolean>;\n}\n\n/** The rows with what was kept since they were read, so a change shows at once rather than when the page reads the server again. */\nexport function keptToolsOf(tools: readonly TableTool[], kept: KeptChanges): TableTool[] {\n return tools.map((tool) => ({ ...tool, scopes: kept.scopes.get(tool.name) ?? tool.scopes, isOn: tool.isOn === null ? null : (kept.switches.get(tool.name) ?? tool.isOn) }));\n}\n","import type { GatewayApi } from '../../../../lib/gateway-api/gateway-api';\nimport { readOf } from '../../../../lib/gateway-api/page-api';\nimport { tableToolsOf } from '../table-tools';\nimport { ToolsTable } from './tools-table';\n\n/** Whether the actor approves the party, and the scopes the fleet lists when it does: what the controls need. */\nexport async function approvalOf({ api, name }: { api: GatewayApi; name: string }) {\n const approving = await readOf(api.parties.approving.query({ name }));\n const canChange = approving.isOk && approving.value.isApproving;\n const listed = canChange ? await readOf(api.parties.listedScopes.query()) : undefined;\n return {\n canChange: canChange && listed?.isOk === true,\n listed: listed?.isOk === true ? listed.value.scopes : null,\n /** Why the controls are not shown, when the actor holds gateway:approve but may not use them now. */\n reason: approving.isOk ? (approving.value.isApproving ? (listed?.isOk === false ? listed.refusal : null) : approving.value.reason) : approving.refusal,\n };\n}\n\n/**\n * An outside MCP server's tools section (gateway scopes 4.3): the tools the\n * server lists now, the scopes each needs, and whether the actor may change\n * them, read side by side. It streams in behind skeleton rows, as the\n * server's tools/list may take a while.\n */\nexport async function ToolsSection({ api, fleetId, name, isApprover }: { api: GatewayApi; fleetId: string; name: string; isApprover: boolean }) {\n const [read, requirements, approval] = await Promise.all([\n readOf(api.parties.tools.query({ name })),\n readOf(api.parties.scopeRequirements.query({ name })),\n isApprover ? approvalOf({ api, name }) : { canChange: false, listed: null, reason: null },\n ]);\n if (!requirements.isOk) {\n return <p className=\"text-muted-foreground\">{requirements.refusal}</p>;\n }\n return (\n <div className=\"grid gap-3\">\n {approval.reason === null ? null : (\n <p className=\"text-muted-foreground\" data-testid=\"tools-table-read-only-reason\">\n You see these read-only: {approval.reason}\n </p>\n )}\n <ToolsTable\n fleetId={fleetId}\n party={name}\n tools={tableToolsOf({ read, requirements: requirements.value })}\n version={requirements.value.version}\n partyScopes={requirements.value.party}\n listed={approval.listed}\n canChange={approval.canChange}\n serverRefusal={read.isOk ? null : read.refusal}\n />\n </div>\n );\n}\n","/** How many rows the table shows while the server's tools/list is read. */\nconst SKELETON_ROWS = 8;\n\n/** The tools table's shape while the server's tools/list is read (gateway scopes 4.3). */\nexport function ToolsSkeleton({ party }: { party: string }) {\n return (\n <div aria-busy=\"true\" aria-label={`Reading the tools ${party} lists`} className=\"grid gap-2\" data-testid=\"tools-table-skeleton\">\n <span className=\"block h-9 w-full animate-pulse rounded-md bg-muted\" />\n {Array.from({ length: SKELETON_ROWS }, (_, row) => (\n <span key={row} className=\"block h-10 animate-pulse rounded-md bg-muted\" />\n ))}\n </div>\n );\n}\n","// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport const RepeatableSwitch = registerClientReference(\n function() { throw new Error(\"Attempted to call RepeatableSwitch() from the server but RepeatableSwitch is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/web/features/outside-party/ui/repeatable-switch.tsx\",\n \"RepeatableSwitch\",\n);\n"],"names":["AgentNeeds","Error","ToolsTable","scopeWords","scope","core","safeParse","success","data","RepeatableSwitch"],"mappings":"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","ignoreList":[0,1,7]}
@@ -1,3 +0,0 @@
1
- (()=>{"use strict";module.exports=[72839,a=>{var b=a.i(87924),c=a.i(72131),d=a.i(5050);let e=(0,d.createServerReference)("4014aa056bb50c82c4c5d043ea43cf93b62d271403",d.callServer,void 0,d.findSourceMapURL,"answerDelivery"),f=(0,d.createServerReference)("60879627fcb3859acdcedd271cee07b8efe6779f22",d.callServer,void 0,d.findSourceMapURL,"doneDelivery"),g=(0,d.createServerReference)("60c83e83c134744a861bfcd84946e8939c2b708f6d",d.callServer,void 0,d.findSourceMapURL,"openDelivery");var h=a.i(1542),i=a.i(24229);function j({delivery:a,meetingHref:c,note:d,working:e,failure:f,onNoteChange:g,onAnswer:k,onDone:l,onBack:m}){let{question:n}=a,o=void 0!==e,p=n?.options.find(a=>a.key===n.pick.option);return(0,b.jsxs)("section",{"data-testid":"overview-delivery",className:"grid gap-3 rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm",children:[(0,b.jsxs)("span",{className:"text-caption text-muted-foreground",children:[a.from," · ",new Date(a.sentAt).toUTCString()]}),(0,b.jsx)("h2",{className:"text-heading font-semibold",children:n?.title??a.title}),void 0===c?null:(0,b.jsx)("a",{"data-testid":"overview-meeting",href:c,className:"inline-flex h-9 items-center justify-self-start rounded-md bg-primary px-4 text-primary-foreground hover:bg-primary-hover",children:"Go to the meeting"}),void 0===n?(0,b.jsx)("pre",{className:"whitespace-pre-wrap rounded-md bg-muted p-3 font-mono text-caption",children:a.payload}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("p",{className:"whitespace-pre-wrap",children:n.context}),(0,b.jsx)("div",{className:"flex flex-wrap gap-2",children:n.options.map(a=>(0,b.jsx)(h.f,{title:a.detail,variant:a.key===n.pick.option?"primary":"secondary",className:a.key===n.pick.option?"outline-2 outline-offset-2 outline-dashed outline-ring":"",isPending:e?.kind==="option"&&e.option===a.key,pendingLabel:"Sending...",disabled:o,onClick:()=>{k(a.key)},children:a.label},a.key))}),void 0===p?null:(0,b.jsxs)("p",{className:"text-muted-foreground",children:[p.label," is the pick of ",a.from,": ",n.pick.why]})]}),(0,b.jsxs)("label",{className:"grid gap-1",children:[(0,b.jsx)("span",{children:void 0===n?"Your answer":"Note"}),(0,b.jsx)("textarea",{"data-testid":"overview-note",rows:2,value:d,onChange:a=>{g(a.target.value)},placeholder:void 0===n?"":"Optional, sent with your answer",className:"rounded-md border border-input bg-background p-2"})]}),void 0===f?null:(0,b.jsx)(i.f,{message:f,isFailure:!0}),(0,b.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,b.jsx)(h.f,{"data-testid":"overview-answer",variant:void 0===n?"primary":"secondary",isPending:e?.kind==="note",pendingLabel:"Sending...",disabled:o,onClick:()=>{k(void 0)},children:void 0===n?"Answer":"Send the note alone"}),void 0===n?(0,b.jsx)(h.f,{"data-testid":"overview-done",isPending:e?.kind==="done",pendingLabel:"Marking done...",disabled:o,onClick:l,children:"Done"}):null,(0,b.jsx)("button",{type:"button",onClick:m,disabled:o,className:"inline-flex h-9 items-center rounded-md px-4 text-muted-foreground hover:bg-accent disabled:opacity-70",children:"Back to the inbox"})]})]})}function k({entry:a}){return(0,b.jsxs)("span",{className:"flex min-w-0 flex-1 flex-col text-left",children:[(0,b.jsx)("span",{className:"truncate",children:a.title}),(0,b.jsxs)("span",{className:"text-caption text-muted-foreground",children:["from ",a.from]})]})}function l({waitingCount:a,waiting:c,opened:d,openingId:e,failure:f,onOpen:g}){return(0,b.jsxs)("div",{className:"grid gap-6",children:[0===c.length?null:(0,b.jsxs)("section",{className:"grid gap-2",children:[(0,b.jsxs)("h2",{className:"text-section font-semibold",children:["Next · ",a]}),c.map(a=>(0,b.jsxs)("div",{className:"grid min-w-0 gap-2 rounded-md border border-border bg-card p-3",children:[(0,b.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,b.jsx)(k,{entry:a}),(0,b.jsx)(h.f,{"data-testid":"overview-open",isPending:e===a.deliveryId,pendingLabel:"Opening...",disabled:void 0!==e,onClick:()=>{g(a)},children:"Open"})]}),f?.deliveryId===a.deliveryId?(0,b.jsx)(i.f,{message:f.message,isFailure:!0}):null]},a.deliveryId))]}),0===d.length?null:(0,b.jsxs)("section",{className:"grid gap-2",children:[(0,b.jsxs)("h2",{className:"text-section font-semibold",children:["Opened, not yet dealt with · ",d.length]}),d.map(a=>(0,b.jsxs)("div",{className:"grid min-w-0 gap-2 rounded-md border border-border bg-card p-3",children:[(0,b.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,b.jsx)(k,{entry:a}),(0,b.jsx)(h.f,{"data-testid":"overview-deal",isPending:e===a.deliveryId,pendingLabel:"Opening...",disabled:void 0!==e,onClick:()=>{g(a)},children:"Answer or be done"})]}),f?.deliveryId===a.deliveryId?(0,b.jsx)(i.f,{message:f.message,isFailure:!0}):null]},a.deliveryId))]})]})}a.s(["InboxPanel",0,function({fleetId:a,inbox:d}){let[h,k]=(0,c.useState)(),[m,n]=(0,c.useState)(""),[o,p]=(0,c.useState)(),[q,r]=(0,c.useState)(),[s,t]=(0,c.useState)(),[u,v]=(0,c.useState)(),[w,x]=(0,c.useState)(),[,y]=(0,c.useTransition)(),z=({control:a,action:b,said:c})=>{r(a),v(void 0),y(async()=>{let a=await b();r(void 0),a.isOk?(k(void 0),x(c)):v(a.message)})};if(void 0!==h){var A;let c;return(0,b.jsx)(j,{delivery:h,meetingHref:void 0===h.meetingId?void 0:(c=new URLSearchParams({fleet:(A={fleetId:a,meetingId:h.meetingId}).fleetId,...void 0===A.cursor?{}:{cursor:A.cursor}}),`/meetings/${encodeURIComponent(A.meetingId)}?${c.toString()}`),note:m,working:q,failure:u,onNoteChange:n,onAnswer:b=>{z({control:void 0===b?{kind:"note"}:{kind:"option",option:b},action:()=>e({fleet:a,deliveryId:h.deliveryId,input:{questionId:h.question?.id,option:b,note:m}}),said:`Your answer went to ${h.from}.`})},onDone:()=>{z({control:{kind:"done"},action:()=>f(a,h.deliveryId),said:`Done with “${h.title}”.`})},onBack:()=>{k(void 0)}})}return(0,b.jsxs)("div",{className:"grid gap-4",children:[void 0===w?null:(0,b.jsx)(i.f,{message:w,isFailure:!1}),(0,b.jsx)(l,{waitingCount:d.waiting,waiting:d.deliveries,opened:d.opened,openingId:o,failure:s,onOpen:b=>{p(b.deliveryId),t(void 0),x(void 0),y(async()=>{let c=await g(a,b.deliveryId);(p(void 0),c.isOk)?(k(c.value),n(""),v(void 0),x(void 0)):t({deliveryId:b.deliveryId,message:c.message})})}})]})}],72839)},50850,a=>{var b=a.i(87924),c=a.i(72131),d=a.i(5050);let e=(0,d.createServerReference)("6017c749753af49b1a92ac65eefd34fb3013277ed0",d.callServer,void 0,d.findSourceMapURL,"turnEmail");var f=a.i(1542),g=a.i(24229);let h=(0,d.createServerReference)("60c5ea0de7f3955f10be5a2689cc88f9c20e116d9d",d.callServer,void 0,d.findSourceMapURL,"turnOffWebPush"),i=(0,d.createServerReference)("60e774ea1bc22f071020621a68eaa0f19648488f7e",d.callServer,void 0,d.findSourceMapURL,"turnOnWebPush"),j=[[/Edg\//,"Edge"],[/Firefox\//,"Firefox"],[/Chrome\//,"Chrome"],[/Safari\//,"Safari"]],k=[[/iPhone|iPad/,"iOS"],[/Android/,"Android"],[/Mac OS X/,"macOS"],[/Windows/,"Windows"],[/Linux/,"Linux"]],l=(a,b)=>b.find(([b])=>b.test(a))?.[1],m="/wake-worker.js";async function n(){let a=await navigator.serviceWorker.getRegistration(m);return await a?.pushManager.getSubscription()??null}async function o(a){let b;if(await Notification.requestPermission()!=="granted")return{isOk:!1,message:"Your browser did not allow notifications from this site: allow them, then turn web push on again"};let c=await navigator.serviceWorker.register(m);return await navigator.serviceWorker.ready,{isOk:!0,value:await c.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:(b=atob(a.replaceAll("-","+").replaceAll("_","/")),Uint8Array.from(b,a=>a.charCodeAt(0)))})}}function p({fleetId:a,webPushKey:d,browsers:e}){let[m,q]=(0,c.useState)(!0),[r,s]=(0,c.useState)(),[t,u]=(0,c.useState)(),[v,w]=(0,c.useState)(),[,x]=(0,c.useTransition)();(0,c.useEffect)(()=>{"serviceWorker"in navigator&&"PushManager"in window&&"Notification"in window?n().then(a=>{s(a?.endpoint)}):q(!1)},[]);let y=void 0!==r&&e.some(({endpoint:a,isGone:b})=>a===r&&!b);return(0,b.jsxs)("div",{className:"grid gap-2","data-testid":"overview-wake-web-push",children:[e.map(({endpoint:c,browser:d,addedAt:e,isGone:g})=>(0,b.jsxs)("div",{className:"flex items-center gap-3 rounded-md border border-border bg-card p-3",children:[(0,b.jsxs)("span",{className:"flex min-w-0 flex-1 flex-col",children:[(0,b.jsxs)("span",{className:"truncate",children:["Web push in ",d,c===r?" · this browser":""]}),(0,b.jsx)("span",{className:"text-caption text-muted-foreground",children:g?"No longer takes wakes: its push service ended them. Turn web push on again in that browser, or remove it.":`On since ${new Date(e).toLocaleDateString()}: it tells you when something waits in this fleet, with a link here. Never what waits.`})]}),(0,b.jsx)(f.f,{"data-testid":"overview-web-push-remove",isPending:t===c,pendingLabel:"Removing...",disabled:void 0!==t,onClick:()=>{u(c),w(void 0),x(async()=>{c===r&&(await (await n())?.unsubscribe(),s(void 0));let b=await h(a,c);u(void 0),b.isOk||w(b.message)})},children:"Remove"})]},c)),m?y?null:(0,b.jsx)("div",{children:(0,b.jsx)(f.f,{"data-testid":"overview-web-push-on",variant:"primary",isPending:"on"===t,pendingLabel:"Turning on...",disabled:void 0!==t,onClick:()=>{u("on"),w(void 0),x(async()=>{try{var b;let c,e,f=await o(d);if(!f.isOk)return void w(f.message);let g=function(a,b){let{endpoint:c,keys:d}=a,e=d?.p256dh,f=d?.auth;return void 0===c||void 0===e||void 0===f?void 0:{endpoint:c,keys:{p256dh:e,auth:f},browser:b}}(f.value.toJSON(),(b=navigator.userAgent,c=l(b,j),e=l(b,k),void 0===c?"A browser":void 0===e?c:`${c} on ${e}`));if(void 0===g)return void w("Your browser gave no push subscription: try again");let h=await i(a,g);h.isOk?s(g.endpoint):w(h.message)}catch{w("Your browser could not turn web push on: try again")}finally{u(void 0)}})},children:"Turn on web push in this browser"})}):(0,b.jsx)("p",{className:"text-caption text-muted-foreground",children:"This browser takes no web push."}),void 0===v?null:(0,b.jsx)(g.f,{message:v,isFailure:!0})]})}a.s(["WakePanel",0,function({fleetId:a,channels:d}){let[h,i]=(0,c.useTransition)(),[j,k]=(0,c.useState)(),{email:l,webPush:m}=d;return l.isOffered||null!==m.publicKey?(0,b.jsxs)("section",{className:"grid gap-2","aria-labelledby":"overview-wake-heading",children:[(0,b.jsx)("h2",{id:"overview-wake-heading",className:"text-section font-semibold",children:"When something waits"}),l.isOffered?(0,b.jsxs)("div",{className:"flex items-center gap-3 rounded-md border border-border bg-card p-3",children:[(0,b.jsxs)("span",{className:"flex min-w-0 flex-1 flex-col",children:[(0,b.jsx)("span",{children:"Email"}),(0,b.jsx)("span",{"data-testid":"overview-wake-email-state",className:"text-caption text-muted-foreground",children:l.isOn?"On: you get an email when something waits for you in this fleet, with a link here. Never what waits.":"Off: nothing tells you when something waits while you are away."})]}),(0,b.jsx)(f.f,{"data-testid":"overview-wake-email",isPending:h,pendingLabel:l.isOn?"Turning off...":"Turning on...",onClick:()=>{var b;b=!l.isOn,k(void 0),i(async()=>{let c=await e(a,b);c.isOk||k(c.message)})},children:l.isOn?"Turn off":"Turn on"})]}):null,void 0===j?null:(0,b.jsx)(g.f,{message:j,isFailure:!0}),null===m.publicKey?null:(0,b.jsx)(p,{fleetId:a,webPushKey:m.publicKey,browsers:m.browsers})]}):null}],50850)}]})();
2
-
3
- //# sourceMappingURL=web_features_overview_state_1wuk95dw2_whp._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../web/features/overview/state/inbox-panel.tsx","../../../../../web/features/meeting/paths.ts","../../../../../web/features/overview/hooks/data%3A8fa33e%20%3Ctext/javascript%3E","../../../../../web/features/overview/hooks/data%3A6c6af6%20%3Ctext/javascript%3E","../../../../../web/features/overview/hooks/data%3Ad79040%20%3Ctext/javascript%3E","../../../../../web/features/overview/ui/delivery-card.tsx","../../../../../web/features/overview/ui/inbox-list.tsx","../../../../../web/features/overview/state/wake-panel.tsx","../../../../../web/features/overview/hooks/data%3A021a29%20%3Ctext/javascript%3E","../../../../../web/features/overview/hooks/data%3Ae06868%20%3Ctext/javascript%3E","../../../../../web/features/overview/hooks/data%3Aea3978%20%3Ctext/javascript%3E","../../../../../web/features/overview/services/web-push.ts","../../../../../web/features/overview/state/web-push-panel.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useTransition } from 'react';\n\nimport { meetingPathOf } from '../../meeting/paths';\nimport { answerDelivery, doneDelivery, openDelivery, type ActionOutcome } from '../hooks/overview-actions';\nimport type { FocusedDelivery, Inbox, InboxEntry } from '../services/deliveries';\nimport { DeliveryCard, type DeliveryControl } from '../ui/delivery-card';\nimport { InboxList } from '../ui/inbox-list';\nimport { Notice } from '../ui/notice';\n\n/**\n * The person's inbox with one delivery in focus at a time. Opening is their\n * own act, so it is a press, never a link: the gateway acknowledges the\n * delivery for them, and it is shown whole. One they opened before opens\n * again whole, as the fleet reads it again (aeolus-fleet #1046), so the way\n * to its meeting stays. Answering or being done says so in place, and the\n * inbox reads itself again.\n */\nexport function InboxPanel({ fleetId, inbox }: { fleetId: string; inbox: Inbox }) {\n const [focus, setFocus] = useState<FocusedDelivery | undefined>();\n const [note, setNote] = useState('');\n const [openingId, setOpeningId] = useState<string | undefined>();\n const [working, setWorking] = useState<DeliveryControl | undefined>();\n const [openFailure, setOpenFailure] = useState<{ deliveryId: string; message: string } | undefined>();\n const [failure, setFailure] = useState<string | undefined>();\n const [done, setDone] = useState<string | undefined>();\n const [, startTransition] = useTransition();\n\n const show = (delivery: FocusedDelivery) => {\n setFocus(delivery);\n setNote('');\n setFailure(undefined);\n setDone(undefined);\n };\n\n const open = (entry: InboxEntry) => {\n setOpeningId(entry.deliveryId);\n setOpenFailure(undefined);\n setDone(undefined);\n startTransition(async () => {\n const outcome = await openDelivery(fleetId, entry.deliveryId);\n setOpeningId(undefined);\n if (outcome.isOk) {\n show(outcome.value);\n } else {\n setOpenFailure({ deliveryId: entry.deliveryId, message: outcome.message });\n }\n });\n };\n\n const settle = ({ control, action, said }: { control: DeliveryControl; action: () => Promise<ActionOutcome<undefined>>; said: string }) => {\n setWorking(control);\n setFailure(undefined);\n startTransition(async () => {\n const outcome = await action();\n setWorking(undefined);\n if (outcome.isOk) {\n setFocus(undefined);\n setDone(said);\n } else {\n setFailure(outcome.message);\n }\n });\n };\n\n if (focus !== undefined) {\n return (\n <DeliveryCard\n delivery={focus}\n meetingHref={focus.meetingId === undefined ? undefined : meetingPathOf({ fleetId, meetingId: focus.meetingId })}\n note={note}\n working={working}\n failure={failure}\n onNoteChange={setNote}\n onAnswer={(option) => { settle({ control: option === undefined ? { kind: 'note' } : { kind: 'option', option }, action: () => answerDelivery({ fleet: fleetId, deliveryId: focus.deliveryId, input: { questionId: focus.question?.id, option, note } }), said: `Your answer went to ${focus.from}.` }); }\n }\n onDone={() => { settle({ control: { kind: 'done' }, action: () => doneDelivery(fleetId, focus.deliveryId), said: `Done with “${focus.title}”.` }); }}\n onBack={() => { setFocus(undefined); }}\n />\n );\n }\n return (\n <div className=\"grid gap-4\">\n {done === undefined ? null : <Notice message={done} isFailure={false} />}\n <InboxList\n waitingCount={inbox.waiting}\n waiting={inbox.deliveries}\n opened={inbox.opened}\n openingId={openingId}\n failure={openFailure}\n onOpen={open}\n />\n </div>\n );\n}\n","/** Where a meeting's page is, for server and client code alike. */\n\n/** The meeting page's address, before the meeting's id. */\nexport const MEETINGS_PATH = '/meetings';\n\n/** The address of a meeting's page in a fleet, at the page of contributions after the cursor, if one is given. */\nexport function meetingPathOf(meeting: { fleetId: string; meetingId: string; cursor?: string }): string {\n const query = new URLSearchParams({ fleet: meeting.fleetId, ...(meeting.cursor === undefined ? {} : { cursor: meeting.cursor }) });\n return `${MEETINGS_PATH}/${encodeURIComponent(meeting.meetingId)}?${query.toString()}`;\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"4014aa056bb50c82c4c5d043ea43cf93b62d271403\":{\"name\":\"answerDelivery\"}},\"web/features/overview/hooks/overview-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_1=/*#__PURE__*/createServerReference(\"4014aa056bb50c82c4c5d043ea43cf93b62d271403\",callServer,void 0,findSourceMapURL,\"answerDelivery\");export{$$RSC_SERVER_ACTION_1 as answerDelivery};","/* __next_internal_action_entry_do_not_use__ [{\"60879627fcb3859acdcedd271cee07b8efe6779f22\":{\"name\":\"doneDelivery\"}},\"web/features/overview/hooks/overview-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_2=/*#__PURE__*/createServerReference(\"60879627fcb3859acdcedd271cee07b8efe6779f22\",callServer,void 0,findSourceMapURL,\"doneDelivery\");export{$$RSC_SERVER_ACTION_2 as doneDelivery};","/* __next_internal_action_entry_do_not_use__ [{\"60c83e83c134744a861bfcd84946e8939c2b708f6d\":{\"name\":\"openDelivery\"}},\"web/features/overview/hooks/overview-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"60c83e83c134744a861bfcd84946e8939c2b708f6d\",callServer,void 0,findSourceMapURL,\"openDelivery\");export{$$RSC_SERVER_ACTION_0 as openDelivery};","import type { FocusedDelivery } from '../services/deliveries';\nimport { ActionButton } from './action-button';\nimport { Notice } from './notice';\n\n/** Which of the card's controls is working: an option of the question, the note alone, or done. */\nexport type DeliveryControl = { kind: 'option'; option: number } | { kind: 'note' } | { kind: 'done' };\n\n/**\n * One delivery in focus (design B, Signal). A question is answered with one\n * tap on a button that names the option it sends, the asker's pick on a\n * dashed edge; any delivery may get a note as its answer, and a message may\n * be done with; one of a meeting leads to the meeting.\n */\nexport function DeliveryCard({\n delivery,\n meetingHref,\n note,\n working,\n failure,\n onNoteChange,\n onAnswer,\n onDone,\n onBack,\n}: {\n delivery: FocusedDelivery;\n /** The page of the meeting it belongs to, if it belongs to one. */\n meetingHref: string | undefined;\n note: string;\n working: DeliveryControl | undefined;\n failure: string | undefined;\n onNoteChange: (note: string) => void;\n onAnswer: (option: number | undefined) => void;\n onDone: () => void;\n onBack: () => void;\n}) {\n const { question } = delivery;\n const isWorking = working !== undefined;\n const picked = question?.options.find((option) => option.key === question.pick.option);\n return (\n <section data-testid=\"overview-delivery\" className=\"grid gap-3 rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm\">\n <span className=\"text-caption text-muted-foreground\">\n {delivery.from} · {new Date(delivery.sentAt).toUTCString()}\n </span>\n <h2 className=\"text-heading font-semibold\">{question?.title ?? delivery.title}</h2>\n {meetingHref === undefined ? null : (\n <a data-testid=\"overview-meeting\" href={meetingHref} className=\"inline-flex h-9 items-center justify-self-start rounded-md bg-primary px-4 text-primary-foreground hover:bg-primary-hover\">\n Go to the meeting\n </a>\n )}\n {question === undefined ? (\n <pre className=\"whitespace-pre-wrap rounded-md bg-muted p-3 font-mono text-caption\">{delivery.payload}</pre>\n ) : (\n <>\n <p className=\"whitespace-pre-wrap\">{question.context}</p>\n <div className=\"flex flex-wrap gap-2\">\n {question.options.map((option) => (\n <ActionButton\n key={option.key}\n title={option.detail}\n variant={option.key === question.pick.option ? 'primary' : 'secondary'}\n className={option.key === question.pick.option ? 'outline-2 outline-offset-2 outline-dashed outline-ring' : ''}\n isPending={working?.kind === 'option' && working.option === option.key}\n pendingLabel=\"Sending...\"\n disabled={isWorking}\n onClick={() => { onAnswer(option.key); }}\n >\n {option.label}\n </ActionButton>\n ))}\n </div>\n {picked === undefined ? null : (\n <p className=\"text-muted-foreground\">\n {picked.label} is the pick of {delivery.from}: {question.pick.why}\n </p>\n )}\n </>\n )}\n <label className=\"grid gap-1\">\n <span>{question === undefined ? 'Your answer' : 'Note'}</span>\n <textarea\n data-testid=\"overview-note\"\n rows={2}\n value={note}\n onChange={(event) => { onNoteChange(event.target.value); }}\n placeholder={question === undefined ? '' : 'Optional, sent with your answer'}\n className=\"rounded-md border border-input bg-background p-2\"\n />\n </label>\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n <div className=\"flex flex-wrap gap-2\">\n <ActionButton data-testid=\"overview-answer\" variant={question === undefined ? 'primary' : 'secondary'} isPending={working?.kind === 'note'} pendingLabel=\"Sending...\" disabled={isWorking} onClick={() => { onAnswer(undefined); }}>\n {question === undefined ? 'Answer' : 'Send the note alone'}\n </ActionButton>\n {question === undefined ? (\n <ActionButton data-testid=\"overview-done\" isPending={working?.kind === 'done'} pendingLabel=\"Marking done...\" disabled={isWorking} onClick={onDone}>\n Done\n </ActionButton>\n ) : null}\n <button type=\"button\" onClick={onBack} disabled={isWorking} className=\"inline-flex h-9 items-center rounded-md px-4 text-muted-foreground hover:bg-accent disabled:opacity-70\">\n Back to the inbox\n </button>\n </div>\n </section>\n );\n}\n","import type { InboxEntry } from '../services/deliveries';\nimport { ActionButton } from './action-button';\nimport { Notice } from './notice';\n\nfunction EntryText({ entry }: { entry: InboxEntry }) {\n return (\n <span className=\"flex min-w-0 flex-1 flex-col text-left\">\n <span className=\"truncate\">{entry.title}</span>\n <span className=\"text-caption text-muted-foreground\">from {entry.from}</span>\n </span>\n );\n}\n\n/**\n * The person's inbox in two groups (aeolus-fleet #1046): what waits, which\n * they open one at a time, and what they opened and have not answered or\n * been done with yet, which opens again. A failure to open says why by the\n * delivery.\n */\nexport function InboxList({\n waitingCount,\n waiting,\n opened,\n openingId,\n failure,\n onOpen,\n}: {\n waitingCount: number;\n waiting: readonly InboxEntry[];\n opened: readonly InboxEntry[];\n openingId: string | undefined;\n failure: { deliveryId: string; message: string } | undefined;\n onOpen: (entry: InboxEntry) => void;\n}) {\n return (\n <div className=\"grid gap-6\">\n {waiting.length === 0 ? null : (\n <section className=\"grid gap-2\">\n <h2 className=\"text-section font-semibold\">Next · {waitingCount}</h2>\n {waiting.map((entry) => (\n <div key={entry.deliveryId} className=\"grid min-w-0 gap-2 rounded-md border border-border bg-card p-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <EntryText entry={entry} />\n <ActionButton data-testid=\"overview-open\" isPending={openingId === entry.deliveryId} pendingLabel=\"Opening...\" disabled={openingId !== undefined} onClick={() => { onOpen(entry); }}>\n Open\n </ActionButton>\n </div>\n {failure?.deliveryId === entry.deliveryId ? <Notice message={failure.message} isFailure /> : null}\n </div>\n ))}\n </section>\n )}\n {opened.length === 0 ? null : (\n <section className=\"grid gap-2\">\n <h2 className=\"text-section font-semibold\">Opened, not yet dealt with · {opened.length}</h2>\n {opened.map((entry) => (\n <div key={entry.deliveryId} className=\"grid min-w-0 gap-2 rounded-md border border-border bg-card p-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <EntryText entry={entry} />\n <ActionButton data-testid=\"overview-deal\" isPending={openingId === entry.deliveryId} pendingLabel=\"Opening...\" disabled={openingId !== undefined} onClick={() => { onOpen(entry); }}>\n Answer or be done\n </ActionButton>\n </div>\n {failure?.deliveryId === entry.deliveryId ? <Notice message={failure.message} isFailure /> : null}\n </div>\n ))}\n </section>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useState, useTransition } from 'react';\n\nimport { turnEmail } from '../hooks/overview-actions';\nimport type { WakeChannels } from '../services/deliveries';\nimport { ActionButton } from '../ui/action-button';\nimport { Notice } from '../ui/notice';\nimport { WebPushPanel } from './web-push-panel';\n\n/**\n * Where the person turns on the channels that wake them when something\n * waits for their person ship while they are away (wake a person, W8):\n * email, where the gateway sends it, and web push per browser, where it\n * holds push keys. Nothing is on by default. The wake says only that\n * something waits in the fleet, with a link here. While a page of theirs\n * here is in focus, it shows what arrives and no wake goes out (W6).\n */\nexport function WakePanel({ fleetId, channels }: { fleetId: string; channels: WakeChannels }) {\n const [isTurning, startTransition] = useTransition();\n const [failure, setFailure] = useState<string | undefined>();\n const { email, webPush } = channels;\n if (!email.isOffered && webPush.publicKey === null) {\n return null;\n }\n\n const turn = (isOn: boolean) => {\n setFailure(undefined);\n startTransition(async () => {\n const outcome = await turnEmail(fleetId, isOn);\n if (!outcome.isOk) {\n setFailure(outcome.message);\n }\n });\n };\n\n return (\n <section className=\"grid gap-2\" aria-labelledby=\"overview-wake-heading\">\n <h2 id=\"overview-wake-heading\" className=\"text-section font-semibold\">\n When something waits\n </h2>\n {!email.isOffered ? null : (\n <div className=\"flex items-center gap-3 rounded-md border border-border bg-card p-3\">\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span>Email</span>\n <span data-testid=\"overview-wake-email-state\" className=\"text-caption text-muted-foreground\">\n {email.isOn ? 'On: you get an email when something waits for you in this fleet, with a link here. Never what waits.' : 'Off: nothing tells you when something waits while you are away.'}\n </span>\n </span>\n <ActionButton data-testid=\"overview-wake-email\" isPending={isTurning} pendingLabel={email.isOn ? 'Turning off...' : 'Turning on...'} onClick={() => { turn(!email.isOn); }}>\n {email.isOn ? 'Turn off' : 'Turn on'}\n </ActionButton>\n </div>\n )}\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n {webPush.publicKey === null ? null : <WebPushPanel fleetId={fleetId} webPushKey={webPush.publicKey} browsers={webPush.browsers} />}\n </section>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"6017c749753af49b1a92ac65eefd34fb3013277ed0\":{\"name\":\"turnEmail\"}},\"web/features/overview/hooks/overview-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_3=/*#__PURE__*/createServerReference(\"6017c749753af49b1a92ac65eefd34fb3013277ed0\",callServer,void 0,findSourceMapURL,\"turnEmail\");export{$$RSC_SERVER_ACTION_3 as turnEmail};","/* __next_internal_action_entry_do_not_use__ [{\"60c5ea0de7f3955f10be5a2689cc88f9c20e116d9d\":{\"name\":\"turnOffWebPush\"}},\"web/features/overview/hooks/overview-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_5=/*#__PURE__*/createServerReference(\"60c5ea0de7f3955f10be5a2689cc88f9c20e116d9d\",callServer,void 0,findSourceMapURL,\"turnOffWebPush\");export{$$RSC_SERVER_ACTION_5 as turnOffWebPush};","/* __next_internal_action_entry_do_not_use__ [{\"60e774ea1bc22f071020621a68eaa0f19648488f7e\":{\"name\":\"turnOnWebPush\"}},\"web/features/overview/hooks/overview-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_4=/*#__PURE__*/createServerReference(\"60e774ea1bc22f071020621a68eaa0f19648488f7e\",callServer,void 0,findSourceMapURL,\"turnOnWebPush\");export{$$RSC_SERVER_ACTION_4 as turnOnWebPush};","/**\n * What the overview's section of wakes works out in the browser (wake a\n * person, W8): the name a browser it turns web push on in is listed by, the\n * gateway's push key as the browser's push manager takes it, and the\n * subscription the browser sends the gateway.\n */\n\n/** A browser's push subscription as the gateway takes it, with the browser's name. */\nexport interface SubscriptionInput {\n readonly endpoint: string;\n readonly keys: { readonly p256dh: string; readonly auth: string };\n readonly browser: string;\n}\n\n/** The browsers and systems a name is made of, the first that matches counting: Edge and Chrome also say Safari, and Chrome says Chrome. */\nconst BROWSERS: readonly (readonly [RegExp, string])[] = [\n [/Edg\\//, 'Edge'],\n [/Firefox\\//, 'Firefox'],\n [/Chrome\\//, 'Chrome'],\n [/Safari\\//, 'Safari'],\n];\nconst SYSTEMS: readonly (readonly [RegExp, string])[] = [\n [/iPhone|iPad/, 'iOS'],\n [/Android/, 'Android'],\n [/Mac OS X/, 'macOS'],\n [/Windows/, 'Windows'],\n [/Linux/, 'Linux'],\n];\n\nconst firstOf = (userAgent: string, names: readonly (readonly [RegExp, string])[]): string | undefined => names.find(([pattern]) => pattern.test(userAgent))?.[1];\n\n/** The name a browser is listed by, such as Firefox on Linux, from its user agent. */\nexport function browserNameOf(userAgent: string): string {\n const browser = firstOf(userAgent, BROWSERS);\n const system = firstOf(userAgent, SYSTEMS);\n if (browser === undefined) {\n return 'A browser';\n }\n return system === undefined ? browser : `${browser} on ${system}`;\n}\n\n/** The bytes a base64url key stands for, as the browser's push manager takes the gateway's key. */\nexport function applicationServerKeyOf(key: string): Uint8Array<ArrayBuffer> {\n const binary = atob(key.replaceAll('-', '+').replaceAll('_', '/'));\n return Uint8Array.from(binary, (character) => character.charCodeAt(0));\n}\n\n/** The subscription to send, from the push manager's own, or none when it gave no endpoint or keys. */\nexport function subscriptionInputOf(subscription: { endpoint?: string; keys?: Record<string, string> }, browser: string): SubscriptionInput | undefined {\n const { endpoint, keys } = subscription;\n const p256dh = keys?.p256dh;\n const auth = keys?.auth;\n return endpoint === undefined || p256dh === undefined || auth === undefined ? undefined : { endpoint, keys: { p256dh, auth }, browser };\n}\n","'use client';\n\nimport { useEffect, useState, useTransition } from 'react';\n\nimport { turnOffWebPush, turnOnWebPush } from '../hooks/overview-actions';\nimport type { WakeChannels } from '../services/deliveries';\nimport { applicationServerKeyOf, browserNameOf, subscriptionInputOf } from '../services/web-push';\nimport { ActionButton } from '../ui/action-button';\nimport { Notice } from '../ui/notice';\n\n/** The service worker that shows a wake and opens the overview when it is pressed. */\nconst WORKER_PATH = '/wake-worker.js';\n\n/** Whether this browser takes web push at all. */\nfunction isPushTaken(): boolean {\n return 'serviceWorker' in navigator && 'PushManager' in window && 'Notification' in window;\n}\n\n/** This browser's own push subscription with the gateway's worker, if it has one. */\nasync function ownSubscription(): Promise<PushSubscription | null> {\n const registration = await navigator.serviceWorker.getRegistration(WORKER_PATH);\n return (await registration?.pushManager.getSubscription()) ?? null;\n}\n\n/** Asks the browser's permission, then subscribes it with the gateway's key: the subscription to send, or why there is none. */\nasync function subscribed(webPushKey: string): Promise<{ readonly isOk: true; readonly value: PushSubscription } | { readonly isOk: false; readonly message: string }> {\n if ((await Notification.requestPermission()) !== 'granted') {\n return { isOk: false, message: 'Your browser did not allow notifications from this site: allow them, then turn web push on again' };\n }\n const registration = await navigator.serviceWorker.register(WORKER_PATH);\n await navigator.serviceWorker.ready;\n return { isOk: true, value: await registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: applicationServerKeyOf(webPushKey) }) };\n}\n\n/**\n * Web push in the overview's section of wakes (wake a person, W8): the\n * person turns it on for this browser, which asks the browser's permission\n * first, sees the browsers they turned it on in, and removes one. Nothing is\n * on until they turn it on. A browser whose push service ended its\n * subscription is said to be gone.\n */\nexport function WebPushPanel({ fleetId, webPushKey, browsers }: { fleetId: string; webPushKey: string; browsers: WakeChannels['webPush']['browsers'] }) {\n const [isTaken, setIsTaken] = useState(true);\n const [ownEndpoint, setOwnEndpoint] = useState<string | undefined>();\n const [working, setWorking] = useState<string | undefined>();\n const [failure, setFailure] = useState<string | undefined>();\n const [, startTransition] = useTransition();\n\n useEffect(() => {\n if (!isPushTaken()) {\n setIsTaken(false);\n return;\n }\n void ownSubscription().then((own) => {\n setOwnEndpoint(own?.endpoint);\n });\n }, []);\n\n const turnOn = () => {\n setWorking('on');\n setFailure(undefined);\n startTransition(async () => {\n try {\n const subscription = await subscribed(webPushKey);\n if (!subscription.isOk) {\n setFailure(subscription.message);\n return;\n }\n const input = subscriptionInputOf(subscription.value.toJSON(), browserNameOf(navigator.userAgent));\n if (input === undefined) {\n setFailure('Your browser gave no push subscription: try again');\n return;\n }\n const outcome = await turnOnWebPush(fleetId, input);\n if (outcome.isOk) {\n setOwnEndpoint(input.endpoint);\n } else {\n setFailure(outcome.message);\n }\n } catch {\n setFailure('Your browser could not turn web push on: try again');\n } finally {\n setWorking(undefined);\n }\n });\n };\n\n const remove = (endpoint: string) => {\n setWorking(endpoint);\n setFailure(undefined);\n startTransition(async () => {\n if (endpoint === ownEndpoint) {\n await (await ownSubscription())?.unsubscribe();\n setOwnEndpoint(undefined);\n }\n const outcome = await turnOffWebPush(fleetId, endpoint);\n setWorking(undefined);\n if (!outcome.isOk) {\n setFailure(outcome.message);\n }\n });\n };\n\n const isOwnOn = ownEndpoint !== undefined && browsers.some(({ endpoint, isGone }) => endpoint === ownEndpoint && !isGone);\n return (\n <div className=\"grid gap-2\" data-testid=\"overview-wake-web-push\">\n {browsers.map(({ endpoint, browser, addedAt, isGone }) => (\n <div key={endpoint} className=\"flex items-center gap-3 rounded-md border border-border bg-card p-3\">\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate\">\n Web push in {browser}\n {endpoint === ownEndpoint ? ' · this browser' : ''}\n </span>\n <span className=\"text-caption text-muted-foreground\">\n {isGone ? 'No longer takes wakes: its push service ended them. Turn web push on again in that browser, or remove it.' : `On since ${new Date(addedAt).toLocaleDateString()}: it tells you when something waits in this fleet, with a link here. Never what waits.`}\n </span>\n </span>\n <ActionButton data-testid=\"overview-web-push-remove\" isPending={working === endpoint} pendingLabel=\"Removing...\" disabled={working !== undefined} onClick={() => { remove(endpoint); }}>\n Remove\n </ActionButton>\n </div>\n ))}\n {!isTaken ? (\n <p className=\"text-caption text-muted-foreground\">This browser takes no web push.</p>\n ) : isOwnOn ? null : (\n <div>\n <ActionButton data-testid=\"overview-web-push-on\" variant=\"primary\" isPending={working === 'on'} pendingLabel=\"Turning on...\" disabled={working !== undefined} onClick={turnOn}>\n Turn on web push in this browser\n </ActionButton>\n </div>\n )}\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n </div>\n );\n}\n"],"names":["MEETINGS_PATH","meetingPathOf","meeting","query","URLSearchParams","fleet","fleetId","cursor","undefined","encodeURIComponent","meetingId","toString","$$RSC_SERVER_ACTION_3"],"mappings":"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"}