@wrongstack/webui 0.299.0 → 0.300.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/dist/assets/AgentRosterView-wkALMOGD.js +9 -0
  2. package/dist/assets/{AnalyticsDashboard-D58kSekC.js → AnalyticsDashboard-CIN35A_u.js} +1 -1
  3. package/dist/assets/AudienceMemoryPanel-BAY2Bh8z.js +3 -0
  4. package/dist/assets/ChangesView-CVWSTGmX.js +1 -0
  5. package/dist/assets/ChronicleDashboard-Bg3W7C9U.js +1 -0
  6. package/dist/assets/CodeEditor-CWY_6cQD.js +1 -0
  7. package/dist/assets/CodeMap-CjmKO0lB.js +1 -0
  8. package/dist/assets/CronJobsPanel-BinzTWNs.js +1 -0
  9. package/dist/assets/DeadCodeScanPanel-C3CgaNVv.js +2 -0
  10. package/dist/assets/DebugDashboard-BqUghn06.js +1 -0
  11. package/dist/assets/DesignGalleryView-CuWWQAlD.js +1 -0
  12. package/dist/assets/GoalView-2weuLiPM.js +1 -0
  13. package/dist/assets/KanbanView-DXYRrshJ.js +3 -0
  14. package/dist/assets/{MailboxDetailView-ZcKcOEAe.js → MailboxDetailView-aaHx9Nma.js} +1 -1
  15. package/dist/assets/MemoryManager-BgcicCyg.js +1 -0
  16. package/dist/assets/{ModelPicker-DvNLZzkm.js → ModelPicker-B3BqjJnT.js} +1 -1
  17. package/dist/assets/OfficeMapPanel-Ck8NUOEs.js +4 -0
  18. package/dist/assets/OfficeMapPanel-CpexsBed.css +1 -0
  19. package/dist/assets/{ProcessMonitor-2nSk6sXA.js → ProcessMonitor-CoMYZcdS.js} +1 -1
  20. package/dist/assets/{QueuePanel-4KBBWFxj.js → QueuePanel-CA3CVCO_.js} +1 -1
  21. package/dist/assets/{RefreshDebugView-D3XnE53y.js → RefreshDebugView-cqBtyNna.js} +1 -1
  22. package/dist/assets/RequirementIntakeView-BBtUk8mC.js +1 -0
  23. package/dist/assets/SageTabs-Di49i4Yu.js +2 -0
  24. package/dist/assets/SddHub-D8iV6l9A.js +2 -0
  25. package/dist/assets/SessionInspectView-DHC_xTzG.js +1 -0
  26. package/dist/assets/{SessionList-BeinIC-h.js → SessionList-DH-ZsHmv.js} +1 -1
  27. package/dist/assets/{SessionsDashboard-DEG_BylE.js → SessionsDashboard-Coi6htwg.js} +1 -1
  28. package/dist/assets/SetupScreen-CD2Sx4n9.js +1 -0
  29. package/dist/assets/{SkillDetailView-D7EQ2XtV.js → SkillDetailView-D7wSJWUX.js} +1 -1
  30. package/dist/assets/SpecsView-BRWSI1iV.js +1 -0
  31. package/dist/assets/TechStackView-BOjkuJLe.js +1 -0
  32. package/dist/assets/{TerminalPanel-BL9ZPGJt.js → TerminalPanel-Dg8WR5Un.js} +1 -1
  33. package/dist/assets/{Toaster-CJI70aa-.js → Toaster-DSKFSuK3.js} +1 -1
  34. package/dist/assets/activity-BWbV0byu.js +9 -0
  35. package/dist/assets/activity-Bjb_mil3.js +9 -0
  36. package/dist/assets/activity-Bze6njDy.js +9 -0
  37. package/dist/assets/activity-Ciqcr7Ps.js +9 -0
  38. package/dist/assets/activity-DA9hmVZV.js +9 -0
  39. package/dist/assets/activity-GdnS66AB.js +9 -0
  40. package/dist/assets/activity-eawh_OWs.js +9 -0
  41. package/dist/assets/{chat-DzPxYALH.js → chat-4NEOESoU.js} +1 -1
  42. package/dist/assets/{chat-DLn1hY01.js → chat-BSg62iwX.js} +1 -1
  43. package/dist/assets/{chat-OunddzYy.js → chat-Bb1TpPfJ.js} +1 -1
  44. package/dist/assets/{chat-DxLD17ER.js → chat-COLKjtcx.js} +1 -1
  45. package/dist/assets/{chat-DSEq1Bdz.js → chat-CfRKV9iX.js} +1 -1
  46. package/dist/assets/{chat-CwnuX7tG.js → chat-EbeT4kiS.js} +1 -1
  47. package/dist/assets/{chat-CRmMDzCb.js → chat-ux_gymOJ.js} +1 -1
  48. package/dist/assets/{common-DMM-xyW3.js → common-BXJbu5Y-.js} +1 -1
  49. package/dist/assets/{common-C9ikgX7d.js → common-BiNu_WzQ.js} +1 -1
  50. package/dist/assets/common-COVxQ0FV.js +1 -0
  51. package/dist/assets/{common-D29Zdkxb.js → common-Ch7JihXD.js} +1 -1
  52. package/dist/assets/{common-DoUBSHRY.js → common-DPaTeTls.js} +1 -1
  53. package/dist/assets/{common-vdwxzODB.js → common-DdGpRh8j.js} +1 -1
  54. package/dist/assets/{common-C5hY-d_0.js → common-pI6fYZW3.js} +1 -1
  55. package/dist/assets/i18n-C31PI0Up.js +2 -0
  56. package/dist/assets/index-5IWUhPO4.css +1 -0
  57. package/dist/assets/index-D1izXztg.js +132 -0
  58. package/dist/assets/{mailbox-store-D8TvJsuk.js → mailbox-store-Bc9ER3Ph.js} +1 -1
  59. package/dist/assets/{progress-ring-61A-xUEl.js → progress-ring-D_d6hn_4.js} +1 -1
  60. package/dist/assets/{roster-ws-Dfg_187V.js → roster-ws-D6dGRfC5.js} +1 -1
  61. package/dist/assets/settings-BKuhxUSF.js +1 -0
  62. package/dist/assets/settings-CeK0doV7.js +1 -0
  63. package/dist/assets/settings-DZ-H89lu.js +1 -0
  64. package/dist/assets/settings-DvrdpSdA.js +1 -0
  65. package/dist/assets/settings-SBUqq0ll.js +1 -0
  66. package/dist/assets/settings-W8t1ZrxM.js +1 -0
  67. package/dist/assets/settings-tOqZkk9R.js +1 -0
  68. package/dist/assets/stores-OBoFiAKe.js +7 -0
  69. package/dist/assets/ui-store-CE4-TlwB.js +1 -0
  70. package/dist/assets/useWebSocket-DuLtH2jI.js +29 -0
  71. package/dist/assets/{view-navigation-DxfiZrXS.js → view-navigation-DIDEcp4V.js} +1 -1
  72. package/dist/assets/ws-client-Bw1ixxwI.js +1 -0
  73. package/dist/components/AutonomyPicker.d.ts +1 -1
  74. package/dist/components/ChatView/auto-collapse.d.ts +42 -0
  75. package/dist/components/FallbackModal.d.ts +2 -0
  76. package/dist/components/KanbanVerificationDashboard.d.ts +0 -6
  77. package/dist/components/SettingsPanel/PluginToggleList.d.ts +11 -3
  78. package/dist/components/SettingsPanel/brain-section-options.d.ts +25 -55
  79. package/dist/components/TaskCard.d.ts +0 -1
  80. package/dist/components/TaskRiskPanel.d.ts +10 -3
  81. package/dist/components/TechStackView/shared.d.ts +11 -6
  82. package/dist/components/ThemeProvider.d.ts +6 -1
  83. package/dist/components/agent-roster-data.d.ts +2 -1
  84. package/dist/hooks/ws-handlers/files-mailbox-handlers.d.ts +1 -0
  85. package/dist/hooks/ws-handlers/misc-handlers.d.ts +13 -0
  86. package/dist/hooks/ws-handlers/session-handlers.d.ts +1 -0
  87. package/dist/index.css +30 -0
  88. package/dist/index.html +15 -15
  89. package/dist/index.js +25202 -11602
  90. package/dist/lib/file-icons.d.ts +3 -3
  91. package/dist/lib/palettes.d.ts +37 -0
  92. package/dist/lib/ws-client.d.ts +3 -3
  93. package/dist/providers.json +7 -7
  94. package/dist/stores/config-store.d.ts +9 -1
  95. package/dist/stores/context-editor-store.d.ts +9 -1
  96. package/dist/stores/fallback-store.d.ts +30 -0
  97. package/dist/stores/fleet-store.d.ts +13 -0
  98. package/dist/stores/index.d.ts +2 -0
  99. package/dist/stores/local-prefs.d.ts +4 -0
  100. package/dist/stores/mailbox-store.d.ts +2 -0
  101. package/dist/types/client-message.d.ts +12 -1
  102. package/dist/types/protocol-core.d.ts +19 -0
  103. package/dist/types/runtime.d.ts +8 -0
  104. package/dist/types/server-message.d.ts +13 -2
  105. package/package.json +9 -9
  106. package/dist/assets/AgentRosterView-BqojERFR.js +0 -11
  107. package/dist/assets/AudienceMemoryPanel-Cc1UkbDl.js +0 -3
  108. package/dist/assets/ChangesView-BKU80ANq.js +0 -1
  109. package/dist/assets/ChronicleDashboard-CvCS1Dj1.js +0 -1
  110. package/dist/assets/CodeEditor-BHZQhx_8.js +0 -1
  111. package/dist/assets/CodeMap-qllGEFLB.js +0 -1
  112. package/dist/assets/CronJobsPanel-DD5mhZ4Q.js +0 -1
  113. package/dist/assets/DeadCodeScanPanel-PB-c8et_.js +0 -2
  114. package/dist/assets/DebugDashboard-Q8QiVflQ.js +0 -1
  115. package/dist/assets/DesignGalleryView-CGOtWO7s.js +0 -1
  116. package/dist/assets/GoalView-Dlk42vW7.js +0 -1
  117. package/dist/assets/KanbanView-DIP6kKmU.js +0 -3
  118. package/dist/assets/MemoryManager-B7620q_K.js +0 -1
  119. package/dist/assets/OfficeMapPanel-BFIF-EMt.css +0 -1
  120. package/dist/assets/OfficeMapPanel-DKJNTtOZ.js +0 -4
  121. package/dist/assets/RequirementIntakeView-BMxlf8bt.js +0 -1
  122. package/dist/assets/SageTabs-g1hO2hJ0.js +0 -2
  123. package/dist/assets/SddHub-Kv_TbTgT.js +0 -2
  124. package/dist/assets/SessionInspectView-PnKTvyvP.js +0 -1
  125. package/dist/assets/SetupScreen-DxJwZ1OZ.js +0 -1
  126. package/dist/assets/SpecsView-Fm7pYYcj.js +0 -1
  127. package/dist/assets/TechStackView-Bo_UenRF.js +0 -1
  128. package/dist/assets/activity-BCgOEWgR.js +0 -5
  129. package/dist/assets/activity-BQ0zqkw2.js +0 -5
  130. package/dist/assets/activity-CAovbq3e.js +0 -5
  131. package/dist/assets/activity-CFQyCvgu.js +0 -5
  132. package/dist/assets/activity-CdQf7zRK.js +0 -5
  133. package/dist/assets/activity-DACvyn2-.js +0 -5
  134. package/dist/assets/activity-DOwYydU-.js +0 -5
  135. package/dist/assets/common-BfVFjVhf.js +0 -1
  136. package/dist/assets/i18n-B0hsnanh.js +0 -2
  137. package/dist/assets/index-DHdO0CRE.js +0 -132
  138. package/dist/assets/index-DKrFQ76m.css +0 -1
  139. package/dist/assets/settings-B5xal2R3.js +0 -1
  140. package/dist/assets/settings-BHtFy8EG.js +0 -1
  141. package/dist/assets/settings-Bss5hBla.js +0 -1
  142. package/dist/assets/settings-BzrLCVRP.js +0 -1
  143. package/dist/assets/settings-C7RdvmLZ.js +0 -1
  144. package/dist/assets/settings-Dd94HoV6.js +0 -1
  145. package/dist/assets/settings-Dm9THFe8.js +0 -1
  146. package/dist/assets/stores-BptlyD_v.js +0 -7
  147. package/dist/assets/ui-store-BsBnjO3w.js +0 -1
  148. package/dist/assets/useWebSocket-Bc4S0N4r.js +0 -29
  149. package/dist/assets/ws-client-DqFoX4jJ.js +0 -1
  150. package/dist/lib/accent-colors.d.ts +0 -136
