@kafca/agentdock 0.1.41 → 0.1.42
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/README.md +6 -0
- package/dist/renderer/assets/{Badge-BX3RC8l6.js → Badge-D-WU4kUV.js} +1 -1
- package/dist/renderer/assets/{Chat-DJwIciel.js → Chat-BGkC5tAe.js} +1 -1
- package/dist/renderer/assets/{ChatMarkdown-DfGbRR0S.js → ChatMarkdown-CfbC1jRd.js} +1 -1
- package/dist/renderer/assets/{Config-2x2RDL3j.js → Config-qQb4bX5D.js} +1 -1
- package/dist/renderer/assets/{CronList-C6nPAmEo.js → CronList-CKhggzYk.js} +1 -1
- package/dist/renderer/assets/{Dashboard-2Wcx_bvJ.js → Dashboard-xn6cUy_n.js} +2 -2
- package/dist/renderer/assets/{EmptyState-DoCpF2tn.js → EmptyState-BdKBBUpr.js} +1 -1
- package/dist/renderer/assets/{KnowledgeDetail-CBRu2bXX.js → KnowledgeDetail-Duk8IQP3.js} +1 -1
- package/dist/renderer/assets/{KnowledgeHome-CItdlDVR.js → KnowledgeHome-BfjX_4Sv.js} +1 -1
- package/dist/renderer/assets/{Logs-Cd_7ZOXc.js → Logs-Bfq61QMn.js} +1 -1
- package/dist/renderer/assets/{Modal-B4eOiBsB.js → Modal-B3vlBmBr.js} +1 -1
- package/dist/renderer/assets/{Page-C5VH4D9U.js → Page-CPsLOP3z.js} +1 -1
- package/dist/renderer/assets/{ProjectDetail-D_DA--IP.js → ProjectDetail-D-g46wyF.js} +1 -1
- package/dist/renderer/assets/{ProjectList-CtCXJ50u.js → ProjectList-BrQEKDQ8.js} +1 -1
- package/dist/renderer/assets/{Select-B6E68LcN.js → Select-C4CFMQmF.js} +1 -1
- package/dist/renderer/assets/{SessionChat-D1HtMdQS.js → SessionChat-06Jny5_G.js} +1 -1
- package/dist/renderer/assets/{SessionList-Do-5-Xx6.js → SessionList-DPWIUbOg.js} +1 -1
- package/dist/renderer/assets/{ThreadChat-B1tEtE3V.js → ThreadChat-BjtU-j9q.js} +1 -1
- package/dist/renderer/assets/{Workspace-BlhS2RFw.js → Workspace-BcNmHuJx.js} +1 -1
- package/dist/renderer/assets/{arrow-left-DF1_F9Pk.js → arrow-left-DPzSmidS.js} +1 -1
- package/dist/renderer/assets/{book-open-DxRTGpWO.js → book-open-B0xhoRqZ.js} +1 -1
- package/dist/renderer/assets/{check-BAqPPYkf.js → check-BTJTyd0C.js} +1 -1
- package/dist/renderer/assets/{chevron-down-DIZZgSb3.js → chevron-down-B6jJXlhi.js} +1 -1
- package/dist/renderer/assets/{circle-B5raL_XK.js → circle-qRhJR9qR.js} +1 -1
- package/dist/renderer/assets/{desktop-CFcnzwcY.js → desktop-DXmXjjUR.js} +1 -1
- package/dist/renderer/assets/{funnel-BPjLpVSB.js → funnel-CbYKGTn8.js} +1 -1
- package/dist/renderer/assets/{heart-D2M1xN1N.js → heart-DjwWJfkz.js} +1 -1
- package/dist/renderer/assets/{index-Cx71F_Lz.js → index-BWmHJRhe.js} +2 -2
- package/dist/renderer/assets/{index-BijJAYmo.js → index-CyZs_2NJ.js} +1 -1
- package/dist/renderer/assets/{pencil-DlDr8Mmp.js → pencil-1dfAivmj.js} +1 -1
- package/dist/renderer/assets/{play-BOEG_mY8.js → play-CB3w1G6S.js} +1 -1
- package/dist/renderer/assets/{plug-BI27elC-.js → plug-Bvep5o3r.js} +1 -1
- package/dist/renderer/assets/{plus-BhURuFIQ.js → plus-DJVg9m09.js} +1 -1
- package/dist/renderer/assets/projects-xnW0fTtq.js +1 -0
- package/dist/renderer/assets/{save-RwkHNm9e.js → save-xjJn3qf2.js} +1 -1
- package/dist/renderer/assets/{search-DMNtm2WP.js → search-BK3UrQxM.js} +1 -1
- package/dist/renderer/assets/{server-CNaxKyAq.js → server-Dyd2eXJu.js} +1 -1
- package/dist/renderer/assets/{session-utils-vsALZkZN.js → session-utils-eXC0020s.js} +1 -1
- package/dist/renderer/assets/{sessions-BY-R1IL_.js → sessions-WLYpkyUt.js} +1 -1
- package/dist/renderer/assets/{shield-check-BF-4oJbj.js → shield-check-C0N6aWzF.js} +1 -1
- package/dist/renderer/assets/{trash-2-DduflM4q.js → trash-2-BGMTNJA6.js} +1 -1
- package/dist/renderer/assets/{user-DBcvnuW4.js → user-BcGMLyhu.js} +1 -1
- package/dist/renderer/assets/{wifi-off-X1nXESYu.js → wifi-off-FhcQx0HK.js} +1 -1
- package/dist/renderer/index.html +1 -1
- package/dist-electron/services/local-ai-core/src/acp/local-core-acp-backend.js +25 -39
- package/dist-electron/services/local-ai-core/src/acp/local-core-acp-session-coordinator.js +13 -0
- package/dist-electron/services/local-ai-core/src/acp/local-core-acp-store.js +7 -0
- package/dist-electron/services/local-ai-core/src/acp/local-core-slash-commands.js +28 -0
- package/dist-electron/services/local-ai-core/src/router/workspace-router.js +40 -4
- package/dist-electron/services/local-ai-core/src/thread/thread-command-service.js +134 -0
- package/dist-electron/tests/electron/plugin-kernel.test.js +26 -0
- package/dist-electron/tests/integration/local-core-refactor.test.js +165 -0
- package/package.json +1 -1
- package/dist/renderer/assets/projects-DpR972HM.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{G as Te,aK as Ae,r as c,j as x,aL as pe,aM as Ne,aA as te}from"./index-Cx71F_Lz.js";var ye=Ae();const De=Te(ye);function X(e,t,{checkForDefaultPrevented:n=!0}={}){return function(o){if(e==null||e(o),n===!1||!o.defaultPrevented)return t==null?void 0:t(o)}}function Jt(e,t){const n=c.createContext(t),r=i=>{const{children:s,...a}=i,h=c.useMemo(()=>a,Object.values(a));return x.jsx(n.Provider,{value:h,children:s})};r.displayName=e+"Provider";function o(i){const s=c.useContext(n);if(s)return s;if(t!==void 0)return t;throw new Error(`\`${i}\` must be used within \`${e}\``)}return[r,o]}function en(e,t=[]){let n=[];function r(i,s){const a=c.createContext(s),h=n.length;n=[...n,s];const l=d=>{var p;const{scope:v,children:y,...w}=d,u=((p=v==null?void 0:v[e])==null?void 0:p[h])||a,m=c.useMemo(()=>w,Object.values(w));return x.jsx(u.Provider,{value:m,children:y})};l.displayName=i+"Provider";function f(d,v){var u;const y=((u=v==null?void 0:v[e])==null?void 0:u[h])||a,w=c.useContext(y);if(w)return w;if(s!==void 0)return s;throw new Error(`\`${d}\` must be used within \`${i}\``)}return[l,f]}const o=()=>{const i=n.map(s=>c.createContext(s));return function(a){const h=(a==null?void 0:a[e])||i;return c.useMemo(()=>({[`__scope${e}`]:{...a,[e]:h}}),[a,h])}};return o.scopeName=e,[r,ke(o,...t)]}function ke(...e){const t=e[0];if(e.length===1)return t;const n=()=>{const r=e.map(o=>({useScope:o(),scopeName:o.scopeName}));return function(i){const s=r.reduce((a,{useScope:h,scopeName:l})=>{const d=h(i)[`__scope${l}`];return{...a,...d}},{});return c.useMemo(()=>({[`__scope${t.scopeName}`]:s}),[s])}};return n.scopeName=t.scopeName,n}var ne=globalThis!=null&&globalThis.document?c.useLayoutEffect:()=>{},Me=pe[" useId ".trim().toString()]||(()=>{}),Fe=0;function tn(e){const[t,n]=c.useState(Me());return ne(()=>{n(r=>r??String(Fe++))},[e]),e||(t?`radix-${t}`:"")}var Ie=pe[" useInsertionEffect ".trim().toString()]||ne;function nn({prop:e,defaultProp:t,onChange:n=()=>{},caller:r}){const[o,i,s]=We({defaultProp:t,onChange:n}),a=e!==void 0,h=a?e:o;{const f=c.useRef(e!==void 0);c.useEffect(()=>{const d=f.current;d!==a&&console.warn(`${r} is changing from ${d?"controlled":"uncontrolled"} to ${a?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),f.current=a},[a,r])}const l=c.useCallback(f=>{var d;if(a){const v=Be(f)?f(e):f;v!==e&&((d=s.current)==null||d.call(s,v))}else i(f)},[a,e,i,s]);return[h,l]}function We({defaultProp:e,onChange:t}){const[n,r]=c.useState(e),o=c.useRef(n),i=c.useRef(t);return Ie(()=>{i.current=t},[t]),c.useEffect(()=>{var s;o.current!==n&&((s=i.current)==null||s.call(i,n),o.current=n)},[n,o]),[n,r,i]}function Be(e){return typeof e=="function"}function _e(e){const t=je(e),n=c.forwardRef((r,o)=>{const{children:i,...s}=r,a=c.Children.toArray(i),h=a.find($e);if(h){const l=h.props.children,f=a.map(d=>d===h?c.Children.count(l)>1?c.Children.only(null):c.isValidElement(l)?l.props.children:null:d);return x.jsx(t,{...s,ref:o,children:c.isValidElement(l)?c.cloneElement(l,void 0,f):null})}return x.jsx(t,{...s,ref:o,children:i})});return n.displayName=`${e}.Slot`,n}function je(e){const t=c.forwardRef((n,r)=>{const{children:o,...i}=n;if(c.isValidElement(o)){const s=Ke(o),a=Ve(i,o.props);return o.type!==c.Fragment&&(a.ref=r?Ne(r,s):s),c.cloneElement(o,a)}return c.Children.count(o)>1?c.Children.only(null):null});return t.displayName=`${e}.SlotClone`,t}var Ue=Symbol("radix.slottable");function $e(e){return c.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===Ue}function Ve(e,t){const n={...t};for(const r in t){const o=e[r],i=t[r];/^on[A-Z]/.test(r)?o&&i?n[r]=(...a)=>{const h=i(...a);return o(...a),h}:o&&(n[r]=o):r==="style"?n[r]={...o,...i}:r==="className"&&(n[r]=[o,i].filter(Boolean).join(" "))}return{...e,...n}}function Ke(e){var r,o;let t=(r=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:r.get,n=t&&"isReactWarning"in t&&t.isReactWarning;return n?e.ref:(t=(o=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:o.get,n=t&&"isReactWarning"in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}var Xe=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],V=Xe.reduce((e,t)=>{const n=_e(`Primitive.${t}`),r=c.forwardRef((o,i)=>{const{asChild:s,...a}=o,h=s?n:t;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),x.jsx(h,{...a,ref:i})});return r.displayName=`Primitive.${t}`,{...e,[t]:r}},{});function Ye(e,t){e&&ye.flushSync(()=>e.dispatchEvent(t))}function F(e){const t=c.useRef(e);return c.useEffect(()=>{t.current=e}),c.useMemo(()=>(...n)=>{var r;return(r=t.current)==null?void 0:r.call(t,...n)},[])}function He(e,t=globalThis==null?void 0:globalThis.document){const n=F(e);c.useEffect(()=>{const r=o=>{o.key==="Escape"&&n(o)};return t.addEventListener("keydown",r,{capture:!0}),()=>t.removeEventListener("keydown",r,{capture:!0})},[n,t])}var ze="DismissableLayer",J="dismissableLayer.update",Ge="dismissableLayer.pointerDownOutside",Ze="dismissableLayer.focusOutside",oe,Ee=c.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),qe=c.forwardRef((e,t)=>{const{disableOutsidePointerEvents:n=!1,onEscapeKeyDown:r,onPointerDownOutside:o,onFocusOutside:i,onInteractOutside:s,onDismiss:a,...h}=e,l=c.useContext(Ee),[f,d]=c.useState(null),v=(f==null?void 0:f.ownerDocument)??(globalThis==null?void 0:globalThis.document),[,y]=c.useState({}),w=te(t,E=>d(E)),u=Array.from(l.layers),[m]=[...l.layersWithOutsidePointerEventsDisabled].slice(-1),p=u.indexOf(m),g=f?u.indexOf(f):-1,b=l.layersWithOutsidePointerEventsDisabled.size>0,S=g>=p,C=et(E=>{const L=E.target,T=[...l.branches].some(M=>M.contains(L));!S||T||(o==null||o(E),s==null||s(E),E.defaultPrevented||a==null||a())},v),P=tt(E=>{const L=E.target;[...l.branches].some(M=>M.contains(L))||(i==null||i(E),s==null||s(E),E.defaultPrevented||a==null||a())},v);return He(E=>{g===l.layers.size-1&&(r==null||r(E),!E.defaultPrevented&&a&&(E.preventDefault(),a()))},v),c.useEffect(()=>{if(f)return n&&(l.layersWithOutsidePointerEventsDisabled.size===0&&(oe=v.body.style.pointerEvents,v.body.style.pointerEvents="none"),l.layersWithOutsidePointerEventsDisabled.add(f)),l.layers.add(f),ae(),()=>{n&&l.layersWithOutsidePointerEventsDisabled.size===1&&(v.body.style.pointerEvents=oe)}},[f,v,n,l]),c.useEffect(()=>()=>{f&&(l.layers.delete(f),l.layersWithOutsidePointerEventsDisabled.delete(f),ae())},[f,l]),c.useEffect(()=>{const E=()=>y({});return document.addEventListener(J,E),()=>document.removeEventListener(J,E)},[]),x.jsx(V.div,{...h,ref:w,style:{pointerEvents:b?S?"auto":"none":void 0,...e.style},onFocusCapture:X(e.onFocusCapture,P.onFocusCapture),onBlurCapture:X(e.onBlurCapture,P.onBlurCapture),onPointerDownCapture:X(e.onPointerDownCapture,C.onPointerDownCapture)})});qe.displayName=ze;var Qe="DismissableLayerBranch",Je=c.forwardRef((e,t)=>{const n=c.useContext(Ee),r=c.useRef(null),o=te(t,r);return c.useEffect(()=>{const i=r.current;if(i)return n.branches.add(i),()=>{n.branches.delete(i)}},[n.branches]),x.jsx(V.div,{...e,ref:o})});Je.displayName=Qe;function et(e,t=globalThis==null?void 0:globalThis.document){const n=F(e),r=c.useRef(!1),o=c.useRef(()=>{});return c.useEffect(()=>{const i=a=>{if(a.target&&!r.current){let h=function(){ge(Ge,n,l,{discrete:!0})};const l={originalEvent:a};a.pointerType==="touch"?(t.removeEventListener("click",o.current),o.current=h,t.addEventListener("click",o.current,{once:!0})):h()}else t.removeEventListener("click",o.current);r.current=!1},s=window.setTimeout(()=>{t.addEventListener("pointerdown",i)},0);return()=>{window.clearTimeout(s),t.removeEventListener("pointerdown",i),t.removeEventListener("click",o.current)}},[t,n]),{onPointerDownCapture:()=>r.current=!0}}function tt(e,t=globalThis==null?void 0:globalThis.document){const n=F(e),r=c.useRef(!1);return c.useEffect(()=>{const o=i=>{i.target&&!r.current&&ge(Ze,n,{originalEvent:i},{discrete:!1})};return t.addEventListener("focusin",o),()=>t.removeEventListener("focusin",o)},[t,n]),{onFocusCapture:()=>r.current=!0,onBlurCapture:()=>r.current=!1}}function ae(){const e=new CustomEvent(J);document.dispatchEvent(e)}function ge(e,t,n,{discrete:r}){const o=n.originalEvent.target,i=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&o.addEventListener(e,t,{once:!0}),r?Ye(o,i):o.dispatchEvent(i)}var Y="focusScope.autoFocusOnMount",H="focusScope.autoFocusOnUnmount",ce={bubbles:!1,cancelable:!0},nt="FocusScope",rt=c.forwardRef((e,t)=>{const{loop:n=!1,trapped:r=!1,onMountAutoFocus:o,onUnmountAutoFocus:i,...s}=e,[a,h]=c.useState(null),l=F(o),f=F(i),d=c.useRef(null),v=te(t,u=>h(u)),y=c.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;c.useEffect(()=>{if(r){let u=function(b){if(y.paused||!a)return;const S=b.target;a.contains(S)?d.current=S:O(d.current,{select:!0})},m=function(b){if(y.paused||!a)return;const S=b.relatedTarget;S!==null&&(a.contains(S)||O(d.current,{select:!0}))},p=function(b){if(document.activeElement===document.body)for(const C of b)C.removedNodes.length>0&&O(a)};document.addEventListener("focusin",u),document.addEventListener("focusout",m);const g=new MutationObserver(p);return a&&g.observe(a,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",u),document.removeEventListener("focusout",m),g.disconnect()}}},[r,a,y.paused]),c.useEffect(()=>{if(a){se.add(y);const u=document.activeElement;if(!a.contains(u)){const p=new CustomEvent(Y,ce);a.addEventListener(Y,l),a.dispatchEvent(p),p.defaultPrevented||(ot(ut(be(a)),{select:!0}),document.activeElement===u&&O(a))}return()=>{a.removeEventListener(Y,l),setTimeout(()=>{const p=new CustomEvent(H,ce);a.addEventListener(H,f),a.dispatchEvent(p),p.defaultPrevented||O(u??document.body,{select:!0}),a.removeEventListener(H,f),se.remove(y)},0)}}},[a,l,f,y]);const w=c.useCallback(u=>{if(!n&&!r||y.paused)return;const m=u.key==="Tab"&&!u.altKey&&!u.ctrlKey&&!u.metaKey,p=document.activeElement;if(m&&p){const g=u.currentTarget,[b,S]=at(g);b&&S?!u.shiftKey&&p===S?(u.preventDefault(),n&&O(b,{select:!0})):u.shiftKey&&p===b&&(u.preventDefault(),n&&O(S,{select:!0})):p===g&&u.preventDefault()}},[n,r,y.paused]);return x.jsx(V.div,{tabIndex:-1,...s,ref:v,onKeyDown:w})});rt.displayName=nt;function ot(e,{select:t=!1}={}){const n=document.activeElement;for(const r of e)if(O(r,{select:t}),document.activeElement!==n)return}function at(e){const t=be(e),n=ie(t,e),r=ie(t.reverse(),e);return[n,r]}function be(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const o=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||o?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function ie(e,t){for(const n of e)if(!ct(n,{upTo:t}))return n}function ct(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function it(e){return e instanceof HTMLInputElement&&"select"in e}function O(e,{select:t=!1}={}){if(e&&e.focus){const n=document.activeElement;e.focus({preventScroll:!0}),e!==n&&it(e)&&t&&e.select()}}var se=st();function st(){let e=[];return{add(t){const n=e[0];t!==n&&(n==null||n.pause()),e=ue(e,t),e.unshift(t)},remove(t){var n;e=ue(e,t),(n=e[0])==null||n.resume()}}}function ue(e,t){const n=[...e],r=n.indexOf(t);return r!==-1&&n.splice(r,1),n}function ut(e){return e.filter(t=>t.tagName!=="A")}var lt="Portal",ft=c.forwardRef((e,t)=>{var a;const{container:n,...r}=e,[o,i]=c.useState(!1);ne(()=>i(!0),[]);const s=n||o&&((a=globalThis==null?void 0:globalThis.document)==null?void 0:a.body);return s?De.createPortal(x.jsx(V.div,{...r,ref:t}),s):null});ft.displayName=lt;var z=0;function rn(){c.useEffect(()=>{const e=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",e[0]??le()),document.body.insertAdjacentElement("beforeend",e[1]??le()),z++,()=>{z===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(t=>t.remove()),z--}},[])}function le(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}var R=function(){return R=Object.assign||function(t){for(var n,r=1,o=arguments.length;r<o;r++){n=arguments[r];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t},R.apply(this,arguments)};function Se(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]]);return n}function dt(e,t,n){if(n||arguments.length===2)for(var r=0,o=t.length,i;r<o;r++)(i||!(r in t))&&(i||(i=Array.prototype.slice.call(t,0,r)),i[r]=t[r]);return e.concat(i||Array.prototype.slice.call(t))}var U="right-scroll-bar-position",$="width-before-scroll-bar",vt="with-scroll-bars-hidden",ht="--removed-body-scroll-bar-size";function G(e,t){return typeof e=="function"?e(t):e&&(e.current=t),e}function mt(e,t){var n=c.useState(function(){return{value:e,callback:t,facade:{get current(){return n.value},set current(r){var o=n.value;o!==r&&(n.value=r,n.callback(r,o))}}}})[0];return n.callback=t,n.facade}var pt=typeof window<"u"?c.useLayoutEffect:c.useEffect,fe=new WeakMap;function yt(e,t){var n=mt(null,function(r){return e.forEach(function(o){return G(o,r)})});return pt(function(){var r=fe.get(n);if(r){var o=new Set(r),i=new Set(e),s=n.current;o.forEach(function(a){i.has(a)||G(a,null)}),i.forEach(function(a){o.has(a)||G(a,s)})}fe.set(n,e)},[e]),n}function Et(e){return e}function gt(e,t){t===void 0&&(t=Et);var n=[],r=!1,o={read:function(){if(r)throw new Error("Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.");return n.length?n[n.length-1]:e},useMedium:function(i){var s=t(i,r);return n.push(s),function(){n=n.filter(function(a){return a!==s})}},assignSyncMedium:function(i){for(r=!0;n.length;){var s=n;n=[],s.forEach(i)}n={push:function(a){return i(a)},filter:function(){return n}}},assignMedium:function(i){r=!0;var s=[];if(n.length){var a=n;n=[],a.forEach(i),s=n}var h=function(){var f=s;s=[],f.forEach(i)},l=function(){return Promise.resolve().then(h)};l(),n={push:function(f){s.push(f),l()},filter:function(f){return s=s.filter(f),n}}}};return o}function bt(e){e===void 0&&(e={});var t=gt(null);return t.options=R({async:!0,ssr:!1},e),t}var we=function(e){var t=e.sideCar,n=Se(e,["sideCar"]);if(!t)throw new Error("Sidecar: please provide `sideCar` property to import the right car");var r=t.read();if(!r)throw new Error("Sidecar medium not found");return c.createElement(r,R({},n))};we.isSideCarExport=!0;function St(e,t){return e.useMedium(t),we}var Ce=bt(),Z=function(){},K=c.forwardRef(function(e,t){var n=c.useRef(null),r=c.useState({onScrollCapture:Z,onWheelCapture:Z,onTouchMoveCapture:Z}),o=r[0],i=r[1],s=e.forwardProps,a=e.children,h=e.className,l=e.removeScrollBar,f=e.enabled,d=e.shards,v=e.sideCar,y=e.noRelative,w=e.noIsolation,u=e.inert,m=e.allowPinchZoom,p=e.as,g=p===void 0?"div":p,b=e.gapMode,S=Se(e,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noRelative","noIsolation","inert","allowPinchZoom","as","gapMode"]),C=v,P=yt([n,t]),E=R(R({},S),o);return c.createElement(c.Fragment,null,f&&c.createElement(C,{sideCar:Ce,removeScrollBar:l,shards:d,noRelative:y,noIsolation:w,inert:u,setCallbacks:i,allowPinchZoom:!!m,lockRef:n,gapMode:b}),s?c.cloneElement(c.Children.only(a),R(R({},E),{ref:P})):c.createElement(g,R({},E,{className:h,ref:P}),a))});K.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1};K.classNames={fullWidth:$,zeroRight:U};var wt=function(){if(typeof __webpack_nonce__<"u")return __webpack_nonce__};function Ct(){if(!document)return null;var e=document.createElement("style");e.type="text/css";var t=wt();return t&&e.setAttribute("nonce",t),e}function Pt(e,t){e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t))}function Rt(e){var t=document.head||document.getElementsByTagName("head")[0];t.appendChild(e)}var xt=function(){var e=0,t=null;return{add:function(n){e==0&&(t=Ct())&&(Pt(t,n),Rt(t)),e++},remove:function(){e--,!e&&t&&(t.parentNode&&t.parentNode.removeChild(t),t=null)}}},Ot=function(){var e=xt();return function(t,n){c.useEffect(function(){return e.add(t),function(){e.remove()}},[t&&n])}},Pe=function(){var e=Ot(),t=function(n){var r=n.styles,o=n.dynamic;return e(r,o),null};return t},Lt={left:0,top:0,right:0,gap:0},q=function(e){return parseInt(e||"",10)||0},Tt=function(e){var t=window.getComputedStyle(document.body),n=t[e==="padding"?"paddingLeft":"marginLeft"],r=t[e==="padding"?"paddingTop":"marginTop"],o=t[e==="padding"?"paddingRight":"marginRight"];return[q(n),q(r),q(o)]},At=function(e){if(e===void 0&&(e="margin"),typeof window>"u")return Lt;var t=Tt(e),n=document.documentElement.clientWidth,r=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,r-n+t[2]-t[0])}},Nt=Pe(),k="data-scroll-locked",Dt=function(e,t,n,r){var o=e.left,i=e.top,s=e.right,a=e.gap;return n===void 0&&(n="margin"),`
|
|
1
|
+
import{G as Te,aK as Ae,r as c,j as x,aL as pe,aM as Ne,aA as te}from"./index-BWmHJRhe.js";var ye=Ae();const De=Te(ye);function X(e,t,{checkForDefaultPrevented:n=!0}={}){return function(o){if(e==null||e(o),n===!1||!o.defaultPrevented)return t==null?void 0:t(o)}}function Jt(e,t){const n=c.createContext(t),r=i=>{const{children:s,...a}=i,h=c.useMemo(()=>a,Object.values(a));return x.jsx(n.Provider,{value:h,children:s})};r.displayName=e+"Provider";function o(i){const s=c.useContext(n);if(s)return s;if(t!==void 0)return t;throw new Error(`\`${i}\` must be used within \`${e}\``)}return[r,o]}function en(e,t=[]){let n=[];function r(i,s){const a=c.createContext(s),h=n.length;n=[...n,s];const l=d=>{var p;const{scope:v,children:y,...w}=d,u=((p=v==null?void 0:v[e])==null?void 0:p[h])||a,m=c.useMemo(()=>w,Object.values(w));return x.jsx(u.Provider,{value:m,children:y})};l.displayName=i+"Provider";function f(d,v){var u;const y=((u=v==null?void 0:v[e])==null?void 0:u[h])||a,w=c.useContext(y);if(w)return w;if(s!==void 0)return s;throw new Error(`\`${d}\` must be used within \`${i}\``)}return[l,f]}const o=()=>{const i=n.map(s=>c.createContext(s));return function(a){const h=(a==null?void 0:a[e])||i;return c.useMemo(()=>({[`__scope${e}`]:{...a,[e]:h}}),[a,h])}};return o.scopeName=e,[r,ke(o,...t)]}function ke(...e){const t=e[0];if(e.length===1)return t;const n=()=>{const r=e.map(o=>({useScope:o(),scopeName:o.scopeName}));return function(i){const s=r.reduce((a,{useScope:h,scopeName:l})=>{const d=h(i)[`__scope${l}`];return{...a,...d}},{});return c.useMemo(()=>({[`__scope${t.scopeName}`]:s}),[s])}};return n.scopeName=t.scopeName,n}var ne=globalThis!=null&&globalThis.document?c.useLayoutEffect:()=>{},Me=pe[" useId ".trim().toString()]||(()=>{}),Fe=0;function tn(e){const[t,n]=c.useState(Me());return ne(()=>{n(r=>r??String(Fe++))},[e]),e||(t?`radix-${t}`:"")}var Ie=pe[" useInsertionEffect ".trim().toString()]||ne;function nn({prop:e,defaultProp:t,onChange:n=()=>{},caller:r}){const[o,i,s]=We({defaultProp:t,onChange:n}),a=e!==void 0,h=a?e:o;{const f=c.useRef(e!==void 0);c.useEffect(()=>{const d=f.current;d!==a&&console.warn(`${r} is changing from ${d?"controlled":"uncontrolled"} to ${a?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),f.current=a},[a,r])}const l=c.useCallback(f=>{var d;if(a){const v=Be(f)?f(e):f;v!==e&&((d=s.current)==null||d.call(s,v))}else i(f)},[a,e,i,s]);return[h,l]}function We({defaultProp:e,onChange:t}){const[n,r]=c.useState(e),o=c.useRef(n),i=c.useRef(t);return Ie(()=>{i.current=t},[t]),c.useEffect(()=>{var s;o.current!==n&&((s=i.current)==null||s.call(i,n),o.current=n)},[n,o]),[n,r,i]}function Be(e){return typeof e=="function"}function _e(e){const t=je(e),n=c.forwardRef((r,o)=>{const{children:i,...s}=r,a=c.Children.toArray(i),h=a.find($e);if(h){const l=h.props.children,f=a.map(d=>d===h?c.Children.count(l)>1?c.Children.only(null):c.isValidElement(l)?l.props.children:null:d);return x.jsx(t,{...s,ref:o,children:c.isValidElement(l)?c.cloneElement(l,void 0,f):null})}return x.jsx(t,{...s,ref:o,children:i})});return n.displayName=`${e}.Slot`,n}function je(e){const t=c.forwardRef((n,r)=>{const{children:o,...i}=n;if(c.isValidElement(o)){const s=Ke(o),a=Ve(i,o.props);return o.type!==c.Fragment&&(a.ref=r?Ne(r,s):s),c.cloneElement(o,a)}return c.Children.count(o)>1?c.Children.only(null):null});return t.displayName=`${e}.SlotClone`,t}var Ue=Symbol("radix.slottable");function $e(e){return c.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===Ue}function Ve(e,t){const n={...t};for(const r in t){const o=e[r],i=t[r];/^on[A-Z]/.test(r)?o&&i?n[r]=(...a)=>{const h=i(...a);return o(...a),h}:o&&(n[r]=o):r==="style"?n[r]={...o,...i}:r==="className"&&(n[r]=[o,i].filter(Boolean).join(" "))}return{...e,...n}}function Ke(e){var r,o;let t=(r=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:r.get,n=t&&"isReactWarning"in t&&t.isReactWarning;return n?e.ref:(t=(o=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:o.get,n=t&&"isReactWarning"in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}var Xe=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],V=Xe.reduce((e,t)=>{const n=_e(`Primitive.${t}`),r=c.forwardRef((o,i)=>{const{asChild:s,...a}=o,h=s?n:t;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),x.jsx(h,{...a,ref:i})});return r.displayName=`Primitive.${t}`,{...e,[t]:r}},{});function Ye(e,t){e&&ye.flushSync(()=>e.dispatchEvent(t))}function F(e){const t=c.useRef(e);return c.useEffect(()=>{t.current=e}),c.useMemo(()=>(...n)=>{var r;return(r=t.current)==null?void 0:r.call(t,...n)},[])}function He(e,t=globalThis==null?void 0:globalThis.document){const n=F(e);c.useEffect(()=>{const r=o=>{o.key==="Escape"&&n(o)};return t.addEventListener("keydown",r,{capture:!0}),()=>t.removeEventListener("keydown",r,{capture:!0})},[n,t])}var ze="DismissableLayer",J="dismissableLayer.update",Ge="dismissableLayer.pointerDownOutside",Ze="dismissableLayer.focusOutside",oe,Ee=c.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),qe=c.forwardRef((e,t)=>{const{disableOutsidePointerEvents:n=!1,onEscapeKeyDown:r,onPointerDownOutside:o,onFocusOutside:i,onInteractOutside:s,onDismiss:a,...h}=e,l=c.useContext(Ee),[f,d]=c.useState(null),v=(f==null?void 0:f.ownerDocument)??(globalThis==null?void 0:globalThis.document),[,y]=c.useState({}),w=te(t,E=>d(E)),u=Array.from(l.layers),[m]=[...l.layersWithOutsidePointerEventsDisabled].slice(-1),p=u.indexOf(m),g=f?u.indexOf(f):-1,b=l.layersWithOutsidePointerEventsDisabled.size>0,S=g>=p,C=et(E=>{const L=E.target,T=[...l.branches].some(M=>M.contains(L));!S||T||(o==null||o(E),s==null||s(E),E.defaultPrevented||a==null||a())},v),P=tt(E=>{const L=E.target;[...l.branches].some(M=>M.contains(L))||(i==null||i(E),s==null||s(E),E.defaultPrevented||a==null||a())},v);return He(E=>{g===l.layers.size-1&&(r==null||r(E),!E.defaultPrevented&&a&&(E.preventDefault(),a()))},v),c.useEffect(()=>{if(f)return n&&(l.layersWithOutsidePointerEventsDisabled.size===0&&(oe=v.body.style.pointerEvents,v.body.style.pointerEvents="none"),l.layersWithOutsidePointerEventsDisabled.add(f)),l.layers.add(f),ae(),()=>{n&&l.layersWithOutsidePointerEventsDisabled.size===1&&(v.body.style.pointerEvents=oe)}},[f,v,n,l]),c.useEffect(()=>()=>{f&&(l.layers.delete(f),l.layersWithOutsidePointerEventsDisabled.delete(f),ae())},[f,l]),c.useEffect(()=>{const E=()=>y({});return document.addEventListener(J,E),()=>document.removeEventListener(J,E)},[]),x.jsx(V.div,{...h,ref:w,style:{pointerEvents:b?S?"auto":"none":void 0,...e.style},onFocusCapture:X(e.onFocusCapture,P.onFocusCapture),onBlurCapture:X(e.onBlurCapture,P.onBlurCapture),onPointerDownCapture:X(e.onPointerDownCapture,C.onPointerDownCapture)})});qe.displayName=ze;var Qe="DismissableLayerBranch",Je=c.forwardRef((e,t)=>{const n=c.useContext(Ee),r=c.useRef(null),o=te(t,r);return c.useEffect(()=>{const i=r.current;if(i)return n.branches.add(i),()=>{n.branches.delete(i)}},[n.branches]),x.jsx(V.div,{...e,ref:o})});Je.displayName=Qe;function et(e,t=globalThis==null?void 0:globalThis.document){const n=F(e),r=c.useRef(!1),o=c.useRef(()=>{});return c.useEffect(()=>{const i=a=>{if(a.target&&!r.current){let h=function(){ge(Ge,n,l,{discrete:!0})};const l={originalEvent:a};a.pointerType==="touch"?(t.removeEventListener("click",o.current),o.current=h,t.addEventListener("click",o.current,{once:!0})):h()}else t.removeEventListener("click",o.current);r.current=!1},s=window.setTimeout(()=>{t.addEventListener("pointerdown",i)},0);return()=>{window.clearTimeout(s),t.removeEventListener("pointerdown",i),t.removeEventListener("click",o.current)}},[t,n]),{onPointerDownCapture:()=>r.current=!0}}function tt(e,t=globalThis==null?void 0:globalThis.document){const n=F(e),r=c.useRef(!1);return c.useEffect(()=>{const o=i=>{i.target&&!r.current&&ge(Ze,n,{originalEvent:i},{discrete:!1})};return t.addEventListener("focusin",o),()=>t.removeEventListener("focusin",o)},[t,n]),{onFocusCapture:()=>r.current=!0,onBlurCapture:()=>r.current=!1}}function ae(){const e=new CustomEvent(J);document.dispatchEvent(e)}function ge(e,t,n,{discrete:r}){const o=n.originalEvent.target,i=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&o.addEventListener(e,t,{once:!0}),r?Ye(o,i):o.dispatchEvent(i)}var Y="focusScope.autoFocusOnMount",H="focusScope.autoFocusOnUnmount",ce={bubbles:!1,cancelable:!0},nt="FocusScope",rt=c.forwardRef((e,t)=>{const{loop:n=!1,trapped:r=!1,onMountAutoFocus:o,onUnmountAutoFocus:i,...s}=e,[a,h]=c.useState(null),l=F(o),f=F(i),d=c.useRef(null),v=te(t,u=>h(u)),y=c.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;c.useEffect(()=>{if(r){let u=function(b){if(y.paused||!a)return;const S=b.target;a.contains(S)?d.current=S:O(d.current,{select:!0})},m=function(b){if(y.paused||!a)return;const S=b.relatedTarget;S!==null&&(a.contains(S)||O(d.current,{select:!0}))},p=function(b){if(document.activeElement===document.body)for(const C of b)C.removedNodes.length>0&&O(a)};document.addEventListener("focusin",u),document.addEventListener("focusout",m);const g=new MutationObserver(p);return a&&g.observe(a,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",u),document.removeEventListener("focusout",m),g.disconnect()}}},[r,a,y.paused]),c.useEffect(()=>{if(a){se.add(y);const u=document.activeElement;if(!a.contains(u)){const p=new CustomEvent(Y,ce);a.addEventListener(Y,l),a.dispatchEvent(p),p.defaultPrevented||(ot(ut(be(a)),{select:!0}),document.activeElement===u&&O(a))}return()=>{a.removeEventListener(Y,l),setTimeout(()=>{const p=new CustomEvent(H,ce);a.addEventListener(H,f),a.dispatchEvent(p),p.defaultPrevented||O(u??document.body,{select:!0}),a.removeEventListener(H,f),se.remove(y)},0)}}},[a,l,f,y]);const w=c.useCallback(u=>{if(!n&&!r||y.paused)return;const m=u.key==="Tab"&&!u.altKey&&!u.ctrlKey&&!u.metaKey,p=document.activeElement;if(m&&p){const g=u.currentTarget,[b,S]=at(g);b&&S?!u.shiftKey&&p===S?(u.preventDefault(),n&&O(b,{select:!0})):u.shiftKey&&p===b&&(u.preventDefault(),n&&O(S,{select:!0})):p===g&&u.preventDefault()}},[n,r,y.paused]);return x.jsx(V.div,{tabIndex:-1,...s,ref:v,onKeyDown:w})});rt.displayName=nt;function ot(e,{select:t=!1}={}){const n=document.activeElement;for(const r of e)if(O(r,{select:t}),document.activeElement!==n)return}function at(e){const t=be(e),n=ie(t,e),r=ie(t.reverse(),e);return[n,r]}function be(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const o=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||o?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function ie(e,t){for(const n of e)if(!ct(n,{upTo:t}))return n}function ct(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function it(e){return e instanceof HTMLInputElement&&"select"in e}function O(e,{select:t=!1}={}){if(e&&e.focus){const n=document.activeElement;e.focus({preventScroll:!0}),e!==n&&it(e)&&t&&e.select()}}var se=st();function st(){let e=[];return{add(t){const n=e[0];t!==n&&(n==null||n.pause()),e=ue(e,t),e.unshift(t)},remove(t){var n;e=ue(e,t),(n=e[0])==null||n.resume()}}}function ue(e,t){const n=[...e],r=n.indexOf(t);return r!==-1&&n.splice(r,1),n}function ut(e){return e.filter(t=>t.tagName!=="A")}var lt="Portal",ft=c.forwardRef((e,t)=>{var a;const{container:n,...r}=e,[o,i]=c.useState(!1);ne(()=>i(!0),[]);const s=n||o&&((a=globalThis==null?void 0:globalThis.document)==null?void 0:a.body);return s?De.createPortal(x.jsx(V.div,{...r,ref:t}),s):null});ft.displayName=lt;var z=0;function rn(){c.useEffect(()=>{const e=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",e[0]??le()),document.body.insertAdjacentElement("beforeend",e[1]??le()),z++,()=>{z===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(t=>t.remove()),z--}},[])}function le(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}var R=function(){return R=Object.assign||function(t){for(var n,r=1,o=arguments.length;r<o;r++){n=arguments[r];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t},R.apply(this,arguments)};function Se(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]]);return n}function dt(e,t,n){if(n||arguments.length===2)for(var r=0,o=t.length,i;r<o;r++)(i||!(r in t))&&(i||(i=Array.prototype.slice.call(t,0,r)),i[r]=t[r]);return e.concat(i||Array.prototype.slice.call(t))}var U="right-scroll-bar-position",$="width-before-scroll-bar",vt="with-scroll-bars-hidden",ht="--removed-body-scroll-bar-size";function G(e,t){return typeof e=="function"?e(t):e&&(e.current=t),e}function mt(e,t){var n=c.useState(function(){return{value:e,callback:t,facade:{get current(){return n.value},set current(r){var o=n.value;o!==r&&(n.value=r,n.callback(r,o))}}}})[0];return n.callback=t,n.facade}var pt=typeof window<"u"?c.useLayoutEffect:c.useEffect,fe=new WeakMap;function yt(e,t){var n=mt(null,function(r){return e.forEach(function(o){return G(o,r)})});return pt(function(){var r=fe.get(n);if(r){var o=new Set(r),i=new Set(e),s=n.current;o.forEach(function(a){i.has(a)||G(a,null)}),i.forEach(function(a){o.has(a)||G(a,s)})}fe.set(n,e)},[e]),n}function Et(e){return e}function gt(e,t){t===void 0&&(t=Et);var n=[],r=!1,o={read:function(){if(r)throw new Error("Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.");return n.length?n[n.length-1]:e},useMedium:function(i){var s=t(i,r);return n.push(s),function(){n=n.filter(function(a){return a!==s})}},assignSyncMedium:function(i){for(r=!0;n.length;){var s=n;n=[],s.forEach(i)}n={push:function(a){return i(a)},filter:function(){return n}}},assignMedium:function(i){r=!0;var s=[];if(n.length){var a=n;n=[],a.forEach(i),s=n}var h=function(){var f=s;s=[],f.forEach(i)},l=function(){return Promise.resolve().then(h)};l(),n={push:function(f){s.push(f),l()},filter:function(f){return s=s.filter(f),n}}}};return o}function bt(e){e===void 0&&(e={});var t=gt(null);return t.options=R({async:!0,ssr:!1},e),t}var we=function(e){var t=e.sideCar,n=Se(e,["sideCar"]);if(!t)throw new Error("Sidecar: please provide `sideCar` property to import the right car");var r=t.read();if(!r)throw new Error("Sidecar medium not found");return c.createElement(r,R({},n))};we.isSideCarExport=!0;function St(e,t){return e.useMedium(t),we}var Ce=bt(),Z=function(){},K=c.forwardRef(function(e,t){var n=c.useRef(null),r=c.useState({onScrollCapture:Z,onWheelCapture:Z,onTouchMoveCapture:Z}),o=r[0],i=r[1],s=e.forwardProps,a=e.children,h=e.className,l=e.removeScrollBar,f=e.enabled,d=e.shards,v=e.sideCar,y=e.noRelative,w=e.noIsolation,u=e.inert,m=e.allowPinchZoom,p=e.as,g=p===void 0?"div":p,b=e.gapMode,S=Se(e,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noRelative","noIsolation","inert","allowPinchZoom","as","gapMode"]),C=v,P=yt([n,t]),E=R(R({},S),o);return c.createElement(c.Fragment,null,f&&c.createElement(C,{sideCar:Ce,removeScrollBar:l,shards:d,noRelative:y,noIsolation:w,inert:u,setCallbacks:i,allowPinchZoom:!!m,lockRef:n,gapMode:b}),s?c.cloneElement(c.Children.only(a),R(R({},E),{ref:P})):c.createElement(g,R({},E,{className:h,ref:P}),a))});K.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1};K.classNames={fullWidth:$,zeroRight:U};var wt=function(){if(typeof __webpack_nonce__<"u")return __webpack_nonce__};function Ct(){if(!document)return null;var e=document.createElement("style");e.type="text/css";var t=wt();return t&&e.setAttribute("nonce",t),e}function Pt(e,t){e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t))}function Rt(e){var t=document.head||document.getElementsByTagName("head")[0];t.appendChild(e)}var xt=function(){var e=0,t=null;return{add:function(n){e==0&&(t=Ct())&&(Pt(t,n),Rt(t)),e++},remove:function(){e--,!e&&t&&(t.parentNode&&t.parentNode.removeChild(t),t=null)}}},Ot=function(){var e=xt();return function(t,n){c.useEffect(function(){return e.add(t),function(){e.remove()}},[t&&n])}},Pe=function(){var e=Ot(),t=function(n){var r=n.styles,o=n.dynamic;return e(r,o),null};return t},Lt={left:0,top:0,right:0,gap:0},q=function(e){return parseInt(e||"",10)||0},Tt=function(e){var t=window.getComputedStyle(document.body),n=t[e==="padding"?"paddingLeft":"marginLeft"],r=t[e==="padding"?"paddingTop":"marginTop"],o=t[e==="padding"?"paddingRight":"marginRight"];return[q(n),q(r),q(o)]},At=function(e){if(e===void 0&&(e="margin"),typeof window>"u")return Lt;var t=Tt(e),n=document.documentElement.clientWidth,r=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,r-n+t[2]-t[0])}},Nt=Pe(),k="data-scroll-locked",Dt=function(e,t,n,r){var o=e.left,i=e.top,s=e.right,a=e.gap;return n===void 0&&(n="margin"),`
|
|
2
2
|
.`.concat(vt,` {
|
|
3
3
|
overflow: hidden `).concat(r,`;
|
|
4
4
|
padding-right: `).concat(a,"px ").concat(r,`;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as t}from"./index-BWmHJRhe.js";const e=()=>t.get("/projects"),r=o=>t.get(`/projects/${o}`);export{r as g,e as l};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z as o}from"./index-
|
|
1
|
+
import{z as o}from"./index-BWmHJRhe.js";const i=s=>o.get(`/projects/${s}/sessions`),c=(s,e,t)=>o.get(`/projects/${s}/sessions/${e}`,{history_limit:String(t)}),r=(s,e,t)=>o.patch(`/projects/${s}/sessions/${e}`,t),a=(s,e)=>o.delete(`/projects/${s}/sessions/${e}`),p=(s,e)=>o.post(`/projects/${s}/sessions/switch`,e),$=(s,e)=>o.post(`/projects/${s}/send`,e);export{$ as a,a as d,c as g,i as l,r,p as s};
|
package/dist/renderer/index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<link rel="icon" type="image/svg+xml" href="./favicon.svg" />
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<title>AgentDock</title>
|
|
8
|
-
<script type="module" crossorigin src="./assets/index-
|
|
8
|
+
<script type="module" crossorigin src="./assets/index-BWmHJRhe.js"></script>
|
|
9
9
|
<link rel="stylesheet" crossorigin href="./assets/index-CaQZSRbg.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body class="bg-[#f5f5f7] dark:bg-[#151516]">
|
|
@@ -13,6 +13,7 @@ const local_core_slash_commands_js_1 = require("./local-core-slash-commands.js")
|
|
|
13
13
|
const local_core_acp_progress_js_1 = require("./local-core-acp-progress.js");
|
|
14
14
|
const index_js_1 = require("../agents/index.js");
|
|
15
15
|
const scheduled_job_route_js_1 = require("../scheduler/scheduled-job-route.js");
|
|
16
|
+
const thread_command_service_js_1 = require("../thread/thread-command-service.js");
|
|
16
17
|
const ACP_PROMPT_TIMEOUT_MS = 15 * 60 * 1000;
|
|
17
18
|
class LocalCoreAcpBackend {
|
|
18
19
|
options;
|
|
@@ -20,6 +21,7 @@ class LocalCoreAcpBackend {
|
|
|
20
21
|
turnCoordinator;
|
|
21
22
|
sessionCoordinator;
|
|
22
23
|
responseProcessor;
|
|
24
|
+
commandService;
|
|
23
25
|
constructor(options) {
|
|
24
26
|
this.options = options;
|
|
25
27
|
this.transport = new local_core_acp_transport_js_1.LocalCoreAcpTransport({
|
|
@@ -87,6 +89,19 @@ class LocalCoreAcpBackend {
|
|
|
87
89
|
emitBridge: (event) => this.emitBridgeEvent(event),
|
|
88
90
|
log: options.log,
|
|
89
91
|
});
|
|
92
|
+
this.commandService = new thread_command_service_js_1.ThreadCommandService({
|
|
93
|
+
getThreadRow: (threadId) => this.options.store.getThreadRow(threadId),
|
|
94
|
+
updateThreadAgentMode: (threadId, mode) => this.options.store.updateThreadAgentMode(threadId, mode),
|
|
95
|
+
updateThreadAgentType: (threadId, agentType) => this.options.store.updateThreadAgentType(threadId, agentType),
|
|
96
|
+
getLatestRunForThread: (threadId) => this.options.store.getLatestRunForThread(threadId),
|
|
97
|
+
createAuditEvent: (input) => {
|
|
98
|
+
this.options.store.createAuditEvent(input);
|
|
99
|
+
},
|
|
100
|
+
getAgentTypes: options.getAgentTypes,
|
|
101
|
+
setThreadMode: (threadId, mode) => this.sessionCoordinator.setThreadMode(threadId, mode),
|
|
102
|
+
closeThreadSession: (threadId) => this.sessionCoordinator.closeThreadSession(threadId),
|
|
103
|
+
log: options.log,
|
|
104
|
+
});
|
|
90
105
|
this.responseProcessor = new local_core_acp_response_processor_js_1.LocalCoreAcpResponseProcessor({
|
|
91
106
|
getScheduledDeliveryBinding: (threadId) => {
|
|
92
107
|
const binding = this.options.store.getPlatformThreadBindingByThreadId(threadId);
|
|
@@ -149,16 +164,21 @@ class LocalCoreAcpBackend {
|
|
|
149
164
|
source: 'user',
|
|
150
165
|
},
|
|
151
166
|
});
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
|
|
167
|
+
const commandResult = await this.commandService.execute({
|
|
168
|
+
threadId,
|
|
169
|
+
workspaceId: row.workspace_id,
|
|
170
|
+
content,
|
|
171
|
+
defaultAgentType: config.agentType,
|
|
172
|
+
});
|
|
173
|
+
if (commandResult.handled) {
|
|
174
|
+
this.options.store.appendMessage(threadId, 'assistant', commandResult.displayText, 'final');
|
|
155
175
|
this.options.eventBus.emit({
|
|
156
176
|
type: 'thread.message.accepted',
|
|
157
177
|
payload: {
|
|
158
178
|
threadId,
|
|
159
179
|
workspaceId: row.workspace_id,
|
|
160
180
|
role: 'assistant',
|
|
161
|
-
content:
|
|
181
|
+
content: commandResult.displayText,
|
|
162
182
|
kind: 'final',
|
|
163
183
|
source: 'system',
|
|
164
184
|
},
|
|
@@ -166,7 +186,7 @@ class LocalCoreAcpBackend {
|
|
|
166
186
|
this.emitBridgeEvent({
|
|
167
187
|
type: 'reply',
|
|
168
188
|
sessionKey: row.bridge_session_key,
|
|
169
|
-
content:
|
|
189
|
+
content: commandResult.displayText,
|
|
170
190
|
});
|
|
171
191
|
this.emitBridgeEvent({
|
|
172
192
|
type: 'typing_stop',
|
|
@@ -246,40 +266,6 @@ class LocalCoreAcpBackend {
|
|
|
246
266
|
});
|
|
247
267
|
return { runId: session.currentRunId };
|
|
248
268
|
}
|
|
249
|
-
async handleLocalSlashCommand(threadId, workspaceId, content) {
|
|
250
|
-
const command = (0, local_core_slash_commands_js_1.parseSlashCommand)(content);
|
|
251
|
-
if (!command || command.name !== 'mode') {
|
|
252
|
-
return '';
|
|
253
|
-
}
|
|
254
|
-
const row = this.options.store.getThreadRow(threadId);
|
|
255
|
-
const currentMode = row?.agent_mode || local_core_slash_commands_js_1.DEFAULT_AGENT_MODE;
|
|
256
|
-
const requested = command.args.join(' ').trim();
|
|
257
|
-
if (!requested) {
|
|
258
|
-
return (0, local_core_slash_commands_js_1.modeHelpText)(currentMode);
|
|
259
|
-
}
|
|
260
|
-
const mode = (0, local_core_slash_commands_js_1.normalizeAgentMode)(requested);
|
|
261
|
-
if (!mode) {
|
|
262
|
-
return `未知模式:${requested}\n\n${(0, local_core_slash_commands_js_1.modeHelpText)(currentMode)}`;
|
|
263
|
-
}
|
|
264
|
-
this.options.store.updateThreadAgentMode(threadId, mode);
|
|
265
|
-
try {
|
|
266
|
-
await this.sessionCoordinator.setThreadMode(threadId, mode);
|
|
267
|
-
}
|
|
268
|
-
catch (error) {
|
|
269
|
-
this.options.log?.(`localcore-acp mode sync failed for ${threadId}: ${error instanceof Error ? error.message : String(error)}`);
|
|
270
|
-
}
|
|
271
|
-
this.options.store.createAuditEvent({
|
|
272
|
-
type: 'permission.changed',
|
|
273
|
-
workspaceId,
|
|
274
|
-
actor: 'local',
|
|
275
|
-
summary: `Thread agent mode changed to ${mode}.`,
|
|
276
|
-
metadata: { threadId, mode },
|
|
277
|
-
});
|
|
278
|
-
if (mode === 'bypassPermissions') {
|
|
279
|
-
return '已切换到 yolo 模式:后续工具调用会跳过权限申请。使用 `/mode default` 可恢复默认权限。';
|
|
280
|
-
}
|
|
281
|
-
return `已切换到 ${(0, local_core_slash_commands_js_1.formatAgentMode)(mode)} 模式。`;
|
|
282
|
-
}
|
|
283
269
|
async interruptRun(runId) {
|
|
284
270
|
return this.sessionCoordinator.interruptRun(runId);
|
|
285
271
|
}
|
|
@@ -29,11 +29,13 @@ class LocalCoreAcpSessionCoordinator {
|
|
|
29
29
|
async ensureSession(threadId, bridgeSessionKey, config, options = {}) {
|
|
30
30
|
const existing = this.sessions.get(threadId);
|
|
31
31
|
const permissionMode = this.resolveLaunchPermissionMode(threadId, options.permissionMode);
|
|
32
|
+
const configKey = this.buildLaunchConfigKey(config);
|
|
32
33
|
const runtimeEnvKey = this.buildRuntimeEnvKey(options.runtimeEnv);
|
|
33
34
|
if (existing
|
|
34
35
|
&& !existing.closed
|
|
35
36
|
&& existing.sessionId
|
|
36
37
|
&& existing.launchPermissionMode === permissionMode
|
|
38
|
+
&& existing.launchConfigKey === configKey
|
|
37
39
|
&& existing.launchRuntimeEnvKey === runtimeEnvKey) {
|
|
38
40
|
return existing;
|
|
39
41
|
}
|
|
@@ -51,6 +53,7 @@ class LocalCoreAcpSessionCoordinator {
|
|
|
51
53
|
runtimeEnv: this.buildAgentRuntimeEnv(threadId, String(baseEnv.PATH || ''), options.runtimeEnv),
|
|
52
54
|
});
|
|
53
55
|
session.launchPermissionMode = permissionMode;
|
|
56
|
+
session.launchConfigKey = configKey;
|
|
54
57
|
session.launchRuntimeEnvKey = runtimeEnvKey;
|
|
55
58
|
this.sessions.set(threadId, session);
|
|
56
59
|
await this.options.transport.initializeSession(session);
|
|
@@ -204,6 +207,16 @@ class LocalCoreAcpSessionCoordinator {
|
|
|
204
207
|
...runtimeEnv,
|
|
205
208
|
};
|
|
206
209
|
}
|
|
210
|
+
buildLaunchConfigKey(config) {
|
|
211
|
+
return JSON.stringify({
|
|
212
|
+
agentType: config.agentType,
|
|
213
|
+
workDir: config.workDir,
|
|
214
|
+
command: config.command,
|
|
215
|
+
args: config.args || [],
|
|
216
|
+
env: config.env || {},
|
|
217
|
+
model: config.model || '',
|
|
218
|
+
});
|
|
219
|
+
}
|
|
207
220
|
resolveLaunchPermissionMode(threadId, permissionModeOverride = '') {
|
|
208
221
|
const row = this.options.store.getThreadRow(threadId);
|
|
209
222
|
const mode = String(permissionModeOverride || row?.agent_mode || '').trim();
|
|
@@ -978,6 +978,13 @@ class LocalCoreAcpStore {
|
|
|
978
978
|
WHERE id = ?
|
|
979
979
|
`).run(mode, new Date().toISOString(), threadId);
|
|
980
980
|
}
|
|
981
|
+
updateThreadAgentType(threadId, agentType) {
|
|
982
|
+
this.db.prepare(`
|
|
983
|
+
UPDATE threads
|
|
984
|
+
SET agent_type = ?, acp_session_id = NULL, acp_supports_load = 0, updated_at = ?
|
|
985
|
+
WHERE id = ?
|
|
986
|
+
`).run(agentType, new Date().toISOString(), threadId);
|
|
987
|
+
}
|
|
981
988
|
updateThreadSession(threadId, sessionId, supportsLoad) {
|
|
982
989
|
this.db.prepare(`
|
|
983
990
|
UPDATE threads
|
|
@@ -5,7 +5,17 @@ exports.parseSlashCommand = parseSlashCommand;
|
|
|
5
5
|
exports.normalizeAgentMode = normalizeAgentMode;
|
|
6
6
|
exports.formatAgentMode = formatAgentMode;
|
|
7
7
|
exports.modeHelpText = modeHelpText;
|
|
8
|
+
exports.normalizeAgentCommandTarget = normalizeAgentCommandTarget;
|
|
9
|
+
exports.formatAgentList = formatAgentList;
|
|
10
|
+
exports.agentHelpText = agentHelpText;
|
|
8
11
|
exports.DEFAULT_AGENT_MODE = 'default';
|
|
12
|
+
const AGENT_ALIASES = {
|
|
13
|
+
claude: 'claudecode',
|
|
14
|
+
'claude-code': 'claudecode',
|
|
15
|
+
claude_code: 'claudecode',
|
|
16
|
+
claudecode: 'claudecode',
|
|
17
|
+
cc: 'claudecode',
|
|
18
|
+
};
|
|
9
19
|
const MODE_ALIASES = {
|
|
10
20
|
auto: 'auto',
|
|
11
21
|
default: 'default',
|
|
@@ -58,3 +68,21 @@ function modeHelpText(currentMode) {
|
|
|
58
68
|
'`/mode yolo` 会跳过工具权限申请;使用 `/mode default` 可恢复默认权限。'
|
|
59
69
|
].join('\n');
|
|
60
70
|
}
|
|
71
|
+
function normalizeAgentCommandTarget(agent) {
|
|
72
|
+
const key = String(agent || '').trim().toLowerCase();
|
|
73
|
+
return AGENT_ALIASES[key] || key;
|
|
74
|
+
}
|
|
75
|
+
function formatAgentList(agents) {
|
|
76
|
+
return [...new Set(agents.map(normalizeAgentCommandTarget).filter(Boolean))].sort();
|
|
77
|
+
}
|
|
78
|
+
function agentHelpText(input) {
|
|
79
|
+
const currentAgent = normalizeAgentCommandTarget(input.currentAgent) || 'unknown';
|
|
80
|
+
const defaultAgent = normalizeAgentCommandTarget(input.defaultAgent) || 'unknown';
|
|
81
|
+
const availableAgents = formatAgentList(input.availableAgents);
|
|
82
|
+
return [
|
|
83
|
+
`当前线程 Agent:${currentAgent}`,
|
|
84
|
+
`默认 Agent:${defaultAgent}`,
|
|
85
|
+
`可用 Agent:${availableAgents.length ? availableAgents.join(', ') : '无'}`,
|
|
86
|
+
'可用命令:`/agent list`、`/agent current`、`/agent use <agent-id>`、`/agent reset`。',
|
|
87
|
+
].join('\n');
|
|
88
|
+
}
|
|
@@ -48,6 +48,7 @@ class WorkspaceRouter {
|
|
|
48
48
|
return this.schedulerBridge.deleteJob(jobId);
|
|
49
49
|
},
|
|
50
50
|
},
|
|
51
|
+
getAgentTypes: () => this.options.getCapabilities().snapshot.agents.map((agent) => agent.agentType),
|
|
51
52
|
log: options.log,
|
|
52
53
|
});
|
|
53
54
|
}
|
|
@@ -203,12 +204,14 @@ class WorkspaceRouter {
|
|
|
203
204
|
}
|
|
204
205
|
async sendThreadMessage(threadId, content, options) {
|
|
205
206
|
const { workspaceId } = (0, workspace_thread_id_js_1.decodeThreadId)(threadId);
|
|
206
|
-
const route =
|
|
207
|
+
const route = isLocalSlashCommand(content)
|
|
208
|
+
? await this.getWorkspaceRoute(workspaceId)
|
|
209
|
+
: await this.getThreadWorkspaceRoute(threadId, workspaceId);
|
|
207
210
|
return this.localCoreAcp.sendThreadMessage(threadId, content, route.config, options);
|
|
208
211
|
}
|
|
209
212
|
async sendThreadAction(threadId, content) {
|
|
210
213
|
const { workspaceId } = (0, workspace_thread_id_js_1.decodeThreadId)(threadId);
|
|
211
|
-
const route = await this.
|
|
214
|
+
const route = await this.getThreadWorkspaceRoute(threadId, workspaceId);
|
|
212
215
|
return this.localCoreAcp.sendThreadAction(threadId, content, route.config);
|
|
213
216
|
}
|
|
214
217
|
async interruptRun(runId) {
|
|
@@ -425,11 +428,21 @@ class WorkspaceRouter {
|
|
|
425
428
|
await this.localCoreAcp.deleteThread(thread.id).catch(() => ({ deleted: false }));
|
|
426
429
|
}
|
|
427
430
|
}
|
|
428
|
-
async
|
|
431
|
+
async getThreadWorkspaceRoute(threadId, workspaceId) {
|
|
432
|
+
const defaultRoute = await this.getWorkspaceRoute(workspaceId);
|
|
433
|
+
const row = this.store.getThreadRow(threadId);
|
|
434
|
+
const threadAgentType = String(row?.agent_type || '').trim().toLowerCase();
|
|
435
|
+
if (!threadAgentType || threadAgentType === defaultRoute.agentType) {
|
|
436
|
+
return defaultRoute;
|
|
437
|
+
}
|
|
438
|
+
return this.getWorkspaceRoute(workspaceId, threadAgentType);
|
|
439
|
+
}
|
|
440
|
+
async getWorkspaceRoute(workspaceId, agentTypeOverride = '') {
|
|
429
441
|
const configState = await this.options.readConfigState();
|
|
430
442
|
const projects = Array.isArray(configState.parsed?.projects) ? configState.parsed.projects : [];
|
|
431
443
|
const matched = projects.find((project) => String(project?.name || '').trim() === workspaceId);
|
|
432
|
-
const
|
|
444
|
+
const project = matched && agentTypeOverride ? withAgentTypeOverride(matched, agentTypeOverride) : matched;
|
|
445
|
+
const route = project ? this.resolveProjectRoute(configState, project) : null;
|
|
433
446
|
if (!matched || !route) {
|
|
434
447
|
throw new Error(`Workspace "${workspaceId}" is not configured as a Local AI Core ACP workspace.`);
|
|
435
448
|
}
|
|
@@ -512,6 +525,29 @@ function inferWorkspacePath(project) {
|
|
|
512
525
|
}
|
|
513
526
|
return '';
|
|
514
527
|
}
|
|
528
|
+
function withAgentTypeOverride(project, agentType) {
|
|
529
|
+
const options = project.agent?.options && typeof project.agent.options === 'object'
|
|
530
|
+
? { ...project.agent.options }
|
|
531
|
+
: {};
|
|
532
|
+
delete options.command;
|
|
533
|
+
delete options.args;
|
|
534
|
+
return {
|
|
535
|
+
...project,
|
|
536
|
+
agent: {
|
|
537
|
+
...(project.agent || {}),
|
|
538
|
+
type: agentType,
|
|
539
|
+
options,
|
|
540
|
+
},
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
function isLocalSlashCommand(content) {
|
|
544
|
+
const text = typeof content === 'string' ? content : String(content.displayText || '');
|
|
545
|
+
const normalized = text.trim().toLowerCase();
|
|
546
|
+
return normalized === '/agent'
|
|
547
|
+
|| normalized.startsWith('/agent ')
|
|
548
|
+
|| normalized === '/mode'
|
|
549
|
+
|| normalized.startsWith('/mode ');
|
|
550
|
+
}
|
|
515
551
|
function workspaceHealth(path) {
|
|
516
552
|
if (!path) {
|
|
517
553
|
return {
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ThreadCommandService = void 0;
|
|
4
|
+
const local_core_slash_commands_js_1 = require("../acp/local-core-slash-commands.js");
|
|
5
|
+
const index_js_1 = require("../agents/index.js");
|
|
6
|
+
class ThreadCommandService {
|
|
7
|
+
options;
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.options = options;
|
|
10
|
+
}
|
|
11
|
+
async execute(input) {
|
|
12
|
+
const command = (0, local_core_slash_commands_js_1.parseSlashCommand)(input.content);
|
|
13
|
+
if (!command) {
|
|
14
|
+
return { handled: false, displayText: '' };
|
|
15
|
+
}
|
|
16
|
+
if (command.name === 'mode') {
|
|
17
|
+
return {
|
|
18
|
+
handled: true,
|
|
19
|
+
displayText: await this.executeModeCommand(input.threadId, input.workspaceId, command.args),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (command.name === 'agent') {
|
|
23
|
+
return {
|
|
24
|
+
handled: true,
|
|
25
|
+
displayText: this.executeAgentCommand(input.threadId, input.workspaceId, command.args, input.defaultAgentType),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
return { handled: false, displayText: '' };
|
|
29
|
+
}
|
|
30
|
+
async executeModeCommand(threadId, workspaceId, args) {
|
|
31
|
+
const row = this.options.getThreadRow(threadId);
|
|
32
|
+
const currentMode = row?.agent_mode || local_core_slash_commands_js_1.DEFAULT_AGENT_MODE;
|
|
33
|
+
const requested = args.join(' ').trim();
|
|
34
|
+
if (!requested) {
|
|
35
|
+
return (0, local_core_slash_commands_js_1.modeHelpText)(currentMode);
|
|
36
|
+
}
|
|
37
|
+
const mode = (0, local_core_slash_commands_js_1.normalizeAgentMode)(requested);
|
|
38
|
+
if (!mode) {
|
|
39
|
+
return `未知模式:${requested}\n\n${(0, local_core_slash_commands_js_1.modeHelpText)(currentMode)}`;
|
|
40
|
+
}
|
|
41
|
+
this.options.updateThreadAgentMode(threadId, mode);
|
|
42
|
+
try {
|
|
43
|
+
await this.options.setThreadMode?.(threadId, mode);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
this.options.log?.(`localcore-acp mode sync failed for ${threadId}: ${error instanceof Error ? error.message : String(error)}`);
|
|
47
|
+
}
|
|
48
|
+
this.options.createAuditEvent({
|
|
49
|
+
type: 'permission.changed',
|
|
50
|
+
workspaceId,
|
|
51
|
+
actor: 'local',
|
|
52
|
+
summary: `Thread agent mode changed to ${mode}.`,
|
|
53
|
+
metadata: { threadId, mode },
|
|
54
|
+
});
|
|
55
|
+
if (mode === 'bypassPermissions') {
|
|
56
|
+
return '已切换到 yolo 模式:后续工具调用会跳过权限申请。使用 `/mode default` 可恢复默认权限。';
|
|
57
|
+
}
|
|
58
|
+
return `已切换到 ${(0, local_core_slash_commands_js_1.formatAgentMode)(mode)} 模式。`;
|
|
59
|
+
}
|
|
60
|
+
executeAgentCommand(threadId, workspaceId, args, defaultAgentType) {
|
|
61
|
+
const row = this.options.getThreadRow(threadId);
|
|
62
|
+
const currentAgent = (0, local_core_slash_commands_js_1.normalizeAgentCommandTarget)(row?.agent_type || defaultAgentType);
|
|
63
|
+
const defaultAgent = (0, local_core_slash_commands_js_1.normalizeAgentCommandTarget)(defaultAgentType);
|
|
64
|
+
const availableAgents = (0, local_core_slash_commands_js_1.formatAgentList)(this.options.getAgentTypes?.() || [defaultAgent, currentAgent]);
|
|
65
|
+
const [rawAction = '', ...rest] = args;
|
|
66
|
+
const action = String(rawAction || '').trim().toLowerCase();
|
|
67
|
+
if (!action || action === 'current') {
|
|
68
|
+
return [
|
|
69
|
+
`当前线程 Agent:${currentAgent}`,
|
|
70
|
+
`来源:${currentAgent === defaultAgent ? '默认设置' : '线程设置'}`,
|
|
71
|
+
`默认 Agent:${defaultAgent}`,
|
|
72
|
+
'使用 `/agent list` 查看可用 Agent,或 `/agent use <agent-id>` 切换。',
|
|
73
|
+
].join('\n');
|
|
74
|
+
}
|
|
75
|
+
if (action === 'list') {
|
|
76
|
+
return (0, local_core_slash_commands_js_1.agentHelpText)({ currentAgent, defaultAgent, availableAgents });
|
|
77
|
+
}
|
|
78
|
+
if (action === 'reset') {
|
|
79
|
+
if (currentAgent === defaultAgent) {
|
|
80
|
+
return `当前线程已经使用默认 Agent:${defaultAgent}。`;
|
|
81
|
+
}
|
|
82
|
+
const activeRun = this.hasActiveRun(threadId);
|
|
83
|
+
this.options.updateThreadAgentType(threadId, defaultAgent);
|
|
84
|
+
if (!activeRun) {
|
|
85
|
+
this.options.closeThreadSession?.(threadId);
|
|
86
|
+
}
|
|
87
|
+
this.options.createAuditEvent({
|
|
88
|
+
type: 'agent.changed',
|
|
89
|
+
workspaceId,
|
|
90
|
+
actor: 'local',
|
|
91
|
+
summary: `Thread agent reset to ${defaultAgent}.`,
|
|
92
|
+
metadata: { threadId, agentType: defaultAgent, previousAgentType: currentAgent },
|
|
93
|
+
});
|
|
94
|
+
return `已清除当前线程 Agent 设置。\n当前线程将回到默认 Agent:${defaultAgent}。`;
|
|
95
|
+
}
|
|
96
|
+
const rawRequested = action === 'use' ? rest.join(' ').trim() : args.join(' ').trim();
|
|
97
|
+
const requestedAgent = (0, local_core_slash_commands_js_1.normalizeAgentCommandTarget)(rawRequested);
|
|
98
|
+
if (!requestedAgent) {
|
|
99
|
+
return (0, local_core_slash_commands_js_1.agentHelpText)({ currentAgent, defaultAgent, availableAgents });
|
|
100
|
+
}
|
|
101
|
+
const definition = (0, index_js_1.resolveAgentRuntimeDefinition)(requestedAgent);
|
|
102
|
+
if (!definition) {
|
|
103
|
+
return `未知 Agent:${rawRequested}\n可用 Agent:${availableAgents.length ? availableAgents.join(', ') : '无'}`;
|
|
104
|
+
}
|
|
105
|
+
const canonicalAgent = definition.agentType;
|
|
106
|
+
if (!availableAgents.includes(canonicalAgent)) {
|
|
107
|
+
return `Agent "${canonicalAgent}" 当前不可用。\n可用 Agent:${availableAgents.length ? availableAgents.join(', ') : '无'}`;
|
|
108
|
+
}
|
|
109
|
+
if (canonicalAgent === currentAgent) {
|
|
110
|
+
return `当前线程已经使用 Agent:${canonicalAgent}。`;
|
|
111
|
+
}
|
|
112
|
+
const activeRun = this.hasActiveRun(threadId);
|
|
113
|
+
this.options.updateThreadAgentType(threadId, canonicalAgent);
|
|
114
|
+
if (!activeRun) {
|
|
115
|
+
this.options.closeThreadSession?.(threadId);
|
|
116
|
+
}
|
|
117
|
+
const runningNote = activeRun
|
|
118
|
+
? `\n当前正在运行的任务仍会继续使用 ${currentAgent},下一轮开始生效。`
|
|
119
|
+
: '';
|
|
120
|
+
this.options.createAuditEvent({
|
|
121
|
+
type: 'agent.changed',
|
|
122
|
+
workspaceId,
|
|
123
|
+
actor: 'local',
|
|
124
|
+
summary: `Thread agent changed to ${canonicalAgent}.`,
|
|
125
|
+
metadata: { threadId, agentType: canonicalAgent, previousAgentType: currentAgent },
|
|
126
|
+
});
|
|
127
|
+
return `已将当前线程 Agent 切换为 ${canonicalAgent}。\n后续消息将使用 ${canonicalAgent} 处理。${runningNote}`;
|
|
128
|
+
}
|
|
129
|
+
hasActiveRun(threadId) {
|
|
130
|
+
const latestRun = this.options.getLatestRunForThread(threadId);
|
|
131
|
+
return Boolean(latestRun && ['queued', 'running', 'awaiting_input'].includes(latestRun.status));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
exports.ThreadCommandService = ThreadCommandService;
|