@aeolus-fleet/gateway 0.37.3 → 0.37.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +3 -3
- package/web/.next/diagnostics/route-bundle-stats.json +87 -87
- package/web/.next/fallback-build-manifest.json +3 -3
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/server/app/(bridge)/bridge/basket/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/(bridge)/bridge/basket/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/basket/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/bridge/done/page/server-reference-manifest.json +4 -4
- package/web/.next/server/app/(bridge)/bridge/done/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/done/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/bridge/fleet/page/server-reference-manifest.json +3 -3
- package/web/.next/server/app/(bridge)/bridge/fleet/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/fleet/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/bridge/page/server-reference-manifest.json +9 -9
- package/web/.next/server/app/(bridge)/bridge/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/bridge/settings/page/server-reference-manifest.json +3 -3
- package/web/.next/server/app/(bridge)/bridge/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/bridge/settings/requests/[requestId]/page/server-reference-manifest.json +4 -4
- package/web/.next/server/app/(bridge)/bridge/settings/requests/[requestId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/settings/requests/[requestId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/bridge/settings/routing/page/server-reference-manifest.json +7 -7
- package/web/.next/server/app/(bridge)/bridge/settings/routing/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/settings/routing/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/bridge/stay-aware/page/server-reference-manifest.json +9 -9
- package/web/.next/server/app/(bridge)/bridge/stay-aware/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/stay-aware/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/[name]/change/page/server-reference-manifest.json +19 -19
- package/web/.next/server/app/(bridge)/outside-parties/[name]/change/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/[name]/change/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/[name]/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/(bridge)/outside-parties/[name]/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/[name]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/[name]/retire/page/server-reference-manifest.json +19 -19
- package/web/.next/server/app/(bridge)/outside-parties/[name]/retire/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/[name]/retire/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/add/page/server-reference-manifest.json +12 -12
- package/web/.next/server/app/(bridge)/outside-parties/add/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/add/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/add-a2a-agent/page/server-reference-manifest.json +4 -4
- package/web/.next/server/app/(bridge)/outside-parties/add-a2a-agent/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/add-a2a-agent/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/add-a2a-client/page/server-reference-manifest.json +4 -4
- package/web/.next/server/app/(bridge)/outside-parties/add-a2a-client/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/add-a2a-client/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/page/server-reference-manifest.json +4 -4
- package/web/.next/server/app/(bridge)/outside-parties/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/gateway-off/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/(console)/gateway-off/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/gateway-off/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/meetings/[meetingId]/page/server-reference-manifest.json +3 -3
- package/web/.next/server/app/(console)/meetings/[meetingId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/meetings/[meetingId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/parties/page/server-reference-manifest.json +9 -9
- package/web/.next/server/app/(console)/parties/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/parties/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/sign-in/failed/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/(console)/sign-in/failed/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/sign-in/failed/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/slack/disconnect/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/(console)/slack/disconnect/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/slack/disconnect/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/slack/expose/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/(console)/slack/expose/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/slack/expose/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/slack/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/(console)/slack/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/slack/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/slack/remove/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/(console)/slack/remove/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/slack/remove/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +1 -1
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/authorize/failed/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/authorize/failed/page.js.nft.json +1 -1
- package/web/.next/server/app/authorize/failed/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/authorize/pick/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/authorize/pick/page.js.nft.json +1 -1
- package/web/.next/server/app/authorize/pick/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/authorize/waiting/approval/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/authorize/waiting/approval/page.js.nft.json +1 -1
- package/web/.next/server/app/authorize/waiting/approval/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/ssr/01fr_app_(bridge)_bridge_settings_requests_[requestId]_page_actions_0o8g7_xshtmem.js +1 -1
- package/web/.next/server/chunks/ssr/01fr_app_(bridge)_bridge_settings_requests_[requestId]_page_actions_0o8g7_xshtmem.js.map +1 -1
- package/web/.next/server/chunks/ssr/0b9d__next-internal_server_app_(bridge)_bridge_settings_page_actions_0_te6h-2xxp7l.js +1 -1
- package/web/.next/server/chunks/ssr/0b9d__next-internal_server_app_(bridge)_bridge_settings_page_actions_0_te6h-2xxp7l.js.map +1 -1
- package/web/.next/server/chunks/ssr/0b9d__next-internal_server_app_(bridge)_bridge_stay-aware_page_actions_1u0xo0v3y9c34.js +1 -1
- package/web/.next/server/chunks/ssr/0b9d__next-internal_server_app_(bridge)_bridge_stay-aware_page_actions_1u0xo0v3y9c34.js.map +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_bridge_settings_routing_page_actions_06_j7s24dy5ee.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_bridge_settings_routing_page_actions_06_j7s24dy5ee.js.map +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_outside-parties_[name]_change_page_actions_1is-kjq5bubl4.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_outside-parties_[name]_change_page_actions_1is-kjq5bubl4.js.map +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_outside-parties_[name]_page_actions_1mctxtlzsa7xi.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_outside-parties_[name]_page_actions_1mctxtlzsa7xi.js.map +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_outside-parties_[name]_retire_page_actions_0xh6ok1un7s9k.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_outside-parties_[name]_retire_page_actions_0xh6ok1un7s9k.js.map +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_outside-parties_add-a2a-agent_page_actions_1w1q5eavo_loo.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_outside-parties_add-a2a-agent_page_actions_1w1q5eavo_loo.js.map +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_outside-parties_add_page_actions_0urcbg_r0lo7j.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_outside-parties_add_page_actions_0urcbg_r0lo7j.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0ipo8r1s1ntds._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0ovcg5tg3nh49._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0ovcg5tg3nh49._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0ro-majrw7piv._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0ro-majrw7piv._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0xurmpdv5uqfl._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0zz6fx0keti4r._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0zz6fx0keti4r._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__18-8taiduk1jn._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__18-8taiduk1jn._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__19p4g16n2nh0b._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__19p4g16n2nh0b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1ncn4wx-1i09m._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1ncn4wx-1i09m._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_00hfzlqn1og18._.js +1 -1
- package/web/.next/server/chunks/ssr/_00hfzlqn1og18._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_0phqji_8-1g8r._.js → _035yszhj3r1c4._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_12yl1q5vpvmnf._.js.map → _035yszhj3r1c4._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_12yl1q5vpvmnf._.js → _09lgufm3mfrax._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_0phqji_8-1g8r._.js.map → _09lgufm3mfrax._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_0_nfv33ug5g31._.js +1 -1
- package/web/.next/server/chunks/ssr/_0_nfv33ug5g31._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_0yt_0nnqp7qsf._.js → _0da66q5vprjs4._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_15oq7v7za6xc0._.js.map → _0da66q5vprjs4._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_0ka_9elusb800._.js +1 -1
- package/web/.next/server/chunks/ssr/_0ka_9elusb800._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0pyd1_y7w8ngp._.js +1 -1
- package/web/.next/server/chunks/ssr/_0pyd1_y7w8ngp._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0xickgbbju_9-._.js +1 -1
- package/web/.next/server/chunks/ssr/_0xickgbbju_9-._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1cs_0d0h7mhw0._.js +1 -1
- package/web/.next/server/chunks/ssr/_1cs_0d0h7mhw0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_15oq7v7za6xc0._.js → _1csct1ek1q8gk._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_0yt_0nnqp7qsf._.js.map → _1csct1ek1q8gk._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_1eybd2u08vpbe._.js +57 -0
- package/web/.next/server/chunks/ssr/_1eybd2u08vpbe._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_1gvevplh5--ko._.js +57 -0
- package/web/.next/server/chunks/ssr/_1gvevplh5--ko._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_1pjtire7rqla0._.js +1 -1
- package/web/.next/server/chunks/ssr/_1pjtire7rqla0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1qbsmlji34yph._.js +1 -1
- package/web/.next/server/chunks/ssr/_1qbsmlji34yph._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_0a9n7acgjrk5c._.js +1 -1
- package/web/.next/server/chunks/ssr/web_0a9n7acgjrk5c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_1vvrekkq5mirt._.js +1 -1
- package/web/.next/server/chunks/ssr/web_1vvrekkq5mirt._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_basket_page_actions_0g7q_rc5nma1e.js +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_basket_page_actions_0g7q_rc5nma1e.js.map +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_done_page_actions_0kjm34arntdzv.js +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_done_page_actions_0kjm34arntdzv.js.map +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_fleet_page_actions_19wmo6phgvqfk.js +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_fleet_page_actions_19wmo6phgvqfk.js.map +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_page_actions_1ok64rg3edm_u.js +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_page_actions_1ok64rg3edm_u.js.map +1 -1
- package/web/.next/server/chunks/ssr/{web_features_05tyk8t8uz71m._.js → web_features_0ids5df1ey0ok._.js} +2 -2
- package/web/.next/server/chunks/ssr/{web_features_05tyk8t8uz71m._.js.map → web_features_0ids5df1ey0ok._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{web_features_1_648zpxn76jp._.js → web_features_0mfj1eqsy4d_c._.js} +2 -2
- package/web/.next/server/chunks/ssr/{web_features_1_648zpxn76jp._.js.map → web_features_0mfj1eqsy4d_c._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/web_features_1_4v6uya90q44._.js +3 -0
- package/web/.next/server/chunks/ssr/{web_features_0hnjtl8jg_qhq._.js.map → web_features_1_4v6uya90q44._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/web_features_1urhbp0mcpa_l._.js +3 -0
- package/web/.next/server/chunks/ssr/{web_features_1uzz6jypukhkx._.js.map → web_features_1urhbp0mcpa_l._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-a2a-agent_ui_a2a-agent-form_tsx_0z8t1aalwzyl7._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-a2a-agent_ui_a2a-agent-form_tsx_0z8t1aalwzyl7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-a2a-client_ui_a2a-client-form_tsx_1anv88g385nwe._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-a2a-client_ui_a2a-client-form_tsx_1anv88g385nwe._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-server_ui_add-server_tsx_1jnmar5xju49k._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-server_ui_add-server_tsx_1jnmar5xju49k._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_0-0nf-k5yxn_-._.js +3 -0
- package/web/.next/server/chunks/ssr/{web_features_bridge_0ldot9q_-xh4o._.js.map → web_features_bridge_0-0nf-k5yxn_-._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_hooks_bridge-actions_ts_0h-_xm2rcb-ij._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_basket-panel_tsx_1qi_kzld0rfgs._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_basket-panel_tsx_1qi_kzld0rfgs._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_decision-panel_tsx_1mzsixgc8zuxc._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_decision-panel_tsx_1mzsixgc8zuxc._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_done-panel_tsx_1m844-qb1z9p_._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_done-panel_tsx_1m844-qb1z9p_._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_meeting_state_meeting-controls_tsx_12g4kzk2mbvvz._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_meeting_state_meeting-controls_tsx_12g4kzk2mbvvz._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_outside-parties_ui_switch-card_tsx_1_xnu9bm4tc-_._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_outside-parties_ui_switch-card_tsx_1_xnu9bm4tc-_._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_outside-party_actions_ts_102ar5pdowf8s._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_parties_actions_ts_0r-tbfsig2ty-._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_slack_actions_ts_1l3yg9vl20_vu._.js +1 -1
- package/web/.next/server/middleware-build-manifest.js +3 -3
- package/web/.next/server/pages/500.html +1 -1
- package/web/.next/server/preview-props.json +3 -3
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +50 -50
- package/web/.next/static/chunks/08kys3m2d2npp.js +1 -0
- package/web/.next/static/chunks/{3ce0mcxr613x9.js → 0nyh_47-o2jm-.js} +1 -1
- package/web/.next/static/chunks/{3qdxrlqdxsqgz.js → 18how8fkqnl0e.js} +1 -1
- package/web/.next/static/chunks/{1zz_y28tujbue.js → 1brlzq2plk5ap.js} +4 -4
- package/web/.next/static/chunks/{3-1jjh1cn7c8-.js → 1orsal1h4e53h.js} +1 -1
- package/web/.next/static/chunks/{3tjpz6bq80t74.js → 21g7i42tax4p1.js} +1 -1
- package/web/.next/static/chunks/{2v9rmbrsi3gic.js → 24stbxkvxsyds.js} +1 -1
- package/web/.next/static/chunks/28mfymfvqbiap.js +1 -0
- package/web/.next/static/chunks/2a9t2r05lq6sx.js +1 -0
- package/web/.next/static/chunks/{37he-4csbzq66.js → 2rs9v3lnu9szf.js} +1 -1
- package/web/.next/static/chunks/{13wwvyhf3sngt.js → 2wlb27llhjqbn.js} +1 -1
- package/web/.next/static/chunks/{10irrhgnj6fen.js → 39oc4f33cg9c7.js} +1 -1
- package/web/.next/static/chunks/{037n80h9g7uj9.js → 3_3ru7h0-k2d3.js} +1 -1
- package/web/.next/static/chunks/{2bdw63_s9xtu_.js → 3r7im_t5_lx3c.js} +1 -1
- package/web/.next/static/chunks/{07m-_glbqp-37.js → 40hz9zl48_4m7.js} +1 -1
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/server/chunks/ssr/_19gyfcgdw7y22._.js +0 -57
- package/web/.next/server/chunks/ssr/_19gyfcgdw7y22._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_1whn-m68y_cvc._.js +0 -57
- package/web/.next/server/chunks/ssr/_1whn-m68y_cvc._.js.map +0 -1
- package/web/.next/server/chunks/ssr/web_features_0hnjtl8jg_qhq._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_1uzz6jypukhkx._.js +0 -3
- package/web/.next/server/chunks/ssr/web_features_bridge_0ldot9q_-xh4o._.js +0 -3
- package/web/.next/static/chunks/0aa4uzjjhyqka.js +0 -1
- package/web/.next/static/chunks/15n0w5axo2pz9.js +0 -1
- package/web/.next/static/chunks/3q96u74uhyutq.js +0 -1
- /package/web/.next/static/{LxcgnSJuKSN0rA6kJgwr6 → vVGWuotNHMnGhCAYWm1Z-}/_buildManifest.js +0 -0
- /package/web/.next/static/{LxcgnSJuKSN0rA6kJgwr6 → vVGWuotNHMnGhCAYWm1Z-}/_clientMiddlewareManifest.js +0 -0
- /package/web/.next/static/{LxcgnSJuKSN0rA6kJgwr6 → vVGWuotNHMnGhCAYWm1Z-}/_ssgManifest.js +0 -0
package/web/.next/server/chunks/ssr/web_features_add-server_ui_add-server_tsx_1jnmar5xju49k._.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../web/features/add-server/ui/add-server.tsx","../../../../../web/features/add-server/data%3Ad1c844%20%3Ctext/javascript%3E","../../../../../web/features/add-server/data%3A45ec69%20%3Ctext/javascript%3E","../../../../../web/features/add-server/ui/address-step.tsx","../../../../../web/features/add-server/steps.ts","../../../../../web/features/add-server/ui/refused.tsx","../../../../../web/features/add-server/ui/steps.tsx","../../../../../web/features/add-server/ui/owner-step.tsx","../../../../../web/features/add-server/suggested-name.ts","../../../../../web/features/add-server/ui/tools-section.tsx","../../../../../web/features/add-server/tool-choice.ts","../../../../../web/features/outside-parties/ui/tool-row.tsx","../../../../../web/features/add-server/ui/sign-in-step.tsx"],"sourcesContent":["'use client';\n\nimport { useActionState, useState } from 'react';\n\nimport { approveServer, checkServer } from '../actions';\nimport { AddressStep } from './address-step';\nimport { OwnerStep } from './owner-step';\nimport { SignInStep } from './sign-in-step';\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. A server\n * where each person signs in is added unchecked, then the approver signs in\n * to it for themselves (M1, decision 0067). Each button says at once that its\n * 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 [approved, 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 max-w-160 gap-3\">\n <h1 className=\"text-heading-touch font-semibold max-sm:sr-only\">Add MCP server</h1>\n {approved.kind === 'added' ? (\n <SignInStep fleetId={fleetId} name={approved.name} />\n ) : owner === undefined ? (\n <AddressStep state={checked} action={check} fleetId={fleetId} />\n ) : (\n <OwnerStep state={owner} refused={approved} action={approve} onBack={() => { setBackFrom(owner.requestId); }} fleetId={fleetId} canSwitchTools={canSwitchTools} />\n )}\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"60e472f6b698047c65a8be4cfe981e2eec45441a61\":{\"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(\"60e472f6b698047c65a8be4cfe981e2eec45441a61\",callServer,void 0,findSourceMapURL,\"approveServer\");export{$$RSC_SERVER_ACTION_1 as approveServer};","/* __next_internal_action_entry_do_not_use__ [{\"60863cecd00fe7ed6ccaaa0b57716b1b2a714cf179\":{\"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(\"60863cecd00fe7ed6ccaaa0b57716b1b2a714cf179\",callServer,void 0,findSourceMapURL,\"checkServer\");export{$$RSC_SERVER_ACTION_0 as checkServer};","'use client';\n\nimport { useState } from 'react';\n\nimport { FLEET_FIELD } from '../../forms/form-state';\nimport { addedCredentialKindOf, SIGN_IN_CREDENTIAL } from '../../forms/server-credential';\nimport { CredentialFields } from '../../forms/ui/credential-fields';\nimport { COMPACT_CARD, INPUT, LABEL } from '../../forms/ui/look';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport { stepsOf } from '../steps';\nimport { Refused } from './refused';\nimport { Steps } from './steps';\n\n/**\n * The first step: the server's address and its credential, with the check's\n * refusal where it was refused. A server where each person signs in goes on\n * to its owner with Next, unchecked; any other is checked first.\n */\nexport function AddressStep({ state, action, fleetId }: { state: { fields: Readonly<Record<string, string>>; refusal?: string | undefined }; action: (form: FormData) => void; fleetId: string }) {\n const [kind, setKind] = useState(addedCredentialKindOf(state.fields.credentialKind ?? ''));\n const isSignIn = kind === SIGN_IN_CREDENTIAL.kind;\n return (\n <>\n <Steps names={stepsOf(kind)} at={0} />\n <form action={action} className={`${COMPACT_CARD} grid gap-3.5`} 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.\" canEachPersonSignIn onKindChange={setKind} />\n <div>\n <SubmitButton pending={isSignIn ? 'Next…' : 'Checking the server…'} testId=\"add-server-check\">\n {isSignIn ? 'Next' : 'Check the server'}\n </SubmitButton>\n </div>\n </form>\n </>\n );\n}\n","/**\n * The steps of adding a server, as M1 numbers them. A server where each\n * person signs in has no tools to check before someone signs in, so the\n * gateway checks its sign-in when it is added, and the approver's own sign-in\n * comes last (decision 0067, Q15).\n */\nimport { SIGN_IN_CREDENTIAL, type AddedCredentialKind } from '../forms/server-credential';\n\nexport const CHECKED_STEPS = ['Address', 'Check', 'Owner'] as const;\n\nexport const SIGN_IN_STEPS = ['Address', 'Owner', 'Sign in'] as const;\n\n/** The steps for a server with this credential. */\nexport function stepsOf(kind: AddedCredentialKind): typeof CHECKED_STEPS | typeof SIGN_IN_STEPS {\n return kind === SIGN_IN_CREDENTIAL.kind ? SIGN_IN_STEPS : CHECKED_STEPS;\n}\n","import { Outcome } from '../../forms/ui/outcome';\n\n/** Why the API refused a step, said on that step; nothing while it was not refused. */\nexport function Refused({ refusal }: { refusal: string | undefined }) {\n return refusal === undefined ? null : <Outcome state={{ kind: 'refused', message: refusal }} />;\n}\n","/** The steps of adding a server, as the design numbers them, the one at marked current. */\nexport function Steps({ names, at }: { names: readonly string[]; at: number }) {\n return (\n <ol className=\"flex gap-4 text-meta\">\n {names.map((step, index) => (\n <li key={step} aria-current={index === at ? 'step' : undefined} className={index <= at ? 'font-semibold' : 'text-muted-foreground'}>\n {index + 1} {step}\n </li>\n ))}\n </ol>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\n\nimport { FLEET_FIELD } from '../../forms/form-state';\nimport { BUTTONS, COMPACT_CARD, INPUT, LABEL } from '../../forms/ui/look';\nimport { OwnerField } from '../../forms/ui/owner-field';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport type { AddServerState, ApproveState } from '../actions';\nimport { CHECKED_STEPS, SIGN_IN_STEPS } from '../steps';\nimport { addButtonLabel, suggestedName } from '../suggested-name';\nimport { Refused } from './refused';\nimport { Steps } from './steps';\nimport { ToolsSection } from './tools-section';\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\n/**\n * The step that names the server's proxy ship and its owner, below the tools\n * the check answered. A server where each person signs in has no tools to\n * show yet: Add checks its sign-in, and says a refusal in place.\n */\nexport function 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 const tools = state.tools;\n return (\n <>\n {tools === null ? <Steps names={SIGN_IN_STEPS} at={1} /> : <Steps names={CHECKED_STEPS} at={2} />}\n <form action={action} className={`${COMPACT_CARD} grid gap-3.5`} data-testid=\"add-server-owner\">\n {tools === null ? null : <ToolsSection tools={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'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 {tools === null ? <p className=\"text-muted-foreground\">Its tools show once someone signs in.</p> : null}\n <div className=\"flex gap-2\">\n <SubmitButton pending={tools === null ? 'Checking the sign-in…' : '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","/** 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","'use client';\n\nimport { useState } from 'react';\n\nimport { Switch } from '../../forms/ui/switch';\nimport { ToolRow } from '../../outside-parties/ui/tool-row';\nimport type { CheckedTool } from '../actions';\nimport { TOOL_ON_FIELD, TOOL_SHOWN_FIELD } from '../tool-choice';\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 */\nexport function 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","/**\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","'use client';\n\nimport { useActionState } from 'react';\n\nimport { FLEET_FIELD, IDLE } from '../../forms/form-state';\nimport { BUTTONS, COMPACT_CARD } from '../../forms/ui/look';\nimport { Outcome } from '../../forms/ui/outcome';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport { inFleet } from '../../../lib/gateway-api/page-account';\nimport { partyPath } from '../../outside-parties/paths';\nimport { signInToParty } from '../../outside-party/actions';\nimport { SIGN_IN_STEPS } from '../steps';\nimport { Steps } from './steps';\n\n/**\n * The last step of adding a server where each person signs in: the\n * approver signs in to it for themselves, and their sign-in reads its tools\n * (Q15). Later goes to its page, where they sign in when they choose.\n */\nexport function SignInStep({ fleetId, name }: { fleetId: string; name: string }) {\n const [refused, signIn] = useActionState(signInToParty, IDLE);\n return (\n <>\n <Steps names={SIGN_IN_STEPS} at={2} />\n <form action={signIn} className={`${COMPACT_CARD} grid gap-3.5`} data-testid=\"add-server-sign-in\">\n <Outcome state={{ kind: 'done', message: `${name} is added.` }} />\n <Outcome state={refused} />\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <input type=\"hidden\" name=\"name\" value={name} />\n <p>Sign in to {name} for yourself. Its tools show after the first sign-in.</p>\n <div className=\"flex gap-2\">\n <SubmitButton pending={`Opening ${name}…`} testId=\"add-server-sign-in-start\">\n Sign in to {name}\n </SubmitButton>\n <a href={inFleet(partyPath(name), fleetId)} className={BUTTONS.secondary}>\n Later\n </a>\n </div>\n </form>\n </>\n );\n}\n"],"names":["$$RSC_SERVER_ACTION_1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/add-server/ui/add-server.tsx","../../../../../web/features/add-server/data%3Ae3142d%20%3Ctext/javascript%3E","../../../../../web/features/add-server/data%3Ad571a6%20%3Ctext/javascript%3E","../../../../../web/features/add-server/ui/address-step.tsx","../../../../../web/features/add-server/steps.ts","../../../../../web/features/add-server/ui/refused.tsx","../../../../../web/features/add-server/ui/steps.tsx","../../../../../web/features/add-server/ui/owner-step.tsx","../../../../../web/features/add-server/suggested-name.ts","../../../../../web/features/add-server/ui/tools-section.tsx","../../../../../web/features/add-server/tool-choice.ts","../../../../../web/features/outside-parties/ui/tool-row.tsx","../../../../../web/features/add-server/ui/sign-in-step.tsx"],"sourcesContent":["'use client';\n\nimport { useActionState, useState } from 'react';\n\nimport { approveServer, checkServer } from '../actions';\nimport { AddressStep } from './address-step';\nimport { OwnerStep } from './owner-step';\nimport { SignInStep } from './sign-in-step';\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. A server\n * where each person signs in is added unchecked, then the approver signs in\n * to it for themselves (M1, decision 0067). Each button says at once that its\n * 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 [approved, 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 max-w-160 gap-3\">\n <h1 className=\"text-heading-touch font-semibold max-sm:sr-only\">Add MCP server</h1>\n {approved.kind === 'added' ? (\n <SignInStep fleetId={fleetId} name={approved.name} />\n ) : owner === undefined ? (\n <AddressStep state={checked} action={check} fleetId={fleetId} />\n ) : (\n <OwnerStep state={owner} refused={approved} action={approve} onBack={() => { setBackFrom(owner.requestId); }} fleetId={fleetId} canSwitchTools={canSwitchTools} />\n )}\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"6072fb1c623d2f527ff2ce4829a2430ae9a23ad13c\":{\"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(\"6072fb1c623d2f527ff2ce4829a2430ae9a23ad13c\",callServer,void 0,findSourceMapURL,\"approveServer\");export{$$RSC_SERVER_ACTION_1 as approveServer};","/* __next_internal_action_entry_do_not_use__ [{\"60801acc9573ddff0ccc01328bc288382c8c0b4c99\":{\"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(\"60801acc9573ddff0ccc01328bc288382c8c0b4c99\",callServer,void 0,findSourceMapURL,\"checkServer\");export{$$RSC_SERVER_ACTION_0 as checkServer};","'use client';\n\nimport { useState } from 'react';\n\nimport { FLEET_FIELD } from '../../forms/form-state';\nimport { addedCredentialKindOf, SIGN_IN_CREDENTIAL } from '../../forms/server-credential';\nimport { CredentialFields } from '../../forms/ui/credential-fields';\nimport { COMPACT_CARD, INPUT, LABEL } from '../../forms/ui/look';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport { stepsOf } from '../steps';\nimport { Refused } from './refused';\nimport { Steps } from './steps';\n\n/**\n * The first step: the server's address and its credential, with the check's\n * refusal where it was refused. A server where each person signs in goes on\n * to its owner with Next, unchecked; any other is checked first.\n */\nexport function AddressStep({ state, action, fleetId }: { state: { fields: Readonly<Record<string, string>>; refusal?: string | undefined }; action: (form: FormData) => void; fleetId: string }) {\n const [kind, setKind] = useState(addedCredentialKindOf(state.fields.credentialKind ?? ''));\n const isSignIn = kind === SIGN_IN_CREDENTIAL.kind;\n return (\n <>\n <Steps names={stepsOf(kind)} at={0} />\n <form action={action} className={`${COMPACT_CARD} grid gap-3.5`} 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.\" canEachPersonSignIn onKindChange={setKind} />\n <div>\n <SubmitButton pending={isSignIn ? 'Next…' : 'Checking the server…'} testId=\"add-server-check\">\n {isSignIn ? 'Next' : 'Check the server'}\n </SubmitButton>\n </div>\n </form>\n </>\n );\n}\n","/**\n * The steps of adding a server, as M1 numbers them. A server where each\n * person signs in has no tools to check before someone signs in, so the\n * gateway checks its sign-in when it is added, and the approver's own sign-in\n * comes last (decision 0067, Q15).\n */\nimport { SIGN_IN_CREDENTIAL, type AddedCredentialKind } from '../forms/server-credential';\n\nexport const CHECKED_STEPS = ['Address', 'Check', 'Owner'] as const;\n\nexport const SIGN_IN_STEPS = ['Address', 'Owner', 'Sign in'] as const;\n\n/** The steps for a server with this credential. */\nexport function stepsOf(kind: AddedCredentialKind): typeof CHECKED_STEPS | typeof SIGN_IN_STEPS {\n return kind === SIGN_IN_CREDENTIAL.kind ? SIGN_IN_STEPS : CHECKED_STEPS;\n}\n","import { Outcome } from '../../forms/ui/outcome';\n\n/** Why the API refused a step, said on that step; nothing while it was not refused. */\nexport function Refused({ refusal }: { refusal: string | undefined }) {\n return refusal === undefined ? null : <Outcome state={{ kind: 'refused', message: refusal }} />;\n}\n","/** The steps of adding a server, as the design numbers them, the one at marked current. */\nexport function Steps({ names, at }: { names: readonly string[]; at: number }) {\n return (\n <ol className=\"flex gap-4 text-meta\">\n {names.map((step, index) => (\n <li key={step} aria-current={index === at ? 'step' : undefined} className={index <= at ? 'font-semibold' : 'text-muted-foreground'}>\n {index + 1} {step}\n </li>\n ))}\n </ol>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\n\nimport { FLEET_FIELD } from '../../forms/form-state';\nimport { BUTTONS, COMPACT_CARD, INPUT, LABEL } from '../../forms/ui/look';\nimport { OwnerField } from '../../forms/ui/owner-field';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport type { AddServerState, ApproveState } from '../actions';\nimport { CHECKED_STEPS, SIGN_IN_STEPS } from '../steps';\nimport { addButtonLabel, suggestedName } from '../suggested-name';\nimport { Refused } from './refused';\nimport { Steps } from './steps';\nimport { ToolsSection } from './tools-section';\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\n/**\n * The step that names the server's proxy ship and its owner, below the tools\n * the check answered. A server where each person signs in has no tools to\n * show yet: Add checks its sign-in, and says a refusal in place.\n */\nexport function 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 const tools = state.tools;\n return (\n <>\n {tools === null ? <Steps names={SIGN_IN_STEPS} at={1} /> : <Steps names={CHECKED_STEPS} at={2} />}\n <form action={action} className={`${COMPACT_CARD} grid gap-3.5`} data-testid=\"add-server-owner\">\n {tools === null ? null : <ToolsSection tools={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'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 {tools === null ? <p className=\"text-muted-foreground\">Its tools show once someone signs in.</p> : null}\n <div className=\"flex gap-2\">\n <SubmitButton pending={tools === null ? 'Checking the sign-in…' : '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","/** 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","'use client';\n\nimport { useState } from 'react';\n\nimport { Switch } from '../../forms/ui/switch';\nimport { ToolRow } from '../../outside-parties/ui/tool-row';\nimport type { CheckedTool } from '../actions';\nimport { TOOL_ON_FIELD, TOOL_SHOWN_FIELD } from '../tool-choice';\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 */\nexport function 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","/**\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","'use client';\n\nimport { useActionState } from 'react';\n\nimport { FLEET_FIELD, IDLE } from '../../forms/form-state';\nimport { BUTTONS, COMPACT_CARD } from '../../forms/ui/look';\nimport { Outcome } from '../../forms/ui/outcome';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport { inFleet } from '../../../lib/gateway-api/page-account';\nimport { partyPath } from '../../outside-parties/paths';\nimport { signInToParty } from '../../outside-party/actions';\nimport { SIGN_IN_STEPS } from '../steps';\nimport { Steps } from './steps';\n\n/**\n * The last step of adding a server where each person signs in: the\n * approver signs in to it for themselves, and their sign-in reads its tools\n * (Q15). Later goes to its page, where they sign in when they choose.\n */\nexport function SignInStep({ fleetId, name }: { fleetId: string; name: string }) {\n const [refused, signIn] = useActionState(signInToParty, IDLE);\n return (\n <>\n <Steps names={SIGN_IN_STEPS} at={2} />\n <form action={signIn} className={`${COMPACT_CARD} grid gap-3.5`} data-testid=\"add-server-sign-in\">\n <Outcome state={{ kind: 'done', message: `${name} is added.` }} />\n <Outcome state={refused} />\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <input type=\"hidden\" name=\"name\" value={name} />\n <p>Sign in to {name} for yourself. Its tools show after the first sign-in.</p>\n <div className=\"flex gap-2\">\n <SubmitButton pending={`Opening ${name}…`} testId=\"add-server-sign-in-start\">\n Sign in to {name}\n </SubmitButton>\n <a href={inFleet(partyPath(name), fleetId)} className={BUTTONS.secondary}>\n Later\n </a>\n </div>\n </form>\n </>\n );\n}\n"],"names":["$$RSC_SERVER_ACTION_1"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
(()=>{"use strict";module.exports=[2598,48298,a=>{var b=a.i(5050);let c=(0,b.createServerReference)("405ac46a4560b927736870155c56d4790ab18543bd",b.callServer,void 0,b.findSourceMapURL,"turnRoute");a.s(["f",0,c],2598);var d=a.i(83900),e=a.i(2550),f=a.i(9809),g=a.i(37149),h=a.i(62591),i=a.i(64831);let j={name:"message-circle-question-mark",size:24,node:[["path",{d:"M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719",key:"1sd12s"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]],aliases:["message-circle-question"]};j.node;let k=(0,i.f)(j);var l=a.i(98238),m=a.i(86708);let n={decide:{Icon:e.f,tone:"text-tone-active-fg"},do:{Icon:f.f,tone:"text-tone-waiting-fg"},"stay-aware":{Icon:d.f,tone:"text-muted-foreground"},"everything-else":{Icon:k,tone:"text-muted-foreground"}},o=l.f,p={slack:g.f,chat:m.f,"web-push":d.f,email:h.f};a.s(["x",0,o,"c",0,n,"U",0,p],48298)},43801,a=>{var b=a.i(87924),c=a.i(72131),d=a.i(2598),e=a.i(5050);let f=(0,e.createServerReference)("4020c1fc8cb82c75c38df24fb9199a12e3b1949c70",e.callServer,void 0,e.findSourceMapURL,"unlinkSlack"),g=[[/Edg\//,"Edge"],[/Firefox\//,"Firefox"],[/Chrome\//,"Chrome"],[/Safari\//,"Safari"]],h=[[/iPhone|iPad/,"iOS"],[/Android/,"Android"],[/Mac OS X/,"macOS"],[/Windows/,"Windows"],[/Linux/,"Linux"]],i=(a,b)=>b.find(([b])=>b.test(a))?.[1],j=(0,e.createServerReference)("60f60da8efe172d849607ffc97ccda43a09a8f42b9",e.callServer,void 0,e.findSourceMapURL,"turnOffWebPush"),k=(0,e.createServerReference)("60cb33148fea563caed0616680d34d77631b80e0fb",e.callServer,void 0,e.findSourceMapURL,"turnOnWebPush"),l="/wake-worker.js";async function m(){let a=await navigator.serviceWorker.getRegistration(l);return await a?.pushManager.getSubscription()??null}async function n(a){let b;if(await Notification.requestPermission()!=="granted")return{isOk:!1,message:"Your browser did not allow notifications from this site: allow them, then turn web push on again"};let c=await navigator.serviceWorker.register(l);return await navigator.serviceWorker.ready,{isOk:!0,value:await c.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:(b=atob(a.replaceAll("-","+").replaceAll("_","/")),Uint8Array.from(b,a=>a.charCodeAt(0)))})}}var o=a.i(99306),p=a.i(32043),q=a.i(10039),r=a.i(97024),s=a.i(64831);let t={name:"circle-pause",size:24,node:[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"10",x2:"10",y1:"15",y2:"9",key:"c1nkhi"}],["line",{x1:"14",x2:"14",y1:"15",y2:"9",key:"h65svq"}]],aliases:["pause-circle"]};t.node;let u=(0,s.f)(t);function v({place:a,name:c,Icon:d,card:e,children:f}){let g=e.state.isOk?r.f:u;return(0,b.jsxs)("div",{"data-testid":`bridge-place-${a}`,className:"flex flex-col gap-1.5 rounded-lg border border-border bg-card px-3 py-2.5",children:[(0,b.jsxs)("span",{className:"flex items-center gap-2 font-medium",children:[(0,b.jsx)(d,{"aria-hidden":!0,className:"size-4 shrink-0"}),c,(0,b.jsxs)("span",{"data-testid":`bridge-place-${a}-state`,className:`ml-auto inline-flex items-center gap-1 text-caption font-medium ${e.state.isOk?"text-tone-ok-fg":"text-muted-foreground"}`,children:[(0,b.jsx)(g,{"aria-hidden":!0,className:"size-3.5"}),e.state.label]})]}),(0,b.jsx)("span",{className:"text-caption text-muted-foreground",children:e.description}),void 0===f?null:(0,b.jsx)("span",{className:"mt-auto flex flex-col items-start gap-1.5",children:f})]})}var w=a.i(48298);function x({fleetId:a,slackLink:d}){let[e,g]=(0,c.useTransition)(),[h,i]=(0,c.useState)(),j=(0,o.H)(d);return(0,b.jsxs)(v,{place:"slack",name:o.k.slack,Icon:w.U.slack,card:j,children:["link"===j.action?(0,b.jsx)("a",{href:`/slack/link?${new URLSearchParams({fleet:a}).toString()}`,"data-testid":"bridge-slack-link",className:"inline-flex h-7 items-center rounded-md bg-primary px-2.5 text-caption font-medium text-primary-foreground hover:bg-primary-hover",children:"Link Slack"}):null,"unlink"===j.action?(0,b.jsx)(p.i,{size:"xs","data-testid":"bridge-slack-unlink",isPending:e,pendingLabel:"Unlinking...",onClick:()=>{i(void 0),g(async()=>{let b=await f(a);b.isOk||i(b.message)})},children:"Unlink"}):null,void 0===h?null:(0,b.jsx)(q.f,{message:h,isFailure:!0})]})}function y({fleetId:a,webPush:d}){let e=d?.browsers??[],{isTaken:f,ownEndpoint:l,working:r,failure:s,turnOn:t,remove:u}=function({fleetId:a,webPushKey:b}){let[d,e]=(0,c.useState)(!0),[f,l]=(0,c.useState)(),[o,p]=(0,c.useState)(),[q,r]=(0,c.useState)(),[,s]=(0,c.useTransition)();return(0,c.useEffect)(()=>{"serviceWorker"in navigator&&"PushManager"in window&&"Notification"in window?m().then(a=>{l(a?.endpoint)}):e(!1)},[]),{isTaken:d,ownEndpoint:f,working:o,failure:q,turnOn:()=>{null!==b&&(p("on"),r(void 0),s(async()=>{try{var c;let d,e,f=await n(b);if(!f.isOk)return void r(f.message);let j=function(a,b){let{endpoint:c,keys:d}=a,e=d?.p256dh,f=d?.auth;return void 0===c||void 0===e||void 0===f?void 0:{endpoint:c,keys:{p256dh:e,auth:f},browser:b}}(f.value.toJSON(),(c=navigator.userAgent,d=i(c,g),e=i(c,h),void 0===d?"A browser":void 0===e?d:`${d} on ${e}`));if(void 0===j)return void r("Your browser gave no push subscription: try again");let m=await k(a,j);m.isOk?l(j.endpoint):r(m.message)}catch{r("Your browser could not turn web push on: try again")}finally{p(void 0)}}))},remove:b=>{p(b),r(void 0),s(async()=>{b===f&&(await (await m())?.unsubscribe(),l(void 0));let c=await j(a,b);p(void 0),c.isOk||r(c.message)})}}}({fleetId:a,webPushKey:d?.publicKey??null}),x=(0,o.B)({isOffered:void 0!==d&&null!==d.publicKey,isTaken:f,ownEndpoint:l,browsers:e}),z=e.filter(({endpoint:a})=>"remove"!==x.action||a!==l);return(0,b.jsxs)(v,{place:"web-push",name:o.k["web-push"],Icon:w.U["web-push"],card:x,children:["remove"===x.action&&void 0!==l?(0,b.jsx)(p.i,{size:"xs","data-testid":"bridge-web-push-remove",isPending:r===l,pendingLabel:"Removing...",disabled:void 0!==r,onClick:()=>{u(l)},children:"Remove"}):null,"turnOn"===x.action?(0,b.jsx)(p.i,{size:"xs","data-testid":"bridge-web-push-on",isPending:"on"===r,pendingLabel:"Turning on...",disabled:void 0!==r,onClick:t,children:"Turn on"}):null,z.map(({endpoint:a,browser:c,isGone:d})=>(0,b.jsxs)("span",{"data-testid":"bridge-web-push-browser",className:"flex w-full items-center gap-2 text-caption text-muted-foreground",children:[(0,b.jsx)("span",{className:"min-w-0 flex-1",children:d?`${c}: no longer takes wakes`:`Also on in ${c}`}),(0,b.jsx)("button",{type:"button","data-testid":"bridge-web-push-remove-other",disabled:void 0!==r,onClick:()=>{u(a)},className:"underline hover:text-foreground disabled:opacity-50",children:r===a?"Removing...":"Remove"})]},a)),void 0===s?null:(0,b.jsx)(q.f,{message:s,isFailure:!0})]})}function z({fleetId:a,routing:e}){let[f,g]=(0,c.useTransition)(),[h,i]=(0,c.useState)(),j=(0,o.t)({isOffered:e.offered.email,isOnForAnyJob:e.jobs.some(({places:a})=>a.email)});return(0,b.jsxs)(v,{place:"email",name:o.k.email,Icon:w.U.email,card:j,children:["turnOn"===j.action||"turnOff"===j.action?(0,b.jsx)(p.i,{size:"xs","data-testid":"bridge-email-turn",isPending:f,pendingLabel:"turnOn"===j.action?"Turning on...":"Turning off...",onClick:()=>{var b;b="turnOn"===j.action,i(void 0),g(async()=>{for(let c of(0,o.T)(e,b)){let b=await (0,d.f)({fleet:a,...c});if(!b.isOk)return void i(b.message)}})},children:"turnOn"===j.action?"Turn on":"Turn off"}):null,void 0===h?null:(0,b.jsx)(q.f,{message:h,isFailure:!0})]})}a.s(["PlacesPanel",0,function({fleetId:a,routing:c,slackLink:d,chats:e,webPush:f}){return(0,b.jsxs)("section",{"aria-label":"The places",className:"grid gap-2.5 sm:grid-cols-2 lg:grid-cols-4",children:[(0,b.jsx)(x,{fleetId:a,slackLink:d}),(0,b.jsx)(v,{place:"chat",name:o.k.chat,Icon:w.U.chat,card:(0,o.g)(e)}),(0,b.jsx)(y,{fleetId:a,webPush:f}),(0,b.jsx)(z,{fleetId:a,routing:c})]})}],43801)},87952,a=>{var b=a.i(87924),c=a.i(97024),d=a.i(72131),e=a.i(2598),f=a.i(99306),g=a.i(10039),h=a.i(48298);function i({isOn:a,label:c,isDisabled:d,isBusy:e=!1,aside:f,testId:g,onTurn:h}){return(0,b.jsxs)("span",{className:"inline-flex items-center gap-2.5",children:[(0,b.jsx)("button",{type:"button",role:"switch","aria-checked":a,"aria-label":c,"aria-busy":e,disabled:d,"data-testid":g,onClick:h,className:"group inline-flex h-4 w-7 shrink-0 items-center rounded-full bg-input p-0.5 aria-checked:bg-primary disabled:cursor-not-allowed disabled:opacity-50",children:(0,b.jsx)("span",{"aria-hidden":!0,className:"size-3 rounded-full bg-card shadow-sm transition-transform group-aria-checked:translate-x-3"})}),void 0===f?null:(0,b.jsx)("span",{className:"text-caption text-muted-foreground",children:f})]})}let j="sm:grid sm:grid-cols-[1.6fr_repeat(5,1fr)] sm:items-center sm:gap-3";function k({toast:a}){return(0,b.jsxs)("div",{role:"status","data-testid":"bridge-routing-toast",className:"flex max-w-[720px] gap-3 rounded-lg border border-border bg-popover py-3.5 pr-3.5 pl-4 text-popover-foreground shadow-lg",children:[(0,b.jsx)(c.f,{"aria-hidden":!0,className:"mt-0.5 size-4 shrink-0 text-tone-ok-fg"}),(0,b.jsxs)("span",{className:"flex min-w-0 flex-1 flex-col gap-1",children:[(0,b.jsx)("span",{className:"font-medium",children:a.title}),(0,b.jsx)("span",{className:"text-caption text-muted-foreground",children:a.detail})]})]})}function l({name:a,children:c}){return(0,b.jsxs)("span",{className:"flex items-center justify-between sm:block",children:[(0,b.jsx)("span",{className:"sm:hidden",children:a}),c]})}a.s(["RoutingPanel",0,function({fleetId:a,routing:c,isSlackLinked:m,waitingByJob:n}){let[o,p]=(0,d.useTransition)(),[q,r]=(0,d.useState)(),[s,t]=(0,d.useState)(),[u,v]=(0,d.useState)();return(0,b.jsxs)("section",{className:"grid gap-3","aria-label":"Per job",children:[(0,b.jsxs)("div",{className:"grid gap-3 sm:gap-0 sm:overflow-hidden sm:rounded-lg sm:border sm:border-border sm:bg-card",children:[(0,b.jsxs)("div",{"aria-hidden":!0,className:`hidden min-h-8 bg-muted px-4 text-caption font-medium text-muted-foreground ${j}`,children:[(0,b.jsx)("span",{children:"Job"}),(0,b.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:[(0,b.jsx)(h.x,{className:"size-3.5"}),"Bridge"]}),f.N.map(a=>{let c=h.U[a];return(0,b.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:[(0,b.jsx)(c,{className:"size-3.5"}),f.k[a]]},a)})]}),c.jobs.map(({job:d,places:g})=>{let{Icon:k,tone:s}=h.c[d];return(0,b.jsxs)("div",{"data-testid":"bridge-routing-job",className:`flex flex-col gap-2 rounded-lg border border-border bg-card p-3 sm:min-h-[52px] sm:rounded-none sm:border-0 sm:border-t sm:px-4 sm:py-1.5 ${j}`,children:[(0,b.jsxs)("span",{className:"flex flex-col gap-0.5",children:[(0,b.jsxs)("span",{className:"inline-flex items-center gap-1.5 font-semibold sm:font-medium",children:[(0,b.jsx)(k,{"aria-hidden":!0,className:`size-4 shrink-0 ${s}`}),f.I[d].name]}),(0,b.jsx)("span",{className:"text-caption text-muted-foreground max-sm:hidden",children:f.I[d].holds})]}),(0,b.jsx)(l,{name:"Bridge",children:(0,b.jsx)(i,{isOn:!0,label:`Bridge for ${f.I[d].name}`,isDisabled:!0,aside:"Always",testId:`bridge-routing-${d}-bridge`})}),f.N.map(h=>{let j=g[h],k=`${d}-${h}`;return(0,b.jsx)(l,{name:f.k[h],children:(0,b.jsx)(i,{isOn:j,label:`${f.k[h]} for ${f.I[d].name}`,isDisabled:o||!j&&(!c.offered[h]||"slack"===h&&!m),isBusy:o&&q===k,..."everything-else"===d&&"slack"===h&&!j?{aside:"Bots only"}:{},testId:`bridge-routing-${k}`,onTurn:()=>{var b;b={job:d,place:h,isOn:!j,isChatOn:g.chat},t(void 0),v(void 0),r(`${b.job}-${b.place}`),p(async()=>{let{isChatOn:c,...d}=b,g=await (0,e.f)({fleet:a,...d});g.isOk?t((0,f.b)({...d,waiting:n[d.job],isChatOn:c})):v(g.message)})}})},h)})]},d)})]}),void 0===s?null:(0,b.jsx)(k,{toast:s}),void 0===u?null:(0,b.jsx)(g.f,{message:u,isFailure:!0}),(0,b.jsx)("p",{className:"text-caption text-muted-foreground max-sm:hidden",children:"While a Bridge page is open in focus, web push and email do not wake you. Slack still posts: you turned it on, and the views stay in step."})]})}],87952)}]})();
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=web_features_bridge_0-0nf-k5yxn_-._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../web/features/bridge/ui/place-icons.tsx","../../../../../web/features/bridge/hooks/data%3Ab3de60%20%3Ctext/javascript%3E","../../../../../node_modules/lucide-react/src/icons/message-circle-question-mark.ts","../../../../../web/features/bridge/hooks/data%3Afbbb82%20%3Ctext/javascript%3E","../../../../../web/features/bridge/hooks/data%3A3e17b2%20%3Ctext/javascript%3E","../../../../../web/features/bridge/hooks/data%3A0e4e9d%20%3Ctext/javascript%3E","../../../../../web/features/bridge/hooks/use-web-push.ts","../../../../../web/features/bridge/ui/place-card.tsx","../../../../../web/features/bridge/state/places-panel.tsx","../../../../../web/features/bridge/hooks/slack-link-path.ts","../../../../../node_modules/lucide-react/src/icons/circle-pause.ts","../../../../../web/features/bridge/services/web-push.ts","../../../../../web/features/bridge/state/routing-panel.tsx","../../../../../web/features/bridge/ui/routing-switch.tsx"],"sourcesContent":["import { Bell, CircleQuestionMark, Hand, Hash, Mail, MessageCircleQuestionMark, Ship, Sparkles, type LucideIcon } from 'lucide-react';\n\nimport type { RoutedJob, RoutedPlace } from '../services/routing';\n\n/** Each job's icon in its tone, as the routing mockup draws it: Decide active, Do waiting, the others muted. */\nexport const JOB_ICONS: Readonly<Record<RoutedJob, { readonly Icon: LucideIcon; readonly tone: string }>> = {\n decide: { Icon: CircleQuestionMark, tone: 'text-tone-active-fg' },\n do: { Icon: Hand, tone: 'text-tone-waiting-fg' },\n 'stay-aware': { Icon: Bell, tone: 'text-muted-foreground' },\n 'everything-else': { Icon: MessageCircleQuestionMark, tone: 'text-muted-foreground' },\n};\n\n/** Bridge's icon, the mark of the sidebar. */\nexport const BRIDGE_ICON: LucideIcon = Ship;\n\n/** Each place's icon, as the routing mockup draws it. */\nexport const PLACE_ICONS: Readonly<Record<RoutedPlace, LucideIcon>> = { slack: Hash, chat: Sparkles, 'web-push': Bell, email: Mail };\n","/* __next_internal_action_entry_do_not_use__ [{\"40bc7c96fce86cf783b7afa9934b227b20832bc648\":{\"name\":\"turnRoute\"}},\"web/features/bridge/hooks/bridge-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_10=/*#__PURE__*/createServerReference(\"40bc7c96fce86cf783b7afa9934b227b20832bc648\",callServer,void 0,findSourceMapURL,\"turnRoute\");export{$$RSC_SERVER_ACTION_10 as turnRoute};","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'message-circle-question-mark',\n size: 24,\n node: [\n [\n 'path',\n {\n d: 'M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719',\n key: '1sd12s',\n },\n ],\n ['path', { d: 'M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3', key: '1u773s' }],\n ['path', { d: 'M12 17h.01', key: 'p32p05' }],\n ],\n aliases: ['message-circle-question'],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name MessageCircleQuestionMark\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/message-circle-question-mark\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 MessageCircleQuestionMark = createLucideIcon(__iconData);\n\nexport default MessageCircleQuestionMark;\n","/* __next_internal_action_entry_do_not_use__ [{\"6009cf875fb9980a91d32c680f626ff2a624e4de0e\":{\"name\":\"turnOffWebPush\"}},\"web/features/bridge/hooks/bridge-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_12=/*#__PURE__*/createServerReference(\"6009cf875fb9980a91d32c680f626ff2a624e4de0e\",callServer,void 0,findSourceMapURL,\"turnOffWebPush\");export{$$RSC_SERVER_ACTION_12 as turnOffWebPush};","/* __next_internal_action_entry_do_not_use__ [{\"604799c2332415c201ae5795b6deef4ea921c69b40\":{\"name\":\"turnOnWebPush\"}},\"web/features/bridge/hooks/bridge-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_11=/*#__PURE__*/createServerReference(\"604799c2332415c201ae5795b6deef4ea921c69b40\",callServer,void 0,findSourceMapURL,\"turnOnWebPush\");export{$$RSC_SERVER_ACTION_11 as turnOnWebPush};","/* __next_internal_action_entry_do_not_use__ [{\"401795dbe980817c7febb7a9ef452e6d25af298560\":{\"name\":\"unlinkSlack\"}},\"web/features/bridge/hooks/bridge-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_13=/*#__PURE__*/createServerReference(\"401795dbe980817c7febb7a9ef452e6d25af298560\",callServer,void 0,findSourceMapURL,\"unlinkSlack\");export{$$RSC_SERVER_ACTION_13 as unlinkSlack};","'use client';\n\nimport { useEffect, useState, useTransition } from 'react';\n\nimport type { WakeChannels } from '../services/deliveries';\nimport { applicationServerKeyOf, browserNameOf, subscriptionInputOf } from '../services/web-push';\nimport { turnOffWebPush, turnOnWebPush } from './bridge-actions';\n\n/** The service worker that shows a wake and opens Bridge when it is pressed. */\nconst WORKER_PATH = '/wake-worker.js';\n\n/** Whether this browser takes web push at all. */\nfunction isPushTaken(): boolean {\n return 'serviceWorker' in navigator && 'PushManager' in window && 'Notification' in window;\n}\n\n/** This browser's own push subscription with the gateway's worker, if it has one. */\nasync function ownSubscription(): Promise<PushSubscription | null> {\n const registration = await navigator.serviceWorker.getRegistration(WORKER_PATH);\n return (await registration?.pushManager.getSubscription()) ?? null;\n}\n\n/** Asks the browser's permission, then subscribes it with the gateway's key: the subscription to send, or why there is none. */\nasync function subscribed(webPushKey: string): Promise<{ readonly isOk: true; readonly value: PushSubscription } | { readonly isOk: false; readonly message: string }> {\n if ((await Notification.requestPermission()) !== 'granted') {\n return { isOk: false, message: 'Your browser did not allow notifications from this site: allow them, then turn web push on again' };\n }\n const registration = await navigator.serviceWorker.register(WORKER_PATH);\n await navigator.serviceWorker.ready;\n return { isOk: true, value: await registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: applicationServerKeyOf(webPushKey) }) };\n}\n\n/**\n * Web push in this browser (wake a person, W8): whether it takes web push,\n * its own subscription, turning it on, which asks the browser's permission\n * first, and removing a browser, this one or another.\n */\nexport function useWebPush({ fleetId, webPushKey }: { fleetId: string; webPushKey: string | null }) {\n const [isTaken, setIsTaken] = useState(true);\n const [ownEndpoint, setOwnEndpoint] = useState<string | undefined>();\n const [working, setWorking] = useState<string | undefined>();\n const [failure, setFailure] = useState<string | undefined>();\n const [, startTransition] = useTransition();\n\n useEffect(() => {\n if (!isPushTaken()) {\n setIsTaken(false);\n return;\n }\n void ownSubscription().then((own) => {\n setOwnEndpoint(own?.endpoint);\n });\n }, []);\n\n const turnOn = () => {\n if (webPushKey === null) {\n return;\n }\n setWorking('on');\n setFailure(undefined);\n startTransition(async () => {\n try {\n const subscription = await subscribed(webPushKey);\n if (!subscription.isOk) {\n setFailure(subscription.message);\n return;\n }\n const input = subscriptionInputOf(subscription.value.toJSON(), browserNameOf(navigator.userAgent));\n if (input === undefined) {\n setFailure('Your browser gave no push subscription: try again');\n return;\n }\n const outcome = await turnOnWebPush(fleetId, input);\n if (outcome.isOk) {\n setOwnEndpoint(input.endpoint);\n } else {\n setFailure(outcome.message);\n }\n } catch {\n setFailure('Your browser could not turn web push on: try again');\n } finally {\n setWorking(undefined);\n }\n });\n };\n\n const remove = (endpoint: string) => {\n setWorking(endpoint);\n setFailure(undefined);\n startTransition(async () => {\n if (endpoint === ownEndpoint) {\n await (await ownSubscription())?.unsubscribe();\n setOwnEndpoint(undefined);\n }\n const outcome = await turnOffWebPush(fleetId, endpoint);\n setWorking(undefined);\n if (!outcome.isOk) {\n setFailure(outcome.message);\n }\n });\n };\n\n return { isTaken, ownEndpoint, working, failure, turnOn, remove };\n}\n\nexport type WebPushBrowsers = WakeChannels['webPush']['browsers'];\n","import { CircleCheck, CirclePause, type LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport type { PlaceCard as PlaceCardState } from '../services/routing';\n\n/**\n * A place on top of Where things show (the routing mockup): its icon and\n * name, its state on the right, what it does, and its one action below.\n */\nexport function PlaceCard({ place, name, Icon, card, children }: { place: string; name: string; Icon: LucideIcon; card: PlaceCardState; children?: ReactNode }) {\n const StateIcon = card.state.isOk ? CircleCheck : CirclePause;\n return (\n <div data-testid={`bridge-place-${place}`} className=\"flex flex-col gap-1.5 rounded-lg border border-border bg-card px-3 py-2.5\">\n <span className=\"flex items-center gap-2 font-medium\">\n <Icon aria-hidden className=\"size-4 shrink-0\" />\n {name}\n <span data-testid={`bridge-place-${place}-state`} className={`ml-auto inline-flex items-center gap-1 text-caption font-medium ${card.state.isOk ? 'text-tone-ok-fg' : 'text-muted-foreground'}`}>\n <StateIcon aria-hidden className=\"size-3.5\" />\n {card.state.label}\n </span>\n </span>\n <span className=\"text-caption text-muted-foreground\">{card.description}</span>\n {children === undefined ? null : <span className=\"mt-auto flex flex-col items-start gap-1.5\">{children}</span>}\n </div>\n );\n}\n","'use client';\n\nimport { useState, useTransition } from 'react';\n\nimport { turnRoute, unlinkSlack } from '../hooks/bridge-actions';\nimport type { SlackLink } from '../hooks/read-bridge';\nimport { SLACK_LINK_PATH } from '../hooks/slack-link-path';\nimport { useWebPush } from '../hooks/use-web-push';\nimport type { WakeChannels } from '../services/deliveries';\nimport { chatCardOf, emailCardOf, emailTurnsOf, PLACE_NAMES, slackCardOf, webPushCardOf, type RoutingView } from '../services/routing';\nimport { ActionButton } from '../ui/action-button';\nimport { Notice } from '../ui/notice';\nimport { PlaceCard } from '../ui/place-card';\nimport { PLACE_ICONS } from '../ui/place-icons';\n\nfunction SlackPlace({ fleetId, slackLink }: { fleetId: string; slackLink: SlackLink | null }) {\n const [isUnlinking, startTransition] = useTransition();\n const [failure, setFailure] = useState<string | undefined>();\n const card = slackCardOf(slackLink);\n\n const unlink = () => {\n setFailure(undefined);\n startTransition(async () => {\n const outcome = await unlinkSlack(fleetId);\n if (!outcome.isOk) {\n setFailure(outcome.message);\n }\n });\n };\n\n return (\n <PlaceCard place=\"slack\" name={PLACE_NAMES.slack} Icon={PLACE_ICONS.slack} card={card}>\n {card.action === 'link' ? (\n <a\n href={`${SLACK_LINK_PATH}?${new URLSearchParams({ fleet: fleetId }).toString()}`}\n data-testid=\"bridge-slack-link\"\n className=\"inline-flex h-7 items-center rounded-md bg-primary px-2.5 text-caption font-medium text-primary-foreground hover:bg-primary-hover\"\n >\n Link Slack\n </a>\n ) : null}\n {card.action === 'unlink' ? (\n <ActionButton size=\"xs\" data-testid=\"bridge-slack-unlink\" isPending={isUnlinking} pendingLabel=\"Unlinking...\" onClick={unlink}>\n Unlink\n </ActionButton>\n ) : null}\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n </PlaceCard>\n );\n}\n\nfunction WebPushPlace({ fleetId, webPush }: { fleetId: string; webPush: WakeChannels['webPush'] | undefined }) {\n const browsers = webPush?.browsers ?? [];\n const { isTaken, ownEndpoint, working, failure, turnOn, remove } = useWebPush({ fleetId, webPushKey: webPush?.publicKey ?? null });\n const card = webPushCardOf({ isOffered: webPush !== undefined && webPush.publicKey !== null, isTaken, ownEndpoint, browsers });\n const others = browsers.filter(({ endpoint }) => card.action !== 'remove' || endpoint !== ownEndpoint);\n return (\n <PlaceCard place=\"web-push\" name={PLACE_NAMES['web-push']} Icon={PLACE_ICONS['web-push']} card={card}>\n {card.action === 'remove' && ownEndpoint !== undefined ? (\n <ActionButton size=\"xs\" data-testid=\"bridge-web-push-remove\" isPending={working === ownEndpoint} pendingLabel=\"Removing...\" disabled={working !== undefined} onClick={() => { remove(ownEndpoint); }}>\n Remove\n </ActionButton>\n ) : null}\n {card.action === 'turnOn' ? (\n <ActionButton size=\"xs\" data-testid=\"bridge-web-push-on\" isPending={working === 'on'} pendingLabel=\"Turning on...\" disabled={working !== undefined} onClick={turnOn}>\n Turn on\n </ActionButton>\n ) : null}\n {others.map(({ endpoint, browser, isGone }) => (\n <span key={endpoint} data-testid=\"bridge-web-push-browser\" className=\"flex w-full items-center gap-2 text-caption text-muted-foreground\">\n <span className=\"min-w-0 flex-1\">{isGone ? `${browser}: no longer takes wakes` : `Also on in ${browser}`}</span>\n <button type=\"button\" data-testid=\"bridge-web-push-remove-other\" disabled={working !== undefined} onClick={() => { remove(endpoint); }} className=\"underline hover:text-foreground disabled:opacity-50\">\n {working === endpoint ? 'Removing...' : 'Remove'}\n </button>\n </span>\n ))}\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n </PlaceCard>\n );\n}\n\nfunction EmailPlace({ fleetId, routing }: { fleetId: string; routing: RoutingView }) {\n const [isTurning, startTransition] = useTransition();\n const [failure, setFailure] = useState<string | undefined>();\n const card = emailCardOf({ isOffered: routing.offered.email, isOnForAnyJob: routing.jobs.some(({ places }) => places.email) });\n\n const turn = (isOn: boolean) => {\n setFailure(undefined);\n startTransition(async () => {\n for (const change of emailTurnsOf(routing, isOn)) {\n const outcome = await turnRoute({ fleet: fleetId, ...change });\n if (!outcome.isOk) {\n setFailure(outcome.message);\n return;\n }\n }\n });\n };\n\n return (\n <PlaceCard place=\"email\" name={PLACE_NAMES.email} Icon={PLACE_ICONS.email} card={card}>\n {card.action === 'turnOn' || card.action === 'turnOff' ? (\n <ActionButton size=\"xs\" data-testid=\"bridge-email-turn\" isPending={isTurning} pendingLabel={card.action === 'turnOn' ? 'Turning on...' : 'Turning off...'} onClick={() => { turn(card.action === 'turnOn'); }}>\n {card.action === 'turnOn' ? 'Turn on' : 'Turn off'}\n </ActionButton>\n ) : null}\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n </PlaceCard>\n );\n}\n\n/**\n * The places on top of Where things show (Bridge, section 8; the routing\n * mockup), each with its state and its one action: Slack linked or not, the\n * chats connected through the gateway, web push in this browser, and email.\n */\nexport function PlacesPanel({\n fleetId,\n routing,\n slackLink,\n chats,\n webPush,\n}: {\n fleetId: string;\n routing: RoutingView;\n slackLink: SlackLink | null;\n chats: readonly string[];\n webPush: WakeChannels['webPush'] | undefined;\n}) {\n return (\n <section aria-label=\"The places\" className=\"grid gap-2.5 sm:grid-cols-2 lg:grid-cols-4\">\n <SlackPlace fleetId={fleetId} slackLink={slackLink} />\n <PlaceCard place=\"chat\" name={PLACE_NAMES.chat} Icon={PLACE_ICONS.chat} card={chatCardOf(chats)} />\n <WebPushPlace fleetId={fleetId} webPush={webPush} />\n <EmailPlace fleetId={fleetId} routing={routing} />\n </section>\n );\n}\n","/** Where Link Slack starts (gateway scopes 9.3): the button in Bridge's settings and the button in a bot's answer in Slack (src/core/slack/take-slack-event.ts). */\nexport const SLACK_LINK_PATH = '/slack/link';\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'circle-pause',\n size: 24,\n node: [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['line', { x1: '10', x2: '10', y1: '15', y2: '9', key: 'c1nkhi' }],\n ['line', { x1: '14', x2: '14', y1: '15', y2: '9', key: 'h65svq' }],\n ],\n aliases: ['pause-circle'],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name CirclePause\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/circle-pause\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 CirclePause = createLucideIcon(__iconData);\n\nexport default CirclePause;\n","/**\n * What the section of wakes of Bridge's settings works out in the browser (wake a\n * person, W8): the name a browser it turns web push on in is listed by, the\n * gateway's push key as the browser's push manager takes it, and the\n * subscription the browser sends the gateway.\n */\n\n/** A browser's push subscription as the gateway takes it, with the browser's name. */\nexport interface SubscriptionInput {\n readonly endpoint: string;\n readonly keys: { readonly p256dh: string; readonly auth: string };\n readonly browser: string;\n}\n\n/** The browsers and systems a name is made of, the first that matches counting: Edge and Chrome also say Safari, and Chrome says Chrome. */\nconst BROWSERS: readonly (readonly [RegExp, string])[] = [\n [/Edg\\//, 'Edge'],\n [/Firefox\\//, 'Firefox'],\n [/Chrome\\//, 'Chrome'],\n [/Safari\\//, 'Safari'],\n];\nconst SYSTEMS: readonly (readonly [RegExp, string])[] = [\n [/iPhone|iPad/, 'iOS'],\n [/Android/, 'Android'],\n [/Mac OS X/, 'macOS'],\n [/Windows/, 'Windows'],\n [/Linux/, 'Linux'],\n];\n\nconst firstOf = (userAgent: string, names: readonly (readonly [RegExp, string])[]): string | undefined => names.find(([pattern]) => pattern.test(userAgent))?.[1];\n\n/** The name a browser is listed by, such as Firefox on Linux, from its user agent. */\nexport function browserNameOf(userAgent: string): string {\n const browser = firstOf(userAgent, BROWSERS);\n const system = firstOf(userAgent, SYSTEMS);\n if (browser === undefined) {\n return 'A browser';\n }\n return system === undefined ? browser : `${browser} on ${system}`;\n}\n\n/** The bytes a base64url key stands for, as the browser's push manager takes the gateway's key. */\nexport function applicationServerKeyOf(key: string): Uint8Array<ArrayBuffer> {\n const binary = atob(key.replaceAll('-', '+').replaceAll('_', '/'));\n return Uint8Array.from(binary, (character) => character.charCodeAt(0));\n}\n\n/** The subscription to send, from the push manager's own, or none when it gave no endpoint or keys. */\nexport function subscriptionInputOf(subscription: { endpoint?: string; keys?: Record<string, string> }, browser: string): SubscriptionInput | undefined {\n const { endpoint, keys } = subscription;\n const p256dh = keys?.p256dh;\n const auth = keys?.auth;\n return endpoint === undefined || p256dh === undefined || auth === undefined ? undefined : { endpoint, keys: { p256dh, auth }, browser };\n}\n","'use client';\n\nimport { CircleCheck } from 'lucide-react';\nimport { useState, useTransition } from 'react';\n\nimport { turnRoute } from '../hooks/bridge-actions';\nimport { JOB_NAMES, PLACE_NAMES, ROUTED_PLACES, turnedToastOf, type RoutedJob, type RoutedPlace, type RoutingToast, type RoutingView, type WaitingByJob } from '../services/routing';\nimport { Notice } from '../ui/notice';\nimport { BRIDGE_ICON, JOB_ICONS, PLACE_ICONS } from '../ui/place-icons';\nimport { RoutingSwitch } from '../ui/routing-switch';\n\n/** Six columns on desktop: the job, Bridge, then each place. */\nconst ROW = 'sm:grid sm:grid-cols-[1.6fr_repeat(5,1fr)] sm:items-center sm:gap-3';\n\n/** The toast after a change (the routing mockup): what the place now shows. */\nfunction Toast({ toast }: { toast: RoutingToast }) {\n return (\n <div role=\"status\" data-testid=\"bridge-routing-toast\" className=\"flex max-w-[720px] gap-3 rounded-lg border border-border bg-popover py-3.5 pr-3.5 pl-4 text-popover-foreground shadow-lg\">\n <CircleCheck aria-hidden className=\"mt-0.5 size-4 shrink-0 text-tone-ok-fg\" />\n <span className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className=\"font-medium\">{toast.title}</span>\n <span className=\"text-caption text-muted-foreground\">{toast.detail}</span>\n </span>\n </div>\n );\n}\n\n/** A place's cell: on desktop the switch in its column, on the phone a line with the place's name and the switch. */\nfunction PlaceCell({ name, children }: { name: string; children: React.ReactNode }) {\n return (\n <span className=\"flex items-center justify-between sm:block\">\n <span className=\"sm:hidden\">{name}</span>\n {children}\n </span>\n );\n}\n\n/**\n * Routing per job (Bridge, section 8; the routing mockup): per job, the\n * places that show it besides Bridge, which always does. A switch turns a\n * place on or off at once; the toast then says what it shows (CC20). A\n * place the gateway does not offer, or Slack before it is linked, cannot be\n * turned on; one on can always be turned off. On desktop a table, on the\n * phone a card per job.\n */\nexport function RoutingPanel({ fleetId, routing, isSlackLinked, waitingByJob }: { fleetId: string; routing: RoutingView; isSlackLinked: boolean; waitingByJob: WaitingByJob }) {\n const [isTurning, startTransition] = useTransition();\n const [turning, setTurning] = useState<string | undefined>();\n const [toast, setToast] = useState<RoutingToast | undefined>();\n const [failure, setFailure] = useState<string | undefined>();\n const isUsable = (place: RoutedPlace): boolean => routing.offered[place] && (place !== 'slack' || isSlackLinked);\n\n const turn = (change: { job: RoutedJob; place: RoutedPlace; isOn: boolean; isChatOn: boolean }) => {\n setToast(undefined);\n setFailure(undefined);\n setTurning(`${change.job}-${change.place}`);\n startTransition(async () => {\n const { isChatOn, ...route } = change;\n const outcome = await turnRoute({ fleet: fleetId, ...route });\n if (outcome.isOk) {\n setToast(turnedToastOf({ ...route, waiting: waitingByJob[route.job], isChatOn }));\n } else {\n setFailure(outcome.message);\n }\n });\n };\n\n return (\n <section className=\"grid gap-3\" aria-label=\"Per job\">\n <div className=\"grid gap-3 sm:gap-0 sm:overflow-hidden sm:rounded-lg sm:border sm:border-border sm:bg-card\">\n <div aria-hidden className={`hidden min-h-8 bg-muted px-4 text-caption font-medium text-muted-foreground ${ROW}`}>\n <span>Job</span>\n <span className=\"inline-flex items-center gap-1.5\">\n <BRIDGE_ICON className=\"size-3.5\" />\n Bridge\n </span>\n {ROUTED_PLACES.map((place) => {\n const Icon = PLACE_ICONS[place];\n return (\n <span key={place} className=\"inline-flex items-center gap-1.5\">\n <Icon className=\"size-3.5\" />\n {PLACE_NAMES[place]}\n </span>\n );\n })}\n </div>\n {routing.jobs.map(({ job, places }) => {\n const { Icon, tone } = JOB_ICONS[job];\n return (\n <div\n key={job}\n data-testid=\"bridge-routing-job\"\n className={`flex flex-col gap-2 rounded-lg border border-border bg-card p-3 sm:min-h-[52px] sm:rounded-none sm:border-0 sm:border-t sm:px-4 sm:py-1.5 ${ROW}`}\n >\n <span className=\"flex flex-col gap-0.5\">\n <span className=\"inline-flex items-center gap-1.5 font-semibold sm:font-medium\">\n <Icon aria-hidden className={`size-4 shrink-0 ${tone}`} />\n {JOB_NAMES[job].name}\n </span>\n <span className=\"text-caption text-muted-foreground max-sm:hidden\">{JOB_NAMES[job].holds}</span>\n </span>\n <PlaceCell name=\"Bridge\">\n <RoutingSwitch isOn label={`Bridge for ${JOB_NAMES[job].name}`} isDisabled aside=\"Always\" testId={`bridge-routing-${job}-bridge`} />\n </PlaceCell>\n {ROUTED_PLACES.map((place) => {\n const isOn = places[place];\n const key = `${job}-${place}`;\n return (\n <PlaceCell key={place} name={PLACE_NAMES[place]}>\n <RoutingSwitch\n isOn={isOn}\n label={`${PLACE_NAMES[place]} for ${JOB_NAMES[job].name}`}\n isDisabled={isTurning || (!isOn && !isUsable(place))}\n isBusy={isTurning && turning === key}\n {...(job === 'everything-else' && place === 'slack' && !isOn ? { aside: 'Bots only' } : {})}\n testId={`bridge-routing-${key}`}\n onTurn={() => {\n turn({ job, place, isOn: !isOn, isChatOn: places.chat });\n }}\n />\n </PlaceCell>\n );\n })}\n </div>\n );\n })}\n </div>\n {toast === undefined ? null : <Toast toast={toast} />}\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n <p className=\"text-caption text-muted-foreground max-sm:hidden\">While a Bridge page is open in focus, web push and email do not wake you. Slack still posts: you turned it on, and the views stay in step.</p>\n </section>\n );\n}\n","/**\n * A switch for one place of one job (the routing mockup): on or off, small;\n * Bridge's is on and cannot be turned, said beside it as Always; Slack's for\n * everything else, while off, says Bots only beside it.\n */\nexport function RoutingSwitch({\n isOn,\n label,\n isDisabled,\n isBusy = false,\n aside,\n testId,\n onTurn,\n}: {\n isOn: boolean;\n label: string;\n isDisabled: boolean;\n isBusy?: boolean;\n aside?: string;\n testId: string;\n onTurn?: () => void;\n}) {\n return (\n <span className=\"inline-flex items-center gap-2.5\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={isOn}\n aria-label={label}\n aria-busy={isBusy}\n disabled={isDisabled}\n data-testid={testId}\n onClick={onTurn}\n className=\"group inline-flex h-4 w-7 shrink-0 items-center rounded-full bg-input p-0.5 aria-checked:bg-primary disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <span aria-hidden className=\"size-3 rounded-full bg-card shadow-sm transition-transform group-aria-checked:translate-x-3\" />\n </button>\n {aside === undefined ? null : <span className=\"text-caption text-muted-foreground\">{aside}</span>}\n </span>\n );\n}\n"],"names":["$$RSC_SERVER_ACTION_10","$$RSC_SERVER_ACTION_13","RoutingSwitch","isOn","label","isDisabled","isBusy","aside","testId","onTurn","className","type","role","disabled","onClick","undefined"],"mappings":"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","ignoreList":[2,10]}
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/bridge/ui/place-icons.tsx","../../../../../web/features/bridge/hooks/data%3Ab182b2%20%3Ctext/javascript%3E","../../../../../node_modules/lucide-react/src/icons/message-circle-question-mark.ts","../../../../../web/features/bridge/hooks/data%3Af0634d%20%3Ctext/javascript%3E","../../../../../web/features/bridge/hooks/data%3Ab2c3c6%20%3Ctext/javascript%3E","../../../../../web/features/bridge/hooks/data%3A881f1c%20%3Ctext/javascript%3E","../../../../../web/features/bridge/hooks/use-web-push.ts","../../../../../web/features/bridge/ui/place-card.tsx","../../../../../web/features/bridge/state/places-panel.tsx","../../../../../web/features/bridge/hooks/slack-link-path.ts","../../../../../node_modules/lucide-react/src/icons/circle-pause.ts","../../../../../web/features/bridge/services/web-push.ts","../../../../../web/features/bridge/state/routing-panel.tsx","../../../../../web/features/bridge/ui/routing-switch.tsx"],"sourcesContent":["import { Bell, CircleQuestionMark, Hand, Hash, Mail, MessageCircleQuestionMark, Ship, Sparkles, type LucideIcon } from 'lucide-react';\n\nimport type { RoutedJob, RoutedPlace } from '../services/routing';\n\n/** Each job's icon in its tone, as the routing mockup draws it: Decide active, Do waiting, the others muted. */\nexport const JOB_ICONS: Readonly<Record<RoutedJob, { readonly Icon: LucideIcon; readonly tone: string }>> = {\n decide: { Icon: CircleQuestionMark, tone: 'text-tone-active-fg' },\n do: { Icon: Hand, tone: 'text-tone-waiting-fg' },\n 'stay-aware': { Icon: Bell, tone: 'text-muted-foreground' },\n 'everything-else': { Icon: MessageCircleQuestionMark, tone: 'text-muted-foreground' },\n};\n\n/** Bridge's icon, the mark of the sidebar. */\nexport const BRIDGE_ICON: LucideIcon = Ship;\n\n/** Each place's icon, as the routing mockup draws it. */\nexport const PLACE_ICONS: Readonly<Record<RoutedPlace, LucideIcon>> = { slack: Hash, chat: Sparkles, 'web-push': Bell, email: Mail };\n","/* __next_internal_action_entry_do_not_use__ [{\"405ac46a4560b927736870155c56d4790ab18543bd\":{\"name\":\"turnRoute\"}},\"web/features/bridge/hooks/bridge-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_10=/*#__PURE__*/createServerReference(\"405ac46a4560b927736870155c56d4790ab18543bd\",callServer,void 0,findSourceMapURL,\"turnRoute\");export{$$RSC_SERVER_ACTION_10 as turnRoute};","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'message-circle-question-mark',\n size: 24,\n node: [\n [\n 'path',\n {\n d: 'M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719',\n key: '1sd12s',\n },\n ],\n ['path', { d: 'M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3', key: '1u773s' }],\n ['path', { d: 'M12 17h.01', key: 'p32p05' }],\n ],\n aliases: ['message-circle-question'],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name MessageCircleQuestionMark\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/message-circle-question-mark\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 MessageCircleQuestionMark = createLucideIcon(__iconData);\n\nexport default MessageCircleQuestionMark;\n","/* __next_internal_action_entry_do_not_use__ [{\"60f60da8efe172d849607ffc97ccda43a09a8f42b9\":{\"name\":\"turnOffWebPush\"}},\"web/features/bridge/hooks/bridge-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_12=/*#__PURE__*/createServerReference(\"60f60da8efe172d849607ffc97ccda43a09a8f42b9\",callServer,void 0,findSourceMapURL,\"turnOffWebPush\");export{$$RSC_SERVER_ACTION_12 as turnOffWebPush};","/* __next_internal_action_entry_do_not_use__ [{\"60cb33148fea563caed0616680d34d77631b80e0fb\":{\"name\":\"turnOnWebPush\"}},\"web/features/bridge/hooks/bridge-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_11=/*#__PURE__*/createServerReference(\"60cb33148fea563caed0616680d34d77631b80e0fb\",callServer,void 0,findSourceMapURL,\"turnOnWebPush\");export{$$RSC_SERVER_ACTION_11 as turnOnWebPush};","/* __next_internal_action_entry_do_not_use__ [{\"4020c1fc8cb82c75c38df24fb9199a12e3b1949c70\":{\"name\":\"unlinkSlack\"}},\"web/features/bridge/hooks/bridge-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_13=/*#__PURE__*/createServerReference(\"4020c1fc8cb82c75c38df24fb9199a12e3b1949c70\",callServer,void 0,findSourceMapURL,\"unlinkSlack\");export{$$RSC_SERVER_ACTION_13 as unlinkSlack};","'use client';\n\nimport { useEffect, useState, useTransition } from 'react';\n\nimport type { WakeChannels } from '../services/deliveries';\nimport { applicationServerKeyOf, browserNameOf, subscriptionInputOf } from '../services/web-push';\nimport { turnOffWebPush, turnOnWebPush } from './bridge-actions';\n\n/** The service worker that shows a wake and opens Bridge when it is pressed. */\nconst WORKER_PATH = '/wake-worker.js';\n\n/** Whether this browser takes web push at all. */\nfunction isPushTaken(): boolean {\n return 'serviceWorker' in navigator && 'PushManager' in window && 'Notification' in window;\n}\n\n/** This browser's own push subscription with the gateway's worker, if it has one. */\nasync function ownSubscription(): Promise<PushSubscription | null> {\n const registration = await navigator.serviceWorker.getRegistration(WORKER_PATH);\n return (await registration?.pushManager.getSubscription()) ?? null;\n}\n\n/** Asks the browser's permission, then subscribes it with the gateway's key: the subscription to send, or why there is none. */\nasync function subscribed(webPushKey: string): Promise<{ readonly isOk: true; readonly value: PushSubscription } | { readonly isOk: false; readonly message: string }> {\n if ((await Notification.requestPermission()) !== 'granted') {\n return { isOk: false, message: 'Your browser did not allow notifications from this site: allow them, then turn web push on again' };\n }\n const registration = await navigator.serviceWorker.register(WORKER_PATH);\n await navigator.serviceWorker.ready;\n return { isOk: true, value: await registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: applicationServerKeyOf(webPushKey) }) };\n}\n\n/**\n * Web push in this browser (wake a person, W8): whether it takes web push,\n * its own subscription, turning it on, which asks the browser's permission\n * first, and removing a browser, this one or another.\n */\nexport function useWebPush({ fleetId, webPushKey }: { fleetId: string; webPushKey: string | null }) {\n const [isTaken, setIsTaken] = useState(true);\n const [ownEndpoint, setOwnEndpoint] = useState<string | undefined>();\n const [working, setWorking] = useState<string | undefined>();\n const [failure, setFailure] = useState<string | undefined>();\n const [, startTransition] = useTransition();\n\n useEffect(() => {\n if (!isPushTaken()) {\n setIsTaken(false);\n return;\n }\n void ownSubscription().then((own) => {\n setOwnEndpoint(own?.endpoint);\n });\n }, []);\n\n const turnOn = () => {\n if (webPushKey === null) {\n return;\n }\n setWorking('on');\n setFailure(undefined);\n startTransition(async () => {\n try {\n const subscription = await subscribed(webPushKey);\n if (!subscription.isOk) {\n setFailure(subscription.message);\n return;\n }\n const input = subscriptionInputOf(subscription.value.toJSON(), browserNameOf(navigator.userAgent));\n if (input === undefined) {\n setFailure('Your browser gave no push subscription: try again');\n return;\n }\n const outcome = await turnOnWebPush(fleetId, input);\n if (outcome.isOk) {\n setOwnEndpoint(input.endpoint);\n } else {\n setFailure(outcome.message);\n }\n } catch {\n setFailure('Your browser could not turn web push on: try again');\n } finally {\n setWorking(undefined);\n }\n });\n };\n\n const remove = (endpoint: string) => {\n setWorking(endpoint);\n setFailure(undefined);\n startTransition(async () => {\n if (endpoint === ownEndpoint) {\n await (await ownSubscription())?.unsubscribe();\n setOwnEndpoint(undefined);\n }\n const outcome = await turnOffWebPush(fleetId, endpoint);\n setWorking(undefined);\n if (!outcome.isOk) {\n setFailure(outcome.message);\n }\n });\n };\n\n return { isTaken, ownEndpoint, working, failure, turnOn, remove };\n}\n\nexport type WebPushBrowsers = WakeChannels['webPush']['browsers'];\n","import { CircleCheck, CirclePause, type LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport type { PlaceCard as PlaceCardState } from '../services/routing';\n\n/**\n * A place on top of Where things show (the routing mockup): its icon and\n * name, its state on the right, what it does, and its one action below.\n */\nexport function PlaceCard({ place, name, Icon, card, children }: { place: string; name: string; Icon: LucideIcon; card: PlaceCardState; children?: ReactNode }) {\n const StateIcon = card.state.isOk ? CircleCheck : CirclePause;\n return (\n <div data-testid={`bridge-place-${place}`} className=\"flex flex-col gap-1.5 rounded-lg border border-border bg-card px-3 py-2.5\">\n <span className=\"flex items-center gap-2 font-medium\">\n <Icon aria-hidden className=\"size-4 shrink-0\" />\n {name}\n <span data-testid={`bridge-place-${place}-state`} className={`ml-auto inline-flex items-center gap-1 text-caption font-medium ${card.state.isOk ? 'text-tone-ok-fg' : 'text-muted-foreground'}`}>\n <StateIcon aria-hidden className=\"size-3.5\" />\n {card.state.label}\n </span>\n </span>\n <span className=\"text-caption text-muted-foreground\">{card.description}</span>\n {children === undefined ? null : <span className=\"mt-auto flex flex-col items-start gap-1.5\">{children}</span>}\n </div>\n );\n}\n","'use client';\n\nimport { useState, useTransition } from 'react';\n\nimport { turnRoute, unlinkSlack } from '../hooks/bridge-actions';\nimport type { SlackLink } from '../hooks/read-bridge';\nimport { SLACK_LINK_PATH } from '../hooks/slack-link-path';\nimport { useWebPush } from '../hooks/use-web-push';\nimport type { WakeChannels } from '../services/deliveries';\nimport { chatCardOf, emailCardOf, emailTurnsOf, PLACE_NAMES, slackCardOf, webPushCardOf, type RoutingView } from '../services/routing';\nimport { ActionButton } from '../ui/action-button';\nimport { Notice } from '../ui/notice';\nimport { PlaceCard } from '../ui/place-card';\nimport { PLACE_ICONS } from '../ui/place-icons';\n\nfunction SlackPlace({ fleetId, slackLink }: { fleetId: string; slackLink: SlackLink | null }) {\n const [isUnlinking, startTransition] = useTransition();\n const [failure, setFailure] = useState<string | undefined>();\n const card = slackCardOf(slackLink);\n\n const unlink = () => {\n setFailure(undefined);\n startTransition(async () => {\n const outcome = await unlinkSlack(fleetId);\n if (!outcome.isOk) {\n setFailure(outcome.message);\n }\n });\n };\n\n return (\n <PlaceCard place=\"slack\" name={PLACE_NAMES.slack} Icon={PLACE_ICONS.slack} card={card}>\n {card.action === 'link' ? (\n <a\n href={`${SLACK_LINK_PATH}?${new URLSearchParams({ fleet: fleetId }).toString()}`}\n data-testid=\"bridge-slack-link\"\n className=\"inline-flex h-7 items-center rounded-md bg-primary px-2.5 text-caption font-medium text-primary-foreground hover:bg-primary-hover\"\n >\n Link Slack\n </a>\n ) : null}\n {card.action === 'unlink' ? (\n <ActionButton size=\"xs\" data-testid=\"bridge-slack-unlink\" isPending={isUnlinking} pendingLabel=\"Unlinking...\" onClick={unlink}>\n Unlink\n </ActionButton>\n ) : null}\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n </PlaceCard>\n );\n}\n\nfunction WebPushPlace({ fleetId, webPush }: { fleetId: string; webPush: WakeChannels['webPush'] | undefined }) {\n const browsers = webPush?.browsers ?? [];\n const { isTaken, ownEndpoint, working, failure, turnOn, remove } = useWebPush({ fleetId, webPushKey: webPush?.publicKey ?? null });\n const card = webPushCardOf({ isOffered: webPush !== undefined && webPush.publicKey !== null, isTaken, ownEndpoint, browsers });\n const others = browsers.filter(({ endpoint }) => card.action !== 'remove' || endpoint !== ownEndpoint);\n return (\n <PlaceCard place=\"web-push\" name={PLACE_NAMES['web-push']} Icon={PLACE_ICONS['web-push']} card={card}>\n {card.action === 'remove' && ownEndpoint !== undefined ? (\n <ActionButton size=\"xs\" data-testid=\"bridge-web-push-remove\" isPending={working === ownEndpoint} pendingLabel=\"Removing...\" disabled={working !== undefined} onClick={() => { remove(ownEndpoint); }}>\n Remove\n </ActionButton>\n ) : null}\n {card.action === 'turnOn' ? (\n <ActionButton size=\"xs\" data-testid=\"bridge-web-push-on\" isPending={working === 'on'} pendingLabel=\"Turning on...\" disabled={working !== undefined} onClick={turnOn}>\n Turn on\n </ActionButton>\n ) : null}\n {others.map(({ endpoint, browser, isGone }) => (\n <span key={endpoint} data-testid=\"bridge-web-push-browser\" className=\"flex w-full items-center gap-2 text-caption text-muted-foreground\">\n <span className=\"min-w-0 flex-1\">{isGone ? `${browser}: no longer takes wakes` : `Also on in ${browser}`}</span>\n <button type=\"button\" data-testid=\"bridge-web-push-remove-other\" disabled={working !== undefined} onClick={() => { remove(endpoint); }} className=\"underline hover:text-foreground disabled:opacity-50\">\n {working === endpoint ? 'Removing...' : 'Remove'}\n </button>\n </span>\n ))}\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n </PlaceCard>\n );\n}\n\nfunction EmailPlace({ fleetId, routing }: { fleetId: string; routing: RoutingView }) {\n const [isTurning, startTransition] = useTransition();\n const [failure, setFailure] = useState<string | undefined>();\n const card = emailCardOf({ isOffered: routing.offered.email, isOnForAnyJob: routing.jobs.some(({ places }) => places.email) });\n\n const turn = (isOn: boolean) => {\n setFailure(undefined);\n startTransition(async () => {\n for (const change of emailTurnsOf(routing, isOn)) {\n const outcome = await turnRoute({ fleet: fleetId, ...change });\n if (!outcome.isOk) {\n setFailure(outcome.message);\n return;\n }\n }\n });\n };\n\n return (\n <PlaceCard place=\"email\" name={PLACE_NAMES.email} Icon={PLACE_ICONS.email} card={card}>\n {card.action === 'turnOn' || card.action === 'turnOff' ? (\n <ActionButton size=\"xs\" data-testid=\"bridge-email-turn\" isPending={isTurning} pendingLabel={card.action === 'turnOn' ? 'Turning on...' : 'Turning off...'} onClick={() => { turn(card.action === 'turnOn'); }}>\n {card.action === 'turnOn' ? 'Turn on' : 'Turn off'}\n </ActionButton>\n ) : null}\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n </PlaceCard>\n );\n}\n\n/**\n * The places on top of Where things show (Bridge, section 8; the routing\n * mockup), each with its state and its one action: Slack linked or not, the\n * chats connected through the gateway, web push in this browser, and email.\n */\nexport function PlacesPanel({\n fleetId,\n routing,\n slackLink,\n chats,\n webPush,\n}: {\n fleetId: string;\n routing: RoutingView;\n slackLink: SlackLink | null;\n chats: readonly string[];\n webPush: WakeChannels['webPush'] | undefined;\n}) {\n return (\n <section aria-label=\"The places\" className=\"grid gap-2.5 sm:grid-cols-2 lg:grid-cols-4\">\n <SlackPlace fleetId={fleetId} slackLink={slackLink} />\n <PlaceCard place=\"chat\" name={PLACE_NAMES.chat} Icon={PLACE_ICONS.chat} card={chatCardOf(chats)} />\n <WebPushPlace fleetId={fleetId} webPush={webPush} />\n <EmailPlace fleetId={fleetId} routing={routing} />\n </section>\n );\n}\n","/** Where Link Slack starts (gateway scopes 9.3): the button in Bridge's settings and the button in a bot's answer in Slack (src/core/slack/take-slack-event.ts). */\nexport const SLACK_LINK_PATH = '/slack/link';\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'circle-pause',\n size: 24,\n node: [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['line', { x1: '10', x2: '10', y1: '15', y2: '9', key: 'c1nkhi' }],\n ['line', { x1: '14', x2: '14', y1: '15', y2: '9', key: 'h65svq' }],\n ],\n aliases: ['pause-circle'],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name CirclePause\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/circle-pause\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 CirclePause = createLucideIcon(__iconData);\n\nexport default CirclePause;\n","/**\n * What the section of wakes of Bridge's settings works out in the browser (wake a\n * person, W8): the name a browser it turns web push on in is listed by, the\n * gateway's push key as the browser's push manager takes it, and the\n * subscription the browser sends the gateway.\n */\n\n/** A browser's push subscription as the gateway takes it, with the browser's name. */\nexport interface SubscriptionInput {\n readonly endpoint: string;\n readonly keys: { readonly p256dh: string; readonly auth: string };\n readonly browser: string;\n}\n\n/** The browsers and systems a name is made of, the first that matches counting: Edge and Chrome also say Safari, and Chrome says Chrome. */\nconst BROWSERS: readonly (readonly [RegExp, string])[] = [\n [/Edg\\//, 'Edge'],\n [/Firefox\\//, 'Firefox'],\n [/Chrome\\//, 'Chrome'],\n [/Safari\\//, 'Safari'],\n];\nconst SYSTEMS: readonly (readonly [RegExp, string])[] = [\n [/iPhone|iPad/, 'iOS'],\n [/Android/, 'Android'],\n [/Mac OS X/, 'macOS'],\n [/Windows/, 'Windows'],\n [/Linux/, 'Linux'],\n];\n\nconst firstOf = (userAgent: string, names: readonly (readonly [RegExp, string])[]): string | undefined => names.find(([pattern]) => pattern.test(userAgent))?.[1];\n\n/** The name a browser is listed by, such as Firefox on Linux, from its user agent. */\nexport function browserNameOf(userAgent: string): string {\n const browser = firstOf(userAgent, BROWSERS);\n const system = firstOf(userAgent, SYSTEMS);\n if (browser === undefined) {\n return 'A browser';\n }\n return system === undefined ? browser : `${browser} on ${system}`;\n}\n\n/** The bytes a base64url key stands for, as the browser's push manager takes the gateway's key. */\nexport function applicationServerKeyOf(key: string): Uint8Array<ArrayBuffer> {\n const binary = atob(key.replaceAll('-', '+').replaceAll('_', '/'));\n return Uint8Array.from(binary, (character) => character.charCodeAt(0));\n}\n\n/** The subscription to send, from the push manager's own, or none when it gave no endpoint or keys. */\nexport function subscriptionInputOf(subscription: { endpoint?: string; keys?: Record<string, string> }, browser: string): SubscriptionInput | undefined {\n const { endpoint, keys } = subscription;\n const p256dh = keys?.p256dh;\n const auth = keys?.auth;\n return endpoint === undefined || p256dh === undefined || auth === undefined ? undefined : { endpoint, keys: { p256dh, auth }, browser };\n}\n","'use client';\n\nimport { CircleCheck } from 'lucide-react';\nimport { useState, useTransition } from 'react';\n\nimport { turnRoute } from '../hooks/bridge-actions';\nimport { JOB_NAMES, PLACE_NAMES, ROUTED_PLACES, turnedToastOf, type RoutedJob, type RoutedPlace, type RoutingToast, type RoutingView, type WaitingByJob } from '../services/routing';\nimport { Notice } from '../ui/notice';\nimport { BRIDGE_ICON, JOB_ICONS, PLACE_ICONS } from '../ui/place-icons';\nimport { RoutingSwitch } from '../ui/routing-switch';\n\n/** Six columns on desktop: the job, Bridge, then each place. */\nconst ROW = 'sm:grid sm:grid-cols-[1.6fr_repeat(5,1fr)] sm:items-center sm:gap-3';\n\n/** The toast after a change (the routing mockup): what the place now shows. */\nfunction Toast({ toast }: { toast: RoutingToast }) {\n return (\n <div role=\"status\" data-testid=\"bridge-routing-toast\" className=\"flex max-w-[720px] gap-3 rounded-lg border border-border bg-popover py-3.5 pr-3.5 pl-4 text-popover-foreground shadow-lg\">\n <CircleCheck aria-hidden className=\"mt-0.5 size-4 shrink-0 text-tone-ok-fg\" />\n <span className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className=\"font-medium\">{toast.title}</span>\n <span className=\"text-caption text-muted-foreground\">{toast.detail}</span>\n </span>\n </div>\n );\n}\n\n/** A place's cell: on desktop the switch in its column, on the phone a line with the place's name and the switch. */\nfunction PlaceCell({ name, children }: { name: string; children: React.ReactNode }) {\n return (\n <span className=\"flex items-center justify-between sm:block\">\n <span className=\"sm:hidden\">{name}</span>\n {children}\n </span>\n );\n}\n\n/**\n * Routing per job (Bridge, section 8; the routing mockup): per job, the\n * places that show it besides Bridge, which always does. A switch turns a\n * place on or off at once; the toast then says what it shows (CC20). A\n * place the gateway does not offer, or Slack before it is linked, cannot be\n * turned on; one on can always be turned off. On desktop a table, on the\n * phone a card per job.\n */\nexport function RoutingPanel({ fleetId, routing, isSlackLinked, waitingByJob }: { fleetId: string; routing: RoutingView; isSlackLinked: boolean; waitingByJob: WaitingByJob }) {\n const [isTurning, startTransition] = useTransition();\n const [turning, setTurning] = useState<string | undefined>();\n const [toast, setToast] = useState<RoutingToast | undefined>();\n const [failure, setFailure] = useState<string | undefined>();\n const isUsable = (place: RoutedPlace): boolean => routing.offered[place] && (place !== 'slack' || isSlackLinked);\n\n const turn = (change: { job: RoutedJob; place: RoutedPlace; isOn: boolean; isChatOn: boolean }) => {\n setToast(undefined);\n setFailure(undefined);\n setTurning(`${change.job}-${change.place}`);\n startTransition(async () => {\n const { isChatOn, ...route } = change;\n const outcome = await turnRoute({ fleet: fleetId, ...route });\n if (outcome.isOk) {\n setToast(turnedToastOf({ ...route, waiting: waitingByJob[route.job], isChatOn }));\n } else {\n setFailure(outcome.message);\n }\n });\n };\n\n return (\n <section className=\"grid gap-3\" aria-label=\"Per job\">\n <div className=\"grid gap-3 sm:gap-0 sm:overflow-hidden sm:rounded-lg sm:border sm:border-border sm:bg-card\">\n <div aria-hidden className={`hidden min-h-8 bg-muted px-4 text-caption font-medium text-muted-foreground ${ROW}`}>\n <span>Job</span>\n <span className=\"inline-flex items-center gap-1.5\">\n <BRIDGE_ICON className=\"size-3.5\" />\n Bridge\n </span>\n {ROUTED_PLACES.map((place) => {\n const Icon = PLACE_ICONS[place];\n return (\n <span key={place} className=\"inline-flex items-center gap-1.5\">\n <Icon className=\"size-3.5\" />\n {PLACE_NAMES[place]}\n </span>\n );\n })}\n </div>\n {routing.jobs.map(({ job, places }) => {\n const { Icon, tone } = JOB_ICONS[job];\n return (\n <div\n key={job}\n data-testid=\"bridge-routing-job\"\n className={`flex flex-col gap-2 rounded-lg border border-border bg-card p-3 sm:min-h-[52px] sm:rounded-none sm:border-0 sm:border-t sm:px-4 sm:py-1.5 ${ROW}`}\n >\n <span className=\"flex flex-col gap-0.5\">\n <span className=\"inline-flex items-center gap-1.5 font-semibold sm:font-medium\">\n <Icon aria-hidden className={`size-4 shrink-0 ${tone}`} />\n {JOB_NAMES[job].name}\n </span>\n <span className=\"text-caption text-muted-foreground max-sm:hidden\">{JOB_NAMES[job].holds}</span>\n </span>\n <PlaceCell name=\"Bridge\">\n <RoutingSwitch isOn label={`Bridge for ${JOB_NAMES[job].name}`} isDisabled aside=\"Always\" testId={`bridge-routing-${job}-bridge`} />\n </PlaceCell>\n {ROUTED_PLACES.map((place) => {\n const isOn = places[place];\n const key = `${job}-${place}`;\n return (\n <PlaceCell key={place} name={PLACE_NAMES[place]}>\n <RoutingSwitch\n isOn={isOn}\n label={`${PLACE_NAMES[place]} for ${JOB_NAMES[job].name}`}\n isDisabled={isTurning || (!isOn && !isUsable(place))}\n isBusy={isTurning && turning === key}\n {...(job === 'everything-else' && place === 'slack' && !isOn ? { aside: 'Bots only' } : {})}\n testId={`bridge-routing-${key}`}\n onTurn={() => {\n turn({ job, place, isOn: !isOn, isChatOn: places.chat });\n }}\n />\n </PlaceCell>\n );\n })}\n </div>\n );\n })}\n </div>\n {toast === undefined ? null : <Toast toast={toast} />}\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n <p className=\"text-caption text-muted-foreground max-sm:hidden\">While a Bridge page is open in focus, web push and email do not wake you. Slack still posts: you turned it on, and the views stay in step.</p>\n </section>\n );\n}\n","/**\n * A switch for one place of one job (the routing mockup): on or off, small;\n * Bridge's is on and cannot be turned, said beside it as Always; Slack's for\n * everything else, while off, says Bots only beside it.\n */\nexport function RoutingSwitch({\n isOn,\n label,\n isDisabled,\n isBusy = false,\n aside,\n testId,\n onTurn,\n}: {\n isOn: boolean;\n label: string;\n isDisabled: boolean;\n isBusy?: boolean;\n aside?: string;\n testId: string;\n onTurn?: () => void;\n}) {\n return (\n <span className=\"inline-flex items-center gap-2.5\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={isOn}\n aria-label={label}\n aria-busy={isBusy}\n disabled={isDisabled}\n data-testid={testId}\n onClick={onTurn}\n className=\"group inline-flex h-4 w-7 shrink-0 items-center rounded-full bg-input p-0.5 aria-checked:bg-primary disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <span aria-hidden className=\"size-3 rounded-full bg-card shadow-sm transition-transform group-aria-checked:translate-x-3\" />\n </button>\n {aside === undefined ? null : <span className=\"text-caption text-muted-foreground\">{aside}</span>}\n </span>\n );\n}\n"],"names":["$$RSC_SERVER_ACTION_10","$$RSC_SERVER_ACTION_13","RoutingSwitch","isOn","label","isDisabled","isBusy","aside","testId","onTurn","className","type","role","disabled","onClick","undefined"],"mappings":"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","ignoreList":[2,10]}
|
package/web/.next/server/chunks/ssr/web_features_bridge_hooks_bridge-actions_ts_0h-_xm2rcb-ij._.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[43889,a=>{"use strict";var b=a.i(37936),c=a.i(29517),d=a.i(18558),e=a.i(5246);a.i(70396);var f=a.i(73727),g=a.i(55476),h=a.i(66283),i=a.i(29493),j=a.i(74718),k=a.i(15489),l=a.i(27221),m=a.i(26972),n=a.i(54757),n=n,o=a.i(1081),p=a.i(27857),q=a.i(35504);function r(a){let[b=""]=a.split(";");return b.trim().toLowerCase()}let s=k.z.int().min(1),t=l.z.string().min(1),u=m.z.object({key:s,label:t,detail:l.z.string().default("")}),v=m.z.object({id:n.uuid(),title:t,context:l.z.string(),options:o.z.array(u).min(1),pick:m.z.object({option:s,why:t})}).refine(({options:a})=>new Set(a.map(({key:a})=>a)).size===a.length,{message:"Every option has its own number",path:["options"]}).refine(({options:a,pick:b})=>a.some(({key:a})=>a===b.option),{message:"The pick names one of the options",path:["pick","option"]}),w=m.z.object({questionId:n.uuid()}),x=m.z.object({questionId:n.uuid(),question:v}).refine(({questionId:a,question:b})=>b.id!==a,{message:"The new question has a uuid of its own",path:["question","id"]});p.z.union([m.z.object({option:s,note:t.optional()}),m.z.object({note:t})]);let y=p.z.union([m.z.object({questionId:n.uuid(),option:s,note:t.optional()}),m.z.object({questionId:n.uuid(),note:t})]),z=m.z.object({messageId:(0,c.f)("message"),sentAt:q.z.iso.datetime(),option:s.nullable(),note:l.z.string().nullable()});function A(a){try{return JSON.parse(a)}catch{return}}m.z.object({id:n.uuid(),title:l.z.string(),context:l.z.string(),options:o.z.array(u),pick:m.z.object({option:s,why:l.z.string()}),answer:z.nullable()});var B=n;function C(a){if("application/vnd.aeolus.question+json"!==r(a.contentType))return function({contentType:a,payload:b}){if("application/vnd.aeolus.question-withdrawal+json"===r(a)){let a=w.safeParse(A(b));return a.success?{questionId:a.data.questionId,replacement:null}:null}if("application/vnd.aeolus.question-replacement+json"===r(a)){let a=x.safeParse(A(b));return a.success?{questionId:a.data.questionId,replacement:a.data.question}:null}return null}(a)?.replacement??void 0;try{let b=v.safeParse(JSON.parse(a.payload));return b.success?b.data:void 0}catch{return}}let D=m.z.object({title:l.z.string().min(1),why:l.z.string(),link:B.url({protocol:/^https?$/}).optional()}),E=new Map([["application/vnd.aeolus.step+json",D],["application/vnd.aeolus.step-replacement+json",m.z.object({step:D}).transform(({step:a})=>a)]]),F=new Set([j.U,"application/vnd.aeolus.notice+json"]),G=m.z.object({body:l.z.string()});var H=a.i(43959),I=a.i(94705),J=a.i(75879);let K=m.z.object({ship:m.z.object({name:l.z.string().min(1)})});var L=a.i(29660);async function M(a,b){let c;try{c={isOk:!0,value:await b(await (0,h.z)(a))}}catch(c){let b=(0,h.U)(c);if("UNAUTHORIZED"===b)return(0,f.redirect)(`/sign-in/start?${new URLSearchParams({return_to:`${L.P}?${new URLSearchParams({[g.n]:a}).toString()}`}).toString()}`);return void 0===b?{isOk:!1,message:"The gateway did not answer: try again in a moment"}:{isOk:!1,message:(0,h.s)(c),code:b}}return(0,d.revalidatePath)(L.P,"layout"),c}async function N(a,b){return M(a,a=>a.people.record.query({cursor:b}))}async function O(a,b){let c=(await (0,e.headers)()).get("host")??"";return M(a,async a=>{let{contentType:d,payload:e,meetingId:f,...g}=await a.people.open.mutate({deliveryId:b});return{...g,payload:e,body:function(a){let[b=""]=a.contentType.split(";");if(!F.has(b.trim().toLowerCase()))return a.payload;try{return G.safeParse(JSON.parse(a.payload)).data?.body??a.payload}catch{return a.payload}}({contentType:d,payload:e}),question:C({contentType:d,payload:e}),step:function(a,b){let[c=""]=a.contentType.split(";"),d=E.get(c.trim().toLowerCase());if(void 0!==d)try{let c,e=d.safeParse(JSON.parse(a.payload));if(!e.success)return;let{title:f,why:g,link:h}=e.data;return{title:f,why:g,link:void 0===h?void 0:(c=new URL(h),{href:h,address:`${c.host}${c.pathname.replace(/\/$/,"")}`,isOutside:c.host!==b})}}catch{return}}({contentType:d,payload:e},c),alert:(0,H.S)({contentType:d,payload:e}),meetingId:f??void 0,alertShip:function(a){let[b=""]=a.contentType.split(";");if(b.trim().toLowerCase()===j.U)try{return K.safeParse(JSON.parse(a.payload)).data?.ship.name}catch{return}}({contentType:d,payload:e})}})}async function P({fleet:a,deliveryId:b,input:c}){let d=function(a){let b=a.note.trim();if(void 0===a.questionId)return""===b?{isOk:!1,message:"Write your answer first"}:{isOk:!0,value:{contentType:"text/plain",payload:b}};let c=y.safeParse({questionId:a.questionId,...void 0===a.option?{}:{option:a.option},...""===b?{}:{note:b}});return c.success?{isOk:!0,value:{contentType:"application/vnd.aeolus.answer+json",payload:JSON.stringify(c.data)}}:{isOk:!1,message:"Tap an option, or write a note"}}(c);return d.isOk?M(a,async a=>{await a.people.answer.mutate({deliveryId:b,...d.value})}):d}async function Q({fleet:a,deliveryId:b,option:c,optionLabel:d,note:e}){return M(a,async a=>{let{option:f,note:g}=await a.people.putInBasket.mutate({deliveryId:b,option:c,optionLabel:d,note:e});return{option:f,note:g}})}async function R({fleet:a,deliveryId:b,option:c}){return M(a,async a=>{let d=await a.people.open.mutate({deliveryId:b}),e=C(d)?.options.find(({key:a})=>a===c)?.label??null;await a.people.putInBasket.mutate({deliveryId:b,option:c,optionLabel:e,note:""})})}async function S(a,b){return M(a,async a=>{await a.people.removeFromBasket.mutate({questionId:b})})}async function T(a){return M(a,a=>a.people.sendBasket.mutate())}async function U({fleet:a,deliveryId:b,step:c}){return M(a,async a=>{await a.people.done.mutate(void 0===c?{deliveryId:b}:{deliveryId:b,...c})})}async function V(a){return M(a,async a=>{var b;let c,d,[e,f]=await Promise.all([a.people.sendTo.query(),a.people.yourFleet.query().catch(()=>void 0)]);return{sentAs:e.sentAs,ships:(b=e.ships,c=new Map((f?.groups??[]).flatMap(({tiles:a})=>a.map(({name:a,state:b})=>[a,b]))),d=a=>null===a?J.X.length:J.X.indexOf(a),b.map(a=>({name:a,state:c.get(a)??null})).toSorted((a,b)=>d(a.state)-d(b.state)||a.name.localeCompare(b.name)))}})}async function W({fleet:a,to:b,payload:c,idempotencyKey:d}){return M(a,async a=>(await a.people.send.mutate({to:b,payload:c,idempotencyKey:d}),{storedAt:new Date().toISOString()}))}async function X({fleet:a,job:b,place:c,isOn:d}){return M(a,async a=>{await a.people.turnRoute.mutate({job:b,place:c,isOn:d})})}async function Y(a,b){return M(a,async a=>{await a.people.turnOnWebPush.mutate({endpoint:b.endpoint,keys:{p256dh:b.keys.p256dh,auth:b.keys.auth},browser:b.browser})})}async function Z(a,b){return M(a,async a=>{await a.people.turnOffWebPush.mutate({endpoint:b})})}async function $(a){return M(a,async a=>{await a.slack.unlink.mutate()})}async function _({fleet:a,requestId:b,input:d}){if("deny"===d.kind)return M(a,async a=>{await a.requests.decide.mutate({requestId:b,decision:{kind:"deny"}})});let e=(0,c.f)("ship").safeParse(d.ownerShipId.trim());if(!e.success)return{isOk:!1,message:"The owner's ship id is not a ship id (shp_...)"};let f={name:d.name,ownerShipId:e.data,scopes:[...new Set([...I._,...d.scopes])]},{server:g}=d,h=void 0===g?void 0:(0,i.y)(g);return M(a,async a=>{await a.requests.decide.mutate({requestId:b,decision:{kind:"approve",party:f,...void 0===g||void 0===h?{}:{server:{credential:h,concurrencyLimit:g.concurrencyLimit}}}})})}(0,a.i(13095).ensureServerEntryExports)([N,O,P,Q,R,S,T,U,V,W,X,Y,Z,$,_]),(0,b.registerServerReference)(N,"
|
|
1
|
+
module.exports=[43889,a=>{"use strict";var b=a.i(37936),c=a.i(29517),d=a.i(18558),e=a.i(5246);a.i(70396);var f=a.i(73727),g=a.i(55476),h=a.i(66283),i=a.i(29493),j=a.i(74718),k=a.i(15489),l=a.i(27221),m=a.i(26972),n=a.i(54757),n=n,o=a.i(1081),p=a.i(27857),q=a.i(35504);function r(a){let[b=""]=a.split(";");return b.trim().toLowerCase()}let s=k.z.int().min(1),t=l.z.string().min(1),u=m.z.object({key:s,label:t,detail:l.z.string().default("")}),v=m.z.object({id:n.uuid(),title:t,context:l.z.string(),options:o.z.array(u).min(1),pick:m.z.object({option:s,why:t})}).refine(({options:a})=>new Set(a.map(({key:a})=>a)).size===a.length,{message:"Every option has its own number",path:["options"]}).refine(({options:a,pick:b})=>a.some(({key:a})=>a===b.option),{message:"The pick names one of the options",path:["pick","option"]}),w=m.z.object({questionId:n.uuid()}),x=m.z.object({questionId:n.uuid(),question:v}).refine(({questionId:a,question:b})=>b.id!==a,{message:"The new question has a uuid of its own",path:["question","id"]});p.z.union([m.z.object({option:s,note:t.optional()}),m.z.object({note:t})]);let y=p.z.union([m.z.object({questionId:n.uuid(),option:s,note:t.optional()}),m.z.object({questionId:n.uuid(),note:t})]),z=m.z.object({messageId:(0,c.f)("message"),sentAt:q.z.iso.datetime(),option:s.nullable(),note:l.z.string().nullable()});function A(a){try{return JSON.parse(a)}catch{return}}m.z.object({id:n.uuid(),title:l.z.string(),context:l.z.string(),options:o.z.array(u),pick:m.z.object({option:s,why:l.z.string()}),answer:z.nullable()});var B=n;function C(a){if("application/vnd.aeolus.question+json"!==r(a.contentType))return function({contentType:a,payload:b}){if("application/vnd.aeolus.question-withdrawal+json"===r(a)){let a=w.safeParse(A(b));return a.success?{questionId:a.data.questionId,replacement:null}:null}if("application/vnd.aeolus.question-replacement+json"===r(a)){let a=x.safeParse(A(b));return a.success?{questionId:a.data.questionId,replacement:a.data.question}:null}return null}(a)?.replacement??void 0;try{let b=v.safeParse(JSON.parse(a.payload));return b.success?b.data:void 0}catch{return}}let D=m.z.object({title:l.z.string().min(1),why:l.z.string(),link:B.url({protocol:/^https?$/}).optional()}),E=new Map([["application/vnd.aeolus.step+json",D],["application/vnd.aeolus.step-replacement+json",m.z.object({step:D}).transform(({step:a})=>a)]]),F=new Set([j.U,"application/vnd.aeolus.notice+json"]),G=m.z.object({body:l.z.string()});var H=a.i(43959),I=a.i(94705),J=a.i(75879);let K=m.z.object({ship:m.z.object({name:l.z.string().min(1)})});var L=a.i(29660);async function M(a,b){let c;try{c={isOk:!0,value:await b(await (0,h.z)(a))}}catch(c){let b=(0,h.U)(c);if("UNAUTHORIZED"===b)return(0,f.redirect)(`/sign-in/start?${new URLSearchParams({return_to:`${L.P}?${new URLSearchParams({[g.n]:a}).toString()}`}).toString()}`);return void 0===b?{isOk:!1,message:"The gateway did not answer: try again in a moment"}:{isOk:!1,message:(0,h.s)(c),code:b}}return(0,d.revalidatePath)(L.P,"layout"),c}async function N(a,b){return M(a,a=>a.people.record.query({cursor:b}))}async function O(a,b){let c=(await (0,e.headers)()).get("host")??"";return M(a,async a=>{let{contentType:d,payload:e,meetingId:f,...g}=await a.people.open.mutate({deliveryId:b});return{...g,payload:e,body:function(a){let[b=""]=a.contentType.split(";");if(!F.has(b.trim().toLowerCase()))return a.payload;try{return G.safeParse(JSON.parse(a.payload)).data?.body??a.payload}catch{return a.payload}}({contentType:d,payload:e}),question:C({contentType:d,payload:e}),step:function(a,b){let[c=""]=a.contentType.split(";"),d=E.get(c.trim().toLowerCase());if(void 0!==d)try{let c,e=d.safeParse(JSON.parse(a.payload));if(!e.success)return;let{title:f,why:g,link:h}=e.data;return{title:f,why:g,link:void 0===h?void 0:(c=new URL(h),{href:h,address:`${c.host}${c.pathname.replace(/\/$/,"")}`,isOutside:c.host!==b})}}catch{return}}({contentType:d,payload:e},c),alert:(0,H.S)({contentType:d,payload:e}),meetingId:f??void 0,alertShip:function(a){let[b=""]=a.contentType.split(";");if(b.trim().toLowerCase()===j.U)try{return K.safeParse(JSON.parse(a.payload)).data?.ship.name}catch{return}}({contentType:d,payload:e})}})}async function P({fleet:a,deliveryId:b,input:c}){let d=function(a){let b=a.note.trim();if(void 0===a.questionId)return""===b?{isOk:!1,message:"Write your answer first"}:{isOk:!0,value:{contentType:"text/plain",payload:b}};let c=y.safeParse({questionId:a.questionId,...void 0===a.option?{}:{option:a.option},...""===b?{}:{note:b}});return c.success?{isOk:!0,value:{contentType:"application/vnd.aeolus.answer+json",payload:JSON.stringify(c.data)}}:{isOk:!1,message:"Tap an option, or write a note"}}(c);return d.isOk?M(a,async a=>{await a.people.answer.mutate({deliveryId:b,...d.value})}):d}async function Q({fleet:a,deliveryId:b,option:c,optionLabel:d,note:e}){return M(a,async a=>{let{option:f,note:g}=await a.people.putInBasket.mutate({deliveryId:b,option:c,optionLabel:d,note:e});return{option:f,note:g}})}async function R({fleet:a,deliveryId:b,option:c}){return M(a,async a=>{let d=await a.people.open.mutate({deliveryId:b}),e=C(d)?.options.find(({key:a})=>a===c)?.label??null;await a.people.putInBasket.mutate({deliveryId:b,option:c,optionLabel:e,note:""})})}async function S(a,b){return M(a,async a=>{await a.people.removeFromBasket.mutate({questionId:b})})}async function T(a){return M(a,a=>a.people.sendBasket.mutate())}async function U({fleet:a,deliveryId:b,step:c}){return M(a,async a=>{await a.people.done.mutate(void 0===c?{deliveryId:b}:{deliveryId:b,...c})})}async function V(a){return M(a,async a=>{var b;let c,d,[e,f]=await Promise.all([a.people.sendTo.query(),a.people.yourFleet.query().catch(()=>void 0)]);return{sentAs:e.sentAs,ships:(b=e.ships,c=new Map((f?.groups??[]).flatMap(({tiles:a})=>a.map(({name:a,state:b})=>[a,b]))),d=a=>null===a?J.X.length:J.X.indexOf(a),b.map(a=>({name:a,state:c.get(a)??null})).toSorted((a,b)=>d(a.state)-d(b.state)||a.name.localeCompare(b.name)))}})}async function W({fleet:a,to:b,payload:c,idempotencyKey:d}){return M(a,async a=>(await a.people.send.mutate({to:b,payload:c,idempotencyKey:d}),{storedAt:new Date().toISOString()}))}async function X({fleet:a,job:b,place:c,isOn:d}){return M(a,async a=>{await a.people.turnRoute.mutate({job:b,place:c,isOn:d})})}async function Y(a,b){return M(a,async a=>{await a.people.turnOnWebPush.mutate({endpoint:b.endpoint,keys:{p256dh:b.keys.p256dh,auth:b.keys.auth},browser:b.browser})})}async function Z(a,b){return M(a,async a=>{await a.people.turnOffWebPush.mutate({endpoint:b})})}async function $(a){return M(a,async a=>{await a.slack.unlink.mutate()})}async function _({fleet:a,requestId:b,input:d}){if("deny"===d.kind)return M(a,async a=>{await a.requests.decide.mutate({requestId:b,decision:{kind:"deny"}})});let e=(0,c.f)("ship").safeParse(d.ownerShipId.trim());if(!e.success)return{isOk:!1,message:"The owner's ship id is not a ship id (shp_...)"};let f={name:d.name,ownerShipId:e.data,scopes:[...new Set([...I._,...d.scopes])]},{server:g}=d,h=void 0===g?void 0:(0,i.y)(g);return M(a,async a=>{await a.requests.decide.mutate({requestId:b,decision:{kind:"approve",party:f,...void 0===g||void 0===h?{}:{server:{credential:h,concurrencyLimit:g.concurrencyLimit}}}})})}(0,a.i(13095).ensureServerEntryExports)([N,O,P,Q,R,S,T,U,V,W,X,Y,Z,$,_]),(0,b.registerServerReference)(N,"60651bb6c3720357100bb22cf07a2affe2ae5ba9ff",null),(0,b.registerServerReference)(O,"60946b456da6a921986ea3d07b2f6537c5bda01bfa",null),(0,b.registerServerReference)(P,"4005a272c7d42c49369853549fa504bfa2f5a28065",null),(0,b.registerServerReference)(Q,"4043b8bae7efc2281930fbebb86cf40a8f63d03a8e",null),(0,b.registerServerReference)(R,"407b068dc2b43638230da6c1086963ff832b2f1f41",null),(0,b.registerServerReference)(S,"6008bd26cffddf1eb3a19dab7e76beb69f7c7d5cc9",null),(0,b.registerServerReference)(T,"404fcb9ad0887ff9f433e609c4f9a76ab493a7ffee",null),(0,b.registerServerReference)(U,"4006afedfc0a3ba4a084b559962062132da4a87fb3",null),(0,b.registerServerReference)(V,"403fca853218d8cdf03e21b35232e762312fa3df80",null),(0,b.registerServerReference)(W,"409193f858c76b3ea3ef052dd72ff22f37e9d572f4",null),(0,b.registerServerReference)(X,"405ac46a4560b927736870155c56d4790ab18543bd",null),(0,b.registerServerReference)(Y,"60cb33148fea563caed0616680d34d77631b80e0fb",null),(0,b.registerServerReference)(Z,"60f60da8efe172d849607ffc97ccda43a09a8f42b9",null),(0,b.registerServerReference)($,"4020c1fc8cb82c75c38df24fb9199a12e3b1949c70",null),(0,b.registerServerReference)(_,"4014092bc297e94f9971bb84bed1cfc89921b96a8a",null),a.s(["q",0,P,"Q",0,_,"G",0,U,"v",0,O,"y",0,Q,"W",0,R,"F",0,N,"e",0,V,"D",0,S,"K",0,T,"u",0,W,"X",0,Z,"z",0,Y,"f",0,X,"Z",0,$],43889)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=web_features_bridge_hooks_bridge-actions_ts_0h-_xm2rcb-ij._.js.map
|
package/web/.next/server/chunks/ssr/web_features_bridge_state_basket-panel_tsx_1qi_kzld0rfgs._.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[80198,a=>{"use strict";var b=a.i(87924),c=a.i(64831);let d={name:"arrow-right",size:24,node:[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]};d.node;let e=(0,c.f)(d);var f=a.i(70840),g=a.i(52562),h=a.i(93817),i=a.i(97024),j=a.i(2550);let k={name:"clock",size:24,node:[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 6v6l4 2",key:"mmk7yg"}]]};k.node;let l=(0,c.f)(k);var m=a.i(58983);let n={name:"pencil",size:24,node:[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]};n.node;let o=(0,c.f)(n);var p=a.i(59542),q=a.i(74746),r=a.i(55596),s=a.i(74215),t=a.i(72131),u=a.i(81483),v=a.i(5050);let w=(0,v.createServerReference)("40782571a3d14714151f0e9ee3d153d9c227e67e85",v.callServer,void 0,v.findSourceMapURL,"sendBasket");function x(a){return`${new Date(a).toISOString().slice(11,16)} UTC`}let y={bridge:"in Bridge",chat:"in a chat",slack:"in Slack",gateway:"by the gateway"};function z(a){return{desktop:a,phone:a}}function A(a){return 1===a?"1 answer":`${String(a)} answers`}function B(a){return a.length<=1?a.join(""):`${a.slice(0,-1).join(", ")} and ${a.at(-1)??""}`}function C(a){return[...new Set(a.map(({from:a})=>a))]}var D=a.i(32043),E=a.i(10039),F=a.i(91777);let G={sent:i.f,sending:m.f,next:l,unanswered:m.f,refused:h.f,withdrawn:f.f,replaced:p.f,elsewhere:g.f},H={ok:"text-tone-ok-fg",waiting:"text-tone-waiting-fg",attention:"text-tone-attention-fg",off:"text-muted-foreground"};function I({words:a}){return a.desktop===a.phone?(0,b.jsx)("span",{children:a.desktop}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{className:"hidden sm:inline",children:a.desktop}),(0,b.jsx)("span",{className:"sm:hidden",children:a.phone})]})}function J({line:a}){let c=G[a.icon];return(0,b.jsxs)("p",{"data-testid":"bridge-basket-standing",className:"col-span-2 col-start-2 flex items-start gap-1.5 text-meta",children:[(0,b.jsx)(c,{"aria-hidden":!0,className:`mt-0.5 size-3.5 shrink-0 ${H[a.tone]}`}),(0,b.jsx)("span",{children:(0,b.jsx)(I,{words:a.words})})]})}function K({entry:a,line:c,opening:d,working:f,onRemove:g}){let{standing:h}=a,i="withdrawn"===h.kind||"replaced"===h.kind||"dealtElsewhere"===h.kind,k=void 0!==f||void 0!==d.openingId,l=f?.kind==="remove"&&f.questionId===a.questionId,m="replaced"===h.kind?h.replacementId:null,n=i?"line-through decoration-muted-foreground":"";return(0,b.jsxs)("li",{"data-testid":"bridge-basket-entry","data-standing":h.kind,className:`grid grid-cols-[18px_1fr_auto] items-start gap-x-2.5 gap-y-1.5 border-t border-border p-3 first:border-t-0 sm:px-3.5 ${i?"bg-muted":""}`,children:[(0,b.jsx)(j.f,{"aria-hidden":!0,className:"mt-0.5 size-4 text-tone-active-fg"}),(0,b.jsxs)("div",{className:"flex min-w-0 flex-col gap-0.5",children:[(0,b.jsx)("span",{className:`font-medium ${n}`,children:a.title}),(0,b.jsxs)("span",{className:"flex flex-wrap items-center gap-1.5 text-caption text-muted-foreground",children:[(0,b.jsxs)("span",{children:["to ",(0,b.jsx)("b",{className:"font-medium text-foreground",children:a.from})]}),(0,b.jsx)("span",{"aria-hidden":!0,className:"hidden text-border sm:inline",children:"·"}),(0,b.jsxs)("span",{className:"hidden sm:inline",children:["asked at ",(0,b.jsx)("time",{dateTime:a.sentAt,children:x(a.sentAt)})]})]}),(0,b.jsxs)("span",{className:`${i?"hidden sm:flex":"flex"} items-center gap-1.5 text-meta ${n}`,children:[(0,b.jsx)(e,{"aria-hidden":!0,className:"size-3.5 shrink-0 text-primary"}),null===a.option?"Note alone":null===a.optionLabel?`Option ${String(a.option)}`:`${String(a.option)}. ${a.optionLabel}`]}),null===a.note?null:(0,b.jsxs)("span",{className:"text-caption italic text-muted-foreground",children:['"',a.note,'"']})]}),"waiting"===h.kind?(0,b.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,b.jsxs)(D.i,{"data-testid":"bridge-basket-change",size:"small","aria-label":"Change",isPending:d.openingId===a.deliveryId,pendingLabel:"Opening...",disabled:k,onClick:()=>{d.open({deliveryId:a.deliveryId,job:"decide",inBasket:{option:a.option,note:a.note}})},children:[(0,b.jsx)(o,{"aria-hidden":!0,className:"size-3.5"}),(0,b.jsx)("span",{className:"hidden sm:inline",children:"Change"})]}),(0,b.jsxs)(D.i,{"data-testid":"bridge-basket-remove",size:"small",variant:"ghost","aria-label":"Remove",isPending:l,pendingLabel:"Removing...",disabled:k,onClick:()=>{g(a.questionId)},children:[(0,b.jsx)(s.X,{"aria-hidden":!0,className:"size-4 sm:hidden"}),(0,b.jsx)("span",{className:"hidden sm:inline",children:"Remove"})]})]}):(0,b.jsx)("span",{}),void 0===c?null:(0,b.jsx)(J,{line:c}),d.failure?.deliveryId===a.deliveryId?(0,b.jsx)("div",{className:"col-span-2 col-start-2",children:(0,b.jsx)(E.f,{message:d.failure.message,isFailure:!0})}):null,"withdrawn"===h.kind||"replaced"===h.kind||"dealtElsewhere"===h.kind||"refused"===h.kind?(0,b.jsxs)("div",{className:"col-span-2 col-start-2 flex flex-wrap items-center gap-1.5",children:[null===m?null:(0,b.jsxs)(D.i,{"data-testid":"bridge-replacement",size:"small",isPending:d.openingId===m,pendingLabel:"Opening...",disabled:k,onClick:()=>{d.open({deliveryId:m,job:"decide"})},children:[(0,b.jsx)(e,{"aria-hidden":!0,className:"size-3.5"}),"Answer the new question"]}),(0,b.jsx)(D.i,{"data-testid":"bridge-basket-remove",size:"small",variant:"replaced"===h.kind?"ghost":"secondary",isPending:l,pendingLabel:"Removing...",disabled:k,onClick:()=>{g(a.questionId)},children:"refused"===h.kind?"Remove and mark done":"Remove"})]}):null]})}function L({foot:a,isSending:c,isWorking:d,onSend:e}){return"none"===a.kind?null:(0,b.jsxs)("div",{"data-testid":"bridge-basket-foot",className:"flex flex-col items-stretch gap-2 border-t border-border bg-card p-3 sm:flex-row sm:items-center sm:gap-3 sm:px-3.5",children:[(0,b.jsx)("p",{className:"flex-1 text-caption text-muted-foreground",children:(0,b.jsx)(I,{words:a.words})}),"send"===a.kind?(0,b.jsxs)(D.i,{"data-testid":"bridge-basket-send",variant:"primary",className:"justify-center",isPending:c,pendingLabel:"Sending...",disabled:d,onClick:e,children:[(0,b.jsx)(q.f,{"aria-hidden":!0,className:"size-4"}),a.label]}):null,"sending"===a.kind?(0,b.jsxs)("button",{type:"button","data-testid":"bridge-basket-sending",disabled:!0,"aria-busy":"true",className:"inline-flex h-9 items-center justify-center gap-2 rounded-md border border-border bg-card px-4 font-medium text-card-foreground",children:[(0,b.jsx)(m.f,{"aria-hidden":!0,className:"size-4 animate-spin"}),a.progress]}):null]})}function M({summary:a}){return(0,b.jsxs)("div",{"data-testid":"bridge-basket-sent",role:"status",className:"flex max-w-[620px] items-start gap-3 rounded-lg border border-border bg-popover p-4 text-popover-foreground shadow-lg",children:[(0,b.jsx)(i.f,{"aria-hidden":!0,className:"mt-0.5 size-4 shrink-0 text-tone-ok-fg"}),(0,b.jsxs)("span",{className:"grid gap-1",children:[(0,b.jsx)("span",{className:"font-medium",children:a.title}),(0,b.jsx)("span",{className:"text-caption text-muted-foreground",children:a.description})]})]})}function N(){return(0,b.jsxs)("div",{"data-testid":"bridge-basket-empty",className:"grid max-w-[820px] justify-items-center gap-3 rounded-lg border border-dashed border-border bg-card px-6 py-10 text-center",children:[(0,b.jsx)("span",{className:"inline-flex size-11 items-center justify-center rounded-lg bg-secondary text-muted-foreground",children:(0,b.jsx)(r.f,{"aria-hidden":!0,className:"size-5"})}),(0,b.jsx)("span",{className:"text-heading font-semibold",children:"The basket is empty"}),(0,b.jsx)("span",{className:"max-w-[360px] text-muted-foreground",children:"Pick an option on a question and put it in the basket; it waits here until you send it."})]})}a.s(["BasketPanel",0,function({fleetId:a,basket:c}){let d,e,[f,g]=(0,t.useState)(),[h,i]=(0,t.useState)(),[,j]=(0,t.useTransition)(),k=(d=c.entries.some(({standing:a})=>"sent"===a.kind),e=c.entries.find(({standing:a})=>"sending"===a.kind&&!a.isUnanswered),c.entries.map(a=>(function(a,b){let{standing:c,from:d}=a;switch(c.kind){case"waiting":return;case"sent":{let a=x(c.at);return{icon:"sent",tone:"ok",words:{desktop:`Sent at ${a} and stored. Done.`,phone:`Sent at ${a}. Done.`}}}case"sending":if(c.isUnanswered)return{icon:"unanswered",tone:"waiting",words:{desktop:"The fleet did not answer. Sending again with the same key until it is stored; it arrives once.",phone:"No answer from the fleet. Sending again, same key."}};return b.isSendingNow?{icon:"sending",tone:"waiting",words:z("Sending...")}:{icon:"next",tone:"waiting",words:{desktop:"Next, in the order you added it",phone:"Next"}};case"refused":{let a=`Not sent: ${c.reason}.`,[d=c.reason]=c.reason.split(", so ");return{icon:"refused",tone:"attention",words:{desktop:b.isAnySent?`${a} The others were sent.`:a,phone:`Not sent: ${d}.`}}}case"withdrawn":return{icon:"withdrawn",tone:"off",words:{desktop:`Withdrawn by ${d} at ${x(c.at)}. Not sent; Send skips it.`,phone:`Withdrawn by ${d}. Not sent.`}};case"replaced":{let a=null===c.replacementTitle?".":` with "${c.replacementTitle}"`;return{icon:"replaced",tone:"off",words:{desktop:`Replaced by ${d} at ${x(c.at)}${a} Not sent: its options differ, so answer the new one.`,phone:`Replaced by ${d}. Not sent.`}}}case"dealtElsewhere":return{icon:"elsewhere",tone:"off",words:z(null===c.option?`Done ${y[c.place]}. Nothing is sent from it.`:`Answered ${y[c.place]}: option ${String(c.option)}. Nothing is sent from it.`)}}})(a,{isAnySent:d,isSendingNow:a===e}))),l=function(a){let{entries:b}=a;if(0===b.length||b.some(({standing:a})=>"sent"!==a.kind))return;let c=`To ${B(C(b))}, as you;`;return{title:`${A(b.length)} sent`,description:1===b.length?`${c} stored, and in Done.`:`${c} each stored, each in Done.`}}(c),m=b=>{g({kind:"remove",questionId:b}),i(void 0),j(async()=>{let c=await (0,u.f)(a,b);g(void 0),i(c.isOk?void 0:c.message)})},n=()=>{g({kind:"send"}),i(void 0),j(async()=>{let b=await w(a);g(void 0),i(b.isOk?void 0:b.message)})};return(0,b.jsx)(F.f,{fleetId:a,children:a=>(0,b.jsxs)("section",{className:"grid gap-4","aria-labelledby":"bridge-basket-heading",children:[(0,b.jsxs)("div",{className:"hidden sm:block",children:[(0,b.jsxs)("h1",{id:"bridge-basket-heading",className:"text-heading font-semibold",children:["Basket ",(0,b.jsx)("span",{"data-testid":"bridge-basket-count",className:"text-primary",children:c.count})]}),(0,b.jsx)("p",{className:"text-caption text-muted-foreground",children:"Answers you picked in Bridge, not sent yet. Nothing goes until you press Send."})]}),void 0===h?null:(0,b.jsx)(E.f,{message:h,isFailure:!0}),void 0===l?null:(0,b.jsx)(M,{summary:l}),0===c.entries.length||void 0!==l?(0,b.jsx)(N,{}):(0,b.jsxs)("div",{className:"max-w-[820px] overflow-hidden rounded-lg border border-border bg-card",children:[(0,b.jsx)("ul",{children:c.entries.map((c,d)=>(0,b.jsx)(K,{entry:c,line:k[d],opening:a,working:f,onRemove:m},c.questionId))}),(0,b.jsx)(L,{foot:function(a){if(a.toSend>0)return function(a){var b;let c=function(a){let b=b=>a.filter(({standing:a})=>a.kind===b).length,c=["withdrawn","replaced"].map(a=>({kind:a,count:b(a)})).filter(({count:a})=>a>0),d=c.map(({kind:a,count:b},d)=>b>1?`the ${String(b)} ${a}`:d===c.length-1?`the ${a} one`:`the ${a}`),e=b("dealtElsewhere"),f=0===e?d:[...d,1===e?"the one answered elsewhere":`the ${String(e)} answered elsewhere`];if(0===f.length)return;let g=B(f),h=1===c.reduce((a,{count:b})=>a+b,e);return`${g.charAt(0).toUpperCase()}${g.slice(1)} ${h?"is":"are"} not sent.`}(a.entries),d=(b=a.toSend,`Send ${A(b)}`);if(void 0!==c)return{kind:"send",words:{desktop:`${String(a.toSend)} to send. ${c}`,phone:c},label:d};let e=a.entries.filter(({standing:a})=>"waiting"===a.kind),f=C(e),g=f.length>1?"each receive their own answer":e.length>1?"receives its own answer to each":"receives its own answer";return{kind:"send",words:{desktop:`${B(f)} ${g}, as you, as if sent one by one.`,phone:"Each asker receives its own answer."},label:d}}(a);let b=a.entries.map(({standing:a})=>a),c=b.filter(({kind:a})=>"sent"===a).length,d=b.filter(({kind:a})=>"sending"===a).length,e=b.filter(({kind:a})=>"refused"===a).length,f=b.some(a=>"sending"===a.kind&&a.isUnanswered);if(d>0&&0===e&&!f)return{kind:"sending",words:{desktop:"You can close Bridge: the gateway keeps sending what is stored as sending.",phone:"You can close Bridge; the gateway keeps sending."},progress:`Sending ${String(c+1)} of ${String(c+d)}`};if(0===d&&0===e)return{kind:"none"};let g=(a,b)=>0===a?[]:[`${String(a)} ${b}`];return{kind:"summary",words:{desktop:`${[...g(c,"sent"),...g(d,"still sending"),...g(e,"not sent")].join(", ")}.`,phone:`${[...g(c,"sent"),...g(d,"sending"),...g(e,"not sent")].join(", ")}.`}}}(c),isSending:f?.kind==="send",isWorking:void 0!==f||void 0!==a.openingId,onSend:n})]})]})})}],80198)}];
|
|
1
|
+
module.exports=[80198,a=>{"use strict";var b=a.i(87924),c=a.i(64831);let d={name:"arrow-right",size:24,node:[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]};d.node;let e=(0,c.f)(d);var f=a.i(70840),g=a.i(52562),h=a.i(93817),i=a.i(97024),j=a.i(2550);let k={name:"clock",size:24,node:[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 6v6l4 2",key:"mmk7yg"}]]};k.node;let l=(0,c.f)(k);var m=a.i(58983);let n={name:"pencil",size:24,node:[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]};n.node;let o=(0,c.f)(n);var p=a.i(59542),q=a.i(74746),r=a.i(55596),s=a.i(74215),t=a.i(72131),u=a.i(63591),v=a.i(5050);let w=(0,v.createServerReference)("404fcb9ad0887ff9f433e609c4f9a76ab493a7ffee",v.callServer,void 0,v.findSourceMapURL,"sendBasket");function x(a){return`${new Date(a).toISOString().slice(11,16)} UTC`}let y={bridge:"in Bridge",chat:"in a chat",slack:"in Slack",gateway:"by the gateway"};function z(a){return{desktop:a,phone:a}}function A(a){return 1===a?"1 answer":`${String(a)} answers`}function B(a){return a.length<=1?a.join(""):`${a.slice(0,-1).join(", ")} and ${a.at(-1)??""}`}function C(a){return[...new Set(a.map(({from:a})=>a))]}var D=a.i(32043),E=a.i(10039),F=a.i(91777);let G={sent:i.f,sending:m.f,next:l,unanswered:m.f,refused:h.f,withdrawn:f.f,replaced:p.f,elsewhere:g.f},H={ok:"text-tone-ok-fg",waiting:"text-tone-waiting-fg",attention:"text-tone-attention-fg",off:"text-muted-foreground"};function I({words:a}){return a.desktop===a.phone?(0,b.jsx)("span",{children:a.desktop}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{className:"hidden sm:inline",children:a.desktop}),(0,b.jsx)("span",{className:"sm:hidden",children:a.phone})]})}function J({line:a}){let c=G[a.icon];return(0,b.jsxs)("p",{"data-testid":"bridge-basket-standing",className:"col-span-2 col-start-2 flex items-start gap-1.5 text-meta",children:[(0,b.jsx)(c,{"aria-hidden":!0,className:`mt-0.5 size-3.5 shrink-0 ${H[a.tone]}`}),(0,b.jsx)("span",{children:(0,b.jsx)(I,{words:a.words})})]})}function K({entry:a,line:c,opening:d,working:f,onRemove:g}){let{standing:h}=a,i="withdrawn"===h.kind||"replaced"===h.kind||"dealtElsewhere"===h.kind,k=void 0!==f||void 0!==d.openingId,l=f?.kind==="remove"&&f.questionId===a.questionId,m="replaced"===h.kind?h.replacementId:null,n=i?"line-through decoration-muted-foreground":"";return(0,b.jsxs)("li",{"data-testid":"bridge-basket-entry","data-standing":h.kind,className:`grid grid-cols-[18px_1fr_auto] items-start gap-x-2.5 gap-y-1.5 border-t border-border p-3 first:border-t-0 sm:px-3.5 ${i?"bg-muted":""}`,children:[(0,b.jsx)(j.f,{"aria-hidden":!0,className:"mt-0.5 size-4 text-tone-active-fg"}),(0,b.jsxs)("div",{className:"flex min-w-0 flex-col gap-0.5",children:[(0,b.jsx)("span",{className:`font-medium ${n}`,children:a.title}),(0,b.jsxs)("span",{className:"flex flex-wrap items-center gap-1.5 text-caption text-muted-foreground",children:[(0,b.jsxs)("span",{children:["to ",(0,b.jsx)("b",{className:"font-medium text-foreground",children:a.from})]}),(0,b.jsx)("span",{"aria-hidden":!0,className:"hidden text-border sm:inline",children:"·"}),(0,b.jsxs)("span",{className:"hidden sm:inline",children:["asked at ",(0,b.jsx)("time",{dateTime:a.sentAt,children:x(a.sentAt)})]})]}),(0,b.jsxs)("span",{className:`${i?"hidden sm:flex":"flex"} items-center gap-1.5 text-meta ${n}`,children:[(0,b.jsx)(e,{"aria-hidden":!0,className:"size-3.5 shrink-0 text-primary"}),null===a.option?"Note alone":null===a.optionLabel?`Option ${String(a.option)}`:`${String(a.option)}. ${a.optionLabel}`]}),null===a.note?null:(0,b.jsxs)("span",{className:"text-caption italic text-muted-foreground",children:['"',a.note,'"']})]}),"waiting"===h.kind?(0,b.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,b.jsxs)(D.i,{"data-testid":"bridge-basket-change",size:"small","aria-label":"Change",isPending:d.openingId===a.deliveryId,pendingLabel:"Opening...",disabled:k,onClick:()=>{d.open({deliveryId:a.deliveryId,job:"decide",inBasket:{option:a.option,note:a.note}})},children:[(0,b.jsx)(o,{"aria-hidden":!0,className:"size-3.5"}),(0,b.jsx)("span",{className:"hidden sm:inline",children:"Change"})]}),(0,b.jsxs)(D.i,{"data-testid":"bridge-basket-remove",size:"small",variant:"ghost","aria-label":"Remove",isPending:l,pendingLabel:"Removing...",disabled:k,onClick:()=>{g(a.questionId)},children:[(0,b.jsx)(s.X,{"aria-hidden":!0,className:"size-4 sm:hidden"}),(0,b.jsx)("span",{className:"hidden sm:inline",children:"Remove"})]})]}):(0,b.jsx)("span",{}),void 0===c?null:(0,b.jsx)(J,{line:c}),d.failure?.deliveryId===a.deliveryId?(0,b.jsx)("div",{className:"col-span-2 col-start-2",children:(0,b.jsx)(E.f,{message:d.failure.message,isFailure:!0})}):null,"withdrawn"===h.kind||"replaced"===h.kind||"dealtElsewhere"===h.kind||"refused"===h.kind?(0,b.jsxs)("div",{className:"col-span-2 col-start-2 flex flex-wrap items-center gap-1.5",children:[null===m?null:(0,b.jsxs)(D.i,{"data-testid":"bridge-replacement",size:"small",isPending:d.openingId===m,pendingLabel:"Opening...",disabled:k,onClick:()=>{d.open({deliveryId:m,job:"decide"})},children:[(0,b.jsx)(e,{"aria-hidden":!0,className:"size-3.5"}),"Answer the new question"]}),(0,b.jsx)(D.i,{"data-testid":"bridge-basket-remove",size:"small",variant:"replaced"===h.kind?"ghost":"secondary",isPending:l,pendingLabel:"Removing...",disabled:k,onClick:()=>{g(a.questionId)},children:"refused"===h.kind?"Remove and mark done":"Remove"})]}):null]})}function L({foot:a,isSending:c,isWorking:d,onSend:e}){return"none"===a.kind?null:(0,b.jsxs)("div",{"data-testid":"bridge-basket-foot",className:"flex flex-col items-stretch gap-2 border-t border-border bg-card p-3 sm:flex-row sm:items-center sm:gap-3 sm:px-3.5",children:[(0,b.jsx)("p",{className:"flex-1 text-caption text-muted-foreground",children:(0,b.jsx)(I,{words:a.words})}),"send"===a.kind?(0,b.jsxs)(D.i,{"data-testid":"bridge-basket-send",variant:"primary",className:"justify-center",isPending:c,pendingLabel:"Sending...",disabled:d,onClick:e,children:[(0,b.jsx)(q.f,{"aria-hidden":!0,className:"size-4"}),a.label]}):null,"sending"===a.kind?(0,b.jsxs)("button",{type:"button","data-testid":"bridge-basket-sending",disabled:!0,"aria-busy":"true",className:"inline-flex h-9 items-center justify-center gap-2 rounded-md border border-border bg-card px-4 font-medium text-card-foreground",children:[(0,b.jsx)(m.f,{"aria-hidden":!0,className:"size-4 animate-spin"}),a.progress]}):null]})}function M({summary:a}){return(0,b.jsxs)("div",{"data-testid":"bridge-basket-sent",role:"status",className:"flex max-w-[620px] items-start gap-3 rounded-lg border border-border bg-popover p-4 text-popover-foreground shadow-lg",children:[(0,b.jsx)(i.f,{"aria-hidden":!0,className:"mt-0.5 size-4 shrink-0 text-tone-ok-fg"}),(0,b.jsxs)("span",{className:"grid gap-1",children:[(0,b.jsx)("span",{className:"font-medium",children:a.title}),(0,b.jsx)("span",{className:"text-caption text-muted-foreground",children:a.description})]})]})}function N(){return(0,b.jsxs)("div",{"data-testid":"bridge-basket-empty",className:"grid max-w-[820px] justify-items-center gap-3 rounded-lg border border-dashed border-border bg-card px-6 py-10 text-center",children:[(0,b.jsx)("span",{className:"inline-flex size-11 items-center justify-center rounded-lg bg-secondary text-muted-foreground",children:(0,b.jsx)(r.f,{"aria-hidden":!0,className:"size-5"})}),(0,b.jsx)("span",{className:"text-heading font-semibold",children:"The basket is empty"}),(0,b.jsx)("span",{className:"max-w-[360px] text-muted-foreground",children:"Pick an option on a question and put it in the basket; it waits here until you send it."})]})}a.s(["BasketPanel",0,function({fleetId:a,basket:c}){let d,e,[f,g]=(0,t.useState)(),[h,i]=(0,t.useState)(),[,j]=(0,t.useTransition)(),k=(d=c.entries.some(({standing:a})=>"sent"===a.kind),e=c.entries.find(({standing:a})=>"sending"===a.kind&&!a.isUnanswered),c.entries.map(a=>(function(a,b){let{standing:c,from:d}=a;switch(c.kind){case"waiting":return;case"sent":{let a=x(c.at);return{icon:"sent",tone:"ok",words:{desktop:`Sent at ${a} and stored. Done.`,phone:`Sent at ${a}. Done.`}}}case"sending":if(c.isUnanswered)return{icon:"unanswered",tone:"waiting",words:{desktop:"The fleet did not answer. Sending again with the same key until it is stored; it arrives once.",phone:"No answer from the fleet. Sending again, same key."}};return b.isSendingNow?{icon:"sending",tone:"waiting",words:z("Sending...")}:{icon:"next",tone:"waiting",words:{desktop:"Next, in the order you added it",phone:"Next"}};case"refused":{let a=`Not sent: ${c.reason}.`,[d=c.reason]=c.reason.split(", so ");return{icon:"refused",tone:"attention",words:{desktop:b.isAnySent?`${a} The others were sent.`:a,phone:`Not sent: ${d}.`}}}case"withdrawn":return{icon:"withdrawn",tone:"off",words:{desktop:`Withdrawn by ${d} at ${x(c.at)}. Not sent; Send skips it.`,phone:`Withdrawn by ${d}. Not sent.`}};case"replaced":{let a=null===c.replacementTitle?".":` with "${c.replacementTitle}"`;return{icon:"replaced",tone:"off",words:{desktop:`Replaced by ${d} at ${x(c.at)}${a} Not sent: its options differ, so answer the new one.`,phone:`Replaced by ${d}. Not sent.`}}}case"dealtElsewhere":return{icon:"elsewhere",tone:"off",words:z(null===c.option?`Done ${y[c.place]}. Nothing is sent from it.`:`Answered ${y[c.place]}: option ${String(c.option)}. Nothing is sent from it.`)}}})(a,{isAnySent:d,isSendingNow:a===e}))),l=function(a){let{entries:b}=a;if(0===b.length||b.some(({standing:a})=>"sent"!==a.kind))return;let c=`To ${B(C(b))}, as you;`;return{title:`${A(b.length)} sent`,description:1===b.length?`${c} stored, and in Done.`:`${c} each stored, each in Done.`}}(c),m=b=>{g({kind:"remove",questionId:b}),i(void 0),j(async()=>{let c=await (0,u.f)(a,b);g(void 0),i(c.isOk?void 0:c.message)})},n=()=>{g({kind:"send"}),i(void 0),j(async()=>{let b=await w(a);g(void 0),i(b.isOk?void 0:b.message)})};return(0,b.jsx)(F.f,{fleetId:a,children:a=>(0,b.jsxs)("section",{className:"grid gap-4","aria-labelledby":"bridge-basket-heading",children:[(0,b.jsxs)("div",{className:"hidden sm:block",children:[(0,b.jsxs)("h1",{id:"bridge-basket-heading",className:"text-heading font-semibold",children:["Basket ",(0,b.jsx)("span",{"data-testid":"bridge-basket-count",className:"text-primary",children:c.count})]}),(0,b.jsx)("p",{className:"text-caption text-muted-foreground",children:"Answers you picked in Bridge, not sent yet. Nothing goes until you press Send."})]}),void 0===h?null:(0,b.jsx)(E.f,{message:h,isFailure:!0}),void 0===l?null:(0,b.jsx)(M,{summary:l}),0===c.entries.length||void 0!==l?(0,b.jsx)(N,{}):(0,b.jsxs)("div",{className:"max-w-[820px] overflow-hidden rounded-lg border border-border bg-card",children:[(0,b.jsx)("ul",{children:c.entries.map((c,d)=>(0,b.jsx)(K,{entry:c,line:k[d],opening:a,working:f,onRemove:m},c.questionId))}),(0,b.jsx)(L,{foot:function(a){if(a.toSend>0)return function(a){var b;let c=function(a){let b=b=>a.filter(({standing:a})=>a.kind===b).length,c=["withdrawn","replaced"].map(a=>({kind:a,count:b(a)})).filter(({count:a})=>a>0),d=c.map(({kind:a,count:b},d)=>b>1?`the ${String(b)} ${a}`:d===c.length-1?`the ${a} one`:`the ${a}`),e=b("dealtElsewhere"),f=0===e?d:[...d,1===e?"the one answered elsewhere":`the ${String(e)} answered elsewhere`];if(0===f.length)return;let g=B(f),h=1===c.reduce((a,{count:b})=>a+b,e);return`${g.charAt(0).toUpperCase()}${g.slice(1)} ${h?"is":"are"} not sent.`}(a.entries),d=(b=a.toSend,`Send ${A(b)}`);if(void 0!==c)return{kind:"send",words:{desktop:`${String(a.toSend)} to send. ${c}`,phone:c},label:d};let e=a.entries.filter(({standing:a})=>"waiting"===a.kind),f=C(e),g=f.length>1?"each receive their own answer":e.length>1?"receives its own answer to each":"receives its own answer";return{kind:"send",words:{desktop:`${B(f)} ${g}, as you, as if sent one by one.`,phone:"Each asker receives its own answer."},label:d}}(a);let b=a.entries.map(({standing:a})=>a),c=b.filter(({kind:a})=>"sent"===a).length,d=b.filter(({kind:a})=>"sending"===a).length,e=b.filter(({kind:a})=>"refused"===a).length,f=b.some(a=>"sending"===a.kind&&a.isUnanswered);if(d>0&&0===e&&!f)return{kind:"sending",words:{desktop:"You can close Bridge: the gateway keeps sending what is stored as sending.",phone:"You can close Bridge; the gateway keeps sending."},progress:`Sending ${String(c+1)} of ${String(c+d)}`};if(0===d&&0===e)return{kind:"none"};let g=(a,b)=>0===a?[]:[`${String(a)} ${b}`];return{kind:"summary",words:{desktop:`${[...g(c,"sent"),...g(d,"still sending"),...g(e,"not sent")].join(", ")}.`,phone:`${[...g(c,"sent"),...g(d,"sending"),...g(e,"not sent")].join(", ")}.`}}}(c),isSending:f?.kind==="send",isWorking:void 0!==f||void 0!==a.openingId,onSend:n})]})]})})}],80198)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=web_features_bridge_state_basket-panel_tsx_1qi_kzld0rfgs._.js.map
|