@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
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../web/features/add-server/ui/add-server.tsx","../../../../../web/features/add-server/tool-choice.ts","../../../../../web/features/outside-parties/ui/tool-row.tsx","../../../../../web/features/add-server/data%3Aa7900b%20%3Ctext/javascript%3E","../../../../../web/features/add-server/data%3A8ac92a%20%3Ctext/javascript%3E","../../../../../web/features/add-server/suggested-name.ts"],"sourcesContent":["'use client';\n\nimport { useActionState, useState } from 'react';\n\nimport { FLEET_FIELD } from '../../forms/form-state';\nimport { CredentialFields } from '../../forms/ui/credential-fields';\nimport { BUTTONS, CARD, INPUT, LABEL } from '../../forms/ui/look';\nimport { Outcome } from '../../forms/ui/outcome';\nimport { OwnerField } from '../../forms/ui/owner-field';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport { Switch } from '../../forms/ui/switch';\nimport { ToolRow } from '../../outside-parties/ui/tool-row';\nimport { approveServer, checkServer, type AddServerState, type ApproveState, type CheckedTool } from '../actions';\nimport { addButtonLabel, suggestedName } from '../suggested-name';\nimport { TOOL_ON_FIELD, TOOL_SHOWN_FIELD } from '../tool-choice';\n\n/** The steps of adding a server, as the design numbers them. */\nconst STEPS = ['Address', 'Check', 'Owner'] as const;\n\nconst CONCURRENCY_LIMIT_DEFAULT = '4';\n\n/** The credential fields, carried on from the address step to the owner step. */\nconst CARRIED_FIELDS = ['url', 'credentialKind', 'token', 'clientId', 'clientSecret', 'issuer', 'scope'] as const;\n\nfunction Steps({ at }: { at: number }) {\n return (\n <ol className=\"flex gap-4\">\n {STEPS.map((step, index) => (\n <li key={step} aria-current={index === at ? 'step' : undefined} className={index <= at ? 'font-medium' : 'text-muted-foreground'}>\n {index + 1} {step}\n </li>\n ))}\n </ol>\n );\n}\n\nfunction Refused({ refusal }: { refusal: string | undefined }) {\n return refusal === undefined ? null : <Outcome state={{ kind: 'refused', message: refusal }} />;\n}\n\nfunction AddressStep({ state, action, fleetId }: { state: Extract<AddServerState, { step: 'address' }> | { fields: Record<string, string>; refusal?: string }; action: (form: FormData) => void; fleetId: string }) {\n return (\n <form action={action} className={`${CARD} grid gap-3`} data-testid=\"add-server-address\">\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <Refused refusal={state.refusal} />\n <label className={LABEL}>\n <span>Streamable HTTP address</span>\n <input className={INPUT} type=\"url\" name=\"url\" defaultValue={state.fields.url ?? ''} placeholder=\"https://mcp.example.com/mcp\" required />\n </label>\n <CredentialFields legend=\"The server's credential\" fields={state.fields} noneHelp=\"The gateway sends no credential: for a server reached only on a private network.\" />\n <div>\n <SubmitButton pending=\"Checking the server…\" testId=\"add-server-check\">\n Check the server\n </SubmitButton>\n </div>\n </form>\n );\n}\n\n/**\n * The tools the check answered, one row each. An approver switches each on\n * or off, all on to start; the fleet may call only those on (aeolus-fleet#1151).\n * Without gateway:approve they show without switches, and every tool starts on.\n */\nfunction ToolsSection({ tools, canSwitch }: { tools: CheckedTool[]; canSwitch: boolean }) {\n const [off, setOff] = useState<ReadonlySet<string>>(new Set());\n const onCount = tools.length - off.size;\n const flip = (name: string) => {\n setOff((current) => {\n const next = new Set(current);\n if (!next.delete(name)) {\n next.add(name);\n }\n return next;\n });\n };\n return (\n <section className=\"grid gap-2\" data-testid=\"add-server-tools\">\n <h2 className=\"flex flex-wrap justify-between gap-2 text-section font-semibold\">\n <span>\n The server answers: {tools.length} {tools.length === 1 ? 'tool' : 'tools'}\n </span>\n {canSwitch ? (\n <span role=\"status\" className=\"font-normal text-muted-foreground\" data-testid=\"add-server-tools-on\">\n {onCount} of {tools.length} on\n </span>\n ) : null}\n </h2>\n <p className=\"text-muted-foreground\">{canSwitch ? '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.'}</p>\n <ul className=\"grid\">\n {tools.map((tool) => {\n const isOn = !off.has(tool.name);\n return (\n <ToolRow\n key={tool.name}\n tool={tool}\n testId=\"add-server-tool\"\n control={\n canSwitch ? (\n <>\n <input type=\"hidden\" name={TOOL_SHOWN_FIELD} value={tool.name} />\n {isOn ? <input type=\"hidden\" name={TOOL_ON_FIELD} value={tool.name} /> : null}\n <Switch isOn={isOn} label={tool.name} onClick={() => { flip(tool.name); }} />\n </>\n ) : null\n }\n />\n );\n })}\n </ul>\n </section>\n );\n}\n\nfunction OwnerStep({ state, refused, action, onBack, fleetId, canSwitchTools }: { state: Extract<AddServerState, { step: 'owner' }>; refused: ApproveState; action: (form: FormData) => void; onBack: () => void; fleetId: string; canSwitchTools: boolean }) {\n // A refused approval of this check shows what the browser sent, and why.\n const isRefused = refused.kind === 'refused' && refused.requestId === state.requestId;\n const fields = isRefused ? refused.fields : state.fields;\n const url = fields.url ?? '';\n const [name, setName] = useState(fields.name ?? suggestedName(url));\n return (\n <>\n <form action={action} className={`${CARD} grid gap-3`} data-testid=\"add-server-owner\">\n <ToolsSection tools={state.tools} canSwitch={canSwitchTools} />\n <h2 className=\"text-section font-semibold\">Its owner</h2>\n <Refused refusal={isRefused ? refused.message : undefined} />\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <input type=\"hidden\" name=\"requestId\" value={state.requestId} />\n {CARRIED_FIELDS.map((field) => (\n <input key={field} type=\"hidden\" name={field} value={fields[field] ?? ''} />\n ))}\n <p className=\"font-mono text-muted-foreground\">{url}</p>\n <label className={LABEL}>\n <span>Proxy ship&apos;s name</span>\n <input className={INPUT} type=\"text\" name=\"name\" value={name} onChange={(event) => { setName(event.target.value); }} required />\n </label>\n <OwnerField choices={state.owners} current={state.owners.find((owner) => owner.shipId === fields.ownerShipId) ?? null} help=\"A person ship or argo. It answers for this server.\" />\n <label className={LABEL}>\n <span>Calls at once</span>\n <input className={INPUT} type=\"number\" name=\"concurrencyLimit\" min={1} max={10} defaultValue={fields.concurrencyLimit ?? CONCURRENCY_LIMIT_DEFAULT} />\n </label>\n <div className=\"flex gap-2\">\n <SubmitButton pending=\"Adding…\" testId=\"add-server-approve\">\n {addButtonLabel(name)}\n </SubmitButton>\n <button type=\"button\" className={BUTTONS.secondary} onClick={onBack}>\n Back to the address\n </button>\n </div>\n </form>\n </>\n );\n}\n\n/**\n * Adding an outside MCP server in three steps: its address and credential,\n * the gateway's check of the tools it answers with, then its owner. Each\n * button says at once that its step is on its way.\n */\nexport function AddServer({ fleetId, canSwitchTools }: { fleetId: string; canSwitchTools: boolean }) {\n const [checked, check] = useActionState(checkServer, { step: 'address', fields: {} });\n const [refused, approve] = useActionState(approveServer, { kind: 'idle' });\n // Going back shows the address step again, with what was sent, until the next check answers.\n const [backFrom, setBackFrom] = useState<string | undefined>(undefined);\n const owner = checked.step === 'owner' && backFrom !== checked.requestId ? checked : undefined;\n return (\n <div className=\"grid gap-4\">\n <h1 className=\"text-title font-semibold\">Add MCP server</h1>\n <Steps at={owner === undefined ? 0 : 2} />\n {owner === undefined ? (\n <AddressStep state={checked} action={check} fleetId={fleetId} />\n ) : (\n <OwnerStep state={owner} refused={refused} action={approve} onBack={() => { setBackFrom(owner.requestId); }} fleetId={fleetId} canSwitchTools={canSwitchTools} />\n )}\n </div>\n );\n}\n","/**\n * The tools an approver switched when adding a server (aeolus-fleet#1151):\n * each tool the check answered is sent as shown, and the ticked ones as on.\n */\n\n/** The field naming each tool whose switch the form showed. */\nexport const TOOL_SHOWN_FIELD = 'toolShown';\n\n/** The field naming each tool ticked on. */\nexport const TOOL_ON_FIELD = 'toolOn';\n\nfunction namesIn(form: FormData, field: string): string[] {\n return form.getAll(field).filter((value) => typeof value === 'string');\n}\n\n/** Each tool shown, on or off; none when the form showed no switch, so the server keeps every tool on. */\nexport function toolChoiceOf(form: FormData): { name: string; isOn: boolean }[] | undefined {\n const shown = namesIn(form, TOOL_SHOWN_FIELD);\n if (shown.length === 0) {\n return undefined;\n }\n const on = new Set(namesIn(form, TOOL_ON_FIELD));\n return shown.map((name) => ({ name, isOn: on.has(name) }));\n}\n\n/** A description's first line with words, as a tool's row shows it before it is opened. */\nexport function firstLineOf(description: string): string {\n return description.split('\\n').map((line) => line.trim()).find((line) => line !== '') ?? '';\n}\n","import type { ReactNode } from 'react';\n\nimport { firstLineOf } from '../../add-server/tool-choice';\nimport { StatusBadge, Tag } from './status-badge';\n\n/** A tool of an outside MCP server, as its row shows it. */\nexport interface ShownTool {\n name: string;\n description?: string | undefined;\n isReadOnly: boolean;\n isNew?: boolean;\n}\n\n/**\n * One tool in a list an approver scans (aeolus-fleet#1151): its switch, its\n * name, whether the server says it reads only, whether it is new, and its\n * description's first line, the whole description folded open on a click.\n */\nexport function ToolRow({ tool, control, testId }: { tool: ShownTool; control: ReactNode; testId?: string }) {\n const { name, description, isReadOnly, isNew = false } = tool;\n const firstLine = description === undefined ? '' : firstLineOf(description);\n const isFolded = description !== undefined && description.trim() !== firstLine;\n return (\n <li className=\"grid gap-1 border-b border-border py-2 last:border-b-0\" data-testid={testId}>\n <div className=\"flex flex-wrap items-center gap-2\">\n {control}\n <span className=\"font-mono\">{name}</span>\n {isReadOnly ? <Tag>reads only</Tag> : null}\n {isNew ? <StatusBadge tone=\"attention\" label=\"New\" /> : null}\n </div>\n {firstLine === '' ? null : isFolded ? (\n <details className=\"text-muted-foreground\">\n <summary className=\"cursor-pointer\">{firstLine}</summary>\n <p className=\"mt-1 whitespace-pre-line\">{description}</p>\n </details>\n ) : (\n <p className=\"text-muted-foreground\">{firstLine}</p>\n )}\n </li>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"602fc68efe93632500d8dd932b478dec13d0f730d6\":{\"name\":\"approveServer\"}},\"web/features/add-server/actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_1=/*#__PURE__*/createServerReference(\"602fc68efe93632500d8dd932b478dec13d0f730d6\",callServer,void 0,findSourceMapURL,\"approveServer\");export{$$RSC_SERVER_ACTION_1 as approveServer};","/* __next_internal_action_entry_do_not_use__ [{\"605398e73b605625bb3dee184002103ffa040aef48\":{\"name\":\"checkServer\"}},\"web/features/add-server/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(\"605398e73b605625bb3dee184002103ffa040aef48\",callServer,void 0,findSourceMapURL,\"checkServer\");export{$$RSC_SERVER_ACTION_0 as checkServer};","/** The most characters of the proxy ship's name the add button shows. */\nconst BUTTON_NAME_MAX_LENGTH = 20;\n\n/** A proxy ship's name offered from a server's address: its host's first name that says whose it is; none for an IP address, whose numbers say nothing of it. */\nexport function suggestedName(url: string): string {\n if (!URL.canParse(url)) {\n return '';\n }\n const { hostname } = new URL(url);\n // URL writes every IPv4 host as four numbers, and keeps an IPv6 host in its brackets; the browser runs this too, so no node:net.\n if (/^\\d+(\\.\\d+){3}$/.test(hostname) || hostname.startsWith('[')) {\n return '';\n }\n const labels = hostname.split('.').filter((label) => label !== 'mcp' && label !== 'www');\n return (labels[0] ?? '').toLowerCase().replaceAll(/[^a-z0-9]+/g, '-').replaceAll(/^-+|-+$/g, '');\n}\n\n/** The add button's words: the proxy ship's name as typed, cut at 20 characters, or the plain words while none is typed. */\nexport function addButtonLabel(name: string): string {\n const typed = name.trim();\n if (typed === '') {\n return 'Add as outside party';\n }\n return typed.length > BUTTON_NAME_MAX_LENGTH ? `Add ${typed.slice(0, BUTTON_NAME_MAX_LENGTH)}…` : `Add ${typed}`;\n}\n"],"names":["TOOL_SHOWN_FIELD","TOOL_ON_FIELD","namesIn","form","field","getAll","filter","value","toolChoiceOf","shown","length","undefined","on","Set","map","name","isOn","has","firstLineOf","description","split","line","trim","find"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../web/features/add-server/ui/add-server.tsx","../../../../../web/features/add-server/tool-choice.ts","../../../../../web/features/outside-parties/ui/tool-row.tsx","../../../../../web/features/add-server/data%3A18a22b%20%3Ctext/javascript%3E","../../../../../web/features/add-server/data%3A48e858%20%3Ctext/javascript%3E","../../../../../web/features/add-server/suggested-name.ts"],"sourcesContent":["'use client';\n\nimport { useActionState, useState } from 'react';\n\nimport { FLEET_FIELD } from '../../forms/form-state';\nimport { CredentialFields } from '../../forms/ui/credential-fields';\nimport { BUTTONS, CARD, INPUT, LABEL } from '../../forms/ui/look';\nimport { Outcome } from '../../forms/ui/outcome';\nimport { OwnerField } from '../../forms/ui/owner-field';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport { Switch } from '../../forms/ui/switch';\nimport { ToolRow } from '../../outside-parties/ui/tool-row';\nimport { approveServer, checkServer, type AddServerState, type ApproveState, type CheckedTool } from '../actions';\nimport { addButtonLabel, suggestedName } from '../suggested-name';\nimport { TOOL_ON_FIELD, TOOL_SHOWN_FIELD } from '../tool-choice';\n\n/** The steps of adding a server, as the design numbers them. */\nconst STEPS = ['Address', 'Check', 'Owner'] as const;\n\nconst CONCURRENCY_LIMIT_DEFAULT = '4';\n\n/** The credential fields, carried on from the address step to the owner step. */\nconst CARRIED_FIELDS = ['url', 'credentialKind', 'token', 'clientId', 'clientSecret', 'issuer', 'scope'] as const;\n\nfunction Steps({ at }: { at: number }) {\n return (\n <ol className=\"flex gap-4\">\n {STEPS.map((step, index) => (\n <li key={step} aria-current={index === at ? 'step' : undefined} className={index <= at ? 'font-medium' : 'text-muted-foreground'}>\n {index + 1} {step}\n </li>\n ))}\n </ol>\n );\n}\n\nfunction Refused({ refusal }: { refusal: string | undefined }) {\n return refusal === undefined ? null : <Outcome state={{ kind: 'refused', message: refusal }} />;\n}\n\nfunction AddressStep({ state, action, fleetId }: { state: Extract<AddServerState, { step: 'address' }> | { fields: Record<string, string>; refusal?: string }; action: (form: FormData) => void; fleetId: string }) {\n return (\n <form action={action} className={`${CARD} grid gap-3`} data-testid=\"add-server-address\">\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <Refused refusal={state.refusal} />\n <label className={LABEL}>\n <span>Streamable HTTP address</span>\n <input className={INPUT} type=\"url\" name=\"url\" defaultValue={state.fields.url ?? ''} placeholder=\"https://mcp.example.com/mcp\" required />\n </label>\n <CredentialFields legend=\"The server's credential\" fields={state.fields} noneHelp=\"The gateway sends no credential: for a server reached only on a private network.\" />\n <div>\n <SubmitButton pending=\"Checking the server…\" testId=\"add-server-check\">\n Check the server\n </SubmitButton>\n </div>\n </form>\n );\n}\n\n/**\n * The tools the check answered, one row each. An approver switches each on\n * or off, all on to start; the fleet may call only those on (aeolus-fleet#1151).\n * Without gateway:approve they show without switches, and every tool starts on.\n */\nfunction ToolsSection({ tools, canSwitch }: { tools: CheckedTool[]; canSwitch: boolean }) {\n const [off, setOff] = useState<ReadonlySet<string>>(new Set());\n const onCount = tools.length - off.size;\n const flip = (name: string) => {\n setOff((current) => {\n const next = new Set(current);\n if (!next.delete(name)) {\n next.add(name);\n }\n return next;\n });\n };\n return (\n <section className=\"grid gap-2\" data-testid=\"add-server-tools\">\n <h2 className=\"flex flex-wrap justify-between gap-2 text-section font-semibold\">\n <span>\n The server answers: {tools.length} {tools.length === 1 ? 'tool' : 'tools'}\n </span>\n {canSwitch ? (\n <span role=\"status\" className=\"font-normal text-muted-foreground\" data-testid=\"add-server-tools-on\">\n {onCount} of {tools.length} on\n </span>\n ) : null}\n </h2>\n <p className=\"text-muted-foreground\">{canSwitch ? '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.'}</p>\n <ul className=\"grid\">\n {tools.map((tool) => {\n const isOn = !off.has(tool.name);\n return (\n <ToolRow\n key={tool.name}\n tool={tool}\n testId=\"add-server-tool\"\n control={\n canSwitch ? (\n <>\n <input type=\"hidden\" name={TOOL_SHOWN_FIELD} value={tool.name} />\n {isOn ? <input type=\"hidden\" name={TOOL_ON_FIELD} value={tool.name} /> : null}\n <Switch isOn={isOn} label={tool.name} onClick={() => { flip(tool.name); }} />\n </>\n ) : null\n }\n />\n );\n })}\n </ul>\n </section>\n );\n}\n\nfunction OwnerStep({ state, refused, action, onBack, fleetId, canSwitchTools }: { state: Extract<AddServerState, { step: 'owner' }>; refused: ApproveState; action: (form: FormData) => void; onBack: () => void; fleetId: string; canSwitchTools: boolean }) {\n // A refused approval of this check shows what the browser sent, and why.\n const isRefused = refused.kind === 'refused' && refused.requestId === state.requestId;\n const fields = isRefused ? refused.fields : state.fields;\n const url = fields.url ?? '';\n const [name, setName] = useState(fields.name ?? suggestedName(url));\n return (\n <>\n <form action={action} className={`${CARD} grid gap-3`} data-testid=\"add-server-owner\">\n <ToolsSection tools={state.tools} canSwitch={canSwitchTools} />\n <h2 className=\"text-section font-semibold\">Its owner</h2>\n <Refused refusal={isRefused ? refused.message : undefined} />\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <input type=\"hidden\" name=\"requestId\" value={state.requestId} />\n {CARRIED_FIELDS.map((field) => (\n <input key={field} type=\"hidden\" name={field} value={fields[field] ?? ''} />\n ))}\n <p className=\"font-mono text-muted-foreground\">{url}</p>\n <label className={LABEL}>\n <span>Proxy ship&apos;s name</span>\n <input className={INPUT} type=\"text\" name=\"name\" value={name} onChange={(event) => { setName(event.target.value); }} required />\n </label>\n <OwnerField choices={state.owners} current={state.owners.find((owner) => owner.shipId === fields.ownerShipId) ?? null} help=\"A person ship or argo. It answers for this server.\" />\n <label className={LABEL}>\n <span>Calls at once</span>\n <input className={INPUT} type=\"number\" name=\"concurrencyLimit\" min={1} max={10} defaultValue={fields.concurrencyLimit ?? CONCURRENCY_LIMIT_DEFAULT} />\n </label>\n <div className=\"flex gap-2\">\n <SubmitButton pending=\"Adding…\" testId=\"add-server-approve\">\n {addButtonLabel(name)}\n </SubmitButton>\n <button type=\"button\" className={BUTTONS.secondary} onClick={onBack}>\n Back to the address\n </button>\n </div>\n </form>\n </>\n );\n}\n\n/**\n * Adding an outside MCP server in three steps: its address and credential,\n * the gateway's check of the tools it answers with, then its owner. Each\n * button says at once that its step is on its way.\n */\nexport function AddServer({ fleetId, canSwitchTools }: { fleetId: string; canSwitchTools: boolean }) {\n const [checked, check] = useActionState(checkServer, { step: 'address', fields: {} });\n const [refused, approve] = useActionState(approveServer, { kind: 'idle' });\n // Going back shows the address step again, with what was sent, until the next check answers.\n const [backFrom, setBackFrom] = useState<string | undefined>(undefined);\n const owner = checked.step === 'owner' && backFrom !== checked.requestId ? checked : undefined;\n return (\n <div className=\"grid gap-4\">\n <h1 className=\"text-title font-semibold\">Add MCP server</h1>\n <Steps at={owner === undefined ? 0 : 2} />\n {owner === undefined ? (\n <AddressStep state={checked} action={check} fleetId={fleetId} />\n ) : (\n <OwnerStep state={owner} refused={refused} action={approve} onBack={() => { setBackFrom(owner.requestId); }} fleetId={fleetId} canSwitchTools={canSwitchTools} />\n )}\n </div>\n );\n}\n","/**\n * The tools an approver switched when adding a server (aeolus-fleet#1151):\n * each tool the check answered is sent as shown, and the ticked ones as on.\n */\n\n/** The field naming each tool whose switch the form showed. */\nexport const TOOL_SHOWN_FIELD = 'toolShown';\n\n/** The field naming each tool ticked on. */\nexport const TOOL_ON_FIELD = 'toolOn';\n\nfunction namesIn(form: FormData, field: string): string[] {\n return form.getAll(field).filter((value) => typeof value === 'string');\n}\n\n/** Each tool shown, on or off; none when the form showed no switch, so the server keeps every tool on. */\nexport function toolChoiceOf(form: FormData): { name: string; isOn: boolean }[] | undefined {\n const shown = namesIn(form, TOOL_SHOWN_FIELD);\n if (shown.length === 0) {\n return undefined;\n }\n const on = new Set(namesIn(form, TOOL_ON_FIELD));\n return shown.map((name) => ({ name, isOn: on.has(name) }));\n}\n\n/** A description's first line with words, as a tool's row shows it before it is opened. */\nexport function firstLineOf(description: string): string {\n return description.split('\\n').map((line) => line.trim()).find((line) => line !== '') ?? '';\n}\n","import type { ReactNode } from 'react';\n\nimport { firstLineOf } from '../../add-server/tool-choice';\nimport { StatusBadge, Tag } from './status-badge';\n\n/** A tool of an outside MCP server, as its row shows it. */\nexport interface ShownTool {\n name: string;\n description?: string | undefined;\n isReadOnly: boolean;\n isNew?: boolean;\n}\n\n/**\n * One tool in a list an approver scans (aeolus-fleet#1151): its switch, its\n * name, whether the server says it reads only, whether it is new, and its\n * description's first line, the whole description folded open on a click.\n */\nexport function ToolRow({ tool, control, testId }: { tool: ShownTool; control: ReactNode; testId?: string }) {\n const { name, description, isReadOnly, isNew = false } = tool;\n const firstLine = description === undefined ? '' : firstLineOf(description);\n const isFolded = description !== undefined && description.trim() !== firstLine;\n return (\n <li className=\"grid gap-1 border-b border-border py-2 last:border-b-0\" data-testid={testId}>\n <div className=\"flex flex-wrap items-center gap-2\">\n {control}\n <span className=\"font-mono\">{name}</span>\n {isReadOnly ? <Tag>reads only</Tag> : null}\n {isNew ? <StatusBadge tone=\"attention\" label=\"New\" /> : null}\n </div>\n {firstLine === '' ? null : isFolded ? (\n <details className=\"text-muted-foreground\">\n <summary className=\"cursor-pointer\">{firstLine}</summary>\n <p className=\"mt-1 whitespace-pre-line\">{description}</p>\n </details>\n ) : (\n <p className=\"text-muted-foreground\">{firstLine}</p>\n )}\n </li>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"6050e72c4951cfe2c298e4f22266f17e9b82c186a1\":{\"name\":\"approveServer\"}},\"web/features/add-server/actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_1=/*#__PURE__*/createServerReference(\"6050e72c4951cfe2c298e4f22266f17e9b82c186a1\",callServer,void 0,findSourceMapURL,\"approveServer\");export{$$RSC_SERVER_ACTION_1 as approveServer};","/* __next_internal_action_entry_do_not_use__ [{\"6066f7418afb7b8e3bbfe4ab46e1e2b04b0a09599e\":{\"name\":\"checkServer\"}},\"web/features/add-server/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(\"6066f7418afb7b8e3bbfe4ab46e1e2b04b0a09599e\",callServer,void 0,findSourceMapURL,\"checkServer\");export{$$RSC_SERVER_ACTION_0 as checkServer};","/** The most characters of the proxy ship's name the add button shows. */\nconst BUTTON_NAME_MAX_LENGTH = 20;\n\n/** A proxy ship's name offered from a server's address: its host's first name that says whose it is; none for an IP address, whose numbers say nothing of it. */\nexport function suggestedName(url: string): string {\n if (!URL.canParse(url)) {\n return '';\n }\n const { hostname } = new URL(url);\n // URL writes every IPv4 host as four numbers, and keeps an IPv6 host in its brackets; the browser runs this too, so no node:net.\n if (/^\\d+(\\.\\d+){3}$/.test(hostname) || hostname.startsWith('[')) {\n return '';\n }\n const labels = hostname.split('.').filter((label) => label !== 'mcp' && label !== 'www');\n return (labels[0] ?? '').toLowerCase().replaceAll(/[^a-z0-9]+/g, '-').replaceAll(/^-+|-+$/g, '');\n}\n\n/** The add button's words: the proxy ship's name as typed, cut at 20 characters, or the plain words while none is typed. */\nexport function addButtonLabel(name: string): string {\n const typed = name.trim();\n if (typed === '') {\n return 'Add as outside party';\n }\n return typed.length > BUTTON_NAME_MAX_LENGTH ? `Add ${typed.slice(0, BUTTON_NAME_MAX_LENGTH)}…` : `Add ${typed}`;\n}\n"],"names":["TOOL_SHOWN_FIELD","TOOL_ON_FIELD","namesIn","form","field","getAll","filter","value","toolChoiceOf","shown","length","undefined","on","Set","map","name","isOn","has","firstLineOf","description","split","line","trim","find"],"mappings":"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"}
@@ -0,0 +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"}])},35149,a=>{var b=a.i(87924),c=a.i(88412);a.s(["f",0,function({choices:a,current:d,help:e,refusal:f}){let g=null===d||a.some(a=>a.shipId===d.shipId)?a:[d,...a];return(0,b.jsxs)("label",{className:c.z,children:[(0,b.jsx)("span",{children:"Owner"}),(0,b.jsxs)("select",{className:c.w,name:"ownerShipId",defaultValue:d?.shipId??"",required:!0,"data-testid":"owner-field",children:[null===d?(0,b.jsx)("option",{value:"",disabled:!0,children:"Pick its owner"}):null,g.map(a=>(0,b.jsx)("option",{value:a.shipId,children:a.name},a.shipId))]}),(0,b.jsx)("span",{className:"text-muted-foreground",children:f??e})]})}])}]})();
2
+
3
+ //# sourceMappingURL=web_features_forms_1u0akr22eh_x_._.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../web/features/forms/server-credential.ts","../../../../../web/features/forms/ui/owner-field.tsx"],"sourcesContent":["/**\n * An outside MCP server's credential, as the add, Parties and decision forms\n * take it: none for a server reached only on a private network, a static\n * bearer, or OAuth client credentials.\n */\n\n/** The credential kinds a form offers, with the words it shows. */\nexport const CREDENTIAL_KINDS = [\n { kind: 'none', label: 'No credential' },\n { kind: 'bearer', label: 'Bearer token' },\n { kind: 'clientCredentials', label: 'OAuth client credentials' },\n] as const;\n\nexport type CredentialKind = (typeof CREDENTIAL_KINDS)[number]['kind'];\n\nexport type ServerCredential =\n | { kind: 'none' }\n | { kind: 'bearer'; token: string }\n | { kind: 'clientCredentials'; clientId: string; clientSecret: string; issuer: string; scope?: string };\n\n/** The kind a form sent, a bearer when it sent none it knows. */\nexport function credentialKindOf(sent: string): CredentialKind {\n return CREDENTIAL_KINDS.find(({ kind }) => kind === sent)?.kind ?? 'bearer';\n}\n\n/** The credential the fields name: only the fields of its kind are read. */\nexport function serverCredentialOf(fields: { credentialKind: string; token: string; clientId: string; clientSecret: string; issuer: string; scope: string }): ServerCredential {\n const kind = credentialKindOf(fields.credentialKind);\n switch (kind) {\n case 'none':\n return { kind };\n case 'bearer':\n return { kind, token: fields.token };\n case 'clientCredentials':\n return { kind, clientId: fields.clientId, clientSecret: fields.clientSecret, issuer: fields.issuer, ...(fields.scope === '' ? {} : { scope: fields.scope }) };\n }\n}\n","import { INPUT, LABEL } from './look';\n\n/** A ship a party's owner may be picked from, by its name. */\nexport interface OwnerChoice {\n shipId: string;\n name: string;\n}\n\n/** The owner choices as a page read them, or why they could not be read. */\nexport type OwnerChoices = { isOk: true; value: OwnerChoice[] } | { isOk: false; refusal: string };\n\n/**\n * The owner of a party, picked by name from the ships the fleet takes as an\n * owner. The owner it has now stays a choice, though the fleet no longer\n * lists it, so saving leaves it as it is. Where the choices could not be\n * read, it says why, with nothing to pick.\n */\nexport function OwnerField({ choices, current, help, refusal }: { choices: readonly OwnerChoice[]; current: OwnerChoice | null; help: string; refusal?: string | undefined }) {\n const shown = current === null || choices.some((choice) => choice.shipId === current.shipId) ? choices : [current, ...choices];\n return (\n <label className={LABEL}>\n <span>Owner</span>\n <select className={INPUT} name=\"ownerShipId\" defaultValue={current?.shipId ?? ''} required data-testid=\"owner-field\">\n {current === null ? (\n <option value=\"\" disabled>\n Pick its owner\n </option>\n ) : null}\n {shown.map((choice) => (\n <option key={choice.shipId} value={choice.shipId}>\n {choice.name}\n </option>\n ))}\n </select>\n <span className=\"text-muted-foreground\">{refusal ?? help}</span>\n </label>\n );\n}\n"],"names":["CREDENTIAL_KINDS","kind","label","credentialKindOf","sent","find","serverCredentialOf","fields","credentialKind","token","clientId","clientSecret","issuer","scope","OwnerField","choices","current","help","refusal","shown","some","choice","shipId","className","name","defaultValue","required","value","disabled","map"],"mappings":"6CAOO,IAAMA,EAAmB,CAC9B,CAAEC,KAAM,OAAQC,MAAO,eAAgB,EACvC,CAAED,KAAM,SAAUC,MAAO,cAAe,EACxC,CAAED,KAAM,oBAAqBC,MAAO,0BAA2B,EAChE,oBAUM,SAASC,AAAiBC,CAAY,EAC3C,OAAOJ,EAAiBK,IAAI,CAAC,CAAC,MAAEJ,CAAI,CAAE,GAAKA,IAASG,IAAOH,MAAQ,QACrE,gCCvBA,EAAA,EAAA,CAAA,CAAA,kBAiBO,SAASa,AAAW,SAAEC,CAAO,SAAEC,CAAO,MAAEC,CAAI,SAAEC,CAAO,CAAgH,EAC1K,IAAMC,EAAQH,AAAY,UAAQD,EAAQK,IAAI,CAAC,AAACC,GAAWA,EAAOC,MAAM,GAAKN,EAAQM,MAAM,EAAIP,EAAU,CAACC,KAAYD,EAAQ,CAC9H,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAMQ,UAAW,EAAA,CAAK,WACrB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,UACN,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAOA,UAAW,EAAA,CAAK,CAAEC,KAAK,cAAcC,aAAcT,GAASM,QAAU,GAAII,QAAQ,CAAA,CAAA,EAAC,cAAY,wBACxF,OAAZV,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAOW,MAAM,GAAGC,QAAQ,CAAA,CAAA,WAAC,mBAGxB,KACHT,EAAMU,GAAG,CAAC,AAACR,GACV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAA2BM,MAAON,EAAOC,MAAM,UAC7CD,EAAOG,IAAI,EADDH,EAAOC,MAAM,MAK9B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKC,UAAU,iCAAyBL,GAAWD,MAG1D"}
@@ -1,3 +1,3 @@
1
- (()=>{"use strict";module.exports=[72704,a=>{var b=a.i(7997),c=a.i(8403);function d({header:a,children:c}){return(0,b.jsxs)("div",{className:"flex min-h-dvh flex-col",children:[(0,b.jsx)("div",{"data-testid":"frame-header",className:"contents",children:a}),(0,b.jsx)("main",{className:"mx-auto w-full max-w-5xl flex-1 px-4 py-6",children:c})]})}var e=a.i(717),f=a.i(66283);async function g(){try{return await (await (0,f.z)(void 0)).account.apps.query()}catch(a){if(void 0!==(0,f.T)(a))return;throw a}}var h=a.i(75416),i=a.i(49310),j=a.i(26972),k=a.i(54757),k=k,l=a.i(27221),m=a.i(89963),n=a.i(83931),o=a.i(29517);let p=i.z.enum(["console","gateway","account","admin"]),q=j.z.object({app:p,url:k.httpUrl()});j.z.object({account:j.z.object({id:h.s,email:l.z.string()}),apps:m.z.array(q),fleets:m.z.array(j.z.object({id:(0,o.f)("fleet"),name:l.z.string(),argo:n.z.boolean(),apps:m.z.array(q)}))});var r=a.i(91156);let s=(0,o.f)("fleet");function t(a){return a.flatMap(({app:a,url:b})=>{let c=p.safeParse(a);return c.success?[{app:c.data,url:b}]:[]})}var u=a.i(73952);function v(){return(0,b.jsx)("header",{"data-testid":"plain-header",className:"flex h-14 items-center border-b border-border px-4",children:(0,b.jsx)("a",{href:"/overview",className:"text-section font-semibold",children:"Aeolus"})})}async function w({theme:a}){let c=await g(),d=void 0===c?[]:function(a){let b=h.s.safeParse(a.account.id),c=a.fleets.map(a=>s.safeParse(a.id));if(!b.success||c.some(a=>!a.success))return[];let d={account:{id:b.data,email:a.account.email},apps:t(a.apps),fleets:a.fleets.flatMap((a,b)=>{let d=c[b];return d?.success===!0?[{id:d.data,name:a.name,argo:!1,apps:t(a.apps)}]:[]})};return d.fleets.map(({id:a,name:b})=>(0,r.f)({list:d,fleet:{id:a,name:b},app:"gateway"}))}(c);return void 0===c||0===d.length?(0,b.jsx)(v,{}):(0,b.jsx)(e.Suspense,{fallback:(0,b.jsx)(v,{}),children:(0,b.jsx)(u.GatewayHeader,{switchers:d,email:c.account.email,accountUrl:c.apps.find(({app:a})=>"account"===a)?.url,theme:a})})}async function x({children:a}){return(0,b.jsx)(d,{header:(0,b.jsx)(w,{theme:await (0,c.f)()}),children:a})}a.s(["f",0,x],72704)},56397,a=>{let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call GatewayHeader() from the server but GatewayHeader 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/frame/ui/gateway-header.tsx","GatewayHeader");a.s(["GatewayHeader",0,b])},73952,a=>{var b=a.i(56397);a.n(b)}]})();
1
+ (()=>{"use strict";module.exports=[72704,a=>{var b=a.i(7997),c=a.i(8403);function d({header:a,children:c}){return(0,b.jsxs)("div",{className:"flex min-h-dvh flex-col",children:[(0,b.jsx)("div",{"data-testid":"frame-header",className:"contents",children:a}),(0,b.jsx)("main",{className:"mx-auto w-full max-w-5xl flex-1 px-4 py-6",children:c})]})}var e=a.i(717),f=a.i(66283);async function g(){try{return await (await (0,f.z)(void 0)).account.apps.query()}catch(a){if(void 0!==(0,f.U)(a))return;throw a}}var h=a.i(75416),i=a.i(49310),j=a.i(26972),k=a.i(54757),k=k,l=a.i(27221),m=a.i(89963),n=a.i(83931),o=a.i(29517);let p=i.z.enum(["console","gateway","account","admin"]),q=j.z.object({app:p,url:k.httpUrl()});j.z.object({account:j.z.object({id:h.s,email:l.z.string()}),apps:m.z.array(q),fleets:m.z.array(j.z.object({id:(0,o.f)("fleet"),name:l.z.string(),argo:n.z.boolean(),apps:m.z.array(q)}))});var r=a.i(91156);let s=(0,o.f)("fleet");function t(a){return a.flatMap(({app:a,url:b})=>{let c=p.safeParse(a);return c.success?[{app:c.data,url:b}]:[]})}var u=a.i(73952);function v(){return(0,b.jsx)("header",{"data-testid":"plain-header",className:"flex h-14 items-center border-b border-border px-4",children:(0,b.jsx)("a",{href:"/overview",className:"text-section font-semibold",children:"Aeolus"})})}async function w({theme:a}){let c=await g(),d=void 0===c?[]:function(a){let b=h.s.safeParse(a.account.id),c=a.fleets.map(a=>s.safeParse(a.id));if(!b.success||c.some(a=>!a.success))return[];let d={account:{id:b.data,email:a.account.email},apps:t(a.apps),fleets:a.fleets.flatMap((a,b)=>{let d=c[b];return d?.success===!0?[{id:d.data,name:a.name,argo:!1,apps:t(a.apps)}]:[]})};return d.fleets.map(({id:a,name:b})=>(0,r.f)({list:d,fleet:{id:a,name:b},app:"gateway"}))}(c);return void 0===c||0===d.length?(0,b.jsx)(v,{}):(0,b.jsx)(e.Suspense,{fallback:(0,b.jsx)(v,{}),children:(0,b.jsx)(u.GatewayHeader,{switchers:d,email:c.account.email,accountUrl:c.apps.find(({app:a})=>"account"===a)?.url,theme:a})})}async function x({children:a}){return(0,b.jsx)(d,{header:(0,b.jsx)(w,{theme:await (0,c.f)()}),children:a})}a.s(["f",0,x],72704)},56397,a=>{let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call GatewayHeader() from the server but GatewayHeader 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/frame/ui/gateway-header.tsx","GatewayHeader");a.s(["GatewayHeader",0,b])},73952,a=>{var b=a.i(56397);a.n(b)}]})();
2
2
 
3
3
  //# sourceMappingURL=web_features_frame_0pe8cwpxe1egb._.js.map
@@ -1,3 +1,3 @@
1
- module.exports=[45648,a=>{"use strict";var b=a.i(87924),c=a.i(64831);let d={name:"search",size:24,node:[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]]};d.node;let e=(0,c.f)(d);var f=a.i(78400),g=a.i(21244),h=a.i(95725),i=a.i(6158),j=a.i(18486);function k({switcher:a,account:c,onSearch:d,searchLabel:l="Search or jump to",children:m,actions:n,className:o}){return(0,b.jsxs)("header",{"data-slot":"app-header",className:(0,j.f)("sticky top-0 z-30 flex h-(--size-header) shrink-0 items-center justify-between gap-4 border-b border-border bg-background px-6",o),children:[(0,b.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[void 0===a?(0,b.jsx)("span",{"data-testid":"app-switcher-loading","aria-hidden":!0,className:"h-4 w-36 shrink-0 animate-pulse rounded bg-muted motion-reduce:animate-none"}):(0,b.jsx)(f.AppSwitcher,{switcher:a,layout:"full",className:"shrink-0"}),m]}),(0,b.jsxs)("div",{className:"flex shrink-0 items-center gap-3",children:[n,d?(0,b.jsxs)(g.f,{size:"sm",icon:(0,b.jsx)(e,{"aria-hidden":!0}),"data-testid":"header-search",className:"w-60 justify-start font-normal text-muted-foreground max-lg:w-auto",onClick:d,children:[(0,b.jsx)("span",{className:"grow text-left max-lg:sr-only",children:l}),(0,b.jsx)(h.f,{children:"⌘K"})]}):null,(0,b.jsx)(i.AvatarMenu,{...c})]})]})}var l=a.i(50944),m=a.i(72131),n=a.i(5050);let o=(0,n.createServerReference)("40e9a42ba8cfd90f0dd74f6fcb1ee9c16c64e374ae",n.callServer,void 0,n.findSourceMapURL,"setTheme"),p=["light","dark","system"];var q=a.i(25959);let r=[{key:"overview",label:"Overview",path:"/overview"},{key:"outside-parties",label:"Outside parties",path:"/outside-parties"},{key:"parties",label:"Parties",path:"/parties"}];function s({fleetId:a}){let c=(0,l.usePathname)();return(0,b.jsx)("nav",{"aria-label":"Gateway",className:"flex shrink-0 items-center gap-1",children:r.map(({key:d,label:e,path:f})=>{let g=c===f||c.startsWith(`${f}/`);return(0,b.jsx)("a",{href:(0,q.f)(f,a),"data-testid":`frame-tab-${d}`,"aria-current":g?"page":void 0,className:`whitespace-nowrap rounded-md px-2 py-1 text-sm ${g?"bg-accent font-semibold":"text-muted-foreground hover:bg-accent"}`,children:e},d)})})}a.s(["GatewayHeader",0,function({switchers:a,email:c,accountUrl:d,theme:e}){let g=(0,l.useSearchParams)().get("fleet"),h=a.find(({fleet:a})=>a.id===g)??a[0],[j,n]=(0,m.useState)(e),[q,r]=(0,m.useState)(!1),t=(0,m.useRef)(null),u={name:c,signedInAs:"account",accountUrl:d,theme:j,themes:p,hasTheme:!0,onThemeChange:a=>{let b;n(a),document.documentElement.dataset.theme=a,b="dark"===a||"system"===a&&window.matchMedia("(prefers-color-scheme: dark)").matches,document.documentElement.classList.toggle("dark",b),o(a)},shortcuts:[],helpUrl:"https://github.com/ThomasHendrickx/aeolus-fleet",onSignOut:()=>{r(!0),t.current?.requestSubmit()},isSigningOut:q};return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("form",{ref:t,method:"post",action:"/sign-in/end",hidden:!0}),(0,b.jsx)(k,{switcher:h,account:u,className:"max-sm:hidden",children:void 0===h?null:(0,b.jsx)(s,{fleetId:h.fleet.id})}),(0,b.jsxs)("header",{className:"sticky top-0 z-30 flex h-14 shrink-0 items-center gap-3 border-b border-border bg-background px-4 sm:hidden",children:[void 0===h?null:(0,b.jsx)(f.AppSwitcher,{switcher:h,layout:"compact",className:"min-w-0"}),void 0===h?null:(0,b.jsx)(s,{fleetId:h.fleet.id}),(0,b.jsx)("span",{className:"grow"}),(0,b.jsx)(i.AvatarMenuSheet,{...u})]})]})}],45648)}];
1
+ module.exports=[45648,a=>{"use strict";var b=a.i(87924),c=a.i(64831);let d={name:"search",size:24,node:[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]]};d.node;let e=(0,c.f)(d);var f=a.i(78400),g=a.i(21244),h=a.i(95725),i=a.i(6158),j=a.i(18486);function k({switcher:a,account:c,onSearch:d,searchLabel:l="Search or jump to",children:m,actions:n,className:o}){return(0,b.jsxs)("header",{"data-slot":"app-header",className:(0,j.f)("sticky top-0 z-30 flex h-(--size-header) shrink-0 items-center justify-between gap-4 border-b border-border bg-background px-6",o),children:[(0,b.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[void 0===a?(0,b.jsx)("span",{"data-testid":"app-switcher-loading","aria-hidden":!0,className:"h-4 w-36 shrink-0 animate-pulse rounded bg-muted motion-reduce:animate-none"}):(0,b.jsx)(f.AppSwitcher,{switcher:a,layout:"full",className:"shrink-0"}),m]}),(0,b.jsxs)("div",{className:"flex shrink-0 items-center gap-3",children:[n,d?(0,b.jsxs)(g.f,{size:"sm",icon:(0,b.jsx)(e,{"aria-hidden":!0}),"data-testid":"header-search",className:"w-60 justify-start font-normal text-muted-foreground max-lg:w-auto",onClick:d,children:[(0,b.jsx)("span",{className:"grow text-left max-lg:sr-only",children:l}),(0,b.jsx)(h.f,{children:"⌘K"})]}):null,(0,b.jsx)(i.AvatarMenu,{...c})]})]})}var l=a.i(50944),m=a.i(72131),n=a.i(5050);let o=(0,n.createServerReference)("404a6fe925a7b9f3a666fe6efebf5bf6e8ec052ac8",n.callServer,void 0,n.findSourceMapURL,"setTheme"),p=["light","dark","system"];var q=a.i(25959);let r=[{key:"overview",label:"Overview",path:"/overview"},{key:"outside-parties",label:"Outside parties",path:"/outside-parties"},{key:"parties",label:"Parties",path:"/parties"}];function s({fleetId:a}){let c=(0,l.usePathname)();return(0,b.jsx)("nav",{"aria-label":"Gateway",className:"flex shrink-0 items-center gap-1",children:r.map(({key:d,label:e,path:f})=>{let g=c===f||c.startsWith(`${f}/`);return(0,b.jsx)("a",{href:(0,q.f)(f,a),"data-testid":`frame-tab-${d}`,"aria-current":g?"page":void 0,className:`whitespace-nowrap rounded-md px-2 py-1 text-sm ${g?"bg-accent font-semibold":"text-muted-foreground hover:bg-accent"}`,children:e},d)})})}a.s(["GatewayHeader",0,function({switchers:a,email:c,accountUrl:d,theme:e}){let g=(0,l.useSearchParams)().get("fleet"),h=a.find(({fleet:a})=>a.id===g)??a[0],[j,n]=(0,m.useState)(e),[q,r]=(0,m.useState)(!1),t=(0,m.useRef)(null),u={name:c,signedInAs:"account",accountUrl:d,theme:j,themes:p,hasTheme:!0,onThemeChange:a=>{let b;n(a),document.documentElement.dataset.theme=a,b="dark"===a||"system"===a&&window.matchMedia("(prefers-color-scheme: dark)").matches,document.documentElement.classList.toggle("dark",b),o(a)},shortcuts:[],helpUrl:"https://github.com/ThomasHendrickx/aeolus-fleet",onSignOut:()=>{r(!0),t.current?.requestSubmit()},isSigningOut:q};return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("form",{ref:t,method:"post",action:"/sign-in/end",hidden:!0}),(0,b.jsx)(k,{switcher:h,account:u,className:"max-sm:hidden",children:void 0===h?null:(0,b.jsx)(s,{fleetId:h.fleet.id})}),(0,b.jsxs)("header",{className:"sticky top-0 z-30 flex h-14 shrink-0 items-center gap-3 border-b border-border bg-background px-4 sm:hidden",children:[void 0===h?null:(0,b.jsx)(f.AppSwitcher,{switcher:h,layout:"compact",className:"min-w-0"}),void 0===h?null:(0,b.jsx)(s,{fleetId:h.fleet.id}),(0,b.jsx)("span",{className:"grow"}),(0,b.jsx)(i.AvatarMenuSheet,{...u})]})]})}],45648)}];
2
2
 
