@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.
Files changed (55) hide show
  1. package/README.md +6 -0
  2. package/dist/renderer/assets/{Badge-BX3RC8l6.js → Badge-D-WU4kUV.js} +1 -1
  3. package/dist/renderer/assets/{Chat-DJwIciel.js → Chat-BGkC5tAe.js} +1 -1
  4. package/dist/renderer/assets/{ChatMarkdown-DfGbRR0S.js → ChatMarkdown-CfbC1jRd.js} +1 -1
  5. package/dist/renderer/assets/{Config-2x2RDL3j.js → Config-qQb4bX5D.js} +1 -1
  6. package/dist/renderer/assets/{CronList-C6nPAmEo.js → CronList-CKhggzYk.js} +1 -1
  7. package/dist/renderer/assets/{Dashboard-2Wcx_bvJ.js → Dashboard-xn6cUy_n.js} +2 -2
  8. package/dist/renderer/assets/{EmptyState-DoCpF2tn.js → EmptyState-BdKBBUpr.js} +1 -1
  9. package/dist/renderer/assets/{KnowledgeDetail-CBRu2bXX.js → KnowledgeDetail-Duk8IQP3.js} +1 -1
  10. package/dist/renderer/assets/{KnowledgeHome-CItdlDVR.js → KnowledgeHome-BfjX_4Sv.js} +1 -1
  11. package/dist/renderer/assets/{Logs-Cd_7ZOXc.js → Logs-Bfq61QMn.js} +1 -1
  12. package/dist/renderer/assets/{Modal-B4eOiBsB.js → Modal-B3vlBmBr.js} +1 -1
  13. package/dist/renderer/assets/{Page-C5VH4D9U.js → Page-CPsLOP3z.js} +1 -1
  14. package/dist/renderer/assets/{ProjectDetail-D_DA--IP.js → ProjectDetail-D-g46wyF.js} +1 -1
  15. package/dist/renderer/assets/{ProjectList-CtCXJ50u.js → ProjectList-BrQEKDQ8.js} +1 -1
  16. package/dist/renderer/assets/{Select-B6E68LcN.js → Select-C4CFMQmF.js} +1 -1
  17. package/dist/renderer/assets/{SessionChat-D1HtMdQS.js → SessionChat-06Jny5_G.js} +1 -1
  18. package/dist/renderer/assets/{SessionList-Do-5-Xx6.js → SessionList-DPWIUbOg.js} +1 -1
  19. package/dist/renderer/assets/{ThreadChat-B1tEtE3V.js → ThreadChat-BjtU-j9q.js} +1 -1
  20. package/dist/renderer/assets/{Workspace-BlhS2RFw.js → Workspace-BcNmHuJx.js} +1 -1
  21. package/dist/renderer/assets/{arrow-left-DF1_F9Pk.js → arrow-left-DPzSmidS.js} +1 -1
  22. package/dist/renderer/assets/{book-open-DxRTGpWO.js → book-open-B0xhoRqZ.js} +1 -1
  23. package/dist/renderer/assets/{check-BAqPPYkf.js → check-BTJTyd0C.js} +1 -1
  24. package/dist/renderer/assets/{chevron-down-DIZZgSb3.js → chevron-down-B6jJXlhi.js} +1 -1
  25. package/dist/renderer/assets/{circle-B5raL_XK.js → circle-qRhJR9qR.js} +1 -1
  26. package/dist/renderer/assets/{desktop-CFcnzwcY.js → desktop-DXmXjjUR.js} +1 -1
  27. package/dist/renderer/assets/{funnel-BPjLpVSB.js → funnel-CbYKGTn8.js} +1 -1
  28. package/dist/renderer/assets/{heart-D2M1xN1N.js → heart-DjwWJfkz.js} +1 -1
  29. package/dist/renderer/assets/{index-Cx71F_Lz.js → index-BWmHJRhe.js} +2 -2
  30. package/dist/renderer/assets/{index-BijJAYmo.js → index-CyZs_2NJ.js} +1 -1
  31. package/dist/renderer/assets/{pencil-DlDr8Mmp.js → pencil-1dfAivmj.js} +1 -1
  32. package/dist/renderer/assets/{play-BOEG_mY8.js → play-CB3w1G6S.js} +1 -1
  33. package/dist/renderer/assets/{plug-BI27elC-.js → plug-Bvep5o3r.js} +1 -1
  34. package/dist/renderer/assets/{plus-BhURuFIQ.js → plus-DJVg9m09.js} +1 -1
  35. package/dist/renderer/assets/projects-xnW0fTtq.js +1 -0
  36. package/dist/renderer/assets/{save-RwkHNm9e.js → save-xjJn3qf2.js} +1 -1
  37. package/dist/renderer/assets/{search-DMNtm2WP.js → search-BK3UrQxM.js} +1 -1
  38. package/dist/renderer/assets/{server-CNaxKyAq.js → server-Dyd2eXJu.js} +1 -1
  39. package/dist/renderer/assets/{session-utils-vsALZkZN.js → session-utils-eXC0020s.js} +1 -1
  40. package/dist/renderer/assets/{sessions-BY-R1IL_.js → sessions-WLYpkyUt.js} +1 -1
  41. package/dist/renderer/assets/{shield-check-BF-4oJbj.js → shield-check-C0N6aWzF.js} +1 -1
  42. package/dist/renderer/assets/{trash-2-DduflM4q.js → trash-2-BGMTNJA6.js} +1 -1
  43. package/dist/renderer/assets/{user-DBcvnuW4.js → user-BcGMLyhu.js} +1 -1
  44. package/dist/renderer/assets/{wifi-off-X1nXESYu.js → wifi-off-FhcQx0HK.js} +1 -1
  45. package/dist/renderer/index.html +1 -1
  46. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-backend.js +25 -39
  47. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-session-coordinator.js +13 -0
  48. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-store.js +7 -0
  49. package/dist-electron/services/local-ai-core/src/acp/local-core-slash-commands.js +28 -0
  50. package/dist-electron/services/local-ai-core/src/router/workspace-router.js +40 -4
  51. package/dist-electron/services/local-ai-core/src/thread/thread-command-service.js +134 -0
  52. package/dist-electron/tests/electron/plugin-kernel.test.js +26 -0
  53. package/dist-electron/tests/integration/local-core-refactor.test.js +165 -0
  54. package/package.json +1 -1
  55. 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,`;
@@ -1,4 +1,4 @@
1
- import{c as a}from"./index-Cx71F_Lz.js";/**
1
+ import{c as a}from"./index-BWmHJRhe.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as o}from"./index-Cx71F_Lz.js";/**
1
+ import{c as o}from"./index-BWmHJRhe.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as o}from"./index-Cx71F_Lz.js";/**
1
+ import{c as o}from"./index-BWmHJRhe.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as e}from"./index-Cx71F_Lz.js";/**
1
+ import{c as e}from"./index-BWmHJRhe.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -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,4 +1,4 @@
1
- import{c as a}from"./index-Cx71F_Lz.js";/**
1
+ import{c as a}from"./index-BWmHJRhe.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c}from"./index-Cx71F_Lz.js";/**
1
+ import{c}from"./index-BWmHJRhe.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as e}from"./index-Cx71F_Lz.js";/**
1
+ import{c as e}from"./index-BWmHJRhe.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as o}from"./index-Cx71F_Lz.js";/**
1
+ import{c as o}from"./index-BWmHJRhe.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{z as o}from"./index-Cx71F_Lz.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};
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};
@@ -1,4 +1,4 @@
1
- import{c}from"./index-Cx71F_Lz.js";/**
1
+ import{c}from"./index-BWmHJRhe.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as e}from"./index-Cx71F_Lz.js";/**
1
+ import{c as e}from"./index-BWmHJRhe.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as e}from"./index-Cx71F_Lz.js";/**
1
+ import{c as e}from"./index-BWmHJRhe.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as a}from"./index-Cx71F_Lz.js";/**
1
+ import{c as a}from"./index-BWmHJRhe.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -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-Cx71F_Lz.js"></script>
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 slashResponse = await this.handleLocalSlashCommand(threadId, row.workspace_id, content);
153
- if (slashResponse) {
154
- this.options.store.appendMessage(threadId, 'assistant', slashResponse, 'final');
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: slashResponse,
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: slashResponse,
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 = await this.getWorkspaceRoute(workspaceId);
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.getWorkspaceRoute(workspaceId);
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 getWorkspaceRoute(workspaceId) {
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 route = matched ? this.resolveProjectRoute(configState, matched) : null;
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;