@@ -0,0 +1,29 @@
1
+ import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{a as t,n,r,t as i}from"./chat-store-CtOyUCdF.js";import{La as a,Na as o,za as s}from"./vendor-BuarzSSb.js";import{t as c}from"./i18n-C31PI0Up.js";import{a as l,c as u,i as d,l as f,o as p,s as m,t as h}from"./ws-client-Bw1ixxwI.js";import{t as g}from"./session-store-b2KGFwkX.js";import{i as _,n as v}from"./codemap-activity-store-DQfjo7-j.js";import{A as y,F as b,N as ee,P as x,_ as te,a as ne,c as re,f as ie,g as S,h as ae,i as C,l as w,m as oe,o as se,p as ce,r as T,s as E,t as D,u as O,v as le,w as k,y as ue}from"./stores-OBoFiAKe.js";import{r as A}from"./mailbox-store-Bc9ER3Ph.js";import{n as j,t as de}from"./ui-store-CE4-TlwB.js";import{n as fe,o as pe}from"./view-navigation-DIDEcp4V.js";import{t as me}from"./codemap-index-store-COStDU-8.js";import{n as M}from"./Toaster-DSKFSuK3.js";var N=e(s(),1);function he(e,t){if(t)return!0;try{return new URLSearchParams(e).get(`shell`)===`desktop`}catch{return!1}}function P(){return typeof window>`u`?!1:he(window.location.search,!!window.wrongstackDesktopHost)}function F(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function I(e,t=``){return typeof e==`string`?e:t}function L(e,t=0){return typeof e==`number`&&Number.isFinite(e)?e:t}function ge(e){let t=F(e.payload);if(!t)return null;switch(e.type){case`provider.thinking_delta`:{let e=I(t.text);return e?{kind:`thinking-delta`,text:e}:null}case`provider.text_delta`:{let e=I(t.text);return e?{kind:`text-delta`,text:e,messageId:I(t.messageId)}:null}case`provider.response`:return{kind:`response`,content:t.content,stopReason:I(t.stopReason)};case`run.result`:return{kind:`run-result`,status:I(t.status),iterations:L(t.iterations,1),...typeof t.finalText==`string`?{finalText:t.finalText}:{}};case`error`:return{kind:`error`,message:I(t.message,`Run failed`)};default:return null}}function R(e){let t=F(e.payload);if(!t)return null;if(e.type===`tool.started`){let e=I(t.name,`tool`);return{kind:`started`,id:I(t.id,e),name:e,input:t.input,messageId:I(t.messageId)}}if(e.type===`tool.progress`){let e=F(t.event);return{kind:`progress`,id:I(t.id),name:I(t.name,`tool`),eventType:I(e?.type),text:I(e?.text).trim()}}return e.type===`tool.executed`?{kind:`executed`,id:I(t.id),name:I(t.name),ok:t.ok!==!1,durationMs:L(t.durationMs),...typeof t.output==`string`?{output:t.output}:{},...Array.isArray(t.sage)?{sage:t.sage.filter(e=>typeof e==`string`)}:{}}:null}function z(e){if(!(typeof e!=`number`||!Number.isFinite(e)))return e}function _e(e){return typeof e==`string`&&e.length>0?e:void 0}function ve(e){let t=F(e.payload);if(!t)return null;switch(e.type){case`fleet.concurrency_update`:return{kind:`concurrency`,active:L(t.fleetConcurrency),maximum:L(t.fleetConcurrencyMax),maxSpawns:z(t.maxSpawns),usedSpawns:z(t.usedSpawns),remainingSpawns:z(t.remainingSpawns),maxSpawnsSource:_e(t.maxSpawnsSource),maxConcurrentSource:_e(t.maxConcurrentSource),effectiveSource:_e(t.effectiveSource),checkpointMaxSpawns:z(t.checkpointMaxSpawns),ceilingMismatch:t.ceilingMismatch===!0||void 0};case`client.status_update`:return{kind:`client-status`,status:t};case`sessions.status_update`:return{kind:`sessions`,sessions:Array.isArray(t.sessions)?t.sessions:[]};case`coordinator.stats`:return{kind:`coordinator`,agents:Array.isArray(t.subagentStatuses)?t.subagentStatuses.filter(e=>F(e)!==null):[]};default:return null}}function ye(e){return`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
2
+ <rect width="64" height="64" fill="#121210" />
3
+ <path fill="#FD9F02" d="M5 27h10v10H5zM27 27h10v10H27zM38 27h10v10H38zM49 27h10v10H49z" />
4
+ <path fill="#FE2E5F" d="M16 32h10v10H16z" />
5
+ ${e===`ready`?`<circle cx="50" cy="14" r="14" fill="#22c55e" stroke="#fff" stroke-width="3" />`:e===`error`?`<circle cx="50" cy="14" r="14" fill="#ef4444" stroke="#fff" stroke-width="3" />`:e===`running`?`<circle cx="50" cy="14" r="14" fill="#f59e0b" stroke="#fff" stroke-width="3" />`:e===`attention`?`<circle cx="50" cy="14" r="14" fill="#eab308" stroke="#fff" stroke-width="3"><animate attributeName="opacity" values="1;0.3;1" dur="1s" repeatCount="indefinite"/></circle>`:``}
6
+ </svg>`}function be(e){return`data:image/svg+xml;charset=utf-8,${encodeURIComponent(e)}`}function xe(){if(typeof document>`u`)return null;let e=document.querySelector(`link[rel="icon"]`);return e||(e=document.createElement(`link`),e.rel=`icon`,e.type=`image/svg+xml`,document.head.appendChild(e)),e}var B=`idle`;function V(e){B=e;let t=xe();t&&(t.href=be(ye(e)))}var Se=!1;function Ce(){Se||typeof document>`u`||(Se=!0,document.addEventListener(`visibilitychange`,()=>{!document.hidden&&(B===`ready`||B===`error`||B===`attention`)&&V(`idle`)}))}var we=2048,Te=2*1024*1024,Ee=new Set([`image/png`,`image/jpeg`,`image/webp`,`image/gif`]),H=class extends Error{reason;constructor(e,t){super(e),this.reason=t,this.name=`ImageAttachmentError`}};function De(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(r.result),r.onerror=()=>n(r.error),r.readAsDataURL(e)})}function Oe(e){let t=e.indexOf(`,`),n=t>=0?e.length-t-1:e.length;return Math.floor(n*3/4)}function ke(e){return/^data:([^;,]+)/.exec(e)?.[1]??`image/png`}async function Ae(e){try{return await createImageBitmap(e)}catch{let t=URL.createObjectURL(e);try{return await new Promise((e,n)=>{let r=new Image;r.onload=()=>e(r),r.onerror=()=>n(Error(`image decode failed`)),r.src=t})}finally{URL.revokeObjectURL(t)}}}function je(e,t,n,r,i){let a=document.createElement(`canvas`);a.width=t,a.height=n;let o=a.getContext(`2d`);if(!o)throw new H(`canvas 2d context unavailable`,`decode_failed`);o.drawImage(e,0,0,t,n);let s=a.toDataURL(`image/webp`,i);return s.startsWith(`data:image/webp`)?s:r?a.toDataURL(`image/png`):a.toDataURL(`image/jpeg`,i)}var Me=0;function Ne(){return Me+=1,`img_${Date.now()}_${Me}`}async function Pe(e){let t=Ee.has(e.type),n;try{n=await Ae(e)}catch{throw new H(`Could not decode image "${e.name}"`,`decode_failed`)}let r=n.width,i=n.height,a=Math.max(r,i);if(!(!t||a>we||e.size>Te)){let t=await De(e);return{id:Ne(),dataUrl:t,mediaType:e.type,bytes:Oe(t),name:e.name||void 0,width:r,height:i}}let o=e.type!==`image/jpeg`,s=Math.min(1,we/a),c=.85,l=je(n,Math.max(1,Math.round(r*s)),Math.max(1,Math.round(i*s)),o,c);Oe(l)>4194304&&(s=Math.min(s,1280/a),c=.7,l=je(n,Math.max(1,Math.round(r*s)),Math.max(1,Math.round(i*s)),o,c)),`close`in n&&n.close();let u=Oe(l);if(u>4194304)throw new H(`Image "${e.name}" is too large after compression`,`too_large`);return{id:Ne(),dataUrl:l,mediaType:ke(l),bytes:u,name:e.name||void 0,width:Math.max(1,Math.round(r*s)),height:Math.max(1,Math.round(i*s))}}function Fe(e){return e.map(e=>{let t=e.dataUrl.indexOf(`,`);return{data:t>=0?e.dataUrl.slice(t+1):e.dataUrl,mediaType:e.mediaType,...e.name?{name:e.name}:{}}})}var U=null;function Ie(){if(typeof window>`u`)return null;if(U)return U;let e=window.AudioContext||window.webkitAudioContext;if(!e)return null;try{U=new e}catch{return null}return U}function W(e,t,n){let r=Ie();if(!r)return;let i=r.currentTime+t,a=r.createOscillator(),o=r.createGain();a.type=`sine`,a.frequency.value=e,o.gain.setValueAtTime(0,i),o.gain.linearRampToValueAtTime(.18,i+.01),o.gain.exponentialRampToValueAtTime(1e-4,i+n),a.connect(o).connect(r.destination),a.start(i),a.stop(i+n+.02)}function Le(){W(659.25,0,.18),W(880,.12,.24)}function Re(){W(523.25,0,.15),W(659.25,.1,.15),W(783.99,.2,.25)}var G=`default`;G=typeof window<`u`&&`Notification`in window?Notification.permission:`unsupported`;async function ze(){if(G===`unsupported`||G===`granted`||G===`denied`)return G;try{let e=await Notification.requestPermission();return G=e,e}catch{return`denied`}}function Be(e,t,n){if(!(typeof document>`u`||!document.hidden)&&G===`granted`)try{let r=new Notification(e,{body:t,icon:`/wrongstack.svg`,tag:n??`wrongstack-run`,requireInteraction:n===`wrongstack-confirm`});r.onclick=()=>{window.focus(),r.close()}}catch{}}var Ve={"iteration.started":He,"provider.text_delta":Ue,"provider.thinking_delta":We,"tool.started":Ge,"tool.progress":Ke,"tool.executed":qe,"tool.confirm_needed":Je,"run.result":Ye};function He(e){if(!d(e))return;l(e);let t=e.payload;g.getState().setIteration({index:t.index,max:t.maxIterations??0}),i.getState().setLoading(!0),typeof document<`u`&&document.hidden&&V(`running`),i.getState().runStart===null&&i.getState().setRunStart({at:Date.now(),cost:g.getState().cost}),i.getState().setCurrentAssistantMessage(null)}function Ue(e){if(!d(e))return;let t=ge(e);if(t?.kind!==`text-delta`)return;f.flush(`__thinking__`),i.getState().clearThinking();let n=i.getState().currentAssistantMessageId;n||(n=i.getState().addMessage({role:`assistant`,content:``,streaming:!0}),i.getState().setCurrentAssistantMessage(n)),f.push(n,t.text,(e,t)=>i.getState().appendToMessage(e,t))}function We(e){if(!d(e))return;let t=ge(e);t?.kind===`thinking-delta`&&f.push(`__thinking__`,t.text,(e,t)=>i.getState().appendThinking(t))}function Ge(e){if(!d(e))return;l(e);let t=R(e);if(t?.kind!==`started`)return;let n=i.getState().getToolMessageId(t.id);if(n){i.getState().setCurrentToolId(n);return}f.flushAll(),i.getState().clearThinking();let r=i.getState().currentAssistantMessageId;r&&i.getState().finalizeMessage(r,{final:!1}),i.getState().setCurrentAssistantMessage(null);let a=i.getState().addMessage({role:`tool`,content:``,toolName:t.name,toolInput:t.input,toolUseId:t.id});i.getState().setCurrentToolId(a),i.getState().addExecution({id:t.id,name:t.name,input:t.input,ok:!0,startedAt:Date.now()})}function Ke(e){if(!d(e))return;let t=R(e);if(t?.kind!==`progress`)return;let n=t.text;if(!n)return;let r=i.getState().getToolMessageId(t.id);if(!r)return;let a=t.eventType===`warning`?`⚠ `:``;f.push(r,`${a}${n}\n`,(e,n)=>i.getState().appendToolProgressLinesByUseId(t.id,n.split(`
7
+ `).filter(e=>e.length>0)))}function qe(e){if(!d(e))return;l(e);let t=R(e);if(t?.kind!==`executed`)return;let{currentToolId:n}=i.getState(),r=t.id?i.getState().getToolMessageId(t.id):n;r&&(f.drop(r),t.id?i.getState().setToolResultByUseId(t.id,t.output??``,t.ok):i.getState().setToolResult(r,t.output??``,t.ok),i.getState().updateMessage(r,{toolDurationMs:t.durationMs,...t.sage&&t.sage.length>0?{sageLines:t.sage}:{}})),t.id&&i.getState().updateExecution(t.id,{completedAt:Date.now(),durationMs:t.durationMs,output:t.output,ok:t.ok}),n&&r===n&&i.getState().setCurrentToolId(null)}function Je(e){if(!d(e))return;let t=e.payload;if(c.getState().yolo===!0&&!t.boundaryReason){h(b.getState().wsUrl).sendConfirm(t.id,`yes`),j.getState().hideConfirm();return}j.getState().showConfirm({id:t.id,toolName:t.toolName,input:t.input,suggestedPattern:t.suggestedPattern,decisionSource:t.decisionSource,riskTier:t.riskTier,boundaryReason:t.boundaryReason});try{Re()}catch{}ze(),Be(`${g.getState().projectName||`Agent`} needs approval`,`Tool "${t.toolName}" is waiting for your decision.`,`agent-confirm`),typeof document<`u`&&document.hidden&&V(`attention`)}function Ye(e){if(!d(e))return;let n=p(e,{status:`string`},{iterations:`number`,finalText:`string`,error:`object`});if(!n)return;let a=n.iterations??1;f.flushAll(),i.getState().flushThinkingLog(Math.max(1,a)),g.getState().setIteration(null),i.getState().setLoading(!1);let o=i.getState().currentAssistantMessageId,s=n.status===`done`?n.finalText?.trim():void 0;if(o){let e=i.getState().messages.find(e=>e.id===o);i.getState().updateMessage(o,{content:e?.content?.trim()?e.content:s??e?.content??``}),i.getState().finalizeMessage(o,{final:!0})}else if(s){let e=i.getState().runStart,t=r(s).stripped.trim(),n=i.getState().messages,a;for(let t=n.length-1;t>=0;t--){let r=n[t];if(r?.role===`assistant`&&(!e||r.timestamp>=e.at)){a=r;break}}let o=a?.content.trim();if(!(o!==void 0&&(o===s||o===t))){let e=i.getState().addMessage({role:`assistant`,content:s});i.getState().finalizeMessage(e,{final:!0})}}i.getState().setCurrentAssistantMessage(null),i.getState().clearThinking();let c=i.getState().runStart;if(c&&n.status===`done`){let e=i.getState().messages,n=-1,r=0;for(let i=e.length-1;i>=0;i--){let a=t(e[i]);if(a.role===`assistant`&&n===-1&&a.content&&(n=i),a.role===`tool`&&a.timestamp>=c.at&&(r+=1),a.role===`user`&&a.timestamp<=c.at)break}if(n!==-1){let t=g.getState().cost;i.getState().updateMessage(e[n]?.id,{runSummary:{iterations:a,tools:r,durationMs:Date.now()-c.at,costDelta:Math.max(0,t-c.cost)}})}}if(i.getState().setRunStart(null),n.status!==`done`&&n.error)i.getState().addMessage({role:`assistant`,content:`Error: ${n.error.message}`,isError:!0}),M.error(`Run ended: ${n.error.message}`),Be(`${g.getState().projectName||`Agent`} run failed`,n.error.message),typeof document<`u`&&document.hidden&&V(`error`);else if(n.status===`done`){if(typeof document<`u`&&document.hidden&&(M.success(`Run completed in ${a} iteration${a===1?``:`s`}`),Be(`${g.getState().projectName||`Agent`} run finished`,`Completed in ${a} iteration${a===1?``:`s`}.`),V(`ready`)),ze(),b.getState().soundOnComplete)try{Le()}catch{}typeof document<`u`&&document.dispatchEvent(new CustomEvent(`chat:next-step-countdown`))}let l=i.getState(),u=l.queue[0];if(!u)return;if(u.alreadyDispatched===!0){Xe(u);let e=l.dequeueDrainable();return e?Ze(e):void 0}let m=l.dequeue();if(m)return Ze(m)}function Xe(e){if(e.bubbleAdded===!0)return;let t=e.images??[];i.getState().addMessage({role:`user`,content:e.text,...t.length>0?{attachments:t.map(e=>({id:e.id,kind:`image`,dataUrl:e.dataUrl,mediaType:e.mediaType,bytes:e.bytes,name:e.name}))}:{}}),e.bubbleAdded=!0}function Ze(e){let t=h(b.getState().wsUrl),n=e.images??[];if(i.getState().addMessage({role:`user`,content:e.text,...n.length>0?{attachments:n.map(e=>({id:e.id,kind:`image`,dataUrl:e.dataUrl,mediaType:e.mediaType,bytes:e.bytes,name:e.name}))}:{}}),e.mode===`btw`){e.alreadyDispatched!==!0&&t.sendMailboxMessage({type:`btw`,to:`leader`,subject:`btw from WebUI`,body:e.text,priority:`normal`,audience:`all`});return}i.getState().setLoading(!0),t.sendMessage(e.text,n.length>0?Fe(n):void 0)}var Qe={"coordinator.status":e=>{let t=e.payload;x.getState().setCoordinatorStatus(t.status,t.mode),t.taskQueue&&x.getState().updateCoordinatorStats({total:t.subagentCount??0,running:0,idle:0,stopped:0,inFlight:t.taskQueue.running,pending:t.taskQueue.pending,completed:t.taskQueue.completed})},"coordinator.stats":e=>{let t=e.payload;x.getState().updateCoordinatorStats(t)},"budget.threshold_reached":e=>{let t=e.payload;x.getState().pushEvent(`budget.threshold_reached`,t,t.ts??Date.now(),t.subagentId,t.taskId),t.limit>0&&t.used/t.limit*100>=85&&x.getState().recordBudgetAlert(t.subagentId,t.kind,t.used,t.limit),x.getState().updateSubagentBudget(t.subagentId,{budgetUsage:{iterations:0,toolCalls:0,tokens:0,costUsd:0,elapsedMs:t.used??0}})},"budget.decision":e=>{let t=e.payload,n=t.extended?.timeoutMs??t.extended?.maxIterations??t.extended?.maxToolCalls;x.getState().recordBudgetDecision(t.subagentId,t.kind,t.decision,n),x.getState().pushEvent(`budget.decision`,{subagentId:t.subagentId,kind:t.kind,decision:t.decision,newLimit:n},Date.now(),t.subagentId)},"subagent.budget_extended":e=>{let t=e.payload;x.getState().recordBudgetExtended(t.subagentId,t.kind,t.extendedTo),x.getState().pushEvent(`subagent.budget_extended`,t,Date.now(),t.subagentId)},"consensus.vote_initiated":e=>{let t=e.payload;x.getState().pushConsensusVote(t.changeId,t.title,t.eligible),x.getState().pushEvent(`consensus.vote_initiated`,t,Date.now()),M.info(`Vote started: `+t.title)},"consensus.vote_cast":e=>{let t=e.payload,n=x.getState().consensusVotes.get(t.changeId)?.eligible.find(e=>e.agentId===t.voterId);x.getState().recordConsensusVote(t.changeId,t.voterId,n?.agentName??t.voterId,t.value),x.getState().pushEvent(`consensus.vote_cast`,t,Date.now(),t.voterId)},"consensus.vote_resolved":e=>{let t=e.payload;x.getState().resolveConsensusVote(t.changeId,t.result,t.approveCount,t.rejectCount),x.getState().pushEvent(`consensus.vote_resolved`,t,Date.now()),M.info(`Vote resolved: `+t.result+` (y`+t.approveCount+` n`+t.rejectCount+`)`)},"task.pending":e=>{let t=e.payload;x.getState().pushTaskPending(t.taskId,t.description,t.priority),x.getState().pushEvent(`task.pending`,t,Date.now())},"task.started":e=>{let t=e.payload;x.getState().startTask(t.taskId,t.subagentId),x.getState().pushEvent(`task.started`,t,Date.now(),t.subagentId)},"task.completed":e=>{let t=e.payload;x.getState().completeTask(t.taskId,t.status,t.durationMs),x.getState().pushEvent(`task.completed`,t,Date.now(),t.subagentId)},"task.failed":e=>{let t=e.payload;x.getState().failTask(t.taskId,t.error),x.getState().pushEvent(`task.failed`,{taskId:t.taskId,subagentId:t.subagentId,error:String(t.error).slice(0,120)},Date.now(),t.subagentId),M.error(`Task failed: `+String(t.error).slice(0,80))}};function K(){let e=h();e?.send?.({type:`mailbox.messages`,payload:{limit:30,incompleteOnly:!0}}),e?.send?.({type:`mailbox.agents`,payload:{}})}var q=null;function J(){q!==null&&clearTimeout(q),q=setTimeout(()=>{q=null,K()},300)}function $e(e){let t=e.payload;if(t.error){y.getState().setError(t.error);return}y.getState().setTree(t.root,t.tree)}function et(e){let t=e.payload;if(t.error){y.getState().setError(t.error);return}y.getState().openFile(t.filePath,t.content)}function tt(e){let t=e.payload;t.success?y.getState().markSaved(t.filePath):t.error&&y.getState().setError(`Save failed: ${t.error}`)}function nt(e){let t=u(`mailbox.event`,e.payload);t&&(m.getState().pushEvent(t),m.getState().setActive(!0)),J()}function rt(e){let t=e.payload;t?.messages&&A.getState().setMessages(t.messages)}function it(e){let t=e.payload;t?.agents&&A.getState().setAgents(t.agents)}function at(e){let t=u(`mailbox.received`,e.payload);t&&(m.getState().pushEvent(t),m.getState().setActive(!0)),J()}function ot(e){J()}function st(e){let t=e.payload;t?.agentId&&A.getState().removeAgent(t.agentId)}function ct(e){A.getState().setMessages([]),K()}function lt(e){J()}function ut(e){let t=e.payload;t&&typeof t.totalRemoved==`number`&&A.getState().setLastCompaction({readByAllRemoved:t.readByAllRemoved??0,expiredRemoved:t.expiredRemoved??0,stalePurged:t.stalePurged??0,totalRemoved:t.totalRemoved,remaining:t.remaining??0}),J()}function dt(e){let t=e.payload;if(t?.success){J();return}M.error(`Mailbox action failed: ${t?.error??`unknown error`}`)}var ft={"files.tree":$e,"files.read":et,"files.written":tt,"mailbox.event":nt,"mailbox.messages":rt,"mailbox.agents":it,"mailbox.received":at,"mailbox.agent_registered":ot,"mailbox.agent_deregistered":st,"mailbox.cleared":ct,"mailbox.purged":lt,"mailbox.compacted":ut,"mailbox.action_result":dt};function pt(e){let t=e.payload;D.getState().setSnapshot(t.worktrees??[],t.baseBranch??``)}function mt(e){let t=e.payload;D.getState().pushEvent(t)}function ht(e){let t=e.payload;D.getState().setOrphans(t.orphans??[],t.canClean??!1,t.reason)}function gt(e){let t=e.payload;D.getState().setCleanResult({...t,at:Date.now()})}function _t(e){let t=e.payload;D.getState().setMergeResult({...t,at:Date.now()})}function vt(e){let t=e.payload;D.getState().setDiff(t.dir,t.summary)}function yt(e){k.getState().applyEvent(e.payload);let t=u(`subagent.event`,e.payload);t&&(m.getState().pushEvent(t),m.getState().setActive(!0))}function bt(e){let t=ve(e);t?.kind===`concurrency`&&k.setState({fleetConcurrency:t.active,fleetConcurrencyMax:t.maximum,...t.maxSpawns===void 0?{}:{fleetMaxSpawns:t.maxSpawns},...t.usedSpawns===void 0?{}:{fleetUsedSpawns:t.usedSpawns},...t.remainingSpawns===void 0?{}:{fleetRemainingSpawns:t.remainingSpawns},...t.effectiveSource===void 0?{}:{fleetBudgetSource:t.effectiveSource},...t.checkpointMaxSpawns===void 0?{}:{fleetCheckpointMaxSpawns:t.checkpointMaxSpawns},...t.ceilingMismatch===void 0?{}:{fleetCeilingMismatch:t.ceilingMismatch}})}function xt(e){let t=ve(e);if(t?.kind!==`client-status`)return;let n=t.status;ie.getState().setCurrentSession({clientType:n.clientType,clientId:n.clientId,agentCount:n.agentCount,model:n.model,mode:n.mode,toolCalls:n.toolCalls,inputTokens:n.inputTokens,outputTokens:n.outputTokens,cacheTokens:n.cacheTokens,costUsd:n.costUsd,timestamp:n.timestamp})}function St(e){let t=ve(e);if(t?.kind!==`sessions`)return;ie.getState().setLiveSessions(t.sessions);let n=Date.now();if(n-wt>=5e3&&(wt=n,K()),n-Ct<1e3)return;Ct=n;let r=u(`sessions.status_update`,e.payload);r&&(m.getState().pushEvent(r),m.getState().setActive(!0))}var Ct=0,wt=0,Tt={"worktree.state":pt,"worktree.event":mt,"worktree.orphans":ht,"worktree.cleanup_result":gt,"worktree.merge_result":_t,"worktree.diff_result":vt,"subagent.event":yt,"fleet.concurrency_update":bt,"client.status_update":xt,"sessions.status_update":St};function Et(e,t){let n=e=>e.trim().replace(/\s+/g,` `).toLowerCase();return n(e)===n(t)}var Dt=50,Ot=200;function kt(e){return e.length<=300?e:`${e.slice(0,299)}…`}function At(e){return{...e,text:kt(e.text)}}function jt(e){let t=[];for(let n of Object.values(e))n.state===`exited`&&t.push(n);if(t.length<=Ot)return e;t.sort((e,t)=>(t.exitedAt??t.lastSeenAt).localeCompare(e.exitedAt??e.lastSeenAt));let n={...e};for(let e of t.slice(Ot))delete n[e.id];return n}var Y=o()(e=>({traces:[],contextMemories:{},transitions:[],pushTrace:t=>e(e=>{let n={...e.contextMemories},r=[...e.transitions],i=t.injected.map(At),a=t.activated.map(At);for(let e of i){let i=n[e.id];n[e.id]={...e,state:i?.state===`active`?`active`:`injected`,trigger:t.trigger,enteredAt:i?.enteredAt??t.at,lastSeenAt:t.at};let a=`${t.at}_injected_${e.id}`;r.some(e=>e.id===a)||r.unshift({id:a,at:t.at,memoryId:e.id,action:`injected`,reason:`${t.trigger} · score ${e.score.toFixed(2)}`})}return{traces:[{...t,activated:a,injected:i},...e.traces.filter(e=>e.runId!==t.runId)].slice(0,Dt),contextMemories:jt(n),transitions:r.slice(0,100)}}),applyContextSnapshot:t=>e(e=>{let n={...e.contextMemories},r=[...e.transitions],i=new Set(t.activeMemoryIds);for(let e of t.activeMemoryIds){let r=n[e];n[e]=r?{...r,state:`active`,lastSeenAt:t.at,exitedAt:void 0}:Mt(e,t.at,`active`)}for(let e of t.enteredMemoryIds){let n=`${t.at}_entered_${e}`;r.some(e=>e.id===n)||r.unshift({id:n,at:t.at,memoryId:e,action:`entered`,reason:`present in provider request`})}for(let e of t.exitedMemoryIds){let i=n[e];i&&(n[e]={...i,state:`exited`,exitedAt:t.at});let a=`${t.at}_exited_${e}`;r.some(e=>e.id===a)||r.unshift({id:a,at:t.at,memoryId:e,action:`exited`,reason:`absent from provider request`})}for(let[e,a]of Object.entries(n))if((a.state===`injected`||a.state===`active`)&&!i.has(e)&&(n[e]={...a,state:`exited`,exitedAt:t.at},!t.exitedMemoryIds.includes(e))){let n=`${t.at}_exited_before_provider_${e}`;r.some(e=>e.id===n)||r.unshift({id:n,at:t.at,memoryId:e,action:`exited`,reason:a.state===`injected`?`removed before provider request`:`absent from provider context snapshot`})}return{contextMemories:jt(n),transitions:r.slice(0,100)}}),resetContext:()=>e({contextMemories:{},transitions:[]}),clear:()=>e({traces:[],contextMemories:{},transitions:[]})}));function Mt(e,t,n){return{id:e,kind:`unknown`,text:`Memory details were not present in this UI process.`,score:0,relationStrength:0,anchors:[],tags:[],activationReasons:[],importance:0,confidence:0,freshness:0,persistence:`unknown`,state:n,trigger:`context snapshot`,enteredAt:t,lastSeenAt:t,isPlaceholder:!0}}var Nt=100,Pt=new Set([`exited`,`superseded`,`archived`,`staled`,`contradicted`]);function Ft(e,t=new Date){let n=e.event,r=X(e.memoryId),i=X(e.at)??t.toISOString(),a={id:`${n}_${t.getTime()}_${Math.random().toString(36).slice(2,7)}`,at:i,event:n};if(n===`memory.accepted`&&r)return{...a,action:`entered`,memoryId:r,label:`${r} entered memory`,detail:Lt(e)};if(n===`memory.merged`&&r){let t=Array.isArray(e.mergedIds)?e.mergedIds.length:0;return{...a,action:`merged`,memoryId:r,label:`${r} merged`,detail:t>0?`${t} records folded in`:void 0}}if(n===`memory.recovered`&&r)return{...a,action:`recovered`,memoryId:r,label:`${r} recovered`,detail:X(e.reason)};if(n===`memory.deleted`&&r)return{...a,action:`exited`,memoryId:r,label:`${r} exited memory`,detail:Rt(e)};if(n===`memory.updated`&&r){let t=X(e.status)??`updated`;return{...a,action:t===`deleted`?`exited`:`updated`,memoryId:r,label:t===`deleted`?`${r} exited memory`:`${r} updated → ${t}`,detail:Lt(e)}}if(n===`memory.graph_edge_added`){let t=X(e.from),n=X(e.to);if(!t?.startsWith(`mem:`)||!n?.startsWith(`mem:`))return null;let r=X(e.relation)??`related_to`,i=Z(e.weight),o=Array.isArray(e.evidence)?e.evidence.filter(e=>typeof e==`string`):[];return{...a,action:`related`,memoryId:t.startsWith(`mem:`)?t.slice(4):void 0,label:`${zt(t)} ↔ ${zt(n)}`,detail:[r,i===void 0?void 0:`weight ${i.toFixed(2)}`,o.length>0?`why: ${o.join(`, `)}`:void 0].filter(Boolean).join(` · `)}}return n===`memory.relationships_rebuilt`?{...a,action:`related`,label:`Memory relationships rebuilt`,detail:`${Z(e.added)??0} added / ${Z(e.proposed)??0} proposed`}:n===`memory.superseded`&&r?{...a,action:`superseded`,memoryId:r,label:`${r} → superseded`,detail:X(e.reason)??Lt(e)}:n===`memory.archived`&&r?{...a,action:`archived`,memoryId:r,label:`${r} → archived`,detail:X(e.reason)}:n===`memory.staled`&&r?{...a,action:`staled`,memoryId:r,label:`${r} → staled`,detail:X(e.reason)??`anchor drift detected`}:n===`memory.contradicted`&&r?{...a,action:`contradicted`,memoryId:r,label:`${r} → contradicted`,detail:X(e.reason)??`conflicting evidence`}:null}var It=o()(e=>({items:[],pushEvent:t=>e(e=>{let n=Ft(t);return n?{items:[n,...Pt.has(n.action)?e.items.filter(e=>!(Pt.has(e.action)&&e.memoryId===n.memoryId)):e.items].slice(0,Nt)}:e}),clear:()=>e({items:[]})}));function X(e){return typeof e==`string`&&e.length>0?e:void 0}function Z(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function Lt(e){let t=[X(e.kind),X(e.persistence)],n=Z(e.confidence),r=Z(e.freshness);return n!==void 0&&t.push(`confidence ${n.toFixed(2)}`),r!==void 0&&t.push(`freshness ${r.toFixed(2)}`),t.filter(Boolean).join(` · `)||void 0}function Rt(e){let t=X(e.reason),n=Z(e.removedEdges);return[t,n===void 0?void 0:`${n} edges removed`].filter(Boolean).join(` · `)||void 0}function zt(e){let t=e.replace(/^mem:/,``);return t.length>26?`${t.slice(0,23)}…`:t}function Bt(e){if(!e||e.length===0)return;let t=e.map(e=>e.status);return t.some(e=>e===`failed`)?`failed`:t.every(e=>e===`completed`||e===`skipped`)?`completed`:t.some(e=>e===`paused`)?`paused`:`running`}function Vt(e){let t=e.payload,n=Array.isArray(t.phases)?t.phases:void 0,r=Bt(n);S.getState().setState({phases:n,activePhaseId:typeof t.activePhaseId==`string`?t.activePhaseId:void 0,overallPercent:typeof t.overallPercent==`number`?t.overallPercent:void 0,autonomous:typeof t.autonomous==`boolean`?t.autonomous:void 0,title:typeof t.title==`string`?t.title:void 0,goal:typeof t.goal==`string`?t.goal:void 0,status:r,multiBoard:t.multiBoard===!0,lastError:r===`failed`?S.getState().lastError:null})}function Ht(e){let t=e.payload,n={totalPhases:typeof t.totalPhases==`number`?t.totalPhases:0,completed:typeof t.completed==`number`?t.completed:0,failed:typeof t.failed==`number`?t.failed:0,totalTasks:typeof t.totalTasks==`number`?t.totalTasks:0,completedTasks:typeof t.completedTasks==`number`?t.completedTasks:0,failedTasks:typeof t.failedTasks==`number`?t.failedTasks:0};S.getState().setState({progress:n,overallPercent:typeof t.percentComplete==`number`?Math.round(t.percentComplete):void 0,status:n.failed>0||n.failedTasks>0?`failed`:`running`,lastEvent:`progress`})}function Q(e){let t=e.payload,n=typeof t.title==`string`&&t.title?t.title:`Goal`,r=typeof t.error==`string`&&t.error?t.error:void 0;if(e.type===`goal.paused`){S.getState().setState({status:`paused`,autonomous:!1,lastEvent:`paused`}),M.info(`Goal paused`);return}if(e.type===`goal.resumed`){S.getState().setState({status:`running`,autonomous:!0,lastEvent:`resumed`}),M.info(`Goal resumed`);return}if(e.type===`goal.stopped`){S.getState().setState({status:`stopped`,autonomous:!1,lastEvent:`stopped`}),M.warn(`Goal stopped`);return}if(e.type===`goal.cleared`){S.getState().clear();return}if(e.type===`goal.reverted`){let e=t.ok===!0,n=typeof t.reverted==`number`?t.reverted:0,r=typeof t.reason==`string`?t.reason:void 0;e?M.success(n>0?`Reverted ${n} commit${n===1?``:`s`}`:`Nothing to revert`):M.error(`Revert failed: ${r??`unknown error`}`),S.getState().setState({lastEvent:`reverted`});return}if(e.type===`goal.saved`){S.getState().setState({lastEvent:`saved`}),M.success(`Goal graph saved`);return}if(e.type===`goal.completed`){S.getState().setState({status:`completed`,autonomous:!1,overallPercent:100,lastEvent:`completed`,lastError:null}),M.success(`${n} completed`);return}if(e.type===`goal.failed`||e.type===`goal.error`){let e=r??(typeof t.message==`string`?t.message:`${n} failed`);S.getState().setState({status:`failed`,autonomous:!1,lastEvent:`failed`,lastError:e}),M.error(e)}}function Ut(e){let t=e.payload;S.getState().setState({lastEvent:`list`,graphs:Array.isArray(t.graphs)?t.graphs:[]})}function Wt(e){let t=e.payload;ae.getState().setGoal(t)}function Gt(e){let t=e.payload;c.getState().set(t),t.yolo===!0&&j.getState().confirmInfo&&j.getState().hideConfirm()}function Kt(e){if(!d(e))return;let t=e.payload,n;if(t.decision.type===`answer`){let e=t.decision.rationale&&t.decision.rationale!==t.decision.text?`\n\n_${t.decision.rationale}_`:``;n=`🧠 ${t.decision.text??``}${e}`}else n=t.decision.type===`deny`?`🧠 Denied: ${t.decision.reason??``}`:`🧠 The Brain escalated this question back to you — it needs human judgement.`;i.getState().addMessage({role:`assistant`,content:n})}function qt(e){if(!d(e))return;let t=e.payload,n=t.requestId??t.request?.id;if(n&&t.request?.question&&T.getState().noteQuestion(n,t.request.question),t.event===`brain.council_vote`){T.getState().recordVote(t);let e=t.requestId??`unknown`;m.getState().pushEvent({id:`council_${e}_${t.seatId??`seat-${Date.now()}`}`,kind:`brain:council_vote`,timestamp:Date.now(),source:t.model??t.persona??`seat`,target:`brain`,label:`${t.persona??`voter`} → ${t.status===`valid`?t.optionId??`stance`:t.status??`failed`}`,data:t,color:`#38bdf8`,flowGroup:`brain`});return}if(t.event===`brain.council_resolved`){T.getState().recordResolution(t);let e=t.requestId??`unknown`,n=T.getState().panels.find(t=>t.requestId===e)?.seats??[],r=n.map(e=>`- **${e.persona}**${e.veto?` (veto)`:``} → ${e.status===`valid`?e.optionId??`stance`:e.status}${e.model?` · \`${e.model}\``:``}`),a=[`⚖️ **Council ${t.resolution??`resolved`}**`,`${t.validVoteCount??n.length}/${t.configuredSeatCount??n.length} seats`,`${t.distinctTargetCount??0} distinct target${t.distinctTargetCount===1?``:`s`}`,t.judgeUsed?`judge used`:void 0,t.usage?.totalTokens?`${t.usage.totalTokens} tok`:void 0].filter(Boolean).join(` · `);i.getState().addMessage({role:`assistant`,content:[a,...r,...(t.warnings??[]).map(e=>`> ⚠ ${e}`)].filter(Boolean).join(`
8
+ `)});for(let e of t.warnings??[])M.warn(e);return}if(t.event===`brain.intervention`){let e=t.decision?.rationale??t.decision?.text??``,n=t.intervened?`🧠 **Brain intervention** — corrective guidance was sent to the agent.`:`🧠 **Brain check** — a distress signal was reviewed; no action needed.`;i.getState().addMessage({role:`assistant`,content:[n,t.request?.question??``,e?`_${e}_`:``].filter(Boolean).join(`
9
+
10
+ `)}),t.intervened&&M.info(`Brain intervened: agent steered`)}else t.event===`brain.decision_denied`&&M.warn(`Brain denied: ${t.decision?.reason??t.request?.question??`request`}`)}function Jt(e){if(!d(e))return;let t=e.payload;m.getState().pushEvent({id:`memory_${Date.now()}_${Math.random().toString(36).slice(2,7)}`,kind:`memory:event`,timestamp:Date.now(),source:`sage`,target:`leader`,label:t.event.replace(/^memory\./,``),data:t,color:`#a78bfa`,flowGroup:`memory`}),t.event===`memory.injector_run`&&Y.getState().pushTrace(t),t.event===`memory.context_snapshot`&&Y.getState().applyContextSnapshot(t),It.getState().pushEvent(t),t.event===`memory.staled`?M.warn(`Memory became stale: ${String(t.memoryId??``)}`):t.event===`memory.contradicted`?M.warn(`Memory contradicted: ${String(t.memoryId??``)}`):t.event===`memory.hygiene_completed`&&M.info(`SAGE hygiene completed`)}function Yt(e){let t=e.payload,n=typeof t.kind==`string`?t.kind:typeof t.event==`string`?t.event:`collab.event`;m.getState().pushEvent({id:`collab_${Date.now()}_${Math.random().toString(36).slice(2,7)}`,kind:`collab:event`,timestamp:Date.now(),source:`collab`,target:typeof t.sessionId==`string`?t.sessionId:`session`,label:n,magnitude:1,data:t,raw:e.payload,color:`hsl(200, 70%, 55%)`,flowGroup:`collab`}),m.getState().setActive(!0)}function Xt(e){Yt(e);let t=e.payload;t?.phase===`consumed`?M.success(`Tool injection applied${t.toolName?` to ${t.toolName}`:``}`):M.info(`Collab tool injection queued`)}function Zt(e){let t=e.payload?.entry;if(!t)return;let n=typeof t.iteration==`number`?t.iteration:0,r=typeof t.task==`string`?t.task:void 0,i=typeof t.status==`string`?t.status:void 0,a=typeof t.at==`string`?t.at:new Date().toISOString();ae.getState().appendJournalEntry({iteration:n,task:r,status:i,timestamp:a}),m.getState().pushEvent({id:`eternal_${Date.now()}_${n}`,kind:`eternal:iteration`,timestamp:Date.now(),source:`eternal`,target:`goal`,label:r?`L${n}: ${r}`:`Eternal iteration ${n}`,magnitude:typeof t.costUsd==`number`?t.costUsd:1,data:t,raw:e.payload,color:i===`failure`?`hsl(0, 80%, 55%)`:`hsl(220, 80%, 60%)`,flowGroup:`eternal`}),m.getState().setActive(!0)}function Qt(e){let t=e.payload;g.getState().setEnv({cwd:t.cwd,projectRoot:t.projectRoot,projectName:t.projectRoot.split(/[/\\]/).pop()||t.projectRoot}),y.getState().setTreeLoading(!0),h().send({type:`files.tree`,payload:{path:t.cwd}})}function $t(e){let t=e.payload,n=j.getState().refinePanel,r=i.getState().pendingRefinement;if(!n&&r){i.getState().setRefining(!1);let e=r.text,n=r.images?.length?r.images.map((e,t)=>({id:`pr_${Date.now()}_${t}`,dataUrl:`data:${e.mime};base64,${e.data}`,mediaType:e.mime,bytes:Math.round(e.data.length*3/4)})):void 0,a=n&&n.length>0&&r.mode===`btw`?`queue`:r.mode??`queue`;if(t.error){i.getState().setPendingRefinement(null),i.getState().enqueue(e,a,n);return}let o=t.refined??``;if(!o||Et(o,e)){i.getState().setPendingRefinement(null),i.getState().enqueue(e,a,n);return}i.getState().setPendingRefinement(null),j.getState().setRefinePanel({original:e,refined:o,english:t.english||o,status:`ready`,mode:n&&n.length>0&&r.mode===`btw`?`queue`:r.mode,images:n,...t.refinedWith?{provider:t.refinedWith.provider,model:t.refinedWith.model}:{},error:void 0,errorKind:void 0,resolve:()=>{}});return}if(!n)return;if(t.error){if(t.errorKind===`timeout`&&!n.retried&&t.retryTimeoutMs){j.getState().setRefinePanel({...n,status:`refining`,retried:!0}),h().refineModel(n.original,{timeoutMs:t.retryTimeoutMs});return}j.getState().setRefinePanel({...n,status:`failed`,error:t.error,errorKind:t.errorKind,fallbackRef:t.fallbackRef});return}let a=n.original;if(Et(t.refined,a)){j.getState().setRefinePanel(null),i.getState().addMessage({role:`user`,content:a}),i.getState().setLoading(!0),h().sendMessage(a);return}j.getState().setRefinePanel({...n,status:`ready`,refined:t.refined,english:t.english,...t.refinedWith?{provider:t.refinedWith.provider,model:t.refinedWith.model}:{},error:void 0,errorKind:void 0})}function en(e){let t=e.payload;le.getState().setInfo({...t,fetchedAt:Date.now()})}function tn(e){let t=e.payload;ue.getState().setFiles(t.files??[],t.error??null)}function nn(e){let t=e.payload;ue.getState().selectedPath===t.path&&ue.getState().setDiff({path:t.path,oldText:t.oldText??``,newText:t.newText??``,binary:t.binary,tooLarge:t.tooLarge,error:t.error})}function rn(e){let t=e.payload;ee.getState().setSnapshot({count:t.count,maxConcurrent:t.maxConcurrent,jobs:t.jobs??[]})}function an(e){let t=e.payload;ee.getState().recordFired(t.name,t.ts)}function on(e){let t=e.payload;M.info(t.message??`🦂 Chimera report ready. No follow-up started; open the mailbox to inspect it.`,8e3)}var sn={"goal-state.updated":Wt,"prefs.updated":Gt,"goal.state":Vt,"goal.progress":Ht,"goal.paused":Q,"goal.resumed":Q,"goal.stopped":Q,"goal.cleared":Q,"goal.reverted":Q,"goal.saved":Q,"goal.completed":Q,"goal.failed":Q,"goal.error":Q,"goal.list":Ut,"brain.answer":Kt,"brain.event":qt,"memory.event":Jt,"collab.event":Yt,"collab.injection.granted":Xt,"eternal.iteration":Zt,"working_dir.changed":Qt,"model.refine_result":$t,"git.info":en,"git.changes":tn,"git.diff":nn,"cron.snapshot":rn,"cron.job_fired":an,"chimera.report_available":on};function cn(e){let t=e.payload;!t.jobId||!t.kind||C.getState().jobStarted(t.jobId,t.kind)}function ln(e){let t=e.payload;!t.jobId||!t.phase||!Number.isFinite(t.completed)||!Number.isFinite(t.total)||C.getState().jobProgress(t.jobId,{phase:t.phase,completed:t.completed??0,total:t.total??0})}function un(e){let t=e.payload;t.workspaceId&&C.getState().workspaceCompleted(t.workspaceId)}function dn(e){let t=e.payload;t.snapshot&&C.getState().setSnapshot(t.snapshot,t.stale??!1)}function fn(e){let t=e.payload;t.reportId&&C.getState().reportReady(t.reportId)}function pn(e){let t=e.payload;t.jobId&&C.getState().jobFailed(t.jobId,t.error??`TechStack job failed`)}function mn(e){let t=e.payload;t.jobId&&C.getState().jobCancelled(t.jobId)}var hn={"techstack.job.started":cn,"techstack.job.progress":ln,"techstack.workspace.completed":un,"techstack.snapshot.updated":dn,"techstack.report.ready":fn,"techstack.job.failed":pn,"techstack.job.cancelled":mn};function gn(){let[e,t]=(0,N.useState)({isMobile:!1,isSmall:!1,width:0});return(0,N.useEffect)(()=>{if(typeof window>`u`)return;let e=window.matchMedia(`(max-width: 768px)`),n=window.matchMedia(`(max-width: 640px)`),r=()=>{t({isMobile:e.matches,isSmall:n.matches,width:window.innerWidth})};return r(),e.addEventListener(`change`,r),n.addEventListener(`change`,r),()=>{e.removeEventListener(`change`,r),n.removeEventListener(`change`,r)}},[]),e}function _n(){return typeof window>`u`?!1:window.matchMedia(`(max-width: 768px)`).matches}function vn(e){if(typeof e!=`string`)return Date.now();let t=Date.parse(e);return Number.isFinite(t)?t:Date.now()}function yn(e){return`replay_${Date.now()}_${e}`}function bn(){return typeof window>`u`?!1:window.location.pathname===`/debug`||window.location.pathname===`/analytics`||window.location.pathname===`/refresh-debug`}function xn(e){return typeof e==`string`?e:JSON.stringify(e)}function Sn(e){return typeof e==`string`?e:Array.isArray(e)?e.filter(e=>!!e&&typeof e==`object`&&e.type===`text`&&typeof e.text==`string`).map(e=>e.text).join(`
11
+ `):``}function Cn(e){if(typeof e==`string`)return e.trim();if(!e||typeof e!=`object`||Array.isArray(e))return``;let t=e;for(let e of[`id`,`name`,`type`]){let n=t[e];if(typeof n==`string`&&n.trim())return n.trim()}return``}function wn(e,t=[]){let n=[],r=new Map,i=0,a=0,o=(e,t,r)=>{t&&n.push({id:yn(n.length),role:e,content:t,timestamp:r})},s=e=>{n.push({id:yn(n.length),role:`system`,content:e.text,timestamp:vn(e.ts),isError:e.level===`error`||void 0})},c=e=>{if(typeof e==`string`)for(;a<t.length&&t[a].ts<e;)s(t[a]),a+=1},l=(e,t)=>{let r=e.trim();r&&(i+=1,n.push({id:yn(n.length),role:`system`,content:``,timestamp:t,thinkingLog:{iteration:i,text:r,startedAt:t,durationMs:0,replayed:!0}}))};for(let t of e){if(c(t.ts),t.role!==`user`&&t.role!==`assistant`&&t.role!==`system`)continue;let e=t.role,i=vn(t.ts);if(typeof t.content==`string`){o(e,t.content,i);continue}if(!Array.isArray(t.content))continue;let a=``,s=[];for(let c of t.content){if(c.type===`thinking`&&typeof c.thinking==`string`){s.push(c.thinking);continue}if(c.type===`text`&&typeof c.text==`string`){a+=(a?`
12
+ `:``)+c.text;continue}if(c.type===`tool_use`){o(e,a,i),a=``;let t=String(c.id??``),s={id:yn(n.length),role:`tool`,content:``,toolName:String(c.name??`tool`),toolInput:c.input,toolUseId:t,timestamp:i};n.push(s),t&&r.set(t,s);continue}if(c.type===`tool_result`){let e=String(c.tool_use_id??``),t=r.get(e);t&&(t.toolResult=xn(c.content),t.isError=!!c.is_error)}}o(e,a,i),e===`assistant`&&s.length>0&&l(s.join(`
13
+
14
+ `),i)}for(;a<t.length;)s(t[a]),a+=1;return n}var Tn=new Set;function En(e,t=140){return e.length>t?`${e.slice(0,t-1)}…`:e}function Dn(){f.flush(`__thinking__`);let e=g.getState().iteration;i.getState().flushThinkingLog(Math.max(1,e?.index??1)),i.getState().clearThinking()}function On(e){let t=u(`session.start`,e.payload);t&&(m.getState().pushEvent(t),m.getState().setActive(!0));let n=e.payload,r=Cn(n.provider),a=Cn(n.model),o=g.getState().session?.id,s=!o||o!==n.sessionId||n.reset;if((n.appVersion||n.latestVersion)&&g.getState().setUpdateInfo({appVersion:String(n.appVersion??``),latestVersion:String(n.latestVersion??``),updateAvailable:!!n.updateAvailable}),Array.isArray(n.providerStatuses)&&O.getState().hydrate(n.providerStatuses.map(e=>({providerId:e.providerId,model:e.model,state:e.state,reason:e.lastErrorKind??e.state,updatedAt:e.lastFailureAt??Date.now(),stateExpiresAt:e.stateExpiresAt??void 0}))),n.needsSetup&&fe(`setup`),s?(Y.getState().clear(),g.getState().startSession({id:n.sessionId,startedAt:Date.now(),model:a,provider:r})):g.getState().setSession({id:n.sessionId,startedAt:g.getState().session?.startedAt??Date.now(),model:a,provider:r}),g.getState().setEnv({maxContext:n.maxContext,projectRoot:n.projectRoot??``,projectName:n.projectName,cwd:n.cwd,mode:n.mode,contextMode:n.contextMode,inputCost:n.inputCost,outputCost:n.outputCost,cacheReadCost:n.cacheReadCost}),b.getState().setConfig({provider:r,model:a}),s){!n.needsSetup&&P()&&!bn()&&de({sidebarOpen:!1}),f.dropAll(),i.getState().clearMessages(),i.getState().setBoundSessionId(n.sessionId),j.getState().setSearchActiveMessageId(null),i.getState().setLoading(!1),g.setState({todos:[]}),V(`ready`);let e=k.getState();if(n.clearedSessionId){let t=new Map;for(let[r,i]of e.agents)i.sessionId!==n.clearedSessionId&&t.set(r,i);k.setState({agents:t})}else e.clear();y.getState().setTreeLoading(!0),h().send({type:`files.tree`,payload:{path:g.getState().cwd}})}let c=n.replayMessages,l=n.replayMarkers??[];if(c&&c.length>0){let e=i.getState();(s||e.messages.length===0||e.boundSessionId!==n.sessionId||e.isLoading)&&(e.setMessages(wn(c,l)),e.setBoundSessionId(n.sessionId))}if(c){let e=n.replayUsage;if(e){let t=g.getState(),n=e.input??0,r=e.output??0,i=e.cacheRead??0,a=e.cacheWrite??0;g.setState({totalTokens:{input:n,output:r,cacheRead:i,cacheWrite:a},cost:(n*t.inputCost+r*t.outputCost+i*t.cacheReadCost)/1e6})}let t=n.lastInputTokens;typeof t==`number`&&t>0&&g.setState({lastInputTokens:t}),s&&!n.needsSetup&&(bn()||(P()?de({sidebarOpen:!1}):j.getState().currentView!==`chat`&&pe(`chat`))),_n()&&j.getState().setSidebarOpen(!1)}}function kn(e){if(!d(e))return;let t=e.payload,n=e=>e.toLocaleString(),r=[...t.tools.breakdown].sort((e,t)=>t.tokens-e.tokens).slice(0,8),a=[...t.messages.breakdown].sort((e,t)=>t.tokens-e.tokens).slice(0,8);i.getState().addMessage({role:`assistant`,content:[`📊 **Context breakdown** (heuristic — 4 chars/token)`,``,`**Total estimate:** ${n(t.total)} tokens`,`• System prompt: ${n(t.systemPrompt)}`,`• Tool schemas: ${n(t.tools.total)} (${t.tools.count} tools)`,`• Messages: ${n(t.messages.total)} (${t.messages.count} messages)`,``,`**Top tool schemas:**`,...r.map(e=>` · ${e.name}: ${n(e.tokens)}`),``,`**Top messages:**`,...a.map(e=>` · #${e.index} ${e.role}: ${n(e.tokens)} — ${e.preview||`(empty)`}`)].join(`
15
+ `)})}function An(e){let t=e.payload;t.success?M.success(t.message):M.error(t.message),h(b.getState().wsUrl).listSavedProviders()}function jn(e){let t=e.payload;if(!t.success||!t.provider||!t.model)return;b.getState().setProvider(t.provider),b.getState().setModel(t.model);let n=t.previousProvider&&t.previousModel?`${t.previousProvider} / ${t.previousModel}`:a.t(`settings:toast.previousModel`),r=`${t.provider} / ${t.model}`;i.getState().addMessage({role:`system`,content:a.t(t.runActive?`settings:toast.modelSwitchedRunActive`:`settings:toast.modelSwitchedNextRequest`,{from:n,to:r})})}function Mn(e){if(!d(e))return;l(e);let t=e.payload,n=t.reductions.length?t.reductions.map(e=>`${e.phase}: ${e.saved}`).join(`, `):`no-op`;t.repaired&&(n+=`; repaired ${t.repaired.removedToolUses?.length??0} tool_use, ${t.repaired.removedToolResults?.length??0} tool_result, ${t.repaired.removedMessages} empty messages`),i.getState().addMessage({role:`system`,content:`🗜️ Context compacted: ${t.before} → ${t.after} tokens (saved ~${t.saved}). ${n}`}),g.setState({lastInputTokens:t.after})}function Nn(e){if(!d(e))return;l(e);let t=e.payload,n,r;t.budget&&t.budget.availableInputTokens>0?(n=Math.min(100,Math.max(0,Math.round(t.budget.load*100))),r=`input budget`):(n=t.maxContext>0?Math.min(100,Math.max(0,Math.round(t.tokens/t.maxContext*100))):0,r=`context`),i.getState().addMessage({role:`assistant`,content:`Compaction failed at ${t.level} (${n}% ${r}): ${t.message}`,isError:t.fatal}),M.error(`Compaction failed: ${t.message}`)}function Pn(e){if(!d(e))return;l(e);let t=e.payload,r=Sn(t.content),a=t.usage,o=(a.input??0)+(a.cacheWrite??0)-(a.cacheRead??0);o>0&&g.setState({lastInputTokens:o}),g.getState().updateUsage(t.usage);let{inputCost:s,outputCost:c,cacheReadCost:u}=g.getState(),p=(t.usage.input*s+t.usage.output*c+(t.usage.cacheRead??0)*u)/1e6;p>0&&g.getState().addCost(p);let m=n(t.stopReason);m&&i.getState().setLoading(!1);let h=i.getState().currentAssistantMessageId;if(h){f.flush(h);let e=i.getState().messages.find(e=>e.id===h)?.content??``;r.trim()&&(e.trim()?r.startsWith(e)&&r.length>e.length&&i.getState().updateMessage(h,{content:r}):i.getState().updateMessage(h,{content:r})),i.getState().finalizeMessage(h,{final:m}),t.usage.output>0&&i.getState().updateMessage(h,{usage:t.usage})}else if(r.trim()){let e=i.getState().addMessage({role:`assistant`,content:r,usage:t.usage.output>0?t.usage:void 0});i.getState().finalizeMessage(e,{final:m})}i.getState().setCurrentAssistantMessage(null),f.flush(`__thinking__`),i.getState().clearThinking()}function Fn(e){if(!d(e))return;l(e);let t=e.payload;f.flush(`__thinking__`),i.getState().flushThinkingLog(t.index),i.getState().clearThinking();let n=g.getState().iteration;n&&g.getState().setIteration({index:t.index,max:n.max})}function In(e){if(!d(e))return;let t=e.payload;i.getState().addMessage({role:`assistant`,content:`Iteration limit reached: ${t.currentIterations}/${t.currentLimit}.`,isError:!0}),M.warn(`Iteration limit reached (${t.currentIterations}/${t.currentLimit})`)}function Ln(e){if(!d(e))return;let t=e.payload,n=Math.max(0,Math.round(t.delayMs/100)/10);M.warn(`${t.providerId} retry ${t.attempt} after ${n}s (${t.status})`)}function Rn(e){if(!d(e))return;let t=e.payload;i.getState().addMessage({role:`assistant`,content:[`Provider error from \`${t.providerId}\` (${t.status}).`,t.description,t.retryable?`_Retryable; WrongStack may recover automatically._`:``].filter(Boolean).join(`
16
+
17
+ `),isError:!0}),M.error(`${t.providerId} provider error (${t.status})`)}function zn(e){if(!d(e))return;let t=e.payload,n=`${t.from.providerId}/${t.from.model}`,r=`${t.to.providerId}/${t.to.model}`;i.getState().addMessage({role:`assistant`,content:`Provider fallback: \`${n}\` returned ${t.status}; switching to \`${r}\`${t.providerSwitched?` with provider change`:``}.`}),M.warn(`Fallback to ${r}`);let a=w.getState().pending;a&&a.from.providerId===t.from.providerId&&a.from.model===t.from.model&&(typeof t.requestId==`string`&&t.requestId.length>0&&a.requestId!==t.requestId||w.getState().clear())}function Bn(e){if(!d(e))return;let t=e.payload;w.getState().setPending({requestId:t.requestId,from:t.from,status:t.status,candidates:t.candidates,autoSwitchSeconds:t.autoSwitchSeconds,timestamp:Date.now()})}function Vn(e){let t=e.payload;O.getState().update({providerId:t.providerId,model:t.model,state:t.newState,reason:t.reason,updatedAt:t.timestamp,stateExpiresAt:t.stateExpiresAt});let n=`${t.providerId}/${t.model}`;t.newState===`blocked`&&t.oldState!==`blocked`?M.warn(`${n} entered the limit-reset waiting room`):t.newState===`healthy`&&t.oldState!==`healthy`&&M.success(`${n} recovered and rejoined model routing`)}function Hn(e){let t=e.payload;if(t&&typeof t==`object`&&`error`in t){O.getState().setError(`Provider status tracking not available`);return}O.getState().applySnapshot(t)}function Un(e){if(!d(e))return;let t=e.payload;i.getState().addMessage({role:`assistant`,content:`Waiting room skipped \`${t.providerId}/${t.model}\`. ${t.lastError}`})}function Wn(e){if(!d(e))return;l(e);let t=e.payload;M.warn(`Provider stream event skipped: ${t.eventType}`),i.getState().addMessage({role:`assistant`,content:`Provider stream warning (${t.eventType}): ${t.message}`,isError:!0})}function Gn(e){if(!d(e))return;l(e);let t=e.payload,n=t.tools||t.kind||`assistant response`;if(t.action===`steer`){M.info(`Possible repetition noticed for ${n}; changing approach.`);return}i.getState().addMessage({role:`assistant`,content:`Loop guard stopped the turn: ${n} made no progress ${t.repeatCount} time(s) (iteration ${t.iteration+1}).`,isError:!0}),M.warn(`Loop guard stopped the turn`)}function Kn(e){if(!d(e))return;l(e);let t=e.payload,n=En(t.task,180);i.getState().addMessage({role:`assistant`,content:`Delegating to \`${t.target}\`: ${n}`}),k.getState().pushAgentTimelineEntry({subagentId:t.target,agentName:t.target,content:n,kind:`status`,iteration:0,ts:new Date().toISOString(),status:`delegating`})}function qn(e){if(!d(e))return;l(e);let t=e.payload,n=Math.max(0,Math.round(t.durationMs/100)/10),r=typeof t.costUsd==`number`&&t.costUsd>0?` · $${t.costUsd.toFixed(4)}`:``,a=`${t.iterations} iteration(s), ${t.toolCalls} tool call(s), ${n}s${r}`;i.getState().addMessage({role:`assistant`,content:[`Delegate ${t.ok?`completed`:`failed`} for \`${t.target}\`${t.status?` (${t.status})`:``}.`,t.summary,a].join(`
18
+ `),isError:!t.ok}),k.getState().pushAgentTimelineEntry({subagentId:t.subagentId??t.target,agentName:t.target,content:t.summary,kind:t.ok?`status`:`error`,iteration:t.iterations,ts:new Date().toISOString(),status:t.status??(t.ok?`completed`:`failed`)}),t.ok||M.warn(`Delegate failed: ${t.target}`)}function Jn(e){if(!d(e))return;let t=e.payload,n=`${t.tool}: ${t.pattern}`;t.decision===`always`?M.success(`Always allowed ${n}`):M.warn(`Denied ${n}`)}function Yn(e){if(!d(e))return;l(e);let t=e.payload,n=t.removedToolUses.length+t.removedToolResults.length+t.removedMessages,r=t.beforeMessages!==void 0&&t.afterMessages!==void 0?` Messages: ${t.beforeMessages} -> ${t.afterMessages}.`:``;i.getState().addMessage({role:`assistant`,content:`Context repaired: removed ${n} orphan protocol item(s).${r} tool_use ${t.removedToolUses.length}, tool_result ${t.removedToolResults.length}.`})}function Xn(e){if(!d(e))return;l(e);let t=e.payload;g.getState().setContextUsage(t.tokens,t.maxContext)}function Zn(e){if(!d(e))return;let t=e.payload;g.getState().setEnv({maxContext:t.maxContext})}function Qn(e){if(!d(e))return;let t=e.payload;g.getState().setContextUsage(t.used,t.limit);let n=t.limit>0?Math.round(t.used/t.limit*100):0;M.warn(`Token threshold reached (${n}%)`)}function $n(e){if(!d(e))return;let t=e.payload.model||`<unknown>`;Tn.has(t)||(Tn.add(t),M.warn(`Cost estimate unavailable for ${t}`))}function er(e){if(!d(e))return;let t=e.payload;i.getState().addMessage({role:`assistant`,content:`Session ${t.sessionId} is damaged: ${t.detail}`,isError:!0}),M.error(`Session damage detected`)}function tr(e){if(!d(e))return;let t=e.payload;i.getState().addMessage({role:`assistant`,content:`Session rewound to prompt #${t.toPromptIndex}. Removed ${t.removedEvents} event(s); reverted ${t.revertedFiles.length} file(s).`}),M.info(`Session rewound`)}function nr(e){if(!d(e))return;let t=e.payload;M.success(`Checkpoint #${t.promptIndex} written (${t.fileCount} file(s))`)}function rr(e){if(!d(e))return;let t=e.payload;m.getState().pushEvent({id:`inflight_${Date.now()}`,kind:`session:start`,timestamp:Date.now(),source:`session`,target:`leader`,label:`In-flight: ${t.context}`,magnitude:1,data:t,raw:e.payload,flowGroup:`session`})}function ir(e){d(e)&&e.payload.reason===`recovered`&&M.info(`Recovered previous in-flight operation`)}function ar(){b.getState().setWsConnected(!1),typeof document<`u`&&document.dispatchEvent(new CustomEvent(`chat:session-end`))}function or(e){if(!d(e))return;let t=e.payload;g.getState().setContextModes(t.modes.map(e=>({id:e.id,name:e.name,description:e.description,thresholds:e.thresholds,preserveK:e.preserveK,eliseThreshold:e.eliseThreshold,custom:e.custom}))),g.getState().setEnv({contextMode:t.activeId})}function sr(e){if(!d(e))return;let t=e.payload;g.getState().setEnv({contextMode:t.id})}function cr(e){let t=e.payload;oe.getState().setEntries(t.sessions??[],t.error??null)}function lr(e){if(!d(e))return;let t=e.payload;Dn(),i.getState().addMessage({role:`assistant`,content:`[${t.phase}] ${t.message}`,isError:!0}),i.getState().setLoading(!1)}var ur={"context.debug":kn,"key.operation_result":An,"model.switch_result":jn,"context.compacted":Mn,"compaction.failed":Nn,"provider.response":Pn,"iteration.completed":Fn,"iteration.limit_reached":In,"provider.retry":Ln,"provider.error":Rn,"provider.fallback":zn,"provider.fallback_pending":Bn,"provider.status_changed":Vn,"provider.active_blocked":Un,"provider.stream_error":Wn,"tool.loop_detected":Gn,"delegate.started":Kn,"delegate.completed":qn,"trust.persisted":Jn,"context.repaired":Yn,"ctx.pct":Xn,"ctx.max_context":Zn,"token.threshold":Qn,"token.cost_estimate_unavailable":$n,"session.end":ar,"session.damaged":er,"session.rewound":tr,"checkpoint.written":nr,"in_flight.started":rr,"in_flight.ended":ir,"context.modes.list":or,"context.mode.changed":sr,"sessions.list":cr,"provider.status.snapshot":Hn,error:lr};function dr(e){let t=e.payload;i.getState().addMessage({role:`assistant`,content:[`🛠️ **Registered tools** (${t.tools.length})`,``,...t.tools.map(e=>`• \`${e.name}\`${e.params.length?` (${e.params.join(`, `)})`:``} — ${e.description||`_no description_`}`)].join(`
19
+ `)})}function fr(e){let t=e.payload,n=t.text?.trim();i.getState().addMessage({role:`assistant`,content:t.error?`Memory read failed: ${t.error}`:n?`🧠 **Memory** \n\n${n}`:`🧠 **Memory**
20
+
21
+ _empty — nothing remembered yet_`})}function pr(e){let t=e.payload,n=i.getState();if(!t.success){n.addMessage({role:`assistant`,content:`❌ **Config Doctor failed**\n\n${t.error??`Unknown config error.`}`,isError:!0});return}if(!t.changed){n.addMessage({role:`assistant`,content:`✅ **Config Doctor** — active profile config is healthy.\n\n\`${t.configPath}\``});return}let r=t.changes.slice(0,40),a=[t.applied?`✅ **Config Doctor** — repaired ${t.changes.length} field(s).`:`🩺 **Config Doctor** — found ${t.changes.length} repairable field(s).`,``,...r.map(e=>`- \`${e.path}\` — ${e.action===`added`?`missing default`:`invalid shape; default required`}`)];t.changes.length>r.length&&a.push(`- _…and ${t.changes.length-r.length} more_`),a.push(``,`Config: \`${t.configPath}\``),t.applied&&t.backupPath&&a.push(`Backup: \`${t.backupPath}\``),t.applied||a.push(``,"Run `/doctor fix` to apply these repairs."),n.addMessage({role:`assistant`,content:a.join(`
22
+ `)})}function mr(e){let t=e.payload;if(t.error){i.getState().addMessage({role:`assistant`,content:`❌ ${t.error}`});return}let n=t.memories??[],r=t.stats,a=[`## 🧠 SAGE`];if(r){let e=r.byStatus.active??0,t=r.byStatus.stale??0,n=r.byStatus.archived??0;a.push(`**Total:** ${r.total} · Active: ${e} · Stale: ${t} · Archived: ${n} · Graph edges: ${r.edges}`);let i=Object.entries(r.byKind).filter(([,e])=>e>0).map(([e,t])=>`${e}=${t}`).join(`, `);i&&a.push(`**Kinds:** ${i}`),a.push(``)}if(n.length===0)a.push(`_No entries to display._`);else{for(let e of n.slice(0,20)){let t=e.text.length>80?`${e.text.slice(0,78)}…`:e.text,n=e.tags.length>0?e.tags.map(e=>`\`${e}\``).join(` `):``,r=e.createdAt.slice(0,10);a.push(`- \`${e.id.slice(0,12)}…\` [${e.kind}|${e.status}] ${r} — ${t}${n?` ${n}`:``}`)}n.length>20&&a.push(`_…and ${n.length-20} more_`)}a.push(``),a.push("*Use `/memory` in the TUI or build a Memory Manager panel for full editing.*"),i.getState().addMessage({role:`assistant`,content:a.join(`
23
+ `)})}function hr(e){let t=e.payload;if(t.error){i.getState().addMessage({role:`assistant`,content:`❌ ${t.error}`});return}if(!t.memory){i.getState().addMessage({role:`assistant`,content:`❌ Memory not found.`});return}let n=t.memory,r=n.tags.length>0?n.tags.map(e=>`\`${e}\``).join(` `):`—`,a=n.anchors.length>0?n.anchors.map(e=>e.path??e.type).join(`, `):`—`,o=[`## 🧠 Memory: \`${n.id}\``,``,`**Text:** ${n.text}`,`**Kind:** \`${n.kind}\` · **Status:** \`${n.status}\``,`**Created:** ${n.createdAt.slice(0,10)} · **Updated:** ${n.updatedAt.slice(0,10)}`,`**Importance:** ${n.importance} · **Confidence:** ${n.confidence}`,`**Tags:** ${r}`,`**Anchors:** ${a}`];i.getState().addMessage({role:`assistant`,content:o.join(`
24
+ `)})}function gr(e){let t=e.payload;if(t.error){i.getState().addMessage({role:`assistant`,content:`❌ Update failed: ${t.error}`});return}if(t.memory){let e=String(t.memory.id??``);i.getState().addMessage({role:`assistant`,content:`✅ Memory \`${e}\` updated.`})}}function _r(e){let t=e.payload;if(t.error){i.getState().addMessage({role:`assistant`,content:`❌ Failed to create memory: ${t.error}`});return}if(t.memory){let e=String(t.memory.id??``);i.getState().addMessage({role:`assistant`,content:`✅ Memory \`${e}\` created.`})}}function vr(e){let t=e.payload,n=i.getState();if(t.error){n.addMessage({role:`assistant`,content:`❌ Recover failed: ${t.error}`});return}if(!t.memory)return;let r=String(t.memory.id??``);if(t.noop){let e=t.activeId??r;n.addMessage({role:`assistant`,content:`ℹ️ Nothing to recover — \`${e}\` is already the active version.`});return}n.addMessage({role:`assistant`,content:`✅ Memory \`${r}\` recovered.`})}function yr(e){let t=e.payload,n=i.getState();if(t.error){n.addMessage({role:`assistant`,content:`❌ Candidate resolve failed: ${t.error}`});return}if(!t.candidate)return;let r=t.resolvedAction===`reject`?`rejected`:`accepted`;n.addMessage({role:`assistant`,content:`✅ Candidate \`${t.candidate.id}\` ${r}.`})}function br(e){let t=e.payload,n=i.getState();if(t.error){n.addMessage({role:`assistant`,content:`❌ Backfill failed: ${t.error}`});return}let r=`examined ${t.examined??0} · recoverable ${t.recoverable??0} · recovered ${t.recovered??0}`;n.addMessage({role:`assistant`,content:t.dryRun?`ℹ️ Backfill preview (dry-run) — ${r}. Re-run with apply to write.`:`✅ Backfill applied — ${r}.`})}function xr(e){let t=e.payload;if(!t.enabled){i.getState().addMessage({role:`assistant`,content:`🎯 **Skills**
25
+
26
+ _disabled (config.features.skills = false)_`});return}let n=[`🎯 **Skills** (${t.skills.length})`,``,...t.skills.length===0?[`_none registered_`]:t.skills.map(e=>`• \`${e.name}\`${e.version?` v${e.version}`:``} _(${e.source})_ — ${e.description||e.trigger||`_no description_`}`)];t.error&&n.push(``,`⚠ ${t.error}`),i.getState().addMessage({role:`assistant`,content:n.join(`
27
+ `)})}function Sr(e){if(!d(e))return;let t=e.payload;g.getState().setDroppedTools((t.maxTools??0)>0?t.droppedTools??0:0),i.getState().addMessage({role:`assistant`,content:[`🩺 **Runtime diagnostics**`,``,`**Provider:** \`${t.provider}\` / \`${t.model}\``,`**Mode:** \`${t.mode}\``,`**Session:** \`${t.sessionId}\``,`**CWD:** \`${t.cwd}\``,``,`**Tools:** ${t.tools.count}`,`**Messages:** ${t.messages} · **Todos:** ${t.todos}`,`**Usage:** ${t.usage.input.toLocaleString()} in · ${t.usage.output.toLocaleString()} out${t.usage.cacheRead?` · ${t.usage.cacheRead.toLocaleString()} cache`:``}`,``,`**Features:** memory=${t.features.memory?`✓`:`✗`} · skills=${t.features.skills?`✓`:`✗`} · modelsRegistry=${t.features.modelsRegistry?`✓`:`✗`}`].join(`
28
+ `)})}function Cr(e){if(!d(e))return;let t=e.payload,n=Math.floor(t.elapsedMs/1e3),r=n<60?`${n}s`:n<3600?`${Math.floor(n/60)}m ${n%60}s`:`${Math.floor(n/3600)}h ${Math.floor(n%3600/60)}m`;i.getState().addMessage({role:`assistant`,content:[`📈 **Session stats**`,``,`**Session:** \`${t.sessionId}\``,`**Provider/Model:** \`${t.provider}\` / \`${t.model}\``,`**Elapsed:** ${r}`,``,`**Usage:** ${t.usage.input.toLocaleString()} in · ${t.usage.output.toLocaleString()} out`,...t.cache&&t.cache.readTokens>0?[`**Cache:** ${t.cache.readTokens.toLocaleString()} read · ${t.cache.writeTokens.toLocaleString()} write · hit ratio ${(t.cache.hitRatio*100).toFixed(1)}%`]:[],`**Cost:** ${t.cost.toFixed(4)}`,``,`**Messages:** ${t.messages} · **Files read:** ${t.readFiles} · **Tools available:** ${t.tools}`,...t.sideEffectCount?[`**Side effects:** ⚠ ${t.sideEffectCount}`]:[]].join(`
29
+ `)})}function wr(e){if(!d(e))return;let t=e.payload;g.getState().setTodos(t.todos??[])}function Tr(e){let t=e.payload;g.getState().setModes(t.modes.map(e=>({id:e.id,name:e.name,description:e.description}))),g.getState().setEnv({mode:t.activeId})}function $(e){ce.getState().handleResult(e.type,e.payload)}var Er={...Ve,...ur,...Tt,...ft,...sn,...Qe,...hn,"config.doctor.result":pr,"session.start":e=>{On(e),K()},"specs.list":e=>{let t=e.payload;ne.getState().setSpecs(t.specs??[])},"specs.detail":e=>{ne.getState().setDetail(e.payload)},"sdd.board.snapshot":e=>{re.getState().setSnapshot(e.payload)},"sdd.board.list":e=>{let t=e.payload;re.getState().setBoards(t.boards??[])},"sdd.board.lifecycle_result":e=>{let t=e.payload,n=re.getState();n.setLifecycleResult({...t,at:Date.now()}),n.setDestroying(!1),t.op===`destroy`&&t.ok&&E.getState().reset()},"sdd.spec.snapshot":e=>{E.getState().setSnapshot(e.payload)},"sdd.spec.agent_text":e=>{E.getState().setAgentText(e.payload.text??``)},"sdd.spec.error":e=>{E.getState().setError(e.payload.message??`Error`)},"sdd.run.started":e=>{E.getState().setStartedRunId(e.payload.runId??null)},"goal.assess.result":e=>{let t=e.payload;te.getState().setResult({realistic:t.realistic,durationClaimed:t.durationClaimed,explanation:t.explanation,recommendedDuration:t.recommendedDuration,concerns:t.concerns,parseFailed:t.parseFailed,parseError:t.parseError,reqSeq:t.reqSeq??0})},"kanban.list":$,"kanban.get":$,"kanban.health":$,"kanban.create":$,"kanban.duplicate":$,"kanban.update":$,"kanban.delete":$,"kanban.generate":$,"kanban.snapshot":$,"kanban.taskgraph.export":$,"kanban.taskgraph.sync":$,"kanban.task.ready":$,"kanban.task.add":$,"kanban.task.split":$,"kanban.task.merge":$,"kanban.task.update":$,"kanban.task.move":$,"kanban.task.copy":$,"kanban.task.transfer":$,"kanban.task.transition":$,"kanban.task.chain":$,"kanban.task.chain.get":$,"kanban.task.claim":$,"kanban.task.release":$,"kanban.task.metric.add":$,"kanban.task.metric.update":$,"kanban.task.check.add":$,"kanban.task.check.update":$,"kanban.task.note.add":$,"kanban.task.assign":$,"kanban.task.dispatch":$,"kanban.task.remove":$,"kanban.task.get":$,"kanban.column.add":$,"kanban.column.remove":$,"kanban.run.start":$,"kanban.supervisor.status":$,"kanban.supervisor.audit":$,"kanban.task.verify":$,"kanban.task.verification_started":$,"kanban.task.verification_completed":$,"kanban.decomposition.approve":$,"kanban.decomposition.reject":$,"kanban.decomposition.resolved":$,"kanban.decomposition.applied":$,"tools.list":dr,"memory.list":fr,"memory.sage.list":mr,"memory.sage.get":hr,"memory.sage.update":gr,"memory.sage.remember":_r,"memory.sage.recover":vr,"memory.sage.candidateResolve":yr,"memory.sage.backfillRecoverable":br,"skills.list":xr,"diag.get":Sr,"stats.get":Cr,side_effects:e=>{if(!d(e))return;let t=e.payload;se.getState().setSideEffects(t.sideEffects??[])},"todos.updated":wr,"todos.cleared":e=>{d(e)&&g.getState().setTodos([])},"agent.timeline.message":e=>{if(!d(e))return;let t=e.payload;k.getState().pushAgentTimelineEntry({subagentId:t.subagentId,agentName:t.agentName,content:t.content,kind:t.kind,iteration:t.iteration,ts:t.ts,toolName:t.toolName,toolOk:t.toolOk,costUsd:t.costUsd})},"agent.status_changed":e=>{if(!d(e))return;let t=e.payload;k.getState().pushAgentTimelineEntry({subagentId:t.subagentId,agentName:t.agentName,content:t.summary??t.status,kind:`status`,iteration:0,ts:t.ts,status:t.status})},"tasks.updated":e=>{},"plan.updated":e=>{},"modes.list":Tr,"session.checkpoints":e=>{},"process.list":e=>{},"projects.list":e=>{},"projects.added":e=>{},"projects.selected":e=>{},"tool.disabled":e=>{},"tool.enabled":e=>{},"provider.response":e=>{Pn(e)},"tool.progress":e=>{Ke(e);let t=v(e),n=_.getState();for(let e of t)n.recordFileEvent(e)},"tool.started":e=>{Ge(e);let t=v(e);t.length>0&&_.getState().startActivities(t)},"tool.executed":e=>{qe(e);let t=e.payload;t.id&&_.getState().finishTool(t.id,{durationMs:t.durationMs,ok:t.ok!==!1})},"codemap.tool_started":e=>{l(e);let t=v(e);t.length>0&&_.getState().startActivities(t)},"codemap.tool_executed":e=>{l(e);let t=e.payload;t.id&&_.getState().finishTool(t.id,{durationMs:t.durationMs,ok:t.ok!==!1})},"codemap.file_event":e=>{let t=v(e),n=_.getState();for(let e of t)n.recordFileEvent(e)},"codemap.index_updated":e=>{let t=e.payload;me.getState().notifyIndexUpdated(t?.at)},"file.saved":e=>{let t=v(e);if(t.length>0){let e=_.getState();for(let n of t)e.recordFileEvent(n)}},"memory.event":e=>{Jt(e);let t=v(e);if(t.length>0){let e=_.getState();for(let n of t)e.recordActivity(n)}}};function Dr(e){let t=[];for(let[n,r]of Object.entries(Er))r&&t.push(e.on(n,t=>{e.consumeSuppressedChatEcho(n)||r(t)}));return()=>{for(let e of t)e()}}function Or(){let{autoConnect:e,wsUrl:t}=b(),n=b(e=>e.setWsStatus);(0,N.useEffect)(()=>{if(!e)return;Ce();let r=h(t),i=!1,a=r.onStatus(e=>{i||n(e)});r.connect().then(()=>{i||r.getPrefs()}).catch(e=>{i||console.warn(JSON.stringify({level:`warn`,event:`webui.ws_connection_failed`,message:e instanceof Error?e.message:String(e),timestamp:new Date().toISOString()}))});let o=Dr(r);return()=>{i=!0,o(),a()}},[e,t,n])}function kr(){let{wsUrl:e}=b(),t=h(e),n=(0,N.useCallback)((e,n)=>t.isConnected?t.sendMessage(e,n):null,[t]),r=(0,N.useCallback)(()=>t.sendAbort(),[t]),i=(0,N.useCallback)(e=>t.sendMailboxMessage(e),[t]),{hideConfirm:a}=j(),o=(0,N.useCallback)((e,n)=>{t.sendConfirm(e,n),a()},[t,a]),s=(0,N.useCallback)((e,n)=>t.switchModel(e,n),[t]),c=(0,N.useCallback)(()=>t.listProviders(),[t]),l=(0,N.useCallback)(e=>t.listProviderModels(e),[t]),u=(0,N.useCallback)(()=>t.listSavedProviders(),[t]),d=(0,N.useCallback)((e,n,r)=>t.addKey(e,n,r),[t]),f=(0,N.useCallback)((e,n,r)=>t.updateKey(e,n,r),[t]),p=(0,N.useCallback)((e,n)=>t.deleteKey(e,n),[t]),m=(0,N.useCallback)((e,n)=>t.setActiveKey(e,n),[t]),g=(0,N.useCallback)((e,n,r,i,a,o)=>t.addProvider(e,n,r,i,a,o),[t]),_=(0,N.useCallback)(e=>t.removeProvider(e),[t]),v=(0,N.useCallback)(e=>{oe.getState().setLoading(!0),t.listSessions(e)},[t]),y=(0,N.useCallback)(e=>t.deleteSession(e),[t]),ee=(0,N.useCallback)((e,n)=>{oe.getState().updateEntryName(e,n),t.renameSession(e,n)},[t]),x=(0,N.useCallback)(e=>t.resumeSessionById(e),[t]),te=(0,N.useCallback)(e=>t.inspectSession(e),[t]),ne=(0,N.useCallback)(()=>t.saveSession(),[t]),re=(0,N.useCallback)(e=>t.listTools(e),[t]),ie=(0,N.useCallback)(e=>t.listMemory(e),[t]),S=(0,N.useCallback)(e=>t.listSageMemories(e),[t]),ae=(0,N.useCallback)((e,n)=>t.listSageMemoriesPage(e,n),[t]),C=(0,N.useCallback)((e,n)=>t.getSage(e,n),[t]),w=(0,N.useCallback)((e,n,r)=>t.getSageGraph(e,n,r),[t]),se=(0,N.useCallback)((e,n,r)=>t.updateSage(e,n,r),[t]),ce=(0,N.useCallback)((e,n)=>t.deleteSage(e,n),[t]),T=(0,N.useCallback)((e,n)=>t.rememberSage(e,n),[t]),E=(0,N.useCallback)((e,n)=>t.findMemoriesForFile(e,n),[t]),D=(0,N.useCallback)((e,n)=>t.recoverSage(e,n),[t]),O=(0,N.useCallback)((e,n)=>t.resolveMemoryCandidate(e,n),[t]),le=(0,N.useCallback)((e,n)=>t.backfillRecoverable(e,n),[t]),k=(0,N.useCallback)(e=>t.listSkills(e),[t]),ue=(0,N.useCallback)(e=>t.getDiag(e),[t]),A=(0,N.useCallback)(e=>t.getStats(e),[t]),de=(0,N.useCallback)(()=>t.getPlan(),[t]),fe=(0,N.useCallback)(()=>t.listModes(),[t]),pe=(0,N.useCallback)(e=>t.switchMode(e),[t]),me=(0,N.useCallback)(()=>t.listContextModes(),[t]),M=(0,N.useCallback)(e=>t.switchContextMode(e),[t]),he=(0,N.useCallback)(e=>t.createContextMode(e),[t]),P=(0,N.useCallback)((e,n)=>t.updateContextMode(e,n),[t]),F=(0,N.useCallback)(e=>t.deleteContextMode(e),[t]),I=(0,N.useCallback)(()=>t.repairContext(),[t]),L=(0,N.useCallback)((e,n)=>t.refineModel(e,n),[t]),ge=(0,N.useCallback)(e=>t.switchAutonomy(e),[t]),R=(0,N.useCallback)(e=>t.updatePrefs(e),[t]);return{client:t,sendMessage:n,sendAbort:r,sendMailboxMessage:i,sendConfirm:o,switchModel:s,listProviders:c,listProviderModels:l,listSavedProviders:u,addKey:d,updateKey:f,deleteKey:p,setActiveKey:m,addProvider:g,removeProvider:_,listSessions:v,deleteSession:y,renameSession:ee,resumeSession:x,inspectSession:te,saveSession:ne,listTools:re,listMemory:ie,listSageMemories:S,listSageMemoriesPage:ae,getSage:C,getSageGraph:w,updateSage:se,deleteSage:ce,rememberSage:T,findMemoriesForFile:E,recoverSage:D,resolveMemoryCandidate:O,backfillRecoverable:le,listSkills:k,getDiag:ue,getStats:A,getPlan:de,listModes:fe,switchMode:pe,listContextModes:me,switchContextMode:M,createContextMode:he,updateContextMode:P,deleteContextMode:F,repairContext:I,toggleGoalAutonomous:(0,N.useCallback)(e=>{t.send({type:`goal.toggleAutonomous`,payload:{autonomous:e}})},[t]),startGoal:(0,N.useCallback)((e,n,r=!0)=>{t.send({type:`goal.start`,payload:{title:e,phases:n,autonomous:r}})},[t]),pauseGoal:(0,N.useCallback)(()=>{t.send({type:`goal.pause`,payload:{}})},[t]),resumeGoal:(0,N.useCallback)(()=>{t.send({type:`goal.resume`,payload:{}})},[t]),stopGoal:(0,N.useCallback)(()=>{t.send({type:`goal.stop`,payload:{}})},[t]),selectGoal:(0,N.useCallback)(e=>{t.send({type:`goal.selectPhase`,payload:{phaseId:e}})},[t]),switchAutonomy:ge,updatePrefs:R,refineModel:L}}export{Y as a,Pe as c,It as i,Fe as l,Or as n,Le as o,gn as r,H as s,kr as t,P as u};
@@ -1 +1 @@
1
- import{n as e}from"./ui-store-BsBnjO3w.js";var t={chat:`chat`,agents:`chat`,files:`files`,changes:`changes`,mailbox:`mailbox`,skills:`skill`,worktrees:`chat`,design:`design-gallery`,officemap:`officemap`},n={chat:`chat`,files:`files`,changes:`changes`,mailbox:`mailbox`,skill:`skills`,officemap:`officemap`,"design-gallery":`design`},r={1:`chat`,2:`files`,3:`changes`,4:`mailbox`,5:`skills`,6:`officemap`,0:`design`},i={chat:`Ctrl+1`,agents:``,files:`Ctrl+2`,changes:`Ctrl+3`,mailbox:`Ctrl+4`,skills:`Ctrl+5`,worktrees:`Ctrl+Shift+W`,design:`Ctrl+0`,officemap:`Ctrl+6`};function a(e){return t[e]??`chat`}function o(e){return i[e]??``}function s(t){let n=e.getState();n.currentView!==t&&n.setCurrentView(t)}function c(t){let n=e.getState();n.setSidebarOpen(!0),n.selectActivity(t),s(a(t))}function l(t){let n=e.getState();if(!n.sidebarOpen)n.setSidebarOpen(!0),n.selectActivity(t);else if(n.activeActivity===t){n.setSidebarOpen(!1);return}else n.activeActivity===`agents`&&n.setSidebarOpen(!0),n.selectActivity(t);s(a(t))}function u(t){let n=e.getState();if(n.currentView===t){c(`chat`);return}n.setSidebarOpen(!1),s(t)}function d(t){let r=n[t];if(r){c(r);return}e.getState().setSidebarOpen(!1),s(t)}export{o as a,l as i,d as n,c as o,u as r,r as t};
1
+ import{n as e}from"./ui-store-CE4-TlwB.js";var t={chat:`chat`,agents:`chat`,files:`files`,changes:`changes`,mailbox:`mailbox`,skills:`skill`,worktrees:`chat`,design:`design-gallery`,officemap:`officemap`},n={chat:`chat`,files:`files`,changes:`changes`,mailbox:`mailbox`,skill:`skills`,officemap:`officemap`,"design-gallery":`design`},r={1:`chat`,2:`files`,3:`changes`,4:`mailbox`,5:`skills`,6:`officemap`,0:`design`},i={chat:`Ctrl+1`,agents:``,files:`Ctrl+2`,changes:`Ctrl+3`,mailbox:`Ctrl+4`,skills:`Ctrl+5`,worktrees:`Ctrl+Shift+W`,design:`Ctrl+0`,officemap:`Ctrl+6`};function a(e){return t[e]??`chat`}function o(e){return i[e]??``}function s(t){let n=e.getState();n.currentView!==t&&n.setCurrentView(t)}function c(t){let n=e.getState();n.setSidebarOpen(!0),n.selectActivity(t),s(a(t))}function l(t){let n=e.getState();if(!n.sidebarOpen)n.setSidebarOpen(!0),n.selectActivity(t);else if(n.activeActivity===t){n.setSidebarOpen(!1);return}else n.activeActivity===`agents`&&n.setSidebarOpen(!0),n.selectActivity(t);s(a(t))}function u(t){let n=e.getState();if(n.currentView===t){c(`chat`);return}n.setSidebarOpen(!1),s(t)}function d(t){let r=n[t];if(r){c(r);return}e.getState().setSidebarOpen(!1),s(t)}export{o as a,l as i,d as n,c as o,u as r,r as t};
@@ -0,0 +1 @@
1
+ import{n as e}from"./rolldown-runtime-QTnfLwEv.js";import{Na as t}from"./vendor-BuarzSSb.js";import{n}from"./utils-B-9lSDIn.js";import{t as r}from"./session-store-b2KGFwkX.js";function i(e){typeof requestAnimationFrame==`function`?requestAnimationFrame(e):queueMicrotask(e)}var a=new class{pending=new Map;scheduled=!1;push(e,t,n){if(!t)return;let r=this.pending.get(e);r?(r.buffer+=t,r.flush=n):this.pending.set(e,{buffer:t,flush:n}),this.schedule()}schedule(){this.scheduled||(this.scheduled=!0,i(()=>{this.scheduled=!1,this.drain()}))}drain(){if(this.pending.size===0)return;let e=Array.from(this.pending.entries());this.pending.clear();for(let[t,n]of e)n.buffer&&n.flush(t,n.buffer)}drop(e){this.pending.delete(e)}dropAll(){this.pending.clear()}flush(e){let t=this.pending.get(e);t&&(this.pending.delete(e),t.buffer&&t.flush(e,t.buffer))}flushAll(){this.drain()}},o={maxReconnectAttempts:10,initialBackoffMs:1e3,maxBackoffMs:3e4,backoffMultiplier:2,jitterRatio:0,queueLimit:1e3,heartbeatIntervalMs:0,heartbeatTimeoutMs:0};function s(){return{phase:`idle`,reconnectAttempt:0,lastActivityAt:null,stopped:!1}}function c(e){return e.stopped?e:{...e,phase:`connecting`}}function l(e,t=Date.now()){return{...e,phase:`open`,reconnectAttempt:0,lastActivityAt:t,stopped:!1}}function u(e,t=Date.now()){return{...e,lastActivityAt:t}}function d(e){return{...e,phase:`closed`,stopped:!0}}function f(e){return{...e,phase:`idle`,reconnectAttempt:0,stopped:!1}}function p(e,t,n=Date.now(),r=Math.random){if(e.stopped||e.reconnectAttempt>=t.maxReconnectAttempts)return{state:{...e,phase:`closed`},plan:null};let i=e.reconnectAttempt+1,a=Math.min(t.initialBackoffMs*t.backoffMultiplier**(i-1),t.maxBackoffMs),o=(r()*2-1)*t.jitterRatio,s=Math.max(0,Math.round(a*(1+o)));return{state:{...e,phase:`reconnecting`,reconnectAttempt:i},plan:{attempt:i,delayMs:s,retryAt:n+s}}}var m=`abort,ping,user_message,tool.confirm_result,completion.request,model.switch,model.refine,model.fallback_choice,autonomy.switch,context.clear,context.compact,context.debug,context.editor.open,context.editor.validate,context.editor.apply,context.mode.create,context.mode.delete,context.mode.switch,context.mode.update,context.modes.list,context.repair,mode.switch,modes.list,session.checkpoints,session.delete,session.inspect,session.new,session.rename,session.resume,session.rewind,session.save,sessions.list,side_effects.list,stats.get,todo.update,todos.clear,todos.get,todos.remove`.split(`,`),h=[`collab.join`,`collab.leave`,`collab.annotate`,`collab.resolve`,`collab.request_pause`,`collab.resume`,`collab.grant_control`,`collab.inject_tool`,`mailbox.action`,`mailbox.agents`,`mailbox.clear`,`mailbox.compact`,`mailbox.messages`,`mailbox.purge`,`mailbox.send`],g=`brain.ask,brain.config.get,brain.config.set,brain.risk,brain.status,chronicle.facet,chronicle.facets,chronicle.graph,chronicle.metrics,chronicle.query,chronicle.status,config.doctor,design.list,design.materialize,design.set,design.state,design.swap,design.tune,design.use,design.verify,memory.list,memory.sage.backfillRecoverable,memory.sage.candidateResolve,memory.sage.delete,memory.sage.forFile,memory.sage.get,memory.sage.graph,memory.sage.list,memory.sage.listPage,memory.sage.recover,memory.sage.remember,memory.sage.update`.split(`,`),_=`auth.oauth.cancel,auth.oauth.code,auth.oauth.start,mcp.add,mcp.disable,mcp.discover,mcp.enable,mcp.list,mcp.prompt.get,mcp.prompts,mcp.remove,mcp.resource.read,mcp.resources,mcp.restart,mcp.sleep,mcp.update,mcp.wake,prompts.content,prompts.create,prompts.favorite,prompts.list,prompts.recent,prompts.search,prompts.used,skills.content,skills.create,skills.edit,skills.export,skills.install,skills.list,skills.uninstall,skills.update`.split(`,`),v=`goal-state.get,goal.addTask,goal.assess,goal.assignTask,goal.clear,goal.get,goal.list,goal.load,goal.moveTask,goal.pause,goal.resume,goal.retryTask,goal.revert,goal.runTask,goal.save,goal.selectPhase,goal.start,goal.state,goal.status,goal.stop,goal.taskStatus,goal.toggleAutonomous,plan.get,plan.item.update,plan.template_use,task.update,tasks.get`.split(`,`),y=`sdd.board.cancel_task,sdd.board.cleanup_worktrees,sdd.board.delete_task,sdd.board.destroy,sdd.board.get,sdd.board.list,sdd.board.pause,sdd.board.reassign,sdd.board.resume,sdd.board.retry,sdd.board.retry_all_failed,sdd.board.rollback,sdd.board.set_task_fallbacks,sdd.board.set_task_model,sdd.board.set_task_verification,sdd.board.split_task,sdd.board.stop,sdd.run.from_graph,sdd.run.from_spec,sdd.run.start,sdd.spec.approve,sdd.spec.discard,sdd.spec.get,sdd.spec.message,sdd.spec.start,specs.get,specs.list,specs.taskStatus`.split(`,`),b=[`files.list`,`files.read`,`files.tree`,`files.write`,`git.changes`,`git.diff`,`git.info`,`projects.add`,`projects.list`,`projects.select`,`working_dir.set`,`worktree.cleanup`,`worktree.diff`,`worktree.merge`,`worktree.remove`,`worktree.scan`,`shell.open`,`process.kill`,`process.killAll`,`process.list`,`terminal.close`,`terminal.create`,`terminal.input`,`terminal.resize`],x=`codebase.index.server.shutdown,connections.health,connections.service_action,diag.get,key.add,key.delete,key.set_active,key.update,prefs.get,prefs.update,provider.add,provider.clear_models,provider.custom_models.remove,provider.custom_models.set,provider.models,provider.models.search,provider.probe,provider.remove,provider.status.clear,provider.status.get,provider.status.retry,provider.undo_clear,provider.update,providers.list,providers.saved,tool.disable,tool.enable,tools.list,webui.shutdown`.split(`,`),S=`error,log,pong,side_effects,agent.status_changed,agent.timeline.message,client.status_update,chimera.report_available,compaction.failed,completion.result,context.compacted,context.debug,context.editor.snapshot,context.editor.validation,context.editor.applied,context.mode.changed,context.modes.list,context.repaired,ctx.max_context,ctx.pct,delegate.completed,delegate.started,iteration.completed,iteration.limit_reached,iteration.started,model.refine_result,modes.list,provider.active_blocked,provider.error,provider.fallback,provider.fallback_pending,provider.response,provider.retry,provider.status_changed,provider.stream_error,provider.text_delta,provider.thinking_delta,run.result,session.checkpoints,session.damaged,session.end,session.inspect,session.rewound,session.start,session.stats,sessions.list,sessions.status_update,stats.get,token.cost_estimate_unavailable,token.threshold,tool.confirm_needed,tool.disabled,tool.enabled,tool.executed,tool.loop_detected,tool.progress,tool.started,tools.list,trust.persisted`.split(`,`),ee=[`collab.annotation.added`,`collab.annotation.resolved`,`collab.event`,`collab.injection.granted`,`collab.participant.joined`,`collab.participant.left`,`collab.pause.granted`,`collab.pause.released`,`collab.state`,`mailbox.action_result`,`mailbox.agent_registered`,`mailbox.agent_deregistered`,`mailbox.agents`,`mailbox.cleared`,`mailbox.compacted`,`mailbox.event`,`mailbox.messages`,`mailbox.sent`,`mailbox.purged`,`mailbox.received`,`subagent.budget_extended`,`subagent.event`],te=`brain.answer,brain.config,brain.event,brain.status,chronicle.error,chronicle.facet_result,chronicle.facets_result,chronicle.graph_result,chronicle.metrics_result,chronicle.query_result,chronicle.status_result,config.doctor.result,design.list,design.materialize,design.set,design.state,design.swap,design.tune,design.use,design.verify,memory.event,memory.list,memory.sage.backfillRecoverable,memory.sage.candidateResolve,memory.sage.delete,memory.sage.forFile,memory.sage.get,memory.sage.graph,memory.sage.list,memory.sage.listPage,memory.sage.recover,memory.sage.remember,memory.sage.update`.split(`,`),ne=`mcp.content.error,mcp.content.selected,mcp.list,mcp.operation_result,mcp.prompts,mcp.resources,mcp.server.added,mcp.server.connected,mcp.server.disconnected,mcp.server.discovered,mcp.server.error,mcp.server.reconnected,mcp.server.removed,mcp.server.sleeping,mcp.server.updated,mcp.server.waking,prompts.content,prompts.created,prompts.favorite,prompts.list,prompts.recent,prompts.search,prompts.used,skills.content,skills.created,skills.edited,skills.exported,skills.installed,skills.list,skills.uninstalled,skills.updated`.split(`,`),C=`budget.decision,budget.threshold_reached,coordinator.stats,coordinator.status,eternal.iteration,fleet.concurrency_update,goal-state.updated,goal.assess.result,goal.list,goal.paused,goal.resumed,goal.saved,goal.error,goal.stopped,goal.failed,goal.completed,goal.cleared,goal.reverted,goal.progress,goal.state,in_flight.ended,in_flight.started,plan.updated,task.completed,task.failed,task.pending,task.started,tasks.updated,todos.cleared,todos.updated`.split(`,`),re=[`kanban.task.activity`,`sdd.board.lifecycle_result`,`sdd.board.list`,`sdd.board.snapshot`,`sdd.run.started`,`sdd.spec.agent_text`,`sdd.spec.error`,`sdd.spec.snapshot`,`specs.detail`,`specs.list`],ie=[`consensus.vote_cast`,`consensus.vote_initiated`,`consensus.vote_resolved`,`cron.job_fired`,`cron.snapshot`,`techstack.job.cancelled`,`techstack.job.failed`,`techstack.job.progress`,`techstack.job.started`,`techstack.report.delivered`,`techstack.report.ready`,`techstack.snapshot.updated`,`techstack.workspace.completed`],ae=`checkpoint.written,codemap.file_event,codemap.index_updated,codemap.tool_executed,codemap.tool_started,file.saved,files.list,files.read,files.tree,files.written,git.changes,git.diff,git.info,process.list,projects.added,projects.list,projects.selected,terminal.exit,terminal.output,working_dir.changed,worktree.cleanup_result,worktree.diff_result,worktree.event,worktree.merge_result,worktree.orphans,worktree.state`.split(`,`),w=[`auth.oauth.status`,`codebase.index.server.shutdown_result`,`connections.health_error`,`connections.health_result`,`connections.service_action_result`,`diag.get`,`key.operation_result`,`model.switch_result`,`prefs.updated`,`provider.catalog`,`provider.models`,`provider.models.search_result`,`provider.probe`,`provider.status.snapshot`,`providers.saved`],oe=[...m,...h,...b,...x,...v,...y,...g,..._],T=[...S,...ee,...ae,...w,...C,...re,...ie,...te,...ne],se=new Set(oe),ce=new Set(T);function le(e,t){return(t===`client`?se:ce).has(e)||e.startsWith(`kanban.`)&&e.length>7||e.startsWith(`agent-roster.`)&&e.length>13}var ue=new Set([`__proto__`,`constructor`,`prototype`]),de=32;function E(e,t,n){if(n>de)return{code:`too_deep`,message:`Protocol payload exceeds the nesting limit`,path:t};if(typeof e!=`object`||!e)return null;for(let r of Object.keys(e)){let i=`${t}.${r}`;if(ue.has(r))return{code:`unsafe_key`,message:`Unsafe protocol key: ${r}`,path:i};let a=E(e[r],i,n+1);if(a)return a}return null}function D(e,t){if(typeof e!=`object`||!e||Array.isArray(e))return{ok:!1,issue:{code:`invalid_envelope`,message:`Protocol message must be an object`}};let n=e;if(typeof n.type!=`string`||n.type.length===0)return{ok:!1,issue:{code:`invalid_type`,message:`Protocol message type must be a non-empty string`}};if(!le(n.type,t))return{ok:!1,issue:{code:`unknown_type`,message:`Unknown ${t} message: ${n.type}`}};if(t===`server`&&!Object.hasOwn(n,`payload`))return{ok:!1,issue:{code:`invalid_envelope`,message:`Server protocol messages require a payload`}};let r=E(n,`$`,0);return r?{ok:!1,issue:r}:{ok:!0,message:e}}function fe(e,t){try{return D(JSON.parse(e),t)}catch{return{ok:!1,issue:{code:`invalid_envelope`,message:`Protocol frame is not valid JSON`}}}}var pe=[`protocol.directional-decoder`,`protocol.recursive-key-safety`,`chronicle.query`,`chronicle.facet`,`chronicle.facets`,`chronicle.graph`,`chronicle.metrics`,`chronicle.status`,`connections.health`,`sdd.interview.continuity`,`sdd.run.from_graph`];function me(e){let t=e.protocolVersion,n=t===void 0,r=n?1:Math.min(t,1),i=n||Number.isInteger(t)&&t>=1,a=new Set(e.protocolCapabilities??[]);return{compatible:i,legacyPeer:n,version:r,capabilities:pe.filter(e=>a.has(e))}}var O={listTools(e){this.send({type:`tools.list`},e)},listMemory(e){this.send({type:`memory.list`},e)},listSageMemories(e){this.send({type:`memory.sage.list`},e)},listSageMemoriesPage(e,t){this.send({type:`memory.sage.listPage`,payload:{...e}},t)},getSage(e,t){this.send({type:`memory.sage.get`,payload:{id:e}},t)},getSageGraph(e,t,n){this.send({type:`memory.sage.graph`,payload:{query:e,...t}},n)},updateSage(e,t,n){this.send({type:`memory.sage.update`,payload:{id:e,...t}},n)},deleteSage(e,t){this.send({type:`memory.sage.delete`,payload:{id:e,force:!0,...t===void 0?{}:{reason:t}}})},rememberSage(e,t){this.send({type:`memory.sage.remember`,payload:e},t)},findMemoriesForFile(e,t){this.send({type:`memory.sage.forFile`,payload:e},t)},recoverSage(e,t){this.send({type:`memory.sage.recover`,payload:e},t)},resolveMemoryCandidate(e,t){this.send({type:`memory.sage.candidateResolve`,payload:e},t)},backfillRecoverable(e,t){this.send({type:`memory.sage.backfillRecoverable`,payload:e},t)},listMcpServers(){this.send({type:`mcp.list`})},addMcpServer(e){this.send({type:`mcp.add`,payload:e})},removeMcpServer(e){this.send({type:`mcp.remove`,payload:{name:e}})},updateMcpServer(e){this.send({type:`mcp.update`,payload:e})},wakeMcpServer(e){this.send({type:`mcp.wake`,payload:{name:e}})},sleepMcpServer(e){this.send({type:`mcp.sleep`,payload:{name:e}})},discoverMcpServer(e){this.send({type:`mcp.discover`,payload:{name:e}})},listMcpResources(e,t=!1){this.send({type:`mcp.resources`,payload:{name:e,refresh:t}})},listMcpPrompts(e,t=!1){this.send({type:`mcp.prompts`,payload:{name:e,refresh:t}})},readMcpResource(e,t){this.send({type:`mcp.resource.read`,payload:{name:e,uri:t}})},getMcpPrompt(e,t,n){this.send({type:`mcp.prompt.get`,payload:{name:e,prompt:t,...n===void 0?{}:{arguments:n}}})},enableMcpServer(e){this.send({type:`mcp.enable`,payload:{name:e}})},disableMcpServer(e){this.send({type:`mcp.disable`,payload:{name:e}})},restartMcpServer(e){this.send({type:`mcp.restart`,payload:{name:e}})},listSkills(e){this.send({type:`skills.list`},e)},getSkillContent(e,t){this.send({type:`skills.content`,payload:{name:e,source:t}})},installSkill(e,t){this.send({type:`skills.install`,payload:{ref:e,global:t}})},uninstallSkill(e,t){this.send({type:`skills.uninstall`,payload:{name:e,global:t}})},checkForUpdates(e,t){this.send({type:`skills.update`,payload:{name:e,global:t}})},createSkill(e,t,n){this.send({type:`skills.create`,payload:{name:e,description:t,scope:n}})},editSkill(e,t){this.send({type:`skills.edit`,payload:{name:e,body:t}})},exportAllSkills(){this.send({type:`skills.export`})},getDiag(e){this.send({type:`diag.get`,payload:this.withSession({})},e)},getStats(e){this.send({type:`stats.get`,payload:this.withSession({})},e)},saveSession(){this.send({type:`session.save`,payload:this.withSession({})})},resumeSessionById(e){this.send({type:`session.resume`,payload:this.withSession({id:e})})},listModes(){this.send({type:`modes.list`})},switchMode(e){this.send({type:`mode.switch`,payload:{id:e}})},listFiles(e,t,n){this.send({type:`files.list`,payload:{query:e,limit:t,path:n}})},requestCompletion(e){this.send({type:`completion.request`,payload:e})},getTodos(){this.send({type:`todos.get`,payload:this.withSession({})})},clearTodos(){this.send({type:`todos.clear`,payload:this.withSession({})})},removeTodo(e){let t=typeof e==`number`?{index:e}:{id:e};this.send({type:`todos.remove`,payload:this.withSession(t)})},updateTodoStatus(e,t){this.send({type:`todo.update`,payload:this.withSession({id:e,status:t})})},getTasks(){this.send({type:`tasks.get`,payload:this.withSession({})})},updateTaskStatus(e,t){this.send({type:`task.update`,payload:this.withSession({id:e,status:t})})},getPlan(){this.send({type:`plan.get`,payload:this.withSession({})})},updatePlanItem(e,t){this.send({type:`plan.item.update`,payload:this.withSession({target:e,status:t})})},listSessions(e=50){this.send({type:`sessions.list`,payload:this.withSession({limit:e})})},deleteSession(e){this.send({type:`session.delete`,payload:{id:e}})},renameSession(e,t){this.send({type:`session.rename`,payload:{id:e,name:t}})},inspectSession(e){this.send({type:`session.inspect`,payload:{id:e}})},setWorkingDir(e){this.send({type:`working_dir.set`,payload:{path:e}})},resumeSession(e){this.send({type:`session.resume`,payload:this.withSession({id:e})})},ping(){this.send({type:`ping`})},refineModel(e,t){this.send({type:`model.refine`,payload:{text:e,...t?.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs},...t?.provider===void 0?{}:{provider:t.provider},...t?.model===void 0?{}:{model:t.model},...t?.previousRefined===void 0?{}:{previousRefined:t.previousRefined},...t?.previousEnglish===void 0?{}:{previousEnglish:t.previousEnglish},...t?.retryFeedback===void 0?{}:{retryFeedback:t.retryFeedback}}})}};function k(e){Object.assign(e.prototype,O)}function A(e){return{type:`provider.clear_models`,payload:{providerId:e}}}function j(e,t){return{type:`provider.undo_clear`,payload:{providerId:e,previousModels:[...t]}}}function M(e){return{type:`provider.update`,payload:e}}function N(e){return Math.max(0,Math.min(100,Math.round((typeof e==`number`&&Number.isFinite(e)?e:0)*100)))}function P(e,t=!1){if(t&&e.target){if(e.kind===`agent:tool`||e.kind===`tool:executed`||e.kind===`tool:started`)return`tool`;if(e.source===`leader`||e.source===`coordinator`)return`coordinator`;if(e.kind.startsWith(`provider:`))return`provider`;if(e.kind.startsWith(`mailbox:`))return`mailbox`}switch(e.kind){case`provider:call`:case`provider:delta`:case`provider:response`:return`provider`;case`agent:spawned`:case`agent:tool`:case`agent:status`:case`agent:text`:case`agent:ctx`:case`budget:warning`:case`budget:extended`:return`agent`;case`tool:started`:case`tool:executed`:case`tool:progress`:return`tool`;case`mailbox:send`:case`mailbox:deliver`:return`mailbox`;case`collab:event`:return`system`;case`session:start`:case`session:end`:case`iteration:start`:case`iteration:end`:case`eternal:iteration`:case`fleet:snapshot`:return`session`;case`context:compacted`:case`context:repaired`:case`cost:update`:return`system`;case`error`:return`error`;default:return`system`}}function F(e){switch(e){case`provider:call`:case`provider:delta`:case`agent:tool`:case`tool:started`:case`tool:progress`:case`iteration:start`:case`agent:text`:return`streaming`;case`agent:status`:case`iteration:end`:return`completed`;case`error`:return`error`;case`tool:executed`:return`completed`;case`session:end`:return`idle`;default:return`active`}}var I=0;function L(){return`viz_${Date.now()}_${++I}`}function R(e,t){if(e===t)return!0;if(!e||!t)return!1;let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let r of n){let n=e[r],i=t[r];if(n!==i){if(n==null||i==null||typeof n!=typeof i)return!1;if(typeof n==`object`){if(Array.isArray(n)||Array.isArray(i)||!R(n,i))return!1;continue}return!1}}return!0}var z={provider:`hsl(var(--info))`,agent:`hsl(var(--primary))`,tool:`hsl(var(--warning))`,mailbox:`hsl(var(--success))`,session:`hsl(var(--primary))`,system:`hsl(var(--muted-foreground))`,success:`hsl(var(--success))`,error:`hsl(var(--destructive))`},B={"provider:call":`hsl(var(--info))`,"provider:delta":`hsl(var(--primary))`,"agent:tool":`hsl(var(--warning))`,"mailbox:send":`hsl(var(--success))`,default:`hsl(var(--muted-foreground))`},V=t()((e,t)=>({events:[],toolEvents:[],nodes:new Map,edges:new Map,isActive:!1,maxEvents:2e3,counters:{totalTokens:0,totalCost:0,totalToolCalls:0,activeAgents:0,completedTasks:0,errors:0,mailboxMessages:0},pushEvent:t=>e(e=>{let n={...t,id:t.id??L(),timestamp:t.timestamp||Date.now()},r=[n,...e.events];r.length>e.maxEvents&&(r.length=e.maxEvents);let i=t.kind===`agent:tool`||t.kind===`tool:started`||t.kind===`tool:progress`||t.kind===`tool:executed`?[n,...e.toolEvents].slice(0,600):e.toolEvents,a=Date.now(),o=t.source,s={id:o,kind:P(t),label:t.label,status:F(t.kind),activity:1,color:t.color??z[P(t)],lastSeenAt:a},c=e.nodes.get(o),l=c?{...c,...s}:s,u=!R(c,l),d,f=!1,p;if(t.target){p=t.target;let n={id:p,kind:P(t,!0),label:p,status:F(t.kind),activity:.8,color:t.color??z[P(t,!0)],lastSeenAt:a},r=e.nodes.get(p);d=r?{...r,...n}:n,f=!R(r,d)}let m,h=!1,g;if(t.target&&o){g=`${o}->${t.target}`;let n=e.edges.get(g),r={id:g,source:o,target:t.target,kind:t.kind,label:t.label,intensity:n?Math.min(1,n.intensity+.3):.7,color:t.color??z[P(t)]??z.agent,lastActiveAt:a,totalMagnitude:(n?.totalMagnitude??0)+(t.magnitude??0)};m=n?{...n,...r}:r,h=!R(n,m)}let _=e.nodes,v=e.edges;return(u||f)&&(_=new Map(e.nodes),u&&_.set(o,l),f&&d&&p&&_.set(p,d)),h&&m&&g&&(v=new Map(e.edges),v.set(g,m)),{events:r,toolEvents:i,nodes:_,edges:v}}),upsertNode:t=>e(e=>{let n=new Map(e.nodes),r=n.get(t.id);return n.set(t.id,{...r,...t,lastSeenAt:t.lastSeenAt===void 0?Date.now():t.lastSeenAt}),{nodes:n}}),removeNode:t=>e(e=>{let n=new Map(e.nodes);n.delete(t);let r=new Map(e.edges);for(let[e,n]of r)(n.source===t||n.target===t)&&r.delete(e);return{nodes:n,edges:r}}),upsertEdge:t=>e(e=>{let n=new Map(e.edges),r=n.get(t.id);return n.set(t.id,{...r,...t,lastActiveAt:t.lastActiveAt===void 0?Date.now():t.lastActiveAt,intensity:t.intensity??r?.intensity??.5,color:t.color??B[t.kind]??B.default,totalMagnitude:(r?.totalMagnitude??0)+(t.totalMagnitude??0)}),{edges:n}}),removeEdge:t=>e(e=>{let n=new Map(e.edges);return n.delete(t),{edges:n}}),clear:()=>e({events:[],toolEvents:[],nodes:new Map,edges:new Map,counters:{totalTokens:0,totalCost:0,totalToolCalls:0,activeAgents:0,completedTasks:0,errors:0,mailboxMessages:0}}),setActive:t=>e({isActive:t}),decayActivity:()=>e(e=>{let t=new Map(e.nodes);for(let[e,n]of t)if(n.activity>=.01){let r=n.activity*.92;t.set(e,{...n,activity:r<.01?0:r})}let n=new Map(e.edges);for(let[e,t]of n)if(t.intensity>=.01){let r=t.intensity*.9;n.set(e,{...t,intensity:r<.01?0:r})}return{nodes:t,edges:n}}),prunesStale:t=>e(e=>{let n=Date.now()-t,r=new Map(e.nodes);for(let[e,t]of r)t.lastSeenAt<n&&t.status!==void 0&&t.status!==`active`&&r.delete(e);let i=new Map(e.edges);for(let[e,t]of i)t.lastActiveAt<n&&i.delete(e);return{nodes:r,edges:i,events:e.events.filter(e=>e.timestamp>n)}})}));function H(e,t){switch(e){case`provider.text_delta`:{let e=t.text??``;return{id:L(),kind:`provider:delta`,timestamp:Date.now(),source:`provider`,target:`leader`,label:e.slice(0,60),magnitude:e.length,data:{text:e},color:z.provider,flowGroup:`provider`}}case`provider.response`:{let e=t.usage,n=(e?.input??0)+(e?.output??0);return{id:L(),kind:`provider:response`,timestamp:Date.now(),source:`provider`,target:`leader`,label:`${(e?.input??0).toLocaleString(`en-US`)} in / ${(e?.output??0).toLocaleString(`en-US`)} out`,magnitude:n,data:t,color:z.provider,flowGroup:`provider`}}case`provider.stream_error`:{let e=t.message??`Provider stream error`;return{id:L(),kind:`error`,timestamp:Date.now(),source:`provider`,target:`leader`,label:e.slice(0,80),magnitude:1,data:t,color:z.error,flowGroup:`provider`}}case`tool.started`:{let e=t.name??`tool`;return{id:L(),kind:`tool:started`,timestamp:Date.now(),source:e,target:`filesystem`,label:e,magnitude:1,data:t,color:z.tool,flowGroup:`tool:${e}`}}case`tool.executed`:{let e=t.name??`tool`,n=t.ok??!0;return{id:L(),kind:`tool:executed`,timestamp:Date.now(),source:e,target:`leader`,label:`${e} ${n?`✓`:`✗`} (${t.durationMs??0}ms)`,magnitude:t.durationMs??0,data:t,color:n?z.tool:z.error,flowGroup:`tool:${e}`}}case`tool.progress`:{let e=t.name??`tool`,n=t.event?.text??``;return{id:L(),kind:`tool:progress`,timestamp:Date.now(),source:e,target:`leader`,label:n.slice(0,60)||e,magnitude:n.length,data:t,color:z.tool,flowGroup:`tool:${e}`}}case`codemap.tool_started`:{let e=t.name??`tool`,n=t.agentId??`subagent`;return{id:L(),kind:`tool:started`,timestamp:Date.now(),source:n,target:e,label:e,magnitude:1,data:t,color:z.tool,flowGroup:`agent:${n}`}}case`codemap.tool_executed`:{let e=t.name??`tool`,n=t.agentId??`subagent`,r=t.ok??!0;return{id:L(),kind:`tool:executed`,timestamp:Date.now(),source:n,target:e,label:`${e} ${r?`✓`:`✗`} (${t.durationMs??0}ms)`,magnitude:t.durationMs??0,data:t,color:r?z.tool:z.error,flowGroup:`agent:${n}`}}case`tool.loop_detected`:{let e=t.tools??``,n=t.kind??`loop`,r=t.action===`steer`;return{id:L(),kind:r?`agent:status`:`error`,timestamp:Date.now(),source:e||n,target:`leader`,label:`${n} loop x${t.repeatCount??0}`,magnitude:t.repeatCount??1,data:t,color:r?z.agent:z.error,flowGroup:`tool`}}case`delegate.started`:{let e=t.target??`delegate`,n=t.task??``;return{id:L(),kind:`agent:status`,timestamp:Date.now(),source:`leader`,target:e,label:n.slice(0,80)||`Delegating to ${e}`,magnitude:1,data:t,color:z.agent,flowGroup:`delegate:${e}`}}case`delegate.completed`:{let e=t.subagentId??t.target??`delegate`,n=t.ok??!1;return{id:L(),kind:n?`agent:status`:`error`,timestamp:Date.now(),source:e,target:`leader`,label:(t.summary??t.status??`delegate completed`).slice(0,80),magnitude:t.durationMs??1,data:t,color:n?z.agent:z.error,flowGroup:`delegate:${e}`}}case`subagent.event`:{let e=t.kind,n=t.subagentId??`unknown`,r=t.name??n;switch(e){case`spawned`:return{id:L(),kind:`agent:spawned`,timestamp:Date.now(),source:n,target:`session`,label:`${r} spawned`,magnitude:1,data:t,color:z.agent,flowGroup:`agent:${n}`};case`tool_executed`:{let e=t.toolName??`tool`,r=t.ok??!0;return{id:L(),kind:`agent:tool`,timestamp:Date.now(),source:n,target:e,label:e,magnitude:t.durationMs??0,data:t,color:r?z.tool:z.error,flowGroup:`agent:${n}`}}case`task_completed`:{let e=t.status??`completed`;return{id:L(),kind:`agent:status`,timestamp:Date.now(),source:n,target:`session`,label:`${r} ${e}`,magnitude:1,data:t,color:e===`success`?z.success:z.error,flowGroup:`agent:${n}`}}case`ctx_pct`:return{id:L(),kind:`agent:ctx`,timestamp:Date.now(),source:n,target:`session`,label:`ctx ${N(t.load)}%`,magnitude:t.tokens??0,data:t,color:z.agent,flowGroup:`agent:${n}`};case`iteration_summary`:return{id:L(),kind:`agent:text`,timestamp:Date.now(),source:n,target:`session`,label:(t.partialText??``).slice(0,80)||`iter ${t.iteration??0}`,magnitude:t.costUsd??0,data:t,color:z.agent,flowGroup:`agent:${n}`};case`budget_extended`:return{id:L(),kind:`budget:extended`,timestamp:Date.now(),source:n,target:`session`,label:`${r} extended budget`,magnitude:t.totalExtensions??1,data:t,color:z.tool,flowGroup:`agent:${n}`};case`budget_warning`:return{id:L(),kind:`budget:warning`,timestamp:Date.now(),source:n,target:`session`,label:`${r} hit ${t.budgetKind??`budget`} ${t.used??0}/${t.limit??0}`,magnitude:t.used??1,data:t,color:z.error,flowGroup:`agent:${n}`}}return null}case`mailbox.event`:{let e=t.event,n=t.from??`?`,r=t.to??`?`,i=t.subject??``,a=e===`mailbox.sent`;return{id:L(),kind:a?`mailbox:send`:`mailbox:deliver`,timestamp:Date.now(),source:n,target:r,label:i||(a?`→ ${r}`:`← ${n}`),magnitude:1,data:t,color:z.mailbox,flowGroup:`mailbox`}}case`iteration.started`:{let e=t.index??0;return{id:L(),kind:`iteration:start`,timestamp:Date.now(),source:`leader`,target:`session`,label:`Iteration ${e}`,magnitude:e,data:t,color:z.agent,flowGroup:`iteration`}}case`iteration.completed`:{let e=t.index??0;return{id:L(),kind:`iteration:end`,timestamp:Date.now(),source:`leader`,target:`session`,label:`Iteration ${e} done`,magnitude:e,data:t,color:z.session,flowGroup:`iteration`}}case`ctx.pct`:{let e=t.tokens??0;return{id:L(),kind:`agent:ctx`,timestamp:Date.now(),source:`leader`,target:`session`,label:`ctx ${N(t.load)}%`,magnitude:e,data:t,color:z.agent,flowGroup:`leader`}}case`error`:{let e=t.message??`Error`;return{id:L(),kind:`error`,timestamp:Date.now(),source:t.phase??`system`,target:`session`,label:e,magnitude:1,data:t,color:z.error,flowGroup:`error`}}case`context.compacted`:return{id:L(),kind:`context:compacted`,timestamp:Date.now(),source:`system`,target:`session`,label:`Compacted: ${(t.saved??0).toLocaleString(`en-US`)} tokens`,magnitude:t.saved??0,data:t,color:`hsl(var(--info))`,flowGroup:`context`};case`compaction.failed`:{let e=t.message??`Compaction failed`;return{id:L(),kind:`error`,timestamp:Date.now(),source:`compactor`,target:`session`,label:e.slice(0,80),magnitude:t.tokens??1,data:t,color:z.error,flowGroup:`context`}}case`context.repaired`:return{id:L(),kind:`context:repaired`,timestamp:Date.now(),source:`system`,target:`session`,label:`Repaired: ${t.removedMessages??0} msgs`,magnitude:t.removedMessages??0,data:t,color:`hsl(var(--info))`,flowGroup:`context`};case`session.start`:{let e=t.sessionId??`?`,n=t.projectName??``;return{id:L(),kind:`session:start`,timestamp:Date.now(),source:`session`,target:`leader`,label:n||e.slice(0,12),magnitude:1,data:t,color:z.session,flowGroup:`session`}}case`sessions.status_update`:{let e=t.sessions??[];return{id:L(),kind:`fleet:snapshot`,timestamp:Date.now(),source:`system`,target:`session`,label:`${e.length} session(s)`,magnitude:e.length,data:t,color:z.system,flowGroup:`fleet`}}default:return null}}function he(e){let t=e.payload?.sessionId,n=r.getState().session?.id;return!t||!n||t===n}function ge(e){let t=H(e.type,e.payload);t&&(V.getState().pushEvent(t),V.getState().setActive(!0))}function _e(e,t,n){let r=e.payload??{};for(let[e,n]of Object.entries(t)){let t=r[e];if(!U(t,n))return null}if(n)for(let[e,t]of Object.entries(n)){let n=r[e];if(n!=null&&!U(n,t))return null}return r}function U(e,t){switch(t){case`string`:return typeof e==`string`;case`number`:return typeof e==`number`;case`boolean`:return typeof e==`boolean`;case`object`:return typeof e==`object`&&!!e&&!Array.isArray(e);case`array`:return Array.isArray(e);default:return!1}}function ve(e){try{return new URL(e).searchParams.get(`token`)}catch{return null}}function W(){if(typeof window>`u`||!window.location)return null;try{let e=window.location.search??``;return new URLSearchParams(e).get(`token`)}catch{return null}}function G(e){try{let t=new URL(e);return t.searchParams.delete(`token`),t.toString()}catch{return e}}function K(){if(!(typeof window>`u`||!window.location||!window.history?.replaceState))try{let e=window.location.href;if(!e)return;let t=new URL(e);if(!t.searchParams.has(`token`))return;t.searchParams.delete(`token`),window.history.replaceState(window.history.state,document.title,t.toString())}catch{}}function ye(){if(typeof document>`u`)return null;let e=document.querySelector(`meta[name="wrongstack-ws-url"]`)?.getAttribute(`content`)?.trim();if(!e)return null;try{let t=new URL(e);if(t.protocol!==`ws:`&&t.protocol!==`wss:`)return null;let n=W();return n&&!t.searchParams.has(`token`)&&t.searchParams.set(`token`,n),t.toString()}catch{return null}}function q(){let e=ye();if(e)return e;if(typeof window>`u`||!window.location?.hostname)return`ws://127.0.0.1:3456`;let t=window.location.protocol===`https:`?`wss`:`ws`,n=window.location.hostname.toLowerCase(),r=window.location.port,i=W(),a=i?`?token=${encodeURIComponent(i)}`:``;return`${t}://${n===`localhost`||n===`127.0.0.1`||n===`[::1]`||n===`::1`?`127.0.0.1`:n}${r?`:${r}`:``}${a}`}function J(){if(typeof window>`u`||!window.location?.hostname)return`http://127.0.0.1:3456`;let e=window.location.protocol===`https:`?`https`:`http`,t=window.location.hostname.toLowerCase(),n=window.location.port?`:${window.location.port}`:``;return t===`localhost`||t===`127.0.0.1`||t===`[::1]`||t===`::1`?`${e}://127.0.0.1${n}`:`${e}://${window.location.hostname}${n}`}var be=e({WrongStackWebSocketClient:()=>Z,getWSClient:()=>$}),xe={"context.debug":`context.debug`,"diag.get":`diag.get`,"memory.list":`memory.list`,"memory.sage.get":`memory.sage.get`,"memory.sage.graph":`memory.sage.graph`,"memory.sage.list":`memory.sage.list`,"memory.sage.listPage":`memory.sage.listPage`,"memory.sage.remember":`memory.sage.remember`,"memory.sage.update":`memory.sage.update`,"skills.list":`skills.list`,"stats.get":`stats.get`,"tools.list":`tools.list`},Se=3e4,Ce=32;function Y(e){try{let t=new URL(e),n=new URL(J());return t.hostname===n.hostname}catch{return!0}}var X=class e{ws=null;url;handlers=new Map;maxReconnectAttempts=10;shouldReconnect=!0;reconnectTimer=null;connectPromise=null;socketGeneration=0;messageQueue=[];messageQueueChars=0;messageQueueWeights=new WeakMap;connectionState=s();static MAX_QUEUED_MESSAGES=1e3;static MAX_QUEUED_CHARS=16*1024*1024;pendingConfirms=new Map;sessionId=null;sessionSwapPending=!1;lastErrorText;statusListeners=new Set;currentStatus={state:`connecting`};suppressedChatEchoes=new Map;protocolCapabilities=new Set;protocolVersion=null;supportsCapability(e){return this.protocolCapabilities.has(e)}get negotiatedProtocolVersion(){return this.protocolVersion}onStatus(e){return this.statusListeners.add(e),e(this.currentStatus),()=>this.statusListeners.delete(e)}get status(){return this.currentStatus}setStatus(e){this.currentStatus=e;for(let t of this.statusListeners)try{t(e)}catch{}}constructor(e){this.url=e??q()}withSession(e){return this.sessionId?{...e,sessionId:this.sessionId}:e}async ensureAuthCookie(){if(typeof window>`u`)return;if(document.cookie.split(`;`).some(e=>e.trim().startsWith(`ws_token=`))){Y(this.url)&&(this.url=G(this.url)),K();return}let e=ve(this.url)??W();if(!e)return;let t=J()+`/ws-auth?token=${encodeURIComponent(e)}`;try{let e=await fetch(t,{method:`GET`,credentials:`same-origin`,cache:`no-store`});e.ok?(Y(this.url)&&(this.url=G(this.url)),K()):console.warn(JSON.stringify({level:`warn`,event:`ws_client.ws_auth_failed`,status:e.status,timestamp:new Date().toISOString()}))}catch(e){console.warn(JSON.stringify({level:`warn`,event:`ws_client.ws_auth_error`,message:e instanceof Error?e.message:String(e),timestamp:new Date().toISOString()}))}}connect(){return this.ws?.readyState===WebSocket.OPEN?Promise.resolve():(this.connectPromise||=this.openSocket().finally(()=>{this.connectPromise=null}),this.connectPromise)}async openSocket(){return await this.ensureAuthCookie(),this.connectionState=c(this.connectionState),new Promise((e,t)=>{if(this.ws?.readyState===WebSocket.OPEN){e();return}this.setStatus({state:`connecting`});let n=++this.socketGeneration;try{let r=new WebSocket(this.url);this.ws=r,r.binaryType=`arraybuffer`;let i=setTimeout(()=>{if(this.ws===r){try{r.close()}catch{}this.ws===r&&(this.ws=null)}this.lastErrorText=`Connection timeout`,t(Error(`Connection timeout`)),s()},3e4),a=!1,o=!1,s=()=>{o||(o=!0,this.attemptReconnect())};r.onopen=()=>{this.socketGeneration===n&&(clearTimeout(i),a=!0,this.connectionState=l(this.connectionState),this.lastErrorText=void 0,this.setStatus({state:`open`}),this.flushMessageQueue(),e())},r.onmessage=e=>{if(this.socketGeneration!==n)return;this.connectionState=u(this.connectionState);let t=fe(String(e.data),`server`);t.ok?this.handleMessage(t.message):console.error(JSON.stringify({level:`error`,event:`ws_client.message_rejected`,code:t.issue.code,message:t.issue.message,timestamp:new Date().toISOString()}))},r.onerror=e=>{this.socketGeneration===n&&(console.error(JSON.stringify({level:`error`,event:`ws_client.error`,message:e instanceof Error?e.message:String(e),timestamp:new Date().toISOString()})),this.lastErrorText=`Connection error (see browser devtools)`,a||(clearTimeout(i),t(Error(this.lastErrorText)),s()))},r.onclose=e=>{if(this.socketGeneration===n){if(this.sessionSwapPending=!1,!a){clearTimeout(i);let n=e.reason||`Closed with code ${e.code}`;this.lastErrorText=n,t(Error(n)),s();return}e.reason&&!this.lastErrorText?this.lastErrorText=`${e.reason} (code ${e.code})`:!this.lastErrorText&&e.code!==1e3&&(this.lastErrorText=`Closed with code ${e.code}`),this.attemptReconnect()}}}catch(e){if(this.socketGeneration!==n)return;this.lastErrorText=e instanceof Error?e.message:String(e),this.setStatus({state:`closed`,error:this.lastErrorText}),t(e)}})}attemptReconnect(){if(!this.shouldReconnect){this.connectionState=d(this.connectionState),this.reconnectTimer=null,this.setStatus({state:`closed`,error:this.lastErrorText??`Disconnected`});return}let t=p(this.connectionState,{...o,maxReconnectAttempts:this.maxReconnectAttempts,queueLimit:e.MAX_QUEUED_MESSAGES});if(this.connectionState=t.state,!t.plan){this.reconnectTimer=null,this.setStatus({state:`closed`,error:this.lastErrorText??`Disconnected`});return}this.setStatus({state:`reconnecting`,attempt:t.plan.attempt,nextRetryAt:t.plan.retryAt,lastError:this.lastErrorText}),this.reconnectTimer=setTimeout(async()=>{if(this.reconnectTimer=null,this.shouldReconnect)try{await this.connect()}catch(e){console.error(JSON.stringify({level:`error`,event:`ws_client.reconnect_failed`,message:e instanceof Error?e.message:String(e),timestamp:new Date().toISOString()}))}},t.plan.delayMs)}retryNow(){this.currentStatus.state!==`open`&&(this.reconnectTimer&&=(clearTimeout(this.reconnectTimer),null),this.connectionState=f(this.connectionState),this.connect().catch(e=>console.warn(JSON.stringify({level:`warn`,event:`ws_client.reconnect_failed`,message:e instanceof Error?e.message:String(e),timestamp:new Date().toISOString()}))))}flushMessageQueue(){for(;this.messageQueue.length>0;){let e=this.messageQueue.shift();if(e){let t=this.messageQueueWeights.get(e)??JSON.stringify(e).length;this.messageQueueChars=Math.max(0,this.messageQueueChars-t),this.messageQueueWeights.delete(e),this.send(e)}}this.messageQueueChars=0}handleMessage(e){if(e.type===`tool.confirm_needed`){let t=e.payload;this.pendingConfirms.set(t.id,{}),this.emit(e);return}if(e.type===`session.start`){let t=e.payload,n=me(t);this.sessionId=t.sessionId,this.protocolVersion=n.version,this.protocolCapabilities=new Set(n.capabilities),this.sessionSwapPending=!1}else e.type===`error`&&(e.payload.phase===`session.new`||e.payload.phase===`session.resume`)&&(this.sessionSwapPending=!1);this.emit(e)}emit(e){let t=this.handlers.get(e.type);if(t)for(let n of t)try{n(e)}catch(t){console.error(JSON.stringify({level:`error`,event:`ws_client.handler_error`,messageType:e.type,message:t instanceof Error?t.message:String(t),timestamp:new Date().toISOString()}))}}send(e,t={}){let n=this.constructor,r=n.MAX_QUEUED_MESSAGES,i=n.MAX_QUEUED_CHARS,o=D(e,`client`);if(!o.ok)return console.error(JSON.stringify({level:`error`,event:`ws_client.outbound_message_rejected`,code:o.issue.code,message:o.issue.message,timestamp:new Date().toISOString()})),!1;let s=JSON.stringify(o.message),c=this.ws?.readyState===WebSocket.OPEN;if(!c&&s.length>i)return console.warn(JSON.stringify({level:`warn`,event:`ws_client.message_queue_full`,cap:r,charCap:i,droppedType:e.type,reason:`message_too_large`,timestamp:new Date().toISOString()})),!1;let l=e.type===`session.new`||e.type===`session.resume`;if(l&&this.sessionSwapPending)return!1;if(l&&(this.sessionSwapPending=!0),t.echoToChat===!1){let t=xe[e.type];if(t){let e=this.suppressedChatEchoes.get(t)??[];for(e.push(Date.now()+Se);e.length>Ce;)e.shift();this.suppressedChatEchoes.set(t,e)}}if((e.type===`context.clear`||e.type===`session.new`||e.type===`session.resume`)&&a.dropAll(),c)return this.ws?.send(s),!0;{if(t.queueIfDisconnected===!1)return!1;let n;for(;this.messageQueue.length>0&&(this.messageQueue.length>=r||this.messageQueueChars+s.length>i);){let e=this.messageQueue.shift();if(!e)break;n??=e;let t=this.messageQueueWeights.get(e)??JSON.stringify(e).length;this.messageQueueChars=Math.max(0,this.messageQueueChars-t),this.messageQueueWeights.delete(e)}return n&&console.warn(JSON.stringify({level:`warn`,event:`ws_client.message_queue_full`,cap:r,charCap:i,droppedType:n.type,timestamp:new Date().toISOString()})),this.messageQueue.push(e),this.messageQueueWeights.set(e,s.length),this.messageQueueChars+=s.length,!0}}consumeSuppressedChatEcho(e){let t=this.suppressedChatEchoes.get(e);if(!t)return!1;let n=Date.now();for(;t.length>0&&t[0]<=n;)t.shift();return t.length===0?(this.suppressedChatEchoes.delete(e),!1):(t.shift(),t.length===0&&this.suppressedChatEchoes.delete(e),!0)}on(e,t){let n=this.handlers.get(e);return n||(n=new Set,this.handlers.set(e,n)),n.add(t),()=>n?.delete(t)}off(e,t){this.handlers.get(e)?.delete(t)}sendMessage(e,t){let r=`msg_${Date.now()}_${n().slice(0,8)}`;return this.send({type:`user_message`,payload:this.withSession({id:r,content:e,timestamp:Date.now(),...t&&t.length>0?{images:t}:{}})}),r}sendMailboxMessage(e){let t=`mbox_${Date.now()}_${n().slice(0,8)}`;return this.send({type:`mailbox.send`,payload:{requestId:t,to:e.to,type:e.type,audience:e.audience??`all`,subject:e.subject,body:e.body,priority:e.priority??`normal`}}),t}sendAbort(){this.send({type:`abort`,payload:this.withSession({})})}getGitInfo(){this.send({type:`git.info`})}getGitChanges(){this.send({type:`git.changes`})}getGitDiff(e){this.send({type:`git.diff`,payload:{path:e}})}sendConfirm(e,t){this.pendingConfirms.has(e)&&this.pendingConfirms.delete(e),this.send({type:`tool.confirm_result`,payload:this.withSession({id:e,decision:t})})}switchModel(e,t,r=8e3){let i=n();return new Promise(n=>{let a=!1,o=e=>{a||(a=!0,clearTimeout(c),s(),n(e))},s=this.on(`model.switch_result`,e=>{let t=e.payload;t.requestId===i&&o(t)}),c=setTimeout(()=>{o({requestId:i,success:!1,message:`Model switch timed out. Please try again.`,provider:e,model:t,runActive:!1})},r);this.send({type:`model.switch`,payload:{provider:e,model:t,requestId:i}})})}getProviderStatus(){this.send({type:`provider.status.get`})}retryProviderModel(e,t){this.send({type:`provider.status.retry`,payload:{providerId:e,model:t}})}clearProviderStatus(e,t){this.send({type:`provider.status.clear`,payload:{providerId:e,model:t}})}newSession(){this.send({type:`session.new`,payload:this.withSession({})})}shutdownCodebaseIndexServer(e=8e3){let t=n();return new Promise(n=>{let r=!1,i=e=>{r||(r=!0,clearTimeout(o),a(),n(e))},a=this.on(`codebase.index.server.shutdown_result`,e=>{e.payload.requestId&&e.payload.requestId!==t||i(e.payload)}),o=setTimeout(()=>{i({requestId:t,stopped:!1,reason:`Codebase index server shutdown timed out.`})},e);this.send({type:`codebase.index.server.shutdown`,payload:{requestId:t}},{queueIfDisconnected:!1})||i({requestId:t,stopped:!1,reason:`WebSocket is not connected.`})})}listProviders(){this.send({type:`providers.list`})}listProviderModels(e){this.send({type:`provider.models`,payload:{providerId:e}})}listSavedProviders(){this.send({type:`providers.saved`})}searchProviderModels(e,t){this.send({type:`provider.models.search`,payload:{query:e,...t===void 0?{}:{limit:t}}})}addKey(e,t,n){this.send({type:`key.add`,payload:{providerId:e,label:t,apiKey:n}})}updateKey(e,t,n){this.send({type:`key.update`,payload:{providerId:e,label:t,apiKey:n}})}deleteKey(e,t){this.send({type:`key.delete`,payload:{providerId:e,label:t}})}setActiveKey(e,t){this.send({type:`key.set_active`,payload:{providerId:e,label:t}})}addProvider(e,t,n,r,i,a){this.send({type:`provider.add`,payload:{id:e,family:t,baseUrl:n,apiKey:r,...i?{models:i}:{},...a?{customModels:a}:{}}})}removeProvider(e){this.send({type:`provider.remove`,payload:{providerId:e}})}startOAuth(e,t){this.send({type:`auth.oauth.start`,payload:t?{kind:e,providerId:t}:{kind:e}})}submitOAuthCode(e,t){this.send({type:`auth.oauth.code`,payload:{kind:e,input:t}})}cancelOAuth(e){this.send({type:`auth.oauth.cancel`,payload:{kind:e}})}probeProvider(e,t){this.send({type:`provider.probe`,payload:t===void 0?{providerId:e}:{providerId:e,timeoutMs:t}})}clearProviderModels(e){this.send(A(e))}undoProviderClear(e,t){this.send(j(e,t))}setCustomModel(e,t,n){this.send({type:`provider.custom_models.set`,payload:{providerId:e,modelId:t,customModel:n}})}removeCustomModel(e,t){this.send({type:`provider.custom_models.remove`,payload:{providerId:e,modelId:t}})}updateProvider(e){this.send(M(e))}clearContext(){this.send({type:`context.clear`,payload:this.withSession({})})}compactContext(e=!1){this.send({type:`context.compact`,payload:this.withSession({aggressive:e})})}repairContext(){this.send({type:`context.repair`,payload:this.withSession({})})}openContextEditor(){this.send({type:`context.editor.open`,payload:this.withSession({})})}validateContextEditor(e,t,n,r){this.send({type:`context.editor.validate`,payload:this.withSession({baseRevision:e,messages:t,removals:n,allowRepair:r})})}applyContextEditor(e,t,n,r){this.send({type:`context.editor.apply`,payload:this.withSession({baseRevision:e,messages:t,removals:n,allowRepair:r})})}debugContext(e){this.send({type:`context.debug`,payload:this.withSession({})},e)}listContextModes(){this.send({type:`context.modes.list`,payload:this.withSession({})})}switchContextMode(e){this.send({type:`context.mode.switch`,payload:this.withSession({id:e})})}createContextMode(e){this.send({type:`context.mode.create`,payload:this.withSession(e)})}updateContextMode(e,t){this.send({type:`context.mode.update`,payload:this.withSession({id:e,...t})})}deleteContextMode(e){this.send({type:`context.mode.delete`,payload:this.withSession({id:e})})}switchAutonomy(e){this.send({type:`autonomy.switch`,payload:{mode:e}})}updatePrefs(e){this.send({type:`prefs.update`,payload:e})}getPrefs(){this.send({type:`prefs.get`})}disconnect(){this.shouldReconnect=!1,this.connectionState=d(this.connectionState),this.reconnectTimer&&=(clearTimeout(this.reconnectTimer),null),this.messageQueue.length=0,this.messageQueueChars=0,this.sessionSwapPending=!1,this.ws?.close(),this.ws=null}get isConnected(){return this.ws?.readyState===WebSocket.OPEN}get currentSessionId(){return this.sessionId}};k(X);var Z=X,Q=null;function $(e){return Q||=new Z(e),Q}export{ge as a,H as c,he as i,a as l,be as n,_e as o,q as r,V as s,$ as t};
@@ -2,8 +2,8 @@ export type AutonomyMode = 'off' | 'suggest' | 'auto' | 'eternal' | 'eternal-par
2
2
  export interface AutonomyOption {
3
3
  mode: AutonomyMode;
4
4
  /** Display label — left verbatim (autonomy mode names are domain terms). */
5
- label: string;
6
5
  /** i18n key under activity:autonomy.* for the description. */
6
+ labelKey: string;
7
7
  descKey: string;
8
8
  icon: React.ReactNode;
9
9
  }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Pure decision logic for the chat-input auto-collapse state machine.
