@wrongstack/webui 0.298.3 → 0.300.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/AgentRosterView-wkALMOGD.js +9 -0
- package/dist/assets/{AnalyticsDashboard-irejsLMt.js → AnalyticsDashboard-CIN35A_u.js} +1 -1
- package/dist/assets/AudienceMemoryPanel-BAY2Bh8z.js +3 -0
- package/dist/assets/ChangesView-CVWSTGmX.js +1 -0
- package/dist/assets/ChronicleDashboard-Bg3W7C9U.js +1 -0
- package/dist/assets/CodeEditor-CWY_6cQD.js +1 -0
- package/dist/assets/CodeMap-CjmKO0lB.js +1 -0
- package/dist/assets/CronJobsPanel-BinzTWNs.js +1 -0
- package/dist/assets/DeadCodeScanPanel-C3CgaNVv.js +2 -0
- package/dist/assets/DebugDashboard-BqUghn06.js +1 -0
- package/dist/assets/DesignGalleryView-CuWWQAlD.js +1 -0
- package/dist/assets/GoalView-2weuLiPM.js +1 -0
- package/dist/assets/KanbanView-DXYRrshJ.js +3 -0
- package/dist/assets/{MailboxDetailView-Dh8ekyMw.js → MailboxDetailView-aaHx9Nma.js} +1 -1
- package/dist/assets/MemoryManager-BgcicCyg.js +1 -0
- package/dist/assets/{ModelPicker-BxYMTEEN.js → ModelPicker-B3BqjJnT.js} +1 -1
- package/dist/assets/OfficeMapPanel-Ck8NUOEs.js +4 -0
- package/dist/assets/OfficeMapPanel-CpexsBed.css +1 -0
- package/dist/assets/{ProcessMonitor-DVUCtVHZ.js → ProcessMonitor-CoMYZcdS.js} +1 -1
- package/dist/assets/{QueuePanel-n9lScdWu.js → QueuePanel-CA3CVCO_.js} +1 -1
- package/dist/assets/{RefreshDebugView-eZQ3wdxU.js → RefreshDebugView-cqBtyNna.js} +1 -1
- package/dist/assets/RequirementIntakeView-BBtUk8mC.js +1 -0
- package/dist/assets/SageTabs-Di49i4Yu.js +2 -0
- package/dist/assets/SddHub-D8iV6l9A.js +2 -0
- package/dist/assets/SessionInspectView-DHC_xTzG.js +1 -0
- package/dist/assets/SessionList-DH-ZsHmv.js +1 -0
- package/dist/assets/SessionsDashboard-Coi6htwg.js +1 -0
- package/dist/assets/SetupScreen-CD2Sx4n9.js +1 -0
- package/dist/assets/SkillDetailView-D7wSJWUX.js +3 -0
- package/dist/assets/SpecsView-BRWSI1iV.js +1 -0
- package/dist/assets/TechStackView-BOjkuJLe.js +1 -0
- package/dist/assets/{TerminalPanel-BgMsGfGa.js → TerminalPanel-Dg8WR5Un.js} +1 -1
- package/dist/assets/{Toaster-EXqX2jqp.js → Toaster-DSKFSuK3.js} +1 -1
- package/dist/assets/activity-BWbV0byu.js +9 -0
- package/dist/assets/activity-Bjb_mil3.js +9 -0
- package/dist/assets/activity-Bze6njDy.js +9 -0
- package/dist/assets/activity-Ciqcr7Ps.js +9 -0
- package/dist/assets/activity-DA9hmVZV.js +9 -0
- package/dist/assets/activity-GdnS66AB.js +9 -0
- package/dist/assets/activity-eawh_OWs.js +9 -0
- package/dist/assets/{button-DwmC7ENW.js → button-Dcy288Mc.js} +1 -1
- package/dist/assets/{chat-DzPxYALH.js → chat-4NEOESoU.js} +1 -1
- package/dist/assets/{chat-DLn1hY01.js → chat-BSg62iwX.js} +1 -1
- package/dist/assets/{chat-OunddzYy.js → chat-Bb1TpPfJ.js} +1 -1
- package/dist/assets/{chat-DxLD17ER.js → chat-COLKjtcx.js} +1 -1
- package/dist/assets/{chat-DSEq1Bdz.js → chat-CfRKV9iX.js} +1 -1
- package/dist/assets/{chat-CwnuX7tG.js → chat-EbeT4kiS.js} +1 -1
- package/dist/assets/{chat-store-LHzJqRCp.js → chat-store-CtOyUCdF.js} +2 -2
- package/dist/assets/{chat-CRmMDzCb.js → chat-ux_gymOJ.js} +1 -1
- package/dist/assets/{codemap-activity-store-B6n7KiS8.js → codemap-activity-store-DQfjo7-j.js} +1 -1
- package/dist/assets/codemap-index-store-COStDU-8.js +1 -0
- package/dist/assets/{common-DMM-xyW3.js → common-BXJbu5Y-.js} +1 -1
- package/dist/assets/{common-C9ikgX7d.js → common-BiNu_WzQ.js} +1 -1
- package/dist/assets/common-COVxQ0FV.js +1 -0
- package/dist/assets/{common-D29Zdkxb.js → common-Ch7JihXD.js} +1 -1
- package/dist/assets/{common-DoUBSHRY.js → common-DPaTeTls.js} +1 -1
- package/dist/assets/{common-vdwxzODB.js → common-DdGpRh8j.js} +1 -1
- package/dist/assets/{common-C5hY-d_0.js → common-pI6fYZW3.js} +1 -1
- package/dist/assets/{dialog-DsCmc6eL.js → dialog-ftgTihmF.js} +1 -1
- package/dist/assets/{empty-state-02bIS4x7.js → empty-state-RRSqQaCk.js} +1 -1
- package/dist/assets/i18n-C31PI0Up.js +2 -0
- package/dist/assets/index-5IWUhPO4.css +1 -0
- package/dist/assets/index-D1izXztg.js +132 -0
- package/dist/assets/{input-UhWgodVi.js → input-fo9-BPBC.js} +1 -1
- package/dist/assets/{mailbox-store-xh2Ux-Xs.js → mailbox-store-Bc9ER3Ph.js} +1 -1
- package/dist/assets/{progress-ring-C0O73ZjR.js → progress-ring-D_d6hn_4.js} +1 -1
- package/dist/assets/{roster-ws-DlQQL7Eh.js → roster-ws-D6dGRfC5.js} +1 -1
- package/dist/assets/{session-store-BE_S1f5v.js → session-store-b2KGFwkX.js} +1 -1
- package/dist/assets/settings-BKuhxUSF.js +1 -0
- package/dist/assets/settings-CeK0doV7.js +1 -0
- package/dist/assets/settings-DZ-H89lu.js +1 -0
- package/dist/assets/settings-DvrdpSdA.js +1 -0
- package/dist/assets/settings-SBUqq0ll.js +1 -0
- package/dist/assets/settings-W8t1ZrxM.js +1 -0
- package/dist/assets/settings-tOqZkk9R.js +1 -0
- package/dist/assets/{shared-bBntASiy.js → shared-KAzksK0C.js} +1 -1
- package/dist/assets/stores-OBoFiAKe.js +7 -0
- package/dist/assets/ui-store-CE4-TlwB.js +1 -0
- package/dist/assets/useWebSocket-DuLtH2jI.js +29 -0
- package/dist/assets/{utils-_s0GyctV.js → utils-B-9lSDIn.js} +1 -1
- package/dist/assets/{vendor-CxV3l5PQ.js → vendor-BuarzSSb.js} +30 -30
- package/dist/assets/{view-navigation-DLdE7qHU.js → view-navigation-DIDEcp4V.js} +1 -1
- package/dist/assets/ws-client-Bw1ixxwI.js +1 -0
- package/dist/components/AutonomyPicker.d.ts +1 -1
- package/dist/components/ChatView/auto-collapse.d.ts +42 -0
- package/dist/components/CouncilLogTimeline.d.ts +2 -0
- package/dist/components/FallbackModal.d.ts +2 -0
- package/dist/components/KanbanVerificationDashboard.d.ts +0 -6
- package/dist/components/QuickModelSwitcher.filter.d.ts +9 -4
- package/dist/components/RequirementIntakeView.d.ts +2 -0
- package/dist/components/SessionInspectView.d.ts +2 -0
- package/dist/components/SettingsPanel/ModelCatalogPicker.d.ts +1 -2
- package/dist/components/SettingsPanel/PluginToggleList.d.ts +11 -3
- package/dist/components/SettingsPanel/brain-section-options.d.ts +41 -55
- package/dist/components/TaskCard.d.ts +0 -1
- package/dist/components/TaskRiskPanel.d.ts +10 -3
- package/dist/components/TechStackView/shared.d.ts +11 -6
- package/dist/components/ThemeProvider.d.ts +6 -1
- package/dist/components/ViewRouter.d.ts +1 -1
- package/dist/components/agent-roster-data.d.ts +2 -1
- package/dist/hooks/useWebSocket.d.ts +1 -0
- package/dist/hooks/ws-handlers/files-mailbox-handlers.d.ts +1 -0
- package/dist/hooks/ws-handlers/misc-handlers.d.ts +13 -0
- package/dist/hooks/ws-handlers/session-handlers.d.ts +1 -0
- package/dist/index.css +30 -0
- package/dist/index.html +24 -24
- package/dist/index.js +26845 -11968
- package/dist/lib/file-icons.d.ts +3 -3
- package/dist/lib/palettes.d.ts +37 -0
- package/dist/lib/view-navigation.d.ts +2 -2
- package/dist/lib/ws-client-actions.d.ts +1 -0
- package/dist/lib/ws-client.d.ts +3 -3
- package/dist/providers.json +7 -7
- package/dist/stores/config-store.d.ts +9 -1
- package/dist/stores/context-editor-store.d.ts +9 -1
- package/dist/stores/council-log-store.d.ts +67 -0
- package/dist/stores/fallback-store.d.ts +30 -0
- package/dist/stores/fleet-store.d.ts +13 -0
- package/dist/stores/index.d.ts +5 -1
- package/dist/stores/local-prefs.d.ts +4 -0
- package/dist/stores/mailbox-store.d.ts +2 -0
- package/dist/stores/session-inspect-store.d.ts +51 -0
- package/dist/stores/ui-store.d.ts +19 -7
- package/dist/stores/viz-store.d.ts +1 -1
- package/dist/types/brain.d.ts +15 -0
- package/dist/types/client-message.d.ts +17 -1
- package/dist/types/protocol-core.d.ts +19 -0
- package/dist/types/runtime.d.ts +8 -0
- package/dist/types/server-message.d.ts +15 -4
- package/dist/types/system.d.ts +35 -0
- package/package.json +9 -9
- package/dist/assets/AgentRosterView-RvxaV08Y.js +0 -11
- package/dist/assets/AudienceMemoryPanel-DDW_WPjf.js +0 -3
- package/dist/assets/ChangesView-Bnd167hf.js +0 -1
- package/dist/assets/ChronicleDashboard-DC62FDEt.js +0 -1
- package/dist/assets/CodeEditor-DCWcCQPO.js +0 -1
- package/dist/assets/CodeMap-DSqqgBuD.js +0 -1
- package/dist/assets/CronJobsPanel-BXujnpGC.js +0 -1
- package/dist/assets/DeadCodeScanPanel-HTbGUTMl.js +0 -2
- package/dist/assets/DebugDashboard-B5kJBUv0.js +0 -1
- package/dist/assets/DesignGalleryView-BQ0CZpQm.js +0 -1
- package/dist/assets/GoalView-DvaSR6CO.js +0 -1
- package/dist/assets/KanbanView-DpWs_i8T.js +0 -3
- package/dist/assets/MemoryManager-CUAbNwsz.js +0 -1
- package/dist/assets/OfficeMapPanel-BFIF-EMt.css +0 -1
- package/dist/assets/OfficeMapPanel-HgERknuN.js +0 -4
- package/dist/assets/SageTabs-B-eQ--Sb.js +0 -2
- package/dist/assets/SddHub-D81poT6w.js +0 -2
- package/dist/assets/SessionsDashboard-CR3NZeHw.js +0 -1
- package/dist/assets/SetupScreen-t6wrhv6l.js +0 -1
- package/dist/assets/SkillDetailView-D6TOvMQU.js +0 -3
- package/dist/assets/SpecsView-BYiJr__T.js +0 -1
- package/dist/assets/TechStackView-HEMM3PkG.js +0 -1
- package/dist/assets/activity-BBPMHCAJ.js +0 -5
- package/dist/assets/activity-BJijwuIr.js +0 -5
- package/dist/assets/activity-DReNmuta.js +0 -5
- package/dist/assets/activity-DeEOo2zu.js +0 -5
- package/dist/assets/activity-Dyh19u3P.js +0 -5
- package/dist/assets/activity-GR8KiHvf.js +0 -5
- package/dist/assets/activity-iuGHFz2B.js +0 -5
- package/dist/assets/codemap-index-store-oapPwtvI.js +0 -1
- package/dist/assets/common-BfVFjVhf.js +0 -1
- package/dist/assets/i18n-DxnYsmc-.js +0 -2
- package/dist/assets/index-Bf75VrDE.js +0 -132
- package/dist/assets/index-NFp5CXyK.css +0 -1
- package/dist/assets/settings-B5xal2R3.js +0 -1
- package/dist/assets/settings-BHtFy8EG.js +0 -1
- package/dist/assets/settings-Bss5hBla.js +0 -1
- package/dist/assets/settings-BzrLCVRP.js +0 -1
- package/dist/assets/settings-C7RdvmLZ.js +0 -1
- package/dist/assets/settings-Dd94HoV6.js +0 -1
- package/dist/assets/settings-Dm9THFe8.js +0 -1
- package/dist/assets/stores-BS-Bdi-5.js +0 -7
- package/dist/assets/ui-store-C4Ybfoon.js +0 -1
- package/dist/assets/useWebSocket-x8PMoTq8.js +0 -28
- package/dist/assets/ws-client-Cy3oRAmZ.js +0 -1
- package/dist/lib/accent-colors.d.ts +0 -136
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./ui-store-
|
|
1
|
+
import{n as e}from"./ui-store-CE4-TlwB.js";var t={chat:`chat`,agents:`chat`,files:`files`,changes:`changes`,mailbox:`mailbox`,skills:`skill`,worktrees:`chat`,design:`design-gallery`,officemap:`officemap`},n={chat:`chat`,files:`files`,changes:`changes`,mailbox:`mailbox`,skill:`skills`,officemap:`officemap`,"design-gallery":`design`},r={1:`chat`,2:`files`,3:`changes`,4:`mailbox`,5:`skills`,6:`officemap`,0:`design`},i={chat:`Ctrl+1`,agents:``,files:`Ctrl+2`,changes:`Ctrl+3`,mailbox:`Ctrl+4`,skills:`Ctrl+5`,worktrees:`Ctrl+Shift+W`,design:`Ctrl+0`,officemap:`Ctrl+6`};function a(e){return t[e]??`chat`}function o(e){return i[e]??``}function s(t){let n=e.getState();n.currentView!==t&&n.setCurrentView(t)}function c(t){let n=e.getState();n.setSidebarOpen(!0),n.selectActivity(t),s(a(t))}function l(t){let n=e.getState();if(!n.sidebarOpen)n.setSidebarOpen(!0),n.selectActivity(t);else if(n.activeActivity===t){n.setSidebarOpen(!1);return}else n.activeActivity===`agents`&&n.setSidebarOpen(!0),n.selectActivity(t);s(a(t))}function u(t){let n=e.getState();if(n.currentView===t){c(`chat`);return}n.setSidebarOpen(!1),s(t)}function d(t){let r=n[t];if(r){c(r);return}e.getState().setSidebarOpen(!1),s(t)}export{o as a,l as i,d as n,c as o,u as r,r as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./rolldown-runtime-QTnfLwEv.js";import{Na as t}from"./vendor-BuarzSSb.js";import{n}from"./utils-B-9lSDIn.js";import{t as r}from"./session-store-b2KGFwkX.js";function i(e){typeof requestAnimationFrame==`function`?requestAnimationFrame(e):queueMicrotask(e)}var a=new class{pending=new Map;scheduled=!1;push(e,t,n){if(!t)return;let r=this.pending.get(e);r?(r.buffer+=t,r.flush=n):this.pending.set(e,{buffer:t,flush:n}),this.schedule()}schedule(){this.scheduled||(this.scheduled=!0,i(()=>{this.scheduled=!1,this.drain()}))}drain(){if(this.pending.size===0)return;let e=Array.from(this.pending.entries());this.pending.clear();for(let[t,n]of e)n.buffer&&n.flush(t,n.buffer)}drop(e){this.pending.delete(e)}dropAll(){this.pending.clear()}flush(e){let t=this.pending.get(e);t&&(this.pending.delete(e),t.buffer&&t.flush(e,t.buffer))}flushAll(){this.drain()}},o={maxReconnectAttempts:10,initialBackoffMs:1e3,maxBackoffMs:3e4,backoffMultiplier:2,jitterRatio:0,queueLimit:1e3,heartbeatIntervalMs:0,heartbeatTimeoutMs:0};function s(){return{phase:`idle`,reconnectAttempt:0,lastActivityAt:null,stopped:!1}}function c(e){return e.stopped?e:{...e,phase:`connecting`}}function l(e,t=Date.now()){return{...e,phase:`open`,reconnectAttempt:0,lastActivityAt:t,stopped:!1}}function u(e,t=Date.now()){return{...e,lastActivityAt:t}}function d(e){return{...e,phase:`closed`,stopped:!0}}function f(e){return{...e,phase:`idle`,reconnectAttempt:0,stopped:!1}}function p(e,t,n=Date.now(),r=Math.random){if(e.stopped||e.reconnectAttempt>=t.maxReconnectAttempts)return{state:{...e,phase:`closed`},plan:null};let i=e.reconnectAttempt+1,a=Math.min(t.initialBackoffMs*t.backoffMultiplier**(i-1),t.maxBackoffMs),o=(r()*2-1)*t.jitterRatio,s=Math.max(0,Math.round(a*(1+o)));return{state:{...e,phase:`reconnecting`,reconnectAttempt:i},plan:{attempt:i,delayMs:s,retryAt:n+s}}}var m=`abort,ping,user_message,tool.confirm_result,completion.request,model.switch,model.refine,model.fallback_choice,autonomy.switch,context.clear,context.compact,context.debug,context.editor.open,context.editor.validate,context.editor.apply,context.mode.create,context.mode.delete,context.mode.switch,context.mode.update,context.modes.list,context.repair,mode.switch,modes.list,session.checkpoints,session.delete,session.inspect,session.new,session.rename,session.resume,session.rewind,session.save,sessions.list,side_effects.list,stats.get,todo.update,todos.clear,todos.get,todos.remove`.split(`,`),h=[`collab.join`,`collab.leave`,`collab.annotate`,`collab.resolve`,`collab.request_pause`,`collab.resume`,`collab.grant_control`,`collab.inject_tool`,`mailbox.action`,`mailbox.agents`,`mailbox.clear`,`mailbox.compact`,`mailbox.messages`,`mailbox.purge`,`mailbox.send`],g=`brain.ask,brain.config.get,brain.config.set,brain.risk,brain.status,chronicle.facet,chronicle.facets,chronicle.graph,chronicle.metrics,chronicle.query,chronicle.status,config.doctor,design.list,design.materialize,design.set,design.state,design.swap,design.tune,design.use,design.verify,memory.list,memory.sage.backfillRecoverable,memory.sage.candidateResolve,memory.sage.delete,memory.sage.forFile,memory.sage.get,memory.sage.graph,memory.sage.list,memory.sage.listPage,memory.sage.recover,memory.sage.remember,memory.sage.update`.split(`,`),_=`auth.oauth.cancel,auth.oauth.code,auth.oauth.start,mcp.add,mcp.disable,mcp.discover,mcp.enable,mcp.list,mcp.prompt.get,mcp.prompts,mcp.remove,mcp.resource.read,mcp.resources,mcp.restart,mcp.sleep,mcp.update,mcp.wake,prompts.content,prompts.create,prompts.favorite,prompts.list,prompts.recent,prompts.search,prompts.used,skills.content,skills.create,skills.edit,skills.export,skills.install,skills.list,skills.uninstall,skills.update`.split(`,`),v=`goal-state.get,goal.addTask,goal.assess,goal.assignTask,goal.clear,goal.get,goal.list,goal.load,goal.moveTask,goal.pause,goal.resume,goal.retryTask,goal.revert,goal.runTask,goal.save,goal.selectPhase,goal.start,goal.state,goal.status,goal.stop,goal.taskStatus,goal.toggleAutonomous,plan.get,plan.item.update,plan.template_use,task.update,tasks.get`.split(`,`),y=`sdd.board.cancel_task,sdd.board.cleanup_worktrees,sdd.board.delete_task,sdd.board.destroy,sdd.board.get,sdd.board.list,sdd.board.pause,sdd.board.reassign,sdd.board.resume,sdd.board.retry,sdd.board.retry_all_failed,sdd.board.rollback,sdd.board.set_task_fallbacks,sdd.board.set_task_model,sdd.board.set_task_verification,sdd.board.split_task,sdd.board.stop,sdd.run.from_graph,sdd.run.from_spec,sdd.run.start,sdd.spec.approve,sdd.spec.discard,sdd.spec.get,sdd.spec.message,sdd.spec.start,specs.get,specs.list,specs.taskStatus`.split(`,`),b=[`files.list`,`files.read`,`files.tree`,`files.write`,`git.changes`,`git.diff`,`git.info`,`projects.add`,`projects.list`,`projects.select`,`working_dir.set`,`worktree.cleanup`,`worktree.diff`,`worktree.merge`,`worktree.remove`,`worktree.scan`,`shell.open`,`process.kill`,`process.killAll`,`process.list`,`terminal.close`,`terminal.create`,`terminal.input`,`terminal.resize`],x=`codebase.index.server.shutdown,connections.health,connections.service_action,diag.get,key.add,key.delete,key.set_active,key.update,prefs.get,prefs.update,provider.add,provider.clear_models,provider.custom_models.remove,provider.custom_models.set,provider.models,provider.models.search,provider.probe,provider.remove,provider.status.clear,provider.status.get,provider.status.retry,provider.undo_clear,provider.update,providers.list,providers.saved,tool.disable,tool.enable,tools.list,webui.shutdown`.split(`,`),S=`error,log,pong,side_effects,agent.status_changed,agent.timeline.message,client.status_update,chimera.report_available,compaction.failed,completion.result,context.compacted,context.debug,context.editor.snapshot,context.editor.validation,context.editor.applied,context.mode.changed,context.modes.list,context.repaired,ctx.max_context,ctx.pct,delegate.completed,delegate.started,iteration.completed,iteration.limit_reached,iteration.started,model.refine_result,modes.list,provider.active_blocked,provider.error,provider.fallback,provider.fallback_pending,provider.response,provider.retry,provider.status_changed,provider.stream_error,provider.text_delta,provider.thinking_delta,run.result,session.checkpoints,session.damaged,session.end,session.inspect,session.rewound,session.start,session.stats,sessions.list,sessions.status_update,stats.get,token.cost_estimate_unavailable,token.threshold,tool.confirm_needed,tool.disabled,tool.enabled,tool.executed,tool.loop_detected,tool.progress,tool.started,tools.list,trust.persisted`.split(`,`),ee=[`collab.annotation.added`,`collab.annotation.resolved`,`collab.event`,`collab.injection.granted`,`collab.participant.joined`,`collab.participant.left`,`collab.pause.granted`,`collab.pause.released`,`collab.state`,`mailbox.action_result`,`mailbox.agent_registered`,`mailbox.agent_deregistered`,`mailbox.agents`,`mailbox.cleared`,`mailbox.compacted`,`mailbox.event`,`mailbox.messages`,`mailbox.sent`,`mailbox.purged`,`mailbox.received`,`subagent.budget_extended`,`subagent.event`],te=`brain.answer,brain.config,brain.event,brain.status,chronicle.error,chronicle.facet_result,chronicle.facets_result,chronicle.graph_result,chronicle.metrics_result,chronicle.query_result,chronicle.status_result,config.doctor.result,design.list,design.materialize,design.set,design.state,design.swap,design.tune,design.use,design.verify,memory.event,memory.list,memory.sage.backfillRecoverable,memory.sage.candidateResolve,memory.sage.delete,memory.sage.forFile,memory.sage.get,memory.sage.graph,memory.sage.list,memory.sage.listPage,memory.sage.recover,memory.sage.remember,memory.sage.update`.split(`,`),ne=`mcp.content.error,mcp.content.selected,mcp.list,mcp.operation_result,mcp.prompts,mcp.resources,mcp.server.added,mcp.server.connected,mcp.server.disconnected,mcp.server.discovered,mcp.server.error,mcp.server.reconnected,mcp.server.removed,mcp.server.sleeping,mcp.server.updated,mcp.server.waking,prompts.content,prompts.created,prompts.favorite,prompts.list,prompts.recent,prompts.search,prompts.used,skills.content,skills.created,skills.edited,skills.exported,skills.installed,skills.list,skills.uninstalled,skills.updated`.split(`,`),C=`budget.decision,budget.threshold_reached,coordinator.stats,coordinator.status,eternal.iteration,fleet.concurrency_update,goal-state.updated,goal.assess.result,goal.list,goal.paused,goal.resumed,goal.saved,goal.error,goal.stopped,goal.failed,goal.completed,goal.cleared,goal.reverted,goal.progress,goal.state,in_flight.ended,in_flight.started,plan.updated,task.completed,task.failed,task.pending,task.started,tasks.updated,todos.cleared,todos.updated`.split(`,`),re=[`kanban.task.activity`,`sdd.board.lifecycle_result`,`sdd.board.list`,`sdd.board.snapshot`,`sdd.run.started`,`sdd.spec.agent_text`,`sdd.spec.error`,`sdd.spec.snapshot`,`specs.detail`,`specs.list`],ie=[`consensus.vote_cast`,`consensus.vote_initiated`,`consensus.vote_resolved`,`cron.job_fired`,`cron.snapshot`,`techstack.job.cancelled`,`techstack.job.failed`,`techstack.job.progress`,`techstack.job.started`,`techstack.report.delivered`,`techstack.report.ready`,`techstack.snapshot.updated`,`techstack.workspace.completed`],ae=`checkpoint.written,codemap.file_event,codemap.index_updated,codemap.tool_executed,codemap.tool_started,file.saved,files.list,files.read,files.tree,files.written,git.changes,git.diff,git.info,process.list,projects.added,projects.list,projects.selected,terminal.exit,terminal.output,working_dir.changed,worktree.cleanup_result,worktree.diff_result,worktree.event,worktree.merge_result,worktree.orphans,worktree.state`.split(`,`),w=[`auth.oauth.status`,`codebase.index.server.shutdown_result`,`connections.health_error`,`connections.health_result`,`connections.service_action_result`,`diag.get`,`key.operation_result`,`model.switch_result`,`prefs.updated`,`provider.catalog`,`provider.models`,`provider.models.search_result`,`provider.probe`,`provider.status.snapshot`,`providers.saved`],oe=[...m,...h,...b,...x,...v,...y,...g,..._],T=[...S,...ee,...ae,...w,...C,...re,...ie,...te,...ne],se=new Set(oe),ce=new Set(T);function le(e,t){return(t===`client`?se:ce).has(e)||e.startsWith(`kanban.`)&&e.length>7||e.startsWith(`agent-roster.`)&&e.length>13}var ue=new Set([`__proto__`,`constructor`,`prototype`]),de=32;function E(e,t,n){if(n>de)return{code:`too_deep`,message:`Protocol payload exceeds the nesting limit`,path:t};if(typeof e!=`object`||!e)return null;for(let r of Object.keys(e)){let i=`${t}.${r}`;if(ue.has(r))return{code:`unsafe_key`,message:`Unsafe protocol key: ${r}`,path:i};let a=E(e[r],i,n+1);if(a)return a}return null}function D(e,t){if(typeof e!=`object`||!e||Array.isArray(e))return{ok:!1,issue:{code:`invalid_envelope`,message:`Protocol message must be an object`}};let n=e;if(typeof n.type!=`string`||n.type.length===0)return{ok:!1,issue:{code:`invalid_type`,message:`Protocol message type must be a non-empty string`}};if(!le(n.type,t))return{ok:!1,issue:{code:`unknown_type`,message:`Unknown ${t} message: ${n.type}`}};if(t===`server`&&!Object.hasOwn(n,`payload`))return{ok:!1,issue:{code:`invalid_envelope`,message:`Server protocol messages require a payload`}};let r=E(n,`$`,0);return r?{ok:!1,issue:r}:{ok:!0,message:e}}function fe(e,t){try{return D(JSON.parse(e),t)}catch{return{ok:!1,issue:{code:`invalid_envelope`,message:`Protocol frame is not valid JSON`}}}}var pe=[`protocol.directional-decoder`,`protocol.recursive-key-safety`,`chronicle.query`,`chronicle.facet`,`chronicle.facets`,`chronicle.graph`,`chronicle.metrics`,`chronicle.status`,`connections.health`,`sdd.interview.continuity`,`sdd.run.from_graph`];function me(e){let t=e.protocolVersion,n=t===void 0,r=n?1:Math.min(t,1),i=n||Number.isInteger(t)&&t>=1,a=new Set(e.protocolCapabilities??[]);return{compatible:i,legacyPeer:n,version:r,capabilities:pe.filter(e=>a.has(e))}}var O={listTools(e){this.send({type:`tools.list`},e)},listMemory(e){this.send({type:`memory.list`},e)},listSageMemories(e){this.send({type:`memory.sage.list`},e)},listSageMemoriesPage(e,t){this.send({type:`memory.sage.listPage`,payload:{...e}},t)},getSage(e,t){this.send({type:`memory.sage.get`,payload:{id:e}},t)},getSageGraph(e,t,n){this.send({type:`memory.sage.graph`,payload:{query:e,...t}},n)},updateSage(e,t,n){this.send({type:`memory.sage.update`,payload:{id:e,...t}},n)},deleteSage(e,t){this.send({type:`memory.sage.delete`,payload:{id:e,force:!0,...t===void 0?{}:{reason:t}}})},rememberSage(e,t){this.send({type:`memory.sage.remember`,payload:e},t)},findMemoriesForFile(e,t){this.send({type:`memory.sage.forFile`,payload:e},t)},recoverSage(e,t){this.send({type:`memory.sage.recover`,payload:e},t)},resolveMemoryCandidate(e,t){this.send({type:`memory.sage.candidateResolve`,payload:e},t)},backfillRecoverable(e,t){this.send({type:`memory.sage.backfillRecoverable`,payload:e},t)},listMcpServers(){this.send({type:`mcp.list`})},addMcpServer(e){this.send({type:`mcp.add`,payload:e})},removeMcpServer(e){this.send({type:`mcp.remove`,payload:{name:e}})},updateMcpServer(e){this.send({type:`mcp.update`,payload:e})},wakeMcpServer(e){this.send({type:`mcp.wake`,payload:{name:e}})},sleepMcpServer(e){this.send({type:`mcp.sleep`,payload:{name:e}})},discoverMcpServer(e){this.send({type:`mcp.discover`,payload:{name:e}})},listMcpResources(e,t=!1){this.send({type:`mcp.resources`,payload:{name:e,refresh:t}})},listMcpPrompts(e,t=!1){this.send({type:`mcp.prompts`,payload:{name:e,refresh:t}})},readMcpResource(e,t){this.send({type:`mcp.resource.read`,payload:{name:e,uri:t}})},getMcpPrompt(e,t,n){this.send({type:`mcp.prompt.get`,payload:{name:e,prompt:t,...n===void 0?{}:{arguments:n}}})},enableMcpServer(e){this.send({type:`mcp.enable`,payload:{name:e}})},disableMcpServer(e){this.send({type:`mcp.disable`,payload:{name:e}})},restartMcpServer(e){this.send({type:`mcp.restart`,payload:{name:e}})},listSkills(e){this.send({type:`skills.list`},e)},getSkillContent(e,t){this.send({type:`skills.content`,payload:{name:e,source:t}})},installSkill(e,t){this.send({type:`skills.install`,payload:{ref:e,global:t}})},uninstallSkill(e,t){this.send({type:`skills.uninstall`,payload:{name:e,global:t}})},checkForUpdates(e,t){this.send({type:`skills.update`,payload:{name:e,global:t}})},createSkill(e,t,n){this.send({type:`skills.create`,payload:{name:e,description:t,scope:n}})},editSkill(e,t){this.send({type:`skills.edit`,payload:{name:e,body:t}})},exportAllSkills(){this.send({type:`skills.export`})},getDiag(e){this.send({type:`diag.get`,payload:this.withSession({})},e)},getStats(e){this.send({type:`stats.get`,payload:this.withSession({})},e)},saveSession(){this.send({type:`session.save`,payload:this.withSession({})})},resumeSessionById(e){this.send({type:`session.resume`,payload:this.withSession({id:e})})},listModes(){this.send({type:`modes.list`})},switchMode(e){this.send({type:`mode.switch`,payload:{id:e}})},listFiles(e,t,n){this.send({type:`files.list`,payload:{query:e,limit:t,path:n}})},requestCompletion(e){this.send({type:`completion.request`,payload:e})},getTodos(){this.send({type:`todos.get`,payload:this.withSession({})})},clearTodos(){this.send({type:`todos.clear`,payload:this.withSession({})})},removeTodo(e){let t=typeof e==`number`?{index:e}:{id:e};this.send({type:`todos.remove`,payload:this.withSession(t)})},updateTodoStatus(e,t){this.send({type:`todo.update`,payload:this.withSession({id:e,status:t})})},getTasks(){this.send({type:`tasks.get`,payload:this.withSession({})})},updateTaskStatus(e,t){this.send({type:`task.update`,payload:this.withSession({id:e,status:t})})},getPlan(){this.send({type:`plan.get`,payload:this.withSession({})})},updatePlanItem(e,t){this.send({type:`plan.item.update`,payload:this.withSession({target:e,status:t})})},listSessions(e=50){this.send({type:`sessions.list`,payload:this.withSession({limit:e})})},deleteSession(e){this.send({type:`session.delete`,payload:{id:e}})},renameSession(e,t){this.send({type:`session.rename`,payload:{id:e,name:t}})},inspectSession(e){this.send({type:`session.inspect`,payload:{id:e}})},setWorkingDir(e){this.send({type:`working_dir.set`,payload:{path:e}})},resumeSession(e){this.send({type:`session.resume`,payload:this.withSession({id:e})})},ping(){this.send({type:`ping`})},refineModel(e,t){this.send({type:`model.refine`,payload:{text:e,...t?.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs},...t?.provider===void 0?{}:{provider:t.provider},...t?.model===void 0?{}:{model:t.model},...t?.previousRefined===void 0?{}:{previousRefined:t.previousRefined},...t?.previousEnglish===void 0?{}:{previousEnglish:t.previousEnglish},...t?.retryFeedback===void 0?{}:{retryFeedback:t.retryFeedback}}})}};function k(e){Object.assign(e.prototype,O)}function A(e){return{type:`provider.clear_models`,payload:{providerId:e}}}function j(e,t){return{type:`provider.undo_clear`,payload:{providerId:e,previousModels:[...t]}}}function M(e){return{type:`provider.update`,payload:e}}function N(e){return Math.max(0,Math.min(100,Math.round((typeof e==`number`&&Number.isFinite(e)?e:0)*100)))}function P(e,t=!1){if(t&&e.target){if(e.kind===`agent:tool`||e.kind===`tool:executed`||e.kind===`tool:started`)return`tool`;if(e.source===`leader`||e.source===`coordinator`)return`coordinator`;if(e.kind.startsWith(`provider:`))return`provider`;if(e.kind.startsWith(`mailbox:`))return`mailbox`}switch(e.kind){case`provider:call`:case`provider:delta`:case`provider:response`:return`provider`;case`agent:spawned`:case`agent:tool`:case`agent:status`:case`agent:text`:case`agent:ctx`:case`budget:warning`:case`budget:extended`:return`agent`;case`tool:started`:case`tool:executed`:case`tool:progress`:return`tool`;case`mailbox:send`:case`mailbox:deliver`:return`mailbox`;case`collab:event`:return`system`;case`session:start`:case`session:end`:case`iteration:start`:case`iteration:end`:case`eternal:iteration`:case`fleet:snapshot`:return`session`;case`context:compacted`:case`context:repaired`:case`cost:update`:return`system`;case`error`:return`error`;default:return`system`}}function F(e){switch(e){case`provider:call`:case`provider:delta`:case`agent:tool`:case`tool:started`:case`tool:progress`:case`iteration:start`:case`agent:text`:return`streaming`;case`agent:status`:case`iteration:end`:return`completed`;case`error`:return`error`;case`tool:executed`:return`completed`;case`session:end`:return`idle`;default:return`active`}}var I=0;function L(){return`viz_${Date.now()}_${++I}`}function R(e,t){if(e===t)return!0;if(!e||!t)return!1;let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let r of n){let n=e[r],i=t[r];if(n!==i){if(n==null||i==null||typeof n!=typeof i)return!1;if(typeof n==`object`){if(Array.isArray(n)||Array.isArray(i)||!R(n,i))return!1;continue}return!1}}return!0}var z={provider:`hsl(var(--info))`,agent:`hsl(var(--primary))`,tool:`hsl(var(--warning))`,mailbox:`hsl(var(--success))`,session:`hsl(var(--primary))`,system:`hsl(var(--muted-foreground))`,success:`hsl(var(--success))`,error:`hsl(var(--destructive))`},B={"provider:call":`hsl(var(--info))`,"provider:delta":`hsl(var(--primary))`,"agent:tool":`hsl(var(--warning))`,"mailbox:send":`hsl(var(--success))`,default:`hsl(var(--muted-foreground))`},V=t()((e,t)=>({events:[],toolEvents:[],nodes:new Map,edges:new Map,isActive:!1,maxEvents:2e3,counters:{totalTokens:0,totalCost:0,totalToolCalls:0,activeAgents:0,completedTasks:0,errors:0,mailboxMessages:0},pushEvent:t=>e(e=>{let n={...t,id:t.id??L(),timestamp:t.timestamp||Date.now()},r=[n,...e.events];r.length>e.maxEvents&&(r.length=e.maxEvents);let i=t.kind===`agent:tool`||t.kind===`tool:started`||t.kind===`tool:progress`||t.kind===`tool:executed`?[n,...e.toolEvents].slice(0,600):e.toolEvents,a=Date.now(),o=t.source,s={id:o,kind:P(t),label:t.label,status:F(t.kind),activity:1,color:t.color??z[P(t)],lastSeenAt:a},c=e.nodes.get(o),l=c?{...c,...s}:s,u=!R(c,l),d,f=!1,p;if(t.target){p=t.target;let n={id:p,kind:P(t,!0),label:p,status:F(t.kind),activity:.8,color:t.color??z[P(t,!0)],lastSeenAt:a},r=e.nodes.get(p);d=r?{...r,...n}:n,f=!R(r,d)}let m,h=!1,g;if(t.target&&o){g=`${o}->${t.target}`;let n=e.edges.get(g),r={id:g,source:o,target:t.target,kind:t.kind,label:t.label,intensity:n?Math.min(1,n.intensity+.3):.7,color:t.color??z[P(t)]??z.agent,lastActiveAt:a,totalMagnitude:(n?.totalMagnitude??0)+(t.magnitude??0)};m=n?{...n,...r}:r,h=!R(n,m)}let _=e.nodes,v=e.edges;return(u||f)&&(_=new Map(e.nodes),u&&_.set(o,l),f&&d&&p&&_.set(p,d)),h&&m&&g&&(v=new Map(e.edges),v.set(g,m)),{events:r,toolEvents:i,nodes:_,edges:v}}),upsertNode:t=>e(e=>{let n=new Map(e.nodes),r=n.get(t.id);return n.set(t.id,{...r,...t,lastSeenAt:t.lastSeenAt===void 0?Date.now():t.lastSeenAt}),{nodes:n}}),removeNode:t=>e(e=>{let n=new Map(e.nodes);n.delete(t);let r=new Map(e.edges);for(let[e,n]of r)(n.source===t||n.target===t)&&r.delete(e);return{nodes:n,edges:r}}),upsertEdge:t=>e(e=>{let n=new Map(e.edges),r=n.get(t.id);return n.set(t.id,{...r,...t,lastActiveAt:t.lastActiveAt===void 0?Date.now():t.lastActiveAt,intensity:t.intensity??r?.intensity??.5,color:t.color??B[t.kind]??B.default,totalMagnitude:(r?.totalMagnitude??0)+(t.totalMagnitude??0)}),{edges:n}}),removeEdge:t=>e(e=>{let n=new Map(e.edges);return n.delete(t),{edges:n}}),clear:()=>e({events:[],toolEvents:[],nodes:new Map,edges:new Map,counters:{totalTokens:0,totalCost:0,totalToolCalls:0,activeAgents:0,completedTasks:0,errors:0,mailboxMessages:0}}),setActive:t=>e({isActive:t}),decayActivity:()=>e(e=>{let t=new Map(e.nodes);for(let[e,n]of t)if(n.activity>=.01){let r=n.activity*.92;t.set(e,{...n,activity:r<.01?0:r})}let n=new Map(e.edges);for(let[e,t]of n)if(t.intensity>=.01){let r=t.intensity*.9;n.set(e,{...t,intensity:r<.01?0:r})}return{nodes:t,edges:n}}),prunesStale:t=>e(e=>{let n=Date.now()-t,r=new Map(e.nodes);for(let[e,t]of r)t.lastSeenAt<n&&t.status!==void 0&&t.status!==`active`&&r.delete(e);let i=new Map(e.edges);for(let[e,t]of i)t.lastActiveAt<n&&i.delete(e);return{nodes:r,edges:i,events:e.events.filter(e=>e.timestamp>n)}})}));function H(e,t){switch(e){case`provider.text_delta`:{let e=t.text??``;return{id:L(),kind:`provider:delta`,timestamp:Date.now(),source:`provider`,target:`leader`,label:e.slice(0,60),magnitude:e.length,data:{text:e},color:z.provider,flowGroup:`provider`}}case`provider.response`:{let e=t.usage,n=(e?.input??0)+(e?.output??0);return{id:L(),kind:`provider:response`,timestamp:Date.now(),source:`provider`,target:`leader`,label:`${(e?.input??0).toLocaleString(`en-US`)} in / ${(e?.output??0).toLocaleString(`en-US`)} out`,magnitude:n,data:t,color:z.provider,flowGroup:`provider`}}case`provider.stream_error`:{let e=t.message??`Provider stream error`;return{id:L(),kind:`error`,timestamp:Date.now(),source:`provider`,target:`leader`,label:e.slice(0,80),magnitude:1,data:t,color:z.error,flowGroup:`provider`}}case`tool.started`:{let e=t.name??`tool`;return{id:L(),kind:`tool:started`,timestamp:Date.now(),source:e,target:`filesystem`,label:e,magnitude:1,data:t,color:z.tool,flowGroup:`tool:${e}`}}case`tool.executed`:{let e=t.name??`tool`,n=t.ok??!0;return{id:L(),kind:`tool:executed`,timestamp:Date.now(),source:e,target:`leader`,label:`${e} ${n?`✓`:`✗`} (${t.durationMs??0}ms)`,magnitude:t.durationMs??0,data:t,color:n?z.tool:z.error,flowGroup:`tool:${e}`}}case`tool.progress`:{let e=t.name??`tool`,n=t.event?.text??``;return{id:L(),kind:`tool:progress`,timestamp:Date.now(),source:e,target:`leader`,label:n.slice(0,60)||e,magnitude:n.length,data:t,color:z.tool,flowGroup:`tool:${e}`}}case`codemap.tool_started`:{let e=t.name??`tool`,n=t.agentId??`subagent`;return{id:L(),kind:`tool:started`,timestamp:Date.now(),source:n,target:e,label:e,magnitude:1,data:t,color:z.tool,flowGroup:`agent:${n}`}}case`codemap.tool_executed`:{let e=t.name??`tool`,n=t.agentId??`subagent`,r=t.ok??!0;return{id:L(),kind:`tool:executed`,timestamp:Date.now(),source:n,target:e,label:`${e} ${r?`✓`:`✗`} (${t.durationMs??0}ms)`,magnitude:t.durationMs??0,data:t,color:r?z.tool:z.error,flowGroup:`agent:${n}`}}case`tool.loop_detected`:{let e=t.tools??``,n=t.kind??`loop`,r=t.action===`steer`;return{id:L(),kind:r?`agent:status`:`error`,timestamp:Date.now(),source:e||n,target:`leader`,label:`${n} loop x${t.repeatCount??0}`,magnitude:t.repeatCount??1,data:t,color:r?z.agent:z.error,flowGroup:`tool`}}case`delegate.started`:{let e=t.target??`delegate`,n=t.task??``;return{id:L(),kind:`agent:status`,timestamp:Date.now(),source:`leader`,target:e,label:n.slice(0,80)||`Delegating to ${e}`,magnitude:1,data:t,color:z.agent,flowGroup:`delegate:${e}`}}case`delegate.completed`:{let e=t.subagentId??t.target??`delegate`,n=t.ok??!1;return{id:L(),kind:n?`agent:status`:`error`,timestamp:Date.now(),source:e,target:`leader`,label:(t.summary??t.status??`delegate completed`).slice(0,80),magnitude:t.durationMs??1,data:t,color:n?z.agent:z.error,flowGroup:`delegate:${e}`}}case`subagent.event`:{let e=t.kind,n=t.subagentId??`unknown`,r=t.name??n;switch(e){case`spawned`:return{id:L(),kind:`agent:spawned`,timestamp:Date.now(),source:n,target:`session`,label:`${r} spawned`,magnitude:1,data:t,color:z.agent,flowGroup:`agent:${n}`};case`tool_executed`:{let e=t.toolName??`tool`,r=t.ok??!0;return{id:L(),kind:`agent:tool`,timestamp:Date.now(),source:n,target:e,label:e,magnitude:t.durationMs??0,data:t,color:r?z.tool:z.error,flowGroup:`agent:${n}`}}case`task_completed`:{let e=t.status??`completed`;return{id:L(),kind:`agent:status`,timestamp:Date.now(),source:n,target:`session`,label:`${r} ${e}`,magnitude:1,data:t,color:e===`success`?z.success:z.error,flowGroup:`agent:${n}`}}case`ctx_pct`:return{id:L(),kind:`agent:ctx`,timestamp:Date.now(),source:n,target:`session`,label:`ctx ${N(t.load)}%`,magnitude:t.tokens??0,data:t,color:z.agent,flowGroup:`agent:${n}`};case`iteration_summary`:return{id:L(),kind:`agent:text`,timestamp:Date.now(),source:n,target:`session`,label:(t.partialText??``).slice(0,80)||`iter ${t.iteration??0}`,magnitude:t.costUsd??0,data:t,color:z.agent,flowGroup:`agent:${n}`};case`budget_extended`:return{id:L(),kind:`budget:extended`,timestamp:Date.now(),source:n,target:`session`,label:`${r} extended budget`,magnitude:t.totalExtensions??1,data:t,color:z.tool,flowGroup:`agent:${n}`};case`budget_warning`:return{id:L(),kind:`budget:warning`,timestamp:Date.now(),source:n,target:`session`,label:`${r} hit ${t.budgetKind??`budget`} ${t.used??0}/${t.limit??0}`,magnitude:t.used??1,data:t,color:z.error,flowGroup:`agent:${n}`}}return null}case`mailbox.event`:{let e=t.event,n=t.from??`?`,r=t.to??`?`,i=t.subject??``,a=e===`mailbox.sent`;return{id:L(),kind:a?`mailbox:send`:`mailbox:deliver`,timestamp:Date.now(),source:n,target:r,label:i||(a?`→ ${r}`:`← ${n}`),magnitude:1,data:t,color:z.mailbox,flowGroup:`mailbox`}}case`iteration.started`:{let e=t.index??0;return{id:L(),kind:`iteration:start`,timestamp:Date.now(),source:`leader`,target:`session`,label:`Iteration ${e}`,magnitude:e,data:t,color:z.agent,flowGroup:`iteration`}}case`iteration.completed`:{let e=t.index??0;return{id:L(),kind:`iteration:end`,timestamp:Date.now(),source:`leader`,target:`session`,label:`Iteration ${e} done`,magnitude:e,data:t,color:z.session,flowGroup:`iteration`}}case`ctx.pct`:{let e=t.tokens??0;return{id:L(),kind:`agent:ctx`,timestamp:Date.now(),source:`leader`,target:`session`,label:`ctx ${N(t.load)}%`,magnitude:e,data:t,color:z.agent,flowGroup:`leader`}}case`error`:{let e=t.message??`Error`;return{id:L(),kind:`error`,timestamp:Date.now(),source:t.phase??`system`,target:`session`,label:e,magnitude:1,data:t,color:z.error,flowGroup:`error`}}case`context.compacted`:return{id:L(),kind:`context:compacted`,timestamp:Date.now(),source:`system`,target:`session`,label:`Compacted: ${(t.saved??0).toLocaleString(`en-US`)} tokens`,magnitude:t.saved??0,data:t,color:`hsl(var(--info))`,flowGroup:`context`};case`compaction.failed`:{let e=t.message??`Compaction failed`;return{id:L(),kind:`error`,timestamp:Date.now(),source:`compactor`,target:`session`,label:e.slice(0,80),magnitude:t.tokens??1,data:t,color:z.error,flowGroup:`context`}}case`context.repaired`:return{id:L(),kind:`context:repaired`,timestamp:Date.now(),source:`system`,target:`session`,label:`Repaired: ${t.removedMessages??0} msgs`,magnitude:t.removedMessages??0,data:t,color:`hsl(var(--info))`,flowGroup:`context`};case`session.start`:{let e=t.sessionId??`?`,n=t.projectName??``;return{id:L(),kind:`session:start`,timestamp:Date.now(),source:`session`,target:`leader`,label:n||e.slice(0,12),magnitude:1,data:t,color:z.session,flowGroup:`session`}}case`sessions.status_update`:{let e=t.sessions??[];return{id:L(),kind:`fleet:snapshot`,timestamp:Date.now(),source:`system`,target:`session`,label:`${e.length} session(s)`,magnitude:e.length,data:t,color:z.system,flowGroup:`fleet`}}default:return null}}function he(e){let t=e.payload?.sessionId,n=r.getState().session?.id;return!t||!n||t===n}function ge(e){let t=H(e.type,e.payload);t&&(V.getState().pushEvent(t),V.getState().setActive(!0))}function _e(e,t,n){let r=e.payload??{};for(let[e,n]of Object.entries(t)){let t=r[e];if(!U(t,n))return null}if(n)for(let[e,t]of Object.entries(n)){let n=r[e];if(n!=null&&!U(n,t))return null}return r}function U(e,t){switch(t){case`string`:return typeof e==`string`;case`number`:return typeof e==`number`;case`boolean`:return typeof e==`boolean`;case`object`:return typeof e==`object`&&!!e&&!Array.isArray(e);case`array`:return Array.isArray(e);default:return!1}}function ve(e){try{return new URL(e).searchParams.get(`token`)}catch{return null}}function W(){if(typeof window>`u`||!window.location)return null;try{let e=window.location.search??``;return new URLSearchParams(e).get(`token`)}catch{return null}}function G(e){try{let t=new URL(e);return t.searchParams.delete(`token`),t.toString()}catch{return e}}function K(){if(!(typeof window>`u`||!window.location||!window.history?.replaceState))try{let e=window.location.href;if(!e)return;let t=new URL(e);if(!t.searchParams.has(`token`))return;t.searchParams.delete(`token`),window.history.replaceState(window.history.state,document.title,t.toString())}catch{}}function ye(){if(typeof document>`u`)return null;let e=document.querySelector(`meta[name="wrongstack-ws-url"]`)?.getAttribute(`content`)?.trim();if(!e)return null;try{let t=new URL(e);if(t.protocol!==`ws:`&&t.protocol!==`wss:`)return null;let n=W();return n&&!t.searchParams.has(`token`)&&t.searchParams.set(`token`,n),t.toString()}catch{return null}}function q(){let e=ye();if(e)return e;if(typeof window>`u`||!window.location?.hostname)return`ws://127.0.0.1:3456`;let t=window.location.protocol===`https:`?`wss`:`ws`,n=window.location.hostname.toLowerCase(),r=window.location.port,i=W(),a=i?`?token=${encodeURIComponent(i)}`:``;return`${t}://${n===`localhost`||n===`127.0.0.1`||n===`[::1]`||n===`::1`?`127.0.0.1`:n}${r?`:${r}`:``}${a}`}function J(){if(typeof window>`u`||!window.location?.hostname)return`http://127.0.0.1:3456`;let e=window.location.protocol===`https:`?`https`:`http`,t=window.location.hostname.toLowerCase(),n=window.location.port?`:${window.location.port}`:``;return t===`localhost`||t===`127.0.0.1`||t===`[::1]`||t===`::1`?`${e}://127.0.0.1${n}`:`${e}://${window.location.hostname}${n}`}var be=e({WrongStackWebSocketClient:()=>Z,getWSClient:()=>$}),xe={"context.debug":`context.debug`,"diag.get":`diag.get`,"memory.list":`memory.list`,"memory.sage.get":`memory.sage.get`,"memory.sage.graph":`memory.sage.graph`,"memory.sage.list":`memory.sage.list`,"memory.sage.listPage":`memory.sage.listPage`,"memory.sage.remember":`memory.sage.remember`,"memory.sage.update":`memory.sage.update`,"skills.list":`skills.list`,"stats.get":`stats.get`,"tools.list":`tools.list`},Se=3e4,Ce=32;function Y(e){try{let t=new URL(e),n=new URL(J());return t.hostname===n.hostname}catch{return!0}}var X=class e{ws=null;url;handlers=new Map;maxReconnectAttempts=10;shouldReconnect=!0;reconnectTimer=null;connectPromise=null;socketGeneration=0;messageQueue=[];messageQueueChars=0;messageQueueWeights=new WeakMap;connectionState=s();static MAX_QUEUED_MESSAGES=1e3;static MAX_QUEUED_CHARS=16*1024*1024;pendingConfirms=new Map;sessionId=null;sessionSwapPending=!1;lastErrorText;statusListeners=new Set;currentStatus={state:`connecting`};suppressedChatEchoes=new Map;protocolCapabilities=new Set;protocolVersion=null;supportsCapability(e){return this.protocolCapabilities.has(e)}get negotiatedProtocolVersion(){return this.protocolVersion}onStatus(e){return this.statusListeners.add(e),e(this.currentStatus),()=>this.statusListeners.delete(e)}get status(){return this.currentStatus}setStatus(e){this.currentStatus=e;for(let t of this.statusListeners)try{t(e)}catch{}}constructor(e){this.url=e??q()}withSession(e){return this.sessionId?{...e,sessionId:this.sessionId}:e}async ensureAuthCookie(){if(typeof window>`u`)return;if(document.cookie.split(`;`).some(e=>e.trim().startsWith(`ws_token=`))){Y(this.url)&&(this.url=G(this.url)),K();return}let e=ve(this.url)??W();if(!e)return;let t=J()+`/ws-auth?token=${encodeURIComponent(e)}`;try{let e=await fetch(t,{method:`GET`,credentials:`same-origin`,cache:`no-store`});e.ok?(Y(this.url)&&(this.url=G(this.url)),K()):console.warn(JSON.stringify({level:`warn`,event:`ws_client.ws_auth_failed`,status:e.status,timestamp:new Date().toISOString()}))}catch(e){console.warn(JSON.stringify({level:`warn`,event:`ws_client.ws_auth_error`,message:e instanceof Error?e.message:String(e),timestamp:new Date().toISOString()}))}}connect(){return this.ws?.readyState===WebSocket.OPEN?Promise.resolve():(this.connectPromise||=this.openSocket().finally(()=>{this.connectPromise=null}),this.connectPromise)}async openSocket(){return await this.ensureAuthCookie(),this.connectionState=c(this.connectionState),new Promise((e,t)=>{if(this.ws?.readyState===WebSocket.OPEN){e();return}this.setStatus({state:`connecting`});let n=++this.socketGeneration;try{let r=new WebSocket(this.url);this.ws=r,r.binaryType=`arraybuffer`;let i=setTimeout(()=>{if(this.ws===r){try{r.close()}catch{}this.ws===r&&(this.ws=null)}this.lastErrorText=`Connection timeout`,t(Error(`Connection timeout`)),s()},3e4),a=!1,o=!1,s=()=>{o||(o=!0,this.attemptReconnect())};r.onopen=()=>{this.socketGeneration===n&&(clearTimeout(i),a=!0,this.connectionState=l(this.connectionState),this.lastErrorText=void 0,this.setStatus({state:`open`}),this.flushMessageQueue(),e())},r.onmessage=e=>{if(this.socketGeneration!==n)return;this.connectionState=u(this.connectionState);let t=fe(String(e.data),`server`);t.ok?this.handleMessage(t.message):console.error(JSON.stringify({level:`error`,event:`ws_client.message_rejected`,code:t.issue.code,message:t.issue.message,timestamp:new Date().toISOString()}))},r.onerror=e=>{this.socketGeneration===n&&(console.error(JSON.stringify({level:`error`,event:`ws_client.error`,message:e instanceof Error?e.message:String(e),timestamp:new Date().toISOString()})),this.lastErrorText=`Connection error (see browser devtools)`,a||(clearTimeout(i),t(Error(this.lastErrorText)),s()))},r.onclose=e=>{if(this.socketGeneration===n){if(this.sessionSwapPending=!1,!a){clearTimeout(i);let n=e.reason||`Closed with code ${e.code}`;this.lastErrorText=n,t(Error(n)),s();return}e.reason&&!this.lastErrorText?this.lastErrorText=`${e.reason} (code ${e.code})`:!this.lastErrorText&&e.code!==1e3&&(this.lastErrorText=`Closed with code ${e.code}`),this.attemptReconnect()}}}catch(e){if(this.socketGeneration!==n)return;this.lastErrorText=e instanceof Error?e.message:String(e),this.setStatus({state:`closed`,error:this.lastErrorText}),t(e)}})}attemptReconnect(){if(!this.shouldReconnect){this.connectionState=d(this.connectionState),this.reconnectTimer=null,this.setStatus({state:`closed`,error:this.lastErrorText??`Disconnected`});return}let t=p(this.connectionState,{...o,maxReconnectAttempts:this.maxReconnectAttempts,queueLimit:e.MAX_QUEUED_MESSAGES});if(this.connectionState=t.state,!t.plan){this.reconnectTimer=null,this.setStatus({state:`closed`,error:this.lastErrorText??`Disconnected`});return}this.setStatus({state:`reconnecting`,attempt:t.plan.attempt,nextRetryAt:t.plan.retryAt,lastError:this.lastErrorText}),this.reconnectTimer=setTimeout(async()=>{if(this.reconnectTimer=null,this.shouldReconnect)try{await this.connect()}catch(e){console.error(JSON.stringify({level:`error`,event:`ws_client.reconnect_failed`,message:e instanceof Error?e.message:String(e),timestamp:new Date().toISOString()}))}},t.plan.delayMs)}retryNow(){this.currentStatus.state!==`open`&&(this.reconnectTimer&&=(clearTimeout(this.reconnectTimer),null),this.connectionState=f(this.connectionState),this.connect().catch(e=>console.warn(JSON.stringify({level:`warn`,event:`ws_client.reconnect_failed`,message:e instanceof Error?e.message:String(e),timestamp:new Date().toISOString()}))))}flushMessageQueue(){for(;this.messageQueue.length>0;){let e=this.messageQueue.shift();if(e){let t=this.messageQueueWeights.get(e)??JSON.stringify(e).length;this.messageQueueChars=Math.max(0,this.messageQueueChars-t),this.messageQueueWeights.delete(e),this.send(e)}}this.messageQueueChars=0}handleMessage(e){if(e.type===`tool.confirm_needed`){let t=e.payload;this.pendingConfirms.set(t.id,{}),this.emit(e);return}if(e.type===`session.start`){let t=e.payload,n=me(t);this.sessionId=t.sessionId,this.protocolVersion=n.version,this.protocolCapabilities=new Set(n.capabilities),this.sessionSwapPending=!1}else e.type===`error`&&(e.payload.phase===`session.new`||e.payload.phase===`session.resume`)&&(this.sessionSwapPending=!1);this.emit(e)}emit(e){let t=this.handlers.get(e.type);if(t)for(let n of t)try{n(e)}catch(t){console.error(JSON.stringify({level:`error`,event:`ws_client.handler_error`,messageType:e.type,message:t instanceof Error?t.message:String(t),timestamp:new Date().toISOString()}))}}send(e,t={}){let n=this.constructor,r=n.MAX_QUEUED_MESSAGES,i=n.MAX_QUEUED_CHARS,o=D(e,`client`);if(!o.ok)return console.error(JSON.stringify({level:`error`,event:`ws_client.outbound_message_rejected`,code:o.issue.code,message:o.issue.message,timestamp:new Date().toISOString()})),!1;let s=JSON.stringify(o.message),c=this.ws?.readyState===WebSocket.OPEN;if(!c&&s.length>i)return console.warn(JSON.stringify({level:`warn`,event:`ws_client.message_queue_full`,cap:r,charCap:i,droppedType:e.type,reason:`message_too_large`,timestamp:new Date().toISOString()})),!1;let l=e.type===`session.new`||e.type===`session.resume`;if(l&&this.sessionSwapPending)return!1;if(l&&(this.sessionSwapPending=!0),t.echoToChat===!1){let t=xe[e.type];if(t){let e=this.suppressedChatEchoes.get(t)??[];for(e.push(Date.now()+Se);e.length>Ce;)e.shift();this.suppressedChatEchoes.set(t,e)}}if((e.type===`context.clear`||e.type===`session.new`||e.type===`session.resume`)&&a.dropAll(),c)return this.ws?.send(s),!0;{if(t.queueIfDisconnected===!1)return!1;let n;for(;this.messageQueue.length>0&&(this.messageQueue.length>=r||this.messageQueueChars+s.length>i);){let e=this.messageQueue.shift();if(!e)break;n??=e;let t=this.messageQueueWeights.get(e)??JSON.stringify(e).length;this.messageQueueChars=Math.max(0,this.messageQueueChars-t),this.messageQueueWeights.delete(e)}return n&&console.warn(JSON.stringify({level:`warn`,event:`ws_client.message_queue_full`,cap:r,charCap:i,droppedType:n.type,timestamp:new Date().toISOString()})),this.messageQueue.push(e),this.messageQueueWeights.set(e,s.length),this.messageQueueChars+=s.length,!0}}consumeSuppressedChatEcho(e){let t=this.suppressedChatEchoes.get(e);if(!t)return!1;let n=Date.now();for(;t.length>0&&t[0]<=n;)t.shift();return t.length===0?(this.suppressedChatEchoes.delete(e),!1):(t.shift(),t.length===0&&this.suppressedChatEchoes.delete(e),!0)}on(e,t){let n=this.handlers.get(e);return n||(n=new Set,this.handlers.set(e,n)),n.add(t),()=>n?.delete(t)}off(e,t){this.handlers.get(e)?.delete(t)}sendMessage(e,t){let r=`msg_${Date.now()}_${n().slice(0,8)}`;return this.send({type:`user_message`,payload:this.withSession({id:r,content:e,timestamp:Date.now(),...t&&t.length>0?{images:t}:{}})}),r}sendMailboxMessage(e){let t=`mbox_${Date.now()}_${n().slice(0,8)}`;return this.send({type:`mailbox.send`,payload:{requestId:t,to:e.to,type:e.type,audience:e.audience??`all`,subject:e.subject,body:e.body,priority:e.priority??`normal`}}),t}sendAbort(){this.send({type:`abort`,payload:this.withSession({})})}getGitInfo(){this.send({type:`git.info`})}getGitChanges(){this.send({type:`git.changes`})}getGitDiff(e){this.send({type:`git.diff`,payload:{path:e}})}sendConfirm(e,t){this.pendingConfirms.has(e)&&this.pendingConfirms.delete(e),this.send({type:`tool.confirm_result`,payload:this.withSession({id:e,decision:t})})}switchModel(e,t,r=8e3){let i=n();return new Promise(n=>{let a=!1,o=e=>{a||(a=!0,clearTimeout(c),s(),n(e))},s=this.on(`model.switch_result`,e=>{let t=e.payload;t.requestId===i&&o(t)}),c=setTimeout(()=>{o({requestId:i,success:!1,message:`Model switch timed out. Please try again.`,provider:e,model:t,runActive:!1})},r);this.send({type:`model.switch`,payload:{provider:e,model:t,requestId:i}})})}getProviderStatus(){this.send({type:`provider.status.get`})}retryProviderModel(e,t){this.send({type:`provider.status.retry`,payload:{providerId:e,model:t}})}clearProviderStatus(e,t){this.send({type:`provider.status.clear`,payload:{providerId:e,model:t}})}newSession(){this.send({type:`session.new`,payload:this.withSession({})})}shutdownCodebaseIndexServer(e=8e3){let t=n();return new Promise(n=>{let r=!1,i=e=>{r||(r=!0,clearTimeout(o),a(),n(e))},a=this.on(`codebase.index.server.shutdown_result`,e=>{e.payload.requestId&&e.payload.requestId!==t||i(e.payload)}),o=setTimeout(()=>{i({requestId:t,stopped:!1,reason:`Codebase index server shutdown timed out.`})},e);this.send({type:`codebase.index.server.shutdown`,payload:{requestId:t}},{queueIfDisconnected:!1})||i({requestId:t,stopped:!1,reason:`WebSocket is not connected.`})})}listProviders(){this.send({type:`providers.list`})}listProviderModels(e){this.send({type:`provider.models`,payload:{providerId:e}})}listSavedProviders(){this.send({type:`providers.saved`})}searchProviderModels(e,t){this.send({type:`provider.models.search`,payload:{query:e,...t===void 0?{}:{limit:t}}})}addKey(e,t,n){this.send({type:`key.add`,payload:{providerId:e,label:t,apiKey:n}})}updateKey(e,t,n){this.send({type:`key.update`,payload:{providerId:e,label:t,apiKey:n}})}deleteKey(e,t){this.send({type:`key.delete`,payload:{providerId:e,label:t}})}setActiveKey(e,t){this.send({type:`key.set_active`,payload:{providerId:e,label:t}})}addProvider(e,t,n,r,i,a){this.send({type:`provider.add`,payload:{id:e,family:t,baseUrl:n,apiKey:r,...i?{models:i}:{},...a?{customModels:a}:{}}})}removeProvider(e){this.send({type:`provider.remove`,payload:{providerId:e}})}startOAuth(e,t){this.send({type:`auth.oauth.start`,payload:t?{kind:e,providerId:t}:{kind:e}})}submitOAuthCode(e,t){this.send({type:`auth.oauth.code`,payload:{kind:e,input:t}})}cancelOAuth(e){this.send({type:`auth.oauth.cancel`,payload:{kind:e}})}probeProvider(e,t){this.send({type:`provider.probe`,payload:t===void 0?{providerId:e}:{providerId:e,timeoutMs:t}})}clearProviderModels(e){this.send(A(e))}undoProviderClear(e,t){this.send(j(e,t))}setCustomModel(e,t,n){this.send({type:`provider.custom_models.set`,payload:{providerId:e,modelId:t,customModel:n}})}removeCustomModel(e,t){this.send({type:`provider.custom_models.remove`,payload:{providerId:e,modelId:t}})}updateProvider(e){this.send(M(e))}clearContext(){this.send({type:`context.clear`,payload:this.withSession({})})}compactContext(e=!1){this.send({type:`context.compact`,payload:this.withSession({aggressive:e})})}repairContext(){this.send({type:`context.repair`,payload:this.withSession({})})}openContextEditor(){this.send({type:`context.editor.open`,payload:this.withSession({})})}validateContextEditor(e,t,n,r){this.send({type:`context.editor.validate`,payload:this.withSession({baseRevision:e,messages:t,removals:n,allowRepair:r})})}applyContextEditor(e,t,n,r){this.send({type:`context.editor.apply`,payload:this.withSession({baseRevision:e,messages:t,removals:n,allowRepair:r})})}debugContext(e){this.send({type:`context.debug`,payload:this.withSession({})},e)}listContextModes(){this.send({type:`context.modes.list`,payload:this.withSession({})})}switchContextMode(e){this.send({type:`context.mode.switch`,payload:this.withSession({id:e})})}createContextMode(e){this.send({type:`context.mode.create`,payload:this.withSession(e)})}updateContextMode(e,t){this.send({type:`context.mode.update`,payload:this.withSession({id:e,...t})})}deleteContextMode(e){this.send({type:`context.mode.delete`,payload:this.withSession({id:e})})}switchAutonomy(e){this.send({type:`autonomy.switch`,payload:{mode:e}})}updatePrefs(e){this.send({type:`prefs.update`,payload:e})}getPrefs(){this.send({type:`prefs.get`})}disconnect(){this.shouldReconnect=!1,this.connectionState=d(this.connectionState),this.reconnectTimer&&=(clearTimeout(this.reconnectTimer),null),this.messageQueue.length=0,this.messageQueueChars=0,this.sessionSwapPending=!1,this.ws?.close(),this.ws=null}get isConnected(){return this.ws?.readyState===WebSocket.OPEN}get currentSessionId(){return this.sessionId}};k(X);var Z=X,Q=null;function $(e){return Q||=new Z(e),Q}export{ge as a,H as c,he as i,a as l,be as n,_e as o,q as r,V as s,$ as t};
|
|
@@ -2,8 +2,8 @@ export type AutonomyMode = 'off' | 'suggest' | 'auto' | 'eternal' | 'eternal-par
|
|
|
2
2
|
export interface AutonomyOption {
|
|
3
3
|
mode: AutonomyMode;
|
|
4
4
|
/** Display label — left verbatim (autonomy mode names are domain terms). */
|
|
5
|
-
label: string;
|
|
6
5
|
/** i18n key under activity:autonomy.* for the description. */
|
|
6
|
+
labelKey: string;
|
|
7
7
|
descKey: string;
|
|
8
8
|
icon: React.ReactNode;
|
|
9
9
|
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure decision logic for the chat-input auto-collapse state machine.
|
|
3
|
+
*
|
|
4
|
+
* ChatView keeps `inputCollapsed` (a thin bar hides the full input) and two
|
|
5
|
+
* transition refs: `prevHadMessages` (transcript presence on the last render)
|
|
6
|
+
* and `prevAutoCollapse` (the pref on the last render). This function decides
|
|
7
|
+
* whether the input should collapse given the CURRENT values and those
|
|
8
|
+
* previous values — it fires only on transitions, never on steady state:
|
|
9
|
+
*
|
|
10
|
+
* 1. 0→N transcript arrival while the pref is on — covers fresh connects
|
|
11
|
+
* where history lands via WS replay AFTER mount, so the mount-time
|
|
12
|
+
* initializer saw an empty transcript.
|
|
13
|
+
* 2. The pref flips false→true while history is already present — instant
|
|
14
|
+
* feedback for the opt-in toggle (mirrors the manual Collapse button).
|
|
15
|
+
* 3. A session switch (sessionId changed to a new non-null id) while the
|
|
16
|
+
* pref is on and the new transcript has messages — session resume
|
|
17
|
+
* replaces the transcript wholesale (N→M in one commit, never through
|
|
18
|
+
* 0), so the length transition alone would miss it.
|
|
19
|
+
*
|
|
20
|
+
* Deliberately NOT a trigger: plain message growth after history exists
|
|
21
|
+
* (a manual expand stays sticky), and a pref flip while there is no history
|
|
22
|
+
* (nothing to collapse yet). The ChatView caller additionally gates the whole
|
|
23
|
+
* decision on `!isLoading` so a run in flight never collapses the input —
|
|
24
|
+
* the user's first send in a fresh session is itself a 0→N arrival.
|
|
25
|
+
*
|
|
26
|
+
* Extracted as a pure function so the decision matrix is unit-testable
|
|
27
|
+
* without mounting the heavy ChatView dependency graph.
|
|
28
|
+
*/
|
|
29
|
+
export interface AutoCollapseDecision {
|
|
30
|
+
/** Current transcript presence (messages.length > 0). */
|
|
31
|
+
hasMessages: boolean;
|
|
32
|
+
/** Current value of the autoCollapseInput pref. */
|
|
33
|
+
autoCollapseInput: boolean;
|
|
34
|
+
/** True when the active session id changed to a new non-null id. */
|
|
35
|
+
sessionChanged: boolean;
|
|
36
|
+
/** Transcript presence at the last render/effect run. */
|
|
37
|
+
prevHadMessages: boolean;
|
|
38
|
+
/** Pref value at the last render/effect run. */
|
|
39
|
+
prevAutoCollapse: boolean;
|
|
40
|
+
}
|
|
41
|
+
export declare function shouldAutoCollapse(decision: AutoCollapseDecision): boolean;
|
|
42
|
+
//# sourceMappingURL=auto-collapse.d.ts.map
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* KanbanVerificationDashboard — board-wide Definition-of-Done quality view:
|
|
3
|
-
* verified/unverified/failed counts, failing checks, missing evidence, and
|
|
4
|
-
* atomicity debt (tasks needing decomposition, pending proposals).
|
|
5
|
-
* Every row clicks through to the task inspector.
|
|
6
|
-
*/
|
|
7
1
|
import type { KanbanBoard } from '@wrongstack/kanban';
|
|
8
2
|
export declare function KanbanVerificationDashboard({ board, onSelectTask, }: {
|
|
9
3
|
board: KanbanBoard;
|
|
@@ -24,10 +24,15 @@ export interface ModelCandidate {
|
|
|
24
24
|
/**
|
|
25
25
|
* Build the full list of (provider, model) candidates from saved
|
|
26
26
|
* providers and the cached model catalog, apply the search filter
|
|
27
|
-
* (case-insensitive substring on provider / model id / model name)
|
|
28
|
-
* sort so the currently-active model
|
|
27
|
+
* (case-insensitive substring on provider / model id / model name)
|
|
28
|
+
* and optional provider filter, and sort so the currently-active model
|
|
29
|
+
* floats to the top.
|
|
29
30
|
*
|
|
30
|
-
*
|
|
31
|
+
* The two filters combine with AND semantics: when both are active,
|
|
32
|
+
* candidates must match the query AND belong to the selected provider.
|
|
33
|
+
*
|
|
34
|
+
* An empty / whitespace-only `query` returns the unfiltered list
|
|
35
|
+
* (unless `providerFilter` is set).
|
|
31
36
|
*/
|
|
32
|
-
export declare function buildModelCandidates(saved: SavedProviderLite[], modelsByProvider: Record<string, CatalogModelLite[]>, query: string, currentProvider: string | undefined, currentModel: string | undefined): ModelCandidate[];
|
|
37
|
+
export declare function buildModelCandidates(saved: SavedProviderLite[], modelsByProvider: Record<string, CatalogModelLite[]>, query: string, currentProvider: string | undefined, currentModel: string | undefined, providerFilter?: string | null): ModelCandidate[];
|
|
33
38
|
//# sourceMappingURL=QuickModelSwitcher.filter.d.ts.map
|
|
@@ -13,10 +13,9 @@ export interface CatalogMatch {
|
|
|
13
13
|
capabilities: string[];
|
|
14
14
|
}
|
|
15
15
|
export interface ModelCatalogPickerProps {
|
|
16
|
-
providerId: string;
|
|
17
16
|
ws: WrongStackWebSocketClient;
|
|
18
17
|
onSelect: (modelId: string, modelsDev: Record<string, unknown>) => void;
|
|
19
18
|
onClose: () => void;
|
|
20
19
|
}
|
|
21
|
-
export declare function ModelCatalogPicker({
|
|
20
|
+
export declare function ModelCatalogPicker({ ws, onSelect, onClose }: ModelCatalogPickerProps): import("react").JSX.Element;
|
|
22
21
|
//# sourceMappingURL=ModelCatalogPicker.d.ts.map
|
|
@@ -4,9 +4,17 @@
|
|
|
4
4
|
* The list is driven by the shared audit catalog (`@wrongstack/plugins/
|
|
5
5
|
* plugin-audit-catalog`) — the same single source of truth the CLI plugin
|
|
6
6
|
* manager uses — so EVERY plugin the host knows about appears here, whether
|
|
7
|
-
* it is currently active or inactive.
|
|
8
|
-
*
|
|
9
|
-
* `
|
|
7
|
+
* it is currently active or inactive.
|
|
8
|
+
*
|
|
9
|
+
* `localPrefs.pluginsEnabled` is NOT just this browser's memory: on connect the
|
|
10
|
+
* server seeds it (context-meta.ts) with the EFFECTIVE state resolved through
|
|
11
|
+
* core's shared precedence, and the snapshot wins over localStorage. So a
|
|
12
|
+
* plugin the config decides shows what is actually running; only plugins the
|
|
13
|
+
* config says nothing about fall back to the catalog `defaultState` here.
|
|
14
|
+
*
|
|
15
|
+
* On write the server projects the toggle onto `extensions.<name>.enabled` AND
|
|
16
|
+
* any matching `config.plugins` entry (pref-helpers.ts) — the entry outranks
|
|
17
|
+
* the extension, so writing only the latter made this switch decorative.
|
|
10
18
|
* Plugins flagged `canDisable: false` render a locked, non-interactive switch.
|
|
11
19
|
*/
|
|
12
20
|
export declare function PluginToggleList(): import("react").JSX.Element;
|
|
@@ -1,72 +1,58 @@
|
|
|
1
|
+
import type { BrainConfigWire } from '@/types/brain';
|
|
1
2
|
export declare const RISK_LEVELS: readonly ['off', 'low', 'medium', 'high', 'all'];
|
|
2
3
|
export type RiskLevel = (typeof RISK_LEVELS)[number];
|
|
3
4
|
export declare const RISK_COLORS: Record<RiskLevel, string>;
|
|
4
5
|
export declare const RISK_COPY: Record<RiskLevel, string>;
|
|
6
|
+
/**
|
|
7
|
+
* Fallback lens list for servers that publish no `personaCatalog`.
|
|
8
|
+
*
|
|
9
|
+
* Prefer {@link councilPersonaOptions}, which reads the server's registry —
|
|
10
|
+
* this list is only three of the six built-in lenses, and hard-coding it here
|
|
11
|
+
* is what made `security`, `maintainer` and `user-advocate` unselectable.
|
|
12
|
+
*/
|
|
5
13
|
export declare const PERSONAS: readonly ['executor', 'skeptic', 'auditor'];
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
export declare const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}>;
|
|
14
|
+
/** One entry of the lens picker. */
|
|
15
|
+
export interface CouncilPersonaOption {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
description?: string | undefined;
|
|
19
|
+
}
|
|
20
|
+
/** Lens options for a config snapshot: server catalog first, fallback second. */
|
|
21
|
+
export declare function councilPersonaOptions(catalog: BrainConfigWire['personaCatalog']): CouncilPersonaOption[];
|
|
22
|
+
export declare const DECISION_TIMEOUTS: BrainOption[];
|
|
23
|
+
export declare const HUMAN_TIMEOUTS: BrainOption[];
|
|
24
|
+
export declare const FRACTIONS: BrainOption[];
|
|
18
25
|
/** Effective-valued numbers: the snapshot always carries a resolved number, so
|
|
19
26
|
* the default is a LABELLED concrete option rather than a `default` sentinel. */
|
|
20
|
-
export declare const LLM_MAX_TOKENS:
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
export declare const
|
|
25
|
-
value: string;
|
|
26
|
-
label: string;
|
|
27
|
-
}>;
|
|
28
|
-
export declare const DECISION_LOG_SIZES: Array<{
|
|
29
|
-
value: string;
|
|
30
|
-
label: string;
|
|
31
|
-
}>;
|
|
32
|
-
export declare const CACHE_TTLS: Array<{
|
|
33
|
-
value: string;
|
|
34
|
-
label: string;
|
|
35
|
-
}>;
|
|
36
|
-
export declare const CACHE_MAX_ENTRIES: Array<{
|
|
37
|
-
value: string;
|
|
38
|
-
label: string;
|
|
39
|
-
}>;
|
|
27
|
+
export declare const LLM_MAX_TOKENS: BrainOption[];
|
|
28
|
+
export declare const MIN_CONFIDENCE: BrainOption[];
|
|
29
|
+
export declare const DECISION_LOG_SIZES: BrainOption[];
|
|
30
|
+
export declare const CACHE_TTLS: BrainOption[];
|
|
31
|
+
export declare const CACHE_MAX_ENTRIES: BrainOption[];
|
|
40
32
|
/** Optional-valued knobs: `default` clears the field back to core's default. */
|
|
41
|
-
export declare const COUNCIL_CALL_TIMEOUTS:
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
export declare const
|
|
46
|
-
value: string;
|
|
47
|
-
label: string;
|
|
48
|
-
}>;
|
|
49
|
-
export declare const JUDGE_MAX_TOKENS: Array<{
|
|
50
|
-
value: string;
|
|
51
|
-
label: string;
|
|
52
|
-
}>;
|
|
53
|
-
export declare const LEDGER_MEMORY_ENTRIES: Array<{
|
|
54
|
-
value: string;
|
|
55
|
-
label: string;
|
|
56
|
-
}>;
|
|
57
|
-
export declare const INTERVENTION_WINDOWS: Array<{
|
|
58
|
-
value: string;
|
|
59
|
-
label: string;
|
|
60
|
-
}>;
|
|
33
|
+
export declare const COUNCIL_CALL_TIMEOUTS: BrainOption[];
|
|
34
|
+
export declare const COUNCIL_CONCURRENCY: BrainOption[];
|
|
35
|
+
export declare const JUDGE_MAX_TOKENS: BrainOption[];
|
|
36
|
+
export declare const LEDGER_MEMORY_ENTRIES: BrainOption[];
|
|
37
|
+
export declare const INTERVENTION_WINDOWS: BrainOption[];
|
|
61
38
|
/**
|
|
62
39
|
* Presets plus the live value when the config holds something off-menu — a
|
|
63
40
|
* hand-edited config must not render as an empty select (which would then
|
|
64
41
|
* write the first preset back on the next change).
|
|
65
42
|
*/
|
|
66
|
-
|
|
43
|
+
/**
|
|
44
|
+
* A select option. Numeric/unit choices ("5s", "800") carry a literal `label`;
|
|
45
|
+
* anything with words carries `labelKey` and is resolved at render time —
|
|
46
|
+
* this module is hook-free, so it cannot call `t()` itself.
|
|
47
|
+
*/
|
|
48
|
+
export interface BrainOption {
|
|
67
49
|
value: string;
|
|
68
|
-
label
|
|
69
|
-
|
|
50
|
+
label?: string;
|
|
51
|
+
labelKey?: string;
|
|
52
|
+
}
|
|
53
|
+
export declare function withCurrent(options: BrainOption[], current: string): BrainOption[];
|
|
54
|
+
/** Resolve `labelKey` options against the active catalog for rendering. */
|
|
55
|
+
export declare function localizeOptions(options: BrainOption[], t: (key: string) => string): Array<{
|
|
70
56
|
value: string;
|
|
71
57
|
label: string;
|
|
72
58
|
}>;
|
|
@@ -16,7 +16,6 @@ export interface TaskItem {
|
|
|
16
16
|
export declare const TASK_STATUS_CONFIG: Record<TaskItem['status'], {
|
|
17
17
|
icon: React.ReactNode;
|
|
18
18
|
color: string;
|
|
19
|
-
label: string;
|
|
20
19
|
}>;
|
|
21
20
|
export declare const PRIORITY_BADGE: Record<TaskItem['priority'], string>;
|
|
22
21
|
export declare const TYPE_BADGE: Record<TaskItem['type'], string>;
|
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
import type { KanbanBoard, KanbanEvent, KanbanTask } from '@wrongstack/kanban';
|
|
2
2
|
export type TaskRiskSeverity = 'critical' | 'warning' | 'info';
|
|
3
|
+
/**
|
|
4
|
+
* A finding carries i18n KEYS, not prose: `analyzeTaskRisk` is a pure function
|
|
5
|
+
* used outside React (KanbanColumnView calls it for badge counts), so it must
|
|
6
|
+
* not depend on a translator. The panel resolves the keys at render time and
|
|
7
|
+
* feeds `detailParams` into the interpolation.
|
|
8
|
+
*/
|
|
3
9
|
export interface TaskRiskFinding {
|
|
4
10
|
id: string;
|
|
5
11
|
severity: TaskRiskSeverity;
|
|
6
12
|
category: 'operational' | 'audit';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
13
|
+
titleKey: string;
|
|
14
|
+
detailKey: string;
|
|
15
|
+
detailParams?: Record<string, string | number>;
|
|
16
|
+
remediationKey: string;
|
|
10
17
|
}
|
|
11
18
|
export interface TaskRiskAssessment {
|
|
12
19
|
score: number;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import type { ComponentType } from 'react';
|
|
7
7
|
import type { TechStackCoverage, TechStackDependency, TechStackFinding, TechStackFindingSeverity } from '@/stores';
|
|
8
8
|
export interface StatusMeta {
|
|
9
|
-
readonly
|
|
9
|
+
readonly labelKey: string;
|
|
10
10
|
/** Full literal class strings. */
|
|
11
11
|
readonly badge: string;
|
|
12
12
|
readonly dot: string;
|
|
@@ -25,8 +25,11 @@ export interface StatusMeta {
|
|
|
25
25
|
export declare const STATUS_META: Record<string, StatusMeta>;
|
|
26
26
|
export declare function statusMeta(status: string): StatusMeta;
|
|
27
27
|
export interface EcosystemMeta {
|
|
28
|
-
/** Human-readable display name
|
|
29
|
-
|
|
28
|
+
/** Human-readable display name — a proper noun (npm, Python, Rust…), so it
|
|
29
|
+
* is NOT translated. The unknown-ecosystem fallback uses `labelKey`. */
|
|
30
|
+
readonly label?: string | undefined;
|
|
31
|
+
/** i18n key, set only where the label is real display copy. */
|
|
32
|
+
readonly labelKey?: string | undefined;
|
|
30
33
|
/** Optional lucide-react icon component for visual identification. */
|
|
31
34
|
readonly icon?: ComponentType<{
|
|
32
35
|
className?: string;
|
|
@@ -41,6 +44,8 @@ export interface EcosystemMeta {
|
|
|
41
44
|
* for the UI to display a human-readable label.
|
|
42
45
|
*/
|
|
43
46
|
export declare const ECOSYSTEM_META: Record<string, EcosystemMeta>;
|
|
47
|
+
/** Display name for an ecosystem: proper noun as-is, fallback via the catalog. */
|
|
48
|
+
export declare function ecosystemLabel(ecosystem: string, t: (key: string) => string): string;
|
|
44
49
|
export declare function ecosystemMeta(ecosystem: string): EcosystemMeta;
|
|
45
50
|
/**
|
|
46
51
|
* Renders the ecosystem icon if one is registered, or nothing.
|
|
@@ -55,15 +60,15 @@ export declare function EcosystemIcon({ ecosystem, className, }: {
|
|
|
55
60
|
export declare function needsAttention(dep: TechStackDependency): boolean;
|
|
56
61
|
export declare const SEVERITY_ORDER: readonly TechStackFindingSeverity[];
|
|
57
62
|
export declare const SEVERITY_META: Record<TechStackFindingSeverity, {
|
|
58
|
-
|
|
63
|
+
labelKey: string;
|
|
59
64
|
badge: string;
|
|
60
65
|
}>;
|
|
61
66
|
export declare const ACTION_LABELS: Record<string, string>;
|
|
62
67
|
export interface CoverageMeta {
|
|
63
|
-
readonly
|
|
68
|
+
readonly labelKey: string;
|
|
64
69
|
readonly badge: string;
|
|
65
70
|
/** Short inline text for the dependency row subtitle (e.g. "limited", "best-effort"). */
|
|
66
|
-
readonly
|
|
71
|
+
readonly noteKey: string | undefined;
|
|
67
72
|
}
|
|
68
73
|
export declare const COVERAGE_META: Record<TechStackCoverage, CoverageMeta>;
|
|
69
74
|
/** Lookup helper that returns the FALLBACK for unknown coverage strings. */
|
|
@@ -1,15 +1,20 @@
|
|
|
1
|
+
import { type PaletteId } from '@/lib/palettes';
|
|
1
2
|
import type React from 'react';
|
|
2
3
|
type Theme = 'light' | 'dark' | 'system';
|
|
3
4
|
interface ThemeProviderProps {
|
|
4
5
|
children: React.ReactNode;
|
|
5
6
|
defaultTheme?: Theme | undefined;
|
|
6
7
|
storageKey?: string | undefined;
|
|
8
|
+
defaultPalette?: PaletteId | undefined;
|
|
9
|
+
paletteStorageKey?: string | undefined;
|
|
7
10
|
}
|
|
8
11
|
interface ThemeProviderState {
|
|
9
12
|
theme: Theme;
|
|
10
13
|
setTheme: (theme: Theme) => void;
|
|
14
|
+
palette: PaletteId;
|
|
15
|
+
setPalette: (palette: PaletteId) => void;
|
|
11
16
|
}
|
|
12
|
-
export declare function ThemeProvider({ children, defaultTheme, storageKey, }: ThemeProviderProps): React.JSX.Element;
|
|
17
|
+
export declare function ThemeProvider({ children, defaultTheme, storageKey, defaultPalette, paletteStorageKey, }: ThemeProviderProps): React.JSX.Element;
|
|
13
18
|
export declare function useTheme(): ThemeProviderState;
|
|
14
19
|
export {};
|
|
15
20
|
//# sourceMappingURL=ThemeProvider.d.ts.map
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* its component in an ErrorBoundary + Suspense. Lazy-loaded views get a
|
|
6
6
|
* PanelSuspense fallback; eagerly-loaded views (chat, settings, context) do not.
|
|
7
7
|
*/
|
|
8
|
-
export declare function ViewRouter({ sessionId, desktopShell }: {
|
|
8
|
+
export declare function ViewRouter({ sessionId, desktopShell, }: {
|
|
9
9
|
sessionId: string | null;
|
|
10
10
|
desktopShell: boolean;
|
|
11
11
|
}): React.ReactElement;
|
|
@@ -54,7 +54,8 @@ export type RosterTab = 'live' | 'catalog' | 'learning' | 'customize';
|
|
|
54
54
|
interface TabDef {
|
|
55
55
|
id: RosterTab;
|
|
56
56
|
icon: React.ReactNode;
|
|
57
|
-
|
|
57
|
+
/** i18n key resolved at render time — this module is hook-free by design. */
|
|
58
|
+
labelKey: string;
|
|
58
59
|
}
|
|
59
60
|
export declare const TABS: TabDef[];
|
|
60
61
|
export declare const KNOWN_ROLES: RosterAgentEntry[];
|
|
@@ -47,6 +47,7 @@ export declare function useWebSocket(): {
|
|
|
47
47
|
deleteSession: (id: string) => void;
|
|
48
48
|
renameSession: (id: string, name: string) => void;
|
|
49
49
|
resumeSession: (id: string) => void;
|
|
50
|
+
inspectSession: (id: string) => void;
|
|
50
51
|
saveSession: () => void;
|
|
51
52
|
listTools: (options?: WSSendOptions) => void;
|
|
52
53
|
listMemory: (options?: WSSendOptions) => void;
|
|
@@ -10,6 +10,7 @@ export declare function handleMailboxMessages(msg: WSServerMessage): void;
|
|
|
10
10
|
export declare function handleMailboxAgents(msg: WSServerMessage): void;
|
|
11
11
|
export declare function handleMailboxReceived(msg: WSServerMessage): void;
|
|
12
12
|
export declare function handleMailboxAgentRegistered(_msg: WSServerMessage): void;
|
|
13
|
+
export declare function handleMailboxAgentDeregistered(msg: WSServerMessage): void;
|
|
13
14
|
export declare function handleMailboxCleared(_msg: WSServerMessage): void;
|
|
14
15
|
export declare function handleMailboxPurged(_msg: WSServerMessage): void;
|
|
15
16
|
export declare function handleMailboxCompacted(msg: WSServerMessage): void;
|
|
@@ -7,6 +7,19 @@ export declare function handleGoalUpdated(msg: WSServerMessage): void;
|
|
|
7
7
|
export declare function handlePrefsUpdated(msg: WSServerMessage): void;
|
|
8
8
|
export declare function handleBrainStatus(msg: WSServerMessage): void;
|
|
9
9
|
export declare function handleBrainAnswer(msg: WSServerMessage): void;
|
|
10
|
+
/**
|
|
11
|
+
* Council seat votes are NOT buffered here: the council log store already
|
|
12
|
+
* tracks each panel's seats per request id (deduped by seat id, retained as
|
|
13
|
+
* whole panels in its ring buffer). `brain.council_vote` fires once per seat
|
|
14
|
+
* and `brain.council_resolved` once per panel, both from inside
|
|
15
|
+
* `council.decide()`. Both reached the browser and were dropped on the
|
|
16
|
+
* floor, so the most expensive Brain tier — one provider call per seat — was
|
|
17
|
+
* completely invisible in the UI. The resolved handler reads the panel's
|
|
18
|
+
* seats back from the store, so vote eviction is per-panel (per-request): a
|
|
19
|
+
* live panel's seats can never be dropped by other requests' vote traffic
|
|
20
|
+
* (the old global 50-vote buffer could). Whole panels still age out of the
|
|
21
|
+
* store's ring buffer, which is the intended log retention.
|
|
22
|
+
*/
|
|
10
23
|
export declare function handleBrainEvent(msg: WSServerMessage): void;
|
|
11
24
|
export declare function handleMemoryEvent(msg: WSServerMessage): void;
|
|
12
25
|
export declare function handleCollabEvent(msg: WSServerMessage): void;
|
|
@@ -11,6 +11,7 @@ export declare function handleIterationLimitReached(msg: WSServerMessage): void;
|
|
|
11
11
|
export declare function handleProviderRetry(msg: WSServerMessage): void;
|
|
12
12
|
export declare function handleProviderError(msg: WSServerMessage): void;
|
|
13
13
|
export declare function handleProviderFallback(msg: WSServerMessage): void;
|
|
14
|
+
export declare function handleProviderFallbackPending(msg: WSServerMessage): void;
|
|
14
15
|
export declare function handleProviderStatusChanged(msg: WSServerMessage): void;
|
|
15
16
|
export declare function handleProviderStatusSnapshot(msg: WSServerMessage): void;
|
|
16
17
|
export declare function handleProviderActiveBlocked(msg: WSServerMessage): void;
|
package/dist/index.css
CHANGED
|
@@ -1007,6 +1007,36 @@
|
|
|
1007
1007
|
--desk-floor: hsl(var(--foreground) / 0.035);
|
|
1008
1008
|
--desk-aura: hsl(var(--muted-foreground) / 0.044);
|
|
1009
1009
|
}
|
|
1010
|
+
.dark .agent-office__lane {
|
|
1011
|
+
--desk-wall: hsl(var(--info) / 0.16);
|
|
1012
|
+
--desk-floor: hsl(var(--warning) / 0.16);
|
|
1013
|
+
--desk-aura: hsl(var(--warning) / 0.14);
|
|
1014
|
+
}
|
|
1015
|
+
.dark .agent-office__lane.is-desk-mint {
|
|
1016
|
+
--desk-wall: hsl(var(--success) / 0.18);
|
|
1017
|
+
--desk-floor: hsl(var(--info) / 0.14);
|
|
1018
|
+
--desk-aura: hsl(var(--success) / 0.16);
|
|
1019
|
+
}
|
|
1020
|
+
.dark .agent-office__lane.is-desk-ocean {
|
|
1021
|
+
--desk-wall: hsl(var(--info) / 0.2);
|
|
1022
|
+
--desk-floor: hsl(var(--primary) / 0.14);
|
|
1023
|
+
--desk-aura: hsl(var(--info) / 0.16);
|
|
1024
|
+
}
|
|
1025
|
+
.dark .agent-office__lane.is-desk-plum {
|
|
1026
|
+
--desk-wall: hsl(var(--primary) / 0.18);
|
|
1027
|
+
--desk-floor: hsl(var(--warning) / 0.14);
|
|
1028
|
+
--desk-aura: hsl(var(--primary) / 0.16);
|
|
1029
|
+
}
|
|
1030
|
+
.dark .agent-office__lane.is-desk-rose {
|
|
1031
|
+
--desk-wall: hsl(var(--destructive) / 0.16);
|
|
1032
|
+
--desk-floor: hsl(var(--warning) / 0.14);
|
|
1033
|
+
--desk-aura: hsl(var(--destructive) / 0.14);
|
|
1034
|
+
}
|
|
1035
|
+
.dark .agent-office__lane.is-desk-graphite {
|
|
1036
|
+
--desk-wall: hsl(var(--muted-foreground) / 0.14);
|
|
1037
|
+
--desk-floor: hsl(var(--foreground) / 0.1);
|
|
1038
|
+
--desk-aura: hsl(var(--muted-foreground) / 0.12);
|
|
1039
|
+
}
|
|
1010
1040
|
.agent-office__lane:hover {
|
|
1011
1041
|
transform: translateY(-1px);
|
|
1012
1042
|
box-shadow: 0 13px 34px hsl(var(--shadow-color) / 0.1);
|