3
3
  //# sourceMappingURL=web_features_frame_ui_gateway-header_tsx_0e9tekx4jf7ng._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../web/features/frame/data%3A6ed796%20%3Ctext/javascript%3E","../../../../../web/features/frame/ui/gateway-header.tsx","../../../../../web/features/frame/ui/gateway-tabs.tsx","../../../../../node_modules/%40aeolus-fleet/common/src/header/app-header.tsx","../../../../../web/features/frame/theme.ts","../../../../../node_modules/lucide-react/src/icons/search.ts"],"sourcesContent":["/* __next_internal_action_entry_do_not_use__ [{\"40e9a42ba8cfd90f0dd74f6fcb1ee9c16c64e374ae\":{\"name\":\"setTheme\"}},\"web/features/frame/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(\"40e9a42ba8cfd90f0dd74f6fcb1ee9c16c64e374ae\",callServer,void 0,findSourceMapURL,\"setTheme\");export{$$RSC_SERVER_ACTION_0 as setTheme};","'use client';\n\nimport type { Theme } from '@aeolus-fleet/common';\nimport { AppHeader, AppSwitcher, AvatarMenuSheet, type AppSwitcherModel, type AvatarMenuProps } from '@aeolus-fleet/common/header';\nimport { useSearchParams } from 'next/navigation';\nimport { useRef, useState } from 'react';\n\nimport { setTheme } from '../actions';\nimport { THEMES } from '../theme';\nimport { GatewayTabs } from './gateway-tabs';\n\n/** Where the avatar menu's Help leads, as in the console. */\nconst HELP_URL = 'https://github.com/ThomasHendrickx/aeolus-fleet';\n\n/** The gateway's server ends the shared sign-in here, in every app at once, for a form sent from its own pages. */\nconst SIGN_OUT_PATH = '/sign-in/end';\n\n/** Applies a theme at once, as the root layout's script does on the next load. */\nfunction applyTheme(theme: Theme): void {\n document.documentElement.dataset.theme = theme;\n const isDark = theme === 'dark' || (theme === 'system' && window.matchMedia('(prefers-color-scheme: dark)').matches);\n document.documentElement.classList.toggle('dark', isDark);\n}\n\ninterface GatewayHeaderProps {\n /** One per fleet the account may open, with it in view; the address picks one. */\n switchers: readonly AppSwitcherModel[];\n email: string;\n /** Account's address, for the avatar menu's Your account, Your rights and Email updates. */\n accountUrl: string | undefined;\n theme: Theme;\n}\n\n/**\n * The header every Aeolus app shows (aeolus-fleet, header design), on the\n * gateway's pages: from 640 px the shared AppHeader, with the switcher in\n * the title and the avatar menu; on phone a bar with the switcher compact\n * and the avatar's bottom Sheet (H6). After the title, the tabs to the\n * overview, the outside parties and the parties. The fleet in view is the one the\n * address names, else the account's first. Sign out ends the shared\n * sign-in in every app and shows \"Signing out\" until the page leaves.\n */\nexport function GatewayHeader({ switchers, email, accountUrl, theme }: GatewayHeaderProps) {\n const requested = useSearchParams().get('fleet');\n const switcher = switchers.find(({ fleet }) => fleet.id === requested) ?? switchers[0];\n const [shownTheme, setShownTheme] = useState(theme);\n const [isSigningOut, setIsSigningOut] = useState(false);\n const signOutForm = useRef<HTMLFormElement>(null);\n\n const account: AvatarMenuProps = {\n name: email,\n signedInAs: 'account',\n accountUrl,\n theme: shownTheme,\n themes: THEMES,\n hasTheme: true,\n onThemeChange: (next) => {\n setShownTheme(next);\n applyTheme(next);\n void setTheme(next);\n },\n shortcuts: [],\n helpUrl: HELP_URL,\n onSignOut: () => {\n setIsSigningOut(true);\n signOutForm.current?.requestSubmit();\n },\n isSigningOut,\n };\n return (\n <>\n <form ref={signOutForm} method=\"post\" action={SIGN_OUT_PATH} hidden />\n <AppHeader switcher={switcher} account={account} className=\"max-sm:hidden\">\n {switcher === undefined ? null : <GatewayTabs fleetId={switcher.fleet.id} />}\n </AppHeader>\n <header className=\"sticky top-0 z-30 flex h-14 shrink-0 items-center gap-3 border-b border-border bg-background px-4 sm:hidden\">\n {switcher === undefined ? null : <AppSwitcher switcher={switcher} layout=\"compact\" className=\"min-w-0\" />}\n {switcher === undefined ? null : <GatewayTabs fleetId={switcher.fleet.id} />}\n <span className=\"grow\" />\n <AvatarMenuSheet {...account} />\n </header>\n </>\n );\n}\n","'use client';\n\nimport { usePathname } from 'next/navigation';\n\nimport { inFleet } from '../../../lib/gateway-api/page-account';\n\n/** The gateway's pages a person goes between. */\nconst TABS = [\n { key: 'overview', label: 'Overview', path: '/overview' },\n { key: 'outside-parties', label: 'Outside parties', path: '/outside-parties' },\n { key: 'parties', label: 'Parties', path: '/parties' },\n] as const;\n\n/** Whether the page at this path is the tab's page or one of its own. */\nfunction isTabOf(pathname: string, path: string): boolean {\n return pathname === path || pathname.startsWith(`${path}/`);\n}\n\n/** The header's tabs: the overview, the outside parties and the parties of the fleet in view, the page shown current. */\nexport function GatewayTabs({ fleetId }: { fleetId: string }) {\n const pathname = usePathname();\n return (\n <nav aria-label=\"Gateway\" className=\"flex shrink-0 items-center gap-1\">\n {TABS.map(({ key, label, path }) => {\n const isCurrent = isTabOf(pathname, path);\n return (\n <a\n key={key}\n href={inFleet(path, fleetId)}\n data-testid={`frame-tab-${key}`}\n aria-current={isCurrent ? 'page' : undefined}\n className={`whitespace-nowrap rounded-md px-2 py-1 text-sm ${isCurrent ? 'bg-accent font-semibold' : 'text-muted-foreground hover:bg-accent'}`}\n >\n {label}\n </a>\n );\n })}\n </nav>\n );\n}\n","unable to read source [project]/node_modules/@aeolus-fleet/common/src/header/app-header.tsx","/**\n * The theme this browser chose for the gateway's pages (header design H13:\n * each app keeps its own), System until chosen.\n */\nimport type { Theme } from '@aeolus-fleet/common';\n\n/** The themes, as common names them: written here so the header's browser code loads no schema (decision 0033). */\nexport const THEMES: readonly Theme[] = ['light', 'dark', 'system'];\n\n/** The cookie that keeps it. */\nexport const THEME_COOKIE = 'aeolus_gateway_theme';\n\nexport function isTheme(value: unknown): value is Theme {\n return THEMES.some((theme) => theme === value);\n}\n\n/** The theme a cookie names, or System. */\nexport function themeFrom(value: string | undefined): Theme {\n return isTheme(value) ? value : 'system';\n}\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'search',\n size: 24,\n node: [\n ['path', { d: 'm21 21-4.34-4.34', key: '14j7rj' }],\n ['circle', { cx: '11', cy: '11', r: '8', key: '4ej97u' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Search\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMjEgMjEtNC4zNC00LjM0IiAvPgogIDxjaXJjbGUgY3g9IjExIiBjeT0iMTEiIHI9IjgiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/search\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Search = createLucideIcon(__iconData);\n\nexport default Search;\n"],"names":["node","cx","key"],"mappings":"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","ignoreList":[3,5]}