3
+ *
4
+ * ChatView keeps `inputCollapsed` (a thin bar hides the full input) and two
5
+ * transition refs: `prevHadMessages` (transcript presence on the last render)
6
+ * and `prevAutoCollapse` (the pref on the last render). This function decides
7
+ * whether the input should collapse given the CURRENT values and those
8
+ * previous values — it fires only on transitions, never on steady state:
9
+ *
10
+ * 1. 0→N transcript arrival while the pref is on — covers fresh connects
11
+ * where history lands via WS replay AFTER mount, so the mount-time
12
+ * initializer saw an empty transcript.
13
+ * 2. The pref flips false→true while history is already present — instant
14
+ * feedback for the opt-in toggle (mirrors the manual Collapse button).
15
+ * 3. A session switch (sessionId changed to a new non-null id) while the
16
+ * pref is on and the new transcript has messages — session resume
17
+ * replaces the transcript wholesale (N→M in one commit, never through
18
+ * 0), so the length transition alone would miss it.
19
+ *
20
+ * Deliberately NOT a trigger: plain message growth after history exists
21
+ * (a manual expand stays sticky), and a pref flip while there is no history
22
+ * (nothing to collapse yet). The ChatView caller additionally gates the whole
23
+ * decision on `!isLoading` so a run in flight never collapses the input —
24
+ * the user's first send in a fresh session is itself a 0→N arrival.
25
+ *
26
+ * Extracted as a pure function so the decision matrix is unit-testable
27
+ * without mounting the heavy ChatView dependency graph.
28
+ */
29
+ export interface AutoCollapseDecision {
30
+ /** Current transcript presence (messages.length > 0). */
31
+ hasMessages: boolean;
32
+ /** Current value of the autoCollapseInput pref. */
33
+ autoCollapseInput: boolean;
34
+ /** True when the active session id changed to a new non-null id. */
35
+ sessionChanged: boolean;
36
+ /** Transcript presence at the last render/effect run. */
37
+ prevHadMessages: boolean;
38
+ /** Pref value at the last render/effect run. */
39
+ prevAutoCollapse: boolean;
40
+ }
41
+ export declare function shouldAutoCollapse(decision: AutoCollapseDecision): boolean;
42
+ //# sourceMappingURL=auto-collapse.d.ts.map
@@ -0,0 +1,2 @@
1
+ export declare function FallbackModal(): import("react").JSX.Element | null;
2
+ //# sourceMappingURL=FallbackModal.d.ts.map
@@ -1,9 +1,3 @@
1
- /**
2
- * KanbanVerificationDashboard — board-wide Definition-of-Done quality view:
3
- * verified/unverified/failed counts, failing checks, missing evidence, and
4
- * atomicity debt (tasks needing decomposition, pending proposals).
5
- * Every row clicks through to the task inspector.
6
- */
7
1
  import type { KanbanBoard } from '@wrongstack/kanban';
