@aeolus-fleet/gateway 0.30.0 → 0.32.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 (384) hide show
  1. package/dist/adapters/fleet/core-version.d.ts +1 -1
  2. package/dist/adapters/fleet/core-version.js +1 -1
  3. package/dist/adapters/fleet/proxy-ships-as-actor.js +5 -1
  4. package/dist/adapters/fleet/proxy-ships-as-actor.js.map +1 -1
  5. package/dist/adapters/fleet/rest-fleet-door.d.ts +2 -0
  6. package/dist/adapters/fleet/rest-fleet-door.js +51 -7
  7. package/dist/adapters/fleet/rest-fleet-door.js.map +1 -1
  8. package/dist/adapters/http/mcp-endpoint.js +1 -1
  9. package/dist/adapters/http/mcp-endpoint.js.map +1 -1
  10. package/dist/adapters/http/person-tools.d.ts +4 -7
  11. package/dist/adapters/http/person-tools.js +76 -11
  12. package/dist/adapters/http/person-tools.js.map +1 -1
  13. package/dist/adapters/pagasae/email-channel.js +4 -2
  14. package/dist/adapters/pagasae/email-channel.js.map +1 -1
  15. package/dist/adapters/prisma/generated/commonInputTypes.d.ts +50 -50
  16. package/dist/adapters/prisma/generated/internal/class.js +4 -4
  17. package/dist/adapters/prisma/generated/internal/class.js.map +1 -1
  18. package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +2 -0
  19. package/dist/adapters/prisma/generated/internal/prismaNamespace.js +2 -0
  20. package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
  21. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +2 -0
  22. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +2 -0
  23. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  24. package/dist/adapters/prisma/generated/models/A2aPush.d.ts +0 -7
  25. package/dist/adapters/prisma/generated/models/Party.d.ts +70 -1
  26. package/dist/adapters/prisma/scope-requirements.d.ts +10 -0
  27. package/dist/adapters/prisma/scope-requirements.js +37 -0
  28. package/dist/adapters/prisma/scope-requirements.js.map +1 -0
  29. package/dist/adapters/trpc/router.d.ts +154 -8
  30. package/dist/adapters/trpc/router.js +130 -11
  31. package/dist/adapters/trpc/router.js.map +1 -1
  32. package/dist/app.js +38 -9
  33. package/dist/app.js.map +1 -1
  34. package/dist/core/a2a-out/agent-event.d.ts +1 -1
  35. package/dist/core/a2a-out/agent-event.js +2 -2
  36. package/dist/core/a2a-out/agent-event.js.map +1 -1
  37. package/dist/core/a2a-out/agent-statement.d.ts +2 -1
  38. package/dist/core/a2a-out/agent-statement.js +5 -2
  39. package/dist/core/a2a-out/agent-statement.js.map +1 -1
  40. package/dist/core/a2a-out/hand-a2a-message.d.ts +7 -2
  41. package/dist/core/a2a-out/hand-a2a-message.js +15 -1
  42. package/dist/core/a2a-out/hand-a2a-message.js.map +1 -1
  43. package/dist/core/a2a-out/read-agent-statement.d.ts +1 -0
  44. package/dist/core/a2a-out/read-agent-statement.js +1 -1
  45. package/dist/core/a2a-out/read-agent-statement.js.map +1 -1
  46. package/dist/core/a2a-out/state-a2a-agent.d.ts +3 -2
  47. package/dist/core/a2a-out/state-a2a-agent.js +3 -2
  48. package/dist/core/a2a-out/state-a2a-agent.js.map +1 -1
  49. package/dist/core/account-sign-in/account-in-view.d.ts +10 -1
  50. package/dist/core/account-sign-in/account-in-view.js +17 -4
  51. package/dist/core/account-sign-in/account-in-view.js.map +1 -1
  52. package/dist/core/connection/ports.d.ts +8 -0
  53. package/dist/core/mcp-out/hand-call.d.ts +6 -2
  54. package/dist/core/mcp-out/hand-call.js +14 -1
  55. package/dist/core/mcp-out/hand-call.js.map +1 -1
  56. package/dist/core/mcp-out/state-party.d.ts +3 -2
  57. package/dist/core/mcp-out/state-party.js +2 -2
  58. package/dist/core/mcp-out/state-party.js.map +1 -1
  59. package/dist/core/mcp-out/statement.d.ts +16 -0
  60. package/dist/core/mcp-out/statement.js +10 -3
  61. package/dist/core/mcp-out/statement.js.map +1 -1
  62. package/dist/core/meetings/change-own-mic.d.ts +24 -0
  63. package/dist/core/meetings/change-own-mic.js +21 -0
  64. package/dist/core/meetings/change-own-mic.js.map +1 -0
  65. package/dist/core/meetings/mic-standing.d.ts +18 -0
  66. package/dist/core/meetings/mic-standing.js +11 -0
  67. package/dist/core/meetings/mic-standing.js.map +1 -0
  68. package/dist/core/meetings/ports.d.ts +70 -0
  69. package/dist/core/meetings/ports.js +2 -0
  70. package/dist/core/meetings/ports.js.map +1 -0
  71. package/dist/core/meetings/read-meeting.d.ts +30 -0
  72. package/dist/core/meetings/read-meeting.js +26 -0
  73. package/dist/core/meetings/read-meeting.js.map +1 -0
  74. package/dist/core/operator/ports.d.ts +4 -4
  75. package/dist/core/parties/add-a2a-agent.js +1 -1
  76. package/dist/core/parties/add-a2a-agent.js.map +1 -1
  77. package/dist/core/parties/check-approving.d.ts +36 -0
  78. package/dist/core/parties/check-approving.js +48 -0
  79. package/dist/core/parties/check-approving.js.map +1 -0
  80. package/dist/core/parties/check-required-scopes.d.ts +34 -0
  81. package/dist/core/parties/check-required-scopes.js +27 -0
  82. package/dist/core/parties/check-required-scopes.js.map +1 -0
  83. package/dist/core/parties/ports.d.ts +21 -0
  84. package/dist/core/parties/read-listed-scopes.d.ts +17 -0
  85. package/dist/core/parties/read-listed-scopes.js +23 -0
  86. package/dist/core/parties/read-listed-scopes.js.map +1 -0
  87. package/dist/core/parties/read-scope-requirements.d.ts +18 -0
  88. package/dist/core/parties/read-scope-requirements.js +17 -0
  89. package/dist/core/parties/read-scope-requirements.js.map +1 -0
  90. package/dist/core/parties/scope-requirements.d.ts +34 -0
  91. package/dist/core/parties/scope-requirements.js +37 -0
  92. package/dist/core/parties/scope-requirements.js.map +1 -0
  93. package/dist/core/parties/set-scope-requirements.d.ts +45 -0
  94. package/dist/core/parties/set-scope-requirements.js +48 -0
  95. package/dist/core/parties/set-scope-requirements.js.map +1 -0
  96. package/dist/core/parties/switch-tools.d.ts +39 -0
  97. package/dist/core/parties/switch-tools.js +38 -0
  98. package/dist/core/parties/switch-tools.js.map +1 -0
  99. package/dist/core/parties/tool-switches.d.ts +4 -2
  100. package/dist/core/parties/tool-switches.js +2 -1
  101. package/dist/core/parties/tool-switches.js.map +1 -1
  102. package/dist/core/people/inbox-entry.d.ts +2 -2
  103. package/dist/core/people/inbox-entry.js +9 -2
  104. package/dist/core/people/inbox-entry.js.map +1 -1
  105. package/dist/core/people/open-delivery.d.ts +3 -1
  106. package/dist/core/people/open-delivery.js +1 -1
  107. package/dist/core/people/open-delivery.js.map +1 -1
  108. package/dist/core/people/ports.d.ts +11 -4
  109. package/dist/core/people/wake-person.d.ts +22 -10
  110. package/dist/core/people/wake-person.js +88 -20
  111. package/dist/core/people/wake-person.js.map +1 -1
  112. package/dist/core/people/web-push-channel.js +1 -1
  113. package/dist/core/people/web-push-channel.js.map +1 -1
  114. package/dist/core/shared/errors.d.ts +1 -1
  115. package/dist/core/shared/errors.js.map +1 -1
  116. package/package.json +3 -3
  117. package/src/adapters/prisma/migrations/20261025140000_scope_requirements/migration.sql +3 -0
  118. package/src/adapters/prisma/schema.prisma +69 -65
  119. package/web/.next/BUILD_ID +1 -1
  120. package/web/.next/app-path-routes-manifest.json +2 -0
  121. package/web/.next/build-manifest.json +27 -3
  122. package/web/.next/diagnostics/route-bundle-stats.json +122 -70
  123. package/web/.next/fallback-build-manifest.json +3 -3
  124. package/web/.next/prerender-manifest.json +3 -3
  125. package/web/.next/routes-manifest.json +14 -0
  126. package/web/.next/server/app/(console)/gateway-off/page/app-paths-manifest.json +3 -0
  127. package/web/.next/server/app/(console)/gateway-off/page/build-manifest.json +23 -0
  128. package/web/.next/server/app/(console)/gateway-off/page/next-font-manifest.json +11 -0
  129. package/web/.next/server/app/(console)/gateway-off/page/react-loadable-manifest.json +1 -0
  130. package/web/.next/server/app/(console)/gateway-off/page/server-reference-manifest.json +15 -0
  131. package/web/.next/server/app/(console)/gateway-off/page.js +19 -0
  132. package/web/.next/server/app/(console)/gateway-off/page.js.map +5 -0
  133. package/web/.next/server/app/(console)/gateway-off/page.js.nft.json +1 -0
  134. package/web/.next/server/app/(console)/gateway-off/page_client-reference-manifest.js +3 -0
  135. package/web/.next/server/app/(console)/meetings/[meetingId]/page/app-paths-manifest.json +3 -0
  136. package/web/.next/server/app/(console)/meetings/[meetingId]/page/build-manifest.json +23 -0
  137. package/web/.next/server/app/(console)/meetings/[meetingId]/page/next-font-manifest.json +11 -0
  138. package/web/.next/server/app/(console)/meetings/[meetingId]/page/react-loadable-manifest.json +1 -0
  139. package/web/.next/server/app/(console)/meetings/[meetingId]/page/server-reference-manifest.json +35 -0
  140. package/web/.next/server/app/(console)/meetings/[meetingId]/page.js +21 -0
  141. package/web/.next/server/app/(console)/meetings/[meetingId]/page.js.map +5 -0
  142. package/web/.next/server/app/(console)/meetings/[meetingId]/page.js.nft.json +1 -0
  143. package/web/.next/server/app/(console)/meetings/[meetingId]/page_client-reference-manifest.js +3 -0
  144. package/web/.next/server/app/(console)/outside-parties/[name]/change/page/server-reference-manifest.json +17 -7
  145. package/web/.next/server/app/(console)/outside-parties/[name]/change/page.js +4 -4
  146. package/web/.next/server/app/(console)/outside-parties/[name]/change/page.js.nft.json +1 -1
  147. package/web/.next/server/app/(console)/outside-parties/[name]/change/page_client-reference-manifest.js +1 -1
  148. package/web/.next/server/app/(console)/outside-parties/[name]/page/server-reference-manifest.json +15 -5
  149. package/web/.next/server/app/(console)/outside-parties/[name]/page.js +4 -4
  150. package/web/.next/server/app/(console)/outside-parties/[name]/page.js.nft.json +1 -1
  151. package/web/.next/server/app/(console)/outside-parties/[name]/page_client-reference-manifest.js +1 -1
  152. package/web/.next/server/app/(console)/outside-parties/[name]/retire/page/server-reference-manifest.json +17 -7
  153. package/web/.next/server/app/(console)/outside-parties/[name]/retire/page.js +4 -4
  154. package/web/.next/server/app/(console)/outside-parties/[name]/retire/page.js.nft.json +1 -1
  155. package/web/.next/server/app/(console)/outside-parties/[name]/retire/page_client-reference-manifest.js +1 -1
  156. package/web/.next/server/app/(console)/outside-parties/add/page/server-reference-manifest.json +17 -7
  157. package/web/.next/server/app/(console)/outside-parties/add/page.js +3 -4
  158. package/web/.next/server/app/(console)/outside-parties/add/page.js.nft.json +1 -1
  159. package/web/.next/server/app/(console)/outside-parties/add/page_client-reference-manifest.js +1 -1
  160. package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page/server-reference-manifest.json +2 -2
  161. package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page.js.nft.json +1 -1
  162. package/web/.next/server/app/(console)/outside-parties/add-a2a-agent/page_client-reference-manifest.js +1 -1
  163. package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page/server-reference-manifest.json +2 -2
  164. package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page.js.nft.json +1 -1
  165. package/web/.next/server/app/(console)/outside-parties/add-a2a-client/page_client-reference-manifest.js +1 -1
  166. package/web/.next/server/app/(console)/outside-parties/page/server-reference-manifest.json +2 -2
  167. package/web/.next/server/app/(console)/outside-parties/page.js.nft.json +1 -1
  168. package/web/.next/server/app/(console)/outside-parties/page_client-reference-manifest.js +1 -1
  169. package/web/.next/server/app/(console)/overview/changes/route.js.nft.json +1 -1
  170. package/web/.next/server/app/(console)/overview/focus/route.js.nft.json +1 -1
  171. package/web/.next/server/app/(console)/overview/page/server-reference-manifest.json +7 -7
  172. package/web/.next/server/app/(console)/overview/page.js +3 -3
  173. package/web/.next/server/app/(console)/overview/page.js.nft.json +1 -1
  174. package/web/.next/server/app/(console)/overview/page_client-reference-manifest.js +1 -1
  175. package/web/.next/server/app/(console)/overview/requests/[requestId]/page/server-reference-manifest.json +2 -2
  176. package/web/.next/server/app/(console)/overview/requests/[requestId]/page.js.nft.json +1 -1
  177. package/web/.next/server/app/(console)/overview/requests/[requestId]/page_client-reference-manifest.js +1 -1
  178. package/web/.next/server/app/(console)/parties/page/server-reference-manifest.json +7 -7
  179. package/web/.next/server/app/(console)/parties/page.js.nft.json +1 -1
  180. package/web/.next/server/app/(console)/parties/page_client-reference-manifest.js +1 -1
  181. package/web/.next/server/app/(console)/sign-in/failed/page/server-reference-manifest.json +1 -1
  182. package/web/.next/server/app/(console)/sign-in/failed/page.js.nft.json +1 -1
  183. package/web/.next/server/app/(console)/sign-in/failed/page_client-reference-manifest.js +1 -1
  184. package/web/.next/server/app/_global-error.html +1 -1
  185. package/web/.next/server/app/_global-error.rsc +1 -1
  186. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  187. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  188. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  189. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  190. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  191. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  192. package/web/.next/server/app/authorize/failed/page/server-reference-manifest.json +1 -1
  193. package/web/.next/server/app/authorize/failed/page.js.nft.json +1 -1
  194. package/web/.next/server/app/authorize/failed/page_client-reference-manifest.js +1 -1
  195. package/web/.next/server/app/authorize/pick/page/server-reference-manifest.json +1 -1
  196. package/web/.next/server/app/authorize/pick/page.js.nft.json +1 -1
  197. package/web/.next/server/app/authorize/pick/page_client-reference-manifest.js +1 -1
  198. package/web/.next/server/app/authorize/waiting/approval/page/server-reference-manifest.json +1 -1
  199. package/web/.next/server/app/authorize/waiting/approval/page.js.nft.json +1 -1
  200. package/web/.next/server/app/authorize/waiting/approval/page_client-reference-manifest.js +1 -1
  201. package/web/.next/server/app-paths-manifest.json +2 -0
  202. package/web/.next/server/chunks/[root-of-the-server]__0ykc8bq_c06a1._.js +10 -10
  203. package/web/.next/server/chunks/[root-of-the-server]__0ykc8bq_c06a1._.js.map +1 -1
  204. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_change_page_actions_04td11fxohsfm.js +1 -1
  205. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_change_page_actions_04td11fxohsfm.js.map +1 -1
  206. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_page_actions_0u-45itza1ls7.js +1 -1
  207. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_page_actions_0u-45itza1ls7.js.map +1 -1
  208. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_retire_page_actions_0s7ps6i0ts7v5.js +1 -1
  209. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_[name]_retire_page_actions_0s7ps6i0ts7v5.js.map +1 -1
  210. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_add-a2a-client_page_actions_0d_wgiu94c32e.js +1 -1
  211. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_add-a2a-client_page_actions_0d_wgiu94c32e.js.map +1 -1
  212. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_add_page_actions_0yfz_dfn-8uo7.js +1 -1
  213. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_outside-parties_add_page_actions_0yfz_dfn-8uo7.js.map +1 -1
  214. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_overview_requests_[requestId]_page_actions_0uki9j3mtuz9e.js +1 -1
  215. package/web/.next/server/chunks/ssr/0vkm_server_app_(console)_overview_requests_[requestId]_page_actions_0uki9j3mtuz9e.js.map +1 -1
  216. package/web/.next/server/chunks/ssr/[root-of-the-server]__0-og0bl8lr2xq._.js +1 -1
  217. package/web/.next/server/chunks/ssr/[root-of-the-server]__0-og0bl8lr2xq._.js.map +1 -1
  218. package/web/.next/server/chunks/ssr/[root-of-the-server]__00erqdm9cmhh7._.js +3 -0
  219. package/web/.next/server/chunks/ssr/[root-of-the-server]__00erqdm9cmhh7._.js.map +1 -0
  220. package/web/.next/server/chunks/ssr/[root-of-the-server]__00q22dte1g2ww._.js +3 -0
  221. package/web/.next/server/chunks/ssr/[root-of-the-server]__00q22dte1g2ww._.js.map +1 -0
  222. package/web/.next/server/chunks/ssr/[root-of-the-server]__0k3g0p3t9t0c-._.js +1 -1
  223. package/web/.next/server/chunks/ssr/[root-of-the-server]__0k3g0p3t9t0c-._.js.map +1 -1
  224. package/web/.next/server/chunks/ssr/[root-of-the-server]__0n2us07jk-78w._.js +1 -1
  225. package/web/.next/server/chunks/ssr/[root-of-the-server]__0rr5u24i9tjyc._.js +1 -1
  226. package/web/.next/server/chunks/ssr/[root-of-the-server]__1-c9wugbbwsp3._.js +4 -0
  227. package/web/.next/server/chunks/ssr/[root-of-the-server]__1-c9wugbbwsp3._.js.map +1 -0
  228. package/web/.next/server/chunks/ssr/[root-of-the-server]__18-8taiduk1jn._.js +4 -0
  229. package/web/.next/server/chunks/ssr/[root-of-the-server]__18-8taiduk1jn._.js.map +1 -0
  230. package/web/.next/server/chunks/ssr/{[root-of-the-server]__11w36a4le04vy._.js → [root-of-the-server]__1dc6okf5os70a._.js} +2 -2
  231. package/web/.next/server/chunks/ssr/[root-of-the-server]__1dc6okf5os70a._.js.map +1 -0
  232. package/web/.next/server/chunks/ssr/[root-of-the-server]__1dtyycvqa6uht._.js +1 -1
  233. package/web/.next/server/chunks/ssr/_0-lfpqqlgfhzj._.js.map +1 -1
  234. package/web/.next/server/chunks/ssr/_00dg5cvqofspn._.js +3 -0
  235. package/web/.next/server/chunks/ssr/_00dg5cvqofspn._.js.map +1 -0
  236. package/web/.next/server/chunks/ssr/_00hfzlqn1og18._.js +1 -1
  237. package/web/.next/server/chunks/ssr/_00hfzlqn1og18._.js.map +1 -1
  238. package/web/.next/server/chunks/ssr/_03lk54yp-yhw3._.js +2 -2
  239. package/web/.next/server/chunks/ssr/_03lk54yp-yhw3._.js.map +1 -1
  240. package/web/.next/server/chunks/ssr/_0_kakdt7lb6z-._.js +3 -0
  241. package/web/.next/server/chunks/ssr/_0_kakdt7lb6z-._.js.map +1 -0
  242. package/web/.next/server/chunks/ssr/_0bhvvyz0q_0ja._.js +1 -1
  243. package/web/.next/server/chunks/ssr/_0ka_9elusb800._.js +4 -0
  244. package/web/.next/server/chunks/ssr/_0ka_9elusb800._.js.map +1 -0
  245. package/web/.next/server/chunks/ssr/_0pyd1_y7w8ngp._.js +1 -1
  246. package/web/.next/server/chunks/ssr/_0pyd1_y7w8ngp._.js.map +1 -1
  247. package/web/.next/server/chunks/ssr/_0w2ptjht34s6t._.js +3 -0
  248. package/web/.next/server/chunks/ssr/_0w2ptjht34s6t._.js.map +1 -0
  249. package/web/.next/server/chunks/ssr/_0xickgbbju_9-._.js +1 -1
  250. package/web/.next/server/chunks/ssr/_0xickgbbju_9-._.js.map +1 -1
  251. package/web/.next/server/chunks/ssr/_1_wav28san6dm._.js +1 -1
  252. package/web/.next/server/chunks/ssr/_1pjtire7rqla0._.js +1 -1
  253. package/web/.next/server/chunks/ssr/_1pjtire7rqla0._.js.map +1 -1
  254. package/web/.next/server/chunks/ssr/_1qbsmlji34yph._.js +1 -1
  255. package/web/.next/server/chunks/ssr/_1qbsmlji34yph._.js.map +1 -1
  256. package/web/.next/server/chunks/ssr/_1uuy6gkkhq6bx._.js +3 -0
  257. package/web/.next/server/chunks/ssr/_1uuy6gkkhq6bx._.js.map +1 -0
  258. package/web/.next/server/chunks/ssr/_1y1ovmdhl9_ml._.js +3 -0
  259. package/web/.next/server/chunks/ssr/_1y1ovmdhl9_ml._.js.map +1 -0
  260. package/web/.next/server/chunks/ssr/node_modules_07sxnbglqc5q9._.js +3 -0
  261. package/web/.next/server/chunks/ssr/node_modules_07sxnbglqc5q9._.js.map +1 -0
  262. package/web/.next/server/chunks/ssr/node_modules_0_cxkn6vujxay._.js +3 -0
  263. package/web/.next/server/chunks/ssr/node_modules_0_cxkn6vujxay._.js.map +1 -0
  264. package/web/.next/server/chunks/ssr/node_modules_0qlo87g8tugr4._.js +3 -0
  265. package/web/.next/server/chunks/ssr/node_modules_0qlo87g8tugr4._.js.map +1 -0
  266. package/web/.next/server/chunks/ssr/node_modules_15ceu3jhtifcw._.js +3 -0
  267. package/web/.next/server/chunks/ssr/node_modules_15ceu3jhtifcw._.js.map +1 -0
  268. package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_common_dist_header_1jvz31plyg2f-._.js +1 -1
  269. package/web/.next/server/chunks/ssr/node_modules_@aeolus-fleet_common_dist_header_1jvz31plyg2f-._.js.map +1 -1
  270. package/web/.next/server/chunks/ssr/node_modules_@base-ui_react_utils_FloatingPortalLite_mjs_1uzc1ezeugtex._.js +3 -0
  271. package/web/.next/server/chunks/ssr/node_modules_@base-ui_react_utils_FloatingPortalLite_mjs_1uzc1ezeugtex._.js.map +1 -0
  272. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1s46s8vlfx01v.js +3 -0
  273. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1s46s8vlfx01v.js.map +1 -0
  274. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_20d8hq6wsqwh_.js +3 -0
  275. package/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_20d8hq6wsqwh_.js.map +1 -0
  276. package/web/.next/server/chunks/ssr/web_0-ufi2al5ubig._.js +1 -1
  277. package/web/.next/server/chunks/ssr/web_0-ufi2al5ubig._.js.map +1 -1
  278. package/web/.next/server/chunks/ssr/web_09zipglxee7tv._.js +3 -0
  279. package/web/.next/server/chunks/ssr/web_09zipglxee7tv._.js.map +1 -0
  280. package/web/.next/server/chunks/ssr/web_0v-7sowo0hupw._.js +1 -1
  281. package/web/.next/server/chunks/ssr/web_0wys4l6za8umr._.js +1 -1
  282. package/web/.next/server/chunks/ssr/web_0wys4l6za8umr._.js.map +1 -1
  283. package/web/.next/server/chunks/ssr/web_1wcpaty_bz55q._.js +3 -0
  284. package/web/.next/server/chunks/ssr/web_1wcpaty_bz55q._.js.map +1 -0
  285. package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_overview_page_actions_18on1ziyg1nzy.js +1 -1
  286. package/web/.next/server/chunks/ssr/web__next-internal_server_app_(console)_overview_page_actions_18on1ziyg1nzy.js.map +1 -1
  287. package/web/.next/server/chunks/ssr/{web_features_0ahlkugj7fu3n._.js → web_features_0xbnkk4hfgr9v._.js} +2 -2
  288. package/web/.next/server/chunks/ssr/{web_features_0ahlkugj7fu3n._.js.map → web_features_0xbnkk4hfgr9v._.js.map} +1 -1
  289. package/web/.next/server/chunks/ssr/web_features_0xnlgtw8bfqaa._.js +1 -1
  290. package/web/.next/server/chunks/ssr/web_features_10xz3ojtvfi7h._.js +3 -0
  291. package/web/.next/server/chunks/ssr/web_features_10xz3ojtvfi7h._.js.map +1 -0
  292. package/web/.next/server/chunks/ssr/web_features_1_2m6l73qk7qw._.js +1 -1
  293. package/web/.next/server/chunks/ssr/web_features_1k6q2m0sl54-8._.js +3 -0
  294. package/web/.next/server/chunks/ssr/web_features_1k6q2m0sl54-8._.js.map +1 -0
  295. package/web/.next/server/chunks/ssr/web_features_add-a2a-agent_ui_a2a-agent-form_tsx_0z8t1aalwzyl7._.js +1 -1
  296. package/web/.next/server/chunks/ssr/web_features_add-a2a-agent_ui_a2a-agent-form_tsx_0z8t1aalwzyl7._.js.map +1 -1
  297. package/web/.next/server/chunks/ssr/web_features_add-a2a-client_ui_a2a-client-form_tsx_1anv88g385nwe._.js +1 -1
  298. package/web/.next/server/chunks/ssr/web_features_add-a2a-client_ui_a2a-client-form_tsx_1anv88g385nwe._.js.map +1 -1
  299. package/web/.next/server/chunks/ssr/web_features_add-server_ui_add-server_tsx_1jnmar5xju49k._.js +1 -1
  300. package/web/.next/server/chunks/ssr/web_features_add-server_ui_add-server_tsx_1jnmar5xju49k._.js.map +1 -1
  301. package/web/.next/server/chunks/ssr/web_features_forms_1u0akr22eh_x_._.js +3 -0
  302. package/web/.next/server/chunks/ssr/web_features_forms_1u0akr22eh_x_._.js.map +1 -0
  303. package/web/.next/server/chunks/ssr/web_features_frame_0pe8cwpxe1egb._.js +1 -1
  304. package/web/.next/server/chunks/ssr/web_features_frame_ui_gateway-header_tsx_0e9tekx4jf7ng._.js +1 -1
  305. package/web/.next/server/chunks/ssr/web_features_frame_ui_gateway-header_tsx_0e9tekx4jf7ng._.js.map +1 -1
  306. package/web/.next/server/chunks/ssr/web_features_meeting_state_meeting-controls_tsx_12g4kzk2mbvvz._.js +3 -0
  307. package/web/.next/server/chunks/ssr/web_features_meeting_state_meeting-controls_tsx_12g4kzk2mbvvz._.js.map +1 -0
  308. package/web/.next/server/chunks/ssr/web_features_outside-parties_ui_switch-card_tsx_1_xnu9bm4tc-_._.js +1 -1
  309. package/web/.next/server/chunks/ssr/web_features_outside-parties_ui_switch-card_tsx_1_xnu9bm4tc-_._.js.map +1 -1
  310. package/web/.next/server/chunks/ssr/web_features_outside-party_0_9c27knfvw7u._.js +3 -0
  311. package/web/.next/server/chunks/ssr/web_features_outside-party_0_9c27knfvw7u._.js.map +1 -0
  312. package/web/.next/server/chunks/ssr/web_features_outside-party_actions_ts_102ar5pdowf8s._.js +1 -1
  313. package/web/.next/server/chunks/ssr/web_features_outside-party_actions_ts_102ar5pdowf8s._.js.map +1 -1
  314. package/web/.next/server/chunks/ssr/web_features_overview_0udx5lm8igils._.js +3 -0
  315. package/web/.next/server/chunks/ssr/{web_features_overview_16dyz2ngvs14b._.js.map → web_features_overview_0udx5lm8igils._.js.map} +1 -1
  316. package/web/.next/server/chunks/ssr/web_features_overview_hooks_overview-actions_ts_0-wrat07d1y5g._.js +1 -1
  317. package/web/.next/server/chunks/ssr/web_features_overview_hooks_overview-actions_ts_0-wrat07d1y5g._.js.map +1 -1
  318. package/web/.next/server/chunks/ssr/web_features_overview_state_1wuk95dw2_whp._.js +1 -1
  319. package/web/.next/server/chunks/ssr/web_features_overview_state_1wuk95dw2_whp._.js.map +1 -1
  320. package/web/.next/server/chunks/ssr/web_features_overview_state_decision-panel_tsx_0kpd26ggtr6h_._.js +1 -1
  321. package/web/.next/server/chunks/ssr/web_features_overview_state_decision-panel_tsx_0kpd26ggtr6h_._.js.map +1 -1
  322. package/web/.next/server/chunks/ssr/web_features_overview_ui_10mb24kjiffea._.js +3 -0
  323. package/web/.next/server/chunks/ssr/web_features_overview_ui_10mb24kjiffea._.js.map +1 -0
  324. package/web/.next/server/chunks/ssr/web_features_parties_actions_ts_0r-tbfsig2ty-._.js +1 -1
  325. package/web/.next/server/middleware-build-manifest.js +27 -3
  326. package/web/.next/server/next-font-manifest.js +1 -1
  327. package/web/.next/server/next-font-manifest.json +8 -0
  328. package/web/.next/server/pages/500.html +1 -1
  329. package/web/.next/server/preview-props.json +3 -3
  330. package/web/.next/server/server-reference-manifest.js +1 -1
  331. package/web/.next/server/server-reference-manifest.json +76 -26
  332. package/web/.next/static/chunks/10wzmy096av_5.css +3 -0
  333. package/web/.next/static/chunks/{2_41h3v090ur9.js → 1ffk4chq_kmie.js} +1 -1
  334. package/web/.next/static/chunks/1nyfzf-d7kj96.js +1 -0
  335. package/web/.next/static/chunks/202avng4-d5jq.js +1 -0
  336. package/web/.next/static/chunks/{00njqo86bx2kb.js → 26kio8jl2dc6u.js} +1 -1
  337. package/web/.next/static/chunks/2cd4e71s711ad.js +1 -0
  338. package/web/.next/static/chunks/2i3ydqqupow_x.js +1 -0
  339. package/web/.next/static/chunks/2jvq5fses35mf.js +1 -0
  340. package/web/.next/static/chunks/2riya89_i0je8.js +1 -0
  341. package/web/.next/static/chunks/{31vy122d9fvme.js → 2sx1mxv2u71xx.js} +1 -1
  342. package/web/.next/static/chunks/3_pwm8b3mf4mf.js +1 -0
  343. package/web/.next/static/chunks/3f3s544ovqebz.js +1 -0
  344. package/web/.next/static/chunks/{2x00o45pdbkok.js → 3x_8doukmdfpu.js} +1 -1
  345. package/web/.next/static/chunks/{3apnqdh48__yw.js → 3yunex2p9do7t.js} +1 -1
  346. package/web/.next/static/chunks/{1aa1d23q1vokr.js → 40sj32h7okqjq.js} +1 -1
  347. package/web/.next/trace +1 -1
  348. package/web/.next/trace-build +1 -1
  349. package/web/.next/types/routes.d.ts +3 -1
  350. package/web/.next/types/validator.ts +34 -0
  351. package/dist/core/parties/switch-tool.d.ts +0 -29
  352. package/dist/core/parties/switch-tool.js +0 -33
  353. package/dist/core/parties/switch-tool.js.map +0 -1
  354. package/web/.next/server/chunks/ssr/[root-of-the-server]__0m57jyae0dn_7._.js +0 -3
  355. package/web/.next/server/chunks/ssr/[root-of-the-server]__0m57jyae0dn_7._.js.map +0 -1
  356. package/web/.next/server/chunks/ssr/[root-of-the-server]__11w36a4le04vy._.js.map +0 -1
  357. package/web/.next/server/chunks/ssr/[root-of-the-server]__1k25lo5ka4mgd._.js +0 -3
  358. package/web/.next/server/chunks/ssr/[root-of-the-server]__1k25lo5ka4mgd._.js.map +0 -1
  359. package/web/.next/server/chunks/ssr/[root-of-the-server]__1yjb00o7x58xv._.js +0 -3
  360. package/web/.next/server/chunks/ssr/[root-of-the-server]__1yjb00o7x58xv._.js.map +0 -1
  361. package/web/.next/server/chunks/ssr/node_modules_0cyjln1rocvt5._.js +0 -3
  362. package/web/.next/server/chunks/ssr/node_modules_0cyjln1rocvt5._.js.map +0 -1
  363. package/web/.next/server/chunks/ssr/node_modules_1ins1z8o_qrka._.js +0 -3
  364. package/web/.next/server/chunks/ssr/node_modules_1ins1z8o_qrka._.js.map +0 -1
  365. package/web/.next/server/chunks/ssr/web_features_0i_kwiszuiqcp._.js +0 -3
  366. package/web/.next/server/chunks/ssr/web_features_0i_kwiszuiqcp._.js.map +0 -1
  367. package/web/.next/server/chunks/ssr/web_features_1--8ungjj--ht._.js +0 -3
  368. package/web/.next/server/chunks/ssr/web_features_1--8ungjj--ht._.js.map +0 -1
  369. package/web/.next/server/chunks/ssr/web_features_1qq_ruz59ldc9._.js +0 -3
  370. package/web/.next/server/chunks/ssr/web_features_1qq_ruz59ldc9._.js.map +0 -1
  371. package/web/.next/server/chunks/ssr/web_features_forms_form-state_ts_2142hiopykfk1._.js +0 -3
  372. package/web/.next/server/chunks/ssr/web_features_forms_form-state_ts_2142hiopykfk1._.js.map +0 -1
  373. package/web/.next/server/chunks/ssr/web_features_outside-party_ui_20x5u9bhxeehi._.js +0 -3
  374. package/web/.next/server/chunks/ssr/web_features_outside-party_ui_20x5u9bhxeehi._.js.map +0 -1
  375. package/web/.next/server/chunks/ssr/web_features_overview_16dyz2ngvs14b._.js +0 -3
  376. package/web/.next/static/chunks/047i2x2j--shk.css +0 -3
  377. package/web/.next/static/chunks/0g4cpamshfwmn.js +0 -1
  378. package/web/.next/static/chunks/0j84uiid6fsim.js +0 -1
  379. package/web/.next/static/chunks/1ca21kggixrjz.js +0 -1
  380. package/web/.next/static/chunks/23ud2e13dn8f4.js +0 -1
  381. package/web/.next/static/chunks/3okm5g88ig1l3.js +0 -1
  382. /package/web/.next/static/{Az1CqrzgGHMZVR4nw9717 → JmnMsO8U6uK0nukLKdccI}/_buildManifest.js +0 -0
  383. /package/web/.next/static/{Az1CqrzgGHMZVR4nw9717 → JmnMsO8U6uK0nukLKdccI}/_clientMiddlewareManifest.js +0 -0
  384. /package/web/.next/static/{Az1CqrzgGHMZVR4nw9717 → JmnMsO8U6uK0nukLKdccI}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../web/features/meeting/state/meeting.tsx","../../../../../web/features/meeting/hooks/read-meeting.ts","../../../../../web/features/meeting/ui/contributions.tsx","../../../../../web/features/meeting/ui/participants.tsx","../../../../../web/app/%28console%29/meetings/%5BmeetingId%5D/page.tsx","../../../../../web/features/meeting/state/meeting-controls.tsx/__nextjs-internal-proxy.mjs%20%7B%20server%20%3D%3E%20%22%5Bproject%5D/web/features/meeting/state/meeting-controls.tsx%22%20%7D"],"sourcesContent":["import { signedInPage, type SearchParams } from '../../../lib/gateway-api/page-api';\nimport { Notice } from '../../overview/ui/notice';\nimport { NoSignIn } from '../../sign-in/ui/no-sign-in';\nimport { readMeeting } from '../hooks/read-meeting';\nimport { MEETINGS_PATH, meetingPathOf } from '../paths';\nimport { micLineOf, standingOf } from '../services/meeting';\nimport { Contributions } from '../ui/contributions';\nimport { Participants } from '../ui/participants';\nimport { MeetingControls } from './meeting-controls';\n\n/**\n * A meeting the person takes part in (decision 0061, M19), phone first:\n * where they stand on the mic and what they may do now at the top, then the\n * contributions, newest first, and who takes part. Reading it confirms no\n * delivery: each contribution still waits in their inbox.\n */\nexport async function Meeting({ meetingId, searchParams }: { meetingId: string; searchParams: SearchParams }) {\n const page = await signedInPage({ path: `${MEETINGS_PATH}/${encodeURIComponent(meetingId)}`, searchParams });\n if (page.kind === 'noSignIn') {\n return <NoSignIn />;\n }\n const { cursor } = searchParams;\n const read = await readMeeting(page.api, { meetingId, cursor: typeof cursor === 'string' ? cursor : undefined });\n const overview = `/overview?fleet=${encodeURIComponent(page.fleetId)}`;\n if (!read.isOk) {\n return (\n <div className=\"grid gap-4\">\n <Notice message={read.refusal} isFailure />\n <a href={overview} className=\"text-muted-foreground hover:underline\">\n ← Overview\n </a>\n </div>\n );\n }\n const meeting = read.value;\n const standing = standingOf(meeting);\n const here = meetingPathOf({ fleetId: page.fleetId, meetingId });\n return (\n <div data-testid=\"meeting\" className=\"grid gap-6\">\n <a href={overview} className=\"text-muted-foreground hover:underline\">\n ← Overview\n </a>\n <header className=\"grid gap-1\">\n <h1 className=\"text-heading font-semibold\">{meeting.title ?? 'Meeting'}</h1>\n <span className=\"text-caption text-muted-foreground\">\n Moderated by {meeting.moderator.name} · owned by {meeting.owner.name}\n </span>\n </header>\n <section className=\"grid gap-3 rounded-lg border border-border bg-card p-4 text-card-foreground shadow-sm\">\n <p data-testid=\"meeting-standing\">{standing.said}</p>\n <p data-testid=\"meeting-mic\" className=\"text-caption text-muted-foreground\">\n {micLineOf(meeting)}\n {meeting.mic.requests.length === 0 ? null : ` In line: ${meeting.mic.requests.map(({ ship }) => ship.name).join(', ')}.`}\n </p>\n <MeetingControls fleetId={page.fleetId} meetingId={meeting.meetingId} controls={standing.controls} />\n </section>\n <Contributions items={meeting.contributions.items} />\n <div className=\"flex flex-wrap gap-4\">\n <a href={here} className=\"text-muted-foreground hover:underline\">\n Read again\n </a>\n {meeting.contributions.nextCursor === null ? null : (\n <a data-testid=\"meeting-older\" href={meetingPathOf({ fleetId: page.fleetId, meetingId, cursor: meeting.contributions.nextCursor })} className=\"text-muted-foreground hover:underline\">\n Older contributions\n </a>\n )}\n </div>\n <Participants participants={meeting.participants} />\n </div>\n );\n}\n","/**\n * The meeting a page shows, read through the gateway's API as the signed-in\n * account (decision 0061, M12): the meeting with a page of its contributions,\n * newest first, after the cursor the address names.\n */\nimport type { GatewayApi } from '../../../lib/gateway-api/gateway-api';\nimport { readOf, type Read } from '../../../lib/gateway-api/page-api';\nimport type { MeetingView } from '../services/meeting';\n\nexport function readMeeting(api: GatewayApi, asked: { meetingId: string; cursor: string | undefined }): Promise<Read<MeetingView>> {\n return readOf(api.people.meeting.query({ meetingId: asked.meetingId, ...(asked.cursor === undefined ? {} : { cursor: asked.cursor }) }));\n}\n","import type { MeetingView } from '../services/meeting';\n\n/** A meeting's contributions, newest first: who said it, when, and what. */\nexport function Contributions({ items }: { items: MeetingView['contributions']['items'] }) {\n if (items.length === 0) {\n return <p className=\"text-muted-foreground\">No one has contributed yet.</p>;\n }\n return (\n <ol data-testid=\"meeting-contributions\" className=\"grid gap-3\">\n {items.map((contribution) => (\n <li key={contribution.messageId} className=\"grid gap-1 rounded-md border border-border bg-card p-3 text-card-foreground\">\n <span className=\"text-caption text-muted-foreground\">\n {contribution.sender.name} · {new Date(contribution.sentAt).toUTCString()}\n </span>\n <p className=\"whitespace-pre-wrap break-words\">{contribution.payload}</p>\n </li>\n ))}\n </ol>\n );\n}\n","import type { MeetingView } from '../services/meeting';\n\n/** How a participant's crew and place in the meeting read (M13, M14): presence is shown, never checked. */\nconst STATUS_WORDS = { crewed: 'crewed', awaitingCrew: 'awaiting crew', retired: 'retired' } as const;\nconst STATE_WORDS = { present: 'in the meeting', left: 'left', revoked: 'revoked' } as const;\n\n/** Who takes part, each with whether it is crewed now and whether it is in the meeting. */\nexport function Participants({ participants }: { participants: MeetingView['participants'] }) {\n return (\n <section className=\"grid gap-2\">\n <h2 className=\"text-section font-semibold\">Participants · {participants.length}</h2>\n <ul data-testid=\"meeting-participants\" className=\"grid gap-1\">\n {participants.map((participant) => (\n <li key={participant.shipId} className=\"flex flex-wrap justify-between gap-2\">\n <span>{participant.name}</span>\n <span className=\"text-caption text-muted-foreground\">\n {STATUS_WORDS[participant.status]} · {STATE_WORDS[participant.state]}\n </span>\n </li>\n ))}\n </ul>\n </section>\n );\n}\n","import type { Metadata } from 'next';\n\nimport { Meeting } from '../../../../features/meeting/state/meeting';\nimport type { SearchParams } from '../../../../lib/gateway-api/page-api';\n\nexport const metadata: Metadata = { title: 'Meeting' };\n\nexport default async function MeetingPage({ params, searchParams }: { params: Promise<{ meetingId: string }>; searchParams: Promise<SearchParams> }) {\n const [{ meetingId }, query] = await Promise.all([params, searchParams]);\n return <Meeting meetingId={meetingId} searchParams={query} />;\n}\n","// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport const MeetingControls = registerClientReference(\n function() { throw new Error(\"Attempted to call MeetingControls() from the server but MeetingControls 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/meeting/state/meeting-controls.tsx\",\n \"MeetingControls\",\n);\n"],"names":["readMeeting","api","asked","people","meeting","query","meetingId","cursor","undefined","MeetingControls","Error"],"mappings":"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","ignoreList":[5]}
@@ -1,3 +1,3 @@
1
- module.exports=[[68598,a=>{var b=a.i(7997);a.i(70396);var c=a.i(73727),d=a.i(14725),e=a.i(24571),f=a.i(6336);async function g({searchParams:a}){let{waiting:h}=await a,i="string"==typeof h?h:"",j=await (0,d.b)(i);return"goOn"===j.kind&&(0,c.redirect)(`${e.e}?${new URLSearchParams({waiting:i}).toString()}`),(0,b.jsx)(f.WaitingForApproval,{waiting:i,clientName:j.clientName,expiresAt:j.expiresAt,shownAt:new Date().toISOString()})}a.s(["default",0,g,"metadata",0,{title:"Waiting for approval"}])},14725,a=>{var b=a.i(5246),c=a.i(59847),d=a.i(66283);async function e(a){let b=await (0,d.z)(void 0);try{return{kind:"client",client:await b.oauth.authorization.query(Object.fromEntries(a))}}catch(b){let a=(0,d.T)(b);if("BAD_REQUEST"===a)return{kind:"failed",reason:"invalidClient"};if("NOT_FOUND"===a)return{kind:"failed",reason:"noSignIn"};throw b}}async function f(a){let e=(await (0,b.cookies)()).get("aeolus_waiting")?.value;return(0,c.f)({url:(0,d.o)(),cookie:(await (0,b.headers)()).get("cookie")??void 0,fleetId:void 0,...void 0===e?{}:{waitingSecret:e}}).oauth.waiting.query({waiting:a})}a.s(["P",0,function(a){return`/authorize/failed?${new URLSearchParams({reason:a}).toString()}`},"W",0,e,"b",0,f])},24571,a=>{let b="Start again from your MCP client.",c={invalidClient:`The gateway does not know this MCP client, or the address it asks to be sent back to. ${b}`,noPick:"Pick on the page whether to sign in as yourself or to ask for access for the client.",unknownSignIn:`This sign-in is unknown, or took over 10 minutes. ${b}`,otherBrowser:`This sign-in was started in another browser, so it is not yours to finish. ${b}`,fleetNotServed:"This gateway does not serve the fleet you signed in to.",outsidePartiesOff:"Your fleet's outside parties are off, so no MCP client can ask for access. Sign in as yourself instead, or ask whoever runs your fleet.",pagasaeRefused:`The sign-in service did not sign you in. ${b}`,unknownWaiting:`This request is unknown, or ended long ago. ${b}`,otherBrowserWaiting:`This request was made in another browser, so it is not yours to follow. ${b}`,noSignIn:"This gateway signs no one in, so no MCP client can connect to it: its operator sets pagasae first."},d=`The connection did not go through. ${b}`;a.s(["e",0,"/authorize/waiting","U",0,function(a){return(void 0===a?void 0:c[a])??d},"Q",0,function(a){return Object.entries(a).flatMap(([a,b])=>"string"==typeof b&&"holder"!==a?[[a,b]]:[])}])},17487,a=>{let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call WaitingForApproval() from the server but WaitingForApproval 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/authorize/ui/waiting-for-approval.tsx","WaitingForApproval");a.s(["WaitingForApproval",0,b])},6336,a=>{var b=a.i(17487);a.n(b)}],36362,function(a){a.n(a.i(68598))}];
1
+ module.exports=[[68598,a=>{var b=a.i(7997);a.i(70396);var c=a.i(73727),d=a.i(14725),e=a.i(24571),f=a.i(6336);async function g({searchParams:a}){let{waiting:h}=await a,i="string"==typeof h?h:"",j=await (0,d.b)(i);return"goOn"===j.kind&&(0,c.redirect)(`${e.e}?${new URLSearchParams({waiting:i}).toString()}`),(0,b.jsx)(f.WaitingForApproval,{waiting:i,clientName:j.clientName,expiresAt:j.expiresAt,shownAt:new Date().toISOString()})}a.s(["default",0,g,"metadata",0,{title:"Waiting for approval"}])},14725,a=>{var b=a.i(5246),c=a.i(59847),d=a.i(66283);async function e(a){let b=await (0,d.z)(void 0);try{return{kind:"client",client:await b.oauth.authorization.query(Object.fromEntries(a))}}catch(b){let a=(0,d.U)(b);if("BAD_REQUEST"===a)return{kind:"failed",reason:"invalidClient"};if("NOT_FOUND"===a)return{kind:"failed",reason:"noSignIn"};throw b}}async function f(a){let e=(await (0,b.cookies)()).get("aeolus_waiting")?.value;return(0,c.f)({url:(0,d.o)(),cookie:(await (0,b.headers)()).get("cookie")??void 0,fleetId:void 0,...void 0===e?{}:{waitingSecret:e}}).oauth.waiting.query({waiting:a})}a.s(["P",0,function(a){return`/authorize/failed?${new URLSearchParams({reason:a}).toString()}`},"W",0,e,"b",0,f])},24571,a=>{let b="Start again from your MCP client.",c={invalidClient:`The gateway does not know this MCP client, or the address it asks to be sent back to. ${b}`,noPick:"Pick on the page whether to sign in as yourself or to ask for access for the client.",unknownSignIn:`This sign-in is unknown, or took over 10 minutes. ${b}`,otherBrowser:`This sign-in was started in another browser, so it is not yours to finish. ${b}`,fleetNotServed:"This gateway does not serve the fleet you signed in to.",outsidePartiesOff:"Your fleet's outside parties are off, so no MCP client can ask for access. Sign in as yourself instead, or ask whoever runs your fleet.",pagasaeRefused:`The sign-in service did not sign you in. ${b}`,unknownWaiting:`This request is unknown, or ended long ago. ${b}`,otherBrowserWaiting:`This request was made in another browser, so it is not yours to follow. ${b}`,noSignIn:"This gateway signs no one in, so no MCP client can connect to it: its operator sets pagasae first."},d=`The connection did not go through. ${b}`;a.s(["e",0,"/authorize/waiting","U",0,function(a){return(void 0===a?void 0:c[a])??d},"Q",0,function(a){return Object.entries(a).flatMap(([a,b])=>"string"==typeof b&&"holder"!==a?[[a,b]]:[])}])},17487,a=>{let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call WaitingForApproval() from the server but WaitingForApproval 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/authorize/ui/waiting-for-approval.tsx","WaitingForApproval");a.s(["WaitingForApproval",0,b])},6336,a=>{var b=a.i(17487);a.n(b)}],36362,function(a){a.n(a.i(68598))}];
2
2
 
3
3
  //# sourceMappingURL=web_0v-7sowo0hupw._.js.map
@@ -1,3 +1,3 @@
1
- (()=>{"use strict";module.exports=[50088,a=>{var b=a.i(70043),c=a.i(37936),d=a.i(29517);a.i(70396);var e=a.i(73727),f=a.i(55476),g=a.i(66283),h=a.i(81140),i=a.i(1324),j=a.i(29493),k=a.i(72913),l=a.i(13095);let m=new Set(["token","clientSecret"]);async function n(a,b){let c,l=(0,i.v)(b,i.H),n=Object.fromEntries(Object.entries((0,i.O)(b)).filter(([a])=>!m.has(a))),o=(0,d.f)("ship").safeParse((0,i.v)(b,"ownerShipId"));if(!o.success)return{kind:"refused",message:"Pick its owner",fields:n};let p=await (0,g.z)(l);try{c=(await p.parties.addA2aAgent.mutate({requestId:(0,i.v)(b,"requestId"),name:(0,i.v)(b,"name"),cardUrl:(0,i.v)(b,"cardUrl"),credential:(0,j.y)({credentialKind:(0,i.v)(b,"credentialKind"),token:(0,i.v)(b,"token"),clientId:(0,i.v)(b,"clientId"),clientSecret:(0,i.v)(b,"clientSecret"),issuer:(0,i.v)(b,"issuer"),scope:(0,i.v)(b,"scope")}),concurrencyLimit:Number((0,i.v)(b,"concurrencyLimit")),ownerShipId:o.data,scopes:(0,h.f)((0,i.O)(b))})).name}catch(a){return{kind:"refused",message:(0,g.s)(a),fields:n}}(0,e.redirect)((0,f.i)((0,k.N)(c),l))}(0,l.ensureServerEntryExports)([n]),(0,c.registerServerReference)(n,"603c02af05f2520217716b567bda68040ecbf48391",null),a.s(["40e9a42ba8cfd90f0dd74f6fcb1ee9c16c64e374ae",()=>b.f,"603c02af05f2520217716b567bda68040ecbf48391",0,n],50088)},81140,a=>{var b=a.i(18379);a.s(["f",0,function(a){return Object.keys(a).flatMap(a=>a.startsWith(b.u)?[a.slice(b.u.length)]:[])}])},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}}}}])}]})();
1
+ (()=>{"use strict";module.exports=[50088,a=>{var b=a.i(70043),c=a.i(37936),d=a.i(29517);a.i(70396);var e=a.i(73727),f=a.i(55476),g=a.i(66283),h=a.i(81140),i=a.i(1324),j=a.i(29493),k=a.i(72913),l=a.i(13095);let m=new Set(["token","clientSecret"]);async function n(a,b){let c,l=(0,i.v)(b,i.H),n=Object.fromEntries(Object.entries((0,i.O)(b)).filter(([a])=>!m.has(a))),o=(0,d.f)("ship").safeParse((0,i.v)(b,"ownerShipId"));if(!o.success)return{kind:"refused",message:"Pick its owner",fields:n};let p=await (0,g.z)(l);try{c=(await p.parties.addA2aAgent.mutate({requestId:(0,i.v)(b,"requestId"),name:(0,i.v)(b,"name"),cardUrl:(0,i.v)(b,"cardUrl"),credential:(0,j.y)({credentialKind:(0,i.v)(b,"credentialKind"),token:(0,i.v)(b,"token"),clientId:(0,i.v)(b,"clientId"),clientSecret:(0,i.v)(b,"clientSecret"),issuer:(0,i.v)(b,"issuer"),scope:(0,i.v)(b,"scope")}),concurrencyLimit:Number((0,i.v)(b,"concurrencyLimit")),ownerShipId:o.data,scopes:(0,h.f)((0,i.O)(b))})).name}catch(a){return{kind:"refused",message:(0,g.s)(a),fields:n}}(0,e.redirect)((0,f.i)((0,k.N)(c),l))}(0,l.ensureServerEntryExports)([n]),(0,c.registerServerReference)(n,"60e1372b310028e4e5b6cd63f53b452da1eb63833d",null),a.s(["404a6fe925a7b9f3a666fe6efebf5bf6e8ec052ac8",()=>b.f,"60e1372b310028e4e5b6cd63f53b452da1eb63833d",0,n],50088)},81140,a=>{var b=a.i(18379);a.s(["f",0,function(a){return Object.keys(a).flatMap(a=>a.startsWith(b.u)?[a.slice(b.u.length)]:[])}])},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}}}}])}]})();
2
2
 