1
+ {"version":3,"sources":["../../../../../web/features/frame/data%3A22b40e%20%3Ctext/javascript%3E","../../../../../web/features/frame/ui/gateway-header.tsx","../../../../../web/features/frame/ui/gateway-tabs.tsx","../../../../../node_modules/%40aeolus-fleet/common/src/header/app-header.tsx","../../../../../web/features/frame/theme.ts","../../../../../node_modules/lucide-react/src/icons/search.ts"],"sourcesContent":["/* __next_internal_action_entry_do_not_use__ [{\"404a6fe925a7b9f3a666fe6efebf5bf6e8ec052ac8\":{\"name\":\"setTheme\"}},\"web/features/frame/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(\"404a6fe925a7b9f3a666fe6efebf5bf6e8ec052ac8\",callServer,void 0,findSourceMapURL,\"setTheme\");export{$$RSC_SERVER_ACTION_0 as setTheme};","'use client';\n\nimport type { Theme } from '@aeolus-fleet/common';\nimport { AppHeader, AppSwitcher, AvatarMenuSheet, type AppSwitcherModel, type AvatarMenuProps } from '@aeolus-fleet/common/header';\nimport { useSearchParams } from 'next/navigation';\nimport { useRef, useState } from 'react';\n\nimport { setTheme } from '../actions';\nimport { THEMES } from '../theme';\nimport { GatewayTabs } from './gateway-tabs';\n\n/** Where the avatar menu's Help leads, as in the console. */\nconst HELP_URL = 'https://github.com/ThomasHendrickx/aeolus-fleet';\n\n/** The gateway's server ends the shared sign-in here, in every app at once, for a form sent from its own pages. */\nconst SIGN_OUT_PATH = '/sign-in/end';\n\n/** Applies a theme at once, as the root layout's script does on the next load. */\nfunction applyTheme(theme: Theme): void {\n document.documentElement.dataset.theme = theme;\n const isDark = theme === 'dark' || (theme === 'system' && window.matchMedia('(prefers-color-scheme: dark)').matches);\n document.documentElement.classList.toggle('dark', isDark);\n}\n\ninterface GatewayHeaderProps {\n /** One per fleet the account may open, with it in view; the address picks one. */\n switchers: readonly AppSwitcherModel[];\n email: string;\n /** Account's address, for the avatar menu's Your account, Your rights and Email updates. */\n accountUrl: string | undefined;\n theme: Theme;\n}\n\n/**\n * The header every Aeolus app shows (aeolus-fleet, header design), on the\n * gateway's pages: from 640 px the shared AppHeader, with the switcher in\n * the title and the avatar menu; on phone a bar with the switcher compact\n * and the avatar's bottom Sheet (H6). After the title, the tabs to the\n * overview, the outside parties and the parties. The fleet in view is the one the\n * address names, else the account's first. Sign out ends the shared\n * sign-in in every app and shows \"Signing out\" until the page leaves.\n */\nexport function GatewayHeader({ switchers, email, accountUrl, theme }: GatewayHeaderProps) {\n const requested = useSearchParams().get('fleet');\n const switcher = switchers.find(({ fleet }) => fleet.id === requested) ?? switchers[0];\n const [shownTheme, setShownTheme] = useState(theme);\n const [isSigningOut, setIsSigningOut] = useState(false);\n const signOutForm = useRef<HTMLFormElement>(null);\n\n const account: AvatarMenuProps = {\n name: email,\n signedInAs: 'account',\n accountUrl,\n theme: shownTheme,\n themes: THEMES,\n hasTheme: true,\n onThemeChange: (next) => {\n setShownTheme(next);\n applyTheme(next);\n void setTheme(next);\n },\n shortcuts: [],\n helpUrl: HELP_URL,\n onSignOut: () => {\n setIsSigningOut(true);\n signOutForm.current?.requestSubmit();\n },\n isSigningOut,\n };\n return (\n <>\n <form ref={signOutForm} method=\"post\" action={SIGN_OUT_PATH} hidden />\n <AppHeader switcher={switcher} account={account} className=\"max-sm:hidden\">\n {switcher === undefined ? null : <GatewayTabs fleetId={switcher.fleet.id} />}\n </AppHeader>\n <header className=\"sticky top-0 z-30 flex h-14 shrink-0 items-center gap-3 border-b border-border bg-background px-4 sm:hidden\">\n {switcher === undefined ? null : <AppSwitcher switcher={switcher} layout=\"compact\" className=\"min-w-0\" />}\n {switcher === undefined ? null : <GatewayTabs fleetId={switcher.fleet.id} />}\n <span className=\"grow\" />\n <AvatarMenuSheet {...account} />\n </header>\n </>\n );\n}\n","'use client';\n\nimport { usePathname } from 'next/navigation';\n\nimport { inFleet } from '../../../lib/gateway-api/page-account';\n\n/** The gateway's pages a person goes between. */\nconst TABS = [\n { key: 'overview', label: 'Overview', path: '/overview' },\n { key: 'outside-parties', label: 'Outside parties', path: '/outside-parties' },\n { key: 'parties', label: 'Parties', path: '/parties' },\n] as const;\n\n/** Whether the page at this path is the tab's page or one of its own. */\nfunction isTabOf(pathname: string, path: string): boolean {\n return pathname === path || pathname.startsWith(`${path}/`);\n}\n\n/** The header's tabs: the overview, the outside parties and the parties of the fleet in view, the page shown current. */\nexport function GatewayTabs({ fleetId }: { fleetId: string }) {\n const pathname = usePathname();\n return (\n <nav aria-label=\"Gateway\" className=\"flex shrink-0 items-center gap-1\">\n {TABS.map(({ key, label, path }) => {\n const isCurrent = isTabOf(pathname, path);\n return (\n <a\n key={key}\n href={inFleet(path, fleetId)}\n data-testid={`frame-tab-${key}`}\n aria-current={isCurrent ? 'page' : undefined}\n className={`whitespace-nowrap rounded-md px-2 py-1 text-sm ${isCurrent ? 'bg-accent font-semibold' : 'text-muted-foreground hover:bg-accent'}`}\n >\n {label}\n </a>\n );\n })}\n </nav>\n );\n}\n","unable to read source [project]/node_modules/@aeolus-fleet/common/src/header/app-header.tsx","/**\n * The theme this browser chose for the gateway's pages (header design H13:\n * each app keeps its own), System until chosen.\n */\nimport type { Theme } from '@aeolus-fleet/common';\n\n/** The themes, as common names them: written here so the header's browser code loads no schema (decision 0033). */\nexport const THEMES: readonly Theme[] = ['light', 'dark', 'system'];\n\n/** The cookie that keeps it. */\nexport const THEME_COOKIE = 'aeolus_gateway_theme';\n\nexport function isTheme(value: unknown): value is Theme {\n return THEMES.some((theme) => theme === value);\n}\n\n/** The theme a cookie names, or System. */\nexport function themeFrom(value: string | undefined): Theme {\n return isTheme(value) ? value : 'system';\n}\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'search',\n size: 24,\n node: [\n ['path', { d: 'm21 21-4.34-4.34', key: '14j7rj' }],\n ['circle', { cx: '11', cy: '11', r: '8', key: '4ej97u' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Search\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMjEgMjEtNC4zNC00LjM0IiAvPgogIDxjaXJjbGUgY3g9IjExIiBjeT0iMTEiIHI9IjgiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/search\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Search = createLucideIcon(__iconData);\n\nexport default Search;\n"],"names":["node","cx","key"],"mappings":"qEKGO,CAAA,GAAM,EAA6B,MAClC,SACN,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CACN,KAAM,CACJ,CAAC,CAAA,CAAA,CAAA,IAAQ,CAAA,AAAE,EAAG,CAAA,kBAAoB,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CACjD,CAAC,CAAA,AFyBC,QEzBS,IAAM,IAAA,AFyBI,CEzBE,GAAI,CAAA,IAAM,EAAG,CAAA,CAAA,CAAA,KAAU,QAAA,CAAU,CAAA,CAAA,IAOL,CAAA,CFkBa,AElBb,CAAA,CAAA,KAajD,CAAA,CAAA,CAAA,EAAS,CAAA,CAAA,CAAA,EAAA,GFzBf,IAAA,EAA4B,CAArB,CAAyC,AAAD,CAAC,AAAvC,CAAuC,OAEhD,EAA2C,CAFvB,AAEb,CAAoC,CAAlC,AAAkC,AAFrB,CAEqB,KAA5B,AAFa,EAEX,AACjB,EAAqC,CAA9B,CAA8B,CAA5B,AAA4B,CAAA,AADd,EACX,EAAE,MAAM,SADsB,CAAC,MACP,CAAC,cA2BrB,EAAU,CAAA,SAAA,CAAU,SAAE,CEzBD,AFyBQ,CEzBA,SAAA,CFyBU,aAAE,CEzBP,CFyBqB,mBAAmB,UAAE,CAAQ,SAAE,CAAO,WAAE,CAAS,CAAkB,EACxI,MAAA,CAAA,EACE,EAAA,IAAA,EAAA,SAAA,CAAA,YACY,aACV,UAAW,CAAA,EAAA,EAAA,CAAA,AAAU,EAAC,gIAAgI,CAAE,GAAU,MAAD,CAAC,EAAA,IAElK,EAAA,IAAA,EAAA,MAAA,CAAK,SAAS,CAAC,iCAAiC,CAAA,SAAA,CAC7C,AAAa,QAAL,CAAc,CAAC,CAAC,AAAC,CAAA,EACxB,EAAA,GAAA,EAAA,OAAA,CAAA,cAAkB,sBAAsB,CAAA,eAAA,EAAa,SAAS,CAAC,6EAA6E,EAAG,CAChJ,AAAE,CAAD,AAAE,EACF,EAAA,GAAA,EAAC,EAAA,WAAW,CAAA,CAAC,QAAQ,CAAE,EAAU,MAAF,AAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,EAAG,CACvE,AACA,EAAQ,EACL,IACN,AAFW,EAEX,IAAA,EAAA,MAAA,CAAK,SAAS,CAAC,kCAAkC,CAAA,SAAA,CAC9C,EACA,EAAW,CAAA,EADJ,AAEN,EAAA,CADO,CAAC,CAAC,CACT,EAAC,EAAA,CAAM,CAAA,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA,CAAA,EAAE,EAAA,GAAA,EAAC,EAAM,CAAA,GAAA,YAAA,CAAA,EAAe,CAAA,cAAc,eAAe,CAAC,SAAS,CAAC,oEAAoE,CAAC,OAAO,CAAE,EAAQ,MAAA,GAAA,IAC1K,EAAA,GAAA,EAAA,OAAA,CAAM,SAAS,CAAC,+BAA+B,CAAA,SAAE,CAAW,EAAQ,CACpE,CAAA,EAAA,EAAA,EAD4D,CAC5D,EAAC,EAAA,CAAG,CAAA,CAAA,SAAA,IAAA,EAAS,CAAA,EACN,CACV,AAAG,CAAF,GAAM,CACR,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,CAAA,CAAA,GAAK,CAAO,EAAI,CAAA,EACvB,CAAA,EACC,AAEb,CEjDA,AJNA,AEuDC,AADE,CAAC,GFtDJ,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,ODLwL,EAAA,EAAA,CAAA,CAAA,MAAsG,IAAM,EAAmC,CAAA,EAAA,EAAA,iBAAb,IAAa,AAAqB,EAAC,KAAxB,wCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,YIOha,EAA2B,CAAC,QAAS,OAAQ,SAAS,CFHnE,IAAA,EAAA,EAAA,CAAA,CAAA,OAGA,IAAM,EAAO,CACX,CAAE,IAAK,WAAY,MAAO,WAAY,KAAM,WAAY,EACxD,CAAE,IAAK,kBAAmBA,MAAO,kBAAmB,KAAM,kBAAmB,EAC7E,CAAE,IAAK,UAAW,MAAOC,UAAW,KAAM,UAAWC,EACtD,CAQM,SAAS,EAAY,SAAE,CAAO,CAAuB,EAC1D,IAAM,EAAW,CAAA,EAAA,EAAA,WAAA,AAAW,IAC5B,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,aAAW,UAAU,UAAU,4CACjC,EAAK,GAAG,CAAC,CAAC,KAAE,CAAG,CAAE,OAAK,MAAE,CAAI,CAAE,IAC7B,IAAM,EATL,IASmC,GAAV,AATJ,EAAS,CASb,GATJ,MAA2B,CAAC,CAAA,EAAG,EAAK,CAAC,CAAC,EAUpD,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAEC,KAAM,CAAA,EAAA,EAAA,CAAA,AAAO,EAAC,EAAM,GACpB,cAAa,CAAC,UAAU,EAAE,EAAA,CAAK,CAC/B,eAAc,EAAY,YAAS,EACnC,UAAW,CAAC,+CAA+C,EAAE,EAAY,0BAA4B,wCAAA,CAAyC,UAE7I,GANI,EASX,IAGN,wBDGO,SAAS,AAAc,WAAE,CAAS,OAAE,CAAK,YAAE,CAAU,CAAE,OAAK,CAAsB,EACvF,IAAM,EAAY,CAAA,EAAA,EAAA,eAAA,AAAe,IAAG,GAAG,CAAC,SAClC,EAAW,EAAU,IAAI,CAAC,CAAC,OAAE,CAAK,CAAE,GAAK,EAAM,EAAE,GAAK,IAAc,CAAS,CAAC,EAAE,CAChF,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAS,GACvC,CAAC,EAAc,EAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC3C,EAAc,CAAA,EAAA,EAAA,MAAA,AAAM,EAAkB,MAEtC,EAA2B,CAC/B,KAAM,EACN,WAAY,qBACZ,EACA,MAAO,EACP,OAAQ,EACR,UAAU,EACV,cAAe,AAAC,UACd,EAAc,GAtClB,SAAS,eAAe,CAAC,OAAO,CAAC,KAAK,CAuCvB,EAvC0B,AACnC,EAAS,AAAU,YAAW,AAAU,cAAY,OAAO,UAAU,CAAC,gCAAgC,OAAO,CACnH,SAAS,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,OAAQ,GAsCzC,EAAS,EAChB,EACA,UAAW,EAAE,CACb,QAlDa,CAkDJ,iDACT,UAAW,KACT,GAAgB,GAChB,EAAY,OAAO,EAAE,eACvB,eACA,CACF,EACA,MACE,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,IAAK,EAAa,OAAO,OAAO,OAxDtB,CAwD8B,cAAe,MAAM,CAAA,CAAA,IACnE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAU,SAAU,EAAU,QAAS,EAAS,UAAU,yBACxD,KAAa,MAAY,KAAO,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,QAAS,EAAS,KAAK,CAAC,EAAE,KAE1E,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,UAAU,6HACF,IAAb,EAAyB,KAAO,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,WAAW,CAAA,CAAC,SAAU,EAAU,OAAO,UAAU,UAAU,iBAC/E,IAAb,EAAyB,KAAO,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,QAAS,EAAS,KAAK,CAAC,EAAE,GACxE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,SAChB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,eAAe,CAAA,CAAE,GAAG,CAAO,QAIpC","ignoreList":[3,5]}
@@ -0,0 +1,3 @@
1
+ module.exports=[3045,a=>{"use strict";var b=a.i(87924),c=a.i(50944),d=a.i(72131),e=a.i(1542),f=a.i(24229),g=a.i(5050);let h=(0,g.createServerReference)("40b3aca073cc71bb5b55b0ab806b2517702673751a",g.callServer,void 0,g.findSourceMapURL,"changeMic"),i=(0,g.createServerReference)("4040c60d310de4e3ee5cdb2bf013499e241d9cd46d",g.callServer,void 0,g.findSourceMapURL,"contribute"),j={request:{label:"Request the mic",pending:"Requesting..."},withdraw:{label:"Withdraw my request",pending:"Withdrawing..."},release:{label:"Release the mic",pending:"Releasing..."}};a.s(["MeetingControls",0,function({fleetId:a,meetingId:g,controls:k}){let l=(0,c.useRouter)(),[m,n]=(0,d.useState)(""),[o,p]=(0,d.useState)(()=>crypto.randomUUID()),[q,r]=(0,d.useState)(),[s,t]=(0,d.useState)(),[,u]=(0,d.useTransition)(),v=({control:a,action:b,onDone:c})=>{r(a),t(void 0),u(async()=>{let a=await b();r(void 0),a.isOk?(c?.(),l.refresh()):t(a.message)})},w=void 0!==q,x=k.filter(a=>"contribute"!==a);return(0,b.jsxs)("div",{className:"grid gap-3",children:[k.includes("contribute")?(0,b.jsxs)("div",{className:"grid gap-2",children:[(0,b.jsxs)("label",{className:"grid gap-1",children:[(0,b.jsx)("span",{children:"Your contribution"}),(0,b.jsx)("textarea",{"data-testid":"meeting-text",rows:4,value:m,onChange:a=>{n(a.target.value)},className:"rounded-md border border-input bg-background p-2"})]}),(0,b.jsx)(e.f,{"data-testid":"meeting-contribute",variant:"primary",className:"justify-self-start",isPending:"contribute"===q,pendingLabel:"Sending...",disabled:w,onClick:()=>{v({control:"contribute",action:()=>i({fleet:a,meetingId:g,text:m,idempotencyKey:o}),onDone:()=>{n(""),p(crypto.randomUUID())}})},children:"Contribute"})]}):null,0===x.length?null:(0,b.jsx)("div",{className:"flex flex-wrap gap-2",children:x.map(c=>(0,b.jsx)(e.f,{"data-testid":`meeting-${c}`,variant:"request"===c?"primary":"secondary",isPending:q===c,pendingLabel:j[c].pending,disabled:w,onClick:()=>{v({control:c,action:()=>h({fleet:a,meetingId:g,change:c})})},children:j[c].label},c))}),void 0===s?null:(0,b.jsx)(f.f,{message:s,isFailure:!0})]})}],3045)}];
2
+
3
+ //# sourceMappingURL=web_features_meeting_state_meeting-controls_tsx_12g4kzk2mbvvz._.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../web/features/meeting/state/meeting-controls.tsx","../../../../../web/features/meeting/hooks/data%3A7090e7%20%3Ctext/javascript%3E","../../../../../web/features/meeting/hooks/data%3Ad4330b%20%3Ctext/javascript%3E"],"sourcesContent":["'use client';\n\nimport { useRouter } from 'next/navigation';\nimport { useState, useTransition } from 'react';\n\nimport { ActionButton } from '../../overview/ui/action-button';\nimport { Notice } from '../../overview/ui/notice';\nimport type { ActionOutcome } from '../../overview/hooks/overview-actions';\nimport { changeMic, contribute, type OwnMicChange } from '../hooks/meeting-actions';\nimport type { MeetingControl } from '../services/meeting';\n\n/** Each mic control's words, and what it says while it works. */\nconst MIC_CONTROLS: Record<OwnMicChange, { label: string; pending: string }> = {\n request: { label: 'Request the mic', pending: 'Requesting...' },\n withdraw: { label: 'Withdraw my request', pending: 'Withdrawing...' },\n release: { label: 'Release the mic', pending: 'Releasing...' },\n};\n\n/**\n * What the person may do in the meeting now: write a contribution while they\n * hold the mic or moderate, and their own mic calls. A draft keeps one key\n * until it is taken, so a contribution tried again goes once. The page reads\n * itself again after each call.\n */\nexport function MeetingControls({ fleetId, meetingId, controls }: { fleetId: string; meetingId: string; controls: readonly MeetingControl[] }) {\n const router = useRouter();\n const [text, setText] = useState('');\n const [draftKey, setDraftKey] = useState(() => crypto.randomUUID());\n const [working, setWorking] = useState<MeetingControl | undefined>();\n const [failure, setFailure] = useState<string | undefined>();\n const [, startTransition] = useTransition();\n\n const run = ({ control, action, onDone }: { control: MeetingControl; action: () => Promise<ActionOutcome<undefined>>; onDone?: () => void }) => {\n setWorking(control);\n setFailure(undefined);\n startTransition(async () => {\n const outcome = await action();\n setWorking(undefined);\n if (outcome.isOk) {\n onDone?.();\n router.refresh();\n } else {\n setFailure(outcome.message);\n }\n });\n };\n\n const isWorking = working !== undefined;\n const micControls = controls.filter((control): control is OwnMicChange => control !== 'contribute');\n return (\n <div className=\"grid gap-3\">\n {controls.includes('contribute') ? (\n <div className=\"grid gap-2\">\n <label className=\"grid gap-1\">\n <span>Your contribution</span>\n <textarea\n data-testid=\"meeting-text\"\n rows={4}\n value={text}\n onChange={(event) => { setText(event.target.value); }}\n className=\"rounded-md border border-input bg-background p-2\"\n />\n </label>\n <ActionButton\n data-testid=\"meeting-contribute\"\n variant=\"primary\"\n className=\"justify-self-start\"\n isPending={working === 'contribute'}\n pendingLabel=\"Sending...\"\n disabled={isWorking}\n onClick={() => {\n run({\n control: 'contribute',\n action: () => contribute({ fleet: fleetId, meetingId, text, idempotencyKey: draftKey }),\n onDone: () => {\n setText('');\n setDraftKey(crypto.randomUUID());\n },\n });\n }}\n >\n Contribute\n </ActionButton>\n </div>\n ) : null}\n {micControls.length === 0 ? null : (\n <div className=\"flex flex-wrap gap-2\">\n {micControls.map((change) => (\n <ActionButton\n key={change}\n data-testid={`meeting-${change}`}\n variant={change === 'request' ? 'primary' : 'secondary'}\n isPending={working === change}\n pendingLabel={MIC_CONTROLS[change].pending}\n disabled={isWorking}\n onClick={() => { run({ control: change, action: () => changeMic({ fleet: fleetId, meetingId, change }) }); }}\n >\n {MIC_CONTROLS[change].label}\n </ActionButton>\n ))}\n </div>\n )}\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40b3aca073cc71bb5b55b0ab806b2517702673751a\":{\"name\":\"changeMic\"}},\"web/features/meeting/hooks/meeting-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_1=/*#__PURE__*/createServerReference(\"40b3aca073cc71bb5b55b0ab806b2517702673751a\",callServer,void 0,findSourceMapURL,\"changeMic\");export{$$RSC_SERVER_ACTION_1 as changeMic};","/* __next_internal_action_entry_do_not_use__ [{\"4040c60d310de4e3ee5cdb2bf013499e241d9cd46d\":{\"name\":\"contribute\"}},\"web/features/meeting/hooks/meeting-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(\"4040c60d310de4e3ee5cdb2bf013499e241d9cd46d\",callServer,void 0,findSourceMapURL,\"contribute\");export{$$RSC_SERVER_ACTION_0 as contribute};"],"names":["$$RSC_SERVER_ACTION_1"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- module.exports=[18434,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(30587),e=a.i(88412),f=a.i(36855),g=a.i(77237),h=a.i(5050);let i=(0,h.createServerReference)("60efb6926106563b19c1a54b070d26520408b32a05",h.callServer,void 0,h.findSourceMapURL,"switchOutsideParties");var j=a.i(47763);a.s(["SwitchCard",0,function({isOn:a,canSwitch:h,fleetId:k}){let[l,m]=(0,c.useActionState)(i,d.Q);return(0,b.jsxs)("section",{className:`${e.r} grid gap-3`,"data-testid":"outside-parties-switch",children:[(0,b.jsxs)("h2",{className:"flex items-center gap-2 text-section font-semibold",children:["Outside parties are ",a?"on":"off"," ",a?(0,b.jsx)(j.T,{tone:"ok",label:"On"}):(0,b.jsx)(j.T,{tone:"ended",label:"Off"})]}),(0,b.jsx)("p",{className:"text-muted-foreground",children:a?"Approved outside MCP servers and clients reach the fleet, as its network rules allow.":"No outside MCP server or client reaches the fleet, and no request for one can be approved."}),"openNetwork"===l.kind?(0,b.jsxs)("form",{action:m,role:"alert",className:"grid gap-3 rounded-md border border-tone-attention-border bg-tone-attention-bg p-4 text-tone-attention-fg",children:[(0,b.jsx)("h3",{className:"font-semibold",children:"Open network"}),(0,b.jsx)("p",{children:l.message}),(0,b.jsx)("input",{type:"hidden",name:d.H,value:k}),(0,b.jsx)("input",{type:"hidden",name:"isOn",value:"true"}),(0,b.jsx)("input",{type:"hidden",name:"isOpenNetworkConfirmed",value:"true"}),(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsx)(g.f,{kind:"destructive",pending:"Turning on…",testId:"outside-parties-turn-on-anyway",children:"Turn on anyway"}),(0,b.jsx)("a",{className:e.x.secondary,href:"",children:"Keep off"})]})]}):h?(0,b.jsxs)("form",{action:m,children:[(0,b.jsx)("input",{type:"hidden",name:d.H,value:k}),(0,b.jsx)("input",{type:"hidden",name:"isOn",value:String(!a)}),(0,b.jsx)(g.f,{kind:a?"secondary":"primary",pending:a?"Turning off…":"Turning on…",testId:"outside-parties-turn",children:a?"Turn off":"Turn on"})]}):(0,b.jsxs)("p",{className:"text-muted-foreground",children:["Turning them on or off needs ","fleet:network","."]}),"openNetwork"===l.kind?null:(0,b.jsx)(f.f,{state:l})]})}],18434)}];
1
+ module.exports=[18434,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(30587),e=a.i(88412),f=a.i(36855),g=a.i(77237),h=a.i(5050);let i=(0,h.createServerReference)("601569a05001fe6b6107005126588e652707d2e845",h.callServer,void 0,h.findSourceMapURL,"switchOutsideParties");var j=a.i(47763);a.s(["SwitchCard",0,function({isOn:a,canSwitch:h,fleetId:k}){let[l,m]=(0,c.useActionState)(i,d.Q);return(0,b.jsxs)("section",{className:`${e.r} grid gap-3`,"data-testid":"outside-parties-switch",children:[(0,b.jsxs)("h2",{className:"flex items-center gap-2 text-section font-semibold",children:["Outside parties are ",a?"on":"off"," ",a?(0,b.jsx)(j.T,{tone:"ok",label:"On"}):(0,b.jsx)(j.T,{tone:"ended",label:"Off"})]}),(0,b.jsx)("p",{className:"text-muted-foreground",children:a?"Approved outside MCP servers and clients reach the fleet, as its network rules allow.":"No outside MCP server or client reaches the fleet, and no request for one can be approved."}),"openNetwork"===l.kind?(0,b.jsxs)("form",{action:m,role:"alert",className:"grid gap-3 rounded-md border border-tone-attention-border bg-tone-attention-bg p-4 text-tone-attention-fg",children:[(0,b.jsx)("h3",{className:"font-semibold",children:"Open network"}),(0,b.jsx)("p",{children:l.message}),(0,b.jsx)("input",{type:"hidden",name:d.H,value:k}),(0,b.jsx)("input",{type:"hidden",name:"isOn",value:"true"}),(0,b.jsx)("input",{type:"hidden",name:"isOpenNetworkConfirmed",value:"true"}),(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsx)(g.f,{kind:"destructive",pending:"Turning on…",testId:"outside-parties-turn-on-anyway",children:"Turn on anyway"}),(0,b.jsx)("a",{className:e.x.secondary,href:"",children:"Keep off"})]})]}):h?(0,b.jsxs)("form",{action:m,children:[(0,b.jsx)("input",{type:"hidden",name:d.H,value:k}),(0,b.jsx)("input",{type:"hidden",name:"isOn",value:String(!a)}),(0,b.jsx)(g.f,{kind:a?"secondary":"primary",pending:a?"Turning off…":"Turning on…",testId:"outside-parties-turn",children:a?"Turn off":"Turn on"})]}):(0,b.jsxs)("p",{className:"text-muted-foreground",children:["Turning them on or off needs ","fleet:network","."]}),"openNetwork"===l.kind?null:(0,b.jsx)(f.f,{state:l})]})}],18434)}];
2
2
 
