@wrongstack/webui 0.309.0 → 0.310.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 (108) hide show
  1. package/dist/assets/{AgentRosterView-CbgKjnxJ.js → AgentRosterView-D65_58jj.js} +1 -1
  2. package/dist/assets/{AnalyticsDashboard-BXnPG2xB.js → AnalyticsDashboard-DOc43lwL.js} +1 -1
  3. package/dist/assets/{AudienceMemoryPanel-Ch-jf06O.js → AudienceMemoryPanel-BLpp2tHi.js} +1 -1
  4. package/dist/assets/{ChangesView-5lcal8q4.js → ChangesView-DgBKkM9W.js} +1 -1
  5. package/dist/assets/ChronicleDashboard-DTQBK3sz.js +1 -0
  6. package/dist/assets/CodeEditor-C_i1OpFY.js +2 -0
  7. package/dist/assets/CodeMap-DAiZc6KR.js +1 -0
  8. package/dist/assets/{ConfirmModal-KzK0LoJw.js → ConfirmModal-e_pAJNXI.js} +1 -1
  9. package/dist/assets/{CronJobsPanel-aLru0Rd_.js → CronJobsPanel-Bd9yYc54.js} +1 -1
  10. package/dist/assets/{DeadCodeScanPanel-BXpB_M2Z.js → DeadCodeScanPanel-DX6kTHMe.js} +1 -1
  11. package/dist/assets/{DebugDashboard-hnhGaWr-.js → DebugDashboard-DzZ2VgUh.js} +1 -1
  12. package/dist/assets/{DesignGalleryView-CXHgaI2Q.js → DesignGalleryView-C6V81Ve6.js} +1 -1
  13. package/dist/assets/{GoalView-BB5t68cb.js → GoalView-D8IvL8gu.js} +1 -1
  14. package/dist/assets/KanbanView-CgAYUWMt.js +3 -0
  15. package/dist/assets/{MailboxDetailView-jPxF6ia3.js → MailboxDetailView-DVhX5QJL.js} +1 -1
  16. package/dist/assets/{MemoryDrawer-e8UxQq-s.js → MemoryDrawer-8sFKIDFT.js} +1 -1
  17. package/dist/assets/MemoryManager-UVJcZ8F1.js +1 -0
  18. package/dist/assets/{ModelPicker-nyXP3xsj.js → ModelPicker-BX3TyLGh.js} +1 -1
  19. package/dist/assets/OfficeMapPanel-CGquZdpA.js +4 -0
  20. package/dist/assets/OfficeMapPanel-Ce7myLNH.css +1 -0
  21. package/dist/assets/{ProcessMonitor-Epj6RrOA.js → ProcessMonitor-DWRyMBcK.js} +1 -1
  22. package/dist/assets/{PromptJournalView-CMlGmjig.js → PromptJournalView-D7cxTV4b.js} +1 -1
  23. package/dist/assets/{QueuePanel-D67eiPuQ.js → QueuePanel-BHC0oZuW.js} +1 -1
  24. package/dist/assets/{RefreshDebugView-CWAwHE9i.js → RefreshDebugView-CYtfPKpz.js} +1 -1
  25. package/dist/assets/{RequirementIntakeView-DPj065HL.js → RequirementIntakeView-CqK3EO7I.js} +1 -1
  26. package/dist/assets/{SageTabs-BtRa8OZC.js → SageTabs-twWj7FY5.js} +2 -2
  27. package/dist/assets/{SddFlowGraph-DMSN4LTZ.js → SddFlowGraph-DRoJjwE7.js} +1 -1
  28. package/dist/assets/SddHub-GEtMx-VT.js +2 -0
  29. package/dist/assets/{SessionInspectView-BdlOiPzO.js → SessionInspectView-Bj3lSgGC.js} +1 -1
  30. package/dist/assets/SessionList-Q2e5-_66.js +1 -0
  31. package/dist/assets/{SessionsDashboard-BiR0zh-a.js → SessionsDashboard-zMKgGHVE.js} +1 -1
  32. package/dist/assets/SetupScreen-OTuQXHs_.js +1 -0
  33. package/dist/assets/SkillDetailView-DOuDqdnT.js +3 -0
  34. package/dist/assets/{SpecsView-2PqHEXH9.js → SpecsView-DCXc8NKW.js} +1 -1
  35. package/dist/assets/TechStackView-DBYyTF6H.js +2 -0
  36. package/dist/assets/{TerminalPanel-CLUB8F2H.js → TerminalPanel-D8ZfgplP.js} +1 -1
  37. package/dist/assets/{Toaster-BlD1m8P2.js → Toaster-tBe1ZrKx.js} +1 -1
  38. package/dist/assets/{activity-l8lDAw8a.js → activity-BA8C9ueU.js} +3 -3
  39. package/dist/assets/{activity-DYwBIByU.js → activity-BYnOci5N.js} +3 -3
  40. package/dist/assets/{activity-CezOSNBd.js → activity-COQ9xSFu.js} +3 -3
  41. package/dist/assets/{activity-CA5G03Kw.js → activity-CuJqhGz7.js} +3 -3
  42. package/dist/assets/{activity-CkGBp_I-.js → activity-D3ZccGOh.js} +3 -3
  43. package/dist/assets/{activity-C6pIBHte.js → activity-YMES6OPI.js} +3 -3
  44. package/dist/assets/{activity-CxnlCaZu.js → activity-zlMMaNE1.js} +3 -3
  45. package/dist/assets/{button-DvpRpKkt.js → button-Dhmop_yM.js} +1 -1
  46. package/dist/assets/{chat-store-c0pGYczr.js → chat-store-BiEXyguk.js} +1 -1
  47. package/dist/assets/{codemap-activity-store-BH7Mh4k9.js → codemap-activity-store-BWt_a7Gs.js} +1 -1
  48. package/dist/assets/codemap-index-store-CDhApwWQ.js +1 -0
  49. package/dist/assets/{dialog-BJjDUqb3.js → dialog-DPl7DolS.js} +1 -1
  50. package/dist/assets/{empty-state-Cefmzojx.js → empty-state-IT10GzRA.js} +1 -1
  51. package/dist/assets/{i18n-DbJfY4tY.js → i18n-dLvHUYek.js} +2 -2
  52. package/dist/assets/index-B8J_xxU5.css +1 -0
  53. package/dist/assets/index-Cyhuj8ku.js +134 -0
  54. package/dist/assets/{input-BtoHcCl9.js → input-C3rIQ26u.js} +1 -1
  55. package/dist/assets/{mailbox-store-bF96Ih2G.js → mailbox-store-DhAVkVJQ.js} +1 -1
  56. package/dist/assets/{markdown-CIRD7kOg.js → markdown-Kp5uSgOw.js} +23 -23
  57. package/dist/assets/{roster-ws-DycHs92J.js → roster-ws-Vj_HH49O.js} +1 -1
  58. package/dist/assets/session-store-CKpAwNIm.js +1 -0
  59. package/dist/assets/{shared-B3czc2Dj.js → shared-BUXBOqyO.js} +1 -1
  60. package/dist/assets/stores-D9Ng0JyF.js +7 -0
  61. package/dist/assets/ui-store-3HoYrTu5.js +1 -0
  62. package/dist/assets/useWebSocket-B2jKc_G4.js +29 -0
  63. package/dist/assets/{utils-tsZEnrBH.js → utils-BecmXwgG.js} +1 -1
  64. package/dist/assets/{vector-memory-panel-C6iWDhkJ.js → vector-memory-panel-CBA4CK6N.js} +1 -1
  65. package/dist/assets/{vendor-C_zEzV4N.js → vendor-DZ9_OO6N.js} +21 -21
  66. package/dist/assets/{view-navigation-CZKugncK.js → view-navigation-C1UDTk5R.js} +1 -1
  67. package/dist/assets/ws-client-DXT4gi-N.js +1 -0
  68. package/dist/components/AgentOfficeView/model.d.ts +20 -0
  69. package/dist/components/AgentOfficeView.d.ts +10 -0
  70. package/dist/components/ChatView/AgentTabs.d.ts +16 -0
  71. package/dist/components/ChatView/SubagentTranscriptView.d.ts +16 -0
  72. package/dist/components/ChatView/useChatViewState.d.ts +7 -0
  73. package/dist/components/SettingsPanel/LogsSettingsTab.d.ts +1 -1
  74. package/dist/components/SettingsPanel/MCPSection.d.ts +2 -12
  75. package/dist/components/SettingsPanel/ModelSchemaEditor.d.ts +7 -0
  76. package/dist/components/SettingsPanel/contracts.d.ts +29 -0
  77. package/dist/components/SettingsPanel/official-servers.d.ts +1 -1
  78. package/dist/hooks/useLiveContextDebug.d.ts +97 -0
  79. package/dist/index.css +114 -7
  80. package/dist/index.html +23 -23
  81. package/dist/index.js +11198 -10263
  82. package/dist/protocol-compatibility.d.ts +1 -1
  83. package/dist/stores/index.d.ts +1 -1
  84. package/dist/stores/office-map-store.d.ts +6 -0
  85. package/dist/stores/session-store.d.ts +9 -1
  86. package/dist/stores/ui-store.d.ts +12 -0
  87. package/dist/types/system.d.ts +12 -0
  88. package/package.json +18 -17
  89. package/dist/assets/ChronicleDashboard-BH9k5NjB.js +0 -1
  90. package/dist/assets/CodeEditor-BrQMwzOp.js +0 -2
  91. package/dist/assets/CodeMap-B5e0v0jn.js +0 -1
  92. package/dist/assets/KanbanView-bZtgy3zZ.js +0 -3
  93. package/dist/assets/MemoryManager-BXYIA9wG.js +0 -1
  94. package/dist/assets/OfficeMapPanel-CBfE7Kli.js +0 -4
  95. package/dist/assets/OfficeMapPanel-D6yTfGIT.css +0 -1
  96. package/dist/assets/SddHub-CuqWpqSd.js +0 -2
  97. package/dist/assets/SessionList-CvvH8SI2.js +0 -1
  98. package/dist/assets/SetupScreen-B8s5fvr8.js +0 -1
  99. package/dist/assets/SkillDetailView-DbXp7-E5.js +0 -3
  100. package/dist/assets/TechStackView-Dnws9pc9.js +0 -2
  101. package/dist/assets/codemap-index-store-BFm1TzVW.js +0 -1
  102. package/dist/assets/index-D2tx76V0.css +0 -1
  103. package/dist/assets/index-DQn-Lz9q.js +0 -133
  104. package/dist/assets/session-store-CKdsROPD.js +0 -1
  105. package/dist/assets/stores-C0xX0jn4.js +0 -7
  106. package/dist/assets/ui-store-xx1NssJI.js +0 -1
  107. package/dist/assets/useWebSocket-D9Dy4-9x.js +0 -29
  108. package/dist/assets/ws-client-CBfMQmW9.js +0 -1