3
3
  //# sourceMappingURL=web_0wys4l6za8umr._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../web/.next-internal/server/app/%28console%29/outside-parties/add-a2a-agent/page/actions.js%20%28server%20actions%20loader%29","../../../../../web/features/add-a2a-agent/actions.ts","../../../../../web/features/add-a2a-client/ticked-scopes.ts","../../../../../web/features/forms/server-credential.ts"],"sourcesContent":["export {setTheme as '40e9a42ba8cfd90f0dd74f6fcb1ee9c16c64e374ae'} from 'ACTIONS_MODULE0'\nexport {addA2aAgent as '603c02af05f2520217716b567bda68040ecbf48391'} from 'ACTIONS_MODULE1'\n","'use server';\n\n/**\n * Adding an outside A2A agent by its card address (slice 5), as the account\n * signed in: the API checks it holds gateway:approve and grants only scopes\n * it holds, and the gateway reads the card before it commissions anything.\n * Added, the page goes to the agent's own page.\n */\nimport { idSchema } from '@aeolus-fleet/common';\nimport { redirect } from 'next/navigation';\n\nimport { inFleet } from '../../lib/gateway-api/page-account';\nimport { refusalMessageOf, requestApi } from '../../lib/gateway-api/page-api';\nimport { tickedScopes } from '../add-a2a-client/ticked-scopes';\nimport { FLEET_FIELD, fieldOf, fieldsOf } from '../forms/form-state';\nimport { serverCredentialOf } from '../forms/server-credential';\nimport { partyPath } from '../outside-parties/paths';\n\n/** The fields that never travel back to the browser: the credential's secrets. */\nconst SECRET_FIELDS: ReadonlySet<string> = new Set(['token', 'clientSecret']);\n\n/** Where adding stands: not sent, or refused with why and what the browser sent, its secrets aside. */\nexport type AddA2aAgentState = { kind: 'idle' } | { kind: 'refused'; message: string; fields: Record<string, string> };\n\nexport async function addA2aAgent(_previous: AddA2aAgentState, form: FormData): Promise<AddA2aAgentState> {\n const fleetId = fieldOf(form, FLEET_FIELD);\n const fields = Object.fromEntries(Object.entries(fieldsOf(form)).filter(([field]) => !SECRET_FIELDS.has(field)));\n const ownerShipId = idSchema('ship').safeParse(fieldOf(form, 'ownerShipId'));\n if (!ownerShipId.success) {\n return { kind: 'refused', message: 'Pick its owner', fields };\n }\n const api = await requestApi(fleetId);\n let name: string;\n try {\n const added = await api.parties.addA2aAgent.mutate({\n requestId: fieldOf(form, 'requestId'),\n name: fieldOf(form, 'name'),\n cardUrl: fieldOf(form, 'cardUrl'),\n credential: serverCredentialOf({\n credentialKind: fieldOf(form, 'credentialKind'),\n token: fieldOf(form, 'token'),\n clientId: fieldOf(form, 'clientId'),\n clientSecret: fieldOf(form, 'clientSecret'),\n issuer: fieldOf(form, 'issuer'),\n scope: fieldOf(form, 'scope'),\n }),\n concurrencyLimit: Number(fieldOf(form, 'concurrencyLimit')),\n ownerShipId: ownerShipId.data,\n scopes: tickedScopes(fieldsOf(form)),\n });\n name = added.name;\n } catch (error) {\n return { kind: 'refused', message: refusalMessageOf(error), fields };\n }\n redirect(inFleet(partyPath(name), fleetId));\n}\n","import { SCOPE_FIELD_PREFIX } from '../outside-party/scope-changes';\n\n/** The scopes a form ticks, one `scope:<scope>` field each. */\nexport function tickedScopes(fields: Readonly<Record<string, string>>): string[] {\n return Object.keys(fields).flatMap((field) => (field.startsWith(SCOPE_FIELD_PREFIX) ? [field.slice(SCOPE_FIELD_PREFIX.length)] : []));\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"],"names":["SECRET_FIELDS","Set","addA2aAgent","_previous","form","fleetId","fields","Object","fromEntries","entries","filter","field","has","ownerShipId","safeParse","success","kind","message","api","name","added","parties","mutate","requestId","cardUrl","credential","credentialKind","token","clientId","clientSecret","issuer","scope","concurrencyLimit","Number","data","scopes","error","tickedScopes","keys","flatMap","startsWith","slice","length","CREDENTIAL_KINDS","label","credentialKindOf","sent","find","serverCredentialOf"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../web/.next-internal/server/app/%28console%29/outside-parties/add-a2a-agent/page/actions.js%20%28server%20actions%20loader%29","../../../../../web/features/add-a2a-agent/actions.ts","../../../../../web/features/add-a2a-client/ticked-scopes.ts","../../../../../web/features/forms/server-credential.ts"],"sourcesContent":["export {setTheme as '404a6fe925a7b9f3a666fe6efebf5bf6e8ec052ac8'} from 'ACTIONS_MODULE0'\nexport {addA2aAgent as '60e1372b310028e4e5b6cd63f53b452da1eb63833d'} from 'ACTIONS_MODULE1'\n","'use server';\n\n/**\n * Adding an outside A2A agent by its card address (slice 5), as the account\n * signed in: the API checks it holds gateway:approve and grants only scopes\n * it holds, and the gateway reads the card before it commissions anything.\n * Added, the page goes to the agent's own page.\n */\nimport { idSchema } from '@aeolus-fleet/common';\nimport { redirect } from 'next/navigation';\n\nimport { inFleet } from '../../lib/gateway-api/page-account';\nimport { refusalMessageOf, requestApi } from '../../lib/gateway-api/page-api';\nimport { tickedScopes } from '../add-a2a-client/ticked-scopes';\nimport { FLEET_FIELD, fieldOf, fieldsOf } from '../forms/form-state';\nimport { serverCredentialOf } from '../forms/server-credential';\nimport { partyPath } from '../outside-parties/paths';\n\n/** The fields that never travel back to the browser: the credential's secrets. */\nconst SECRET_FIELDS: ReadonlySet<string> = new Set(['token', 'clientSecret']);\n\n/** Where adding stands: not sent, or refused with why and what the browser sent, its secrets aside. */\nexport type AddA2aAgentState = { kind: 'idle' } | { kind: 'refused'; message: string; fields: Record<string, string> };\n\nexport async function addA2aAgent(_previous: AddA2aAgentState, form: FormData): Promise<AddA2aAgentState> {\n const fleetId = fieldOf(form, FLEET_FIELD);\n const fields = Object.fromEntries(Object.entries(fieldsOf(form)).filter(([field]) => !SECRET_FIELDS.has(field)));\n const ownerShipId = idSchema('ship').safeParse(fieldOf(form, 'ownerShipId'));\n if (!ownerShipId.success) {\n return { kind: 'refused', message: 'Pick its owner', fields };\n }\n const api = await requestApi(fleetId);\n let name: string;\n try {\n const added = await api.parties.addA2aAgent.mutate({\n requestId: fieldOf(form, 'requestId'),\n name: fieldOf(form, 'name'),\n cardUrl: fieldOf(form, 'cardUrl'),\n credential: serverCredentialOf({\n credentialKind: fieldOf(form, 'credentialKind'),\n token: fieldOf(form, 'token'),\n clientId: fieldOf(form, 'clientId'),\n clientSecret: fieldOf(form, 'clientSecret'),\n issuer: fieldOf(form, 'issuer'),\n scope: fieldOf(form, 'scope'),\n }),\n concurrencyLimit: Number(fieldOf(form, 'concurrencyLimit')),\n ownerShipId: ownerShipId.data,\n scopes: tickedScopes(fieldsOf(form)),\n });\n name = added.name;\n } catch (error) {\n return { kind: 'refused', message: refusalMessageOf(error), fields };\n }\n redirect(inFleet(partyPath(name), fleetId));\n}\n","import { SCOPE_FIELD_PREFIX } from '../outside-party/scope-changes';\n\n/** The scopes a form ticks, one `scope:<scope>` field each. */\nexport function tickedScopes(fields: Readonly<Record<string, string>>): string[] {\n return Object.keys(fields).flatMap((field) => (field.startsWith(SCOPE_FIELD_PREFIX) ? [field.slice(SCOPE_FIELD_PREFIX.length)] : []));\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"],"names":["SECRET_FIELDS","Set","addA2aAgent","_previous","form","fleetId","fields","Object","fromEntries","entries","filter","field","has","ownerShipId","safeParse","success","kind","message","api","name","added","parties","mutate","requestId","cardUrl","credential","credentialKind","token","clientId","clientSecret","issuer","scope","concurrencyLimit","Number","data","scopes","error","tickedScopes","keys","flatMap","startsWith","slice","length","CREDENTIAL_KINDS","label","credentialKindOf","sent","find","serverCredentialOf"],"mappings":"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"}