3
3
  //# sourceMappingURL=web_features_outside-parties_ui_switch-card_tsx_1_xnu9bm4tc-_._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../web/features/outside-parties/ui/switch-card.tsx","../../../../../web/features/outside-parties/data%3Ac7a2ae%20%3Ctext/javascript%3E"],"sourcesContent":["'use client';\n\nimport { useActionState } from 'react';\n\nimport { FLEET_FIELD, IDLE } from '../../forms/form-state';\nimport { BUTTONS, CARD } from '../../forms/ui/look';\nimport { Outcome } from '../../forms/ui/outcome';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport { switchOutsideParties } from '../actions';\nimport { StatusBadge } from './status-badge';\n\n/** The scope that turns outside parties on or off (0056). */\nconst SWITCHING_SCOPE = 'fleet:network';\n\n/**\n * Whether the fleet's outside parties are on, and the switch for an account\n * holding fleet:network. An open network's warning asks to confirm, or to\n * keep them off.\n */\nexport function SwitchCard({ isOn, canSwitch, fleetId }: { isOn: boolean; canSwitch: boolean; fleetId: string }) {\n const [state, formAction] = useActionState(switchOutsideParties, IDLE);\n return (\n <section className={`${CARD} grid gap-3`} data-testid=\"outside-parties-switch\">\n <h2 className=\"flex items-center gap-2 text-section font-semibold\">\n Outside parties are {isOn ? 'on' : 'off'} {isOn ? <StatusBadge tone=\"ok\" label=\"On\" /> : <StatusBadge tone=\"ended\" label=\"Off\" />}\n </h2>\n <p className=\"text-muted-foreground\">\n {isOn ? 'Approved outside MCP servers and clients reach the fleet, as its network rules allow.' : 'No outside MCP server or client reaches the fleet, and no request for one can be approved.'}\n </p>\n {state.kind === 'openNetwork' ? (\n <form action={formAction} role=\"alert\" className=\"grid gap-3 rounded-md border border-tone-attention-border bg-tone-attention-bg p-4 text-tone-attention-fg\">\n <h3 className=\"font-semibold\">Open network</h3>\n <p>{state.message}</p>\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <input type=\"hidden\" name=\"isOn\" value=\"true\" />\n <input type=\"hidden\" name=\"isOpenNetworkConfirmed\" value=\"true\" />\n <div className=\"flex gap-2\">\n <SubmitButton kind=\"destructive\" pending=\"Turning on…\" testId=\"outside-parties-turn-on-anyway\">\n Turn on anyway\n </SubmitButton>\n <a className={BUTTONS.secondary} href=\"\">\n Keep off\n </a>\n </div>\n </form>\n ) : canSwitch ? (\n <form action={formAction}>\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <input type=\"hidden\" name=\"isOn\" value={String(!isOn)} />\n <SubmitButton kind={isOn ? 'secondary' : 'primary'} pending={isOn ? 'Turning off…' : 'Turning on…'} testId=\"outside-parties-turn\">\n {isOn ? 'Turn off' : 'Turn on'}\n </SubmitButton>\n </form>\n ) : (\n <p className=\"text-muted-foreground\">Turning them on or off needs {SWITCHING_SCOPE}.</p>\n )}\n {state.kind === 'openNetwork' ? null : <Outcome state={state} />}\n </section>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"60efb6926106563b19c1a54b070d26520408b32a05\":{\"name\":\"switchOutsideParties\"}},\"web/features/outside-parties/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(\"60efb6926106563b19c1a54b070d26520408b32a05\",callServer,void 0,findSourceMapURL,\"switchOutsideParties\");export{$$RSC_SERVER_ACTION_0 as switchOutsideParties};"],"names":["$$RSC_SERVER_ACTION_0"],"mappings":"wDAEA,EAAA,EAAA,CAAA,CAAA,OAEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OCP8M,EAAA,EAAA,CAAA,CAAA,MAAsG,IAAMA,EAAmC,CAAA,EAAA,EAAA,iBAAb,IAAa,AAAqB,EAAC,KAAxB,wCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,wBDSnc,IAAA,EAAA,EAAA,CAAA,CAAA,2BAUO,SAAS,AAAW,MAAE,CAAI,WAAE,CAAS,SAAE,CAAO,CAA0D,EAC7G,GAAM,CAAC,EAAO,EAAW,CAAG,CAAA,EAAA,EAAA,cAAA,AAAc,EAAC,EAAsB,EAAA,CAAI,EACrE,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAW,CAAA,EAAG,EAAA,CAAI,CAAC,WAAW,CAAC,CAAE,cAAY,mCACpD,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,UAAU,+DAAqD,uBAC5C,EAAO,KAAO,MAAM,IAAE,EAAO,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAW,CAAA,CAAC,KAAK,KAAK,MAAM,OAAU,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAW,CAAA,CAAC,KAAK,QAAQ,MAAM,WAE3H,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,iCACV,EAAO,wFAA0F,+FAEpF,gBAAf,EAAM,IAAI,CACT,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,OAAQ,EAAY,KAAK,QAAQ,UAAU,sHAC/C,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,yBAAgB,iBAC9B,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,UAAG,EAAM,OAAO,GACjB,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,KAAK,SAAS,KAAM,EAAA,CAAW,CAAE,MAAO,IAC/C,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,KAAK,SAAS,KAAK,OAAO,MAAM,SACvC,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,KAAK,SAAS,KAAK,yBAAyB,MAAM,SACzD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uBACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,CAAA,CAAC,KAAK,cAAc,QAAQ,cAAc,OAAO,0CAAiC,mBAG/F,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAW,EAAA,CAAO,CAAC,SAAS,CAAE,KAAK,YAAG,mBAK3C,EACF,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,OAAQ,YACZ,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,KAAK,SAAS,KAAM,EAAA,CAAW,CAAE,MAAO,IAC/C,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,KAAK,SAAS,KAAK,OAAO,MAAO,OAAO,CAAC,KAChD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,CAAA,CAAC,KAAM,EAAO,YAAc,UAAW,QAAS,EAAO,eAAiB,cAAe,OAAO,gCACxG,EAAO,WAAa,eAIzB,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAE,UAAU,kCAAwB,gCA1CrB,gBA0CmE,OAErE,gBAAf,EAAM,IAAI,CAAqB,KAAO,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAO,CAAA,CAAC,MAAO,MAG7D"}
