@aeolus-fleet/gateway 0.29.0 → 0.29.1
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 +30 -30
- package/web/.next/fallback-build-manifest.json +3 -3
- package/web/.next/prerender-manifest.json +3 -3
- 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/app/outside-parties/[name]/change/page/server-reference-manifest.json +3 -3
- package/web/.next/server/app/outside-parties/[name]/change/page.js.nft.json +1 -1
- package/web/.next/server/app/outside-parties/[name]/change/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/outside-parties/[name]/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/outside-parties/[name]/page.js.nft.json +1 -1
- package/web/.next/server/app/outside-parties/[name]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/outside-parties/[name]/retire/page/server-reference-manifest.json +3 -3
- package/web/.next/server/app/outside-parties/[name]/retire/page.js.nft.json +1 -1
- package/web/.next/server/app/outside-parties/[name]/retire/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/outside-parties/add/page/server-reference-manifest.json +3 -3
- package/web/.next/server/app/outside-parties/add/page.js.nft.json +1 -1
- package/web/.next/server/app/outside-parties/add/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/outside-parties/page/server-reference-manifest.json +2 -2
- package/web/.next/server/app/outside-parties/page.js.nft.json +1 -1
- package/web/.next/server/app/outside-parties/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/overview/page/server-reference-manifest.json +4 -4
- package/web/.next/server/app/overview/page.js.nft.json +1 -1
- package/web/.next/server/app/overview/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/overview/requests/[requestId]/page/server-reference-manifest.json +2 -2
- package/web/.next/server/app/overview/requests/[requestId]/page.js.nft.json +1 -1
- package/web/.next/server/app/overview/requests/[requestId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/parties/page/server-reference-manifest.json +7 -7
- package/web/.next/server/app/parties/page.js.nft.json +1 -1
- package/web/.next/server/app/parties/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/sign-in/failed/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/sign-in/failed/page.js.nft.json +1 -1
- package/web/.next/server/app/sign-in/failed/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_overview_requests_[requestId]_page_actions_08cpboirhdm8t.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_overview_requests_[requestId]_page_actions_08cpboirhdm8t.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0-liudmjwlqmo._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11e7zi5yg_f_4._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11e7zi5yg_f_4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1qpk1uw97id0a._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1qpk1uw97id0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1yyfc4xf3xa-s._.js +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/_03xm-6l-r6ko0._.js +1 -1
- package/web/.next/server/chunks/ssr/_03xm-6l-r6ko0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_04iwj3w0divwb._.js +1 -1
- package/web/.next/server/chunks/ssr/_04iwj3w0divwb._.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/_13qzwpag13tvy._.js +1 -1
- package/web/.next/server/chunks/ssr/_13qzwpag13tvy._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1bfq0g9c1iw__._.js +1 -1
- package/web/.next/server/chunks/ssr/_1bfq0g9c1iw__._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1jfy4064jcghi._.js +1 -1
- package/web/.next/server/chunks/ssr/_1jfy4064jcghi._.js.map +1 -1
- 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__next-internal_server_app_outside-parties_add_page_actions_0wclx47vjdhe6.js +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_outside-parties_add_page_actions_0wclx47vjdhe6.js.map +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_overview_page_actions_0hxu14a57nlf2.js +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_overview_page_actions_0hxu14a57nlf2.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_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_overview_hooks_overview-actions_ts_0-wrat07d1y5g._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_overview_state_decision-panel_tsx_0kpd26ggtr6h_._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_overview_state_decision-panel_tsx_0kpd26ggtr6h_._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_overview_state_inbox-panel_tsx_03hlegjsc27sb._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_overview_state_inbox-panel_tsx_03hlegjsc27sb._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_parties_actions_ts_0r-tbfsig2ty-._.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 +17 -17
- package/web/.next/static/chunks/{3yltnnufhaitm.js → 0214opd1iq3ld.js} +1 -1
- package/web/.next/static/chunks/{2ta7dqldhv69y.js → 0hobzrlhklo3e.js} +1 -1
- package/web/.next/static/chunks/{1cduebcshlfd5.js → 1sgi4p93eayf4.js} +1 -1
- package/web/.next/static/chunks/2rap-vrom5-zw.css +3 -0
- package/web/.next/static/chunks/{131oz96e71xwn.js → 3jr0srcv_-pfa.js} +1 -1
- package/web/.next/static/chunks/{1w-xaw2grqv_2.js → 3l_1gcuoe8bfn.js} +1 -1
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/static/chunks/30n1j9zag1f0q.css +0 -3
- /package/web/.next/static/{6OjpPl7qD1uqwr6E41aT5 → MLIzjhz2u5r5gyyuciHvf}/_buildManifest.js +0 -0
- /package/web/.next/static/{6OjpPl7qD1uqwr6E41aT5 → MLIzjhz2u5r5gyyuciHvf}/_clientMiddlewareManifest.js +0 -0
- /package/web/.next/static/{6OjpPl7qD1uqwr6E41aT5 → MLIzjhz2u5r5gyyuciHvf}/_ssgManifest.js +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
(()=>{"use strict";module.exports=[13095,(a,b,c)=>{function d(a){for(let b=0;b<a.length;b++){let c=a[b];if("function"!=typeof c)throw Error(`A "use server" file can only export async functions, found ${typeof c}.
|
|
2
|
-
Read more: https://nextjs.org/docs/messages/invalid-use-server-value`)}}Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"ensureServerEntryExports",{enumerable:!0,get:function(){return d}})},37936,(a,b,c)=>{Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"registerServerReference",{enumerable:!0,get:function(){return d.registerServerReference}});let d=a.r(11857)},73290,a=>{var b=a.i(70043);a.S([b,"
|
|
2
|
+
Read more: https://nextjs.org/docs/messages/invalid-use-server-value`)}}Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"ensureServerEntryExports",{enumerable:!0,get:function(){return d}})},37936,(a,b,c)=>{Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"registerServerReference",{enumerable:!0,get:function(){return d.registerServerReference}});let d=a.r(11857)},73290,a=>{var b=a.i(70043);a.S([b,"4081cbcd58a3dd3de149e94261778971a7c42ce220,f"],73290)},70043,a=>{var b=a.i(37936),c=a.i(5246),d=a.i(67591);async function e(a){(0,d.x)(a)&&(await (0,c.cookies)()).set(d.g,a,{path:"/",sameSite:"lax",maxAge:31536e3})}(0,a.i(13095).ensureServerEntryExports)([e]),(0,b.registerServerReference)(e,"4081cbcd58a3dd3de149e94261778971a7c42ce220",null),a.s(["f",0,e])}]})();
|
|
3
3
|
|
|
4
4
|
//# sourceMappingURL=_1pjtire7rqla0._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../node_modules/next/src/build/webpack/loaders/next-flight-loader/action-validate.ts","../../../../../node_modules/next/src/build/webpack/loaders/next-flight-loader/server-reference.ts","../../../../../web/.next-internal/server/app/_not-found/page/actions.js%20%28server%20actions%20loader%29","../../../../../web/features/frame/actions.ts"],"sourcesContent":["// This function ensures that all the exported values are valid server actions,\n// during the runtime. By definition all actions are required to be async\n// functions, but here we can only check that they are functions.\nexport function ensureServerEntryExports(actions: any[]) {\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i]\n if (typeof action !== 'function') {\n throw new Error(\n `A \"use server\" file can only export async functions, found ${typeof action}.\\nRead more: https://nextjs.org/docs/messages/invalid-use-server-value`\n )\n }\n }\n}\n","/* eslint-disable import/no-extraneous-dependencies */\nexport { registerServerReference } from 'react-server-dom-webpack/server'\n","export {setTheme as '
|
|
1
|
+
{"version":3,"sources":["../../../../../node_modules/next/src/build/webpack/loaders/next-flight-loader/action-validate.ts","../../../../../node_modules/next/src/build/webpack/loaders/next-flight-loader/server-reference.ts","../../../../../web/.next-internal/server/app/_not-found/page/actions.js%20%28server%20actions%20loader%29","../../../../../web/features/frame/actions.ts"],"sourcesContent":["// This function ensures that all the exported values are valid server actions,\n// during the runtime. By definition all actions are required to be async\n// functions, but here we can only check that they are functions.\nexport function ensureServerEntryExports(actions: any[]) {\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i]\n if (typeof action !== 'function') {\n throw new Error(\n `A \"use server\" file can only export async functions, found ${typeof action}.\\nRead more: https://nextjs.org/docs/messages/invalid-use-server-value`\n )\n }\n }\n}\n","/* eslint-disable import/no-extraneous-dependencies */\nexport { registerServerReference } from 'react-server-dom-webpack/server'\n","export {setTheme as '4081cbcd58a3dd3de149e94261778971a7c42ce220'} from 'ACTIONS_MODULE0'\n","'use server';\n\n/** The header's theme choice, kept for this browser for a year. */\nimport { cookies } from 'next/headers';\n\nimport { isTheme, THEME_COOKIE } from './theme';\n\nconst YEAR_SECONDS = 365 * 24 * 60 * 60;\n\nexport async function setTheme(theme: unknown): Promise<void> {\n if (!isTheme(theme)) {\n return;\n }\n (await cookies()).set(THEME_COOKIE, theme, { path: '/', sameSite: 'lax', maxAge: YEAR_SECONDS });\n}\n"],"names":["ensureServerEntryExports","actions","i","length","action","Error","registerServerReference","YEAR_SECONDS","setTheme","theme","set","path","sameSite","maxAge"],"mappings":"mDAGO,SAASA,EAAyBC,CAAc,EACrD,IAAK,IAAIC,EAAI,EAAGA,EAAID,EAAQE,MAAM,CAAED,IAAK,CACvC,IAAME,EAASH,CAAO,CAACC,EAAE,CACzB,GAAsB,YAAlB,AAA8B,OAAvBE,EACT,MAAUC,AAAJ,MACJ,CAAC,2DAA2D,EAAE,OAAOD,EAAO;AAAA,oEAAuE,CAAC,CAG1J,CACF,0EATgBJ,2BAAAA,qCAAAA,sBCHoC,OAAA,cAAA,CAAA,EAAA,aAAA,oCAC3CM,0BAAAA,qCAAAA,EAAAA,uBAAuB,YAAQ,CAAA,CAAA,IAAA,cCDxC,IAAA,EAAA,EAAA,CAAA,CAAA,iGCGA,EAAA,EAAA,CAAA,CAAA,MAEA,EAAA,EAAA,CAAA,CAAA,OAIO,eAAeE,EAASC,CAAc,EACtC,CAAA,EAAA,EAAA,CAAA,AAAO,EAACA,IAGb,CAAC,GAHoB,GAGd,CAAA,EAAA,EAAA,OAAA,AAAO,GAAA,CAAE,CAAEC,GAAG,CAAC,EAAA,CAAY,CAAED,EAAO,CAAEE,KAAM,IAAKC,SAAU,MAAOC,OANtD,CAM8DN,KANxD,CAMqE,EAChG,EAPgC,KAAK,mCAEfC,IAAAA,CAAAA,EAAAA,EAAAA,uBAAAA,EAAAA,EAAAA,6CAAAA","ignoreList":[0,1]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
(()=>{"use strict";module.exports=[13095,(a,b,c)=>{function d(a){for(let b=0;b<a.length;b++){let c=a[b];if("function"!=typeof c)throw Error(`A "use server" file can only export async functions, found ${typeof c}.
|
|
2
|
-
Read more: https://nextjs.org/docs/messages/invalid-use-server-value`)}}Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"ensureServerEntryExports",{enumerable:!0,get:function(){return d}})},37936,(a,b,c)=>{Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"registerServerReference",{enumerable:!0,get:function(){return d.registerServerReference}});let d=a.r(11857)},33170,a=>{var b=a.i(70043);a.S([b,"
|
|
2
|
+
Read more: https://nextjs.org/docs/messages/invalid-use-server-value`)}}Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"ensureServerEntryExports",{enumerable:!0,get:function(){return d}})},37936,(a,b,c)=>{Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"registerServerReference",{enumerable:!0,get:function(){return d.registerServerReference}});let d=a.r(11857)},33170,a=>{var b=a.i(70043);a.S([b,"4081cbcd58a3dd3de149e94261778971a7c42ce220,f"],33170)},70043,a=>{var b=a.i(37936),c=a.i(5246),d=a.i(67591);async function e(a){(0,d.x)(a)&&(await (0,c.cookies)()).set(d.g,a,{path:"/",sameSite:"lax",maxAge:31536e3})}(0,a.i(13095).ensureServerEntryExports)([e]),(0,b.registerServerReference)(e,"4081cbcd58a3dd3de149e94261778971a7c42ce220",null),a.s(["f",0,e])}]})();
|
|
3
3
|
|
|
4
4
|
//# sourceMappingURL=_1qbsmlji34yph._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../node_modules/next/src/build/webpack/loaders/next-flight-loader/action-validate.ts","../../../../../node_modules/next/src/build/webpack/loaders/next-flight-loader/server-reference.ts","../../../../../web/.next-internal/server/app/authorize/pick/page/actions.js%20%28server%20actions%20loader%29","../../../../../web/features/frame/actions.ts"],"sourcesContent":["// This function ensures that all the exported values are valid server actions,\n// during the runtime. By definition all actions are required to be async\n// functions, but here we can only check that they are functions.\nexport function ensureServerEntryExports(actions: any[]) {\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i]\n if (typeof action !== 'function') {\n throw new Error(\n `A \"use server\" file can only export async functions, found ${typeof action}.\\nRead more: https://nextjs.org/docs/messages/invalid-use-server-value`\n )\n }\n }\n}\n","/* eslint-disable import/no-extraneous-dependencies */\nexport { registerServerReference } from 'react-server-dom-webpack/server'\n","export {setTheme as '
|
|
1
|
+
{"version":3,"sources":["../../../../../node_modules/next/src/build/webpack/loaders/next-flight-loader/action-validate.ts","../../../../../node_modules/next/src/build/webpack/loaders/next-flight-loader/server-reference.ts","../../../../../web/.next-internal/server/app/authorize/pick/page/actions.js%20%28server%20actions%20loader%29","../../../../../web/features/frame/actions.ts"],"sourcesContent":["// This function ensures that all the exported values are valid server actions,\n// during the runtime. By definition all actions are required to be async\n// functions, but here we can only check that they are functions.\nexport function ensureServerEntryExports(actions: any[]) {\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i]\n if (typeof action !== 'function') {\n throw new Error(\n `A \"use server\" file can only export async functions, found ${typeof action}.\\nRead more: https://nextjs.org/docs/messages/invalid-use-server-value`\n )\n }\n }\n}\n","/* eslint-disable import/no-extraneous-dependencies */\nexport { registerServerReference } from 'react-server-dom-webpack/server'\n","export {setTheme as '4081cbcd58a3dd3de149e94261778971a7c42ce220'} from 'ACTIONS_MODULE0'\n","'use server';\n\n/** The header's theme choice, kept for this browser for a year. */\nimport { cookies } from 'next/headers';\n\nimport { isTheme, THEME_COOKIE } from './theme';\n\nconst YEAR_SECONDS = 365 * 24 * 60 * 60;\n\nexport async function setTheme(theme: unknown): Promise<void> {\n if (!isTheme(theme)) {\n return;\n }\n (await cookies()).set(THEME_COOKIE, theme, { path: '/', sameSite: 'lax', maxAge: YEAR_SECONDS });\n}\n"],"names":["ensureServerEntryExports","actions","i","length","action","Error","registerServerReference","YEAR_SECONDS","setTheme","theme","set","path","sameSite","maxAge"],"mappings":"mDAGO,SAASA,EAAyBC,CAAc,EACrD,IAAK,IAAIC,EAAI,EAAGA,EAAID,EAAQE,MAAM,CAAED,IAAK,CACvC,IAAME,EAASH,CAAO,CAACC,EAAE,CACzB,GAAsB,YAAlB,AAA8B,OAAvBE,EACT,MAAUC,AAAJ,MACJ,CAAC,2DAA2D,EAAE,OAAOD,EAAO;AAAA,oEAAuE,CAAC,CAG1J,CACF,0EATgBJ,2BAAAA,qCAAAA,sBCHoC,OAAA,cAAA,CAAA,EAAA,aAAA,oCAC3CM,0BAAAA,qCAAAA,EAAAA,uBAAuB,YAAQ,CAAA,CAAA,IAAA,cCDxC,IAAA,EAAA,EAAA,CAAA,CAAA,iGCGA,EAAA,EAAA,CAAA,CAAA,MAEA,EAAA,EAAA,CAAA,CAAA,OAIO,eAAeE,EAASC,CAAc,EACtC,CAAA,EAAA,EAAA,CAAA,AAAO,EAACA,IAGb,CAAC,GAHoB,GAGd,CAAA,EAAA,EAAA,OAAA,AAAO,GAAA,CAAE,CAAEC,GAAG,CAAC,EAAA,CAAY,CAAED,EAAO,CAAEE,KAAM,IAAKC,SAAU,MAAOC,OANtD,CAM8DN,KANxD,CAMqE,EAChG,EAPgC,KAAK,mCAEfC,IAAAA,CAAAA,EAAAA,EAAAA,uBAAAA,EAAAA,EAAAA,6CAAAA","ignoreList":[0,1]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[85653,a=>{"use strict";var b=a.i(70043),c=a.i(37936),d=a.i(66680),e=a.i(29517);a.i(70396);var f=a.i(73727),g=a.i(55476),h=a.i(66283),i=a.i(1324),j=a.i(72913);function k(a){if("clientCredentials"===(0,i.v)(a,"credentialKind")){let b=(0,i.v)(a,"scope");return{kind:"clientCredentials",clientId:(0,i.v)(a,"clientId"),clientSecret:(0,i.v)(a,"clientSecret"),issuer:(0,i.v)(a,"issuer"),...""===b?{}:{scope:b}}}return{kind:"bearer",token:(0,i.v)(a,"token")}}async function l(a,b){let c=(0,i.O)(b),e=await (0,h.z)((0,i.v)(b,i.H));try{let{tools:a}=await e.parties.check.mutate({url:(0,i.v)(b,"url"),credential:k(b)}),f=await e.parties.ownerChoices.query();return{step:"owner",fields:c,tools:a,owners:f,requestId:(0,d.randomUUID)()}}catch(a){return{step:"address",fields:c,refusal:(0,h.s)(a)}}}async function m(a,b){let c,d=(0,i.v)(b,i.H),l=(0,i.O)(b),m=(0,i.v)(b,"requestId"),n=(0,e.f)("ship").safeParse((0,i.v)(b,"ownerShipId").trim());if(!n.success)return{kind:"refused",requestId:m,fields:l,message:"The owner's ship id is not a ship id (shp_...)"};let o=await (0,h.z)(d);try{c=(await o.parties.approve.mutate({requestId:m,name:(0,i.v)(b,"name"),url:(0,i.v)(b,"url"),credential:k(b),ownerShipId:n.data,concurrencyLimit:Number((0,i.v)(b,"concurrencyLimit"))})).name}catch(a){return{kind:"refused",requestId:m,fields:l,message:(0,h.s)(a)}}(0,f.redirect)((0,g.i)((0,j.N)(c),d))}(0,a.i(13095).ensureServerEntryExports)([l,m]),(0,c.registerServerReference)(l,"
|
|
1
|
+
module.exports=[85653,a=>{"use strict";var b=a.i(70043),c=a.i(37936),d=a.i(66680),e=a.i(29517);a.i(70396);var f=a.i(73727),g=a.i(55476),h=a.i(66283),i=a.i(1324),j=a.i(72913);function k(a){if("clientCredentials"===(0,i.v)(a,"credentialKind")){let b=(0,i.v)(a,"scope");return{kind:"clientCredentials",clientId:(0,i.v)(a,"clientId"),clientSecret:(0,i.v)(a,"clientSecret"),issuer:(0,i.v)(a,"issuer"),...""===b?{}:{scope:b}}}return{kind:"bearer",token:(0,i.v)(a,"token")}}async function l(a,b){let c=(0,i.O)(b),e=await (0,h.z)((0,i.v)(b,i.H));try{let{tools:a}=await e.parties.check.mutate({url:(0,i.v)(b,"url"),credential:k(b)}),f=await e.parties.ownerChoices.query();return{step:"owner",fields:c,tools:a,owners:f,requestId:(0,d.randomUUID)()}}catch(a){return{step:"address",fields:c,refusal:(0,h.s)(a)}}}async function m(a,b){let c,d=(0,i.v)(b,i.H),l=(0,i.O)(b),m=(0,i.v)(b,"requestId"),n=(0,e.f)("ship").safeParse((0,i.v)(b,"ownerShipId").trim());if(!n.success)return{kind:"refused",requestId:m,fields:l,message:"The owner's ship id is not a ship id (shp_...)"};let o=await (0,h.z)(d);try{c=(await o.parties.approve.mutate({requestId:m,name:(0,i.v)(b,"name"),url:(0,i.v)(b,"url"),credential:k(b),ownerShipId:n.data,concurrencyLimit:Number((0,i.v)(b,"concurrencyLimit"))})).name}catch(a){return{kind:"refused",requestId:m,fields:l,message:(0,h.s)(a)}}(0,f.redirect)((0,g.i)((0,j.N)(c),d))}(0,a.i(13095).ensureServerEntryExports)([l,m]),(0,c.registerServerReference)(l,"604cd683600419224d72cce16001d6551c38501acd",null),(0,c.registerServerReference)(m,"6019f8ccbb153920d3407417fa13ae2f68dbae4425",null),a.s(["4081cbcd58a3dd3de149e94261778971a7c42ce220",()=>b.f,"6019f8ccbb153920d3407417fa13ae2f68dbae4425",0,m,"604cd683600419224d72cce16001d6551c38501acd",0,l],85653)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=web__next-internal_server_app_outside-parties_add_page_actions_0wclx47vjdhe6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../web/.next-internal/server/app/outside-parties/add/page/actions.js%20%28server%20actions%20loader%29","../../../../../web/features/add-server/actions.ts"],"sourcesContent":["export {setTheme as '
|
|
1
|
+
{"version":3,"sources":["../../../../../web/.next-internal/server/app/outside-parties/add/page/actions.js%20%28server%20actions%20loader%29","../../../../../web/features/add-server/actions.ts"],"sourcesContent":["export {setTheme as '4081cbcd58a3dd3de149e94261778971a7c42ce220'} from 'ACTIONS_MODULE0'\nexport {approveServer as '6019f8ccbb153920d3407417fa13ae2f68dbae4425'} from 'ACTIONS_MODULE1'\nexport {checkServer as '604cd683600419224d72cce16001d6551c38501acd'} from 'ACTIONS_MODULE1'\n","'use server';\n\n/**\n * Adding an outside MCP server (design B, screen 7; flow F10), as the\n * account signed in: the gateway's check of the tools it answers with,\n * which keeps nothing, then approving it with its owner. Each step asks the\n * API, which checks the account holds fleet:manage.\n */\nimport { randomUUID } from 'node:crypto';\n\nimport { idSchema } from '@aeolus-fleet/common';\nimport { redirect } from 'next/navigation';\n\nimport { inFleet } from '../../lib/gateway-api/page-account';\nimport { refusalMessageOf, requestApi } from '../../lib/gateway-api/page-api';\nimport { FLEET_FIELD, fieldOf, fieldsOf } from '../forms/form-state';\nimport type { OwnerChoice } from '../forms/ui/owner-field';\nimport { partyPath } from '../outside-parties/paths';\n\n/** The tools a server answered the check with. */\nexport interface CheckedTool {\n name: string;\n description?: string | undefined;\n}\n\n/**\n * Where adding a server stands: the address step, or the owner step after\n * the check answered its tools, with the ships its owner may be picked\n * from. The address and credential travel on in the fields, as the browser\n * sent them.\n */\nexport type AddServerState =\n | { step: 'address'; fields: Record<string, string>; refusal?: string }\n | { step: 'owner'; fields: Record<string, string>; tools: CheckedTool[]; owners: OwnerChoice[]; requestId: string };\n\nfunction credentialOf(form: FormData) {\n if (fieldOf(form, 'credentialKind') === 'clientCredentials') {\n const scope = fieldOf(form, 'scope');\n return { kind: 'clientCredentials' as const, clientId: fieldOf(form, 'clientId'), clientSecret: fieldOf(form, 'clientSecret'), issuer: fieldOf(form, 'issuer'), ...(scope === '' ? {} : { scope }) };\n }\n return { kind: 'bearer' as const, token: fieldOf(form, 'token') };\n}\n\nexport async function checkServer(_previous: AddServerState, form: FormData): Promise<AddServerState> {\n const fields = fieldsOf(form);\n const api = await requestApi(fieldOf(form, FLEET_FIELD));\n try {\n const { tools } = await api.parties.check.mutate({ url: fieldOf(form, 'url'), credential: credentialOf(form) });\n const owners = await api.parties.ownerChoices.query();\n return { step: 'owner', fields, tools, owners, requestId: randomUUID() };\n } catch (error) {\n return { step: 'address', fields, refusal: refusalMessageOf(error) };\n }\n}\n\n/** An approval refused, for the owner step of the check it came from, with what the browser sent. */\nexport type ApproveState = { kind: 'idle' } | { kind: 'refused'; requestId: string; fields: Record<string, string>; message: string };\n\nexport async function approveServer(_previous: ApproveState, form: FormData): Promise<ApproveState> {\n const fleetId = fieldOf(form, FLEET_FIELD);\n const fields = fieldsOf(form);\n const requestId = fieldOf(form, 'requestId');\n const ownerShipId = idSchema('ship').safeParse(fieldOf(form, 'ownerShipId').trim());\n if (!ownerShipId.success) {\n return { kind: 'refused', requestId, fields, message: \"The owner's ship id is not a ship id (shp_...)\" };\n }\n const api = await requestApi(fleetId);\n let name: string;\n try {\n const approved = await api.parties.approve.mutate({\n requestId,\n name: fieldOf(form, 'name'),\n url: fieldOf(form, 'url'),\n credential: credentialOf(form),\n ownerShipId: ownerShipId.data,\n concurrencyLimit: Number(fieldOf(form, 'concurrencyLimit')),\n });\n name = approved.name;\n } catch (error) {\n return { kind: 'refused', requestId, fields, message: refusalMessageOf(error) };\n }\n redirect(inFleet(partyPath(name), fleetId));\n}\n"],"names":["credentialOf","form","scope","kind","clientId","clientSecret","issuer","token","checkServer","_previous","fields","api","tools","parties","check","mutate","url","credential","owners","ownerChoices","query","step","requestId","error","refusal","approveServer","fleetId","ownerShipId","safeParse","trim","success","message","name","approved","approve","data","concurrencyLimit","Number"],"mappings":"uCAAA,IAAA,EAAA,EAAA,CAAA,CAAA,oBCQA,EAAA,EAAA,CAAA,CAAA,OAEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,CAAA,CAAA,OAAA,IAAA,EAAA,EAAA,CAAA,CAAA,OAEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,MAEA,EAAA,EAAA,CAAA,CAAA,OAkBA,SAASA,EAAaC,CAAc,EAClC,GAAwC,sBAApC,CAAA,EAAA,EAAA,CAAA,AAAO,EAACA,EAAM,kBAA2C,CAC3D,IAAMC,EAAQ,CAAA,EAAA,EAAA,CAAA,AAAO,EAACD,EAAM,SAC5B,MAAO,CAAEE,KAAM,oBAA8BC,SAAU,CAAA,EAAA,EAAA,CAAA,AAAO,EAACH,EAAM,YAAaI,aAAc,CAAA,EAAA,EAAA,CAAA,AAAO,EAACJ,EAAM,gBAAiBK,OAAQ,CAAA,EAAA,EAAA,CAAA,AAAO,EAACL,EAAM,UAAW,GAAc,KAAVC,EAAe,CAAC,EAAI,OAAEA,CAAM,CAAG,AAAF,CACnM,CACA,MAAO,CAAEC,KAAM,SAAmBI,MAAO,CAAA,EAAA,EAAA,CAAA,AAAO,EAACN,EAAM,QAAS,CAClE,CAEO,eAAeO,EAAYC,CAAyB,CAAER,CAAc,EACzE,IAAMS,EAAS,CAAA,EAAA,EAAA,CAAQ,AAAR,EAAST,GAClBU,EAAM,MAAM,CAAA,EAAA,EAAA,CAAA,AAAU,EAAC,CAAA,EAAA,EAAA,CAAA,AAAO,EAACV,EAAM,EAAA,CAAW,GACtD,GAAI,CACF,GAAM,OAAEW,CAAK,CAAE,CAAG,MAAMD,EAAIE,OAAO,CAACC,KAAK,CAACC,MAAM,CAAC,CAAEC,IAAK,CAAA,EAAA,EAAA,CAAA,AAAO,EAACf,EAAM,OAAQgB,WAAYjB,EAAaC,EAAM,GACvGiB,EAAS,MAAMP,EAAIE,OAAO,CAACM,YAAY,CAACC,KAAK,GACnD,MAAO,CAAEC,KAAM,eAASX,QAAQE,SAAOM,EAAQI,UAAW,CAAA,EAAA,EAAA,UAAA,AAAU,GAAG,CACzE,CAAE,MAAOC,EAAO,CACd,MAAO,CAAEF,KAAM,iBAAWX,EAAQc,QAAS,CAAA,EAAA,EAAA,CAAA,AAAgB,EAACD,EAAO,CACrE,CACF,CAKO,eAAeE,EAAchB,CAAuB,CAAER,CAAc,EACzE,IAQI+B,EAREN,EAAU,CAAA,EAAA,EAAA,CAAO,AAAP,EAAQzB,EAAM,EAAA,CAAW,EACnCS,EAAS,CAAA,EAAA,EAAA,CAAA,AAAQ,EAACT,GAClBqB,EAAY,CAAA,EAAA,EAAA,CAAA,AAAO,EAACrB,EAAM,aAC1B0B,EAAc,CAAA,EAAA,EAAA,CAAA,AAAQ,EAAC,QAAQC,SAAS,CAAC,CAAA,EAAA,EAAA,CAAA,AAAO,EAAC3B,EAAM,eAAe4B,IAAI,IAChF,GAAI,CAACF,EAAYG,OAAO,CACtB,CADwB,KACjB,CAAE3B,KAAM,oBAAWmB,EAAWZ,SAAQqB,QAAS,gDAAiD,EAEzG,IAAMpB,EAAM,MAAM,CAAA,EAAA,EAAA,CAAA,AAAU,EAACe,GAE7B,GAAI,CASFM,EAAOC,CARU,MAAMtB,EAAIE,OAAO,CAACqB,OAAO,CAACnB,MAAM,CAAC,WAChDO,EACAU,KAAM,CAAA,EAAA,EAAA,CAAA,AAAO,EAAC/B,EAAM,QACpBe,IAAK,CAAA,EAAA,EAAA,CAAA,AAAO,EAACf,EAAM,OACnBgB,WAAYjB,EAAaC,GACzB0B,YAAaA,EAAYQ,IAAI,CAC7BC,iBAAkBC,OAAO,CAAA,EAAA,EAAA,CAAA,AAAO,EAACpC,EAAM,oBACzC,EAAA,EACgB+B,IAAI,AACtB,CAAE,MAAOT,EAAO,CACd,MAAO,CAAEpB,KAAM,UAAWmB,mBAAWZ,EAAQqB,QAAS,CAAA,EAAA,EAAA,CAAA,AAAgB,EAACR,EAAO,CAChF,CACA,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,CAAA,EAAA,EAAA,CAAA,AAAO,EAAC,CAAA,EAAA,EAAA,CAAA,AAAS,EAACS,GAAON,GACpC,0CAvCsBlB,EAeAiB,IAfAjB,CAAAA,EAAAA,EAAAA,uBAAAA,EAAAA,EAAAA,6CAAAA,MAeAiB,CAAAA,EAAAA,EAAAA,uBAAAA,EAAAA,EAAAA,6CAAAA"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[28375,a=>{"use strict";var b=a.i(70043),c=a.i(4757);a.S([b,"
|
|
1
|
+
module.exports=[28375,a=>{"use strict";var b=a.i(70043),c=a.i(4757);a.S([b,"4081cbcd58a3dd3de149e94261778971a7c42ce220,f",0,c,"4022bb53cb5aed469521ce90b009331cc9e4aa85f6,q,60d491137132aa96b6833d08eedae6145705a64f9a,v,60f8242e7db2415e3a5de081e5326b1d609e9fce61,G"],28375)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=web__next-internal_server_app_overview_page_actions_0hxu14a57nlf2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../web/.next-internal/server/app/overview/page/actions.js%20%28server%20actions%20loader%29"],"sourcesContent":["export {setTheme as '
|
|
1
|
+
{"version":3,"sources":["../../../../../web/.next-internal/server/app/overview/page/actions.js%20%28server%20actions%20loader%29"],"sourcesContent":["export {setTheme as '4081cbcd58a3dd3de149e94261778971a7c42ce220'} from 'ACTIONS_MODULE0'\nexport {answerDelivery as '4022bb53cb5aed469521ce90b009331cc9e4aa85f6'} from 'ACTIONS_MODULE1'\nexport {doneDelivery as '60f8242e7db2415e3a5de081e5326b1d609e9fce61'} from 'ACTIONS_MODULE1'\nexport {openDelivery as '60d491137132aa96b6833d08eedae6145705a64f9a'} from 'ACTIONS_MODULE1'\n"],"names":[],"mappings":"uCAAA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA"}
|
package/web/.next/server/chunks/ssr/web_features_add-server_ui_add-server_tsx_1jnmar5xju49k._.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[29372,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(30587),e=a.i(88412),f=a.i(36855),g=a.i(35149),h=a.i(77237),i=a.i(5050);let j=(0,i.createServerReference)("
|
|
1
|
+
module.exports=[29372,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(30587),e=a.i(88412),f=a.i(36855),g=a.i(35149),h=a.i(77237),i=a.i(5050);let j=(0,i.createServerReference)("6019f8ccbb153920d3407417fa13ae2f68dbae4425",i.callServer,void 0,i.findSourceMapURL,"approveServer"),k=(0,i.createServerReference)("604cd683600419224d72cce16001d6551c38501acd",i.callServer,void 0,i.findSourceMapURL,"checkServer"),l=["Address","Check","Owner"],m=["url","credentialKind","token","clientId","clientSecret","issuer","scope"];function n({at:a}){return(0,b.jsx)("ol",{className:"flex gap-4",children:l.map((c,d)=>(0,b.jsxs)("li",{"aria-current":d===a?"step":void 0,className:d<=a?"font-medium":"text-muted-foreground",children:[d+1," ",c]},c))})}function o({refusal:a}){return void 0===a?null:(0,b.jsx)(f.f,{state:{kind:"refused",message:a}})}function p({state:a,action:f,fleetId:g}){let[i,j]=(0,c.useState)(a.fields.credentialKind??"bearer");return(0,b.jsxs)("form",{action:f,className:`${e.r} grid gap-3`,"data-testid":"add-server-address",children:[(0,b.jsx)("input",{type:"hidden",name:d.H,value:g}),(0,b.jsx)(o,{refusal:a.refusal}),(0,b.jsxs)("label",{className:e.z,children:[(0,b.jsx)("span",{children:"Streamable HTTP address"}),(0,b.jsx)("input",{className:e.w,type:"url",name:"url",defaultValue:a.fields.url??"",placeholder:"https://mcp.example.com/mcp",required:!0})]}),(0,b.jsxs)("fieldset",{className:"grid gap-3",children:[(0,b.jsx)("legend",{className:"font-medium",children:"The server's credential"}),(0,b.jsxs)("label",{className:e.z,children:[(0,b.jsx)("span",{children:"Credential"}),(0,b.jsxs)("select",{className:e.w,name:"credentialKind",value:i,onChange:a=>{j(a.target.value)},children:[(0,b.jsx)("option",{value:"bearer",children:"Bearer token"}),(0,b.jsx)("option",{value:"clientCredentials",children:"OAuth client credentials"})]})]}),"clientCredentials"===i?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("label",{className:e.z,children:[(0,b.jsx)("span",{children:"Client id"}),(0,b.jsx)("input",{className:e.w,type:"text",name:"clientId",defaultValue:a.fields.clientId??""})]}),(0,b.jsxs)("label",{className:e.z,children:[(0,b.jsx)("span",{children:"Client secret"}),(0,b.jsx)("input",{className:e.w,type:"password",name:"clientSecret"})]}),(0,b.jsxs)("label",{className:e.z,children:[(0,b.jsx)("span",{children:"Issuer"}),(0,b.jsx)("input",{className:e.w,type:"url",name:"issuer",defaultValue:a.fields.issuer??""})]}),(0,b.jsxs)("label",{className:e.z,children:[(0,b.jsx)("span",{children:"Scope"}),(0,b.jsx)("input",{className:e.w,type:"text",name:"scope",defaultValue:a.fields.scope??""})]})]}):(0,b.jsxs)("label",{className:e.z,children:[(0,b.jsx)("span",{children:"Bearer token"}),(0,b.jsx)("input",{className:e.w,type:"password",name:"token"})]})]}),(0,b.jsx)("div",{children:(0,b.jsx)(h.f,{pending:"Checking the server…",testId:"add-server-check",children:"Check the server"})})]})}function q({state:a,refused:c,action:f,onBack:i,fleetId:j}){let k="refused"===c.kind&&c.requestId===a.requestId,l=k?c.fields:a.fields,{tools:n}=a,p=l.url??"",r=l.name??(URL.canParse(p)?(new URL(p).hostname.split(".").filter(a=>"mcp"!==a&&"www"!==a)[0]??"").toLowerCase().replaceAll(/[^a-z0-9]+/g,"-").replaceAll(/^-+|-+$/g,""):"");return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("section",{className:`${e.r} grid gap-2`,"data-testid":"add-server-tools",children:[(0,b.jsxs)("h2",{className:"text-section font-semibold",children:["The server answers: ",n.length," ",1===n.length?"tool":"tools"]}),(0,b.jsx)("ul",{className:"grid gap-1",children:n.map(a=>(0,b.jsxs)("li",{className:"grid",children:[(0,b.jsx)("span",{className:"font-mono",children:a.name}),void 0===a.description?null:(0,b.jsx)("span",{className:"text-muted-foreground",children:a.description})]},a.name))})]}),(0,b.jsxs)("form",{action:f,className:`${e.r} grid gap-3`,"data-testid":"add-server-owner",children:[(0,b.jsx)("h2",{className:"text-section font-semibold",children:"Its owner"}),(0,b.jsx)(o,{refusal:k?c.message:void 0}),(0,b.jsx)("input",{type:"hidden",name:d.H,value:j}),(0,b.jsx)("input",{type:"hidden",name:"requestId",value:a.requestId}),m.map(a=>(0,b.jsx)("input",{type:"hidden",name:a,value:l[a]??""},a)),(0,b.jsx)("p",{className:"font-mono text-muted-foreground",children:p}),(0,b.jsxs)("label",{className:e.z,children:[(0,b.jsx)("span",{children:"Proxy ship's name"}),(0,b.jsx)("input",{className:e.w,type:"text",name:"name",defaultValue:r,required:!0})]}),(0,b.jsx)(g.f,{choices:a.owners,current:a.owners.find(a=>a.shipId===l.ownerShipId)??null,help:"A person ship or argo. It answers for this server."}),(0,b.jsxs)("label",{className:e.z,children:[(0,b.jsx)("span",{children:"Calls at once"}),(0,b.jsx)("input",{className:e.w,type:"number",name:"concurrencyLimit",min:1,max:10,defaultValue:l.concurrencyLimit??"4"})]}),(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsxs)(h.f,{pending:"Adding…",testId:"add-server-approve",children:["Add ",""===r?"server":r]}),(0,b.jsx)("button",{type:"button",className:e.x.secondary,onClick:i,children:"Back to the address"})]})]})]})}a.s(["AddServer",0,function({fleetId:a}){let[d,e]=(0,c.useActionState)(k,{step:"address",fields:{}}),[f,g]=(0,c.useActionState)(j,{kind:"idle"}),[h,i]=(0,c.useState)(void 0),l="owner"===d.step&&h!==d.requestId?d:void 0;return(0,b.jsxs)("div",{className:"grid gap-4",children:[(0,b.jsx)("h1",{className:"text-title font-semibold",children:"Add MCP server"}),(0,b.jsx)(n,{at:2*(void 0!==l)}),void 0===l?(0,b.jsx)(p,{state:d,action:e,fleetId:a}):(0,b.jsx)(q,{state:l,refused:f,action:g,onBack:()=>{i(l.requestId)},fleetId:a})]})}],29372)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=web_features_add-server_ui_add-server_tsx_1jnmar5xju49k._.js.map
|
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%3A60e4ca%20%3Ctext/javascript%3E","../../../../../web/features/add-server/data%3A99d634%20%3Ctext/javascript%3E","../../../../../web/features/add-server/suggested-name.ts"],"sourcesContent":["'use client';\n\nimport { useActionState, useState } from 'react';\n\nimport { FLEET_FIELD } from '../../forms/form-state';\nimport { BUTTONS, CARD, INPUT, LABEL } from '../../forms/ui/look';\nimport { Outcome } from '../../forms/ui/outcome';\nimport { OwnerField } from '../../forms/ui/owner-field';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport { approveServer, checkServer, type AddServerState, type ApproveState } from '../actions';\nimport { suggestedName } from '../suggested-name';\n\n/** The steps of adding a server, as the design numbers them. */\nconst STEPS = ['Address', 'Check', 'Owner'] as const;\n\nconst CONCURRENCY_LIMIT_DEFAULT = '4';\n\n/** The credential fields, carried on from the address step to the owner step. */\nconst CARRIED_FIELDS = ['url', 'credentialKind', 'token', 'clientId', 'clientSecret', 'issuer', 'scope'] as const;\n\nfunction Steps({ at }: { at: number }) {\n return (\n <ol className=\"flex gap-4\">\n {STEPS.map((step, index) => (\n <li key={step} aria-current={index === at ? 'step' : undefined} className={index <= at ? 'font-medium' : 'text-muted-foreground'}>\n {index + 1} {step}\n </li>\n ))}\n </ol>\n );\n}\n\nfunction Refused({ refusal }: { refusal: string | undefined }) {\n return refusal === undefined ? null : <Outcome state={{ kind: 'refused', message: refusal }} />;\n}\n\nfunction AddressStep({ state, action, fleetId }: { state: Extract<AddServerState, { step: 'address' }> | { fields: Record<string, string>; refusal?: string }; action: (form: FormData) => void; fleetId: string }) {\n const [credentialKind, setCredentialKind] = useState(state.fields.credentialKind ?? 'bearer');\n return (\n <form action={action} className={`${CARD} grid gap-3`} data-testid=\"add-server-address\">\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <Refused refusal={state.refusal} />\n <label className={LABEL}>\n <span>Streamable HTTP address</span>\n <input className={INPUT} type=\"url\" name=\"url\" defaultValue={state.fields.url ?? ''} placeholder=\"https://mcp.example.com/mcp\" required />\n </label>\n <fieldset className=\"grid gap-3\">\n <legend className=\"font-medium\">The server's credential</legend>\n <label className={LABEL}>\n <span>Credential</span>\n <select className={INPUT} name=\"credentialKind\" value={credentialKind} onChange={(event) => { setCredentialKind(event.target.value); }}>\n <option value=\"bearer\">Bearer token</option>\n <option value=\"clientCredentials\">OAuth client credentials</option>\n </select>\n </label>\n {credentialKind === 'clientCredentials' ? (\n <>\n <label className={LABEL}>\n <span>Client id</span>\n <input className={INPUT} type=\"text\" name=\"clientId\" defaultValue={state.fields.clientId ?? ''} />\n </label>\n <label className={LABEL}>\n <span>Client secret</span>\n <input className={INPUT} type=\"password\" name=\"clientSecret\" />\n </label>\n <label className={LABEL}>\n <span>Issuer</span>\n <input className={INPUT} type=\"url\" name=\"issuer\" defaultValue={state.fields.issuer ?? ''} />\n </label>\n <label className={LABEL}>\n <span>Scope</span>\n <input className={INPUT} type=\"text\" name=\"scope\" defaultValue={state.fields.scope ?? ''} />\n </label>\n </>\n ) : (\n <label className={LABEL}>\n <span>Bearer token</span>\n <input className={INPUT} type=\"password\" name=\"token\" />\n </label>\n )}\n </fieldset>\n <div>\n <SubmitButton pending=\"Checking the server…\" testId=\"add-server-check\">\n Check the server\n </SubmitButton>\n </div>\n </form>\n );\n}\n\nfunction OwnerStep({ state, refused, action, onBack, fleetId }: { state: Extract<AddServerState, { step: 'owner' }>; refused: ApproveState; action: (form: FormData) => void; onBack: () => void; fleetId: string }) {\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 { tools } = state;\n const url = fields.url ?? '';\n const name = fields.name ?? suggestedName(url);\n return (\n <>\n <section className={`${CARD} grid gap-2`} data-testid=\"add-server-tools\">\n <h2 className=\"text-section font-semibold\">\n The server answers: {tools.length} {tools.length === 1 ? 'tool' : 'tools'}\n </h2>\n <ul className=\"grid gap-1\">\n {tools.map((tool) => (\n <li key={tool.name} className=\"grid\">\n <span className=\"font-mono\">{tool.name}</span>\n {tool.description === undefined ? null : <span className=\"text-muted-foreground\">{tool.description}</span>}\n </li>\n ))}\n </ul>\n </section>\n <form action={action} className={`${CARD} grid gap-3`} data-testid=\"add-server-owner\">\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\" defaultValue={name} required />\n </label>\n <OwnerField choices={state.owners} current={state.owners.find((owner) => owner.shipId === fields.ownerShipId) ?? null} help=\"A person ship or argo. It answers for this server.\" />\n <label className={LABEL}>\n <span>Calls at once</span>\n <input className={INPUT} type=\"number\" name=\"concurrencyLimit\" min={1} max={10} defaultValue={fields.concurrencyLimit ?? CONCURRENCY_LIMIT_DEFAULT} />\n </label>\n <div className=\"flex gap-2\">\n <SubmitButton pending=\"Adding…\" testId=\"add-server-approve\">\n Add {name === '' ? 'server' : name}\n </SubmitButton>\n <button type=\"button\" className={BUTTONS.secondary} onClick={onBack}>\n Back to the address\n </button>\n </div>\n </form>\n </>\n );\n}\n\n/**\n * Adding an outside MCP server in three steps: its address and credential,\n * the gateway's check of the tools it answers with, then its owner. Each\n * button says at once that its step is on its way.\n */\nexport function AddServer({ fleetId }: { fleetId: string }) {\n const [checked, check] = useActionState(checkServer, { step: 'address', fields: {} });\n const [refused, approve] = useActionState(approveServer, { kind: 'idle' });\n // Going back shows the address step again, with what was sent, until the next check answers.\n const [backFrom, setBackFrom] = useState<string | undefined>(undefined);\n const owner = checked.step === 'owner' && backFrom !== checked.requestId ? checked : undefined;\n return (\n <div className=\"grid gap-4\">\n <h1 className=\"text-title font-semibold\">Add MCP server</h1>\n <Steps at={owner === undefined ? 0 : 2} />\n {owner === undefined ? (\n <AddressStep state={checked} action={check} fleetId={fleetId} />\n ) : (\n <OwnerStep state={owner} refused={refused} action={approve} onBack={() => { setBackFrom(owner.requestId); }} fleetId={fleetId} />\n )}\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"608c027fe8149e66524c01289698c18140e03fb815\":{\"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(\"608c027fe8149e66524c01289698c18140e03fb815\",callServer,void 0,findSourceMapURL,\"approveServer\");export{$$RSC_SERVER_ACTION_1 as approveServer};","/* __next_internal_action_entry_do_not_use__ [{\"604e59108806ad2673809d074c8d3ca013d552346b\":{\"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(\"604e59108806ad2673809d074c8d3ca013d552346b\",callServer,void 0,findSourceMapURL,\"checkServer\");export{$$RSC_SERVER_ACTION_0 as checkServer};","/** A proxy ship's name offered from a server's address: its host's first name that says whose it is. */\nexport function suggestedName(url: string): string {\n if (!URL.canParse(url)) {\n return '';\n }\n const labels = new URL(url).hostname.split('.').filter((label) => label !== 'mcp' && label !== 'www');\n return (labels[0] ?? '').toLowerCase().replaceAll(/[^a-z0-9]+/g, '-').replaceAll(/^-+|-+$/g, '');\n}\n"],"names":["$$RSC_SERVER_ACTION_1"],"mappings":"wDAEA,EAAA,EAAA,CAAA,CAAA,OAEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OCRkM,EAAA,EAAA,CAAA,CAAA,MAAsG,IAAMA,EAAmC,CAAA,EAAA,EAAA,iBAAb,IAAa,AAAqB,EAAC,KAAxB,wCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,iBCA3I,EAAmC,CAAA,EAAA,EAAA,iBAAb,IAAa,AAAqB,EAAC,KAAxB,wCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,eFa/a,EAAQ,CAAC,UAAW,QAAS,QAAQ,CAKrC,EAAiB,CAAC,MAAO,iBAAkB,QAAS,WAAY,eAAgB,SAAU,QAAQ,CAExG,SAAS,EAAM,IAAE,CAAE,CAAkB,EACnC,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,sBACX,EAAM,GAAG,CAAC,CAAC,EAAM,IAChB,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAc,eAAc,IAAU,EAAK,YAAS,EAAW,UAAW,GAAS,EAAK,cAAgB,kCACtG,EAAQ,EAAE,IAAE,IADN,KAMjB,CAEA,SAAS,EAAQ,SAAE,CAAO,CAAmC,EAC3D,OAAmB,SAAZ,EAAwB,KAAO,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAO,CAAA,CAAC,MAAO,CAAE,KAAM,UAAW,QAAS,CAAQ,GAC5F,CAEA,SAAS,EAAY,OAAE,CAAK,QAAE,CAAM,SAAE,CAAO,CAAqK,EAChN,GAAM,CAAC,EAAgB,EAAkB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,EAAM,MAAM,CAAC,cAAc,EAAI,UACpF,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,OAAQ,EAAQ,UAAW,CAAA,EAAG,EAAA,CAAI,CAAC,WAAW,CAAC,CAAE,cAAY,+BACjE,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,KAAK,SAAS,KAAM,EAAA,CAAW,CAAE,MAAO,IAC/C,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAQ,QAAS,EAAM,OAAO,GAC/B,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAW,EAAA,CAAK,WACrB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,4BACN,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAW,EAAA,CAAK,CAAE,KAAK,MAAM,KAAK,MAAM,aAAc,EAAM,MAAM,CAAC,GAAG,EAAI,GAAI,YAAY,8BAA8B,QAAQ,CAAA,CAAA,OAEzI,CAAA,EAAA,EAAA,IAAA,EAAC,WAAA,CAAS,UAAU,uBAClB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,UAAU,uBAAc,4BAChC,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAW,EAAA,CAAK,WACrB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,eACN,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,UAAW,EAAA,CAAK,CAAE,KAAK,iBAAiB,MAAO,EAAgB,SAAU,AAAC,IAAY,EAAkB,EAAM,MAAM,CAAC,KAAK,CAAG,YACnI,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,kBAAS,iBACvB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,6BAAoB,mCAGlB,sBAAnB,EACC,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAW,EAAA,CAAK,WACrB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,cACN,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAW,EAAA,CAAK,CAAE,KAAK,OAAO,KAAK,WAAW,aAAc,EAAM,MAAM,CAAC,QAAQ,EAAI,QAE9F,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAW,EAAA,CAAK,WACrB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,kBACN,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAW,EAAA,CAAK,CAAE,KAAK,WAAW,KAAK,oBAEhD,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAW,EAAA,CAAK,WACrB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAW,EAAA,CAAK,CAAE,KAAK,MAAM,KAAK,SAAS,aAAc,EAAM,MAAM,CAAC,MAAM,EAAI,QAEzF,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAW,EAAA,CAAK,WACrB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,UACN,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAW,EAAA,CAAK,CAAE,KAAK,OAAO,KAAK,QAAQ,aAAc,EAAM,MAAM,CAAC,KAAK,EAAI,WAI1F,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAW,EAAA,CAAK,WACrB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,iBACN,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAW,EAAA,CAAK,CAAE,KAAK,WAAW,KAAK,gBAIpD,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,UACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,CAAA,CAAC,QAAQ,uBAAuB,OAAO,4BAAmB,yBAM/E,CAEA,SAAS,EAAU,OAAE,CAAK,SAAE,CAAO,QAAE,CAAM,QAAE,CAAM,SAAE,CAAO,CAAuJ,EAEjN,IAAM,EAA6B,YAAjB,EAAQ,IAAI,EAAkB,EAAQ,SAAS,GAAK,EAAM,SAAS,CAC/E,EAAS,EAAY,EAAQ,MAAM,CAAG,EAAM,MAAM,CAClD,OAAE,CAAK,CAAE,CAAG,EACZ,EAAM,EAAO,GAAG,EAAI,GACpB,EAAO,EAAO,IAAI,GG9FxB,AAAK,CH8FuB,GG9FxB,AAAK,QAAQ,CAAC,GAIX,CADQ,AACP,EAJgB,EAGL,IH2FuB,AG3FnB,GAAK,QAAQ,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,AAAC,GAAoB,QAAV,GAA6BA,QAAV,EACvE,CAAC,EAAE,EAAI,EAAA,CAAE,CAAE,WAAW,GAAG,UAAU,CAAC,cAAe,KAAK,UAAU,CAAC,WAAY,IAHpF,EACT,EH6FA,MACE,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAW,CAAA,EAAG,EAAA,CAAI,CAAC,WAAW,CAAC,CAAE,cAAY,6BACpD,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,UAAU,uCAA6B,uBACpB,EAAM,MAAM,CAAC,IAAmB,IAAjB,EAAM,MAAM,CAAS,OAAS,WAEpE,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,sBACX,EAAM,GAAG,CAAC,AAAC,GACV,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAmB,UAAU,iBAC5B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,EAAK,IAAI,QAChB,IAArB,EAAK,WAAW,CAAiB,KAAO,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,iCAAyB,EAAK,WAAW,KAF3F,EAAK,IAAI,QAOxB,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,OAAQ,EAAQ,UAAW,CAAA,EAAG,EAAA,CAAI,CAAC,WAAW,CAAC,CAAE,cAAY,6BACjE,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,sCAA6B,cAC3C,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAQ,QAAS,EAAY,EAAQ,OAAO,MAAG,IAChD,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,KAAK,SAAS,KAAM,EAAA,CAAW,CAAE,MAAO,IAC/C,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,KAAK,SAAS,KAAK,YAAY,MAAO,EAAM,SAAS,GAC3D,EAAe,GAAG,CAAC,AAAC,GACnB,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAkB,KAAK,SAAS,KAAM,EAAO,MAAO,CAAM,CAAC,EAAM,EAAI,IAA1D,IAEd,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,2CAAmC,IAChD,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAW,EAAA,CAAK,WACrB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,sBACN,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAW,EAAA,CAAK,CAAE,KAAK,OAAO,KAAK,OAAO,aAAc,EAAM,QAAQ,CAAA,CAAA,OAE/E,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAU,CAAA,CAAC,QAAS,EAAM,MAAM,CAAE,QAAS,EAAM,MAAM,CAAC,IAAI,CAAC,AAAC,GAAU,EAAM,MAAM,GAAK,EAAO,WAAW,GAAK,KAAM,KAAK,uDAC5H,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAW,EAAA,CAAK,WACrB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,kBACN,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAW,EAAA,CAAK,CAAE,KAAK,SAAS,KAAK,mBAAmB,IAAK,EAAG,IAAK,GAAI,aAAc,EAAO,gBAAgB,EAjH7F,EAiHiG,OAE3H,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uBACb,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,CAAY,CAAA,CAAC,QAAQ,UAAU,OAAO,+BAAqB,OAC5C,KAAT,EAAc,SAAW,KAEhC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,KAAK,SAAS,UAAW,EAAA,CAAO,CAAC,SAAS,CAAE,QAAS,WAAQ,gCAO/E,oBAOO,SAAS,AAAU,SAAE,CAAO,CAAuB,EACxD,GAAM,CAAC,EAAS,EAAM,CAAG,CAAA,EAAA,EAAA,cAAA,AAAc,EAAC,EAAa,CAAE,KAAM,UAAW,OAAQ,CAAC,CAAE,GAC7E,CAAC,EAAS,EAAQ,CAAG,CAAA,EAAA,EAAA,cAAA,AAAc,EAAC,EAAe,CAAE,KAAM,MAAO,GAElE,CAAC,EAAU,EAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,OAAqB,GACvD,EAAyB,UAAjB,EAAQ,IAAI,EAAgB,IAAa,EAAQ,SAAS,CAAG,OAAU,EACrF,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uBACb,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,oCAA2B,mBACzC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAM,GAA8B,QAAhB,IAAV,CAAU,IAAY,KACtB,IAAV,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,MAAO,EAAS,OAAQ,EAAO,QAAS,IAErD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAU,MAAO,EAAO,QAAS,EAAS,OAAQ,EAAS,OAAQ,KAAQ,EAAY,EAAM,SAAS,CAAG,EAAG,QAAS,MAI9H"}
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/add-server/ui/add-server.tsx","../../../../../web/features/add-server/data%3A4a0360%20%3Ctext/javascript%3E","../../../../../web/features/add-server/data%3A9d7e74%20%3Ctext/javascript%3E","../../../../../web/features/add-server/suggested-name.ts"],"sourcesContent":["'use client';\n\nimport { useActionState, useState } from 'react';\n\nimport { FLEET_FIELD } from '../../forms/form-state';\nimport { BUTTONS, CARD, INPUT, LABEL } from '../../forms/ui/look';\nimport { Outcome } from '../../forms/ui/outcome';\nimport { OwnerField } from '../../forms/ui/owner-field';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport { approveServer, checkServer, type AddServerState, type ApproveState } from '../actions';\nimport { suggestedName } from '../suggested-name';\n\n/** The steps of adding a server, as the design numbers them. */\nconst STEPS = ['Address', 'Check', 'Owner'] as const;\n\nconst CONCURRENCY_LIMIT_DEFAULT = '4';\n\n/** The credential fields, carried on from the address step to the owner step. */\nconst CARRIED_FIELDS = ['url', 'credentialKind', 'token', 'clientId', 'clientSecret', 'issuer', 'scope'] as const;\n\nfunction Steps({ at }: { at: number }) {\n return (\n <ol className=\"flex gap-4\">\n {STEPS.map((step, index) => (\n <li key={step} aria-current={index === at ? 'step' : undefined} className={index <= at ? 'font-medium' : 'text-muted-foreground'}>\n {index + 1} {step}\n </li>\n ))}\n </ol>\n );\n}\n\nfunction Refused({ refusal }: { refusal: string | undefined }) {\n return refusal === undefined ? null : <Outcome state={{ kind: 'refused', message: refusal }} />;\n}\n\nfunction AddressStep({ state, action, fleetId }: { state: Extract<AddServerState, { step: 'address' }> | { fields: Record<string, string>; refusal?: string }; action: (form: FormData) => void; fleetId: string }) {\n const [credentialKind, setCredentialKind] = useState(state.fields.credentialKind ?? 'bearer');\n return (\n <form action={action} className={`${CARD} grid gap-3`} data-testid=\"add-server-address\">\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <Refused refusal={state.refusal} />\n <label className={LABEL}>\n <span>Streamable HTTP address</span>\n <input className={INPUT} type=\"url\" name=\"url\" defaultValue={state.fields.url ?? ''} placeholder=\"https://mcp.example.com/mcp\" required />\n </label>\n <fieldset className=\"grid gap-3\">\n <legend className=\"font-medium\">The server's credential</legend>\n <label className={LABEL}>\n <span>Credential</span>\n <select className={INPUT} name=\"credentialKind\" value={credentialKind} onChange={(event) => { setCredentialKind(event.target.value); }}>\n <option value=\"bearer\">Bearer token</option>\n <option value=\"clientCredentials\">OAuth client credentials</option>\n </select>\n </label>\n {credentialKind === 'clientCredentials' ? (\n <>\n <label className={LABEL}>\n <span>Client id</span>\n <input className={INPUT} type=\"text\" name=\"clientId\" defaultValue={state.fields.clientId ?? ''} />\n </label>\n <label className={LABEL}>\n <span>Client secret</span>\n <input className={INPUT} type=\"password\" name=\"clientSecret\" />\n </label>\n <label className={LABEL}>\n <span>Issuer</span>\n <input className={INPUT} type=\"url\" name=\"issuer\" defaultValue={state.fields.issuer ?? ''} />\n </label>\n <label className={LABEL}>\n <span>Scope</span>\n <input className={INPUT} type=\"text\" name=\"scope\" defaultValue={state.fields.scope ?? ''} />\n </label>\n </>\n ) : (\n <label className={LABEL}>\n <span>Bearer token</span>\n <input className={INPUT} type=\"password\" name=\"token\" />\n </label>\n )}\n </fieldset>\n <div>\n <SubmitButton pending=\"Checking the server…\" testId=\"add-server-check\">\n Check the server\n </SubmitButton>\n </div>\n </form>\n );\n}\n\nfunction OwnerStep({ state, refused, action, onBack, fleetId }: { state: Extract<AddServerState, { step: 'owner' }>; refused: ApproveState; action: (form: FormData) => void; onBack: () => void; fleetId: string }) {\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 { tools } = state;\n const url = fields.url ?? '';\n const name = fields.name ?? suggestedName(url);\n return (\n <>\n <section className={`${CARD} grid gap-2`} data-testid=\"add-server-tools\">\n <h2 className=\"text-section font-semibold\">\n The server answers: {tools.length} {tools.length === 1 ? 'tool' : 'tools'}\n </h2>\n <ul className=\"grid gap-1\">\n {tools.map((tool) => (\n <li key={tool.name} className=\"grid\">\n <span className=\"font-mono\">{tool.name}</span>\n {tool.description === undefined ? null : <span className=\"text-muted-foreground\">{tool.description}</span>}\n </li>\n ))}\n </ul>\n </section>\n <form action={action} className={`${CARD} grid gap-3`} data-testid=\"add-server-owner\">\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\" defaultValue={name} required />\n </label>\n <OwnerField choices={state.owners} current={state.owners.find((owner) => owner.shipId === fields.ownerShipId) ?? null} help=\"A person ship or argo. It answers for this server.\" />\n <label className={LABEL}>\n <span>Calls at once</span>\n <input className={INPUT} type=\"number\" name=\"concurrencyLimit\" min={1} max={10} defaultValue={fields.concurrencyLimit ?? CONCURRENCY_LIMIT_DEFAULT} />\n </label>\n <div className=\"flex gap-2\">\n <SubmitButton pending=\"Adding…\" testId=\"add-server-approve\">\n Add {name === '' ? 'server' : name}\n </SubmitButton>\n <button type=\"button\" className={BUTTONS.secondary} onClick={onBack}>\n Back to the address\n </button>\n </div>\n </form>\n </>\n );\n}\n\n/**\n * Adding an outside MCP server in three steps: its address and credential,\n * the gateway's check of the tools it answers with, then its owner. Each\n * button says at once that its step is on its way.\n */\nexport function AddServer({ fleetId }: { fleetId: string }) {\n const [checked, check] = useActionState(checkServer, { step: 'address', fields: {} });\n const [refused, approve] = useActionState(approveServer, { kind: 'idle' });\n // Going back shows the address step again, with what was sent, until the next check answers.\n const [backFrom, setBackFrom] = useState<string | undefined>(undefined);\n const owner = checked.step === 'owner' && backFrom !== checked.requestId ? checked : undefined;\n return (\n <div className=\"grid gap-4\">\n <h1 className=\"text-title font-semibold\">Add MCP server</h1>\n <Steps at={owner === undefined ? 0 : 2} />\n {owner === undefined ? (\n <AddressStep state={checked} action={check} fleetId={fleetId} />\n ) : (\n <OwnerStep state={owner} refused={refused} action={approve} onBack={() => { setBackFrom(owner.requestId); }} fleetId={fleetId} />\n )}\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"6019f8ccbb153920d3407417fa13ae2f68dbae4425\":{\"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(\"6019f8ccbb153920d3407417fa13ae2f68dbae4425\",callServer,void 0,findSourceMapURL,\"approveServer\");export{$$RSC_SERVER_ACTION_1 as approveServer};","/* __next_internal_action_entry_do_not_use__ [{\"604cd683600419224d72cce16001d6551c38501acd\":{\"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(\"604cd683600419224d72cce16001d6551c38501acd\",callServer,void 0,findSourceMapURL,\"checkServer\");export{$$RSC_SERVER_ACTION_0 as checkServer};","/** A proxy ship's name offered from a server's address: its host's first name that says whose it is. */\nexport function suggestedName(url: string): string {\n if (!URL.canParse(url)) {\n return '';\n }\n const labels = new URL(url).hostname.split('.').filter((label) => label !== 'mcp' && label !== 'www');\n return (labels[0] ?? '').toLowerCase().replaceAll(/[^a-z0-9]+/g, '-').replaceAll(/^-+|-+$/g, '');\n}\n"],"names":["$$RSC_SERVER_ACTION_1"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[18434,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(30587),e=a.i(88412),f=a.i(36855),g=a.i(77237),h=a.i(5050);let i=(0,h.createServerReference)("
|
|
1
|
+
module.exports=[18434,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(30587),e=a.i(88412),f=a.i(36855),g=a.i(77237),h=a.i(5050);let i=(0,h.createServerReference)("609de1548e26e906984570c1f9954ede97bf7b77ca",h.callServer,void 0,h.findSourceMapURL,"switchOutsideParties"),j={waiting:"border-tone-waiting-border bg-tone-waiting-bg text-tone-waiting-fg",active:"border-tone-active-border bg-tone-active-bg text-tone-active-fg",ok:"border-tone-ok-border bg-tone-ok-bg text-tone-ok-fg",attention:"border-tone-attention-border bg-tone-attention-bg text-tone-attention-fg",ended:"border-tone-ended-border bg-tone-ended-bg text-tone-ended-fg"};function k({tone:a,label:c}){return(0,b.jsx)("span",{className:`inline-flex items-center rounded-full border px-2 text-caption ${j[a]}`,children:c})}a.s(["SwitchCard",0,function({isOn:a,canSwitch:h,fleetId:j}){let[l,m]=(0,c.useActionState)(i,d.Q);return(0,b.jsxs)("section",{className:`${e.r} grid gap-3`,"data-testid":"outside-parties-switch",children:[(0,b.jsxs)("h2",{className:"flex items-center gap-2 text-section font-semibold",children:["Outside parties are ",a?"on":"off"," ",a?(0,b.jsx)(k,{tone:"ok",label:"On"}):(0,b.jsx)(k,{tone:"ended",label:"Off"})]}),(0,b.jsx)("p",{className:"text-muted-foreground",children:a?"Approved outside MCP servers and clients reach the fleet, as its network rules allow.":"No outside MCP server or client reaches the fleet, and no request for one can be approved."}),"openNetwork"===l.kind?(0,b.jsxs)("form",{action:m,role:"alert",className:"grid gap-3 rounded-md border border-tone-attention-border bg-tone-attention-bg p-4 text-tone-attention-fg",children:[(0,b.jsx)("h3",{className:"font-semibold",children:"Open network"}),(0,b.jsx)("p",{children:l.message}),(0,b.jsx)("input",{type:"hidden",name:d.H,value:j}),(0,b.jsx)("input",{type:"hidden",name:"isOn",value:"true"}),(0,b.jsx)("input",{type:"hidden",name:"isOpenNetworkConfirmed",value:"true"}),(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsx)(g.f,{kind:"destructive",pending:"Turning on…",testId:"outside-parties-turn-on-anyway",children:"Turn on anyway"}),(0,b.jsx)("a",{className:e.x.secondary,href:"",children:"Keep off"})]})]}):h?(0,b.jsxs)("form",{action:m,children:[(0,b.jsx)("input",{type:"hidden",name:d.H,value:j}),(0,b.jsx)("input",{type:"hidden",name:"isOn",value:String(!a)}),(0,b.jsx)(g.f,{kind:a?"secondary":"primary",pending:a?"Turning off…":"Turning on…",testId:"outside-parties-turn",children:a?"Turn off":"Turn on"})]}):(0,b.jsxs)("p",{className:"text-muted-foreground",children:["Turning them on or off needs ","fleet:network","."]}),"openNetwork"===l.kind?null:(0,b.jsx)(f.f,{state:l})]})}],18434)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=web_features_outside-parties_ui_switch-card_tsx_1_xnu9bm4tc-_._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../web/features/outside-parties/ui/switch-card.tsx","../../../../../web/features/outside-parties/data%
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/outside-parties/ui/switch-card.tsx","../../../../../web/features/outside-parties/data%3Abeb7ff%20%3Ctext/javascript%3E","../../../../../web/features/outside-parties/ui/status-badge.tsx"],"sourcesContent":["'use client';\n\nimport { useActionState } from 'react';\n\nimport { FLEET_FIELD, IDLE } from '../../forms/form-state';\nimport { BUTTONS, CARD } from '../../forms/ui/look';\nimport { Outcome } from '../../forms/ui/outcome';\nimport { SubmitButton } from '../../forms/ui/submit-button';\nimport { switchOutsideParties } from '../actions';\nimport { StatusBadge } from './status-badge';\n\n/** The scope that turns outside parties on or off (0056). */\nconst SWITCHING_SCOPE = 'fleet:network';\n\n/**\n * Whether the fleet's outside parties are on, and the switch for an account\n * holding fleet:network. An open network's warning asks to confirm, or to\n * keep them off.\n */\nexport function SwitchCard({ isOn, canSwitch, fleetId }: { isOn: boolean; canSwitch: boolean; fleetId: string }) {\n const [state, formAction] = useActionState(switchOutsideParties, IDLE);\n return (\n <section className={`${CARD} grid gap-3`} data-testid=\"outside-parties-switch\">\n <h2 className=\"flex items-center gap-2 text-section font-semibold\">\n Outside parties are {isOn ? 'on' : 'off'} {isOn ? <StatusBadge tone=\"ok\" label=\"On\" /> : <StatusBadge tone=\"ended\" label=\"Off\" />}\n </h2>\n <p className=\"text-muted-foreground\">\n {isOn ? 'Approved outside MCP servers and clients reach the fleet, as its network rules allow.' : 'No outside MCP server or client reaches the fleet, and no request for one can be approved.'}\n </p>\n {state.kind === 'openNetwork' ? (\n <form action={formAction} role=\"alert\" className=\"grid gap-3 rounded-md border border-tone-attention-border bg-tone-attention-bg p-4 text-tone-attention-fg\">\n <h3 className=\"font-semibold\">Open network</h3>\n <p>{state.message}</p>\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <input type=\"hidden\" name=\"isOn\" value=\"true\" />\n <input type=\"hidden\" name=\"isOpenNetworkConfirmed\" value=\"true\" />\n <div className=\"flex gap-2\">\n <SubmitButton kind=\"destructive\" pending=\"Turning on…\" testId=\"outside-parties-turn-on-anyway\">\n Turn on anyway\n </SubmitButton>\n <a className={BUTTONS.secondary} href=\"\">\n Keep off\n </a>\n </div>\n </form>\n ) : canSwitch ? (\n <form action={formAction}>\n <input type=\"hidden\" name={FLEET_FIELD} value={fleetId} />\n <input type=\"hidden\" name=\"isOn\" value={String(!isOn)} />\n <SubmitButton kind={isOn ? 'secondary' : 'primary'} pending={isOn ? 'Turning off…' : 'Turning on…'} testId=\"outside-parties-turn\">\n {isOn ? 'Turn off' : 'Turn on'}\n </SubmitButton>\n </form>\n ) : (\n <p className=\"text-muted-foreground\">Turning them on or off needs {SWITCHING_SCOPE}.</p>\n )}\n {state.kind === 'openNetwork' ? null : <Outcome state={state} />}\n </section>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"609de1548e26e906984570c1f9954ede97bf7b77ca\":{\"name\":\"switchOutsideParties\"}},\"web/features/outside-parties/actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"609de1548e26e906984570c1f9954ede97bf7b77ca\",callServer,void 0,findSourceMapURL,\"switchOutsideParties\");export{$$RSC_SERVER_ACTION_0 as switchOutsideParties};","import type { Tone } from '../party-kinds';\n\nconst TONES: Record<Tone, string> = {\n waiting: 'border-tone-waiting-border bg-tone-waiting-bg text-tone-waiting-fg',\n active: 'border-tone-active-border bg-tone-active-bg text-tone-active-fg',\n ok: 'border-tone-ok-border bg-tone-ok-bg text-tone-ok-fg',\n attention: 'border-tone-attention-border bg-tone-attention-bg text-tone-attention-fg',\n ended: 'border-tone-ended-border bg-tone-ended-bg text-tone-ended-fg',\n};\n\n/** A status in its tone, as the console shows one. */\nexport function StatusBadge({ tone, label }: { tone: Tone; label: string }) {\n return <span className={`inline-flex items-center rounded-full border px-2 text-caption ${TONES[tone]}`}>{label}</span>;\n}\n\n/** A plain tag: a protocol, a side, an id. */\nexport function Tag({ children, isMono = false }: { children: React.ReactNode; isMono?: boolean }) {\n return <span className={`inline-flex items-center rounded-md border border-border px-2 text-caption ${isMono ? 'font-mono' : ''}`}>{children}</span>;\n}\n"],"names":["$$RSC_SERVER_ACTION_0"],"mappings":"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"}
|
package/web/.next/server/chunks/ssr/web_features_outside-party_actions_ts_102ar5pdowf8s._.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[94705,18379,a=>{"use strict";var b=a.i(37936);a.i(70396);var c=a.i(73727),d=a.i(55476),e=a.i(66283),f=a.i(1324),g=a.i(72913),h=a.i(29517);let i=["messages:send","messages:receive"],j="scope:",k="scopesShown";function l(a,b){let c,{form:d,scopes:e}=b,f=d.ownerShipId?.trim();if(void 0!==f&&f!==a.ownerShipId){let a=(0,h.f)("ship").safeParse(f);if(!a.success)return{kind:"refused",message:"The owner's ship id is not a ship id (shp_...)"};c=a.data}let g=void 0===c?{}:{ownerShipId:c},l=a.scopes;if("true"!==d[k]||null===l)return{kind:"changes",...g,grant:[],revoke:[]};let m=e.filter(a=>!i.includes(a)),n=a=>void 0!==d[`${j}${a}`];return{kind:"changes",...g,grant:m.filter(a=>n(a)&&!l.includes(a)),revoke:m.filter(a=>!n(a)&&l.includes(a))}}a.s(["_",0,i,"e",0,k,"u",0,j,"t",0,l],18379);var m=a.i(13095);let n="name";async function o(a,b){let h=(0,f.v)(b,f.H),i=(0,f.v)(b,n),j=await (0,e.z)(h);try{let[a,c]=await Promise.all([j.parties.get.query({name:i}),j.account.inView.query()]),d=l(a,{form:(0,f.O)(b),scopes:"signedIn"===c.kind?c.scopes:[]});if("refused"===d.kind)return d;void 0!==d.ownerShipId&&await j.parties.changeOwner.mutate({name:i,ownerShipId:d.ownerShipId}),(d.grant.length>0||d.revoke.length>0)&&await j.parties.changeScopes.mutate({name:i,grant:d.grant,revoke:d.revoke})}catch(a){return{kind:"refused",message:(0,e.s)(a)}}(0,c.redirect)((0,d.i)((0,g.N)(i),h))}async function p(a,b){let h=(0,f.v)(b,f.H),i=await (0,e.z)(h);try{await i.parties.retire.mutate({name:(0,f.v)(b,n)})}catch(a){return{kind:"refused",message:(0,e.s)(a)}}(0,c.redirect)((0,d.i)(g.$,h))}(0,m.ensureServerEntryExports)([o,p]),(0,b.registerServerReference)(o,"
|
|
1
|
+
module.exports=[94705,18379,a=>{"use strict";var b=a.i(37936);a.i(70396);var c=a.i(73727),d=a.i(55476),e=a.i(66283),f=a.i(1324),g=a.i(72913),h=a.i(29517);let i=["messages:send","messages:receive"],j="scope:",k="scopesShown";function l(a,b){let c,{form:d,scopes:e}=b,f=d.ownerShipId?.trim();if(void 0!==f&&f!==a.ownerShipId){let a=(0,h.f)("ship").safeParse(f);if(!a.success)return{kind:"refused",message:"The owner's ship id is not a ship id (shp_...)"};c=a.data}let g=void 0===c?{}:{ownerShipId:c},l=a.scopes;if("true"!==d[k]||null===l)return{kind:"changes",...g,grant:[],revoke:[]};let m=e.filter(a=>!i.includes(a)),n=a=>void 0!==d[`${j}${a}`];return{kind:"changes",...g,grant:m.filter(a=>n(a)&&!l.includes(a)),revoke:m.filter(a=>!n(a)&&l.includes(a))}}a.s(["_",0,i,"e",0,k,"u",0,j,"t",0,l],18379);var m=a.i(13095);let n="name";async function o(a,b){let h=(0,f.v)(b,f.H),i=(0,f.v)(b,n),j=await (0,e.z)(h);try{let[a,c]=await Promise.all([j.parties.get.query({name:i}),j.account.inView.query()]),d=l(a,{form:(0,f.O)(b),scopes:"signedIn"===c.kind?c.scopes:[]});if("refused"===d.kind)return d;void 0!==d.ownerShipId&&await j.parties.changeOwner.mutate({name:i,ownerShipId:d.ownerShipId}),(d.grant.length>0||d.revoke.length>0)&&await j.parties.changeScopes.mutate({name:i,grant:d.grant,revoke:d.revoke})}catch(a){return{kind:"refused",message:(0,e.s)(a)}}(0,c.redirect)((0,d.i)((0,g.N)(i),h))}async function p(a,b){let h=(0,f.v)(b,f.H),i=await (0,e.z)(h);try{await i.parties.retire.mutate({name:(0,f.v)(b,n)})}catch(a){return{kind:"refused",message:(0,e.s)(a)}}(0,c.redirect)((0,d.i)(g.$,h))}(0,m.ensureServerEntryExports)([o,p]),(0,b.registerServerReference)(o,"60714bf511621ed83ee76b417b7e4f50c4923c53ff",null),(0,b.registerServerReference)(p,"60fdc46ed07c10ce56ca12c87587990563de6c6573",null),a.s(["v",0,o,"t",0,p],94705)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=web_features_outside-party_actions_ts_102ar5pdowf8s._.js.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[4757,a=>{"use strict";var b=a.i(37936),c=a.i(29517),d=a.i(18558);a.i(70396);var e=a.i(73727),f=a.i(55476),g=a.i(66283),h=a.i(54757),h=h,i=a.i(27221),j=a.i(26972),k=h,l=a.i(89963),m=h,n=h;let o=h.int().min(1),p=i.z.string().min(1),q=j.z.object({key:o,label:p,detail:i.z.string().default("")}),r=j.z.object({id:k.uuid(),title:p,context:i.z.string(),options:l.z.array(q).min(1),pick:j.z.object({option:o,why:p})}).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"]});j.z.object({questionId:k.uuid()}),j.z.object({questionId:k.uuid(),question:r}).refine(({questionId:a,question:b})=>b.id!==a,{message:"The new question has a uuid of its own",path:["question","id"]}),m.union([j.z.object({option:o,note:p.optional()}),j.z.object({note:p})]);let s=m.union([j.z.object({questionId:k.uuid(),option:o,note:p.optional()}),j.z.object({questionId:k.uuid(),note:p})]),t=j.z.object({messageId:(0,c.f)("message"),sentAt:n.iso.datetime(),option:o.nullable(),note:i.z.string().nullable()});j.z.object({id:k.uuid(),title:i.z.string(),context:i.z.string(),options:l.z.array(q),pick:j.z.object({option:o,why:i.z.string()}),answer:t.nullable()});var u=a.i(11393),v=a.i(10351);async function w(a,b){let c;try{c={isOk:!0,value:await b(await (0,g.z)(a))}}catch(c){let b=(0,g.T)(c);if("UNAUTHORIZED"===b)return(0,e.redirect)(`/sign-in/start?${new URLSearchParams({return_to:`${v.K}?${new URLSearchParams({[f.n]:a}).toString()}`}).toString()}`);return{isOk:!1,message:void 0===b?"The gateway did not answer: try again in a moment":(0,g.s)(c)}}return(0,d.revalidatePath)(v.K),c}async function x(a,b){return w(a,async a=>{let{contentType:c,payload:d,...e}=await a.people.open.mutate({deliveryId:b});return{...e,payload:d,question:function(a){if("application/vnd.aeolus.question+json"===function(a){let[b=""]=a.split(";");return b.trim().toLowerCase()}(a.contentType))try{let b=r.safeParse(JSON.parse(a.payload));return b.success?b.data:void 0}catch{return}}({contentType:c,payload:d})}})}async function y({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=s.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?w(a,async a=>{await a.people.answer.mutate({deliveryId:b,...d.value})}):d}async function z(a,b){return w(a,async a=>{await a.people.done.mutate({deliveryId:b})})}async function A({fleet:a,requestId:b,input:d}){if("deny"===d.kind)return w(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([...u._,...d.scopes])]},{server:g}=d,h=void 0===g?void 0:"clientCredentials"===g.credentialKind?{kind:"clientCredentials",clientId:g.clientId,clientSecret:g.clientSecret,issuer:g.issuer,...""===g.scope?{}:{scope:g.scope}}:{kind:"bearer",token:g.token};return w(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)([x,y,z,A]),(0,b.registerServerReference)(x,"
|
|
1
|
+
module.exports=[4757,a=>{"use strict";var b=a.i(37936),c=a.i(29517),d=a.i(18558);a.i(70396);var e=a.i(73727),f=a.i(55476),g=a.i(66283),h=a.i(54757),h=h,i=a.i(27221),j=a.i(26972),k=h,l=a.i(89963),m=h,n=h;let o=h.int().min(1),p=i.z.string().min(1),q=j.z.object({key:o,label:p,detail:i.z.string().default("")}),r=j.z.object({id:k.uuid(),title:p,context:i.z.string(),options:l.z.array(q).min(1),pick:j.z.object({option:o,why:p})}).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"]});j.z.object({questionId:k.uuid()}),j.z.object({questionId:k.uuid(),question:r}).refine(({questionId:a,question:b})=>b.id!==a,{message:"The new question has a uuid of its own",path:["question","id"]}),m.union([j.z.object({option:o,note:p.optional()}),j.z.object({note:p})]);let s=m.union([j.z.object({questionId:k.uuid(),option:o,note:p.optional()}),j.z.object({questionId:k.uuid(),note:p})]),t=j.z.object({messageId:(0,c.f)("message"),sentAt:n.iso.datetime(),option:o.nullable(),note:i.z.string().nullable()});j.z.object({id:k.uuid(),title:i.z.string(),context:i.z.string(),options:l.z.array(q),pick:j.z.object({option:o,why:i.z.string()}),answer:t.nullable()});var u=a.i(11393),v=a.i(10351);async function w(a,b){let c;try{c={isOk:!0,value:await b(await (0,g.z)(a))}}catch(c){let b=(0,g.T)(c);if("UNAUTHORIZED"===b)return(0,e.redirect)(`/sign-in/start?${new URLSearchParams({return_to:`${v.K}?${new URLSearchParams({[f.n]:a}).toString()}`}).toString()}`);return{isOk:!1,message:void 0===b?"The gateway did not answer: try again in a moment":(0,g.s)(c)}}return(0,d.revalidatePath)(v.K),c}async function x(a,b){return w(a,async a=>{let{contentType:c,payload:d,...e}=await a.people.open.mutate({deliveryId:b});return{...e,payload:d,question:function(a){if("application/vnd.aeolus.question+json"===function(a){let[b=""]=a.split(";");return b.trim().toLowerCase()}(a.contentType))try{let b=r.safeParse(JSON.parse(a.payload));return b.success?b.data:void 0}catch{return}}({contentType:c,payload:d})}})}async function y({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=s.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?w(a,async a=>{await a.people.answer.mutate({deliveryId:b,...d.value})}):d}async function z(a,b){return w(a,async a=>{await a.people.done.mutate({deliveryId:b})})}async function A({fleet:a,requestId:b,input:d}){if("deny"===d.kind)return w(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([...u._,...d.scopes])]},{server:g}=d,h=void 0===g?void 0:"clientCredentials"===g.credentialKind?{kind:"clientCredentials",clientId:g.clientId,clientSecret:g.clientSecret,issuer:g.issuer,...""===g.scope?{}:{scope:g.scope}}:{kind:"bearer",token:g.token};return w(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)([x,y,z,A]),(0,b.registerServerReference)(x,"60d491137132aa96b6833d08eedae6145705a64f9a",null),(0,b.registerServerReference)(y,"4022bb53cb5aed469521ce90b009331cc9e4aa85f6",null),(0,b.registerServerReference)(z,"60f8242e7db2415e3a5de081e5326b1d609e9fce61",null),(0,b.registerServerReference)(A,"40e3b1ad8f9fb8e176b3525a47087f36b14fbcba6e",null),a.s(["q",0,y,"Q",0,A,"G",0,z,"v",0,x],4757)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=web_features_overview_hooks_overview-actions_ts_0-wrat07d1y5g._.js.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[91445,a=>{"use strict";var b=a.i(87924),c=a.i(50944),d=a.i(72131),e=a.i(5050);let f=(0,e.createServerReference)("
|
|
1
|
+
module.exports=[91445,a=>{"use strict";var b=a.i(87924),c=a.i(50944),d=a.i(72131),e=a.i(5050);let f=(0,e.createServerReference)("40e3b1ad8f9fb8e176b3525a47087f36b14fbcba6e",e.callServer,void 0,e.findSourceMapURL,"decideRequest");var g=a.i(35149);let h=["messages:send","messages:receive"],i={"messages:send":"Send","messages:receive":"Receive","fleet:read":"Read the fleet"};var j=a.i(1542),k=a.i(24229);let l="rounded-md border border-input bg-background px-2 py-1.5";function m({scope:a,isLocked:c}){return(0,b.jsxs)("label",{className:"flex items-center gap-2",children:[c?(0,b.jsx)("input",{type:"checkbox",checked:!0,disabled:!0,"aria-label":i[a]??a}):(0,b.jsx)("input",{type:"checkbox",name:"scope",value:a,"aria-label":i[a]??a}),(0,b.jsx)("span",{children:i[a]??a}),(0,b.jsx)("span",{className:"font-mono text-caption text-muted-foreground",children:a}),c?(0,b.jsx)("span",{className:"text-caption text-muted-foreground",children:"(always)"}):null]})}function n(a,b){let c=a.get(b);return"string"==typeof c?c:""}function o({request:a,heldScopes:c,owners:e,working:f,failure:i,onDecide:p}){let[q,r]=(0,d.useState)("bearer"),s=function(a){switch(a.subject.kind){case"client":return a.subject.clientName;case"server":return URL.canParse(a.subject.url)?new URL(a.subject.url).host:a.subject.url}}(a),t="server"===a.subject.kind;return(0,b.jsxs)("section",{className:"grid gap-3 rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm",children:[(0,b.jsxs)("h2",{className:"text-heading font-semibold",children:["Approve ",s]}),(0,b.jsxs)("form",{onSubmit:a=>{a.preventDefault();let b=new FormData(a.currentTarget),c=b.getAll("scope").filter(a=>"string"==typeof a);p({kind:"approve",name:n(b,"name"),ownerShipId:n(b,"ownerShipId"),scopes:c,server:t?{credentialKind:"clientCredentials"===n(b,"credentialKind")?"clientCredentials":"bearer",token:n(b,"token"),clientId:n(b,"clientId"),clientSecret:n(b,"clientSecret"),issuer:n(b,"issuer"),scope:n(b,"scope-requested"),concurrencyLimit:Number(n(b,"concurrencyLimit"))}:void 0})},className:"grid gap-3",children:[(0,b.jsxs)("label",{className:"grid gap-1",children:[(0,b.jsx)("span",{children:"Proxy ship's name"}),(0,b.jsx)("input",{name:"name",defaultValue:s.toLowerCase().replaceAll(/[^a-z0-9]+/g,"-").replaceAll(/^-+|-+$/g,""),required:!0,className:l})]}),(0,b.jsx)(g.f,{choices:e.isOk?e.value:[],current:null,help:"A person ship or argo. It answers for this party.",refusal:e.isOk?void 0:e.refusal}),(0,b.jsxs)("fieldset",{className:"grid gap-1",children:[(0,b.jsx)("legend",{children:"Scopes"}),h.map(a=>(0,b.jsx)(m,{scope:a,isLocked:!0},a)),c.filter(a=>!h.includes(a)).map(a=>(0,b.jsx)(m,{scope:a,isLocked:!1},a))]}),t?(0,b.jsxs)("fieldset",{className:"grid gap-2",children:[(0,b.jsx)("legend",{children:"The server's credential"}),(0,b.jsxs)("label",{className:"grid gap-1",children:[(0,b.jsx)("span",{children:"Credential"}),(0,b.jsxs)("select",{name:"credentialKind",value:q,onChange:a=>{r("clientCredentials"===a.target.value?"clientCredentials":"bearer")},className:l,children:[(0,b.jsx)("option",{value:"bearer",children:"Bearer token"}),(0,b.jsx)("option",{value:"clientCredentials",children:"OAuth client credentials"})]})]}),"bearer"===q?(0,b.jsxs)("label",{className:"grid gap-1",children:[(0,b.jsx)("span",{children:"Bearer token"}),(0,b.jsx)("input",{type:"password",name:"token",className:l})]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("label",{className:"grid gap-1",children:[(0,b.jsx)("span",{children:"Client id"}),(0,b.jsx)("input",{name:"clientId",className:l})]}),(0,b.jsxs)("label",{className:"grid gap-1",children:[(0,b.jsx)("span",{children:"Client secret"}),(0,b.jsx)("input",{type:"password",name:"clientSecret",className:l})]}),(0,b.jsxs)("label",{className:"grid gap-1",children:[(0,b.jsx)("span",{children:"Issuer"}),(0,b.jsx)("input",{type:"url",name:"issuer",className:l})]}),(0,b.jsxs)("label",{className:"grid gap-1",children:[(0,b.jsx)("span",{children:"Scope"}),(0,b.jsx)("input",{name:"scope-requested",className:l})]})]}),(0,b.jsxs)("label",{className:"grid gap-1",children:[(0,b.jsx)("span",{children:"Calls at once"}),(0,b.jsx)("input",{type:"number",name:"concurrencyLimit",min:1,max:10,defaultValue:4,className:l})]})]}):null,void 0===i?null:(0,b.jsx)(k.f,{message:i,isFailure:!0}),(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsx)(j.f,{type:"submit",variant:"primary","data-testid":"overview-approve",isPending:"approve"===f,pendingLabel:"Approving...",disabled:void 0!==f,children:"Approve"}),(0,b.jsx)(j.f,{type:"button","data-testid":"overview-deny",isPending:"deny"===f,pendingLabel:"Denying...",disabled:void 0!==f,onClick:()=>{p({kind:"deny"})},children:"Deny"})]})]})]})}a.s(["DecisionPanel",0,function({fleetId:a,request:e,heldScopes:g,owners:h}){let i=(0,c.useRouter)(),[j,k]=(0,d.useState)(),[l,m]=(0,d.useState)(),[,n]=(0,d.useTransition)();return(0,b.jsx)(o,{request:e,heldScopes:g,owners:h,working:j,failure:l,onDecide:b=>{k(b.kind),m(void 0),n(async()=>{let c=await f({fleet:a,requestId:e.requestId,input:b});c.isOk?i.push(`/overview?${new URLSearchParams({fleet:a,decided:b.kind}).toString()}`):(k(void 0),m(c.message))})}})}],91445)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=web_features_overview_state_decision-panel_tsx_0kpd26ggtr6h_._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../web/features/overview/state/decision-panel.tsx","../../../../../web/features/overview/hooks/data%3A59425f%20%3Ctext/javascript%3E","../../../../../web/features/overview/ui/decision-form.tsx","../../../../../web/features/overview/services/requests.ts"],"sourcesContent":["'use client';\n\nimport { useRouter } from 'next/navigation';\nimport { useState, useTransition } from 'react';\n\nimport type { OwnerChoices } from '../../forms/ui/owner-field';\nimport { decideRequest } from '../hooks/overview-actions';\nimport type { DecisionInput, ShownRequest } from '../services/requests';\nimport { DecisionForm } from '../ui/decision-form';\n\n/** Decides one request as the signed-in approver, then goes back to the Overview, which says nothing more waits here. */\nexport function DecisionPanel({ fleetId, request, heldScopes, owners }: { fleetId: string; request: ShownRequest; heldScopes: readonly string[]; owners: OwnerChoices }) {\n const router = useRouter();\n const [working, setWorking] = useState<DecisionInput['kind'] | undefined>();\n const [failure, setFailure] = useState<string | undefined>();\n const [, startTransition] = useTransition();\n const decide = (decision: DecisionInput) => {\n setWorking(decision.kind);\n setFailure(undefined);\n startTransition(async () => {\n const outcome = await decideRequest({ fleet: fleetId, requestId: request.requestId, input: decision });\n if (outcome.isOk) {\n router.push(`/overview?${new URLSearchParams({ fleet: fleetId, decided: decision.kind }).toString()}`);\n return;\n }\n setWorking(undefined);\n setFailure(outcome.message);\n });\n };\n return <DecisionForm request={request} heldScopes={heldScopes} owners={owners} working={working} failure={failure} onDecide={decide} />;\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"404d9c119589c6de0da022497dd1772a81acb94daa\":{\"name\":\"decideRequest\"}},\"web/features/overview/hooks/overview-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_3=/*#__PURE__*/createServerReference(\"404d9c119589c6de0da022497dd1772a81acb94daa\",callServer,void 0,findSourceMapURL,\"decideRequest\");export{$$RSC_SERVER_ACTION_3 as decideRequest};","'use client';\n\nimport { useState, type SyntheticEvent } from 'react';\n\nimport { OwnerField, type OwnerChoices } from '../../forms/ui/owner-field';\nimport { EVERY_APP_SHIP_SCOPES, scopeLabel, subjectName, suggestedName, type DecisionInput, type ServerCredentialInput, type ShownRequest } from '../services/requests';\nimport { ActionButton } from './action-button';\nimport { Notice } from './notice';\n\nconst CONCURRENCY_LIMIT_DEFAULT = 4;\n\nconst FIELD = 'rounded-md border border-input bg-background px-2 py-1.5';\n\nfunction ScopeRow({ scope, isLocked }: { scope: string; isLocked: boolean }) {\n return (\n <label className=\"flex items-center gap-2\">\n {isLocked ? <input type=\"checkbox\" checked disabled aria-label={scopeLabel(scope)} /> : <input type=\"checkbox\" name=\"scope\" value={scope} aria-label={scopeLabel(scope)} />}\n <span>{scopeLabel(scope)}</span>\n <span className=\"font-mono text-caption text-muted-foreground\">{scope}</span>\n {isLocked ? <span className=\"text-caption text-muted-foreground\">(always)</span> : null}\n </label>\n );\n}\n\nfunction text(form: FormData, name: string): string {\n const value = form.get(name);\n return typeof value === 'string' ? value : '';\n}\n\nfunction serverOf(form: FormData): ServerCredentialInput {\n return {\n credentialKind: text(form, 'credentialKind') === 'clientCredentials' ? 'clientCredentials' : 'bearer',\n token: text(form, 'token'),\n clientId: text(form, 'clientId'),\n clientSecret: text(form, 'clientSecret'),\n issuer: text(form, 'issuer'),\n scope: text(form, 'scope-requested'),\n concurrencyLimit: Number(text(form, 'concurrencyLimit')),\n };\n}\n\n/**\n * The decision on a request: approving names the proxy ship and its owner,\n * and offers as scope rows only the scopes the approver holds, messages:send\n * and messages:receive locked on (0046, 0053); a server's credential too.\n * What was typed stays when the API refuses.\n */\nexport function DecisionForm({\n request,\n heldScopes,\n owners,\n working,\n failure,\n onDecide,\n}: {\n request: ShownRequest;\n heldScopes: readonly string[];\n owners: OwnerChoices;\n working: DecisionInput['kind'] | undefined;\n failure: string | undefined;\n onDecide: (decision: DecisionInput) => void;\n}) {\n const [credentialKind, setCredentialKind] = useState<ServerCredentialInput['credentialKind']>('bearer');\n const name = subjectName(request);\n const isServer = request.subject.kind === 'server';\n const approve = (event: SyntheticEvent<HTMLFormElement>) => {\n event.preventDefault();\n const form = new FormData(event.currentTarget);\n const scopes = form.getAll('scope').filter((scope) => typeof scope === 'string');\n onDecide({ kind: 'approve', name: text(form, 'name'), ownerShipId: text(form, 'ownerShipId'), scopes, server: isServer ? serverOf(form) : undefined });\n };\n return (\n <section className=\"grid gap-3 rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm\">\n <h2 className=\"text-heading font-semibold\">Approve {name}</h2>\n <form onSubmit={approve} className=\"grid gap-3\">\n <label className=\"grid gap-1\">\n <span>Proxy ship's name</span>\n <input name=\"name\" defaultValue={suggestedName(name)} required className={FIELD} />\n </label>\n <OwnerField choices={owners.isOk ? owners.value : []} current={null} help=\"A person ship or argo. It answers for this party.\" refusal={owners.isOk ? undefined : owners.refusal} />\n <fieldset className=\"grid gap-1\">\n <legend>Scopes</legend>\n {EVERY_APP_SHIP_SCOPES.map((scope) => (\n <ScopeRow key={scope} scope={scope} isLocked />\n ))}\n {heldScopes\n .filter((scope) => !EVERY_APP_SHIP_SCOPES.includes(scope))\n .map((scope) => (\n <ScopeRow key={scope} scope={scope} isLocked={false} />\n ))}\n </fieldset>\n {isServer ? (\n <fieldset className=\"grid gap-2\">\n <legend>The server's credential</legend>\n <label className=\"grid gap-1\">\n <span>Credential</span>\n <select name=\"credentialKind\" value={credentialKind} onChange={(event) => { setCredentialKind(event.target.value === 'clientCredentials' ? 'clientCredentials' : 'bearer'); }} className={FIELD}>\n <option value=\"bearer\">Bearer token</option>\n <option value=\"clientCredentials\">OAuth client credentials</option>\n </select>\n </label>\n {credentialKind === 'bearer' ? (\n <label className=\"grid gap-1\">\n <span>Bearer token</span>\n <input type=\"password\" name=\"token\" className={FIELD} />\n </label>\n ) : (\n <>\n <label className=\"grid gap-1\">\n <span>Client id</span>\n <input name=\"clientId\" className={FIELD} />\n </label>\n <label className=\"grid gap-1\">\n <span>Client secret</span>\n <input type=\"password\" name=\"clientSecret\" className={FIELD} />\n </label>\n <label className=\"grid gap-1\">\n <span>Issuer</span>\n <input type=\"url\" name=\"issuer\" className={FIELD} />\n </label>\n <label className=\"grid gap-1\">\n <span>Scope</span>\n <input name=\"scope-requested\" className={FIELD} />\n </label>\n </>\n )}\n <label className=\"grid gap-1\">\n <span>Calls at once</span>\n <input type=\"number\" name=\"concurrencyLimit\" min={1} max={10} defaultValue={CONCURRENCY_LIMIT_DEFAULT} className={FIELD} />\n </label>\n </fieldset>\n ) : null}\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n <div className=\"flex gap-2\">\n <ActionButton type=\"submit\" variant=\"primary\" data-testid=\"overview-approve\" isPending={working === 'approve'} pendingLabel=\"Approving...\" disabled={working !== undefined}>\n Approve\n </ActionButton>\n <ActionButton type=\"button\" data-testid=\"overview-deny\" isPending={working === 'deny'} pendingLabel=\"Denying...\" disabled={working !== undefined} onClick={() => { onDecide({ kind: 'deny' }); }}>\n Deny\n </ActionButton>\n </div>\n </form>\n </section>\n );\n}\n","/**\n * How the Overview names and states a request for an outside party (design\n * B, Signal): pure view logic, no React and no API client.\n */\nimport type { inferRouterOutputs } from '@trpc/server';\n\nimport type { GatewayRouter } from '../../../../src/adapters/trpc/router.js';\n\n/** A request as the API shows it. */\nexport type ShownRequest = inferRouterOutputs<GatewayRouter>['requests']['toDecide'][number];\n\n/** The tones a status shows, from the design tokens; a status always has its words too. */\nexport type Tone = 'waiting' | 'active' | 'ok' | 'attention' | 'ended';\n\nexport interface Status {\n readonly tone: Tone;\n readonly label: string;\n}\n\nconst DAY_MS = 86_400_000;\n\n/** How an outside party is named before it has a proxy ship: a client by its name, a server by its host. */\nexport function subjectName(request: ShownRequest): string {\n switch (request.subject.kind) {\n case 'client':\n return request.subject.clientName;\n case 'server':\n return URL.canParse(request.subject.url) ? new URL(request.subject.url).host : request.subject.url;\n }\n}\n\nexport function subjectKind(request: ShownRequest): string {\n switch (request.subject.kind) {\n case 'client':\n return 'MCP client';\n case 'server':\n return 'MCP server';\n }\n}\n\n/** Days left of the 7 a request is kept, counted up, so its last day reads as such, in the attention tone. */\nexport function daysLeft(request: ShownRequest, now: Date): Status {\n const days = Math.ceil((Date.parse(request.expiresAt) - now.getTime()) / DAY_MS);\n return days <= 1 ? { tone: 'attention', label: 'Last day' } : { tone: 'waiting', label: `${String(days)} d left` };\n}\n\n/** A request's state as the console shows a status; one still pending shows its days left. */\nexport function requestStatus(request: ShownRequest, now: Date): Status {\n switch (request.state) {\n case 'pending':\n return daysLeft(request, now);\n case 'approving':\n return { tone: 'active', label: 'Approving' };\n case 'approved':\n return { tone: 'ok', label: 'Approved' };\n case 'denied':\n return { tone: 'ended', label: 'Denied' };\n case 'expired':\n return { tone: 'ended', label: 'Expired' };\n }\n}\n\n/** A proxy ship's name offered from the party's own: lower case letters, digits and dashes. */\nexport function suggestedName(name: string): string {\n return name\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/g, '-')\n .replaceAll(/^-+|-+$/g, '');\n}\n\n/** The scopes every app ship gets (0046): shown locked on, and always sent. */\nexport const EVERY_APP_SHIP_SCOPES: readonly string[] = ['messages:send', 'messages:receive'];\n\nconst SCOPE_LABELS: Record<string, string> = {\n 'messages:send': 'Send',\n 'messages:receive': 'Receive',\n 'fleet:read': 'Read the fleet',\n};\n\n/** A scope's plain label, shown beside the scope itself. */\nexport function scopeLabel(scope: string): string {\n return SCOPE_LABELS[scope] ?? scope;\n}\n\n/** The server's credential as the decision form takes it. */\nexport interface ServerCredentialInput {\n readonly credentialKind: 'bearer' | 'clientCredentials';\n readonly token: string;\n readonly clientId: string;\n readonly clientSecret: string;\n readonly issuer: string;\n readonly scope: string;\n readonly concurrencyLimit: number;\n}\n\nexport type DecisionInput = { readonly kind: 'deny' } | { readonly kind: 'approve'; readonly name: string; readonly ownerShipId: string; readonly scopes: readonly string[]; readonly server: ServerCredentialInput | undefined };\n"],"names":["$$RSC_SERVER_ACTION_3"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../web/features/overview/state/decision-panel.tsx","../../../../../web/features/overview/hooks/data%3A20669f%20%3Ctext/javascript%3E","../../../../../web/features/overview/ui/decision-form.tsx","../../../../../web/features/overview/services/requests.ts"],"sourcesContent":["'use client';\n\nimport { useRouter } from 'next/navigation';\nimport { useState, useTransition } from 'react';\n\nimport type { OwnerChoices } from '../../forms/ui/owner-field';\nimport { decideRequest } from '../hooks/overview-actions';\nimport type { DecisionInput, ShownRequest } from '../services/requests';\nimport { DecisionForm } from '../ui/decision-form';\n\n/** Decides one request as the signed-in approver, then goes back to the Overview, which says nothing more waits here. */\nexport function DecisionPanel({ fleetId, request, heldScopes, owners }: { fleetId: string; request: ShownRequest; heldScopes: readonly string[]; owners: OwnerChoices }) {\n const router = useRouter();\n const [working, setWorking] = useState<DecisionInput['kind'] | undefined>();\n const [failure, setFailure] = useState<string | undefined>();\n const [, startTransition] = useTransition();\n const decide = (decision: DecisionInput) => {\n setWorking(decision.kind);\n setFailure(undefined);\n startTransition(async () => {\n const outcome = await decideRequest({ fleet: fleetId, requestId: request.requestId, input: decision });\n if (outcome.isOk) {\n router.push(`/overview?${new URLSearchParams({ fleet: fleetId, decided: decision.kind }).toString()}`);\n return;\n }\n setWorking(undefined);\n setFailure(outcome.message);\n });\n };\n return <DecisionForm request={request} heldScopes={heldScopes} owners={owners} working={working} failure={failure} onDecide={decide} />;\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40e3b1ad8f9fb8e176b3525a47087f36b14fbcba6e\":{\"name\":\"decideRequest\"}},\"web/features/overview/hooks/overview-actions.ts\",\"\"] */\"use turbopack: no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_3=/*#__PURE__*/createServerReference(\"40e3b1ad8f9fb8e176b3525a47087f36b14fbcba6e\",callServer,void 0,findSourceMapURL,\"decideRequest\");export{$$RSC_SERVER_ACTION_3 as decideRequest};","'use client';\n\nimport { useState, type SyntheticEvent } from 'react';\n\nimport { OwnerField, type OwnerChoices } from '../../forms/ui/owner-field';\nimport { EVERY_APP_SHIP_SCOPES, scopeLabel, subjectName, suggestedName, type DecisionInput, type ServerCredentialInput, type ShownRequest } from '../services/requests';\nimport { ActionButton } from './action-button';\nimport { Notice } from './notice';\n\nconst CONCURRENCY_LIMIT_DEFAULT = 4;\n\nconst FIELD = 'rounded-md border border-input bg-background px-2 py-1.5';\n\nfunction ScopeRow({ scope, isLocked }: { scope: string; isLocked: boolean }) {\n return (\n <label className=\"flex items-center gap-2\">\n {isLocked ? <input type=\"checkbox\" checked disabled aria-label={scopeLabel(scope)} /> : <input type=\"checkbox\" name=\"scope\" value={scope} aria-label={scopeLabel(scope)} />}\n <span>{scopeLabel(scope)}</span>\n <span className=\"font-mono text-caption text-muted-foreground\">{scope}</span>\n {isLocked ? <span className=\"text-caption text-muted-foreground\">(always)</span> : null}\n </label>\n );\n}\n\nfunction text(form: FormData, name: string): string {\n const value = form.get(name);\n return typeof value === 'string' ? value : '';\n}\n\nfunction serverOf(form: FormData): ServerCredentialInput {\n return {\n credentialKind: text(form, 'credentialKind') === 'clientCredentials' ? 'clientCredentials' : 'bearer',\n token: text(form, 'token'),\n clientId: text(form, 'clientId'),\n clientSecret: text(form, 'clientSecret'),\n issuer: text(form, 'issuer'),\n scope: text(form, 'scope-requested'),\n concurrencyLimit: Number(text(form, 'concurrencyLimit')),\n };\n}\n\n/**\n * The decision on a request: approving names the proxy ship and its owner,\n * and offers as scope rows only the scopes the approver holds, messages:send\n * and messages:receive locked on (0046, 0053); a server's credential too.\n * What was typed stays when the API refuses.\n */\nexport function DecisionForm({\n request,\n heldScopes,\n owners,\n working,\n failure,\n onDecide,\n}: {\n request: ShownRequest;\n heldScopes: readonly string[];\n owners: OwnerChoices;\n working: DecisionInput['kind'] | undefined;\n failure: string | undefined;\n onDecide: (decision: DecisionInput) => void;\n}) {\n const [credentialKind, setCredentialKind] = useState<ServerCredentialInput['credentialKind']>('bearer');\n const name = subjectName(request);\n const isServer = request.subject.kind === 'server';\n const approve = (event: SyntheticEvent<HTMLFormElement>) => {\n event.preventDefault();\n const form = new FormData(event.currentTarget);\n const scopes = form.getAll('scope').filter((scope) => typeof scope === 'string');\n onDecide({ kind: 'approve', name: text(form, 'name'), ownerShipId: text(form, 'ownerShipId'), scopes, server: isServer ? serverOf(form) : undefined });\n };\n return (\n <section className=\"grid gap-3 rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm\">\n <h2 className=\"text-heading font-semibold\">Approve {name}</h2>\n <form onSubmit={approve} className=\"grid gap-3\">\n <label className=\"grid gap-1\">\n <span>Proxy ship's name</span>\n <input name=\"name\" defaultValue={suggestedName(name)} required className={FIELD} />\n </label>\n <OwnerField choices={owners.isOk ? owners.value : []} current={null} help=\"A person ship or argo. It answers for this party.\" refusal={owners.isOk ? undefined : owners.refusal} />\n <fieldset className=\"grid gap-1\">\n <legend>Scopes</legend>\n {EVERY_APP_SHIP_SCOPES.map((scope) => (\n <ScopeRow key={scope} scope={scope} isLocked />\n ))}\n {heldScopes\n .filter((scope) => !EVERY_APP_SHIP_SCOPES.includes(scope))\n .map((scope) => (\n <ScopeRow key={scope} scope={scope} isLocked={false} />\n ))}\n </fieldset>\n {isServer ? (\n <fieldset className=\"grid gap-2\">\n <legend>The server's credential</legend>\n <label className=\"grid gap-1\">\n <span>Credential</span>\n <select name=\"credentialKind\" value={credentialKind} onChange={(event) => { setCredentialKind(event.target.value === 'clientCredentials' ? 'clientCredentials' : 'bearer'); }} className={FIELD}>\n <option value=\"bearer\">Bearer token</option>\n <option value=\"clientCredentials\">OAuth client credentials</option>\n </select>\n </label>\n {credentialKind === 'bearer' ? (\n <label className=\"grid gap-1\">\n <span>Bearer token</span>\n <input type=\"password\" name=\"token\" className={FIELD} />\n </label>\n ) : (\n <>\n <label className=\"grid gap-1\">\n <span>Client id</span>\n <input name=\"clientId\" className={FIELD} />\n </label>\n <label className=\"grid gap-1\">\n <span>Client secret</span>\n <input type=\"password\" name=\"clientSecret\" className={FIELD} />\n </label>\n <label className=\"grid gap-1\">\n <span>Issuer</span>\n <input type=\"url\" name=\"issuer\" className={FIELD} />\n </label>\n <label className=\"grid gap-1\">\n <span>Scope</span>\n <input name=\"scope-requested\" className={FIELD} />\n </label>\n </>\n )}\n <label className=\"grid gap-1\">\n <span>Calls at once</span>\n <input type=\"number\" name=\"concurrencyLimit\" min={1} max={10} defaultValue={CONCURRENCY_LIMIT_DEFAULT} className={FIELD} />\n </label>\n </fieldset>\n ) : null}\n {failure === undefined ? null : <Notice message={failure} isFailure />}\n <div className=\"flex gap-2\">\n <ActionButton type=\"submit\" variant=\"primary\" data-testid=\"overview-approve\" isPending={working === 'approve'} pendingLabel=\"Approving...\" disabled={working !== undefined}>\n Approve\n </ActionButton>\n <ActionButton type=\"button\" data-testid=\"overview-deny\" isPending={working === 'deny'} pendingLabel=\"Denying...\" disabled={working !== undefined} onClick={() => { onDecide({ kind: 'deny' }); }}>\n Deny\n </ActionButton>\n </div>\n </form>\n </section>\n );\n}\n","/**\n * How the Overview names and states a request for an outside party (design\n * B, Signal): pure view logic, no React and no API client.\n */\nimport type { inferRouterOutputs } from '@trpc/server';\n\nimport type { GatewayRouter } from '../../../../src/adapters/trpc/router.js';\n\n/** A request as the API shows it. */\nexport type ShownRequest = inferRouterOutputs<GatewayRouter>['requests']['toDecide'][number];\n\n/** The tones a status shows, from the design tokens; a status always has its words too. */\nexport type Tone = 'waiting' | 'active' | 'ok' | 'attention' | 'ended';\n\nexport interface Status {\n readonly tone: Tone;\n readonly label: string;\n}\n\nconst DAY_MS = 86_400_000;\n\n/** How an outside party is named before it has a proxy ship: a client by its name, a server by its host. */\nexport function subjectName(request: ShownRequest): string {\n switch (request.subject.kind) {\n case 'client':\n return request.subject.clientName;\n case 'server':\n return URL.canParse(request.subject.url) ? new URL(request.subject.url).host : request.subject.url;\n }\n}\n\nexport function subjectKind(request: ShownRequest): string {\n switch (request.subject.kind) {\n case 'client':\n return 'MCP client';\n case 'server':\n return 'MCP server';\n }\n}\n\n/** Days left of the 7 a request is kept, counted up, so its last day reads as such, in the attention tone. */\nexport function daysLeft(request: ShownRequest, now: Date): Status {\n const days = Math.ceil((Date.parse(request.expiresAt) - now.getTime()) / DAY_MS);\n return days <= 1 ? { tone: 'attention', label: 'Last day' } : { tone: 'waiting', label: `${String(days)} d left` };\n}\n\n/** A request's state as the console shows a status; one still pending shows its days left. */\nexport function requestStatus(request: ShownRequest, now: Date): Status {\n switch (request.state) {\n case 'pending':\n return daysLeft(request, now);\n case 'approving':\n return { tone: 'active', label: 'Approving' };\n case 'approved':\n return { tone: 'ok', label: 'Approved' };\n case 'denied':\n return { tone: 'ended', label: 'Denied' };\n case 'expired':\n return { tone: 'ended', label: 'Expired' };\n }\n}\n\n/** A proxy ship's name offered from the party's own: lower case letters, digits and dashes. */\nexport function suggestedName(name: string): string {\n return name\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/g, '-')\n .replaceAll(/^-+|-+$/g, '');\n}\n\n/** The scopes every app ship gets (0046): shown locked on, and always sent. */\nexport const EVERY_APP_SHIP_SCOPES: readonly string[] = ['messages:send', 'messages:receive'];\n\nconst SCOPE_LABELS: Record<string, string> = {\n 'messages:send': 'Send',\n 'messages:receive': 'Receive',\n 'fleet:read': 'Read the fleet',\n};\n\n/** A scope's plain label, shown beside the scope itself. */\nexport function scopeLabel(scope: string): string {\n return SCOPE_LABELS[scope] ?? scope;\n}\n\n/** The server's credential as the decision form takes it. */\nexport interface ServerCredentialInput {\n readonly credentialKind: 'bearer' | 'clientCredentials';\n readonly token: string;\n readonly clientId: string;\n readonly clientSecret: string;\n readonly issuer: string;\n readonly scope: string;\n readonly concurrencyLimit: number;\n}\n\nexport type DecisionInput = { readonly kind: 'deny' } | { readonly kind: 'approve'; readonly name: string; readonly ownerShipId: string; readonly scopes: readonly string[]; readonly server: ServerCredentialInput | undefined };\n"],"names":["$$RSC_SERVER_ACTION_3"],"mappings":"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"}
|
package/web/.next/server/chunks/ssr/web_features_overview_state_inbox-panel_tsx_03hlegjsc27sb._.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[72839,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(5050);let e=(0,d.createServerReference)("
|
|
1
|
+
module.exports=[72839,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(5050);let e=(0,d.createServerReference)("4022bb53cb5aed469521ce90b009331cc9e4aa85f6",d.callServer,void 0,d.findSourceMapURL,"answerDelivery"),f=(0,d.createServerReference)("60f8242e7db2415e3a5de081e5326b1d609e9fce61",d.callServer,void 0,d.findSourceMapURL,"doneDelivery"),g=(0,d.createServerReference)("60d491137132aa96b6833d08eedae6145705a64f9a",d.callServer,void 0,d.findSourceMapURL,"openDelivery");var h=a.i(1542),i=a.i(24229);function j({delivery:a,note:c,working:d,failure:e,onNoteChange:f,onAnswer:g,onDone:k,onBack:l}){let{question:m}=a,n=void 0!==d,o=m?.options.find(a=>a.key===m.pick.option);return(0,b.jsxs)("section",{"data-testid":"overview-delivery",className:"grid gap-3 rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm",children:[(0,b.jsxs)("span",{className:"text-caption text-muted-foreground",children:[a.from," · ",new Date(a.sentAt).toUTCString()]}),(0,b.jsx)("h2",{className:"text-heading font-semibold",children:m?.title??a.title}),void 0===m?void 0===a.payload?(0,b.jsx)("p",{className:"text-muted-foreground",children:"You opened this before; its content was shown to you then."}):(0,b.jsx)("pre",{className:"whitespace-pre-wrap rounded-md bg-muted p-3 font-mono text-caption",children:a.payload}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("p",{className:"whitespace-pre-wrap",children:m.context}),(0,b.jsx)("div",{className:"flex flex-wrap gap-2",children:m.options.map(a=>(0,b.jsx)(h.f,{title:a.detail,variant:a.key===m.pick.option?"primary":"secondary",className:a.key===m.pick.option?"outline-2 outline-offset-2 outline-dashed outline-ring":"",isPending:d?.kind==="option"&&d.option===a.key,pendingLabel:"Sending...",disabled:n,onClick:()=>{g(a.key)},children:a.label},a.key))}),void 0===o?null:(0,b.jsxs)("p",{className:"text-muted-foreground",children:[o.label," is the pick of ",a.from,": ",m.pick.why]})]}),(0,b.jsxs)("label",{className:"grid gap-1",children:[(0,b.jsx)("span",{children:void 0===m?"Your answer":"Note"}),(0,b.jsx)("textarea",{"data-testid":"overview-note",rows:2,value:c,onChange:a=>{f(a.target.value)},placeholder:void 0===m?"":"Optional, sent with your answer",className:"rounded-md border border-input bg-background p-2"})]}),void 0===e?null:(0,b.jsx)(i.f,{message:e,isFailure:!0}),(0,b.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,b.jsx)(h.f,{"data-testid":"overview-answer",variant:void 0===m?"primary":"secondary",isPending:d?.kind==="note",pendingLabel:"Sending...",disabled:n,onClick:()=>{g(void 0)},children:void 0===m?"Answer":"Send the note alone"}),void 0===m?(0,b.jsx)(h.f,{"data-testid":"overview-done",isPending:d?.kind==="done",pendingLabel:"Marking done...",disabled:n,onClick:k,children:"Done"}):null,(0,b.jsx)("button",{type:"button",onClick:l,disabled:n,className:"inline-flex h-9 items-center rounded-md px-4 text-muted-foreground hover:bg-accent disabled:opacity-70",children:"Back to the inbox"})]})]})}function k({entry:a}){return(0,b.jsxs)("span",{className:"flex min-w-0 flex-1 flex-col text-left",children:[(0,b.jsx)("span",{className:"truncate",children:a.title}),(0,b.jsxs)("span",{className:"text-caption text-muted-foreground",children:["from ",a.from]})]})}function l({waitingCount:a,waiting:c,opened:d,openingId:e,failure:f,onOpen:g,onFocus:j}){return(0,b.jsxs)("div",{className:"grid gap-6",children:[0===c.length?null:(0,b.jsxs)("section",{className:"grid gap-2",children:[(0,b.jsxs)("h2",{className:"text-section font-semibold",children:["Next · ",a]}),c.map(a=>(0,b.jsxs)("div",{className:"grid gap-2 rounded-md border border-border bg-card p-3",children:[(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[(0,b.jsx)(k,{entry:a}),(0,b.jsx)(h.f,{"data-testid":"overview-open",isPending:e===a.deliveryId,pendingLabel:"Opening...",disabled:void 0!==e,onClick:()=>{g(a)},children:"Open"})]}),f?.deliveryId===a.deliveryId?(0,b.jsx)(i.f,{message:f.message,isFailure:!0}):null]},a.deliveryId))]}),0===d.length?null:(0,b.jsxs)("section",{className:"grid gap-2",children:[(0,b.jsxs)("h2",{className:"text-section font-semibold",children:["Opened, not yet dealt with · ",d.length]}),d.map(a=>(0,b.jsxs)("div",{className:"flex items-center gap-3 rounded-md border border-border bg-card p-3",children:[(0,b.jsx)(k,{entry:a}),(0,b.jsx)("button",{type:"button","data-testid":"overview-deal",onClick:()=>{j(a)},className:"inline-flex h-9 items-center rounded-md border border-border px-4 hover:bg-accent",children:"Answer or be done"})]},a.deliveryId))]})]})}a.s(["InboxPanel",0,function({fleetId:a,inbox:d}){let[h,k]=(0,c.useState)(),[m,n]=(0,c.useState)(""),[o,p]=(0,c.useState)(),[q,r]=(0,c.useState)(),[s,t]=(0,c.useState)(),[u,v]=(0,c.useState)(),[w,x]=(0,c.useState)(),[,y]=(0,c.useTransition)(),z=a=>{k(a),n(""),v(void 0),x(void 0)},A=({control:a,action:b,said:c})=>{r(a),v(void 0),y(async()=>{let a=await b();r(void 0),a.isOk?(k(void 0),x(c)):v(a.message)})};return void 0!==h?(0,b.jsx)(j,{delivery:h,note:m,working:q,failure:u,onNoteChange:n,onAnswer:b=>{A({control:void 0===b?{kind:"note"}:{kind:"option",option:b},action:()=>e({fleet:a,deliveryId:h.deliveryId,input:{questionId:h.question?.id,option:b,note:m}}),said:`Your answer went to ${h.from}.`})},onDone:()=>{A({control:{kind:"done"},action:()=>f(a,h.deliveryId),said:`Done with “${h.title}”.`})},onBack:()=>{k(void 0)}}):(0,b.jsxs)("div",{className:"grid gap-4",children:[void 0===w?null:(0,b.jsx)(i.f,{message:w,isFailure:!1}),(0,b.jsx)(l,{waitingCount:d.waiting,waiting:d.deliveries,opened:d.opened,openingId:o,failure:s,onOpen:b=>{p(b.deliveryId),t(void 0),x(void 0),y(async()=>{let c=await g(a,b.deliveryId);p(void 0),c.isOk?z(c.value):t({deliveryId:b.deliveryId,message:c.message})})},onFocus:a=>{z({...a,payload:void 0,question:void 0})}})]})}],72839)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=web_features_overview_state_inbox-panel_tsx_03hlegjsc27sb._.js.map
|