@@ -0,0 +1,3 @@
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
@@ -0,0 +1 @@
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 +1,3 @@
1
- module.exports=[43928,a=>{"use strict";var b=a.i(70043),c=a.i(4757);a.S([b,"40e9a42ba8cfd90f0dd74f6fcb1ee9c16c64e374ae,f",0,c,"4094bd2603f6cb4c692f8c5bbc35b6dfa0e2cd78a8,q,6014a23e56a6300e1adee24bc60d3989cf9a3ffcaa,G,60813b25998f3aa5040c7138940db92bf5b1bba1ae,v,60aac98a56e7babd7b75c679560c72a3ef6741a3b7,W,60b48f9537cbc087081a7c9cb59da4be205bfeabdd,_,60da3873bc1544318b9ef24fd1e90ef1716e80cdd3,y"],43928)}];
1
+ module.exports=[43928,a=>{"use strict";var b=a.i(70043),c=a.i(4757);a.S([b,"404a6fe925a7b9f3a666fe6efebf5bf6e8ec052ac8,f",0,c,"40b12060e73abd2eeab7376bdfcf75ad8307166c14,q,600f2d111cc4c411b963093c32f0bc9784c11a437c,y,6080c80d67b08e6b6ab28bf7d9d999f423f3a67e82,G,60a0aa7e0455056ced1d7e9c709c3853888f2f0a44,W,60b0e657af06e6ae327d2ececfc385dbf4f7a6f51e,v,60df2c1d8349c08084aaa3874a2cc8e393b589f47e,_"],43928)}];
2
2
 
