@kafca/agentdock 0.1.30 → 0.1.33

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 (110) hide show
  1. package/LICENSE.md +73 -0
  2. package/README.md +15 -0
  3. package/dist/renderer/assets/{Badge-DlVJI1Ys.js → Badge-VeSLCPPV.js} +1 -1
  4. package/dist/renderer/assets/{Chat-oa8OjaHQ.js → Chat-DWTQeTgn.js} +1 -1
  5. package/dist/renderer/assets/{ChatMarkdown-C-N8KS5C.js → ChatMarkdown-C9gSQIVb.js} +1 -1
  6. package/dist/renderer/assets/{Config-D9sL_d4D.js → Config-CTA-pZNR.js} +1 -1
  7. package/dist/renderer/assets/{CronList-Z5JU3DHk.js → CronList-BngBCnFY.js} +1 -1
  8. package/dist/renderer/assets/{Dashboard-D3BwbG43.js → Dashboard-D4pGvDpc.js} +2 -2
  9. package/dist/renderer/assets/{EmptyState-QOj765Ul.js → EmptyState-DMf8rzDs.js} +1 -1
  10. package/dist/renderer/assets/{KnowledgeDetail-J7n01mPu.js → KnowledgeDetail-C1Ym_cHk.js} +1 -1
  11. package/dist/renderer/assets/{KnowledgeHome-BFnH0NVk.js → KnowledgeHome-DPRiR72G.js} +1 -1
  12. package/dist/renderer/assets/{Logs-DfSUifXc.js → Logs-CRHecmzO.js} +1 -1
  13. package/dist/renderer/assets/{Modal-QjEGhyru.js → Modal-BDhhPv2l.js} +1 -1
  14. package/dist/renderer/assets/{Page-qdHFSw7x.js → Page-DdDZN7AE.js} +1 -1
  15. package/dist/renderer/assets/{ProjectDetail-DS_rfvhh.js → ProjectDetail-DCsr3LkW.js} +1 -1
  16. package/dist/renderer/assets/{ProjectList-COtyZd7H.js → ProjectList-Cnm-iLvg.js} +1 -1
  17. package/dist/renderer/assets/{Select-BQ8mncVu.js → Select-Dw4FCXhJ.js} +1 -1
  18. package/dist/renderer/assets/{SessionChat-DjVnjuQy.js → SessionChat-O-6abK8x.js} +1 -1
  19. package/dist/renderer/assets/{SessionList-88dgGZJ8.js → SessionList-5yptvVL9.js} +1 -1
  20. package/dist/renderer/assets/ThreadChat-CIM_o2HO.js +23 -0
  21. package/dist/renderer/assets/{Workspace-D_hzSJjX.js → Workspace-D9UeUCNr.js} +1 -1
  22. package/dist/renderer/assets/{arrow-left-BMpknulW.js → arrow-left-CKfxNOXE.js} +1 -1
  23. package/dist/renderer/assets/{book-open-CiaOeQbU.js → book-open-CQddlENV.js} +1 -1
  24. package/dist/renderer/assets/{check-CgwYH4GF.js → check-CZYvOmIS.js} +1 -1
  25. package/dist/renderer/assets/{chevron-down-BzD2S1OO.js → chevron-down-CVIWFoXF.js} +1 -1
  26. package/dist/renderer/assets/{circle-BDHD7g7l.js → circle-DSfdQM7k.js} +1 -1
  27. package/dist/renderer/assets/{desktop-BiR5LPL5.js → desktop-B9KUgeOV.js} +1 -1
  28. package/dist/renderer/assets/{desktop-BkMW-h5p.js → desktop-O8_6ZCVZ.js} +2 -2
  29. package/dist/renderer/assets/{funnel-Bruf5FYA.js → funnel-pB5NegZB.js} +1 -1
  30. package/dist/renderer/assets/{heart-D7Mz04B0.js → heart-BT5laZ_b.js} +1 -1
  31. package/dist/renderer/assets/{index-CL1e8m3U.js → index-BYyDk28K.js} +2 -2
  32. package/dist/renderer/assets/{index-gZIRr4_o.js → index-zTUUYax3.js} +1 -1
  33. package/dist/renderer/assets/{pencil-C6gzDMse.js → pencil-C0thxLi6.js} +1 -1
  34. package/dist/renderer/assets/{play-DqTXX-Pr.js → play-CmZ0kWtt.js} +1 -1
  35. package/dist/renderer/assets/{plug-ykmbeaO3.js → plug-CeDQatBe.js} +1 -1
  36. package/dist/renderer/assets/{plus-DHE60vMX.js → plus-Di__xFOZ.js} +1 -1
  37. package/dist/renderer/assets/projects-B-pbhhtH.js +1 -0
  38. package/dist/renderer/assets/{save-CGIvrdQI.js → save-BDatCjfO.js} +1 -1
  39. package/dist/renderer/assets/{search-D7IFAwyE.js → search-DnTOjP0C.js} +1 -1
  40. package/dist/renderer/assets/{server-aOsirp7I.js → server-Ey_iHY6m.js} +1 -1
  41. package/dist/renderer/assets/{session-utils-Dxfp4ohQ.js → session-utils-DWaM7Rkr.js} +1 -1
  42. package/dist/renderer/assets/{sessions-Db1XPbG2.js → sessions-CYYjLD5I.js} +1 -1
  43. package/dist/renderer/assets/{shield-check-ChXeQK-d.js → shield-check-Br8BQzcn.js} +1 -1
  44. package/dist/renderer/assets/{trash-2-CfN-c1zw.js → trash-2-7YD616fw.js} +1 -1
  45. package/dist/renderer/assets/{user-C7OHaBp4.js → user-BR_5jmr9.js} +1 -1
  46. package/dist/renderer/assets/{wifi-off-CpaJigye.js → wifi-off-By9QdREz.js} +1 -1
  47. package/dist/renderer/index.html +1 -1
  48. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-backend.js +28 -4
  49. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-response-processor.js +2 -4
  50. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-turn-coordinator.js +102 -15
  51. package/dist-electron/services/local-ai-core/src/agents/claudecode/behavior.js +5 -0
  52. package/dist-electron/services/local-ai-core/src/agents/claudecode/definition.js +36 -0
  53. package/dist-electron/services/local-ai-core/src/agents/claudecode/index.js +15 -0
  54. package/dist-electron/services/local-ai-core/src/agents/codex/behavior.js +5 -0
  55. package/dist-electron/services/local-ai-core/src/agents/codex/definition.js +24 -0
  56. package/dist-electron/services/local-ai-core/src/agents/codex/index.js +15 -0
  57. package/dist-electron/services/local-ai-core/src/agents/hermes/behavior.js +29 -0
  58. package/dist-electron/services/local-ai-core/src/agents/hermes/definition.js +22 -0
  59. package/dist-electron/services/local-ai-core/src/agents/hermes/index.js +15 -0
  60. package/dist-electron/services/local-ai-core/src/agents/index.js +98 -0
  61. package/dist-electron/services/local-ai-core/src/agents/localcore-acp/behavior.js +5 -0
  62. package/dist-electron/services/local-ai-core/src/agents/localcore-acp/definition.js +14 -0
  63. package/dist-electron/services/local-ai-core/src/agents/localcore-acp/index.js +27 -0
  64. package/dist-electron/services/local-ai-core/src/agents/opencode/behavior.js +5 -0
  65. package/dist-electron/services/local-ai-core/src/agents/opencode/definition.js +18 -0
  66. package/dist-electron/services/local-ai-core/src/agents/opencode/index.js +15 -0
  67. package/dist-electron/services/local-ai-core/src/agents/opencode/launch.js +119 -0
  68. package/dist-electron/services/local-ai-core/src/agents/pi/behavior.js +5 -0
  69. package/dist-electron/services/local-ai-core/src/agents/pi/definition.js +23 -0
  70. package/dist-electron/services/local-ai-core/src/agents/pi/index.js +15 -0
  71. package/dist-electron/services/local-ai-core/src/agents/pi/launch.js +139 -0
  72. package/dist-electron/services/local-ai-core/src/agents/shared/acp-behavior.js +11 -0
  73. package/dist-electron/services/local-ai-core/src/agents/shared/agent-plugin.js +60 -0
  74. package/dist-electron/services/local-ai-core/src/agents/shared/definition.js +12 -0
  75. package/dist-electron/services/local-ai-core/src/agents/shared/launch-utils.js +122 -0
  76. package/dist-electron/services/local-ai-core/src/agents/shared/progress-replay.js +19 -0
  77. package/dist-electron/services/local-ai-core/src/agents/shared/replay-prefix.js +68 -0
  78. package/dist-electron/services/local-ai-core/src/channel/lark/local-core-lark-gateway.js +0 -2
  79. package/dist-electron/services/local-ai-core/src/channel/weixin/local-core-weixin-gateway.js +0 -1
  80. package/dist-electron/services/local-ai-core/src/cli/lac.js +2 -1
  81. package/dist-electron/services/local-ai-core/src/kernel/bootstrap.js +17 -11
  82. package/dist-electron/services/local-ai-core/src/plugins/builtin/agent-localcore-acp-plugin.js +9 -130
  83. package/dist-electron/services/local-ai-core/src/router/workspace-route-config.js +22 -397
  84. package/dist-electron/services/local-ai-core/src/runtime/agent-runtime-detector.js +9 -45
  85. package/dist-electron/services/local-ai-core/src/runtime/local-core-controller.js +9 -4
  86. package/dist-electron/services/local-ai-core/src/runtime/local-core-runtime-state.js +62 -1
  87. package/dist-electron/services/local-ai-core/src/runtime/runtime-detection-service.js +2 -12
  88. package/dist-electron/services/local-ai-core/src/scheduler/lark-schedule-adapter.js +16 -7
  89. package/dist-electron/services/local-ai-core/src/scheduler/local-schedule-adapter.js +10 -2
  90. package/dist-electron/services/local-ai-core/src/scheduler/scheduled-job-route.js +24 -0
  91. package/dist-electron/services/local-ai-core/src/scheduler/weixin-schedule-adapter.js +15 -6
  92. package/dist-electron/shared/desktop.js +3 -1
  93. package/dist-electron/src/pages/Threads/thread-chat-model.js +27 -18
  94. package/dist-electron/src/pages/Threads/thread-chat-permission.test.js +57 -18
  95. package/dist-electron/{electron → tests/contracts}/local-core-contracts.test.js +1 -1
  96. package/dist-electron/{electron → tests/electron}/agent-runtime-detector.test.js +31 -1
  97. package/dist-electron/{electron → tests/electron}/lac-cli.test.js +6 -3
  98. package/dist-electron/{electron → tests/electron}/plugin-kernel.test.js +93 -13
  99. package/dist-electron/{electron → tests/electron}/renderer-packaging.test.js +11 -6
  100. package/dist-electron/{electron → tests/electron}/runtime-detection-service.test.js +1 -1
  101. package/dist-electron/{electron → tests/electron}/security-approval-store.test.js +2 -2
  102. package/dist-electron/{electron → tests/electron}/workspace-task-store.test.js +95 -7
  103. package/dist-electron/{electron → tests/integration}/channel-content.test.js +2 -2
  104. package/dist-electron/{electron → tests/integration}/local-core-acp-content.test.js +1 -1
  105. package/dist-electron/{electron → tests/integration}/local-core-refactor.test.js +437 -15
  106. package/package.json +3 -2
  107. package/dist/renderer/assets/ThreadChat-BCdbTxBo.js +0 -23
  108. package/dist/renderer/assets/projects-Bx5p10th.js +0 -1
  109. /package/dist-electron/{electron → tests/contracts}/architecture-docs.test.js +0 -0
  110. /package/dist-electron/{electron → tests/electron}/knowledge-skill-script.test.js +0 -0
