agent-relay-server 0.35.4 → 0.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/openapi.json +68 -1
- package/package.json +2 -2
- package/public/assets/{activity-CPuZGkeP.js → activity-DVdEofAq.js} +2 -2
- package/public/assets/{activity-CPuZGkeP.js.map → activity-DVdEofAq.js.map} +1 -1
- package/public/assets/{agent-profiles-Bs8MAW6j.js → agent-profiles-BiQ-5F3l.js} +2 -2
- package/public/assets/{agent-profiles-Bs8MAW6j.js.map → agent-profiles-BiQ-5F3l.js.map} +1 -1
- package/public/assets/agents-Dt4FBBnk.js +2 -0
- package/public/assets/agents-Dt4FBBnk.js.map +1 -0
- package/public/assets/{analytics-inmkBD_j.js → analytics-BeUxZhkP.js} +3 -3
- package/public/assets/{analytics-inmkBD_j.js.map → analytics-BeUxZhkP.js.map} +1 -1
- package/public/assets/{automation-DRN2lcqQ.js → automation--G9ZMkL6.js} +2 -2
- package/public/assets/{automation-DRN2lcqQ.js.map → automation--G9ZMkL6.js.map} +1 -1
- package/public/assets/{badge-t8zAwHW9.js → badge-JVybSpzR.js} +2 -2
- package/public/assets/{badge-t8zAwHW9.js.map → badge-JVybSpzR.js.map} +1 -1
- package/public/assets/{branch-state-badge-EliCEAQI.js → branch-state-badge-BTqHF74k.js} +2 -2
- package/public/assets/{branch-state-badge-EliCEAQI.js.map → branch-state-badge-BTqHF74k.js.map} +1 -1
- package/public/assets/{button-DDA5P2YQ.js → button-BsMqBNJb.js} +2 -2
- package/public/assets/{button-DDA5P2YQ.js.map → button-BsMqBNJb.js.map} +1 -1
- package/public/assets/card-I8w4U656.js +2 -0
- package/public/assets/{card-CggxP1h9.js.map → card-I8w4U656.js.map} +1 -1
- package/public/assets/{channels-BzSpsE5h.js → channels-nqTHGf6J.js} +2 -2
- package/public/assets/{channels-BzSpsE5h.js.map → channels-nqTHGf6J.js.map} +1 -1
- package/public/assets/chat-DALcMlDH.js +2 -0
- package/public/assets/chat-DALcMlDH.js.map +1 -0
- package/public/assets/{connectors-DoUgct8f.js → connectors-ChkEg-0q.js} +2 -2
- package/public/assets/{connectors-DoUgct8f.js.map → connectors-ChkEg-0q.js.map} +1 -1
- package/public/assets/copy-button-B-XlL8nF.js +2 -0
- package/public/assets/{copy-button-CE8e2c-F.js.map → copy-button-B-XlL8nF.js.map} +1 -1
- package/public/assets/display-ConJ9cJB.js +3 -0
- package/public/assets/{display-Bebqs1qu.js.map → display-ConJ9cJB.js.map} +1 -1
- package/public/assets/{dist-CiWi_f7V.js → dist-BQ52MnS1.js} +2 -2
- package/public/assets/{dist-CiWi_f7V.js.map → dist-BQ52MnS1.js.map} +1 -1
- package/public/assets/{dist-CHi40_tZ.js → dist-BgfF2Rlm.js} +2 -2
- package/public/assets/{dist-CHi40_tZ.js.map → dist-BgfF2Rlm.js.map} +1 -1
- package/public/assets/dist-CnJzBTp1.js +2 -0
- package/public/assets/{dist-DTLaCErY.js.map → dist-CnJzBTp1.js.map} +1 -1
- package/public/assets/{dist-xorgjFcF.js → dist-CrBurS6i.js} +2 -2
- package/public/assets/{dist-xorgjFcF.js.map → dist-CrBurS6i.js.map} +1 -1
- package/public/assets/dist-D6iXJzms.js +2 -0
- package/public/assets/{dist-BmYJ5xuf.js.map → dist-D6iXJzms.js.map} +1 -1
- package/public/assets/{dist-CkiXMjV0.js → dist-DRlgXPi_.js} +2 -2
- package/public/assets/{dist-CkiXMjV0.js.map → dist-DRlgXPi_.js.map} +1 -1
- package/public/assets/{dist-B3igiXqp.js → dist-DSNhRDNh.js} +2 -2
- package/public/assets/{dist-B3igiXqp.js.map → dist-DSNhRDNh.js.map} +1 -1
- package/public/assets/{dist-C3Yx04R4.js → dist-SqFV12iO.js} +2 -2
- package/public/assets/{dist-C3Yx04R4.js.map → dist-SqFV12iO.js.map} +1 -1
- package/public/assets/{es2015-BDK_SBFZ.js → es2015-iucXYTIE.js} +2 -2
- package/public/assets/{es2015-BDK_SBFZ.js.map → es2015-iucXYTIE.js.map} +1 -1
- package/public/assets/{formatted-body-impl-DP9iZsd4.js → formatted-body-impl-D1K3GML5.js} +2 -2
- package/public/assets/{formatted-body-impl-DP9iZsd4.js.map → formatted-body-impl-D1K3GML5.js.map} +1 -1
- package/public/assets/index-DUxpx-Zp.css +2 -0
- package/public/assets/index-DdB6SVZY.js +21 -0
- package/public/assets/index-DdB6SVZY.js.map +1 -0
- package/public/assets/{input-BW9UD3FM.js → input-dPzf0luy.js} +2 -2
- package/public/assets/{input-BW9UD3FM.js.map → input-dPzf0luy.js.map} +1 -1
- package/public/assets/{insights-yJFgCa3o.js → insights-5CDeJfoX.js} +2 -2
- package/public/assets/{insights-yJFgCa3o.js.map → insights-5CDeJfoX.js.map} +1 -1
- package/public/assets/{integrations-CUv4i_4i.js → integrations-C8839Qa0.js} +2 -2
- package/public/assets/{integrations-CUv4i_4i.js.map → integrations-C8839Qa0.js.map} +1 -1
- package/public/assets/{lib-ZEIADKGq.js → lib-BAE--T4O.js} +3 -3
- package/public/assets/{lib-ZEIADKGq.js.map → lib-BAE--T4O.js.map} +1 -1
- package/public/assets/lucide-react-DLQFnqNm.js +9 -0
- package/public/assets/{lucide-react-CD8Xl2U3.js.map → lucide-react-DLQFnqNm.js.map} +1 -1
- package/public/assets/{maintenance-DtfpsMZa.js → maintenance-Ddl4zgKZ.js} +2 -2
- package/public/assets/{maintenance-DtfpsMZa.js.map → maintenance-Ddl4zgKZ.js.map} +1 -1
- package/public/assets/{managed-agents-C5pzetBh.js → managed-agents-D-K6vUKj.js} +2 -2
- package/public/assets/{managed-agents-C5pzetBh.js.map → managed-agents-D-K6vUKj.js.map} +1 -1
- package/public/assets/{markdown-preview-impl-4s9YDGM7.js → markdown-preview-impl-BjS4cnc3.js} +2 -2
- package/public/assets/{markdown-preview-impl-4s9YDGM7.js.map → markdown-preview-impl-BjS4cnc3.js.map} +1 -1
- package/public/assets/memory-BTV0z4uL.js +2 -0
- package/public/assets/{memory-BWfDbph3.js.map → memory-BTV0z4uL.js.map} +1 -1
- package/public/assets/{messages-C8cP25kp.js → messages-CzHsL-om.js} +2 -2
- package/public/assets/{messages-C8cP25kp.js.map → messages-CzHsL-om.js.map} +1 -1
- package/public/assets/{orchestrators-Clu8MNKo.js → orchestrators-PMUp2sUP.js} +2 -2
- package/public/assets/{orchestrators-Clu8MNKo.js.map → orchestrators-PMUp2sUP.js.map} +1 -1
- package/public/assets/{overview-CXcGh2D6.js → overview-B_od6jh0.js} +2 -2
- package/public/assets/{overview-CXcGh2D6.js.map → overview-B_od6jh0.js.map} +1 -1
- package/public/assets/pairs-CaxiFyfY.js +2 -0
- package/public/assets/{pairs-eOZl_lQn.js.map → pairs-CaxiFyfY.js.map} +1 -1
- package/public/assets/{react-dom-CX8inunm.js → react-dom-CzfKBOnw.js} +2 -2
- package/public/assets/{react-dom-CX8inunm.js.map → react-dom-CzfKBOnw.js.map} +1 -1
- package/public/assets/{security-CA03sHyP.js → security-BZYHZ4CE.js} +2 -2
- package/public/assets/{security-CA03sHyP.js.map → security-BZYHZ4CE.js.map} +1 -1
- package/public/assets/{settings-KTOwGJiW.js → settings-RLyewdfK.js} +7 -7
- package/public/assets/{settings-KTOwGJiW.js.map → settings-RLyewdfK.js.map} +1 -1
- package/public/assets/store-CMUFZKxf.js +9 -0
- package/public/assets/store-CMUFZKxf.js.map +1 -0
- package/public/assets/{switch-22dlDUXs.js → switch-W2_mhdrR.js} +2 -2
- package/public/assets/{switch-22dlDUXs.js.map → switch-W2_mhdrR.js.map} +1 -1
- package/public/assets/tasks-BYTcfYDQ.js +2 -0
- package/public/assets/{tasks-D6jbr2y6.js.map → tasks-BYTcfYDQ.js.map} +1 -1
- package/public/assets/{terminal-viewer-impl-DFODXxpG.js → terminal-viewer-impl-B5rPCNkZ.js} +3 -3
- package/public/assets/{terminal-viewer-impl-DFODXxpG.js.map → terminal-viewer-impl-B5rPCNkZ.js.map} +1 -1
- package/public/assets/{use-keyboard-viewport-DxY_xJV5.js → use-keyboard-viewport-bZ1J-ZnH.js} +2 -2
- package/public/assets/{use-keyboard-viewport-DxY_xJV5.js.map → use-keyboard-viewport-bZ1J-ZnH.js.map} +1 -1
- package/public/assets/work-queue-DYgqkTQD.js +2 -0
- package/public/assets/{work-queue-BWWckTVy.js.map → work-queue-DYgqkTQD.js.map} +1 -1
- package/public/assets/{workspaces-D7lsWShY.js → workspaces-Dkq9DxCL.js} +3 -3
- package/public/assets/{workspaces-D7lsWShY.js.map → workspaces-Dkq9DxCL.js.map} +1 -1
- package/public/index.html +20 -20
- package/src/db/message-reads.ts +54 -1
- package/src/db/migrations.ts +1 -0
- package/src/routes/_shared.ts +2 -1
- package/src/routes/agents.ts +21 -2
- package/src/routes/index.ts +2 -1
- package/src/sse.ts +7 -2
- package/public/assets/agents-Bz4eJ4zH.js +0 -2
- package/public/assets/agents-Bz4eJ4zH.js.map +0 -1
- package/public/assets/card-CggxP1h9.js +0 -2
- package/public/assets/chat-Dn3TEhl0.js +0 -2
- package/public/assets/chat-Dn3TEhl0.js.map +0 -1
- package/public/assets/copy-button-CE8e2c-F.js +0 -2
- package/public/assets/display-Bebqs1qu.js +0 -3
- package/public/assets/dist-BmYJ5xuf.js +0 -2
- package/public/assets/dist-DTLaCErY.js +0 -2
- package/public/assets/index-BL8r94_U.js +0 -21
- package/public/assets/index-BL8r94_U.js.map +0 -1
- package/public/assets/index-DeSwlD3c.css +0 -2
- package/public/assets/lucide-react-CD8Xl2U3.js +0 -9
- package/public/assets/memory-BWfDbph3.js +0 -2
- package/public/assets/pairs-eOZl_lQn.js +0 -2
- package/public/assets/store-CICRhg1m.js +0 -9
- package/public/assets/store-CICRhg1m.js.map +0 -1
- package/public/assets/tasks-D6jbr2y6.js +0 -2
- package/public/assets/work-queue-BWWckTVy.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-dom-CX8inunm.js","names":[],"sources":["../../dashboard/node_modules/react-dom/cjs/react-dom.production.js","../../dashboard/node_modules/react-dom/index.js"],"sourcesContent":["/**\n * @license React\n * react-dom.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\");\nfunction formatProdErrorMessage(code) {\n var url = \"https://react.dev/errors/\" + code;\n if (1 < arguments.length) {\n url += \"?args[]=\" + encodeURIComponent(arguments[1]);\n for (var i = 2; i < arguments.length; i++)\n url += \"&args[]=\" + encodeURIComponent(arguments[i]);\n }\n return (\n \"Minified React error #\" +\n code +\n \"; visit \" +\n url +\n \" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"\n );\n}\nfunction noop() {}\nvar Internals = {\n d: {\n f: noop,\n r: function () {\n throw Error(formatProdErrorMessage(522));\n },\n D: noop,\n C: noop,\n L: noop,\n m: noop,\n X: noop,\n S: noop,\n M: noop\n },\n p: 0,\n findDOMNode: null\n },\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\");\nfunction createPortal$1(children, containerInfo, implementation) {\n var key =\n 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : null;\n return {\n $$typeof: REACT_PORTAL_TYPE,\n key: null == key ? null : \"\" + key,\n children: children,\n containerInfo: containerInfo,\n implementation: implementation\n };\n}\nvar ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;\nfunction getCrossOriginStringAs(as, input) {\n if (\"font\" === as) return \"\";\n if (\"string\" === typeof input)\n return \"use-credentials\" === input ? input : \"\";\n}\nexports.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE =\n Internals;\nexports.createPortal = function (children, container) {\n var key =\n 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : null;\n if (\n !container ||\n (1 !== container.nodeType &&\n 9 !== container.nodeType &&\n 11 !== container.nodeType)\n )\n throw Error(formatProdErrorMessage(299));\n return createPortal$1(children, container, null, key);\n};\nexports.flushSync = function (fn) {\n var previousTransition = ReactSharedInternals.T,\n previousUpdatePriority = Internals.p;\n try {\n if (((ReactSharedInternals.T = null), (Internals.p = 2), fn)) return fn();\n } finally {\n (ReactSharedInternals.T = previousTransition),\n (Internals.p = previousUpdatePriority),\n Internals.d.f();\n }\n};\nexports.preconnect = function (href, options) {\n \"string\" === typeof href &&\n (options\n ? ((options = options.crossOrigin),\n (options =\n \"string\" === typeof options\n ? \"use-credentials\" === options\n ? options\n : \"\"\n : void 0))\n : (options = null),\n Internals.d.C(href, options));\n};\nexports.prefetchDNS = function (href) {\n \"string\" === typeof href && Internals.d.D(href);\n};\nexports.preinit = function (href, options) {\n if (\"string\" === typeof href && options && \"string\" === typeof options.as) {\n var as = options.as,\n crossOrigin = getCrossOriginStringAs(as, options.crossOrigin),\n integrity =\n \"string\" === typeof options.integrity ? options.integrity : void 0,\n fetchPriority =\n \"string\" === typeof options.fetchPriority\n ? options.fetchPriority\n : void 0;\n \"style\" === as\n ? Internals.d.S(\n href,\n \"string\" === typeof options.precedence ? options.precedence : void 0,\n {\n crossOrigin: crossOrigin,\n integrity: integrity,\n fetchPriority: fetchPriority\n }\n )\n : \"script\" === as &&\n Internals.d.X(href, {\n crossOrigin: crossOrigin,\n integrity: integrity,\n fetchPriority: fetchPriority,\n nonce: \"string\" === typeof options.nonce ? options.nonce : void 0\n });\n }\n};\nexports.preinitModule = function (href, options) {\n if (\"string\" === typeof href)\n if (\"object\" === typeof options && null !== options) {\n if (null == options.as || \"script\" === options.as) {\n var crossOrigin = getCrossOriginStringAs(\n options.as,\n options.crossOrigin\n );\n Internals.d.M(href, {\n crossOrigin: crossOrigin,\n integrity:\n \"string\" === typeof options.integrity ? options.integrity : void 0,\n nonce: \"string\" === typeof options.nonce ? options.nonce : void 0\n });\n }\n } else null == options && Internals.d.M(href);\n};\nexports.preload = function (href, options) {\n if (\n \"string\" === typeof href &&\n \"object\" === typeof options &&\n null !== options &&\n \"string\" === typeof options.as\n ) {\n var as = options.as,\n crossOrigin = getCrossOriginStringAs(as, options.crossOrigin);\n Internals.d.L(href, as, {\n crossOrigin: crossOrigin,\n integrity:\n \"string\" === typeof options.integrity ? options.integrity : void 0,\n nonce: \"string\" === typeof options.nonce ? options.nonce : void 0,\n type: \"string\" === typeof options.type ? options.type : void 0,\n fetchPriority:\n \"string\" === typeof options.fetchPriority\n ? options.fetchPriority\n : void 0,\n referrerPolicy:\n \"string\" === typeof options.referrerPolicy\n ? options.referrerPolicy\n : void 0,\n imageSrcSet:\n \"string\" === typeof options.imageSrcSet ? options.imageSrcSet : void 0,\n imageSizes:\n \"string\" === typeof options.imageSizes ? options.imageSizes : void 0,\n media: \"string\" === typeof options.media ? options.media : void 0\n });\n }\n};\nexports.preloadModule = function (href, options) {\n if (\"string\" === typeof href)\n if (options) {\n var crossOrigin = getCrossOriginStringAs(options.as, options.crossOrigin);\n Internals.d.m(href, {\n as:\n \"string\" === typeof options.as && \"script\" !== options.as\n ? options.as\n : void 0,\n crossOrigin: crossOrigin,\n integrity:\n \"string\" === typeof options.integrity ? options.integrity : void 0\n });\n } else Internals.d.m(href);\n};\nexports.requestFormReset = function (form) {\n Internals.d.r(form);\n};\nexports.unstable_batchedUpdates = function (fn, a) {\n return fn(a);\n};\nexports.useFormState = function (action, initialState, permalink) {\n return ReactSharedInternals.H.useFormState(action, initialState, permalink);\n};\nexports.useFormStatus = function () {\n return ReactSharedInternals.H.useHostTransitionStatus();\n};\nexports.version = \"19.2.6\";\n","'use strict';\n\nfunction checkDCE() {\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n if (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n ) {\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n // This branch is unreachable because this function is only called\n // in production, but the condition is true only in development.\n // Therefore if the branch is still here, dead code elimination wasn't\n // properly applied.\n // Don't change the message. React DevTools relies on it. Also make sure\n // this message doesn't occur elsewhere in this function, or it will cause\n // a false positive.\n throw new Error('^_^');\n }\n try {\n // Verify that the code above has been dead code eliminated (DCE'd).\n __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n } catch (err) {\n // DevTools shouldn't crash React, no matter what.\n // We should still report in case we break this code.\n console.error(err);\n }\n}\n\nif (process.env.NODE_ENV === 'production') {\n // DCE check should happen before ReactDOM bundle executes so that\n // DevTools can report bad minification during injection.\n checkDCE();\n module.exports = require('./cjs/react-dom.production.js');\n} else {\n module.exports = require('./cjs/react-dom.development.js');\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"react-dom-CzfKBOnw.js","names":[],"sources":["../../dashboard/node_modules/react-dom/cjs/react-dom.production.js","../../dashboard/node_modules/react-dom/index.js"],"sourcesContent":["/**\n * @license React\n * react-dom.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\");\nfunction formatProdErrorMessage(code) {\n var url = \"https://react.dev/errors/\" + code;\n if (1 < arguments.length) {\n url += \"?args[]=\" + encodeURIComponent(arguments[1]);\n for (var i = 2; i < arguments.length; i++)\n url += \"&args[]=\" + encodeURIComponent(arguments[i]);\n }\n return (\n \"Minified React error #\" +\n code +\n \"; visit \" +\n url +\n \" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"\n );\n}\nfunction noop() {}\nvar Internals = {\n d: {\n f: noop,\n r: function () {\n throw Error(formatProdErrorMessage(522));\n },\n D: noop,\n C: noop,\n L: noop,\n m: noop,\n X: noop,\n S: noop,\n M: noop\n },\n p: 0,\n findDOMNode: null\n },\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\");\nfunction createPortal$1(children, containerInfo, implementation) {\n var key =\n 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : null;\n return {\n $$typeof: REACT_PORTAL_TYPE,\n key: null == key ? null : \"\" + key,\n children: children,\n containerInfo: containerInfo,\n implementation: implementation\n };\n}\nvar ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;\nfunction getCrossOriginStringAs(as, input) {\n if (\"font\" === as) return \"\";\n if (\"string\" === typeof input)\n return \"use-credentials\" === input ? input : \"\";\n}\nexports.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE =\n Internals;\nexports.createPortal = function (children, container) {\n var key =\n 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : null;\n if (\n !container ||\n (1 !== container.nodeType &&\n 9 !== container.nodeType &&\n 11 !== container.nodeType)\n )\n throw Error(formatProdErrorMessage(299));\n return createPortal$1(children, container, null, key);\n};\nexports.flushSync = function (fn) {\n var previousTransition = ReactSharedInternals.T,\n previousUpdatePriority = Internals.p;\n try {\n if (((ReactSharedInternals.T = null), (Internals.p = 2), fn)) return fn();\n } finally {\n (ReactSharedInternals.T = previousTransition),\n (Internals.p = previousUpdatePriority),\n Internals.d.f();\n }\n};\nexports.preconnect = function (href, options) {\n \"string\" === typeof href &&\n (options\n ? ((options = options.crossOrigin),\n (options =\n \"string\" === typeof options\n ? \"use-credentials\" === options\n ? options\n : \"\"\n : void 0))\n : (options = null),\n Internals.d.C(href, options));\n};\nexports.prefetchDNS = function (href) {\n \"string\" === typeof href && Internals.d.D(href);\n};\nexports.preinit = function (href, options) {\n if (\"string\" === typeof href && options && \"string\" === typeof options.as) {\n var as = options.as,\n crossOrigin = getCrossOriginStringAs(as, options.crossOrigin),\n integrity =\n \"string\" === typeof options.integrity ? options.integrity : void 0,\n fetchPriority =\n \"string\" === typeof options.fetchPriority\n ? options.fetchPriority\n : void 0;\n \"style\" === as\n ? Internals.d.S(\n href,\n \"string\" === typeof options.precedence ? options.precedence : void 0,\n {\n crossOrigin: crossOrigin,\n integrity: integrity,\n fetchPriority: fetchPriority\n }\n )\n : \"script\" === as &&\n Internals.d.X(href, {\n crossOrigin: crossOrigin,\n integrity: integrity,\n fetchPriority: fetchPriority,\n nonce: \"string\" === typeof options.nonce ? options.nonce : void 0\n });\n }\n};\nexports.preinitModule = function (href, options) {\n if (\"string\" === typeof href)\n if (\"object\" === typeof options && null !== options) {\n if (null == options.as || \"script\" === options.as) {\n var crossOrigin = getCrossOriginStringAs(\n options.as,\n options.crossOrigin\n );\n Internals.d.M(href, {\n crossOrigin: crossOrigin,\n integrity:\n \"string\" === typeof options.integrity ? options.integrity : void 0,\n nonce: \"string\" === typeof options.nonce ? options.nonce : void 0\n });\n }\n } else null == options && Internals.d.M(href);\n};\nexports.preload = function (href, options) {\n if (\n \"string\" === typeof href &&\n \"object\" === typeof options &&\n null !== options &&\n \"string\" === typeof options.as\n ) {\n var as = options.as,\n crossOrigin = getCrossOriginStringAs(as, options.crossOrigin);\n Internals.d.L(href, as, {\n crossOrigin: crossOrigin,\n integrity:\n \"string\" === typeof options.integrity ? options.integrity : void 0,\n nonce: \"string\" === typeof options.nonce ? options.nonce : void 0,\n type: \"string\" === typeof options.type ? options.type : void 0,\n fetchPriority:\n \"string\" === typeof options.fetchPriority\n ? options.fetchPriority\n : void 0,\n referrerPolicy:\n \"string\" === typeof options.referrerPolicy\n ? options.referrerPolicy\n : void 0,\n imageSrcSet:\n \"string\" === typeof options.imageSrcSet ? options.imageSrcSet : void 0,\n imageSizes:\n \"string\" === typeof options.imageSizes ? options.imageSizes : void 0,\n media: \"string\" === typeof options.media ? options.media : void 0\n });\n }\n};\nexports.preloadModule = function (href, options) {\n if (\"string\" === typeof href)\n if (options) {\n var crossOrigin = getCrossOriginStringAs(options.as, options.crossOrigin);\n Internals.d.m(href, {\n as:\n \"string\" === typeof options.as && \"script\" !== options.as\n ? options.as\n : void 0,\n crossOrigin: crossOrigin,\n integrity:\n \"string\" === typeof options.integrity ? options.integrity : void 0\n });\n } else Internals.d.m(href);\n};\nexports.requestFormReset = function (form) {\n Internals.d.r(form);\n};\nexports.unstable_batchedUpdates = function (fn, a) {\n return fn(a);\n};\nexports.useFormState = function (action, initialState, permalink) {\n return ReactSharedInternals.H.useFormState(action, initialState, permalink);\n};\nexports.useFormStatus = function () {\n return ReactSharedInternals.H.useHostTransitionStatus();\n};\nexports.version = \"19.2.6\";\n","'use strict';\n\nfunction checkDCE() {\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n if (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n ) {\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n // This branch is unreachable because this function is only called\n // in production, but the condition is true only in development.\n // Therefore if the branch is still here, dead code elimination wasn't\n // properly applied.\n // Don't change the message. React DevTools relies on it. Also make sure\n // this message doesn't occur elsewhere in this function, or it will cause\n // a false positive.\n throw new Error('^_^');\n }\n try {\n // Verify that the code above has been dead code eliminated (DCE'd).\n __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n } catch (err) {\n // DevTools shouldn't crash React, no matter what.\n // We should still report in case we break this code.\n console.error(err);\n }\n}\n\nif (process.env.NODE_ENV === 'production') {\n // DCE check should happen before ReactDOM bundle executes so that\n // DevTools can report bad minification during injection.\n checkDCE();\n module.exports = require('./cjs/react-dom.production.js');\n} else {\n module.exports = require('./cjs/react-dom.development.js');\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{r as e}from"./chunk-CilyBKbf.js";import{A as t,An as n,I as r,O as i,S as a,Vn as o,kn as s,m as c,pt as l}from"./lucide-react-CD8Xl2U3.js";import{t as u}from"./badge-t8zAwHW9.js";import{t as d}from"./button-DDA5P2YQ.js";import{t as f}from"./input-BW9UD3FM.js";import{t as p}from"./copy-button-CE8e2c-F.js";import{r as m}from"./index-BL8r94_U.js";import{i as h,n as g,r as _,t as v}from"./card-CggxP1h9.js";var y=e(o(),1),b=s(),x=[`admin:*`,`token:read`,`token:write`,`agent:read`,`agent:write`,`message:read`,`message:send`,`task:read`,`task:write`,`command:read`,`command:write`,`memory:read`,`memory:write`,`memory:admin`,`mcp:use`,`terminal:attach`,`logs:read`,`integration:read`,`integration:write`,`channel:read`,`channel:write`,`stats:read`,`health:read`,`events:read`],S={agents:``,policies:``,targets:``,channels:``,orchestrators:``,cwdPrefixes:``,memoryScopes:``,spawnRequestIds:``,terminalAttach:!1,logsRead:!1},C={id:``,name:``,description:``,role:`provider`,scope:[`agent:read`,`message:read`,`message:send`],ttlSeconds:`86400`,constraints:{...S}};function w(){let[e,o]=(0,y.useState)([]),[s,w]=(0,y.useState)([]),[k,j]=(0,y.useState)(``),[M,F]=(0,y.useState)(C),[I,L]=(0,y.useState)(``),[R,z]=(0,y.useState)(``),[B,V]=(0,y.useState)({...S}),[H,U]=(0,y.useState)(``),[W,G]=(0,y.useState)(``),[K,q]=(0,y.useState)(`profiles`),J=(0,y.useMemo)(()=>e.find(e=>e.id===k),[e,k]);(0,y.useEffect)(()=>{Y()},[]);async function Y(){let[e,t]=await Promise.all([n(`GET`,`/token-profiles`),n(`GET`,`/tokens`)]);o(e),w(t),!k&&e[0]&&(j(e[0].id),F(D(e[0])),L(e[0].id))}function X(e){j(e.id),F(D(e)),U(``)}function Z(){j(``),F({...C,constraints:{...S}}),G(``)}async function Q(){let e=O(M),t=k?await n(`PATCH`,`/token-profiles/${encodeURIComponent(k)}`,e):await n(`POST`,`/token-profiles`,e);await Y(),j(t.id),F(D(t)),L(t.id),G(`${t.name} saved`)}async function $(e){await n(`DELETE`,`/token-profiles/${encodeURIComponent(e.id)}`),Z(),await Y()}async function ee(){let t=e.find(e=>e.id===I);U((await n(`POST`,`/tokens`,{profileId:I,sub:R||t?.role||`component`,constraints:A(B),createdBy:`dashboard`})).token),z(``),V({...S}),await Y()}async function te(e){await n(`POST`,`/tokens/${encodeURIComponent(e.jti)}/revoke`),await Y()}return(0,b.jsxs)(`div`,{className:`space-y-4`,children:[(0,b.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`h1`,{className:`text-lg font-semibold`,children:`Security`}),(0,b.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Token profiles and scoped component tokens`})]}),(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsxs)(`div`,{className:`inline-flex rounded-md border border-border overflow-hidden`,children:[(0,b.jsxs)(`button`,{type:`button`,onClick:()=>q(`profiles`),className:`flex items-center gap-1.5 px-3 py-1.5 text-sm transition-colors ${K===`profiles`?`bg-primary/15 text-primary`:`text-muted-foreground hover:bg-accent`}`,children:[(0,b.jsx)(a,{className:`h-3.5 w-3.5`}),`Profiles`]}),(0,b.jsxs)(`button`,{type:`button`,onClick:()=>q(`tokens`),className:`flex items-center gap-1.5 px-3 py-1.5 text-sm border-l border-border transition-colors ${K===`tokens`?`bg-primary/15 text-primary`:`text-muted-foreground hover:bg-accent`}`,children:[(0,b.jsx)(l,{className:`h-3.5 w-3.5`}),`Tokens`]})]}),(0,b.jsxs)(d,{variant:`outline`,onClick:()=>void Y(),children:[(0,b.jsx)(t,{className:`h-4 w-4`}),`Refresh`]}),K===`profiles`&&(0,b.jsxs)(d,{onClick:Z,children:[(0,b.jsx)(r,{className:`h-4 w-4`}),`New profile`]})]})]}),K===`profiles`&&(0,b.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[340px_minmax(0,1fr)]`,children:[(0,b.jsxs)(v,{children:[(0,b.jsx)(_,{children:(0,b.jsxs)(h,{className:`flex items-center gap-2 text-sm`,children:[(0,b.jsx)(a,{className:`h-4 w-4`}),`Profiles`]})}),(0,b.jsx)(g,{className:`space-y-2`,children:e.map(e=>(0,b.jsxs)(`button`,{type:`button`,onClick:()=>X(e),className:`w-full rounded-md border px-3 py-2 text-left transition-colors ${e.id===k?`border-primary bg-primary/10`:`border-border hover:bg-accent`}`,children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-sm font-medium`,children:e.name}),e.builtIn&&(0,b.jsx)(u,{variant:`secondary`,className:`text-[10px]`,children:`built-in`})]}),(0,b.jsxs)(`div`,{className:`mt-1 flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,b.jsx)(`span`,{children:e.role}),(0,b.jsxs)(`span`,{children:[e.scope.length,` scopes`]}),e.ttlSeconds&&(0,b.jsx)(`span`,{children:P(e.ttlSeconds)})]})]},e.id))})]}),(0,b.jsxs)(v,{children:[(0,b.jsx)(_,{children:(0,b.jsx)(h,{className:`text-sm`,children:J?J.name:`New profile`})}),(0,b.jsxs)(g,{className:`space-y-4`,children:[(0,b.jsxs)(`div`,{className:`grid gap-3 md:grid-cols-2`,children:[(0,b.jsx)(T,{label:`Profile id`,children:(0,b.jsx)(f,{disabled:!!k,value:M.id,onChange:e=>F({...M,id:e.target.value})})}),(0,b.jsx)(T,{label:`Name`,children:(0,b.jsx)(f,{value:M.name,onChange:e=>F({...M,name:e.target.value})})}),(0,b.jsx)(T,{label:`Role`,children:(0,b.jsx)(f,{value:M.role,onChange:e=>F({...M,role:e.target.value})})}),(0,b.jsx)(T,{label:`TTL seconds`,children:(0,b.jsx)(f,{inputMode:`numeric`,value:M.ttlSeconds,onChange:e=>F({...M,ttlSeconds:e.target.value})})})]}),(0,b.jsx)(T,{label:`Description`,children:(0,b.jsx)(m,{rows:2,value:M.description,onChange:e=>F({...M,description:e.target.value})})}),(0,b.jsxs)(`div`,{className:`space-y-2`,children:[(0,b.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:`Scopes`}),(0,b.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:x.map(e=>(0,b.jsx)(`button`,{type:`button`,onClick:()=>F({...M,scope:N(M.scope,e)}),className:`rounded border px-2 py-1 text-xs ${M.scope.includes(e)?`border-primary/50 bg-primary/15 text-primary`:`border-border text-muted-foreground hover:bg-accent`}`,children:e},e))})]}),(0,b.jsx)(E,{value:M.constraints,onChange:e=>F({...M,constraints:e})}),(0,b.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,b.jsxs)(d,{disabled:J?.builtIn,onClick:()=>void Q(),children:[(0,b.jsx)(i,{className:`h-4 w-4`}),`Save`]}),J&&!J.builtIn&&(0,b.jsxs)(d,{variant:`destructive`,onClick:()=>void $(J),children:[(0,b.jsx)(c,{className:`h-4 w-4`}),`Delete`]}),J?.builtIn&&(0,b.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Built-in profiles are managed by Relay.`})]})]})]})]}),K===`tokens`&&(0,b.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[380px_minmax(0,1fr)]`,children:[(0,b.jsxs)(v,{children:[(0,b.jsx)(_,{children:(0,b.jsxs)(h,{className:`flex items-center gap-2 text-sm`,children:[(0,b.jsx)(l,{className:`h-4 w-4`}),`Issue token`]})}),(0,b.jsxs)(g,{className:`space-y-3`,children:[(0,b.jsx)(T,{label:`Profile`,children:(0,b.jsx)(`select`,{className:`h-9 w-full rounded-md border border-input bg-background px-3 text-sm`,value:I,onChange:e=>L(e.target.value),children:e.map(e=>(0,b.jsx)(`option`,{value:e.id,children:e.name},e.id))})}),(0,b.jsx)(T,{label:`Subject`,children:(0,b.jsx)(f,{value:R,onChange:e=>z(e.target.value),placeholder:`component id`})}),(0,b.jsx)(E,{compact:!0,value:B,onChange:V}),(0,b.jsxs)(d,{className:`w-full`,disabled:!I,onClick:()=>void ee(),children:[(0,b.jsx)(l,{className:`h-4 w-4`}),`Issue`]}),H&&(0,b.jsxs)(`div`,{className:`rounded-md border border-border bg-muted/30 p-2`,children:[(0,b.jsxs)(`div`,{className:`mb-1 flex items-center justify-between gap-2`,children:[(0,b.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`New token`}),(0,b.jsx)(p,{value:H,label:`Copy token`,size:`sm`,variant:`ghost`,onCopied:()=>G(`Copied`)})]}),(0,b.jsx)(`code`,{className:`block max-h-24 overflow-auto break-all text-xs`,children:H})]}),W&&(0,b.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:W})]})]}),(0,b.jsxs)(v,{children:[(0,b.jsx)(_,{children:(0,b.jsx)(h,{className:`text-sm`,children:`Issued tokens`})}),(0,b.jsxs)(g,{className:`space-y-2`,children:[s.length===0&&(0,b.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No tokens issued yet`}),s.slice(0,20).map(e=>(0,b.jsxs)(`div`,{className:`rounded-md border border-border p-2`,children:[(0,b.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,b.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,b.jsx)(`div`,{className:`truncate text-sm font-medium`,children:e.sub}),(0,b.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[e.role,` `,e.profileId?`· ${e.profileId}`:``]})]}),e.revokedAt?(0,b.jsx)(u,{variant:`destructive`,children:`revoked`}):(0,b.jsx)(d,{variant:`ghost`,size:`sm`,onClick:()=>void te(e),children:(0,b.jsx)(c,{className:`h-3.5 w-3.5`})})]}),(0,b.jsxs)(`div`,{className:`mt-1 flex flex-wrap gap-1`,children:[e.scope.slice(0,4).map(e=>(0,b.jsx)(u,{variant:`outline`,className:`text-[10px]`,children:e},e)),e.scope.length>4&&(0,b.jsxs)(u,{variant:`secondary`,className:`text-[10px]`,children:[`+`,e.scope.length-4]})]})]},e.jti))]})]})]})]})}function T({label:e,children:t}){return(0,b.jsxs)(`label`,{className:`block space-y-1.5 text-sm`,children:[(0,b.jsx)(`span`,{className:`text-muted-foreground`,children:e}),t]})}function E({value:e,onChange:t,compact:n=!1}){return(0,b.jsxs)(`div`,{className:`space-y-3`,children:[!n&&(0,b.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:`Constraints`}),(0,b.jsx)(`div`,{className:`grid gap-3 ${n?``:`md:grid-cols-2`}`,children:[[`agents`,`Agents`],[`policies`,`Policies`],[`targets`,`Targets`],[`channels`,`Channels`],[`orchestrators`,`Orchestrators`],[`cwdPrefixes`,`CWD prefixes`],[`memoryScopes`,`Memory scopes`],[`spawnRequestIds`,`Spawn requests`]].map(([r,i])=>(0,b.jsx)(T,{label:i,children:(0,b.jsx)(m,{rows:n?2:3,value:String(e[r]||``),onChange:n=>t({...e,[r]:n.target.value}),placeholder:`one per line`})},r))}),(0,b.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,b.jsxs)(`label`,{className:`flex items-center gap-2 rounded border border-border px-2 py-1 text-xs`,children:[(0,b.jsx)(`input`,{type:`checkbox`,checked:e.terminalAttach,onChange:n=>t({...e,terminalAttach:n.target.checked})}),`Terminal attach`]}),(0,b.jsxs)(`label`,{className:`flex items-center gap-2 rounded border border-border px-2 py-1 text-xs`,children:[(0,b.jsx)(`input`,{type:`checkbox`,checked:e.logsRead,onChange:n=>t({...e,logsRead:n.target.checked})}),`Log read`]})]})]})}function D(e){return{id:e.id,name:e.name,description:e.description||``,role:e.role,scope:e.scope,ttlSeconds:e.ttlSeconds?String(e.ttlSeconds):``,constraints:k(e.constraints)}}function O(e){return{id:e.id||void 0,name:e.name,description:e.description||void 0,role:e.role,scope:e.scope,ttlSeconds:e.ttlSeconds?Number(e.ttlSeconds):void 0,constraints:A(e.constraints)}}function k(e){return{agents:M(e?.agents),policies:M(e?.policies),targets:M(e?.targets),channels:M(e?.channels),orchestrators:M(e?.orchestrators),cwdPrefixes:M(e?.cwdPrefixes),memoryScopes:M(e?.memoryScopes),spawnRequestIds:M(e?.spawnRequestIds),terminalAttach:e?.terminalAttach===!0,logsRead:e?.logsRead===!0}}function A(e){let t={};for(let n of[`agents`,`policies`,`targets`,`channels`,`orchestrators`,`cwdPrefixes`,`memoryScopes`,`spawnRequestIds`]){let r=j(String(e[n]||``));r.length&&Object.assign(t,{[n]:r})}return e.terminalAttach&&(t.terminalAttach=!0),e.logsRead&&(t.logsRead=!0),Object.keys(t).length?t:void 0}function j(e){return e.split(/\r?\n|,/).map(e=>e.trim()).filter(Boolean)}function M(e){return(e??[]).join(`
|
|
1
|
+
import{r as e}from"./chunk-CilyBKbf.js";import{A as t,An as n,Hn as r,I as i,O as a,S as o,jn as s,m as c,pt as l}from"./lucide-react-DLQFnqNm.js";import{t as u}from"./badge-JVybSpzR.js";import{t as d}from"./button-BsMqBNJb.js";import{t as f}from"./input-dPzf0luy.js";import{t as p}from"./copy-button-B-XlL8nF.js";import{r as m}from"./index-DdB6SVZY.js";import{i as h,n as g,r as _,t as v}from"./card-I8w4U656.js";var y=e(r(),1),b=n(),x=[`admin:*`,`token:read`,`token:write`,`agent:read`,`agent:write`,`message:read`,`message:send`,`task:read`,`task:write`,`command:read`,`command:write`,`memory:read`,`memory:write`,`memory:admin`,`mcp:use`,`terminal:attach`,`logs:read`,`integration:read`,`integration:write`,`channel:read`,`channel:write`,`stats:read`,`health:read`,`events:read`],S={agents:``,policies:``,targets:``,channels:``,orchestrators:``,cwdPrefixes:``,memoryScopes:``,spawnRequestIds:``,terminalAttach:!1,logsRead:!1},C={id:``,name:``,description:``,role:`provider`,scope:[`agent:read`,`message:read`,`message:send`],ttlSeconds:`86400`,constraints:{...S}};function w(){let[e,n]=(0,y.useState)([]),[r,w]=(0,y.useState)([]),[k,j]=(0,y.useState)(``),[M,F]=(0,y.useState)(C),[I,L]=(0,y.useState)(``),[R,z]=(0,y.useState)(``),[B,V]=(0,y.useState)({...S}),[H,U]=(0,y.useState)(``),[W,G]=(0,y.useState)(``),[K,q]=(0,y.useState)(`profiles`),J=(0,y.useMemo)(()=>e.find(e=>e.id===k),[e,k]);(0,y.useEffect)(()=>{Y()},[]);async function Y(){let[e,t]=await Promise.all([s(`GET`,`/token-profiles`),s(`GET`,`/tokens`)]);n(e),w(t),!k&&e[0]&&(j(e[0].id),F(D(e[0])),L(e[0].id))}function X(e){j(e.id),F(D(e)),U(``)}function Z(){j(``),F({...C,constraints:{...S}}),G(``)}async function Q(){let e=O(M),t=k?await s(`PATCH`,`/token-profiles/${encodeURIComponent(k)}`,e):await s(`POST`,`/token-profiles`,e);await Y(),j(t.id),F(D(t)),L(t.id),G(`${t.name} saved`)}async function $(e){await s(`DELETE`,`/token-profiles/${encodeURIComponent(e.id)}`),Z(),await Y()}async function ee(){let t=e.find(e=>e.id===I);U((await s(`POST`,`/tokens`,{profileId:I,sub:R||t?.role||`component`,constraints:A(B),createdBy:`dashboard`})).token),z(``),V({...S}),await Y()}async function te(e){await s(`POST`,`/tokens/${encodeURIComponent(e.jti)}/revoke`),await Y()}return(0,b.jsxs)(`div`,{className:`space-y-4`,children:[(0,b.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`h1`,{className:`text-lg font-semibold`,children:`Security`}),(0,b.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Token profiles and scoped component tokens`})]}),(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsxs)(`div`,{className:`inline-flex rounded-md border border-border overflow-hidden`,children:[(0,b.jsxs)(`button`,{type:`button`,onClick:()=>q(`profiles`),className:`flex items-center gap-1.5 px-3 py-1.5 text-sm transition-colors ${K===`profiles`?`bg-primary/15 text-primary`:`text-muted-foreground hover:bg-accent`}`,children:[(0,b.jsx)(o,{className:`h-3.5 w-3.5`}),`Profiles`]}),(0,b.jsxs)(`button`,{type:`button`,onClick:()=>q(`tokens`),className:`flex items-center gap-1.5 px-3 py-1.5 text-sm border-l border-border transition-colors ${K===`tokens`?`bg-primary/15 text-primary`:`text-muted-foreground hover:bg-accent`}`,children:[(0,b.jsx)(l,{className:`h-3.5 w-3.5`}),`Tokens`]})]}),(0,b.jsxs)(d,{variant:`outline`,onClick:()=>void Y(),children:[(0,b.jsx)(t,{className:`h-4 w-4`}),`Refresh`]}),K===`profiles`&&(0,b.jsxs)(d,{onClick:Z,children:[(0,b.jsx)(i,{className:`h-4 w-4`}),`New profile`]})]})]}),K===`profiles`&&(0,b.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[340px_minmax(0,1fr)]`,children:[(0,b.jsxs)(v,{children:[(0,b.jsx)(_,{children:(0,b.jsxs)(h,{className:`flex items-center gap-2 text-sm`,children:[(0,b.jsx)(o,{className:`h-4 w-4`}),`Profiles`]})}),(0,b.jsx)(g,{className:`space-y-2`,children:e.map(e=>(0,b.jsxs)(`button`,{type:`button`,onClick:()=>X(e),className:`w-full rounded-md border px-3 py-2 text-left transition-colors ${e.id===k?`border-primary bg-primary/10`:`border-border hover:bg-accent`}`,children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-sm font-medium`,children:e.name}),e.builtIn&&(0,b.jsx)(u,{variant:`secondary`,className:`text-[10px]`,children:`built-in`})]}),(0,b.jsxs)(`div`,{className:`mt-1 flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,b.jsx)(`span`,{children:e.role}),(0,b.jsxs)(`span`,{children:[e.scope.length,` scopes`]}),e.ttlSeconds&&(0,b.jsx)(`span`,{children:P(e.ttlSeconds)})]})]},e.id))})]}),(0,b.jsxs)(v,{children:[(0,b.jsx)(_,{children:(0,b.jsx)(h,{className:`text-sm`,children:J?J.name:`New profile`})}),(0,b.jsxs)(g,{className:`space-y-4`,children:[(0,b.jsxs)(`div`,{className:`grid gap-3 md:grid-cols-2`,children:[(0,b.jsx)(T,{label:`Profile id`,children:(0,b.jsx)(f,{disabled:!!k,value:M.id,onChange:e=>F({...M,id:e.target.value})})}),(0,b.jsx)(T,{label:`Name`,children:(0,b.jsx)(f,{value:M.name,onChange:e=>F({...M,name:e.target.value})})}),(0,b.jsx)(T,{label:`Role`,children:(0,b.jsx)(f,{value:M.role,onChange:e=>F({...M,role:e.target.value})})}),(0,b.jsx)(T,{label:`TTL seconds`,children:(0,b.jsx)(f,{inputMode:`numeric`,value:M.ttlSeconds,onChange:e=>F({...M,ttlSeconds:e.target.value})})})]}),(0,b.jsx)(T,{label:`Description`,children:(0,b.jsx)(m,{rows:2,value:M.description,onChange:e=>F({...M,description:e.target.value})})}),(0,b.jsxs)(`div`,{className:`space-y-2`,children:[(0,b.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:`Scopes`}),(0,b.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:x.map(e=>(0,b.jsx)(`button`,{type:`button`,onClick:()=>F({...M,scope:N(M.scope,e)}),className:`rounded border px-2 py-1 text-xs ${M.scope.includes(e)?`border-primary/50 bg-primary/15 text-primary`:`border-border text-muted-foreground hover:bg-accent`}`,children:e},e))})]}),(0,b.jsx)(E,{value:M.constraints,onChange:e=>F({...M,constraints:e})}),(0,b.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,b.jsxs)(d,{disabled:J?.builtIn,onClick:()=>void Q(),children:[(0,b.jsx)(a,{className:`h-4 w-4`}),`Save`]}),J&&!J.builtIn&&(0,b.jsxs)(d,{variant:`destructive`,onClick:()=>void $(J),children:[(0,b.jsx)(c,{className:`h-4 w-4`}),`Delete`]}),J?.builtIn&&(0,b.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Built-in profiles are managed by Relay.`})]})]})]})]}),K===`tokens`&&(0,b.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[380px_minmax(0,1fr)]`,children:[(0,b.jsxs)(v,{children:[(0,b.jsx)(_,{children:(0,b.jsxs)(h,{className:`flex items-center gap-2 text-sm`,children:[(0,b.jsx)(l,{className:`h-4 w-4`}),`Issue token`]})}),(0,b.jsxs)(g,{className:`space-y-3`,children:[(0,b.jsx)(T,{label:`Profile`,children:(0,b.jsx)(`select`,{className:`h-9 w-full rounded-md border border-input bg-background px-3 text-sm`,value:I,onChange:e=>L(e.target.value),children:e.map(e=>(0,b.jsx)(`option`,{value:e.id,children:e.name},e.id))})}),(0,b.jsx)(T,{label:`Subject`,children:(0,b.jsx)(f,{value:R,onChange:e=>z(e.target.value),placeholder:`component id`})}),(0,b.jsx)(E,{compact:!0,value:B,onChange:V}),(0,b.jsxs)(d,{className:`w-full`,disabled:!I,onClick:()=>void ee(),children:[(0,b.jsx)(l,{className:`h-4 w-4`}),`Issue`]}),H&&(0,b.jsxs)(`div`,{className:`rounded-md border border-border bg-muted/30 p-2`,children:[(0,b.jsxs)(`div`,{className:`mb-1 flex items-center justify-between gap-2`,children:[(0,b.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`New token`}),(0,b.jsx)(p,{value:H,label:`Copy token`,size:`sm`,variant:`ghost`,onCopied:()=>G(`Copied`)})]}),(0,b.jsx)(`code`,{className:`block max-h-24 overflow-auto break-all text-xs`,children:H})]}),W&&(0,b.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:W})]})]}),(0,b.jsxs)(v,{children:[(0,b.jsx)(_,{children:(0,b.jsx)(h,{className:`text-sm`,children:`Issued tokens`})}),(0,b.jsxs)(g,{className:`space-y-2`,children:[r.length===0&&(0,b.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No tokens issued yet`}),r.slice(0,20).map(e=>(0,b.jsxs)(`div`,{className:`rounded-md border border-border p-2`,children:[(0,b.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,b.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,b.jsx)(`div`,{className:`truncate text-sm font-medium`,children:e.sub}),(0,b.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[e.role,` `,e.profileId?`· ${e.profileId}`:``]})]}),e.revokedAt?(0,b.jsx)(u,{variant:`destructive`,children:`revoked`}):(0,b.jsx)(d,{variant:`ghost`,size:`sm`,onClick:()=>void te(e),children:(0,b.jsx)(c,{className:`h-3.5 w-3.5`})})]}),(0,b.jsxs)(`div`,{className:`mt-1 flex flex-wrap gap-1`,children:[e.scope.slice(0,4).map(e=>(0,b.jsx)(u,{variant:`outline`,className:`text-[10px]`,children:e},e)),e.scope.length>4&&(0,b.jsxs)(u,{variant:`secondary`,className:`text-[10px]`,children:[`+`,e.scope.length-4]})]})]},e.jti))]})]})]})]})}function T({label:e,children:t}){return(0,b.jsxs)(`label`,{className:`block space-y-1.5 text-sm`,children:[(0,b.jsx)(`span`,{className:`text-muted-foreground`,children:e}),t]})}function E({value:e,onChange:t,compact:n=!1}){return(0,b.jsxs)(`div`,{className:`space-y-3`,children:[!n&&(0,b.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:`Constraints`}),(0,b.jsx)(`div`,{className:`grid gap-3 ${n?``:`md:grid-cols-2`}`,children:[[`agents`,`Agents`],[`policies`,`Policies`],[`targets`,`Targets`],[`channels`,`Channels`],[`orchestrators`,`Orchestrators`],[`cwdPrefixes`,`CWD prefixes`],[`memoryScopes`,`Memory scopes`],[`spawnRequestIds`,`Spawn requests`]].map(([r,i])=>(0,b.jsx)(T,{label:i,children:(0,b.jsx)(m,{rows:n?2:3,value:String(e[r]||``),onChange:n=>t({...e,[r]:n.target.value}),placeholder:`one per line`})},r))}),(0,b.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,b.jsxs)(`label`,{className:`flex items-center gap-2 rounded border border-border px-2 py-1 text-xs`,children:[(0,b.jsx)(`input`,{type:`checkbox`,checked:e.terminalAttach,onChange:n=>t({...e,terminalAttach:n.target.checked})}),`Terminal attach`]}),(0,b.jsxs)(`label`,{className:`flex items-center gap-2 rounded border border-border px-2 py-1 text-xs`,children:[(0,b.jsx)(`input`,{type:`checkbox`,checked:e.logsRead,onChange:n=>t({...e,logsRead:n.target.checked})}),`Log read`]})]})]})}function D(e){return{id:e.id,name:e.name,description:e.description||``,role:e.role,scope:e.scope,ttlSeconds:e.ttlSeconds?String(e.ttlSeconds):``,constraints:k(e.constraints)}}function O(e){return{id:e.id||void 0,name:e.name,description:e.description||void 0,role:e.role,scope:e.scope,ttlSeconds:e.ttlSeconds?Number(e.ttlSeconds):void 0,constraints:A(e.constraints)}}function k(e){return{agents:M(e?.agents),policies:M(e?.policies),targets:M(e?.targets),channels:M(e?.channels),orchestrators:M(e?.orchestrators),cwdPrefixes:M(e?.cwdPrefixes),memoryScopes:M(e?.memoryScopes),spawnRequestIds:M(e?.spawnRequestIds),terminalAttach:e?.terminalAttach===!0,logsRead:e?.logsRead===!0}}function A(e){let t={};for(let n of[`agents`,`policies`,`targets`,`channels`,`orchestrators`,`cwdPrefixes`,`memoryScopes`,`spawnRequestIds`]){let r=j(String(e[n]||``));r.length&&Object.assign(t,{[n]:r})}return e.terminalAttach&&(t.terminalAttach=!0),e.logsRead&&(t.logsRead=!0),Object.keys(t).length?t:void 0}function j(e){return e.split(/\r?\n|,/).map(e=>e.trim()).filter(Boolean)}function M(e){return(e??[]).join(`
|
|
2
2
|
`)}function N(e,t){return e.includes(t)?e.filter(e=>e!==t):[...e,t]}function P(e){return e%86400==0?`${e/86400}d`:e%3600==0?`${e/3600}h`:`${e}s`}export{w as SecurityView};
|
|
3
|
-
//# sourceMappingURL=security-
|
|
3
|
+
//# sourceMappingURL=security-BZYHZ4CE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security-CA03sHyP.js","names":[],"sources":["../../dashboard/src/components/views/security.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react'\nimport { api } from '@/lib/api'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Input } from '@/components/ui/input'\nimport { Textarea } from '@/components/ui/textarea'\nimport { KeyRound, Plus, Save, Shield, Trash2, RotateCcw } from 'lucide-react'\nimport { CopyButton } from '@/components/shared/copy-button'\nimport type { TokenConstraints, TokenProfile, TokenRecord } from '@/types'\n\nconst scopeOptions = [\n 'admin:*',\n 'token:read',\n 'token:write',\n 'agent:read',\n 'agent:write',\n 'message:read',\n 'message:send',\n 'task:read',\n 'task:write',\n 'command:read',\n 'command:write',\n 'memory:read',\n 'memory:write',\n 'memory:admin',\n 'mcp:use',\n 'terminal:attach',\n 'logs:read',\n 'integration:read',\n 'integration:write',\n 'channel:read',\n 'channel:write',\n 'stats:read',\n 'health:read',\n 'events:read',\n]\n\ninterface ProfileForm {\n id: string\n name: string\n description: string\n role: string\n scope: string[]\n ttlSeconds: string\n constraints: ConstraintForm\n}\n\ninterface ConstraintForm {\n agents: string\n policies: string\n targets: string\n channels: string\n orchestrators: string\n cwdPrefixes: string\n memoryScopes: string\n spawnRequestIds: string\n terminalAttach: boolean\n logsRead: boolean\n}\n\nconst emptyConstraints: ConstraintForm = {\n agents: '',\n policies: '',\n targets: '',\n channels: '',\n orchestrators: '',\n cwdPrefixes: '',\n memoryScopes: '',\n spawnRequestIds: '',\n terminalAttach: false,\n logsRead: false,\n}\n\nconst emptyProfile: ProfileForm = {\n id: '',\n name: '',\n description: '',\n role: 'provider',\n scope: ['agent:read', 'message:read', 'message:send'],\n ttlSeconds: '86400',\n constraints: { ...emptyConstraints },\n}\n\nexport function SecurityView() {\n const [profiles, setProfiles] = useState<TokenProfile[]>([])\n const [tokens, setTokens] = useState<TokenRecord[]>([])\n const [selectedId, setSelectedId] = useState('')\n const [form, setForm] = useState<ProfileForm>(emptyProfile)\n const [issueProfileId, setIssueProfileId] = useState('')\n const [issueSub, setIssueSub] = useState('')\n const [issueConstraints, setIssueConstraints] = useState<ConstraintForm>({ ...emptyConstraints })\n const [issuedToken, setIssuedToken] = useState('')\n const [status, setStatus] = useState('')\n const [tab, setTab] = useState<'profiles' | 'tokens'>('profiles')\n\n const selected = useMemo(() => profiles.find((profile) => profile.id === selectedId), [profiles, selectedId])\n\n useEffect(() => { void refresh() }, [])\n\n async function refresh() {\n const [nextProfiles, nextTokens] = await Promise.all([\n api<TokenProfile[]>('GET', '/token-profiles'),\n api<TokenRecord[]>('GET', '/tokens'),\n ])\n setProfiles(nextProfiles)\n setTokens(nextTokens)\n if (!selectedId && nextProfiles[0]) {\n setSelectedId(nextProfiles[0].id)\n setForm(profileToForm(nextProfiles[0]))\n setIssueProfileId(nextProfiles[0].id)\n }\n }\n\n function selectProfile(profile: TokenProfile) {\n setSelectedId(profile.id)\n setForm(profileToForm(profile))\n setIssuedToken('')\n }\n\n function newProfile() {\n setSelectedId('')\n setForm({ ...emptyProfile, constraints: { ...emptyConstraints } })\n setStatus('')\n }\n\n async function saveProfile() {\n const body = formToProfileBody(form)\n const saved = selectedId\n ? await api<TokenProfile>('PATCH', `/token-profiles/${encodeURIComponent(selectedId)}`, body)\n : await api<TokenProfile>('POST', '/token-profiles', body)\n await refresh()\n setSelectedId(saved.id)\n setForm(profileToForm(saved))\n setIssueProfileId(saved.id)\n setStatus(`${saved.name} saved`)\n }\n\n async function deleteProfile(profile: TokenProfile) {\n await api('DELETE', `/token-profiles/${encodeURIComponent(profile.id)}`)\n newProfile()\n await refresh()\n }\n\n async function issueToken() {\n const profile = profiles.find((item) => item.id === issueProfileId)\n const result = await api<{ token: string; record: TokenRecord }>('POST', '/tokens', {\n profileId: issueProfileId,\n sub: issueSub || profile?.role || 'component',\n constraints: constraintsFromForm(issueConstraints),\n createdBy: 'dashboard',\n })\n setIssuedToken(result.token)\n setIssueSub('')\n setIssueConstraints({ ...emptyConstraints })\n await refresh()\n }\n\n async function revokeToken(token: TokenRecord) {\n await api('POST', `/tokens/${encodeURIComponent(token.jti)}/revoke`)\n await refresh()\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <h1 className=\"text-lg font-semibold\">Security</h1>\n <p className=\"text-sm text-muted-foreground\">Token profiles and scoped component tokens</p>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"inline-flex rounded-md border border-border overflow-hidden\">\n <button type=\"button\" onClick={() => setTab('profiles')} className={`flex items-center gap-1.5 px-3 py-1.5 text-sm transition-colors ${tab === 'profiles' ? 'bg-primary/15 text-primary' : 'text-muted-foreground hover:bg-accent'}`}>\n <Shield className=\"h-3.5 w-3.5\" />Profiles\n </button>\n <button type=\"button\" onClick={() => setTab('tokens')} className={`flex items-center gap-1.5 px-3 py-1.5 text-sm border-l border-border transition-colors ${tab === 'tokens' ? 'bg-primary/15 text-primary' : 'text-muted-foreground hover:bg-accent'}`}>\n <KeyRound className=\"h-3.5 w-3.5\" />Tokens\n </button>\n </div>\n <Button variant=\"outline\" onClick={() => void refresh()}><RotateCcw className=\"h-4 w-4\" />Refresh</Button>\n {tab === 'profiles' && <Button onClick={newProfile}><Plus className=\"h-4 w-4\" />New profile</Button>}\n </div>\n </div>\n\n {tab === 'profiles' && (\n <div className=\"grid gap-4 xl:grid-cols-[340px_minmax(0,1fr)]\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-sm\"><Shield className=\"h-4 w-4\" />Profiles</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {profiles.map((profile) => (\n <button\n key={profile.id}\n type=\"button\"\n onClick={() => selectProfile(profile)}\n className={`w-full rounded-md border px-3 py-2 text-left transition-colors ${profile.id === selectedId ? 'border-primary bg-primary/10' : 'border-border hover:bg-accent'}`}\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium\">{profile.name}</span>\n {profile.builtIn && <Badge variant=\"secondary\" className=\"text-[10px]\">built-in</Badge>}\n </div>\n <div className=\"mt-1 flex items-center gap-2 text-xs text-muted-foreground\">\n <span>{profile.role}</span>\n <span>{profile.scope.length} scopes</span>\n {profile.ttlSeconds && <span>{formatTtl(profile.ttlSeconds)}</span>}\n </div>\n </button>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">{selected ? selected.name : 'New profile'}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-3 md:grid-cols-2\">\n <Field label=\"Profile id\"><Input disabled={Boolean(selectedId)} value={form.id} onChange={(e) => setForm({ ...form, id: e.target.value })} /></Field>\n <Field label=\"Name\"><Input value={form.name} onChange={(e) => setForm({ ...form, name: e.target.value })} /></Field>\n <Field label=\"Role\"><Input value={form.role} onChange={(e) => setForm({ ...form, role: e.target.value })} /></Field>\n <Field label=\"TTL seconds\"><Input inputMode=\"numeric\" value={form.ttlSeconds} onChange={(e) => setForm({ ...form, ttlSeconds: e.target.value })} /></Field>\n </div>\n <Field label=\"Description\"><Textarea rows={2} value={form.description} onChange={(e) => setForm({ ...form, description: e.target.value })} /></Field>\n\n <div className=\"space-y-2\">\n <div className=\"text-sm text-muted-foreground\">Scopes</div>\n <div className=\"flex flex-wrap gap-1.5\">\n {scopeOptions.map((scope) => {\n const active = form.scope.includes(scope)\n return (\n <button\n key={scope}\n type=\"button\"\n onClick={() => setForm({ ...form, scope: toggle(form.scope, scope) })}\n className={`rounded border px-2 py-1 text-xs ${active ? 'border-primary/50 bg-primary/15 text-primary' : 'border-border text-muted-foreground hover:bg-accent'}`}\n >\n {scope}\n </button>\n )\n })}\n </div>\n </div>\n\n <ConstraintEditor value={form.constraints} onChange={(constraints) => setForm({ ...form, constraints })} />\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button disabled={selected?.builtIn} onClick={() => void saveProfile()}><Save className=\"h-4 w-4\" />Save</Button>\n {selected && !selected.builtIn && (\n <Button variant=\"destructive\" onClick={() => void deleteProfile(selected)}><Trash2 className=\"h-4 w-4\" />Delete</Button>\n )}\n {selected?.builtIn && <span className=\"text-xs text-muted-foreground\">Built-in profiles are managed by Relay.</span>}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {tab === 'tokens' && (\n <div className=\"grid gap-4 xl:grid-cols-[380px_minmax(0,1fr)]\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-sm\"><KeyRound className=\"h-4 w-4\" />Issue token</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <Field label=\"Profile\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={issueProfileId} onChange={(e) => setIssueProfileId(e.target.value)}>\n {profiles.map((profile) => <option key={profile.id} value={profile.id}>{profile.name}</option>)}\n </select>\n </Field>\n <Field label=\"Subject\"><Input value={issueSub} onChange={(e) => setIssueSub(e.target.value)} placeholder=\"component id\" /></Field>\n <ConstraintEditor compact value={issueConstraints} onChange={setIssueConstraints} />\n <Button className=\"w-full\" disabled={!issueProfileId} onClick={() => void issueToken()}><KeyRound className=\"h-4 w-4\" />Issue</Button>\n {issuedToken && (\n <div className=\"rounded-md border border-border bg-muted/30 p-2\">\n <div className=\"mb-1 flex items-center justify-between gap-2\">\n <span className=\"text-xs text-muted-foreground\">New token</span>\n <CopyButton value={issuedToken} label=\"Copy token\" size=\"sm\" variant=\"ghost\" onCopied={() => setStatus('Copied')} />\n </div>\n <code className=\"block max-h-24 overflow-auto break-all text-xs\">{issuedToken}</code>\n </div>\n )}\n {status && <p className=\"text-xs text-muted-foreground\">{status}</p>}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Issued tokens</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {tokens.length === 0 && <p className=\"text-xs text-muted-foreground\">No tokens issued yet</p>}\n {tokens.slice(0, 20).map((token) => (\n <div key={token.jti} className=\"rounded-md border border-border p-2\">\n <div className=\"flex items-start gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium\">{token.sub}</div>\n <div className=\"text-xs text-muted-foreground\">{token.role} {token.profileId ? `· ${token.profileId}` : ''}</div>\n </div>\n {token.revokedAt ? <Badge variant=\"destructive\">revoked</Badge> : <Button variant=\"ghost\" size=\"sm\" onClick={() => void revokeToken(token)}><Trash2 className=\"h-3.5 w-3.5\" /></Button>}\n </div>\n <div className=\"mt-1 flex flex-wrap gap-1\">\n {token.scope.slice(0, 4).map((scope) => <Badge key={scope} variant=\"outline\" className=\"text-[10px]\">{scope}</Badge>)}\n {token.scope.length > 4 && <Badge variant=\"secondary\" className=\"text-[10px]\">+{token.scope.length - 4}</Badge>}\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n )\n}\n\nfunction Field({ label, children }: { label: string; children: React.ReactNode }) {\n return <label className=\"block space-y-1.5 text-sm\"><span className=\"text-muted-foreground\">{label}</span>{children}</label>\n}\n\nfunction ConstraintEditor({ value, onChange, compact = false }: { value: ConstraintForm; onChange: (value: ConstraintForm) => void; compact?: boolean }) {\n const fields: Array<[keyof ConstraintForm, string]> = [\n ['agents', 'Agents'],\n ['policies', 'Policies'],\n ['targets', 'Targets'],\n ['channels', 'Channels'],\n ['orchestrators', 'Orchestrators'],\n ['cwdPrefixes', 'CWD prefixes'],\n ['memoryScopes', 'Memory scopes'],\n ['spawnRequestIds', 'Spawn requests'],\n ]\n return (\n <div className=\"space-y-3\">\n {!compact && <div className=\"text-sm text-muted-foreground\">Constraints</div>}\n <div className={`grid gap-3 ${compact ? '' : 'md:grid-cols-2'}`}>\n {fields.map(([key, label]) => (\n <Field key={key} label={label}>\n <Textarea\n rows={compact ? 2 : 3}\n value={String(value[key] || '')}\n onChange={(e) => onChange({ ...value, [key]: e.target.value })}\n placeholder=\"one per line\"\n />\n </Field>\n ))}\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <label className=\"flex items-center gap-2 rounded border border-border px-2 py-1 text-xs\">\n <input type=\"checkbox\" checked={value.terminalAttach} onChange={(e) => onChange({ ...value, terminalAttach: e.target.checked })} />\n Terminal attach\n </label>\n <label className=\"flex items-center gap-2 rounded border border-border px-2 py-1 text-xs\">\n <input type=\"checkbox\" checked={value.logsRead} onChange={(e) => onChange({ ...value, logsRead: e.target.checked })} />\n Log read\n </label>\n </div>\n </div>\n )\n}\n\nfunction profileToForm(profile: TokenProfile): ProfileForm {\n return {\n id: profile.id,\n name: profile.name,\n description: profile.description || '',\n role: profile.role,\n scope: profile.scope,\n ttlSeconds: profile.ttlSeconds ? String(profile.ttlSeconds) : '',\n constraints: formFromConstraints(profile.constraints),\n }\n}\n\nfunction formToProfileBody(form: ProfileForm) {\n return {\n id: form.id || undefined,\n name: form.name,\n description: form.description || undefined,\n role: form.role,\n scope: form.scope,\n ttlSeconds: form.ttlSeconds ? Number(form.ttlSeconds) : undefined,\n constraints: constraintsFromForm(form.constraints),\n }\n}\n\nfunction formFromConstraints(constraints: TokenConstraints | undefined): ConstraintForm {\n return {\n agents: linesText(constraints?.agents),\n policies: linesText(constraints?.policies),\n targets: linesText(constraints?.targets),\n channels: linesText(constraints?.channels),\n orchestrators: linesText(constraints?.orchestrators),\n cwdPrefixes: linesText(constraints?.cwdPrefixes),\n memoryScopes: linesText(constraints?.memoryScopes),\n spawnRequestIds: linesText(constraints?.spawnRequestIds),\n terminalAttach: constraints?.terminalAttach === true,\n logsRead: constraints?.logsRead === true,\n }\n}\n\nfunction constraintsFromForm(form: ConstraintForm): TokenConstraints | undefined {\n const constraints: TokenConstraints = {}\n const arrayFields: Array<keyof ConstraintForm> = ['agents', 'policies', 'targets', 'channels', 'orchestrators', 'cwdPrefixes', 'memoryScopes', 'spawnRequestIds']\n for (const field of arrayFields) {\n const values = lines(String(form[field] || ''))\n if (values.length) Object.assign(constraints, { [field]: values })\n }\n if (form.terminalAttach) constraints.terminalAttach = true\n if (form.logsRead) constraints.logsRead = true\n return Object.keys(constraints).length ? constraints : undefined\n}\n\nfunction lines(value: string): string[] {\n return value.split(/\\r?\\n|,/).map((line) => line.trim()).filter(Boolean)\n}\n\nfunction linesText(value: string[] | undefined): string {\n return (value ?? []).join('\\n')\n}\n\nfunction toggle(values: string[], item: string): string[] {\n return values.includes(item) ? values.filter((value) => value !== item) : [...values, item]\n}\n\nfunction formatTtl(seconds: number): string {\n if (seconds % 86400 === 0) return `${seconds / 86400}d`\n if (seconds % 3600 === 0) return `${seconds / 3600}h`\n return `${seconds}s`\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"security-BZYHZ4CE.js","names":[],"sources":["../../dashboard/src/components/views/security.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react'\nimport { api } from '@/lib/api'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Input } from '@/components/ui/input'\nimport { Textarea } from '@/components/ui/textarea'\nimport { KeyRound, Plus, Save, Shield, Trash2, RotateCcw } from 'lucide-react'\nimport { CopyButton } from '@/components/shared/copy-button'\nimport type { TokenConstraints, TokenProfile, TokenRecord } from '@/types'\n\nconst scopeOptions = [\n 'admin:*',\n 'token:read',\n 'token:write',\n 'agent:read',\n 'agent:write',\n 'message:read',\n 'message:send',\n 'task:read',\n 'task:write',\n 'command:read',\n 'command:write',\n 'memory:read',\n 'memory:write',\n 'memory:admin',\n 'mcp:use',\n 'terminal:attach',\n 'logs:read',\n 'integration:read',\n 'integration:write',\n 'channel:read',\n 'channel:write',\n 'stats:read',\n 'health:read',\n 'events:read',\n]\n\ninterface ProfileForm {\n id: string\n name: string\n description: string\n role: string\n scope: string[]\n ttlSeconds: string\n constraints: ConstraintForm\n}\n\ninterface ConstraintForm {\n agents: string\n policies: string\n targets: string\n channels: string\n orchestrators: string\n cwdPrefixes: string\n memoryScopes: string\n spawnRequestIds: string\n terminalAttach: boolean\n logsRead: boolean\n}\n\nconst emptyConstraints: ConstraintForm = {\n agents: '',\n policies: '',\n targets: '',\n channels: '',\n orchestrators: '',\n cwdPrefixes: '',\n memoryScopes: '',\n spawnRequestIds: '',\n terminalAttach: false,\n logsRead: false,\n}\n\nconst emptyProfile: ProfileForm = {\n id: '',\n name: '',\n description: '',\n role: 'provider',\n scope: ['agent:read', 'message:read', 'message:send'],\n ttlSeconds: '86400',\n constraints: { ...emptyConstraints },\n}\n\nexport function SecurityView() {\n const [profiles, setProfiles] = useState<TokenProfile[]>([])\n const [tokens, setTokens] = useState<TokenRecord[]>([])\n const [selectedId, setSelectedId] = useState('')\n const [form, setForm] = useState<ProfileForm>(emptyProfile)\n const [issueProfileId, setIssueProfileId] = useState('')\n const [issueSub, setIssueSub] = useState('')\n const [issueConstraints, setIssueConstraints] = useState<ConstraintForm>({ ...emptyConstraints })\n const [issuedToken, setIssuedToken] = useState('')\n const [status, setStatus] = useState('')\n const [tab, setTab] = useState<'profiles' | 'tokens'>('profiles')\n\n const selected = useMemo(() => profiles.find((profile) => profile.id === selectedId), [profiles, selectedId])\n\n useEffect(() => { void refresh() }, [])\n\n async function refresh() {\n const [nextProfiles, nextTokens] = await Promise.all([\n api<TokenProfile[]>('GET', '/token-profiles'),\n api<TokenRecord[]>('GET', '/tokens'),\n ])\n setProfiles(nextProfiles)\n setTokens(nextTokens)\n if (!selectedId && nextProfiles[0]) {\n setSelectedId(nextProfiles[0].id)\n setForm(profileToForm(nextProfiles[0]))\n setIssueProfileId(nextProfiles[0].id)\n }\n }\n\n function selectProfile(profile: TokenProfile) {\n setSelectedId(profile.id)\n setForm(profileToForm(profile))\n setIssuedToken('')\n }\n\n function newProfile() {\n setSelectedId('')\n setForm({ ...emptyProfile, constraints: { ...emptyConstraints } })\n setStatus('')\n }\n\n async function saveProfile() {\n const body = formToProfileBody(form)\n const saved = selectedId\n ? await api<TokenProfile>('PATCH', `/token-profiles/${encodeURIComponent(selectedId)}`, body)\n : await api<TokenProfile>('POST', '/token-profiles', body)\n await refresh()\n setSelectedId(saved.id)\n setForm(profileToForm(saved))\n setIssueProfileId(saved.id)\n setStatus(`${saved.name} saved`)\n }\n\n async function deleteProfile(profile: TokenProfile) {\n await api('DELETE', `/token-profiles/${encodeURIComponent(profile.id)}`)\n newProfile()\n await refresh()\n }\n\n async function issueToken() {\n const profile = profiles.find((item) => item.id === issueProfileId)\n const result = await api<{ token: string; record: TokenRecord }>('POST', '/tokens', {\n profileId: issueProfileId,\n sub: issueSub || profile?.role || 'component',\n constraints: constraintsFromForm(issueConstraints),\n createdBy: 'dashboard',\n })\n setIssuedToken(result.token)\n setIssueSub('')\n setIssueConstraints({ ...emptyConstraints })\n await refresh()\n }\n\n async function revokeToken(token: TokenRecord) {\n await api('POST', `/tokens/${encodeURIComponent(token.jti)}/revoke`)\n await refresh()\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <h1 className=\"text-lg font-semibold\">Security</h1>\n <p className=\"text-sm text-muted-foreground\">Token profiles and scoped component tokens</p>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"inline-flex rounded-md border border-border overflow-hidden\">\n <button type=\"button\" onClick={() => setTab('profiles')} className={`flex items-center gap-1.5 px-3 py-1.5 text-sm transition-colors ${tab === 'profiles' ? 'bg-primary/15 text-primary' : 'text-muted-foreground hover:bg-accent'}`}>\n <Shield className=\"h-3.5 w-3.5\" />Profiles\n </button>\n <button type=\"button\" onClick={() => setTab('tokens')} className={`flex items-center gap-1.5 px-3 py-1.5 text-sm border-l border-border transition-colors ${tab === 'tokens' ? 'bg-primary/15 text-primary' : 'text-muted-foreground hover:bg-accent'}`}>\n <KeyRound className=\"h-3.5 w-3.5\" />Tokens\n </button>\n </div>\n <Button variant=\"outline\" onClick={() => void refresh()}><RotateCcw className=\"h-4 w-4\" />Refresh</Button>\n {tab === 'profiles' && <Button onClick={newProfile}><Plus className=\"h-4 w-4\" />New profile</Button>}\n </div>\n </div>\n\n {tab === 'profiles' && (\n <div className=\"grid gap-4 xl:grid-cols-[340px_minmax(0,1fr)]\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-sm\"><Shield className=\"h-4 w-4\" />Profiles</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {profiles.map((profile) => (\n <button\n key={profile.id}\n type=\"button\"\n onClick={() => selectProfile(profile)}\n className={`w-full rounded-md border px-3 py-2 text-left transition-colors ${profile.id === selectedId ? 'border-primary bg-primary/10' : 'border-border hover:bg-accent'}`}\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium\">{profile.name}</span>\n {profile.builtIn && <Badge variant=\"secondary\" className=\"text-[10px]\">built-in</Badge>}\n </div>\n <div className=\"mt-1 flex items-center gap-2 text-xs text-muted-foreground\">\n <span>{profile.role}</span>\n <span>{profile.scope.length} scopes</span>\n {profile.ttlSeconds && <span>{formatTtl(profile.ttlSeconds)}</span>}\n </div>\n </button>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">{selected ? selected.name : 'New profile'}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-3 md:grid-cols-2\">\n <Field label=\"Profile id\"><Input disabled={Boolean(selectedId)} value={form.id} onChange={(e) => setForm({ ...form, id: e.target.value })} /></Field>\n <Field label=\"Name\"><Input value={form.name} onChange={(e) => setForm({ ...form, name: e.target.value })} /></Field>\n <Field label=\"Role\"><Input value={form.role} onChange={(e) => setForm({ ...form, role: e.target.value })} /></Field>\n <Field label=\"TTL seconds\"><Input inputMode=\"numeric\" value={form.ttlSeconds} onChange={(e) => setForm({ ...form, ttlSeconds: e.target.value })} /></Field>\n </div>\n <Field label=\"Description\"><Textarea rows={2} value={form.description} onChange={(e) => setForm({ ...form, description: e.target.value })} /></Field>\n\n <div className=\"space-y-2\">\n <div className=\"text-sm text-muted-foreground\">Scopes</div>\n <div className=\"flex flex-wrap gap-1.5\">\n {scopeOptions.map((scope) => {\n const active = form.scope.includes(scope)\n return (\n <button\n key={scope}\n type=\"button\"\n onClick={() => setForm({ ...form, scope: toggle(form.scope, scope) })}\n className={`rounded border px-2 py-1 text-xs ${active ? 'border-primary/50 bg-primary/15 text-primary' : 'border-border text-muted-foreground hover:bg-accent'}`}\n >\n {scope}\n </button>\n )\n })}\n </div>\n </div>\n\n <ConstraintEditor value={form.constraints} onChange={(constraints) => setForm({ ...form, constraints })} />\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button disabled={selected?.builtIn} onClick={() => void saveProfile()}><Save className=\"h-4 w-4\" />Save</Button>\n {selected && !selected.builtIn && (\n <Button variant=\"destructive\" onClick={() => void deleteProfile(selected)}><Trash2 className=\"h-4 w-4\" />Delete</Button>\n )}\n {selected?.builtIn && <span className=\"text-xs text-muted-foreground\">Built-in profiles are managed by Relay.</span>}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {tab === 'tokens' && (\n <div className=\"grid gap-4 xl:grid-cols-[380px_minmax(0,1fr)]\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-sm\"><KeyRound className=\"h-4 w-4\" />Issue token</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <Field label=\"Profile\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={issueProfileId} onChange={(e) => setIssueProfileId(e.target.value)}>\n {profiles.map((profile) => <option key={profile.id} value={profile.id}>{profile.name}</option>)}\n </select>\n </Field>\n <Field label=\"Subject\"><Input value={issueSub} onChange={(e) => setIssueSub(e.target.value)} placeholder=\"component id\" /></Field>\n <ConstraintEditor compact value={issueConstraints} onChange={setIssueConstraints} />\n <Button className=\"w-full\" disabled={!issueProfileId} onClick={() => void issueToken()}><KeyRound className=\"h-4 w-4\" />Issue</Button>\n {issuedToken && (\n <div className=\"rounded-md border border-border bg-muted/30 p-2\">\n <div className=\"mb-1 flex items-center justify-between gap-2\">\n <span className=\"text-xs text-muted-foreground\">New token</span>\n <CopyButton value={issuedToken} label=\"Copy token\" size=\"sm\" variant=\"ghost\" onCopied={() => setStatus('Copied')} />\n </div>\n <code className=\"block max-h-24 overflow-auto break-all text-xs\">{issuedToken}</code>\n </div>\n )}\n {status && <p className=\"text-xs text-muted-foreground\">{status}</p>}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Issued tokens</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {tokens.length === 0 && <p className=\"text-xs text-muted-foreground\">No tokens issued yet</p>}\n {tokens.slice(0, 20).map((token) => (\n <div key={token.jti} className=\"rounded-md border border-border p-2\">\n <div className=\"flex items-start gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium\">{token.sub}</div>\n <div className=\"text-xs text-muted-foreground\">{token.role} {token.profileId ? `· ${token.profileId}` : ''}</div>\n </div>\n {token.revokedAt ? <Badge variant=\"destructive\">revoked</Badge> : <Button variant=\"ghost\" size=\"sm\" onClick={() => void revokeToken(token)}><Trash2 className=\"h-3.5 w-3.5\" /></Button>}\n </div>\n <div className=\"mt-1 flex flex-wrap gap-1\">\n {token.scope.slice(0, 4).map((scope) => <Badge key={scope} variant=\"outline\" className=\"text-[10px]\">{scope}</Badge>)}\n {token.scope.length > 4 && <Badge variant=\"secondary\" className=\"text-[10px]\">+{token.scope.length - 4}</Badge>}\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n )\n}\n\nfunction Field({ label, children }: { label: string; children: React.ReactNode }) {\n return <label className=\"block space-y-1.5 text-sm\"><span className=\"text-muted-foreground\">{label}</span>{children}</label>\n}\n\nfunction ConstraintEditor({ value, onChange, compact = false }: { value: ConstraintForm; onChange: (value: ConstraintForm) => void; compact?: boolean }) {\n const fields: Array<[keyof ConstraintForm, string]> = [\n ['agents', 'Agents'],\n ['policies', 'Policies'],\n ['targets', 'Targets'],\n ['channels', 'Channels'],\n ['orchestrators', 'Orchestrators'],\n ['cwdPrefixes', 'CWD prefixes'],\n ['memoryScopes', 'Memory scopes'],\n ['spawnRequestIds', 'Spawn requests'],\n ]\n return (\n <div className=\"space-y-3\">\n {!compact && <div className=\"text-sm text-muted-foreground\">Constraints</div>}\n <div className={`grid gap-3 ${compact ? '' : 'md:grid-cols-2'}`}>\n {fields.map(([key, label]) => (\n <Field key={key} label={label}>\n <Textarea\n rows={compact ? 2 : 3}\n value={String(value[key] || '')}\n onChange={(e) => onChange({ ...value, [key]: e.target.value })}\n placeholder=\"one per line\"\n />\n </Field>\n ))}\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <label className=\"flex items-center gap-2 rounded border border-border px-2 py-1 text-xs\">\n <input type=\"checkbox\" checked={value.terminalAttach} onChange={(e) => onChange({ ...value, terminalAttach: e.target.checked })} />\n Terminal attach\n </label>\n <label className=\"flex items-center gap-2 rounded border border-border px-2 py-1 text-xs\">\n <input type=\"checkbox\" checked={value.logsRead} onChange={(e) => onChange({ ...value, logsRead: e.target.checked })} />\n Log read\n </label>\n </div>\n </div>\n )\n}\n\nfunction profileToForm(profile: TokenProfile): ProfileForm {\n return {\n id: profile.id,\n name: profile.name,\n description: profile.description || '',\n role: profile.role,\n scope: profile.scope,\n ttlSeconds: profile.ttlSeconds ? String(profile.ttlSeconds) : '',\n constraints: formFromConstraints(profile.constraints),\n }\n}\n\nfunction formToProfileBody(form: ProfileForm) {\n return {\n id: form.id || undefined,\n name: form.name,\n description: form.description || undefined,\n role: form.role,\n scope: form.scope,\n ttlSeconds: form.ttlSeconds ? Number(form.ttlSeconds) : undefined,\n constraints: constraintsFromForm(form.constraints),\n }\n}\n\nfunction formFromConstraints(constraints: TokenConstraints | undefined): ConstraintForm {\n return {\n agents: linesText(constraints?.agents),\n policies: linesText(constraints?.policies),\n targets: linesText(constraints?.targets),\n channels: linesText(constraints?.channels),\n orchestrators: linesText(constraints?.orchestrators),\n cwdPrefixes: linesText(constraints?.cwdPrefixes),\n memoryScopes: linesText(constraints?.memoryScopes),\n spawnRequestIds: linesText(constraints?.spawnRequestIds),\n terminalAttach: constraints?.terminalAttach === true,\n logsRead: constraints?.logsRead === true,\n }\n}\n\nfunction constraintsFromForm(form: ConstraintForm): TokenConstraints | undefined {\n const constraints: TokenConstraints = {}\n const arrayFields: Array<keyof ConstraintForm> = ['agents', 'policies', 'targets', 'channels', 'orchestrators', 'cwdPrefixes', 'memoryScopes', 'spawnRequestIds']\n for (const field of arrayFields) {\n const values = lines(String(form[field] || ''))\n if (values.length) Object.assign(constraints, { [field]: values })\n }\n if (form.terminalAttach) constraints.terminalAttach = true\n if (form.logsRead) constraints.logsRead = true\n return Object.keys(constraints).length ? constraints : undefined\n}\n\nfunction lines(value: string): string[] {\n return value.split(/\\r?\\n|,/).map((line) => line.trim()).filter(Boolean)\n}\n\nfunction linesText(value: string[] | undefined): string {\n return (value ?? []).join('\\n')\n}\n\nfunction toggle(values: string[], item: string): string[] {\n return values.includes(item) ? values.filter((value) => value !== item) : [...values, item]\n}\n\nfunction formatTtl(seconds: number): string {\n if (seconds % 86400 === 0) return `${seconds / 86400}d`\n if (seconds % 3600 === 0) return `${seconds / 3600}h`\n return `${seconds}s`\n}\n"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import{r as e}from"./chunk-CilyBKbf.js";import{An as t,Dn as n,O as r,Vn as i,c as a,dn as o,en as s,g as c,h as l,in as u,kn as d,rn as f,vt as p,wt as m}from"./lucide-react-CD8Xl2U3.js";import{t as h}from"./react-dom-CX8inunm.js";import{c as g,o as _,t as v}from"./store-CICRhg1m.js";import{o as y,r as b}from"./dist-CiWi_f7V.js";import{t as x}from"./dist-CkiXMjV0.js";import{i as S,n as C,t as w}from"./dist-C3Yx04R4.js";import{a as T,i as E,n as D,o as O,r as ee,t as k}from"./dist-xorgjFcF.js";import{t as A}from"./dist-CHi40_tZ.js";import{a as te,i as ne,n as re,o as ie,r as ae,s as j,t as oe}from"./es2015-BDK_SBFZ.js";import{t as se}from"./dist-DTLaCErY.js";import{t as ce}from"./dist-BmYJ5xuf.js";import{r as M,t as N}from"./switch-22dlDUXs.js";import{t as le}from"./dist-CVTST7Gc.js";import{t as P}from"./button-DDA5P2YQ.js";import{t as F}from"./input-BW9UD3FM.js";import{r as I,z as ue}from"./index-BL8r94_U.js";var L=e(i(),1),de=e(h(),1),R=d(),fe=[` `,`Enter`,`ArrowUp`,`ArrowDown`],pe=[` `,`Enter`],z=`Select`,[me,B,he]=O(z),[V,ge]=S(z,[he,T]),_e=T(),[ve,H]=V(z),[ye,be]=V(z),xe=e=>{let{__scopeSelect:t,children:n,open:r,defaultOpen:i,onOpenChange:a,value:o,defaultValue:s,onValueChange:c,dir:l,name:u,autoComplete:d,disabled:f,required:p,form:m}=e,h=_e(t),[g,_]=L.useState(null),[v,y]=L.useState(null),[b,x]=L.useState(!1),S=se(l),[C,w]=A({prop:r,defaultProp:i??!1,onChange:a,caller:z}),[T,D]=A({prop:o,defaultProp:s,onChange:c,caller:z}),O=L.useRef(null),ee=g?m||!!g.closest(`form`):!0,[k,te]=L.useState(new Set),ne=Array.from(k).map(e=>e.props.value).join(`;`);return(0,R.jsx)(E,{...h,children:(0,R.jsxs)(ve,{required:p,scope:t,trigger:g,onTriggerChange:_,valueNode:v,onValueNodeChange:y,valueNodeHasChildren:b,onValueNodeHasChildrenChange:x,contentId:j(),value:T,onValueChange:D,open:C,onOpenChange:w,dir:S,triggerPointerDownPosRef:O,disabled:f,children:[(0,R.jsx)(me.Provider,{scope:t,children:(0,R.jsx)(ye,{scope:e.__scopeSelect,onNativeOptionAdd:L.useCallback(e=>{te(t=>new Set(t).add(e))},[]),onNativeOptionRemove:L.useCallback(e=>{te(t=>{let n=new Set(t);return n.delete(e),n})},[]),children:n})}),ee?(0,R.jsxs)(ft,{"aria-hidden":!0,required:p,tabIndex:-1,name:u,autoComplete:d,value:T,onChange:e=>D(e.target.value),disabled:f,form:m,children:[T===void 0?(0,R.jsx)(`option`,{value:``}):null,Array.from(k)]},ne):null]})})};xe.displayName=z;var Se=`SelectTrigger`,Ce=L.forwardRef((e,t)=>{let{__scopeSelect:n,disabled:r=!1,...i}=e,a=_e(n),o=H(Se,n),s=o.disabled||r,c=y(t,o.onTriggerChange),l=B(n),u=L.useRef(`touch`),[d,f,p]=mt(e=>{let t=l().filter(e=>!e.disabled),n=ht(t,e,t.find(e=>e.value===o.value));n!==void 0&&o.onValueChange(n.value)}),m=e=>{s||(o.onOpenChange(!0),p()),e&&(o.triggerPointerDownPosRef.current={x:Math.round(e.pageX),y:Math.round(e.pageY)})};return(0,R.jsx)(k,{asChild:!0,...a,children:(0,R.jsx)(x.button,{type:`button`,role:`combobox`,"aria-controls":o.contentId,"aria-expanded":o.open,"aria-required":o.required,"aria-autocomplete":`none`,dir:o.dir,"data-state":o.open?`open`:`closed`,disabled:s,"data-disabled":s?``:void 0,"data-placeholder":pt(o.value)?``:void 0,...i,ref:c,onClick:C(i.onClick,e=>{e.currentTarget.focus(),u.current!==`mouse`&&m(e)}),onPointerDown:C(i.onPointerDown,e=>{u.current=e.pointerType;let t=e.target;t.hasPointerCapture(e.pointerId)&&t.releasePointerCapture(e.pointerId),e.button===0&&e.ctrlKey===!1&&e.pointerType===`mouse`&&(m(e),e.preventDefault())}),onKeyDown:C(i.onKeyDown,e=>{let t=d.current!==``;!(e.ctrlKey||e.altKey||e.metaKey)&&e.key.length===1&&f(e.key),!(t&&e.key===` `)&&fe.includes(e.key)&&(m(),e.preventDefault())})})})});Ce.displayName=Se;var we=`SelectValue`,Te=L.forwardRef((e,t)=>{let{__scopeSelect:n,className:r,style:i,children:a,placeholder:o=``,...s}=e,c=H(we,n),{onValueNodeHasChildrenChange:l}=c,u=a!==void 0,d=y(t,c.onValueNodeChange);return w(()=>{l(u)},[l,u]),(0,R.jsx)(x.span,{...s,ref:d,style:{pointerEvents:`none`},children:pt(c.value)?(0,R.jsx)(R.Fragment,{children:o}):a})});Te.displayName=we;var Ee=`SelectIcon`,De=L.forwardRef((e,t)=>{let{__scopeSelect:n,children:r,...i}=e;return(0,R.jsx)(x.span,{"aria-hidden":!0,...i,ref:t,children:r||`▼`})});De.displayName=Ee;var Oe=`SelectPortal`,ke=e=>(0,R.jsx)(ne,{asChild:!0,...e});ke.displayName=Oe;var U=`SelectContent`,Ae=L.forwardRef((e,t)=>{let n=H(U,e.__scopeSelect),[r,i]=L.useState();if(w(()=>{i(new DocumentFragment)},[]),!n.open){let t=r;return t?de.createPortal((0,R.jsx)(je,{scope:e.__scopeSelect,children:(0,R.jsx)(me.Slot,{scope:e.__scopeSelect,children:(0,R.jsx)(`div`,{children:e.children})})}),t):null}return(0,R.jsx)(Pe,{...e,ref:t})});Ae.displayName=U;var W=10,[je,G]=V(U),Me=`SelectContentImpl`,Ne=b(`SelectContent.RemoveScroll`),Pe=L.forwardRef((e,t)=>{let{__scopeSelect:n,position:r=`item-aligned`,onCloseAutoFocus:i,onEscapeKeyDown:a,onPointerDownOutside:o,side:s,sideOffset:c,align:l,alignOffset:u,arrowPadding:d,collisionBoundary:f,collisionPadding:p,sticky:m,hideWhenDetached:h,avoidCollisions:g,..._}=e,v=H(U,n),[b,x]=L.useState(null),[S,w]=L.useState(null),T=y(t,e=>x(e)),[E,D]=L.useState(null),[O,ee]=L.useState(null),k=B(n),[A,ne]=L.useState(!1),j=L.useRef(!1);L.useEffect(()=>{if(b)return oe(b)},[b]),ae();let se=L.useCallback(e=>{let[t,...n]=k().map(e=>e.ref.current),[r]=n.slice(-1),i=document.activeElement;for(let n of e)if(n===i||(n?.scrollIntoView({block:`nearest`}),n===t&&S&&(S.scrollTop=0),n===r&&S&&(S.scrollTop=S.scrollHeight),n?.focus(),document.activeElement!==i))return},[k,S]),ce=L.useCallback(()=>se([E,b]),[se,E,b]);L.useEffect(()=>{A&&ce()},[A,ce]);let{onOpenChange:M,triggerPointerDownPosRef:N}=v;L.useEffect(()=>{if(b){let e={x:0,y:0},t=t=>{e={x:Math.abs(Math.round(t.pageX)-(N.current?.x??0)),y:Math.abs(Math.round(t.pageY)-(N.current?.y??0))}},n=n=>{e.x<=10&&e.y<=10?n.preventDefault():b.contains(n.target)||M(!1),document.removeEventListener(`pointermove`,t),N.current=null};return N.current!==null&&(document.addEventListener(`pointermove`,t),document.addEventListener(`pointerup`,n,{capture:!0,once:!0})),()=>{document.removeEventListener(`pointermove`,t),document.removeEventListener(`pointerup`,n,{capture:!0})}}},[b,M,N]),L.useEffect(()=>{let e=()=>M(!1);return window.addEventListener(`blur`,e),window.addEventListener(`resize`,e),()=>{window.removeEventListener(`blur`,e),window.removeEventListener(`resize`,e)}},[M]);let[le,P]=mt(e=>{let t=k().filter(e=>!e.disabled),n=ht(t,e,t.find(e=>e.ref.current===document.activeElement));n&&setTimeout(()=>n.ref.current.focus())}),F=L.useCallback((e,t,n)=>{let r=!j.current&&!n;(v.value!==void 0&&v.value===t||r)&&(D(e),r&&(j.current=!0))},[v.value]),I=L.useCallback(()=>b?.focus(),[b]),ue=L.useCallback((e,t,n)=>{let r=!j.current&&!n;(v.value!==void 0&&v.value===t||r)&&ee(e)},[v.value]),de=r===`popper`?Re:Ie,fe=de===Re?{side:s,sideOffset:c,align:l,alignOffset:u,arrowPadding:d,collisionBoundary:f,collisionPadding:p,sticky:m,hideWhenDetached:h,avoidCollisions:g}:{};return(0,R.jsx)(je,{scope:n,content:b,viewport:S,onViewportChange:w,itemRefCallback:F,selectedItem:E,onItemLeave:I,itemTextRefCallback:ue,focusSelectedItem:ce,selectedItemText:O,position:r,isPositioned:A,searchRef:le,children:(0,R.jsx)(re,{as:Ne,allowPinchZoom:!0,children:(0,R.jsx)(te,{asChild:!0,trapped:v.open,onMountAutoFocus:e=>{e.preventDefault()},onUnmountAutoFocus:C(i,e=>{v.trigger?.focus({preventScroll:!0}),e.preventDefault()}),children:(0,R.jsx)(ie,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:a,onPointerDownOutside:o,onFocusOutside:e=>e.preventDefault(),onDismiss:()=>v.onOpenChange(!1),children:(0,R.jsx)(de,{role:`listbox`,id:v.contentId,"data-state":v.open?`open`:`closed`,dir:v.dir,onContextMenu:e=>e.preventDefault(),..._,...fe,onPlaced:()=>ne(!0),ref:T,style:{display:`flex`,flexDirection:`column`,outline:`none`,..._.style},onKeyDown:C(_.onKeyDown,e=>{let t=e.ctrlKey||e.altKey||e.metaKey;if(e.key===`Tab`&&e.preventDefault(),!t&&e.key.length===1&&P(e.key),[`ArrowUp`,`ArrowDown`,`Home`,`End`].includes(e.key)){let t=k().filter(e=>!e.disabled).map(e=>e.ref.current);if([`ArrowUp`,`End`].includes(e.key)&&(t=t.slice().reverse()),[`ArrowUp`,`ArrowDown`].includes(e.key)){let n=e.target,r=t.indexOf(n);t=t.slice(r+1)}setTimeout(()=>se(t)),e.preventDefault()}})})})})})})});Pe.displayName=Me;var Fe=`SelectItemAlignedPosition`,Ie=L.forwardRef((e,t)=>{let{__scopeSelect:n,onPlaced:r,...i}=e,a=H(U,n),o=G(U,n),[s,c]=L.useState(null),[l,u]=L.useState(null),d=y(t,e=>u(e)),f=B(n),p=L.useRef(!1),m=L.useRef(!0),{viewport:h,selectedItem:g,selectedItemText:_,focusSelectedItem:v}=o,b=L.useCallback(()=>{if(a.trigger&&a.valueNode&&s&&l&&h&&g&&_){let e=a.trigger.getBoundingClientRect(),t=l.getBoundingClientRect(),n=a.valueNode.getBoundingClientRect(),i=_.getBoundingClientRect();if(a.dir!==`rtl`){let r=i.left-t.left,a=n.left-r,o=e.left-a,c=e.width+o,l=Math.max(c,t.width),u=window.innerWidth-W,d=le(a,[W,Math.max(W,u-l)]);s.style.minWidth=c+`px`,s.style.left=d+`px`}else{let r=t.right-i.right,a=window.innerWidth-n.right-r,o=window.innerWidth-e.right-a,c=e.width+o,l=Math.max(c,t.width),u=window.innerWidth-W,d=le(a,[W,Math.max(W,u-l)]);s.style.minWidth=c+`px`,s.style.right=d+`px`}let o=f(),c=window.innerHeight-W*2,u=h.scrollHeight,d=window.getComputedStyle(l),m=parseInt(d.borderTopWidth,10),v=parseInt(d.paddingTop,10),y=parseInt(d.borderBottomWidth,10),b=parseInt(d.paddingBottom,10),x=m+v+u+b+y,S=Math.min(g.offsetHeight*5,x),C=window.getComputedStyle(h),w=parseInt(C.paddingTop,10),T=parseInt(C.paddingBottom,10),E=e.top+e.height/2-W,D=c-E,O=g.offsetHeight/2,ee=g.offsetTop+O,k=m+v+ee,A=x-k;if(k<=E){let e=o.length>0&&g===o[o.length-1].ref.current;s.style.bottom=`0px`;let t=l.clientHeight-h.offsetTop-h.offsetHeight,n=k+Math.max(D,O+(e?T:0)+t+y);s.style.height=n+`px`}else{let e=o.length>0&&g===o[0].ref.current;s.style.top=`0px`;let t=Math.max(E,m+h.offsetTop+(e?w:0)+O)+A;s.style.height=t+`px`,h.scrollTop=k-E+h.offsetTop}s.style.margin=`${W}px 0`,s.style.minHeight=S+`px`,s.style.maxHeight=c+`px`,r?.(),requestAnimationFrame(()=>p.current=!0)}},[f,a.trigger,a.valueNode,s,l,h,g,_,a.dir,r]);w(()=>b(),[b]);let[S,C]=L.useState();return w(()=>{l&&C(window.getComputedStyle(l).zIndex)},[l]),(0,R.jsx)(ze,{scope:n,contentWrapper:s,shouldExpandOnScrollRef:p,onScrollButtonChange:L.useCallback(e=>{e&&m.current===!0&&(b(),v?.(),m.current=!1)},[b,v]),children:(0,R.jsx)(`div`,{ref:c,style:{display:`flex`,flexDirection:`column`,position:`fixed`,zIndex:S},children:(0,R.jsx)(x.div,{...i,ref:d,style:{boxSizing:`border-box`,maxHeight:`100%`,...i.style}})})})});Ie.displayName=Fe;var Le=`SelectPopperPosition`,Re=L.forwardRef((e,t)=>{let{__scopeSelect:n,align:r=`start`,collisionPadding:i=W,...a}=e,o=_e(n);return(0,R.jsx)(ee,{...o,...a,ref:t,align:r,collisionPadding:i,style:{boxSizing:`border-box`,...a.style,"--radix-select-content-transform-origin":`var(--radix-popper-transform-origin)`,"--radix-select-content-available-width":`var(--radix-popper-available-width)`,"--radix-select-content-available-height":`var(--radix-popper-available-height)`,"--radix-select-trigger-width":`var(--radix-popper-anchor-width)`,"--radix-select-trigger-height":`var(--radix-popper-anchor-height)`}})});Re.displayName=Le;var[ze,Be]=V(U,{}),Ve=`SelectViewport`,He=L.forwardRef((e,t)=>{let{__scopeSelect:n,nonce:r,...i}=e,a=G(Ve,n),o=Be(Ve,n),s=y(t,a.onViewportChange),c=L.useRef(0);return(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`style`,{dangerouslySetInnerHTML:{__html:`[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}`},nonce:r}),(0,R.jsx)(me.Slot,{scope:n,children:(0,R.jsx)(x.div,{"data-radix-select-viewport":``,role:`presentation`,...i,ref:s,style:{position:`relative`,flex:1,overflow:`hidden auto`,...i.style},onScroll:C(i.onScroll,e=>{let t=e.currentTarget,{contentWrapper:n,shouldExpandOnScrollRef:r}=o;if(r?.current&&n){let e=Math.abs(c.current-t.scrollTop);if(e>0){let r=window.innerHeight-W*2,i=parseFloat(n.style.minHeight),a=parseFloat(n.style.height),o=Math.max(i,a);if(o<r){let i=o+e,a=Math.min(r,i),s=i-a;n.style.height=a+`px`,n.style.bottom===`0px`&&(t.scrollTop=s>0?s:0,n.style.justifyContent=`flex-end`)}}}c.current=t.scrollTop})})})]})});He.displayName=Ve;var Ue=`SelectGroup`,[We,Ge]=V(Ue),Ke=L.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e,i=j();return(0,R.jsx)(We,{scope:n,id:i,children:(0,R.jsx)(x.div,{role:`group`,"aria-labelledby":i,...r,ref:t})})});Ke.displayName=Ue;var qe=`SelectLabel`,Je=L.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e,i=Ge(qe,n);return(0,R.jsx)(x.div,{id:i.id,...r,ref:t})});Je.displayName=qe;var Ye=`SelectItem`,[Xe,Ze]=V(Ye),Qe=L.forwardRef((e,t)=>{let{__scopeSelect:n,value:r,disabled:i=!1,textValue:a,...o}=e,s=H(Ye,n),c=G(Ye,n),l=s.value===r,[u,d]=L.useState(a??``),[f,p]=L.useState(!1),m=y(t,e=>c.itemRefCallback?.(e,r,i)),h=j(),g=L.useRef(`touch`),_=()=>{i||(s.onValueChange(r),s.onOpenChange(!1))};if(r===``)throw Error(`A <Select.Item /> must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder.`);return(0,R.jsx)(Xe,{scope:n,value:r,disabled:i,textId:h,isSelected:l,onItemTextChange:L.useCallback(e=>{d(t=>t||(e?.textContent??``).trim())},[]),children:(0,R.jsx)(me.ItemSlot,{scope:n,value:r,disabled:i,textValue:u,children:(0,R.jsx)(x.div,{role:`option`,"aria-labelledby":h,"data-highlighted":f?``:void 0,"aria-selected":l&&f,"data-state":l?`checked`:`unchecked`,"aria-disabled":i||void 0,"data-disabled":i?``:void 0,tabIndex:i?void 0:-1,...o,ref:m,onFocus:C(o.onFocus,()=>p(!0)),onBlur:C(o.onBlur,()=>p(!1)),onClick:C(o.onClick,()=>{g.current!==`mouse`&&_()}),onPointerUp:C(o.onPointerUp,()=>{g.current===`mouse`&&_()}),onPointerDown:C(o.onPointerDown,e=>{g.current=e.pointerType}),onPointerMove:C(o.onPointerMove,e=>{g.current=e.pointerType,i?c.onItemLeave?.():g.current===`mouse`&&e.currentTarget.focus({preventScroll:!0})}),onPointerLeave:C(o.onPointerLeave,e=>{e.currentTarget===document.activeElement&&c.onItemLeave?.()}),onKeyDown:C(o.onKeyDown,e=>{c.searchRef?.current!==``&&e.key===` `||(pe.includes(e.key)&&_(),e.key===` `&&e.preventDefault())})})})})});Qe.displayName=Ye;var K=`SelectItemText`,$e=L.forwardRef((e,t)=>{let{__scopeSelect:n,className:r,style:i,...a}=e,o=H(K,n),s=G(K,n),c=Ze(K,n),l=be(K,n),[u,d]=L.useState(null),f=y(t,e=>d(e),c.onItemTextChange,e=>s.itemTextRefCallback?.(e,c.value,c.disabled)),p=u?.textContent,m=L.useMemo(()=>(0,R.jsx)(`option`,{value:c.value,disabled:c.disabled,children:p},c.value),[c.disabled,c.value,p]),{onNativeOptionAdd:h,onNativeOptionRemove:g}=l;return w(()=>(h(m),()=>g(m)),[h,g,m]),(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(x.span,{id:c.textId,...a,ref:f}),c.isSelected&&o.valueNode&&!o.valueNodeHasChildren?de.createPortal(a.children,o.valueNode):null]})});$e.displayName=K;var et=`SelectItemIndicator`,tt=L.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e;return Ze(et,n).isSelected?(0,R.jsx)(x.span,{"aria-hidden":!0,...r,ref:t}):null});tt.displayName=et;var nt=`SelectScrollUpButton`,rt=L.forwardRef((e,t)=>{let n=G(nt,e.__scopeSelect),r=Be(nt,e.__scopeSelect),[i,a]=L.useState(!1),o=y(t,r.onScrollButtonChange);return w(()=>{if(n.viewport&&n.isPositioned){let e=function(){a(t.scrollTop>0)},t=n.viewport;return e(),t.addEventListener(`scroll`,e),()=>t.removeEventListener(`scroll`,e)}},[n.viewport,n.isPositioned]),i?(0,R.jsx)(ot,{...e,ref:o,onAutoScroll:()=>{let{viewport:e,selectedItem:t}=n;e&&t&&(e.scrollTop-=t.offsetHeight)}}):null});rt.displayName=nt;var it=`SelectScrollDownButton`,at=L.forwardRef((e,t)=>{let n=G(it,e.__scopeSelect),r=Be(it,e.__scopeSelect),[i,a]=L.useState(!1),o=y(t,r.onScrollButtonChange);return w(()=>{if(n.viewport&&n.isPositioned){let e=function(){let e=t.scrollHeight-t.clientHeight;a(Math.ceil(t.scrollTop)<e)},t=n.viewport;return e(),t.addEventListener(`scroll`,e),()=>t.removeEventListener(`scroll`,e)}},[n.viewport,n.isPositioned]),i?(0,R.jsx)(ot,{...e,ref:o,onAutoScroll:()=>{let{viewport:e,selectedItem:t}=n;e&&t&&(e.scrollTop+=t.offsetHeight)}}):null});at.displayName=it;var ot=L.forwardRef((e,t)=>{let{__scopeSelect:n,onAutoScroll:r,...i}=e,a=G(`SelectScrollButton`,n),o=L.useRef(null),s=B(n),c=L.useCallback(()=>{o.current!==null&&(window.clearInterval(o.current),o.current=null)},[]);return L.useEffect(()=>()=>c(),[c]),w(()=>{s().find(e=>e.ref.current===document.activeElement)?.ref.current?.scrollIntoView({block:`nearest`})},[s]),(0,R.jsx)(x.div,{"aria-hidden":!0,...i,ref:t,style:{flexShrink:0,...i.style},onPointerDown:C(i.onPointerDown,()=>{o.current===null&&(o.current=window.setInterval(r,50))}),onPointerMove:C(i.onPointerMove,()=>{a.onItemLeave?.(),o.current===null&&(o.current=window.setInterval(r,50))}),onPointerLeave:C(i.onPointerLeave,()=>{c()})})}),st=`SelectSeparator`,ct=L.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e;return(0,R.jsx)(x.div,{"aria-hidden":!0,...r,ref:t})});ct.displayName=st;var lt=`SelectArrow`,ut=L.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e,i=_e(n),a=H(lt,n),o=G(lt,n);return a.open&&o.position===`popper`?(0,R.jsx)(D,{...i,...r,ref:t}):null});ut.displayName=lt;var dt=`SelectBubbleInput`,ft=L.forwardRef(({__scopeSelect:e,value:t,...n},r)=>{let i=L.useRef(null),a=y(r,i),o=M(t);return L.useEffect(()=>{let e=i.current;if(!e)return;let n=window.HTMLSelectElement.prototype,r=Object.getOwnPropertyDescriptor(n,`value`).set;if(o!==t&&r){let n=new Event(`change`,{bubbles:!0});r.call(e,t),e.dispatchEvent(n)}},[o,t]),(0,R.jsx)(x.select,{...n,style:{...ue,...n.style},ref:a,defaultValue:t})});ft.displayName=dt;function pt(e){return e===``||e===void 0}function mt(e){let t=ce(e),n=L.useRef(``),r=L.useRef(0),i=L.useCallback(e=>{let i=n.current+e;t(i),(function e(t){n.current=t,window.clearTimeout(r.current),t!==``&&(r.current=window.setTimeout(()=>e(``),1e3))})(i)},[t]),a=L.useCallback(()=>{n.current=``,window.clearTimeout(r.current)},[]);return L.useEffect(()=>()=>window.clearTimeout(r.current),[]),[n,i,a]}function ht(e,t,n){let r=t.length>1&&Array.from(t).every(e=>e===t[0])?t[0]:t,i=n?e.indexOf(n):-1,a=gt(e,Math.max(i,0));r.length===1&&(a=a.filter(e=>e!==n));let o=a.find(e=>e.textValue.toLowerCase().startsWith(r.toLowerCase()));return o===n?void 0:o}function gt(e,t){return e.map((n,r)=>e[(t+r)%e.length])}var _t=xe,vt=Ce,yt=Te,bt=De,xt=ke,St=Ae,Ct=He,wt=Qe,Tt=$e,Et=tt,Dt=rt,Ot=at;function q({...e}){return(0,R.jsx)(_t,{"data-slot":`select`,...e})}function J({...e}){return(0,R.jsx)(yt,{"data-slot":`select-value`,...e})}function Y({className:e,size:t=`default`,children:r,...i}){return(0,R.jsxs)(vt,{"data-slot":`select-trigger`,"data-size":t,className:n(`flex w-fit items-center justify-between gap-1.5 rounded-lg border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,e),...i,children:[r,(0,R.jsx)(bt,{asChild:!0,children:(0,R.jsx)(f,{className:`pointer-events-none size-4 text-muted-foreground`})})]})}function X({className:e,children:t,position:r=`item-aligned`,align:i=`center`,...a}){return(0,R.jsx)(xt,{children:(0,R.jsxs)(St,{"data-slot":`select-content`,"data-align-trigger":r===`item-aligned`,className:n(`relative z-50 max-h-(--radix-select-content-available-height) min-w-36 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95`,r===`popper`&&`data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1`,e),position:r,align:i,...a,children:[(0,R.jsx)(kt,{}),(0,R.jsx)(Ct,{"data-position":r,className:n(`data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)`,r===`popper`&&``),children:t}),(0,R.jsx)(At,{})]})})}function Z({className:e,children:t,...r}){return(0,R.jsxs)(wt,{"data-slot":`select-item`,className:n(`relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2`,e),...r,children:[(0,R.jsx)(`span`,{className:`pointer-events-none absolute right-2 flex size-4 items-center justify-center`,children:(0,R.jsx)(Et,{children:(0,R.jsx)(u,{className:`pointer-events-none`})})}),(0,R.jsx)(Tt,{children:t})]})}function kt({className:e,...t}){return(0,R.jsx)(Dt,{"data-slot":`select-scroll-up-button`,className:n(`z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4`,e),...t,children:(0,R.jsx)(s,{})})}function At({className:e,...t}){return(0,R.jsx)(Ot,{"data-slot":`select-scroll-down-button`,className:n(`z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4`,e),...t,children:(0,R.jsx)(f,{})})}var jt=[`claude`,`codex`];function Mt(){let[e,n]=(0,L.useState)({}),[i,a]=(0,L.useState)(`claude`),[o,s]=(0,L.useState)(``);(0,L.useEffect)(()=>{t(`GET`,`/providers/config`).then(n).catch(e=>s(e.message))},[]);let u=e[i],d=t=>{u&&n({...e,[i]:{...u,...t}})};async function f(){if(!u)return;let r=await t(`PUT`,`/providers/${i}/config`,u);n({...e,[i]:r}),s(`${i} saved`)}async function p(){let e=await t(`POST`,`/providers/${i}/config/test`);s(e.ok?`${i} command: ${e.path||`found`}`:e.error||`command not found`)}return(0,R.jsxs)(`div`,{className:`space-y-4`,children:[(0,R.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`h1`,{className:`text-xl font-semibold`,children:`Settings`}),(0,R.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Provider runner configuration`})]}),(0,R.jsx)(`div`,{className:`flex gap-2`,children:jt.map(e=>(0,R.jsxs)(P,{variant:i===e?`default`:`outline`,onClick:()=>a(e),children:[(0,R.jsx)(c,{className:`w-4 h-4`}),e]},e))})]}),u&&(0,R.jsxs)(`div`,{className:`grid gap-4 lg:grid-cols-[minmax(0,1fr)_minmax(280px,360px)]`,children:[(0,R.jsxs)(`section`,{className:`space-y-3`,children:[(0,R.jsx)(Q,{label:`Command`,children:(0,R.jsx)(F,{value:u.command,onChange:e=>d({command:e.target.value})})}),(0,R.jsx)(Q,{label:`Default arguments`,children:(0,R.jsx)(I,{rows:3,value:u.defaultArgs.join(`
|
|
2
|
-
`),onChange:e=>
|
|
3
|
-
`),onChange:e=>
|
|
4
|
-
`),onChange:e=>
|
|
5
|
-
`),onChange:e=>
|
|
1
|
+
import{r as e}from"./chunk-CilyBKbf.js";import{An as t,Hn as n,O as r,On as i,c as a,dn as o,en as s,g as c,h as l,in as u,jn as d,rn as f,vt as p,wt as m}from"./lucide-react-DLQFnqNm.js";import{t as h}from"./react-dom-CzfKBOnw.js";import{c as g,o as _,t as v}from"./store-CMUFZKxf.js";import{o as y,r as b}from"./dist-BQ52MnS1.js";import{t as x}from"./dist-DRlgXPi_.js";import{i as S,n as C,t as w}from"./dist-SqFV12iO.js";import{a as T,i as E,n as D,o as O,r as ee,t as k}from"./dist-CrBurS6i.js";import{t as A}from"./dist-BgfF2Rlm.js";import{a as te,i as ne,n as re,o as ie,r as ae,s as j,t as oe}from"./es2015-iucXYTIE.js";import{t as se}from"./dist-CnJzBTp1.js";import{t as ce}from"./dist-D6iXJzms.js";import{r as M,t as N}from"./switch-W2_mhdrR.js";import{t as le}from"./dist-CVTST7Gc.js";import{t as P}from"./button-BsMqBNJb.js";import{t as F}from"./input-dPzf0luy.js";import{r as I,z as ue}from"./index-DdB6SVZY.js";var L=e(n(),1),de=e(h(),1),R=t(),fe=[` `,`Enter`,`ArrowUp`,`ArrowDown`],pe=[` `,`Enter`],z=`Select`,[me,B,he]=O(z),[V,ge]=S(z,[he,T]),_e=T(),[ve,H]=V(z),[ye,be]=V(z),xe=e=>{let{__scopeSelect:t,children:n,open:r,defaultOpen:i,onOpenChange:a,value:o,defaultValue:s,onValueChange:c,dir:l,name:u,autoComplete:d,disabled:f,required:p,form:m}=e,h=_e(t),[g,_]=L.useState(null),[v,y]=L.useState(null),[b,x]=L.useState(!1),S=se(l),[C,w]=A({prop:r,defaultProp:i??!1,onChange:a,caller:z}),[T,D]=A({prop:o,defaultProp:s,onChange:c,caller:z}),O=L.useRef(null),ee=g?m||!!g.closest(`form`):!0,[k,te]=L.useState(new Set),ne=Array.from(k).map(e=>e.props.value).join(`;`);return(0,R.jsx)(E,{...h,children:(0,R.jsxs)(ve,{required:p,scope:t,trigger:g,onTriggerChange:_,valueNode:v,onValueNodeChange:y,valueNodeHasChildren:b,onValueNodeHasChildrenChange:x,contentId:j(),value:T,onValueChange:D,open:C,onOpenChange:w,dir:S,triggerPointerDownPosRef:O,disabled:f,children:[(0,R.jsx)(me.Provider,{scope:t,children:(0,R.jsx)(ye,{scope:e.__scopeSelect,onNativeOptionAdd:L.useCallback(e=>{te(t=>new Set(t).add(e))},[]),onNativeOptionRemove:L.useCallback(e=>{te(t=>{let n=new Set(t);return n.delete(e),n})},[]),children:n})}),ee?(0,R.jsxs)(ft,{"aria-hidden":!0,required:p,tabIndex:-1,name:u,autoComplete:d,value:T,onChange:e=>D(e.target.value),disabled:f,form:m,children:[T===void 0?(0,R.jsx)(`option`,{value:``}):null,Array.from(k)]},ne):null]})})};xe.displayName=z;var Se=`SelectTrigger`,Ce=L.forwardRef((e,t)=>{let{__scopeSelect:n,disabled:r=!1,...i}=e,a=_e(n),o=H(Se,n),s=o.disabled||r,c=y(t,o.onTriggerChange),l=B(n),u=L.useRef(`touch`),[d,f,p]=mt(e=>{let t=l().filter(e=>!e.disabled),n=ht(t,e,t.find(e=>e.value===o.value));n!==void 0&&o.onValueChange(n.value)}),m=e=>{s||(o.onOpenChange(!0),p()),e&&(o.triggerPointerDownPosRef.current={x:Math.round(e.pageX),y:Math.round(e.pageY)})};return(0,R.jsx)(k,{asChild:!0,...a,children:(0,R.jsx)(x.button,{type:`button`,role:`combobox`,"aria-controls":o.contentId,"aria-expanded":o.open,"aria-required":o.required,"aria-autocomplete":`none`,dir:o.dir,"data-state":o.open?`open`:`closed`,disabled:s,"data-disabled":s?``:void 0,"data-placeholder":pt(o.value)?``:void 0,...i,ref:c,onClick:C(i.onClick,e=>{e.currentTarget.focus(),u.current!==`mouse`&&m(e)}),onPointerDown:C(i.onPointerDown,e=>{u.current=e.pointerType;let t=e.target;t.hasPointerCapture(e.pointerId)&&t.releasePointerCapture(e.pointerId),e.button===0&&e.ctrlKey===!1&&e.pointerType===`mouse`&&(m(e),e.preventDefault())}),onKeyDown:C(i.onKeyDown,e=>{let t=d.current!==``;!(e.ctrlKey||e.altKey||e.metaKey)&&e.key.length===1&&f(e.key),!(t&&e.key===` `)&&fe.includes(e.key)&&(m(),e.preventDefault())})})})});Ce.displayName=Se;var we=`SelectValue`,Te=L.forwardRef((e,t)=>{let{__scopeSelect:n,className:r,style:i,children:a,placeholder:o=``,...s}=e,c=H(we,n),{onValueNodeHasChildrenChange:l}=c,u=a!==void 0,d=y(t,c.onValueNodeChange);return w(()=>{l(u)},[l,u]),(0,R.jsx)(x.span,{...s,ref:d,style:{pointerEvents:`none`},children:pt(c.value)?(0,R.jsx)(R.Fragment,{children:o}):a})});Te.displayName=we;var Ee=`SelectIcon`,De=L.forwardRef((e,t)=>{let{__scopeSelect:n,children:r,...i}=e;return(0,R.jsx)(x.span,{"aria-hidden":!0,...i,ref:t,children:r||`▼`})});De.displayName=Ee;var Oe=`SelectPortal`,ke=e=>(0,R.jsx)(ne,{asChild:!0,...e});ke.displayName=Oe;var U=`SelectContent`,Ae=L.forwardRef((e,t)=>{let n=H(U,e.__scopeSelect),[r,i]=L.useState();if(w(()=>{i(new DocumentFragment)},[]),!n.open){let t=r;return t?de.createPortal((0,R.jsx)(je,{scope:e.__scopeSelect,children:(0,R.jsx)(me.Slot,{scope:e.__scopeSelect,children:(0,R.jsx)(`div`,{children:e.children})})}),t):null}return(0,R.jsx)(Pe,{...e,ref:t})});Ae.displayName=U;var W=10,[je,G]=V(U),Me=`SelectContentImpl`,Ne=b(`SelectContent.RemoveScroll`),Pe=L.forwardRef((e,t)=>{let{__scopeSelect:n,position:r=`item-aligned`,onCloseAutoFocus:i,onEscapeKeyDown:a,onPointerDownOutside:o,side:s,sideOffset:c,align:l,alignOffset:u,arrowPadding:d,collisionBoundary:f,collisionPadding:p,sticky:m,hideWhenDetached:h,avoidCollisions:g,..._}=e,v=H(U,n),[b,x]=L.useState(null),[S,w]=L.useState(null),T=y(t,e=>x(e)),[E,D]=L.useState(null),[O,ee]=L.useState(null),k=B(n),[A,ne]=L.useState(!1),j=L.useRef(!1);L.useEffect(()=>{if(b)return oe(b)},[b]),ae();let se=L.useCallback(e=>{let[t,...n]=k().map(e=>e.ref.current),[r]=n.slice(-1),i=document.activeElement;for(let n of e)if(n===i||(n?.scrollIntoView({block:`nearest`}),n===t&&S&&(S.scrollTop=0),n===r&&S&&(S.scrollTop=S.scrollHeight),n?.focus(),document.activeElement!==i))return},[k,S]),ce=L.useCallback(()=>se([E,b]),[se,E,b]);L.useEffect(()=>{A&&ce()},[A,ce]);let{onOpenChange:M,triggerPointerDownPosRef:N}=v;L.useEffect(()=>{if(b){let e={x:0,y:0},t=t=>{e={x:Math.abs(Math.round(t.pageX)-(N.current?.x??0)),y:Math.abs(Math.round(t.pageY)-(N.current?.y??0))}},n=n=>{e.x<=10&&e.y<=10?n.preventDefault():b.contains(n.target)||M(!1),document.removeEventListener(`pointermove`,t),N.current=null};return N.current!==null&&(document.addEventListener(`pointermove`,t),document.addEventListener(`pointerup`,n,{capture:!0,once:!0})),()=>{document.removeEventListener(`pointermove`,t),document.removeEventListener(`pointerup`,n,{capture:!0})}}},[b,M,N]),L.useEffect(()=>{let e=()=>M(!1);return window.addEventListener(`blur`,e),window.addEventListener(`resize`,e),()=>{window.removeEventListener(`blur`,e),window.removeEventListener(`resize`,e)}},[M]);let[le,P]=mt(e=>{let t=k().filter(e=>!e.disabled),n=ht(t,e,t.find(e=>e.ref.current===document.activeElement));n&&setTimeout(()=>n.ref.current.focus())}),F=L.useCallback((e,t,n)=>{let r=!j.current&&!n;(v.value!==void 0&&v.value===t||r)&&(D(e),r&&(j.current=!0))},[v.value]),I=L.useCallback(()=>b?.focus(),[b]),ue=L.useCallback((e,t,n)=>{let r=!j.current&&!n;(v.value!==void 0&&v.value===t||r)&&ee(e)},[v.value]),de=r===`popper`?Re:Ie,fe=de===Re?{side:s,sideOffset:c,align:l,alignOffset:u,arrowPadding:d,collisionBoundary:f,collisionPadding:p,sticky:m,hideWhenDetached:h,avoidCollisions:g}:{};return(0,R.jsx)(je,{scope:n,content:b,viewport:S,onViewportChange:w,itemRefCallback:F,selectedItem:E,onItemLeave:I,itemTextRefCallback:ue,focusSelectedItem:ce,selectedItemText:O,position:r,isPositioned:A,searchRef:le,children:(0,R.jsx)(re,{as:Ne,allowPinchZoom:!0,children:(0,R.jsx)(te,{asChild:!0,trapped:v.open,onMountAutoFocus:e=>{e.preventDefault()},onUnmountAutoFocus:C(i,e=>{v.trigger?.focus({preventScroll:!0}),e.preventDefault()}),children:(0,R.jsx)(ie,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:a,onPointerDownOutside:o,onFocusOutside:e=>e.preventDefault(),onDismiss:()=>v.onOpenChange(!1),children:(0,R.jsx)(de,{role:`listbox`,id:v.contentId,"data-state":v.open?`open`:`closed`,dir:v.dir,onContextMenu:e=>e.preventDefault(),..._,...fe,onPlaced:()=>ne(!0),ref:T,style:{display:`flex`,flexDirection:`column`,outline:`none`,..._.style},onKeyDown:C(_.onKeyDown,e=>{let t=e.ctrlKey||e.altKey||e.metaKey;if(e.key===`Tab`&&e.preventDefault(),!t&&e.key.length===1&&P(e.key),[`ArrowUp`,`ArrowDown`,`Home`,`End`].includes(e.key)){let t=k().filter(e=>!e.disabled).map(e=>e.ref.current);if([`ArrowUp`,`End`].includes(e.key)&&(t=t.slice().reverse()),[`ArrowUp`,`ArrowDown`].includes(e.key)){let n=e.target,r=t.indexOf(n);t=t.slice(r+1)}setTimeout(()=>se(t)),e.preventDefault()}})})})})})})});Pe.displayName=Me;var Fe=`SelectItemAlignedPosition`,Ie=L.forwardRef((e,t)=>{let{__scopeSelect:n,onPlaced:r,...i}=e,a=H(U,n),o=G(U,n),[s,c]=L.useState(null),[l,u]=L.useState(null),d=y(t,e=>u(e)),f=B(n),p=L.useRef(!1),m=L.useRef(!0),{viewport:h,selectedItem:g,selectedItemText:_,focusSelectedItem:v}=o,b=L.useCallback(()=>{if(a.trigger&&a.valueNode&&s&&l&&h&&g&&_){let e=a.trigger.getBoundingClientRect(),t=l.getBoundingClientRect(),n=a.valueNode.getBoundingClientRect(),i=_.getBoundingClientRect();if(a.dir!==`rtl`){let r=i.left-t.left,a=n.left-r,o=e.left-a,c=e.width+o,l=Math.max(c,t.width),u=window.innerWidth-W,d=le(a,[W,Math.max(W,u-l)]);s.style.minWidth=c+`px`,s.style.left=d+`px`}else{let r=t.right-i.right,a=window.innerWidth-n.right-r,o=window.innerWidth-e.right-a,c=e.width+o,l=Math.max(c,t.width),u=window.innerWidth-W,d=le(a,[W,Math.max(W,u-l)]);s.style.minWidth=c+`px`,s.style.right=d+`px`}let o=f(),c=window.innerHeight-W*2,u=h.scrollHeight,d=window.getComputedStyle(l),m=parseInt(d.borderTopWidth,10),v=parseInt(d.paddingTop,10),y=parseInt(d.borderBottomWidth,10),b=parseInt(d.paddingBottom,10),x=m+v+u+b+y,S=Math.min(g.offsetHeight*5,x),C=window.getComputedStyle(h),w=parseInt(C.paddingTop,10),T=parseInt(C.paddingBottom,10),E=e.top+e.height/2-W,D=c-E,O=g.offsetHeight/2,ee=g.offsetTop+O,k=m+v+ee,A=x-k;if(k<=E){let e=o.length>0&&g===o[o.length-1].ref.current;s.style.bottom=`0px`;let t=l.clientHeight-h.offsetTop-h.offsetHeight,n=k+Math.max(D,O+(e?T:0)+t+y);s.style.height=n+`px`}else{let e=o.length>0&&g===o[0].ref.current;s.style.top=`0px`;let t=Math.max(E,m+h.offsetTop+(e?w:0)+O)+A;s.style.height=t+`px`,h.scrollTop=k-E+h.offsetTop}s.style.margin=`${W}px 0`,s.style.minHeight=S+`px`,s.style.maxHeight=c+`px`,r?.(),requestAnimationFrame(()=>p.current=!0)}},[f,a.trigger,a.valueNode,s,l,h,g,_,a.dir,r]);w(()=>b(),[b]);let[S,C]=L.useState();return w(()=>{l&&C(window.getComputedStyle(l).zIndex)},[l]),(0,R.jsx)(ze,{scope:n,contentWrapper:s,shouldExpandOnScrollRef:p,onScrollButtonChange:L.useCallback(e=>{e&&m.current===!0&&(b(),v?.(),m.current=!1)},[b,v]),children:(0,R.jsx)(`div`,{ref:c,style:{display:`flex`,flexDirection:`column`,position:`fixed`,zIndex:S},children:(0,R.jsx)(x.div,{...i,ref:d,style:{boxSizing:`border-box`,maxHeight:`100%`,...i.style}})})})});Ie.displayName=Fe;var Le=`SelectPopperPosition`,Re=L.forwardRef((e,t)=>{let{__scopeSelect:n,align:r=`start`,collisionPadding:i=W,...a}=e,o=_e(n);return(0,R.jsx)(ee,{...o,...a,ref:t,align:r,collisionPadding:i,style:{boxSizing:`border-box`,...a.style,"--radix-select-content-transform-origin":`var(--radix-popper-transform-origin)`,"--radix-select-content-available-width":`var(--radix-popper-available-width)`,"--radix-select-content-available-height":`var(--radix-popper-available-height)`,"--radix-select-trigger-width":`var(--radix-popper-anchor-width)`,"--radix-select-trigger-height":`var(--radix-popper-anchor-height)`}})});Re.displayName=Le;var[ze,Be]=V(U,{}),Ve=`SelectViewport`,He=L.forwardRef((e,t)=>{let{__scopeSelect:n,nonce:r,...i}=e,a=G(Ve,n),o=Be(Ve,n),s=y(t,a.onViewportChange),c=L.useRef(0);return(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`style`,{dangerouslySetInnerHTML:{__html:`[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}`},nonce:r}),(0,R.jsx)(me.Slot,{scope:n,children:(0,R.jsx)(x.div,{"data-radix-select-viewport":``,role:`presentation`,...i,ref:s,style:{position:`relative`,flex:1,overflow:`hidden auto`,...i.style},onScroll:C(i.onScroll,e=>{let t=e.currentTarget,{contentWrapper:n,shouldExpandOnScrollRef:r}=o;if(r?.current&&n){let e=Math.abs(c.current-t.scrollTop);if(e>0){let r=window.innerHeight-W*2,i=parseFloat(n.style.minHeight),a=parseFloat(n.style.height),o=Math.max(i,a);if(o<r){let i=o+e,a=Math.min(r,i),s=i-a;n.style.height=a+`px`,n.style.bottom===`0px`&&(t.scrollTop=s>0?s:0,n.style.justifyContent=`flex-end`)}}}c.current=t.scrollTop})})})]})});He.displayName=Ve;var Ue=`SelectGroup`,[We,Ge]=V(Ue),Ke=L.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e,i=j();return(0,R.jsx)(We,{scope:n,id:i,children:(0,R.jsx)(x.div,{role:`group`,"aria-labelledby":i,...r,ref:t})})});Ke.displayName=Ue;var qe=`SelectLabel`,Je=L.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e,i=Ge(qe,n);return(0,R.jsx)(x.div,{id:i.id,...r,ref:t})});Je.displayName=qe;var Ye=`SelectItem`,[Xe,Ze]=V(Ye),Qe=L.forwardRef((e,t)=>{let{__scopeSelect:n,value:r,disabled:i=!1,textValue:a,...o}=e,s=H(Ye,n),c=G(Ye,n),l=s.value===r,[u,d]=L.useState(a??``),[f,p]=L.useState(!1),m=y(t,e=>c.itemRefCallback?.(e,r,i)),h=j(),g=L.useRef(`touch`),_=()=>{i||(s.onValueChange(r),s.onOpenChange(!1))};if(r===``)throw Error(`A <Select.Item /> must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder.`);return(0,R.jsx)(Xe,{scope:n,value:r,disabled:i,textId:h,isSelected:l,onItemTextChange:L.useCallback(e=>{d(t=>t||(e?.textContent??``).trim())},[]),children:(0,R.jsx)(me.ItemSlot,{scope:n,value:r,disabled:i,textValue:u,children:(0,R.jsx)(x.div,{role:`option`,"aria-labelledby":h,"data-highlighted":f?``:void 0,"aria-selected":l&&f,"data-state":l?`checked`:`unchecked`,"aria-disabled":i||void 0,"data-disabled":i?``:void 0,tabIndex:i?void 0:-1,...o,ref:m,onFocus:C(o.onFocus,()=>p(!0)),onBlur:C(o.onBlur,()=>p(!1)),onClick:C(o.onClick,()=>{g.current!==`mouse`&&_()}),onPointerUp:C(o.onPointerUp,()=>{g.current===`mouse`&&_()}),onPointerDown:C(o.onPointerDown,e=>{g.current=e.pointerType}),onPointerMove:C(o.onPointerMove,e=>{g.current=e.pointerType,i?c.onItemLeave?.():g.current===`mouse`&&e.currentTarget.focus({preventScroll:!0})}),onPointerLeave:C(o.onPointerLeave,e=>{e.currentTarget===document.activeElement&&c.onItemLeave?.()}),onKeyDown:C(o.onKeyDown,e=>{c.searchRef?.current!==``&&e.key===` `||(pe.includes(e.key)&&_(),e.key===` `&&e.preventDefault())})})})})});Qe.displayName=Ye;var K=`SelectItemText`,$e=L.forwardRef((e,t)=>{let{__scopeSelect:n,className:r,style:i,...a}=e,o=H(K,n),s=G(K,n),c=Ze(K,n),l=be(K,n),[u,d]=L.useState(null),f=y(t,e=>d(e),c.onItemTextChange,e=>s.itemTextRefCallback?.(e,c.value,c.disabled)),p=u?.textContent,m=L.useMemo(()=>(0,R.jsx)(`option`,{value:c.value,disabled:c.disabled,children:p},c.value),[c.disabled,c.value,p]),{onNativeOptionAdd:h,onNativeOptionRemove:g}=l;return w(()=>(h(m),()=>g(m)),[h,g,m]),(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(x.span,{id:c.textId,...a,ref:f}),c.isSelected&&o.valueNode&&!o.valueNodeHasChildren?de.createPortal(a.children,o.valueNode):null]})});$e.displayName=K;var et=`SelectItemIndicator`,tt=L.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e;return Ze(et,n).isSelected?(0,R.jsx)(x.span,{"aria-hidden":!0,...r,ref:t}):null});tt.displayName=et;var nt=`SelectScrollUpButton`,rt=L.forwardRef((e,t)=>{let n=G(nt,e.__scopeSelect),r=Be(nt,e.__scopeSelect),[i,a]=L.useState(!1),o=y(t,r.onScrollButtonChange);return w(()=>{if(n.viewport&&n.isPositioned){let e=function(){a(t.scrollTop>0)},t=n.viewport;return e(),t.addEventListener(`scroll`,e),()=>t.removeEventListener(`scroll`,e)}},[n.viewport,n.isPositioned]),i?(0,R.jsx)(ot,{...e,ref:o,onAutoScroll:()=>{let{viewport:e,selectedItem:t}=n;e&&t&&(e.scrollTop-=t.offsetHeight)}}):null});rt.displayName=nt;var it=`SelectScrollDownButton`,at=L.forwardRef((e,t)=>{let n=G(it,e.__scopeSelect),r=Be(it,e.__scopeSelect),[i,a]=L.useState(!1),o=y(t,r.onScrollButtonChange);return w(()=>{if(n.viewport&&n.isPositioned){let e=function(){let e=t.scrollHeight-t.clientHeight;a(Math.ceil(t.scrollTop)<e)},t=n.viewport;return e(),t.addEventListener(`scroll`,e),()=>t.removeEventListener(`scroll`,e)}},[n.viewport,n.isPositioned]),i?(0,R.jsx)(ot,{...e,ref:o,onAutoScroll:()=>{let{viewport:e,selectedItem:t}=n;e&&t&&(e.scrollTop+=t.offsetHeight)}}):null});at.displayName=it;var ot=L.forwardRef((e,t)=>{let{__scopeSelect:n,onAutoScroll:r,...i}=e,a=G(`SelectScrollButton`,n),o=L.useRef(null),s=B(n),c=L.useCallback(()=>{o.current!==null&&(window.clearInterval(o.current),o.current=null)},[]);return L.useEffect(()=>()=>c(),[c]),w(()=>{s().find(e=>e.ref.current===document.activeElement)?.ref.current?.scrollIntoView({block:`nearest`})},[s]),(0,R.jsx)(x.div,{"aria-hidden":!0,...i,ref:t,style:{flexShrink:0,...i.style},onPointerDown:C(i.onPointerDown,()=>{o.current===null&&(o.current=window.setInterval(r,50))}),onPointerMove:C(i.onPointerMove,()=>{a.onItemLeave?.(),o.current===null&&(o.current=window.setInterval(r,50))}),onPointerLeave:C(i.onPointerLeave,()=>{c()})})}),st=`SelectSeparator`,ct=L.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e;return(0,R.jsx)(x.div,{"aria-hidden":!0,...r,ref:t})});ct.displayName=st;var lt=`SelectArrow`,ut=L.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e,i=_e(n),a=H(lt,n),o=G(lt,n);return a.open&&o.position===`popper`?(0,R.jsx)(D,{...i,...r,ref:t}):null});ut.displayName=lt;var dt=`SelectBubbleInput`,ft=L.forwardRef(({__scopeSelect:e,value:t,...n},r)=>{let i=L.useRef(null),a=y(r,i),o=M(t);return L.useEffect(()=>{let e=i.current;if(!e)return;let n=window.HTMLSelectElement.prototype,r=Object.getOwnPropertyDescriptor(n,`value`).set;if(o!==t&&r){let n=new Event(`change`,{bubbles:!0});r.call(e,t),e.dispatchEvent(n)}},[o,t]),(0,R.jsx)(x.select,{...n,style:{...ue,...n.style},ref:a,defaultValue:t})});ft.displayName=dt;function pt(e){return e===``||e===void 0}function mt(e){let t=ce(e),n=L.useRef(``),r=L.useRef(0),i=L.useCallback(e=>{let i=n.current+e;t(i),(function e(t){n.current=t,window.clearTimeout(r.current),t!==``&&(r.current=window.setTimeout(()=>e(``),1e3))})(i)},[t]),a=L.useCallback(()=>{n.current=``,window.clearTimeout(r.current)},[]);return L.useEffect(()=>()=>window.clearTimeout(r.current),[]),[n,i,a]}function ht(e,t,n){let r=t.length>1&&Array.from(t).every(e=>e===t[0])?t[0]:t,i=n?e.indexOf(n):-1,a=gt(e,Math.max(i,0));r.length===1&&(a=a.filter(e=>e!==n));let o=a.find(e=>e.textValue.toLowerCase().startsWith(r.toLowerCase()));return o===n?void 0:o}function gt(e,t){return e.map((n,r)=>e[(t+r)%e.length])}var _t=xe,vt=Ce,yt=Te,bt=De,xt=ke,St=Ae,Ct=He,wt=Qe,Tt=$e,Et=tt,Dt=rt,Ot=at;function q({...e}){return(0,R.jsx)(_t,{"data-slot":`select`,...e})}function J({...e}){return(0,R.jsx)(yt,{"data-slot":`select-value`,...e})}function Y({className:e,size:t=`default`,children:n,...r}){return(0,R.jsxs)(vt,{"data-slot":`select-trigger`,"data-size":t,className:i(`flex w-fit items-center justify-between gap-1.5 rounded-lg border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,e),...r,children:[n,(0,R.jsx)(bt,{asChild:!0,children:(0,R.jsx)(f,{className:`pointer-events-none size-4 text-muted-foreground`})})]})}function X({className:e,children:t,position:n=`item-aligned`,align:r=`center`,...a}){return(0,R.jsx)(xt,{children:(0,R.jsxs)(St,{"data-slot":`select-content`,"data-align-trigger":n===`item-aligned`,className:i(`relative z-50 max-h-(--radix-select-content-available-height) min-w-36 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95`,n===`popper`&&`data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1`,e),position:n,align:r,...a,children:[(0,R.jsx)(kt,{}),(0,R.jsx)(Ct,{"data-position":n,className:i(`data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)`,n===`popper`&&``),children:t}),(0,R.jsx)(At,{})]})})}function Z({className:e,children:t,...n}){return(0,R.jsxs)(wt,{"data-slot":`select-item`,className:i(`relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2`,e),...n,children:[(0,R.jsx)(`span`,{className:`pointer-events-none absolute right-2 flex size-4 items-center justify-center`,children:(0,R.jsx)(Et,{children:(0,R.jsx)(u,{className:`pointer-events-none`})})}),(0,R.jsx)(Tt,{children:t})]})}function kt({className:e,...t}){return(0,R.jsx)(Dt,{"data-slot":`select-scroll-up-button`,className:i(`z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4`,e),...t,children:(0,R.jsx)(s,{})})}function At({className:e,...t}){return(0,R.jsx)(Ot,{"data-slot":`select-scroll-down-button`,className:i(`z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4`,e),...t,children:(0,R.jsx)(f,{})})}var jt=[`claude`,`codex`];function Mt(){let[e,t]=(0,L.useState)({}),[n,i]=(0,L.useState)(`claude`),[a,o]=(0,L.useState)(``);(0,L.useEffect)(()=>{d(`GET`,`/providers/config`).then(t).catch(e=>o(e.message))},[]);let s=e[n],u=r=>{s&&t({...e,[n]:{...s,...r}})};async function f(){if(!s)return;let r=await d(`PUT`,`/providers/${n}/config`,s);t({...e,[n]:r}),o(`${n} saved`)}async function p(){let e=await d(`POST`,`/providers/${n}/config/test`);o(e.ok?`${n} command: ${e.path||`found`}`:e.error||`command not found`)}return(0,R.jsxs)(`div`,{className:`space-y-4`,children:[(0,R.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`h1`,{className:`text-xl font-semibold`,children:`Settings`}),(0,R.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Provider runner configuration`})]}),(0,R.jsx)(`div`,{className:`flex gap-2`,children:jt.map(e=>(0,R.jsxs)(P,{variant:n===e?`default`:`outline`,onClick:()=>i(e),children:[(0,R.jsx)(c,{className:`w-4 h-4`}),e]},e))})]}),s&&(0,R.jsxs)(`div`,{className:`grid gap-4 lg:grid-cols-[minmax(0,1fr)_minmax(280px,360px)]`,children:[(0,R.jsxs)(`section`,{className:`space-y-3`,children:[(0,R.jsx)(Q,{label:`Command`,children:(0,R.jsx)(F,{value:s.command,onChange:e=>u({command:e.target.value})})}),(0,R.jsx)(Q,{label:`Default arguments`,children:(0,R.jsx)(I,{rows:3,value:s.defaultArgs.join(`
|
|
2
|
+
`),onChange:e=>u({defaultArgs:$(e.target.value)})})}),(0,R.jsx)(Q,{label:`Plugin directories`,children:(0,R.jsx)(I,{rows:3,value:s.pluginDirs.join(`
|
|
3
|
+
`),onChange:e=>u({pluginDirs:$(e.target.value)})})}),(0,R.jsx)(Q,{label:`Environment`,children:(0,R.jsx)(I,{rows:5,value:Bt(s.env),onChange:e=>u({env:Vt(e.target.value)})})})]}),(0,R.jsxs)(`section`,{className:`space-y-3`,children:[(0,R.jsx)(Q,{label:`Capabilities`,children:(0,R.jsx)(I,{rows:3,value:s.defaultCapabilities.join(`
|
|
4
|
+
`),onChange:e=>u({defaultCapabilities:$(e.target.value)})})}),(0,R.jsx)(Q,{label:`Tags`,children:(0,R.jsx)(I,{rows:3,value:s.defaultTags.join(`
|
|
5
|
+
`),onChange:e=>u({defaultTags:$(e.target.value)})})}),(0,R.jsx)(Q,{label:`Approval mode`,children:(0,R.jsx)(F,{value:s.defaultApprovalMode,onChange:e=>u({defaultApprovalMode:e.target.value})})}),(0,R.jsx)(Q,{label:`Chat capture mode`,children:(0,R.jsxs)(q,{value:s.chatCaptureMode??`final`,onValueChange:e=>u({chatCaptureMode:e}),children:[(0,R.jsx)(Y,{children:(0,R.jsx)(J,{})}),(0,R.jsxs)(X,{children:[(0,R.jsx)(Z,{value:`final`,children:`Final response only`}),(0,R.jsx)(Z,{value:`full`,children:`Full turn (intermediate messages)`})]})]})}),(0,R.jsx)(Q,{label:`tmux prefix`,children:(0,R.jsx)(F,{value:s.headless.tmuxPrefix,onChange:e=>u({headless:{...s.headless,tmuxPrefix:e.target.value}})})}),(0,R.jsx)(Q,{label:`Shutdown timeout`,children:(0,R.jsx)(F,{type:`number`,value:s.headless.shutdownTimeoutMs,onChange:e=>u({headless:{...s.headless,shutdownTimeoutMs:Number(e.target.value)||1e4}})})}),(0,R.jsxs)(`div`,{className:`flex gap-2 pt-2`,children:[(0,R.jsxs)(P,{onClick:f,children:[(0,R.jsx)(r,{className:`w-4 h-4`}),`Save`]}),(0,R.jsxs)(P,{variant:`outline`,onClick:p,children:[(0,R.jsx)(l,{className:`w-4 h-4`}),`Test`]})]}),a&&(0,R.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:a})]})]}),(0,R.jsx)(Ft,{}),(0,R.jsx)(Pt,{}),(0,R.jsx)(zt,{}),(0,R.jsx)(It,{})]})}var Nt={symlinkPaths:[]};function Pt(){let[e,t]=(0,L.useState)(Nt),[n,i]=(0,L.useState)(``);(0,L.useEffect)(()=>{d(`GET`,`/workspace-config`).then(e=>t({...Nt,...e.value})).catch(e=>i(e.message))},[]);async function a(){try{let n=await d(`PUT`,`/workspace-config`,e);t({...Nt,...n.value}),i(`Workspace config saved`)}catch(e){i(e.message)}}return(0,R.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,R.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,R.jsx)(m,{className:`w-4 h-4`}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Isolated worktree symlinks`}),(0,R.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Untracked files or filename patterns symlinked from main into each isolated worktree (the "Workspace" spawn option), one per line. Plain names like `,(0,R.jsx)(`code`,{children:`AGENTS.md`}),` or `,(0,R.jsx)(`code`,{children:`.claude-rig`}),` match files and directories; entries with `,(0,R.jsxs)(`code`,{children:[`*?[]`,`{}`]}),` are expanded as globs. A path is only linked if it exists in main.`]})]})]}),(0,R.jsx)(Q,{label:`Paths / patterns`,children:(0,R.jsx)(I,{rows:5,placeholder:`AGENTS.md
|
|
6
6
|
.claude-rig`,value:e.symlinkPaths.join(`
|
|
7
|
-
`),onChange:t
|
|
7
|
+
`),onChange:n=>t({...e,symlinkPaths:$(n.target.value)})})}),(0,R.jsxs)(`div`,{className:`flex items-center gap-2 pt-1`,children:[(0,R.jsxs)(P,{onClick:a,children:[(0,R.jsx)(r,{className:`w-4 h-4`}),`Save`]}),n&&(0,R.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:n})]})]})}function Ft(){let e=v(e=>e.showReasoning),t=v(e=>e.set);return(0,R.jsx)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:(0,R.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,R.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,R.jsx)(o,{className:`w-4 h-4`}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Show reasoning details`}),(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Show the agent's internal thinking inline in chat, alongside its narration and tool steps. Off by default — narration is always shown either way.`})]})]}),(0,R.jsx)(N,{checked:e,onCheckedChange:e=>t({showReasoning:e})})]})})}function It(){let e=v(e=>e.voiceTtsEnabled),t=v(e=>e.setVoiceTtsEnabled),n=v(e=>e.voiceTtsMode),r=v(e=>e.setVoiceTtsMode),i=v(e=>e.voiceTtsKokoroVoice),o=v(e=>e.setVoiceTtsKokoroVoice),s=v(e=>e.voiceTtsBrowserVoice),c=v(e=>e.setVoiceTtsBrowserVoice),l=v(e=>e.voiceInputMode),u=v(e=>e.setVoiceInputMode),[d,f]=(0,L.useState)(()=>g());(0,L.useEffect)(()=>{if(typeof window>`u`||!(`speechSynthesis`in window))return;let e=()=>f(g());return e(),window.speechSynthesis.addEventListener?.(`voiceschanged`,e),()=>window.speechSynthesis.removeEventListener?.(`voiceschanged`,e)},[]);let p=_.some(e=>e.id===i)?_:[..._,{id:i,label:i}];return(0,R.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,R.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,R.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,R.jsx)(a,{className:`w-4 h-4`}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Voice`}),(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Speak agent responses aloud in the active chat, and how push-to-talk behaves.`})]})]}),(0,R.jsx)(N,{checked:e,onCheckedChange:t})]}),(0,R.jsx)(Q,{label:`Speech engine`,children:(0,R.jsxs)(q,{value:n,onValueChange:e=>r(e),children:[(0,R.jsx)(Y,{children:(0,R.jsx)(J,{})}),(0,R.jsxs)(X,{children:[(0,R.jsx)(Z,{value:`kokoro`,children:`Kokoro (server, natural — falls back to browser)`}),(0,R.jsx)(Z,{value:`browser`,children:`Browser (Web Speech API)`})]})]})}),(0,R.jsx)(Q,{label:`Kokoro voice`,children:(0,R.jsxs)(q,{value:i,onValueChange:o,children:[(0,R.jsx)(Y,{children:(0,R.jsx)(J,{})}),(0,R.jsx)(X,{children:p.map(e=>(0,R.jsx)(Z,{value:e.id,children:e.label},e.id))})]})}),(0,R.jsx)(Q,{label:`Browser voice`,children:(0,R.jsxs)(q,{value:s||`__default__`,onValueChange:e=>c(e===`__default__`?``:e),children:[(0,R.jsx)(Y,{children:(0,R.jsx)(J,{})}),(0,R.jsxs)(X,{children:[(0,R.jsx)(Z,{value:`__default__`,children:`System default`}),d.map(e=>(0,R.jsx)(Z,{value:e.uri,children:e.label},e.uri))]})]})}),(0,R.jsx)(Q,{label:`Push-to-talk input`,children:(0,R.jsxs)(q,{value:l,onValueChange:e=>u(e),children:[(0,R.jsx)(Y,{children:(0,R.jsx)(J,{})}),(0,R.jsxs)(X,{children:[(0,R.jsx)(Z,{value:`compose`,children:`Fill the message box (review, then Enter)`}),(0,R.jsx)(Z,{value:`autosend`,children:`Send immediately (speak-and-send)`})]})]})})]})}var Lt=[`low`,`medium`,`high`,`xhigh`,`max`],Rt={enabled:!1,provider:`claude`,permissionMode:`open`,keepaliveSeconds:300};function zt(){let[e,t]=(0,L.useState)(Rt),[n,i]=(0,L.useState)(``);(0,L.useEffect)(()=>{d(`GET`,`/steward-config`).then(e=>t({...Rt,...e.value})).catch(e=>i(e.message))},[]);let a=e=>t(t=>({...t,...e}));async function o(){try{let n=await d(`PUT`,`/steward-config`,e);t({...Rt,...n.value}),i(`Steward config saved`)}catch(e){i(e.message)}}return(0,R.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,R.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,R.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,R.jsx)(p,{className:`w-4 h-4`}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Stewards`}),(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Auto-resolve merge conflicts & diverged branches across all repos. Provider-independent — applies to every repo's steward.`})]})]}),(0,R.jsx)(N,{checked:e.enabled,onCheckedChange:e=>a({enabled:e})})]}),(0,R.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,R.jsx)(Q,{label:`Provider`,children:(0,R.jsxs)(q,{value:e.provider,onValueChange:e=>a({provider:e}),children:[(0,R.jsx)(Y,{children:(0,R.jsx)(J,{})}),(0,R.jsx)(X,{children:jt.map(e=>(0,R.jsx)(Z,{value:e,children:e},e))})]})}),(0,R.jsx)(Q,{label:`Model (optional)`,children:(0,R.jsx)(F,{value:e.model??``,placeholder:`e.g. gpt-5.5`,onChange:e=>a({model:e.target.value.trim()||void 0})})}),(0,R.jsx)(Q,{label:`Effort`,children:(0,R.jsxs)(q,{value:e.effort??`default`,onValueChange:e=>a({effort:e===`default`?void 0:e}),children:[(0,R.jsx)(Y,{children:(0,R.jsx)(J,{})}),(0,R.jsxs)(X,{children:[(0,R.jsx)(Z,{value:`default`,children:`Provider default`}),Lt.map(e=>(0,R.jsx)(Z,{value:e,children:e},e))]})]})}),(0,R.jsx)(Q,{label:`Idle timeout (seconds)`,children:(0,R.jsx)(F,{type:`number`,value:e.keepaliveSeconds,onChange:e=>a({keepaliveSeconds:Number(e.target.value)||300})})})]}),(0,R.jsxs)(`div`,{className:`flex items-center gap-2 pt-1`,children:[(0,R.jsxs)(P,{onClick:o,children:[(0,R.jsx)(r,{className:`w-4 h-4`}),`Save`]}),n&&(0,R.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:n})]})]})}function Q({label:e,children:t}){return(0,R.jsxs)(`label`,{className:`block space-y-1.5 text-sm`,children:[(0,R.jsx)(`span`,{className:`text-muted-foreground`,children:e}),t]})}function $(e){return e.split(`
|
|
8
8
|
`).map(e=>e.trim()).filter(Boolean)}function Bt(e){return Object.entries(e).map(([e,t])=>`${e}=${t}`).join(`
|
|
9
9
|
`)}function Vt(e){return Object.fromEntries($(e).map(e=>{let t=e.indexOf(`=`);return t>=0?[e.slice(0,t).trim(),e.slice(t+1)]:[e,``]}))}export{Mt as SettingsView};
|
|
10
|
-
//# sourceMappingURL=settings-
|
|
10
|
+
//# sourceMappingURL=settings-RLyewdfK.js.map
|