3
3
  //# sourceMappingURL=web__next-internal_server_app_%28console%29_overview_page_actions_18on1ziyg1nzy.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../web/.next-internal/server/app/%28console%29/overview/page/actions.js%20%28server%20actions%20loader%29"],"sourcesContent":["export {setTheme as '40e9a42ba8cfd90f0dd74f6fcb1ee9c16c64e374ae'} from 'ACTIONS_MODULE0'\nexport {answerDelivery as '4094bd2603f6cb4c692f8c5bbc35b6dfa0e2cd78a8'} from 'ACTIONS_MODULE1'\nexport {doneDelivery as '6014a23e56a6300e1adee24bc60d3989cf9a3ffcaa'} from 'ACTIONS_MODULE1'\nexport {openDelivery as '60813b25998f3aa5040c7138940db92bf5b1bba1ae'} from 'ACTIONS_MODULE1'\nexport {turnEmail as '60b48f9537cbc087081a7c9cb59da4be205bfeabdd'} from 'ACTIONS_MODULE1'\nexport {turnOffWebPush as '60aac98a56e7babd7b75c679560c72a3ef6741a3b7'} from 'ACTIONS_MODULE1'\nexport {turnOnWebPush as '60da3873bc1544318b9ef24fd1e90ef1716e80cdd3'} from 'ACTIONS_MODULE1'\n"],"names":[],"mappings":"uCAAA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA"}