1
+ {"version":3,"sources":["../../../../../web/features/outside-parties/ui/switch-card.tsx","../../../../../web/features/outside-parties/data%3A5b609b%20%3Ctext/javascript%3E"],"sourcesContent":["'use client';\n\nimport { useActionState } from 'react';\n\nimport { FLEET_FIELD, IDLE } from '../../forms/form-state';\nimport { BUTTONS, CARD } from '../../forms/ui/look';\nimport { Outcome } from '../../forms/ui/outcome';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport { switchOutsideParties } from '../actions';\nimport { StatusBadge } from './status-badge';\n\n/** The scope that turns outside parties on or off (0056). */\nconst SWITCHING_SCOPE = 'fleet:network';\n\n/**\n * Whether the fleet's outside parties are on, and the switch for an account\n * holding fleet:network. An open network's warning asks to confirm, or to\n * keep them off.\n */\nexport function SwitchCard({ isOn, canSwitch, fleetId }: { isOn: boolean; canSwitch: boolean; fleetId: string }) {\n const [state, formAction] = useActionState(switchOutsideParties, IDLE);\n return (\n <section className={`${CARD} grid gap-3`} data-testid=\"outside-parties-switch\">\n <h2 className=\"flex items-center gap-2 text-section font-semibold\">\n Outside parties are {isOn ? 'on' : 'off'} {isOn ? <StatusBadge tone=\"ok\" label=\"On\" /> : <StatusBadge tone=\"ended\" label=\"Off\" />}\n </h2>\n <p className=\"text-muted-foreground\">\n {isOn ? 'Approved outside MCP servers and clients reach the fleet, as its network rules allow.' : 'No outside MCP server or client reaches the fleet, and no request for one can be approved.'}\n </p>\n {state.kind === 'openNetwork' ? (\n <form action={formAction} role=\"alert\" className=\"grid gap-3 rounded-md border border-tone-attention-border bg-tone-attention-bg p-4 text-tone-attention-fg\">\n <h3 className=\"font-semibold\">Open network</h3>\n <p>{state.message}</p>\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <input type=\"hidden\" name=\"isOn\" value=\"true\" />\n <input type=\"hidden\" name=\"isOpenNetworkConfirmed\" value=\"true\" />\n <div className=\"flex gap-2\">\n <SubmitButton kind=\"destructive\" pending=\"Turning on…\" testId=\"outside-parties-turn-on-anyway\">\n Turn on anyway\n </SubmitButton>\n <a className={BUTTONS.secondary} href=\"\">\n Keep off\n </a>\n </div>\n </form>\n ) : canSwitch ? (\n <form action={formAction}>\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <input type=\"hidden\" name=\"isOn\" value={String(!isOn)} />\n <SubmitButton kind={isOn ? 'secondary' : 'primary'} pending={isOn ? 'Turning off…' : 'Turning on…'} testId=\"outside-parties-turn\">\n {isOn ? 'Turn off' : 'Turn on'}\n </SubmitButton>\n </form>\n ) : (\n <p className=\"text-muted-foreground\">Turning them on or off needs {SWITCHING_SCOPE}.</p>\n )}\n {state.kind === 'openNetwork' ? null : <Outcome state={state} />}\n </section>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"601569a05001fe6b6107005126588e652707d2e845\":{\"name\":\"switchOutsideParties\"}},\"web/features/outside-parties/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(\"601569a05001fe6b6107005126588e652707d2e845\",callServer,void 0,findSourceMapURL,\"switchOutsideParties\");export{$$RSC_SERVER_ACTION_0 as switchOutsideParties};"],"names":["$$RSC_SERVER_ACTION_0"],"mappings":"wDAEA,EAAA,EAAA,CAAA,CAAA,OAEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OCP8M,EAAA,EAAA,CAAA,CAAA,MAAsG,IAAMA,EAAmC,CAAA,EAAA,EAAA,iBAAb,IAAa,AAAqB,EAAC,KAAxB,wCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,wBDSnc,IAAA,EAAA,EAAA,CAAA,CAAA,2BAUO,SAAS,AAAW,MAAE,CAAI,WAAE,CAAS,SAAE,CAAO,CAA0D,EAC7G,GAAM,CAAC,EAAO,EAAW,CAAG,CAAA,EAAA,EAAA,cAAA,AAAc,EAAC,EAAsB,EAAA,CAAI,EACrE,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAW,CAAA,EAAG,EAAA,CAAI,CAAC,WAAW,CAAC,CAAE,cAAY,mCACpD,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,UAAU,+DAAqD,uBAC5C,EAAO,KAAO,MAAM,IAAE,EAAO,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAW,CAAA,CAAC,KAAK,KAAK,MAAM,OAAU,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAW,CAAA,CAAC,KAAK,QAAQ,MAAM,WAE3H,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,iCACV,EAAO,wFAA0F,+FAEpF,gBAAf,EAAM,IAAI,CACT,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,OAAQ,EAAY,KAAK,QAAQ,UAAU,sHAC/C,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,yBAAgB,iBAC9B,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,UAAG,EAAM,OAAO,GACjB,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,KAAK,SAAS,KAAM,EAAA,CAAW,CAAE,MAAO,IAC/C,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,KAAK,SAAS,KAAK,OAAO,MAAM,SACvC,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,KAAK,SAAS,KAAK,yBAAyB,MAAM,SACzD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uBACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,CAAA,CAAC,KAAK,cAAc,QAAQ,cAAc,OAAO,0CAAiC,mBAG/F,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAW,EAAA,CAAO,CAAC,SAAS,CAAE,KAAK,YAAG,mBAK3C,EACF,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,OAAQ,YACZ,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,KAAK,SAAS,KAAM,EAAA,CAAW,CAAE,MAAO,IAC/C,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,KAAK,SAAS,KAAK,OAAO,MAAO,OAAO,CAAC,KAChD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,CAAA,CAAC,KAAM,EAAO,YAAc,UAAW,QAAS,EAAO,eAAiB,cAAe,OAAO,gCACxG,EAAO,WAAa,eAIzB,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAE,UAAU,kCAAwB,gCA1CrB,gBA0CmE,OAErE,gBAAf,EAAM,IAAI,CAAqB,KAAO,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAO,CAAA,CAAC,MAAO,MAG7D"}
@@ -0,0 +1,3 @@
1
+ (()=>{"use strict";module.exports=[69717,a=>{let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call AgentNeeds() from the server but AgentNeeds is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/web/features/outside-party/tools-table/ui/agent-needs.tsx","AgentNeeds");a.s(["AgentNeeds",0,b])},4741,a=>{var b=a.i(69717);a.n(b)},64256,a=>{let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call ToolsTable() from the server but ToolsTable is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/web/features/outside-party/tools-table/ui/tools-table.tsx","ToolsTable");a.s(["ToolsTable",0,b])},46736,a=>{var b=a.i(64256);a.n(b)},9181,a=>{var b=a.i(7997),c=a.i(717),d=a.i(55476),e=a.i(66283),f=a.i(29493),g=a.i(49144),h=a.i(65253),i=a.i(72913),j=a.i(1130),k=a.i(98323),l=a.i(4741),m=a.i(46736);async function n({api:a,name:b}){let c=await (0,e.F)(a.parties.approving.query({name:b})),d=c.isOk&&c.value.isApproving,f=d?await (0,e.F)(a.parties.listedScopes.query()):void 0;return{canChange:d&&f?.isOk===!0,listed:f?.isOk===!0?f.value.scopes:null,reason:c.isOk?c.value.isApproving?f?.isOk===!1?f.refusal:null:c.value.reason:c.refusal}}async function o({api:a,fleetId:c,name:d,isApprover:f}){let[g,h,i]=await Promise.all([(0,e.F)(a.parties.tools.query({name:d})),(0,e.F)(a.parties.scopeRequirements.query({name:d})),f?n({api:a,name:d}):{canChange:!1,listed:null,reason:null}]);return h.isOk?(0,b.jsxs)("div",{className:"grid gap-3",children:[null===i.reason?null:(0,b.jsxs)("p",{className:"text-muted-foreground","data-testid":"tools-table-read-only-reason",children:["You see these read-only: ",i.reason]}),(0,b.jsx)(m.ToolsTable,{fleetId:c,party:d,tools:function({read:a,requirements:b}){let c=new Map(b.tools.map(({tool:a,scopes:b})=>[a,b]));return a.isOk?a.value.tools.map(a=>({...a,scopes:c.get(a.name)??[]})):b.tools.map(({tool:a,scopes:b})=>({name:a,isOn:null,isNew:!1,scopes:b}))}({read:g,requirements:h.value}),version:h.value.version,partyScopes:h.value.party,listed:i.listed,canChange:i.canChange,serverRefusal:g.isOk?null:g.refusal})]}):(0,b.jsx)("p",{className:"text-muted-foreground",children:h.refusal})}function p({party:a}){return(0,b.jsxs)("div",{"aria-busy":"true","aria-label":`Reading the tools ${a} lists`,className:"grid gap-2","data-testid":"tools-table-skeleton",children:[(0,b.jsx)("span",{className:"block h-9 w-full animate-pulse rounded-md bg-muted"}),Array.from({length:8},(a,c)=>(0,b.jsx)("span",{className:"block h-10 animate-pulse rounded-md bg-muted"},c))]})}var q=a.i(35670);let r="fleet:owner",s="scopes:grant",t="gateway:approve";function u({fleetId:a}){return(0,b.jsx)("a",{href:(0,d.i)(i.$,a),className:"text-muted-foreground hover:text-foreground",children:"← Outside parties"})}function v({children:a}){return(0,b.jsx)("p",{role:"alert",className:"rounded-md border border-tone-attention-border bg-tone-attention-bg px-3 py-2 text-tone-attention-fg",children:a})}let w={mcpServer:"Address",mcpClient:"Client id",a2aClient:"Address",a2aAgent:"Card address"},x=(0,b.jsx)("span",{className:"text-muted-foreground",children:"Not known"});function y({label:a,children:c}){return(0,b.jsxs)("div",{className:"grid gap-1 sm:grid-cols-[10rem_1fr]",children:[(0,b.jsx)("dt",{className:"text-muted-foreground",children:a}),(0,b.jsx)("dd",{className:"flex flex-wrap items-center gap-2",children:c})]})}function z({party:a}){let{protocol:c,side:d}=h.G[a.kind],e=h.Y[a.state];return(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,b.jsx)("h1",{className:"text-title font-semibold",children:a.name}),(0,b.jsx)(k.E,{children:c}),(0,b.jsx)(k.E,{children:h.N[d].one}),(0,b.jsx)(k.T,{tone:e.tone,label:e.label})]})}async function A({page:a,name:m}){let{api:B,fleetId:C,scopes:D}=a,E=await (0,e.F)(B.parties.get.query({name:m}));if(!E.isOk)return(0,b.jsxs)("div",{className:"grid gap-4",children:[(0,b.jsx)(u,{fleetId:C}),(0,b.jsx)(v,{children:E.refusal})]});let F=E.value,G=(0,h.M)(F),H=D.includes(t),[I,J]=await Promise.all(["a2aClient"===F.kind?(0,e.F)(B.parties.cardAddresses.query({name:m})):void 0,"a2aAgent"===F.kind?Promise.all([(0,e.F)(B.parties.scopeRequirements.query({name:m})),H?n({api:B,name:m}):{canChange:!1,listed:null,reason:null}]):void 0]),K=(0,b.jsx)("a",{href:(0,d.i)((0,i.N)(F.name,"change"),C),className:"text-primary hover:underline","data-testid":"outside-party-change",children:"Change"});return(0,b.jsxs)("div",{className:"grid gap-4",children:[(0,b.jsx)(u,{fleetId:C}),(0,b.jsx)(z,{party:F}),(0,b.jsxs)("dl",{className:`${g.r} grid gap-3`,children:[(0,b.jsx)(y,{label:"Proxy ship",children:F.proxyShipName??x}),(0,b.jsxs)(y,{label:"Owner",children:[F.ownerName??x,D.includes(r)?K:null]}),(0,b.jsxs)(y,{label:"Scopes",children:[null===F.scopes?x:F.scopes.map(a=>{let c;return(0,b.jsx)(k.E,{children:(c=j.K.safeParse(a)).success?j.q[c.data]:a},a)}),D.includes(s)?K:null]}),"mcpServer"===F.kind||"a2aAgent"===F.kind?(0,b.jsx)(y,{label:"Credential",children:f.x.find(({kind:a})=>a===F.credentialKind)?.label}):null,null===G?null:(0,b.jsx)(y,{label:w[F.kind],children:(0,b.jsx)("span",{className:"font-mono",children:G})}),"a2aAgent"===F.kind?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(y,{label:"Messages at once",children:F.concurrencyLimit}),(0,b.jsx)(y,{label:"Needs",children:void 0===J?null:J[0].isOk?(0,b.jsx)(l.AgentNeeds,{fleetId:C,party:F.name,version:J[0].value.version,scopes:J[0].value.party,listed:J[1].listed,canChange:J[1].canChange}):(0,b.jsx)("span",{className:"text-muted-foreground",children:J[0].refusal})}),(0,b.jsx)(y,{label:"Repeatable",children:D.includes(t)?(0,b.jsx)(q.RepeatableSwitch,{fleetId:C,party:F.name,isRepeatable:F.isRepeatable}):(0,b.jsx)(k.E,{children:F.isRepeatable?"Repeatable":"Not repeatable"})})]}):null]}),"mcpServer"===F.kind?(0,b.jsxs)("section",{className:`${g.r} grid gap-3`,"data-testid":"outside-party-tools",children:[(0,b.jsx)("h2",{className:"text-section font-semibold",children:"Tools"}),(0,b.jsxs)("p",{className:"text-muted-foreground",children:["The fleet may call only the tools switched on, and a calling ship must hold every scope a tool needs; every ship that may reach ",F.name," reaches the same tools. ",H?null:"Changing them needs gateway:approve."]}),(0,b.jsx)(c.Suspense,{fallback:(0,b.jsx)(p,{party:F.name}),children:(0,b.jsx)(o,{api:B,fleetId:C,name:F.name,isApprover:H})})]}):null,void 0===I?null:(0,b.jsxs)("section",{className:`${g.r} grid gap-2`,"data-testid":"outside-party-cards",children:[(0,b.jsxs)("h2",{className:"flex justify-between text-section font-semibold",children:[(0,b.jsx)("span",{children:"Card addresses"}),I.isOk?(0,b.jsx)("span",{children:I.value.addresses.length}):null]}),(0,b.jsx)("p",{className:"text-muted-foreground",children:"One per ship its proxy ship reaches now. Its owner hands them to the client."}),I.isOk?0===I.value.addresses.length?(0,b.jsx)("p",{className:"text-muted-foreground",children:"It reaches no ship now."}):(0,b.jsx)("ul",{className:"grid gap-1",children:I.value.addresses.map(a=>(0,b.jsx)("li",{className:"break-all font-mono text-code",children:a},a))}):(0,b.jsx)("p",{className:"text-muted-foreground",children:I.refusal})]}),D.includes("fleet:manage")?(0,b.jsx)("div",{children:(0,b.jsxs)("a",{className:g.x.secondary,href:(0,d.i)((0,i.N)(F.name,"retire"),C),"data-testid":"outside-party-retire",children:["Retire ",F.name,"…"]})}):null]})}a.s(["N",0,t,"W",0,u,"p",0,s,"J",0,r,"b",0,A,"y",0,v],9181)},56786,a=>{let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call RepeatableSwitch() from the server but RepeatableSwitch is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/web/features/outside-party/ui/repeatable-switch.tsx","RepeatableSwitch");a.s(["RepeatableSwitch",0,b])},35670,a=>{var b=a.i(56786);a.n(b)}]})();
2
+
3
+ //# sourceMappingURL=web_features_outside-party_0_9c27knfvw7u._.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../web/features/outside-party/tools-table/ui/agent-needs.tsx/__nextjs-internal-proxy.mjs%20%7B%20server%20%3D%3E%20%22%5Bproject%5D/web/features/outside-party/tools-table/ui/agent-needs.tsx%22%20%7D","../../../../../web/features/outside-party/tools-table/ui/tools-table.tsx/__nextjs-internal-proxy.mjs%20%7B%20server%20%3D%3E%20%22%5Bproject%5D/web/features/outside-party/tools-table/ui/tools-table.tsx%22%20%7D","../../../../../web/features/outside-party/ui/outside-party.tsx","../../../../../web/features/outside-parties/scope-words.ts","../../../../../web/features/outside-party/tools-table/table-tools.ts","../../../../../web/features/outside-party/tools-table/ui/tools-section.tsx","../../../../../web/features/outside-party/tools-table/ui/tools-skeleton.tsx","../../../../../web/features/outside-party/ui/repeatable-switch.tsx/__nextjs-internal-proxy.mjs%20%7B%20server%20%3D%3E%20%22%5Bproject%5D/web/features/outside-party/ui/repeatable-switch.tsx%22%20%7D"],"sourcesContent":["// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport const AgentNeeds = registerClientReference(\n function() { throw new Error(\"Attempted to call AgentNeeds() from the server but AgentNeeds is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/web/features/outside-party/tools-table/ui/agent-needs.tsx\",\n \"AgentNeeds\",\n);\n","// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport const ToolsTable = registerClientReference(\n function() { throw new Error(\"Attempted to call ToolsTable() from the server but ToolsTable is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/web/features/outside-party/tools-table/ui/tools-table.tsx\",\n \"ToolsTable\",\n);\n","import { Suspense, type ReactNode } from 'react';\n\nimport { inFleet } from '../../../lib/gateway-api/page-account';\nimport { readOf, type SignedInPage } from '../../../lib/gateway-api/page-api';\nimport { CREDENTIAL_KINDS } from '../../forms/server-credential';\nimport { BUTTONS, CARD } from '../../forms/ui/look';\nimport { outsideAddressOf, PARTY_KINDS, PARTY_STATES, SIDES, type ListedParty } from '../../outside-parties/party-kinds';\nimport { OUTSIDE_PARTIES_PATH, partyPath } from '../../outside-parties/paths';\nimport { scopeWords } from '../../outside-parties/scope-words';\nimport { StatusBadge, Tag } from '../../outside-parties/ui/status-badge';\nimport { AgentNeeds } from '../tools-table/ui/agent-needs';\nimport { approvalOf, ToolsSection } from '../tools-table/ui/tools-section';\nimport { ToolsSkeleton } from '../tools-table/ui/tools-skeleton';\nimport { RepeatableSwitch } from './repeatable-switch';\n\n/** The scopes that change a party's owner, its scopes, and retire it (0056). */\nexport const OWNING_SCOPE = 'fleet:owner';\nexport const GRANTING_SCOPE = 'scopes:grant';\nexport const RETIRING_SCOPE = 'fleet:manage';\n\n/** The scope that switches a server's tools (aeolus-fleet#1151) and marks an A2A agent (A9). */\nexport const APPROVING_SCOPE = 'gateway:approve';\n\n/** The way back to the list, in the page's fleet. */\nexport function Back({ fleetId }: { fleetId: string }) {\n return (\n <a href={inFleet(OUTSIDE_PARTIES_PATH, fleetId)} className=\"text-muted-foreground hover:text-foreground\">\n ← Outside parties\n </a>\n );\n}\n\n/** Why the API refused: said in place of the page. */\nexport function Refusal({ children }: { children: ReactNode }) {\n return (\n <p role=\"alert\" className=\"rounded-md border border-tone-attention-border bg-tone-attention-bg px-3 py-2 text-tone-attention-fg\">\n {children}\n </p>\n );\n}\n\n/** What a party's outside address is called on its page. */\nconst ADDRESS_LABELS: Record<ListedParty['kind'], string> = { mcpServer: 'Address', mcpClient: 'Client id', a2aClient: 'Address', a2aAgent: 'Card address' };\n\nconst UNKNOWN = <span className=\"text-muted-foreground\">Not known</span>;\n\nfunction Fact({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div className=\"grid gap-1 sm:grid-cols-[10rem_1fr]\">\n <dt className=\"text-muted-foreground\">{label}</dt>\n <dd className=\"flex flex-wrap items-center gap-2\">{children}</dd>\n </div>\n );\n}\n\n/** The party's head: its name, protocol, side and state. */\nexport function PartyHead({ party }: { party: ListedParty }) {\n const { protocol, side } = PARTY_KINDS[party.kind];\n const state = PARTY_STATES[party.state];\n return (\n <div className=\"flex flex-wrap items-center gap-2\">\n <h1 className=\"text-title font-semibold\">{party.name}</h1>\n <Tag>{protocol}</Tag>\n <Tag>{SIDES[side].one}</Tag>\n <StatusBadge tone={state.tone} label={state.label} />\n </div>\n );\n}\n\n/**\n * One outside party (design B, screens 12 and 14): its proxy ship's state,\n * then its facts as the fleet holds them, and for an MCP server the tools\n * it lists now as a table, with the switch and the scopes each needs\n * (aeolus-fleet#1151, gateway scopes 4.3); for an A2A agent the scopes it\n * needs and its repeatable mark, a switch for an approver (A9). Each control shows only to an account holding\n * its scope; the API checks it again.\n */\nexport async function OutsideParty({ page, name }: { page: SignedInPage; name: string }) {\n const { api, fleetId, scopes } = page;\n const read = await readOf(api.parties.get.query({ name }));\n if (!read.isOk) {\n return (\n <div className=\"grid gap-4\">\n <Back fleetId={fleetId} />\n <Refusal>{read.refusal}</Refusal>\n </div>\n );\n }\n const party = read.value;\n const address = outsideAddressOf(party);\n const isApprover = scopes.includes(APPROVING_SCOPE);\n const [cards, agentNeeds] = await Promise.all([\n party.kind === 'a2aClient' ? readOf(api.parties.cardAddresses.query({ name })) : undefined,\n party.kind === 'a2aAgent' ? Promise.all([readOf(api.parties.scopeRequirements.query({ name })), isApprover ? approvalOf({ api, name }) : { canChange: false, listed: null, reason: null }]) : undefined,\n ]);\n const change = (\n <a href={inFleet(partyPath(party.name, 'change'), fleetId)} className=\"text-primary hover:underline\" data-testid=\"outside-party-change\">\n Change\n </a>\n );\n return (\n <div className=\"grid gap-4\">\n <Back fleetId={fleetId} />\n <PartyHead party={party} />\n <dl className={`${CARD} grid gap-3`}>\n <Fact label=\"Proxy ship\">{party.proxyShipName ?? UNKNOWN}</Fact>\n <Fact label=\"Owner\">\n {party.ownerName ?? UNKNOWN}\n {scopes.includes(OWNING_SCOPE) ? change : null}\n </Fact>\n <Fact label=\"Scopes\">\n {party.scopes === null\n ? UNKNOWN\n : party.scopes.map((scope) => <Tag key={scope}>{scopeWords(scope)}</Tag>)}\n {scopes.includes(GRANTING_SCOPE) ? change : null}\n </Fact>\n {party.kind === 'mcpServer' || party.kind === 'a2aAgent' ? <Fact label=\"Credential\">{CREDENTIAL_KINDS.find(({ kind }) => kind === party.credentialKind)?.label}</Fact> : null}\n {address === null ? null : (\n <Fact label={ADDRESS_LABELS[party.kind]}>\n <span className=\"font-mono\">{address}</span>\n </Fact>\n )}\n {party.kind === 'a2aAgent' ? (\n <>\n <Fact label=\"Messages at once\">{party.concurrencyLimit}</Fact>\n <Fact label=\"Needs\">\n {agentNeeds === undefined ? null : agentNeeds[0].isOk ? (\n <AgentNeeds fleetId={fleetId} party={party.name} version={agentNeeds[0].value.version} scopes={agentNeeds[0].value.party} listed={agentNeeds[1].listed} canChange={agentNeeds[1].canChange} />\n ) : (\n <span className=\"text-muted-foreground\">{agentNeeds[0].refusal}</span>\n )}\n </Fact>\n <Fact label=\"Repeatable\">\n {scopes.includes(APPROVING_SCOPE) ? <RepeatableSwitch fleetId={fleetId} party={party.name} isRepeatable={party.isRepeatable} /> : <Tag>{party.isRepeatable ? 'Repeatable' : 'Not repeatable'}</Tag>}\n </Fact>\n </>\n ) : null}\n </dl>\n {party.kind === 'mcpServer' ? (\n <section className={`${CARD} grid gap-3`} data-testid=\"outside-party-tools\">\n <h2 className=\"text-section font-semibold\">Tools</h2>\n <p className=\"text-muted-foreground\">\n The fleet may call only the tools switched on, and a calling ship must hold every scope a tool needs; every ship that may reach {party.name} reaches the same tools. {isApprover ? null : 'Changing them needs gateway:approve.'}\n </p>\n <Suspense fallback={<ToolsSkeleton party={party.name} />}>\n <ToolsSection api={api} fleetId={fleetId} name={party.name} isApprover={isApprover} />\n </Suspense>\n </section>\n ) : null}\n {cards === undefined ? null : (\n <section className={`${CARD} grid gap-2`} data-testid=\"outside-party-cards\">\n <h2 className=\"flex justify-between text-section font-semibold\">\n <span>Card addresses</span>\n {cards.isOk ? <span>{cards.value.addresses.length}</span> : null}\n </h2>\n <p className=\"text-muted-foreground\">One per ship its proxy ship reaches now. Its owner hands them to the client.</p>\n {!cards.isOk ? (\n <p className=\"text-muted-foreground\">{cards.refusal}</p>\n ) : cards.value.addresses.length === 0 ? (\n <p className=\"text-muted-foreground\">It reaches no ship now.</p>\n ) : (\n <ul className=\"grid gap-1\">\n {cards.value.addresses.map((address) => (\n <li key={address} className=\"break-all font-mono text-code\">\n {address}\n </li>\n ))}\n </ul>\n )}\n </section>\n )}\n {scopes.includes(RETIRING_SCOPE) ? (\n <div>\n <a className={BUTTONS.secondary} href={inFleet(partyPath(party.name, 'retire'), fleetId)} data-testid=\"outside-party-retire\">\n Retire {party.name}…\n </a>\n </div>\n ) : null}\n </div>\n );\n}\n","import { CORE_SCOPE_DESCRIPTIONS, scopeSchema } from '@aeolus-fleet/common';\n\n/** A scope in plain words: what a core scope allows, as the fleet words it (decision 0046); a plugin's scope by its name. */\nexport function scopeWords(scope: string): string {\n const core = scopeSchema.safeParse(scope);\n return core.success ? CORE_SCOPE_DESCRIPTIONS[core.data] : scope;\n}\n","/**\n * The rows of an outside MCP server's tools table (gateway scopes 4.3):\n * each tool the server lists now, with its switch, the hints it gives and\n * the scopes it needs of its own; and the filters an approver narrows them by.\n */\nimport type { Read } from '../../../lib/gateway-api/page-api';\n\n/** A tool as the server lists it now, with its switch, as the API answers it. */\nexport interface ListedTool {\n name: string;\n description?: string | undefined;\n isReadOnly?: boolean | undefined;\n isDestructive?: boolean | undefined;\n isOn: boolean;\n isNew: boolean;\n}\n\n/** A party's required scopes as the API answers them. */\nexport interface PartyRequirements {\n version: number;\n party: string[];\n tools: { tool: string; scopes: string[] }[];\n}\n\n/** One row: the tool, its switch (unknown while the server does not answer), and the scopes it needs of its own. */\nexport interface TableTool {\n name: string;\n description?: string | undefined;\n isReadOnly?: boolean | undefined;\n isDestructive?: boolean | undefined;\n isOn: boolean | null;\n isNew: boolean;\n scopes: readonly string[];\n}\n\n/**\n * The rows: every tool the server lists with what it needs; while the server\n * does not answer, the requirements kept per tool name, so they can still be\n * read and changed.\n */\nexport function tableToolsOf({ read, requirements }: { read: Read<{ tools: ListedTool[] }>; requirements: PartyRequirements }): TableTool[] {\n const own = new Map(requirements.tools.map(({ tool, scopes }) => [tool, scopes]));\n if (!read.isOk) {\n return requirements.tools.map(({ tool, scopes }) => ({ name: tool, isOn: null, isNew: false, scopes }));\n }\n return read.value.tools.map((tool) => ({ ...tool, scopes: own.get(tool.name) ?? [] }));\n}\n\n/** The table's state filter. */\nexport const STATE_FILTERS = [\n { state: 'all', label: 'All' },\n { state: 'on', label: 'On' },\n { state: 'off', label: 'Off' },\n { state: 'new', label: 'New' },\n { state: 'needsNothing', label: 'Needs nothing' },\n] as const;\n\nexport type StateFilter = (typeof STATE_FILTERS)[number]['state'];\n\nfunction isInState(tool: TableTool, { state, partyScopes }: { state: StateFilter; partyScopes: readonly string[] }): boolean {\n switch (state) {\n case 'all':\n return true;\n case 'on':\n return tool.isOn === true;\n case 'off':\n return tool.isOn === false;\n case 'new':\n return tool.isNew;\n case 'needsNothing':\n return partyScopes.length === 0 && tool.scopes.length === 0;\n }\n}\n\n/** The tools whose name holds the text, in any case, and that are in the state picked. */\nexport function shownTools(tools: readonly TableTool[], filter: { name: string; state: StateFilter; partyScopes: readonly string[] }): TableTool[] {\n const name = filter.name.trim().toLowerCase();\n return tools.filter((tool) => tool.name.toLowerCase().includes(name) && isInState(tool, filter));\n}\n\n/** What the page kept since it read the rows: each changed tool's own scopes, and each switched tool's switch. */\nexport interface KeptChanges {\n scopes: ReadonlyMap<string, readonly string[]>;\n switches: ReadonlyMap<string, boolean>;\n}\n\n/** The rows with what was kept since they were read, so a change shows at once rather than when the page reads the server again. */\nexport function keptToolsOf(tools: readonly TableTool[], kept: KeptChanges): TableTool[] {\n return tools.map((tool) => ({ ...tool, scopes: kept.scopes.get(tool.name) ?? tool.scopes, isOn: tool.isOn === null ? null : (kept.switches.get(tool.name) ?? tool.isOn) }));\n}\n","import type { GatewayApi } from '../../../../lib/gateway-api/gateway-api';\nimport { readOf } from '../../../../lib/gateway-api/page-api';\nimport { tableToolsOf } from '../table-tools';\nimport { ToolsTable } from './tools-table';\n\n/** Whether the actor approves the party, and the scopes the fleet lists when it does: what the controls need. */\nexport async function approvalOf({ api, name }: { api: GatewayApi; name: string }) {\n const approving = await readOf(api.parties.approving.query({ name }));\n const canChange = approving.isOk && approving.value.isApproving;\n const listed = canChange ? await readOf(api.parties.listedScopes.query()) : undefined;\n return {\n canChange: canChange && listed?.isOk === true,\n listed: listed?.isOk === true ? listed.value.scopes : null,\n /** Why the controls are not shown, when the actor holds gateway:approve but may not use them now. */\n reason: approving.isOk ? (approving.value.isApproving ? (listed?.isOk === false ? listed.refusal : null) : approving.value.reason) : approving.refusal,\n };\n}\n\n/**\n * An outside MCP server's tools section (gateway scopes 4.3): the tools the\n * server lists now, the scopes each needs, and whether the actor may change\n * them, read side by side. It streams in behind skeleton rows, as the\n * server's tools/list may take a while.\n */\nexport async function ToolsSection({ api, fleetId, name, isApprover }: { api: GatewayApi; fleetId: string; name: string; isApprover: boolean }) {\n const [read, requirements, approval] = await Promise.all([\n readOf(api.parties.tools.query({ name })),\n readOf(api.parties.scopeRequirements.query({ name })),\n isApprover ? approvalOf({ api, name }) : { canChange: false, listed: null, reason: null },\n ]);\n if (!requirements.isOk) {\n return <p className=\"text-muted-foreground\">{requirements.refusal}</p>;\n }\n return (\n <div className=\"grid gap-3\">\n {approval.reason === null ? null : (\n <p className=\"text-muted-foreground\" data-testid=\"tools-table-read-only-reason\">\n You see these read-only: {approval.reason}\n </p>\n )}\n <ToolsTable\n fleetId={fleetId}\n party={name}\n tools={tableToolsOf({ read, requirements: requirements.value })}\n version={requirements.value.version}\n partyScopes={requirements.value.party}\n listed={approval.listed}\n canChange={approval.canChange}\n serverRefusal={read.isOk ? null : read.refusal}\n />\n </div>\n );\n}\n","/** How many rows the table shows while the server's tools/list is read. */\nconst SKELETON_ROWS = 8;\n\n/** The tools table's shape while the server's tools/list is read (gateway scopes 4.3). */\nexport function ToolsSkeleton({ party }: { party: string }) {\n return (\n <div aria-busy=\"true\" aria-label={`Reading the tools ${party} lists`} className=\"grid gap-2\" data-testid=\"tools-table-skeleton\">\n <span className=\"block h-9 w-full animate-pulse rounded-md bg-muted\" />\n {Array.from({ length: SKELETON_ROWS }, (_, row) => (\n <span key={row} className=\"block h-10 animate-pulse rounded-md bg-muted\" />\n ))}\n </div>\n );\n}\n","// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport const RepeatableSwitch = registerClientReference(\n function() { throw new Error(\"Attempted to call RepeatableSwitch() from the server but RepeatableSwitch is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/web/features/outside-party/ui/repeatable-switch.tsx\",\n \"RepeatableSwitch\",\n);\n"],"names":["AgentNeeds","Error","ToolsTable","scopeWords","scope","core","safeParse","success","data","RepeatableSwitch"],"mappings":"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","ignoreList":[0,1,7]}
@@ -1,3 +1,3 @@
1
- module.exports=[94705,a=>{"use strict";var b=a.i(37936),c=a.i(18558);a.i(70396);var d=a.i(73727),e=a.i(55476),f=a.i(66283),g=a.i(1324),h=a.i(72913),i=a.i(18379),j=a.i(13095);let k="name";async function l(a,b){let c=(0,g.v)(b,g.H),j=(0,g.v)(b,k),l=await (0,f.z)(c);try{let[a,c]=await Promise.all([l.parties.get.query({name:j}),l.account.inView.query()]),d=(0,i.t)(a,{form:(0,g.O)(b),scopes:"signedIn"===c.kind?c.scopes:[]});if("refused"===d.kind)return d;void 0!==d.ownerShipId&&await l.parties.changeOwner.mutate({name:j,ownerShipId:d.ownerShipId}),(d.grant.length>0||d.revoke.length>0)&&await l.parties.changeScopes.mutate({name:j,grant:d.grant,revoke:d.revoke})}catch(a){return{kind:"refused",message:(0,f.s)(a)}}(0,d.redirect)((0,e.i)((0,h.N)(j),c))}async function m(a,b){let d=(0,g.v)(b,g.H),e=(0,g.v)(b,k),i=await (0,f.z)(d);try{let{tool:a,isOn:d,statementRefusal:f}=await i.parties.switchTool.mutate({name:e,tool:(0,g.v)(b,"tool"),isOn:"true"===(0,g.v)(b,"isOn")});return(0,c.revalidatePath)((0,h.N)(e)),{kind:"switched",isOn:d,message:function({tool:a,isOn:b,statementRefusal:c}){let d=`${a} is ${b?"on":"off"}`;return null!==c?`${d}; the fleet sees it at the proxy ship's next statement: ${c}`:b?`${d}: the fleet may call it.`:`${d}: the fleet sees it no more, and a call to it is refused.`}({tool:a,isOn:d,statementRefusal:f})}}catch(a){return{kind:"refused",message:(0,f.s)(a)}}}async function n(a,b){let d=(0,g.v)(b,g.H),e=(0,g.v)(b,k),i=await (0,f.z)(d);try{let{isRepeatable:a,statementRefusal:d}=await i.parties.markA2aAgent.mutate({name:e,isRepeatable:"true"===(0,g.v)(b,"isRepeatable")});return(0,c.revalidatePath)((0,h.N)(e)),{kind:"marked",isRepeatable:a,message:function({name:a,isRepeatable:b,statementRefusal:c}){let d=`${a} is ${b?"repeatable":"not repeatable"}`;return null!==c?`${d}; the fleet sees it at the proxy ship's next statement: ${c}`:b?`${d}: a message that died before it confirmed it is handed again.`:`${d}: a message that died before it confirmed it is not handed again, as it may have run.`}({name:e,isRepeatable:a,statementRefusal:d})}}catch(a){return{kind:"refused",message:(0,f.s)(a)}}}async function o(a,b){let c=(0,g.v)(b,g.H),i=await (0,f.z)(c);try{await i.parties.retire.mutate({name:(0,g.v)(b,k)})}catch(a){return{kind:"refused",message:(0,f.s)(a)}}(0,d.redirect)((0,e.i)(h.$,c))}(0,j.ensureServerEntryExports)([l,m,n,o]),(0,b.registerServerReference)(l,"60203ae0831583bb989b90f838af8ad09ce21f97c3",null),(0,b.registerServerReference)(m,"60a68d36449bc53cbd6e751425ac86bfa7a302a8bf",null),(0,b.registerServerReference)(n,"6006cd6ed5454b8c34c176236313db65f23f52094d",null),(0,b.registerServerReference)(o,"607a9bab4971285771a37307805823b3418205ff2e",null),a.s(["v",0,l,"o",0,n,"t",0,o,"z",0,m],94705)}];
1
+ module.exports=[94705,a=>{"use strict";var b=a.i(37936),c=a.i(18558);a.i(70396);var d=a.i(73727),e=a.i(55476),f=a.i(66283),g=a.i(1324),h=a.i(72913),i=a.i(18379),j=a.i(13095);let k="name";async function l(a,b){let c=(0,g.v)(b,g.H),j=(0,g.v)(b,k),l=await (0,f.z)(c);try{let[a,c]=await Promise.all([l.parties.get.query({name:j}),l.account.inView.query()]),d=(0,i.t)(a,{form:(0,g.O)(b),scopes:"signedIn"===c.kind?c.scopes:[]});if("refused"===d.kind)return d;void 0!==d.ownerShipId&&await l.parties.changeOwner.mutate({name:j,ownerShipId:d.ownerShipId}),(d.grant.length>0||d.revoke.length>0)&&await l.parties.changeScopes.mutate({name:j,grant:d.grant,revoke:d.revoke})}catch(a){return{kind:"refused",message:(0,f.s)(a)}}(0,d.redirect)((0,e.i)((0,h.N)(j),c))}function m(a){return{isOk:!1,message:(0,f.s)(a),isConflict:"CONFLICT"===(0,f.U)(a)}}async function n(a){let{fleetId:b,...d}=a,e=await (0,f.z)(b);try{let{version:a,statementRefusal:b}=await e.parties.setScopeRequirements.mutate(d);return(0,c.revalidatePath)((0,h.N)(d.name)),{isOk:!0,version:a,statementRefusal:b}}catch(a){return m(a)}}async function o(a){let{fleetId:b,...d}=a,e=await (0,f.z)(b);try{let{statementRefusal:a}=await e.parties.switchTools.mutate(d);return(0,c.revalidatePath)((0,h.N)(d.name)),{isOk:!0,version:null,statementRefusal:a}}catch(a){return m(a)}}async function p(a,b){let d=(0,g.v)(b,g.H),e=(0,g.v)(b,k),i=await (0,f.z)(d);try{let{isRepeatable:a,statementRefusal:d}=await i.parties.markA2aAgent.mutate({name:e,isRepeatable:"true"===(0,g.v)(b,"isRepeatable")});return(0,c.revalidatePath)((0,h.N)(e)),{kind:"marked",isRepeatable:a,message:function({name:a,isRepeatable:b,statementRefusal:c}){let d=`${a} is ${b?"repeatable":"not repeatable"}`;return null!==c?`${d}; the fleet sees it at the proxy ship's next statement: ${c}`:b?`${d}: a message that died before it confirmed it is handed again.`:`${d}: a message that died before it confirmed it is not handed again, as it may have run.`}({name:e,isRepeatable:a,statementRefusal:d})}}catch(a){return{kind:"refused",message:(0,f.s)(a)}}}async function q(a,b){let c=(0,g.v)(b,g.H),i=await (0,f.z)(c);try{await i.parties.retire.mutate({name:(0,g.v)(b,k)})}catch(a){return{kind:"refused",message:(0,f.s)(a)}}(0,d.redirect)((0,e.i)(h.$,c))}(0,j.ensureServerEntryExports)([l,n,o,p,q]),(0,b.registerServerReference)(l,"60236285483fb22611472dbe9ff187e4a99a67ebbd",null),(0,b.registerServerReference)(n,"401796a2b6f48cc59cc275e9fde4500326e4b698bb",null),(0,b.registerServerReference)(o,"40313bb6a73ff4c6cf9db1dc6010fd9dd332869a43",null),(0,b.registerServerReference)(p,"60d56d8b2d1a1bab18d5726426f7a6b24ec307b83c",null),(0,b.registerServerReference)(q,"607b96d6845b63d3a53b168f480d1bfafd2f194a84",null),a.s(["v",0,l,"o",0,p,"t",0,q,"L",0,n,"M",0,o],94705)}];
2
2
 
3
3
  //# sourceMappingURL=web_features_outside-party_actions_ts_102ar5pdowf8s._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../web/features/outside-party/actions.ts","../../../../../web/features/outside-party/marked-message.ts","../../../../../web/features/outside-party/switched-message.ts"],"sourcesContent":["'use server';\n\n/**\n * One outside party's forms, as the account signed in (decision 0056):\n * changing its owner and scopes, switching a server's tools, marking an\n * A2A agent repeatable or not, and retiring it. Each asks the API, which\n * checks the account's scopes; a refusal is said on the form.\n */\nimport { revalidatePath } from 'next/cache';\nimport { redirect } from 'next/navigation';\n\nimport { inFleet } from '../../lib/gateway-api/page-account';\nimport { refusalMessageOf, requestApi } from '../../lib/gateway-api/page-api';\nimport { FLEET_FIELD, fieldOf, fieldsOf, type FormState } from '../forms/form-state';\nimport { OUTSIDE_PARTIES_PATH, partyPath } from '../outside-parties/paths';\nimport { changesOf } from './scope-changes';\nimport { markedMessageOf } from './marked-message';\nimport { switchedMessageOf } from './switched-message';\n\n/** The field a party's form names it by. */\nconst NAME_FIELD = 'name';\n\nexport async function changeParty(_previous: FormState, form: FormData): Promise<FormState> {\n const fleetId = fieldOf(form, FLEET_FIELD);\n const name = fieldOf(form, NAME_FIELD);\n const api = await requestApi(fleetId);\n try {\n const [party, account] = await Promise.all([api.parties.get.query({ name }), api.account.inView.query()]);\n const changes = changesOf(party, { form: fieldsOf(form), scopes: account.kind === 'signedIn' ? account.scopes : [] });\n if (changes.kind === 'refused') {\n return changes;\n }\n if (changes.ownerShipId !== undefined) {\n await api.parties.changeOwner.mutate({ name, ownerShipId: changes.ownerShipId });\n }\n if (changes.grant.length > 0 || changes.revoke.length > 0) {\n await api.parties.changeScopes.mutate({ name, grant: changes.grant, revoke: changes.revoke });\n }\n } catch (error) {\n return { kind: 'refused', message: refusalMessageOf(error) };\n }\n redirect(inFleet(partyPath(name), fleetId));\n}\n\n/** How one tool's switch ended: as it stands now and what the fleet sees, or why the API refused it. */\nexport type ToolSwitchState = { kind: 'idle' } | { kind: 'switched'; isOn: boolean; message: string } | { kind: 'refused'; message: string };\n\nexport async function switchPartyTool(_previous: ToolSwitchState, form: FormData): Promise<ToolSwitchState> {\n const fleetId = fieldOf(form, FLEET_FIELD);\n const name = fieldOf(form, NAME_FIELD);\n const api = await requestApi(fleetId);\n try {\n const { tool, isOn, statementRefusal } = await api.parties.switchTool.mutate({ name, tool: fieldOf(form, 'tool'), isOn: fieldOf(form, 'isOn') === 'true' });\n revalidatePath(partyPath(name));\n return { kind: 'switched', isOn, message: switchedMessageOf({ tool, isOn, statementRefusal }) };\n } catch (error) {\n return { kind: 'refused', message: refusalMessageOf(error) };\n }\n}\n\n/** How an A2A agent's repeatable mark ended: as it stands now and what it means, or why the API refused it. */\nexport type MarkState = { kind: 'idle' } | { kind: 'marked'; isRepeatable: boolean; message: string } | { kind: 'refused'; message: string };\n\nexport async function markA2aAgent(_previous: MarkState, form: FormData): Promise<MarkState> {\n const fleetId = fieldOf(form, FLEET_FIELD);\n const name = fieldOf(form, NAME_FIELD);\n const api = await requestApi(fleetId);\n try {\n const { isRepeatable, statementRefusal } = await api.parties.markA2aAgent.mutate({ name, isRepeatable: fieldOf(form, 'isRepeatable') === 'true' });\n revalidatePath(partyPath(name));\n return { kind: 'marked', isRepeatable, message: markedMessageOf({ name, isRepeatable, statementRefusal }) };\n } catch (error) {\n return { kind: 'refused', message: refusalMessageOf(error) };\n }\n}\n\nexport async function retireParty(_previous: FormState, form: FormData): Promise<FormState> {\n const fleetId = fieldOf(form, FLEET_FIELD);\n const api = await requestApi(fleetId);\n try {\n await api.parties.retire.mutate({ name: fieldOf(form, NAME_FIELD) });\n } catch (error) {\n return { kind: 'refused', message: refusalMessageOf(error) };\n }\n redirect(inFleet(OUTSIDE_PARTIES_PATH, fleetId));\n}\n","/** What an A2A agent's repeatable mark says once the API kept it (A9): what a message that died unconfirmed comes to, or that the proxy ship shows it at its next statement, and why. */\nexport function markedMessageOf({ name, isRepeatable, statementRefusal }: { name: string; isRepeatable: boolean; statementRefusal: string | null }): string {\n const state = `${name} is ${isRepeatable ? 'repeatable' : 'not repeatable'}`;\n if (statementRefusal !== null) {\n return `${state}; the fleet sees it at the proxy ship's next statement: ${statementRefusal}`;\n }\n return isRepeatable ? `${state}: a message that died before it confirmed it is handed again.` : `${state}: a message that died before it confirmed it is not handed again, as it may have run.`;\n}\n","/** What a tool's switch says once the API kept it: what the fleet sees now, or that the proxy ship shows it at its next statement, and why. */\nexport function switchedMessageOf({ tool, isOn, statementRefusal }: { tool: string; isOn: boolean; statementRefusal: string | null }): string {\n const state = `${tool} is ${isOn ? 'on' : 'off'}`;\n if (statementRefusal !== null) {\n return `${state}; the fleet sees it at the proxy ship's next statement: ${statementRefusal}`;\n }\n return isOn ? `${state}: the fleet may call it.` : `${state}: the fleet sees it no more, and a call to it is refused.`;\n}\n"],"names":["markedMessageOf","name","isRepeatable","statementRefusal","state"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../web/features/outside-party/actions.ts","../../../../../web/features/outside-party/marked-message.ts"],"sourcesContent":["'use server';\n\n/**\n * One outside party's forms, as the account signed in (decision 0056):\n * changing its owner and scopes, switching a server's tools and setting the\n * scopes a party needs, marking an A2A agent repeatable or not, and retiring it. Each asks the API, which\n * checks the account's scopes; a refusal is said on the form.\n */\nimport { revalidatePath } from 'next/cache';\nimport { redirect } from 'next/navigation';\n\nimport { inFleet } from '../../lib/gateway-api/page-account';\nimport { refusalCodeOf, refusalMessageOf, requestApi } from '../../lib/gateway-api/page-api';\nimport { FLEET_FIELD, fieldOf, fieldsOf, type FormState } from '../forms/form-state';\nimport { OUTSIDE_PARTIES_PATH, partyPath } from '../outside-parties/paths';\nimport { changesOf } from './scope-changes';\nimport { markedMessageOf } from './marked-message';\n\n/** The field a party's form names it by. */\nconst NAME_FIELD = 'name';\n\nexport async function changeParty(_previous: FormState, form: FormData): Promise<FormState> {\n const fleetId = fieldOf(form, FLEET_FIELD);\n const name = fieldOf(form, NAME_FIELD);\n const api = await requestApi(fleetId);\n try {\n const [party, account] = await Promise.all([api.parties.get.query({ name }), api.account.inView.query()]);\n const changes = changesOf(party, { form: fieldsOf(form), scopes: account.kind === 'signedIn' ? account.scopes : [] });\n if (changes.kind === 'refused') {\n return changes;\n }\n if (changes.ownerShipId !== undefined) {\n await api.parties.changeOwner.mutate({ name, ownerShipId: changes.ownerShipId });\n }\n if (changes.grant.length > 0 || changes.revoke.length > 0) {\n await api.parties.changeScopes.mutate({ name, grant: changes.grant, revoke: changes.revoke });\n }\n } catch (error) {\n return { kind: 'refused', message: refusalMessageOf(error) };\n }\n redirect(inFleet(partyPath(name), fleetId));\n}\n\n/** How a change on a party's page ended (gateway scopes 4.3): kept, at the requirements' new version when it changed them, or refused with why, CONFLICT told apart for its Reload. */\nexport type TableOutcome = { isOk: true; version: number | null; statementRefusal: string | null } | { isOk: false; message: string; isConflict: boolean };\n\nfunction refusedOutcome(error: unknown): TableOutcome {\n return { isOk: false, message: refusalMessageOf(error), isConflict: refusalCodeOf(error) === 'CONFLICT' };\n}\n\n/** Sets the scopes a party needs, its own set when sent and each tool's sent, all at once on the version the page read. */\nexport async function setPartyScopes(change: { fleetId: string; name: string; version: number; party?: string[]; tools: { tool: string; scopes: string[] }[] }): Promise<TableOutcome> {\n const { fleetId, ...input } = change;\n const api = await requestApi(fleetId);\n try {\n const { version, statementRefusal } = await api.parties.setScopeRequirements.mutate(input);\n revalidatePath(partyPath(input.name));\n return { isOk: true, version, statementRefusal };\n } catch (error) {\n return refusedOutcome(error);\n }\n}\n\n/** Switches the tools selected on a server's page on or off, in one change. */\nexport async function switchPartyTools(change: { fleetId: string; name: string; tools: string[]; isOn: boolean }): Promise<TableOutcome> {\n const { fleetId, ...input } = change;\n const api = await requestApi(fleetId);\n try {\n const { statementRefusal } = await api.parties.switchTools.mutate(input);\n revalidatePath(partyPath(input.name));\n return { isOk: true, version: null, statementRefusal };\n } catch (error) {\n return refusedOutcome(error);\n }\n}\n\n/** How an A2A agent's repeatable mark ended: as it stands now and what it means, or why the API refused it. */\nexport type MarkState = { kind: 'idle' } | { kind: 'marked'; isRepeatable: boolean; message: string } | { kind: 'refused'; message: string };\n\nexport async function markA2aAgent(_previous: MarkState, form: FormData): Promise<MarkState> {\n const fleetId = fieldOf(form, FLEET_FIELD);\n const name = fieldOf(form, NAME_FIELD);\n const api = await requestApi(fleetId);\n try {\n const { isRepeatable, statementRefusal } = await api.parties.markA2aAgent.mutate({ name, isRepeatable: fieldOf(form, 'isRepeatable') === 'true' });\n revalidatePath(partyPath(name));\n return { kind: 'marked', isRepeatable, message: markedMessageOf({ name, isRepeatable, statementRefusal }) };\n } catch (error) {\n return { kind: 'refused', message: refusalMessageOf(error) };\n }\n}\n\nexport async function retireParty(_previous: FormState, form: FormData): Promise<FormState> {\n const fleetId = fieldOf(form, FLEET_FIELD);\n const api = await requestApi(fleetId);\n try {\n await api.parties.retire.mutate({ name: fieldOf(form, NAME_FIELD) });\n } catch (error) {\n return { kind: 'refused', message: refusalMessageOf(error) };\n }\n redirect(inFleet(OUTSIDE_PARTIES_PATH, fleetId));\n}\n","/** What an A2A agent's repeatable mark says once the API kept it (A9): what a message that died unconfirmed comes to, or that the proxy ship shows it at its next statement, and why. */\nexport function markedMessageOf({ name, isRepeatable, statementRefusal }: { name: string; isRepeatable: boolean; statementRefusal: string | null }): string {\n const state = `${name} is ${isRepeatable ? 'repeatable' : 'not repeatable'}`;\n if (statementRefusal !== null) {\n return `${state}; the fleet sees it at the proxy ship's next statement: ${statementRefusal}`;\n }\n return isRepeatable ? `${state}: a message that died before it confirmed it is handed again.` : `${state}: a message that died before it confirmed it is not handed again, as it may have run.`;\n}\n"],"names":["state","markedMessageOf","name","isRepeatable","statementRefusal"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ (()=>{"use strict";module.exports=[25964,a=>{var b=a.i(72131),c=a.i(50944);a.s(["LiveRefresh",0,function({fleetId:a}){let d;return d=(0,c.useRouter)(),(0,b.useEffect)(()=>{let b=new EventSource(`/overview/changes?fleet=${encodeURIComponent(a)}`);return b.onmessage=()=>{d.refresh()},()=>{b.close()}},[a,d]),(0,b.useEffect)(()=>{let b,c=()=>{let c="visible"===document.visibilityState&&document.hasFocus();c&&void 0===b?b=new EventSource(`/overview/focus?fleet=${encodeURIComponent(a)}`):c||void 0===b||(b.close(),b=void 0)};return c(),window.addEventListener("focus",c),window.addEventListener("blur",c),document.addEventListener("visibilitychange",c),()=>{window.removeEventListener("focus",c),window.removeEventListener("blur",c),document.removeEventListener("visibilitychange",c),b?.close()}},[a]),null}],25964)},1542,a=>{var b=a.i(87924);let c={primary:"bg-primary text-primary-foreground hover:bg-primary-hover",secondary:"border border-border bg-card text-card-foreground hover:bg-accent"};a.s(["f",0,function({isPending:a,pendingLabel:d,variant:e="secondary",children:f,className:g="",disabled:h,...i}){return(0,b.jsx)("button",{...i,disabled:!0===h||a,"aria-busy":a,className:`inline-flex h-9 items-center gap-2 rounded-md px-4 disabled:cursor-not-allowed disabled:opacity-70 ${c[e]} ${g}`,children:a?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{"aria-hidden":"true",className:"size-3.5 animate-spin rounded-full border-2 border-current border-t-transparent"}),d]}):f})}])},24229,a=>{var b=a.i(87924);a.s(["f",0,function({message:a,isFailure:c}){return c?(0,b.jsx)("p",{role:"alert","data-testid":"overview-failure",className:"rounded-md border border-tone-attention-border bg-tone-attention-bg px-3 py-2 text-tone-attention-fg",children:a}):(0,b.jsx)("p",{role:"status","data-testid":"overview-success",className:"rounded-md border border-tone-ok-border bg-tone-ok-bg px-3 py-2 text-tone-ok-fg",children:a})}])}]})();
2
+
3
+ //# sourceMappingURL=web_features_overview_0udx5lm8igils._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../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":["'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":["FOCUS_PATH","useFocusReport","fleetId","focus","report","isInFocus","document","visibilityState","hasFocus","undefined","EventSource","encodeURIComponent","close","window","addEventListener","removeEventListener","VARIANTS","primary","secondary","ActionButton","isPending","pendingLabel","variant","children","className","disabled","button"],"mappings":"6CAEA,IAAA,EAAA,EAAA,CAAA,CAAA,OCAA,EAAA,EAAA,CAAA,CAAA,4BCIO,SAAS,AAAY,SAAE,CAAO,CAAuB,QAG1D,ODKM,EAAS,CAAA,EAAA,EAAA,SAAA,AAAS,IACxB,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,IAAM,EAAU,IAAI,YAAY,GAAG,aAAa,OAAO,IAAE,mBAAmB,ACT/D,IDSyE,EAItF,OAHA,EAAQ,SAAS,CAAG,KAClB,EAAO,OAAO,EAChB,EACO,KACL,EAAQ,KAAK,EACf,CACFO,EAAG,GAAU,EAAO,EDRpB,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KAER,IADIJ,EACEC,EAAS,KACb,IAAMC,EAAyC,YAA7BC,SAASC,eAAe,EAAkBD,SAASE,QAAQ,EACzEH,SAAuBI,IAAVN,EACfA,EAAQ,GAD4B,CACxBO,YAAY,GAAGV,WAAW,OAAO,IAAEW,mBAAmBT,IAAU,EAClEG,QAAuBI,IAAVN,IACvBA,EAAMS,CADsC,IACjC,GACXT,OAAQM,EAEZ,EAKA,OAJAL,IACAS,OAAOC,gBAAgB,CAAC,QAASV,GACjCS,OAAOC,gBAAgB,CAAC,OAAQV,GAChCE,SAASQ,gBAAgB,CAAC,mBAAoBV,GACvC,KACLS,OAAOE,mBAAmB,CAAC,QAASX,GACpCS,OAAOE,mBAAmB,CAAC,OAAQX,GACnCE,SAASS,mBAAmB,CAAC,mBAAoBX,GACjDD,GAAOS,OACT,CACF,EAAG,CE5BY,EF4BH,EE3BL,IACT,2CCRA,IAAMI,EAAW,CACfC,QAAS,4DACTC,UAAW,mEACb,aAMO,SAASC,AAAa,WAC3BC,CAAS,cACTC,CAAY,SACZC,EAAU,WAAW,UACrBC,CAAQ,WACRC,EAAY,EAAE,UACdC,CAAQ,CACR,GAAGC,EAC0I,EAC7I,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACE,GAAGA,CAAM,CACVD,UAAuB,IAAbA,GAAqBL,EAC/B,YAAWA,EACXI,UAAW,CAAC,mGAAmG,EAAER,CAAQ,CAACM,EAAQ,CAAC,CAAC,EAAEE,EAAAA,CAAW,UAEhJJ,EACC,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,cAAY,OAAOI,UAAU,oFAClCH,KAGHE,GAIR,oBCpCO,SAAS,AAAO,SAAE,CAAO,WAAE,CAAS,CAA2C,EACpF,OAAO,EACL,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,KAAK,QAAQ,cAAY,mBAAmB,UAAU,gHACtD,IAGH,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,KAAK,SAAS,cAAY,mBAAmB,UAAU,2FACvD,GAGP"}
1
+ {"version":3,"sources":["../../../../../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":["'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":["FOCUS_PATH","useFocusReport","fleetId","focus","report","isInFocus","document","visibilityState","hasFocus","undefined","EventSource","encodeURIComponent","close","window","addEventListener","removeEventListener","VARIANTS","primary","secondary","ActionButton","isPending","pendingLabel","variant","children","className","disabled","button","Notice","message","isFailure","role"],"mappings":"6CAEA,IAAA,EAAA,EAAA,CAAA,CAAA,OCAA,EAAA,EAAA,CAAA,CAAA,4BCIO,SAAS,AAAY,SAAE,CAAO,CAAuB,QAG1D,ODKM,EAAS,CAAA,EAAA,EAAA,SAAA,AAAS,IACxB,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,IAAM,EAAU,IAAI,YAAY,GAAG,aAAa,OAAO,IAAE,mBAAmB,ACT/D,IDSyE,EAItF,OAHA,EAAQ,SAAS,CAAG,KAClB,EAAO,OAAO,EAChB,EACO,KACL,EAAQ,KAAK,EACf,CACFO,EAAG,GAAU,EAAO,EDRpB,CAAA,EAAA,EAAA,SAAS,AAAT,EAAU,KAER,IADIJ,EACEC,EAAS,KACb,IAAMC,EAAyC,YAA7BC,SAASC,eAAe,EAAkBD,SAASE,QAAQ,EACzEH,SAAuBI,IAAVN,EACfA,EAAQ,GAD4B,CACxBO,YAAY,GAAGV,WAAW,OAAO,IAAEW,mBAAmBT,IAAU,EAClEG,QAAuBI,IAAVN,IACvBA,EAAMS,CADsC,IACjC,GACXT,OAAQM,EAEZ,EAKA,OAJAL,IACAS,OAAOC,gBAAgB,CAAC,QAASV,GACjCS,OAAOC,gBAAgB,CAAC,OAAQV,GAChCE,SAASQ,gBAAgB,CAAC,mBAAoBV,GACvC,KACLS,OAAOE,mBAAmB,CAAC,QAASX,GACpCS,OAAOE,mBAAmB,CAAC,OAAQX,GACnCE,SAASS,mBAAmB,CAAC,mBAAoBX,GACjDD,GAAOS,OACT,CACF,EAAG,CE5BY,EF4BH,EE3BL,IACT,qCCRA,IAAMI,EAAW,CACfC,QAAS,4DACTC,UAAW,mEACb,aAMO,SAASC,AAAa,CAC3BC,WAAS,cACTC,CAAY,SACZC,EAAU,WAAW,UACrBC,CAAQ,WACRC,EAAY,EAAE,UACdC,CAAQ,CACR,GAAGC,EAC0I,EAC7I,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACE,GAAGA,CAAM,CACVD,UAAuB,IAAbA,GAAqBL,EAC/B,YAAWA,EACXI,UAAW,CAAC,mGAAmG,EAAER,CAAQ,CAACM,EAAQ,CAAC,CAAC,EAAEE,EAAAA,CAAW,UAEhJJ,EACC,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,cAAY,OAAOI,UAAU,oFAClCH,KAGHE,GAIR,eCrCwG,IAAA,EAAA,EAAA,CAAA,CAAA,kBACjG,SAASI,AAAO,SAAEC,CAAO,WAAEC,CAAS,CAA2C,EACpF,OAAOA,EACL,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAEC,KAAK,QAAQ,cAAY,mBAAmBN,UAAU,gHACtDI,IAGH,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAEE,KAAK,SAAS,cAAY,mBAAmBN,UAAU,2FACvDI,GAGP"}