@wrongstack/webui 0.308.6 → 0.309.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.
- package/dist/assets/{AgentRosterView-z7sAuWGe.js → AgentRosterView-CbgKjnxJ.js} +1 -1
- package/dist/assets/{AnalyticsDashboard-Ch1DX7tR.js → AnalyticsDashboard-BXnPG2xB.js} +1 -1
- package/dist/assets/{AudienceMemoryPanel-Cec0V4--.js → AudienceMemoryPanel-Ch-jf06O.js} +1 -1
- package/dist/assets/{ChangesView-CzvRJS2F.js → ChangesView-5lcal8q4.js} +1 -1
- package/dist/assets/{ChronicleDashboard-Dc5cQH7A.js → ChronicleDashboard-BH9k5NjB.js} +1 -1
- package/dist/assets/{CodeEditor-C1xScB5M.js → CodeEditor-BrQMwzOp.js} +1 -1
- package/dist/assets/{CodeMap-BMcY8qXe.js → CodeMap-B5e0v0jn.js} +1 -1
- package/dist/assets/{ConfirmModal-i2BGY0ev.js → ConfirmModal-KzK0LoJw.js} +1 -1
- package/dist/assets/{CronJobsPanel-D4VNa-Kl.js → CronJobsPanel-aLru0Rd_.js} +1 -1
- package/dist/assets/{DeadCodeScanPanel-DyV2LHm_.js → DeadCodeScanPanel-BXpB_M2Z.js} +1 -1
- package/dist/assets/{DebugDashboard-C_T68C0f.js → DebugDashboard-hnhGaWr-.js} +1 -1
- package/dist/assets/{DesignGalleryView-CVmV-AU2.js → DesignGalleryView-CXHgaI2Q.js} +1 -1
- package/dist/assets/{GoalView-DQa9PklT.js → GoalView-BB5t68cb.js} +1 -1
- package/dist/assets/{KanbanView-CDp4gTML.js → KanbanView-bZtgy3zZ.js} +1 -1
- package/dist/assets/{MailboxDetailView-D7aRTWS8.js → MailboxDetailView-jPxF6ia3.js} +1 -1
- package/dist/assets/{MemoryDrawer-Bivx9AXj.js → MemoryDrawer-e8UxQq-s.js} +1 -1
- package/dist/assets/{MemoryManager-DOTxwo0l.js → MemoryManager-BXYIA9wG.js} +1 -1
- package/dist/assets/{ModelPicker-MpC6-gWQ.js → ModelPicker-nyXP3xsj.js} +1 -1
- package/dist/assets/{OfficeMapPanel-Q8nQfQVb.js → OfficeMapPanel-CBfE7Kli.js} +1 -1
- package/dist/assets/{ProcessMonitor-C8GH1q2B.js → ProcessMonitor-Epj6RrOA.js} +1 -1
- package/dist/assets/{PromptJournalView-BdOYPAjU.js → PromptJournalView-CMlGmjig.js} +1 -1
- package/dist/assets/{QueuePanel-RBW9Sh9b.js → QueuePanel-D67eiPuQ.js} +1 -1
- package/dist/assets/{RefreshDebugView-1lZduXKE.js → RefreshDebugView-CWAwHE9i.js} +1 -1
- package/dist/assets/{RequirementIntakeView-BtKuq_F4.js → RequirementIntakeView-DPj065HL.js} +1 -1
- package/dist/assets/{SageTabs-D2_mTlcJ.js → SageTabs-BtRa8OZC.js} +2 -2
- package/dist/assets/{SddFlowGraph-BdaItHkB.js → SddFlowGraph-DMSN4LTZ.js} +1 -1
- package/dist/assets/{SddHub-DVO0JGWk.js → SddHub-CuqWpqSd.js} +1 -1
- package/dist/assets/{SessionInspectView-xchxZrHA.js → SessionInspectView-BdlOiPzO.js} +1 -1
- package/dist/assets/{SessionList-2W7mKbcZ.js → SessionList-CvvH8SI2.js} +1 -1
- package/dist/assets/{SessionsDashboard-6QJsVGap.js → SessionsDashboard-BiR0zh-a.js} +1 -1
- package/dist/assets/{SetupScreen-DM2KCb23.js → SetupScreen-B8s5fvr8.js} +1 -1
- package/dist/assets/{SkillDetailView-Cx2z8hyp.js → SkillDetailView-DbXp7-E5.js} +1 -1
- package/dist/assets/{SpecsView-D-qbN6F5.js → SpecsView-2PqHEXH9.js} +1 -1
- package/dist/assets/{TechStackView-C7XFcAls.js → TechStackView-Dnws9pc9.js} +1 -1
- package/dist/assets/{TerminalPanel-DZs5mkPP.js → TerminalPanel-CLUB8F2H.js} +1 -1
- package/dist/assets/{Toaster-ChF897Tc.js → Toaster-BlD1m8P2.js} +1 -1
- package/dist/assets/{i18n-DiD9Wcep.js → i18n-DbJfY4tY.js} +2 -2
- package/dist/assets/{index-Cnerffls.js → index-DQn-Lz9q.js} +7 -7
- package/dist/assets/{roster-ws-XgkT9mo8.js → roster-ws-DycHs92J.js} +1 -1
- package/dist/assets/session-store-CKdsROPD.js +1 -0
- package/dist/assets/settings-B36QpLU8.js +1 -0
- package/dist/assets/settings-B8Hgh9_X.js +1 -0
- package/dist/assets/settings-B8uABeWU.js +1 -0
- package/dist/assets/settings-CSwU_zzD.js +1 -0
- package/dist/assets/settings-DfID_cS9.js +1 -0
- package/dist/assets/{settings-BPT8LWkU.js → settings-FXJ8SsEh.js} +1 -1
- package/dist/assets/settings-RQKnX4dA.js +1 -0
- package/dist/assets/{stores-CzgPPQlG.js → stores-C0xX0jn4.js} +1 -1
- package/dist/assets/{useWebSocket-DvMcAAgU.js → useWebSocket-D9Dy4-9x.js} +2 -2
- package/dist/assets/{ws-client-BVq0hf0a.js → ws-client-CBfMQmW9.js} +1 -1
- package/dist/index.html +10 -10
- package/dist/index.js +92 -31
- package/dist/stores/session-store.d.ts +7 -0
- package/dist/types/protocol-core.d.ts +4 -0
- package/package.json +8 -8
- package/dist/assets/session-store-BgiP4PnQ.js +0 -1
- package/dist/assets/settings-50uwXQIW.js +0 -1
- package/dist/assets/settings-BmJI-gam.js +0 -1
- package/dist/assets/settings-CqFe8Jtz.js +0 -1
- package/dist/assets/settings-DeM0wvCG.js +0 -1
- package/dist/assets/settings-DijFr-kZ.js +0 -1
- package/dist/assets/settings-L9mLQIIP.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-hePW80VL.js";import{za as t}from"./vendor-C_zEzV4N.js";import{n}from"./utils-tsZEnrBH.js";import{t as r}from"./session-store-BgiP4PnQ.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(`,`),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.rewind,sdd.spec.start,specs.get,specs.list,specs.taskStatus`.split(`,`),ee=`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(`,`),te=`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(`,`),ne=`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(`,`),re=[`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`],ie=`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(`,`),ae=`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(`,`),oe=`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(`,`),se=[`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`],ce=[`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`],le=`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(`,`),ue=[`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`],de=[...m,...h,...ee,...te,...v,...y,...g,..._],b=[...ne,...re,...le,...ue,...oe,...se,...ce,...ie,...ae],x=new Set(de),fe=new Set(b);function pe(e,t){return(t===`client`?x:fe).has(e)||e.startsWith(`kanban.`)&&e.length>7||e.startsWith(`agent-roster.`)&&e.length>13}var me=new Set([`__proto__`,`constructor`,`prototype`]),he=32;function S(e,t,n){if(n>he)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(me.has(r))return{code:`unsafe_key`,message:`Unsafe protocol key: ${r}`,path:i};let a=S(e[r],i,n+1);if(a)return a}return null}function C(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(!pe(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=S(n,`$`,0);return r?{ok:!1,issue:r}:{ok:!0,message:e}}function ge(e,t){try{return C(JSON.parse(e),t)}catch{return{ok:!1,issue:{code:`invalid_envelope`,message:`Protocol frame is not valid JSON`}}}}var _e=[`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 ve(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:_e.filter(e=>a.has(e))}}var ye={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 be(e){Object.assign(e.prototype,ye)}function w(e){return{type:`provider.clear_models`,payload:{providerId:e}}}function T(e,t){return{type:`provider.undo_clear`,payload:{providerId:e,previousModels:[...t]}}}function E(e){return{type:`provider.update`,payload:e}}var D={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(w(e))},undoProviderClear(e,t){this.send(T(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(E(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 O(e){Object.assign(e.prototype,D)}function k(e){return Math.max(0,Math.min(100,Math.round((typeof e==`number`&&Number.isFinite(e)?e:0)*100)))}function A(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 j=400,M=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 F=0;function I(){return`viz_${Date.now()}_${++F}`}var xe=250;function L(e,t){return t-e<xe}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??I(),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:A(t),label:t.label,status:P(t.kind),activity:1,color:t.color??z[A(t)],lastSeenAt:a},c=e.nodes.get(o),l=c?{...c,...s}:s,u=!R(c,l);c&&u&&L(c.lastSeenAt,a)&&R({...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:A(t,!0),label:p,status:P(t.kind),activity:.8,color:t.color??z[A(t,!0)],lastSeenAt:a},r=e.nodes.get(p);d=r?{...r,...n}:n,f=!R(r,d),r&&f&&L(r.lastSeenAt,a)&&R({...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??z[A(t)]??z.agent,lastActiveAt:a,totalMagnitude:(n?.totalMagnitude??0)+(t.magnitude??0)};m=n?{...n,...r}:r,h=!R(n,m),n&&h&&L(n.lastActiveAt,a)&&R({...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(_,j,e=>e.lastSeenAt)),v!==e.edges&&(v=N(v,M,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??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&&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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),kind:`agent:ctx`,timestamp:Date.now(),source:n,target:`session`,label:`ctx ${k(t.load)}%`,magnitude:t.tokens??0,data:t,color:z.agent,flowGroup:`agent:${n}`};case`iteration_summary`:return{id:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),kind:`agent:ctx`,timestamp:Date.now(),source:`leader`,target:`session`,label:`ctx ${k(t.load)}%`,magnitude:e,data:t,color:z.agent,flowGroup:`leader`}}case`error`:{let e=t.message??`Error`;return{id:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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 Se(e){let t=e.payload?.sessionId,n=r.getState().session?.id;return t===``?!1:!t||!n||t===n}function Ce(e){let t=H(e.type,e.payload);t&&(V.getState().pushEvent(t),V.getState().setActive(!0))}function we(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 Te(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 Ee(){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=Ee();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 De=e({WrongStackWebSocketClient:()=>Z,getWSClient:()=>$}),Oe={"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`},ke=3e4,Ae=32,je=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=G(this.url)),K();return}let e=Te(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=ge(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=ve(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=C(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=Oe[e.type];if(t){let e=this.suppressedChatEchoes.get(t)??[];for(e.push(Date.now()+ke);e.length>Ae;)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())},je)}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}};be(X),O(X);var Z=X,Q=null;function $(e){return Q||=new Z(e),Q}export{Ce as a,H as c,Se as i,a as l,De as n,we as o,q as r,V as s,$ as t};
|
|
1
|
+
import{n as e}from"./rolldown-runtime-hePW80VL.js";import{za as t}from"./vendor-C_zEzV4N.js";import{n}from"./utils-tsZEnrBH.js";import{t as r}from"./session-store-CKdsROPD.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(`,`),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.rewind,sdd.spec.start,specs.get,specs.list,specs.taskStatus`.split(`,`),ee=`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(`,`),te=`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(`,`),ne=`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(`,`),re=[`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`],ie=`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(`,`),ae=`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(`,`),oe=`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(`,`),se=[`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`],ce=[`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`],le=`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(`,`),ue=[`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`],de=[...m,...h,...ee,...te,...v,...y,...g,..._],b=[...ne,...re,...le,...ue,...oe,...se,...ce,...ie,...ae],x=new Set(de),fe=new Set(b);function pe(e,t){return(t===`client`?x:fe).has(e)||e.startsWith(`kanban.`)&&e.length>7||e.startsWith(`agent-roster.`)&&e.length>13}var me=new Set([`__proto__`,`constructor`,`prototype`]),he=32;function S(e,t,n){if(n>he)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(me.has(r))return{code:`unsafe_key`,message:`Unsafe protocol key: ${r}`,path:i};let a=S(e[r],i,n+1);if(a)return a}return null}function C(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(!pe(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=S(n,`$`,0);return r?{ok:!1,issue:r}:{ok:!0,message:e}}function ge(e,t){try{return C(JSON.parse(e),t)}catch{return{ok:!1,issue:{code:`invalid_envelope`,message:`Protocol frame is not valid JSON`}}}}var _e=[`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 ve(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:_e.filter(e=>a.has(e))}}var ye={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 be(e){Object.assign(e.prototype,ye)}function w(e){return{type:`provider.clear_models`,payload:{providerId:e}}}function T(e,t){return{type:`provider.undo_clear`,payload:{providerId:e,previousModels:[...t]}}}function E(e){return{type:`provider.update`,payload:e}}var D={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(w(e))},undoProviderClear(e,t){this.send(T(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(E(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 O(e){Object.assign(e.prototype,D)}function k(e){return Math.max(0,Math.min(100,Math.round((typeof e==`number`&&Number.isFinite(e)?e:0)*100)))}function A(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 j=400,M=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 F=0;function I(){return`viz_${Date.now()}_${++F}`}var xe=250;function L(e,t){return t-e<xe}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??I(),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:A(t),label:t.label,status:P(t.kind),activity:1,color:t.color??z[A(t)],lastSeenAt:a},c=e.nodes.get(o),l=c?{...c,...s}:s,u=!R(c,l);c&&u&&L(c.lastSeenAt,a)&&R({...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:A(t,!0),label:p,status:P(t.kind),activity:.8,color:t.color??z[A(t,!0)],lastSeenAt:a},r=e.nodes.get(p);d=r?{...r,...n}:n,f=!R(r,d),r&&f&&L(r.lastSeenAt,a)&&R({...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??z[A(t)]??z.agent,lastActiveAt:a,totalMagnitude:(n?.totalMagnitude??0)+(t.magnitude??0)};m=n?{...n,...r}:r,h=!R(n,m),n&&h&&L(n.lastActiveAt,a)&&R({...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(_,j,e=>e.lastSeenAt)),v!==e.edges&&(v=N(v,M,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??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&&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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),kind:`agent:ctx`,timestamp:Date.now(),source:n,target:`session`,label:`ctx ${k(t.load)}%`,magnitude:t.tokens??0,data:t,color:z.agent,flowGroup:`agent:${n}`};case`iteration_summary`:return{id:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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:I(),kind:`agent:ctx`,timestamp:Date.now(),source:`leader`,target:`session`,label:`ctx ${k(t.load)}%`,magnitude:e,data:t,color:z.agent,flowGroup:`leader`}}case`error`:{let e=t.message??`Error`;return{id:I(),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:I(),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:I(),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:I(),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:I(),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:I(),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 Se(e){let t=e.payload?.sessionId,n=r.getState().session?.id;return t===``?!1:!t||!n||t===n}function Ce(e){let t=H(e.type,e.payload);t&&(V.getState().pushEvent(t),V.getState().setActive(!0))}function we(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 Te(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 Ee(){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=Ee();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 De=e({WrongStackWebSocketClient:()=>Z,getWSClient:()=>$}),Oe={"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`},ke=3e4,Ae=32,je=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=G(this.url)),K();return}let e=Te(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=ge(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=ve(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=C(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=Oe[e.type];if(t){let e=this.suppressedChatEchoes.get(t)??[];for(e.push(Date.now()+ke);e.length>Ae;)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())},je)}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}};be(X),O(X);var Z=X,Q=null;function $(e){return Q||=new Z(e),Q}export{Ce as a,H as c,Se as i,a as l,De as n,we as o,q as r,V as s,$ as t};
|
package/dist/index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
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-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-DQn-Lz9q.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
11
|
<link rel="modulepreload" crossorigin href="/assets/markdown-CIRD7kOg.js">
|
|
@@ -16,25 +16,25 @@
|
|
|
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
|
-
<link rel="modulepreload" crossorigin href="/assets/settings-
|
|
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-
|
|
23
|
-
<link rel="modulepreload" crossorigin href="/assets/session-store-
|
|
24
|
-
<link rel="modulepreload" crossorigin href="/assets/ws-client-
|
|
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
25
|
<link rel="modulepreload" crossorigin href="/assets/codemap-activity-store-BH7Mh4k9.js">
|
|
26
26
|
<link rel="modulepreload" crossorigin href="/assets/mailbox-store-bF96Ih2G.js">
|
|
27
27
|
<link rel="modulepreload" crossorigin href="/assets/ui-store-xx1NssJI.js">
|
|
28
|
-
<link rel="modulepreload" crossorigin href="/assets/stores-
|
|
28
|
+
<link rel="modulepreload" crossorigin href="/assets/stores-C0xX0jn4.js">
|
|
29
29
|
<link rel="modulepreload" crossorigin href="/assets/view-navigation-CZKugncK.js">
|
|
30
30
|
<link rel="modulepreload" crossorigin href="/assets/codemap-index-store-BFm1TzVW.js">
|
|
31
|
-
<link rel="modulepreload" crossorigin href="/assets/Toaster-
|
|
32
|
-
<link rel="modulepreload" crossorigin href="/assets/useWebSocket-
|
|
31
|
+
<link rel="modulepreload" crossorigin href="/assets/Toaster-BlD1m8P2.js">
|
|
32
|
+
<link rel="modulepreload" crossorigin href="/assets/useWebSocket-D9Dy4-9x.js">
|
|
33
33
|
<link rel="modulepreload" crossorigin href="/assets/dialog-BJjDUqb3.js">
|
|
34
34
|
<link rel="modulepreload" crossorigin href="/assets/button-DvpRpKkt.js">
|
|
35
35
|
<link rel="modulepreload" crossorigin href="/assets/input-BtoHcCl9.js">
|
|
36
|
-
<link rel="modulepreload" crossorigin href="/assets/ConfirmModal-
|
|
37
|
-
<link rel="modulepreload" crossorigin href="/assets/ModelPicker-
|
|
36
|
+
<link rel="modulepreload" crossorigin href="/assets/ConfirmModal-KzK0LoJw.js">
|
|
37
|
+
<link rel="modulepreload" crossorigin href="/assets/ModelPicker-nyXP3xsj.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
40
|
<link rel="stylesheet" crossorigin href="/assets/index-D2tx76V0.css">
|
package/dist/index.js
CHANGED
|
@@ -4616,7 +4616,8 @@ var require_settings = __commonJS({
|
|
|
4616
4616
|
autonomyDelayMsLabel: "Auto-proceed delay",
|
|
4617
4617
|
autonomyDelayMsHint: "Milliseconds before the agent auto-proceeds in Auto mode. 0 = immediate.",
|
|
4618
4618
|
refineCountdownLabel: "Refine countdown",
|
|
4619
|
-
refineCountdownHint: "Grace period before the refined prompt auto-sends (milliseconds)."
|
|
4619
|
+
refineCountdownHint: "Grace period before the refined prompt auto-sends (milliseconds).",
|
|
4620
|
+
reasoningEffortModelSet: "levels offered by the active model"
|
|
4620
4621
|
},
|
|
4621
4622
|
execution: {
|
|
4622
4623
|
heading: "Execution",
|
|
@@ -9511,7 +9512,8 @@ var require_settings2 = __commonJS({
|
|
|
9511
9512
|
autonomyDelayMsLabel: "Verz\xF6gerung der automatischen Fortsetzung",
|
|
9512
9513
|
autonomyDelayMsHint: "Millisekunden, bevor der Agent im Auto-Modus automatisch fortf\xE4hrt. 0 = sofort.",
|
|
9513
9514
|
refineCountdownLabel: "Verfeinerungs-Countdown",
|
|
9514
|
-
refineCountdownHint: "Gnadenfrist, bevor der verfeinerte Prompt automatisch gesendet wird (Millisekunden)."
|
|
9515
|
+
refineCountdownHint: "Gnadenfrist, bevor der verfeinerte Prompt automatisch gesendet wird (Millisekunden).",
|
|
9516
|
+
reasoningEffortModelSet: "Stufen des aktiven Modells"
|
|
9515
9517
|
},
|
|
9516
9518
|
execution: {
|
|
9517
9519
|
heading: "Ausf\xFChrung",
|
|
@@ -14406,7 +14408,8 @@ var require_settings3 = __commonJS({
|
|
|
14406
14408
|
autonomyDelayMsLabel: "Retraso de continuaci\xF3n autom\xE1tica",
|
|
14407
14409
|
autonomyDelayMsHint: "Milisegundos antes de que el agente contin\xFAe autom\xE1ticamente en modo Auto. 0 = inmediato.",
|
|
14408
14410
|
refineCountdownLabel: "Cuenta atr\xE1s de refinamiento",
|
|
14409
|
-
refineCountdownHint: "Per\xEDodo de gracia antes del env\xEDo autom\xE1tico del prompt refinado (milisegundos)."
|
|
14411
|
+
refineCountdownHint: "Per\xEDodo de gracia antes del env\xEDo autom\xE1tico del prompt refinado (milisegundos).",
|
|
14412
|
+
reasoningEffortModelSet: "niveles del modelo activo"
|
|
14410
14413
|
},
|
|
14411
14414
|
execution: {
|
|
14412
14415
|
heading: "Ejecuci\xF3n",
|
|
@@ -19302,7 +19305,8 @@ var require_settings4 = __commonJS({
|
|
|
19302
19305
|
autonomyDelayMsLabel: "D\xE9lai de reprise automatique",
|
|
19303
19306
|
autonomyDelayMsHint: "Millisecondes avant que l'agent reprenne automatiquement en mode Auto. 0 = imm\xE9diat.",
|
|
19304
19307
|
refineCountdownLabel: "Compte \xE0 rebours d'affinage",
|
|
19305
|
-
refineCountdownHint: "D\xE9lai de gr\xE2ce avant l'envoi automatique du prompt affin\xE9 (millisecondes)."
|
|
19308
|
+
refineCountdownHint: "D\xE9lai de gr\xE2ce avant l'envoi automatique du prompt affin\xE9 (millisecondes).",
|
|
19309
|
+
reasoningEffortModelSet: "niveaux du mod\xE8le actif"
|
|
19306
19310
|
},
|
|
19307
19311
|
execution: {
|
|
19308
19312
|
heading: "Ex\xE9cution",
|
|
@@ -24198,7 +24202,8 @@ var require_settings5 = __commonJS({
|
|
|
24198
24202
|
autonomyDelayMsLabel: "Ritardo di avanzamento automatico",
|
|
24199
24203
|
autonomyDelayMsHint: "Millisecondi prima che l'agente proceda automaticamente in modalit\xE0 Auto. 0 = immediato.",
|
|
24200
24204
|
refineCountdownLabel: "Conto alla rovescia affinamento",
|
|
24201
|
-
refineCountdownHint: "Periodo di grazia prima dell'invio automatico del prompt affinato (millisecondi)."
|
|
24205
|
+
refineCountdownHint: "Periodo di grazia prima dell'invio automatico del prompt affinato (millisecondi).",
|
|
24206
|
+
reasoningEffortModelSet: "livelli del modello attivo"
|
|
24202
24207
|
},
|
|
24203
24208
|
execution: {
|
|
24204
24209
|
heading: "Esecuzione",
|
|
@@ -29093,7 +29098,8 @@ var require_settings6 = __commonJS({
|
|
|
29093
29098
|
autonomyDelayMsLabel: "Atraso de continua\xE7\xE3o autom\xE1tica",
|
|
29094
29099
|
autonomyDelayMsHint: "Milissegundos antes de o agente continuar automaticamente no modo Auto. 0 = imediato.",
|
|
29095
29100
|
refineCountdownLabel: "Contagem regressiva de refinamento",
|
|
29096
|
-
refineCountdownHint: "Per\xEDodo de car\xEAncia antes do envio autom\xE1tico do prompt refinado (milissegundos)."
|
|
29101
|
+
refineCountdownHint: "Per\xEDodo de car\xEAncia antes do envio autom\xE1tico do prompt refinado (milissegundos).",
|
|
29102
|
+
reasoningEffortModelSet: "n\xEDveis do modelo ativo"
|
|
29097
29103
|
},
|
|
29098
29104
|
execution: {
|
|
29099
29105
|
heading: "Execu\xE7\xE3o",
|
|
@@ -33988,7 +33994,8 @@ var require_settings7 = __commonJS({
|
|
|
33988
33994
|
autonomyDelayMsLabel: "Otomatik devam gecikmesi",
|
|
33989
33995
|
autonomyDelayMsHint: "Auto modunda ajan\u0131n otomatik devam etmeden \xF6nce bekleme s\xFCresi (milisaniye). 0 = an\u0131nda.",
|
|
33990
33996
|
refineCountdownLabel: "\u0130yile\u015Ftirme geri say\u0131m\u0131",
|
|
33991
|
-
refineCountdownHint: "\u0130yile\u015Ftirilmi\u015F istemin otomatik g\xF6nderilmeden \xF6nceki bekleme s\xFCresi (milisaniye)."
|
|
33997
|
+
refineCountdownHint: "\u0130yile\u015Ftirilmi\u015F istemin otomatik g\xF6nderilmeden \xF6nceki bekleme s\xFCresi (milisaniye).",
|
|
33998
|
+
reasoningEffortModelSet: "aktif modelin destekledi\u011Fi seviyeler"
|
|
33992
33999
|
},
|
|
33993
34000
|
execution: {
|
|
33994
34001
|
heading: "Y\xFCr\xFCtme",
|
|
@@ -35384,7 +35391,13 @@ var init_session_store = __esm({
|
|
|
35384
35391
|
// Clear cache snapshot on provider/model switch — a stale
|
|
35385
35392
|
// reading from the previous provider can never apply to the
|
|
35386
35393
|
// new prompt cache. Same lifecycle as `contextLimitWarning`.
|
|
35387
|
-
|
|
35394
|
+
// `reasoningEffortLevels` follows: a new model's effort set is
|
|
35395
|
+
// unknown until the next session.start repopulates it.
|
|
35396
|
+
...sessionOrRouteChanged ? {
|
|
35397
|
+
contextLimitWarning: null,
|
|
35398
|
+
cacheStats: null,
|
|
35399
|
+
reasoningEffortLevels: void 0
|
|
35400
|
+
} : {}
|
|
35388
35401
|
};
|
|
35389
35402
|
}),
|
|
35390
35403
|
updateUsage: (usage) => set((state) => {
|
|
@@ -35412,7 +35425,8 @@ var init_session_store = __esm({
|
|
|
35412
35425
|
lastVisitedAt: Date.now(),
|
|
35413
35426
|
droppedTools: 0,
|
|
35414
35427
|
contextLimitWarning: null,
|
|
35415
|
-
cacheStats: null
|
|
35428
|
+
cacheStats: null,
|
|
35429
|
+
reasoningEffortLevels: void 0
|
|
35416
35430
|
}),
|
|
35417
35431
|
endSession: () => set({
|
|
35418
35432
|
session: null,
|
|
@@ -35420,7 +35434,8 @@ var init_session_store = __esm({
|
|
|
35420
35434
|
iteration: null,
|
|
35421
35435
|
droppedTools: 0,
|
|
35422
35436
|
contextLimitWarning: null,
|
|
35423
|
-
cacheStats: null
|
|
35437
|
+
cacheStats: null,
|
|
35438
|
+
reasoningEffortLevels: void 0
|
|
35424
35439
|
// Note: we intentionally do NOT clear lastVisitedAt here. The
|
|
35425
35440
|
// verifier view uses it to show "previous activity at …" even
|
|
35426
35441
|
// when the user explicitly ended a session.
|
|
@@ -35434,7 +35449,13 @@ var init_session_store = __esm({
|
|
|
35434
35449
|
contextMode: env.contextMode ?? state.contextMode,
|
|
35435
35450
|
inputCost: env.inputCost ?? state.inputCost,
|
|
35436
35451
|
outputCost: env.outputCost ?? state.outputCost,
|
|
35437
|
-
cacheReadCost: env.cacheReadCost ?? state.cacheReadCost
|
|
35452
|
+
cacheReadCost: env.cacheReadCost ?? state.cacheReadCost,
|
|
35453
|
+
// Key-presence, not `??`: the server OMITS the field when the new
|
|
35454
|
+
// model advertises no effort list, and a `??` fallback would keep
|
|
35455
|
+
// the previous model's list alive across the switch (the same
|
|
35456
|
+
// stale-leak pattern cacheStats guards against). Present-but-
|
|
35457
|
+
// undefined means "no list" and must overwrite.
|
|
35458
|
+
reasoningEffortLevels: "reasoningEffortLevels" in env ? env.reasoningEffortLevels : state.reasoningEffortLevels
|
|
35438
35459
|
})),
|
|
35439
35460
|
setIteration: (iteration) => set({ iteration }),
|
|
35440
35461
|
setContextUsage: (tokens, maxContext) => set((state) => ({
|
|
@@ -44049,7 +44070,10 @@ function handleSessionStart(msg) {
|
|
|
44049
44070
|
contextMode: payload.contextMode,
|
|
44050
44071
|
inputCost: payload.inputCost,
|
|
44051
44072
|
outputCost: payload.outputCost,
|
|
44052
|
-
cacheReadCost: payload.cacheReadCost
|
|
44073
|
+
cacheReadCost: payload.cacheReadCost,
|
|
44074
|
+
// Always pass the key (even undefined) so the store's key-presence
|
|
44075
|
+
// semantics replace a previous model's list on switch.
|
|
44076
|
+
reasoningEffortLevels: payload.reasoningEffortLevels
|
|
44053
44077
|
});
|
|
44054
44078
|
useConfigStore.getState().setConfig({ provider, model });
|
|
44055
44079
|
if (isReset) {
|
|
@@ -100551,10 +100575,19 @@ function useAutoSubmitStreak() {
|
|
|
100551
100575
|
}
|
|
100552
100576
|
}, [sessionId]);
|
|
100553
100577
|
useEffect45(() => {
|
|
100554
|
-
|
|
100578
|
+
const wasAuto = prevAutonomyRef.current === "auto";
|
|
100579
|
+
const isAuto = autonomy === "auto";
|
|
100580
|
+
if (!wasAuto && isAuto) {
|
|
100555
100581
|
_capWarned = false;
|
|
100556
100582
|
capWarnedRef.current = false;
|
|
100557
100583
|
}
|
|
100584
|
+
if (wasAuto && !isAuto) {
|
|
100585
|
+
_streak = 0;
|
|
100586
|
+
streakRef.current = 0;
|
|
100587
|
+
_loopHalted = false;
|
|
100588
|
+
_loopGuard.reset();
|
|
100589
|
+
_continuationTracker.reset();
|
|
100590
|
+
}
|
|
100558
100591
|
prevAutonomyRef.current = autonomy;
|
|
100559
100592
|
}, [autonomy]);
|
|
100560
100593
|
const canAutoSubmit = useCallback18(() => {
|
|
@@ -101131,17 +101164,28 @@ function NextStepsBar({
|
|
|
101131
101164
|
document.addEventListener("chat:next-step-countdown", handler);
|
|
101132
101165
|
return () => document.removeEventListener("chat:next-step-countdown", handler);
|
|
101133
101166
|
}, [steps.length, autoFillActive, isLatest, sessionEndAutoFill]);
|
|
101167
|
+
const prevGateRef = useRef17(yoloMode && autoMode && canAutoSubmitProp);
|
|
101168
|
+
useEffect47(() => {
|
|
101169
|
+
const gateOpen2 = yoloMode && autoMode && canAutoSubmitProp;
|
|
101170
|
+
const wasOpen = prevGateRef.current;
|
|
101171
|
+
prevGateRef.current = gateOpen2;
|
|
101172
|
+
if (!autoFillActive) return;
|
|
101173
|
+
if (wasOpen && !gateOpen2) {
|
|
101174
|
+
setAutoFillActive(false);
|
|
101175
|
+
}
|
|
101176
|
+
}, [autoFillActive, yoloMode, autoMode, canAutoSubmitProp]);
|
|
101177
|
+
const gateOpen = yoloMode && autoMode && canAutoSubmitProp;
|
|
101134
101178
|
const handleAutoFill = useCallback19(() => {
|
|
101135
101179
|
if (steps.length > 0) {
|
|
101136
101180
|
const step = steps[0];
|
|
101137
|
-
if (step.auto && onAutoSubmit) {
|
|
101181
|
+
if (step.auto && onAutoSubmit && gateOpen) {
|
|
101138
101182
|
onAutoSubmit(step.text);
|
|
101139
101183
|
} else {
|
|
101140
101184
|
fillInput(step.text);
|
|
101141
101185
|
}
|
|
101142
101186
|
}
|
|
101143
101187
|
setAutoFillActive(false);
|
|
101144
|
-
}, [steps, onAutoSubmit]);
|
|
101188
|
+
}, [steps, onAutoSubmit, gateOpen]);
|
|
101145
101189
|
const stepsKey = steps.map((s) => `${s.index}:${s.text}`).join("|");
|
|
101146
101190
|
useEffect47(() => {
|
|
101147
101191
|
setSelectedIndices(/* @__PURE__ */ new Set());
|
|
@@ -109092,6 +109136,7 @@ import { useShallow as useShallow12 } from "zustand/react/shallow";
|
|
|
109092
109136
|
// src/components/SettingsPanel/AgentSettingsTab.tsx
|
|
109093
109137
|
init_i18n();
|
|
109094
109138
|
init_local_prefs();
|
|
109139
|
+
init_session_store();
|
|
109095
109140
|
import { Activity as Activity8, Cpu as Cpu10, Zap as Zap15 } from "lucide-react";
|
|
109096
109141
|
import { useState as useState65 } from "react";
|
|
109097
109142
|
|
|
@@ -109501,6 +109546,19 @@ function PreferenceToggle({
|
|
|
109501
109546
|
|
|
109502
109547
|
// src/components/SettingsPanel/AgentSettingsTab.tsx
|
|
109503
109548
|
import { jsx as jsx111, jsxs as jsxs105 } from "react/jsx-runtime";
|
|
109549
|
+
var ALL_EFFORTS = [
|
|
109550
|
+
"none",
|
|
109551
|
+
"minimal",
|
|
109552
|
+
"low",
|
|
109553
|
+
"medium",
|
|
109554
|
+
"high",
|
|
109555
|
+
"xhigh",
|
|
109556
|
+
"max"
|
|
109557
|
+
];
|
|
109558
|
+
var EFFORT_SET = new Set(ALL_EFFORTS);
|
|
109559
|
+
function isEffort(value) {
|
|
109560
|
+
return EFFORT_SET.has(value);
|
|
109561
|
+
}
|
|
109504
109562
|
function AgentSettingsTab({
|
|
109505
109563
|
syncPref,
|
|
109506
109564
|
switchAutonomy
|
|
@@ -109508,6 +109566,23 @@ function AgentSettingsTab({
|
|
|
109508
109566
|
const { t } = useTranslation();
|
|
109509
109567
|
const localPrefs = useLocalPrefs();
|
|
109510
109568
|
const [refinerPickerOpen, setRefinerPickerOpen] = useState65(false);
|
|
109569
|
+
const EFFORT_LABEL_KEYS = {
|
|
109570
|
+
none: "settings:agent.reasoningEffortNone",
|
|
109571
|
+
minimal: "settings:agent.reasoningEffortMinimal",
|
|
109572
|
+
low: "settings:agent.reasoningEffortLow",
|
|
109573
|
+
medium: "settings:agent.reasoningEffortMedium",
|
|
109574
|
+
high: "settings:agent.reasoningEffortHigh",
|
|
109575
|
+
xhigh: "settings:agent.reasoningEffortXhigh",
|
|
109576
|
+
max: "settings:agent.reasoningEffortMax"
|
|
109577
|
+
};
|
|
109578
|
+
const effortLevels = useSessionStore((s) => s.reasoningEffortLevels);
|
|
109579
|
+
const narrowed = effortLevels?.length ? effortLevels.filter(isEffort) : [...ALL_EFFORTS];
|
|
109580
|
+
const current = localPrefs.reasoningEffort;
|
|
109581
|
+
if (isEffort(current) && !narrowed.includes(current)) narrowed.push(current);
|
|
109582
|
+
const effortOptions = narrowed.map((level) => ({
|
|
109583
|
+
value: level,
|
|
109584
|
+
label: t(EFFORT_LABEL_KEYS[level])
|
|
109585
|
+
}));
|
|
109511
109586
|
return /* @__PURE__ */ jsxs105("div", { className: "space-y-6", children: [
|
|
109512
109587
|
/* @__PURE__ */ jsxs105("div", { className: "rounded-xl border border-border/70 bg-card/80 p-5 shadow-sm", children: [
|
|
109513
109588
|
/* @__PURE__ */ jsxs105("div", { className: "flex items-start gap-3 mb-4", children: [
|
|
@@ -109700,23 +109775,9 @@ function AgentSettingsTab({
|
|
|
109700
109775
|
PreferenceSelect,
|
|
109701
109776
|
{
|
|
109702
109777
|
label: t("settings:agent.reasoningEffortLabel"),
|
|
109703
|
-
hint: t("settings:agent.reasoningEffortHint"),
|
|
109778
|
+
hint: effortLevels ? `${t("settings:agent.reasoningEffortHint")} (${t("settings:agent.reasoningEffortModelSet")})` : t("settings:agent.reasoningEffortHint"),
|
|
109704
109779
|
value: localPrefs.reasoningEffort,
|
|
109705
|
-
options:
|
|
109706
|
-
{ value: "none", label: t("settings:agent.reasoningEffortNone") },
|
|
109707
|
-
{
|
|
109708
|
-
value: "minimal",
|
|
109709
|
-
label: t("settings:agent.reasoningEffortMinimal")
|
|
109710
|
-
},
|
|
109711
|
-
{ value: "low", label: t("settings:agent.reasoningEffortLow") },
|
|
109712
|
-
{
|
|
109713
|
-
value: "medium",
|
|
109714
|
-
label: t("settings:agent.reasoningEffortMedium")
|
|
109715
|
-
},
|
|
109716
|
-
{ value: "high", label: t("settings:agent.reasoningEffortHigh") },
|
|
109717
|
-
{ value: "xhigh", label: t("settings:agent.reasoningEffortXhigh") },
|
|
109718
|
-
{ value: "max", label: t("settings:agent.reasoningEffortMax") }
|
|
109719
|
-
],
|
|
109780
|
+
options: effortOptions,
|
|
109720
109781
|
onChange: (v) => syncPref("reasoningEffort", v)
|
|
109721
109782
|
}
|
|
109722
109783
|
),
|
|
@@ -40,6 +40,12 @@ interface SessionState {
|
|
|
40
40
|
inputCost: number;
|
|
41
41
|
outputCost: number;
|
|
42
42
|
cacheReadCost: number;
|
|
43
|
+
/** Effort levels the ACTIVE model advertises (session.start payload).
|
|
44
|
+
* Undefined when the model has no explicit list — the settings effort
|
|
45
|
+
* dropdown then shows the full canonical set. Same lifecycle as
|
|
46
|
+
* `cacheStats`: refreshed on every session.start (which fires on model
|
|
47
|
+
* switch), so a stale list from the previous model never leaks. */
|
|
48
|
+
reasoningEffortLevels?: string[] | undefined;
|
|
43
49
|
/** basename(projectRoot) for the topbar. */
|
|
44
50
|
projectName: string;
|
|
45
51
|
/** Full project root path — used for richer tooltips / hover context. */
|
|
@@ -116,6 +122,7 @@ interface SessionState {
|
|
|
116
122
|
inputCost?: number | undefined;
|
|
117
123
|
outputCost?: number | undefined;
|
|
118
124
|
cacheReadCost?: number | undefined;
|
|
125
|
+
reasoningEffortLevels?: string[] | undefined;
|
|
119
126
|
}) => void;
|
|
120
127
|
setIteration: (it: {
|
|
121
128
|
index: number;
|
|
@@ -32,6 +32,10 @@ export interface WSSessionStart {
|
|
|
32
32
|
needsSetup?: boolean | undefined;
|
|
33
33
|
/** Feature negotiation prevents a newer WebUI from sending messages to an older backend. */
|
|
34
34
|
protocolCapabilities?: string[] | undefined;
|
|
35
|
+
/** Effort levels the ACTIVE model advertises (models.dev reasoningConfig).
|
|
36
|
+
* Absent when the model has no explicit effort list — the UI then shows
|
|
37
|
+
* the full canonical set, matching the resolver's conservative gate. */
|
|
38
|
+
reasoningEffortLevels?: string[] | undefined;
|
|
35
39
|
};
|
|
36
40
|
}
|
|
37
41
|
export interface WSSessionEnd {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wrongstack/webui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.309.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Browser-based WebUI for WrongStack — React + Vite frontend. The WebSocket backend lives in the separate @wrongstack/webui-server package (extracted in PR #018b to remove the CLI -> @wrongstack/webui/server cross-package edge).",
|
|
6
6
|
"keywords": [
|
|
@@ -76,12 +76,12 @@
|
|
|
76
76
|
"tailwind-merge": "^3.6.0",
|
|
77
77
|
"virtua": "^0.50.1",
|
|
78
78
|
"zustand": "^5.0.15",
|
|
79
|
-
"@wrongstack/core": "0.
|
|
80
|
-
"@wrongstack/providers": "0.
|
|
81
|
-
"@wrongstack/plugins": "0.
|
|
82
|
-
"@wrongstack/tools": "0.
|
|
83
|
-
"@wrongstack/kanban": "0.
|
|
84
|
-
"@wrongstack/webui-server": "0.
|
|
79
|
+
"@wrongstack/core": "0.309.0",
|
|
80
|
+
"@wrongstack/providers": "0.309.0",
|
|
81
|
+
"@wrongstack/plugins": "0.309.0",
|
|
82
|
+
"@wrongstack/tools": "0.309.0",
|
|
83
|
+
"@wrongstack/kanban": "0.309.0",
|
|
84
|
+
"@wrongstack/webui-server": "0.309.0"
|
|
85
85
|
},
|
|
86
86
|
"optionalDependencies": {
|
|
87
87
|
"node-pty": "1.2.0-beta.14"
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
"typescript": "^7.0.2",
|
|
104
104
|
"vite": "^8.2.1",
|
|
105
105
|
"vitest": "^4.1.10",
|
|
106
|
-
"@wrongstack/sdd": "0.
|
|
106
|
+
"@wrongstack/sdd": "0.309.0"
|
|
107
107
|
},
|
|
108
108
|
"scripts": {
|
|
109
109
|
"dev": "vite",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Ra as e,za as t}from"./vendor-C_zEzV4N.js";var n=1,r=t()(e(e=>({session:null,totalTokens:{input:0,output:0,cacheRead:0,cacheWrite:0},lastInputTokens:0,cost:0,startTime:null,maxContext:0,contextLimitWarning:null,cacheStats:null,inputCost:0,outputCost:0,cacheReadCost:0,projectName:``,projectRoot:``,cwd:``,mode:`default`,modes:[],contextMode:`balanced`,contextModes:[],iteration:null,todos:[],lastVisitedAt:0,appVersion:``,latestVersion:``,updateAvailable:!1,droppedTools:0,setSession:t=>e(e=>{let n=e.session?.id!==t?.id||e.session?.provider!==t?.provider||e.session?.model!==t?.model;return{session:t,lastVisitedAt:Date.now(),...n?{contextLimitWarning:null,cacheStats:null}:{}}}),updateUsage:t=>e(e=>{let n=t.input+(t.cacheRead??0)+(t.cacheWrite??0),r=t.cacheRead??0,i=t.cacheWrite??0;return{totalTokens:{input:e.totalTokens.input+t.input,output:e.totalTokens.output+t.output,cacheRead:(e.totalTokens.cacheRead??0)+r,cacheWrite:(e.totalTokens.cacheWrite??0)+i},lastInputTokens:n||e.lastInputTokens}}),addCost:t=>e(e=>({cost:e.cost+t})),startSession:t=>e({session:t,startTime:Date.now(),iteration:null,lastInputTokens:0,totalTokens:{input:0,output:0,cacheRead:0,cacheWrite:0},cost:0,lastVisitedAt:Date.now(),droppedTools:0,contextLimitWarning:null,cacheStats:null}),endSession:()=>e({session:null,startTime:null,iteration:null,droppedTools:0,contextLimitWarning:null,cacheStats:null}),setEnv:t=>e(e=>({maxContext:t.maxContext??e.maxContext,projectRoot:t.projectRoot??e.projectRoot,projectName:t.projectName??e.projectName,cwd:t.cwd??e.cwd,mode:t.mode??e.mode,contextMode:t.contextMode??e.contextMode,inputCost:t.inputCost??e.inputCost,outputCost:t.outputCost??e.outputCost,cacheReadCost:t.cacheReadCost??e.cacheReadCost})),setIteration:t=>e({iteration:t}),setContextUsage:(t,n)=>e(e=>({lastInputTokens:t,maxContext:n??e.maxContext})),setContextLimitWarning:t=>e({contextLimitWarning:t}),setCacheStats:t=>e({cacheStats:t}),setModes:t=>e({modes:t}),setContextModes:t=>e({contextModes:t}),setTodos:t=>e({todos:t}),setUpdateInfo:t=>e({appVersion:t.appVersion,latestVersion:t.latestVersion,updateAvailable:t.updateAvailable}),setDroppedTools:t=>e({droppedTools:t})}),{name:`wrongstack-session`,version:n,partialize:e=>({session:e.session,projectName:e.projectName,projectRoot:e.projectRoot,cwd:e.cwd,mode:e.mode,contextMode:e.contextMode,lastVisitedAt:e.lastVisitedAt,lastInputTokens:e.lastInputTokens}),migrate:(e,t)=>{if(t>n)return null;let r=e??{};return r.session!==null&&r.session!==void 0&&typeof r.session!=`object`?null:{session:r.session??null,projectName:typeof r.projectName==`string`?r.projectName:``,projectRoot:typeof r.projectRoot==`string`?r.projectRoot:``,cwd:typeof r.cwd==`string`?r.cwd:``,mode:typeof r.mode==`string`?r.mode:`default`,contextMode:typeof r.contextMode==`string`?r.contextMode:`balanced`,lastVisitedAt:typeof r.lastVisitedAt==`number`?r.lastVisitedAt:0}},onRehydrateStorage:()=>(e,t)=>{t||typeof window<`u`&&(window.__wrongstackSessionRehydrated=!0)}}));export{r as t};
|