1
+ {"version":3,"sources":["../../../../../web/.next-internal/server/app/%28console%29/overview/page/actions.js%20%28server%20actions%20loader%29"],"sourcesContent":["export {setTheme as '404a6fe925a7b9f3a666fe6efebf5bf6e8ec052ac8'} from 'ACTIONS_MODULE0'\nexport {answerDelivery as '40b12060e73abd2eeab7376bdfcf75ad8307166c14'} from 'ACTIONS_MODULE1'\nexport {doneDelivery as '6080c80d67b08e6b6ab28bf7d9d999f423f3a67e82'} from 'ACTIONS_MODULE1'\nexport {openDelivery as '60b0e657af06e6ae327d2ececfc385dbf4f7a6f51e'} from 'ACTIONS_MODULE1'\nexport {turnEmail as '60df2c1d8349c08084aaa3874a2cc8e393b589f47e'} from 'ACTIONS_MODULE1'\nexport {turnOffWebPush as '60a0aa7e0455056ced1d7e9c709c3853888f2f0a44'} from 'ACTIONS_MODULE1'\nexport {turnOnWebPush as '600f2d111cc4c411b963093c32f0bc9784c11a437c'} from 'ACTIONS_MODULE1'\n"],"names":[],"mappings":"uCAAA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA"}
@@ -1,3 +1,3 @@
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,24229,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})}],1542),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})}],24229)}]})();
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
2
 
3
- //# sourceMappingURL=web_features_0ahlkugj7fu3n._.js.map
3
+ //# sourceMappingURL=web_features_0xbnkk4hfgr9v._.js.map
@@ -1 +1 @@
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"],"mappings":"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"}
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 +1,3 @@
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:"])}]})();
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})]})}])},45677,a=>{a.s(["f",0,"scope:"])}]})();
2
2
 
3
3
  //# sourceMappingURL=web_features_0xnlgtw8bfqaa._.js.map
@@ -0,0 +1,3 @@
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
@@ -0,0 +1 @@
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 +1,3 @@
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:"])}]})();
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})]})}])},45677,a=>{a.s(["f",0,"scope:"])}]})();
2
2
 
3
3
  //# sourceMappingURL=web_features_1_2m6l73qk7qw._.js.map
@@ -0,0 +1,3 @@
1
+ (()=>{"use strict";module.exports=[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"])},51496,a=>{let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call LiveRefresh() from the server but LiveRefresh 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/live-refresh.tsx","LiveRefresh");a.s(["LiveRefresh",0,b])},20285,a=>{var b=a.i(51496);a.n(b)},67395,a=>{var b=a.i(7997);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})}])},65044,a=>{var b=a.i(7997),c=a.i(11393);let d={waiting:"border-tone-waiting-border bg-tone-waiting-bg text-tone-waiting-fg",active:"border-tone-active-border bg-tone-active-bg text-tone-active-fg",ok:"border-tone-ok-border bg-tone-ok-bg text-tone-ok-fg",attention:"border-tone-attention-border bg-tone-attention-bg text-tone-attention-fg",ended:"border-tone-ended-border bg-tone-ended-bg text-tone-ended-fg"};function e({status:a}){return(0,b.jsx)("span",{className:`inline-flex shrink-0 items-center rounded-full border px-2 py-0.5 text-caption ${d[a.tone]}`,children:a.label})}function f({name:a}){return(0,b.jsx)("span",{"aria-hidden":"true",className:"inline-flex size-8 shrink-0 items-center justify-center rounded-md bg-secondary font-semibold text-secondary-foreground",children:a.slice(0,1).toUpperCase()})}function g({request:a,now:d}){let h=(0,c.M)(a);return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(f,{name:h}),(0,b.jsxs)("span",{className:"flex min-w-0 flex-1 flex-col",children:[(0,b.jsx)("span",{className:"truncate",children:h}),(0,b.jsx)("span",{className:"text-caption text-muted-foreground",children:(0,c.E)(a)})]}),(0,b.jsx)(e,{status:(0,c.T)(a,d)})]})}a.s(["f",0,function({title:a,requests:c,now:d,hrefOf:e,currentId:f}){return(0,b.jsxs)("section",{className:"grid gap-2",children:[(0,b.jsxs)("h2",{className:"text-section font-semibold",children:[a," · ",c.length]}),c.map(a=>void 0===e?(0,b.jsx)("div",{className:"flex items-center gap-3 rounded-md border border-border bg-card p-3",children:(0,b.jsx)(g,{request:a,now:d})},a.requestId):(0,b.jsx)("a",{href:e(a),"aria-current":a.requestId===f?"true":void 0,"data-testid":"overview-request",className:"flex items-center gap-3 rounded-md border border-border bg-card p-3 hover:bg-accent aria-[current=true]:border-ring",children:(0,b.jsx)(g,{request:a,now:d})},a.requestId))]})}],65044)},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_1k6q2m0sl54-8._.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../web/features/forms/ui/look.ts","../../../../../web/features/overview/state/live-refresh.tsx/__nextjs-internal-proxy.mjs%20%7B%20server%20%3D%3E%20%22%5Bproject%5D/web/features/overview/state/live-refresh.tsx%22%20%7D","../../../../../web/features/overview/ui/notice.tsx","../../../../../web/features/overview/ui/requests-list.tsx","../../../../../web/features/overview/ui/status-badge.tsx","../../../../../web/features/sign-in/ui/no-sign-in.tsx"],"sourcesContent":["/** 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","// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport const LiveRefresh = registerClientReference(\n function() { throw new Error(\"Attempted to call LiveRefresh() from the server but LiveRefresh 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/live-refresh.tsx\",\n \"LiveRefresh\",\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","import { requestStatus, subjectKind, subjectName, type ShownRequest } from '../services/requests';\nimport { StatusBadge } from './status-badge';\n\nfunction PartyMark({ name }: { name: string }) {\n return (\n <span aria-hidden=\"true\" className=\"inline-flex size-8 shrink-0 items-center justify-center rounded-md bg-secondary font-semibold text-secondary-foreground\">\n {name.slice(0, 1).toUpperCase()}\n </span>\n );\n}\n\nfunction RequestRow({ request, now }: { request: ShownRequest; now: Date }) {\n const name = subjectName(request);\n return (\n <>\n <PartyMark name={name} />\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate\">{name}</span>\n <span className=\"text-caption text-muted-foreground\">{subjectKind(request)}</span>\n </span>\n <StatusBadge status={requestStatus(request, now)} />\n </>\n );\n}\n\n/** Requests in a list: each a link to decide it, or, for the person's own, its state alone. */\nexport function RequestsList({ title, requests, now, hrefOf, currentId }: { title: string; requests: readonly ShownRequest[]; now: Date; hrefOf?: (request: ShownRequest) => string; currentId?: string }) {\n return (\n <section className=\"grid gap-2\">\n <h2 className=\"text-section font-semibold\">\n {title} · {requests.length}\n </h2>\n {requests.map((request) =>\n hrefOf === undefined ? (\n <div key={request.requestId} className=\"flex items-center gap-3 rounded-md border border-border bg-card p-3\">\n <RequestRow request={request} now={now} />\n </div>\n ) : (\n <a\n key={request.requestId}\n href={hrefOf(request)}\n aria-current={request.requestId === currentId ? 'true' : undefined}\n data-testid=\"overview-request\"\n className=\"flex items-center gap-3 rounded-md border border-border bg-card p-3 hover:bg-accent aria-[current=true]:border-ring\"\n >\n <RequestRow request={request} now={now} />\n </a>\n ),\n )}\n </section>\n );\n}\n","import type { Status, Tone } from '../services/requests';\n\nconst TONES: Record<Tone, string> = {\n waiting: 'border-tone-waiting-border bg-tone-waiting-bg text-tone-waiting-fg',\n active: 'border-tone-active-border bg-tone-active-bg text-tone-active-fg',\n ok: 'border-tone-ok-border bg-tone-ok-bg text-tone-ok-fg',\n attention: 'border-tone-attention-border bg-tone-attention-bg text-tone-attention-fg',\n ended: 'border-tone-ended-border bg-tone-ended-bg text-tone-ended-fg',\n};\n\n/** A status in its tone, always with its words, so it never rests on colour alone. */\nexport function StatusBadge({ status }: { status: Status }) {\n return <span className={`inline-flex shrink-0 items-center rounded-full border px-2 py-0.5 text-caption ${TONES[status.tone]}`}>{status.label}</span>;\n}\n","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":["CARD","BUTTON","BUTTONS","primary","secondary","destructive","INPUT","LABEL","LiveRefresh","Error","Notice","message","isFailure","role","className","TONES","waiting","active","ok","attention","ended","StatusBadge","status","tone","label","NoSignIn"],"mappings":"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","ignoreList":[1]}
@@ -1,3 +1,3 @@
1
- module.exports=[96001,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(30587),e=a.i(60224),f=a.i(88412),g=a.i(36855),h=a.i(35149),i=a.i(77237),j=a.i(64943),k=a.i(5050);let l=(0,k.createServerReference)("603c02af05f2520217716b567bda68040ecbf48391",k.callServer,void 0,k.findSourceMapURL,"addA2aAgent"),m={kind:"idle"};a.s(["A2aAgentForm",0,function({fleetId:a,requestId:k,owners:n,scopes:o}){let[p,q]=(0,c.useActionState)(l,m),r="refused"===p.kind?p.fields:{};return(0,b.jsxs)("form",{action:q,className:`${f.r} grid gap-3`,"data-testid":"add-a2a-agent-form",children:[(0,b.jsx)("input",{type:"hidden",name:d.H,value:a}),(0,b.jsx)("input",{type:"hidden",name:"requestId",value:k}),(0,b.jsx)("h1",{className:"text-title font-semibold",children:"Add an A2A agent"}),(0,b.jsx)(g.f,{state:"refused"===p.kind?p:{kind:"idle"}}),(0,b.jsxs)("label",{className:f.z,children:[(0,b.jsx)("span",{children:"Name, the proxy ship's"}),(0,b.jsx)("input",{className:f.w,name:"name",defaultValue:r.name??"",required:!0})]}),(0,b.jsxs)("label",{className:f.z,children:[(0,b.jsx)("span",{children:"Card address"}),(0,b.jsx)("input",{className:f.w,type:"url",name:"cardUrl",defaultValue:r.cardUrl??"",placeholder:"https://agent.example.com/.well-known/agent-card.json",required:!0}),(0,b.jsx)("span",{className:"text-caption text-muted-foreground",children:"The gateway reads the card first: an agent whose card it cannot state is not added."})]}),(0,b.jsx)(e.f,{legend:"The agent's credential",fields:r,noneHelp:"The gateway sends no credential: for an agent that asks for none."}),(0,b.jsxs)("label",{className:f.z,children:[(0,b.jsx)("span",{children:"Messages in flight at once"}),(0,b.jsx)("input",{className:f.w,type:"number",name:"concurrencyLimit",min:1,max:10,defaultValue:r.concurrencyLimit??"4"})]}),(0,b.jsx)(h.f,{choices:n.isOk?n.value:[],current:null,help:"A person ship or argo. It answers for this agent.",refusal:n.isOk?void 0:n.refusal}),0===o.length?null:(0,b.jsxs)("fieldset",{className:"grid gap-2",children:[(0,b.jsx)("legend",{className:"font-medium",children:"Scopes, beside sending and receiving"}),o.map(a=>(0,b.jsxs)("label",{className:"flex items-center gap-2",children:[(0,b.jsx)("input",{type:"checkbox",name:`${j.f}${a}`,defaultChecked:void 0!==r[`${j.f}${a}`]}),(0,b.jsx)("span",{className:"font-mono text-code",children:a})]},a))]}),(0,b.jsx)("div",{children:(0,b.jsx)(i.f,{pending:"Reading the card…",children:"Add"})})]})}],96001)}];
1
+ module.exports=[96001,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(30587),e=a.i(60224),f=a.i(88412),g=a.i(36855),h=a.i(35149),i=a.i(77237),j=a.i(45677),k=a.i(5050);let l=(0,k.createServerReference)("60e1372b310028e4e5b6cd63f53b452da1eb63833d",k.callServer,void 0,k.findSourceMapURL,"addA2aAgent"),m={kind:"idle"};a.s(["A2aAgentForm",0,function({fleetId:a,requestId:k,owners:n,scopes:o}){let[p,q]=(0,c.useActionState)(l,m),r="refused"===p.kind?p.fields:{};return(0,b.jsxs)("form",{action:q,className:`${f.r} grid gap-3`,"data-testid":"add-a2a-agent-form",children:[(0,b.jsx)("input",{type:"hidden",name:d.H,value:a}),(0,b.jsx)("input",{type:"hidden",name:"requestId",value:k}),(0,b.jsx)("h1",{className:"text-title font-semibold",children:"Add an A2A agent"}),(0,b.jsx)(g.f,{state:"refused"===p.kind?p:{kind:"idle"}}),(0,b.jsxs)("label",{className:f.z,children:[(0,b.jsx)("span",{children:"Name, the proxy ship's"}),(0,b.jsx)("input",{className:f.w,name:"name",defaultValue:r.name??"",required:!0})]}),(0,b.jsxs)("label",{className:f.z,children:[(0,b.jsx)("span",{children:"Card address"}),(0,b.jsx)("input",{className:f.w,type:"url",name:"cardUrl",defaultValue:r.cardUrl??"",placeholder:"https://agent.example.com/.well-known/agent-card.json",required:!0}),(0,b.jsx)("span",{className:"text-caption text-muted-foreground",children:"The gateway reads the card first: an agent whose card it cannot state is not added."})]}),(0,b.jsx)(e.f,{legend:"The agent's credential",fields:r,noneHelp:"The gateway sends no credential: for an agent that asks for none."}),(0,b.jsxs)("label",{className:f.z,children:[(0,b.jsx)("span",{children:"Messages in flight at once"}),(0,b.jsx)("input",{className:f.w,type:"number",name:"concurrencyLimit",min:1,max:10,defaultValue:r.concurrencyLimit??"4"})]}),(0,b.jsx)(h.f,{choices:n.isOk?n.value:[],current:null,help:"A person ship or argo. It answers for this agent.",refusal:n.isOk?void 0:n.refusal}),0===o.length?null:(0,b.jsxs)("fieldset",{className:"grid gap-2",children:[(0,b.jsx)("legend",{className:"font-medium",children:"Scopes, beside sending and receiving"}),o.map(a=>(0,b.jsxs)("label",{className:"flex items-center gap-2",children:[(0,b.jsx)("input",{type:"checkbox",name:`${j.f}${a}`,defaultChecked:void 0!==r[`${j.f}${a}`]}),(0,b.jsx)("span",{className:"font-mono text-code",children:a})]},a))]}),(0,b.jsx)("div",{children:(0,b.jsx)(i.f,{pending:"Reading the card…",children:"Add"})})]})}],96001)}];
2
2
 