@@ -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-CL1e8m3U.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-BYyDk28K.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-CL1e8m3U.js";/**
1
+ import{c as a}from"./index-BYyDk28K.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-CL1e8m3U.js";/**
1
+ import{c as o}from"./index-BYyDk28K.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-CL1e8m3U.js";/**
1
+ import{c as o}from"./index-BYyDk28K.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-CL1e8m3U.js";/**
1
+ import{c as e}from"./index-BYyDk28K.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-BYyDk28K.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-CL1e8m3U.js";/**
1
+ import{c as a}from"./index-BYyDk28K.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-CL1e8m3U.js";/**
1
+ import{c}from"./index-BYyDk28K.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-CL1e8m3U.js";/**
1
+ import{c as e}from"./index-BYyDk28K.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-CL1e8m3U.js";/**
1
+ import{c as o}from"./index-BYyDk28K.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-CL1e8m3U.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-BYyDk28K.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-CL1e8m3U.js";/**
1
+ import{c}from"./index-BYyDk28K.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-CL1e8m3U.js";/**
1
+ import{c as e}from"./index-BYyDk28K.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-CL1e8m3U.js";/**
1
+ import{c as e}from"./index-BYyDk28K.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-CL1e8m3U.js";/**
1
+ import{c as a}from"./index-BYyDk28K.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-CL1e8m3U.js"></script>
8
+ <script type="module" crossorigin src="./assets/index-BYyDk28K.js"></script>
9
9
  <link rel="stylesheet" crossorigin href="./assets/index-DFiJR0vv.css">
10
10
  </head>
11
11
  <body class="bg-[#f5f5f7] dark:bg-[#151516]">
@@ -11,6 +11,7 @@ const local_core_acp_content_js_1 = require("./local-core-acp-content.js");
11
11
  const command_risk_js_1 = require("../security/command-risk.js");
12
12
  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
+ const index_js_1 = require("../agents/index.js");
14
15
  const ACP_PROMPT_TIMEOUT_MS = 15 * 60 * 1000;
15
16
  class LocalCoreAcpBackend {
16
17
  options;
@@ -98,7 +99,6 @@ class LocalCoreAcpBackend {
98
99
  type: binding.platform === 'lark' ? 'channel.chat' : binding.platform,
99
100
  channelId: binding.chat_id,
100
101
  participantId: binding.platform_user_id,
101
- threadId,
102
102
  },
103
103
  };
104
104
  },
@@ -200,8 +200,10 @@ class LocalCoreAcpBackend {
200
200
  sessionKey: row.bridge_session_key,
201
201
  },
202
202
  });
203
- void this.runPrompt(threadId, runId, row.bridge_session_key, config, message, options).catch((error) => {
204
- this.options.log?.(`localcore-acp prompt failed for ${threadId}: ${error instanceof Error ? error.message : String(error)}`);
203
+ setImmediate(() => {
204
+ void this.runPrompt(threadId, runId, row.bridge_session_key, config, message, options).catch((error) => {
205
+ this.options.log?.(`localcore-acp prompt failed for ${threadId}: ${error instanceof Error ? error.message : String(error)}`);
206
+ });
205
207
  });
206
208
  return { runId };
207
209
  }
@@ -301,6 +303,19 @@ class LocalCoreAcpBackend {
301
303
  session = await this.sessionCoordinator.ensureSession(threadId, bridgeSessionKey, config, {
302
304
  permissionMode: options.permissionMode,
303
305
  });
306
+ const priorAssistantFinalMessages = this.options.store
307
+ .getThread(threadId, [])
308
+ .messages
309
+ .filter((entry) => entry.role === 'assistant' && entry.kind === 'final')
310
+ .map((entry) => entry.content);
311
+ const priorAssistantProgressMessages = this.options.store
312
+ .getThread(threadId, [])
313
+ .messages
314
+ .filter((entry) => entry.role === 'assistant' && entry.kind === 'progress')
315
+ .map((entry) => ({
316
+ kind: entry.bridgeKind,
317
+ content: entry.content,
318
+ }));
304
319
  session.currentRunId = runId;
305
320
  session.currentTurn = {
306
321
  runId,
@@ -308,7 +323,11 @@ class LocalCoreAcpBackend {
308
323
  previewHandle: (0, node_crypto_1.randomUUID)(),
309
324
  thoughtPreviewHandle: (0, node_crypto_1.randomUUID)(),
310
325
  thoughtMessageId: `${runId}-thought-1`,
326
+ agentType: row.agent_type,
311
327
  assistantText: '',
328
+ rawAssistantText: '',
329
+ priorAssistantFinalMessages,
330
+ priorAssistantProgressMessages,
312
331
  thoughtText: '',
313
332
  thoughtSequence: 1,
314
333
  typingStarted: true,
@@ -338,7 +357,12 @@ class LocalCoreAcpBackend {
338
357
  this.turnCoordinator.closePendingThoughtSegment(session);
339
358
  this.turnCoordinator.flushPendingToolCall(session);
340
359
  if (currentTurn.assistantText) {
341
- const assistantText = (0, local_core_acp_progress_js_1.stripObservedToolTranscriptsFromAssistantText)(currentTurn.assistantText, currentTurn.toolObservations);
360
+ const behavior = (0, index_js_1.resolveAgentAcpBehavior)(currentTurn.agentType);
361
+ const normalizedFinalAssistantText = behavior.normalizeFinalAssistantText({
362
+ rawText: currentTurn.rawAssistantText || currentTurn.assistantText,
363
+ priorAssistantMessages: currentTurn.priorAssistantFinalMessages || [],
364
+ });
365
+ const assistantText = (0, local_core_acp_progress_js_1.stripObservedToolTranscriptsFromAssistantText)(normalizedFinalAssistantText, currentTurn.toolObservations);
342
366
  const processed = await this.responseProcessor.processAssistantResponse(threadId, assistantText);
343
367
  if (processed.displayContent) {
344
368
  this.options.store.appendMessage(threadId, 'assistant', processed.displayContent, 'final');
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.LocalCoreAcpResponseProcessor = void 0;
4
4
  const cron_command_detector_js_1 = require("../scheduler/cron-command-detector.js");
5
5
  const job_id_js_1 = require("../scheduler/job-id.js");
6
+ const scheduled_job_route_js_1 = require("../scheduler/scheduled-job-route.js");
6
7
  class LocalCoreAcpResponseProcessor {
7
8
  options;
8
9
  constructor(options) {
@@ -74,10 +75,7 @@ class LocalCoreAcpResponseProcessor {
74
75
  const job = await this.options.scheduler.createJob({
75
76
  workspaceId: binding.workspaceId,
76
77
  platform: binding.platform,
77
- route: {
78
- ...binding.route,
79
- threadId,
80
- },
78
+ route: (0, scheduled_job_route_js_1.withoutThreadRoute)(binding.route),
81
79
  name: command.name,
82
80
  schedule: command.schedule,
83
81
  scheduleDescription: command.scheduleDescription,
@@ -6,6 +6,7 @@ const local_core_acp_progress_js_1 = require("./local-core-acp-progress.js");
6
6
  const local_core_acp_permission_lifecycle_js_1 = require("./local-core-acp-permission-lifecycle.js");
7
7
  const workspace_acp_permissions_js_1 = require("./workspace-acp-permissions.js");
8
8
  const local_core_slash_commands_js_1 = require("./local-core-slash-commands.js");
9
+ const index_js_1 = require("../agents/index.js");
9
10
  class LocalCoreAcpTurnCoordinator {
10
11
  options;
11
12
  constructor(options) {
@@ -22,6 +23,9 @@ class LocalCoreAcpTurnCoordinator {
22
23
  if (!currentTurn || !currentRunId) {
23
24
  return;
24
25
  }
26
+ for (const toolCall of (0, local_core_acp_progress_js_1.getToolCallsInOrder)(currentTurn).filter((entry) => entry.suppressReplay)) {
27
+ (0, local_core_acp_progress_js_1.deletePendingToolCall)(currentTurn, toolCall.key);
28
+ }
25
29
  const pending = (0, local_core_acp_progress_js_1.getToolCallsInOrder)(currentTurn)
26
30
  .filter((toolCall) => !toolCall.emitted);
27
31
  if (pending.length === 0) {
@@ -100,7 +104,13 @@ class LocalCoreAcpTurnCoordinator {
100
104
  });
101
105
  return;
102
106
  }
103
- const options = (0, local_core_acp_permission_lifecycle_js_1.parsePermissionOptions)(payload.params?.options);
107
+ const currentTurn = session.currentTurn;
108
+ const behavior = (0, index_js_1.resolveAgentAcpBehavior)(currentTurn?.agentType);
109
+ const parsedOptions = (0, local_core_acp_permission_lifecycle_js_1.parsePermissionOptions)(payload.params?.options);
110
+ const options = behavior.normalizePermissionOptions?.({
111
+ options: parsedOptions,
112
+ params: payload.params,
113
+ }) || parsedOptions;
104
114
  const toolTitle = (0, workspace_acp_permissions_js_1.formatToolCallContent)(payload.params?.toolCall);
105
115
  this.closePendingThoughtSegment(session);
106
116
  if ((this.options.getThreadAgentMode?.(session.threadId) || local_core_slash_commands_js_1.DEFAULT_AGENT_MODE) === 'bypassPermissions') {
@@ -204,6 +214,9 @@ class LocalCoreAcpTurnCoordinator {
204
214
  if (isToolScopedAssistantUpdate(update) || consumeRawAssistantProgressChunk(session, String(update.content.text || ''))) {
205
215
  const content = String(update.content.text || '').trim();
206
216
  if (content) {
217
+ if (this.shouldSuppressProgress(currentTurn, 'tool', content)) {
218
+ return;
219
+ }
207
220
  this.options.appendMessage(session.threadId, 'assistant', content, 'progress', undefined, 'tool');
208
221
  this.options.emitBridge({
209
222
  type: 'reply',
@@ -215,7 +228,20 @@ class LocalCoreAcpTurnCoordinator {
215
228
  }
216
229
  return;
217
230
  }
218
- const projection = (0, local_core_acp_progress_js_1.applyAssistantMessageChunk)(currentTurn, String(update.content.text || ''));
231
+ const chunk = String(update.content.text || '');
232
+ currentTurn.rawAssistantText = `${currentTurn.rawAssistantText || ''}${chunk}`;
233
+ const behavior = (0, index_js_1.resolveAgentAcpBehavior)(currentTurn.agentType);
234
+ const normalizedText = behavior.normalizeAssistantText({
235
+ rawText: currentTurn.rawAssistantText,
236
+ priorAssistantMessages: currentTurn.priorAssistantFinalMessages || [],
237
+ });
238
+ const nextChunk = normalizedText.startsWith(currentTurn.assistantText)
239
+ ? normalizedText.slice(currentTurn.assistantText.length)
240
+ : normalizedText;
241
+ if (!nextChunk) {
242
+ return;
243
+ }
244
+ const projection = (0, local_core_acp_progress_js_1.applyAssistantMessageChunk)(currentTurn, nextChunk);
219
245
  if (!projection) {
220
246
  return;
221
247
  }
@@ -237,6 +263,10 @@ class LocalCoreAcpTurnCoordinator {
237
263
  if (!projection) {
238
264
  return;
239
265
  }
266
+ if (this.shouldSuppressProgress(currentTurn, 'thought', projection.content)) {
267
+ this.resetThoughtSegment(currentTurn);
268
+ return;
269
+ }
240
270
  if (this.options.upsertMessage) {
241
271
  this.options.upsertMessage(session.threadId, projection.messageId, 'assistant', projection.content, 'progress', undefined, projection.bridgeKind);
242
272
  }
@@ -253,11 +283,16 @@ class LocalCoreAcpTurnCoordinator {
253
283
  case 'tool_call': {
254
284
  this.closePendingThoughtSegment(session);
255
285
  const toolCall = (0, local_core_acp_progress_js_1.registerPendingToolCall)({ currentTurn, runId: currentRunId, update });
256
- (0, local_core_acp_progress_js_1.recordToolObservation)(currentTurn, {
257
- name: toolCall.title,
258
- title: toolCall.title,
259
- input: toolCall.input,
260
- });
286
+ if (this.isKnownPriorToolInput(currentTurn, toolCall.title, toolCall.input)) {
287
+ toolCall.suppressReplay = true;
288
+ }
289
+ else {
290
+ (0, local_core_acp_progress_js_1.recordToolObservation)(currentTurn, {
291
+ name: toolCall.title,
292
+ title: toolCall.title,
293
+ input: toolCall.input,
294
+ });
295
+ }
261
296
  (0, local_core_acp_progress_js_1.syncLegacyPendingToolCall)(currentTurn, toolCall);
262
297
  return;
263
298
  }
@@ -314,14 +349,18 @@ class LocalCoreAcpTurnCoordinator {
314
349
  detail: displayTitle,
315
350
  content,
316
351
  });
317
- (0, local_core_acp_progress_js_1.recordToolObservation)(currentTurn, {
318
- name: toolName || displayTitle || title,
319
- title: displayTitle || title,
320
- status,
321
- input: updateInput === undefined ? toolCall?.input : updateInput,
322
- outputText: content,
323
- });
324
- this.emitProgress(session, currentRunId, (0, local_core_acp_progress_js_1.formatToolProgressMessage)({ toolName, title: displayTitle, status, content }), messageId, toolCallPayload);
352
+ const progressContent = (0, local_core_acp_progress_js_1.formatToolProgressMessage)({ toolName, title: displayTitle, status, content });
353
+ const suppressProgress = Boolean(toolCall?.suppressReplay) || this.shouldSuppressProgress(currentTurn, 'tool', progressContent);
354
+ if (!suppressProgress) {
355
+ (0, local_core_acp_progress_js_1.recordToolObservation)(currentTurn, {
356
+ name: toolName || displayTitle || title,
357
+ title: displayTitle || title,
358
+ status,
359
+ input: updateInput === undefined ? toolCall?.input : updateInput,
360
+ outputText: content,
361
+ });
362
+ this.emitProgress(session, currentRunId, progressContent, messageId, toolCallPayload);
363
+ }
325
364
  (0, local_core_acp_progress_js_1.syncLegacyPendingToolCall)(currentTurn, (0, local_core_acp_progress_js_1.resolveFallbackToolCall)(currentTurn));
326
365
  return;
327
366
  }
@@ -336,6 +375,9 @@ class LocalCoreAcpTurnCoordinator {
336
375
  if (!content) {
337
376
  return;
338
377
  }
378
+ if (this.shouldSuppressProgress(currentTurn, 'plan', content)) {
379
+ return;
380
+ }
339
381
  this.options.appendMessage(session.threadId, 'assistant', content, 'progress', undefined, 'plan');
340
382
  this.options.emitBridge({
341
383
  type: 'reply',
@@ -380,8 +422,53 @@ class LocalCoreAcpTurnCoordinator {
380
422
  toolCall,
381
423
  });
382
424
  }
425
+ shouldSuppressProgress(currentTurn, kind, content) {
426
+ const behavior = (0, index_js_1.resolveAgentAcpBehavior)(currentTurn.agentType);
427
+ return behavior.shouldSuppressProgress?.({
428
+ kind,
429
+ content,
430
+ priorProgressMessages: currentTurn.priorAssistantProgressMessages || [],
431
+ }) || false;
432
+ }
433
+ resetThoughtSegment(currentTurn) {
434
+ const runId = currentTurn.runId || 'thought';
435
+ const nextSequence = (currentTurn.thoughtSequence || 1) + 1;
436
+ currentTurn.thoughtSequence = nextSequence;
437
+ currentTurn.thoughtText = '';
438
+ currentTurn.thoughtPreviewStarted = false;
439
+ currentTurn.thoughtMessageId = `${runId}-thought-${nextSequence}`;
440
+ currentTurn.thoughtPreviewHandle = `${runId}-thought-preview-${nextSequence}`;
441
+ }
442
+ isKnownPriorToolInput(currentTurn, title, input) {
443
+ const compactInput = compactToolInput(input);
444
+ if (!compactInput) {
445
+ return false;
446
+ }
447
+ const needle = `${title}: ${compactInput}`.trim();
448
+ return (currentTurn.priorAssistantProgressMessages || []).some((message) => message.kind === 'tool' && message.content.includes(needle));
449
+ }
383
450
  }
384
451
  exports.LocalCoreAcpTurnCoordinator = LocalCoreAcpTurnCoordinator;
452
+ function compactToolInput(input) {
453
+ if (input === undefined || input === null) {
454
+ return '';
455
+ }
456
+ if (typeof input === 'string') {
457
+ return input.trim();
458
+ }
459
+ if (typeof input !== 'object') {
460
+ return String(input).trim();
461
+ }
462
+ const command = input.command;
463
+ if (typeof command === 'string' && command.trim()) {
464
+ return command.trim();
465
+ }
466
+ const path = input.path;
467
+ if (typeof path === 'string' && path.trim()) {
468
+ return path.trim();
469
+ }
470
+ return '';
471
+ }
385
472
  function isToolScopedAssistantUpdate(update) {
386
473
  const meta = update._meta;
387
474
  if (!meta || typeof meta !== 'object') {
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.claudeCodeAcpBehavior = void 0;
4
+ const acp_behavior_js_1 = require("../shared/acp-behavior.js");
5
+ exports.claudeCodeAcpBehavior = acp_behavior_js_1.standardAcpBehavior;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.claudeCodeAgentDefinition = void 0;
4
+ const desktop_js_1 = require("../../../../../shared/desktop.js");
5
+ const launch_utils_js_1 = require("../shared/launch-utils.js");
6
+ const behavior_js_1 = require("./behavior.js");
7
+ exports.claudeCodeAgentDefinition = {
8
+ agentType: 'claudecode',
9
+ displayName: 'Claude Code',
10
+ behavior: behavior_js_1.claudeCodeAcpBehavior,
11
+ detection: {
12
+ commandCandidates: ['claude-agent-acp', 'claude'],
13
+ versionArgs: ['--version'],
14
+ bundledRuntimes: [
15
+ {
16
+ packageName: desktop_js_1.DESKTOP_CLAUDECODE_ACP_PACKAGE,
17
+ candidates: [
18
+ 'dist/cli.js',
19
+ 'bin/claude-agent-acp.js',
20
+ 'cli.js',
21
+ ],
22
+ },
23
+ ],
24
+ },
25
+ buildLaunchConfig(input) {
26
+ const bundled = (0, launch_utils_js_1.resolveBundledAcpCommand)(desktop_js_1.DESKTOP_CLAUDECODE_ACP_PACKAGE, 'claude-agent-acp');
27
+ return {
28
+ ...bundled,
29
+ env: input.model
30
+ ? {
31
+ ANTHROPIC_MODEL: input.model,
32
+ }
33
+ : {},
34
+ };
35
+ },
36
+ };
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.claudeCodeAgentDefinition = exports.claudeCodeAcpBehavior = void 0;
4
+ exports.createBuiltinClaudeCodeAgentPlugin = createBuiltinClaudeCodeAgentPlugin;
5
+ const agent_plugin_js_1 = require("../shared/agent-plugin.js");
6
+ const behavior_js_1 = require("./behavior.js");
7
+ Object.defineProperty(exports, "claudeCodeAcpBehavior", { enumerable: true, get: function () { return behavior_js_1.claudeCodeAcpBehavior; } });
8
+ const definition_js_1 = require("./definition.js");
9
+ Object.defineProperty(exports, "claudeCodeAgentDefinition", { enumerable: true, get: function () { return definition_js_1.claudeCodeAgentDefinition; } });
10
+ function createBuiltinClaudeCodeAgentPlugin() {
11
+ return (0, agent_plugin_js_1.createBuiltinAgentPlugin)({
12
+ definition: definition_js_1.claudeCodeAgentDefinition,
13
+ match: (normalizedAgentType) => normalizedAgentType === 'claudecode',
14
+ });
15
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.codexAcpBehavior = void 0;
4
+ const acp_behavior_js_1 = require("../shared/acp-behavior.js");
5
+ exports.codexAcpBehavior = acp_behavior_js_1.standardAcpBehavior;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.codexAgentDefinition = void 0;
4
+ const desktop_js_1 = require("../../../../../shared/desktop.js");
5
+ const launch_utils_js_1 = require("../shared/launch-utils.js");
6
+ const behavior_js_1 = require("./behavior.js");
7
+ exports.codexAgentDefinition = {
8
+ agentType: 'codex',
9
+ displayName: 'Codex',
10
+ behavior: behavior_js_1.codexAcpBehavior,
11
+ detection: {
12
+ commandCandidates: ['codex-acp', 'codex'],
13
+ versionArgs: ['--version'],
14
+ bundledRuntimes: [
15
+ {
16
+ packageName: desktop_js_1.DESKTOP_CODEX_ACP_PACKAGE,
17
+ candidates: ['bin/codex-acp.js'],
18
+ },
19
+ ],
20
+ },
21
+ buildLaunchConfig() {
22
+ return (0, launch_utils_js_1.resolveBundledAcpCommand)(desktop_js_1.DESKTOP_CODEX_ACP_PACKAGE, 'codex-acp');
23
+ },
24
+ };
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.codexAgentDefinition = exports.codexAcpBehavior = void 0;
4
+ exports.createBuiltinCodexAgentPlugin = createBuiltinCodexAgentPlugin;
5
+ const agent_plugin_js_1 = require("../shared/agent-plugin.js");
6
+ const behavior_js_1 = require("./behavior.js");
7
+ Object.defineProperty(exports, "codexAcpBehavior", { enumerable: true, get: function () { return behavior_js_1.codexAcpBehavior; } });
8
+ const definition_js_1 = require("./definition.js");
9
+ Object.defineProperty(exports, "codexAgentDefinition", { enumerable: true, get: function () { return definition_js_1.codexAgentDefinition; } });
10
+ function createBuiltinCodexAgentPlugin() {
11
+ return (0, agent_plugin_js_1.createBuiltinAgentPlugin)({
12
+ definition: definition_js_1.codexAgentDefinition,
13
+ match: (normalizedAgentType) => normalizedAgentType === 'codex',
14
+ });
15
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hermesAcpBehavior = void 0;
4
+ const progress_replay_js_1 = require("../shared/progress-replay.js");
5
+ const replay_prefix_js_1 = require("../shared/replay-prefix.js");
6
+ function allowsPermanentPermission(params) {
7
+ if (!params || typeof params !== 'object') {
8
+ return true;
9
+ }
10
+ const record = params;
11
+ return record.allow_permanent !== false && record.allowPermanent !== false;
12
+ }
13
+ exports.hermesAcpBehavior = {
14
+ normalizeAssistantText(input) {
15
+ return (0, replay_prefix_js_1.stripAssistantReplayPrefix)(input.rawText, input.priorAssistantMessages);
16
+ },
17
+ normalizeFinalAssistantText(input) {
18
+ return (0, replay_prefix_js_1.stripAssistantReplayPrefix)(input.rawText, input.priorAssistantMessages);
19
+ },
20
+ shouldSuppressProgress(input) {
21
+ return (0, progress_replay_js_1.hasPriorProgressMessage)(input);
22
+ },
23
+ normalizePermissionOptions(input) {
24
+ if (allowsPermanentPermission(input.params)) {
25
+ return input.options;
26
+ }
27
+ return input.options.filter((option) => option.normalizedAction !== 'allow all');
28
+ },
29
+ };