@@ -1 +1 @@
1
- import{n as e}from"./ui-store-xx1NssJI.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-3HoYrTu5.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-hePW80VL.js";import{za as t}from"./vendor-DZ9_OO6N.js";import{n}from"./utils-BecmXwgG.js";import{t as r}from"./session-store-CKpAwNIm.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,topic.advice,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.listCandidates,memory.sage.listPage,memory.sage.recover,memory.sage.remember,memory.sage.searchBreakdown,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.journal,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(`,`),ee=`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.rewind,sdd.spec.start,specs.get,specs.list,specs.taskStatus`.split(`,`),te=`files.create,files.delete,files.list,files.move,files.read,files.rename,files.skeleton,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`.split(`,`),ne=`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(`,`),re=`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,topic.advice_result,tools.list,trust.persisted`.split(`,`),ie=[`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`],ae=`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.listCandidates,memory.sage.listPage,memory.sage.recover,memory.sage.remember,memory.sage.searchBreakdown,memory.sage.update`.split(`,`),oe=`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.journal,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(`,`),se=`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(`,`),ce=[`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`],le=[`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`],ue=`checkpoint.written,codemap.file_event,codemap.index_updated,codemap.tool_executed,codemap.tool_started,file.saved,files.created,files.deleted,files.list,files.moved,files.read,files.renamed,files.skeleton_result,files.tree,files.tree.changed,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(`,`),de=[`auth.oauth.status`,`codebase.index.server.shutdown_result`,`connections.auto_heal_status`,`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`],fe=[...m,...h,...te,...ne,...v,...ee,...g,..._],pe=[...re,...ie,...ue,...de,...se,...ce,...le,...ae,...oe],me=new Set(fe),he=new Set(pe);function ge(e,t){return(t===`client`?me:he).has(e)||e.startsWith(`kanban.`)&&e.length>7||e.startsWith(`agent-roster.`)&&e.length>13}var _e=new Set([`__proto__`,`constructor`,`prototype`]),ve=32;function y(e,t,n){if(n>ve)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(_e.has(r))return{code:`unsafe_key`,message:`Unsafe protocol key: ${r}`,path:i};let a=y(e[r],i,n+1);if(a)return a}return null}function b(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(!ge(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=y(n,`$`,0);return r?{ok:!1,issue:r}:{ok:!0,message:e}}function ye(e,t){try{return b(JSON.parse(e),t)}catch{return{ok:!1,issue:{code:`invalid_envelope`,message:`Protocol frame is not valid JSON`}}}}function x(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function S(e,t=``){return typeof e==`string`?e:t}function C(e,t=0){return typeof e==`number`&&Number.isFinite(e)?e:t}function be(e){let t=x(e.payload);if(!t)return null;switch(e.type){case`provider.thinking_delta`:{let e=S(t.text);return e?{kind:`thinking-delta`,text:e}:null}case`provider.text_delta`:{let e=S(t.text);return e?{kind:`text-delta`,text:e,messageId:S(t.messageId)}:null}case`provider.response`:return{kind:`response`,content:t.content,stopReason:S(t.stopReason)};case`run.result`:return{kind:`run-result`,status:S(t.status),iterations:C(t.iterations,1),...typeof t.finalText==`string`?{finalText:t.finalText}:{}};case`error`:return{kind:`error`,message:S(t.message,`Run failed`)};default:return null}}function xe(e){let t=x(e.payload);if(!t)return null;if(e.type===`tool.started`){let e=S(t.name,`tool`);return{kind:`started`,id:S(t.id,e),name:e,input:t.input,messageId:S(t.messageId)}}if(e.type===`tool.progress`){let e=x(t.event);return{kind:`progress`,id:S(t.id),name:S(t.name,`tool`),eventType:S(e?.type),text:S(e?.text).trim()}}return e.type===`tool.executed`?{kind:`executed`,id:S(t.id),name:S(t.name),ok:t.ok!==!1,durationMs:C(t.durationMs),...typeof t.output==`string`?{output:t.output}:{},...Array.isArray(t.sage)?{sage:t.sage.filter(e=>typeof e==`string`)}:{}}:null}function w(e){if(!(typeof e!=`number`||!Number.isFinite(e)))return e}function T(e){return typeof e==`string`&&e.length>0?e:void 0}function Se(e){let t=x(e.payload);if(!t)return null;switch(e.type){case`fleet.concurrency_update`:return{kind:`concurrency`,active:C(t.fleetConcurrency),maximum:C(t.fleetConcurrencyMax),maxSpawns:w(t.maxSpawns),usedSpawns:w(t.usedSpawns),remainingSpawns:w(t.remainingSpawns),maxSpawnsSource:T(t.maxSpawnsSource),maxConcurrentSource:T(t.maxConcurrentSource),effectiveSource:T(t.effectiveSource),checkpointMaxSpawns:w(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=>x(e)!==null):[]};default:return null}}var Ce=[`protocol.directional-decoder`,`protocol.recursive-key-safety`,`chronicle.query`,`chronicle.facet`,`chronicle.facets`,`chronicle.graph`,`chronicle.metrics`,`chronicle.status`,`connections.health`,`context.topic-boundary`,`sdd.interview.continuity`,`sdd.run.from_graph`];function E(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:Ce.filter(e=>a.has(e))}}var D={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)},listMemoryCandidates(e,t){this.send({type:`memory.sage.listCandidates`,payload:{...e}},t)},searchSageBreakdown(e,t){this.send({type:`memory.sage.searchBreakdown`,payload:{query:e.query,...e.limit===void 0?{}:{limit:e.limit},...e.includeStale===void 0?{}:{includeStale:e.includeStale}}},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 O(e){Object.assign(e.prototype,D)}function k(e){return{type:`provider.clear_models`,payload:{providerId:e}}}function A(e,t){return{type:`provider.undo_clear`,payload:{providerId:e,previousModels:[...t]}}}function we(e){return{type:`provider.update`,payload:e}}var Te={getGitInfo(){this.send({type:`git.info`})},getGitChanges(){this.send({type:`git.changes`})},getGitDiff(e){this.send({type:`git.diff`,payload:{path:e}})},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:`abort`,payload:this.withSession({})}),this.send({type:`session.new`,payload:this.withSession({})})},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(k(e))},undoProviderClear(e,t){this.send(A(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(we(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`})}};function Ee(e){Object.assign(e.prototype,Te)}function j(e){return Math.max(0,Math.min(100,Math.round((typeof e==`number`&&Number.isFinite(e)?e:0)*100)))}function M(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`}}var De=400,Oe=1200;function N(e,t,n){if(e.size<=t)return e;let r=[...e.entries()].sort((e,t)=>n(e[1])-n(t[1]));for(let[n]of r.slice(0,e.size-t))e.delete(n);return e}function P(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 ke=0;function F(){return`viz_${Date.now()}_${++ke}`}var Ae=250;function I(e,t){return t-e<Ae}function L(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)||!L(n,i))return!1;continue}return!1}}return!0}var R={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))`},z={"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))`},B=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??F(),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:M(t),label:t.label,status:P(t.kind),activity:1,color:t.color??R[M(t)],lastSeenAt:a},c=e.nodes.get(o),l=c?{...c,...s}:s,u=!L(c,l);c&&u&&I(c.lastSeenAt,a)&&L({...c,activity:l.activity,lastSeenAt:l.lastSeenAt},l)&&(l=c,u=!1);let d,f=!1,p;if(t.target){p=t.target;let n={id:p,kind:M(t,!0),label:p,status:P(t.kind),activity:.8,color:t.color??R[M(t,!0)],lastSeenAt:a},r=e.nodes.get(p);d=r?{...r,...n}:n,f=!L(r,d),r&&f&&I(r.lastSeenAt,a)&&L({...r,activity:d.activity,lastSeenAt:d.lastSeenAt},d)&&(d=r,f=!1)}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??R[M(t)]??R.agent,lastActiveAt:a,totalMagnitude:(n?.totalMagnitude??0)+(t.magnitude??0)};m=n?{...n,...r}:r,h=!L(n,m),n&&h&&I(n.lastActiveAt,a)&&L({...n,lastActiveAt:m.lastActiveAt},m)&&(m=n,h=!1)}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)),_!==e.nodes&&(_=N(_,De,e=>e.lastSeenAt)),v!==e.edges&&(v=N(v,Oe,e=>e.lastActiveAt)),{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??z[t.kind]??z.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&&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 V(e,t){switch(e){case`provider.text_delta`:{let e=t.text??``;return{id:F(),kind:`provider:delta`,timestamp:Date.now(),source:`provider`,target:`leader`,label:e.slice(0,60),magnitude:e.length,data:{text:e},color:R.provider,flowGroup:`provider`}}case`provider.response`:{let e=t.usage,n=(e?.input??0)+(e?.output??0);return{id:F(),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:R.provider,flowGroup:`provider`}}case`provider.stream_error`:{let e=t.message??`Provider stream error`;return{id:F(),kind:`error`,timestamp:Date.now(),source:`provider`,target:`leader`,label:e.slice(0,80),magnitude:1,data:t,color:R.error,flowGroup:`provider`}}case`tool.started`:{let e=t.name??`tool`;return{id:F(),kind:`tool:started`,timestamp:Date.now(),source:e,target:`filesystem`,label:e,magnitude:1,data:t,color:R.tool,flowGroup:`tool:${e}`}}case`tool.executed`:{let e=t.name??`tool`,n=t.ok??!0;return{id:F(),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?R.tool:R.error,flowGroup:`tool:${e}`}}case`tool.progress`:{let e=t.name??`tool`,n=t.event?.text??``;return{id:F(),kind:`tool:progress`,timestamp:Date.now(),source:e,target:`leader`,label:n.slice(0,60)||e,magnitude:n.length,data:t,color:R.tool,flowGroup:`tool:${e}`}}case`codemap.tool_started`:{let e=t.name??`tool`,n=t.agentId??`subagent`;return{id:F(),kind:`tool:started`,timestamp:Date.now(),source:n,target:e,label:e,magnitude:1,data:t,color:R.tool,flowGroup:`agent:${n}`}}case`codemap.tool_executed`:{let e=t.name??`tool`,n=t.agentId??`subagent`,r=t.ok??!0;return{id:F(),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?R.tool:R.error,flowGroup:`agent:${n}`}}case`tool.loop_detected`:{let e=t.tools??``,n=t.kind??`loop`,r=t.action===`steer`;return{id:F(),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?R.agent:R.error,flowGroup:`tool`}}case`delegate.started`:{let e=t.target??`delegate`,n=t.task??``;return{id:F(),kind:`agent:status`,timestamp:Date.now(),source:`leader`,target:e,label:n.slice(0,80)||`Delegating to ${e}`,magnitude:1,data:t,color:R.agent,flowGroup:`delegate:${e}`}}case`delegate.completed`:{let e=t.subagentId??t.target??`delegate`,n=t.ok??!1;return{id:F(),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?R.agent:R.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:F(),kind:`agent:spawned`,timestamp:Date.now(),source:n,target:`session`,label:`${r} spawned`,magnitude:1,data:t,color:R.agent,flowGroup:`agent:${n}`};case`tool_executed`:{let e=t.toolName??`tool`,r=t.ok??!0;return{id:F(),kind:`agent:tool`,timestamp:Date.now(),source:n,target:e,label:e,magnitude:t.durationMs??0,data:t,color:r?R.tool:R.error,flowGroup:`agent:${n}`}}case`task_completed`:{let e=t.status??`completed`;return{id:F(),kind:`agent:status`,timestamp:Date.now(),source:n,target:`session`,label:`${r} ${e}`,magnitude:1,data:t,color:e===`success`?R.success:R.error,flowGroup:`agent:${n}`}}case`ctx_pct`:return{id:F(),kind:`agent:ctx`,timestamp:Date.now(),source:n,target:`session`,label:`ctx ${j(t.load)}%`,magnitude:t.tokens??0,data:t,color:R.agent,flowGroup:`agent:${n}`};case`iteration_summary`:return{id:F(),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:R.agent,flowGroup:`agent:${n}`};case`budget_extended`:return{id:F(),kind:`budget:extended`,timestamp:Date.now(),source:n,target:`session`,label:`${r} extended budget`,magnitude:t.totalExtensions??1,data:t,color:R.tool,flowGroup:`agent:${n}`};case`budget_warning`:return{id:F(),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:R.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:F(),kind:a?`mailbox:send`:`mailbox:deliver`,timestamp:Date.now(),source:n,target:r,label:i||(a?`→ ${r}`:`← ${n}`),magnitude:1,data:t,color:R.mailbox,flowGroup:`mailbox`}}case`iteration.started`:{let e=t.index??0;return{id:F(),kind:`iteration:start`,timestamp:Date.now(),source:`leader`,target:`session`,label:`Iteration ${e}`,magnitude:e,data:t,color:R.agent,flowGroup:`iteration`}}case`iteration.completed`:{let e=t.index??0;return{id:F(),kind:`iteration:end`,timestamp:Date.now(),source:`leader`,target:`session`,label:`Iteration ${e} done`,magnitude:e,data:t,color:R.session,flowGroup:`iteration`}}case`ctx.pct`:{let e=t.tokens??0;return{id:F(),kind:`agent:ctx`,timestamp:Date.now(),source:`leader`,target:`session`,label:`ctx ${j(t.load)}%`,magnitude:e,data:t,color:R.agent,flowGroup:`leader`}}case`error`:{let e=t.message??`Error`;return{id:F(),kind:`error`,timestamp:Date.now(),source:t.phase??`system`,target:`session`,label:e,magnitude:1,data:t,color:R.error,flowGroup:`error`}}case`context.compacted`:return{id:F(),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:F(),kind:`error`,timestamp:Date.now(),source:`compactor`,target:`session`,label:e.slice(0,80),magnitude:t.tokens??1,data:t,color:R.error,flowGroup:`context`}}case`context.repaired`:return{id:F(),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:F(),kind:`session:start`,timestamp:Date.now(),source:`session`,target:`leader`,label:n||e.slice(0,12),magnitude:1,data:t,color:R.session,flowGroup:`session`}}case`sessions.status_update`:{let e=t.sessions??[];return{id:F(),kind:`fleet:snapshot`,timestamp:Date.now(),source:`system`,target:`session`,label:`${e.length} session(s)`,magnitude:e.length,data:t,color:R.system,flowGroup:`fleet`}}default:return null}}function je(e){let t=e.payload?.sessionId,n=r.getState().session?.id;return t===``?!1:!t||!n||t===n}function Me(e){let t=V(e.type,e.payload);t&&(B.getState().pushEvent(t),B.getState().setActive(!0))}function Ne(e,t,n){let r=e.payload??{};for(let[e,n]of Object.entries(t)){let t=r[e];if(!H(t,n))return null}if(n)for(let[e,t]of Object.entries(n)){let n=r[e];if(n!=null&&!H(n,t))return null}return r}function H(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 Pe(e){try{return new URL(e).searchParams.get(`token`)}catch{return null}}function U(){if(typeof window>`u`||!window.location)return null;try{let e=window.location.search??``;return new URLSearchParams(e).get(`token`)}catch{return null}}function W(e){try{let t=new URL(e);return t.searchParams.delete(`token`),t.toString()}catch{return e}}function G(){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 K(){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=U();return n&&!t.searchParams.has(`token`)&&t.searchParams.set(`token`,n),t.toString()}catch{return null}}function q(){let e=K();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=U(),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 Fe=e({WrongStackWebSocketClient:()=>Z,getWSClient:()=>$}),Ie={"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.listCandidates":`memory.sage.listCandidates`,"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`},Le=3e4,Re=32,ze=15e3;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=16777216;pendingConfirms=new Map;static PENDING_CONFIRM_TTL_MS=6e4;sessionId=null;sessionSwapPending=!1;lastErrorText;statusListeners=new Set;currentStatus={state:`connecting`};suppressedChatEchoes=new Map;echoSweepTimer=null;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=W(this.url)),G();return}let e=Pe(this.url)??U();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=W(this.url)),G()):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=ye(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(){let e=this.messageQueue.splice(0);this.messageQueueChars=0;for(let t of e)try{this.send(t)}catch(e){console.warn(JSON.stringify({level:`warn`,event:`ws.flush_failed`,message:e instanceof Error?e.message:String(e)}))}}handleMessage(t){if(t.type===`tool.confirm_needed`){let n=t.payload;this.sweepExpiredPendingConfirms(Date.now()),this.pendingConfirms.set(n.id,{expiresAtMs:Date.now()+e.PENDING_CONFIRM_TTL_MS}),this.emit(t);return}if(t.type===`session.start`){let e=t.payload,n=E(e);this.sessionId=e.sessionId,this.protocolVersion=n.version,this.protocolCapabilities=new Set(n.capabilities),this.sessionSwapPending=!1}else t.type===`error`&&(t.payload.phase===`session.new`||t.payload.phase===`session.resume`)&&(this.sessionSwapPending=!1);this.emit(t)}sweepExpiredPendingConfirms(e){for(let[t,n]of this.pendingConfirms)n.expiresAtMs<=e&&this.pendingConfirms.delete(t)}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=b(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=Ie[e.type];if(t){let e=this.suppressedChatEchoes.get(t)??[];for(e.push(Date.now()+Le);e.length>Re;)e.shift();this.suppressedChatEchoes.set(t,e),this.ensureEchoSweep()}}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)}ensureEchoSweep(){this.echoSweepTimer||=setInterval(()=>{this.sweepSuppressedChatEchoes(Date.now())},ze)}sweepSuppressedChatEchoes(e){for(let[t,n]of this.suppressedChatEchoes){for(;n.length>0&&n[0]<=e;)n.shift();n.length===0&&this.suppressedChatEchoes.delete(t)}this.suppressedChatEchoes.size===0&&this.echoSweepTimer&&(clearInterval(this.echoSweepTimer),this.echoSweepTimer=null)}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,r=!1){let i=`msg_${Date.now()}_${n().slice(0,8)}`;return this.send({type:`user_message`,payload:this.withSession({id:i,content:e,timestamp:Date.now(),...r?{freshContext:!0}:{},...t&&t.length>0?{images:t}:{}})}),i}adviseTopic(e,t=1e4){let r=n();return new Promise(n=>{let i=!1,a=e=>{i||(i=!0,clearTimeout(s),o(),n(e))},o=this.on(`topic.advice_result`,e=>{e.payload.requestId===r&&a(e.payload)}),s=setTimeout(()=>{a({requestId:r,suggestNewContext:!1,confidence:0,reason:`Topic check timed out; continuing in the current context.`,source:`local`})},t);this.send({type:`topic.advice`,payload:this.withSession({requestId:r,prompt:e})})})}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({})})}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}})})}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.`})})}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.pendingConfirms.clear(),this.echoSweepTimer&&=(clearInterval(this.echoSweepTimer),null),this.suppressedChatEchoes.clear(),this.ws?.close(),this.ws=null}get isConnected(){return this.ws?.readyState===WebSocket.OPEN}get currentSessionId(){return this.sessionId}};O(X),Ee(X);var Z=X,Q=null;function $(e){return Q||=new Z(e),Q}export{Me as a,V as c,xe as d,a as f,je as i,be as l,Fe as n,Ne as o,q as r,B as s,$ as t,Se as u};
@@ -50,6 +50,26 @@ export declare function deskPersonality(identity: string, role: AgentVisualRole)
50
50
  /** `anthropic/claude-sonnet-4-20250514` → `claude-sonnet-4`; falls back to the raw value. */
51
51
  export declare function shortModelName(model: string, max?: number): string;
52
52
  export declare function shortPath(value: string | undefined, max?: number): string | undefined;
53
+ export interface DeskWaitState {
54
+ /** True when the agent is alive but has produced no tool/mail work for a while. */
55
+ waiting: boolean;
56
+ /** Milliseconds since the last observable activity (tool call or mail). */
57
+ idleMs: number;
58
+ /** What the agent most plausibly waits for, for the tooltip. */
59
+ reason: 'no-work' | 'telemetry' | 'mail-reply';
60
+ /** Human label for the last known anchor point, shown in the tooltip. */
61
+ anchor: string;
62
+ /** Mail id the `mail-reply` reason refers to — used to suppress the flyby. */
63
+ anchorId: string | undefined;
64
+ anchorAt: number | undefined;
65
+ }
66
+ /**
67
+ * A desk is "waiting" when it is active but silent: no running tool call and
68
+ * nothing new for WAIT_THRESHOLD_MS. The reason distinguishes the three cases
69
+ * a supervisor actually needs to tell apart — no assigned work, missing
70
+ * telemetry, or a sent mail that nobody answered yet.
71
+ */
72
+ export declare function deskWaitState(model: OfficeAgentModel, now: number, thresholdMs?: number): DeskWaitState;
53
73
  export declare function relativeTime(timestamp: number, now: number): string;
54
74
  export declare function formatUptime(startedAt: string | undefined, now: number): string;
55
75
  export declare function clientOfficeStats(agents: OfficeAgentModel[]): ClientOfficeStats;
@@ -1,3 +1,13 @@
1
+ import { type SelectedAction } from './AgentOfficeDetails';
1
2
  import './AgentOfficeView.css';
3
+ import { type OfficeAgentModel } from './AgentOfficeView/model';
4
+ /** Exported for tests: render a single desk lane with fixture models. */
5
+ export declare function AgentLane({ model, now, onSelect, routedMailIds, }: {
6
+ model: OfficeAgentModel;
7
+ now: number;
8
+ onSelect: (selected: SelectedAction) => void;
9
+ /** Mail ids animated by the desk-to-desk route overlay — skip the local flyby. */
10
+ routedMailIds?: ReadonlySet<string> | undefined;
11
+ }): import("react").JSX.Element;
2
12
  export declare function AgentOfficeView(): import("react").JSX.Element;
3
13
  //# sourceMappingURL=AgentOfficeView.d.ts.map
@@ -0,0 +1,16 @@
1
+ /**
2
+ * AgentTabs — leader/subagent switcher above the chat transcript.
3
+ *
4
+ * Renders only when the fleet roster is non-empty (the leader is part of
5
+ * it). The Leader tab restores the normal chat; each subagent tab swaps
6
+ * the transcript pane for that agent's full history rendered chat-style
7
+ * (SubagentTranscriptView) and hides the input area. Selection lives in
8
+ * ui-store (`subagentChatFocusId`) so any surface — roster cards, agent
9
+ * detail sections — can jump straight into an agent's chat view.
10
+ */
11
+ export declare function AgentTabs(): import("react").JSX.Element | null;
12
+ /** Pure focus-retention rule: a focused subagent id only survives while the
13
+ * agent still exists in the fleet roster. Null focus never clears. Exported
14
+ * for direct unit testing (consumed by ChatView's stale-focus effect). */
15
+ export declare function shouldAutoClearSubagentFocus(focusId: string | null, agentExists: boolean): boolean;
16
+ //# sourceMappingURL=AgentTabs.d.ts.map
@@ -0,0 +1,16 @@
1
+ /**
2
+ * SubagentTranscriptView — full-pane chat-style history of one subagent.
3
+ *
4
+ * Shown in place of the leader transcript while an agent tab is selected
5
+ * (see AgentTabs). Renders the agent's complete fleet-store transcript —
6
+ * markdown assistant bubbles, collapsible thinking, tool call/result cards,
7
+ * status lines — mirroring the leader chat's visual language, but WITHOUT
8
+ * any input area: subagents are read-only observers here.
9
+ *
10
+ * Auto-scrolls to the newest entry while the user is pinned to the bottom;
11
+ * scrolling up releases the pin so long histories can be read in place.
12
+ */
13
+ export declare function SubagentTranscriptView({ agentId }: {
14
+ agentId: string;
15
+ }): React.ReactElement;
16
+ //# sourceMappingURL=SubagentTranscriptView.d.ts.map
@@ -19,6 +19,13 @@ export declare function useChatViewState(): {
19
19
  readTokens: number;
20
20
  writeTokens: number;
21
21
  hitRatio: number;
22
+ providers?: Array<{
23
+ provider: string;
24
+ input: number;
25
+ cacheRead: number;
26
+ cacheWrite: number;
27
+ hitRatio: number;
28
+ }>;
22
29
  coverageTokens: number;
23
30
  } | null;
24
31
  iteration: {
@@ -1,4 +1,4 @@
1
- export declare function LogsSettingsTab({ syncPref, }: {
1
+ export declare function LogsSettingsTab({ syncPref }: {
2
2
  syncPref: (key: string, value: unknown) => void;
3
3
  }): import("react").JSX.Element;
4
4
  //# sourceMappingURL=LogsSettingsTab.d.ts.map
@@ -36,17 +36,7 @@ export interface MCPServer {
36
36
  };
37
37
  };
38
38
  }
39
- export interface MCPServerConfig {
40
- name: string;
41
- transport: string;
42
- description?: string;
43
- enabled?: boolean;
44
- command?: string;
45
- args?: string[];
46
- env?: Record<string, string>;
47
- allowedTools?: string[];
48
- url?: string;
49
- lazy?: boolean;
50
- }
39
+ import type { MCPServerConfig } from './contracts.js';
40
+ export type { MCPServerConfig };
51
41
  export declare function MCPSection(): ReactElement;
52
42
  //# sourceMappingURL=MCPSection.d.ts.map
@@ -1,3 +1,10 @@
1
+ /**
2
+ * `<ModelSchemaEditor>` — grouped schema edit form for a single model (ME-4).
3
+ *
4
+ * Sections: identity · limits · pricing · modalities · capability flags · dates.
5
+ * Client-side validation via the ME-1 zod schema (modelsDevModelSchema).
6
+ * Optional raw-JSON advanced tab.
7
+ */
1
8
  export interface ModelSchemaEditorProps {
2
9
  providerId: string;
3
10
  modelId: string;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Leaf contract types for the @wrongstack/webui SettingsPanel surface.
3
+ *
4
+ * Lives separately from `MCPSection.tsx` so callers (e.g. `official-servers.ts`
5
+ * which converts an `OfficialServer` entry into an `MCPServerConfig`) can
6
+ * depend on the wire-level shape without pulling in the 904-line MCPSection
7
+ * component implementation. Breaks the long-standing type-level SCC
8
+ * ARCH-CYCLE-TYPE-23 where `MCPSection.tsx` both homed the shared config
9
+ * type and was imported back by `official-servers.ts`.
10
+ *
11
+ * This module MUST contain no runtime imports.
12
+ */
13
+ /**
14
+ * Configuration shape for a user-defined MCP server entry.
15
+ * Mirrors the persisted JSON shape consumed by the runtime registry.
16
+ */
17
+ export interface MCPServerConfig {
18
+ name: string;
19
+ transport: string;
20
+ description?: string;
21
+ enabled?: boolean;
22
+ command?: string;
23
+ args?: string[];
24
+ env?: Record<string, string>;
25
+ allowedTools?: string[];
26
+ url?: string;
27
+ lazy?: boolean;
28
+ }
29
+ //# sourceMappingURL=contracts.d.ts.map
@@ -1,4 +1,4 @@
1
- import type { MCPServerConfig } from './MCPSection';
1
+ import type { MCPServerConfig } from './contracts.js';
2
2
  export interface OfficialServer {
3
3
  name: string;
4
4
  description: string;
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Per-payload shape returned by the server's `context.debug` WS message.
3
+ * Kept loose (the modal re-types the fields it cares about) so a future
4
+ * server-side addition does not break every consumer of the hook.
5
+ */
6
+ export interface LiveContextDebugPayload {
7
+ total: number;
8
+ mode?: string | undefined;
9
+ policy?: unknown | undefined;
10
+ systemPrompt: number;
11
+ tools: {
12
+ total: number;
13
+ count: number;
14
+ breakdown: Array<{
15
+ name: string;
16
+ tokens: number;
17
+ }>;
18
+ };
19
+ messages: {
20
+ total: number;
21
+ count: number;
22
+ breakdown: Array<{
23
+ index: number;
24
+ role: string;
25
+ tokens: number;
26
+ preview: string;
27
+ }>;
28
+ };
29
+ }
30
+ export interface UseLiveContextDebugOptions {
31
+ /**
32
+ * When `false`, the hook idles: no subscription, no polling, no
33
+ * requests. Defaults to `true` so a typical modal consumer can call
34
+ * the hook unconditionally.
35
+ */
36
+ active?: boolean | undefined;
37
+ /**
38
+ * Polling cadence in milliseconds. 2 s is fast enough to look
39
+ * "live" during in-flight agent runs without flooding the server
40
+ * when nothing is moving. Tune per consumer if needed.
41
+ */
42
+ intervalMs?: number | undefined;
43
+ /**
44
+ * When `true` (the default), pause polling while `document.hidden`
45
+ * and fire one catch-up request on visibility regain. Off by default
46
+ * in non-DOM test environments.
47
+ */
48
+ pauseWhenHidden?: boolean | undefined;
49
+ }
50
+ export interface UseLiveContextDebugResult<T extends LiveContextDebugPayload> {
51
+ /**
52
+ * Latest snapshot, or `null` until the first response arrives. Each
53
+ * incoming payload overwrites the prior one — the most recent server
54
+ * payload always wins, so consumers never see a stale value after a
55
+ * refresh.
56
+ */
57
+ data: T | null;
58
+ /**
59
+ * `true` only while the first snapshot is in flight. Subsequent
60
+ * snapshots never re-trigger the loading indicator, so a refresh
61
+ * does not blank the UI mid-update.
62
+ */
63
+ loading: boolean;
64
+ /** Last error message, or `null`. Resets on every successful snapshot. */
65
+ error: string | null;
66
+ /**
67
+ * Imperative restart: bumps a generation counter that triggers an
68
+ * immediate request and re-arms the polling cadence. Use for an
69
+ * explicit "refresh" button.
70
+ */
71
+ refresh: () => void;
72
+ /**
73
+ * Wall-clock time of the most recent successful snapshot, or `null`.
74
+ * Useful for "last updated 3s ago" affordances.
75
+ */
76
+ lastUpdatedAt: number | null;
77
+ }
78
+ /**
79
+ * Subscribe-and-poll wrapper around the server `context.debug` WS
80
+ * message. While `active` is true the hook:
81
+ *
82
+ * 1. Subscribes to `context.debug` for the hook's lifetime.
83
+ * 2. Sends an immediate request.
84
+ * 3. Polls every `intervalMs` (default 2 s).
85
+ * 4. Pauses on `document.hidden` and catches up on regain, unless
86
+ * `pauseWhenHidden` is `false`.
87
+ *
88
+ * Latest snapshot wins. Transient `send()` failures (closed socket
89
+ * during reconnect) are swallowed — the next tick retries.
90
+ *
91
+ * @example
92
+ * const { data, loading, error, refresh } = useLiveContextDebug(wsUrl, {
93
+ * active: open,
94
+ * });
95
+ */
96
+ export declare function useLiveContextDebug<T extends LiveContextDebugPayload = LiveContextDebugPayload>(wsUrl: string, options?: UseLiveContextDebugOptions): UseLiveContextDebugResult<T>;
97
+ //# sourceMappingURL=useLiveContextDebug.d.ts.map
package/dist/index.css CHANGED
@@ -1163,6 +1163,115 @@
1163
1163
  text-overflow: ellipsis;
1164
1164
  white-space: nowrap;
1165
1165
  }
1166
+ .agent-office__wait-badge {
1167
+ display: inline-flex;
1168
+ width: fit-content;
1169
+ align-items: center;
1170
+ gap: 5px;
1171
+ margin-top: 6px;
1172
+ padding: 3px 7px;
1173
+ border: 1px solid hsl(var(--warning) / 0.35);
1174
+ border-radius: 999px;
1175
+ color: hsl(var(--warning));
1176
+ background: hsl(var(--warning) / 0.08);
1177
+ cursor: pointer;
1178
+ font: 500 9px / 1.3 var(--font-mono);
1179
+ letter-spacing: 0.04em;
1180
+ }
1181
+ .agent-office__wait-badge svg {
1182
+ width: 11px;
1183
+ height: 11px;
1184
+ }
1185
+ .agent-office__wait-badge:hover {
1186
+ border-color: hsl(var(--warning) / 0.6);
1187
+ background: hsl(var(--warning) / 0.14);
1188
+ }
1189
+ .agent-office__wait-badge.is-mail-reply {
1190
+ border-color: hsl(var(--info) / 0.4);
1191
+ color: hsl(var(--info));
1192
+ background: hsl(var(--info) / 0.08);
1193
+ }
1194
+ .agent-office__wait-badge.is-mail-reply:hover {
1195
+ border-color: hsl(var(--info) / 0.65);
1196
+ background: hsl(var(--info) / 0.14);
1197
+ }
1198
+ .agent-office__wait-badge.is-telemetry {
1199
+ border-style: dashed;
1200
+ }
1201
+ .agent-office__lane.is-waiting .agent-office__status-dot {
1202
+ background: hsl(var(--warning));
1203
+ }
1204
+ .agent-office__lane.is-waiting .agent-office__window span {
1205
+ animation-play-state: paused;
1206
+ opacity: 0.6;
1207
+ }
1208
+ .agent-office__desk-metrics {
1209
+ grid-column: 1 / -1;
1210
+ display: flex;
1211
+ align-items: center;
1212
+ gap: 0;
1213
+ margin: 0 9px 8px;
1214
+ padding: 4px 2px 0;
1215
+ border-top: 1px solid var(--office-line);
1216
+ color: hsl(var(--muted-foreground));
1217
+ font: 500 9.5px / 1.2 var(--font-mono);
1218
+ }
1219
+ .agent-office__metric {
1220
+ display: inline-flex;
1221
+ flex: 0 0 auto;
1222
+ align-items: center;
1223
+ gap: 5px;
1224
+ padding: 3px 12px 3px 0;
1225
+ margin-right: 12px;
1226
+ border-right: 1px solid var(--office-line);
1227
+ white-space: nowrap;
1228
+ }
1229
+ .agent-office__metric:last-child {
1230
+ border-right: none;
1231
+ }
1232
+ .agent-office__metric strong {
1233
+ color: hsl(var(--foreground));
1234
+ font-weight: 600;
1235
+ }
1236
+ .agent-office__metric small {
1237
+ letter-spacing: 0.08em;
1238
+ font-size: 8.5px;
1239
+ }
1240
+ .agent-office__metric svg {
1241
+ width: 11px;
1242
+ height: 11px;
1243
+ flex: 0 0 auto;
1244
+ }
1245
+ .agent-office__ctx-bar {
1246
+ position: relative;
1247
+ overflow: hidden;
1248
+ width: 34px;
1249
+ height: 3px;
1250
+ border-radius: 999px;
1251
+ background: hsl(var(--border) / 0.6);
1252
+ }
1253
+ .agent-office__ctx-bar b {
1254
+ position: absolute;
1255
+ inset: 0 auto 0 0;
1256
+ border-radius: inherit;
1257
+ background: hsl(var(--primary) / 0.55);
1258
+ transition: width 400ms ease;
1259
+ }
1260
+ .agent-office__ctx-bar.is-high b {
1261
+ background: hsl(var(--destructive) / 0.7);
1262
+ }
1263
+ .agent-office__metric-action {
1264
+ min-width: 0;
1265
+ flex: 1 1 auto;
1266
+ overflow: hidden;
1267
+ padding-right: 0;
1268
+ }
1269
+ .agent-office__metric-action small {
1270
+ overflow: hidden;
1271
+ text-overflow: ellipsis;
1272
+ letter-spacing: 0.02em;
1273
+ color: hsl(var(--foreground) / 0.72);
1274
+ }
1166
1275
  .agent-office__identity-mail {
1167
1276
  display: flex;
1168
1277
  width: 100%;
@@ -1262,6 +1371,7 @@
1262
1371
  color-mix(in srgb, var(--desk-screen) 23%, transparent),
1263
1372
  hsl(var(--primary) / 0.04));
1264
1373
  animation: agent-office-window-glow 8s ease-in-out infinite alternate;
1374
+ box-shadow: inset 0 0 8px hsl(var(--info) / 0.14);
1265
1375
  }
1266
1376
  .agent-office__window span:nth-child(2) {
1267
1377
  animation-delay: -2.4s;
@@ -3001,10 +3111,10 @@ button.agent-office__parcel:hover {
3001
3111
  }
3002
3112
  @keyframes agent-office-brief-arrive {
3003
3113
  from {
3004
- left: -30%;
3114
+ transform: skewX(-18deg) translateX(0);
3005
3115
  }
3006
3116
  to {
3007
- left: 118%;
3117
+ transform: skewX(-18deg) translateX(617%);
3008
3118
  }
3009
3119
  }
3010
3120
  @keyframes agent-office-sync-line {
@@ -3036,7 +3146,6 @@ button.agent-office__parcel:hover {
3036
3146
  }
3037
3147
  to {
3038
3148
  opacity: 1;
3039
- box-shadow: inset 0 0 8px hsl(var(--info) / 0.14);
3040
3149
  }
3041
3150
  }
3042
3151
  @keyframes agent-office-plant-sway {
@@ -3169,12 +3278,10 @@ button.agent-office__parcel:hover {
3169
3278
  }
3170
3279
  @keyframes agent-office-yawn-mouth {
3171
3280
  0%, 72%, 100% {
3172
- height: 2px;
3173
- transform: scale(1);
3281
+ transform: scaleY(1);
3174
3282
  }
3175
3283
  80%, 88% {
3176
- height: 7px;
3177
- transform: scale(1.15);
3284
+ transform: scaleY(3.5);
3178
3285
  }
3179
3286
  }
3180
3287
  @keyframes agent-office-idle-stretch {
package/dist/index.html CHANGED
@@ -5,39 +5,39 @@
5
5
  <link rel="icon" type="image/svg+xml" href="/wrongstack.svg" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>WrongStack WebUI</title>
8
- <script type="module" crossorigin src="/assets/index-DQn-Lz9q.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-Cyhuj8ku.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-hePW80VL.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/monaco-BCqJp2xW.js">
11
- <link rel="modulepreload" crossorigin href="/assets/markdown-CIRD7kOg.js">
12
- <link rel="modulepreload" crossorigin href="/assets/vendor-C_zEzV4N.js">
13
- <link rel="modulepreload" crossorigin href="/assets/utils-tsZEnrBH.js">
14
- <link rel="modulepreload" crossorigin href="/assets/chat-store-c0pGYczr.js">
15
- <link rel="modulepreload" crossorigin href="/assets/activity-CezOSNBd.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/markdown-Kp5uSgOw.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/vendor-DZ9_OO6N.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/utils-BecmXwgG.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/chat-store-BiEXyguk.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/activity-COQ9xSFu.js">
16
16
  <link rel="modulepreload" crossorigin href="/assets/chat-CzaGXz_W.js">
17
17
  <link rel="modulepreload" crossorigin href="/assets/commandPalette-BovBiPec.js">
18
18
  <link rel="modulepreload" crossorigin href="/assets/common-BBHmIHQW.js">
19
19
  <link rel="modulepreload" crossorigin href="/assets/settings-DfID_cS9.js">
20
20
  <link rel="modulepreload" crossorigin href="/assets/setup-DfcCCvUO.js">
21
21
  <link rel="modulepreload" crossorigin href="/assets/toasts-DOfXc7Rt.js">
22
- <link rel="modulepreload" crossorigin href="/assets/i18n-DbJfY4tY.js">
23
- <link rel="modulepreload" crossorigin href="/assets/session-store-CKdsROPD.js">
24
- <link rel="modulepreload" crossorigin href="/assets/ws-client-CBfMQmW9.js">
25
- <link rel="modulepreload" crossorigin href="/assets/codemap-activity-store-BH7Mh4k9.js">
26
- <link rel="modulepreload" crossorigin href="/assets/mailbox-store-bF96Ih2G.js">
27
- <link rel="modulepreload" crossorigin href="/assets/ui-store-xx1NssJI.js">
28
- <link rel="modulepreload" crossorigin href="/assets/stores-C0xX0jn4.js">
29
- <link rel="modulepreload" crossorigin href="/assets/view-navigation-CZKugncK.js">
30
- <link rel="modulepreload" crossorigin href="/assets/codemap-index-store-BFm1TzVW.js">
31
- <link rel="modulepreload" crossorigin href="/assets/Toaster-BlD1m8P2.js">
32
- <link rel="modulepreload" crossorigin href="/assets/useWebSocket-D9Dy4-9x.js">
33
- <link rel="modulepreload" crossorigin href="/assets/dialog-BJjDUqb3.js">
34
- <link rel="modulepreload" crossorigin href="/assets/button-DvpRpKkt.js">
35
- <link rel="modulepreload" crossorigin href="/assets/input-BtoHcCl9.js">
36
- <link rel="modulepreload" crossorigin href="/assets/ConfirmModal-KzK0LoJw.js">
37
- <link rel="modulepreload" crossorigin href="/assets/ModelPicker-nyXP3xsj.js">
22
+ <link rel="modulepreload" crossorigin href="/assets/i18n-dLvHUYek.js">
23
+ <link rel="modulepreload" crossorigin href="/assets/session-store-CKpAwNIm.js">
24
+ <link rel="modulepreload" crossorigin href="/assets/ws-client-DXT4gi-N.js">
25
+ <link rel="modulepreload" crossorigin href="/assets/codemap-activity-store-BWt_a7Gs.js">
26
+ <link rel="modulepreload" crossorigin href="/assets/mailbox-store-DhAVkVJQ.js">
27
+ <link rel="modulepreload" crossorigin href="/assets/ui-store-3HoYrTu5.js">
28
+ <link rel="modulepreload" crossorigin href="/assets/stores-D9Ng0JyF.js">
29
+ <link rel="modulepreload" crossorigin href="/assets/view-navigation-C1UDTk5R.js">
30
+ <link rel="modulepreload" crossorigin href="/assets/codemap-index-store-CDhApwWQ.js">
31
+ <link rel="modulepreload" crossorigin href="/assets/Toaster-tBe1ZrKx.js">
32
+ <link rel="modulepreload" crossorigin href="/assets/useWebSocket-B2jKc_G4.js">
33
+ <link rel="modulepreload" crossorigin href="/assets/dialog-DPl7DolS.js">
34
+ <link rel="modulepreload" crossorigin href="/assets/button-Dhmop_yM.js">
35
+ <link rel="modulepreload" crossorigin href="/assets/input-C3rIQ26u.js">
36
+ <link rel="modulepreload" crossorigin href="/assets/ConfirmModal-e_pAJNXI.js">
37
+ <link rel="modulepreload" crossorigin href="/assets/ModelPicker-BX3TyLGh.js">
38
38
  <link rel="stylesheet" crossorigin href="/assets/monaco-Bowa0-zp.css">
39
39
  <link rel="stylesheet" crossorigin href="/assets/vendor-BMdWcCR4.css">
40
- <link rel="stylesheet" crossorigin href="/assets/index-D2tx76V0.css">
40
+ <link rel="stylesheet" crossorigin href="/assets/index-B8J_xxU5.css">
41
41
  </head>
42
42
  <body>
43
43
  <div id="root"></div>