3
3
  //# sourceMappingURL=web_features_add-a2a-agent_ui_a2a-agent-form_tsx_0z8t1aalwzyl7._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../web/features/add-a2a-agent/ui/a2a-agent-form.tsx","../../../../../web/features/add-a2a-agent/data%3Ae63de7%20%3Ctext/javascript%3E"],"sourcesContent":["'use client';\n\nimport { useActionState } from 'react';\n\nimport { FLEET_FIELD } from '../../forms/form-state';\nimport { CredentialFields } from '../../forms/ui/credential-fields';\nimport { CARD, INPUT, LABEL } from '../../forms/ui/look';\nimport { Outcome } from '../../forms/ui/outcome';\nimport { OwnerField, type OwnerChoices } from '../../forms/ui/owner-field';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport { SCOPE_FIELD_PREFIX } from '../../outside-party/scope-changes';\nimport { addA2aAgent, type AddA2aAgentState } from '../actions';\n\nconst IDLE: AddA2aAgentState = { kind: 'idle' };\n\nconst CONCURRENCY_LIMIT_DEFAULT = '4';\n\n/** The form that adds an A2A agent: its name, card address, credential and calls at once, its owner and the approver's own scopes to tick. */\nexport function A2aAgentForm({ fleetId, requestId, owners, scopes }: { fleetId: string; requestId: string; owners: OwnerChoices; scopes: readonly string[] }) {\n const [state, action] = useActionState(addA2aAgent, IDLE);\n const fields = state.kind === 'refused' ? state.fields : {};\n return (\n <form action={action} className={`${CARD} grid gap-3`} data-testid=\"add-a2a-agent-form\">\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <input type=\"hidden\" name=\"requestId\" value={requestId} />\n <h1 className=\"text-title font-semibold\">Add an A2A agent</h1>\n <Outcome state={state.kind === 'refused' ? state : { kind: 'idle' }} />\n <label className={LABEL}>\n <span>Name, the proxy ship&apos;s</span>\n <input className={INPUT} name=\"name\" defaultValue={fields.name ?? ''} required />\n </label>\n <label className={LABEL}>\n <span>Card address</span>\n <input className={INPUT} type=\"url\" name=\"cardUrl\" defaultValue={fields.cardUrl ?? ''} placeholder=\"https://agent.example.com/.well-known/agent-card.json\" required />\n <span className=\"text-caption text-muted-foreground\">The gateway reads the card first: an agent whose card it cannot state is not added.</span>\n </label>\n <CredentialFields legend=\"The agent's credential\" fields={fields} noneHelp=\"The gateway sends no credential: for an agent that asks for none.\" />\n <label className={LABEL}>\n <span>Messages in flight at once</span>\n <input className={INPUT} type=\"number\" name=\"concurrencyLimit\" min={1} max={10} defaultValue={fields.concurrencyLimit ?? CONCURRENCY_LIMIT_DEFAULT} />\n </label>\n <OwnerField choices={owners.isOk ? owners.value : []} current={null} help=\"A person ship or argo. It answers for this agent.\" refusal={owners.isOk ? undefined : owners.refusal} />\n {scopes.length === 0 ? null : (\n <fieldset className=\"grid gap-2\">\n <legend className=\"font-medium\">Scopes, beside sending and receiving</legend>\n {scopes.map((scope) => (\n <label key={scope} className=\"flex items-center gap-2\">\n <input type=\"checkbox\" name={`${SCOPE_FIELD_PREFIX}${scope}`} defaultChecked={fields[`${SCOPE_FIELD_PREFIX}${scope}`] !== undefined} />\n <span className=\"font-mono text-code\">{scope}</span>\n </label>\n ))}\n </fieldset>\n )}\n <div>\n <SubmitButton pending=\"Reading the card…\">Add</SubmitButton>\n </div>\n </form>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"603c02af05f2520217716b567bda68040ecbf48391\":{\"name\":\"addA2aAgent\"}},\"web/features/add-a2a-agent/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(\"603c02af05f2520217716b567bda68040ecbf48391\",callServer,void 0,findSourceMapURL,\"addA2aAgent\");export{$$RSC_SERVER_ACTION_0 as addA2aAgent};"],"names":["$$RSC_SERVER_ACTION_0"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../web/features/add-a2a-agent/ui/a2a-agent-form.tsx","../../../../../web/features/add-a2a-agent/data%3Aba1fc8%20%3Ctext/javascript%3E"],"sourcesContent":["'use client';\n\nimport { useActionState } from 'react';\n\nimport { FLEET_FIELD } from '../../forms/form-state';\nimport { CredentialFields } from '../../forms/ui/credential-fields';\nimport { CARD, INPUT, LABEL } from '../../forms/ui/look';\nimport { Outcome } from '../../forms/ui/outcome';\nimport { OwnerField, type OwnerChoices } from '../../forms/ui/owner-field';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport { SCOPE_FIELD_PREFIX } from '../../outside-party/scope-changes';\nimport { addA2aAgent, type AddA2aAgentState } from '../actions';\n\nconst IDLE: AddA2aAgentState = { kind: 'idle' };\n\nconst CONCURRENCY_LIMIT_DEFAULT = '4';\n\n/** The form that adds an A2A agent: its name, card address, credential and calls at once, its owner and the approver's own scopes to tick. */\nexport function A2aAgentForm({ fleetId, requestId, owners, scopes }: { fleetId: string; requestId: string; owners: OwnerChoices; scopes: readonly string[] }) {\n const [state, action] = useActionState(addA2aAgent, IDLE);\n const fields = state.kind === 'refused' ? state.fields : {};\n return (\n <form action={action} className={`${CARD} grid gap-3`} data-testid=\"add-a2a-agent-form\">\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <input type=\"hidden\" name=\"requestId\" value={requestId} />\n <h1 className=\"text-title font-semibold\">Add an A2A agent</h1>\n <Outcome state={state.kind === 'refused' ? state : { kind: 'idle' }} />\n <label className={LABEL}>\n <span>Name, the proxy ship&apos;s</span>\n <input className={INPUT} name=\"name\" defaultValue={fields.name ?? ''} required />\n </label>\n <label className={LABEL}>\n <span>Card address</span>\n <input className={INPUT} type=\"url\" name=\"cardUrl\" defaultValue={fields.cardUrl ?? ''} placeholder=\"https://agent.example.com/.well-known/agent-card.json\" required />\n <span className=\"text-caption text-muted-foreground\">The gateway reads the card first: an agent whose card it cannot state is not added.</span>\n </label>\n <CredentialFields legend=\"The agent's credential\" fields={fields} noneHelp=\"The gateway sends no credential: for an agent that asks for none.\" />\n <label className={LABEL}>\n <span>Messages in flight at once</span>\n <input className={INPUT} type=\"number\" name=\"concurrencyLimit\" min={1} max={10} defaultValue={fields.concurrencyLimit ?? CONCURRENCY_LIMIT_DEFAULT} />\n </label>\n <OwnerField choices={owners.isOk ? owners.value : []} current={null} help=\"A person ship or argo. It answers for this agent.\" refusal={owners.isOk ? undefined : owners.refusal} />\n {scopes.length === 0 ? null : (\n <fieldset className=\"grid gap-2\">\n <legend className=\"font-medium\">Scopes, beside sending and receiving</legend>\n {scopes.map((scope) => (\n <label key={scope} className=\"flex items-center gap-2\">\n <input type=\"checkbox\" name={`${SCOPE_FIELD_PREFIX}${scope}`} defaultChecked={fields[`${SCOPE_FIELD_PREFIX}${scope}`] !== undefined} />\n <span className=\"font-mono text-code\">{scope}</span>\n </label>\n ))}\n </fieldset>\n )}\n <div>\n <SubmitButton pending=\"Reading the card…\">Add</SubmitButton>\n </div>\n </form>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"60e1372b310028e4e5b6cd63f53b452da1eb63833d\":{\"name\":\"addA2aAgent\"}},\"web/features/add-a2a-agent/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(\"60e1372b310028e4e5b6cd63f53b452da1eb63833d\",callServer,void 0,findSourceMapURL,\"addA2aAgent\");export{$$RSC_SERVER_ACTION_0 as addA2aAgent};"],"names":["$$RSC_SERVER_ACTION_0"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- module.exports=[90344,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(25959),e=a.i(30587),f=a.i(88412),g=a.i(36855),h=a.i(35149),i=a.i(77237),j=a.i(64943),k=a.i(5050);let l=(0,k.createServerReference)("60603a92ed50e3b9120d0d5125ae97329a5b89b154",k.callServer,void 0,k.findSourceMapURL,"addA2aClient"),m={kind:"idle"};function n({name:a,bearer:c,fleetId:e}){return(0,b.jsxs)("section",{className:`${f.r} grid gap-3`,"data-testid":"add-a2a-client-added",children:[(0,b.jsxs)("h2",{className:"text-section font-semibold",children:[a," is added"]}),(0,b.jsx)("p",{children:"Hand its client this bearer now. It is shown only once: the gateway keeps no copy it can show again."}),(0,b.jsx)("code",{className:"break-all rounded-md border border-border bg-background px-3 py-2 font-mono text-code","data-testid":"add-a2a-client-bearer",children:c}),(0,b.jsx)("p",{children:(0,b.jsx)("a",{href:(0,d.f)(`/outside-parties/${encodeURIComponent(a)}`,e),className:"text-primary hover:underline",children:"Its card addresses"})})]})}a.s(["A2aClientForm",0,function({fleetId:a,requestId:d,owners:k,scopes:o}){let[p,q]=(0,c.useActionState)(l,m);return"added"===p.kind?(0,b.jsx)(n,{name:p.name,bearer:p.bearer,fleetId:a}):(0,b.jsxs)("form",{action:q,className:`${f.r} grid gap-3`,"data-testid":"add-a2a-client-form",children:[(0,b.jsx)("input",{type:"hidden",name:e.H,value:a}),(0,b.jsx)("input",{type:"hidden",name:"requestId",value:d}),(0,b.jsx)("h1",{className:"text-title font-semibold",children:"Add an A2A client"}),(0,b.jsxs)("label",{className:f.z,children:[(0,b.jsx)("span",{children:"Name, the proxy ship's"}),(0,b.jsx)("input",{className:f.w,name:"name",required:!0})]}),(0,b.jsx)(h.f,{choices:k.isOk?k.value:[],current:null,help:"A person ship or argo. It answers for this client.",refusal:k.isOk?void 0:k.refusal}),0===o.length?null:(0,b.jsxs)("fieldset",{className:"grid gap-2",children:[(0,b.jsx)("legend",{className:"font-medium",children:"Scopes, beside sending and receiving"}),o.map(a=>(0,b.jsxs)("label",{className:"flex items-center gap-2",children:[(0,b.jsx)("input",{type:"checkbox",name:`${j.f}${a}`}),(0,b.jsx)("span",{className:"font-mono text-code",children:a})]},a))]}),(0,b.jsx)("div",{children:(0,b.jsx)(i.f,{pending:"Adding…",children:"Add"})}),(0,b.jsx)(g.f,{state:"refused"===p.kind?p:{kind:"idle"}})]})}],90344)}];