8
2
  export declare function KanbanVerificationDashboard({ board, onSelectTask, }: {
9
3
  board: KanbanBoard;
@@ -4,9 +4,17 @@
4
4
  * The list is driven by the shared audit catalog (`@wrongstack/plugins/
5
5
  * plugin-audit-catalog`) — the same single source of truth the CLI plugin
6
6
  * manager uses — so EVERY plugin the host knows about appears here, whether
7
- * it is currently active or inactive. Enablement resolves from the per-browser
8
- * override (`localPrefs.pluginsEnabled`, which the server persists to
9
- * `extensions.<name>.enabled`) and falls back to the catalog `defaultState`.
7
+ * it is currently active or inactive.
8
+ *
9
+ * `localPrefs.pluginsEnabled` is NOT just this browser's memory: on connect the
10
+ * server seeds it (context-meta.ts) with the EFFECTIVE state resolved through
11
+ * core's shared precedence, and the snapshot wins over localStorage. So a
12
+ * plugin the config decides shows what is actually running; only plugins the
13
+ * config says nothing about fall back to the catalog `defaultState` here.
14
+ *
15
+ * On write the server projects the toggle onto `extensions.<name>.enabled` AND
16
+ * any matching `config.plugins` entry (pref-helpers.ts) — the entry outranks
17
+ * the extension, so writing only the latter made this switch decorative.
10
18
  * Plugins flagged `canDisable: false` render a locked, non-interactive switch.
11
19
  */
12
20
  export declare function PluginToggleList(): import("react").JSX.Element;
@@ -19,70 +19,40 @@ export interface CouncilPersonaOption {
19
19
  }
20
20
  /** Lens options for a config snapshot: server catalog first, fallback second. */
21
21
  export declare function councilPersonaOptions(catalog: BrainConfigWire['personaCatalog']): CouncilPersonaOption[];
22
- export declare const DECISION_TIMEOUTS: Array<{
23
- value: string;
24
- label: string;
25
- }>;
26
- export declare const HUMAN_TIMEOUTS: Array<{
27
- value: string;
28
- label: string;
29
- }>;
30
- export declare const FRACTIONS: Array<{
31
- value: string;
32
- label: string;
33
- }>;
22
+ export declare const DECISION_TIMEOUTS: BrainOption[];
23
+ export declare const HUMAN_TIMEOUTS: BrainOption[];
24
+ export declare const FRACTIONS: BrainOption[];
34
25
  /** Effective-valued numbers: the snapshot always carries a resolved number, so
35
26
  * the default is a LABELLED concrete option rather than a `default` sentinel. */
36
- export declare const LLM_MAX_TOKENS: Array<{
37
- value: string;
38
- label: string;
39
- }>;
40
- export declare const MIN_CONFIDENCE: Array<{
41
- value: string;
42
- label: string;
43
- }>;
44
- export declare const DECISION_LOG_SIZES: Array<{
45
- value: string;
46
- label: string;
47
- }>;
48
- export declare const CACHE_TTLS: Array<{
49
- value: string;
50
- label: string;
51
- }>;
52
- export declare const CACHE_MAX_ENTRIES: Array<{
53
- value: string;
54
- label: string;
55
- }>;
27
+ export declare const LLM_MAX_TOKENS: BrainOption[];
28
+ export declare const MIN_CONFIDENCE: BrainOption[];
29
+ export declare const DECISION_LOG_SIZES: BrainOption[];
30
+ export declare const CACHE_TTLS: BrainOption[];
31
+ export declare const CACHE_MAX_ENTRIES: BrainOption[];
56
32
  /** Optional-valued knobs: `default` clears the field back to core's default. */
57
- export declare const COUNCIL_CALL_TIMEOUTS: Array<{
58
- value: string;
59
- label: string;
60
- }>;
61
- export declare const COUNCIL_CONCURRENCY: Array<{
62
- value: string;
63
- label: string;
64
- }>;
65
- export declare const JUDGE_MAX_TOKENS: Array<{
66
- value: string;
67
- label: string;
68
- }>;
69
- export declare const LEDGER_MEMORY_ENTRIES: Array<{
70
- value: string;
71
- label: string;
72
- }>;
73
- export declare const INTERVENTION_WINDOWS: Array<{
74
- value: string;
75
- label: string;
76
- }>;
33
+ export declare const COUNCIL_CALL_TIMEOUTS: BrainOption[];
34
+ export declare const COUNCIL_CONCURRENCY: BrainOption[];
35
+ export declare const JUDGE_MAX_TOKENS: BrainOption[];
36
+ export declare const LEDGER_MEMORY_ENTRIES: BrainOption[];
37
+ export declare const INTERVENTION_WINDOWS: BrainOption[];
77
38
  /**
78
39
  * Presets plus the live value when the config holds something off-menu — a
79
40
  * hand-edited config must not render as an empty select (which would then
80
41
  * write the first preset back on the next change).
81
42
  */
82
- export declare function withCurrent(options: Array<{
43
+ /**
44
+ * A select option. Numeric/unit choices ("5s", "800") carry a literal `label`;
45
+ * anything with words carries `labelKey` and is resolved at render time —
46
+ * this module is hook-free, so it cannot call `t()` itself.
47
+ */
48
+ export interface BrainOption {
83
49
  value: string;
84
- label: string;
85
- }>, current: string): Array<{
50
+ label?: string;
51
+ labelKey?: string;
52
+ }
53
+ export declare function withCurrent(options: BrainOption[], current: string): BrainOption[];
54
+ /** Resolve `labelKey` options against the active catalog for rendering. */
55
+ export declare function localizeOptions(options: BrainOption[], t: (key: string) => string): Array<{
86
56
  value: string;
87
57
  label: string;
88
58
  }>;
@@ -16,7 +16,6 @@ export interface TaskItem {
16
16
  export declare const TASK_STATUS_CONFIG: Record<TaskItem['status'], {
17
17
  icon: React.ReactNode;
18
18
  color: string;
19
- label: string;
20
19
  }>;
21
20
  export declare const PRIORITY_BADGE: Record<TaskItem['priority'], string>;
22
21
  export declare const TYPE_BADGE: Record<TaskItem['type'], string>;
@@ -1,12 +1,19 @@
1
1
  import type { KanbanBoard, KanbanEvent, KanbanTask } from '@wrongstack/kanban';
2
2
  export type TaskRiskSeverity = 'critical' | 'warning' | 'info';
3
+ /**
4
+ * A finding carries i18n KEYS, not prose: `analyzeTaskRisk` is a pure function
5
+ * used outside React (KanbanColumnView calls it for badge counts), so it must
6
+ * not depend on a translator. The panel resolves the keys at render time and
7
+ * feeds `detailParams` into the interpolation.
8
+ */
3
9
  export interface TaskRiskFinding {
4
10
  id: string;
5
11
  severity: TaskRiskSeverity;
6
12
  category: 'operational' | 'audit';
7
- title: string;
8
- detail: string;
9
- remediation: string;
13
+ titleKey: string;
14
+ detailKey: string;
15
+ detailParams?: Record<string, string | number>;
16
+ remediationKey: string;
10
17
  }
11
18
  export interface TaskRiskAssessment {
12
19
  score: number;
@@ -6,7 +6,7 @@
6
6
  import type { ComponentType } from 'react';
7
7
  import type { TechStackCoverage, TechStackDependency, TechStackFinding, TechStackFindingSeverity } from '@/stores';
8
8
  export interface StatusMeta {
9
- readonly label: string;
9
+ readonly labelKey: string;
10
10
  /** Full literal class strings. */
11
11
  readonly badge: string;
12
12
  readonly dot: string;
@@ -25,8 +25,11 @@ export interface StatusMeta {
25
25
  export declare const STATUS_META: Record<string, StatusMeta>;
26
26
  export declare function statusMeta(status: string): StatusMeta;
27
27
  export interface EcosystemMeta {
28
- /** Human-readable display name for the ecosystem. */
29
- readonly label: string;
28
+ /** Human-readable display name a proper noun (npm, Python, Rust…), so it
29
+ * is NOT translated. The unknown-ecosystem fallback uses `labelKey`. */
30
+ readonly label?: string | undefined;
31
+ /** i18n key, set only where the label is real display copy. */
32
+ readonly labelKey?: string | undefined;
30
33
  /** Optional lucide-react icon component for visual identification. */
31
34
  readonly icon?: ComponentType<{
32
35
  className?: string;
@@ -41,6 +44,8 @@ export interface EcosystemMeta {
41
44
  * for the UI to display a human-readable label.
42
45
  */
43
46
  export declare const ECOSYSTEM_META: Record<string, EcosystemMeta>;
47
+ /** Display name for an ecosystem: proper noun as-is, fallback via the catalog. */
48
+ export declare function ecosystemLabel(ecosystem: string, t: (key: string) => string): string;
44
49
  export declare function ecosystemMeta(ecosystem: string): EcosystemMeta;
45
50
  /**
46
51
  * Renders the ecosystem icon if one is registered, or nothing.
@@ -55,15 +60,15 @@ export declare function EcosystemIcon({ ecosystem, className, }: {
55
60
  export declare function needsAttention(dep: TechStackDependency): boolean;
56
61
  export declare const SEVERITY_ORDER: readonly TechStackFindingSeverity[];
57
62
  export declare const SEVERITY_META: Record<TechStackFindingSeverity, {
58
- label: string;
63
+ labelKey: string;
59
64
  badge: string;
60
65
  }>;
61
66
  export declare const ACTION_LABELS: Record<string, string>;
62
67
  export interface CoverageMeta {
63
- readonly label: string;
68
+ readonly labelKey: string;
64
69
  readonly badge: string;
65
70
  /** Short inline text for the dependency row subtitle (e.g. "limited", "best-effort"). */
66
- readonly note: string | undefined;
71
+ readonly noteKey: string | undefined;
67
72
  }
68
73
  export declare const COVERAGE_META: Record<TechStackCoverage, CoverageMeta>;
69
74
  /** Lookup helper that returns the FALLBACK for unknown coverage strings. */
@@ -1,15 +1,20 @@
1
+ import { type PaletteId } from '@/lib/palettes';
1
2
  import type React from 'react';
2
3
  type Theme = 'light' | 'dark' | 'system';
3
4
  interface ThemeProviderProps {
4
5
  children: React.ReactNode;
5
6
  defaultTheme?: Theme | undefined;
6
7
  storageKey?: string | undefined;
8
+ defaultPalette?: PaletteId | undefined;
9
+ paletteStorageKey?: string | undefined;
7
10
  }
8
11
  interface ThemeProviderState {
9
12
  theme: Theme;
10
13
  setTheme: (theme: Theme) => void;
14
+ palette: PaletteId;
15
+ setPalette: (palette: PaletteId) => void;
11
16
  }
12
- export declare function ThemeProvider({ children, defaultTheme, storageKey, }: ThemeProviderProps): React.JSX.Element;
17
+ export declare function ThemeProvider({ children, defaultTheme, storageKey, defaultPalette, paletteStorageKey, }: ThemeProviderProps): React.JSX.Element;
13
18
  export declare function useTheme(): ThemeProviderState;
14
19
  export {};
15
20
  //# sourceMappingURL=ThemeProvider.d.ts.map
@@ -54,7 +54,8 @@ export type RosterTab = 'live' | 'catalog' | 'learning' | 'customize';
54
54
  interface TabDef {
55
55
  id: RosterTab;
56
56
  icon: React.ReactNode;
57
- label: string;
57
+ /** i18n key resolved at render time — this module is hook-free by design. */
58
+ labelKey: string;
58
59
  }
59
60
  export declare const TABS: TabDef[];
60
61
  export declare const KNOWN_ROLES: RosterAgentEntry[];