1
+ module.exports=[90344,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(25959),e=a.i(30587),f=a.i(88412),g=a.i(36855),h=a.i(35149),i=a.i(77237),j=a.i(45677),k=a.i(5050);let l=(0,k.createServerReference)("603cbf887d58be5debb93c1e2bfea0e8983e157c11",k.callServer,void 0,k.findSourceMapURL,"addA2aClient"),m={kind:"idle"};function n({name:a,bearer:c,fleetId:e}){return(0,b.jsxs)("section",{className:`${f.r} grid gap-3`,"data-testid":"add-a2a-client-added",children:[(0,b.jsxs)("h2",{className:"text-section font-semibold",children:[a," is added"]}),(0,b.jsx)("p",{children:"Hand its client this bearer now. It is shown only once: the gateway keeps no copy it can show again."}),(0,b.jsx)("code",{className:"break-all rounded-md border border-border bg-background px-3 py-2 font-mono text-code","data-testid":"add-a2a-client-bearer",children:c}),(0,b.jsx)("p",{children:(0,b.jsx)("a",{href:(0,d.f)(`/outside-parties/${encodeURIComponent(a)}`,e),className:"text-primary hover:underline",children:"Its card addresses"})})]})}a.s(["A2aClientForm",0,function({fleetId:a,requestId:d,owners:k,scopes:o}){let[p,q]=(0,c.useActionState)(l,m);return"added"===p.kind?(0,b.jsx)(n,{name:p.name,bearer:p.bearer,fleetId:a}):(0,b.jsxs)("form",{action:q,className:`${f.r} grid gap-3`,"data-testid":"add-a2a-client-form",children:[(0,b.jsx)("input",{type:"hidden",name:e.H,value:a}),(0,b.jsx)("input",{type:"hidden",name:"requestId",value:d}),(0,b.jsx)("h1",{className:"text-title font-semibold",children:"Add an A2A client"}),(0,b.jsxs)("label",{className:f.z,children:[(0,b.jsx)("span",{children:"Name, the proxy ship's"}),(0,b.jsx)("input",{className:f.w,name:"name",required:!0})]}),(0,b.jsx)(h.f,{choices:k.isOk?k.value:[],current:null,help:"A person ship or argo. It answers for this client.",refusal:k.isOk?void 0:k.refusal}),0===o.length?null:(0,b.jsxs)("fieldset",{className:"grid gap-2",children:[(0,b.jsx)("legend",{className:"font-medium",children:"Scopes, beside sending and receiving"}),o.map(a=>(0,b.jsxs)("label",{className:"flex items-center gap-2",children:[(0,b.jsx)("input",{type:"checkbox",name:`${j.f}${a}`}),(0,b.jsx)("span",{className:"font-mono text-code",children:a})]},a))]}),(0,b.jsx)("div",{children:(0,b.jsx)(i.f,{pending:"Adding…",children:"Add"})}),(0,b.jsx)(g.f,{state:"refused"===p.kind?p:{kind:"idle"}})]})}],90344)}];
2
2
 
3
3
  //# sourceMappingURL=web_features_add-a2a-client_ui_a2a-client-form_tsx_1anv88g385nwe._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../web/features/add-a2a-client/ui/a2a-client-form.tsx","../../../../../web/features/outside-parties/paths.ts","../../../../../web/features/add-a2a-client/data%3Ac60158%20%3Ctext/javascript%3E"],"sourcesContent":["'use client';\n\nimport { useActionState } from 'react';\n\nimport { inFleet } from '../../../lib/gateway-api/page-account';\nimport { FLEET_FIELD } from '../../forms/form-state';\nimport { CARD, INPUT, LABEL } from '../../forms/ui/look';\nimport { Outcome } from '../../forms/ui/outcome';\nimport { OwnerField, type OwnerChoices } from '../../forms/ui/owner-field';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport { partyPath } from '../../outside-parties/paths';\nimport { SCOPE_FIELD_PREFIX } from '../../outside-party/scope-changes';\nimport { addA2aClient, type AddA2aClientState } from '../actions';\n\nconst IDLE: AddA2aClientState = { kind: 'idle' };\n\n/** The bearer, shown this once: the gateway keeps only its hash. */\nfunction Added({ name, bearer, fleetId }: { name: string; bearer: string; fleetId: string }) {\n return (\n <section className={`${CARD} grid gap-3`} data-testid=\"add-a2a-client-added\">\n <h2 className=\"text-section font-semibold\">{name} is added</h2>\n <p>Hand its client this bearer now. It is shown only once: the gateway keeps no copy it can show again.</p>\n <code className=\"break-all rounded-md border border-border bg-background px-3 py-2 font-mono text-code\" data-testid=\"add-a2a-client-bearer\">\n {bearer}\n </code>\n <p>\n <a href={inFleet(partyPath(name), fleetId)} className=\"text-primary hover:underline\">\n Its card addresses\n </a>\n </p>\n </section>\n );\n}\n\n/** The form that adds an A2A client: its name, owner and the approver's own scopes to tick; then its bearer. */\nexport function A2aClientForm({ fleetId, requestId, owners, scopes }: { fleetId: string; requestId: string; owners: OwnerChoices; scopes: readonly string[] }) {\n const [state, action] = useActionState(addA2aClient, IDLE);\n if (state.kind === 'added') {\n return <Added name={state.name} bearer={state.bearer} fleetId={fleetId} />;\n }\n return (\n <form action={action} className={`${CARD} grid gap-3`} data-testid=\"add-a2a-client-form\">\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <input type=\"hidden\" name=\"requestId\" value={requestId} />\n <h1 className=\"text-title font-semibold\">Add an A2A client</h1>\n <label className={LABEL}>\n <span>Name, the proxy ship&apos;s</span>\n <input className={INPUT} name=\"name\" required />\n </label>\n <OwnerField choices={owners.isOk ? owners.value : []} current={null} help=\"A person ship or argo. It answers for this client.\" refusal={owners.isOk ? undefined : owners.refusal} />\n {scopes.length === 0 ? null : (\n <fieldset className=\"grid gap-2\">\n <legend className=\"font-medium\">Scopes, beside sending and receiving</legend>\n {scopes.map((scope) => (\n <label key={scope} className=\"flex items-center gap-2\">\n <input type=\"checkbox\" name={`${SCOPE_FIELD_PREFIX}${scope}`} />\n <span className=\"font-mono text-code\">{scope}</span>\n </label>\n ))}\n </fieldset>\n )}\n <div>\n <SubmitButton pending=\"Adding…\">Add</SubmitButton>\n </div>\n <Outcome state={state.kind === 'refused' ? state : { kind: 'idle' }} />\n </form>\n );\n}\n","/** The outside parties' pages. */\nexport const OUTSIDE_PARTIES_PATH = '/outside-parties';\n\nexport const ADD_SERVER_PATH = `${OUTSIDE_PARTIES_PATH}/add`;\n\nexport const ADD_A2A_CLIENT_PATH = `${OUTSIDE_PARTIES_PATH}/add-a2a-client`;\n\nexport const ADD_A2A_AGENT_PATH = `${OUTSIDE_PARTIES_PATH}/add-a2a-agent`;\n\n/** One outside party's page, or one of its own: changing it, retiring it. */\nexport function partyPath(name: string, action?: 'change' | 'retire'): string {\n return `${OUTSIDE_PARTIES_PATH}/${encodeURIComponent(name)}${action === undefined ? '' : `/${action}`}`;\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"60603a92ed50e3b9120d0d5125ae97329a5b89b154\":{\"name\":\"addA2aClient\"}},\"web/features/add-a2a-client/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(\"60603a92ed50e3b9120d0d5125ae97329a5b89b154\",callServer,void 0,findSourceMapURL,\"addA2aClient\");export{$$RSC_SERVER_ACTION_0 as addA2aClient};"],"names":["OUTSIDE_PARTIES_PATH","ADD_SERVER_PATH","ADD_A2A_CLIENT_PATH","ADD_A2A_AGENT_PATH","partyPath","name","action","encodeURIComponent","undefined"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../web/features/add-a2a-client/ui/a2a-client-form.tsx","../../../../../web/features/outside-parties/paths.ts","../../../../../web/features/add-a2a-client/data%3A807290%20%3Ctext/javascript%3E"],"sourcesContent":["'use client';\n\nimport { useActionState } from 'react';\n\nimport { inFleet } from '../../../lib/gateway-api/page-account';\nimport { FLEET_FIELD } from '../../forms/form-state';\nimport { CARD, INPUT, LABEL } from '../../forms/ui/look';\nimport { Outcome } from '../../forms/ui/outcome';\nimport { OwnerField, type OwnerChoices } from '../../forms/ui/owner-field';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport { partyPath } from '../../outside-parties/paths';\nimport { SCOPE_FIELD_PREFIX } from '../../outside-party/scope-changes';\nimport { addA2aClient, type AddA2aClientState } from '../actions';\n\nconst IDLE: AddA2aClientState = { kind: 'idle' };\n\n/** The bearer, shown this once: the gateway keeps only its hash. */\nfunction Added({ name, bearer, fleetId }: { name: string; bearer: string; fleetId: string }) {\n return (\n <section className={`${CARD} grid gap-3`} data-testid=\"add-a2a-client-added\">\n <h2 className=\"text-section font-semibold\">{name} is added</h2>\n <p>Hand its client this bearer now. It is shown only once: the gateway keeps no copy it can show again.</p>\n <code className=\"break-all rounded-md border border-border bg-background px-3 py-2 font-mono text-code\" data-testid=\"add-a2a-client-bearer\">\n {bearer}\n </code>\n <p>\n <a href={inFleet(partyPath(name), fleetId)} className=\"text-primary hover:underline\">\n Its card addresses\n </a>\n </p>\n </section>\n );\n}\n\n/** The form that adds an A2A client: its name, owner and the approver's own scopes to tick; then its bearer. */\nexport function A2aClientForm({ fleetId, requestId, owners, scopes }: { fleetId: string; requestId: string; owners: OwnerChoices; scopes: readonly string[] }) {\n const [state, action] = useActionState(addA2aClient, IDLE);\n if (state.kind === 'added') {\n return <Added name={state.name} bearer={state.bearer} fleetId={fleetId} />;\n }\n return (\n <form action={action} className={`${CARD} grid gap-3`} data-testid=\"add-a2a-client-form\">\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <input type=\"hidden\" name=\"requestId\" value={requestId} />\n <h1 className=\"text-title font-semibold\">Add an A2A client</h1>\n <label className={LABEL}>\n <span>Name, the proxy ship&apos;s</span>\n <input className={INPUT} name=\"name\" required />\n </label>\n <OwnerField choices={owners.isOk ? owners.value : []} current={null} help=\"A person ship or argo. It answers for this client.\" refusal={owners.isOk ? undefined : owners.refusal} />\n {scopes.length === 0 ? null : (\n <fieldset className=\"grid gap-2\">\n <legend className=\"font-medium\">Scopes, beside sending and receiving</legend>\n {scopes.map((scope) => (\n <label key={scope} className=\"flex items-center gap-2\">\n <input type=\"checkbox\" name={`${SCOPE_FIELD_PREFIX}${scope}`} />\n <span className=\"font-mono text-code\">{scope}</span>\n </label>\n ))}\n </fieldset>\n )}\n <div>\n <SubmitButton pending=\"Adding…\">Add</SubmitButton>\n </div>\n <Outcome state={state.kind === 'refused' ? state : { kind: 'idle' }} />\n </form>\n );\n}\n","/** The outside parties' pages. */\nexport const OUTSIDE_PARTIES_PATH = '/outside-parties';\n\nexport const ADD_SERVER_PATH = `${OUTSIDE_PARTIES_PATH}/add`;\n\nexport const ADD_A2A_CLIENT_PATH = `${OUTSIDE_PARTIES_PATH}/add-a2a-client`;\n\nexport const ADD_A2A_AGENT_PATH = `${OUTSIDE_PARTIES_PATH}/add-a2a-agent`;\n\n/** One outside party's page, or one of its own: changing it, retiring it. */\nexport function partyPath(name: string, action?: 'change' | 'retire'): string {\n return `${OUTSIDE_PARTIES_PATH}/${encodeURIComponent(name)}${action === undefined ? '' : `/${action}`}`;\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"603cbf887d58be5debb93c1e2bfea0e8983e157c11\":{\"name\":\"addA2aClient\"}},\"web/features/add-a2a-client/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(\"603cbf887d58be5debb93c1e2bfea0e8983e157c11\",callServer,void 0,findSourceMapURL,\"addA2aClient\");export{$$RSC_SERVER_ACTION_0 as addA2aClient};"],"names":["OUTSIDE_PARTIES_PATH","ADD_SERVER_PATH","ADD_A2A_CLIENT_PATH","ADD_A2A_AGENT_PATH","partyPath","name","action","encodeURIComponent","undefined"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- module.exports=[29372,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(30587),e=a.i(60224),f=a.i(88412),g=a.i(36855),h=a.i(35149),i=a.i(77237),j=a.i(10020),k=a.i(47763);function l({tool:a,control:c,testId:d}){let{name:e,description:f,isReadOnly:g,isNew:h=!1}=a,i=void 0===f?"":f.split("\n").map(a=>a.trim()).find(a=>""!==a)??"",j=void 0!==f&&f.trim()!==i;return(0,b.jsxs)("li",{className:"grid gap-1 border-b border-border py-2 last:border-b-0","data-testid":d,children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[c,(0,b.jsx)("span",{className:"font-mono",children:e}),g?(0,b.jsx)(k.E,{children:"reads only"}):null,h?(0,b.jsx)(k.T,{tone:"attention",label:"New"}):null]}),""===i?null:j?(0,b.jsxs)("details",{className:"text-muted-foreground",children:[(0,b.jsx)("summary",{className:"cursor-pointer",children:i}),(0,b.jsx)("p",{className:"mt-1 whitespace-pre-line",children:f})]}):(0,b.jsx)("p",{className:"text-muted-foreground",children:i})]})}var m=a.i(5050);let n=(0,m.createServerReference)("602fc68efe93632500d8dd932b478dec13d0f730d6",m.callServer,void 0,m.findSourceMapURL,"approveServer"),o=(0,m.createServerReference)("605398e73b605625bb3dee184002103ffa040aef48",m.callServer,void 0,m.findSourceMapURL,"checkServer"),p=["Address","Check","Owner"],q=["url","credentialKind","token","clientId","clientSecret","issuer","scope"];function r({at:a}){return(0,b.jsx)("ol",{className:"flex gap-4",children:p.map((c,d)=>(0,b.jsxs)("li",{"aria-current":d===a?"step":void 0,className:d<=a?"font-medium":"text-muted-foreground",children:[d+1," ",c]},c))})}function s({refusal:a}){return void 0===a?null:(0,b.jsx)(g.f,{state:{kind:"refused",message:a}})}function t({state:a,action:c,fleetId:g}){return(0,b.jsxs)("form",{action:c,className:`${f.r} grid gap-3`,"data-testid":"add-server-address",children:[(0,b.jsx)("input",{type:"hidden",name:d.H,value:g}),(0,b.jsx)(s,{refusal:a.refusal}),(0,b.jsxs)("label",{className:f.z,children:[(0,b.jsx)("span",{children:"Streamable HTTP address"}),(0,b.jsx)("input",{className:f.w,type:"url",name:"url",defaultValue:a.fields.url??"",placeholder:"https://mcp.example.com/mcp",required:!0})]}),(0,b.jsx)(e.f,{legend:"The server's credential",fields:a.fields,noneHelp:"The gateway sends no credential: for a server reached only on a private network."}),(0,b.jsx)("div",{children:(0,b.jsx)(i.f,{pending:"Checking the server…",testId:"add-server-check",children:"Check the server"})})]})}function u({tools:a,canSwitch:d}){let[e,f]=(0,c.useState)(new Set),g=a.length-e.size;return(0,b.jsxs)("section",{className:"grid gap-2","data-testid":"add-server-tools",children:[(0,b.jsxs)("h2",{className:"flex flex-wrap justify-between gap-2 text-section font-semibold",children:[(0,b.jsxs)("span",{children:["The server answers: ",a.length," ",1===a.length?"tool":"tools"]}),d?(0,b.jsxs)("span",{role:"status",className:"font-normal text-muted-foreground","data-testid":"add-server-tools-on",children:[g," of ",a.length," on"]}):null]}),(0,b.jsx)("p",{className:"text-muted-foreground",children:d?"The fleet may call only the tools switched on. A tool the server adds later starts off.":"Switching tools needs gateway:approve: every tool starts on, and an approver switches them on its page."}),(0,b.jsx)("ul",{className:"grid",children:a.map(a=>{let c=!e.has(a.name);return(0,b.jsx)(l,{tool:a,testId:"add-server-tool",control:d?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("input",{type:"hidden",name:"toolShown",value:a.name}),c?(0,b.jsx)("input",{type:"hidden",name:"toolOn",value:a.name}):null,(0,b.jsx)(j.f,{isOn:c,label:a.name,onClick:()=>{var b;b=a.name,f(a=>{let c=new Set(a);return c.delete(b)||c.add(b),c})}})]}):null},a.name)})})]})}function v({state:a,refused:e,action:g,onBack:j,fleetId:k,canSwitchTools:l}){let m,n="refused"===e.kind&&e.requestId===a.requestId,o=n?e.fields:a.fields,p=o.url??"",[r,t]=(0,c.useState)(o.name??function(a){if(!URL.canParse(a))return"";let{hostname:b}=new URL(a);return/^\d+(\.\d+){3}$/.test(b)||b.startsWith("[")?"":(b.split(".").filter(a=>"mcp"!==a&&"www"!==a)[0]??"").toLowerCase().replaceAll(/[^a-z0-9]+/g,"-").replaceAll(/^-+|-+$/g,"")}(p));return(0,b.jsx)(b.Fragment,{children:(0,b.jsxs)("form",{action:g,className:`${f.r} grid gap-3`,"data-testid":"add-server-owner",children:[(0,b.jsx)(u,{tools:a.tools,canSwitch:l}),(0,b.jsx)("h2",{className:"text-section font-semibold",children:"Its owner"}),(0,b.jsx)(s,{refusal:n?e.message:void 0}),(0,b.jsx)("input",{type:"hidden",name:d.H,value:k}),(0,b.jsx)("input",{type:"hidden",name:"requestId",value:a.requestId}),q.map(a=>(0,b.jsx)("input",{type:"hidden",name:a,value:o[a]??""},a)),(0,b.jsx)("p",{className:"font-mono text-muted-foreground",children:p}),(0,b.jsxs)("label",{className:f.z,children:[(0,b.jsx)("span",{children:"Proxy ship's name"}),(0,b.jsx)("input",{className:f.w,type:"text",name:"name",value:r,onChange:a=>{t(a.target.value)},required:!0})]}),(0,b.jsx)(h.f,{choices:a.owners,current:a.owners.find(a=>a.shipId===o.ownerShipId)??null,help:"A person ship or argo. It answers for this server."}),(0,b.jsxs)("label",{className:f.z,children:[(0,b.jsx)("span",{children:"Calls at once"}),(0,b.jsx)("input",{className:f.w,type:"number",name:"concurrencyLimit",min:1,max:10,defaultValue:o.concurrencyLimit??"4"})]}),(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsx)(i.f,{pending:"Adding…",testId:"add-server-approve",children:""===(m=r.trim())?"Add as outside party":m.length>20?`Add ${m.slice(0,20)}…`:`Add ${m}`}),(0,b.jsx)("button",{type:"button",className:f.x.secondary,onClick:j,children:"Back to the address"})]})]})})}a.s(["AddServer",0,function({fleetId:a,canSwitchTools:d}){let[e,f]=(0,c.useActionState)(o,{step:"address",fields:{}}),[g,h]=(0,c.useActionState)(n,{kind:"idle"}),[i,j]=(0,c.useState)(void 0),k="owner"===e.step&&i!==e.requestId?e:void 0;return(0,b.jsxs)("div",{className:"grid gap-4",children:[(0,b.jsx)("h1",{className:"text-title font-semibold",children:"Add MCP server"}),(0,b.jsx)(r,{at:2*(void 0!==k)}),void 0===k?(0,b.jsx)(t,{state:e,action:f,fleetId:a}):(0,b.jsx)(v,{state:k,refused:g,action:h,onBack:()=>{j(k.requestId)},fleetId:a,canSwitchTools:d})]})}],29372)}];
1
+ module.exports=[29372,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(30587),e=a.i(60224),f=a.i(88412),g=a.i(36855),h=a.i(35149),i=a.i(77237),j=a.i(10020),k=a.i(47763);function l({tool:a,control:c,testId:d}){let{name:e,description:f,isReadOnly:g,isNew:h=!1}=a,i=void 0===f?"":f.split("\n").map(a=>a.trim()).find(a=>""!==a)??"",j=void 0!==f&&f.trim()!==i;return(0,b.jsxs)("li",{className:"grid gap-1 border-b border-border py-2 last:border-b-0","data-testid":d,children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[c,(0,b.jsx)("span",{className:"font-mono",children:e}),g?(0,b.jsx)(k.E,{children:"reads only"}):null,h?(0,b.jsx)(k.T,{tone:"attention",label:"New"}):null]}),""===i?null:j?(0,b.jsxs)("details",{className:"text-muted-foreground",children:[(0,b.jsx)("summary",{className:"cursor-pointer",children:i}),(0,b.jsx)("p",{className:"mt-1 whitespace-pre-line",children:f})]}):(0,b.jsx)("p",{className:"text-muted-foreground",children:i})]})}var m=a.i(5050);let n=(0,m.createServerReference)("6050e72c4951cfe2c298e4f22266f17e9b82c186a1",m.callServer,void 0,m.findSourceMapURL,"approveServer"),o=(0,m.createServerReference)("6066f7418afb7b8e3bbfe4ab46e1e2b04b0a09599e",m.callServer,void 0,m.findSourceMapURL,"checkServer"),p=["Address","Check","Owner"],q=["url","credentialKind","token","clientId","clientSecret","issuer","scope"];function r({at:a}){return(0,b.jsx)("ol",{className:"flex gap-4",children:p.map((c,d)=>(0,b.jsxs)("li",{"aria-current":d===a?"step":void 0,className:d<=a?"font-medium":"text-muted-foreground",children:[d+1," ",c]},c))})}function s({refusal:a}){return void 0===a?null:(0,b.jsx)(g.f,{state:{kind:"refused",message:a}})}function t({state:a,action:c,fleetId:g}){return(0,b.jsxs)("form",{action:c,className:`${f.r} grid gap-3`,"data-testid":"add-server-address",children:[(0,b.jsx)("input",{type:"hidden",name:d.H,value:g}),(0,b.jsx)(s,{refusal:a.refusal}),(0,b.jsxs)("label",{className:f.z,children:[(0,b.jsx)("span",{children:"Streamable HTTP address"}),(0,b.jsx)("input",{className:f.w,type:"url",name:"url",defaultValue:a.fields.url??"",placeholder:"https://mcp.example.com/mcp",required:!0})]}),(0,b.jsx)(e.f,{legend:"The server's credential",fields:a.fields,noneHelp:"The gateway sends no credential: for a server reached only on a private network."}),(0,b.jsx)("div",{children:(0,b.jsx)(i.f,{pending:"Checking the server…",testId:"add-server-check",children:"Check the server"})})]})}function u({tools:a,canSwitch:d}){let[e,f]=(0,c.useState)(new Set),g=a.length-e.size;return(0,b.jsxs)("section",{className:"grid gap-2","data-testid":"add-server-tools",children:[(0,b.jsxs)("h2",{className:"flex flex-wrap justify-between gap-2 text-section font-semibold",children:[(0,b.jsxs)("span",{children:["The server answers: ",a.length," ",1===a.length?"tool":"tools"]}),d?(0,b.jsxs)("span",{role:"status",className:"font-normal text-muted-foreground","data-testid":"add-server-tools-on",children:[g," of ",a.length," on"]}):null]}),(0,b.jsx)("p",{className:"text-muted-foreground",children:d?"The fleet may call only the tools switched on. A tool the server adds later starts off.":"Switching tools needs gateway:approve: every tool starts on, and an approver switches them on its page."}),(0,b.jsx)("ul",{className:"grid",children:a.map(a=>{let c=!e.has(a.name);return(0,b.jsx)(l,{tool:a,testId:"add-server-tool",control:d?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("input",{type:"hidden",name:"toolShown",value:a.name}),c?(0,b.jsx)("input",{type:"hidden",name:"toolOn",value:a.name}):null,(0,b.jsx)(j.f,{isOn:c,label:a.name,onClick:()=>{var b;b=a.name,f(a=>{let c=new Set(a);return c.delete(b)||c.add(b),c})}})]}):null},a.name)})})]})}function v({state:a,refused:e,action:g,onBack:j,fleetId:k,canSwitchTools:l}){let m,n="refused"===e.kind&&e.requestId===a.requestId,o=n?e.fields:a.fields,p=o.url??"",[r,t]=(0,c.useState)(o.name??function(a){if(!URL.canParse(a))return"";let{hostname:b}=new URL(a);return/^\d+(\.\d+){3}$/.test(b)||b.startsWith("[")?"":(b.split(".").filter(a=>"mcp"!==a&&"www"!==a)[0]??"").toLowerCase().replaceAll(/[^a-z0-9]+/g,"-").replaceAll(/^-+|-+$/g,"")}(p));return(0,b.jsx)(b.Fragment,{children:(0,b.jsxs)("form",{action:g,className:`${f.r} grid gap-3`,"data-testid":"add-server-owner",children:[(0,b.jsx)(u,{tools:a.tools,canSwitch:l}),(0,b.jsx)("h2",{className:"text-section font-semibold",children:"Its owner"}),(0,b.jsx)(s,{refusal:n?e.message:void 0}),(0,b.jsx)("input",{type:"hidden",name:d.H,value:k}),(0,b.jsx)("input",{type:"hidden",name:"requestId",value:a.requestId}),q.map(a=>(0,b.jsx)("input",{type:"hidden",name:a,value:o[a]??""},a)),(0,b.jsx)("p",{className:"font-mono text-muted-foreground",children:p}),(0,b.jsxs)("label",{className:f.z,children:[(0,b.jsx)("span",{children:"Proxy ship's name"}),(0,b.jsx)("input",{className:f.w,type:"text",name:"name",value:r,onChange:a=>{t(a.target.value)},required:!0})]}),(0,b.jsx)(h.f,{choices:a.owners,current:a.owners.find(a=>a.shipId===o.ownerShipId)??null,help:"A person ship or argo. It answers for this server."}),(0,b.jsxs)("label",{className:f.z,children:[(0,b.jsx)("span",{children:"Calls at once"}),(0,b.jsx)("input",{className:f.w,type:"number",name:"concurrencyLimit",min:1,max:10,defaultValue:o.concurrencyLimit??"4"})]}),(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsx)(i.f,{pending:"Adding…",testId:"add-server-approve",children:""===(m=r.trim())?"Add as outside party":m.length>20?`Add ${m.slice(0,20)}…`:`Add ${m}`}),(0,b.jsx)("button",{type:"button",className:f.x.secondary,onClick:j,children:"Back to the address"})]})]})})}a.s(["AddServer",0,function({fleetId:a,canSwitchTools:d}){let[e,f]=(0,c.useActionState)(o,{step:"address",fields:{}}),[g,h]=(0,c.useActionState)(n,{kind:"idle"}),[i,j]=(0,c.useState)(void 0),k="owner"===e.step&&i!==e.requestId?e:void 0;return(0,b.jsxs)("div",{className:"grid gap-4",children:[(0,b.jsx)("h1",{className:"text-title font-semibold",children:"Add MCP server"}),(0,b.jsx)(r,{at:2*(void 0!==k)}),void 0===k?(0,b.jsx)(t,{state:e,action:f,fleetId:a}):(0,b.jsx)(v,{state:k,refused:g,action:h,onBack:()=>{j(k.requestId)},fleetId:a,canSwitchTools:d})]})}],29372)}];
2
2
 
3
3
  //# sourceMappingURL=web_features_add-server_ui_add-server_tsx_1jnmar5xju49k._.js.map